/* * Das Widget ist ein transluzentes Overlay und committet sich bewusst auf * einen dunklen Look — ein heller Modus würde über beliebigen Fenstern * schlechter lesbar sein. Die Farbwerte stammen aus der validierten Palette * und wurden gegen die Oberfläche #1e1e22 geprüft. */ :root { color-scheme: dark; /* * Nahezu deckend: Ein transparentes Electron-Fenster hat keinen Backdrop, * den CSS blurren könnte — durchscheinender Text darunter macht das Widget * unlesbar. Die Transparenz steuert stattdessen bewusst das Tray-Menü über * die Fenster-Deckkraft. */ --surface: rgba(24, 24, 27, 0.985); --surface-solid: #1e1e22; --surface-raised: rgba(255, 255, 255, 0.05); --track: rgba(255, 255, 255, 0.1); --text-primary: #ffffff; --text-secondary: #c3c2b7; --text-muted: #898781; --hairline: rgba(255, 255, 255, 0.1); /* Statusfarben — fest, nie durch Serienfarben ersetzt */ --status-good: #0ca30c; --status-warning: #fab219; --status-critical: #d03b3b; --status-update: #9b6bd6; /* Kategoriale Slots (dunkle Stufen), fest je Modellfamilie vergeben */ --series-1: #3987e5; --series-2: #d95926; --series-3: #199e70; --series-4: #c98500; --series-other: #898781; --radius: 10px; --font: system-ui, -apple-system, "Segoe UI", sans-serif; } * { box-sizing: border-box; } /* * Das hidden-Attribut muss jede display-Regel schlagen. Ohne !important * gewinnt z. B. `.meter-head { display: flex }` gegen das UA-Stylesheet, und * ein ausgeblendeter Bereich bleibt sichtbar — mit leeren Platzhaltern. */ [hidden] { display: none !important; } html, body { margin: 0; padding: 0; background: transparent; overflow: hidden; font-family: var(--font); color: var(--text-primary); user-select: none; cursor: default; } .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } .widget { height: 100vh; display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--radius); overflow: hidden; } /* ── Kopfzeile ───────────────────────────────────────────────────────── */ .titlebar { -webkit-app-region: drag; /* einziger Ziehbereich des rahmenlosen Fensters */ display: flex; align-items: center; gap: 7px; padding: 7px 8px 7px 10px; border-bottom: 1px solid var(--hairline); flex: 0 0 auto; } .dot-brand { width: 7px; height: 7px; border-radius: 50%; background: var(--series-2); flex: 0 0 auto; } .title { font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .spacer { flex: 1; } .badge { font-size: 10px; border: 1px solid currentColor; border-radius: 4px; padding: 0 4px; white-space: nowrap; } .badge.warn { color: var(--status-warning); } .icon-btn { -webkit-app-region: no-drag; display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 18px; padding: 0; border: 0; border-radius: 4px; background: transparent; color: var(--text-muted); font-size: 13px; line-height: 1; cursor: pointer; } .icon-btn:hover { background: var(--surface-raised); color: var(--text-primary); } #btn-update-available { color: var(--status-update); } /* ── Meter ───────────────────────────────────────────────────────────── */ .meters { padding: 10px 12px 4px; display: flex; flex-direction: column; gap: 12px; flex: 0 0 auto; } .meter-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 5px; } .meter-label { font-size: 11px; color: var(--text-secondary); } .meter-value { font-size: 17px; font-weight: 650; line-height: 1; letter-spacing: -0.01em; } /* Balken: 4px runde Datenenden, an der Grundlinie verankert */ .track { position: relative; height: 8px; border-radius: 4px; background: var(--track); overflow: hidden; } .fill { position: absolute; inset: 0 auto 0 0; width: 0; border-radius: 4px; background: var(--status-good); transition: width 0.4s ease, background-color 0.3s ease; } /* Hochrechnung als schraffierte Verlängerung — deutlich vom Ist getrennt */ .projection { position: absolute; top: 0; bottom: 0; border-radius: 0 4px 4px 0; background-image: repeating-linear-gradient( 135deg, rgba(255, 255, 255, 0.28) 0 2px, transparent 2px 5px ); border-left: 2px solid var(--surface-solid); /* 2px Abstand zum Ist-Wert */ transition: left 0.4s ease, width 0.4s ease; } .meter-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 5px; font-size: 10.5px; color: var(--text-muted); } /* Status trägt immer Symbol + Text, nie Farbe allein */ .status { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; } .status-icon { width: 7px; height: 7px; border-radius: 50%; background: var(--status-good); flex: 0 0 auto; } .status[data-severity="warn"] .status-icon { background: var(--status-warning); border-radius: 1px; transform: rotate(45deg); /* zweite Unterscheidung neben der Farbe */ } .status[data-severity="critical"] .status-icon { background: var(--status-critical); border-radius: 1px; } .status[data-severity="warn"] .status-text { color: var(--status-warning); } .status[data-severity="critical"] .status-text { color: var(--status-critical); } /* Eigene Schriftgröße: .reset steht auch außerhalb von .meter-foot. */ .reset { /* Bleibt rechtsbündig, auch wenn der Status daneben entfällt. */ margin-left: auto; font-size: 10.5px; color: var(--text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; } /* ── Laufende Sitzung ────────────────────────────────────────────────── */ .session-figures { display: flex; gap: 18px; margin-top: 7px; } .figure { display: flex; flex-direction: column; gap: 1px; } .figure-value { font-size: 14px; font-weight: 600; line-height: 1.1; letter-spacing: -0.01em; } .figure-label { font-size: 9.5px; color: var(--text-muted); } .runway { margin: 2px 0 0; padding-top: 9px; border-top: 1px solid var(--hairline); font-size: 10.5px; line-height: 1.4; color: var(--text-secondary); } /* ── Aufklapper ──────────────────────────────────────────────────────── */ .expander { -webkit-app-region: no-drag; display: flex; align-items: center; justify-content: center; gap: 5px; width: 100%; padding: 6px; border: 0; border-top: 1px solid var(--hairline); background: transparent; color: var(--text-muted); font-family: inherit; font-size: 10.5px; cursor: pointer; flex: 0 0 auto; } .expander:hover { background: var(--surface-raised); color: var(--text-secondary); } .chevron { transition: transform 0.2s ease; display: inline-block; } .expander[aria-expanded="true"] .chevron { transform: rotate(180deg); } /* ── Detailansicht ───────────────────────────────────────────────────── */ .details { flex: 1 1 auto; overflow-y: auto; overflow-x: hidden; padding: 4px 12px 12px; border-top: 1px solid var(--hairline); } .details::-webkit-scrollbar { width: 6px; } .details::-webkit-scrollbar-thumb { background: var(--track); border-radius: 3px; } .detail-block { padding-top: 10px; } .detail-block + .detail-block { margin-top: 4px; border-top: 1px solid var(--hairline); } .detail-block h2 { margin: 0 0 7px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-muted); } /* Gestapelter Balken mit 2px Oberflächenlücke zwischen den Segmenten */ .stacked { display: flex; height: 8px; border-radius: 4px; overflow: hidden; background: var(--track); gap: 2px; } .stacked .segment { height: 100%; min-width: 2px; } .stacked .segment:first-child { border-radius: 4px 0 0 4px; } .stacked .segment:last-child { border-radius: 0 4px 4px 0; } .stacked .segment:only-child { border-radius: 4px; } .legend { list-style: none; margin: 7px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 4px 10px; font-size: 10.5px; color: var(--text-secondary); } .legend li { display: inline-flex; align-items: center; gap: 5px; } .legend .swatch { width: 8px; height: 8px; border-radius: 2px; flex: 0 0 auto; } /* Tabellenansicht — zweiter Zugang zu denselben Zahlen */ .model-table { width: 100%; margin-top: 9px; border-collapse: collapse; font-size: 10.5px; } .model-table th, .model-table td { padding: 3px 0; text-align: left; color: var(--text-secondary); font-weight: 400; white-space: nowrap; } .model-table th { color: var(--text-muted); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--hairline); } .model-table .num { text-align: right; font-variant-numeric: tabular-nums; } .model-table td:first-child { max-width: 118px; overflow: hidden; text-overflow: ellipsis; } .facts { display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; margin: 0; font-size: 10.5px; } .facts dt { color: var(--text-muted); white-space: nowrap; } .facts dd { margin: 0; text-align: right; color: var(--text-secondary); font-variant-numeric: tabular-nums; } .hint { margin: 8px 0 0; font-size: 10px; line-height: 1.45; color: var(--text-muted); } .errors { list-style: none; margin: 8px 0 0; padding: 0; font-size: 10px; line-height: 1.4; color: var(--status-warning); } .errors li + li { margin-top: 4px; }