Tokens: CSS-Variablen in :root, an Tailwind per @theme inline gereicht (bg-surface, text-muted, border-border-strong, rounded-karte …). So nutzen Inline-SVGs und Utilities
dieselbe Quelle. Nur dunkler Modus.
Schriften: nur Latin-Ausschnitt und benutzte Gewichte, importiert in src/app/layout.tsx.
Zeichen außerhalb (z. B. „→“) fallen auf die Systemschrift zurück – unauffällig.
Kontrast (gemessen): --text-muted auf --surface 5,8:1, auf --raised 5,3:1;
Messing auf --accent-soft 7,2:1; Koralle auf --danger-soft 5,8:1; Text auf Messing-Button 10,3:1.
Icons:pnpm icons (scripts/icons.mjs) erzeugt public/icons/*, src/app/favicon.ico
(16/32/48, PNG-in-ICO), src/app/icon.svg und src/app/apple-icon.png; Ergebnisse sind
eingecheckt, damit Build und Laufzeitabbild kein sharp brauchen. App-Icons auf #0D1013 mit
Rand (Logo 72 %), deshalb ohne maskable.
Aktiver Pfad: Ein Layout kennt den Pfad nicht. Huelle nimmt aktiverPfad optional;
ohne Angabe ermittelt die Client-Navigation ihn per usePathname().
Benutzer:src/app/(app)/huellen-benutzer.ts → huellenBenutzerErmitteln() liefert bis #004 einen festen Beispielbenutzer (TODO-Kommentar).
Mobil: Unter 1024 px Kopfleiste mit Menü-Button, Leiste als Overlay (280 px) mit eigenem
Schließen-Knopf; Escape, Klick auf Abdunkler oder auf einen Link schließt. Geschlossen ist die
Leiste invisible und damit nicht per Tab erreichbar.
Desktop: Seitenleiste als eigene Flex-Spalte, Inhalt darin sticky – Hintergrund und Rahmen
laufen auch bei langen Seiten (und in Full-Page-Screenshots) durch.
Tabellen scrollen im eigenen Container; der Container ist relative, sonst entkommen sr-only-Texte dem Scrollbereich und verbreitern die Seite (bei 390 px gefunden).
Prototyp: Beispieldaten in src/beispiel/ (Bezugszeit BEISPIEL_JETZT), Seiten sichtbar
als „Beispieldaten“ markiert. Platzhalterseiten nennen Phase und Issue.
Quelle: docs/issues/002-design-layout.md – dort wird dieses Issue gepflegt.
## Ziel
Design laut Vorgabe (Tresor, Graphit + Messing): Tokens, Schriften, Logo, Favicon/PWA-Icons, Grundlayout mit Seitenleiste.
## Aufgaben
- [x] Design-Tokens als CSS-Variablen + Tailwind-Theme
- [x] Space Grotesk, IBM Plex Sans, JetBrains Mono selbst gehostet (`@fontsource`)
- [x] `public/brand/` mit `logo.svg`, `logo-light.svg`, `logo-mono.svg`, `favicon.svg`; PNG-Icons + Manifest per Skript
- [x] Seitenleiste (Logo, Navigation, Benutzer unten), einklappbar auf schmalen Bildschirmen
- [x] Grundkomponenten: Karte, Button (primär/sekundär/Gefahr), Badge, Statuspunkt, Tabelle, Diff-Box, Kennzahl-Kachel
## Akzeptanzkriterien
- [x] Kontrast ≥ 4,5:1, Fokusrahmen in Messing
- [x] Kein horizontales Scrollen bei 390 px
- [x] Klickflächen ≥ 44 px
## Abhängigkeiten
#001
## Notizen / Entscheidungen
- **Tokens:** CSS-Variablen in `:root`, an Tailwind per `@theme inline` gereicht (`bg-surface`,
`text-muted`, `border-border-strong`, `rounded-karte` …). So nutzen Inline-SVGs und Utilities
dieselbe Quelle. Nur dunkler Modus.
- **Schriften:** nur Latin-Ausschnitt und benutzte Gewichte, importiert in `src/app/layout.tsx`.
Zeichen außerhalb (z. B. „→“) fallen auf die Systemschrift zurück – unauffällig.
- **Kontrast** (gemessen): `--text-muted` auf `--surface` 5,8:1, auf `--raised` 5,3:1;
Messing auf `--accent-soft` 7,2:1; Koralle auf `--danger-soft` 5,8:1; Text auf Messing-Button 10,3:1.
- **Icons:** `pnpm icons` (`scripts/icons.mjs`) erzeugt `public/icons/*`, `src/app/favicon.ico`
(16/32/48, PNG-in-ICO), `src/app/icon.svg` und `src/app/apple-icon.png`; Ergebnisse sind
eingecheckt, damit Build und Laufzeitabbild kein sharp brauchen. App-Icons auf `#0D1013` mit
Rand (Logo 72 %), deshalb ohne `maskable`.
- **Aktiver Pfad:** Ein Layout kennt den Pfad nicht. `Huelle` nimmt `aktiverPfad` optional;
ohne Angabe ermittelt die Client-`Navigation` ihn per `usePathname()`.
- **Benutzer:** `src/app/(app)/huellen-benutzer.ts` → `huellenBenutzerErmitteln()` liefert bis
#004 einen festen Beispielbenutzer (TODO-Kommentar).
- **Mobil:** Unter 1024 px Kopfleiste mit Menü-Button, Leiste als Overlay (280 px) mit eigenem
Schließen-Knopf; Escape, Klick auf Abdunkler oder auf einen Link schließt. Geschlossen ist die
Leiste `invisible` und damit nicht per Tab erreichbar.
- **Desktop:** Seitenleiste als eigene Flex-Spalte, Inhalt darin `sticky` – Hintergrund und Rahmen
laufen auch bei langen Seiten (und in Full-Page-Screenshots) durch.
- **Tabellen** scrollen im eigenen Container; der Container ist `relative`, sonst entkommen
`sr-only`-Texte dem Scrollbereich und verbreitern die Seite (bei 390 px gefunden).
- **Prototyp:** Beispieldaten in `src/beispiel/` (Bezugszeit `BEISPIEL_JETZT`), Seiten sichtbar
als „Beispieldaten“ markiert. Platzhalterseiten nennen Phase und Issue.
- **Screenshots:** `pnpm exec tsx scripts/screenshots.ts` (ENV `SSHKV_URL`, `SSHKV_BILDER`,
`SSHKV_SEITEN`) → `docs/anleitung/bilder/`; meldet horizontalen Überlauf mit Exit-Code 1.
---
Quelle: `docs/issues/002-design-layout.md` – dort wird dieses Issue gepflegt.
florian.wilde
added this to the v0.1.0 milestone 2026-10-12 15:12:32 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ziel
Design laut Vorgabe (Tresor, Graphit + Messing): Tokens, Schriften, Logo, Favicon/PWA-Icons, Grundlayout mit Seitenleiste.
Aufgaben
@fontsource)public/brand/mitlogo.svg,logo-light.svg,logo-mono.svg,favicon.svg; PNG-Icons + Manifest per SkriptAkzeptanzkriterien
Abhängigkeiten
#001
Notizen / Entscheidungen
:root, an Tailwind per@theme inlinegereicht (bg-surface,text-muted,border-border-strong,rounded-karte…). So nutzen Inline-SVGs und Utilitiesdieselbe Quelle. Nur dunkler Modus.
src/app/layout.tsx.Zeichen außerhalb (z. B. „→“) fallen auf die Systemschrift zurück – unauffällig.
--text-mutedauf--surface5,8:1, auf--raised5,3:1;Messing auf
--accent-soft7,2:1; Koralle auf--danger-soft5,8:1; Text auf Messing-Button 10,3:1.pnpm icons(scripts/icons.mjs) erzeugtpublic/icons/*,src/app/favicon.ico(16/32/48, PNG-in-ICO),
src/app/icon.svgundsrc/app/apple-icon.png; Ergebnisse sindeingecheckt, damit Build und Laufzeitabbild kein sharp brauchen. App-Icons auf
#0D1013mitRand (Logo 72 %), deshalb ohne
maskable.HuellenimmtaktiverPfadoptional;ohne Angabe ermittelt die Client-
Navigationihn perusePathname().src/app/(app)/huellen-benutzer.ts→huellenBenutzerErmitteln()liefert bis#004 einen festen Beispielbenutzer (TODO-Kommentar).
Schließen-Knopf; Escape, Klick auf Abdunkler oder auf einen Link schließt. Geschlossen ist die
Leiste
invisibleund damit nicht per Tab erreichbar.sticky– Hintergrund und Rahmenlaufen auch bei langen Seiten (und in Full-Page-Screenshots) durch.
relative, sonst entkommensr-only-Texte dem Scrollbereich und verbreitern die Seite (bei 390 px gefunden).src/beispiel/(BezugszeitBEISPIEL_JETZT), Seiten sichtbarals „Beispieldaten“ markiert. Platzhalterseiten nennen Phase und Issue.
pnpm exec tsx scripts/screenshots.ts(ENVSSHKV_URL,SSHKV_BILDER,SSHKV_SEITEN) →docs/anleitung/bilder/; meldet horizontalen Überlauf mit Exit-Code 1.Quelle:
docs/issues/002-design-layout.md– dort wird dieses Issue gepflegt.