Entscheidungen (ADR-Log)
Jede Entscheidung mit Kontext, Alternativen und Folgen. Neue Einträge hängen hinten an, bestehende werden nicht umgeschrieben, sondern mit „ersetzt durch ADR-0xx“ markiert. Quelle der Entwürfe: specs/design-system/design.md.
ADR-001 Richtung „Tafelgrün“ und Schrift Entwurf 10
Status: gilt (Gate 1). Entscheidung: Palette Tafelgrün, Schrift Lexend, warmes Dunkel, vier Rollenfarben. Alternativen: Palette Blau, Palette Beere, Entwürfe 01 bis 09. Folgen: Bricolage Grotesque entfällt. Gewicht 300 nur für große Fragen, Fließtext 400.
ADR-002 Schriftlizenz und Quelle
Status: gilt. Entscheidung: Lexend und Courier Prime, SIL OFL 1.1, aus @fontsource 5.3.0, WOFF2, nur Latin-Teilmenge, selbst gehostet. Alternativen: Source Sans 3, direkte Foundry-Dateien (nicht erreichbar). Folgen: Fontsource paketiert Google-Fonts-Familien. Das widerspricht der Regel des Skills „bencium“ (kein Google Fonts), nicht dem Auftrag (offene Lizenz, selbst gehostet, kein Laufzeit-Abruf). Lizenztexte liegen neben den Schriften.
ADR-003 Betragsschrift Courier Prime
Status: gilt (2026-10-06). Kontext: Lexend hat keine Tabellenziffern (Schriftdatei geprüft). Entscheidung: Beträge und Zahlenspalten in --font-family-amount = Courier Prime. Alternativen: IBM Plex Mono, festes Zahlenraster mit Lexend. Folgen: Zwei zusätzliche Schriftdateien (19 KB je Schnitt), nur auf Seiten mit Beträgen geladen.
ADR-004 Tokens: eigenes Skript
Status: gilt. Entscheidung: tokens/build-tokens.mjs ohne Abhängigkeiten erzeugt tokens.css, tokens.scoped.css und tokens.resolved.json. Alternativen: Skript aus dem Skill design-system (liegt in .claude/, nicht im Paket), Style Dictionary (große Abhängigkeit). Folgen: Eine Quelle (tokens.json), Exportformat für spätere native Apps vorhanden.
ADR-005 Kein Tailwind, keine UI-Bibliothek
Status: gilt. Entscheidung: Reines CSS mit Custom Properties. Alternative: Tailwind-Theme aus tokens.resolved.json (später möglich). Folgen: Kein Build-Schritt im Browser, kein Laufzeit-CSS, kleine Dateien (8 KB komprimiert).
ADR-006 Kontrast als Gate
Status: gilt, Umfang 98 Paare. Entscheidung: tokens/contrast.mjs prüft Text 4,5:1 und UI 3:1 in beiden Themes und bricht bei Verstoß ab (läuft in npm test). Befund: Die gelbe „Neu“-Fläche hat auf Papier nur 1,7:1. Lösung: Das Badge trägt immer Text (8,7:1) und einen Rand (color-new-edge, 3,9:1). Die Prüfung wurde nicht gelockert, sondern ein Token ergänzt.
ADR-007 Anrede nach Rolle
Status: gilt. Entscheidung: Eltern „du“, Verwaltungsrollen (Mandanten-Admin, Finanzverwalter) „du“, Lehrkräfte „Sie“. „du“ wird mitten im Satz kleingeschrieben. Folgen: Keine für Tokens und Komponenten, Texte tragen die Anrede (siehe MICROCOPY.md). Dokumentvorlagen von Lehrkräften an Eltern (Elternbrief, Protokoll) sprechen mit „Sie“, weil die Absenderin die Lehrkraft ist (bestätigt).
ADR-008 Icons: Lucide
Status: gilt. Entscheidung: Lucide (ISC), unveränderte SVG-Dateien zu einem Sprite, Strichstärke 2 px, derzeit 46 Symbole. Alternative: Phosphor (MIT). Folgen: Einzelne Teile stammen von Feather (MIT), Lizenztext liegt in LICENSE-lucide.txt.
ADR-009 Bildzeichen aus eigenem Auftrag
Status: ersetzt die Vorläufig-Entscheidung „nur Wortmarke“. Entscheidung: Das Bildzeichen (k mit Spalt) entstand außerhalb dieser Sitzung und wird als unveränderte Datei übernommen (packages/design/brand/). Folgen: Favicon (adaptiv hell/dunkel), App-Icon, Manifest und Social-Vorschau kommen aus dem Markenpaket. Das Design-System zeichnet kein SVG selbst.
ADR-010 Container Queries für Komponenten
Status: gilt. Alternative: Media Queries. Folgen: Komponenten passen sich dem verfügbaren Platz an (auch in schmalen Einbettungen und Vorschauen). Moderne Browser nötig (Chromium, Safari, Firefox aktuell).
ADR-011 Anfangs nur Wortmarke im Seitenkopf
Status: erledigt durch ADR-009 für Marken-Dateien. Der Seitenkopf der App zeigt weiterhin die Wortmarke „klasu“ als Text mit translate="no".
ADR-012 Rollen immer mit Icon und Text
Status: gilt. Rollen unterscheiden sich durch Icon, Text und Farbe, Farbe allein trägt nie eine Rolle.
ADR-013 Anrede in Texten
Status: gilt, ergänzt ADR-007. Lehrkräfte werden in der App bisher nirgends direkt angesprochen, deshalb gibt es noch keinen „Sie“-Text auf einem App-Screen. Die „Sie“-Fassungen stehen im Microcopy-Leitfaden.
ADR-014 Navigation per Container Query
Status: gilt. Unter 18 rem Containerbreite ist die klebende Leiste statisch, damit sie bei 200 % Text nichts verdeckt. Bottom-Bar im schmalen, Seitenleiste im breiten Raum (ab 52 rem Containerbreite).
ADR-015 Kalender als echte Tabelle
Status: gilt. <table class="cal-month"> statt ARIA-Grid. Ohne JavaScript ist das die einzig korrekte Semantik. Tage mit Termin tragen einen sprechenden aria-label.
ADR-016 scroll-padding unter der klebenden Leiste
Status: gilt, Wirkung nicht automatisch belegt. Prüfung per Tastatur steht in der manuellen Liste (specs/design-system/phase-6/manual-checklist.md).
ADR-017 Mandantenfarben müssen den Kontrasttest bestehen
Status: gilt, umgesetzt in tokens/accent.mjs. Die Wunschfarbe wird nur in der Helligkeit angepasst, bis alle Kontraste in beiden Themes halten. Besteht sie auch dann nicht (z. B. Gelb), bleibt die Standardfarbe. Gelb ist für „Neu“ reserviert und für Mandanten gesperrt.
ADR-018 Das Paket ist die Quelle, die Specs sind Doku
Status: gilt (Phase 5). Quellen liegen in packages/design/ (tokens/, src/), Specs und Berichte unter specs/design-system/. dist/ wird gebaut und nicht eingecheckt. Folgen: apps/web und das Dockerfile bauen das Paket vor dem Build der App.
ADR-019 Server Components und Formulare statt Client-JavaScript
Status: gilt. Alle App-Bausteine sind Server Components. Sprache und Darstellung schalten Formulare (POST, Cookie, Redirect). Einzige Client Component ist die Fehlergrenze error.tsx (von Next vorgeschrieben). Folgen: Seiten funktionieren ohne JavaScript (geprüft). 142 KB bleiben als Next-Laufzeit.
ADR-020 Zerstörerische Aktionen mit zweistufiger Rückfrage ohne JavaScript
Status: gilt (Phase 6). ConfirmAction nutzt <details>, erst der zweite Knopf sendet das Formular. Alternative: Modaler Dialog mit JavaScript. Folgen: Funktioniert ohne Skript und per Tastatur.
ADR-021 Schriften über next/font/local
Status: gilt (Phase 6, ersetzt die reinen @font-face-Regeln in der App). Preload für Lexend per Link-Header, berechnete Fallback-Schrift gegen Layoutsprung. Die Variablen werden in app/fonts.css an die Token gebunden. Außerhalb von Next gelten die @font-face-Regeln aus base.css. Folge: Die Schriftdateien liegen weiter nur im Paket.
ADR-022 Bildvergleich mit Referenzbildern unter Linux-Chromium
Status: gilt, im CI noch nicht gelaufen. 40 Referenzbilder (10 Seitenzustände × hell/dunkel × Handy/Desktop), Toleranz 0,1 % der Pixel. Datumsabhängige Stellen (heutiger Tag, „Stand“) werden abgedeckt. Folge: Referenzen immer in derselben Umgebung wie der Vergleich erzeugen. Weicht das CI-Image ab, einmal neu erzeugen und sichten.
ADR-023 Rückmeldung und Fehler gehören in eine eigene Spec
Status: offen, verwiesen auf specs/rueckmeldung-formulare. Das Design-System liefert die Bausteine (Toast, Feldfehler, Fehlerübersicht), die App-Logik dafür ist ein eigenes Feature.