FluentUI: Design-Tokens
Zurück: FluentUI (Design-System-Bibliothek)
Status: Tier 1 — beschreibt tatsächlich umgesetzten Code (lib/plugins/wkfluentui/style.css).
Farb-Kernkontrakt
wkfluentui/style.css definiert dieselbe „cross-template Contract“-Sektion wie
premium-navy-ivory/css/tokens.css:33-176 (ink/paper/accent/gold/surface/text/link/border/
highlight/sidebar/success/warning/error/admin-accent — dieselben Namen wie
lib/tpl/flat/css/color-palette.css). Werte: flats eigene Palette (DokuWikis
Stock-Referenz-Template — die neutralste, unabhängigste Wahl für einen generischen Default,
keine der WvdS-Marken-Paletten wird bevorzugt). Vollständige Token-Liste:
Styles-Contract (--wk-*).
Größen-/Radius-/Spacing-/Typografie-Skala (neu, forensisch belegt)
Quelle: src/vs/workbench/browser/media/{style,part}.css (VSCode/ADS gemeinsam,
https://github.com/microsoft/vscode) + ADS-spezifische Form-/Dialog-CSS unter
src/sql/** (https://github.com/microsoft/azuredatastudio). Alle Werte sind
pixel-zitiert, nicht geschätzt.
| Token | Wert | Quelle |
|---|---|---|
–wk-fs-chrome | 11px | style.css:43, part.css:53 (Chrome-/Meta-Schrift: Titel-Leisten, Labels) |
–wk-fs-body | 13px | style.css:53-54 (Standard-Body-Text, line-height:1.4em) |
–wk-fs-title | 15px | ADS modal.css:82-83 (Dialog-Titel, font-weight:600) |
–wk-icon-size | 16px | style.css:152 (Standard-Icon-Größe, fix) |
–wk-radius-sm | 2px | button.css:11, inputBox.css:11, selectBox.css:9 (Radius Button/Input/Select geschlossen) |
–wk-radius-md | 5px | dropdown.css:26, menubar.css:56 (Radius Menü/Dropdown-Popover) |
–wk-radius-lg | 8px | ADS card.css:89 (Radius Card/Tile, ADS-spezifisch) |
–wk-space-1 … –wk-space-6 | 5/10/15/20/25/30px | ADS formLayout.css:8, designer.css:98, card.css:11 (5px-Schritte, nicht das 4px-Fluent-Raster) |
Nicht übernommene Werte: Part-Content-Text-Override (ADS: 12px, part.css:91), Icon-
Größe klein (13px, ADS designer.css:119), Radius Toggle/Hover/Tooltip (3px, toggle.css:13,
hover.css:104), Dialog-Breiten (500/800/1200px, ADS modal.css:60-72) — dokumentiert als
Referenzwerte in FluentUI: Basic Layout (vertieft) und FluentUI: Basis-Widget-Katalog,
aber (noch) nicht als eigene wkfluentui-Tokens ausgeliefert, da kein aktueller Verbraucher.
Shell-Regionen (Basic Layout)
Anders als die Größen-/Radius-/Spacing-Skala oben sind dies keine neu pixel-gemessenen
ADS-Werte, sondern Alias-Tokens: jeder Fallback verweist auf einen bereits
bestehenden –wk-*-Token, kein neuer Hex-/Pixel-Wert wird erfunden (Ausnahme:
–wk-shell-statusbar-h, pixel-zitiert aus derselben ADS-Quelle wie die
Basic-Layout-Tabelle in FluentUI (Design-System-Bibliothek), Region (7)). Erster
Konsument: wksqlitedss .wkq-shell-Grid (siehe
FluentUI: Basic Layout (vertieft)).
| Token | Fallback | Verwendung |
|---|---|---|
–wk-shell-sidebar-bg | var(–wk-surface-alt) | Hintergrund der Sidebar-Region |
–wk-shell-sidebar-border | var(–wk-border) | Rahmen rechts der Sidebar-Region |
–wk-shell-content-bg | var(–wk-surface) | Hintergrund der Content-Region |
–wk-shell-auxbar-bg | var(–wk-surface-alt) | Hintergrund der Auxiliary-Bar-Region |
–wk-shell-auxbar-border | var(–wk-border) | Rahmen links der Auxiliary-Bar-Region |
–wk-shell-statusbar-bg | var(–wk-surface-alt) | Hintergrund der Statusbar-Region |
–wk-shell-statusbar-border | var(–wk-border) | Rahmen oben der Statusbar-Region |
–wk-shell-statusbar-text | var(–wk-text-alt) | Textfarbe in der Statusbar-Region |
–wk-shell-statusbar-h | 22px | fixe Statusbar-Höhe, ADS part.css (siehe FluentUI: Basic Layout (vertieft), Region (7)) |
–wk-shell-commandbar-bg | var(–wk-surface-alt) | Hintergrund der Command-Bar-Region (WvdS-Ergänzung) |
–wk-shell-commandbar-border | var(–wk-border) | Rahmen unten der Command-Bar-Region |
Bewusst nicht ausgeliefert: –wk-shell-titlebar-*/–wk-shell-rail-* — kein
aktueller Verbraucher (Titlebar/Activity Bar werden von premium-navy-ivorys Wiki-Shell
geerbt, nicht von wksqliteds neu gebaut; siehe „Nicht übernommene Werte“-Konvention
oben).
Berührung, Baumzeilen, Schubfach (Live seit 2026-08-25)
Fünf Token für die Frage „wie groß ist das auf einem Finger„. Sie stehen hier
und nicht bei den Shell-Regionen, weil sie zeigergerätabhängig sind: unter
@media (pointer: coarse) nehmen zwei von ihnen einen anderen Wert an.
Ein Verbraucher schreibt einen Namen und bekommt auf beiden Geräteklassen
die richtige Zahl — die Medienabfrage in jedem Aufrufer zu wiederholen ist der
Weg, auf dem zwei Umschaltpunkt-Systeme entstehen.
| Token | Wert | unter pointer: coarse | Verwendung |
|---|---|---|---|
–wk-touch-min | 40px | 44px | Untergrenze jeder Trefferfläche |
–wk-tree-row-height | 26px | 36px | Zeilenhöhe eines Baums |
–wk-drawer-width | 100% | — | Schubfach auf dem Telefon: Vollbild |
–wk-drawer-width-tablet | 380px | — | Schubfach auf dem Tablett: begrenztes Overlay |
–wk-mobile-header-height | 48px | — | Kontextzeile über dem Inhalt auf kleinen Bildschirmen |
–wk-touch-min trug zwei Werte, und der Rückfallwert der Aufrufer war
richtiger als die Definition.
Der Token war genau einmal definiert, mit 32px, und zwar in einem Block,
der fremden Paketen Namen nachreicht — nicht im eigentlichen Tokenblock. Fünf
Pakete lasen ihn als var(--wk-touch-min, 40px):
wkdocore, wkdodashboard, wkdogit, wkdoqueries, wkdoworkitems.
Die Trefferfläche hing damit daran, ob dieses Stylesheet auf der Seite geladen
war — mit ihm 32px, ohne es 40px. Und 32px liegt unter jeder Untergrenze, die
dieses Projekt aufgeschrieben hat: ADR-009 nennt 40, die Telefonstufe 44. Der
einzige eigene Aufruf stand ausgerechnet in @media (pointer: coarse),
also an der einen Stelle, an der der Name überhaupt etwas bedeutet.
Die neuen Werte sind so gewählt, dass kein fremdes Paket angefasst werden
muss: 40px am Zeigergerät ist genau das, was die fünf ohnehin angenommen
hatten; ihr Rückfallwert wird damit zur Wahrheit statt zum Widerspruch.
Gefunden von dw-portable-b7.
Nachverifikation der Admin-Skala (erledigt)
premium-navy-ivorys –wk-admin-fs-*/–wk-admin-radius-Skala
(tokens.css) wurde am 2026-07-14 forensisch gegen den ADS-Quellcode nachverifiziert;
die Kommentarblöcke direkt an den Token-Definitionen dokumentieren je Wert Quelle und
Befund. Ergebnis: keine Wertänderung nötig. –wk-admin-radius 2px ist gegen ADS
bestätigt (button.css:11; das heutige VSCode nutzt seit dem Rounded-Refresh 4px —
bewusst der ältere ADS-Stand). Die Karten-Rundung 4px und die Schriftskala sind
dokumentierte, gewollte Abweichungen: die ADS-Karte (card.css:89, 8px) ist eine
Marketing-Kachel und passt nicht in die flache Admin-Optik; die Admin-Schriftgrößen liegen
eine Stufe über der ADS-Basis 11/13/15 — Lesbarkeits-Entscheidung des Nutzers vom
2026-07-11, ausdrücklich nicht zurückzunehmen.
Ladereihenfolge / Überschreib-Verhalten
lib/exe/css.phps css_out() komponiert: Core-Styles → Plugin-Styles
(css_pluginstyles(), bindet wkfluentui/style.css automatisch ein) → Template-Styles
(z. B. wkbizway/css/tokens.css, via style.ini-stylesheets-Liste) →
User-Styles. Template-Regeln laden nach Plugin-Regeln — bei gleicher Selektor-Spezifität
() gewinnt die zuletzt definierte, d. h. ein aktives Template mit eigenen
:root–wk-*-Werten überschreibt wkfluentuis Defaults automatisch; ist kein Template mit
eigenen Tokens aktiv, bleiben wkfluentuis Werte als Site-weiter Fallback bestehen.
Wo eine Ableitung stehen darf
Ein Teil der Tokens sind keine Werte, sondern Ableitungen: ihr Wert liest über var() ein anderes Token, damit eine Änderung an der Basis alles mitzieht, was daraus folgt. Dabei gilt eine Eigenschaft, die man der Schreibweise nicht ansieht:
Eine Ableitung in rechnet also gegen die Palette der Wurzel. Eine Fläche weiter unten im Baum, die eine der Basen für sich umbelegt, erreicht sie nicht: die Ableitung behält die Antwort der Wurzel. Es gibt dabei keine Fehlermeldung – das Stilblatt ist gültig, der Wert ist gültig, die Seite rendert.
:root
Am 4. August 2026 über Bausatz und Hausvorlage gemessen: 13 Ableitungen in lesen eine Basis, die eine Fläche unterhalb von :root umbelegt. Zwei davon waren belegt falsch. Beispiel: die Anmeldekarte setzt :root – sie will eckige Ecken –, und innerhalb dieser Fläche antwortete das abgeleitete --wk-radius-md: 0 weiterhin --wk-radius5px.
Seither gilt die Regel, und ein Prüflauf des Repositories hält sie nach. Für jede solche Ableitung ist genau eine von zwei Antworten zulässig:
| Antwort | Bedeutung | Umsetzung |
|---|---|---|
| folgt | die Fläche soll den abgeleiteten Wert verändern | die Ableitung wird auf derselben Fläche erneut deklariert, oder sie wandert in die Komponentenregel, wo var() am Element auflöst |
| folgt bewusst nicht | das Token benennt eine Aussage der Palette; eine flächenlokale Umbelegung liegt außerhalb seines Gegenstands | Eintrag in der Ausnahmetabelle des Prüflaufs, mit Grund |
Unzulässig ist die dritte Möglichkeit: unentschieden.
Zustände: die Gruppe „States"
Ein Zustand wird hier als Anteil geführt, nicht als Farbe – und das folgt unmittelbar aus der Regel darüber.
| Token | Wert | Bedeutung |
|---|---|---|
--wk-state-disabled-opacity | 55% | Deckkraft eines gesperrten Bedienelements |
--wk-state-readonly-tint | 8% | Anteil der eigenen Schriftfarbe, der in den eigenen Grund gemischt wird |
--wk-state-hover-tint | 7% | derselbe Anteil für den Zeigen-Zustand |
--wk-state-press-tint | 15% | derselbe Anteil für den Druckzustand |
--wk-state-press-dim | 82% | Helligkeitsstufe des Druckzustands bei Flächen mit eigener Farbe |
Ein Zustandston als Farbtoken in rechnete gegen die Wurzelpalette und folgte keiner Fläche, die die Feldfarben umbelegt – die Anmeldekarte tut genau das. Ein Anteil wird dagegen in der Komponentenregel verrechnet:
:root
background: color-mix(in srgb, var(--wk-field-fg) var(--wk-state-readonly-tint), var(--wk-field-bg));
Dort löst var() am Element auf. Der Zustand folgt damit jeder Fläche, jedem Schema, jeder Haut und jedem Akzent – aus einer Deklaration, statt je Achsenblock wiederholt zu werden.
Zeigen und Drücken kamen am 5. August 2026 – zusammen mit den Regeln, die sie zeichnen, wie es die frühere Fassung dieses Abschnitts angekündigt hatte. Ein Token, das niemand liest, ist dieselbe Bauform wie ein Token, das gelesen und nie definiert wird; deshalb standen sie bis dahin nicht hier.
Warum der Druckzustand zwei Werte hat
Der Unterscheider ist, wessen Farbe die Fläche ist.
Ein Bedienelement, das die Fläche des Schemas erbt – ein Eingabefeld, eine sachliche Schaltfläche –, bekommt die Mischung von oben. Sie ist selbstrichtend: im hellen Schema ist die Schrift dunkel und die Fläche wandert nach dunkel, im dunklen Schema umgekehrt. Eine Deklaration deckt damit alle drei Schemata ab.
Ein Bedienelement mit eigener Farbe – Hauptaktion, Gefahr, Erfolg – bekommt stattdessen eine Helligkeitsstufe. Seine eigene Schrift hineinzumischen würde es im hellen Schema heller machen, während sein Hover-Wert es dunkler macht: eine Geste, zwei Richtungen. Eine Helligkeitsstufe kennt ebenfalls keine Farbe, braucht keine Farbfunktion und hält beide Zustände auf einer Achse.
color-mix() übersteht DokuWikis LESS-Übersetzer unbeschädigt – auch mit var() in der Prozentposition, mit Ersatzwerten und zwei Ableitungsebenen tief. Gemischte Einheiten in calc() bleiben dagegen verboten; sie brechen dort nicht ab, sondern rechnen still falsch. Ein Nullprozent übersteht er allerdings nicht – siehe den Abschnitt zur Palette unten.
Die Palette: drei Schemata, drei Akzente
Am 5. August 2026 wurde die Palette erstmals als Ganzes ausgerechnet: jedes Wertepaar aus Schriftfarbe und Fläche, das der Bausatz tatsächlich rendert, gegen die Kontrastanforderung der WCAG 2.2 (Erfolgskriterium 1.4.3, Stufe AA: 4,5:1 für Fließtext; Erfolgskriterium 1.4.11: 3:1 für die Kante, die ein Bedienelement identifizierbar macht).
Die drei Mängel, die frühere Etappen einzeln notiert hatten, waren die sichtbare Spitze davon. Ein Stilblatt kann nicht fehlschlagen: ein fast lesbarer Wert sieht aus wie eine Gestaltungsentscheidung.
Zwei Ursachen, beide strukturell
Ein Tokenname trug zwei Aufgaben. --wk-border bemalte die Zierlinie zwischen zwei Tabellenzeilen und die Kante eines Eingabefeldes. Für die Zierlinie sind 1,71:1 richtig – eine Trennlinie, die 3:1 erreicht, ist ein Balken. Für die Feldkante ist derselbe Wert ein Verstoß gegen 1.4.11, denn die Kante ist das Einzige, was das Feld als Feld erkennbar macht. Ein Wert kann nicht beides richtig sein; die Feldkante hat seither einen eigenen.
Dieselbe Verwechslung bei den Zuständen: --wk-warning war zugleich Signal (Symbol, Kante, Füllung) und Schrift auf dem Warngrund und Schrift auf der Seite. Als Signal ist ein Gold richtig; als Schrift erreichte dasselbe Gold 2,39:1, und Weiß auf der goldenen Zählmarke 2,10:1. Die Familie hat deshalb drei Tokens: Signal, Schrift, und die Tinte auf dem Signal.
Das dunkle Schema war unvollständig. Es belegte Flächen, Schrift, Schale und Seitenleiste neu, aber weder die Akzent- noch die Zustandsfamilie. Ein dunkler Bildschirm zeigte also den hellen Erfolgskasten, und der Verweis stand bei 3,71:1 bzw. 2,22:1 im Zeigen-Zustand.
Die drei Schemata
| Schema | Attribut | Material |
|---|---|---|
| hell | keines (Basisblock) | weißes Papier, kühle Neutralstufen |
| Heritage | data-wk-scheme="heritage" | Elfenbein-Papier, Navy-Kommandoband, Gold als Zierlinie |
| dunkel | data-wk-scheme="dark" | nahezu schwarze Fläche, warme Schrift |
Heritage ist keine dritte Helligkeit zwischen hell und dunkel. Für den Browser ist es eine helle Welt, und color-scheme: light sagt das auch – sonst zeichnete er die nativen Bedienelemente gegen die falsche Annahme. Ein Schema zu sein verdient es dadurch, dass es Material umbelegt: Flächen und Schrift, sonst nichts.
text.secondary ist dort #C2A980, ein Gold: auf dem Elfenbein-Papier sind das 2,05:1, auf dem Navy-Kommandoband 7,25:1. Die Vorgabetabelle nennt eine Rolle, wo es zwei gibt. Das Gold steht deshalb heute dort, wo es funktioniert – als gedämpfte Schrift der Schale –, und das Papier hat ein eigenes warmes Dunkelgrau. Ebenso interactive.focus: in allen drei Schemata #1D3A6C, was auf der dunklen Fläche 1,74:1 ergibt – ein Fokusring, den niemand sieht.
Die drei Akzente
| Akzent | Grundton | zweite Farbe |
|---|---|---|
| Atlantic | #1D3A6C | Navy |
| Riviera | #0F5132 | Racing Green |
| Graphit | #3A4249 | Graphit |
Rot ist die Konstante der Akzentsprache des Hauses und ausdrücklich keiner der drei: es ist der Alarm, und ein Alarm, der zugleich die Marke ist, hört auf, ein Alarm zu sein. Getrennt werden die Familien über ihre zweite Farbe – und Graphit ist im Satz, weil es als einziges kein Buntton-Nachbar der beiden anderen ist und die drei damit auf einem dichten Datenbildschirm auseinanderzuhalten bleiben.
Vorher standen dort vier Farbnamen (blau, orange, grün, violett) mit je drei handgeschriebenen Werten. Jeder dieser Werte war in genau einem Schema richtig: „blau“ hatte einen Hexwert, und der war entweder ein lesbarer Verweis auf Papier oder auf nahezu Schwarz, nie beides.
Eine Familie, ein Grundton, eine Richtung
Drei Familien mal drei Schemata wären neun von Hand gleichgehaltene Blöcke. Stattdessen nennt jede Familie einen Grundton, und das Schema sagt, wie viel davon bleibt:
--wk-accent: color-mix(in srgb, var(--wk-accent-base) var(--wk-accent-keep, 100%), var(--wk-accent-lift, #FFFFFF));
| Regler | hell / Heritage | dunkel |
|---|---|---|
--wk-accent-keep | 100% | 54% |
--wk-accent-press-lift | #000000 | #FFFFFF |
Der zweite Regler ist der interessantere: „gedrückt„ ist eine Richtung, keine Helligkeit. Auf heller Fläche ist der Druckzustand dunkler, auf dunkler heller – und keine Akzentfamilie muss dafür wissen, dass es ein dunkles Schema gibt.
color-mix(). Der LESS-Übersetzer dieser Installation normalisiert 0% zu einem einheitenlosen 0. color-mix() verlangt einen Prozentwert; eine nackte Null macht die ganze Funktion zur Berechnungszeit ungültig, und das Token fällt still auf den Erbwert zurück.
Im Browser gemessen, nicht vermutet: alle drei Akzente ergaben rgb(92,92,92) – die umgebende Textfarbe –, während das Bündel sauber übersetzte und nichts protokolliert wurde. Deshalb heißt der Regler „wie viel bleibt“ und nicht „wie weit angehoben„: 100% ist eine Zahl, die der Übersetzer nicht anzufassen braucht.
Das ist die schärfere Form der Regel, die für calc() schon galt: der Schaden ist kein Abbruch, sondern ein Wert, der in der Quelle richtig aussieht und vom Browser verworfen wird.
Was ein Achsenblock auf einem Container zusätzlich braucht
Die Regel aus dem Abschnitt „Wo eine Ableitung stehen darf“ gilt eine Ebene höher noch einmal. Ein Token, das in als :rootvar(X) deklariert ist, wird an der Wurzel beantwortet. Sitzt das Schema ebenfalls an der Wurzel – der gewöhnliche Fall, serverseitig gestempelt –, stimmt das. Sitzt es auf einem Container, wie es die Modul-Auszeichnung tut, hat die Wurzel schon geantwortet.
Gemessen an einem Prüfelement: --wk-btn-primary-text blieb weiß, während --wk-text-on-accent daneben nahezu schwarz war – die Hauptschaltfläche verlor ihre Beschriftung bei 3,20:1. Gefunden hat das der Browser, nicht der Prüflauf.
Seither gilt: ein Achsenblock, der eine Basis umbelegt, wiederholt die kontrastrelevanten Ableitungen daraus. Der Prüflauf hält das nach – beschränkt auf die Paarungen, weil dieselbe Regel auf alle Ableitungen angewandt rund 200 wiederholte Deklarationen verlangte und damit genau die Doppelung zurückkaufte, gegen die die Palette gebaut ist. Die übrigen 71 werden gezählt und gemeldet, nicht gefordert.
Der Prüflauf
Der Kontrast-Prüflauf rechnet 34 Paarungen in 12 Kombinationen (drei Schemata mal vier Akzente einschließlich der Vorgabe), seit dem 9. August zusätzlich über die Hautachse gekreuzt mit dem Schema, und prüft daneben Achsenliste, Beschriftungen in fünf Sprachen und die Nullprozent-Regel: 514 Prüfungen.
Er ist eine Ratsche in beide Richtungen. Ein Wert, der schlechter wird, schlägt fehl – und eine Paarung, die sich nicht mehr auflösen lässt, ebenso: ein Tor, das nur in eine Richtung misst, hört unbemerkt auf zu messen, und dafür hat dieses Projekt schon dreimal bezahlt.
Die Hautachse: der Befund, der die Achsen entflochten hat
Bis zum 5. August 2026 kannte der Prüflauf zwei Achsen. Die Häute waren damit ungemessen – sie belegten je 26 Werte neu und erbten alle übrigen, und ob die geerbten zu den neu belegten passen, hatte nie jemand ausgerechnet.
Die erste Messung fand 72 Einzelverstöße in 19 Paarungen, und beim Nachsehen, woher sie kommen, lag die Ursache eine Ebene tiefer als der Kontrast.
Die Ursache: gleiche Gewichtung, und die Haut stand hinten
Alle vier Achsen sind als :root[data-wk-<achse>="<wert>"] geschrieben und wiegen damit gleich. Bei gleicher Gewichtung entscheidet allein die Reihenfolge im Bündel – und dort standen die Hautblöcke nach den Schemablöcken, bei denselben neun Neutralen.
Gemessen am 9. August 2026: 105 Belegungen, bei denen eine Haut das Schema überschrieb, 25 der 26 Hauttokens allein gegen das Dunkelschema. Die Folge war nicht subtil – skin="wxi" zusammen mit scheme="dark" rendert weißes Papier.
Die Auflösung: disjunkte Tokenmengen
Eine Haut nennt seither ihre Neutralen je Helligkeitswelt (--wk-n-<welt>-<rolle>), ein Schema liest eine Welt und belegt daraus die semantischen Tokens. Die beiden Mengen überschneiden sich nicht mehr, und damit hört die Reihenfolge auf, zwischen ihnen zu entscheiden – die einzige Form von Orthogonalität, die es übersteht, dass jemand einen Block verschiebt.
Der Akzent bleibt die gewollte Ausnahme: er soll Haut und Schema überstimmen, steht deshalb zuletzt, und ein Tor sichert zu, dass er dort bleibt.
Warum nicht wie beim Akzent aus einem Grundton abgeleitet: ein Farbton ist wirklich eine Sache unter verschiedenem Licht, Neutrale sind das nicht. Die neun hellen Stufen dieses Hauses sind keine gerade Mischung zwischen ihren eigenen Enden – vor der ersten Zeile durchgerechnet, verfehlt ein Zwei-Punkt-Mix --wk-border um neun Werte je Kanal, und mehrere Stufen tragen eine erkämpfte Kontrastkorrektur, die dabei verloren ginge.
Eine Haut nennt nur die Welten, die sie hat. wxi hat eine helle und eine dunkle Lesart und keine Heritage-Lesart, fällt unter scheme="heritage" also auf die Hausrampe zurück. Das ist die vorgesehene Antwort, keine Lücke.
Was die Entflechtung gebracht hat
| vorher | nachher | |
|---|---|---|
| Haut überschreibt Schema | 105 Belegungen | 0 |
| Verstöße der Hautachse | 72 in 19 Paarungen | 28 in 7 |
| Gemessene Kombinationen | Haut × Akzent | Haut × Schema × Akzent |
| Hautnamen | drei | einer |
Der Rückgang ist dabei untertrieben: der Sweep misst seither die dreifache Zahl an Kombinationen. Und es wurde nichts umgefärbt – die verbliebenen sieben Paarungen sind WXIs eigene gedämpfte Graustufen (2,85:1 hell, 2,99:1 dunkel), unverändert übernommen, damit der offene Befund weiter beschreibt, was im Baum steht.
wxi-darkness und wxi-clearness sind dabei als Hautnamen entfallen. Die erste war eine Helligkeitswelt mit Hautnamen – erkennbar daran, dass sie ihr color-scheme selbst tragen musste, was eine Welt sagt und ein Charakter nicht; sie ist jetzt skin="wxi" scheme="dark". Die zweite war WXIs helle Lesart mit einem anderen Blau, und nach dem Umzug des Akzents auf eine eigene Achse blieb nichts übrig, was sie von wxi unterschieden hätte.
skin=-Attribut einer Modulfläche. wxi-darkness nimmt dabei seine Helligkeit mit: wer ihn gewählt hat, hat einen dunklen Bildschirm gewählt, und nur den Hautteil zu übersetzen hätte ihn auf einen hellen verschoben – in der Achse, in der es niemand nachgesehen hätte.
Festgenagelt wird die Menge, nicht die Zahl. Eine Obergrenze auf die Anzahl ließe eine Verschiebung durch: ein Verstoß behoben, ein neuer entstanden, Summe unverändert, Meldung „unverändert“ für ein Stilblatt, das sich bewegt hat. Verglichen wird deshalb die Liste der betroffenen Paarungen, und der Prüflauf nennt, was dazugekommen und was verschwunden ist.
--wk-surface in ihrem eigenen :root, später im Bündel und bei gleicher Gewichtung. Vorher hat der Hautblock sie mit höherer Spezifität überstimmt – also genau die Spezifitätsschlacht, die die Hausregel „Plugin definiert, Thema übersteuert„ verbietet. Im Dunkelschema greift die Haut weiter. Aufgelöst wird das, wenn die Palette der Vorlage in dieselbe Rampenform wandert.
Was er ausdrücklich nicht misst, ist die gerenderte Seite: eine berechnete Farbe kann aus einer Regel kommen, die er nie sieht. Der Prüflauf belegt, dass die Palette stimmt; der Browsercheck belegt, dass die Regeln sie ausgeben.
Verifiziert gegen: wkfluentui@462fab6 (2026-08-09), wk-dw-msqlite-plugin@240c064