docs(15): record owner-approved typography exception, add icon-only aria-labels
Tessera CI/CD / Lint & Type Check (push) Successful in 44s
Tessera CI/CD / Tests (push) Successful in 49s
Tessera CI/CD / Build & Publish Images (push) Successful in 6s

This commit is contained in:
2026-08-04 13:54:44 +02:00
parent 2f354cd59c
commit 37ab7c537d
@@ -58,7 +58,14 @@ Declared values (must be multiples of 4), identisch mit dem bereits im Projekt e
| Section Heading | 18px (`text-lg`) | 600 semibold | 1.3 | | Section Heading | 18px (`text-lg`) | 600 semibold | 1.3 |
| Page Heading | 24px (`text-2xl`) | 700 bold | 1.2 | | Page Heading | 24px (`text-2xl`) | 700 bold | 1.2 |
**Exception (dokumentierte Abweichung vom UI-SPEC-Standardvokabular "2 Gewichte max"):** Formular-Labels, Tabellen-Kopfzeilen und Buttons nutzen zusätzlich `font-medium` (500) auf 14px-Basis — z. B. `<label className="text-sm font-medium text-foreground">`. Das ist kein fünftes Gewicht, sondern dieselbe 500er-Stufe wie bei Labels/Badges, nur auf 14px statt 12px angewendet. Diese vier Größe-Gewicht-Paare sind das etablierte Tessera-Admin-Vokabular seit Phase 2 — der Planner/Executor übernimmt sie unverändert, erfindet keine neue Kombination. **OWNER-APPROVED EXCEPTION — genehmigt am 2026-08-04 vom Projekt-Owner.**
Die vier Gewichte 400 (Body) / 500 (Label, Badge) / 600 (Section Heading) / 700 (Page Heading) überschreiten das UI-SPEC-Standardlimit von 2 Gewichten. Diese Überschreitung ist **explizit vom Projekt-Owner genehmigt**, nicht nur durch Prosa-Argumentation begründet:
- **Scope der Ausnahme:** genau diese vier Werte — 400/500/600/700 — sind vorbestehendes Projektvokabular, etabliert in Phase 2 und seither auf allen ausgelieferten Oberflächen (5 Admin-Seiten, Marketplace, Dashboard, alle Modul-Shells) im Einsatz. Phase 15 führt kein fünftes Gewicht ein.
- **Begründung:** Phase 15 konsumiert ausschließlich die bestehende Skala, ohne sie zu erweitern. Eine Konsolidierung auf 2 Gewichte würde jede bereits ausgelieferte Seite umgestalten — projektweite Bestandsaufnahme zählt **192 `font-medium`-, 56 `font-semibold`- und 19 `font-bold`-Vorkommen über 70 Dateien in `apps/web/src`**. Das ist ein Portal-weites Redesign und liegt außerhalb des Scopes einer Berechtigungs-Phase.
- **Keine Performance-Kosten:** `apps/web/src/app/globals.css:33` deklariert `--font-sans: "Inter", system-ui, …` ohne `next/font` und ohne `@font-face` — es werden keine Font-Dateien nachgeladen, die Gewichtsanzahl verursacht keine Ladekosten.
- **Bindende Einschränkung für Phase 15:** die neuen Oberflächen dieser Phase dürfen **kein** Gewicht jenseits dieser vier einführen. Formular-Labels, Tabellen-Kopfzeilen und Buttons nutzen `font-medium` (500) auf 14px-Basis (z. B. `<label className="text-sm font-medium text-foreground">`) — dieselbe 500er-Stufe wie bei Labels/Badges, nur auf 14px statt 12px angewendet, kein neuer Wert. Planner/Executor übernehmen ausschließlich die vier genehmigten Größe-Gewicht-Paare, erfinden keine neue Kombination.
--- ---
@@ -109,6 +116,9 @@ Accent reserved for: Primär-Buttons (Gruppe erstellen, Speichern, Sofort freige
| AD-Bindung — Bindungs-Auswahl-Hinweis | "Wähle eine AD-Gruppe aus der Liste, um die Mitgliedschaft automatisch zu synchronisieren." (`admin.groups.ldapBind.hint`) | | AD-Bindung — Bindungs-Auswahl-Hinweis | "Wähle eine AD-Gruppe aus der Liste, um die Mitgliedschaft automatisch zu synchronisieren." (`admin.groups.ldapBind.hint`) |
| AD-Bindung — bereits gebunden | "Gebunden an: {ldapDn}" mit "Bindung entfernen"-Link (`admin.groups.ldapBind.bound` / `.unbind`) | | AD-Bindung — bereits gebunden | "Gebunden an: {ldapDn}" mit "Bindung entfernen"-Link (`admin.groups.ldapBind.bound` / `.unbind`) |
| Standardgruppen-Markierung | Icon-Button-Tooltip/`aria-label`: "Als Standardgruppe festlegen" bzw. "Standardgruppe" (wenn bereits gesetzt) — `admin.groups.setDefault` / `admin.groups.isDefault` | | Standardgruppen-Markierung | Icon-Button-Tooltip/`aria-label`: "Als Standardgruppe festlegen" bzw. "Standardgruppe" (wenn bereits gesetzt) — `admin.groups.setDefault` / `admin.groups.isDefault` |
| Mitglied entfernen (Icon-only, Mitglieder-Modal) | Icon-Button-Tooltip/`aria-label`: "Mitglied entfernen" — `admin.groups.members.remove`. Gilt nur für `MANUAL`-Mitgliedschaften (Button ist deaktiviert bei `LDAP`-Herkunft, siehe Surface Contract 1); der deaktivierte Zustand trägt zusätzlich `aria-label`/Tooltip "Wird über AD-Sync verwaltet" — `admin.groups.members.ldapManaged` |
| Matrix-Häkchen ohne sichtbaren Text (Permission-Matrix) | `aria-label` pro Checkbox, dynamisch zusammengesetzt: "{Modulname} für Gruppe {Gruppenname} freigeben" bzw. "… entziehen" je nach Zustand — `admin.groups.grants.matrixCheckboxLabel` (Modul- und Gruppenname als next-intl-Interpolationsparameter, da die Zelle selbst keinen sichtbaren Text trägt — nur Zeilen-/Spaltenkopf) |
| User-Detail "Direkt"-Checkbox (User-Detail-Modul-Zugriff) | `aria-label` pro Checkbox: "{Modulname} direkt für {Benutzername} freigeben" bzw. "… entziehen" — `admin.users.grants.directCheckboxLabel` (gleiches Muster wie Matrix-Checkbox, da auch hier kein sichtbarer Zellentext existiert) |
--- ---