@the-bearded-bear/claude-craft 8.8.1 → 8.8.2
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/Dev/i18n/de/Angular/commands/check-compliance.md +218 -168
- package/Dev/i18n/de/Common/agents/refactoring-specialist.md +146 -69
- package/Dev/i18n/de/Common/commands/add-technology.md +166 -68
- package/Dev/i18n/de/Common/commands/setup-ci.md +216 -33
- package/Dev/i18n/de/Laravel/commands/check-compliance.md +223 -115
- package/Dev/i18n/de/Python/checklists/new-feature.md +319 -44
- package/Dev/i18n/de/React/rules/02-architecture.md +483 -322
- package/Dev/i18n/de/React/rules/03-coding-standards.md +584 -368
- package/Dev/i18n/de/Symfony/commands/check-compliance.md +186 -114
- package/Dev/i18n/de/Symfony/rules/07-testing-symfony.md +679 -10
- package/Dev/i18n/de/UIUX/commands/a11y-component.md +284 -26
- package/Dev/i18n/de/UIUX/commands/design-tokens.md +199 -35
- package/Dev/i18n/de/UIUX/commands/user-flow.md +179 -16
- package/Dev/i18n/de/VueJS/commands/check-compliance.md +227 -102
- package/Dev/i18n/es/Angular/commands/check-compliance.md +217 -167
- package/Dev/i18n/es/Common/commands/add-technology.md +158 -60
- package/Dev/i18n/es/Laravel/commands/check-compliance.md +223 -115
- package/Dev/i18n/es/React/commands/check-testing.md +263 -169
- package/Dev/i18n/es/ReactNative/commands/check-testing.md +256 -198
- package/Dev/i18n/es/Symfony/commands/check-compliance.md +189 -117
- package/Dev/i18n/es/Symfony/commands/check-testing.md +301 -102
- package/Dev/i18n/es/Symfony/commands/migration-plan.md +267 -34
- package/Dev/i18n/es/UIUX/commands/a11y-component.md +274 -16
- package/Dev/i18n/es/UIUX/commands/design-tokens.md +186 -22
- package/Dev/i18n/es/UIUX/commands/user-flow.md +173 -10
- package/Dev/i18n/es/VueJS/commands/check-compliance.md +227 -102
- package/Dev/i18n/fr/Angular/commands/check-compliance.md +217 -167
- package/Dev/i18n/fr/Common/commands/ralph-run.md +138 -60
- package/Dev/i18n/fr/Laravel/commands/check-compliance.md +223 -115
- package/Dev/i18n/fr/React/commands/check-architecture.md +370 -53
- package/Dev/i18n/fr/React/commands/check-code-quality.md +454 -64
- package/Dev/i18n/fr/React/commands/check-testing.md +476 -102
- package/Dev/i18n/fr/Symfony/commands/check-compliance.md +188 -116
- package/Dev/i18n/fr/VueJS/commands/check-compliance.md +227 -102
- package/Dev/i18n/pt/Angular/commands/check-compliance.md +225 -175
- package/Dev/i18n/pt/Common/agents/ralph-conductor.md +211 -30
- package/Dev/i18n/pt/Common/commands/add-technology.md +149 -51
- package/Dev/i18n/pt/Common/commands/ralph-run.md +239 -35
- package/Dev/i18n/pt/Flutter/commands/analyze-performance.md +331 -46
- package/Dev/i18n/pt/Flutter/commands/check-compliance.md +234 -29
- package/Dev/i18n/pt/Flutter/commands/generate-feature.md +526 -51
- package/Dev/i18n/pt/Flutter/commands/generate-widget.md +515 -27
- package/Dev/i18n/pt/Flutter/commands/golden-update.md +322 -46
- package/Dev/i18n/pt/Flutter/commands/localization-check.md +278 -37
- package/Dev/i18n/pt/Laravel/commands/check-compliance.md +212 -104
- package/Dev/i18n/pt/React/commands/accessibility-check.md +151 -42
- package/Dev/i18n/pt/React/commands/bundle-analyze.md +300 -25
- package/Dev/i18n/pt/React/commands/check-architecture.md +369 -34
- package/Dev/i18n/pt/React/commands/check-code-quality.md +440 -34
- package/Dev/i18n/pt/React/commands/check-compliance.md +232 -62
- package/Dev/i18n/pt/React/commands/check-security.md +370 -31
- package/Dev/i18n/pt/React/commands/check-testing.md +473 -43
- package/Dev/i18n/pt/React/commands/generate-component.md +454 -19
- package/Dev/i18n/pt/React/commands/generate-hook.md +425 -24
- package/Dev/i18n/pt/React/commands/storybook-story.md +520 -35
- package/Dev/i18n/pt/ReactNative/commands/app-size.md +358 -387
- package/Dev/i18n/pt/ReactNative/commands/check-code-quality.md +246 -75
- package/Dev/i18n/pt/ReactNative/commands/check-compliance.md +191 -85
- package/Dev/i18n/pt/ReactNative/commands/check-security.md +363 -115
- package/Dev/i18n/pt/ReactNative/commands/check-testing.md +269 -79
- package/Dev/i18n/pt/ReactNative/commands/generate-screen.md +491 -324
- package/Dev/i18n/pt/ReactNative/commands/native-module.md +539 -82
- package/Dev/i18n/pt/ReactNative/commands/store-prepare.md +429 -185
- package/Dev/i18n/pt/ReactNative/rules/02-architecture.md +1084 -31
- package/Dev/i18n/pt/Symfony/commands/check-compliance.md +195 -123
- package/Dev/i18n/pt/UIUX/commands/a11y-audit.md +208 -24
- package/Dev/i18n/pt/UIUX/commands/a11y-component.md +281 -23
- package/Dev/i18n/pt/UIUX/commands/design-tokens.md +197 -33
- package/Dev/i18n/pt/UIUX/commands/user-flow.md +183 -20
- package/Dev/i18n/pt/VueJS/commands/check-compliance.md +228 -103
- package/Dev/i18n/pt/Workflow/commands/analyze.md +147 -146
- package/Dev/i18n/pt/Workflow/commands/design.md +205 -204
- package/Dev/i18n/pt/Workflow/commands/implement.md +184 -184
- package/Project/i18n/de/Sprint/commands/dev.md +339 -86
- package/Project/i18n/es/Sprint/commands/dev.md +342 -91
- package/Project/i18n/pt/Sprint/commands/dev.md +343 -92
- package/bundles/cursor/.cursorrules +1 -1
- package/bundles/windsurf/.windsurfrules +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Barrierefreiheits-Spezifikation für Komponenten
|
|
3
3
|
argument-hint: [arguments]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Barrierefreiheits-Spezifikation für Komponenten
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Sie sind ein zertifizierter Barrierefreiheitsexperte. Sie müssen vollständige Barrierefreiheitsspezifikationen für eine UI-Komponente erstellen.
|
|
9
9
|
|
|
10
10
|
## Argumente
|
|
11
11
|
$ARGUMENTS
|
|
@@ -14,42 +14,52 @@ Argumente:
|
|
|
14
14
|
- Komponentenname
|
|
15
15
|
- (Optional) Typ: button, input, modal, dropdown, tabs, accordion, tooltip, etc.
|
|
16
16
|
|
|
17
|
-
Beispiel: `/uiux:a11y-component Modal` oder `/uiux:a11y-component "Datumsauswahl"
|
|
17
|
+
Beispiel: `/uiux:a11y-component Modal` oder `/uiux:a11y-component "Datumsauswahl" type:input`
|
|
18
18
|
|
|
19
19
|
## Plan-Modus
|
|
20
20
|
|
|
21
|
-
> **Der Plan-Modus ist obligatorisch.**
|
|
21
|
+
> **Der Plan-Modus ist obligatorisch.** Bevor Claude mit der Ausführung beginnt, aktiviert es den Plan-Modus, um den betroffenen Code zu analysieren, einen Implementierungsplan vorzuschlagen und auf Ihre Validierung zu warten, bevor Änderungen vorgenommen werden.
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## AUFTRAG
|
|
24
24
|
|
|
25
|
-
### Schritt 1: ARIA-
|
|
25
|
+
### Schritt 1: ARIA-Muster identifizieren
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
Konsultieren Sie den ARIA Authoring Practices Guide (APG) für das entsprechende Muster.
|
|
28
28
|
|
|
29
29
|
### Schritt 2: Spezifikation erstellen
|
|
30
30
|
|
|
31
31
|
```
|
|
32
32
|
══════════════════════════════════════════════════════════════
|
|
33
|
-
♿
|
|
33
|
+
♿ BARRIEREFREIHEITSSPEZIFIKATION: {KOMPONENTENNAME}
|
|
34
34
|
══════════════════════════════════════════════════════════════
|
|
35
35
|
|
|
36
36
|
Typ: {Button | Input | Dialog | Listbox | Tabs | ...}
|
|
37
|
-
APG-
|
|
38
|
-
Datum: {
|
|
37
|
+
APG-Muster: {Link zum offiziellen Muster}
|
|
38
|
+
Datum: {date}
|
|
39
39
|
|
|
40
40
|
──────────────────────────────────────────────────────────────
|
|
41
41
|
📋 HTML-SEMANTIK
|
|
42
42
|
──────────────────────────────────────────────────────────────
|
|
43
43
|
|
|
44
44
|
### Empfohlenes natives Element
|
|
45
|
+
|
|
45
46
|
```html
|
|
46
|
-
<!-- Immer
|
|
47
|
+
<!-- Immer das native Element bevorzugen -->
|
|
47
48
|
<{element} ...>
|
|
48
49
|
{Inhalt}
|
|
49
50
|
</{element}>
|
|
50
51
|
```
|
|
51
52
|
|
|
53
|
+
### Falls eine benutzerdefinierte Komponente erforderlich ist
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<div role="{role}" ...>
|
|
57
|
+
{Inhalt}
|
|
58
|
+
</div>
|
|
59
|
+
```
|
|
60
|
+
|
|
52
61
|
### Vollständige Struktur
|
|
62
|
+
|
|
53
63
|
```html
|
|
54
64
|
<!-- Vollständiges Beispiel mit ARIA -->
|
|
55
65
|
<div
|
|
@@ -58,6 +68,7 @@ Datum: {datum}
|
|
|
58
68
|
tabindex="0"
|
|
59
69
|
>
|
|
60
70
|
<span id="{id}-label">{Label}</span>
|
|
71
|
+
<div id="{id}-description">{Beschreibung}</div>
|
|
61
72
|
{Inhalt}
|
|
62
73
|
</div>
|
|
63
74
|
```
|
|
@@ -67,76 +78,323 @@ Datum: {datum}
|
|
|
67
78
|
──────────────────────────────────────────────────────────────
|
|
68
79
|
|
|
69
80
|
### Erforderliche Attribute
|
|
81
|
+
|
|
70
82
|
| Attribut | Wert | Wann | Beschreibung |
|
|
71
83
|
|----------|------|------|--------------|
|
|
72
|
-
| role | {role} | Immer (falls
|
|
84
|
+
| role | {role} | Immer (falls benutzerdefiniert) | Definiert den Typ |
|
|
73
85
|
| aria-label | "{text}" | Falls kein sichtbares Label | Barrierefreies Label |
|
|
86
|
+
| aria-labelledby | "{id}" | Falls sichtbares Label | Verweis auf Label |
|
|
74
87
|
|
|
75
88
|
### Bedingte Attribute
|
|
89
|
+
|
|
76
90
|
| Attribut | Wert | Wann | Beschreibung |
|
|
77
91
|
|----------|------|------|--------------|
|
|
78
|
-
| aria-
|
|
79
|
-
| aria-
|
|
92
|
+
| aria-describedby | "{id}" | Falls Beschreibung vorhanden | Verweis auf Beschreibung |
|
|
93
|
+
| aria-expanded | "true"/"false" | Falls erweiterbar | Geöffnet/geschlossen-Zustand |
|
|
94
|
+
| aria-controls | "{id}" | Falls anderes Element gesteuert wird | ID des gesteuerten Elements |
|
|
95
|
+
| aria-owns | "{id}" | Falls separates DOM | Eltern-Kind-Beziehung |
|
|
96
|
+
| aria-haspopup | "dialog"/"menu"/"listbox" | Falls Popup vorhanden | Popup-Typ |
|
|
97
|
+
| aria-pressed | "true"/"false" | Falls Umschalter | Gedrückt-Zustand |
|
|
98
|
+
| aria-selected | "true"/"false" | Falls Auswahl | Ausgewählt-Zustand |
|
|
99
|
+
| aria-checked | "true"/"false"/"mixed" | Falls Kontrollkästchen | Aktiviert-Zustand |
|
|
100
|
+
| aria-disabled | "true" | Falls deaktiviert | Deaktiviert-Zustand |
|
|
101
|
+
| aria-invalid | "true" | Falls Fehler | Ungültig-Zustand |
|
|
102
|
+
| aria-required | "true" | Falls Pflichtfeld | Pflichtfeld |
|
|
103
|
+
| aria-busy | "true" | Falls Laden | In Bearbeitung |
|
|
104
|
+
| aria-live | "polite"/"assertive" | Falls dynamisch | Änderung ankündigen |
|
|
105
|
+
| aria-atomic | "true" | Mit aria-live | Alles ankündigen |
|
|
106
|
+
|
|
107
|
+
### Zustände nach Interaktion
|
|
108
|
+
|
|
109
|
+
| Zustand | ARIA-Attribute |
|
|
110
|
+
|---------|----------------|
|
|
111
|
+
| Standard | {Basisattribute} |
|
|
112
|
+
| Hover | Keine ARIA-Änderung |
|
|
113
|
+
| Fokus | Keine ARIA-Änderung |
|
|
114
|
+
| Erweitert | aria-expanded="true" |
|
|
115
|
+
| Eingeklappt | aria-expanded="false" |
|
|
116
|
+
| Ausgewählt | aria-selected="true" |
|
|
117
|
+
| Deaktiviert | aria-disabled="true" |
|
|
118
|
+
| Wird geladen | aria-busy="true" |
|
|
119
|
+
| Fehler | aria-invalid="true", aria-errormessage="{id}" |
|
|
80
120
|
|
|
81
121
|
──────────────────────────────────────────────────────────────
|
|
82
122
|
⌨️ TASTATURNAVIGATION
|
|
83
123
|
──────────────────────────────────────────────────────────────
|
|
84
124
|
|
|
125
|
+
### Haupttasten
|
|
126
|
+
|
|
85
127
|
| Taste | Aktion | Detail |
|
|
86
128
|
|-------|--------|--------|
|
|
87
|
-
| Tab | Fokus auf Komponente | Betritt Komponente |
|
|
129
|
+
| Tab | Fokus auf Komponente | Betritt die Komponente |
|
|
130
|
+
| Shift+Tab | Vorheriger Fokus | Verlässt die Komponente |
|
|
88
131
|
| Enter | Aktivieren | Primäre Aktion |
|
|
89
|
-
| Space | Aktivieren (
|
|
132
|
+
| Space | Aktivieren (Umschalten) | Für Umschalter-Schaltflächen |
|
|
90
133
|
| Escape | Schließen/Abbrechen | Falls Popup/Modal |
|
|
91
|
-
|
|
|
134
|
+
| ↑ Pfeil oben | Vorheriges Element | Listennavigation |
|
|
135
|
+
| ↓ Pfeil unten | Nächstes Element | Listennavigation |
|
|
136
|
+
| ← Pfeil links | Vorheriges Element (horizontal) | Reiter, Schieberegler |
|
|
137
|
+
| → Pfeil rechts | Nächstes Element (horizontal) | Reiter, Schieberegler |
|
|
138
|
+
| Home | Erstes Element | Schnellnavigation |
|
|
139
|
+
| End | Letztes Element | Schnellnavigation |
|
|
140
|
+
|
|
141
|
+
### Fokusverwaltung
|
|
142
|
+
|
|
143
|
+
| Situation | Verhalten |
|
|
144
|
+
|-----------|-----------|
|
|
145
|
+
| Öffnen | Fokus auf {erstes fokussierbares Element} |
|
|
146
|
+
| Schließen | Fokus kehrt zu {auslösendes Element} zurück |
|
|
147
|
+
| Interne Navigation | Wandernder tabindex ODER aria-activedescendant |
|
|
148
|
+
| Fokus-Trap | {Ja bei Modal / Nein bei Dropdown} |
|
|
149
|
+
|
|
150
|
+
### Wandernder tabindex (falls zutreffend)
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<!-- Immer nur ein fokussierbares Element gleichzeitig -->
|
|
154
|
+
<div role="tablist">
|
|
155
|
+
<button role="tab" tabindex="0" aria-selected="true">Reiter 1</button>
|
|
156
|
+
<button role="tab" tabindex="-1" aria-selected="false">Reiter 2</button>
|
|
157
|
+
<button role="tab" tabindex="-1" aria-selected="false">Reiter 3</button>
|
|
158
|
+
</div>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
──────────────────────────────────────────────────────────────
|
|
162
|
+
🎯 SICHTBARER FOKUS
|
|
163
|
+
──────────────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
### Erforderlicher Stil (WCAG 2.4.11 AAA)
|
|
166
|
+
|
|
167
|
+
```css
|
|
168
|
+
.{komponente}:focus-visible {
|
|
169
|
+
/* Sichtbare Umrandung */
|
|
170
|
+
outline: 2px solid var(--color-focus);
|
|
171
|
+
outline-offset: 2px;
|
|
172
|
+
|
|
173
|
+
/* Kontrastverhältnis ≥ 3:1 */
|
|
174
|
+
/* Fokusfläche ≥ sichtbarer Umfang */
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Zurücksetzen bei Mausbedienung */
|
|
178
|
+
.{komponente}:focus:not(:focus-visible) {
|
|
179
|
+
outline: none;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Überprüfungen
|
|
184
|
+
|
|
185
|
+
| Kriterium | Wert | Status |
|
|
186
|
+
|-----------|------|--------|
|
|
187
|
+
| Umrandungsdicke | ≥ 2px | ✅ |
|
|
188
|
+
| Umrandungskontrast | ≥ 3:1 | ✅ |
|
|
189
|
+
| Sichtbare Fläche | ≥ Umfang | ✅ |
|
|
190
|
+
| Sichtbar auf allen Hintergründen | Ja | ✅ |
|
|
92
191
|
|
|
93
192
|
──────────────────────────────────────────────────────────────
|
|
94
193
|
🔊 SCREENREADER-ANKÜNDIGUNGEN
|
|
95
194
|
──────────────────────────────────────────────────────────────
|
|
96
195
|
|
|
97
|
-
###
|
|
196
|
+
### Beim Eintreten (Fokus)
|
|
197
|
+
|
|
98
198
|
```
|
|
99
199
|
"{Label}, {Rolle}, {Zustand}"
|
|
200
|
+
|
|
100
201
|
Beispiele:
|
|
101
|
-
- "Absenden,
|
|
202
|
+
- "Absenden, Schaltfläche"
|
|
102
203
|
- "Hauptmenü, Menü, eingeklappt"
|
|
204
|
+
- "Name, Textfeld, Pflichtfeld"
|
|
205
|
+
- "Newsletter, Kontrollkästchen, nicht aktiviert"
|
|
103
206
|
```
|
|
104
207
|
|
|
105
|
-
### Während Interaktion
|
|
208
|
+
### Während der Interaktion
|
|
209
|
+
|
|
106
210
|
| Aktion | Ankündigung |
|
|
107
211
|
|--------|-------------|
|
|
108
212
|
| Erweiterung | "erweitert" / "eingeklappt" |
|
|
109
|
-
|
|
|
213
|
+
| Auswahl | "ausgewählt" |
|
|
214
|
+
| Umschalten | "ein" / "aus" |
|
|
215
|
+
| Laden | "Wird geladen" |
|
|
216
|
+
| Erfolg | "{Erfolgsmeldung}" |
|
|
217
|
+
| Fehler | "Fehler: {Meldung}" |
|
|
218
|
+
|
|
219
|
+
### Dynamischer Inhalt (aria-live)
|
|
220
|
+
|
|
221
|
+
```html
|
|
222
|
+
<!-- Höfliche Benachrichtigungen (nicht dringend) -->
|
|
223
|
+
<div aria-live="polite" aria-atomic="true">
|
|
224
|
+
{Toast-Nachricht}
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<!-- Dringende Benachrichtigungen (Fehler) -->
|
|
228
|
+
<div aria-live="assertive" aria-atomic="true">
|
|
229
|
+
{Fehlermeldung}
|
|
230
|
+
</div>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
──────────────────────────────────────────────────────────────
|
|
234
|
+
📏 KONTRAST (WCAG AAA)
|
|
235
|
+
──────────────────────────────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
### Text
|
|
238
|
+
|
|
239
|
+
| Typ | Erforderliches Verhältnis | Überprüfung |
|
|
240
|
+
|-----|--------------------------|-------------|
|
|
241
|
+
| Normaler Text (< 18px) | ≥ 7:1 | {Farbe} / {Hintergrund} = {Verhältnis} |
|
|
242
|
+
| Großer Text (≥ 18px oder 14px fett) | ≥ 4.5:1 | {Farbe} / {Hintergrund} = {Verhältnis} |
|
|
243
|
+
|
|
244
|
+
### UI-Elemente
|
|
245
|
+
|
|
246
|
+
| Element | Erforderliches Verhältnis | Überprüfung |
|
|
247
|
+
|---------|--------------------------|-------------|
|
|
248
|
+
| Rahmen | ≥ 3:1 | {Farbe} / {Hintergrund} = {Verhältnis} |
|
|
249
|
+
| Symbole | ≥ 3:1 | {Farbe} / {Hintergrund} = {Verhältnis} |
|
|
250
|
+
| Fokusumrandung | ≥ 3:1 | {Farbe} / {Hintergrund} = {Verhältnis} |
|
|
251
|
+
|
|
252
|
+
### Zustände
|
|
253
|
+
|
|
254
|
+
| Zustand | Kontrastüberprüfung |
|
|
255
|
+
|---------|---------------------|
|
|
256
|
+
| Standard | ✅ {Verhältnis} |
|
|
257
|
+
| Hover | ✅ {Verhältnis} |
|
|
258
|
+
| Fokus | ✅ {Verhältnis} |
|
|
259
|
+
| Deaktiviert | ⚠️ Nicht erforderlich, aber empfohlen |
|
|
110
260
|
|
|
111
261
|
──────────────────────────────────────────────────────────────
|
|
112
262
|
📐 TOUCH-ZIELE (WCAG 2.5.5 AAA)
|
|
113
263
|
──────────────────────────────────────────────────────────────
|
|
114
264
|
|
|
265
|
+
### Mindestabmessungen
|
|
266
|
+
|
|
115
267
|
| Kriterium | Wert | Status |
|
|
116
268
|
|-----------|------|--------|
|
|
117
|
-
| Mindestgröße | 44 × 44 CSS
|
|
269
|
+
| Mindestgröße | 44 × 44 CSS-Pixel | ✅/❌ |
|
|
118
270
|
| Abstand zwischen Zielen | ≥ 8px | ✅/❌ |
|
|
119
271
|
|
|
272
|
+
### Implementierung
|
|
273
|
+
|
|
274
|
+
```css
|
|
275
|
+
.{komponente} {
|
|
276
|
+
min-width: 44px;
|
|
277
|
+
min-height: 44px;
|
|
278
|
+
/* ODER Innenabstand, um 44px zu erreichen */
|
|
279
|
+
padding: 10px 16px; /* falls Texthöhe ~24px */
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* Symbol-Schaltflächen */
|
|
283
|
+
.{komponente}-icon {
|
|
284
|
+
width: 44px;
|
|
285
|
+
height: 44px;
|
|
286
|
+
display: flex;
|
|
287
|
+
align-items: center;
|
|
288
|
+
justify-content: center;
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
──────────────────────────────────────────────────────────────
|
|
293
|
+
🧪 DURCHZUFÜHRENDE TESTS
|
|
294
|
+
──────────────────────────────────────────────────────────────
|
|
295
|
+
|
|
296
|
+
### Automatisiert
|
|
297
|
+
|
|
298
|
+
- [ ] axe DevTools: 0 Verstöße
|
|
299
|
+
- [ ] Lighthouse Barrierefreiheit: 100/100
|
|
300
|
+
- [ ] ESLint jsx-a11y: 0 Fehler
|
|
301
|
+
|
|
302
|
+
### Manuell
|
|
303
|
+
|
|
304
|
+
- [ ] Vollständige Tastaturnavigation
|
|
305
|
+
- [ ] Sichtbarer Fokus bei jedem Schritt
|
|
306
|
+
- [ ] Keine Tastaturfalle
|
|
307
|
+
- [ ] Logische Fokusreihenfolge
|
|
308
|
+
|
|
309
|
+
### Screenreader
|
|
310
|
+
|
|
311
|
+
- [ ] VoiceOver (macOS/iOS): korrekte Ankündigungen
|
|
312
|
+
- [ ] NVDA (Windows): Listen-/Tabellennavigation
|
|
313
|
+
- [ ] TalkBack (Android): falls mobil
|
|
314
|
+
|
|
315
|
+
### Randfälle
|
|
316
|
+
|
|
317
|
+
- [ ] 400 % Zoom: kein Inhaltsverlust
|
|
318
|
+
- [ ] Hochkontrastmodus: sichtbar
|
|
319
|
+
- [ ] Reduzierte Bewegung: Animationen berücksichtigt
|
|
320
|
+
|
|
321
|
+
──────────────────────────────────────────────────────────────
|
|
322
|
+
💻 IMPLEMENTIERUNGSBEISPIEL
|
|
323
|
+
──────────────────────────────────────────────────────────────
|
|
324
|
+
|
|
325
|
+
```tsx
|
|
326
|
+
// {Component}.tsx
|
|
327
|
+
import { forwardRef, useId } from 'react';
|
|
328
|
+
|
|
329
|
+
interface {Component}Props {
|
|
330
|
+
label: string;
|
|
331
|
+
description?: string;
|
|
332
|
+
disabled?: boolean;
|
|
333
|
+
// ...weitere Props
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export const {Component} = forwardRef<HTML{Element}Element, {Component}Props>(
|
|
337
|
+
({ label, description, disabled, ...props }, ref) => {
|
|
338
|
+
const id = useId();
|
|
339
|
+
const descriptionId = description ? `${id}-description` : undefined;
|
|
340
|
+
|
|
341
|
+
return (
|
|
342
|
+
<{element}
|
|
343
|
+
ref={ref}
|
|
344
|
+
id={id}
|
|
345
|
+
role="{role}"
|
|
346
|
+
aria-label={label}
|
|
347
|
+
aria-describedby={descriptionId}
|
|
348
|
+
aria-disabled={disabled}
|
|
349
|
+
tabIndex={disabled ? -1 : 0}
|
|
350
|
+
{...props}
|
|
351
|
+
>
|
|
352
|
+
{/* Inhalt */}
|
|
353
|
+
|
|
354
|
+
{description && (
|
|
355
|
+
<span id={descriptionId} className="sr-only">
|
|
356
|
+
{description}
|
|
357
|
+
</span>
|
|
358
|
+
)}
|
|
359
|
+
</{element}>
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
{Component}.displayName = '{Component}';
|
|
365
|
+
```
|
|
366
|
+
|
|
120
367
|
──────────────────────────────────────────────────────────────
|
|
121
368
|
✅ VALIDIERUNGS-CHECKLISTE
|
|
122
369
|
──────────────────────────────────────────────────────────────
|
|
123
370
|
|
|
124
371
|
### Semantik
|
|
125
|
-
- [ ] Natives HTML-Element verwendet
|
|
126
|
-
- [ ] Korrekte ARIA-Rolle
|
|
372
|
+
- [ ] Natives HTML-Element verwendet, wenn möglich
|
|
373
|
+
- [ ] Korrekte ARIA-Rolle bei benutzerdefinierter Komponente
|
|
127
374
|
- [ ] Logische DOM-Struktur
|
|
128
375
|
|
|
129
376
|
### ARIA
|
|
130
377
|
- [ ] Erforderliche Attribute vorhanden
|
|
378
|
+
- [ ] Bedingte Attribute korrekt
|
|
131
379
|
- [ ] Keine ARIA-Überladung (nativ > ARIA)
|
|
132
380
|
|
|
133
381
|
### Tastatur
|
|
134
382
|
- [ ] Fokussierbar (passender tabindex)
|
|
135
|
-
- [ ] Alle Aktionen per Tastatur
|
|
383
|
+
- [ ] Alle Aktionen per Tastatur erreichbar
|
|
136
384
|
- [ ] Keine Tastaturfalle
|
|
137
385
|
- [ ] Konformer sichtbarer Fokus
|
|
138
386
|
|
|
387
|
+
### Ankündigungen
|
|
388
|
+
- [ ] Label wird bei Fokus angekündigt
|
|
389
|
+
- [ ] Zustände werden bei Änderung angekündigt
|
|
390
|
+
- [ ] Fehler mit aria-live assertive
|
|
391
|
+
|
|
139
392
|
### Kontrast
|
|
140
393
|
- [ ] Text ≥ 7:1 (AAA)
|
|
141
394
|
- [ ] UI ≥ 3:1
|
|
395
|
+
- [ ] Fokus ≥ 3:1
|
|
396
|
+
|
|
397
|
+
### Touch
|
|
398
|
+
- [ ] Ziele ≥ 44×44px
|
|
399
|
+
- [ ] Abstände ≥ 8px
|
|
142
400
|
```
|