264 lines
5.3 KiB
SCSS
264 lines
5.3 KiB
SCSS
/* ===== GLOBAL STYLES - CLEAN & MINIMAL ===== */
|
|
|
|
@import './app/utils/shared-styles.scss';
|
|
|
|
/* ===== SAFARI & iOS GLOBAL HOTFIX ===== */
|
|
/* Behebt Touch-Probleme, Button-Verzögerungen und Tap-Highlight auf Safari/iOS */
|
|
|
|
/* Entfernt 300ms Touch-Delay auf allen interaktiven Elementen */
|
|
a, button, input, select, textarea, [role="button"], [tabindex] {
|
|
-webkit-tap-highlight-color: transparent;
|
|
-webkit-touch-callout: none;
|
|
touch-action: manipulation; /* Entfernt 300ms delay, erlaubt nur pan/zoom */
|
|
}
|
|
|
|
/* Fix für Safari Button-Styling */
|
|
button, [type="button"], [type="submit"], [type="reset"] {
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
}
|
|
|
|
/* GPU-beschleunigte Transforms für alle Buttons (verhindert Ruckeln) */
|
|
.btn, button, a.btn, [role="button"] {
|
|
-webkit-transform: translateZ(0);
|
|
transform: translateZ(0);
|
|
-webkit-backface-visibility: hidden;
|
|
backface-visibility: hidden;
|
|
will-change: transform, box-shadow;
|
|
}
|
|
|
|
/* Fix: Material Icons Platzhalter (verhindert Layout-Shift beim Laden) */
|
|
.material-symbols-outlined {
|
|
width: 24px;
|
|
height: 24px;
|
|
min-width: 24px;
|
|
font-display: block; /* Zeigt nichts bis Font geladen */
|
|
}
|
|
|
|
/* Font-Loading Fallback (verhindert FOUT - Flash of Unstyled Text) */
|
|
html {
|
|
font-display: swap;
|
|
}
|
|
|
|
/* ===== RESET ===== */
|
|
*, *::before, *::after {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
html {
|
|
font-size: 16px;
|
|
scroll-behavior: smooth;
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
font-size: 1rem;
|
|
line-height: 1.6;
|
|
color: $color-text-primary;
|
|
background: $gradient-bg;
|
|
background-attachment: fixed;
|
|
min-height: 100vh;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
/* ===== TYPOGRAPHY ===== */
|
|
h1, h2, h3, h4, h5, h6 {
|
|
margin: 0;
|
|
font-weight: 700;
|
|
line-height: 1.2;
|
|
color: $color-text-primary;
|
|
}
|
|
|
|
h1 { font-size: clamp(1.75rem, 5vw, 3rem); font-weight: 800; }
|
|
h2 { font-size: clamp(1.5rem, 4vw, 2.25rem); font-weight: 700; }
|
|
h3 { font-size: clamp(1.25rem, 3vw, 1.75rem); }
|
|
h4 { font-size: clamp(1.1rem, 2.5vw, 1.35rem); }
|
|
|
|
p { margin: 0; }
|
|
|
|
a {
|
|
color: inherit;
|
|
text-decoration: none;
|
|
}
|
|
|
|
img, svg {
|
|
max-width: 100%;
|
|
height: auto;
|
|
display: block;
|
|
}
|
|
|
|
/* ===== CONTAINER ===== */
|
|
.container {
|
|
width: 100%;
|
|
max-width: 700px;
|
|
margin: 0 auto;
|
|
padding: 0 1rem;
|
|
|
|
@media (min-width: 900px) {
|
|
max-width: 900px;
|
|
padding: 0 1.5rem;
|
|
}
|
|
|
|
@media (min-width: 1200px) {
|
|
max-width: 1100px;
|
|
padding: 0 2rem;
|
|
}
|
|
}
|
|
|
|
/* ===== SCROLLBAR ===== */
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: $color-gray-100;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: $color-brand-primary;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
* {
|
|
scrollbar-width: thin;
|
|
scrollbar-color: $color-brand-primary $color-gray-100;
|
|
}
|
|
|
|
/* ===== SELECTION ===== */
|
|
::selection {
|
|
background: rgba(37, 99, 235, 0.2);
|
|
}
|
|
|
|
/* ===== FOCUS STATES ===== */
|
|
*:focus-visible {
|
|
outline: 2px solid $color-brand-primary;
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
/* ===== MATERIAL ICONS ===== */
|
|
.material-symbols-outlined {
|
|
font-family: 'Material Symbols Outlined';
|
|
font-size: 24px;
|
|
width: 24px;
|
|
height: 24px;
|
|
min-width: 24px;
|
|
line-height: 1;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
|
|
/* Verhindert Layout-Shift beim Font-Laden */
|
|
font-display: block;
|
|
}
|
|
|
|
/* ===== GLASS PANEL ===== */
|
|
.glass-panel {
|
|
background: $glass-bg;
|
|
border: 1px solid $glass-border;
|
|
border-radius: $radius-xl;
|
|
box-shadow: $shadow-glass;
|
|
padding: 1.5rem;
|
|
|
|
@media (min-width: 641px) {
|
|
backdrop-filter: blur(20px);
|
|
padding: 2rem;
|
|
}
|
|
}
|
|
|
|
/* ===== FORM ELEMENTS ===== */
|
|
input[type="text"],
|
|
input[type="email"],
|
|
input[type="password"],
|
|
input[type="tel"],
|
|
input[type="number"],
|
|
textarea,
|
|
select {
|
|
width: 100%;
|
|
padding: 0.75rem 1rem;
|
|
border: 2px solid $color-gray-200;
|
|
border-radius: $radius-md;
|
|
font-size: 1rem;
|
|
font-family: inherit;
|
|
color: $color-text-primary;
|
|
background: $color-white;
|
|
transition: border-color 0.2s;
|
|
|
|
&:focus {
|
|
outline: none;
|
|
border-color: $color-brand-primary;
|
|
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
|
|
}
|
|
|
|
&::placeholder {
|
|
color: $color-text-tertiary;
|
|
}
|
|
}
|
|
|
|
textarea {
|
|
min-height: 120px;
|
|
resize: vertical;
|
|
}
|
|
|
|
label {
|
|
display: block;
|
|
font-size: 0.9375rem;
|
|
font-weight: 600;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
/* ===== UTILITIES ===== */
|
|
.sr-only {
|
|
position: absolute;
|
|
width: 1px;
|
|
height: 1px;
|
|
padding: 0;
|
|
margin: -1px;
|
|
overflow: hidden;
|
|
clip: rect(0, 0, 0, 0);
|
|
border: 0;
|
|
}
|
|
|
|
.truncate {
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.text-center { text-align: center; }
|
|
|
|
/* ===== ANIMATIONS ===== */
|
|
@keyframes fadeIn {
|
|
from { opacity: 0; }
|
|
to { opacity: 1; }
|
|
}
|
|
|
|
@keyframes spin {
|
|
to { transform: rotate(360deg); }
|
|
}
|
|
|
|
.spinner {
|
|
width: 32px;
|
|
height: 32px;
|
|
border: 3px solid $color-gray-200;
|
|
border-top-color: $color-brand-primary;
|
|
border-radius: 50%;
|
|
animation: spin 0.8s linear infinite;
|
|
}
|
|
|
|
/* ===== REDUCED MOTION ===== */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*, *::before, *::after {
|
|
animation-duration: 0.01ms !important;
|
|
transition-duration: 0.01ms !important;
|
|
}
|
|
}
|
|
|
|
/* ===== MOBILE PERFORMANCE ===== */
|
|
@media (max-width: 640px) {
|
|
*, *::before, *::after {
|
|
backdrop-filter: none !important;
|
|
}
|
|
} |