Architecture Decision Record · 0003

SOLCOM-Brandfarben als Hybrid-Layer im Theme verankern

TL;DR — Brand-Tokens als Quelle der Wahrheit (theme.brand.css), shadcn-Semantik als Schnittstelle — sodass Components bg-primary schreiben können, ohne Brand-Hex-Werte zu kennen.

Kontext

Die SOLCOM-Brand-Palette aus dem Figma Design System (figma.com/design/CHHDfbpX8Ys2LBiGs5HVK0, Node 657:12324 „Colors") muss im byte_theme (Fork von drupal/byte_theme, siehe ADR-0001) hinterlegt werden. Die Palette unterscheidet drei Gruppen: Brand Colors (Lime #BEDC00, Background Blue #011C53, Dark Blue #001F46, zwei Gradients), Gray (Dark Gray #828282 plus Opazitäten 70/40/15 %, Light Gray #EBEBEB) und Basic Colors (Black, White, Error #F59678, Disabled Blue #28468C). Das bestehende Theme nutzt das shadcn/ui-Vokabular (--primary, --accent, --destructive, …) in oklch()-Notation. Eine 1:1-Übernahme der Brand-Hex-Werte in die shadcn-Slots wäre intransparent (welcher Slot bekommt Lime?), eine reine Brand-Layer ohne Mapping würde das shadcn-konforme Component-Inventar (button.twig referenziert bg-primary, bg-accent, ring-ring, …) brechen.

Entscheidung

Hybrid: Brand-Tokens als Quelle der Wahrheit, shadcn-Semantik als Schnittstelle. Eine neue Datei src/theme.brand.css definiert alle Marken-Variablen (--brand-lime, --brand-dark-blue, --brand-bg-blue, --brand-gray, --brand-gray-15/40/70, --brand-light-gray, --brand-error, --brand-disabled-blue, --brand-black, --brand-white, --brand-gradient-1/2). Sie wird in byte_theme.libraries.yml vor src/theme.css als raw CSS geladen. src/theme.css definiert die shadcn-Tokens ausschließlich als Aliasse (--primary: var(--brand-lime), --background: var(--brand-bg-blue), …) und ersetzt damit die bisherigen oklch()-Literale. Zusätzlich wird --ring: var(--brand-lime) neu eingeführt und --color-ring plus --color-brand-*-Aliasse in src/main.css (@theme inline) ergänzt, damit Tailwind-Utilities (ring-ring, bg-brand-lime, …) auflösen.

Semantisches Mapping

Das Mapping wurde aus realen Layouts in Figma abgeleitet (Job-Listing Node 1160:20009, Buttons Node 766:15037):

Brand-Update-Workflow: Hex-Werte nur in theme.brand.css ändern — shadcn-Mapping und Component-Klassen bleiben unberührt.

Rejected alternatives

Direkt-Replacement der shadcn-Tokens mit Brand-Hex-Werten (--primary: #BEDC00) rejected

Kürzer, aber Brand-Updates erfordern Suche/Ersetzung an mehreren Stellen; kein klares Vokabular für Designer:innen, die eine spezifische Brand-Farbe referenzieren wollen, ohne über die semantische Bedeutung nachzudenken.

Reine Brand-Layer ohne shadcn-Mapping rejected

Hätte alle Components zwingen, bg-[var(--brand-lime)] o. ä. zu schreiben statt bg-primary. Bricht den bestehenden Component-Stil und verliert die shadcn-Compatibility.

Alles in einer Datei (theme.css) mit Section-Headern rejected

Lesbar, aber vermischt zwei Lebenszyklen (Brand-Refresh vs. Component-Mapping-Refactor) in derselben Datei. Bei separaten Dateien sieht man im PR-Diff direkt, ob das Brand-Layer geändert wurde oder „nur" das Mapping.

--accent auf Lime mappen rejected

shadcn-typische Wahl (Accent = Brand-Highlight), bricht aber button.twig — der Sekundärbutton würde optisch mit dem Primärbutton verschmelzen, weil er bg-accent zieht.

Opazitäts-Grays als Tailwind-Modifier (bg-brand-gray/15) statt eigene Tokens rejected

Tailwind-idiomatisch und kürzer, aber die Figma-Palette nennt vier explizite Tokens. 1:1-Tokens machen Code-Suche deterministisch.

Adobe Color, Open Color o. Ä. als Brand-Layer-Generator rejected

Nicht erwogen, weil Figma die Quelle der Wahrheit ist und eigenständige Hex-Pflege ausreicht.

Consequences