Badge SDC — 5 SOLCOM-Varianten
byte_theme:badge-SDC-Komponente bekommt exakt 5 neue Figma-konforme Varianten (lime, dark, disabled, lined, matching). Die veralteten Werte primary, secondary und pill werden aus dem Schema entfernt und via Twig-Fallback auf lime abgebildet. Die matching-Variante erhält zwei neue Props (abbreviation, percentage). Keine DB-Migration, kein Update-Hook.
Problem Statement
Die byte_theme:badge-Komponente existiert mit drei Varianten (primary, secondary, pill), die keine Entsprechung im SOLCOM Figma Design System haben. Redakteure und Site-Builder können im Canvas-Editor keine Badges einfügen, die dem Corporate Design entsprechen — die verfügbaren Stile sind entweder Tailwind-Defaults (primary, secondary) oder eine nicht-dokumentierte Kapselvariante (pill). Das Figma-Design-System definiert fünf konkrete Badge-Varianten mit exakten Tokenwerten, Radien und Padding-Regeln, die bisher nicht im Code abgebildet sind. Solange diese Lücke besteht, ist der Badge-SDC-Eintrag in docs/design/MAPPING.html als partial markiert.
Solution
Das style-Prop in badge.component.yml wird auf exakt 5 Figma-autoritative Werte eingeschränkt: lime, dark, disabled, lined, matching. Das CVA-Objekt in badge.twig erhält für jeden der fünf Werte ein dediziertes Klassen-Array mit var(--brand-*)-Tokens statt Hex-Literalen. Legacy-Werte werden im Twig via |default('lime')-Fallback abgefangen — keine bestehenden Canvas-Blöcke brechen. Die matching-Variante bekommt zwei neue optionale Props (abbreviation und percentage), die ihre spezifische Substruktur (Lime-Kreis + Kürzel + Prozentwert) steuern. Abschließend wird der Badge-Eintrag in docs/design/MAPPING.html auf Status matched gesetzt.
User Stories
- Als Site-Builder möchte ich im Canvas-Editor eine Badge-Komponente mit dem Stil
lime(weißer Hintergrund, Dark-Blue-Text, 10px-Radius) auswählen können, damit Badges auf dunklen Sektionshintergründen des SOLCOM Corporate Designs korrekt erscheinen. - Als Site-Builder möchte ich im Canvas-Editor eine Badge-Komponente mit dem Stil
dark(Lime-Hintergrund, Dark-Blue-Text, 10px-Radius) auswählen können, damit Badges auf hellen oder neutralen Hintergründen die SOLCOM-Brand-Farbe tragen. - Als Site-Builder möchte ich im Canvas-Editor eine Badge-Komponente mit dem Stil
disabled(Grau-Hintergrund, Hellgrau-Text, 10px-Radius) auswählen können, damit inaktive oder nicht verfügbare Zustände visuell korrekt dargestellt werden. - Als Site-Builder möchte ich im Canvas-Editor eine Badge-Komponente mit dem Stil
lined(transparenter Hintergrund, Lime-Border, weißer Text, 20px-Radius) auswählen können, damit Pill-förmige Outline-Badges auf dunklen Hintergründen verfügbar sind. - Als Site-Builder möchte ich im Canvas-Editor eine Badge-Komponente mit dem Stil
matchingauswählen können und dabei ein Kürzel sowie einen Prozentwert eingeben können, damit „Matching"-Anzeigen (z. B. Bewerber-Passung) mit Lime-Kreis, Kürzel-Text und Prozent-Wert korrekt dargestellt werden. - Als Site-Builder möchte ich, dass bestehende Canvas-Blöcke, die noch den alten Stil
pillodersecondarytragen, weiterhin gerendert werden, damit keine existierenden Seiten visuell brechen, wenn die neuen Stile eingeführt werden. - Als Entwickler möchte ich, dass alle Badge-Farben ausschließlich über
var(--brand-*)-Tokens austheme.brand.cssgesetzt werden, damit zukünftige Branding-Anpassungen ausschließlich an der Token-Quelle vorgenommen werden müssen. - Als Figma-Designer möchte ich, dass der Badge-Eintrag im
MAPPING.htmlden Statusmatchedträgt, damit ich den Parität-Status des Design Systems auf einen Blick ablesen kann. - Als Entwickler möchte ich, dass die Textgröße in allen Badge-Varianten 15px beträgt (statt des bisherigen
text-sm= 14px), damit das Rendering mit der Figma-Spec übereinstimmt. - Als Site-Builder möchte ich, dass der Canvas-Editor automatisch die aktualisierten Style-Optionen (lime, dark, disabled, lined, matching) im Dropdown anzeigt, sobald das Schema geändert ist, ohne manuellen Config-Import oder Update-Hook.
Implementation Decisions
Schema-Änderungen (badge.component.yml)
- Der
style-Enum wird auf exakt 5 Werte eingeschränkt:lime,dark,disabled,lined,matching. Die Werteprimary,secondaryundpillwerden aus dem Enum entfernt. - Zwei neue optionale Props werden hinzugefügt:
abbreviation(type: string | null) undpercentage(type: string | null). Beide haben nur visuellen Effekt beistyle=matching. - Die bestehenden Props
iconundicon_firstbleiben im Schema erhalten (Backward-Compat für Canvas-Blöcke, die diese Props gesetzt haben), werden aber in den 5 neuen Varianten-Implementierungen nicht gerendert. - Der
label-Prop bleibt unverändert optional (type: string | null). Beistyle=matchingwird er nicht gerendert — stattdessen steuernabbreviationundpercentageden Inhalt.
Twig-Implementierung (badge.twig)
- Deprecation-Strategie — Twig-Fallback (Option C): Alle Legacy-Werte (
pill,primary,secondary, unbekannte Strings) werden viastyle|default('lime')auflimeabgebildet. Kein Update-Hook, kein DB-Migration-Script. Bestehende Canvas-Blöcke rendern unverändert alslime. - Das CVA-Objekt erhält 5 neue
style-Varianten. Alle Farben werden ausschließlich übervar(--brand-*)-Tokens gesetzt — keine Hex-Literale in Tailwind-Klassen. - Figma-konforme Klassen je Variante:
lime:bg-white text-[var(--brand-dark-blue)] rounded-[10px] px-[4px]dark:bg-[var(--brand-lime)] text-[var(--brand-dark-blue)] rounded-[10px] px-[4px]disabled:bg-[var(--brand-gray)] text-[var(--brand-light-gray)] rounded-[10px] px-[4px]lined:bg-transparent border border-[var(--brand-lime)] text-white rounded-[20px] px-[8px] py-[4px]matching:bg-transparent border border-[var(--brand-lime)] text-white rounded-[20px] px-[8px] py-[4px]
- Textgröße: Bisheriges
text-sm(14px) wird auftext-[15px]korrigiert — Figma-Spec bestätigt 15px. - Matching-Substruktur: Bei
style=matchingrendert das Twig drei feste Elemente: einen 8×8px Lime-Kreis (w-2 h-2 rounded-full bg-[var(--brand-lime)], dekorativ), denabbreviation-Text (font-sans font-medium text-[15px] text-white) und denpercentage-Text (font-sans font-bold text-[19px] text-[var(--brand-lime)]). Gap:gap-[4px]. - Icon-Rendering entfällt in allen 5 neuen Varianten — die Figma-Spec zeigt in keiner Variante ein Icon-Element.
Canvas-Integration
- Die Canvas-Config
canvas.component.sdc.byte_theme.badge.ymlverwendetallowed_values_function: canvas_load_allowed_values_for_component_propfür denstyle-Prop. Diese Funktion liest die Werte direkt aus dem SDC-Schema — nach dem Schema-Update spiegelt der Canvas-Editor automatisch die 5 neuen Werte ohne Config-Deploy. - Der
default_valuefürstylein der Canvas-Config bleibt beiprimary— dieser wird beim Rendern durch den Twig-Fallback auflimegemappt, bis ein Redakteur bewusst einen neuen Wert wählt. - Keine neuen Canvas-Config-Versionen werden angelegt — die bestehenden Versionen bleiben unverändert, da der Twig-Fallback Rückwärtskompatibilität sichert.
Figma-Korrekturen gegenüber Jira-Ticket
Das Jira-Ticket P2503-157 enthält drei Ungenauigkeiten, die durch direkte Figma-Analyse korrigiert wurden:
- Radius lime/dark/disabled: Ticket nennt
rounded-full, Figma-Spec bestätigtrounded-[10px]. - Lined-Borderfarbe: Ticket schweigt, Figma bestätigt
border-[var(--brand-lime)](nicht weiß). - Token-Namen: Ticket nennt
--color-lime,--color-dark-blue— korrekte Namen intheme.brand.csssind--brand-lime,--brand-dark-blue.
Testing Decisions
Was macht einen guten Test aus
Tests prüfen das externe Verhalten (gerenderte Klassen, HTML-Struktur) — nicht die interne CVA-Implementierung. Ein Test gibt keinen Aufschluss darüber, wie eine Klasse berechnet wird, sondern ob das finale Markup die erwarteten Token-Klassen trägt und die Substruktur der matching-Variante korrekt ist.
Zu testende Module
badge.twig— Kernel-Render-Test (PHPUnit, Gruppebadge): Sofern ein Kernel-Test für das Badge-SDC existiert, wird er um die 5 neuen Varianten erweitert. Geprüft wird: (a) jede Variante rendert die erwarteten Tailwind-Klassen, (b) der Twig-Fallback fürpill/primary/secondaryproduziertlime-Klassen, (c) beistyle=matchingsind Lime-Kreis,abbreviation- undpercentage-Textelemente im Markup vorhanden.- Manueller Browser-Smoketest: Da Tailwind-Klassen erst nach
npm run buildim CSS landen, ist für die visuellen Token-Werte (var(--brand-lime)etc.) ein manueller Browser-Check via DDEV nötig. Der QA-Plan im Story-Hub (docs/stories/P2503-157-badge-sdc-solcom-varianten.html#qa-plan) listet 9 click-genaue Schritte.
Prior Art
Vergleichbare Kernel-Render-Tests für SDC-Komponenten im Projekt: web/themes/custom/byte_theme/components/button/ und web/themes/custom/byte_theme/components/card/ — dort Twig-Render-Tests über ddev exec ./vendor/bin/phpunit --group <sdc>.
Out of Scope
- Hover- und Focus-States für die 5 neuen Varianten — Figma zeigt keine Hover-Varianten für Badge-Elemente.
- Link-Verhalten (
url-Prop) in Kombination mit den neuen Varianten — der Prop bleibt erhalten, aber keine neue Figma-Spec dafür. - Icon-Support in den neuen Varianten — kein Figma-Äquivalent vorhanden.
- DB-Migration oder Update-Hook für bestehende Canvas-Blöcke — der Twig-Fallback übernimmt das.
- Responsive-Breakpoint-Unterschiede für Badge-Größen — Figma spezifiziert keine Breakpoint-Varianten.
- Barrierefreiheits-Anpassungen (
aria-label, Kontrastprüfung) — sind für ein separates A11y-Ticket vorgesehen.
Further Notes
- Die
matching-Variante ist inhaltlich für Bewerber-Passungs-Badges konzipiert (Figma-Node61121:32532). Zukünftige Entity-Bindings solltenabbreviationan ein Kurztext-Feld undpercentagean ein Integer-Feld binden. - Nach dem Build (
npm run build) muss überprüft werden, dass Tailwind die neuen arbiträren Klassen (text-[15px],text-[19px],rounded-[10px],rounded-[20px],gap-[4px],px-[4px],px-[8px],py-[4px]) inbuild/main.min.cssaufnimmt — sofern diese nicht durch andere Komponenten bereits referenziert sind. - Story-Hub mit vollständigem QA-Plan: docs/stories/P2503-157-badge-sdc-solcom-varianten.html
- Design-Mapping-Eintrag (Node
61121:32532) ist nach der Implementierung aufmatchedzu setzen.