Zum Inhalt springen
NativeCSS
Handbuch-Inhalt

Farben & Flächen

light-dark() ist die alleinige Dark-Mode-Mechanik - kein zweites Dark-Stylesheet, keine .dark-Klasse. EIN Wert pro Token deckt Hell und Dunkel ab.

Semantische Tokens

TokenZweck
--ncss-color-brand / -brand-2Marken-/Zweitfarbe
--ncss-color-neutralBasis-Grauton
--ncss-color-success / -warning / -dangerStatusfarben
--ncss-color-bg / -bg-subtleSeitenhintergrund, dezent abgesetzt
--ncss-color-surfaceKarten/Panels
--ncss-color-text / -text-mutedFließtext, gedämpfter Text
--ncss-color-borderRahmen
--ncss-color-focus-ringFokus-Ring
--ncss-color-overlayModal-/Dialog-Backdrop (transparent)

Abgestufte Skalen

Jede der sechs Farbfamilien (brand, brand-2, neutral, success, warning, danger) hat abgeleitete Stufen, per color-mix() aus GENAU EINEM Basiswert berechnet:

SuffixBedeutung
-100 / -300Heller/dezenter (Badge-/Chip-Hintergrund)
-500Die Basisfarbe selbst (Alias)
-700 / -900Dunkler/kräftiger, bleibt in BEIDEN Modi dunkel
-on-softPassende Textfarbe für eine -100/-300-Fläche

Eine Marke in theme.css ändern, die ganze Skala zieht automatisch mit - siehe Theme anpassen.

Farbige Flächen

helpers/surfaces.css: .ncss-surface--brand / --brand-2 / --neutral - Hintergrund + garantiert passende Textfarbe (900er-Stufe + #fff) in einer Klasse, statt Inline-Style mit hand-gepflegtem Kontrast.

<div class="ncss-surface--brand">Immer lesbarer Kontrast</div>

Web Awesome auf farbigen Flächen: ein <wa-input> o.ä. rendert Label/Wert im eigenen Shadow DOM - color allein erreicht das nicht. webawesome-bridge.css bridgt --wa-form-control-label-color u.a. automatisch mit, sobald .ncss-surface--* oder .ncss-text-light/-dark im Spiel sind.

Erzwungener heller/dunkler Text

.ncss-text-light/-dark (+ -100/-300/-700/-900 als Deckkraft-Stufen) - fest auf Weiß/Schwarz, UNABHÄNGIG vom Theme. Für Flächen, deren Farbe nicht über ncss-Tokens läuft (Foto, Video-Poster). UIkit-uk-light-Pendant.

Manueller Theme-Override

[data-theme="light"]/[data-theme="dark"] auf <html> erzwingt ein Farbschema unabhängig von der Systemeinstellung (z.B. für einen UI-Umschalter). Lokal auf ein einzelnes Element: .ncss-scheme-dark/-light (helpers/surfaces.css).

Umschalter mit gespeicherter Wahl (opt-in)

js/theme-toggle.js + components/theme-toggle.css machen daraus einen fertigen Umschalter: die Wahl bleibt in localStorage („ncss-theme“) gespeichert, ohne Wahl gilt das System (auch live, wenn es sich ändert). js/theme-toggle-early.js - synchron im <head> VOR dem CSS - setzt die Wahl, bevor die Seite gezeichnet wird, damit nichts aufblitzt; als eigene Datei statt Inline-Snippet, damit eine strenge CSP ohne 'unsafe-inline' funktioniert. Beide setzen zusätzlich [data-theme-resolved] = den tatsächlich aktiven Modus (auch bei „System“), z.B. für das passende Icon.

<script src="dist/js/theme-toggle-early.js"></script>
<link rel="stylesheet" href="dist/ncss.css">
<script src="dist/js/theme-toggle.js" defer></script>

<!-- Icon-Button: Hell <-> Dunkel -->
<button type="button" class="ncss-theme-toggle" data-ncss-theme-toggle>
  <span class="ncss-icon ncss-icon-moon ncss-theme-icon-dark" aria-hidden="true"></span>
  <span class="ncss-icon ncss-icon-sun ncss-theme-icon-light" aria-hidden="true"></span>
</button>

<!-- Zyklus: System -> Hell -> Dunkel -->
<button type="button" data-ncss-theme-toggle="cycle">Theme: <span data-ncss-theme-label>System</span></button>

Der Icon-Button bekommt aria-pressed und ein wechselndes aria-label („Dunkles Design einschalten“/„Helles Design einschalten“, Englisch nach <html lang>, überschreibbar per data-label-dark/-light). Entspricht die neue Wahl wieder dem System, wird die gespeicherte Wahl gelöscht. Der Farbwechsel blendet nur während des Umschaltens weich über (.ncss-theme-switching, abgeschaltet bei prefers-reduced-motion). Live: Demo.