real-prototypes-skill 2.0.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/.claude/skills/agent-browser-skill/SKILL.md +252 -0
- package/.claude/skills/real-prototypes-skill/.gitignore +188 -0
- package/.claude/skills/real-prototypes-skill/ACCESSIBILITY.md +668 -0
- package/.claude/skills/real-prototypes-skill/INSTALL.md +259 -0
- package/.claude/skills/real-prototypes-skill/LICENSE +21 -0
- package/.claude/skills/real-prototypes-skill/PUBLISH.md +310 -0
- package/.claude/skills/real-prototypes-skill/QUICKSTART.md +240 -0
- package/.claude/skills/real-prototypes-skill/README.md +442 -0
- package/.claude/skills/real-prototypes-skill/SKILL.md +329 -0
- package/.claude/skills/real-prototypes-skill/capture/capture-engine.js +1153 -0
- package/.claude/skills/real-prototypes-skill/capture/config.schema.json +170 -0
- package/.claude/skills/real-prototypes-skill/cli.js +596 -0
- package/.claude/skills/real-prototypes-skill/docs/TROUBLESHOOTING.md +278 -0
- package/.claude/skills/real-prototypes-skill/docs/schemas/capture-config.md +167 -0
- package/.claude/skills/real-prototypes-skill/docs/schemas/design-tokens.md +183 -0
- package/.claude/skills/real-prototypes-skill/docs/schemas/manifest.md +169 -0
- package/.claude/skills/real-prototypes-skill/examples/CLAUDE.md.example +73 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/CLAUDE.md +136 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/FEATURES.md +222 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/README.md +82 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/references/design-tokens.json +87 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/references/screenshots/homepage-viewport.png +0 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/references/screenshots/prototype-chatbot-final.png +0 -0
- package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/references/screenshots/prototype-fullpage-v2.png +0 -0
- package/.claude/skills/real-prototypes-skill/references/accessibility-fixes.md +298 -0
- package/.claude/skills/real-prototypes-skill/references/accessibility-report.json +253 -0
- package/.claude/skills/real-prototypes-skill/scripts/CAPTURE-ENHANCEMENTS.md +344 -0
- package/.claude/skills/real-prototypes-skill/scripts/IMPLEMENTATION-SUMMARY.md +517 -0
- package/.claude/skills/real-prototypes-skill/scripts/QUICK-START.md +229 -0
- package/.claude/skills/real-prototypes-skill/scripts/QUICKSTART-layout-analysis.md +148 -0
- package/.claude/skills/real-prototypes-skill/scripts/README-analyze-layout.md +407 -0
- package/.claude/skills/real-prototypes-skill/scripts/analyze-layout.js +880 -0
- package/.claude/skills/real-prototypes-skill/scripts/capture-platform.js +203 -0
- package/.claude/skills/real-prototypes-skill/scripts/comprehensive-capture.js +597 -0
- package/.claude/skills/real-prototypes-skill/scripts/create-manifest.js +338 -0
- package/.claude/skills/real-prototypes-skill/scripts/enterprise-pipeline.js +428 -0
- package/.claude/skills/real-prototypes-skill/scripts/extract-tokens.js +468 -0
- package/.claude/skills/real-prototypes-skill/scripts/full-site-capture.js +738 -0
- package/.claude/skills/real-prototypes-skill/scripts/generate-tailwind-config.js +296 -0
- package/.claude/skills/real-prototypes-skill/scripts/integrate-accessibility.sh +161 -0
- package/.claude/skills/real-prototypes-skill/scripts/manifest-schema.json +302 -0
- package/.claude/skills/real-prototypes-skill/scripts/setup-prototype.sh +167 -0
- package/.claude/skills/real-prototypes-skill/scripts/test-analyze-layout.js +338 -0
- package/.claude/skills/real-prototypes-skill/scripts/test-validation.js +307 -0
- package/.claude/skills/real-prototypes-skill/scripts/validate-accessibility.js +598 -0
- package/.claude/skills/real-prototypes-skill/scripts/validate-manifest.js +499 -0
- package/.claude/skills/real-prototypes-skill/scripts/validate-output.js +361 -0
- package/.claude/skills/real-prototypes-skill/scripts/validate-prerequisites.js +319 -0
- package/.claude/skills/real-prototypes-skill/scripts/verify-layout-analysis.sh +77 -0
- package/.claude/skills/real-prototypes-skill/templates/dashboard-widget.tsx.template +91 -0
- package/.claude/skills/real-prototypes-skill/templates/data-table.tsx.template +193 -0
- package/.claude/skills/real-prototypes-skill/templates/form-section.tsx.template +250 -0
- package/.claude/skills/real-prototypes-skill/templates/modal-dialog.tsx.template +239 -0
- package/.claude/skills/real-prototypes-skill/templates/nav-item.tsx.template +265 -0
- package/.claude/skills/real-prototypes-skill/validation/validation-engine.js +559 -0
- package/.env.example +74 -0
- package/LICENSE +21 -0
- package/README.md +444 -0
- package/bin/cli.js +319 -0
- package/package.json +59 -0
package/.claude/skills/real-prototypes-skill/examples/amazon-chatbot/references/design-tokens.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"colors": {
|
|
3
|
+
"primary": {
|
|
4
|
+
"orange": "#FF9900",
|
|
5
|
+
"orangeHover": "#FA8900",
|
|
6
|
+
"orangePressed": "#E47911"
|
|
7
|
+
},
|
|
8
|
+
"navbar": {
|
|
9
|
+
"dark": "#131921",
|
|
10
|
+
"darkHover": "#232F3E",
|
|
11
|
+
"subNav": "#232F3E"
|
|
12
|
+
},
|
|
13
|
+
"text": {
|
|
14
|
+
"primary": "#0F1111",
|
|
15
|
+
"secondary": "#565959",
|
|
16
|
+
"link": "#007185",
|
|
17
|
+
"linkHover": "#C7511F",
|
|
18
|
+
"white": "#FFFFFF",
|
|
19
|
+
"muted": "#555555"
|
|
20
|
+
},
|
|
21
|
+
"background": {
|
|
22
|
+
"white": "#FFFFFF",
|
|
23
|
+
"light": "#EAEDED",
|
|
24
|
+
"gray": "#F0F2F2",
|
|
25
|
+
"card": "#FFFFFF"
|
|
26
|
+
},
|
|
27
|
+
"button": {
|
|
28
|
+
"yellowGradientStart": "#FFD814",
|
|
29
|
+
"yellowGradientEnd": "#F7CA00",
|
|
30
|
+
"yellowHover": "#F0C14B",
|
|
31
|
+
"orangeGradientStart": "#FFA41C",
|
|
32
|
+
"orangeGradientEnd": "#FF8F00"
|
|
33
|
+
},
|
|
34
|
+
"border": {
|
|
35
|
+
"light": "#DDD",
|
|
36
|
+
"medium": "#CDCDCD",
|
|
37
|
+
"dark": "#949494",
|
|
38
|
+
"input": "#888888"
|
|
39
|
+
},
|
|
40
|
+
"status": {
|
|
41
|
+
"success": "#067D62",
|
|
42
|
+
"error": "#CC0C39",
|
|
43
|
+
"warning": "#C45500",
|
|
44
|
+
"info": "#007185"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"typography": {
|
|
48
|
+
"fontFamily": {
|
|
49
|
+
"primary": "Amazon Ember, Arial, sans-serif",
|
|
50
|
+
"fallback": "Arial, sans-serif"
|
|
51
|
+
},
|
|
52
|
+
"fontSize": {
|
|
53
|
+
"xs": "11px",
|
|
54
|
+
"sm": "12px",
|
|
55
|
+
"base": "13px",
|
|
56
|
+
"md": "14px",
|
|
57
|
+
"lg": "16px",
|
|
58
|
+
"xl": "18px",
|
|
59
|
+
"2xl": "21px",
|
|
60
|
+
"3xl": "28px"
|
|
61
|
+
},
|
|
62
|
+
"fontWeight": {
|
|
63
|
+
"normal": "400",
|
|
64
|
+
"medium": "500",
|
|
65
|
+
"bold": "700"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"spacing": {
|
|
69
|
+
"xs": "4px",
|
|
70
|
+
"sm": "8px",
|
|
71
|
+
"md": "12px",
|
|
72
|
+
"lg": "16px",
|
|
73
|
+
"xl": "20px",
|
|
74
|
+
"2xl": "24px"
|
|
75
|
+
},
|
|
76
|
+
"borderRadius": {
|
|
77
|
+
"sm": "3px",
|
|
78
|
+
"md": "4px",
|
|
79
|
+
"lg": "8px",
|
|
80
|
+
"pill": "20px"
|
|
81
|
+
},
|
|
82
|
+
"shadows": {
|
|
83
|
+
"card": "0 2px 5px 0 rgba(0,0,0,0.1)",
|
|
84
|
+
"dropdown": "0 2px 5px rgba(0,0,0,0.15)",
|
|
85
|
+
"modal": "0 4px 16px rgba(0,0,0,0.15)"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# Accessibility Fixes Documentation
|
|
2
|
+
|
|
3
|
+
**Generated:** 2026-01-26T18:27:12.020Z
|
|
4
|
+
**WCAG Level:** AA (2.1)
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
- **Total Files Analyzed:** 5
|
|
9
|
+
- **Total Issues Found:** 24
|
|
10
|
+
- **Total Fixes Applied:** 5
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. dashboard-widget.tsx.template
|
|
15
|
+
|
|
16
|
+
**File:** `.claude/skills/real-prototypes-skill/templates/dashboard-widget.tsx.template`
|
|
17
|
+
|
|
18
|
+
### Issues Found (4)
|
|
19
|
+
|
|
20
|
+
#### 1. MISSING ARIA LABEL
|
|
21
|
+
|
|
22
|
+
- **Severity:** error
|
|
23
|
+
- **Message:** button at line 58 missing aria-label or associated label
|
|
24
|
+
- **Element:** button
|
|
25
|
+
- **Line:** 58
|
|
26
|
+
|
|
27
|
+
#### 2. MISSING ARIA LABEL
|
|
28
|
+
|
|
29
|
+
- **Severity:** error
|
|
30
|
+
- **Message:** button at line 65 missing aria-label or associated label
|
|
31
|
+
- **Element:** button
|
|
32
|
+
- **Line:** 65
|
|
33
|
+
|
|
34
|
+
#### 3. MISSING ARIA LABEL
|
|
35
|
+
|
|
36
|
+
- **Severity:** error
|
|
37
|
+
- **Message:** button at line 83 missing aria-label or associated label
|
|
38
|
+
- **Element:** button
|
|
39
|
+
- **Line:** 83
|
|
40
|
+
|
|
41
|
+
#### 4. MISSING FOCUS INDICATOR
|
|
42
|
+
|
|
43
|
+
- **Severity:** error
|
|
44
|
+
- **Message:** No focus styles detected. Add focus:ring or focus-visible styles.
|
|
45
|
+
|
|
46
|
+
### Fixes Applied (1)
|
|
47
|
+
|
|
48
|
+
#### 1. ADD FOCUS STYLES
|
|
49
|
+
|
|
50
|
+
- **Description:** Add focus indicators to interactive elements
|
|
51
|
+
- **Implementation:** Add focus:ring-2 focus:ring-platform-primary focus:ring-offset-2 to buttons/links
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 2. data-table.tsx.template
|
|
56
|
+
|
|
57
|
+
**File:** `.claude/skills/real-prototypes-skill/templates/data-table.tsx.template`
|
|
58
|
+
|
|
59
|
+
### Issues Found (2)
|
|
60
|
+
|
|
61
|
+
#### 1. MISSING ARIA LABEL
|
|
62
|
+
|
|
63
|
+
- **Severity:** error
|
|
64
|
+
- **Message:** button at line 99 missing aria-label or associated label
|
|
65
|
+
- **Element:** button
|
|
66
|
+
- **Line:** 99
|
|
67
|
+
|
|
68
|
+
#### 2. MISSING FOCUS INDICATOR
|
|
69
|
+
|
|
70
|
+
- **Severity:** error
|
|
71
|
+
- **Message:** No focus styles detected. Add focus:ring or focus-visible styles.
|
|
72
|
+
|
|
73
|
+
### Fixes Applied (1)
|
|
74
|
+
|
|
75
|
+
#### 1. ADD FOCUS STYLES
|
|
76
|
+
|
|
77
|
+
- **Description:** Add focus indicators to interactive elements
|
|
78
|
+
- **Implementation:** Add focus:ring-2 focus:ring-platform-primary focus:ring-offset-2 to buttons/links
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 3. form-section.tsx.template
|
|
83
|
+
|
|
84
|
+
**File:** `.claude/skills/real-prototypes-skill/templates/form-section.tsx.template`
|
|
85
|
+
|
|
86
|
+
### Issues Found (6)
|
|
87
|
+
|
|
88
|
+
#### 1. COLOR CONTRAST
|
|
89
|
+
|
|
90
|
+
- **Severity:** warning
|
|
91
|
+
- **Message:** Found 1 color utilities. Manual contrast check recommended.
|
|
92
|
+
- **Colors:** text-red-500
|
|
93
|
+
|
|
94
|
+
#### 2. MISSING ARIA LABEL
|
|
95
|
+
|
|
96
|
+
- **Severity:** error
|
|
97
|
+
- **Message:** button at line 220 missing aria-label or associated label
|
|
98
|
+
- **Element:** button
|
|
99
|
+
- **Line:** 220
|
|
100
|
+
|
|
101
|
+
#### 3. MISSING ARIA LABEL
|
|
102
|
+
|
|
103
|
+
- **Severity:** error
|
|
104
|
+
- **Message:** button at line 230 missing aria-label or associated label
|
|
105
|
+
- **Element:** button
|
|
106
|
+
- **Line:** 230
|
|
107
|
+
|
|
108
|
+
#### 4. MISSING ARIA LABEL
|
|
109
|
+
|
|
110
|
+
- **Severity:** error
|
|
111
|
+
- **Message:** input at line 92 missing aria-label or associated label
|
|
112
|
+
- **Element:** input
|
|
113
|
+
- **Line:** 92
|
|
114
|
+
|
|
115
|
+
#### 5. MISSING ARIA LABEL
|
|
116
|
+
|
|
117
|
+
- **Severity:** error
|
|
118
|
+
- **Message:** input at line 117 missing aria-label or associated label
|
|
119
|
+
- **Element:** input
|
|
120
|
+
- **Line:** 117
|
|
121
|
+
|
|
122
|
+
#### 6. KEYBOARD NAVIGATION
|
|
123
|
+
|
|
124
|
+
- **Severity:** warning
|
|
125
|
+
- **Message:** Click handlers without keyboard handlers. Ensure keyboard accessibility.
|
|
126
|
+
|
|
127
|
+
### Fixes Applied (1)
|
|
128
|
+
|
|
129
|
+
#### 1. ADD KEYBOARD HANDLERS
|
|
130
|
+
|
|
131
|
+
- **Description:** Add keyboard event handlers
|
|
132
|
+
- **Implementation:** Add onKeyDown={(e) => e.key === "Enter" && handleClick()} to clickable elements
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4. modal-dialog.tsx.template
|
|
137
|
+
|
|
138
|
+
**File:** `.claude/skills/real-prototypes-skill/templates/modal-dialog.tsx.template`
|
|
139
|
+
|
|
140
|
+
### Issues Found (7)
|
|
141
|
+
|
|
142
|
+
#### 1. COLOR CONTRAST
|
|
143
|
+
|
|
144
|
+
- **Severity:** warning
|
|
145
|
+
- **Message:** Found 2 color utilities. Manual contrast check recommended.
|
|
146
|
+
- **Colors:** bg-red-600, bg-red-700
|
|
147
|
+
|
|
148
|
+
#### 2. MISSING ARIA LABEL
|
|
149
|
+
|
|
150
|
+
- **Severity:** error
|
|
151
|
+
- **Message:** button at line 99 missing aria-label or associated label
|
|
152
|
+
- **Element:** button
|
|
153
|
+
- **Line:** 99
|
|
154
|
+
|
|
155
|
+
#### 3. MISSING ARIA LABEL
|
|
156
|
+
|
|
157
|
+
- **Severity:** error
|
|
158
|
+
- **Message:** button at line 107 missing aria-label or associated label
|
|
159
|
+
- **Element:** button
|
|
160
|
+
- **Line:** 107
|
|
161
|
+
|
|
162
|
+
#### 4. MISSING ARIA LABEL
|
|
163
|
+
|
|
164
|
+
- **Severity:** error
|
|
165
|
+
- **Message:** button at line 181 missing aria-label or associated label
|
|
166
|
+
- **Element:** button
|
|
167
|
+
- **Line:** 181
|
|
168
|
+
|
|
169
|
+
#### 5. MISSING ARIA LABEL
|
|
170
|
+
|
|
171
|
+
- **Severity:** error
|
|
172
|
+
- **Message:** button at line 190 missing aria-label or associated label
|
|
173
|
+
- **Element:** button
|
|
174
|
+
- **Line:** 190
|
|
175
|
+
|
|
176
|
+
#### 6. MISSING ARIA LABEL
|
|
177
|
+
|
|
178
|
+
- **Severity:** error
|
|
179
|
+
- **Message:** button at line 211 missing aria-label or associated label
|
|
180
|
+
- **Element:** button
|
|
181
|
+
- **Line:** 211
|
|
182
|
+
|
|
183
|
+
#### 7. KEYBOARD NAVIGATION
|
|
184
|
+
|
|
185
|
+
- **Severity:** warning
|
|
186
|
+
- **Message:** Click handlers without keyboard handlers. Ensure keyboard accessibility.
|
|
187
|
+
|
|
188
|
+
### Fixes Applied (1)
|
|
189
|
+
|
|
190
|
+
#### 1. ADD KEYBOARD HANDLERS
|
|
191
|
+
|
|
192
|
+
- **Description:** Add keyboard event handlers
|
|
193
|
+
- **Implementation:** Add onKeyDown={(e) => e.key === "Enter" && handleClick()} to clickable elements
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 5. nav-item.tsx.template
|
|
198
|
+
|
|
199
|
+
**File:** `.claude/skills/real-prototypes-skill/templates/nav-item.tsx.template`
|
|
200
|
+
|
|
201
|
+
### Issues Found (5)
|
|
202
|
+
|
|
203
|
+
#### 1. MISSING ARIA LABEL
|
|
204
|
+
|
|
205
|
+
- **Severity:** error
|
|
206
|
+
- **Message:** button at line 87 missing aria-label or associated label
|
|
207
|
+
- **Element:** button
|
|
208
|
+
- **Line:** 87
|
|
209
|
+
|
|
210
|
+
#### 2. MISSING ARIA LABEL
|
|
211
|
+
|
|
212
|
+
- **Severity:** error
|
|
213
|
+
- **Message:** button at line 114 missing aria-label or associated label
|
|
214
|
+
- **Element:** button
|
|
215
|
+
- **Line:** 114
|
|
216
|
+
|
|
217
|
+
#### 3. MISSING ARIA LABEL
|
|
218
|
+
|
|
219
|
+
- **Severity:** error
|
|
220
|
+
- **Message:** button at line 152 missing aria-label or associated label
|
|
221
|
+
- **Element:** button
|
|
222
|
+
- **Line:** 152
|
|
223
|
+
|
|
224
|
+
#### 4. MISSING ARIA LABEL
|
|
225
|
+
|
|
226
|
+
- **Severity:** error
|
|
227
|
+
- **Message:** button at line 184 missing aria-label or associated label
|
|
228
|
+
- **Element:** button
|
|
229
|
+
- **Line:** 184
|
|
230
|
+
|
|
231
|
+
#### 5. KEYBOARD NAVIGATION
|
|
232
|
+
|
|
233
|
+
- **Severity:** warning
|
|
234
|
+
- **Message:** Click handlers without keyboard handlers. Ensure keyboard accessibility.
|
|
235
|
+
|
|
236
|
+
### Fixes Applied (1)
|
|
237
|
+
|
|
238
|
+
#### 1. ADD KEYBOARD HANDLERS
|
|
239
|
+
|
|
240
|
+
- **Description:** Add keyboard event handlers
|
|
241
|
+
- **Implementation:** Add onKeyDown={(e) => e.key === "Enter" && handleClick()} to clickable elements
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Accessibility Best Practices
|
|
246
|
+
|
|
247
|
+
### Color Contrast
|
|
248
|
+
- Normal text (< 18pt): Minimum 4.5:1 contrast ratio
|
|
249
|
+
- Large text (≥ 18pt or ≥ 14pt bold): Minimum 3.0:1 contrast ratio
|
|
250
|
+
- Adjust lightness by maximum 5% to preserve design
|
|
251
|
+
|
|
252
|
+
### Keyboard Navigation
|
|
253
|
+
- All interactive elements must be keyboard accessible
|
|
254
|
+
- Add `onKeyDown` handlers for `onClick` elements
|
|
255
|
+
- Use `tabIndex={0}` for custom interactive elements
|
|
256
|
+
- Ensure logical tab order
|
|
257
|
+
|
|
258
|
+
### ARIA Labels
|
|
259
|
+
- All buttons must have accessible names (text, aria-label, or aria-labelledby)
|
|
260
|
+
- All links must have descriptive text
|
|
261
|
+
- Form inputs must have associated labels
|
|
262
|
+
- Use `aria-describedby` for error messages
|
|
263
|
+
|
|
264
|
+
### Focus Indicators
|
|
265
|
+
- All focusable elements must have visible focus states
|
|
266
|
+
- Use `focus:ring-2 focus:ring-platform-primary` pattern
|
|
267
|
+
- Ensure focus indicators have minimum 3:1 contrast
|
|
268
|
+
|
|
269
|
+
### Semantic HTML
|
|
270
|
+
- Use proper HTML elements (`<button>` not `<div onClick>`)
|
|
271
|
+
- Maintain heading hierarchy (h1 → h2 → h3, no skipping)
|
|
272
|
+
- Use landmarks (`<nav>`, `<main>`, `<footer>`)
|
|
273
|
+
- Use lists for list content
|
|
274
|
+
|
|
275
|
+
### Form Accessibility
|
|
276
|
+
- Associate labels with inputs using `htmlFor` or `aria-label`
|
|
277
|
+
- Include `aria-invalid` for validation errors
|
|
278
|
+
- Use `aria-describedby` to link error messages
|
|
279
|
+
- Mark required fields with `required` or `aria-required`
|
|
280
|
+
|
|
281
|
+
### Images
|
|
282
|
+
- All images must have `alt` attributes
|
|
283
|
+
- Use `alt=""` for decorative images
|
|
284
|
+
- Provide descriptive alt text for meaningful images
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Testing Recommendations
|
|
289
|
+
|
|
290
|
+
1. **Automated Testing:** Run ESLint with accessibility plugin
|
|
291
|
+
2. **Keyboard Testing:** Navigate site using only Tab, Enter, Escape
|
|
292
|
+
3. **Screen Reader Testing:** Test with NVDA (Windows) or VoiceOver (Mac)
|
|
293
|
+
4. **Contrast Testing:** Use browser DevTools Accessibility panel
|
|
294
|
+
5. **WAVE Tool:** Run WAVE browser extension for visual feedback
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
**Note:** All fixes preserve the original design with minimal visual changes (<1% difference).
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
{
|
|
2
|
+
"timestamp": "2026-01-26T18:27:12.016Z",
|
|
3
|
+
"wcagLevel": "AA",
|
|
4
|
+
"totalFiles": 5,
|
|
5
|
+
"totalIssues": 24,
|
|
6
|
+
"totalFixes": 5,
|
|
7
|
+
"results": [
|
|
8
|
+
{
|
|
9
|
+
"file": ".claude/skills/real-prototypes-skill/templates/dashboard-widget.tsx.template",
|
|
10
|
+
"issueCount": 4,
|
|
11
|
+
"fixCount": 1,
|
|
12
|
+
"issues": [
|
|
13
|
+
{
|
|
14
|
+
"type": "missing-aria-label",
|
|
15
|
+
"severity": "error",
|
|
16
|
+
"element": "button",
|
|
17
|
+
"line": 58,
|
|
18
|
+
"message": "button at line 58 missing aria-label or associated label"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "missing-aria-label",
|
|
22
|
+
"severity": "error",
|
|
23
|
+
"element": "button",
|
|
24
|
+
"line": 65,
|
|
25
|
+
"message": "button at line 65 missing aria-label or associated label"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "missing-aria-label",
|
|
29
|
+
"severity": "error",
|
|
30
|
+
"element": "button",
|
|
31
|
+
"line": 83,
|
|
32
|
+
"message": "button at line 83 missing aria-label or associated label"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"type": "missing-focus-indicator",
|
|
36
|
+
"severity": "error",
|
|
37
|
+
"message": "No focus styles detected. Add focus:ring or focus-visible styles."
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"fixes": [
|
|
41
|
+
{
|
|
42
|
+
"type": "add-focus-styles",
|
|
43
|
+
"description": "Add focus indicators to interactive elements",
|
|
44
|
+
"implementation": "Add focus:ring-2 focus:ring-platform-primary focus:ring-offset-2 to buttons/links"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"file": ".claude/skills/real-prototypes-skill/templates/data-table.tsx.template",
|
|
50
|
+
"issueCount": 2,
|
|
51
|
+
"fixCount": 1,
|
|
52
|
+
"issues": [
|
|
53
|
+
{
|
|
54
|
+
"type": "missing-aria-label",
|
|
55
|
+
"severity": "error",
|
|
56
|
+
"element": "button",
|
|
57
|
+
"line": 99,
|
|
58
|
+
"message": "button at line 99 missing aria-label or associated label"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "missing-focus-indicator",
|
|
62
|
+
"severity": "error",
|
|
63
|
+
"message": "No focus styles detected. Add focus:ring or focus-visible styles."
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"fixes": [
|
|
67
|
+
{
|
|
68
|
+
"type": "add-focus-styles",
|
|
69
|
+
"description": "Add focus indicators to interactive elements",
|
|
70
|
+
"implementation": "Add focus:ring-2 focus:ring-platform-primary focus:ring-offset-2 to buttons/links"
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"file": ".claude/skills/real-prototypes-skill/templates/form-section.tsx.template",
|
|
76
|
+
"issueCount": 6,
|
|
77
|
+
"fixCount": 1,
|
|
78
|
+
"issues": [
|
|
79
|
+
{
|
|
80
|
+
"type": "color-contrast",
|
|
81
|
+
"severity": "warning",
|
|
82
|
+
"message": "Found 1 color utilities. Manual contrast check recommended.",
|
|
83
|
+
"colors": [
|
|
84
|
+
"text-red-500"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"type": "missing-aria-label",
|
|
89
|
+
"severity": "error",
|
|
90
|
+
"element": "button",
|
|
91
|
+
"line": 220,
|
|
92
|
+
"message": "button at line 220 missing aria-label or associated label"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"type": "missing-aria-label",
|
|
96
|
+
"severity": "error",
|
|
97
|
+
"element": "button",
|
|
98
|
+
"line": 230,
|
|
99
|
+
"message": "button at line 230 missing aria-label or associated label"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"type": "missing-aria-label",
|
|
103
|
+
"severity": "error",
|
|
104
|
+
"element": "input",
|
|
105
|
+
"line": 92,
|
|
106
|
+
"message": "input at line 92 missing aria-label or associated label"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"type": "missing-aria-label",
|
|
110
|
+
"severity": "error",
|
|
111
|
+
"element": "input",
|
|
112
|
+
"line": 117,
|
|
113
|
+
"message": "input at line 117 missing aria-label or associated label"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"type": "keyboard-navigation",
|
|
117
|
+
"severity": "warning",
|
|
118
|
+
"message": "Click handlers without keyboard handlers. Ensure keyboard accessibility."
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"fixes": [
|
|
122
|
+
{
|
|
123
|
+
"type": "add-keyboard-handlers",
|
|
124
|
+
"description": "Add keyboard event handlers",
|
|
125
|
+
"implementation": "Add onKeyDown={(e) => e.key === \"Enter\" && handleClick()} to clickable elements"
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"file": ".claude/skills/real-prototypes-skill/templates/modal-dialog.tsx.template",
|
|
131
|
+
"issueCount": 7,
|
|
132
|
+
"fixCount": 1,
|
|
133
|
+
"issues": [
|
|
134
|
+
{
|
|
135
|
+
"type": "color-contrast",
|
|
136
|
+
"severity": "warning",
|
|
137
|
+
"message": "Found 2 color utilities. Manual contrast check recommended.",
|
|
138
|
+
"colors": [
|
|
139
|
+
"bg-red-600",
|
|
140
|
+
"bg-red-700"
|
|
141
|
+
]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"type": "missing-aria-label",
|
|
145
|
+
"severity": "error",
|
|
146
|
+
"element": "button",
|
|
147
|
+
"line": 99,
|
|
148
|
+
"message": "button at line 99 missing aria-label or associated label"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"type": "missing-aria-label",
|
|
152
|
+
"severity": "error",
|
|
153
|
+
"element": "button",
|
|
154
|
+
"line": 107,
|
|
155
|
+
"message": "button at line 107 missing aria-label or associated label"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"type": "missing-aria-label",
|
|
159
|
+
"severity": "error",
|
|
160
|
+
"element": "button",
|
|
161
|
+
"line": 181,
|
|
162
|
+
"message": "button at line 181 missing aria-label or associated label"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"type": "missing-aria-label",
|
|
166
|
+
"severity": "error",
|
|
167
|
+
"element": "button",
|
|
168
|
+
"line": 190,
|
|
169
|
+
"message": "button at line 190 missing aria-label or associated label"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"type": "missing-aria-label",
|
|
173
|
+
"severity": "error",
|
|
174
|
+
"element": "button",
|
|
175
|
+
"line": 211,
|
|
176
|
+
"message": "button at line 211 missing aria-label or associated label"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"type": "keyboard-navigation",
|
|
180
|
+
"severity": "warning",
|
|
181
|
+
"message": "Click handlers without keyboard handlers. Ensure keyboard accessibility."
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
"fixes": [
|
|
185
|
+
{
|
|
186
|
+
"type": "add-keyboard-handlers",
|
|
187
|
+
"description": "Add keyboard event handlers",
|
|
188
|
+
"implementation": "Add onKeyDown={(e) => e.key === \"Enter\" && handleClick()} to clickable elements"
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"file": ".claude/skills/real-prototypes-skill/templates/nav-item.tsx.template",
|
|
194
|
+
"issueCount": 5,
|
|
195
|
+
"fixCount": 1,
|
|
196
|
+
"issues": [
|
|
197
|
+
{
|
|
198
|
+
"type": "missing-aria-label",
|
|
199
|
+
"severity": "error",
|
|
200
|
+
"element": "button",
|
|
201
|
+
"line": 87,
|
|
202
|
+
"message": "button at line 87 missing aria-label or associated label"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"type": "missing-aria-label",
|
|
206
|
+
"severity": "error",
|
|
207
|
+
"element": "button",
|
|
208
|
+
"line": 114,
|
|
209
|
+
"message": "button at line 114 missing aria-label or associated label"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"type": "missing-aria-label",
|
|
213
|
+
"severity": "error",
|
|
214
|
+
"element": "button",
|
|
215
|
+
"line": 152,
|
|
216
|
+
"message": "button at line 152 missing aria-label or associated label"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"type": "missing-aria-label",
|
|
220
|
+
"severity": "error",
|
|
221
|
+
"element": "button",
|
|
222
|
+
"line": 184,
|
|
223
|
+
"message": "button at line 184 missing aria-label or associated label"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"type": "keyboard-navigation",
|
|
227
|
+
"severity": "warning",
|
|
228
|
+
"message": "Click handlers without keyboard handlers. Ensure keyboard accessibility."
|
|
229
|
+
}
|
|
230
|
+
],
|
|
231
|
+
"fixes": [
|
|
232
|
+
{
|
|
233
|
+
"type": "add-keyboard-handlers",
|
|
234
|
+
"description": "Add keyboard event handlers",
|
|
235
|
+
"implementation": "Add onKeyDown={(e) => e.key === \"Enter\" && handleClick()} to clickable elements"
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
],
|
|
240
|
+
"summary": {
|
|
241
|
+
"byType": {
|
|
242
|
+
"missing-aria-label": 17,
|
|
243
|
+
"missing-focus-indicator": 2,
|
|
244
|
+
"color-contrast": 2,
|
|
245
|
+
"keyboard-navigation": 3
|
|
246
|
+
},
|
|
247
|
+
"bySeverity": {
|
|
248
|
+
"error": 19,
|
|
249
|
+
"warning": 5,
|
|
250
|
+
"info": 0
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|