Files
oikos/public/styles/tokens.css
T
Ulas Kalayci c4cb52d042 feat(nav): shared sub-tabs component for settings and kitchen
Extracts the tab-bar UI into a reusable renderSubTabs() utility
(public/utils/sub-tabs.js + public/styles/sub-tabs.css) so all
sub-module navigation shares one implementation and visual style.

- Settings: replaces template-literal <nav class="settings-tabs">
  with renderSubTabs(); tabs now show icon + label (pill-style),
  group separators via separatorBefore, panel switching via onChange
- Kitchen: renderKitchenTabsBar() becomes a thin wrapper around
  renderSubTabs(); kitchen-tabs.css keeps only layout adjustment rules
- CSS: kitchen-tab* rules removed from kitchen-tabs.css,
  settings-tab-btn* rules removed from settings.css; both now
  inherit from sub-tabs.css
- tokens.css: adds --sub-tabs-height (52px default;
  kitchen overrides to --kitchen-tabs-height: 56px)
- test-browser-loader.mjs: resolves browser-absolute /utils/*.js
  imports to public/ directory for Node test compatibility

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 07:33:54 +02:00

763 lines
32 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Modul: Design Tokens
* Zweck: CSS Custom Properties fuer das gesamte Design-System
* Abhängigkeiten: keine
*
* Aufbau:
* 1. Neutral-Farbskala (50950)
* 2. Akzentfarben + Semantische Farben
* 3. Modul-Akzentfarben
* 4. Mahlzeit-Typ-Farben
* 5. Prioritäten
* 6. Overlay / Backdrop
* 7. Schatten
* 8. Border-Radien
* 9. Typografie
* 10. Abstände (4px-Raster)
* 11. Layout
* 12. Sidebar
* 13. Übergänge
* 14. Z-Indizes
* 15. Dark Mode
*
* Dark-Mode-Architektur (§8.2):
* Private Tokens (--_name) halten den aktuellen Wert.
* Öffentliche Tokens (--name) zeigen immer auf var(--_name).
* Dark-Mode-Blöcke überschreiben nur die privaten Tokens —
* die öffentliche API bleibt stabil und muss nie doppelt geändert werden.
*/
/* --------------------------------------------------------
* Plus Jakarta Sans — selbst gehostet, Variable Font
* -------------------------------------------------------- */
@font-face {
font-family: 'Plus Jakarta Sans';
src: url('/fonts/plus-jakarta-sans-variable.woff2') format('woff2-variations');
font-weight: 200 800;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Plus Jakarta Sans';
src: url('/fonts/plus-jakarta-sans-variable-italic.woff2') format('woff2-variations');
font-weight: 200 800;
font-style: italic;
font-display: swap;
}
:root {
/* --------------------------------------------------------
* 1. Farben - Neutral-Skala
* Leicht warmgetönt (kein reines Grau) für einladende Atmosphäre.
* Private --_neutral-* für Dark-Mode-Überschreibungen;
* öffentliche --neutral-* sind die stabile API.
* -------------------------------------------------------- */
--_neutral-50: #FAFAF8;
--neutral-50: var(--_neutral-50);
--_neutral-100: #F5F4F1;
--neutral-100: var(--_neutral-100);
--_neutral-150: #EFEEE9;
--neutral-150: var(--_neutral-150);
--_neutral-200: #E8E7E2;
--neutral-200: var(--_neutral-200);
--_neutral-250: #DDDCD7;
--neutral-250: var(--_neutral-250);
--_neutral-300: #D1D0CB;
--neutral-300: var(--_neutral-300);
--_neutral-400: #B5B4AF;
--neutral-400: var(--_neutral-400);
--_neutral-500: #8E8D89;
--neutral-500: var(--_neutral-500);
--_neutral-600: #6C6B67;
--neutral-600: var(--_neutral-600);
--_neutral-700: #4A4A46;
--neutral-700: var(--_neutral-700);
--_neutral-800: #2E2E2B;
--neutral-800: var(--_neutral-800);
--_neutral-900: #1C1C1A;
--neutral-900: var(--_neutral-900);
--_neutral-950: #121211;
--neutral-950: var(--_neutral-950);
/* Semantische Aliase (abwärtskompatibel) */
--color-bg: var(--neutral-100);
--_color-surface: #FFFFFF;
--color-surface: var(--_color-surface);
/* surface-2: recessed/vertieft (dunkler als bg in dark mode — kein Elevations-Token) */
--color-surface-2: var(--neutral-50);
--_color-surface-3: var(--_neutral-150);
--color-surface-3: var(--_color-surface-3);
--color-border: var(--neutral-200);
--color-border-subtle: var(--neutral-150);
--color-text-primary: var(--neutral-900);
--color-text-secondary: var(--neutral-600); /* WCAG AA: ~5.0:1 auf weiß */
--_color-text-tertiary: #6A6964;
--color-text-tertiary: var(--_color-text-tertiary); /* WCAG AA: 4.61:1 auf --color-bg */
--color-text-disabled: var(--neutral-300);
--color-text-on-accent: #ffffff; /* Weißer Text auf farbigen Hintergründen */
/* Elevation-Stufen für interaktive Listen-Elemente (More-Sheet, Search) */
--_color-surface-elevated: var(--_neutral-50);
--color-surface-elevated: var(--_color-surface-elevated);
--_color-surface-hover: var(--_neutral-150);
--color-surface-hover: var(--_color-surface-hover);
/* --------------------------------------------------------
* 2. Farben - Akzent (konfigurierbar)
* Indigo mit leichtem Violett-Drall — charaktervoller als Default-Blau,
* harmoniert mit --color-accent-secondary und --module-calendar.
* -------------------------------------------------------- */
--_color-accent: #4F46E5;
--color-accent: var(--_color-accent); /* Indigo-600 — 4.93:1 auf weiß */
--_color-accent-hover: #4338CA;
--color-accent-hover: var(--_color-accent-hover); /* Indigo-700 */
--_color-accent-active: #3730A3;
--color-accent-active: var(--_color-accent-active); /* Indigo-800 */
--color-accent-deep: #2E2D82; /* Tiefer Akzent für Gradienten, Wetter-Widget */
/* Greeting-Gradienten: Tageszeit-Varianten */
--greeting-morning-from: #C2410C; /* Orange-700 — Morgensonne */
--greeting-morning-to: #D97706; /* Amber-600 */
--greeting-evening-from: #6D28D9; /* Violet-700 */
--greeting-evening-to: #8250DF; /* = --module-calendar */
--_color-accent-secondary: #7C5CFC;
--color-accent-secondary: var(--_color-accent-secondary); /* Sekundärer Akzent für Logo-Gradient */
--_color-accent-light: #EEF2FF;
--color-accent-light: var(--_color-accent-light); /* Indigo-50 */
--_color-accent-subtle: #E0E7FF;
--color-accent-subtle: var(--_color-accent-subtle); /* Indigo-100 */
--_color-btn-primary: #4338CA;
--color-btn-primary: var(--_color-btn-primary); /* Indigo-700 — WCAG AAA: 7.04:1 auf weiß */
--_color-btn-primary-hover: #3730A3;
--color-btn-primary-hover: var(--_color-btn-primary-hover); /* Indigo-800 */
/* --------------------------------------------------------
* 3. Farben - Semantisch
* -------------------------------------------------------- */
--_color-success: #15803D;
--color-success: var(--_color-success);
--color-success-hover: #166534;
--_color-success-light: #DAFBE1;
--color-success-light: var(--_color-success-light);
--_color-warning: #A15C0A;
--color-warning: var(--_color-warning); /* Hue-Trennung von --module-meals, 5.23:1 auf weiß */
--color-warning-hover: #824908;
--_color-warning-light: #FFF4D4;
--color-warning-light: var(--_color-warning-light);
--_color-danger: #B91C1C;
--color-danger: var(--_color-danger); /* Red-700 — 6.90:1 auf weiß */
--color-danger-hover: #991B1B; /* Red-800 */
--_color-danger-light: #FFE2E0;
--color-danger-light: var(--_color-danger-light);
--color-info: #0969DA; /* WCAG AA: ~4.6:1 auf weiß */
--color-info-hover: #0550AE;
--_color-info-light: #DDF4FF;
--color-info-light: var(--_color-info-light);
/* Toast-Textfarben: weiß auf dunklen semantischen Bg (light mode).
* Dark mode überschreibt auf dunkel, weil --color-success/warning/danger
* dort vivid/hell sind und weißen Text unleserlich machen würden. */
--_toast-success-text: var(--color-text-on-accent);
--toast-success-text: var(--_toast-success-text);
--_toast-warning-text: var(--color-text-on-accent);
--toast-warning-text: var(--_toast-warning-text);
--_toast-danger-text: var(--color-text-on-accent);
--toast-danger-text: var(--_toast-danger-text);
/* --------------------------------------------------------
* 4. Farben - Modul-Akzente
* Jedes Modul hat eine eigene dezente Akzentfarbe.
* Einsatz in Modul-Headern, Icons, aktiven States.
* Domain-Farben von Severity entkoppelt — siehe §2.5 des Redesign-Vorschlags.
* -------------------------------------------------------- */
--_module-dashboard: #4F46E5;
--module-dashboard: var(--_module-dashboard); /* Indigo - Übersicht (= --color-accent, bewusster Share) */
--_module-tasks: #15803D;
--module-tasks: var(--_module-tasks); /* Grün - Erledigung (= --color-success, bewusster Share) */
--_module-calendar: #8250DF;
--module-calendar: var(--_module-calendar); /* Violett - Termine, Zeit */
--_module-meals: #C2410C;
--module-meals: var(--_module-meals); /* Orange-700 - Essen, Wärme */
--_module-recipes: #0D9488;
--module-recipes: var(--_module-recipes); /* Teal-600 - Rezepte */
--_module-shopping: #DB2777;
--module-shopping: var(--_module-shopping); /* Pink-600 - Einkaufen (trennt von Meals) */
--_module-notes: #A16207;
--module-notes: var(--_module-notes); /* Amber-700 - Notizen (6.3:1 auf weiß — WCAG AA) */
--_module-contacts: #0969DA;
--module-contacts: var(--_module-contacts); /* Kräftiges Blau - Kontakte */
--_module-birthdays: #E11D48;
--module-birthdays: var(--_module-birthdays); /* Rose - Geburtstage */
--_module-budget: #0F766E;
--module-budget: var(--_module-budget); /* Teal-700 - Finanzen, Stabilität */
--_module-documents: #1D4ED8;
--module-documents: var(--_module-documents); /* Blue - secure family documents */
--_module-settings: #6E7781;
--module-settings: var(--_module-settings); /* Grau - Konfiguration */
--_module-reminders: #0E7490;
--module-reminders: var(--_module-reminders); /* Cyan-700 - Erinnerungen, 6.3:1 auf weiß — WCAG AA */
/* --------------------------------------------------------
* 5. Farben - Mahlzeit-Typen
* Zentrale Tokens statt Hardcoding in meals.css
* -------------------------------------------------------- */
--_meal-breakfast: #A15C0A;
--meal-breakfast: var(--_meal-breakfast); /* Morgensonne-Amber (= --color-warning, bewusster Share) */
--_meal-breakfast-light: #FFF4D4;
--meal-breakfast-light: var(--_meal-breakfast-light);
--meal-lunch: #2DA44E;
--_meal-lunch-light: #DAFBE1;
--meal-lunch-light: var(--_meal-lunch-light);
--_meal-dinner: #4F46E5;
--meal-dinner: var(--_meal-dinner); /* Indigo - ruhiger Tag-Ausklang (= --color-accent) */
--_meal-dinner-light: #EEF2FF;
--meal-dinner-light: var(--_meal-dinner-light);
--meal-snack: #C2410C; /* = --module-meals — Snack ist Sub-Domain */
--_meal-snack-light: #FFECE3;
--meal-snack-light: var(--_meal-snack-light);
/* --------------------------------------------------------
* 6. Farben - Prioritäten
* -------------------------------------------------------- */
--color-priority-none: var(--neutral-400);
--color-priority-low: var(--neutral-500);
--color-priority-medium: #A16207; /* Amber-700 — trennt von --color-warning + --module-meals */
--color-priority-high: #C2410C; /* = --module-meals (bewusster Share: „heiß") */
--color-priority-urgent: #B91C1C; /* = --color-danger (bewusster Share: „gefährlich") */
/* Hintergrundfarben für Priority-Badges */
--_color-priority-none-bg: rgba(142, 141, 137, 0.08);
--color-priority-none-bg: var(--_color-priority-none-bg);
--_color-priority-low-bg: rgba(142, 141, 137, 0.12);
--color-priority-low-bg: var(--_color-priority-low-bg);
--_color-priority-medium-bg: rgba(161, 98, 7, 0.12);
--color-priority-medium-bg: var(--_color-priority-medium-bg);
--_color-priority-high-bg: rgba(194, 65, 12, 0.12);
--color-priority-high-bg: var(--_color-priority-high-bg);
--_color-priority-urgent-bg: rgba(185, 28, 28, 0.12);
--color-priority-urgent-bg: var(--_color-priority-urgent-bg);
/* --------------------------------------------------------
* 7. Overlay / Backdrop
* -------------------------------------------------------- */
--_color-overlay: rgba(0, 0, 0, 0.45);
--color-overlay: var(--_color-overlay);
--_color-overlay-light: rgba(0, 0, 0, 0.2);
--color-overlay-light: var(--_color-overlay-light);
--color-overlay-glass: rgba(0, 0, 0, 0.30); /* Glass-Modal-Overlay (zwischen overlay-light und overlay) */
--color-backdrop-fab: rgba(0, 0, 0, 0.25);
--color-backdrop-glass: rgba(0, 0, 0, 0.18); /* Subtiler FAB-Backdrop hinter Glass */
/* Glass-Overlays (fuer Elemente auf farbigen Hintergruenden) */
--color-glass: rgba(255, 255, 255, 0.18);
--color-glass-hover: rgba(255, 255, 255, 0.3);
--color-glass-border: rgba(255, 255, 255, 0.15);
--color-danger-translucent: rgba(255, 59, 48, 0.35);
--color-warning-translucent: rgba(245, 158, 11, 0.28);
--color-soon: var(--color-warning);
/* --------------------------------------------------------
* 8. Schatten
* 3 Stufen: subtle (Karten), medium (Dropdowns, Hover),
* elevated (Modals, FAB).
* -------------------------------------------------------- */
--shadow-drop-icon: drop-shadow(0 2px 4px rgba(18, 14, 8, 0.16));
--_shadow-sm: 0 1px 2px rgba(18, 14, 8, 0.05), 0 1px 4px rgba(18, 14, 8, 0.04);
--shadow-sm: var(--_shadow-sm);
--_shadow-md: 0 2px 8px rgba(18, 14, 8, 0.09), 0 1px 2px rgba(18, 14, 8, 0.05);
--shadow-md: var(--_shadow-md);
--_shadow-lg: 0 8px 24px rgba(18, 14, 8, 0.13), 0 2px 6px rgba(18, 14, 8, 0.05);
--shadow-lg: var(--_shadow-lg);
--_shadow-xl: 0 16px 48px rgba(18, 14, 8, 0.19), 0 4px 12px rgba(18, 14, 8, 0.07);
--shadow-xl: var(--_shadow-xl);
--_shadow-xs: 0 1px 2px rgba(18, 14, 8, 0.09);
--shadow-xs: var(--_shadow-xs);
/* --------------------------------------------------------
* 9. Border-Radien
* -------------------------------------------------------- */
--radius-xs: 4px;
--radius-sm: 8px;
--radius-md: 12px;
--radius-lg: 16px;
--radius-xl: 24px;
--radius-full: 9999px;
/* --------------------------------------------------------
* 10. Typografie
* System-Font-Stack laut Redesign-Spec.
* Skala von xs (12px) bis 4xl (36px).
* -------------------------------------------------------- */
--font-sans: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
--font-mono: 'SF Mono', 'Fira Code', 'Fira Mono', 'Roboto Mono', monospace;
/* Size-Skala */
--text-2xs: 0.625rem; /* 10px - Sehr kleine Badges (z.B. Erinnerungs-Zähler) */
--text-xs: 0.75rem; /* 12px - Minimum, Captions, Badges, Nav-Labels */
--text-sm: 0.8125rem; /* 13px - Small/Secondary */
--text-base: 0.9375rem; /* 15px - Body (Desktop) */
--text-md: 1rem; /* 16px - Body (Mobile), Inputs */
--text-lg: 1.125rem; /* 18px - Section-Title */
--text-xl: 1.25rem; /* 20px - Subtitle */
--text-2xl: 1.5rem; /* 24px - Page-Title */
--text-3xl: 1.875rem; /* 30px - Page-Title Desktop */
--text-4xl: 2.25rem; /* 36px - Hero/Greeting */
/* Line-Heights */
--line-height-tight: 1.25;
--line-height-snug: 1.375;
--line-height-base: 1.5;
--line-height-relaxed: 1.625;
/* Font-Weights */
--font-weight-regular: 400;
--font-weight-medium: 500;
--font-weight-semibold: 600;
--font-weight-bold: 700;
/* --------------------------------------------------------
* 11. Abstände - 4px-Raster
* -------------------------------------------------------- */
--space-0: 0px;
--space-px: 1px;
--space-0h: 2px;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-10: 40px;
--space-12: 48px;
--space-16: 64px;
/* --------------------------------------------------------
* 11b. Touch-Target Sizes
* -------------------------------------------------------- */
--target-sm: 32px; /* Visuelle Größe (z.B. Logos) — kein Touch-Target */
--target-md: 40px; /* Desktop Touch-Target (Maus) */
--target-lg: 48px; /* Mobile Touch-Target (Finger) */
--target-base: 44px; /* iOS-Minimum Touch-Target (44pt) */
/* --------------------------------------------------------
* 12. Layout
* -------------------------------------------------------- */
--nav-height-mobile: 56px;
--nav-bottom-height: calc(var(--nav-height-mobile) + 12px); /* scroll (56px) + dots-indicator (12px) */
--sidebar-width: 56px; /* collapsed icon-only (10241279px) */
--sidebar-width-expanded: 220px; /* full sidebar (1440px+), max 240px laut Spec */
--content-max-width: 1280px;
--content-max-width-narrow: 720px;
--cal-hour-height: 56px;
--sub-tabs-height: 52px;
--kitchen-tabs-height: 56px;
/* --------------------------------------------------------
* 13. Sidebar
* Reduzierter Neumorphismus - subtilere Schatten.
* -------------------------------------------------------- */
--_sidebar-bg: var(--_neutral-100);
--sidebar-bg: var(--_sidebar-bg);
--_sidebar-shadow-light: rgba(255, 255, 255, 0.6);
--sidebar-shadow-light: var(--_sidebar-shadow-light);
--_sidebar-shadow-dark: rgba(0, 0, 0, 0.08);
--sidebar-shadow-dark: var(--_sidebar-shadow-dark);
--safe-area-inset-top: env(safe-area-inset-top, 0px);
--safe-area-inset-bottom: env(safe-area-inset-bottom, 0px);
/* --------------------------------------------------------
* 14. Übergänge
* fast=150ms, base=250ms, slow=400ms (laut Redesign-Spec)
* -------------------------------------------------------- */
--transition-fast: 0.15s ease;
--transition-base: 0.25s ease;
--transition-slow: 0.4s ease;
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
/* --------------------------------------------------------
* 15. Z-Indizes
* -------------------------------------------------------- */
--z-base: 0;
--z-card: 1;
--z-sticky: 10;
--z-dropdown: 50;
--z-nav: 100;
--z-modal: 200;
--z-toast: 300;
/* --------------------------------------------------------
* 16. Glass-Design-System (Liquid Glass Layer)
* Additive Tokens bestehende Tokens werden nicht verändert.
* Aktivierung per @supports (backdrop-filter) in Komponenten.
*
* Aufbau:
* a) Glass-Hintergründe
* b) Blur-Stufen
* c) Opazitäten
* d) Highlights / Specular
* e) Glass-Schatten
* f) Glass-Radien
* g) Glass-Übergänge
* -------------------------------------------------------- */
/* a) Glass-Hintergründe */
--_glass-bg: rgba(255, 255, 255, 0.72);
--glass-bg: var(--_glass-bg);
--_glass-bg-hover: rgba(255, 255, 255, 0.82);
--glass-bg-hover: var(--_glass-bg-hover);
--_glass-bg-elevated: rgba(255, 255, 255, 0.88);
--glass-bg-elevated: var(--_glass-bg-elevated);
--_glass-border: rgba(255, 255, 255, 0.60);
--glass-border: var(--_glass-border);
--_glass-border-subtle: rgba(255, 255, 255, 0.35);
--glass-border-subtle: var(--_glass-border-subtle);
--glass-border-overlay: rgba(255, 255, 255, 0.10); /* immer-dunkle Surfaces (Toasts, Overlays) */
/* a2) Glass-Hintergründe: Vibrancy-Stufe (transparenter, mehr Durchschein) */
--_glass-bg-card: rgba(255, 255, 255, 0.52);
--glass-bg-card: var(--_glass-bg-card);
--_glass-bg-card-hover: rgba(255, 255, 255, 0.65);
--glass-bg-card-hover: var(--_glass-bg-card-hover);
--_glass-bg-input: rgba(255, 255, 255, 0.48);
--glass-bg-input: var(--_glass-bg-input);
--_glass-bg-toolbar: rgba(255, 255, 255, 0.58);
--glass-bg-toolbar: var(--_glass-bg-toolbar);
/* a3) Tint: Modul-Akzentfarbe als subtile Glass-Tonung */
--_glass-tint-strength: 6%;
--glass-tint-strength: var(--_glass-tint-strength);
/* b) Blur-Stufen */
--blur-2xs: blur(2px);
--blur-xs: blur(4px);
--blur-sm: blur(8px);
--blur-md: blur(16px);
--blur-lg: blur(28px);
--blur-xl: blur(48px);
/* c) Opazitäten */
--opacity-glass-subtle: 0.65;
--opacity-glass-base: 0.80;
--opacity-glass-elevated: 0.92;
/* d) Highlights / Specular */
--_glass-highlight: rgba(255, 255, 255, 0.70);
--glass-highlight: var(--_glass-highlight);
--_glass-highlight-subtle: rgba(255, 255, 255, 0.35);
--glass-highlight-subtle: var(--_glass-highlight-subtle);
--glass-highlight-mid: rgba(255, 255, 255, 0.50); /* Mittlere Stärke für Outlines auf dunklen Surfaces */
/* d2) Inset-Specular: Oberrand-Sheen für Glass-Elemente (volle inset-Kurzform) */
--glass-inset-soft: inset 0 1px 0 rgba(255, 255, 255, 0.18);
--glass-inset-base: inset 0 1px 0 rgba(255, 255, 255, 0.20);
--glass-inset-medium: inset 0 1px 0 rgba(255, 255, 255, 0.22);
--glass-inset-elevated: inset 0 1px 0 rgba(255, 255, 255, 0.28);
--glass-inset-strong: inset 0 1px 0 rgba(255, 255, 255, 0.32);
/* d3) Dark-Inset-Specular: Unterrand-Schatten (komplementär zu den White-Insets oben) */
--glass-inset-bottom-base: inset 0 -1px 0 rgba(0, 0, 0, 0.12);
--glass-inset-bottom-hover: inset 0 -1px 0 rgba(0, 0, 0, 0.16);
--glass-inset-thumb: inset 0 1px 0 rgba(255, 255, 255, 0.90),
inset 0 -1px 0 rgba(0, 0, 0, 0.08);
--glass-inset-input: inset 0 1px 2px rgba(0, 0, 0, 0.04);
/* e) Glass-Schatten */
--_glass-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(255, 255, 255, 0.55);
--glass-shadow-sm: var(--_glass-shadow-sm);
--_glass-shadow-md: 0 4px 20px rgba(0, 0, 0, 0.10), 0 0 0 1px rgba(255, 255, 255, 0.50);
--glass-shadow-md: var(--_glass-shadow-md);
--_glass-shadow-lg: 0 8px 40px rgba(0, 0, 0, 0.14), 0 0 0 1px rgba(255, 255, 255, 0.45);
--glass-shadow-lg: var(--_glass-shadow-lg);
/* f) Glass-Radien */
--radius-glass-card: 20px;
--radius-glass-inner: 14px;
--radius-glass-chip: var(--radius-full);
--radius-glass-button: var(--radius-full);
/* g) Glass-Übergänge */
--ease-glass: cubic-bezier(0.34, 1.56, 0.64, 1);
--transition-glass: 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* ================================================================
* Dark Mode — private Tokens überschreiben, öffentliche API bleibt stabil.
*
* Zwei Selektoren aktivieren Dark Mode:
* 1. @media (prefers-color-scheme: dark) — System-Präferenz (CSS-native,
* kein JS erforderlich, funktioniert auch wenn matchMedia blockiert ist)
* 2. [data-theme="dark"] — expliziter Override durch den Nutzer
*
* Explizites Light ([data-theme="light"]) blockiert den @media-Block via :not().
* Explizites Dark ([data-theme="dark"]) überschreibt den @media-Block, falls OS
* auf Light steht.
* ================================================================ */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
/* Neutral-Skala — tiefer warm (Option A) */
--_neutral-50: #141413;
--_neutral-100: #1A1A18;
--_neutral-150: #222220;
--_neutral-200: #2A2A28;
--_neutral-250: #333331;
--_neutral-300: #3D3D3A;
--_neutral-400: #636360;
--_neutral-500: #8E8D89;
--_neutral-600: #AEADB0;
--_neutral-700: #C8C7C3;
--_neutral-800: #E2E1DC;
--_neutral-900: #F5F4F1;
--_neutral-950: #FAFAF8;
--_color-surface: #222220;
--_color-surface-3: #2A2A28;
--_color-surface-elevated: #2A2A28;
--_color-surface-hover: #333331;
--_sidebar-bg: #141413;
--_sidebar-shadow-light: rgba(255, 255, 255, 0.04);
--_sidebar-shadow-dark: rgba(0, 0, 0, 0.4);
--_color-accent: #818CF8;
--_color-accent-hover: #6366F1;
--_color-accent-active: #4F46E5;
--_color-accent-light: #2E2D5B;
--_color-accent-subtle: #252255;
--_color-btn-primary: #6366F1;
--_color-btn-primary-hover: #4F46E5;
--_color-accent-secondary: #A78BFA;
--_color-success: #4ADE80;
--_color-warning: #F59E0B;
--_color-danger: #FCA5A5;
--_color-text-tertiary: #A3A3A0;
--_color-success-light: #1A3325;
--_color-warning-light: #332400;
--_color-danger-light: #3D1C1A;
--_color-info-light: #1A2D40;
/* Toast: dunkler Text auf vividen Farben (#4ADE80, #F59E0B, #FCA5A5) */
--_toast-success-text: #062010; /* 13.6:1 auf #4ADE80 */
--_toast-warning-text: #291400; /* 13.1:1 auf #F59E0B */
--_toast-danger-text: #330808; /* 15.1:1 auf #FCA5A5 */
--_module-dashboard: #818CF8;
--_module-tasks: #4ADE80;
--_module-calendar: #A78BFA;
--_module-meals: #FB923C;
--_module-shopping: #F472B6;
--_module-notes: #FCD34D;
--_module-contacts: #60A5FA;
--_module-birthdays: #FB7185;
--_module-budget: #2DD4BF;
--_module-settings: #94A3B8;
--_module-reminders: #22D3EE; /* Cyan-400 */
--_meal-breakfast: #F59E0B;
--_meal-breakfast-light: #332400;
--_meal-lunch-light: #1A3325;
--_meal-dinner: #818CF8;
--_meal-dinner-light: #2E2D5B;
--_meal-snack-light: #3D2010;
--_color-priority-none-bg: rgba(142, 141, 137, 0.12);
--_color-priority-low-bg: rgba(142, 141, 137, 0.18);
--_color-priority-medium-bg: rgba(230, 147, 10, 0.18);
--_color-priority-high-bg: rgba(212, 81, 30, 0.18);
--_color-priority-urgent-bg: rgba(229, 83, 75, 0.18);
--_color-overlay: rgba(0, 0, 0, 0.6);
--_color-overlay-light: rgba(0, 0, 0, 0.35);
--_shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25);
--_shadow-md: 0 4px 12px rgba(0, 0, 0, 0.35);
--_shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.45);
--_shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.60), 0 4px 12px rgba(0, 0, 0, 0.25);
--_shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.30);
--_glass-bg: rgba(28, 28, 26, 0.75);
--_glass-bg-hover: rgba(38, 38, 36, 0.82);
--_glass-bg-elevated: rgba(46, 46, 44, 0.90);
--_glass-border: rgba(255, 255, 255, 0.10);
--_glass-border-subtle: rgba(255, 255, 255, 0.06);
--_glass-highlight: rgba(255, 255, 255, 0.09);
--_glass-highlight-subtle: rgba(255, 255, 255, 0.05);
--_glass-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.30), 0 0 0 1px rgba(255, 255, 255, 0.07);
--_glass-shadow-md: 0 4px 20px rgba(0, 0, 0, 0.40), 0 0 0 1px rgba(255, 255, 255, 0.06);
--_glass-shadow-lg: 0 8px 40px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.05);
--_glass-bg-card: rgba(26, 26, 24, 0.50);
--_glass-bg-card-hover: rgba(36, 36, 34, 0.62);
--_glass-bg-input: rgba(22, 22, 20, 0.45);
--_glass-bg-toolbar: rgba(28, 28, 26, 0.55);
--_glass-tint-strength: 8%;
}
}
[data-theme="dark"] {
/* Neutral-Skala — tiefer warm (Option A) */
--_neutral-50: #141413;
--_neutral-100: #1A1A18;
--_neutral-150: #222220;
--_neutral-200: #2A2A28;
--_neutral-250: #333331;
--_neutral-300: #3D3D3A;
--_neutral-400: #636360;
--_neutral-500: #8E8D89;
--_neutral-600: #AEADB0; /* WCAG AA: ~5.6:1 auf #222220 */
--_neutral-700: #C8C7C3;
--_neutral-800: #E2E1DC;
--_neutral-900: #F5F4F1;
--_neutral-950: #FAFAF8;
/* Semantische Aliase folgen automatisch via var(--neutral-*) */
--_color-surface: #222220;
--_color-surface-3: #2A2A28;
--_color-surface-elevated: #2A2A28;
--_color-surface-hover: #333331;
/* Sidebar */
--_sidebar-bg: #141413;
--_sidebar-shadow-light: rgba(255, 255, 255, 0.04);
--_sidebar-shadow-dark: rgba(0, 0, 0, 0.4);
/* Akzent - Dark Mode (Indigo bleibt, nur Lightness/Saturation rücken) */
--_color-accent: #818CF8; /* Indigo-400 — 6.8:1 auf #2A2A28 */
--_color-accent-hover: #6366F1; /* Indigo-500 */
--_color-accent-active: #4F46E5; /* Indigo-600 (= Light-Primary, Mirroring) */
--_color-accent-light: #2E2D5B;
--_color-accent-subtle: #252255;
--_color-btn-primary: #6366F1; /* Indigo-500 — 5.5:1 auf Dark-Surface */
--_color-btn-primary-hover: #4F46E5;
--_color-accent-secondary: #A78BFA;
/* Semantische Farben */
--_color-success: #4ADE80;
--_color-warning: #F59E0B;
--_color-danger: #FCA5A5;
--_color-text-tertiary: #A3A3A0;
--_color-success-light: #1A3325;
--_color-warning-light: #332400;
--_color-danger-light: #3D1C1A;
--_color-info-light: #1A2D40;
/* Toast: dunkler Text auf vividen Farben (#4ADE80, #F59E0B, #FCA5A5) */
--_toast-success-text: #062010; /* 13.6:1 auf #4ADE80 */
--_toast-warning-text: #291400; /* 13.1:1 auf #F59E0B */
--_toast-danger-text: #330808; /* 15.1:1 auf #FCA5A5 */
/* Modul-Akzente (Entflechtung Meals/Shopping spiegelt Light-Mode) */
--_module-dashboard: #818CF8; /* Indigo-400 */
--_module-tasks: #4ADE80;
--_module-calendar: #A78BFA;
--_module-meals: #FB923C; /* Orange-400 */
--_module-shopping: #F472B6; /* Pink-400 */
--_module-notes: #FCD34D;
--_module-contacts: #60A5FA;
--_module-birthdays: #FB7185;
--_module-budget: #2DD4BF; /* Teal-400 */
--_module-settings: #94A3B8;
--_module-reminders: #22D3EE; /* Cyan-400 */
/* Mahlzeit-Typ */
--_meal-breakfast: #F59E0B;
--_meal-breakfast-light: #332400;
--_meal-lunch-light: #1A3325;
--_meal-dinner: #818CF8; /* Indigo-400 */
--_meal-dinner-light: #2E2D5B;
--_meal-snack-light: #3D2010;
/* Priority-Badge Hintergründe */
--_color-priority-none-bg: rgba(142, 141, 137, 0.12);
--_color-priority-low-bg: rgba(142, 141, 137, 0.18);
--_color-priority-medium-bg: rgba(230, 147, 10, 0.18);
--_color-priority-high-bg: rgba(212, 81, 30, 0.18);
--_color-priority-urgent-bg: rgba(229, 83, 75, 0.18);
/* Overlay */
--_color-overlay: rgba(0, 0, 0, 0.6);
--_color-overlay-light: rgba(0, 0, 0, 0.35);
/* Schatten stärker im Dark Mode */
--_shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25);
--_shadow-md: 0 4px 12px rgba(0, 0, 0, 0.35);
--_shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.45);
--_shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.60), 0 4px 12px rgba(0, 0, 0, 0.25);
--_shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.30);
/* Glass */
--_glass-bg: rgba(28, 28, 26, 0.75);
--_glass-bg-hover: rgba(38, 38, 36, 0.82);
--_glass-bg-elevated: rgba(46, 46, 44, 0.90);
--_glass-border: rgba(255, 255, 255, 0.10);
--_glass-border-subtle: rgba(255, 255, 255, 0.06);
--_glass-highlight: rgba(255, 255, 255, 0.09);
--_glass-highlight-subtle: rgba(255, 255, 255, 0.05);
--_glass-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.30), 0 0 0 1px rgba(255, 255, 255, 0.07);
--_glass-shadow-md: 0 4px 20px rgba(0, 0, 0, 0.40), 0 0 0 1px rgba(255, 255, 255, 0.06);
--_glass-shadow-lg: 0 8px 40px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.05);
--_glass-bg-card: rgba(26, 26, 24, 0.50);
--_glass-bg-card-hover: rgba(36, 36, 34, 0.62);
--_glass-bg-input: rgba(22, 22, 20, 0.45);
--_glass-bg-toolbar: rgba(28, 28, 26, 0.55);
--_glass-tint-strength: 8%;
}
/* ================================================================
* Accessibility: prefers-reduced-transparency
* Glass-Effekte abschalten - opake Fallbacks.
* ================================================================ */
@media (prefers-reduced-transparency: reduce) {
:root {
--glass-bg: var(--color-surface);
--glass-bg-hover: var(--color-surface-2);
--glass-bg-elevated: var(--color-surface);
--glass-bg-card: var(--color-surface);
--glass-bg-card-hover: var(--color-surface-2);
--glass-bg-input: var(--color-surface);
--glass-bg-toolbar: var(--color-surface);
--glass-border: var(--color-border);
--glass-border-subtle: var(--color-border-subtle);
--glass-highlight: transparent;
--glass-highlight-subtle: transparent;
--glass-tint-strength: 0%;
--blur-2xs: blur(0px);
--blur-xs: blur(0px);
--blur-sm: blur(0px);
--blur-md: blur(0px);
--blur-lg: blur(0px);
--blur-xl: blur(0px);
--opacity-glass-subtle: 1;
--opacity-glass-base: 1;
--opacity-glass-elevated: 1;
}
}
/* ================================================================
* Accessibility: prefers-contrast: more
* Kontrast erhöhen, Blur reduzieren.
* ================================================================ */
@media (prefers-contrast: more) {
:root {
--glass-bg: rgba(255, 255, 255, 0.97);
--glass-bg-hover: #ffffff;
--glass-bg-elevated: #ffffff;
--glass-border: var(--color-text-primary);
--glass-border-subtle: var(--color-text-secondary);
--glass-highlight: transparent;
--glass-highlight-subtle: transparent;
--blur-2xs: blur(0px);
--blur-xs: blur(0px);
--blur-sm: blur(0px);
--blur-md: blur(0px);
--blur-lg: blur(0px);
--blur-xl: blur(0px);
/* Notes-Token im Hochkontrast auf voll AA-taugliches Yellow-700 (6.3:1) heben */
--module-notes: #A16207;
}
}