Files
trainingsplan/DESIGN.md
T
AI-Agent 1759da8437
Image bauen und in die Registry schieben / build (push) Successful in 16s
DESIGN.md: Design-Sprache normiert (Tokens, Komponenten, Zustaende, Anti-Patterns)
- Philosophie (Nutzbarkeit vor Stil), Leitprinzipien, vollstaendige
  Farb-/Theme-/Akzent-Tokens mit Werten, Typografie, Form & Abstand
- Komponenten-Regeln (Buttons, Field-Box, Set-Zeile, Karten, Tabellen,
  Modals/Wizard, Toasts), Zustands-Matrix, i18n, A11y & Responsive
- Verbotene Anti-Patterns + Abschluss-Checkliste; README verlinkt darauf
2026-10-04 17:06:39 +00:00

9.4 KiB
Raw Blame History

REKORD - Design-Sprache

Normative Design-Doku für REKORD (Trainings-Tracker). Sie beschreibt die Design-Entscheidungen so präzise, dass sie auch in anderen Projekten wiederverwendbar sind. Wo ein Punkt geklärt wird, gilt er verbindlich - mit der einen Ausnahme: Nutzbarkeit schlägt Stil. Eine Regel, die die Software unbrauchbar macht, darf gebrochen werden - dann aber bewusst und begründet.


1. Philosophie

REKORD ist ein Werkzeug für den täglichen Gebrauch, kein Schaufenster. Daraus folgt:

  • Erst Funktion, dann Form. Die App reibt sich nicht zwischen dich und die Übung. Kompaktheit und Bedienbarkeit gehen jedem ästhetischen Detail voraus.
  • Ehrliche Fläche. Alles ist flach, kantig, offen. Kein Schein, keine Tiefe, kein Verlauf. Eine Kante ist eine Kante (2px), ein Zustand ist ein Zustand (klar unterscheidbar).
  • Konfiguration statt Auftrag. Der Nicht-Programmierer pflegt config.json; das Design muss das widerspiegeln: ruhig, vorhersehbar, nicht überraschend.
  • Daten bleiben Daten. Zahlen sind Daten und werden in einer Daten-Schrift gesetzt; Einheiten sind immer sichtbar (kg, km, min - nie nackte Zahlen).
  • Weniger ist mehr. Ein Akzent. Eine Karte. Eine Idee pro Bildschirm.

2. Leitprinzipien

  1. 0px Radius. Keine abgerundeten Ecken. Kanten sind hart.
  2. 2px-Border. Trennungen und Rahmen sind durchgängig 2px, nie schlanker.
  3. Dunkler Grund. Dunkle Themes sind der Default. Schwarz bleibt Schwarz (OLED), Hell ist eine Option, nie der Standard.
  4. Ein Akzent. Eine Akzentfarbe pro Sitzung, flach eingesetzt für aktive/ gewählte Zustände. Kein zweiter Akzent, kein Farbverlauf.
  5. Zustände denken. Hover, Fokus, Aktiv, Deaktiviert, "Erledigt" - jeder Zustand ist visuell eindeutig.
  6. Zwei Schriften, zwei Aufgaben. Sans für UI und Fließtext, Mono für Zahlen und Daten. Kein unreflektierter System-Stack als einzige Schrift.
  7. Bewegung nur, wenn sie dient. Und dann prefers-reduced-motion respektieren.

3. Tokens

Die Tokens leben als CSS-Variablen in :root und werden über data-theme / data-accent auf <html> gewechselt. Komponenten nutzen nur Tokens - keine hartkodierten Farben.

3.1 Farbe (Dunkel, Default)

Token Wert Verwendung
--bg #0e0e0e Seitenhintergrund
--bg-panel #161616 Karten, Panels, Modals
--bg-input #0a0a0a Eingabefelder
--bg-hover #202020 Hover-Hintergrund
--bg-subtle #1d1d1d Zebra, Header, Done-Zeilen
--border #333 Standardrahmen
--border-hover #4d4d4d Rahmen im Hover
--text #e8e8e8 Primärtext
--muted #a0a0a0 Sekundärtext (Kontrast >= 7:1 auf Panel)
--danger #c0392b destruktive Aktionen
--ok #6fae5c Erfolg

3.2 Akzent-Palette

Zehn flache Akzentfarben, alle mit einer einheitlichen dunklen Tinte (--accent-ink: #141414, Kontrast >= 4,2:1 überall - mathematisch geprüft). Jede Farbe hat --accent-hover (heller) und --accent-active (dunkler).

Akzent Wert Hover Active
amber #e0a33c #e9b257 #cf9130
orange #e4582e #ed6a36 #ca4a22
red #d64541 #e1514c #be3a37
green #3fae5a #4ebc68 #36984b
teal #2aa198 #39afa5 #258d84
cyan #25b8cc #39c5d8 #219fb2
blue #4a86c8 #5a96d6 #4073b0
violet #9a6fd0 #ab80e0 #875db7
pink #e0567f #eb6890 #c74b6e
white #ffffff #f2f2f2 #e6e6e6

Sonderfall weißer Akzent: auf hellem Theme braucht er eine sichtbare Umrandung (--accent-border: #9a9a9a), sonst verschwinden Buttons weiß-auf-weiß. Gleiches gilt für Fortschrittssegmente (auf hellem Theme schwarz statt unsichtbar-weiß).

3.3 Themes

Theme --bg --bg-panel --bg-input --border --text --muted
dark #0e0e0e #161616 #0a0a0a #333 #e8e8e8 #a0a0a0
light #f2f2f0 #ffffff #ffffff #c6c6c2 #1c1c1c #5c5c59
oled #000000 #050505 #000000 #232323 #e8e8e8 #a0a0a0
  • system folgt prefers-color-scheme (mit Live-Watch über Media Query).
  • oled ist eine Eigenschaft des dunklen Modus (Schalter), kein eigenes Theme: Wenn oled aktiv und die Auflösung dunkel, gelten reines-Schwarz- Tokens.
  • color-scheme wird pro Theme gesetzt (native Formulare folgen).

3.4 Typografie

  • --font-ui: System-Sans für UI, Labels, Fließtext.
  • --font-data: Mono (tabular-nums) für Zahlen, Gewichte, Zeiten, Datums-, Statistik- und Eingabefelder.
  • Hierarchie über Gewicht und Abstand, nicht über Größen-Vielfalt: h1 > h2 > h3, bei begrenzter Größenspreizung. Kein "alles gleich".
  • Kein webfont-Download nötig - offline-fähig.

3.5 Form, Abstand, Bewegung

  • Radius: 0.
  • Border: 2px (Buttons, Karten, Inputs, Tabs, Segmente).
  • Abstand: konsistente Raster (8/10/12/14/16/20px), Modals großzügig (Padding >= 32px, min-height fuer konstante Groesse).
  • Schatten: keine. Trennung über Kanten und Abstand.
  • Motion: höchstens kurzzeitige Transitions (Farbwechsel); nichts Animiertes ohne prefers-reduced-motion-Schutz.

4. Komponenten & Regeln

4.1 Buttons

  • Primary (.btn-primary): Akzent-Hintergrund + --accent-ink-Tinte. Hover = --accent-hover, Active = --accent-active (Border bleibt --accent-border). Nur für die eine Hauptaktion.
  • Secondary (.btn): transparent, 2px-Border, --text. Für Nebenaktionen.
  • Danger (.btn-danger-ghost): rote Border/Tinte. Destruktiv.
  • min-width (96px / 64px bei .btn-small): Buttons springen nicht in der Breite, wenn die Sprache wechselt.
  • Disabled: Opacity 0.45 + not-allowed.
  • Icons statt Text bei platzsparenden Aktionen (Reset = SVG-Pfeilkreislauf, Loeschen = ×). Keine Emojis als Icons.

4.2 Eingabefelder (Field-Box)

Eine zusammengehoerige Box: Zahl links, Einheit rechts als festes Suffix in derselben Box (z.B. [18,5 | kg]). Klick auf die ganze Box fokussiert den Input. Einheiten sind nie nackt. :focus-within faerbt die Border im Akzent. Leer bleibt leer - nie 0.

4.3 Set-Zeile

Kompakte 5-Spalten-Grid: auto auto auto auto auto (Check | kg | reps | Reset-Icon | X-Icon). Check = "Set n [ ]", ganzer Button klickbar, Kette ohne Luecken. Die Zeile muss auf ein normales Handy-Display passen - ohne horizontales Scrollen.

4.4 Karten & Panels

2px-Border, --bg-panel, Radius 0. Keine Schatten, keine rounded-2xl-Karten. Karten durch Trennlinien/Kanten strukturieren statt durch Abstaende allein.

4.5 Tabellen

2px-Border auf allen Zellen, Header auf --bg-subtle, Zahlen rechtsbündig in Mono. Balken (Statistik) als flache Akzent-Rechtecke.

4.6 Modals / Setup-Wizard

  • Feste Mindesthoehe (konstante Groesse zwischen Schritten), Navigation unten verankert, Inhalt intern scrollbar.
  • Fortschritt = segmentierter Balken oben rechts (Striche mit gap). Erledigt = gefuellt, aktuell = nur Umrandung, kommend = ausgegraut.
  • Explizite Navigation (Zurueck / Weiter / Abschliessen), Auswahl springt nie automatisch weiter.

4.7 Toasts

Fixiert unten, 2px-Border. Fehler = --danger, Erfolg = --ok, und Einstellungs-Bestaetigungen in der Akzentfarbe (nicht fix gruen).

5. Zustände

Zustand Regel
hover --bg-hover / --border-hover; bei Akzent-Buttons --accent-hover
focus :focus-visible 2px Akzent-Outline (nie outline: none ohne Ersatz)
active/pressed --accent-active bei Primary, --bg-hover bei Secondary
disabled Opacity 0.45, cursor: not-allowed
done/selected Akzent-Hintergrund + --accent-ink (Check, aktiver Tab, Toggle)
error --danger (Border + Text), nie nur Farb-Luecke

6. i18n & Sprache

  • Alle UI-Texte über t(key) aus einem LANG-Dictionary (de/en). Keine hartkodierten Strings in Views.
  • Buttons bekommen min-width, damit Sprachwechsel die Groesse nicht aendern.
  • Server-Fehlermeldungen werden ueber eMsg() lokalisiert.
  • Der Login-Screen erscheint in der Server-Standardsprache (aus /api/meta).

7. Accessibility & Responsive

  • Tastatur: alles bedienbar, sichtbarer Fokus.
  • Kontrast: --muted auf Panel >= 7:1; Akzent-Tinte >= 4,2:1.
  • aria-label/aria-pressed an interaktiven Icons/Checks.
  • prefers-reduced-motion schaltet Transitions aus.
  • Mobil: keine horizontalen Scrollleisten fuer Inhalte; Tabs wrappen statt abzuschneiden; Eingaben flexibel-schrumpfbar mit min-width: 0.

8. Verboten (Anti-Patterns)

  • Verlaeufe (auch subtile), Glow, Glassmorphism, backdrop-filter.
  • Schatten statt Kanten.
  • Mehr als ein Akzent gleichzeitig; Lila-zu-Blau-Heroes.
  • Emojis als Icons, rohe Unicode-Pfeile in Labels, Em-Dashes als Stilmittel.
  • Abgerundete Pillen/Buttons ohne Grund.
  • "Nahtlos", "Leistungsstark", "Elevate" - Vage-Floskel-Copy.
  • Zentrierter Hero + 3-Karten-SaaS-Skelett.
  • Eingaben, die bei jedem Tastendruck neu gerendert werden (Fokus-Verlust).
  • Nackte Zahlen ohne Einheit.

9. Abschluss-Check (vor dem Shippen)

  1. Diff gegen die Tokens: keine hartkodierten Farben in Komponenten.
  2. Scan auf Em-Dashes, Verlaeufe, rohe Pfeile, Emojis, Bannwoerter.
  3. Einheiten/Labels ueberall sichtbar?
  4. Zustaende (hover/focus/active/disabled/done) durchgeklickt?
  5. Mobil ohne horizontales Scrollen geprueft?
  6. Sprachwechsel (de/en) auf Button-Groessen getestet?