Skip to content

feat(ui): EYT-80 zentrale Basisdesign-v2-Tokens und deterministisches Kontrastgate - #96

Merged
DYAI2025 merged 8 commits into
masterfrom
feat/eyt-80-basisdesign-tokens
Aug 28, 2026
Merged

feat(ui): EYT-80 zentrale Basisdesign-v2-Tokens und deterministisches Kontrastgate#96
DYAI2025 merged 8 commits into
masterfrom
feat/eyt-80-basisdesign-tokens

Conversation

@DYAI2025

@DYAI2025 DYAI2025 commented Aug 27, 2026

Copy link
Copy Markdown
Owner

Worum es geht

packages/ui besitzt ab jetzt die semantischen Basisdesign-v2-Farbrollen. apps/web/app/globals.css
fuehrt keine eigene Palette mehr, sondern bindet die kanonische Datei mit einem einzigen
@import ein. Dazu kommt ein deterministisches Kontrastgate fuer normalen Kleintext.

EYT-80 Inkrement 2. Basis: 3f98d76 (Merge von PR #95). EYT-80 bleibt „In Arbeit".

Was sich geaendert hat und warum

Datei Warum
packages/ui/src/basisdesign-v2.css neu — die kanonische Quelle. 13 genehmigte Rollen aus Confluence 8814623 §2.1 plus 2 repo-eigene, hell und dunkel. Werte bytegleich zu dem, was vorher in globals.css stand.
packages/ui/package.json Export-Unterpfad ./basisdesign-v2.css; sideEffects von false auf ["*.css"]; build kopiert die CSS-Datei nach dist (tsc tut das nicht).
packages/ui/test/helpers/kontrast.ts neu — WCAG-2.1-Kontrast, lokal gerechnet, keine neue Abhaengigkeit.
packages/ui/test/basisdesign-tokens.test.ts neu — liest die kanonische Datei und prueft Werte, Ableitungen und Kontrast.
apps/web/app/globals.css 30 --eyt-*-Deklarationen entfernt, @import als erste Anweisung. Alle 58 var(--eyt-…)-Verwendungen und jeder Selektor unveraendert.
apps/web/test/basisdesign-tokens.test.ts neu — Waechter: keine eigene Palette, Import vorhanden, Rollen weiterhin benutzt.
apps/web/e2e/shell-smoke.spec.ts drei Faelle: der gebaute Browser liefert die kanonischen Tokens auf /, /planung, /kosten.

Gewaehltes Eigentumsmodell — gemessen, nicht bevorzugt

A: kanonisches CSS in packages/ui. Vor der Umsetzung als Spike gemessen und wieder
zurueckgenommen:

  • Next 16 loest @import "@easytree/ui/basisdesign-v2.css" ueber die exports-Map auf und inlined
    es (@import im gebauten Chunk: 0).
  • Der OpenNext-/Cloudflare-Bau (Pflichtschritt in build-web) laeuft ebenfalls durch.
  • Ohne API antworten /, /planung, /kosten mit 200 und tragen dieselbe CSS-Datei.

Verworfen:

  • B: typisierte Tokendaten + Projektion nach apps/web. Die Literale blieben physisch in
    globals.css; „keine eigene Palette" waere dann eine Ueberwachung statt einer Struktur.
  • C: Lintregel gegen Farbliterale in packages/ui. Heute gegenstandslos — packages/ui enthaelt
    gemessen null Farbliterale, die Regel haette nichts zu fangen und das Paket besaesse weiter nichts.
  • D: CSS-in-JS oder PostCSS-Tokenschicht. Neue Abhaengigkeit und mehrstufige Pipeline, ohne Not.

Ausgefuehrte Gegenmutationen

Jede wurde eingespielt, gemessen und zurueckgenommen.

1. Drei Rollen verfaelscht (Task 2) — hell --eyt-text-secondary auf den von der Baseline
verworfenen Penpot-Ton #6d786f, dunkel --eyt-state-draft-text und --eyt-state-info-text auf
ihren Hellwert. Ergebnis: genau 7 rote Faelle, Verhaeltnisse 4.18 / 1.92 / 1.77 / 2.26 — exakt
die vorher gerechneten Zahlen.

Der Kern dabei: hell: --eyt-text-secondary auf --eyt-bg-surface blieb gruen bei 4.60:1, waehrend
derselbe Vordergrund auf --eyt-bg-canvas rot wurde. Das Gate misst also das gerenderte Paar und
verbietet nicht eine Zeichenkette.

2. Export-Unterpfad geloescht (Task 5) — Ergebnis: der Bau scheitert,
Module not found: Can't resolve '@easytree/ui/basisdesign-v2.css'. Das ist eine Zusage von
build-web, nicht von den drei Browserfaellen: die konnten gar nicht laufen, weil es keinen Bau
zu bedienen gab. Diese Formulierung ist Absicht und soll nicht staerker gelesen werden.

3. Ausgelieferte CSS-Datei geleert (Task 5, nachgereicht) — die Mutation, die die Browserfaelle
wirklich trifft: Export loest auf, Bau gruen, aber 0 Deklarationen im Chunk (58 Verwendungen
bleiben). Ergebnis: genau die drei neuen Faelle rot (--eyt-bg-canvas ist nicht deklariert,
Received: ""), die uebrigen 24 gruen.

Bemerkenswert: beide Dateiwaechter UND alle vier axe-Faelle blieben dabei gruen. Eine vollstaendig
ungestylte Anwendung besteht axe. Genau dafuer gibt es die drei Browserfaelle.

4. @import aus globals.css entfernt (Task 4) — der apps/web-Waechter wird rot, genau ein
Fall.

Ein Befund, den erst der Browser gezeigt hat

Der Produktions-Minifier kuerzt #ffffff zu #fff, und getComputedStyle normalisiert den Wert
einer Custom Property nicht
(bis zur Verwendung ist sie ein beliebiges Token). Ein
Zeichenkettenvergleich haette hier den Minifier geprueft, nicht die Farbe.

Betroffen sind nur die sechsstelligen Hexwerte, die sich auf drei kuerzen lassen —
--eyt-bg-surface und --eyt-action-primary-contrast; die uebrigen elf Rollen ueberleben bytegleich.

Der Browserfall vergleicht deshalb die Farbe: der rohe Wert wird einer Sonde als color
zugewiesen und von Chromium als rgb(…) zurueckgelesen. Das ist unabhaengig von Schreibweise und
Minifier. Ein zusaetzliches Flag prueft, dass der CSS-Parser den Wert ueberhaupt angenommen hat —
sonst haette eine fehlende Rolle die geerbte Farbe der Sonde gemessen und koennte zufaellig gruen sein.

Beide Dateiwaechter behaupten weiterhin #ffffff und sind gruen. Sie lesen die Quelle, der Browser
liest das Bauergebnis — dazwischen sitzt der Minifier.

Eine beabsichtigte sichtbare Aenderung

.eyt-table__caption benutzte var(--eyt-color-text-muted, #555). Dieses Token ist nirgends
deklariert, gerendert wurde also #555 — in beiden Modi. Jetzt var(--eyt-text-secondary), also
#5b564e hell und #b0aaa0 dunkel. Die Dunkelmodusseite ist damit auch eine
Barrierefreiheitsverbesserung, nicht nur ein Farbwechsel.

Sonst aendert sich keine gerenderte Farbe: die 30 verschobenen Werte sind bytegleich, und der
komplette Selektorbestand von globals.css ist vorher/nachher identisch.

Befunde, die dieser Slice bewusst NICHT behebt

  1. apps/web/app/layout.tsx setzt themeColor: "#166534" — ein Farbliteral in keiner Tokenrolle und
    ungleich action.primary (#1e5231).
  2. .eyt-table__caption traegt weiter var(--eyt-space-2, 0.5rem) — dasselbe Muster wie das gerade
    behobene #555, aber ein Abstandstoken und damit ausserhalb dieses Schnitts.
  3. --color-focus (#1d4ed8 / #7cc1db) bleibt anwendungseigen: §2.1 kennt keine Fokusfarbe.
  4. Die Schwaechen in apps/api/test/architecture/scan.ts sind unberuehrt (ausdruecklich ausserhalb).

Grenzen der Evidenz

  • Dunkelmodus ist im Browser nicht gemessen. Playwright laeuft unter colorScheme: light; die
    Dunkelwerte haengen an der Quelltextpruefung in packages/ui.
  • Das Kontrastgate ist auf 4 von 24 Faellen gegenmutiert, nicht auf allen. Die uebrigen sind
    Ausfuehrungsnachweis, kein Beweis.
  • Der Ableitungsfall (state.published.text folgt action.primary) hat keine Gegenmutation.
  • --eyt-action-primary-contrast und --eyt-state-published-text stehen nicht in der
    Browsertabelle
    — bewusst, sie haengen an den Dateiwaechtern.
  • axe color-contrast bleibt in apps/web/test/a11y.test.tsx abgeschaltet. jsdom hat keine
    Layoutmaschine; dieser Slice ersetzt die Luecke durch eine deterministische Rechnung, statt so zu
    tun, als koenne axe sie schliessen. Nicht als „Kontrast vollstaendig durch axe geprueft" lesen.
  • Nicht-Text-Kontrast (EYT-12, 3:1 Fokus) ist nicht abgesichert — heute gemessen 6.10:1 hell /
    9.13:1 dunkel, aber nichts haelt das fest.
  • sideEffects: ["*.css"] ist nicht isoliert als notwendig nachgewiesen. Der Spike lief damit;
    ob false auch gereicht haette, ist ungeprueft.

Akzeptanzkriterien

EYT-80 — „Tokens fuer Canvas, Surface, Text, Border, Primary, Published, Draft, Danger und Info
sind zentral versioniert": erfuellt durch packages/ui/src/basisdesign-v2.css als alleinige Quelle,
abgesichert gegen die Confluence-Tabelle.

EYT-80 — „Kontrasttests verhindern die verworfenen Penpot-Kombinationen #6D786F/#F0F4EF und
#A86B2B/#F6E9D8 fuer normalen Kleintext": erfuellt. Zusaetzlich reproduziert die Rechnung die in
der Baseline genannten Verhaeltnisse (4,14 und 3,66) — das ist die Gegenprobe fuer die Formel selbst.

EYT-12 — „Kontrasttests sichern die semantischen Hell-/Dunkel-Tokens aus EYT-80 ab": erfuellt fuer
die 24 aufgezaehlten Normaltextpaare in beiden Modi.

Nicht beruehrt (weiter offen an EYT-80): BottomNavigation, die Zustandsfamilie
Forbidden/Unauthenticated/Stale/Partial, die Mitarbeiter-Shell, visuelle Regressionen aus realen
Produktseiten.

Historienreparatur 27.08.2026

Der Branch wurde von 3f98d76 neu aufgebaut. Der Ausfuehrungsplan
docs/plans/2026-08-27-eyt-80-inkrement-2-basisdesign-tokens.md war abgeleitetes,
nichtkanonisches Arbeitsmaterial und ist weder im Endbaum noch in der Ahnenreihe dieses
Branches enthalten; ein spaeteres git rm haette ihn ueber die Historie erreichbar gelassen.

Die sieben Produkt- und Testdateien sind bytegleich zum zuvor gereviewten Stand 6df734c
(Blobvergleich je Datei: sieben gleich, null Abweichungen). Es wurde kein Produktcode geaendert.
Der Baumvergleich alt gegen neu zeigt genau eine Aenderung: die Loeschung des Plandokuments.

Neuer Kopf: 08fed37906db2d7b67ca2044b8d93290b4655208 · CI-Lauf: 33106872669 (11/11 gruen).

Der Abschnitt „Summary by Sourcery" stammt aus dem Lauf gegen den alten Kopf 6df734c und
beschreibt denselben Produktstand; sein Punkt „Documentation" ist entfallen, weil der Diff kein
Dokument mehr enthaelt. Diese PR-Beschreibung fuehrt kein automatisches Review als Nachweis.

Kein Deploy, kein Merge

BLOCKER_ENVIRONMENT_SEPARATION ist unberuehrt. Es wurde nichts deployt und nichts gemergt.
EYT-80 bleibt In Arbeit.

Summary by Sourcery

Zentralisiere die Basisdesign-v2-Farbrollen in packages/ui und sichere ihre Verwendung sowie Auslieferung mit deterministischen Kontrast- und Browserprüfungen ab.

New Features:

  • Zentralisiere die semantischen Basisdesign-v2-Farbrollen in packages/ui und stelle sie als importierbare CSS-Ressource bereit.
  • Führe ein deterministisches WCAG-Kontrastgate für normalen Kleintext in hellen und dunklen Tokenvarianten ein.
  • Prüfe im gebauten Browser, dass die kanonischen Tokens auf den zentralen Web-Routen ausgeliefert werden.

Bug Fixes:

  • Ersetze die unwirksame Tabellenbeschriftungs-Fallbackfarbe durch die semantische Sekundärtextrolle.

Enhancements:

  • Entferne die doppelte Farbpalette aus apps/web und binde stattdessen die kanonische UI-Tokenquelle ein.
  • Ergänze Quelltext- und Auslieferungswächter für Tokenbesitz, Rollenverwendung und korrekte CSS-Auslieferung.

Build:

  • Erweitere den UI-Paket-Export und den Build, damit die kanonische CSS-Datei in dist verfügbar ist.

Tests:

  • Ergänze UI-Tests für genehmigte Rollen, Ableitungen, Farbwerte und WCAG-Kontrastgrenzen.
  • Ergänze Web-Tests, die eine eigene Palette verhindern und die weitere Tokenverwendung absichern.
  • Erweitere die Browser-Smoke-Tests um die Prüfung der ausgelieferten Tokens auf /, /planung und /kosten.

Guard-Härtung (PO-Review, 27.08.2026)

Alter reviewter Head: 08fed37906db2d7b67ca2044b8d93290b4655208 · Neuer Head: 75e7840b57140946785a181de3be8b8df36d9d74. Produkt-CSS und Tokenwerte unverändert — packages/ui/src/basisdesign-v2.css und apps/web/app/globals.css sind byte-identisch zum alten Head; geändert sind ausschließlich die drei Wächterdateien.

Drei Falschgrün-Klassen, jede vor der Reparatur als grün reproduziert und danach per ausgeführter Gegenmutation als rot belegt (eingespielt → rot gemessen → revertiert):

  1. Teilung am ersten @media war strukturell unsicher (packages/ui/test/basisdesign-tokens.test.ts): ein später :root-Block NACH dem Dunkelblock überschreibt im echten Browser den Hellmodus, landete im Test aber im DUNKEL-Abschnitt — 46/46 grün. Jetzt zerlegt ein deterministischer Klammerzähler (kein CSS-Parser als Abhängigkeit) die Datei vollständig: genau ein heller :root-Block, dann genau ein @media (prefers-color-scheme: dark)-Block mit genau einem inneren :root, sonst nichts; Reihenfolge hell → dunkel mitbewacht. Gegenmutation A (später :root-Override von --eyt-action-primary-contrast) → rot: „3 Top-Level-Bloecke statt 2“.
  2. Deklarations-Regex war selektorblind: Dunkeltokens unter .dunkel statt :root blieben 46/46 grün; eine Streudeklaration unter fremdem Selektor wurde stumm Teil der Tokenkarte. HELL/DUNKEL entstehen jetzt nur aus den beiden korrekt aufgehängten :root-Körpern. Gegenmutationen B (.dunkel) → rot „der Medienblock traegt 1 innere Bloecke (.dunkel) statt genau einem :root“ (29 Tests rot); B2 (Streudeklaration unter .hinweis, gleicher Wert) → vorher stumm absorbiert, jetzt rot mit Blocknamen.
  3. Farbliteral-Gate sah nur Hex (apps/web/test/basisdesign-tokens.test.ts): rgb()/hsl()/oklch()/Farbnamen kamen durch. Drei Schichten ohne handgepflegte ~148er-Farbnamensliste: Hex exakt die zwei Fokusfarben; geschlossene Menge der CSS-Farbfunktionen verboten; jedes nackte Wort eines Deklarationswerts gegen den jsdom-CSS-Parser als Farbwort geprüft (Sonden-Selbsttest: tomato erkannt, solid nicht; var()-Fallbacks bleiben sichtbar). Gegenmutation C (rgb(109, 120, 111)/rgb(240, 244, 239) — die verworfene Penpot-Kombination #6D786F/#F0F4EF) → rot mit beiden Werten; Zusatzmutation Farbname tomato → rot.

Zusätzlich misst shell-smoke jetzt auch --eyt-action-primary-contrast und --eyt-state-published-text im gebauten Chromium (15 statt 13 Rollen auf /, /planung, /kosten).

Exakt-Head-CI auf 75e7840: siehe Checks dieses PR (alle elf Pflicht-Jobs).

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @DYAI2025, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 1 day and 10 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Reviewer's Guide

Die PR zentralisiert die Basisdesign-v2-Farbrollen in packages/ui, bindet sie in apps/web über einen gebauten CSS-Export ein und ergänzt deterministische Quelltext-, Kontrast- und Browserprüfungen für die Auslieferung und WCAG-Normaltextkontraste.

Sequence diagram for built token verification

sequenceDiagram
    participant Build as WebBuild
    participant CSS as CanonicalCSS
    participant Page as ProductPage
    participant Browser as Chromium
    participant Test as ShellSmoke

    Build->>CSS: copy basisdesign-v2.css to dist
    Build->>Page: bundle globals.css and resolve CSS export
    Page->>Browser: serve /, /planung, or /kosten
    Browser->>Browser: read custom properties and assign probe color
    Browser-->>Test: return parsed and computed RGB values
    Test->>Test: compare canonical token colors
Loading

Flow diagram for deterministic contrast gating

flowchart TD
    CSS[Read canonical token CSS]
    PARSE[Parse light and dark declarations]
    PAIRS[Evaluate enumerated normal-text pairs]
    WCAG[Compute WCAG relative luminance and ratio]
    GATE{Ratio >= 4.5:1?}
    PASS[Tests pass]
    FAIL[Tests fail]

    CSS --> PARSE --> PAIRS --> WCAG --> GATE
    GATE -->|yes| PASS
    GATE -->|no| FAIL
Loading

File-Level Changes

Change Details Files
Die semantischen Basisdesign-v2-Farbrollen werden als kanonische CSS-Datei in packages/ui zentralisiert und für den Web-Build exportiert.
  • Neue helle und dunkle Tokenrollen einschließlich der repo-eigenen Ableitungen angelegt.
  • CSS-Export-Unterpfad und explizites Kopieren der CSS-Datei nach dist ergänzt.
  • CSS-Nebenwirkungen für Bundler und Tree-Shaking korrekt deklariert.
packages/ui/src/basisdesign-v2.css
packages/ui/package.json
Ein deterministisches WCAG-2.1-Kontrastgate validiert die Tokenwerte und die aufgeführten Normaltext-Paare.
  • Lokale Berechnung von Farbkanälen, relativer Leuchtdichte und Kontrastverhältnis ohne neue Abhängigkeit eingeführt.
  • Genehmigte Rollen, helle/dunkle Werte, Ableitungen und 4,5:1-Kontrastgrenze getestet.
  • Die beiden verworfenen Penpot-Kombinationen einschließlich ihrer erwarteten Verhältnisse als Formelkontrolle abgesichert.
packages/ui/test/helpers/kontrast.ts
packages/ui/test/basisdesign-tokens.test.ts
apps/web konsumiert die zentrale Tokenquelle statt eine eigene semantische Farbpalette zu deklarieren.
  • @import der UI-CSS-Datei als erste Anweisung ergänzt und 30 lokale Token-Deklarationen entfernt.
  • Bestehende Tokenverwendungen, Aliasse und Selektoren beibehalten; die un deklarierte Caption-Farbe auf --eyt-text-secondary umgestellt.
  • Dateiwächter verhindern eigene Rollen, fehlenden Import und den Verlust bestehender Tokenverwendungen beziehungsweise Farbliterale.
apps/web/app/globals.css
apps/web/test/basisdesign-tokens.test.ts
Der gebaute Web-Auftritt wird im Chromium auf mehreren realen Routen gegen die kanonischen Tokenfarben geprüft.
  • Tokenwerte auf /, /planung und /kosten aus getComputedStyle gelesen.
  • Farbwerte über eine CSS-Farbsonde statt über rohe Hex-Schreibweise verglichen, um Minifier-Normalisierung zu tolerieren.
  • Parser-Akzeptanz und tatsächliche Deklaration separat geprüft.
apps/web/e2e/shell-smoke.spec.ts
Die Umsetzungsentscheidung und Ausführungsnachweise werden als detaillierter Plan dokumentiert.
  • Gemessene CSS-Import-/Build-Eigenschaften und verworfene Architekturvarianten festgehalten.
  • Durchgeführte Gegenmutationen, Grenzen der Evidenz und bewusst nicht behobene Befunde dokumentiert.
  • Kein Deploy, Merge oder Abschluss von EYT-80 vorgenommen.
docs/plans/2026-08-27-eyt-80-inkrement-2-basisdesign-tokens.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@DYAI2025
DYAI2025 force-pushed the feat/eyt-80-basisdesign-tokens branch from 6df734c to 08fed37 Compare August 27, 2026 19:07
sourcery-ai[bot]
sourcery-ai Bot previously approved these changes Aug 27, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sourcery assessment

Approved.

…lossen

PO-Review PR #96 wies drei Umgehungswege in den NEUEN Waechtern nach; alle
drei sind vor der Reparatur als gruen reproduziert und danach als rot belegt:

1. packages/ui: Die Teilung am ersten @media war strukturell unsicher — ein
   spaeter :root-Block NACH dem Dunkelblock ueberschreibt im echten Browser
   den Hellmodus, landete im Test aber im DUNKEL-Abschnitt und blieb gruen.
   Jetzt zerlegt ein deterministischer Klammerzaehler die Datei vollstaendig:
   genau ein heller :root-Block, genau ein @media (prefers-color-scheme:
   dark)-Block mit genau einem inneren :root, sonst nichts; jede Abweichung
   (Zusatzblock, fremder Selektor, Nesting, Doppeldeklaration, Resttext)
   steht namentlich in STRUKTURFEHLER.

2. packages/ui: Die Deklarations-Regex war selektorblind — Dunkeltokens
   unter .dunkel statt :root blieben gruen, eine Streudeklaration unter
   fremdem Selektor wurde stumm Teil der Tokenkarte. HELL/DUNKEL entstehen
   jetzt NUR aus den beiden korrekt aufgehaengten :root-Koerpern.

3. apps/web: Das Farbliteral-Gate sah nur Hex — rgb()/hsl()/oklch()/
   Farbnamen kamen durch. Drei Schichten ohne handgepflegte Farbnamensliste:
   Hex exakt die zwei Fokusfarben, die geschlossene Menge der CSS-
   Farbfunktionen verboten, und jedes nackte Wort eines Deklarationswerts
   gegen den jsdom-CSS-Parser als Farbwort geprueft (mit Selbsttest der
   Sonde: tomato rot, solid nicht).

Zusaetzlich liefert shell-smoke jetzt auch --eyt-action-primary-contrast
und --eyt-state-published-text im gebauten Chromium nach.

Produkt-CSS unveraendert: packages/ui/src/basisdesign-v2.css und
apps/web/app/globals.css sind byte-identisch zu 08fed37.

Gegenmutationen ausgefuehrt (je: eingespielt, rot gemessen, revertiert):
A spaeter :root-Override nach dem Dunkelblock; B Dunkeltokens unter
.dunkel sowie Streudeklaration unter .hinweis; C rgb()-Fassung der
verworfenen Penpot-Kombination #6D786F/#F0F4EF sowie Farbname tomato.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sourcery assessment

Approved.

@DYAI2025
DYAI2025 merged commit 5a40026 into master Aug 28, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants