InfraGuard

Helles / dunkles Design

Schaltet die Konsole zwischen Hell und Dunkel um — ein einziges data-theme-Attribut am Wurzelelement, in localStorage (infr-theme) gespeichert, eine Schaltfläche in der Kopfleiste und sämtliche Farben als --infr-*-CSS-Variablen-Token.

Überblick — was es leistet

Die InfraGuard-Konsole wird mit zwei Designs ausgeliefert: dunkel (Standard) und hell. Das Design wird über ein einziges Attribut am Wurzelelement des Dokuments (<html>) umgeschaltet, data-theme, dessen Wert den gesamten Satz der in SCSS definierten --infr-*-CSS-Variablen-Token austauscht. Jede Komponente verwendet var(--infr-*)-Token statt fest codierter Hex-Werte, sodass das Umlegen eines einzigen Wortes (dark ↔ light) die gesamte Oberfläche sofort neu einfärbt.

Der Standard ist dunkel — als NOC-Konsole (Network Operations Center) nutzt sie einen tief blauschwarzen Hintergrund mit türkisfarbenen Signalakzenten, damit die Schweregradfarben (crit / warn / good) auf dunklem Grund klar ablesbar bleiben.

<html data-theme="dark">   ← Standard, NOC-Dunkel
<html data-theme="light">  ← hell (helle Büroumgebungen)

Das Design ist eine reine Front-End-Einstellung. Es wird niemals auf dem Server gespeichert und hat weder mit Ihrem Konto noch mit der Datenbank zu tun — es lebt ausschließlich im localStorage des Browsers. Es übersteht das Abmelden, und wenn sich jemand mit demselben Konto auf einem anderen Gerät anmeldet, folgt dieses Gerät seiner eigenen Einstellung.


Wann Sie es nutzen

Einmal gewählt bleibt die Einstellung in diesem Browser erhalten, Sie stellen sie also normalerweise nur einmal ein.


Aufbau

Umschalt-Schaltfläche in der Kopfleiste

Sowohl die Konsolenhülle (layouts/app.blade.php) als auch der Anmeldebildschirm (layouts/simple.blade.php) platzieren rechts in der oberen Leiste eine Schaltfläche zum Designwechsel.

Element Wert
Markup-Anker <button data-theme-toggle>
Symbol mdi-theme-light-dark (Halbmond)
aria-label msg.action.theme (lokalisiert)
Aktion Ein Klick wechselt zwischen dunkel ↔ hell
Position Aktionsbereich der oberen Leiste (neben der Sprachumschaltung, links vom Benutzermenü)

Der Bildschirm vor der Anmeldung (Gast) trägt dieselbe Schaltfläche, Sie können das Design also ohne Authentifizierung ändern.

Gruppen von Farb-Token

resources/scss/_variables.scss definiert dieselben Token-Namen mit unterschiedlichen Werten in zwei Blöcken: :root[data-theme="dark"] und :root[data-theme="light"]. Repräsentative Token:

Token Zweck dark light
--infr-bg Seitenhintergrund #0b1220 #f6f8fb
--infr-surface Panel-/Kartenfläche #111b2c #ffffff
--infr-fg Fließtext #e9eff8 #111a28
--infr-fg-muted Sekundärtext #8493ac #63728b
--infr-border Rahmen #1e2c43 #dbe2ec
--infr-accent Akzent (Türkis) #2dd4bf #0d9488
--infr-crit Schweregrad kritisch #fb7185 #e11d48
--infr-warn Schweregrad Warnung #fbbf24 #b45309
--infr-good Schweregrad gesund #34d399 #0f9d6a
--infr-info Information #38bdf8 #0369a1

Darüber hinaus definiert jedes Design außerdem --infr-surface-2/hi, --infr-border-2, --infr-accent-soft/ink, --infr-on-accent (Schaltflächentext auf Akzentfarbe), TCP-Zustandsfarben (--infr-state-*), Diagrammfarben (--infr-chart-2), Schatten/Leuchten (--infr-shadow / --infr-glow) sowie das Glas der oberen Leiste (--infr-topbar-*). Jeder Block deklariert zusätzlich color-scheme: dark|light, damit native Formularelemente und Bildlaufleisten zum Design passen.

Die Farbpalette des SSH-Terminals ist eine Ausnahme. Die --infr-term-*-Token bleiben unabhängig von data-theme tief und immersiv dunkel. Auch im hellen Design behält die SSH-Konsole ein dunkles Terminal.


Vorgehen

Umschalten

  1. Klicken Sie rechts in der oberen Leiste auf das Halbmond-Symbol (Design wechseln).
  2. Es wechselt sofort zwischen dunkel ↔ hell, und die Auswahl wird automatisch gespeichert.
  3. Beim nächsten Besuch oder nach einem Neuladen der Seite wird Ihre letzte Auswahl wiederhergestellt.

Unter der Haube (Entwicklerreferenz)

Das Front-End ist in resources/js/app.js verdrahtet. Kernlogik:

const THEME_KEY = 'infr-theme';                 // localStorage-Schlüssel
const get_theme = () => localStorage.getItem(THEME_KEY) || 'dark';   // Standard dunkel
const set_theme = (t) => {
    document.documentElement.setAttribute('data-theme', t);   // Attribut am Wurzelelement
    localStorage.setItem(THEME_KEY, t);                        // dauerhaft speichern
    window.dispatchEvent(new CustomEvent('infr:theme', { detail: t })); // Diagramme neu einfärben
};
// die Umschalt-Schaltfläche verdrahten
document.querySelectorAll('[data-theme-toggle]')
    .forEach(btn => btn.addEventListener('click',
        () => set_theme(get_theme() === 'dark' ? 'light' : 'dark')));

Zusammenfassung des Verhaltens:

Schritt Was
Speicherschlüssel localStorage['infr-theme'] = "dark" | "light"
Angewendet auf Attribut data-theme an document.documentElement (dem <html>)
Standard dark (wenn localStorage leer oder nicht lesbar ist)
Ereignis Jeder Wechsel löst am window ein CustomEvent infr:theme aus (detail = aktuelles Design)
Synchronisierung zwischen Tabs Lauscht auf das storage-Ereignis → andere Tabs desselben Browsers synchronisieren sich automatisch

Vermeidung des Aufblitzens ungestylter Inhalte (FOUC) — Skript vor dem Zeichnen

Ein winziges Inline-Skript ganz oben im <head> (von app.blade.php und simple.blade.php gemeinsam genutzt, vor dem CSS-Laden per @vite) setzt data-theme, bevor irgendein Stylesheet greift. Damit entfällt das "Dunkel→Hell-Aufblitzen" beim Neuladen.

<script>
  (function () {
    try { document.documentElement.setAttribute('data-theme',
            localStorage.getItem('infr-theme') || 'dark'); }
    catch (e) { document.documentElement.setAttribute('data-theme', 'dark'); }
  })();
</script>

Selbst dort, wo localStorage blockiert ist (Inkognito, blockierter Drittanbieterspeicher usw.), fällt das catch sicher auf dunkel zurück.

Diagramme und Editoren folgen dem Design

<cm-editor v-model="script.body" lang="bash" :dark="is_dark_mode"></cm-editor>

Datenquellen

Das Design hat überhaupt keine Speicherung in der Datenbank oder auf dem Server. Es verwendet ausschließlich:

Ort Inhalt
localStorage['infr-theme'] Benutzerauswahl je Browser (dark/light)
<html data-theme> Zur Laufzeit angewendeter Zustand
resources/scss/_variables.scss Tatsächliche Werte der --infr-*-Token je Design (in das CSS kompiliert)
resources/js/app.js Umschalten / Speichern / Ereignisverdrahtung

Anhang C (Token für helles/dunkles Design) in CLAUDE.md ist die maßgebliche Quelle für den Entwurf der Farbpalette.


Zugriff

Das Design ist eine Oberflächeneinstellung ohne Bezug zu Authentifizierung oder Autorisierung.


Fehlerbehebung und FAQ

F. Das Design wird beim Neuladen zurückgesetzt. Wenn der Browser localStorage blockiert (Inkognito, strenge Datenschutzeinstellungen, Blockade von Drittanbieterspeicher), lässt sich die Auswahl nicht sichern und fällt jedes Mal auf den Standard dunkel zurück. Gewähren Sie der Website Zugriff auf den Speicher.

F. Ich habe es in einem Tab geändert, aber ein anderer Tab hat sich nicht aktualisiert. Der Wechsel wird über das storage-Ereignis an andere Tabs desselben Browsers weitergegeben. Wird er nicht sofort übernommen, hat dieser Tab die Verdrahtung des Listeners (app.js) möglicherweise noch nicht geladen — laden Sie ihn neu. Unterschiedliche Geräte/Browser haben getrennte Speicher und synchronisieren sich nicht (so gewollt).

F. Ich habe auf Hell umgeschaltet, aber das SSH-Terminal bleibt dunkel. Das ist zu erwarten. Das Terminal verwendet eine eigene --infr-term-*-Palette, die unabhängig vom Anwendungsdesign tiefdunkel bleibt (Lesbarkeit / Immersion).

F. Eine Komponente sieht falsch aus (das Design greift bei ihr nicht). Diese Komponente hat Hex-Werte fest codiert statt Token zu verwenden. Per Konvention dürfen Komponenten ausschließlich var(--infr-*)-Token verwenden. Prüfen Sie resources/scss/pages mit dem Regressions-Grep auf direkte Hex-Werte:

rg -n "#[0-9a-fA-F]{3,6}" resources/scss/pages

F. Ich möchte, dass es dem Dunkelmodus meines Betriebssystems folgt. Die aktuelle Implementierung folgt der Betriebssystemeinstellung (prefers-color-scheme) nicht. Der Anfangswert ist immer dark, und sie merkt sich nur, was der Benutzer über die Schaltfläche ausdrücklich gewählt hat. Die Integration mit dem Betriebssystem steht auf der Roadmap.


Verwandte Themen

상단바 오른쪽의 테마 · 언어 전환
상단바 오른쪽의 테마 · 언어 전환