red-proto 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -0
- package/agents/backend-developer.md +110 -0
- package/agents/frontend-developer.md +171 -0
- package/agents/qa-engineer.md +112 -0
- package/agents/ux-reviewer.md +186 -0
- package/bin/install.js +218 -0
- package/commands/red:proto-architect.md +143 -0
- package/commands/red:proto-dev-setup.md +545 -0
- package/commands/red:proto-dev.md +241 -0
- package/commands/red:proto-flows.md +210 -0
- package/commands/red:proto-qa.md +228 -0
- package/commands/red:proto-requirements.md +194 -0
- package/commands/red:proto-research.md +145 -0
- package/commands/red:proto-sparring.md +121 -0
- package/commands/red:proto-ux.md +292 -0
- package/commands/red:proto-workflow.md +82 -0
- package/commands/red:proto.md +170 -0
- package/design-system/README.md +62 -0
- package/design-system/components/button.md +68 -0
- package/design-system/components/card.md +77 -0
- package/design-system/components/input.md +81 -0
- package/design-system/patterns/data-display.md +132 -0
- package/design-system/patterns/feedback.md +148 -0
- package/design-system/patterns/forms.md +90 -0
- package/design-system/patterns/navigation.md +100 -0
- package/design-system/screens/README.md +45 -0
- package/design-system/tokens/colors.md +66 -0
- package/design-system/tokens/motion.md +53 -0
- package/design-system/tokens/shadows.md +33 -0
- package/design-system/tokens/spacing.md +57 -0
- package/design-system/tokens/typography.md +70 -0
- package/package.json +36 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Card
|
|
2
|
+
|
|
3
|
+
## Beschreibung
|
|
4
|
+
Container für zusammengehörige Inhalte. Cards gruppieren verwandte Informationen und Aktionen zu einer logischen Einheit. Sie können statisch (reine Anzeige) oder interaktiv (klickbar, z.B. zu Detailansicht) sein.
|
|
5
|
+
|
|
6
|
+
## Varianten
|
|
7
|
+
|
|
8
|
+
| Variante | Verwendung |
|
|
9
|
+
|---------------|------------------------------------------------------------------|
|
|
10
|
+
| `default` | Statische Inhalts-Card (kein Hover-Effekt) |
|
|
11
|
+
| `interactive` | Klickbare Card (gesamte Card ist Klickziel) mit Hover-Effekt |
|
|
12
|
+
| `compact` | Reduziertes Padding, für Listen mit vielen Cards |
|
|
13
|
+
| `flat` | Kein Schatten, nur Border – für Inhalte auf farbigem Hintergrund |
|
|
14
|
+
| `highlight` | Mit farbiger Leiste oder farbigem Hintergrund-Tint (Betonung) |
|
|
15
|
+
|
|
16
|
+
## Aufbau (Reihenfolge im DOM)
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
[Card-Wrapper]
|
|
20
|
+
[Card-Header] ← Optional: Titel + Subtitle + Header-Aktion
|
|
21
|
+
[Card-Media] ← Optional: Bild/Icon-Bereich oben
|
|
22
|
+
[Card-Body] ← Pflicht: Hauptinhalt
|
|
23
|
+
[Card-Footer] ← Optional: Aktionen (Buttons, Links)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Zustände (nur bei Variant: interactive)
|
|
27
|
+
|
|
28
|
+
| Zustand | Verhalten |
|
|
29
|
+
|----------|------------------------------------------------------------------|
|
|
30
|
+
| `default`| Ruhezustand |
|
|
31
|
+
| `hover` | Leicht erhöhter Schatten, leichter Hintergrund-Tint |
|
|
32
|
+
| `focus` | Sichtbarer Focus-Ring (Keyboard-Navigation) |
|
|
33
|
+
| `active` | Leichter Scale-Down (0.99) oder verstärkter Schatten |
|
|
34
|
+
|
|
35
|
+
## Visuelle Specs – Default
|
|
36
|
+
|
|
37
|
+
| Eigenschaft | Wert |
|
|
38
|
+
|----------------|-----------------------------|
|
|
39
|
+
| Hintergrund | `color-bg-surface` |
|
|
40
|
+
| Border | `1px color-border-default` |
|
|
41
|
+
| Border-Radius | `radius-lg` |
|
|
42
|
+
| Schatten | `shadow-card` |
|
|
43
|
+
| Padding Body | `spacing-6` |
|
|
44
|
+
| Padding Compact| `spacing-4` |
|
|
45
|
+
|
|
46
|
+
## Visuelle Specs – Interactive (zusätzlich)
|
|
47
|
+
|
|
48
|
+
| Eigenschaft | Hover |
|
|
49
|
+
|-------------------|------------------------------|
|
|
50
|
+
| Schatten | `shadow-lg` |
|
|
51
|
+
| Hintergrund | leichter `color-primary-50` |
|
|
52
|
+
| Transition | `transition-shadow` |
|
|
53
|
+
|
|
54
|
+
## Card-Header
|
|
55
|
+
|
|
56
|
+
- Titel: `style-h3` oder `style-h4` je nach Kontext
|
|
57
|
+
- Subtitle: `style-body-sm`, Farbe `color-text-secondary`
|
|
58
|
+
- Header-Aktion: Icon-Button rechts, oder Overflow-Menu
|
|
59
|
+
|
|
60
|
+
## Card-Footer
|
|
61
|
+
|
|
62
|
+
- Trennlinie oben: `1px color-border-default`
|
|
63
|
+
- Padding: `spacing-4` `spacing-6`
|
|
64
|
+
- Layout: Flex, Aktionen rechts-ausgerichtet
|
|
65
|
+
- Max. 2 Aktionen – primary + secondary Button
|
|
66
|
+
|
|
67
|
+
## Regeln
|
|
68
|
+
|
|
69
|
+
- Interaktive Cards haben genau EINEN Klickbereich (die gesamte Card) – keine verschachtelten Links oder Buttons innerhalb einer klickbaren Card (Ausnahme: Overflow-Menu)
|
|
70
|
+
- Wenn mehrere Aktionen nötig sind → Aktionen im Footer, Card selbst nicht klickbar
|
|
71
|
+
- Bilder in Cards: immer mit alt-Text, feste Höhe (aspect-ratio), object-fit: cover
|
|
72
|
+
|
|
73
|
+
## Nicht verwenden wenn
|
|
74
|
+
|
|
75
|
+
- Für einzelne Kennzahlen → Stat-Komponente
|
|
76
|
+
- Für Formular-Felder → Form-Group
|
|
77
|
+
- Für Listen-Einträge mit vielen Zeilen → List-Item
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Input / Textfeld
|
|
2
|
+
|
|
3
|
+
## Beschreibung
|
|
4
|
+
Einzeiliges Texteingabefeld. Verwendet für kurze Freitext-Eingaben: Name, E-Mail, Suche, Passwort, Zahlen.
|
|
5
|
+
|
|
6
|
+
## Varianten
|
|
7
|
+
|
|
8
|
+
| Variante | Verwendung |
|
|
9
|
+
|-------------|------------------------------------------------------|
|
|
10
|
+
| `default` | Standardmäßiges Textfeld |
|
|
11
|
+
| `search` | Mit Lupe-Icon links, optional Clear-Button rechts |
|
|
12
|
+
| `password` | Maskierter Text, Toggle für Sichtbarkeit |
|
|
13
|
+
| `number` | Nur numerische Eingabe, optional Stepper-Buttons |
|
|
14
|
+
|
|
15
|
+
## Zustände
|
|
16
|
+
|
|
17
|
+
| Zustand | Verhalten |
|
|
18
|
+
|------------|------------------------------------------------------------------------|
|
|
19
|
+
| `default` | Ruhezustand – Border: `color-border-default` |
|
|
20
|
+
| `focus` | Border: `color-border-focus` (2px), kein Box-Shadow |
|
|
21
|
+
| `filled` | Hat Inhalt – kein visueller Unterschied außer Content |
|
|
22
|
+
| `error` | Border: `color-error-500`, Fehlermeldung darunter, Error-Icon |
|
|
23
|
+
| `success` | Border: `color-success-500`, Checkmark-Icon (optional) |
|
|
24
|
+
| `disabled` | Opacity 0.5, Background: `color-bg-muted`, kein Cursor |
|
|
25
|
+
| `readonly` | Kein Fokus möglich, Background: `color-bg-muted`, Cursor: `default` |
|
|
26
|
+
|
|
27
|
+
## Aufbau (Reihenfolge im DOM)
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
[Label] ← <label> mit for-Attribut (PFLICHT, kein Placeholder-Ersatz)
|
|
31
|
+
[Helper-Text] ← Optional, kurze Erklärung vor dem Input
|
|
32
|
+
[Input-Wrapper]
|
|
33
|
+
[Prefix-Icon] ← Optional
|
|
34
|
+
[<input>]
|
|
35
|
+
[Suffix-Icon/Action] ← Optional (Clear, Toggle, Unit)
|
|
36
|
+
[Error-Message] ← Nur bei Fehler, mit role="alert" oder aria-live
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Größen
|
|
40
|
+
|
|
41
|
+
| Größe | Padding (h/v) | Font-Size | Height |
|
|
42
|
+
|-------|------------------------------|--------------|--------|
|
|
43
|
+
| `sm` | `spacing-2` / `spacing-3` | `text-sm` | 32px |
|
|
44
|
+
| `md` | `spacing-3` / `spacing-4` | `text-base` | 40px |
|
|
45
|
+
| `lg` | `spacing-4` / `spacing-4` | `text-base` | 48px |
|
|
46
|
+
|
|
47
|
+
## Visuelle Specs
|
|
48
|
+
|
|
49
|
+
| Eigenschaft | Default | Focus | Error |
|
|
50
|
+
|----------------|----------------------------|---------------------------|--------------------------|
|
|
51
|
+
| Hintergrund | `color-neutral-0` | `color-neutral-0` | `color-error-100` |
|
|
52
|
+
| Border | `1px color-border-default` | `2px color-border-focus` | `1px color-error-500` |
|
|
53
|
+
| Border-Radius | `radius-default` | `radius-default` | `radius-default` |
|
|
54
|
+
| Text | `color-text-primary` | `color-text-primary` | `color-text-primary` |
|
|
55
|
+
| Placeholder | `color-text-disabled` | `color-text-disabled` | `color-text-disabled` |
|
|
56
|
+
|
|
57
|
+
## Label-Regeln
|
|
58
|
+
|
|
59
|
+
- Label ist immer sichtbar – kein Placeholder als Label-Ersatz
|
|
60
|
+
- Pflichtfelder: Sternchen (*) im Label + aria-required="true" auf Input
|
|
61
|
+
- Pflichtfeld-Hinweis am Anfang des Formulars: "* Pflichtfeld"
|
|
62
|
+
|
|
63
|
+
## Fehlermeldungen
|
|
64
|
+
|
|
65
|
+
- Inline direkt unter dem Input, nicht in Alerts oder Toasts
|
|
66
|
+
- Text: `color-error-700`, `text-sm`
|
|
67
|
+
- Kurz und präzise: "Bitte gültige E-Mail-Adresse eingeben" – nicht "Fehler"
|
|
68
|
+
- ID verknüpft mit Input via `aria-describedby`
|
|
69
|
+
|
|
70
|
+
## Regeln
|
|
71
|
+
|
|
72
|
+
- Labels sind immer vergeben – niemals nur Placeholder
|
|
73
|
+
- Fehlermeldungen sind inline, nicht in Toasts
|
|
74
|
+
- Jeder Input hat ein name-Attribut
|
|
75
|
+
- Autocomplete-Attribute setzen (email, name, tel etc.)
|
|
76
|
+
|
|
77
|
+
## Nicht verwenden wenn
|
|
78
|
+
|
|
79
|
+
- Längerer Freitext → Textarea
|
|
80
|
+
- Auswahl aus Optionen → Select oder Radio/Checkbox
|
|
81
|
+
- Datumsauswahl → DatePicker
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Pattern: Datenanzeige
|
|
2
|
+
|
|
3
|
+
## Tabellen
|
|
4
|
+
|
|
5
|
+
### Verwendung
|
|
6
|
+
|
|
7
|
+
Für strukturierte, vergleichbare Daten mit mehreren Attributen pro Zeile. Nicht für einfache Listen oder Einzel-Werte.
|
|
8
|
+
|
|
9
|
+
### Aufbau
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
[Table-Toolbar] ← Optional: Suche, Filter, Bulk-Aktionen, Spalten-Konfiguration
|
|
13
|
+
[Table-Header] ← Sticky bei langen Tabellen; sortierbare Spalten mit Icon
|
|
14
|
+
[Table-Body]
|
|
15
|
+
[Table-Row] ← Hover-Highlight; selektierbar (Checkbox links)
|
|
16
|
+
[Table-Cell]
|
|
17
|
+
[Table-Footer] ← Pagination oder "Alle X Einträge laden"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Regeln
|
|
21
|
+
|
|
22
|
+
- Spalten-Header: `style-label`, `color-text-secondary`, sortierbar mit Up/Down-Icon
|
|
23
|
+
- Zahlen: rechtsbündig, gleiche Dezimalstellen pro Spalte
|
|
24
|
+
- Text: linksbündig
|
|
25
|
+
- Status/Badges: zentriert (optional)
|
|
26
|
+
- Leerer Zustand: Empty-State Pattern (nicht einfach leere Tabelle)
|
|
27
|
+
- Mobile: Horizontales Scrollen oder Card-Ansicht als Alternative
|
|
28
|
+
- Max. 6–8 Spalten sichtbar – mehr → Spalten ausblendbar
|
|
29
|
+
|
|
30
|
+
### Zeilenaktionen
|
|
31
|
+
|
|
32
|
+
- Hover-Aktionen: erscheinen rechts in der Zeile beim Hover (Edit, Delete)
|
|
33
|
+
- Overflow-Menu: bei mehr als 2 Aktionen
|
|
34
|
+
- Bulk-Aktionen: erscheinen in Toolbar wenn Zeilen selektiert
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Listen
|
|
39
|
+
|
|
40
|
+
### Einfache Liste
|
|
41
|
+
|
|
42
|
+
Für Elemente mit wenigen Attributen, keine komplexe Sortierung nötig.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
[List-Item]
|
|
46
|
+
[Leading: Icon/Avatar/Thumbnail] ← Optional
|
|
47
|
+
[Content]
|
|
48
|
+
[Primary Text] ← style-body, color-text-primary
|
|
49
|
+
[Secondary Text] ← style-body-sm, color-text-secondary
|
|
50
|
+
[Trailing: Action/Meta/Badge] ← Optional
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Trennlinien: `1px color-border-default` zwischen Items (nicht unter letztem Item).
|
|
54
|
+
|
|
55
|
+
### Geordnete Liste / Rankings
|
|
56
|
+
|
|
57
|
+
- Nummerierung: konsistent ausgerichtet (rechtsbündig, gleiche Breite)
|
|
58
|
+
- Hervorhebung: Top 3 mit Badge oder Icon
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Badges / Tags
|
|
63
|
+
|
|
64
|
+
### Verwendung
|
|
65
|
+
|
|
66
|
+
Kurze Status-Informationen, Kategorisierungen, Zähler.
|
|
67
|
+
|
|
68
|
+
### Varianten
|
|
69
|
+
|
|
70
|
+
| Variante | Verwendung | Farbe |
|
|
71
|
+
|-------------|------------------------------------------|-----------------------------|
|
|
72
|
+
| `success` | Aktiv, Abgeschlossen, Online | `color-success-*` |
|
|
73
|
+
| `warning` | Ausstehend, In Review, Achtung | `color-warning-*` |
|
|
74
|
+
| `error` | Fehler, Abgelehnt, Kritisch | `color-error-*` |
|
|
75
|
+
| `info` | Neu, Beta, Hinweis | `color-primary-*` |
|
|
76
|
+
| `neutral` | Archiviert, Inaktiv, Standard | `color-neutral-*` |
|
|
77
|
+
|
|
78
|
+
### Regeln
|
|
79
|
+
|
|
80
|
+
- Maximale Zeichenzahl: 20–25 Zeichen – mehr → Tooltip mit Volltext
|
|
81
|
+
- Nicht klickbar (wenn klickbar → Filter-Tag / Chip)
|
|
82
|
+
- Dot-Badge: Nur Farbe als Status-Indikator (immer mit sichtbarem Text-Label für Accessibility)
|
|
83
|
+
- Zähler-Badge: Auf Icons/Avatare für ungelesene Nachrichten etc.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Statistik / Kennzahlen (Stat Cards)
|
|
88
|
+
|
|
89
|
+
### Aufbau
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
[Label / Beschreibung] ← style-body-sm, color-text-secondary
|
|
93
|
+
[Hauptwert] ← text-3xl oder text-4xl, font-weight-bold
|
|
94
|
+
[Vergleichswert / Trend] ← Optional: +12% (grün) oder -3% (rot) + Icon
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Regeln
|
|
98
|
+
|
|
99
|
+
- Trend-Indikatoren: Farbe PLUS Icon (nicht nur Farbe)
|
|
100
|
+
- Einheiten klar kennzeichnen: €, %, Stk., ms
|
|
101
|
+
- Sehr große Zahlen formatieren: 1.234.567 oder 1,2M
|
|
102
|
+
- Loading: Skeleton über dem gesamten Stat-Block
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Avatar / Nutzerbilder
|
|
107
|
+
|
|
108
|
+
### Varianten
|
|
109
|
+
|
|
110
|
+
| Variante | Inhalt |
|
|
111
|
+
|------------|-------------------------------------------------|
|
|
112
|
+
| Bild | Nutzerfoto (immer mit Fallback) |
|
|
113
|
+
| Initials | Fallback: Initialen auf Farbhintergrund |
|
|
114
|
+
| Icon | Generisches User-Icon (wenn kein Name verfügbar)|
|
|
115
|
+
|
|
116
|
+
### Größen
|
|
117
|
+
|
|
118
|
+
| Größe | Durchmesser | Verwendung |
|
|
119
|
+
|-------|-------------|------------------------------------|
|
|
120
|
+
| `xs` | 24px | In Tabellenzellen, kompakte Listen |
|
|
121
|
+
| `sm` | 32px | Kommentar-Avatare, Chips |
|
|
122
|
+
| `md` | 40px | Standard Avatar |
|
|
123
|
+
| `lg` | 48px | Profil-Header |
|
|
124
|
+
| `xl` | 64px | Profilseite, Detailansicht |
|
|
125
|
+
| `2xl` | 96px | Große Profilseite |
|
|
126
|
+
|
|
127
|
+
### Regeln
|
|
128
|
+
|
|
129
|
+
- Border-Radius: `radius-full` (rund)
|
|
130
|
+
- Fallback-Initials: 1–2 Buchstaben, konsistente Farb-Zuweisung (z.B. Hash des Namens)
|
|
131
|
+
- Bild: `alt`-Attribut = Nutzername
|
|
132
|
+
- Avatar-Group (mehrere): überlappend, max. 4 + "+N" Anzeige
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Pattern: Feedback & Status-Kommunikation
|
|
2
|
+
|
|
3
|
+
## Überblick
|
|
4
|
+
|
|
5
|
+
| Pattern | Wann einsetzen | Persistent? | Unterbrechend? |
|
|
6
|
+
|---------------|----------------------------------------------------|-------------|----------------|
|
|
7
|
+
| Toast/Snackbar| Kurze Bestätigung, nicht kritisch | Nein (3–5s) | Nein |
|
|
8
|
+
| Alert-Banner | Wichtige Info auf Page-Ebene, kein sofortiges Handeln | Ja (manuell) | Nein |
|
|
9
|
+
| Modal | Bestätigung nötig, kritische Entscheidung | Ja | Ja |
|
|
10
|
+
| Inline-Error | Formularfehler, kontextbezogene Fehler | Ja | Nein |
|
|
11
|
+
| Empty State | Kein Inhalt vorhanden (noch nicht oder nach Filter)| Ja | Nein |
|
|
12
|
+
| Skeleton | Inhalt lädt, Struktur bekannt | Nein | Nein |
|
|
13
|
+
| Spinner | Kurze unbekannte Ladedauer | Nein | Optional |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Toast / Snackbar
|
|
18
|
+
|
|
19
|
+
### Verwendung
|
|
20
|
+
|
|
21
|
+
Nach erfolgreichen Aktionen (Speichern, Löschen, Versenden) die keine weitere Bestätigung brauchen.
|
|
22
|
+
|
|
23
|
+
### Aufbau
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
[Icon] [Message] [Action (optional)] [Close]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Regeln
|
|
30
|
+
|
|
31
|
+
- Position: Unten rechts (Desktop), unten zentriert (Mobile)
|
|
32
|
+
- Autohide: 4–5 Sekunden bei Info/Success, Fehler-Toasts manuell schließen
|
|
33
|
+
- Max. 3 gleichzeitig sichtbar – ältere schieben nach oben
|
|
34
|
+
- Varianten: `success`, `error`, `warning`, `info`
|
|
35
|
+
- Klickbare Aktion: max. 1 (z.B. "Rückgängig"), kurzer Text
|
|
36
|
+
|
|
37
|
+
### Hintergrundfarben
|
|
38
|
+
|
|
39
|
+
| Variante | Hintergrund | Icon-Farbe |
|
|
40
|
+
|-----------|---------------------|---------------------|
|
|
41
|
+
| success | `color-neutral-900` | `color-success-500` |
|
|
42
|
+
| error | `color-error-700` | `color-neutral-0` |
|
|
43
|
+
| warning | `color-warning-500` | `color-neutral-900` |
|
|
44
|
+
| info | `color-neutral-900` | `color-primary-300` |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Alert-Banner
|
|
49
|
+
|
|
50
|
+
### Verwendung
|
|
51
|
+
|
|
52
|
+
Für wichtige Informationen auf Seiten-Ebene: Systemwarnungen, Hinweise die für alle Nutzer relevant sind, Bestätigungen nach Redirect.
|
|
53
|
+
|
|
54
|
+
### Aufbau
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
[Icon] [Titel (optional)] [Beschreibung] [Aktion (optional)] [Close (optional)]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Regeln
|
|
61
|
+
|
|
62
|
+
- Oben auf der Seite, direkt unter dem Header
|
|
63
|
+
- Nicht zu viele gleichzeitig – max. 1 kritisches + 1 informationales Banner
|
|
64
|
+
- Varianten: `success`, `error`, `warning`, `info`
|
|
65
|
+
- Schließbar (X-Button) außer bei kritischen Systemmeldungen
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Modal / Dialog
|
|
70
|
+
|
|
71
|
+
### Verwendung
|
|
72
|
+
|
|
73
|
+
- Bestätigungen für irreversible Aktionen (Löschen, Publishen)
|
|
74
|
+
- Komplexere Formulare die aus dem Kontext herausgelöst werden müssen
|
|
75
|
+
- Lightboxes / Medien-Ansichten
|
|
76
|
+
|
|
77
|
+
### Regeln
|
|
78
|
+
|
|
79
|
+
- Fokus: wird beim Öffnen in das Modal gesetzt (erstes interaktives Element)
|
|
80
|
+
- Focus-Trap: Tab navigiert nur innerhalb des Modals
|
|
81
|
+
- Schließen: ESC-Taste, X-Button, optional Klick außerhalb (nicht bei kritischen Modals)
|
|
82
|
+
- Beim Schließen: Fokus kehrt zum auslösenden Element zurück
|
|
83
|
+
- Backdrop: semi-transparentes Overlay (`rgba(0,0,0,0.5)`)
|
|
84
|
+
- Max-Breite: 480px (small), 640px (default), 800px (large)
|
|
85
|
+
- Mobile: Drawer von unten (full width, 90vh max)
|
|
86
|
+
|
|
87
|
+
### Bestätigungs-Modals (Danger)
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
[Titel: "X löschen?"]
|
|
91
|
+
[Erklärung: "Dies kann nicht rückgängig gemacht werden."]
|
|
92
|
+
[Abbrechen] [Löschen]
|
|
93
|
+
Secondary Danger
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Empty State
|
|
99
|
+
|
|
100
|
+
### Verwendung
|
|
101
|
+
|
|
102
|
+
Wenn ein Listenbereich / Tabelle / Dashboard-Widget keine Inhalte hat – entweder weil noch nichts erstellt wurde oder der aktuelle Filter keine Treffer liefert.
|
|
103
|
+
|
|
104
|
+
### Aufbau
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
[Illustration oder Icon]
|
|
108
|
+
[Titel: "Noch keine [Objekte]"]
|
|
109
|
+
[Beschreibung: Was der Nutzer tun kann]
|
|
110
|
+
[Primäraktion: z.B. "Ersten X erstellen"]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Regeln
|
|
114
|
+
|
|
115
|
+
- Immer eine mögliche Nächste-Aktion anbieten (wenn möglich)
|
|
116
|
+
- Bei leerem Filter: "Filter zurücksetzen" als Aktion
|
|
117
|
+
- Icon/Illustration: passend zum Kontext, nicht generisch
|
|
118
|
+
- Kein "Keine Daten gefunden" – erkläre WAS fehlt und WAS der User tun kann
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Skeleton Loader
|
|
123
|
+
|
|
124
|
+
### Verwendung
|
|
125
|
+
|
|
126
|
+
Wenn die Struktur des Inhalts bekannt ist und das Laden länger als 300ms dauert.
|
|
127
|
+
|
|
128
|
+
### Regeln
|
|
129
|
+
|
|
130
|
+
- Zeigt die Form des zukünftigen Inhalts als graue Platzhalter-Blöcke
|
|
131
|
+
- Animierter Shimmer-Effekt (gradient sweep) – aber `prefers-reduced-motion` beachten
|
|
132
|
+
- Für Text: Blöcke in variierender Breite (nicht alle gleich lang)
|
|
133
|
+
- Für Cards: Card-Umriss mit Platzhaltern für Bild, Titel, Text
|
|
134
|
+
- Kein Skeleton länger als 10 Sekunden – danach Error State
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Ladezustand (Spinner / Progress)
|
|
139
|
+
|
|
140
|
+
| Typ | Wann |
|
|
141
|
+
|-----------------|---------------------------------------------------|
|
|
142
|
+
| Inline Spinner | Button-Loading, kurze In-Component Aktionen |
|
|
143
|
+
| Page Spinner | Seitenübergreifende Ladeoperationen (selten) |
|
|
144
|
+
| Progress Bar | Upload, Prozesse mit bekannter Dauer |
|
|
145
|
+
| Skeleton | Inhalt lädt, Struktur bekannt |
|
|
146
|
+
|
|
147
|
+
- Page Spinner: Overlay mit Backdrop, zentrierter Spinner – NUR wenn wirklich nötig
|
|
148
|
+
- Spinner-Größen: 16px (inline), 24px (component), 40px (page-level)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Pattern: Formulare
|
|
2
|
+
|
|
3
|
+
## Grundprinzipien
|
|
4
|
+
|
|
5
|
+
- Ein Formular = eine Aufgabe (kein Mega-Form mit allem auf einmal)
|
|
6
|
+
- Labels immer sichtbar – kein Placeholder als Label-Ersatz
|
|
7
|
+
- Fehler inline, direkt bei dem Feld das betroffen ist
|
|
8
|
+
- Primäraktion am Ende, Abbrechen links davon (oder als Ghost-Button)
|
|
9
|
+
|
|
10
|
+
## Formular-Aufbau
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
[Form-Header] ← Optional: Titel + Kurzbeschreibung was der User tun wird
|
|
14
|
+
[Pflichtfeld-Hinweis] ← "* Pflichtfeld" – einmalig, oben
|
|
15
|
+
[Field-Groups] ← Zusammengehörige Felder gruppiert (optional mit Überschrift)
|
|
16
|
+
[Form-Field]
|
|
17
|
+
[Label] * ← <label> mit for-Attribut
|
|
18
|
+
[Helper-Text] ← Optional, kurze Erklärung (max. 1 Satz)
|
|
19
|
+
[Input-Komponente]
|
|
20
|
+
[Error-Message] ← Nur bei Fehler, aria-live="polite"
|
|
21
|
+
[Form-Actions] ← Primär-Button + Abbrechen/Zurück
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Feldbreiten
|
|
25
|
+
|
|
26
|
+
| Typ | Breite | Beispiel |
|
|
27
|
+
|------------------|--------------------------|-----------------------------------|
|
|
28
|
+
| Voller Block | 100% | Nachricht, Notizen, lange Felder |
|
|
29
|
+
| Halbe Breite | ~50% | Vorname + Nachname nebeneinander |
|
|
30
|
+
| Drittel / Viertel| ~33% / ~25% | PLZ, Hausnummer |
|
|
31
|
+
| Auto | Passt sich Inhalt an | Kurze Codes, Einheiten |
|
|
32
|
+
|
|
33
|
+
Auf Mobile: immer 100% Breite.
|
|
34
|
+
|
|
35
|
+
## Validierung
|
|
36
|
+
|
|
37
|
+
### Wann validieren?
|
|
38
|
+
|
|
39
|
+
| Zeitpunkt | Empfehlung |
|
|
40
|
+
|-----------------|-----------------------------------------------------------------|
|
|
41
|
+
| On Submit | Immer – zeigt alle Fehler auf einmal nach dem Absenden |
|
|
42
|
+
| On Blur | Für Format-Validierung (E-Mail, Datum) – nicht für Pflichtfelder|
|
|
43
|
+
| On Input | Nur für Passwort-Stärke oder Zeichenzähler – nicht für Fehler |
|
|
44
|
+
|
|
45
|
+
### Fehlermeldungen
|
|
46
|
+
|
|
47
|
+
- Spezifisch: "Bitte gültige E-Mail-Adresse eingeben (z.B. name@firma.de)"
|
|
48
|
+
- Nicht: "Ungültige Eingabe" oder "Fehler"
|
|
49
|
+
- Auf Submit: Fokus auf erstes Fehler-Feld springen (scroll + focus)
|
|
50
|
+
- Globale Fehler (Server-Fehler): Alert-Banner über dem Formular
|
|
51
|
+
|
|
52
|
+
## Mehrstufige Formulare (Wizard)
|
|
53
|
+
|
|
54
|
+
- Fortschrittsanzeige: Step-Indicator oben (1 von 3, 2 von 3 ...)
|
|
55
|
+
- Jeder Step: eigene Validierung vor dem Weiter-Klick
|
|
56
|
+
- Navigation: Zurück-Button behält Eingaben aus vorherigen Steps
|
|
57
|
+
- Letzter Step: Zusammenfassung vor dem finalen Absenden (optional)
|
|
58
|
+
|
|
59
|
+
## Spezielle Felder
|
|
60
|
+
|
|
61
|
+
### Passwort-Felder
|
|
62
|
+
|
|
63
|
+
- Immer Toggle für Sichtbarkeit (Eye-Icon rechts im Feld)
|
|
64
|
+
- Anforderungen: sichtbar als Checkliste (nicht erst nach Fehler)
|
|
65
|
+
- Stärken-Indikator: Progressbar, nicht nur Text
|
|
66
|
+
|
|
67
|
+
### File Upload
|
|
68
|
+
|
|
69
|
+
- Drag & Drop + Klick-Alternative
|
|
70
|
+
- Erlaubte Dateitypen und Maximalgröße anzeigen (nicht erst als Fehler)
|
|
71
|
+
- Hochgeladene Dateien: Dateiname + Lösch-Button sichtbar
|
|
72
|
+
- Fortschrittsbalken bei größeren Uploads
|
|
73
|
+
|
|
74
|
+
### Datum / Uhrzeit
|
|
75
|
+
|
|
76
|
+
- DatePicker-Komponente, kein manuelles Texteingabe-Datum-Format
|
|
77
|
+
- Wenn Range: Start + Ende visuell als zusammengehörig kennzeichnen
|
|
78
|
+
- Vergangene/gesperrte Daten: im Picker disabled, nicht nur als Validierungsfehler
|
|
79
|
+
|
|
80
|
+
## Formular-Aktionen
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
[Abbrechen/Zurück] [Primäraktion]
|
|
84
|
+
Ghost-Button Primary-Button
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- Abbrechen links, Primäraktion rechts (westliche Konvention)
|
|
88
|
+
- Abbrechen: fragt nach ungespeicherten Änderungen (Dialog) – wenn Daten verloren gehen
|
|
89
|
+
- Primär-Button: Loading-Zustand beim Absenden, kein Doppelklick möglich
|
|
90
|
+
- Destruktive Aktionen (Löschen, Unwiderrufliches): Danger-Button + Bestätigungsdialog
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Pattern: Navigation
|
|
2
|
+
|
|
3
|
+
## Globale Navigation (Header / Top-Nav)
|
|
4
|
+
|
|
5
|
+
### Aufbau
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
[Header-Wrapper] ← sticky, z-index über Content
|
|
9
|
+
[Logo / Brand] ← Links, immer sichtbar, klickbar = Home
|
|
10
|
+
[Primary Nav] ← Horizontale Links (Desktop) oder Hamburger (Mobile)
|
|
11
|
+
[Secondary Actions] ← Suche, Notifications, User-Avatar/Menu
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Regeln
|
|
15
|
+
|
|
16
|
+
- Aktiver Navigationspunkt: `color-primary-500` Unterstrich oder Hintergrund-Tint
|
|
17
|
+
- Max. 5–7 Hauptnavigationspunkte – mehr → Mega-Menu oder Sidebar
|
|
18
|
+
- Mobile: Hamburger-Icon (3 Linien), öffnet Drawer von links oder oben
|
|
19
|
+
- Skip-Navigation-Link: erster Element im DOM (für Keyboard/Screen Reader)
|
|
20
|
+
- Sticky Header: `shadow-sticky` beim Scrollen aktivieren
|
|
21
|
+
|
|
22
|
+
### Aktiver Zustand
|
|
23
|
+
|
|
24
|
+
| Element | Visual |
|
|
25
|
+
|-----------------|-------------------------------------------------|
|
|
26
|
+
| Link | `color-primary-600` + Unterstrichen oder Tint |
|
|
27
|
+
| Icon-Tab | Gefülltes Icon + `color-primary-500` Label |
|
|
28
|
+
| Sidebar-Item | `color-bg-muted` Hintergrund + `color-primary-600` Text |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Sidebar-Navigation
|
|
33
|
+
|
|
34
|
+
### Verwendung
|
|
35
|
+
|
|
36
|
+
Für Anwendungen mit vielen Bereichen oder komplexer Hierarchie.
|
|
37
|
+
|
|
38
|
+
### Aufbau
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
[Sidebar-Wrapper] ← Feste Breite: 240–280px; collapsible auf 64px
|
|
42
|
+
[App Logo / Name]
|
|
43
|
+
[Navigation Groups]
|
|
44
|
+
[Group Label] ← Optional, Uppercase, text-xs, color-text-secondary
|
|
45
|
+
[Nav-Item] ← Icon + Label, aktiver Zustand
|
|
46
|
+
[Nav-Item (mit Sub-Items)] ← Aufklappbar (Accordion)
|
|
47
|
+
[Bottom-Section] ← Settings, Logout, User-Info
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Regeln
|
|
51
|
+
|
|
52
|
+
- Collapsible: Im Collapsed-Zustand nur Icons mit Tooltip
|
|
53
|
+
- Sub-Navigation: Max. 1 Ebene Tiefe in der Sidebar
|
|
54
|
+
- Scrollbar: Nur wenn mehr Items als sichtbare Höhe (overflow-y: auto)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Breadcrumb
|
|
59
|
+
|
|
60
|
+
### Verwendung
|
|
61
|
+
|
|
62
|
+
Bei tiefen Hierarchien (ab 3 Ebenen). Nicht für flache Navigation.
|
|
63
|
+
|
|
64
|
+
### Aufbau
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
[Home] / [Kategorie] / [Aktuelle Seite]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Regeln
|
|
71
|
+
|
|
72
|
+
- Trennzeichen: `/` oder `›` – konsistent
|
|
73
|
+
- Aktuelle Seite: Nicht klickbar, `color-text-secondary`
|
|
74
|
+
- Eltern-Seiten: Klickbar, `color-primary-600`
|
|
75
|
+
- Mobil: Nur 1–2 Levels anzeigen + "..." für ausgeblendete
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Tab-Navigation
|
|
80
|
+
|
|
81
|
+
### Verwendung
|
|
82
|
+
|
|
83
|
+
Für die Navigation zwischen gleichwertigen Content-Bereichen innerhalb einer Seite oder eines Panels.
|
|
84
|
+
|
|
85
|
+
### Regeln
|
|
86
|
+
|
|
87
|
+
- Max. 5–6 Tabs sichtbar – bei mehr: scrollbar oder Overflow-Dropdown
|
|
88
|
+
- Aktiver Tab: Unterstrich (`color-primary-500`, 2px) + `color-primary-600` Text
|
|
89
|
+
- Tab-Panel: `role="tabpanel"`, Tab: `role="tab"`, Wrapper: `role="tablist"`
|
|
90
|
+
- Keyboard: Pfeiltasten wechseln zwischen Tabs, Enter/Space aktiviert
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Back-Navigation
|
|
95
|
+
|
|
96
|
+
### Regeln
|
|
97
|
+
|
|
98
|
+
- "<- Zurück" nur wenn nicht aus der Hauptnavigation erreichbar
|
|
99
|
+
- Immer expliziter Linktext, nicht nur ein Zurück-Pfeil (Screen Reader!)
|
|
100
|
+
- Navigiert zur vorherigen Seite (nicht Browser-Back, da ggf. abweichender State)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Screen-Referenzen
|
|
2
|
+
|
|
3
|
+
Hier kommen Figma-Exports oder Screenshots deines Design Systems als visuelle Referenz für die Agents.
|
|
4
|
+
|
|
5
|
+
## Ordner-Struktur
|
|
6
|
+
|
|
7
|
+
Lege Screens nach User-Flows / Bereichen in Unterordnern ab:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
screens/
|
|
11
|
+
onboarding/
|
|
12
|
+
01-landing.png
|
|
13
|
+
02-registration.png
|
|
14
|
+
03-email-verification.png
|
|
15
|
+
dashboard/
|
|
16
|
+
01-overview.png
|
|
17
|
+
02-empty-state.png
|
|
18
|
+
[feature-name]/
|
|
19
|
+
01-list.png
|
|
20
|
+
02-detail.png
|
|
21
|
+
03-create-form.png
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Benennungs-Konvention
|
|
25
|
+
|
|
26
|
+
- Numerisches Präfix für die Reihenfolge: `01-`, `02-` ...
|
|
27
|
+
- Beschreibender Name: was ist auf dem Screen zu sehen?
|
|
28
|
+
- Kein CamelCase, kein Leerzeichen: `kebab-case.png`
|
|
29
|
+
|
|
30
|
+
## Dateiformat
|
|
31
|
+
|
|
32
|
+
- **PNG bevorzugt** – verlustfreie Qualität für UI-Details
|
|
33
|
+
- **JPG** – akzeptabel für bildlastige Screens
|
|
34
|
+
- Mindestauflösung: 1440px Breite für Desktop-Screens
|
|
35
|
+
- Mobile-Screens: 375px oder 390px Breite
|
|
36
|
+
|
|
37
|
+
## Was die Agents damit machen
|
|
38
|
+
|
|
39
|
+
- `/red:proto-ux` liest die Screens als visuelle Referenz für User Flows und Komponentenstruktur
|
|
40
|
+
- `frontend-developer` nutzt Screens als Implementierungs-Referenz
|
|
41
|
+
- `ux-reviewer` vergleicht implementierte Screens mit den Referenz-Screens
|
|
42
|
+
|
|
43
|
+
## Hinweis
|
|
44
|
+
|
|
45
|
+
Screens sind **Referenz**, kein Pixel-Perfect-Vorgabe. Die Agents sollen die Struktur, Hierarchie und das Layout verstehen – nicht jeden Pixel nachbauen. Abweichungen in der technischen Umsetzung sind okay, solange sie dem Design-Prinzip folgen.
|