Architecture Decision Record · 0004

SOLCOM Button-System: vier dedizierte SDC-Komponenten + geteiltes Pillen-CSS

TL;DR — Statt einer Mega-Komponente mit Variants: vier eigenständige SDC-Komponenten (button, button-link, button-anchor, button-badge) plus ein gemeinsames Pillen-CSS-Layer. Shadcn-Variants werden ersatzlos entfernt.

Kontext

Das Figma-Design-System der SOLCOM-Site (figma.com/design/CHHDfbpX8Ys2LBiGs5HVK0, Node 766:15037 „Buttons") definiert fünf Button-Typen × vier States: Primary (Lime-Pille mit Brand-Pfeil), Link (nackter Text-Link mit Brand-Pfeil), Link with Icon (wie Link, aber mit funktionalem Icon wie Bell), Anchor (Lime-Pille mit Chevron-down) und Badge (Lime-Pille mit Notification-Counter). Die States sind Default / Hover / Focus / Disabled. Schrift ist ScalaSansLF-Bold 19 px, Pillen-Geometrie h-48, px-[18px], rounded-[30px].

Der bestehende components/button/button.twig (aus dem Byte-Theme-Fork, siehe ADR-0001) bietet vier shadcn-Variants (primary | secondary | primary-inverted | secondary-inverted) und drei Sizes — keine davon entspricht dem SOLCOM-Brand. ADR-0003 hat das Brand-Color-Mapping etabliert, aber explizit festgehalten, dass die SOLCOM-spezifischen Button-States nicht implementiert sind. Existierende Components components/anchor/ (Drupal-In-Page-Anker mit <span id>) und components/badge/ (Standalone-Label mit optionaler URL) tragen Namen, die im Figma anders belegt sind — sie machen konzeptionell etwas anderes.

Entscheidung

B-pur': vier dedizierte SDC-Komponenten plus geteiltes Pillen-CSS-Layer. Konkret:

Die Pille funktioniert ausschließlich auf Dark-Background. Lime auf Weiß ≈ 1.28:1 Kontrast — WCAG 2.1 AA-Fail. Light-Context-Pille ist eigenes Folge-PR mit Designteam-Input.

Rejected alternatives

B-hybrid: alle fünf Typen als Variants in button.twig rejected

Spart Files, erzwingt aber Conditional Schema-Props (count nur sinnvoll wenn trailing=counter). Site-Builder hätten zwei oder drei Achsen statt einer Entscheidung. Mapping zu Figma-Library bricht.

B-pur ohne geteiltes CSS-Layer rejected

Vier SDC-Komponenten, jedes mit dupliziertem State-CSS. DRY-Verlust groß genug, um Refactor in 6 Monaten teuer zu machen.

Additiv: solcom als fünfte Variant neben shadcn-Variants rejected

Führt phantom Variants im Schema, die in Figma keinen Pendant haben. Site-Builder mit ~80 % Wahrscheinlichkeit fallen auf nicht-Brand-konforme Defaults oder können zwischen vier visuell unkommunizierten Werten nicht sicher wählen.

Multi-Size (small | medium | large) rejected

Figma zeigt nur eine Pillen-Größe; null von drei produktiven Aufrufern nutzt heute small oder large. Variant-für-niemanden-Anti-Pattern.

Phosphor-Pfeil statt Custom-Brand-Pfeil rejected

Visueller Drift zur SOLCOM-Visual-Identity. Der Brand-Pfeil ist erkennbar anders als ein generic Pfeil und Teil der Brand-Sprache.

button-anchor als Dropdown-Trigger mit ARIA-Disclosure-Logik rejected

Figma zeigt keinen Open-State (kein Chevron-up als Pendant), und die Dropdown-Mechanik wäre eine eigene Component-Klasse (disclosure/), nicht eine Button-Variante.

Pricing-Card aus dieser PR rausziehen rejected

Hätte den Card-BG-Konflikt verschoben, aber: der bestehende card-pricing.twig:2 referenziert weiter variant: 'primary-inverted', das nach Replace nicht mehr existiert — sofortiger Render-Fehler. Migration ist nicht trennbar.

Tone-Variante einführen (tone: 'on-light') rejected

Bricht die Fix-Size-Linie und B-pur-Reinheit, ist effektiv ein Step zurück zu Variants. Sinnvoller, das Light-Context-Problem als eigene Brand-Definition vom Designteam einzuholen.

Consequences

FAQ

Warum nicht eine Komponente mit allen Typen als Variants?
Conditional Schema-Props (z. B. count nur bei Badge sinnvoll) erzeugen ein unklares Interface. Figma-Typen sind konzeptionell getrennte Elemente — vier Komponenten spiegeln das sauber wider.
Was ist mit Light-Background-Buttons?
Out of scope. Lime auf Weiß scheitert WCAG 2.1 AA (~1.28:1). Eigenes Folge-PR nach Designteam-Input für tone: 'on-light' oder eine separate Light-Pille.