diff --git a/CLAUDE.md b/CLAUDE.md index d409d74..b8e8611 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -138,10 +138,51 @@ Sichtbare FAQ + FAQPage-Schema aus derselben `data/*.json`-Quelle, damit Inhalt - Headings: Coolvetica, uppercase, line-height ~0.85. Body: Abel. Beide self-hosted als woff2. - **Coolvetica nie kleiner als `--fs-650` (28px)** — der schmale Condensed-Schnitt wird in Uppercase darunter unleserlich (mehrfach bestätigt: Footer-Headings, Timeline-Nav). Für kleinere Auszeichnungen - Abel verwenden, ggf. mit `letter-spacing` + uppercase. + Abel verwenden, ggf. mit `letter-spacing` + uppercase. `base.css` setzt das durch: `h1`–`h3` tragen + Coolvetica, **`h4`–`h6` laufen über `--ff-body` + uppercase + `--ls-caps`**. - Rot nie für Fließtext auf dunklem Grund (Kontrast!) — nur als Button-/Akzent-Fläche mit weißem Text. - Alle Werte als CSS Custom Properties in `tokens.css`; Breakpoints: 1249 (Burger) / 1024 / 992 / 768 / 600 / 500. +### Token-Disziplin (gilt für jede CSS-Änderung) + +Keine rohen Werte in `base/layout/components/utilities.css` — es gibt für alles eine Stufe: + +| Was | Token | Anmerkung | +|---|---|---| +| `padding` / `margin` / `gap` | `--space-4xs … --space-7xl` (14 Stufen, 4px-Raster) | `--space-4xs` (2px) **nur** für optische Korrekturen (Icon-/Baseline-Nudges), nie fürs Layout | +| `font-size` (Text) | `--fs-300 … --fs-1000` | `--fs-550`/`--fs-690` sind die fluiden Zwischenstufen (Lead, Karten-Überschrift) | +| `font-size` (Icons) | `--icon-s/m/l/xl` (rem), `--icon-inline-sm/--icon-inline/--icon-inline-lg` (em) | em-Stufen für Icons, die mit ihrer Textzeile mitwachsen sollen | +| `letter-spacing` | `--ls-tight/caps/wide/wider` | | +| Fokus | `--focus-ring` / `--focus-offset` | | +| Trefferfläche | `--tap-min` (44px) | | + +**Ausnahmen, bewusst roh:** `em`-Werte, die mit der `font-size` skalieren sollen (Button-Padding +`--btn-pad-*`, Badge-Innenabstände) — die gehören nicht auf ein festes px-Raster. + +### Buttons & Trefferflächen + +- Varianten in `utilities.css`: `.btn` (primary) · `.btn--outline` · `.btn--ghost` (tertiär, ohne Fläche) + · `.btn--icon` (quadratisch, nur Icon + `aria-label`) · `.btn--sm` / `.btn--lg`. + `.btn` ist `inline-flex` mit `gap` — Icon + Label brauchen **kein** Zusatz-Markup und keinen eigenen Abstand. +- Tabs (Filterleiste wie Panel-Tabs) laufen über die gemeinsame **`.tab`**-Basis in `components.css`; + aktiv wird über `aria-pressed` **oder** `aria-selected` erkannt. Nie eine dritte Tab-Optik bauen. +- **Jedes Control ≥ `--tap-min` (44px, WCAG 2.5.5).** Soll es optisch kleiner bleiben, streckt + `.tap-target` die Trefferfläche unsichtbar per `::after` (bei `.btn--sm` automatisch). Voraussetzung: + kein `overflow: hidden`, `::after` frei. In Reihen (Nav, Footer) stattdessen `min-height` verwenden — + überlappende Pseudo-Flächen würden sonst den Nachbarn verdecken. +- Ausnahme: die Formular-Checkbox bleibt bei 24px (WCAG 2.5.8). `` ist ein Replaced Element, + `::after` greift dort nicht zuverlässig; das klickbare `