/* ============================================================ GeoGraSim Design System Gemeinsame Variablen, Typografie, Komponenten Wird von allen Modulen eingebunden. ============================================================ */ /* --- 1. CSS Custom Properties (Farben, Abstände, Schatten) --- */ :root { /* Primärfarben */ --ggs-fjord: #4a7c8a; --ggs-fjord-dark: #1f4e5a; --ggs-fjord-light: #dae8ec; --ggs-moss: #5a8a5e; --ggs-moss-dark: #3a6b3e; --ggs-moss-light: #dcead0; --ggs-sand: #e8d5b5; --ggs-sand-dark: #c4a97a; --ggs-coral: #c85c4a; --ggs-coral-light: #f0d0ca; --ggs-orange: #e8833a; /* Neutrals */ --ggs-bg: #f5f2eb; --ggs-bg-dark: #e8e4d8; --ggs-white: #ffffff; --ggs-text: #2a2a2a; --ggs-text-muted: #8a8a8a; --ggs-text-light: #b0b0b0; --ggs-border: #e0ddd4; /* Semantische Farben */ --ggs-success: #5a8a5e; --ggs-warning: #e8833a; --ggs-danger: #c85c4a; --ggs-info: #4a7c8a; /* Abstände */ --ggs-gap-xs: 4px; --ggs-gap-sm: 8px; --ggs-gap-md: 16px; --ggs-gap-lg: 24px; --ggs-gap-xl: 32px; /* Radien */ --ggs-radius-sm: 6px; --ggs-radius-md: 12px; --ggs-radius-lg: 16px; --ggs-radius-pill: 999px; /* Schatten */ --ggs-shadow-sm: 0 1px 3px rgba(0,0,0,.08); --ggs-shadow-md: 0 2px 8px rgba(0,0,0,.12); --ggs-shadow-lg: 0 4px 16px rgba(0,0,0,.16); /* Glass-Effekt */ --ggs-glass-bg: rgba(255,255,255,.82); --ggs-glass-blur: blur(12px); /* Typografie */ --ggs-font: 'Inter', system-ui, -apple-system, sans-serif; --ggs-font-mono: 'JetBrains Mono', 'Fira Code', monospace; /* Transitions */ --ggs-ease: cubic-bezier(.22, 1, .36, 1); --ggs-duration: 0.25s; } /* --- 2. Reset & Basis --- */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: var(--ggs-font); color: var(--ggs-text); background: var(--ggs-bg); line-height: 1.5; -webkit-font-smoothing: antialiased; overflow: hidden; height: 100dvh; /* iPad: Double-tap-zoom unterdrücken, aber Pinch-to-zoom erlauben */ touch-action: manipulation; -webkit-tap-highlight-color: transparent; } /* Touch-Ziele: min 36px laut Apple HIG (44px ist Pflicht nur für kritische Bereiche) */ button, a, input, select, textarea { touch-action: manipulation; } /* --- 3. App-Header (überall identisch, heller Hintergrund) --- */ .ggs-header { display: flex; align-items: center; gap: var(--ggs-gap-md); padding: 0 var(--ggs-gap-lg); height: 52px; background: var(--ggs-bg); color: var(--ggs-text); font-size: 14px; z-index: 1000; position: relative; border-bottom: 1px solid var(--ggs-border); } .ggs-header-logo { display: flex; align-items: center; gap: 10px; text-decoration: none; color: var(--ggs-white); } /* Bild-Logo — dreht sich einmal beim Laden */ .ggs-header-logo-icon { height: 38px; animation: ggs-logo-spin 0.8s var(--ggs-ease) both; } @keyframes ggs-logo-spin { 0% { transform: rotateY(-180deg); opacity: 0; } 60% { transform: rotateY(15deg); opacity: 1; } 100% { transform: rotateY(0); } } /* Text-Logo (SVG) — nicht mit CSS manipulieren, Farben sind im SVG definiert */ .ggs-header-logo-text { height: 20px; } .ggs-header-separator { width: 1px; height: 24px; background: var(--ggs-border); margin: 0 4px; } .ggs-header-module { font-weight: 600; font-size: 14px; color: var(--ggs-fjord-dark); } .ggs-header-badge { font-size: 10px; font-weight: 700; padding: 2px 8px; border-radius: var(--ggs-radius-pill); background: var(--ggs-fjord-light); color: var(--ggs-fjord-dark); } .ggs-header-spacer { flex: 1; } .ggs-header-actions { display: flex; align-items: center; gap: var(--ggs-gap-sm); } .ggs-header a { color: var(--ggs-fjord-dark); text-decoration: none; } .ggs-header a:hover { color: var(--ggs-fjord); } /* --- 4a. Simulation Layout: STANDARD (3-Spalten + Graphen) --- Desktop ≥1200px: 240/280 — grosszügig iPad Landscape 900–1199px: 210/250 — optimiert fürs iPad (Referenzgerät) iPad Portrait / Mobile <900px: einspaltig, Panels darunter */ .ggs-sim-layout { display: grid; grid-template-columns: 240px 1fr 310px; grid-template-rows: 1fr auto; grid-template-areas: "status sim actions" "graphs graphs graphs"; height: calc(100dvh - 52px); gap: 0; } @media (max-width: 1199px) and (min-width: 900px) { .ggs-sim-layout { grid-template-columns: 215px 1fr 265px; } } .ggs-zone-status { grid-area: status; overflow-y: auto; padding: var(--ggs-gap-md); background: var(--ggs-bg); border-right: 1px solid var(--ggs-border); } .ggs-zone-sim { grid-area: sim; position: relative; overflow: hidden; } .ggs-zone-actions { grid-area: actions; overflow-y: auto; padding: var(--ggs-gap-md); background: var(--ggs-bg); border-left: 1px solid var(--ggs-border); } .ggs-zone-graphs { grid-area: graphs; display: flex; gap: var(--ggs-gap-sm); padding: var(--ggs-gap-sm) var(--ggs-gap-md); background: var(--ggs-bg); border-top: 1px solid var(--ggs-border); min-height: 150px; max-height: 220px; } /* --- 4b. Simulation Layout: FULLSCREEN (Canvas randlos, Panels als Glass-Overlay) --- */ .ggs-sim-layout.fullscreen { display: block; position: relative; height: calc(100dvh - 52px); } .ggs-sim-layout.fullscreen .ggs-zone-sim { position: absolute; inset: 0; z-index: 1; } .ggs-sim-layout.fullscreen .ggs-zone-status { position: absolute; top: 0; left: 0; width: 240px; height: auto; max-height: calc(100% - 220px); z-index: 10; border-right: none; border-radius: 0 0 var(--ggs-radius-md) 0; box-shadow: var(--ggs-shadow-md); } .ggs-sim-layout.fullscreen .ggs-zone-actions { position: absolute; top: 0; right: 0; width: 310px; height: auto; max-height: calc(100% - 220px); z-index: 10; border-left: none; border-radius: 0 0 0 var(--ggs-radius-md); box-shadow: var(--ggs-shadow-md); } @media (max-width: 1199px) and (min-width: 900px) { .ggs-sim-layout.fullscreen .ggs-zone-status { width: 215px; } .ggs-sim-layout.fullscreen .ggs-zone-actions { width: 265px; } } .ggs-sim-layout.fullscreen .ggs-zone-graphs { position: absolute; bottom: 0; left: 0; right: 0; z-index: 10; border-top: none; border-radius: var(--ggs-radius-md) var(--ggs-radius-md) 0 0; box-shadow: 0 -2px 8px rgba(0,0,0,.1); } /* Responsive: unter 900px einspaltiges Layout */ @media (max-width: 900px) { .ggs-sim-layout, .ggs-sim-layout.fullscreen { display: grid; grid-template-columns: 1fr; grid-template-rows: 1fr auto auto auto; grid-template-areas: "sim" "status" "actions" "graphs"; } .ggs-sim-layout.fullscreen .ggs-zone-status, .ggs-sim-layout.fullscreen .ggs-zone-actions, .ggs-sim-layout.fullscreen .ggs-zone-graphs { position: static; width: auto; max-height: 200px; border-radius: 0; box-shadow: none; } .ggs-zone-status, .ggs-zone-actions { border: none; border-top: 1px solid var(--ggs-border); max-height: 200px; } } /* --- 5. Topbar (innerhalb der Sim-Zone, über dem Canvas) --- */ .ggs-topbar { display: flex; align-items: center; gap: var(--ggs-gap-md); padding: var(--ggs-gap-sm) var(--ggs-gap-md); background: var(--ggs-glass-bg); backdrop-filter: var(--ggs-glass-blur); border-bottom: 1px solid var(--ggs-border); font-size: 13px; z-index: 10; position: relative; } .ggs-topbar-stat { display: flex; align-items: center; gap: 4px; font-weight: 600; } .ggs-topbar-stat .icon { font-size: 16px; } .ggs-topbar-stat .val { font-variant-numeric: tabular-nums; } /* --- 6. Speed Control — Touch-Ziele min 36px hoch (iPad-kompatibel) --- */ .ggs-speed { display: inline-flex; border-radius: var(--ggs-radius-sm); overflow: hidden; border: 1.5px solid var(--ggs-border); } .ggs-speed-btn { border: none; background: var(--ggs-white); padding: 8px 14px; min-width: 40px; min-height: 36px; font-family: var(--ggs-font); font-size: 13px; font-weight: 600; cursor: pointer; color: var(--ggs-text-muted); transition: all var(--ggs-duration) var(--ggs-ease); } .ggs-speed-btn:not(:last-child) { border-right: 1px solid var(--ggs-border); } .ggs-speed-btn:hover { background: var(--ggs-fjord-light); color: var(--ggs-fjord); } .ggs-speed-btn.active { background: var(--ggs-fjord); color: var(--ggs-white); } /* --- 7. Panel (generischer Container) --- */ .ggs-panel { background: var(--ggs-white); border: 1px solid var(--ggs-border); border-radius: var(--ggs-radius-md); padding: var(--ggs-gap-md); margin-bottom: var(--ggs-gap-md); } .ggs-panel-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: var(--ggs-text-muted); margin-bottom: var(--ggs-gap-sm); } /* --- 8. Parameter-Bar (Status-Anzeige) --- */ .ggs-param { display: flex; align-items: center; gap: var(--ggs-gap-sm); padding: 6px 0; } .ggs-param-icon { font-size: 16px; width: 22px; text-align: center; } .ggs-param-label { font-size: 12px; font-weight: 600; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ggs-param-value { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; min-width: 40px; text-align: right; } .ggs-param-bar { width: 100%; height: 6px; background: var(--ggs-bg-dark); border-radius: 3px; overflow: hidden; margin-top: 2px; } .ggs-param-fill { height: 100%; border-radius: 3px; transition: width 0.6s var(--ggs-ease), background-color 0.4s; } /* Farbstufen: automatisch je nach Wert */ .ggs-param-fill.good { background: var(--ggs-moss); } .ggs-param-fill.warning { background: var(--ggs-orange); } .ggs-param-fill.danger { background: var(--ggs-coral); } .ggs-param-fill.info { background: var(--ggs-fjord); } /* Trend-Badge */ .ggs-trend { font-size: 9px; font-weight: 700; padding: 1px 5px; border-radius: var(--ggs-radius-pill); } .ggs-trend.up { background: var(--ggs-moss-light); color: var(--ggs-moss-dark); } .ggs-trend.down { background: var(--ggs-coral-light); color: var(--ggs-coral); } /* --- 9. Action-Card (Maßnahmen, Werkzeuge, Missionen) — kompakt --- */ .ggs-card { background: var(--ggs-white); border: 1.5px solid var(--ggs-border); border-radius: var(--ggs-radius-md); padding: 10px 12px; cursor: pointer; transition: all var(--ggs-duration) var(--ggs-ease); margin-bottom: 6px; } /* Hover nur bei echtem Maus-Gerät — kein Klebe-Effekt auf Touch */ @media (hover: hover) { .ggs-card:hover { border-color: var(--ggs-fjord); background: var(--ggs-fjord-light); transform: translateY(-1px); box-shadow: var(--ggs-shadow-md); } } .ggs-card:active { border-color: var(--ggs-fjord); background: var(--ggs-fjord-light); transform: scale(0.98); } .ggs-card.active { border-color: var(--ggs-fjord); background: var(--ggs-fjord-light); } .ggs-card.disabled { opacity: .45; pointer-events: none; } .ggs-card-header { display: flex; align-items: center; gap: var(--ggs-gap-sm); margin-bottom: 2px; } .ggs-card-icon { font-size: 20px; flex-shrink: 0; } .ggs-card-title { font-size: 13px; font-weight: 700; color: var(--ggs-fjord-dark); } /* Beschreibung: bis 3 Zeilen mit Ellipsis — volle Info im title-Tooltip */ .ggs-card-desc { font-size: 11.5px; color: var(--ggs-text-muted); line-height: 1.35; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; } .ggs-card-badges { display: flex; flex-wrap: wrap; gap: 3px; margin-top: 6px; } /* Mini-Badge (Kosten, Effekt, etc.) */ .ggs-badge { font-size: 10px; font-weight: 600; padding: 2px 7px; border-radius: var(--ggs-radius-sm); white-space: nowrap; } .ggs-badge.cost { background: var(--ggs-sand); color: #7a6540; } .ggs-badge.effect { background: var(--ggs-moss-light); color: var(--ggs-moss-dark); } .ggs-badge.protect { background: var(--ggs-fjord-light); color: var(--ggs-fjord-dark); } .ggs-badge.danger { background: var(--ggs-coral-light); color: var(--ggs-coral); } .ggs-badge.level-easy { background: #d4edda; color: #155724; } .ggs-badge.level-medium { background: #fff3cd; color: #856404; } .ggs-badge.level-hard { background: #f8d7da; color: #721c24; } /* --- 9b. Stufen-Auswahl (Level-Picker) --- */ .ggs-level-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin: 16px 0; } .ggs-level-card { background: var(--ggs-bg); border: 2px solid var(--ggs-border); border-radius: var(--ggs-radius-md); padding: 14px 10px; cursor: pointer; text-align: center; transition: all var(--ggs-duration) var(--ggs-ease); } @media (hover: hover) { .ggs-level-card:hover { border-color: var(--ggs-fjord); transform: translateY(-2px); box-shadow: var(--ggs-shadow-md); } } .ggs-level-card .em { font-size: 34px; display: block; margin-bottom: 4px; } .ggs-level-card .lbl { font-size: 14px; font-weight: 800; color: var(--ggs-fjord-dark); } .ggs-level-card .sub { font-size: 10px; color: var(--ggs-text-muted); margin-top: 4px; line-height: 1.3; } .ggs-level-card .ggs-badge { margin-top: 6px; display: inline-block; } /* --- 10. Graph-Card (Zeitverlauf) --- */ .ggs-graph-card { flex: 1; min-width: 160px; background: var(--ggs-white); border: 1px solid var(--ggs-border); border-radius: var(--ggs-radius-md); padding: var(--ggs-gap-sm); position: relative; cursor: pointer; transition: transform var(--ggs-duration) var(--ggs-ease); } .ggs-graph-card:hover { transform: translateY(-2px); box-shadow: var(--ggs-shadow-sm); } .ggs-graph-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; color: var(--ggs-text-muted); margin-bottom: 2px; } .ggs-graph-value { position: absolute; top: var(--ggs-gap-sm); right: var(--ggs-gap-sm); font-size: 14px; font-weight: 800; font-variant-numeric: tabular-nums; } .ggs-graph-svg { width: 100%; height: 100px; display: block; } /* Achsen-Beschriftung als HTML-Overlay — wird NICHT verzerrt (weil kein SVG-preserveAspectRatio) */ .ggs-graph-axis { position: absolute; top: 26px; bottom: 10px; left: var(--ggs-gap-sm); right: var(--ggs-gap-sm); pointer-events: none; } .ggs-graph-axis-y { position: absolute; left: 0; font-size: 9px; font-weight: 600; color: var(--ggs-text-light); background: var(--ggs-white); padding: 0 3px; border-radius: 2px; transform: translateY(-50%); font-variant-numeric: tabular-nums; } .ggs-graph-axis-zone { position: absolute; left: 0; font-size: 9px; font-weight: 700; color: var(--ggs-text-muted); letter-spacing: .2px; transform: translateY(-50%); opacity: .75; } .ggs-graph-axis-ref { position: absolute; right: 0; font-size: 9px; font-weight: 700; padding: 1px 4px; border-radius: 2px; background: var(--ggs-white); transform: translateY(-50%); white-space: nowrap; } /* Vergrösserter Graph — separates Overlay (weil position:fixed in backdrop-filter-Containern bricht) */ .ggs-graph-zoom-overlay { position: fixed; inset: 0; z-index: 2500; display: flex; align-items: center; justify-content: center; background: rgba(0,0,0,.35); backdrop-filter: blur(3px); animation: ggs-fade-in 0.2s var(--ggs-ease) both; cursor: pointer; } .ggs-graph-zoom-card { background: var(--ggs-white); border-radius: var(--ggs-radius-lg); box-shadow: var(--ggs-shadow-lg); padding: var(--ggs-gap-lg); width: 80vw; max-width: 700px; height: 50dvh; max-height: 400px; display: flex; flex-direction: column; animation: ggs-graph-zoom-in 0.3s var(--ggs-ease) both; cursor: default; } .ggs-graph-zoom-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--ggs-gap-md); } .ggs-graph-zoom-header .ggs-graph-label { font-size: 16px; margin-bottom: 0; } .ggs-graph-zoom-header .ggs-graph-value { position: static; font-size: 24px; } .ggs-graph-zoom-card .ggs-graph-svg { flex: 1; height: auto; } @keyframes ggs-graph-zoom-in { 0% { opacity: 0; transform: scale(0.85); } 100% { opacity: 1; transform: scale(1); } } @keyframes ggs-fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } /* Zonen im Graph */ .ggs-graph-zone-safe { fill: rgba(90,138,94,.08); } .ggs-graph-zone-warning { fill: rgba(232,131,58,.08); } .ggs-graph-zone-danger { fill: rgba(200,92,74,.08); } /* Linie (schlank) */ .ggs-graph-line { fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; } /* Referenzlinie (z.B. "1.5°C Ziel") */ .ggs-graph-ref { stroke-dasharray: 4 3; stroke-width: 1; opacity: .5; } /* --- 11. In-Canvas Event Notifications --- */ /* Events erscheinen gross im Canvas, gleiten dann in den Stapel */ .ggs-event-viewport { position: absolute; top: 50px; left: 50%; transform: translateX(-50%); z-index: 20; pointer-events: none; display: flex; flex-direction: column; align-items: center; gap: var(--ggs-gap-sm); } .ggs-event-notification { background: var(--ggs-glass-bg); backdrop-filter: var(--ggs-glass-blur); border: 1.5px solid var(--ggs-border); border-radius: var(--ggs-radius-md); padding: 10px 20px; font-size: 14px; font-weight: 700; color: var(--ggs-fjord-dark); box-shadow: var(--ggs-shadow-lg); pointer-events: auto; animation: ggs-event-in 0.4s var(--ggs-ease) both, ggs-event-shrink 0.5s 3s var(--ggs-ease) both; white-space: nowrap; max-width: 400px; text-align: center; } .ggs-event-notification.good { border-color: var(--ggs-moss); color: var(--ggs-moss-dark); } .ggs-event-notification.bad { border-color: var(--ggs-coral); color: var(--ggs-coral); } .ggs-event-notification .ev-icon { font-size: 18px; margin-right: 6px; } @keyframes ggs-event-in { 0% { transform: scale(0.5) translateY(-20px); opacity: 0; } 60% { transform: scale(1.05) translateY(0); } 100% { transform: scale(1) translateY(0); opacity: 1; } } @keyframes ggs-event-shrink { 0% { transform: scale(1); opacity: 1; } 100% { transform: scale(0.6) translateY(0); opacity: 0; pointer-events: none; } } /* Event-Stapel (links unten im Canvas, klappbar) */ .ggs-event-stack { position: absolute; bottom: var(--ggs-gap-md); left: var(--ggs-gap-md); z-index: 15; max-width: 280px; } .ggs-event-stack-toggle { display: flex; align-items: center; gap: 4px; padding: 5px 12px; background: var(--ggs-glass-bg); backdrop-filter: var(--ggs-glass-blur); border: 1px solid var(--ggs-border); border-radius: var(--ggs-radius-pill); font-family: var(--ggs-font); font-size: 11px; font-weight: 600; color: var(--ggs-text-muted); cursor: pointer; box-shadow: var(--ggs-shadow-sm); } .ggs-event-stack-toggle:hover { background: var(--ggs-white); } .ggs-event-stack-count { background: var(--ggs-fjord); color: var(--ggs-white); font-size: 10px; padding: 1px 6px; border-radius: var(--ggs-radius-pill); font-weight: 700; } .ggs-event-stack-list { display: none; flex-direction: column; gap: 3px; margin-bottom: 6px; max-height: 240px; overflow-y: auto; } .ggs-event-stack.open .ggs-event-stack-list { display: flex; } .ggs-event-stack-item { font-size: 11px; padding: 4px 10px; background: var(--ggs-glass-bg); backdrop-filter: var(--ggs-glass-blur); border: 1px solid var(--ggs-border); border-radius: var(--ggs-radius-sm); color: var(--ggs-text-muted); } .ggs-event-stack-item.good { border-left: 3px solid var(--ggs-moss); } .ggs-event-stack-item.bad { border-left: 3px solid var(--ggs-coral); } /* Legacy: Pill-Style Events (für einfache Listen ausserhalb des Canvas) */ .ggs-event { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; padding: 3px 10px; border-radius: var(--ggs-radius-pill); background: var(--ggs-white); border: 1px solid var(--ggs-border); white-space: nowrap; } .ggs-event.good { border-color: var(--ggs-moss-light); background: rgba(90,138,94,.08); color: var(--ggs-moss-dark); } .ggs-event.bad { border-color: var(--ggs-coral-light); background: rgba(200,92,74,.06); color: var(--ggs-coral); } .ggs-event.neutral { border-color: var(--ggs-border); color: var(--ggs-text-muted); } /* --- 12. Overlay / Modal --- */ .ggs-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.45); backdrop-filter: blur(4px); display: flex; align-items: center; justify-content: center; z-index: 2000; opacity: 0; pointer-events: none; transition: opacity var(--ggs-duration); } .ggs-overlay.visible { opacity: 1; pointer-events: auto; } .ggs-overlay-card { background: var(--ggs-white); border-radius: var(--ggs-radius-lg); padding: var(--ggs-gap-xl); max-width: 500px; width: 90%; text-align: center; box-shadow: var(--ggs-shadow-lg); transform: scale(.95); transition: transform var(--ggs-duration) var(--ggs-ease); } .ggs-overlay.visible .ggs-overlay-card { transform: scale(1); } /* --- 13. Star Rating --- */ .ggs-stars { display: inline-flex; gap: 4px; font-size: 24px; } .ggs-star { color: var(--ggs-border); transition: color 0.3s, transform 0.3s; } .ggs-star.lit { color: #f0c040; } .ggs-star.lit:nth-child(1) { animation: ggs-star-in 0.4s 0.0s var(--ggs-ease) both; } .ggs-star.lit:nth-child(2) { animation: ggs-star-in 0.4s 0.15s var(--ggs-ease) both; } .ggs-star.lit:nth-child(3) { animation: ggs-star-in 0.4s 0.3s var(--ggs-ease) both; } .ggs-star.lit:nth-child(4) { animation: ggs-star-in 0.4s 0.45s var(--ggs-ease) both; } .ggs-star.lit:nth-child(5) { animation: ggs-star-in 0.4s 0.6s var(--ggs-ease) both; } @keyframes ggs-star-in { 0% { transform: scale(0) rotate(-30deg); opacity: 0; } 60% { transform: scale(1.3) rotate(5deg); } 100% { transform: scale(1) rotate(0); opacity: 1; } } /* --- 14. Achievement Toast --- */ .ggs-toast-container { position: fixed; top: 60px; right: var(--ggs-gap-lg); z-index: 3000; display: flex; flex-direction: column; gap: var(--ggs-gap-sm); pointer-events: none; } .ggs-toast { display: flex; align-items: center; gap: var(--ggs-gap-sm); padding: var(--ggs-gap-sm) var(--ggs-gap-md); background: var(--ggs-white); border: 1.5px solid #f0c040; border-radius: var(--ggs-radius-md); box-shadow: var(--ggs-shadow-lg); animation: ggs-toast-in 0.5s var(--ggs-ease) both, ggs-toast-out 0.4s 3.5s var(--ggs-ease) both; pointer-events: auto; } .ggs-toast-icon { font-size: 24px; } .ggs-toast-text { font-size: 13px; font-weight: 600; color: var(--ggs-fjord-dark); } .ggs-toast-sub { font-size: 10px; color: var(--ggs-text-muted); } @keyframes ggs-toast-in { 0% { transform: translateX(120%); opacity: 0; } 100% { transform: translateX(0); opacity: 1; } } @keyframes ggs-toast-out { 0% { transform: translateX(0); opacity: 1; } 100% { transform: translateX(120%); opacity: 0; } } /* --- 15. Endscreen / Results --- */ .ggs-results { text-align: center; } .ggs-results-icon { font-size: 48px; margin-bottom: var(--ggs-gap-md); } .ggs-results-title { font-size: 22px; font-weight: 800; color: var(--ggs-fjord-dark); margin-bottom: var(--ggs-gap-sm); } .ggs-results-subtitle { font-size: 14px; color: var(--ggs-text-muted); margin-bottom: var(--ggs-gap-lg); } .ggs-results-stats { display: grid; grid-template-columns: 1fr 1fr; gap: var(--ggs-gap-md); text-align: center; margin-bottom: var(--ggs-gap-lg); } .ggs-results-stat-label { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .4px; color: var(--ggs-text-muted); } .ggs-results-stat-value { font-size: 22px; font-weight: 800; color: var(--ggs-fjord-dark); font-variant-numeric: tabular-nums; } /* --- 16. Between-Level Screen --- */ .ggs-level-screen { text-align: center; max-width: 440px; margin: 0 auto; } .ggs-level-screen .ggs-badges-earned { display: flex; justify-content: center; gap: var(--ggs-gap-sm); margin: var(--ggs-gap-md) 0; } .ggs-badge-earned { width: 48px; height: 48px; background: var(--ggs-moss-light); border: 2px solid var(--ggs-moss); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 22px; animation: ggs-badge-pop 0.5s var(--ggs-ease) both; } .ggs-badge-earned:nth-child(2) { animation-delay: 0.2s; } .ggs-badge-earned:nth-child(3) { animation-delay: 0.4s; } @keyframes ggs-badge-pop { 0% { transform: scale(0); } 70% { transform: scale(1.2); } 100% { transform: scale(1); } } /* Reflexionsfrage */ .ggs-reflection { text-align: left; background: var(--ggs-bg); border-radius: var(--ggs-radius-md); padding: var(--ggs-gap-md); margin: var(--ggs-gap-md) 0; } .ggs-reflection-q { font-size: 13px; font-weight: 700; color: var(--ggs-fjord-dark); margin-bottom: var(--ggs-gap-sm); } .ggs-reflection-option { display: flex; align-items: center; gap: var(--ggs-gap-sm); padding: 8px var(--ggs-gap-md); border-radius: var(--ggs-radius-sm); cursor: pointer; font-size: 13px; transition: background var(--ggs-duration); } .ggs-reflection-option:hover { background: var(--ggs-fjord-light); } .ggs-reflection-option.selected { background: var(--ggs-fjord-light); font-weight: 600; } .ggs-reflection-radio { width: 16px; height: 16px; border: 2px solid var(--ggs-border); border-radius: 50%; flex-shrink: 0; position: relative; } .ggs-reflection-option.selected .ggs-reflection-radio { border-color: var(--ggs-fjord); } .ggs-reflection-option.selected .ggs-reflection-radio::after { content: ''; position: absolute; inset: 3px; border-radius: 50%; background: var(--ggs-fjord); } /* --- 17. Buttons --- */ .ggs-btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--ggs-gap-sm); padding: 10px 20px; border: none; border-radius: var(--ggs-radius-sm); font-family: var(--ggs-font); font-size: 13px; font-weight: 700; cursor: pointer; transition: all var(--ggs-duration) var(--ggs-ease); } .ggs-btn-primary { background: var(--ggs-fjord); color: var(--ggs-white); } .ggs-btn-primary:hover { background: var(--ggs-fjord-dark); transform: translateY(-1px); } .ggs-btn-secondary { background: var(--ggs-white); color: var(--ggs-fjord); border: 1.5px solid var(--ggs-fjord); } .ggs-btn-secondary:hover { background: var(--ggs-fjord-light); } .ggs-btn-ghost { background: transparent; color: var(--ggs-text-muted); padding: 8px 12px; min-width: 36px; min-height: 36px; } .ggs-btn-ghost:hover { background: var(--ggs-bg-dark); color: var(--ggs-fjord-dark); border-radius: var(--ggs-radius-sm); } .ggs-btn-success { background: var(--ggs-moss); color: var(--ggs-white); } .ggs-btn-success:hover { background: var(--ggs-moss-dark); } .ggs-btn-danger { background: var(--ggs-coral); color: var(--ggs-white); } /* --- 18. Tutorial Overlay --- */ .ggs-tutorial { max-width: 440px; text-align: center; } .ggs-tutorial-dots { display: flex; justify-content: center; gap: 6px; margin-bottom: var(--ggs-gap-md); } .ggs-tutorial-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ggs-border); } .ggs-tutorial-dot.active { background: var(--ggs-fjord); } .ggs-tutorial-dot.done { background: var(--ggs-moss); } .ggs-tutorial-title { font-size: 18px; font-weight: 800; color: var(--ggs-fjord-dark); margin-bottom: var(--ggs-gap-sm); } .ggs-tutorial-text { font-size: 14px; color: var(--ggs-text-muted); line-height: 1.6; margin-bottom: var(--ggs-gap-lg); } /* --- 19. Progress-Dots (Phasen-Anzeige) --- */ .ggs-phases { display: flex; align-items: center; gap: 2px; } .ggs-phase-dot { width: 24px; height: 4px; border-radius: 2px; background: var(--ggs-border); transition: background var(--ggs-duration); } .ggs-phase-dot.done { background: var(--ggs-moss); } .ggs-phase-dot.current { background: var(--ggs-fjord); } /* --- 19b. Music Player (Header-Widget) --- Erwartet im HTML ein