340 lines
17 KiB
CSS
340 lines
17 KiB
CSS
/* =============================================================================
|
||
CheckPoint Ehrenamt · tokens.css
|
||
Mandantenfähiges Token-System mit Hell- und Dunkelmodus.
|
||
ZWEI ROLLEN-THEMES IN EINER DATEI: User (Mobile, Bottom-Nav) und
|
||
Admin (Desktop-Sidebar, mobil per Off-Canvas). Jedes Theme ist für sich
|
||
mandantenfähig — ein neues Team tauscht beide Brand-Blöcke.
|
||
|
||
AUFBAU (pro Theme dieselben drei Schichten):
|
||
1) BRAND – pro Team austauschbar. Ein zweites Team ändert NUR diese Werte.
|
||
2) BASE – theme-unabhängig: Abstände, Radien, Schrift, Transitions.
|
||
3) SEMANTIK – hell + dunkel in einem, gelöst über die CSS-Funktion light-dark().
|
||
|
||
NAMENSRAUM:
|
||
--cp-user-* → Token für die Ehrenamtlichen-Oberfläche (Bottom-Nav-Shell)
|
||
--cp-admin-* → Token für die Admin-Oberfläche (Sidebar-Shell)
|
||
Komponenten-CSS wählt je Shell den passenden Namensraum. Es gibt keine
|
||
gemeinsamen Farb-Tokens mehr ohne Präfix — das verhindert versehentliches
|
||
Mischen der beiden Looks.
|
||
|
||
THEME-STEUERUNG (kein JavaScript nötig):
|
||
- Standard folgt der Systemeinstellung (prefers-color-scheme) automatisch.
|
||
- Optionaler manueller Override später: <html data-theme="dark"> bzw. "light".
|
||
|
||
Hinweis: Diese Datei definiert nur Variablen. Komponenten-CSS muss diese
|
||
Tokens verwenden (z. B. background: var(--cp-user-surface)), damit der
|
||
Dunkelmodus wirklich greift – nirgends feste Weiß-/Schwarzwerte verdrahten.
|
||
============================================================================= */
|
||
|
||
/* Schriften selbst gehostet (DSGVO: kein externer Request an Google).
|
||
@font-face-Regeln in fonts.css, Dateien unter static/fonts/. */
|
||
@import url("fonts.css");
|
||
|
||
/* #############################################################################
|
||
TEIL A · USER-THEME (Ehrenamtliche, Mobile, Bottom-Nav)
|
||
############################################################################# */
|
||
/* =============================================================================
|
||
A.1 · BRAND (pro Mandant überschreiben — User-Theme)
|
||
----------------------------------------------------------------------------
|
||
Für ein weiteres Team genügt es, diesen Block zu ersetzen – am besten
|
||
serverseitig pro Team eingespielt, z. B.:
|
||
|
||
<style>
|
||
:root {
|
||
--cp-user-brand-primary: #21a8ad;
|
||
--cp-user-brand-primary-strong: #147f84;
|
||
--cp-user-brand-accent: #ef1823;
|
||
--cp-user-brand-accent-strong: #bd0f18;
|
||
--cp-user-brand-font: "DM Sans", Arial, Helvetica, sans-serif;
|
||
}
|
||
</style>
|
||
|
||
Alle getönten Flächen, Fokus-Ringe und Status-Farben werden aus diesen
|
||
wenigen Werten abgeleitet – das Team muss nichts weiter pflegen.
|
||
============================================================================= */
|
||
:root {
|
||
--cp-user-brand-primary: #21a8ad; /* Türkis – Hauptfarbe */
|
||
--cp-user-brand-primary-strong: #147f84; /* Türkis dunkel – Links, starke Akzente */
|
||
--cp-user-brand-accent: #ef1823; /* Rot – dringende Aktionen, Warnungen */
|
||
--cp-user-brand-accent-strong: #bd0f18; /* Rot dunkel – Hover, starke Akzente */
|
||
--cp-user-brand-font: "Roboto Condensed", Arial, Helvetica, sans-serif;
|
||
--cp-user-on-brand: #fff; /* Schrift auf Voll-Marken-Flächen,
|
||
themeunabhängig (Türkis/Rot in beiden
|
||
Modi gleich). Pro Team überschreibbar. */
|
||
}
|
||
|
||
/* =============================================================================
|
||
A.2 · BASE (theme-unabhängig — User-Theme)
|
||
============================================================================= */
|
||
:root {
|
||
--cp-user-font: var(--cp-user-brand-font);
|
||
|
||
--cp-user-radius-sm: 6px;
|
||
--cp-user-radius-md: 8px;
|
||
--cp-user-radius-lg: 12px;
|
||
--cp-user-radius-xl: 16px;
|
||
--cp-user-radius-pill: 999px;
|
||
|
||
--cp-user-space-1: 0.25rem;
|
||
--cp-user-space-2: 0.5rem;
|
||
--cp-user-space-3: 0.75rem;
|
||
--cp-user-space-4: 1rem;
|
||
--cp-user-space-5: 1.25rem;
|
||
--cp-user-space-6: 1.5rem;
|
||
--cp-user-space-8: 2rem;
|
||
|
||
--cp-user-transition: 160ms ease;
|
||
}
|
||
|
||
/* =============================================================================
|
||
A.3 · SEMANTIK (hell + dunkel via light-dark — User-Theme)
|
||
----------------------------------------------------------------------------
|
||
light-dark(HELL, DUNKEL) liefert automatisch den passenden Wert, sobald
|
||
color-scheme aktiv ist. Reihenfolge der Argumente: immer HELL zuerst.
|
||
============================================================================= */
|
||
:root {
|
||
/* --- Flächen & Hintergründe ------------------------------------------- */
|
||
--cp-user-bg: light-dark(#f5f7f8, #0f1518); /* Seitenhintergrund */
|
||
--cp-user-surface: light-dark(#ffffff, #161f22); /* Karten, Header, Formulare */
|
||
--cp-user-surface-alt: light-dark(#f0f5f6, #1d272b); /* neutrale Chips, abgesetzt */
|
||
|
||
/* --- Text -------------------------------------------------------------- */
|
||
--cp-user-text: light-dark(#253033, #e8eef0); /* Haupttext */
|
||
--cp-user-muted: light-dark(#66777c, #9fb1b5); /* Zusatz-/Meta-Text */
|
||
--cp-user-faint: light-dark(#9aabad, #6b7c80); /* inaktiv, sehr leise */
|
||
|
||
/* --- Linien ------------------------------------------------------------ */
|
||
--cp-user-line: light-dark(rgba(37, 48, 51, 0.13), rgba(232, 238, 240, 0.14));
|
||
|
||
/* --- Markenfarben (Buttons, aktive Zustände) -------------------------- */
|
||
--cp-user-teal: var(--cp-user-brand-primary);
|
||
--cp-user-red: var(--cp-user-brand-accent);
|
||
|
||
/* "dark"-Varianten = starke Akzent-/Textfarbe. Im Dunkelmodus heller,
|
||
damit sie auf dunklem Grund lesbar bleibt. */
|
||
--cp-user-teal-dark: light-dark(var(--cp-user-brand-primary-strong), #5fd0d4);
|
||
--cp-user-red-dark: light-dark(var(--cp-user-brand-accent-strong), #ff6b73);
|
||
|
||
/* --- Getönte Flächen (aus der Markenfarbe abgeleitet) ----------------- */
|
||
--cp-user-teal-soft: light-dark(
|
||
color-mix(in srgb, var(--cp-user-brand-primary) 14%, white),
|
||
color-mix(in srgb, var(--cp-user-brand-primary) 26%, transparent)
|
||
);
|
||
--cp-user-red-soft: light-dark(
|
||
color-mix(in srgb, var(--cp-user-brand-accent) 12%, white),
|
||
color-mix(in srgb, var(--cp-user-brand-accent) 26%, transparent)
|
||
);
|
||
|
||
/* --- Info (sekundäre Infoflächen) -------------------------------------- */
|
||
--cp-user-info: light-dark(#2b86c5, #6fb7e6);
|
||
--cp-user-blue-soft: light-dark(#dff4fb, color-mix(in srgb, #4aa3dd 22%, transparent));
|
||
|
||
/* --- Fokus-Ring (aus der Markenfarbe abgeleitet) ---------------------- */
|
||
--cp-user-focus: light-dark(
|
||
color-mix(in srgb, var(--cp-user-brand-primary) 34%, transparent),
|
||
color-mix(in srgb, var(--cp-user-brand-primary) 55%, transparent)
|
||
);
|
||
|
||
/* --- Schatten --------------------------------------------------------- */
|
||
--cp-user-shadow-color: light-dark(rgba(20, 52, 58, 0.12), rgba(0, 0, 0, 0.55));
|
||
--cp-user-shadow-sm: 0 1px 3px var(--cp-user-shadow-color);
|
||
--cp-user-shadow-md: 0 10px 28px var(--cp-user-shadow-color);
|
||
|
||
/* --- Status-Mapping (semantisch, für Badges/Hinweise) ----------------- */
|
||
/* Türkis = offen/bestätigt/verfügbar · Rot = dringend/Vertretung ·
|
||
Neutral = Info/intern/erledigt. */
|
||
--cp-user-status-ok-bg: var(--cp-user-teal-soft);
|
||
--cp-user-status-ok-text: var(--cp-user-teal-dark);
|
||
--cp-user-status-urgent-bg: var(--cp-user-red-soft);
|
||
--cp-user-status-urgent-text: var(--cp-user-red-dark);
|
||
--cp-user-status-neutral-bg: var(--cp-user-surface-alt);
|
||
--cp-user-status-neutral-text: var(--cp-user-muted);
|
||
}
|
||
|
||
/* #############################################################################
|
||
TEIL B · ADMIN-THEME (Sidebar-Verwaltungsoberfläche, Desktop + mobiles
|
||
Off-Canvas-Menü). Eigener, vollständig getrennter Tokensatz — bewusst kein
|
||
Vermischen mit den User-Tokens, damit ein Team beide Looks unabhängig
|
||
pflegen oder austauschen kann.
|
||
############################################################################# */
|
||
|
||
/* =============================================================================
|
||
B.1 · BRAND (pro Mandant überschreiben — Admin-Theme)
|
||
----------------------------------------------------------------------------
|
||
Quelle: "Checkpoint Koeln UI Corporate Design". Ein zweites Team ersetzt
|
||
nur diesen Block plus die Schrift-Imports oben in der Datei.
|
||
============================================================================= */
|
||
:root {
|
||
--cp-admin-brand-navy: #1b1f30; /* Sidebar, Tabellenkopf */
|
||
--cp-admin-brand-navy-soft: #252a3d; /* Sidebar-Trenner, dunkler Hover */
|
||
--cp-admin-brand-teal: #01b2bb; /* Hauptmarkenfarbe, aktive Nav */
|
||
--cp-admin-brand-teal-ui: #11b6c9; /* Primärbuttons, Floating Actions */
|
||
--cp-admin-brand-teal-dark: #139ead; /* Hover, aktive Buttons */
|
||
--cp-admin-brand-yellow: #fbef1f; /* Sidebar-Icons, Markenhighlight */
|
||
--cp-admin-brand-pink: #e6037f; /* Logo-/Markenakzent */
|
||
--cp-admin-brand-red: #e62143; /* Fehler, Abbruch, Warnung */
|
||
--cp-admin-brand-red-dark: #c80f3d; /* Danger-Buttons, Hover */
|
||
--cp-admin-brand-orange: #f59e18; /* sekundäre Hinweise */
|
||
--cp-admin-brand-green: #168a2d; /* Erfolg, verfügbar, bestätigt */
|
||
--cp-admin-brand-font-display: "Alfa Slab One", "Roboto Slab", Georgia, serif;
|
||
--cp-admin-brand-font-ui: "Roboto Condensed", "Arial Narrow", Arial, sans-serif;
|
||
--cp-admin-on-brand: #fff; /* Schrift auf Volltonflächen (Buttons,
|
||
Tabellenkopf, Sidebar-Brand) */
|
||
}
|
||
|
||
/* =============================================================================
|
||
B.2 · BASE (theme-unabhängig — Admin-Theme)
|
||
============================================================================= */
|
||
:root {
|
||
--cp-admin-font-display: var(--cp-admin-brand-font-display);
|
||
--cp-admin-font-ui: var(--cp-admin-brand-font-ui);
|
||
--cp-admin-font-mono: "Roboto Mono", Consolas, monospace;
|
||
|
||
--cp-admin-radius-sm: 6px;
|
||
--cp-admin-radius-md: 10px;
|
||
--cp-admin-radius-lg: 14px;
|
||
|
||
--cp-admin-space-1: 4px;
|
||
--cp-admin-space-2: 8px;
|
||
--cp-admin-space-3: 12px;
|
||
--cp-admin-space-4: 16px;
|
||
--cp-admin-space-5: 24px;
|
||
--cp-admin-space-6: 32px;
|
||
|
||
--cp-admin-sidebar-width: 260px;
|
||
--cp-admin-transition: 160ms ease;
|
||
}
|
||
|
||
/* =============================================================================
|
||
B.3 · SEMANTIK (hell + dunkel via light-dark — Admin-Theme)
|
||
----------------------------------------------------------------------------
|
||
Das Quelldokument beschreibt nur einen hellen Look (helle Arbeitsfläche +
|
||
dunkle Sidebar). Die Sidebar bleibt darum in BEIDEN Modi dunkel (Navy) —
|
||
das ist so gewollt, sie ist ja schon das "dunkle Element" im Hellmodus.
|
||
Im Dunkelmodus wird nur die Arbeitsfläche dunkler, die Sidebar bleibt das
|
||
immer gleiche Marken-Navy. So muss am Logo/Sidebar-Look nichts wechseln.
|
||
============================================================================= */
|
||
:root {
|
||
/* --- Sidebar (in beiden Themes gleich dunkel = Markenelement) ---------- */
|
||
--cp-admin-sidebar-bg: var(--cp-admin-brand-navy);
|
||
--cp-admin-sidebar-hover: var(--cp-admin-brand-navy-soft);
|
||
--cp-admin-sidebar-text: light-dark(rgba(255, 255, 255, 0.92), rgba(255, 255, 255, 0.92));
|
||
--cp-admin-sidebar-text-muted: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));
|
||
--cp-admin-sidebar-icon: var(--cp-admin-brand-yellow);
|
||
--cp-admin-sidebar-active-bg: var(--cp-admin-brand-teal);
|
||
--cp-admin-sidebar-active-text: #ffffff;
|
||
|
||
/* --- Arbeitsfläche & Flächen -------------------------------------------- */
|
||
--cp-admin-bg: light-dark(#f5f7fa, #0e1320); /* Seitenhintergrund */
|
||
--cp-admin-bg-cool: light-dark(#f5fafb, #0c1722); /* kühlerer Arbeitsbereich */
|
||
--cp-admin-surface: light-dark(#ffffff, #161c2b); /* Karten, Panels, Formulare */
|
||
--cp-admin-surface-soft: light-dark(#eef9fb, #16242c); /* Panel-Header, Akkordeons */
|
||
|
||
/* --- Text ---------------------------------------------------------------- */
|
||
--cp-admin-text: light-dark(#1f2b37, #e6ecf1); /* Haupttext */
|
||
--cp-admin-heading: light-dark(#090b10, #f5f8fa); /* Seitentitel, starke Headlines */
|
||
--cp-admin-muted: light-dark(#6e8190, #93a3b0); /* Labels, Meta-Informationen */
|
||
--cp-admin-muted-2: light-dark(#9ba7b1, #6b7a85); /* inaktive Icons, sehr leise */
|
||
|
||
/* --- Linien --------------------------------------------------------------- */
|
||
--cp-admin-line: light-dark(#d6e6ec, rgba(214, 230, 236, 0.18)); /* Rahmen, Input-Borders */
|
||
--cp-admin-line-soft: light-dark(#e8eef2, rgba(214, 230, 236, 0.1)); /* Tabellenlinien */
|
||
|
||
/* --- Markenfarben (Buttons, aktive Zustände, in beiden Themes gleich) --- */
|
||
--cp-admin-teal: var(--cp-admin-brand-teal);
|
||
--cp-admin-teal-ui: var(--cp-admin-brand-teal-ui);
|
||
--cp-admin-teal-dark: light-dark(var(--cp-admin-brand-teal-dark), #5fd6e0);
|
||
--cp-admin-teal-soft: light-dark(
|
||
color-mix(in srgb, var(--cp-admin-brand-teal) 10%, white),
|
||
color-mix(in srgb, var(--cp-admin-brand-teal) 24%, transparent)
|
||
);
|
||
|
||
--cp-admin-pink: var(--cp-admin-brand-pink);
|
||
|
||
--cp-admin-red: var(--cp-admin-brand-red);
|
||
--cp-admin-red-dark: light-dark(var(--cp-admin-brand-red-dark), #ff7a93);
|
||
--cp-admin-red-soft: light-dark(
|
||
color-mix(in srgb, var(--cp-admin-brand-red) 10%, white),
|
||
color-mix(in srgb, var(--cp-admin-brand-red) 24%, transparent)
|
||
);
|
||
|
||
--cp-admin-orange: var(--cp-admin-brand-orange);
|
||
--cp-admin-orange-soft: light-dark(
|
||
color-mix(in srgb, var(--cp-admin-brand-orange) 12%, white),
|
||
color-mix(in srgb, var(--cp-admin-brand-orange) 24%, transparent)
|
||
);
|
||
|
||
--cp-admin-green: var(--cp-admin-brand-green);
|
||
--cp-admin-green-soft: light-dark(#e5f5e6, color-mix(in srgb, var(--cp-admin-brand-green) 24%, transparent));
|
||
|
||
/* --- Fokus-Ring ------------------------------------------------------------ */
|
||
--cp-admin-focus: light-dark(
|
||
color-mix(in srgb, var(--cp-admin-brand-teal) 34%, transparent),
|
||
color-mix(in srgb, var(--cp-admin-brand-teal) 55%, transparent)
|
||
);
|
||
|
||
/* --- Schatten ---------------------------------------------------------- */
|
||
--cp-admin-shadow-color: light-dark(rgba(27, 31, 48, 0.06), rgba(0, 0, 0, 0.5));
|
||
--cp-admin-shadow-soft: 0 2px 8px var(--cp-admin-shadow-color);
|
||
--cp-admin-shadow-action: light-dark(0 4px 10px rgba(1, 178, 187, 0.25), 0 4px 10px rgba(1, 178, 187, 0.35));
|
||
|
||
/* --- Chip/Badge-Status (Text immer mitgeben, nie nur Farbe) ------------- */
|
||
--cp-admin-status-neutral-bg: light-dark(#e9eef2, color-mix(in srgb, var(--cp-admin-muted-2) 22%, transparent));
|
||
--cp-admin-status-neutral-text: var(--cp-admin-text);
|
||
--cp-admin-status-success-bg: var(--cp-admin-green-soft);
|
||
--cp-admin-status-success-text: var(--cp-admin-green);
|
||
--cp-admin-status-info-bg: var(--cp-admin-teal-soft);
|
||
--cp-admin-status-info-text: var(--cp-admin-teal-dark);
|
||
--cp-admin-status-warning-bg: var(--cp-admin-orange-soft);
|
||
--cp-admin-status-warning-text: light-dark(#8a5a0a, #ffc169);
|
||
--cp-admin-status-error-bg: var(--cp-admin-red-soft);
|
||
--cp-admin-status-error-text: var(--cp-admin-red-dark);
|
||
}
|
||
|
||
/* #############################################################################
|
||
TEIL C · GLOBALE STEUERUNG (gilt für beide Themes)
|
||
############################################################################# */
|
||
|
||
/* =============================================================================
|
||
C.1 · Hell/Dunkel aktivieren + manueller Override
|
||
----------------------------------------------------------------------------
|
||
Setzt das Attribut data-theme die color-scheme fest, "gewinnt" diese gegen
|
||
die Systemeinstellung – ganz ohne doppelte Token-Definitionen.
|
||
Der Topbar-Umschalter setzt data-theme serverseitig (theme-Cookie → <html ...>),
|
||
also ohne JavaScript; "System" entfernt das Attribut wieder.
|
||
============================================================================= */
|
||
:root {
|
||
color-scheme: light dark;
|
||
}
|
||
:root[data-theme="light"] { color-scheme: light; }
|
||
:root[data-theme="dark"] { color-scheme: dark; }
|
||
|
||
/* =============================================================================
|
||
C.2 · Shell-Auswahl
|
||
----------------------------------------------------------------------------
|
||
Jede Shell-Vorlage setzt auf ihrem Wurzelelement eine der beiden Klassen.
|
||
So lesen Komponenten in jeder Shell automatisch die richtigen Tokens, ohne
|
||
dass irgendwo "user" oder "admin" hartkodiert werden muss:
|
||
|
||
<body class="cp-shell-user"> → in base_user.html
|
||
<body class="cp-shell-admin"> → in base_admin.html
|
||
|
||
Innerhalb von components.css kann dadurch z. B. .cp-shell-user .cp-card
|
||
bzw. .cp-shell-admin .cp-card jeweils ihre eigenen Tokens nutzen, falls
|
||
geteilte Klassennamen je Shell unterschiedlich aussehen sollen.
|
||
============================================================================= */
|
||
.cp-shell-user {
|
||
background: var(--cp-user-bg);
|
||
color: var(--cp-user-text);
|
||
font-family: var(--cp-user-font);
|
||
}
|
||
|
||
.cp-shell-admin {
|
||
background: var(--cp-admin-bg);
|
||
color: var(--cp-admin-text);
|
||
font-family: var(--cp-admin-font-ui);
|
||
}
|
||
|
||
html {
|
||
color-scheme: inherit;
|
||
}
|