@kood/claude-code 0.4.1 → 0.5.1
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/dist/index.js +69 -12
- package/package.json +2 -1
- package/templates/.claude/PARALLEL_AGENTS.md +737 -0
- package/templates/.claude/agents/analyst.md +416 -0
- package/templates/.claude/agents/architect.md +569 -0
- package/templates/.claude/agents/code-reviewer.md +132 -133
- package/templates/.claude/agents/dependency-manager.md +93 -94
- package/templates/.claude/agents/deployment-validator.md +64 -65
- package/templates/.claude/agents/designer.md +655 -0
- package/templates/.claude/agents/document-writer.md +500 -0
- package/templates/.claude/agents/explore.md +499 -0
- package/templates/.claude/agents/git-operator.md +74 -75
- package/templates/.claude/agents/implementation-executor.md +138 -109
- package/templates/.claude/agents/ko-to-en-translator.md +18 -22
- package/templates/.claude/agents/lint-fixer.md +250 -93
- package/templates/.claude/agents/planner.md +356 -0
- package/templates/.claude/agents/refactor-advisor.md +135 -136
- package/templates/.claude/commands/bug-fix.md +296 -207
- package/templates/.claude/commands/git-all.md +199 -46
- package/templates/.claude/commands/git-session.md +113 -57
- package/templates/.claude/commands/lint-fix.md +219 -153
- package/templates/.claude/commands/lint-init.md +113 -76
- package/templates/.claude/commands/pre-deploy.md +190 -124
- package/templates/.claude/commands/refactor.md +407 -162
- package/templates/.claude/commands/version-update.md +138 -37
- package/templates/.claude/instructions/context-engineering/ANTHROPIC_CONTEXT_ENGINEERING.md +178 -0
- package/templates/.claude/instructions/context-engineering/references/claude-4x.md +215 -0
- package/templates/.claude/instructions/context-engineering/references/core-principles.md +137 -0
- package/templates/.claude/instructions/context-engineering/references/examples.md +351 -0
- package/templates/.claude/instructions/context-engineering/references/techniques.md +162 -0
- package/templates/.claude/instructions/parallel-agent-execution.md +874 -0
- package/templates/.claude/skills/docs-creator/AGENTS.md +238 -0
- package/templates/.claude/{commands/docs-creator.md → skills/docs-creator/SKILL.md} +61 -75
- package/templates/.claude/skills/docs-refactor/AGENTS.md +270 -0
- package/templates/.claude/{commands/docs-refactor.md → skills/docs-refactor/SKILL.md} +30 -44
- package/templates/.claude/skills/execute/SKILL.md +451 -0
- package/templates/.claude/skills/figma-to-code/AGENTS.md +287 -0
- package/templates/.claude/skills/figma-to-code/SKILL.md +225 -225
- package/templates/.claude/skills/figma-to-code/references/design-tokens.md +75 -73
- package/templates/.claude/skills/figma-to-code/references/figma-mcp-tools.md +73 -73
- package/templates/.claude/skills/figma-to-code/references/layout-mapping.md +104 -104
- package/templates/.claude/skills/figma-to-code/references/responsive-design.md +99 -99
- package/templates/.claude/skills/figma-to-code/references/verification.md +91 -91
- package/templates/.claude/skills/global-uiux-design/AGENTS.md +317 -0
- package/templates/.claude/skills/global-uiux-design/SKILL.md +738 -0
- package/templates/.claude/skills/global-uiux-design/references/accessibility.md +401 -0
- package/templates/.claude/skills/global-uiux-design/references/color-system.md +275 -0
- package/templates/.claude/skills/global-uiux-design/references/design-philosophy.md +206 -0
- package/templates/.claude/skills/global-uiux-design/references/design-systems.md +446 -0
- package/templates/.claude/skills/korea-uiux-design/AGENTS.md +307 -0
- package/templates/.claude/skills/korea-uiux-design/SKILL.md +170 -0
- package/templates/.claude/skills/nextjs-react-best-practices/AGENTS.md +95 -116
- package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +134 -152
- package/templates/.claude/skills/nextjs-react-best-practices/rules/advanced-event-handler-refs.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/advanced-use-latest.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-api-routes.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-defer-await.md +22 -22
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-dependencies.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-parallel.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-suspense-boundaries.md +21 -21
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-barrel-imports.md +18 -18
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-conditional.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-defer-third-party.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-dynamic-imports.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-preload.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/client-event-listeners.md +9 -9
- package/templates/.claude/skills/nextjs-react-best-practices/rules/client-swr-dedup.md +7 -7
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-batch-dom-css.md +13 -13
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-cache-function-results.md +14 -14
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-cache-property-access.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-cache-storage.md +10 -10
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-combine-iterations.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-early-exit.md +7 -7
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-hoist-regexp.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-index-maps.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-length-check-first.md +14 -14
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-min-max-loop.md +16 -16
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-set-map-lookups.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-tosorted-immutable.md +17 -17
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-activity.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-animate-svg-wrapper.md +11 -11
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-conditional-render.md +8 -8
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-content-visibility.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-hoist-jsx.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-hydration-no-flicker.md +14 -14
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-svg-precision.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-defer-reads.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-dependencies.md +7 -7
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-derived-state.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-functional-setstate.md +34 -34
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-lazy-state-init.md +15 -15
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-memo.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-transitions.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-after-nonblocking.md +24 -24
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-cache-lru.md +10 -10
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-cache-react.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-parallel-fetching.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-serialization.md +6 -6
- package/templates/.claude/skills/plan/SKILL.md +594 -0
- package/templates/.claude/skills/prd/SKILL.md +496 -0
- package/templates/.claude/skills/ralph/AGENTS.md +393 -0
- package/templates/.claude/skills/ralph/SKILL.md +1035 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +100 -121
- package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +139 -157
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-defer-await.md +22 -22
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-dependencies.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-loader.md +7 -7
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-parallel.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-barrel-imports.md +18 -18
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-conditional.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-lazy-routes.md +12 -12
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-preload.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-event-listeners.md +9 -9
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-tanstack-query.md +12 -12
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-batch-dom-css.md +13 -13
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-function-results.md +14 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-property-access.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-storage.md +10 -10
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-combine-iterations.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-early-exit.md +7 -7
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-hoist-regexp.md +6 -6
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-index-maps.md +6 -6
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-length-check-first.md +14 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-min-max-loop.md +16 -16
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-set-map-lookups.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-tosorted-immutable.md +17 -17
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-animate-svg-wrapper.md +11 -11
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-conditional-render.md +8 -8
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-content-visibility.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-hoist-jsx.md +6 -6
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-svg-precision.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-defer-reads.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-dependencies.md +7 -7
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-derived-state.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-functional-setstate.md +34 -34
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-lazy-state-init.md +15 -15
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-memo.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-transitions.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-cache-lru.md +12 -12
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +14 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-parallel-fetching.md +9 -9
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +6 -6
- package/templates/.claude/commands/agent-creator.md +0 -370
- package/templates/.claude/commands/command-creator.md +0 -524
- package/templates/.claude/commands/execute.md +0 -469
- package/templates/.claude/commands/git.md +0 -98
- package/templates/.claude/commands/plan.md +0 -526
- package/templates/.claude/commands/prd.md +0 -629
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
# Accessibility (WCAG 2.2 AA)
|
|
2
|
+
|
|
3
|
+
## Core Requirements
|
|
4
|
+
|
|
5
|
+
### 1. Perceivable
|
|
6
|
+
|
|
7
|
+
**Information must be presentable to users in ways they can perceive.**
|
|
8
|
+
|
|
9
|
+
#### Text Alternatives (1.1)
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
{/* Images */}
|
|
13
|
+
<img src="chart.png" alt="Sales increased 25% in Q4" />
|
|
14
|
+
|
|
15
|
+
{/* Decorative images */}
|
|
16
|
+
<img src="decoration.png" alt="" role="presentation" />
|
|
17
|
+
|
|
18
|
+
{/* Icon buttons */}
|
|
19
|
+
<button aria-label="Close dialog">
|
|
20
|
+
<svg className="w-5 h-5" aria-hidden="true" />
|
|
21
|
+
</button>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
#### Color Contrast (1.4.3)
|
|
25
|
+
|
|
26
|
+
- **Normal text:** 4.5:1 minimum
|
|
27
|
+
- **Large text (18pt+):** 3:1 minimum
|
|
28
|
+
- **UI components:** 3:1 minimum (borders, form controls)
|
|
29
|
+
|
|
30
|
+
#### Resize Text (1.4.4)
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
{/* Support up to 200% zoom */}
|
|
34
|
+
<p className="text-base leading-relaxed">
|
|
35
|
+
Use relative units (rem, em) not px
|
|
36
|
+
</p>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Operable
|
|
40
|
+
|
|
41
|
+
**UI components must be operable.**
|
|
42
|
+
|
|
43
|
+
#### Keyboard Accessible (2.1)
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
{/* All interactive elements keyboard accessible */}
|
|
47
|
+
<button onClick={handleClick}>Submit</button> {/* ✓ */}
|
|
48
|
+
<div onClick={handleClick}>Submit</div> {/* ✗ Not keyboard accessible */}
|
|
49
|
+
|
|
50
|
+
{/* Custom interactive elements need tabIndex and keyboard handlers */}
|
|
51
|
+
<div
|
|
52
|
+
role="button"
|
|
53
|
+
tabIndex={0}
|
|
54
|
+
onClick={handleClick}
|
|
55
|
+
onKeyDown={(e) => {
|
|
56
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
57
|
+
handleClick();
|
|
58
|
+
}
|
|
59
|
+
}}
|
|
60
|
+
>
|
|
61
|
+
Custom button
|
|
62
|
+
</div>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### Focus Visible (2.4.7)
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
{/* Ensure visible focus indicator */}
|
|
69
|
+
<button className="
|
|
70
|
+
focus:outline-none
|
|
71
|
+
focus:ring-2
|
|
72
|
+
focus:ring-primary-500
|
|
73
|
+
focus:ring-offset-2
|
|
74
|
+
">
|
|
75
|
+
Save
|
|
76
|
+
</button>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### Skip Links (2.4.1)
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
{/* Allow keyboard users to skip navigation */}
|
|
83
|
+
<a
|
|
84
|
+
href="#main-content"
|
|
85
|
+
className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4"
|
|
86
|
+
>
|
|
87
|
+
Skip to main content
|
|
88
|
+
</a>
|
|
89
|
+
|
|
90
|
+
<main id="main-content">
|
|
91
|
+
{/* Page content */}
|
|
92
|
+
</main>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 3. Understandable
|
|
96
|
+
|
|
97
|
+
**Information and operation must be understandable.**
|
|
98
|
+
|
|
99
|
+
#### Language (3.1.1)
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<html lang="en">
|
|
103
|
+
<body>
|
|
104
|
+
<p>This is English text.</p>
|
|
105
|
+
<p lang="es">Este es texto en español.</p>
|
|
106
|
+
</body>
|
|
107
|
+
</html>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### Error Identification (3.3.1)
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
{/* Clear error messages */}
|
|
114
|
+
<div>
|
|
115
|
+
<label htmlFor="email">Email</label>
|
|
116
|
+
<input
|
|
117
|
+
id="email"
|
|
118
|
+
type="email"
|
|
119
|
+
aria-invalid={hasError}
|
|
120
|
+
aria-describedby={hasError ? "email-error" : undefined}
|
|
121
|
+
/>
|
|
122
|
+
{hasError && (
|
|
123
|
+
<p id="email-error" className="text-red-600 text-sm mt-1">
|
|
124
|
+
Please enter a valid email address (e.g., name@example.com)
|
|
125
|
+
</p>
|
|
126
|
+
)}
|
|
127
|
+
</div>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### Labels (3.3.2)
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
{/* Every form input needs a label */}
|
|
134
|
+
<label htmlFor="username" className="block text-sm font-medium">
|
|
135
|
+
Username
|
|
136
|
+
</label>
|
|
137
|
+
<input id="username" type="text" />
|
|
138
|
+
|
|
139
|
+
{/* Or use aria-label */}
|
|
140
|
+
<input type="search" aria-label="Search products" />
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 4. Robust
|
|
144
|
+
|
|
145
|
+
**Content must be robust enough for assistive technologies.**
|
|
146
|
+
|
|
147
|
+
#### Valid HTML (4.1.1)
|
|
148
|
+
|
|
149
|
+
- Proper nesting (no `<div>` inside `<p>`)
|
|
150
|
+
- Unique IDs
|
|
151
|
+
- Closing tags
|
|
152
|
+
- Valid ARIA attributes
|
|
153
|
+
|
|
154
|
+
#### Name, Role, Value (4.1.2)
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
{/* Use semantic HTML when possible */}
|
|
158
|
+
<button>Click me</button> {/* ✓ Role implicit */}
|
|
159
|
+
|
|
160
|
+
{/* Custom components need explicit roles */}
|
|
161
|
+
<div role="button" aria-pressed={isPressed}>
|
|
162
|
+
Toggle
|
|
163
|
+
</div>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## ARIA (Accessible Rich Internet Applications)
|
|
167
|
+
|
|
168
|
+
### ARIA Roles
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
{/* Landmark roles */}
|
|
172
|
+
<header role="banner">
|
|
173
|
+
<nav role="navigation">
|
|
174
|
+
<main role="main">
|
|
175
|
+
<aside role="complementary">
|
|
176
|
+
<footer role="contentinfo">
|
|
177
|
+
|
|
178
|
+
{/* Widget roles */}
|
|
179
|
+
<div role="dialog" aria-modal="true">
|
|
180
|
+
<div role="alertdialog">
|
|
181
|
+
<div role="tooltip">
|
|
182
|
+
<div role="tablist">
|
|
183
|
+
<button role="tab" aria-selected={true}>Tab 1</button>
|
|
184
|
+
</div>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### ARIA States & Properties
|
|
188
|
+
|
|
189
|
+
```tsx
|
|
190
|
+
{/* aria-expanded (dropdowns, accordions) */}
|
|
191
|
+
<button aria-expanded={isOpen} onClick={toggle}>
|
|
192
|
+
Menu
|
|
193
|
+
</button>
|
|
194
|
+
|
|
195
|
+
{/* aria-hidden (decorative elements) */}
|
|
196
|
+
<svg aria-hidden="true" />
|
|
197
|
+
|
|
198
|
+
{/* aria-live (dynamic content) */}
|
|
199
|
+
<div role="status" aria-live="polite">
|
|
200
|
+
{notification}
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
{/* aria-describedby (additional descriptions) */}
|
|
204
|
+
<input
|
|
205
|
+
type="password"
|
|
206
|
+
aria-describedby="password-requirements"
|
|
207
|
+
/>
|
|
208
|
+
<p id="password-requirements">
|
|
209
|
+
Must be at least 8 characters
|
|
210
|
+
</p>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### ARIA Best Practices
|
|
214
|
+
|
|
215
|
+
**First Rule of ARIA:**
|
|
216
|
+
> If you can use native HTML, do it.
|
|
217
|
+
|
|
218
|
+
❌ **Bad:**
|
|
219
|
+
```tsx
|
|
220
|
+
<div role="button" tabIndex={0} onClick={click}>Submit</div>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
✅ **Good:**
|
|
224
|
+
```tsx
|
|
225
|
+
<button onClick={click}>Submit</button>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Common Patterns
|
|
229
|
+
|
|
230
|
+
### Modal Dialog
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
<div
|
|
234
|
+
role="dialog"
|
|
235
|
+
aria-modal="true"
|
|
236
|
+
aria-labelledby="dialog-title"
|
|
237
|
+
aria-describedby="dialog-description"
|
|
238
|
+
>
|
|
239
|
+
<h2 id="dialog-title">Confirm deletion</h2>
|
|
240
|
+
<p id="dialog-description">
|
|
241
|
+
Are you sure you want to delete this item? This action cannot be undone.
|
|
242
|
+
</p>
|
|
243
|
+
<button onClick={confirm}>Delete</button>
|
|
244
|
+
<button onClick={cancel}>Cancel</button>
|
|
245
|
+
</div>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Requirements:**
|
|
249
|
+
- Focus trap (Tab cycles within dialog)
|
|
250
|
+
- Close on Escape key
|
|
251
|
+
- Return focus to trigger element on close
|
|
252
|
+
- Prevent body scroll
|
|
253
|
+
|
|
254
|
+
### Accordion
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
<div>
|
|
258
|
+
<button
|
|
259
|
+
aria-expanded={isOpen}
|
|
260
|
+
aria-controls="panel-1"
|
|
261
|
+
onClick={toggle}
|
|
262
|
+
>
|
|
263
|
+
Section 1
|
|
264
|
+
</button>
|
|
265
|
+
<div id="panel-1" hidden={!isOpen}>
|
|
266
|
+
Panel content
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Tabs
|
|
272
|
+
|
|
273
|
+
```tsx
|
|
274
|
+
<div role="tablist" aria-label="Settings">
|
|
275
|
+
<button
|
|
276
|
+
role="tab"
|
|
277
|
+
aria-selected={activeTab === 'general'}
|
|
278
|
+
aria-controls="panel-general"
|
|
279
|
+
>
|
|
280
|
+
General
|
|
281
|
+
</button>
|
|
282
|
+
<button
|
|
283
|
+
role="tab"
|
|
284
|
+
aria-selected={activeTab === 'privacy'}
|
|
285
|
+
aria-controls="panel-privacy"
|
|
286
|
+
>
|
|
287
|
+
Privacy
|
|
288
|
+
</button>
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
<div role="tabpanel" id="panel-general" hidden={activeTab !== 'general'}>
|
|
292
|
+
General settings
|
|
293
|
+
</div>
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Keyboard:**
|
|
297
|
+
- Arrow keys navigate between tabs
|
|
298
|
+
- Tab key moves to panel content
|
|
299
|
+
- Home/End jump to first/last tab
|
|
300
|
+
|
|
301
|
+
### Toast Notifications
|
|
302
|
+
|
|
303
|
+
```tsx
|
|
304
|
+
{/* Non-interruptive notifications */}
|
|
305
|
+
<div
|
|
306
|
+
role="status"
|
|
307
|
+
aria-live="polite"
|
|
308
|
+
className="fixed bottom-4 right-4"
|
|
309
|
+
>
|
|
310
|
+
<div className="bg-green-50 border border-green-200 p-4 rounded-lg">
|
|
311
|
+
<p>Changes saved successfully</p>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
{/* Urgent alerts */}
|
|
316
|
+
<div
|
|
317
|
+
role="alert"
|
|
318
|
+
aria-live="assertive"
|
|
319
|
+
>
|
|
320
|
+
<p>Error: Payment failed</p>
|
|
321
|
+
</div>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## Screen Reader Testing
|
|
325
|
+
|
|
326
|
+
### macOS VoiceOver
|
|
327
|
+
|
|
328
|
+
1. Enable: System Settings → Accessibility → VoiceOver
|
|
329
|
+
2. Toggle: Cmd + F5
|
|
330
|
+
3. Navigate: VO + Arrow keys (VO = Ctrl + Option)
|
|
331
|
+
4. Interact: VO + Shift + Down
|
|
332
|
+
5. Rotor: VO + U (lists headings, links, form controls)
|
|
333
|
+
|
|
334
|
+
### Windows NVDA (Free)
|
|
335
|
+
|
|
336
|
+
1. Download: nvaccess.org
|
|
337
|
+
2. Toggle: Ctrl + Alt + N
|
|
338
|
+
3. Navigate: Arrow keys
|
|
339
|
+
4. Elements list: Insert + F7
|
|
340
|
+
|
|
341
|
+
### Mobile
|
|
342
|
+
|
|
343
|
+
- **iOS VoiceOver:** Settings → Accessibility → VoiceOver
|
|
344
|
+
- **Android TalkBack:** Settings → Accessibility → TalkBack
|
|
345
|
+
|
|
346
|
+
## Testing Tools
|
|
347
|
+
|
|
348
|
+
### Automated
|
|
349
|
+
|
|
350
|
+
- **axe DevTools** (Chrome/Firefox extension)
|
|
351
|
+
- **Lighthouse** (Chrome DevTools → Lighthouse)
|
|
352
|
+
- **WAVE** (wave.webaim.org)
|
|
353
|
+
- **Pa11y** (CLI tool)
|
|
354
|
+
|
|
355
|
+
### Manual
|
|
356
|
+
|
|
357
|
+
- **Keyboard only:** Unplug mouse, navigate entire app
|
|
358
|
+
- **Screen reader:** VoiceOver (Mac), NVDA (Windows), TalkBack (Android)
|
|
359
|
+
- **Zoom:** Test at 200% browser zoom
|
|
360
|
+
- **Color blind:** Chrome DevTools → Rendering → Emulate vision deficiencies
|
|
361
|
+
|
|
362
|
+
## Legal Requirements
|
|
363
|
+
|
|
364
|
+
### Regions with Accessibility Laws
|
|
365
|
+
|
|
366
|
+
- **US:** ADA, Section 508 (government sites)
|
|
367
|
+
- **EU:** European Accessibility Act (June 2025)
|
|
368
|
+
- **UK:** Equality Act 2010
|
|
369
|
+
- **Canada:** AODA (Ontario)
|
|
370
|
+
- **Australia:** Disability Discrimination Act
|
|
371
|
+
|
|
372
|
+
### Compliance Level
|
|
373
|
+
|
|
374
|
+
- **A:** Minimum (many gaps)
|
|
375
|
+
- **AA:** Target for most (legal requirement in many regions)
|
|
376
|
+
- **AAA:** Gold standard (difficult to achieve fully)
|
|
377
|
+
|
|
378
|
+
**Recommendation:** WCAG 2.2 AA minimum for all public-facing sites.
|
|
379
|
+
|
|
380
|
+
## Quick Accessibility Checklist
|
|
381
|
+
|
|
382
|
+
- [ ] All images have alt text (or alt="" if decorative)
|
|
383
|
+
- [ ] Color contrast meets 4.5:1 (normal text) or 3:1 (large text, UI)
|
|
384
|
+
- [ ] All interactive elements keyboard accessible
|
|
385
|
+
- [ ] Focus indicators visible (not outline: none without replacement)
|
|
386
|
+
- [ ] Form inputs have labels
|
|
387
|
+
- [ ] Headings in logical order (h1 → h2 → h3, no skipping)
|
|
388
|
+
- [ ] Link text descriptive (not "click here")
|
|
389
|
+
- [ ] Videos have captions
|
|
390
|
+
- [ ] Page has valid lang attribute
|
|
391
|
+
- [ ] Zoom to 200% doesn't break layout
|
|
392
|
+
- [ ] Screen reader announces page changes
|
|
393
|
+
- [ ] Error messages clear and actionable
|
|
394
|
+
|
|
395
|
+
## Resources
|
|
396
|
+
|
|
397
|
+
- **WCAG 2.2:** w3.org/WAI/WCAG22/quickref
|
|
398
|
+
- **WAI-ARIA Authoring Practices:** w3.org/WAI/ARIA/apg
|
|
399
|
+
- **WebAIM:** webaim.org (articles, checklists)
|
|
400
|
+
- **A11y Project:** a11yproject.com (beginner-friendly)
|
|
401
|
+
- **Inclusive Components:** inclusive-components.design
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# Color System
|
|
2
|
+
|
|
3
|
+
## Palette Structure
|
|
4
|
+
|
|
5
|
+
### Base Palette (9-shade scale)
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
// Example: Primary color
|
|
9
|
+
const primary = {
|
|
10
|
+
50: '#EFF6FF', // Lightest background
|
|
11
|
+
100: '#DBEAFE',
|
|
12
|
+
200: '#BFDBFE',
|
|
13
|
+
300: '#93C5FD',
|
|
14
|
+
400: '#60A5FA',
|
|
15
|
+
500: '#3B82F6', // Base
|
|
16
|
+
600: '#2563EB', // Default button
|
|
17
|
+
700: '#1D4ED8', // Hover state
|
|
18
|
+
800: '#1E40AF',
|
|
19
|
+
900: '#1E3A8A', // Darkest text
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Semantic Colors
|
|
24
|
+
|
|
25
|
+
| Color | Usage | Example |
|
|
26
|
+
|-------|-------|---------|
|
|
27
|
+
| **Success** | Completed actions, positive feedback | green-600 |
|
|
28
|
+
| **Error** | Failed actions, validation errors | red-600 |
|
|
29
|
+
| **Warning** | Caution, reversible actions | amber-600 |
|
|
30
|
+
| **Info** | Neutral information, tips | blue-600 |
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
{/* Semantic usage */}
|
|
34
|
+
<div className="text-green-600">Payment successful</div>
|
|
35
|
+
<div className="text-red-600">Invalid email address</div>
|
|
36
|
+
<div className="text-amber-600">Unsaved changes</div>
|
|
37
|
+
<div className="text-blue-600">Tip: Press Cmd+K to search</div>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Contrast Requirements (WCAG 2.2 AA)
|
|
41
|
+
|
|
42
|
+
### Text Contrast
|
|
43
|
+
|
|
44
|
+
| Type | Minimum | Recommended |
|
|
45
|
+
|------|---------|-------------|
|
|
46
|
+
| Normal text (<18pt) | 4.5:1 | 7:1 (AAA) |
|
|
47
|
+
| Large text (≥18pt) | 3:1 | 4.5:1 (AAA) |
|
|
48
|
+
| UI components | 3:1 | 4.5:1 |
|
|
49
|
+
|
|
50
|
+
### Testing Tools
|
|
51
|
+
|
|
52
|
+
- Chrome DevTools (Lighthouse)
|
|
53
|
+
- WebAIM Contrast Checker
|
|
54
|
+
- Stark (Figma plugin)
|
|
55
|
+
- Contrast Ratio (leaverou.github.io/contrast-ratio)
|
|
56
|
+
|
|
57
|
+
### Common Mistakes
|
|
58
|
+
|
|
59
|
+
❌ **Gray text on white**
|
|
60
|
+
```tsx
|
|
61
|
+
{/* Bad: Only 2.5:1 contrast */}
|
|
62
|
+
<p className="text-gray-400">Secondary text</p>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
✅ **Darker gray**
|
|
66
|
+
```tsx
|
|
67
|
+
{/* Good: 7:1 contrast */}
|
|
68
|
+
<p className="text-gray-600">Secondary text</p>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Dark Mode
|
|
72
|
+
|
|
73
|
+
### Approach
|
|
74
|
+
|
|
75
|
+
**System preference:**
|
|
76
|
+
```tsx
|
|
77
|
+
// Tailwind config
|
|
78
|
+
module.exports = {
|
|
79
|
+
darkMode: 'media', // or 'class' for manual toggle
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Usage:**
|
|
84
|
+
```tsx
|
|
85
|
+
<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
|
|
86
|
+
Content
|
|
87
|
+
</div>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Dark Mode Palette Adjustments
|
|
91
|
+
|
|
92
|
+
**Don't just invert:**
|
|
93
|
+
- Pure black (#000) is too harsh → Use gray-900 (#111827)
|
|
94
|
+
- Pure white (#FFF) is too bright → Use gray-100 (#F3F4F6)
|
|
95
|
+
- Reduce saturation of colors in dark mode
|
|
96
|
+
- Increase contrast slightly (dark mode often viewed in dim lighting)
|
|
97
|
+
|
|
98
|
+
**Example:**
|
|
99
|
+
```tsx
|
|
100
|
+
const primary = {
|
|
101
|
+
// Light mode: vibrant
|
|
102
|
+
light: '#2563EB', // blue-600
|
|
103
|
+
|
|
104
|
+
// Dark mode: slightly desaturated
|
|
105
|
+
dark: '#60A5FA', // blue-400 (lighter shade, less saturated)
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Elevation in Dark Mode
|
|
110
|
+
|
|
111
|
+
**Light mode:** Use shadows
|
|
112
|
+
**Dark mode:** Use lighter backgrounds
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
<div className="
|
|
116
|
+
bg-white shadow-lg
|
|
117
|
+
dark:bg-gray-800 dark:shadow-none dark:ring-1 dark:ring-gray-700
|
|
118
|
+
">
|
|
119
|
+
Card content
|
|
120
|
+
</div>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Color Harmony
|
|
124
|
+
|
|
125
|
+
### 60-30-10 Rule
|
|
126
|
+
|
|
127
|
+
- **60%** Dominant (background, neutral)
|
|
128
|
+
- **30%** Secondary (supporting elements)
|
|
129
|
+
- **10%** Accent (CTA, highlights)
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
{/* Example: Dashboard */}
|
|
133
|
+
<div className="bg-gray-50"> {/* 60% - neutral background */}
|
|
134
|
+
<aside className="bg-white"> {/* 30% - secondary surface */}
|
|
135
|
+
<button className="bg-blue-600"> {/* 10% - accent CTA */}
|
|
136
|
+
Create
|
|
137
|
+
</button>
|
|
138
|
+
</aside>
|
|
139
|
+
</div>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Analogous Colors
|
|
143
|
+
|
|
144
|
+
Use adjacent colors on color wheel for harmony:
|
|
145
|
+
- Blue (600) + Cyan (600) + Teal (600)
|
|
146
|
+
|
|
147
|
+
### Complementary Colors
|
|
148
|
+
|
|
149
|
+
Use opposite colors for high contrast:
|
|
150
|
+
- Blue (600) + Orange (600)
|
|
151
|
+
- Use sparingly for important CTAs
|
|
152
|
+
|
|
153
|
+
## Brand Color Integration
|
|
154
|
+
|
|
155
|
+
### Extract brand color palette
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
// Brand primary: #FF6B35 (custom orange)
|
|
159
|
+
|
|
160
|
+
// Generate shades using tools:
|
|
161
|
+
// - uicolors.app
|
|
162
|
+
// - tailwindshades.com
|
|
163
|
+
// - palettte.app
|
|
164
|
+
|
|
165
|
+
const brand = {
|
|
166
|
+
50: '#FFF4F0',
|
|
167
|
+
100: '#FFE8DF',
|
|
168
|
+
200: '#FFCFBF',
|
|
169
|
+
300: '#FFB49F',
|
|
170
|
+
400: '#FF9A7F',
|
|
171
|
+
500: '#FF6B35', // Brand color
|
|
172
|
+
600: '#E64D1A',
|
|
173
|
+
700: '#B33A13',
|
|
174
|
+
800: '#80290D',
|
|
175
|
+
900: '#4D1808',
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Usage in Components
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
// Replace default blue with brand color
|
|
183
|
+
<button className="bg-brand-500 hover:bg-brand-600 text-white">
|
|
184
|
+
Brand CTA
|
|
185
|
+
</button>
|
|
186
|
+
|
|
187
|
+
// Keep semantic colors standard
|
|
188
|
+
<div className="text-green-600">Success message</div>
|
|
189
|
+
<div className="text-red-600">Error message</div>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Design System Color Approaches
|
|
193
|
+
|
|
194
|
+
### Material Design 3 - Dynamic Color
|
|
195
|
+
|
|
196
|
+
- Generate palette from single source color
|
|
197
|
+
- Adapts to user's wallpaper (Android 12+)
|
|
198
|
+
- Tools: Material Theme Builder
|
|
199
|
+
|
|
200
|
+
### Apple HIG - System Colors
|
|
201
|
+
|
|
202
|
+
- Semantic colors (systemBlue, systemRed)
|
|
203
|
+
- Automatically adapt to light/dark mode
|
|
204
|
+
- Respect accessibility settings (increase contrast)
|
|
205
|
+
|
|
206
|
+
### IBM Carbon - Color Tokens
|
|
207
|
+
|
|
208
|
+
- Descriptive tokens (interactive-01, ui-background)
|
|
209
|
+
- Theme-agnostic (same token works across themes)
|
|
210
|
+
- Design → Dev handoff uses token names
|
|
211
|
+
|
|
212
|
+
## Color Blindness Considerations
|
|
213
|
+
|
|
214
|
+
### Types
|
|
215
|
+
|
|
216
|
+
- **Deuteranopia** (most common, 5% of males): Red-green
|
|
217
|
+
- **Protanopia**: Red-green
|
|
218
|
+
- **Tritanopia** (rare): Blue-yellow
|
|
219
|
+
|
|
220
|
+
### Design Strategies
|
|
221
|
+
|
|
222
|
+
✅ **Use patterns + color**
|
|
223
|
+
```tsx
|
|
224
|
+
{/* Good: Icon + color differentiates */}
|
|
225
|
+
<div className="text-green-600">✓ Success</div>
|
|
226
|
+
<div className="text-red-600">✗ Error</div>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
✅ **Use high contrast**
|
|
230
|
+
- Avoid red-green combinations
|
|
231
|
+
- Use blue-orange instead
|
|
232
|
+
|
|
233
|
+
✅ **Test with simulators**
|
|
234
|
+
- Figma: Color Blind plugin
|
|
235
|
+
- Chrome: DevTools → Rendering → Emulate vision deficiencies
|
|
236
|
+
|
|
237
|
+
## Performance Considerations
|
|
238
|
+
|
|
239
|
+
### CSS Custom Properties
|
|
240
|
+
|
|
241
|
+
```css
|
|
242
|
+
:root {
|
|
243
|
+
--color-primary: #3B82F6;
|
|
244
|
+
--color-primary-hover: #2563EB;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.dark {
|
|
248
|
+
--color-primary: #60A5FA;
|
|
249
|
+
--color-primary-hover: #3B82F6;
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Benefits:**
|
|
254
|
+
- Runtime theme switching
|
|
255
|
+
- No CSS recompilation
|
|
256
|
+
- Smaller bundle (one color token, multiple values)
|
|
257
|
+
|
|
258
|
+
### Avoid Inline Styles
|
|
259
|
+
|
|
260
|
+
❌ **Bad:** (each instance is unique CSS)
|
|
261
|
+
```tsx
|
|
262
|
+
<div style={{color: '#3B82F6'}}>Text</div>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
✅ **Good:** (reusable class)
|
|
266
|
+
```tsx
|
|
267
|
+
<div className="text-primary-500">Text</div>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Accessibility Tools
|
|
271
|
+
|
|
272
|
+
- **WebAIM Contrast Checker**: webaim.org/resources/contrastchecker
|
|
273
|
+
- **Colorable**: colorable.jxnblk.com
|
|
274
|
+
- **Who Can Use**: whocanuse.com
|
|
275
|
+
- **Contrast Triangle**: contrast-triangle.com
|