/* =========================================================================== GLAS-DARSTELLUNG (Eriks Wahl: Gestaltungsvorschlag "Projektübersicht in Glas", Annäherung an Apple Liquid Glass) --------------------------------------------------------------------------- Eine eigene Schicht über styles.css und plan-styles.css, geladen als LETZTES Stylesheet. Alles hängt an der Klasse html.glas, die ein kleines Skript im von App.html setzt — ohne sie sieht die App aus wie zuvor. Abschalten lässt sie sich je Browser unter Einstellungen → Mein Konto ("Glas- Darstellung", localStorage-Schlüssel projuebersicht-glas). Prinzip: - Tokens statt Einzelregeln: --surface & Co. werden durchscheinend, damit wirken die ~70 Stellen, die var(--surface) als Fläche nutzen, ohne dass jede einzeln angefasst wird. - Echtes Glas (Unschärfe des Hintergrunds) nur auf den großen Flächen — Menüband, Seitenleiste, Karten, Dialoge. Kleine Elemente bleiben ohne backdrop-filter: verschachtelte Unschärfe kostet Rechenzeit und bringt auf einer bereits gläsernen Karte nichts. - Drei Dichten: Rahmen (Menüband/Seitenleiste) am dichtesten, Inhalt mittel, Dialoge und Menüs fast deckend (sie liegen über Inhalt, der sonst durchscheinen und den Text stören würde). - Hintergrund: Lichtflächen in den Logo-Blautönen und das Logo als großes Wasserzeichen (logo.svg, vektorisiert aus logo.png), beides fixiert. - Die Wandtafel (body.wandtafel-aktiv) bleibt außen vor: eigenes Design, und auf dem Kiosk-Rechner wäre Unschärfe zu teuer. =========================================================================== */ /* ---------- Tokens: hell ---------- */ html.glas { --bg: #e8eef3; --surface: rgba(255,255,255,.58); --surface-alt: rgba(255,255,255,.40); --surface-sunk: rgba(15,90,133,.07); --line: rgba(20,45,65,.16); --line-soft: rgba(20,45,65,.09); --accent: #0f5a85; --accent-hover: #0d5079; --accent-active: #0a4565; --accent-soft: rgba(15,90,133,.11); --band-neu: #0f5a85; --text: #14212b; --text-muted: #4b5d6b; --text-subtle: #6f8291; --r-md: 10px; --r-lg: 18px; --r-xl: 22px; --sh-1: 0 8px 28px rgba(21,58,86,.10), 0 1px 4px rgba(21,58,86,.06); --sh-2: 0 12px 34px rgba(21,58,86,.13), 0 2px 6px rgba(21,58,86,.07); --sh-3: 0 20px 60px rgba(21,58,86,.20), 0 4px 14px rgba(21,58,86,.10); --glas-rahmen: rgba(255,255,255,.62); --glas-dicht: rgba(255,255,255,.86); --glas-deckend: #f7fafc; --glas-kante: rgba(255,255,255,.80); --glas-kante-2: rgba(255,255,255,.35); --glas-blur: 24px; --glas-hell: #94b0cc; --glas-tief: #116896; --glas-logo: .16; } /* ---------- Tokens: dunkel (System und manuell) ---------- */ @media (prefers-color-scheme: dark) { html.glas:not([data-theme="light"]) { --bg: #0b141b; --surface: rgba(30,46,60,.50); --surface-alt: rgba(30,46,60,.34); --surface-sunk: rgba(255,255,255,.06); --line: rgba(255,255,255,.14); --line-soft: rgba(255,255,255,.08); --accent: #8cc9e6; --accent-hover: #a3d4ec; --accent-active: #6fb3d3; --accent-soft: rgba(140,201,230,.15); --band-neu: #116896; --text: #e8f0f5; --text-muted: #a9bccb; --text-subtle: #7790a2; --sh-1: 0 10px 30px rgba(0,0,0,.40), 0 1px 4px rgba(0,0,0,.30); --sh-2: 0 14px 38px rgba(0,0,0,.45), 0 2px 8px rgba(0,0,0,.30); --sh-3: 0 22px 64px rgba(0,0,0,.55), 0 4px 16px rgba(0,0,0,.35); --glas-rahmen: rgba(28,42,54,.58); --glas-dicht: rgba(22,34,44,.90); --glas-deckend: #15212b; --glas-kante: rgba(255,255,255,.18); --glas-kante-2: rgba(255,255,255,.07); --glas-hell: #2c5675; --glas-tief: #1d6f99; --glas-logo: .10; } } html.glas[data-theme="dark"] { --bg: #0b141b; --surface: rgba(30,46,60,.50); --surface-alt: rgba(30,46,60,.34); --surface-sunk: rgba(255,255,255,.06); --line: rgba(255,255,255,.14); --line-soft: rgba(255,255,255,.08); --accent: #8cc9e6; --accent-hover: #a3d4ec; --accent-active: #6fb3d3; --accent-soft: rgba(140,201,230,.15); --band-neu: #116896; --text: #e8f0f5; --text-muted: #a9bccb; --text-subtle: #7790a2; --sh-1: 0 10px 30px rgba(0,0,0,.40), 0 1px 4px rgba(0,0,0,.30); --sh-2: 0 14px 38px rgba(0,0,0,.45), 0 2px 8px rgba(0,0,0,.30); --sh-3: 0 22px 64px rgba(0,0,0,.55), 0 4px 16px rgba(0,0,0,.35); --glas-rahmen: rgba(28,42,54,.58); --glas-dicht: rgba(22,34,44,.90); --glas-deckend: #15212b; --glas-kante: rgba(255,255,255,.18); --glas-kante-2: rgba(255,255,255,.07); --glas-hell: #2c5675; --glas-tief: #1d6f99; --glas-logo: .10; } /* ---------- Hintergrund: Lichtflächen und Logo ---------- */ html.glas body { background: radial-gradient(55% 50% at 8% 4%, color-mix(in srgb, var(--glas-hell) 70%, transparent), transparent 70%), radial-gradient(45% 45% at 92% 12%, color-mix(in srgb, var(--glas-tief) 26%, transparent), transparent 70%), radial-gradient(50% 55% at 72% 96%, color-mix(in srgb, #7fc3b6 26%, transparent), transparent 70%), radial-gradient(40% 40% at 28% 82%, color-mix(in srgb, var(--glas-hell) 42%, transparent), transparent 70%), var(--bg); background-attachment: fixed; } /* Wasserzeichen: fixiert, links unten, teils unter Seitenleiste und Karten — dort schimmert es durch das Glas, daneben ist es klar zu sehen. */ html.glas body::before { content: ""; position: fixed; left: -3vw; bottom: -14vh; width: min(1100px, 68vw); aspect-ratio: 256 / 216; background: url("/logo.svg") no-repeat center / contain; opacity: var(--glas-logo); pointer-events: none; z-index: 0; } html.glas .app-shell { position: relative; z-index: 1; } html.glas body.wandtafel-aktiv::before { display: none; } /* ---------- Das Material ---------- */ html.glas .app-topbar, html.glas #headerMenu.side-menu, html.glas .modal, html.glas .user-menu-dropdown, html.glas .user-menu, html.glas .board-list, html.glas .abw-team-kopf, html.glas .report-card, html.glas .load-card, html.glas .settings-card, html.glas .dash-karte, html.glas .dash-band, html.glas .bericht-panel, html.glas .pc-panel, html.glas .table-wrap, html.glas .gantt-container, html.glas .people-readonly, html.glas .bubble-card, html.glas .range-picker, html.glas .sync-problem-bar, html.glas .plan-header, html.glas .plan-nav, html.glas .plan-panel, html.glas .plan-einst-nav, html.glas .load-karte, html.glas .plan-kpi-tile, html.glas .plan-lage-band, html.glas .plan-mini-card, html.glas .protokoll-liste, html.glas .protokoll-schreiben, html.glas .plan-toast, html.glas .glocke-menue, html.glas .wiz { background: var(--surface); -webkit-backdrop-filter: blur(var(--glas-blur)) saturate(170%); backdrop-filter: blur(var(--glas-blur)) saturate(170%); border: 1px solid var(--glas-kante-2); box-shadow: var(--sh-1), inset 0 1px 0 var(--glas-kante), inset 0 -1px 0 var(--glas-kante-2); } /* Rahmen: Menüband und Seitenleiste dichter als der Inhalt. */ html.glas .app-topbar { background: var(--glas-rahmen); border-width: 0 0 1px 0; box-shadow: 0 1px 0 var(--glas-kante-2), 0 6px 24px rgba(21,58,86,.06); } html.glas .topbar-logo { height: 26px; } /* Dialoge, Menüs, Hinweise: fast deckend — sie liegen über Inhalt, der sonst durchscheint und den Text unruhig macht. */ html.glas .modal, html.glas .user-menu-dropdown, html.glas .user-menu, html.glas .range-picker, html.glas .plan-toast, html.glas .glocke-menue, html.glas .sync-problem-bar { background: var(--glas-dicht); box-shadow: var(--sh-3), inset 0 1px 0 var(--glas-kante); } html.glas .modal-bg { background: rgba(15,35,50,.28); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); } /* ---------- Seitenleiste: schwebende Glasfläche (Desktop) ---------- */ @media (min-width: 769px) { html.glas #headerMenu.side-menu { background: var(--glas-rahmen); top: calc(52px + 12px); height: calc(100vh - 52px - 24px); margin: 12px 0 12px 12px; border-radius: var(--r-xl); border: 1px solid var(--glas-kante-2); box-shadow: var(--sh-2), inset 0 1px 0 var(--glas-kante); overflow: hidden; } } /* ---------- "Alles schwebt" (Eriks Wahl C, Desktop) ---------- Vorher stieß der eckige Projektkopf (.plan-header + .plan-nav, ein durchgehender Streifen ohne Abstand) an die runde, schwebende Seitenleiste. Jetzt schweben Menüband, Seitenleiste und Projektkopf mit demselben Abstand (12px) und denselben Rundungen; der aktive Reiter ist eine Kapsel wie der aktive Eintrag der Seitenleiste. */ @media (min-width: 769px) { html.glas .app-topbar { top: 12px; margin: 12px 12px 0; border-radius: var(--r-lg); border: 1px solid var(--glas-kante-2); box-shadow: var(--sh-2), inset 0 1px 0 var(--glas-kante); } html.glas #headerMenu.side-menu { top: calc(52px + 24px); height: calc(100vh - 52px - 36px); } html.glas .plan-kopf { margin: 12px 12px 0; border-radius: var(--r-xl); background: var(--glas-rahmen); -webkit-backdrop-filter: blur(var(--glas-blur)) saturate(170%); backdrop-filter: blur(var(--glas-blur)) saturate(170%); border: 1px solid var(--glas-kante-2); box-shadow: var(--sh-2), inset 0 1px 0 var(--glas-kante); padding: 4px 12px 10px; } /* Kopf und Reiter sind innerhalb der Karte keine eigenen Flächen mehr. */ html.glas .plan-kopf .plan-header, html.glas .plan-kopf .plan-nav { background: transparent; -webkit-backdrop-filter: none; backdrop-filter: none; border: 0; box-shadow: none; } /* Inhalt bündig unter der Kopfkarte und im selben 12px-Abstand. */ html.glas .plan-page .plan-main-content { padding-left: 12px; padding-right: 12px; padding-top: 12px; } html.glas .plan-kopf .plan-header { padding: 10px 12px 6px; } html.glas .plan-kopf .plan-nav { padding: 0; gap: 2px; } html.glas .plan-kopf .plan-nav-item { border-bottom: 0; border-radius: 999px; padding: 8px 16px; font-size: 13.5px; } html.glas .plan-kopf .plan-nav-item:hover { background: var(--surface-sunk); } html.glas .plan-kopf .plan-nav-item.is-active { background: var(--glas-dicht); color: var(--accent); box-shadow: inset 0 1px 0 var(--glas-kante), 0 2px 10px rgba(21,58,86,.10); } } @media (min-width: 769px) and (prefers-color-scheme: dark) { html.glas:not([data-theme="light"]) .plan-kopf .plan-nav-item.is-active { background: rgba(255,255,255,.10); } } @media (min-width: 769px) { html.glas[data-theme="dark"] .plan-kopf .plan-nav-item.is-active { background: rgba(255,255,255,.10); } } /* Projektbereich: .plan-main hat in plan-styles.css einen deckenden Grund (var(--bg)). Unter Glas verdeckte er die Lichtflächen und das Logo-Wasserzeichen — im Projekt sah man nur flaches Dunkelblau bzw. Grau, auf allen anderen Seiten den Glas-Hintergrund. */ html.glas .plan-main { background: transparent; } html.glas .nav-item { border-radius: 999px; } html.glas .nav-item:hover, html.glas .nav-item:visited:hover { background: var(--surface-sunk); } html.glas .nav-item.active { background: var(--glas-dicht); color: var(--text); box-shadow: inset 0 1px 0 var(--glas-kante), 0 2px 10px rgba(21,58,86,.10); } html.glas .nav-item.active .nav-icon { color: var(--accent); } /* Die bestehenden Dunkel-Regeln für die Navigation setzen feste Werte — hier auf die Glas-Tokens zurückführen. */ @media (prefers-color-scheme: dark) { html.glas:not([data-theme="light"]) .nav-item:hover { background: var(--surface-sunk); } html.glas:not([data-theme="light"]) .nav-item.active { background: rgba(255,255,255,.10); } html.glas:not([data-theme="light"]) .app-topbar { background: var(--glas-rahmen); } } html.glas[data-theme="dark"] .nav-item:hover { background: var(--surface-sunk); } html.glas[data-theme="dark"] .nav-item.active { background: rgba(255,255,255,.10); } html.glas[data-theme="dark"] .app-topbar { background: var(--glas-rahmen); } /* ---------- Bedienelemente ---------- */ /* Zweitknöpfe als klare Glaskapsel statt grauer Fläche. */ html.glas button.secondary { background: var(--surface); border: 1px solid var(--glas-kante-2); box-shadow: inset 0 1px 0 var(--glas-kante); color: var(--text); } html.glas button.secondary:hover { background: var(--glas-dicht); } html.glas button:focus-visible { box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 35%, transparent); } /* Hauptknöpfe (ohne eigene Klasse bzw. .small) mit leichtem Glanz oben — bewusst nicht jeder