474 lines
16 KiB
SCSS

// ==========================================================
// DS-COMPAT: Temporäre Utility-Klassen für ds-* Migration
// TODO(tailwind): Durch Tailwind-Utilities ersetzen
// Global resets + fonts are in resets.scss (loaded first)
// ==========================================================
// ds-space Ersatz — Margin-Bottom
.ds-mb-xxx-small { margin-bottom: $space-xxx-small; }
.ds-mb-xx-small { margin-bottom: $space-xx-small; }
.ds-mb-x-small { margin-bottom: $space-x-small; }
.ds-mb-small { margin-bottom: $space-small; }
.ds-mb-base { margin-bottom: $space-base; }
.ds-mb-large { margin-bottom: $space-large; }
.ds-mb-x-large { margin-bottom: $space-x-large; }
.ds-mb-xx-large { margin-bottom: $space-xx-large; }
// ds-space Ersatz — Margin-Top
.ds-mt-xxx-small { margin-top: $space-xxx-small; }
.ds-mt-xx-small { margin-top: $space-xx-small; }
.ds-mt-x-small { margin-top: $space-x-small; }
.ds-mt-small { margin-top: $space-small; }
.ds-mt-base { margin-top: $space-base; }
.ds-mt-large { margin-top: $space-large; }
.ds-mt-x-large { margin-top: $space-x-large; }
.ds-mt-xx-large { margin-top: $space-xx-large; }
// ds-space Ersatz — Margin Y (top + bottom)
.ds-my-xxx-small { margin-top: $space-xxx-small; margin-bottom: $space-xxx-small; }
.ds-my-xx-small { margin-top: $space-xx-small; margin-bottom: $space-xx-small; }
.ds-my-x-small { margin-top: $space-x-small; margin-bottom: $space-x-small; }
.ds-my-small { margin-top: $space-small; margin-bottom: $space-small; }
.ds-my-base { margin-top: $space-base; margin-bottom: $space-base; }
.ds-my-large { margin-top: $space-large; margin-bottom: $space-large; }
.ds-my-x-large { margin-top: $space-x-large; margin-bottom: $space-x-large; }
.ds-my-xx-large { margin-top: $space-xx-large; margin-bottom: $space-xx-large; }
// ds-space centered
.ds-space-centered {
display: flex;
flex: 1;
text-align: center;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
// ds-list-item bullet icon (replaces DsListItem Vue component's angle-right prefix)
.ds-list-item::before {
content: '';
flex: 0 0 1.5em;
height: 1.2em;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='%2370677e'%3E%3Cpath d='M12.969 4.281l11 11 .688.719-.688.719-11 11-1.438-1.438L21.812 16 11.531 5.719z'/%3E%3C/svg%3E") no-repeat left center;
background-size: 0.6em;
}
// ds-grid Ersatz
.ds-grid { display: grid; }
// ds-flex Ersatz
.ds-flex { display: flex; flex-wrap: wrap; }
.ds-flex-no-wrap { flex-wrap: nowrap; }
.ds-flex-centered { align-items: center; justify-content: center; }
.ds-flex-item { flex: 1 0 0; min-width: 0; }
.ds-flex-gap-xxx-small { gap: $space-xxx-small; }
.ds-flex-gap-xx-small { gap: $space-xx-small; }
.ds-flex-gap-x-small { gap: $space-x-small; }
.ds-flex-gap-small { gap: $space-small; }
.ds-flex-gap-base { gap: $space-base; }
.ds-flex-gap-large { gap: $space-large; }
// ds-text Ersatz — Typography utility classes
// Grep: ds-text, ds-text-soft, ds-text-size-small, ds-text-center, ds-text-bold
.ds-text {
box-sizing: border-box;
padding: 0;
margin: 0;
margin-bottom: $font-space-x-large;
&:last-child { margin-bottom: 0; }
font-family: $font-family-text;
line-height: $line-height-base;
display: block;
}
.ds-text-bold { font-weight: $font-weight-bold; }
.ds-text-inline { display: inline; }
.ds-text-left { text-align: left; }
.ds-text-center { text-align: center; }
.ds-text-uppercase { text-transform: uppercase; }
.ds-text-size-small { font-size: $font-size-small; }
.ds-text-size-base { font-size: $font-size-base; }
.ds-text-size-large { font-size: $font-size-large; }
.ds-text-size-x-large { font-size: $font-size-x-large; }
.ds-text-soft { color: $text-color-soft; }
.ds-text-softer { color: $text-color-softer; }
.ds-text-primary { color: $text-color-primary; }
.ds-text-success { color: $text-color-success; }
.ds-text-warning { color: $text-color-warning; }
.ds-text-danger { color: $text-color-danger; }
// ds-table Ersatz
.ds-table-wrap { width: 100%; overflow: auto; }
.ds-table { width: 100%; border-collapse: collapse; }
.ds-table-col {
vertical-align: top;
padding: $space-small $space-xx-small;
&:last-child { padding-right: 0; }
}
.ds-table-head-col {
border-bottom: $border-size-base solid $border-color-softer;
padding: $space-small $space-xx-small;
text-align: left;
font-weight: $font-weight-bold;
}
.ds-table-bordered {
.ds-table-col, .ds-table-head-col { border-bottom: $border-size-base dotted $border-color-softer; }
tr:last-child .ds-table-col { border-bottom: none; }
}
.ds-table-condensed {
.ds-table-col, .ds-table-head-col { padding-top: $space-x-small; padding-bottom: $space-x-small; }
}
.ds-table-col, .ds-table-head-col {
&.ds-table-col-right, &.ds-table-head-col-right { text-align: right; }
&.ds-table-col-center, &.ds-table-head-col-center { text-align: center; }
}
// ==========================================================
// Layout: Container, Section, Placeholder
// ==========================================================
.ds-container {
margin: 0 auto;
padding: 0 $space-small;
@media #{$media-query-medium} { padding: 0 $space-base; }
@media #{$media-query-large} { padding: 0 $space-x-large; }
}
.ds-container-small { max-width: #{$sm}px; }
.ds-container-medium { max-width: #{$md}px; }
.ds-container-x-large { max-width: #{$xl}px; }
.ds-section {
padding: $space-large 0;
}
.ds-placeholder {
color: $text-color-disabled;
font-style: italic;
text-align: center;
padding: $space-base;
}
// ==========================================================
// Typography: Heading
// ==========================================================
.ds-heading {
margin: 2em 0 .6em;
padding: 0;
font-family: $font-family-heading;
font-weight: $font-weight-bold;
line-height: 1.1;
letter-spacing: -0.01em;
}
.ds-heading:first-child { margin-top: 0; }
.ds-heading:last-child { margin-bottom: 0; }
.ds-heading-h1 { font-size: $font-size-xx-large; }
.ds-heading-h2 { font-size: $font-size-xx-large; }
.ds-heading-h3 { font-size: $font-size-x-large; }
.ds-heading-h4 { font-size: $font-size-large; }
@media #{$media-query-large} {
.ds-heading-h1 { font-size: $font-size-xxx-large; }
}
.ds-heading-soft { color: $text-color-softer; }
.ds-heading-no-margin { margin: 0; }
.ds-heading-align-center { text-align: center; }
// Tab Nav — styles are in TabNavigation.vue (scoped), no global .ds-tab-nav needed
// ==========================================================
// List
// ==========================================================
.ds-list {
margin: 0 0 1em;
padding: 0;
list-style: none;
line-height: $line-height-base;
}
.ds-list:last-child { margin-bottom: 0; }
// ==========================================================
// Logo
// ==========================================================
.ds-logo {
display: inline-block;
}
.ds-logo-svg {
display: block;
height: auto;
}
.ds-logo-mobile { display: block; }
.ds-logo-tablet { display: none; }
.ds-logo-desktop { display: none; }
.ds-logo-inverse { display: none; }
@media screen and (min-width: 600px) {
.ds-logo-mobile { display: none; }
.ds-logo-tablet { display: block; }
}
@media screen and (min-width: 960px) {
.ds-logo-tablet { display: none; }
.ds-logo-desktop { display: block; }
}
// Footer — styles are in PageFooter.vue (scoped), no global .ds-footer needed
// ==========================================================
// Form / Input (used by OcelotInput)
// ==========================================================
.ds-form-item {
position: relative;
margin-bottom: $space-small;
}
.ds-form-item:last-child { margin-bottom: 0; }
.ds-input-label {
padding-bottom: $space-xx-small;
color: $text-color-soft;
font-size: $font-size-base;
display: block;
}
.ds-input-error {
color: $color-danger;
font-size: $font-size-x-small;
position: absolute;
top: 100%;
}
.ds-input-error-enter-active {
transition: opacity $duration-base $ease-out, transform $duration-base $ease-out;
}
.ds-input-error-enter, .ds-input-error-leave-to {
opacity: 0;
transform: translateY(-2px);
}
.ds-input-wrap { position: relative; }
.ds-input {
appearance: none;
box-sizing: border-box;
font-size: $input-font-size-base;
line-height: $line-height-base;
font-family: $font-family-text;
width: 100%;
padding: $input-padding-vertical $space-x-small;
height: $input-height;
color: $text-color-base;
background: $background-color-soft;
border: $input-border-size solid $border-color-softer;
border-radius: $border-radius-base;
outline: none;
transition: all $duration-short $ease-out;
}
.ds-input::placeholder { color: $text-color-disabled; }
.ds-input-has-focus .ds-input, .ds-input:focus {
border-color: $border-color-active;
background: $background-color-base;
}
.ds-input-is-disabled .ds-input, .ds-input:disabled {
color: $text-color-disabled;
opacity: $opacity-disabled;
pointer-events: none;
cursor: not-allowed;
background-color: $background-color-disabled;
}
.ds-input-is-readonly .ds-input { pointer-events: none; }
.ds-input-has-error .ds-input { border-color: $border-color-danger; }
.ds-input-size-small {
font-size: $font-size-small;
.ds-input { font-size: $input-font-size-small; height: $input-height-small; padding: $input-padding-vertical-small $space-x-small; }
}
.ds-input-size-large {
font-size: $font-size-large;
.ds-input { font-size: $input-font-size-large; height: $input-height-large; padding: $input-padding-vertical-large $space-x-small; }
}
textarea.ds-input { height: auto; min-height: $input-height; resize: none; }
textarea.ds-input-size-small { min-height: $input-height-small; }
textarea.ds-input-size-large { min-height: $input-height-large; }
.ds-input-icon, .ds-input-icon-right {
position: absolute;
top: 0; bottom: 0; left: 0;
display: flex;
align-items: center;
justify-content: center;
width: $input-height;
color: $text-color-softer;
transition: color $duration-short $ease-out;
pointer-events: none;
}
.ds-input-has-focus .ds-input-icon,
.ds-input-has-focus .ds-input-icon-right { color: $text-color-base; }
.ds-input-size-small .ds-input-icon,
.ds-input-size-small .ds-input-icon-right { width: $input-height-small; }
.ds-input-size-large .ds-input-icon,
.ds-input-size-large .ds-input-icon-right { width: $input-height-large; }
.ds-input-icon-right { right: 0; left: auto; }
.ds-input-has-icon { padding-left: $input-height; }
.ds-input-size-small .ds-input-has-icon { padding-left: $input-height-small; }
.ds-input-size-large .ds-input-has-icon { padding-left: $input-height-large; }
.ds-input-has-icon-right { padding-right: $input-height; }
.ds-input-size-small .ds-input-has-icon-right { padding-right: $input-height-small; }
.ds-input-size-large .ds-input-has-icon-right { padding-right: $input-height-large; }
// ==========================================================
// Select (used by OcelotSelect)
// ==========================================================
.ds-select-wrap { position: relative; }
.ds-select {
appearance: none;
box-sizing: border-box;
font-size: $input-font-size-base;
line-height: $line-height-base;
font-family: $font-family-text;
width: 100%;
padding: $input-padding-vertical $space-x-small;
height: $input-height;
color: $text-color-base;
background: $background-color-soft;
border: $input-border-size solid $border-color-softer;
border-radius: $border-radius-base;
outline: none;
transition: all $duration-short $ease-out;
user-select: none;
}
.ds-select::placeholder { color: $text-color-disabled; }
.ds-input-has-focus .ds-select, .ds-select:focus {
border-color: $border-color-active;
background: $background-color-base;
}
.ds-input-is-disabled .ds-select, .ds-select:disabled {
color: $text-color-disabled;
opacity: $opacity-disabled;
pointer-events: none;
cursor: not-allowed;
background-color: $background-color-disabled;
}
.ds-input-is-readonly .ds-select { pointer-events: none; }
.ds-input-has-error .ds-select { border-color: $border-color-danger; }
.ds-select-is-open .ds-select {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
border-bottom: none;
}
.ds-input-size-small .ds-select { font-size: $input-font-size-small; height: $input-height-small; padding: $input-padding-vertical-small $space-x-small; }
.ds-input-size-large .ds-select { font-size: $input-font-size-large; height: $input-height-large; padding: $input-padding-vertical-large $space-x-small; }
.ds-select-multiple {
display: flex;
align-items: center;
max-width: 100%;
}
.ds-select-search, .ds-select-value {
box-sizing: border-box;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
border: $input-border-size solid transparent;
padding: $input-padding-vertical $space-x-small;
line-height: $line-height-base;
}
.ds-input-size-small .ds-select-search,
.ds-input-size-small .ds-select-value { padding: $input-padding-vertical-small $space-x-small; }
.ds-input-size-large .ds-select-search,
.ds-input-size-large .ds-select-value { padding: $input-padding-vertical-large $space-x-small; }
.ds-select-has-icon .ds-select-search,
.ds-select-has-icon .ds-select-value { padding-left: $input-height; }
.ds-select-has-icon-right .ds-select-search,
.ds-select-has-icon-right .ds-select-value { padding-right: $input-height; }
.ds-select-search {
appearance: none;
font-size: inherit;
font-family: $font-family-text;
width: 100%;
background: transparent;
color: $text-color-base;
outline: none;
user-select: text;
opacity: 0;
}
.ds-select-search::placeholder { color: $text-color-disabled; }
.ds-select-is-open .ds-select-search { opacity: 1; }
.ds-select-multiple .ds-select-search {
position: relative;
display: inline-flex;
width: auto;
height: auto;
padding: 0;
opacity: 1;
}
.ds-select-placeholder, .ds-select-value { pointer-events: none; }
.ds-select-is-open .ds-select-placeholder,
.ds-select-is-open .ds-select-value { opacity: 0; }
.ds-select-placeholder { color: $text-color-disabled; }
.ds-selected-options { display: flex; max-width: 100%; overflow: hidden; }
.ds-selected-option { display: inline-flex; align-items: center; margin-right: $space-xx-small; }
.ds-select-dropdown {
position: absolute;
z-index: $z-index-dropdown;
top: 100%;
left: 0;
width: 100%;
background-color: $background-color-base;
border: $input-border-size solid $border-color-active;
border-top: 0;
border-bottom-left-radius: $border-radius-base;
border-bottom-right-radius: $border-radius-base;
visibility: hidden;
opacity: 0;
transition: all $duration-short $ease-out, border-bottom 0ms;
max-height: 240px;
overflow: auto;
}
.ds-select-is-open .ds-select-dropdown { visibility: visible; opacity: 1; }
.ds-select-dropdown-message {
padding: $input-padding-vertical $space-x-small;
color: $text-color-disabled;
}
.ds-select-options {
margin: 0;
padding: 0;
list-style: none;
}
.ds-select-option {
padding: $input-padding-vertical $space-x-small;
cursor: pointer;
transition: all $duration-short $ease-out;
}
.ds-select-option.ds-select-option-hover {
background-color: $background-color-softer;
color: $text-color-base;
}
.ds-select-option-is-selected {
background-color: $background-color-soft;
color: $text-color-primary;
}
.ds-select-icon, .ds-select-icon-right {
position: absolute;
top: 0; bottom: 0; left: 0;
display: flex;
align-items: center;
justify-content: center;
width: $input-height;
color: $text-color-softer;
transition: color $duration-short $ease-out;
pointer-events: none;
}
.ds-input-has-focus .ds-select-icon,
.ds-input-has-focus .ds-select-icon-right { color: $text-color-base; }
.ds-select-icon-right { right: 0; left: auto; }