@sylix/coworker 2.0.10 → 2.0.12

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.
Files changed (178) hide show
  1. package/dist/commands/slash/config.d.ts.map +1 -1
  2. package/dist/commands/slash/config.js +23 -5
  3. package/dist/commands/slash/config.js.map +1 -1
  4. package/dist/commands/slash/todo.js +1 -1
  5. package/dist/commands/slash/todo.js.map +1 -1
  6. package/dist/core/CoWorkerAgent.d.ts.map +1 -1
  7. package/dist/core/CoWorkerAgent.js +6 -3
  8. package/dist/core/CoWorkerAgent.js.map +1 -1
  9. package/dist/permissions/PermissionInterceptor.js +1 -1
  10. package/dist/permissions/PermissionInterceptor.js.map +1 -1
  11. package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
  12. package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
  13. package/dist/skills/defaults/ai-ml/rag.md +276 -0
  14. package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
  15. package/dist/skills/defaults/backend-development/api-design.md +285 -0
  16. package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
  17. package/dist/skills/defaults/backend-development/async-python.md +237 -0
  18. package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
  19. package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
  20. package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
  21. package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
  22. package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
  23. package/dist/skills/defaults/backend-development/database-design.md +305 -0
  24. package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
  25. package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
  26. package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
  27. package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
  28. package/dist/skills/defaults/backend-development/fastapi.md +309 -0
  29. package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
  30. package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
  31. package/dist/skills/defaults/backend-development/microservices.md +284 -0
  32. package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
  33. package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
  34. package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
  35. package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
  36. package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
  37. package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
  38. package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
  39. package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
  40. package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
  41. package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
  42. package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
  43. package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
  44. package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
  45. package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
  46. package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
  47. package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
  48. package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
  49. package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
  50. package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
  51. package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
  52. package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
  53. package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
  54. package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
  55. package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
  56. package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
  57. package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
  58. package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
  59. package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
  60. package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
  61. package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
  62. package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
  63. package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
  64. package/dist/skills/defaults/data-engineering/airflow.md +519 -0
  65. package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
  66. package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
  67. package/dist/skills/defaults/data-engineering/dbt.md +556 -0
  68. package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
  69. package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
  70. package/dist/skills/defaults/data-engineering/spark.md +411 -0
  71. package/dist/skills/defaults/database/postgresql.md +202 -0
  72. package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
  73. package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
  74. package/dist/skills/defaults/devops/changelog-automation.md +580 -0
  75. package/dist/skills/defaults/devops/cicd.md +314 -0
  76. package/dist/skills/defaults/devops/cloud.md +263 -0
  77. package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
  78. package/dist/skills/defaults/devops/cost-optimization.md +295 -0
  79. package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
  80. package/dist/skills/defaults/devops/docker.md +281 -0
  81. package/dist/skills/defaults/devops/git-workflows.md +205 -0
  82. package/dist/skills/defaults/devops/github-actions.md +311 -0
  83. package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
  84. package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
  85. package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
  86. package/dist/skills/defaults/devops/kubernetes.md +339 -0
  87. package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
  88. package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
  89. package/dist/skills/defaults/devops/observability.md +243 -0
  90. package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
  91. package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
  92. package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
  93. package/dist/skills/defaults/devops/secrets-management.md +341 -0
  94. package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
  95. package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
  96. package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
  97. package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
  98. package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
  99. package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
  100. package/dist/skills/defaults/frontend/interaction-design.md +327 -0
  101. package/dist/skills/defaults/frontend/javascript.md +311 -0
  102. package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
  103. package/dist/skills/defaults/frontend/react-native-design.md +440 -0
  104. package/dist/skills/defaults/frontend/react.md +345 -0
  105. package/dist/skills/defaults/frontend/responsive-design.md +472 -0
  106. package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
  107. package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
  108. package/dist/skills/defaults/frontend/typescript.md +334 -0
  109. package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
  110. package/dist/skills/defaults/frontend/web-component-design.md +279 -0
  111. package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
  112. package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
  113. package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
  114. package/dist/skills/defaults/kubernetes/gitops.md +280 -0
  115. package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
  116. package/dist/skills/defaults/kubernetes/helm.md +343 -0
  117. package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
  118. package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
  119. package/dist/skills/defaults/kubernetes/manifests.md +330 -0
  120. package/dist/skills/defaults/kubernetes/security.md +337 -0
  121. package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
  122. package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
  123. package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
  124. package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
  125. package/dist/skills/defaults/llm-application/langchain.md +259 -0
  126. package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
  127. package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
  128. package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
  129. package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
  130. package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
  131. package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
  132. package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
  133. package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
  134. package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
  135. package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
  136. package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
  137. package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
  138. package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
  139. package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
  140. package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
  141. package/dist/skills/defaults/security/auditor.md +168 -0
  142. package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
  143. package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
  144. package/dist/skills/defaults/security/mtls-configuration.md +349 -0
  145. package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
  146. package/dist/skills/defaults/security/sast-configuration.md +182 -0
  147. package/dist/skills/defaults/security/security.md +313 -0
  148. package/dist/skills/defaults/security/stride-analysis.md +273 -0
  149. package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
  150. package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
  151. package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
  152. package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
  153. package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
  154. package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
  155. package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
  156. package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
  157. package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
  158. package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
  159. package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
  160. package/dist/skills/defaults/testing/testing.md +332 -0
  161. package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
  162. package/dist/skills/defaults/workflows/track-management.md +592 -0
  163. package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
  164. package/dist/skills/index.d.ts +11 -0
  165. package/dist/skills/index.d.ts.map +1 -0
  166. package/dist/skills/index.js +129 -0
  167. package/dist/skills/index.js.map +1 -0
  168. package/dist/utils/character.js +6 -9
  169. package/dist/utils/character.js.map +1 -1
  170. package/dist/utils/contextManager.js +3 -7
  171. package/dist/utils/contextManager.js.map +1 -1
  172. package/dist/utils/inputbar.d.ts.map +1 -1
  173. package/dist/utils/inputbar.js +8 -1
  174. package/dist/utils/inputbar.js.map +1 -1
  175. package/dist/utils/output.d.ts.map +1 -1
  176. package/dist/utils/output.js +3 -35
  177. package/dist/utils/output.js.map +1 -1
  178. package/package.json +1 -1
@@ -0,0 +1,545 @@
1
+ ---
2
+ name: screen-reader-testing
3
+ description: Test web applications with screen readers including VoiceOver, NVDA, and JAWS. Use when validating screen reader compatibility, debugging accessibility issues, or ensuring assistive technology support.
4
+ ---
5
+
6
+ # Screen Reader Testing
7
+
8
+ Practical guide to testing web applications with screen readers for comprehensive accessibility validation.
9
+
10
+ ## When to Use This Skill
11
+
12
+ - Validating screen reader compatibility
13
+ - Testing ARIA implementations
14
+ - Debugging assistive technology issues
15
+ - Verifying form accessibility
16
+ - Testing dynamic content announcements
17
+ - Ensuring navigation accessibility
18
+
19
+ ## Core Concepts
20
+
21
+ ### 1. Major Screen Readers
22
+
23
+ | Screen Reader | Platform | Browser | Usage |
24
+ | ------------- | --------- | -------------- | ----- |
25
+ | **VoiceOver** | macOS/iOS | Safari | ~15% |
26
+ | **NVDA** | Windows | Firefox/Chrome | ~31% |
27
+ | **JAWS** | Windows | Chrome/IE | ~40% |
28
+ | **TalkBack** | Android | Chrome | ~10% |
29
+ | **Narrator** | Windows | Edge | ~4% |
30
+
31
+ ### 2. Testing Priority
32
+
33
+ ```
34
+ Minimum Coverage:
35
+ 1. NVDA + Firefox (Windows)
36
+ 2. VoiceOver + Safari (macOS)
37
+ 3. VoiceOver + Safari (iOS)
38
+
39
+ Comprehensive Coverage:
40
+ + JAWS + Chrome (Windows)
41
+ + TalkBack + Chrome (Android)
42
+ + Narrator + Edge (Windows)
43
+ ```
44
+
45
+ ### 3. Screen Reader Modes
46
+
47
+ | Mode | Purpose | When Used |
48
+ | ------------------ | ---------------------- | ----------------- |
49
+ | **Browse/Virtual** | Read content | Default reading |
50
+ | **Focus/Forms** | Interact with controls | Filling forms |
51
+ | **Application** | Custom widgets | ARIA applications |
52
+
53
+ ## VoiceOver (macOS)
54
+
55
+ ### Setup
56
+
57
+ ```
58
+ Enable: System Preferences → Accessibility → VoiceOver
59
+ Toggle: Cmd + F5
60
+ Quick Toggle: Triple-press Touch ID
61
+ ```
62
+
63
+ ### Essential Commands
64
+
65
+ ```
66
+ Navigation:
67
+ VO = Ctrl + Option (VoiceOver modifier)
68
+
69
+ VO + Right Arrow Next element
70
+ VO + Left Arrow Previous element
71
+ VO + Shift + Down Enter group
72
+ VO + Shift + Up Exit group
73
+
74
+ Reading:
75
+ VO + A Read all from cursor
76
+ Ctrl Stop speaking
77
+ VO + B Read current paragraph
78
+
79
+ Interaction:
80
+ VO + Space Activate element
81
+ VO + Shift + M Open menu
82
+ Tab Next focusable element
83
+ Shift + Tab Previous focusable element
84
+
85
+ Rotor (VO + U):
86
+ Navigate by: Headings, Links, Forms, Landmarks
87
+ Left/Right Arrow Change rotor category
88
+ Up/Down Arrow Navigate within category
89
+ Enter Go to item
90
+
91
+ Web Specific:
92
+ VO + Cmd + H Next heading
93
+ VO + Cmd + J Next form control
94
+ VO + Cmd + L Next link
95
+ VO + Cmd + T Next table
96
+ ```
97
+
98
+ ### Testing Checklist
99
+
100
+ ```markdown
101
+ ## VoiceOver Testing Checklist
102
+
103
+ ### Page Load
104
+
105
+ - [ ] Page title announced
106
+ - [ ] Main landmark found
107
+ - [ ] Skip link works
108
+
109
+ ### Navigation
110
+
111
+ - [ ] All headings discoverable via rotor
112
+ - [ ] Heading levels logical (H1 → H2 → H3)
113
+ - [ ] Landmarks properly labeled
114
+ - [ ] Skip links functional
115
+
116
+ ### Links & Buttons
117
+
118
+ - [ ] Link purpose clear
119
+ - [ ] Button actions described
120
+ - [ ] New window/tab announced
121
+
122
+ ### Forms
123
+
124
+ - [ ] All labels read with inputs
125
+ - [ ] Required fields announced
126
+ - [ ] Error messages read
127
+ - [ ] Instructions available
128
+ - [ ] Focus moves to errors
129
+
130
+ ### Dynamic Content
131
+
132
+ - [ ] Alerts announced immediately
133
+ - [ ] Loading states communicated
134
+ - [ ] Content updates announced
135
+ - [ ] Modals trap focus correctly
136
+
137
+ ### Tables
138
+
139
+ - [ ] Headers associated with cells
140
+ - [ ] Table navigation works
141
+ - [ ] Complex tables have captions
142
+ ```
143
+
144
+ ### Common Issues & Fixes
145
+
146
+ ```html
147
+ <!-- Issue: Button not announcing purpose -->
148
+ <button><svg>...</svg></button>
149
+
150
+ <!-- Fix -->
151
+ <button aria-label="Close dialog"><svg aria-hidden="true">...</svg></button>
152
+
153
+ <!-- Issue: Dynamic content not announced -->
154
+ <div id="results">New results loaded</div>
155
+
156
+ <!-- Fix -->
157
+ <div id="results" role="status" aria-live="polite">New results loaded</div>
158
+
159
+ <!-- Issue: Form error not read -->
160
+ <input type="email" />
161
+ <span class="error">Invalid email</span>
162
+
163
+ <!-- Fix -->
164
+ <input type="email" aria-invalid="true" aria-describedby="email-error" />
165
+ <span id="email-error" role="alert">Invalid email</span>
166
+ ```
167
+
168
+ ## NVDA (Windows)
169
+
170
+ ### Setup
171
+
172
+ ```
173
+ Download: nvaccess.org
174
+ Start: Ctrl + Alt + N
175
+ Stop: Insert + Q
176
+ ```
177
+
178
+ ### Essential Commands
179
+
180
+ ```
181
+ Navigation:
182
+ Insert = NVDA modifier
183
+
184
+ Down Arrow Next line
185
+ Up Arrow Previous line
186
+ Tab Next focusable
187
+ Shift + Tab Previous focusable
188
+
189
+ Reading:
190
+ NVDA + Down Arrow Say all
191
+ Ctrl Stop speech
192
+ NVDA + Up Arrow Current line
193
+
194
+ Headings:
195
+ H Next heading
196
+ Shift + H Previous heading
197
+ 1-6 Heading level 1-6
198
+
199
+ Forms:
200
+ F Next form field
201
+ B Next button
202
+ E Next edit field
203
+ X Next checkbox
204
+ C Next combo box
205
+
206
+ Links:
207
+ K Next link
208
+ U Next unvisited link
209
+ V Next visited link
210
+
211
+ Landmarks:
212
+ D Next landmark
213
+ Shift + D Previous landmark
214
+
215
+ Tables:
216
+ T Next table
217
+ Ctrl + Alt + Arrows Navigate cells
218
+
219
+ Elements List (NVDA + F7):
220
+ Shows all links, headings, form fields, landmarks
221
+ ```
222
+
223
+ ### Browse vs Focus Mode
224
+
225
+ ```
226
+ NVDA automatically switches modes:
227
+ - Browse Mode: Arrow keys navigate content
228
+ - Focus Mode: Arrow keys control interactive elements
229
+
230
+ Manual switch: NVDA + Space
231
+
232
+ Watch for:
233
+ - "Browse mode" announcement when navigating
234
+ - "Focus mode" when entering form fields
235
+ - Application role forces forms mode
236
+ ```
237
+
238
+ ### Testing Script
239
+
240
+ ```markdown
241
+ ## NVDA Test Script
242
+
243
+ ### Initial Load
244
+
245
+ 1. Navigate to page
246
+ 2. Let page finish loading
247
+ 3. Press Insert + Down to read all
248
+ 4. Note: Page title, main content identified?
249
+
250
+ ### Landmark Navigation
251
+
252
+ 1. Press D repeatedly
253
+ 2. Check: All main areas reachable?
254
+ 3. Check: Landmarks properly labeled?
255
+
256
+ ### Heading Navigation
257
+
258
+ 1. Press Insert + F7 → Headings
259
+ 2. Check: Logical heading structure?
260
+ 3. Press H to navigate headings
261
+ 4. Check: All sections discoverable?
262
+
263
+ ### Form Testing
264
+
265
+ 1. Press F to find first form field
266
+ 2. Check: Label read?
267
+ 3. Fill in invalid data
268
+ 4. Submit form
269
+ 5. Check: Errors announced?
270
+ 6. Check: Focus moved to error?
271
+
272
+ ### Interactive Elements
273
+
274
+ 1. Tab through all interactive elements
275
+ 2. Check: Each announces role and state
276
+ 3. Activate buttons with Enter/Space
277
+ 4. Check: Result announced?
278
+
279
+ ### Dynamic Content
280
+
281
+ 1. Trigger content update
282
+ 2. Check: Change announced?
283
+ 3. Open modal
284
+ 4. Check: Focus trapped?
285
+ 5. Close modal
286
+ 6. Check: Focus returns?
287
+ ```
288
+
289
+ ## JAWS (Windows)
290
+
291
+ ### Essential Commands
292
+
293
+ ```
294
+ Start: Desktop shortcut or Ctrl + Alt + J
295
+ Virtual Cursor: Auto-enabled in browsers
296
+
297
+ Navigation:
298
+ Arrow keys Navigate content
299
+ Tab Next focusable
300
+ Insert + Down Read all
301
+ Ctrl Stop speech
302
+
303
+ Quick Keys:
304
+ H Next heading
305
+ T Next table
306
+ F Next form field
307
+ B Next button
308
+ G Next graphic
309
+ L Next list
310
+ ; Next landmark
311
+
312
+ Forms Mode:
313
+ Enter Enter forms mode
314
+ Numpad + Exit forms mode
315
+ F5 List form fields
316
+
317
+ Lists:
318
+ Insert + F7 Link list
319
+ Insert + F6 Heading list
320
+ Insert + F5 Form field list
321
+
322
+ Tables:
323
+ Ctrl + Alt + Arrows Table navigation
324
+ ```
325
+
326
+ ## TalkBack (Android)
327
+
328
+ ### Setup
329
+
330
+ ```
331
+ Enable: Settings → Accessibility → TalkBack
332
+ Toggle: Hold both volume buttons 3 seconds
333
+ ```
334
+
335
+ ### Gestures
336
+
337
+ ```
338
+ Explore: Drag finger across screen
339
+ Next: Swipe right
340
+ Previous: Swipe left
341
+ Activate: Double tap
342
+ Scroll: Two finger swipe
343
+
344
+ Reading Controls (swipe up then right):
345
+ - Headings
346
+ - Links
347
+ - Controls
348
+ - Characters
349
+ - Words
350
+ - Lines
351
+ - Paragraphs
352
+ ```
353
+
354
+ ## Common Test Scenarios
355
+
356
+ ### 1. Modal Dialog
357
+
358
+ ```html
359
+ <!-- Accessible modal structure -->
360
+ <div
361
+ role="dialog"
362
+ aria-modal="true"
363
+ aria-labelledby="dialog-title"
364
+ aria-describedby="dialog-desc"
365
+ >
366
+ <h2 id="dialog-title">Confirm Delete</h2>
367
+ <p id="dialog-desc">This action cannot be undone.</p>
368
+ <button>Cancel</button>
369
+ <button>Delete</button>
370
+ </div>
371
+ ```
372
+
373
+ ```javascript
374
+ // Focus management
375
+ function openModal(modal) {
376
+ // Store last focused element
377
+ lastFocus = document.activeElement;
378
+
379
+ // Move focus to modal
380
+ modal.querySelector("h2").focus();
381
+
382
+ // Trap focus
383
+ modal.addEventListener("keydown", trapFocus);
384
+ }
385
+
386
+ function closeModal(modal) {
387
+ // Return focus
388
+ lastFocus.focus();
389
+ }
390
+
391
+ function trapFocus(e) {
392
+ if (e.key === "Tab") {
393
+ const focusable = modal.querySelectorAll(
394
+ 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',
395
+ );
396
+ const first = focusable[0];
397
+ const last = focusable[focusable.length - 1];
398
+
399
+ if (e.shiftKey && document.activeElement === first) {
400
+ last.focus();
401
+ e.preventDefault();
402
+ } else if (!e.shiftKey && document.activeElement === last) {
403
+ first.focus();
404
+ e.preventDefault();
405
+ }
406
+ }
407
+
408
+ if (e.key === "Escape") {
409
+ closeModal(modal);
410
+ }
411
+ }
412
+ ```
413
+
414
+ ### 2. Live Regions
415
+
416
+ ```html
417
+ <!-- Status messages (polite) -->
418
+ <div role="status" aria-live="polite" aria-atomic="true">
419
+ <!-- Content updates will be announced after current speech -->
420
+ </div>
421
+
422
+ <!-- Alerts (assertive) -->
423
+ <div role="alert" aria-live="assertive">
424
+ <!-- Content updates interrupt current speech -->
425
+ </div>
426
+
427
+ <!-- Progress updates -->
428
+ <div
429
+ role="progressbar"
430
+ aria-valuenow="75"
431
+ aria-valuemin="0"
432
+ aria-valuemax="100"
433
+ aria-label="Upload progress"
434
+ ></div>
435
+
436
+ <!-- Log (additions only) -->
437
+ <div role="log" aria-live="polite" aria-relevant="additions">
438
+ <!-- New messages announced, removals not -->
439
+ </div>
440
+ ```
441
+
442
+ ### 3. Tab Interface
443
+
444
+ ```html
445
+ <div role="tablist" aria-label="Product information">
446
+ <button role="tab" id="tab-1" aria-selected="true" aria-controls="panel-1">
447
+ Description
448
+ </button>
449
+ <button
450
+ role="tab"
451
+ id="tab-2"
452
+ aria-selected="false"
453
+ aria-controls="panel-2"
454
+ tabindex="-1"
455
+ >
456
+ Reviews
457
+ </button>
458
+ </div>
459
+
460
+ <div role="tabpanel" id="panel-1" aria-labelledby="tab-1">
461
+ Product description content...
462
+ </div>
463
+
464
+ <div role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>
465
+ Reviews content...
466
+ </div>
467
+ ```
468
+
469
+ ```javascript
470
+ // Tab keyboard navigation
471
+ tablist.addEventListener("keydown", (e) => {
472
+ const tabs = [...tablist.querySelectorAll('[role="tab"]')];
473
+ const index = tabs.indexOf(document.activeElement);
474
+
475
+ let newIndex;
476
+ switch (e.key) {
477
+ case "ArrowRight":
478
+ newIndex = (index + 1) % tabs.length;
479
+ break;
480
+ case "ArrowLeft":
481
+ newIndex = (index - 1 + tabs.length) % tabs.length;
482
+ break;
483
+ case "Home":
484
+ newIndex = 0;
485
+ break;
486
+ case "End":
487
+ newIndex = tabs.length - 1;
488
+ break;
489
+ default:
490
+ return;
491
+ }
492
+
493
+ tabs[newIndex].focus();
494
+ activateTab(tabs[newIndex]);
495
+ e.preventDefault();
496
+ });
497
+ ```
498
+
499
+ ## Debugging Tips
500
+
501
+ ```javascript
502
+ // Log what screen reader sees
503
+ function logAccessibleName(element) {
504
+ const computed = window.getComputedStyle(element);
505
+ console.log({
506
+ role: element.getAttribute("role") || element.tagName,
507
+ name:
508
+ element.getAttribute("aria-label") ||
509
+ element.getAttribute("aria-labelledby") ||
510
+ element.textContent,
511
+ state: {
512
+ expanded: element.getAttribute("aria-expanded"),
513
+ selected: element.getAttribute("aria-selected"),
514
+ checked: element.getAttribute("aria-checked"),
515
+ disabled: element.disabled,
516
+ },
517
+ visible: computed.display !== "none" && computed.visibility !== "hidden",
518
+ });
519
+ }
520
+ ```
521
+
522
+ ## Best Practices
523
+
524
+ ### Do's
525
+
526
+ - **Test with actual screen readers** - Not just simulators
527
+ - **Use semantic HTML first** - ARIA is supplemental
528
+ - **Test in browse and focus modes** - Different experiences
529
+ - **Verify focus management** - Especially for SPAs
530
+ - **Test keyboard only first** - Foundation for SR testing
531
+
532
+ ### Don'ts
533
+
534
+ - **Don't assume one SR is enough** - Test multiple
535
+ - **Don't ignore mobile** - Growing user base
536
+ - **Don't test only happy path** - Test error states
537
+ - **Don't skip dynamic content** - Most common issues
538
+ - **Don't rely on visual testing** - Different experience
539
+
540
+ ## Resources
541
+
542
+ - [VoiceOver User Guide](https://support.apple.com/guide/voiceover/welcome/mac)
543
+ - [NVDA User Guide](https://www.nvaccess.org/files/nvda/documentation/userGuide.html)
544
+ - [JAWS Documentation](https://support.freedomscientific.com/Products/Blindness/JAWS)
545
+ - [WebAIM Screen Reader Survey](https://webaim.org/projects/screenreadersurvey/)