@olives/devos 2.1.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.
Files changed (741) hide show
  1. package/.agents/AGENTS.md +316 -0
  2. package/.agents/README.md +55 -0
  3. package/.agents/agents/architect.md +18 -0
  4. package/.agents/agents/dba.md +25 -0
  5. package/.agents/agents/developer.md +40 -0
  6. package/.agents/agents/devops.md +18 -0
  7. package/.agents/agents/memory-manager.md +38 -0
  8. package/.agents/agents/orchestrator.md +92 -0
  9. package/.agents/agents/qa.md +53 -0
  10. package/.agents/agents/release-manager.md +41 -0
  11. package/.agents/agents/researcher.md +19 -0
  12. package/.agents/agents/security.md +27 -0
  13. package/.agents/agents/tester.md +21 -0
  14. package/.agents/commands/README.md +42 -0
  15. package/.agents/commands/architect.md +16 -0
  16. package/.agents/commands/commit.md +15 -0
  17. package/.agents/commands/deploy.md +18 -0
  18. package/.agents/commands/fix.md +19 -0
  19. package/.agents/commands/refactor.md +19 -0
  20. package/.agents/commands/research.md +19 -0
  21. package/.agents/commands/review.md +21 -0
  22. package/.agents/commands/secure.md +23 -0
  23. package/.agents/commands/status.md +16 -0
  24. package/.agents/commands/test.md +16 -0
  25. package/.agents/scripts/commit.sh +73 -0
  26. package/.agents/scripts/install-hooks.sh +72 -0
  27. package/.agents/skills/agent-browser/SKILL.md +50 -0
  28. package/.agents/skills/agent-development/SKILL.md +415 -0
  29. package/.agents/skills/agent-development/examples/agent-creation-prompt.md +238 -0
  30. package/.agents/skills/agent-development/examples/complete-agent-examples.md +427 -0
  31. package/.agents/skills/agent-development/references/agent-creation-system-prompt.md +207 -0
  32. package/.agents/skills/agent-development/references/system-prompt-design.md +411 -0
  33. package/.agents/skills/agent-development/references/triggering-examples.md +491 -0
  34. package/.agents/skills/agent-development/scripts/validate-agent.sh +217 -0
  35. package/.agents/skills/backend-dev-guidelines/SKILL.md +352 -0
  36. package/.agents/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
  37. package/.agents/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
  38. package/.agents/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
  39. package/.agents/skills/backend-dev-guidelines/resources/configuration.md +275 -0
  40. package/.agents/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
  41. package/.agents/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
  42. package/.agents/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
  43. package/.agents/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
  44. package/.agents/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
  45. package/.agents/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
  46. package/.agents/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
  47. package/.agents/skills/backend-development/SKILL.md +156 -0
  48. package/.agents/skills/backend-patterns/SKILL.md +562 -0
  49. package/.agents/skills/brainstorming/SKILL.md +159 -0
  50. package/.agents/skills/brainstorming/scripts/frame-template.html +213 -0
  51. package/.agents/skills/brainstorming/scripts/helper.js +167 -0
  52. package/.agents/skills/brainstorming/scripts/server.cjs +723 -0
  53. package/.agents/skills/brainstorming/scripts/start-server.sh +209 -0
  54. package/.agents/skills/brainstorming/scripts/stop-server.sh +120 -0
  55. package/.agents/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  56. package/.agents/skills/brainstorming/visual-companion.md +291 -0
  57. package/.agents/skills/code-reviewer/SKILL.md +65 -0
  58. package/.agents/skills/content-strategy/SKILL.md +365 -0
  59. package/.agents/skills/content-strategy/evals/evals.json +90 -0
  60. package/.agents/skills/content-strategy/references/headless-cms.md +194 -0
  61. package/.agents/skills/deploy-to-vercel/SKILL.md +296 -0
  62. package/.agents/skills/deploy-to-vercel/resources/deploy-codex.sh +301 -0
  63. package/.agents/skills/deploy-to-vercel/resources/deploy.sh +301 -0
  64. package/.agents/skills/deployment-checklist/SKILL.md +119 -0
  65. package/.agents/skills/design/SKILL.md +170 -0
  66. package/.agents/skills/design-an-interface/SKILL.md +94 -0
  67. package/.agents/skills/expose-localhost/SKILL.md +211 -0
  68. package/.agents/skills/expose-localhost/references/TROUBLESHOOTING.md +27 -0
  69. package/.agents/skills/find-skills/SKILL.md +142 -0
  70. package/.agents/skills/frontend-ui-engineering/SKILL.md +328 -0
  71. package/.agents/skills/git-commit/SKILL.md +124 -0
  72. package/.agents/skills/git-ops/SKILL.md +53 -0
  73. package/.agents/skills/git-workflow/SKILL.md +167 -0
  74. package/.agents/skills/google-agents-cli-adk-code/SKILL.md +72 -0
  75. package/.agents/skills/google-agents-cli-adk-code/references/adk-python.md +937 -0
  76. package/.agents/skills/google-agents-cli-adk-code/references/adk-workflows.md +507 -0
  77. package/.agents/skills/google-agents-cli-workflow/SKILL.md +310 -0
  78. package/.agents/skills/google-agents-cli-workflow/references/commands.md +12 -0
  79. package/.agents/skills/google-agents-cli-workflow/references/internals.md +24 -0
  80. package/.agents/skills/google-agents-cli-workflow/references/samples.md +59 -0
  81. package/.agents/skills/google-agents-cli-workflow/references/spec-template.md +25 -0
  82. package/.agents/skills/google-agents-cli-workflow/references/terminology.md +11 -0
  83. package/.agents/skills/grill-me/SKILL.md +47 -0
  84. package/.agents/skills/grill-with-docs/SKILL.md +7 -0
  85. package/.agents/skills/human-checkpoint/SKILL.md +21 -0
  86. package/.agents/skills/image/SKILL.md +340 -0
  87. package/.agents/skills/image/evals/evals.json +89 -0
  88. package/.agents/skills/image/references/ai-image-prompting.md +229 -0
  89. package/.agents/skills/image-generation/SKILL.md +374 -0
  90. package/.agents/skills/imagegen/LICENSE.txt +201 -0
  91. package/.agents/skills/imagegen/SKILL.md +279 -0
  92. package/.agents/skills/imagegen/agents/openai.yaml +6 -0
  93. package/.agents/skills/imagegen/assets/imagegen-small.svg +5 -0
  94. package/.agents/skills/imagegen/assets/imagegen.png +0 -0
  95. package/.agents/skills/imagegen/references/cli.md +160 -0
  96. package/.agents/skills/imagegen/references/codex-network.md +33 -0
  97. package/.agents/skills/imagegen/references/image-api.md +49 -0
  98. package/.agents/skills/imagegen/references/prompting.md +98 -0
  99. package/.agents/skills/imagegen/references/sample-prompts.md +376 -0
  100. package/.agents/skills/imagegen/scripts/image_gen.py +926 -0
  101. package/.agents/skills/imagegen-frontend-web/SKILL.md +987 -0
  102. package/.agents/skills/laravel-security/SKILL.md +948 -0
  103. package/.agents/skills/laravel-specialist/SKILL.md +264 -0
  104. package/.agents/skills/laravel-specialist/references/eloquent.md +351 -0
  105. package/.agents/skills/laravel-specialist/references/livewire.md +512 -0
  106. package/.agents/skills/laravel-specialist/references/queues.md +423 -0
  107. package/.agents/skills/laravel-specialist/references/routing.md +362 -0
  108. package/.agents/skills/laravel-specialist/references/testing.md +522 -0
  109. package/.agents/skills/laravel-tdd/SKILL.md +675 -0
  110. package/.agents/skills/laravel-verification/SKILL.md +180 -0
  111. package/.agents/skills/modern-web-guidance/SKILL.md +114 -0
  112. package/.agents/skills/modern-web-guidance/guides/accessibility/accessibility.md +463 -0
  113. package/.agents/skills/modern-web-guidance/guides/accessibility/accessible-error-announcement.md +207 -0
  114. package/.agents/skills/modern-web-guidance/guides/built-in-ai/language-detection.md +89 -0
  115. package/.agents/skills/modern-web-guidance/guides/built-in-ai/language-model.md +189 -0
  116. package/.agents/skills/modern-web-guidance/guides/built-in-ai/prompt-api.md +189 -0
  117. package/.agents/skills/modern-web-guidance/guides/built-in-ai/summarizer.md +154 -0
  118. package/.agents/skills/modern-web-guidance/guides/built-in-ai/translator.md +162 -0
  119. package/.agents/skills/modern-web-guidance/guides/css/css.md +527 -0
  120. package/.agents/skills/modern-web-guidance/guides/css/highlight-text-ranges.md +128 -0
  121. package/.agents/skills/modern-web-guidance/guides/css-layout/css-layout.md +305 -0
  122. package/.agents/skills/modern-web-guidance/guides/forms/animated-select-picker.md +178 -0
  123. package/.agents/skills/modern-web-guidance/guides/forms/autofill-address-form.md +75 -0
  124. package/.agents/skills/modern-web-guidance/guides/forms/autofill-highlight-inputs.md +45 -0
  125. package/.agents/skills/modern-web-guidance/guides/forms/autofill-payment-form.md +125 -0
  126. package/.agents/skills/modern-web-guidance/guides/forms/autofill-sign-in-form.md +135 -0
  127. package/.agents/skills/modern-web-guidance/guides/forms/autofill-sign-up-form.md +145 -0
  128. package/.agents/skills/modern-web-guidance/guides/forms/brand-consistent-forms.md +255 -0
  129. package/.agents/skills/modern-web-guidance/guides/forms/branded-select-styling.md +114 -0
  130. package/.agents/skills/modern-web-guidance/guides/forms/custom-select-picker-layouts.md +103 -0
  131. package/.agents/skills/modern-web-guidance/guides/forms/form-fields-automatically-fit-contents.md +121 -0
  132. package/.agents/skills/modern-web-guidance/guides/forms/forms.md +372 -0
  133. package/.agents/skills/modern-web-guidance/guides/forms/required-field-feedback.md +214 -0
  134. package/.agents/skills/modern-web-guidance/guides/forms/rich-media-picker.md +132 -0
  135. package/.agents/skills/modern-web-guidance/guides/forms/select-menu-interaction.md +180 -0
  136. package/.agents/skills/modern-web-guidance/guides/forms/validate-input-after-interaction.md +258 -0
  137. package/.agents/skills/modern-web-guidance/guides/html/html.md +407 -0
  138. package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-authentication.md +205 -0
  139. package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-conditional-create.md +134 -0
  140. package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-management.md +211 -0
  141. package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-reauthentication.md +128 -0
  142. package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-registration.md +181 -0
  143. package/.agents/skills/modern-web-guidance/guides/passkeys/passkeys.md +38 -0
  144. package/.agents/skills/modern-web-guidance/guides/performance/batch-analytics-events.md +154 -0
  145. package/.agents/skills/modern-web-guidance/guides/performance/break-up-long-tasks.md +60 -0
  146. package/.agents/skills/modern-web-guidance/guides/performance/calculate-total-foreground-time.md +69 -0
  147. package/.agents/skills/modern-web-guidance/guides/performance/conditional-async-dependencies.md +71 -0
  148. package/.agents/skills/modern-web-guidance/guides/performance/defer-rendering-heavy-content.md +106 -0
  149. package/.agents/skills/modern-web-guidance/guides/performance/defer-work-until-scroll-ends.md +78 -0
  150. package/.agents/skills/modern-web-guidance/guides/performance/deprioritize-background-fetches.md +37 -0
  151. package/.agents/skills/modern-web-guidance/guides/performance/detect-initial-visibility-state.md +99 -0
  152. package/.agents/skills/modern-web-guidance/guides/performance/efficient-background-processing.md +117 -0
  153. package/.agents/skills/modern-web-guidance/guides/performance/faster-spa-view-transitions.md +79 -0
  154. package/.agents/skills/modern-web-guidance/guides/performance/full-session-analytics.md +135 -0
  155. package/.agents/skills/modern-web-guidance/guides/performance/identify-heavy-scripts.md +69 -0
  156. package/.agents/skills/modern-web-guidance/guides/performance/identify-inp-causes.md +73 -0
  157. package/.agents/skills/modern-web-guidance/guides/performance/improve-next-page-load-performance.md +119 -0
  158. package/.agents/skills/modern-web-guidance/guides/performance/interactions-in-complex-layouts.md +78 -0
  159. package/.agents/skills/modern-web-guidance/guides/performance/optimize-image-priority.md +61 -0
  160. package/.agents/skills/modern-web-guidance/guides/performance/optimize-preload-priority.md +41 -0
  161. package/.agents/skills/modern-web-guidance/guides/performance/optimize-script-priority.md +38 -0
  162. package/.agents/skills/modern-web-guidance/guides/performance/performance.md +366 -0
  163. package/.agents/skills/modern-web-guidance/guides/performance/resolution-optimized-pseudo-elements.md +47 -0
  164. package/.agents/skills/modern-web-guidance/guides/performance/schedule-tasks-by-priority.md +59 -0
  165. package/.agents/skills/modern-web-guidance/guides/performance/sequence-distributed-events.md +76 -0
  166. package/.agents/skills/modern-web-guidance/guides/privacy/privacy.md +247 -0
  167. package/.agents/skills/modern-web-guidance/guides/security/security.md +350 -0
  168. package/.agents/skills/modern-web-guidance/guides/user-experience/adapt-scrollbar-to-contrast-preferences.md +74 -0
  169. package/.agents/skills/modern-web-guidance/guides/user-experience/anchor-positioning-tab-underline.md +95 -0
  170. package/.agents/skills/modern-web-guidance/guides/user-experience/animate-element-entry-exit.md +131 -0
  171. package/.agents/skills/modern-web-guidance/guides/user-experience/animate-to-from-top-layer.md +140 -0
  172. package/.agents/skills/modern-web-guidance/guides/user-experience/animate-to-intrinsic-sizes.md +127 -0
  173. package/.agents/skills/modern-web-guidance/guides/user-experience/apply-webgl-shaders.md +239 -0
  174. package/.agents/skills/modern-web-guidance/guides/user-experience/calculate-event-differentials.md +85 -0
  175. package/.agents/skills/modern-web-guidance/guides/user-experience/calculate-with-intrinsic-sizes.md +196 -0
  176. package/.agents/skills/modern-web-guidance/guides/user-experience/capture-location-agnostic-data.md +63 -0
  177. package/.agents/skills/modern-web-guidance/guides/user-experience/carousel-slide-effects.md +187 -0
  178. package/.agents/skills/modern-web-guidance/guides/user-experience/carousel-snap-highlights.md +136 -0
  179. package/.agents/skills/modern-web-guidance/guides/user-experience/child-state-based-styling.md +101 -0
  180. package/.agents/skills/modern-web-guidance/guides/user-experience/complex-shapes.md +73 -0
  181. package/.agents/skills/modern-web-guidance/guides/user-experience/component-specific-light-dark-theme.md +179 -0
  182. package/.agents/skills/modern-web-guidance/guides/user-experience/consistent-cross-document-transitions.md +226 -0
  183. package/.agents/skills/modern-web-guidance/guides/user-experience/content-based-styling.md +118 -0
  184. package/.agents/skills/modern-web-guidance/guides/user-experience/coordinate-global-events.md +79 -0
  185. package/.agents/skills/modern-web-guidance/guides/user-experience/cross-document-transitions.md +127 -0
  186. package/.agents/skills/modern-web-guidance/guides/user-experience/custom-button-actions.md +173 -0
  187. package/.agents/skills/modern-web-guidance/guides/user-experience/customize-scrollbar-color-and-thickness.md +59 -0
  188. package/.agents/skills/modern-web-guidance/guides/user-experience/dark-mode.md +295 -0
  189. package/.agents/skills/modern-web-guidance/guides/user-experience/declarative-dialog-popover-control.md +238 -0
  190. package/.agents/skills/modern-web-guidance/guides/user-experience/deliver-optimized-decorative-images.md +49 -0
  191. package/.agents/skills/modern-web-guidance/guides/user-experience/design-token-reactivity.md +174 -0
  192. package/.agents/skills/modern-web-guidance/guides/user-experience/directional-navigation-transitions.md +125 -0
  193. package/.agents/skills/modern-web-guidance/guides/user-experience/dynamic-sibling-animations.md +54 -0
  194. package/.agents/skills/modern-web-guidance/guides/user-experience/dynamic-sibling-styling.md +98 -0
  195. package/.agents/skills/modern-web-guidance/guides/user-experience/export-html-media-from-canvas.md +256 -0
  196. package/.agents/skills/modern-web-guidance/guides/user-experience/expose-canvas-content-to-browser-features.md +401 -0
  197. package/.agents/skills/modern-web-guidance/guides/user-experience/flicker-free-client-side-ab-testing.md +168 -0
  198. package/.agents/skills/modern-web-guidance/guides/user-experience/fluid-scaling.md +78 -0
  199. package/.agents/skills/modern-web-guidance/guides/user-experience/format-human-readable-durations.md +87 -0
  200. package/.agents/skills/modern-web-guidance/guides/user-experience/group-element-transitions.md +124 -0
  201. package/.agents/skills/modern-web-guidance/guides/user-experience/improve-text-layout-and-legibility.md +76 -0
  202. package/.agents/skills/modern-web-guidance/guides/user-experience/individual-transform-properties.md +92 -0
  203. package/.agents/skills/modern-web-guidance/guides/user-experience/interactive-content-in-3d-scenes.md +383 -0
  204. package/.agents/skills/modern-web-guidance/guides/user-experience/interactive-content-reveal.md +118 -0
  205. package/.agents/skills/modern-web-guidance/guides/user-experience/interest-triggered-action-previews.md +79 -0
  206. package/.agents/skills/modern-web-guidance/guides/user-experience/interest-triggered-tooltips.md +132 -0
  207. package/.agents/skills/modern-web-guidance/guides/user-experience/light-dismiss-a-dialog.md +84 -0
  208. package/.agents/skills/modern-web-guidance/guides/user-experience/manage-recurring-intervals.md +73 -0
  209. package/.agents/skills/modern-web-guidance/guides/user-experience/model-partial-time-concepts.md +96 -0
  210. package/.agents/skills/modern-web-guidance/guides/user-experience/move-dom-element-without-losing-state.md +57 -0
  211. package/.agents/skills/modern-web-guidance/guides/user-experience/navigation-drawer.md +357 -0
  212. package/.agents/skills/modern-web-guidance/guides/user-experience/overflow-clipping-control.md +180 -0
  213. package/.agents/skills/modern-web-guidance/guides/user-experience/parallax-scroll-effects.md +230 -0
  214. package/.agents/skills/modern-web-guidance/guides/user-experience/persistent-app-tours.md +112 -0
  215. package/.agents/skills/modern-web-guidance/guides/user-experience/persistent-toast-notifications.md +30 -0
  216. package/.agents/skills/modern-web-guidance/guides/user-experience/persistent-top-layer-ui.md +48 -0
  217. package/.agents/skills/modern-web-guidance/guides/user-experience/physics-based-easing.md +118 -0
  218. package/.agents/skills/modern-web-guidance/guides/user-experience/platform-controls-dismiss-dialog.md +38 -0
  219. package/.agents/skills/modern-web-guidance/guides/user-experience/position-aware-tooltips.md +154 -0
  220. package/.agents/skills/modern-web-guidance/guides/user-experience/precise-text-alignment.md +99 -0
  221. package/.agents/skills/modern-web-guidance/guides/user-experience/prevent-text-wrapping.md +62 -0
  222. package/.agents/skills/modern-web-guidance/guides/user-experience/pull-to-reveal.md +83 -0
  223. package/.agents/skills/modern-web-guidance/guides/user-experience/reduce-style-repetition.md +87 -0
  224. package/.agents/skills/modern-web-guidance/guides/user-experience/resilient-context-menus-and-nested-dropdowns.md +102 -0
  225. package/.agents/skills/modern-web-guidance/guides/user-experience/same-document-transitions.md +177 -0
  226. package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-entry-exit-effects.md +173 -0
  227. package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-position-aware-elements.md +128 -0
  228. package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-progress-indicator.md +133 -0
  229. package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-snap-realtime-feedback.md +153 -0
  230. package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-snap-state-sync.md +93 -0
  231. package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-target-on-load.md +56 -0
  232. package/.agents/skills/modern-web-guidance/guides/user-experience/scrollability-affordance-hints.md +124 -0
  233. package/.agents/skills/modern-web-guidance/guides/user-experience/scrollytelling.md +181 -0
  234. package/.agents/skills/modern-web-guidance/guides/user-experience/search-hidden-content.md +136 -0
  235. package/.agents/skills/modern-web-guidance/guides/user-experience/shaped-cutouts.md +146 -0
  236. package/.agents/skills/modern-web-guidance/guides/user-experience/shrinking-header-on-scroll.md +126 -0
  237. package/.agents/skills/modern-web-guidance/guides/user-experience/size-aware-styling.md +104 -0
  238. package/.agents/skills/modern-web-guidance/guides/user-experience/soft-edge-content-fade.md +62 -0
  239. package/.agents/skills/modern-web-guidance/guides/user-experience/stabilize-reactive-state.md +72 -0
  240. package/.agents/skills/modern-web-guidance/guides/user-experience/stack-drill-down.md +680 -0
  241. package/.agents/skills/modern-web-guidance/guides/user-experience/style-parent-with-has.md +199 -0
  242. package/.agents/skills/modern-web-guidance/guides/user-experience/support-global-calendar-systems.md +107 -0
  243. package/.agents/skills/modern-web-guidance/guides/user-experience/swipe-to-remove.md +527 -0
  244. package/.agents/skills/modern-web-guidance/guides/user-experience/visually-stable-font-fallbacks.md +49 -0
  245. package/.agents/skills/modern-web-guidance/guides/user-experience/visually-stable-mixed-fonts.md +61 -0
  246. package/.agents/skills/modern-web-guidance/guides/user-experience/visually-texture-content.md +76 -0
  247. package/.agents/skills/modern-web-guidance/guides/webmcp/agentic-forms.md +116 -0
  248. package/.agents/skills/modern-web-guidance/guides/webmcp/agentic-javascript-tools.md +116 -0
  249. package/.agents/skills/modern-web-guidance/guides/webmcp/webmcp.md +43 -0
  250. package/.agents/skills/nextjs-app-router-patterns/SKILL.md +114 -0
  251. package/.agents/skills/nextjs-app-router-patterns/references/details.md +428 -0
  252. package/.agents/skills/nextjs-developer/SKILL.md +145 -0
  253. package/.agents/skills/nextjs-developer/references/app-router.md +311 -0
  254. package/.agents/skills/nextjs-developer/references/data-fetching.md +482 -0
  255. package/.agents/skills/nextjs-developer/references/deployment.md +545 -0
  256. package/.agents/skills/nextjs-developer/references/server-actions.md +462 -0
  257. package/.agents/skills/nextjs-developer/references/server-components.md +384 -0
  258. package/.agents/skills/nextjs-supabase-auth/SKILL.md +313 -0
  259. package/.agents/skills/nodejs-backend-patterns/SKILL.md +45 -0
  260. package/.agents/skills/nodejs-backend-patterns/references/advanced-patterns.md +430 -0
  261. package/.agents/skills/nodejs-backend-patterns/references/details.md +599 -0
  262. package/.agents/skills/performance-engineer/SKILL.md +181 -0
  263. package/.agents/skills/project-requirements/SKILL.md +43 -0
  264. package/.agents/skills/qa/SKILL.md +130 -0
  265. package/.agents/skills/security-review/LICENSE +22 -0
  266. package/.agents/skills/security-review/SKILL.md +312 -0
  267. package/.agents/skills/security-review/infrastructure/docker.md +432 -0
  268. package/.agents/skills/security-review/languages/javascript.md +387 -0
  269. package/.agents/skills/security-review/languages/python.md +363 -0
  270. package/.agents/skills/security-review/references/api-security.md +519 -0
  271. package/.agents/skills/security-review/references/authentication.md +353 -0
  272. package/.agents/skills/security-review/references/authorization.md +372 -0
  273. package/.agents/skills/security-review/references/business-logic.md +443 -0
  274. package/.agents/skills/security-review/references/cryptography.md +329 -0
  275. package/.agents/skills/security-review/references/csrf.md +398 -0
  276. package/.agents/skills/security-review/references/data-protection.md +378 -0
  277. package/.agents/skills/security-review/references/deserialization.md +410 -0
  278. package/.agents/skills/security-review/references/error-handling.md +436 -0
  279. package/.agents/skills/security-review/references/file-security.md +457 -0
  280. package/.agents/skills/security-review/references/injection.md +259 -0
  281. package/.agents/skills/security-review/references/logging.md +433 -0
  282. package/.agents/skills/security-review/references/misconfiguration.md +435 -0
  283. package/.agents/skills/security-review/references/modern-threats.md +475 -0
  284. package/.agents/skills/security-review/references/ssrf.md +413 -0
  285. package/.agents/skills/security-review/references/supply-chain.md +405 -0
  286. package/.agents/skills/security-review/references/xss.md +336 -0
  287. package/.agents/skills/seo-aeo-best-practices/SKILL.md +37 -0
  288. package/.agents/skills/seo-aeo-best-practices/references/aeo-considerations.md +159 -0
  289. package/.agents/skills/seo-aeo-best-practices/references/eeat-principles.md +127 -0
  290. package/.agents/skills/seo-aeo-best-practices/references/structured-data.md +183 -0
  291. package/.agents/skills/seo-aeo-best-practices/references/technical-seo.md +188 -0
  292. package/.agents/skills/seo-geo/.claude-plugin/plugin.json +29 -0
  293. package/.agents/skills/seo-geo/SKILL.md +250 -0
  294. package/.agents/skills/seo-geo/examples/opc-skills-case-study.md +330 -0
  295. package/.agents/skills/seo-geo/references/geo-research.md +319 -0
  296. package/.agents/skills/seo-geo/references/google-docs-summary.md +65 -0
  297. package/.agents/skills/seo-geo/references/platform-algorithms.md +354 -0
  298. package/.agents/skills/seo-geo/references/schema-templates.md +517 -0
  299. package/.agents/skills/seo-geo/references/seo-checklist.md +249 -0
  300. package/.agents/skills/seo-geo/references/tools-and-apis.md +313 -0
  301. package/.agents/skills/seo-geo/scripts/autocomplete_ideas.py +74 -0
  302. package/.agents/skills/seo-geo/scripts/backlinks.py +37 -0
  303. package/.agents/skills/seo-geo/scripts/competitor_gap.py +80 -0
  304. package/.agents/skills/seo-geo/scripts/credential.py +12 -0
  305. package/.agents/skills/seo-geo/scripts/dataforseo_api.py +104 -0
  306. package/.agents/skills/seo-geo/scripts/domain_overview.py +44 -0
  307. package/.agents/skills/seo-geo/scripts/keyword_research.py +38 -0
  308. package/.agents/skills/seo-geo/scripts/related_keywords.py +84 -0
  309. package/.agents/skills/seo-geo/scripts/seo_audit.py +151 -0
  310. package/.agents/skills/seo-geo/scripts/serp_analysis.py +41 -0
  311. package/.agents/skills/shadcn-ui/README.md +248 -0
  312. package/.agents/skills/shadcn-ui/SKILL.md +326 -0
  313. package/.agents/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  314. package/.agents/skills/shadcn-ui/examples/data-table.tsx +313 -0
  315. package/.agents/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  316. package/.agents/skills/shadcn-ui/resources/component-catalog.md +481 -0
  317. package/.agents/skills/shadcn-ui/resources/customization-guide.md +516 -0
  318. package/.agents/skills/shadcn-ui/resources/migration-guide.md +463 -0
  319. package/.agents/skills/shadcn-ui/resources/setup-guide.md +412 -0
  320. package/.agents/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  321. package/.agents/skills/skill-creator/LICENSE.txt +202 -0
  322. package/.agents/skills/skill-creator/SKILL.md +485 -0
  323. package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
  324. package/.agents/skills/skill-creator/agents/comparator.md +202 -0
  325. package/.agents/skills/skill-creator/agents/grader.md +223 -0
  326. package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
  327. package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  328. package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  329. package/.agents/skills/skill-creator/references/schemas.md +430 -0
  330. package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
  331. package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  332. package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
  333. package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
  334. package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
  335. package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
  336. package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
  337. package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
  338. package/.agents/skills/skill-creator/scripts/utils.py +47 -0
  339. package/.agents/skills/stacks/SKILL.md +21 -0
  340. package/.agents/skills/stacks/django.md +187 -0
  341. package/.agents/skills/stacks/express.md +16 -0
  342. package/.agents/skills/stacks/fastapi.md +17 -0
  343. package/.agents/skills/stacks/laravel.md +18 -0
  344. package/.agents/skills/stacks/nextjs.md +20 -0
  345. package/.agents/skills/stacks/react-native.md +170 -0
  346. package/.agents/skills/supabase/CHANGELOG.md +35 -0
  347. package/.agents/skills/supabase/SKILL.md +135 -0
  348. package/.agents/skills/supabase/assets/feedback-issue-template.md +17 -0
  349. package/.agents/skills/supabase/references/skill-feedback.md +17 -0
  350. package/.agents/skills/supabase-postgres-best-practices/CHANGELOG.md +29 -0
  351. package/.agents/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  352. package/.agents/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  353. package/.agents/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  354. package/.agents/skills/supabase-postgres-best-practices/references/_template.md +34 -0
  355. package/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  356. package/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  357. package/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  358. package/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  359. package/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  360. package/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  361. package/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  362. package/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  363. package/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  364. package/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  365. package/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  366. package/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  367. package/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  368. package/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  369. package/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  370. package/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  371. package/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  372. package/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  373. package/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  374. package/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  375. package/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  376. package/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  377. package/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  378. package/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  379. package/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  380. package/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  381. package/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  382. package/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  383. package/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  384. package/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  385. package/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  386. package/.agents/skills/task-contract/SKILL.md +29 -0
  387. package/.agents/skills/token-optimization/SKILL.md +40 -0
  388. package/.agents/skills/ui-designer/SKILL.md +76 -0
  389. package/.agents/skills/ui-ux-pro-max/SKILL.md +704 -0
  390. package/.agents/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
  391. package/.agents/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
  392. package/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
  393. package/.agents/skills/ui-ux-pro-max/data/colors.csv +162 -0
  394. package/.agents/skills/ui-ux-pro-max/data/design.csv +1776 -0
  395. package/.agents/skills/ui-ux-pro-max/data/draft.csv +1779 -0
  396. package/.agents/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
  397. package/.agents/skills/ui-ux-pro-max/data/icons.csv +106 -0
  398. package/.agents/skills/ui-ux-pro-max/data/landing.csv +35 -0
  399. package/.agents/skills/ui-ux-pro-max/data/motion.csv +17 -0
  400. package/.agents/skills/ui-ux-pro-max/data/products.csv +162 -0
  401. package/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  402. package/.agents/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
  403. package/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  404. package/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  405. package/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  406. package/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  407. package/.agents/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
  408. package/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  409. package/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  410. package/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  411. package/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  412. package/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  413. package/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  414. package/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  415. package/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  416. package/.agents/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
  417. package/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  418. package/.agents/skills/ui-ux-pro-max/data/styles.csv +85 -0
  419. package/.agents/skills/ui-ux-pro-max/data/typography.csv +74 -0
  420. package/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
  421. package/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  422. package/.agents/skills/ui-ux-pro-max/scripts/core.py +274 -0
  423. package/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1329 -0
  424. package/.agents/skills/ui-ux-pro-max/scripts/search.py +127 -0
  425. package/.agents/skills/vercel-cli-with-tokens/SKILL.md +353 -0
  426. package/.agents/skills/vercel-composition-patterns/AGENTS.md +946 -0
  427. package/.agents/skills/vercel-composition-patterns/README.md +60 -0
  428. package/.agents/skills/vercel-composition-patterns/SKILL.md +89 -0
  429. package/.agents/skills/vercel-composition-patterns/metadata.json +11 -0
  430. package/.agents/skills/vercel-composition-patterns/rules/_sections.md +29 -0
  431. package/.agents/skills/vercel-composition-patterns/rules/_template.md +24 -0
  432. package/.agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  433. package/.agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  434. package/.agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  435. package/.agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  436. package/.agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  437. package/.agents/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  438. package/.agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  439. package/.agents/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  440. package/.agents/skills/vercel-optimize/AGENTS.md +48 -0
  441. package/.agents/skills/vercel-optimize/CONTRIBUTING.md +41 -0
  442. package/.agents/skills/vercel-optimize/README.md +91 -0
  443. package/.agents/skills/vercel-optimize/SKILL.md +322 -0
  444. package/.agents/skills/vercel-optimize/lib/auth-route.mjs +23 -0
  445. package/.agents/skills/vercel-optimize/lib/budget-summary.mjs +182 -0
  446. package/.agents/skills/vercel-optimize/lib/citations.mjs +139 -0
  447. package/.agents/skills/vercel-optimize/lib/cost-coverage.mjs +143 -0
  448. package/.agents/skills/vercel-optimize/lib/dedup-recs.mjs +325 -0
  449. package/.agents/skills/vercel-optimize/lib/deep-dive.mjs +350 -0
  450. package/.agents/skills/vercel-optimize/lib/display-labels.mjs +185 -0
  451. package/.agents/skills/vercel-optimize/lib/extract-claims.mjs +550 -0
  452. package/.agents/skills/vercel-optimize/lib/framework-support.mjs +67 -0
  453. package/.agents/skills/vercel-optimize/lib/gates/build-minutes-fanout.mjs +69 -0
  454. package/.agents/skills/vercel-optimize/lib/gates/cold-start.mjs +66 -0
  455. package/.agents/skills/vercel-optimize/lib/gates/contract.mjs +79 -0
  456. package/.agents/skills/vercel-optimize/lib/gates/cwv-poor.mjs +87 -0
  457. package/.agents/skills/vercel-optimize/lib/gates/external-api-slow.mjs +55 -0
  458. package/.agents/skills/vercel-optimize/lib/gates/hard-gates.mjs +73 -0
  459. package/.agents/skills/vercel-optimize/lib/gates/index.mjs +45 -0
  460. package/.agents/skills/vercel-optimize/lib/gates/isr-overrevalidation.mjs +62 -0
  461. package/.agents/skills/vercel-optimize/lib/gates/middleware-heavy.mjs +51 -0
  462. package/.agents/skills/vercel-optimize/lib/gates/observability-events-attribution.mjs +56 -0
  463. package/.agents/skills/vercel-optimize/lib/gates/platform-bot-protection.mjs +115 -0
  464. package/.agents/skills/vercel-optimize/lib/gates/platform-fluid-compute.mjs +83 -0
  465. package/.agents/skills/vercel-optimize/lib/gates/region-misconfig.mjs +64 -0
  466. package/.agents/skills/vercel-optimize/lib/gates/route-errors.mjs +80 -0
  467. package/.agents/skills/vercel-optimize/lib/gates/scanner-driven.mjs +122 -0
  468. package/.agents/skills/vercel-optimize/lib/gates/select-candidates.mjs +134 -0
  469. package/.agents/skills/vercel-optimize/lib/gates/slow-route.mjs +88 -0
  470. package/.agents/skills/vercel-optimize/lib/gates/types.d.ts +38 -0
  471. package/.agents/skills/vercel-optimize/lib/gates/uncached-route.mjs +93 -0
  472. package/.agents/skills/vercel-optimize/lib/gates/usage-spike-triage.mjs +121 -0
  473. package/.agents/skills/vercel-optimize/lib/grade-recommendation.mjs +155 -0
  474. package/.agents/skills/vercel-optimize/lib/impact-label.mjs +126 -0
  475. package/.agents/skills/vercel-optimize/lib/impact-magnitude.mjs +60 -0
  476. package/.agents/skills/vercel-optimize/lib/investigation-brief.mjs +610 -0
  477. package/.agents/skills/vercel-optimize/lib/observation-safety.mjs +174 -0
  478. package/.agents/skills/vercel-optimize/lib/project-facts.mjs +99 -0
  479. package/.agents/skills/vercel-optimize/lib/queries.mjs +315 -0
  480. package/.agents/skills/vercel-optimize/lib/reconcile-candidates.mjs +372 -0
  481. package/.agents/skills/vercel-optimize/lib/render-report.mjs +955 -0
  482. package/.agents/skills/vercel-optimize/lib/repo-root.mjs +86 -0
  483. package/.agents/skills/vercel-optimize/lib/route-normalize.mjs +220 -0
  484. package/.agents/skills/vercel-optimize/lib/sanitizers/bot-protection-certainty.mjs +38 -0
  485. package/.agents/skills/vercel-optimize/lib/sanitizers/cache-tag-invalidation-certainty.mjs +30 -0
  486. package/.agents/skills/vercel-optimize/lib/sanitizers/count-correct.mjs +52 -0
  487. package/.agents/skills/vercel-optimize/lib/sanitizers/function-duration-invocations.mjs +38 -0
  488. package/.agents/skills/vercel-optimize/lib/sanitizers/index.mjs +79 -0
  489. package/.agents/skills/vercel-optimize/lib/sanitizers/middleware-conflict.mjs +36 -0
  490. package/.agents/skills/vercel-optimize/lib/sanitizers/missing-citation.mjs +16 -0
  491. package/.agents/skills/vercel-optimize/lib/sanitizers/pre-release.mjs +74 -0
  492. package/.agents/skills/vercel-optimize/lib/sanitizers/rate-limit.mjs +67 -0
  493. package/.agents/skills/vercel-optimize/lib/sanitizers/rendering-mode-mislabel.mjs +38 -0
  494. package/.agents/skills/vercel-optimize/lib/sanitizers/undeclared-dep.mjs +78 -0
  495. package/.agents/skills/vercel-optimize/lib/sanitizers/vercel-directive-strip.mjs +37 -0
  496. package/.agents/skills/vercel-optimize/lib/sanitizers/window-units.mjs +32 -0
  497. package/.agents/skills/vercel-optimize/lib/scanners/cache-components-suspense-dedupe.mjs +109 -0
  498. package/.agents/skills/vercel-optimize/lib/scanners/edge-heavy-import.mjs +94 -0
  499. package/.agents/skills/vercel-optimize/lib/scanners/force-dynamic.mjs +42 -0
  500. package/.agents/skills/vercel-optimize/lib/scanners/headers-in-page.mjs +44 -0
  501. package/.agents/skills/vercel-optimize/lib/scanners/index.mjs +35 -0
  502. package/.agents/skills/vercel-optimize/lib/scanners/large-static-asset.mjs +92 -0
  503. package/.agents/skills/vercel-optimize/lib/scanners/max-age-without-s-maxage.mjs +42 -0
  504. package/.agents/skills/vercel-optimize/lib/scanners/middleware-broad-matcher.mjs +55 -0
  505. package/.agents/skills/vercel-optimize/lib/scanners/missing-cache-headers.mjs +90 -0
  506. package/.agents/skills/vercel-optimize/lib/scanners/prisma-include-tree.mjs +42 -0
  507. package/.agents/skills/vercel-optimize/lib/scanners/region-pin-in-config.mjs +88 -0
  508. package/.agents/skills/vercel-optimize/lib/scanners/source-maps-production.mjs +36 -0
  509. package/.agents/skills/vercel-optimize/lib/scanners/sveltekit-prerender-missing.mjs +43 -0
  510. package/.agents/skills/vercel-optimize/lib/scanners/turbo-force-bypass.mjs +129 -0
  511. package/.agents/skills/vercel-optimize/lib/scanners/unoptimized-image.mjs +113 -0
  512. package/.agents/skills/vercel-optimize/lib/scanners/use-cache-date-stamp.mjs +106 -0
  513. package/.agents/skills/vercel-optimize/lib/support-topics.mjs +355 -0
  514. package/.agents/skills/vercel-optimize/lib/throttle.mjs +273 -0
  515. package/.agents/skills/vercel-optimize/lib/util.mjs +17 -0
  516. package/.agents/skills/vercel-optimize/lib/vercel.mjs +864 -0
  517. package/.agents/skills/vercel-optimize/lib/verify-claim.mjs +1296 -0
  518. package/.agents/skills/vercel-optimize/lib/workspace-resolver.mjs +521 -0
  519. package/.agents/skills/vercel-optimize/metadata.json +14 -0
  520. package/.agents/skills/vercel-optimize/references/candidates.md +176 -0
  521. package/.agents/skills/vercel-optimize/references/data-collection.md +218 -0
  522. package/.agents/skills/vercel-optimize/references/docs-library.json +683 -0
  523. package/.agents/skills/vercel-optimize/references/doctrine.md +105 -0
  524. package/.agents/skills/vercel-optimize/references/observability-plus.md +108 -0
  525. package/.agents/skills/vercel-optimize/references/playbooks/README.md +53 -0
  526. package/.agents/skills/vercel-optimize/references/playbooks/ai-application.md +32 -0
  527. package/.agents/skills/vercel-optimize/references/playbooks/api-service.md +30 -0
  528. package/.agents/skills/vercel-optimize/references/playbooks/content-site.md +30 -0
  529. package/.agents/skills/vercel-optimize/references/playbooks/ecommerce.md +30 -0
  530. package/.agents/skills/vercel-optimize/references/playbooks/marketing.md +30 -0
  531. package/.agents/skills/vercel-optimize/references/playbooks/saas.md +31 -0
  532. package/.agents/skills/vercel-optimize/references/playbooks/sveltekit.md +75 -0
  533. package/.agents/skills/vercel-optimize/references/recommendations.md +203 -0
  534. package/.agents/skills/vercel-optimize/references/scanner-patterns.md +251 -0
  535. package/.agents/skills/vercel-optimize/references/scoring.md +205 -0
  536. package/.agents/skills/vercel-optimize/references/support-topics/README.md +46 -0
  537. package/.agents/skills/vercel-optimize/references/support-topics/astro-edge-middleware-scope.md +22 -0
  538. package/.agents/skills/vercel-optimize/references/support-topics/astro-output-mode-and-isr.md +22 -0
  539. package/.agents/skills/vercel-optimize/references/support-topics/auth-preserving-parallelization.md +22 -0
  540. package/.agents/skills/vercel-optimize/references/support-topics/bot-protection-product-guardrails.md +22 -0
  541. package/.agents/skills/vercel-optimize/references/support-topics/build-minutes-monorepo-fanout.md +23 -0
  542. package/.agents/skills/vercel-optimize/references/support-topics/cache-components-static-shell-boundaries.md +22 -0
  543. package/.agents/skills/vercel-optimize/references/support-topics/cache-components-suspense-dedupe-pitfall.md +23 -0
  544. package/.agents/skills/vercel-optimize/references/support-topics/cdn-cache-auth-safety.md +22 -0
  545. package/.agents/skills/vercel-optimize/references/support-topics/cold-start-initialization-bundle.md +22 -0
  546. package/.agents/skills/vercel-optimize/references/support-topics/core-web-vitals-client-bottlenecks.md +22 -0
  547. package/.agents/skills/vercel-optimize/references/support-topics/database-egress-pooling-region.md +22 -0
  548. package/.agents/skills/vercel-optimize/references/support-topics/dynamic-rendering-traps.md +22 -0
  549. package/.agents/skills/vercel-optimize/references/support-topics/external-api-critical-path-platform.md +22 -0
  550. package/.agents/skills/vercel-optimize/references/support-topics/external-api-critical-path.md +22 -0
  551. package/.agents/skills/vercel-optimize/references/support-topics/fast-data-transfer-payloads.md +22 -0
  552. package/.agents/skills/vercel-optimize/references/support-topics/fluid-compute-caveats.md +22 -0
  553. package/.agents/skills/vercel-optimize/references/support-topics/function-duration-io-and-after.md +22 -0
  554. package/.agents/skills/vercel-optimize/references/support-topics/function-invocation-reduction.md +22 -0
  555. package/.agents/skills/vercel-optimize/references/support-topics/function-region-misconfiguration-ttfb.md +23 -0
  556. package/.agents/skills/vercel-optimize/references/support-topics/image-optimization-cost-control.md +22 -0
  557. package/.agents/skills/vercel-optimize/references/support-topics/isr-revalidation-static-generation.md +22 -0
  558. package/.agents/skills/vercel-optimize/references/support-topics/middleware-proxy-edge-cost.md +22 -0
  559. package/.agents/skills/vercel-optimize/references/support-topics/next-fetch-revalidate-floor.md +22 -0
  560. package/.agents/skills/vercel-optimize/references/support-topics/next-font-cls-self-hosting.md +23 -0
  561. package/.agents/skills/vercel-optimize/references/support-topics/next-heavy-ui-lazy-load-boundaries.md +23 -0
  562. package/.agents/skills/vercel-optimize/references/support-topics/next-image-lcp-preload-sizes.md +23 -0
  563. package/.agents/skills/vercel-optimize/references/support-topics/next-route-handler-get-cache-defaults.md +22 -0
  564. package/.agents/skills/vercel-optimize/references/support-topics/next-script-third-party-strategy.md +23 -0
  565. package/.agents/skills/vercel-optimize/references/support-topics/nextjs-version-cache-semantics.md +22 -0
  566. package/.agents/skills/vercel-optimize/references/support-topics/not-found-catchall-request-waste.md +23 -0
  567. package/.agents/skills/vercel-optimize/references/support-topics/nuxt-route-rules-cache-isr.md +22 -0
  568. package/.agents/skills/vercel-optimize/references/support-topics/observability-events-cost-attribution.md +22 -0
  569. package/.agents/skills/vercel-optimize/references/support-topics/post-response-work-waituntil.md +22 -0
  570. package/.agents/skills/vercel-optimize/references/support-topics/route-error-durable-offload.md +22 -0
  571. package/.agents/skills/vercel-optimize/references/support-topics/route-error-runtime-limits.md +22 -0
  572. package/.agents/skills/vercel-optimize/references/support-topics/runtime-cache-reusable-data.md +22 -0
  573. package/.agents/skills/vercel-optimize/references/support-topics/sveltekit-isr-prerender-safety.md +22 -0
  574. package/.agents/skills/vercel-optimize/references/support-topics/sveltekit-split-cold-start-tradeoff.md +22 -0
  575. package/.agents/skills/vercel-optimize/references/support-topics/usage-spike-triage.md +22 -0
  576. package/.agents/skills/vercel-optimize/references/support-topics/use-cache-date-stamp-isr-write-amplifier.md +23 -0
  577. package/.agents/skills/vercel-optimize/references/support-topics/use-cache-remote-shared-origin-data.md +22 -0
  578. package/.agents/skills/vercel-optimize/references/support-topics/workflow-resumable-stream-routes.md +23 -0
  579. package/.agents/skills/vercel-optimize/references/verification.md +102 -0
  580. package/.agents/skills/vercel-optimize/references/voice.md +76 -0
  581. package/.agents/skills/vercel-optimize/scripts/budget-summary.mjs +56 -0
  582. package/.agents/skills/vercel-optimize/scripts/build-docs.mjs +74 -0
  583. package/.agents/skills/vercel-optimize/scripts/check-citations.mjs +81 -0
  584. package/.agents/skills/vercel-optimize/scripts/check-docs-fresh.mjs +93 -0
  585. package/.agents/skills/vercel-optimize/scripts/collect-signals.mjs +576 -0
  586. package/.agents/skills/vercel-optimize/scripts/collect-sub-agent-outputs.mjs +296 -0
  587. package/.agents/skills/vercel-optimize/scripts/deep-dive.mjs +319 -0
  588. package/.agents/skills/vercel-optimize/scripts/gate-investigations.mjs +166 -0
  589. package/.agents/skills/vercel-optimize/scripts/merge-signals.mjs +192 -0
  590. package/.agents/skills/vercel-optimize/scripts/prepare-investigation-brief.mjs +231 -0
  591. package/.agents/skills/vercel-optimize/scripts/reconcile-candidates.mjs +62 -0
  592. package/.agents/skills/vercel-optimize/scripts/render-report.mjs +437 -0
  593. package/.agents/skills/vercel-optimize/scripts/scan-codebase.mjs +313 -0
  594. package/.agents/skills/vercel-optimize/scripts/verify-and-regen.mjs +346 -0
  595. package/.agents/skills/vercel-optimize/scripts/verify-finding.mjs +19 -0
  596. package/.agents/skills/vercel-react-best-practices/AGENTS.md +3810 -0
  597. package/.agents/skills/vercel-react-best-practices/README.md +123 -0
  598. package/.agents/skills/vercel-react-best-practices/SKILL.md +149 -0
  599. package/.agents/skills/vercel-react-best-practices/metadata.json +15 -0
  600. package/.agents/skills/vercel-react-best-practices/rules/_sections.md +46 -0
  601. package/.agents/skills/vercel-react-best-practices/rules/_template.md +28 -0
  602. package/.agents/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  603. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  604. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  605. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  606. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  607. package/.agents/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  608. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  609. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  610. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  611. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  612. package/.agents/skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  613. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  614. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  615. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  616. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  617. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  618. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  619. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  620. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  621. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  622. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  623. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  624. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  625. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  626. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  627. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  628. package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  629. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  630. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  631. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  632. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  633. package/.agents/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  634. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  635. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  636. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  637. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  638. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  639. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  640. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  641. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  642. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  643. package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  644. package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  645. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  646. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  647. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  648. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  649. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  650. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  651. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  652. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  653. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  654. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  655. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  656. package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  657. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  658. package/.agents/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  659. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  660. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  661. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  662. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  663. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  664. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  665. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  666. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  667. package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  668. package/.agents/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  669. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  670. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  671. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  672. package/.agents/skills/vercel-react-native-skills/AGENTS.md +2897 -0
  673. package/.agents/skills/vercel-react-native-skills/README.md +165 -0
  674. package/.agents/skills/vercel-react-native-skills/SKILL.md +121 -0
  675. package/.agents/skills/vercel-react-native-skills/metadata.json +16 -0
  676. package/.agents/skills/vercel-react-native-skills/rules/_sections.md +86 -0
  677. package/.agents/skills/vercel-react-native-skills/rules/_template.md +28 -0
  678. package/.agents/skills/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
  679. package/.agents/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  680. package/.agents/skills/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
  681. package/.agents/skills/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
  682. package/.agents/skills/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
  683. package/.agents/skills/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
  684. package/.agents/skills/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
  685. package/.agents/skills/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
  686. package/.agents/skills/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
  687. package/.agents/skills/vercel-react-native-skills/rules/list-performance-images.md +53 -0
  688. package/.agents/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
  689. package/.agents/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
  690. package/.agents/skills/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
  691. package/.agents/skills/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
  692. package/.agents/skills/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
  693. package/.agents/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  694. package/.agents/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  695. package/.agents/skills/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
  696. package/.agents/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  697. package/.agents/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  698. package/.agents/skills/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
  699. package/.agents/skills/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
  700. package/.agents/skills/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
  701. package/.agents/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  702. package/.agents/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  703. package/.agents/skills/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
  704. package/.agents/skills/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
  705. package/.agents/skills/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
  706. package/.agents/skills/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
  707. package/.agents/skills/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
  708. package/.agents/skills/vercel-react-native-skills/rules/ui-menus.md +174 -0
  709. package/.agents/skills/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
  710. package/.agents/skills/vercel-react-native-skills/rules/ui-pressable.md +61 -0
  711. package/.agents/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  712. package/.agents/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  713. package/.agents/skills/vercel-react-native-skills/rules/ui-styling.md +87 -0
  714. package/.agents/skills/vercel-react-view-transitions/AGENTS.md +955 -0
  715. package/.agents/skills/vercel-react-view-transitions/README.md +42 -0
  716. package/.agents/skills/vercel-react-view-transitions/SKILL.md +320 -0
  717. package/.agents/skills/vercel-react-view-transitions/metadata.json +12 -0
  718. package/.agents/skills/vercel-react-view-transitions/references/css-recipes.md +242 -0
  719. package/.agents/skills/vercel-react-view-transitions/references/implementation.md +182 -0
  720. package/.agents/skills/vercel-react-view-transitions/references/nextjs.md +176 -0
  721. package/.agents/skills/vercel-react-view-transitions/references/patterns.md +262 -0
  722. package/.agents/skills/web-design-guidelines/SKILL.md +39 -0
  723. package/.agents/skills/workflow-metrics/SKILL.md +18 -0
  724. package/.agents/skills/writing-guidelines/SKILL.md +39 -0
  725. package/CODING_STANDARDS.md +49 -0
  726. package/LICENSE +21 -0
  727. package/README.md +556 -0
  728. package/VERSION +1 -0
  729. package/bin/devos.js +893 -0
  730. package/docs/.gitkeep +0 -0
  731. package/docs/ARCHITECTURE.md +114 -0
  732. package/docs/CHANGELOG.md +61 -0
  733. package/docs/CURRENT_STATE.md +39 -0
  734. package/docs/FIELD_REPORT_2026-08-20.md +130 -0
  735. package/docs/GETTING_STARTED.md +130 -0
  736. package/docs/LESSONS.md +24 -0
  737. package/docs/PRE_COMMIT_HOOK.md +152 -0
  738. package/docs/SLASH_COMMANDS.md +116 -0
  739. package/docs/TUTORIAL.md +75 -0
  740. package/package.json +54 -0
  741. package/scripts/smoke-test.js +167 -0
@@ -0,0 +1,463 @@
1
+ # Accessibility Coding Guidelines
2
+
3
+ This guide provides actionable DOs and DON'Ts for AI coding agents to ensure web applications are accessible to all users, including those using assistive technologies.
4
+
5
+ Keep these principles in mind throughout:
6
+
7
+ - **Accessibility is the minimum, not the ceiling.** Conformance to standards is the floor; aim for genuine usability.
8
+ - **Patterns are use-case specific.** No checklist replaces real testing — including testing with disabled users — to confirm a given implementation is actually accessible in context.
9
+
10
+ ## 1. Content Navigability and Structure
11
+
12
+ ### Actionable Guidelines
13
+
14
+ #### DOs
15
+ - **Place all content within landmarks**: Wrap each relevant part of the page in `<header>`, `<nav>`, `<main>`, `<aside>`, and `<footer>` elements so assistive-tech users can jump between regions.
16
+ - **Structure main content with headings**: Use `<h1>`–`<h6>` sequentially (no jumping `<h1>` → `<h4>`) so screen-reader users get a navigable outline.
17
+ - **Use lists for repeated, contiguous content**: `<ul>`/`<ol>` give assistive tech a count up front and let users skip the entire group.
18
+ - **Provide skip links** prior to repeated content like site headers with navigation or long/infinite lists, so that keyboard users can easily bypass them. Make sure the target is focusable (e.g. `<main id="content" tabindex="-1">`).
19
+ - **Semantic Tables**: Use `<caption>` and `<th scope="col">` (or `<th scope="row">`) for data tables.
20
+
21
+ #### DON'Ts
22
+ - **Don't use fake headings**: Never style `<div>` or `<span>` to look like headings without standard `<h1>`–`<h6>` tags.
23
+ - **Don't place headings inside `<summary>`, and avoid relying on headings inside `<details>` content**: Headings inside `<summary>` may be hidden from screen-reader heading lists and heading-navigation shortcuts entirely; headings inside `<details>` content are only reachable via heading navigation when the disclosure is open.
24
+ - **Caveat**: If a heading must act as a disclosure trigger, use a more robust alternative to `<details>`/`<summary>` instead, e.g. an accordion or a disclosure implemented with ARIA where the heading wraps the button.
25
+ - **Don't use tables for layout**: Use CSS Grid/Flexbox for visual layouts.
26
+ - **Don't overuse landmarks**: Too many landmarks dilute their value. In particular, avoid labeling a `<section>` (which turns it into a `region` landmark) — `region` should be a last resort when no other landmark fits.
27
+
28
+ ### Code Examples
29
+
30
+ ```html
31
+ <!-- Good: Semantic landmarks, heading hierarchy, skip link -->
32
+ <header>
33
+ <a href="#content" class="skip-link visually-hidden">Skip to content</a>
34
+ <nav aria-label="Primary">
35
+ <ul>
36
+ <li><a href="/">Home</a></li>
37
+ </ul>
38
+ </nav>
39
+ </header>
40
+ <main id="content" tabindex="-1">
41
+ <h1>Platform Dashboard</h1>
42
+ <section>
43
+ <h2>User Statistics</h2>
44
+ <table>
45
+ <caption>Monthly active users</caption>
46
+ <tr>
47
+ <th scope="col">Month</th>
48
+ <th scope="col">Users</th>
49
+ </tr>
50
+ <tr>
51
+ <td>January</td>
52
+ <td>12,000</td>
53
+ </tr>
54
+ </table>
55
+ </section>
56
+ </main>
57
+ ```
58
+
59
+ ## 2. Semantic HTML and ARIA
60
+
61
+ ### Actionable Guidelines
62
+
63
+ #### DOs
64
+ - **Prefer HTML elements and attributes to ARIA**: A native element comes with the right role and behavior. `<button>` already implies `role="button"`; `required` already implies `aria-required`.
65
+ - **Match ARIA implementations to actual behavior**: If you set `role="tab"`, the element must behave like a tab — including keyboard interactions. Many ARIA patterns can't be implemented in CSS alone and need JavaScript.
66
+ - **Be deliberate about `disabled` vs `aria-disabled`**: `disabled` removes the element from the focus order entirely (and `tabindex="0"` won't bring it back), which is often wrong for toolbar buttons or links. `aria-disabled="true"` keeps the element focusable so users can land on it and learn it's disabled.
67
+
68
+ #### DON'Ts
69
+ - **Don't use ARIA when native HTML exists**: Avoid `<div role="button">` or `<a role="button">` if `<button>` works.
70
+ - **Don't add redundant ARIA roles or properties**: Avoid `<ul role="list">`, `<nav role="navigation">`, or `<input required aria-required="true">`.
71
+ - **Caveat**: Safari removes list semantics from `<ul>`/`<ol>` outside `<nav>` when `list-style: none` or `display: flex`/`grid` is applied. In that case `role="list"` is required to restore them.
72
+ - **Don't assume custom elements have no ARIA**: Custom elements can attach ARIA via `ElementInternals`, which some automated test tools can't see — so the absence of `role`/`aria-*` attributes in markup doesn't prove the element has no semantics. Verify with the browser's accessibility-tree inspector.
73
+
74
+ ## 3. Accessible Names and Descriptions
75
+
76
+ Every interactive element and some landmarks need an accessible name, and many benefit from an accessible description. Names are short and identify the element; descriptions add context.
77
+
78
+ ### Actionable Guidelines
79
+
80
+ #### DOs
81
+ - **Prefer native naming mechanisms**: `<label>` for form controls, `<caption>` for `<table>`, `<legend>` for `<fieldset>`, `<figcaption>` for `<figure>`.
82
+ - **Explicitly associate `<label>` with its control via `for`/`id`**, even when nesting the input inside the label — explicit association improves assistive-tech support.
83
+ - **Prefer `aria-labelledby` over `aria-label` when a visible label exists**: avoids duplication, improves maintainability, and translates better.
84
+ - **Prefer to reuse the same accessible name for hyperlinks that share an `href`.**
85
+ - **Use visually hidden text to disambiguate controls** that look identical visually but do different things (e.g. multiple "Edit" buttons in a list).
86
+
87
+ #### DON'Ts
88
+ - **Don't put `aria-label`/`aria-labelledby` on elements that shouldn't be named** — e.g. plain `<div>`, `<span>`, or custom elements without a role. Custom elements may have an implicit role set via `ElementInternals`, so the absence of a `role` attribute isn't conclusive.
89
+ - **Don't reuse an accessible name across controls with different effects in the same view** (close buttons for two different open dialogs are fine because only one is reachable at a time; multiple “Edit” buttons for different content is not).
90
+ - **Don't reuse an accessible name across hyperlinks pointing to different `href`s.**
91
+ - **Don't pack descriptions, error messages, or instructions into the label.**
92
+ - **Don't repeat state already exposed via ARIA** (`aria-expanded`, `aria-checked`, `aria-selected`, `aria-pressed`) inside the accessible name — it creates redundancy and ambiguity.
93
+ - **Don't include the role name in the label**: `<nav aria-label="Primary navigation">` reads as "Primary navigation navigation."
94
+ - **Don't use `title` or `placeholder` as a naming mechanism.**
95
+ - **Don't include interactive elements in an `aria-describedby` target** unless their text content reads sensibly as a description on its own (e.g. if a link’s text is the same as how it’s labelled elsewhere, it can be included within a description).
96
+
97
+ ### Code Example: Visually Hidden Utility
98
+
99
+ A `.visually-hidden` utility lets you provide text for screen readers without rendering it visually. It's commonly used for skip links, additional context on icon-only buttons, and supplementary labels.
100
+
101
+ ```css
102
+ /* Hides content visually but keeps it in the accessibility tree.
103
+ :focus-within / :active opt elements out — useful for skip links and
104
+ any focusable content wrapped in this class. */
105
+ .visually-hidden:where(:not(:focus-within, :active)) {
106
+ position: absolute !important;
107
+ clip-path: inset(50%) !important;
108
+ overflow: hidden !important;
109
+ width: 1px !important;
110
+ height: 1px !important;
111
+ margin: -1px !important;
112
+ padding: 0 !important;
113
+ border: 0 !important;
114
+ white-space: nowrap !important;
115
+ }
116
+ ```
117
+
118
+ When the hidden content is focusable (skip links, focus-receiving wrappers), the `:focus-within`/`:active` exception lets it become visible. Style the visible state per situation, e.g. a skip link to the main content typically wants fixed positioning at the top-left of the viewport so the rest of the page doesn't shift.
119
+
120
+ ## 4. Document Metadata and Language
121
+
122
+ ### Actionable Guidelines
123
+
124
+ #### DOs
125
+ - **Declare Visual Language**: Always set `<html lang="en">` (or appropriate code).
126
+ - **Unique Page Titles**: Front-load unique context in `<title>` (e.g., `Page Topic | Site Name`).
127
+ - **Inline Language Switches**: Use `lang="..."` for block quotes or text in different languages.
128
+ - **IFrame Titles**: Always provide a descriptive `title="..."` for `<iframe>` elements.
129
+ - **Update document title on Page Transitions in SPAs**: Shift focus to updated titles.
130
+
131
+ #### DON'Ts
132
+ - **Don't Disable iframe Scrolling**: Avoid `scrolling="no"` (deprecated) or `overflow: hidden` on iframes. Users who zoom in or enlarge text need to scroll to reach content that overflows.
133
+
134
+ ### Code Examples
135
+
136
+ ```html
137
+ <!-- Good: Distinct title and language declaration -->
138
+ <html lang="en">
139
+ <head>
140
+ <title>Analytics Reports | Guidance Platform</title>
141
+ </head>
142
+ <body>
143
+ <p>The motto is <span lang="la">"Carpe diem"</span>.</p>
144
+ <iframe title="Interactive Sales Chart" src="/chart"></iframe>
145
+ </body>
146
+ </html>
147
+ ```
148
+
149
+ ## 5. Keyboard and Focus Management
150
+
151
+ ### Actionable Guidelines
152
+
153
+ #### DOs
154
+ - **Logical Tab Order**: Ensure tab order matches visual layouts (top-to-bottom).
155
+ - **Visible Focus Indicators**: Always style `:focus-visible` states explicitly. If disabling defaults, provide overrides with sufficient contrast.
156
+ - **Custom Trigger Keyboards**: Attach Enter/Space handlers for custom simulated interactive elements. When implementing a custom keyboard handler for button-like elements, `Enter` should be a `keydown` handler and `Space` should be a `keyup` handler (matching native `<button>` behavior where `Enter` repeats and `Space` triggers on release).
157
+ - **Use `tabindex` deliberately**: Anything focusable — by keyboard or programmatically — should have an implicit or explicit ARIA role, so don't make every element focusable. When focus is needed, choose `tabindex="0"` to add the element to the tab order or `tabindex="-1"` to make it programmatically focusable only (e.g., a skip-link target).
158
+ - **Manage Toggle States**: Utilize `aria-expanded` and `aria-pressed` to communicate toggle states for custom controls.
159
+
160
+ #### DON'Ts
161
+ - **Don't disable outlines without replacements**: Avoid `outline: none` without styling alternatives.
162
+ - **Don't use Positive Tabindex values**: Never use `tabindex="1"` or greater.
163
+ - **Don't hide interactive elements from screen readers**: Avoid `aria-hidden="true"` or `role="presentation"` on elements that can receive focus.
164
+
165
+ ### Code Examples
166
+
167
+ ```css
168
+ /* Good: High contrast focus border */
169
+ :where(a:any-link, button):focus-visible {
170
+ outline: 3px solid #ff0055;
171
+ outline-offset: 3px;
172
+ }
173
+ ```
174
+
175
+ ```html
176
+ <!-- Good: Skip to main content -->
177
+ <a href="#content" class="skip-link">Skip to main content</a>
178
+ <main id="content" tabindex="-1">...</main>
179
+ ```
180
+
181
+ ```javascript
182
+ // Good: Keyboard handlers for complex custom widgets (e.g., Tree items, tabs).
183
+ // NOTE: This pattern applies ONLY to non-standard UI where no native HTML tag exists.
184
+ // Always prioritize native <button> or <input> elements for standard interactions.
185
+ // Elements MUST have the appropriate ARIA role (e.g., role="treeitem" or role="tab").
186
+ customWidget.addEventListener('keydown', (e) => {
187
+ if (e.key === 'Enter') {
188
+ toggleWidgetState();
189
+ }
190
+ if (e.key === ' ') {
191
+ e.preventDefault(); // Prevent page scrolling on Spacebar keydown
192
+ }
193
+ });
194
+
195
+ customWidget.addEventListener('keyup', (e) => {
196
+ if (e.key === ' ') {
197
+ toggleWidgetState();
198
+ }
199
+ });
200
+
201
+ function toggleWidgetState() {
202
+ // E.g., Manage toggle/expanded states for custom controls
203
+ const isExpanded = customWidget.getAttribute('aria-expanded') === 'true';
204
+ customWidget.setAttribute('aria-expanded', !isExpanded);
205
+ }
206
+ ```
207
+
208
+ ## 6. Alternate Text and Media
209
+
210
+ ### Actionable Guidelines
211
+
212
+ #### DOs
213
+ - **Informative Visual Descriptions**: Describe the purpose of the image (e.g., "Search", not "Magnifying glass").
214
+ - **Empty Alt properties for decorative visuals**: Use `alt=""` to remove decorative images from the accessibility tree so they aren't announced.
215
+ - **Synchronous Captions for videos**: Supply WebVTT captions for video tracks.
216
+ - **Transcripts for audio**: Provide text transcripts for purely audio podcasts.
217
+ - **Informative View Descriptions for inline SVGs**: Apply `role="img"` and a nested `<title>` tag for informative visuals.
218
+ - **Decorative SVGs removal**: Apply `aria-hidden="true"` to remove decorative SVGs from reading flows.
219
+ - **Long descriptions for complex images**: Use `<figure>`/`<figcaption>` or `aria-describedby` for charts and infographics.
220
+ - **Provide data tables as alternatives**: Consider providing semantic data tables as accessible alternatives for charts and other complex data visualizations.
221
+
222
+ #### DON'Ts
223
+ - **Don't use clichéd prefixes**: Avoid "Image of..." or "Picture of...".
224
+ - **Don't use underscores in filenames**: Use dashes if the filename might be announced as fallback.
225
+
226
+ ### Code Examples
227
+
228
+ ```html
229
+ <!-- Decorative -->
230
+ <img src="divider.png" alt="">
231
+
232
+ <!-- Inline Decorative SVG (remove from tab flow) -->
233
+ <svg aria-hidden="true" viewBox="0 0 24 24">
234
+ <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/>
235
+ </svg>
236
+
237
+ <!-- Informative (Functional) -->
238
+ <a href="/search">
239
+ <img src="glass.png" alt="Search the platform">
240
+ </a>
241
+
242
+ <!-- Video with Captions tracks -->
243
+ <video controls>
244
+ <source src="intro.mp4" type="video/mp4">
245
+ <track src="caps.vtt" kind="captions" srclang="en" label="English">
246
+ </video>
247
+
248
+ <!-- Complex graph with figcaption -->
249
+ <figure>
250
+ <img src="chart.png" alt="Sales growth graph 2024.">
251
+ <figcaption>Sales grew 20% in Q3 due to new platform launch.</figcaption>
252
+ </figure>
253
+
254
+ <!-- Audio with expandable transcript details -->
255
+ <audio controls src="podcast.mp3" aria-details="podcast-transcript"></audio>
256
+ <details id="podcast-transcript">
257
+ <summary>View Transcript</summary>
258
+ <div class="transcript-content">
259
+ Welcome to the show...
260
+ </div>
261
+ </details>
262
+ ```
263
+
264
+ ### Content Visibility Decision Matrix
265
+
266
+ | Intent | Visual | Screen Reader | Focusable | Structural Pattern |
267
+ | :--- | :--- | :--- | :--- | :--- |
268
+ | **Visible to all** | Yes | Yes | Yes | Standard rendering |
269
+ | **Screen Reader only** | No | Yes | Yes (if interactive) | Visually hidden utility (e.g. `.visually-hidden`) |
270
+ | **Visual only** | Yes | No | No | `aria-hidden="true"` / `role="presentation"` |
271
+ | **Hidden for all** | No | No | No | `hidden` attribute / `display: none` |
272
+
273
+ **Heuristic Rule**: If an element can receive keyboard focus, it must not be hidden via `aria-hidden="true"`.
274
+
275
+ ## 7. Forms and Input Controls
276
+
277
+ ### Actionable Guidelines
278
+
279
+ #### DOs
280
+ - **Connect Labels Programmatically**: Use `<label for="id">` linked to `<input id="id">`.
281
+ - **Use Autocomplete**: Set valid standard `autocomplete` options (e.g., `"email"` or `"given-name"`) for user profiles.
282
+ - **Link hints to inputs via `aria-describedby`**: Associate help text with inputs, and place the hint above the input so autocomplete popovers don't cover it during editing.
283
+ - **Announce dynamic errors via live regions**: Use `aria-live` or shift focus to error lists.
284
+ - **Provide form validation constraints**: Use `required` (or `aria-required="true"` only when `required` isn't applicable) to signal mandatory inputs.
285
+
286
+ #### DON'Ts
287
+ - **Don't use placeholders as labels**: Placeholders are not persistent labels.
288
+ - **Don't trigger context shifts on focus changes**: Avoid auto-submitting forms or jumping pages on focus change events alone.
289
+
290
+ ### Code Examples
291
+
292
+ ```html
293
+ <!-- Good: Semantic forms with hints for passwords -->
294
+ <form>
295
+ <label for="pwd">Password:</label>
296
+ <span id="pwd-hint">Must contain at least 8 characters.</span>
297
+ <input id="pwd" type="password" aria-describedby="pwd-hint" autocomplete="current-password" required>
298
+ </form>
299
+ ```
300
+
301
+ ## 8. Live Regions
302
+
303
+ Live regions let assistive tech announce content updates that aren't tied to navigation or focus changes. They're easy to misuse — too many regions, or noisy ones, quickly become spam for screen-reader users.
304
+
305
+ ### Live Region Urgency Table
306
+
307
+ | Urgency | Visual Analogue | `aria-live` Value | Behavioral Impact | Example |
308
+ | :--- | :--- | :--- | :--- | :--- |
309
+ | **Critical** | Modal / Alert | `assertive` (or `role="alert"`) | Interrupts immediately, clears speech queue | Session timeout, API failure |
310
+ | **Standard**| Toast / Banner | `polite` | Announces at next graceful break | Search results, "Saved" status |
311
+ | **Passive** | Silent text | `off` | Only if user navigates to it | Live character count |
312
+
313
+ **Heuristic Rule**: Use `assertive` only for critical, time-sensitive updates that require immediate attention or prevent safe continuation (e.g., data loss, session timeouts, or network drops).
314
+
315
+ ### Actionable Guidelines
316
+
317
+ #### DOs
318
+ - **Centralize live regions for non-visible announcements**: A single `polite` region and a single `assertive` region per page (with whatever `aria-atomic` configuration you need) keeps announcements consistent and easier to maintain. Many frameworks ship their own announcer abstraction — use it.
319
+ - **Debounce frequently-changing regions**: If a region can update many times per second (e.g. a combobox's result count as the user types), debounce so users aren't spammed.
320
+ - **Delay slightly when other announcements may collide**: When the user is typing or focus is being managed, a small delay before announcing keeps live-region updates from overlapping other speech.
321
+
322
+ #### DON'Ts
323
+ - **Don't use live regions for interstitial states** like "Loading…" or "Updating…" unless they're meaningfully informative — they usually just create noise.
324
+ - **Don't add live-region updates to inert DOM**: When dialogs open or sections become `inert`, queued or debounced messages can end up unannounced — or announced from DOM the user can't reach. Coordinate live-region updates with dialog/inert state changes.
325
+
326
+ ### Code Example
327
+
328
+ ```html
329
+ <!-- Session Timeout Warning with controls -->
330
+ <div role="alert" class="timeout-warning">
331
+ Your session will expire in 2 minutes.
332
+ <button type="button" onclick="extendSession()">Extend Session</button>
333
+ </div>
334
+ ```
335
+
336
+ ## 9. Color, Contrast, and Typography
337
+
338
+ ### Actionable Guidelines
339
+
340
+ #### DOs
341
+ - **Minimum contrast standards**: Maintain 4.5:1 for normal text and 3:1 for large text or icons.
342
+ - **Ensure non-text contrast standards**: Maintain a minimum contrast ratio of 3:1 for user interface component boundaries and states.
343
+ - This includes visual elements (borders, backgrounds, box-shadows, underlines) that form the boundary or indicate the presence of a UI component (e.g., input field borders).
344
+ - This also includes visual elements indicating active states within a component (e.g., checkbox checkmarks or switch thumbs).
345
+ - **Caveat**: Meeting 3:1 non-text contrast can challenge minimalistic designs. Soft gradients or subtle inset/outset shadows can soften visual boundaries while satisfying accessibility requirements.
346
+ - **Use multiple state indicators**: Do not denote success/errors ONLY with color. Use icons or text.
347
+ - **Relative font size units**: Use `rem` or `em` for font sizes instead of `px`.
348
+ - **Consistent or Start alignment**: Avoid `justify` alignment as it can be more difficult to read.
349
+ - **Avoid long lines of text**: Cap paragraph blocks to a maximum of 80 characters width.
350
+ - **Support user zoom preferences**: Allow users to resize text up to 200% without loss of content or functionality.
351
+ - **Support light and dark color schemes**: Honor `@media (prefers-color-scheme: dark)` and pair it with the `color-scheme` CSS property so form controls, scrollbars, and other UA-rendered surfaces match.
352
+ - **Use `prefers-contrast` only when warranted**: Reach for `@media (prefers-contrast: more)` when the design uses low-contrast accents (e.g., subtle borders, muted secondary text) that need to be reinforced; most sites that already meet baseline contrast won't need it.
353
+
354
+ #### DON'Ts
355
+ - **Don't use color alone to indicate the presence of a user interface component or its state**: Use iconography and/or shape to help differentiate.
356
+ - **Don't use Justified Text Alignment**: Avoid `text-align: justify`.
357
+ - **Don't use Ornate fonts**: Omit cursive typefaces for main reading content.
358
+ - **Don't rely on all-caps for emphasis**: Prefer bolding for visual emphasis, and use `<em>`/`<strong>` when the emphasis is semantic.
359
+ - **Limit emphasis overall**: Emphasis loses meaning when it's everywhere — apply it only where it changes how the content should be read.
360
+
361
+ ### Code Examples
362
+
363
+ ```css
364
+ /* Good: Relative sizing and line caps */
365
+ body {
366
+ line-height: 1.5;
367
+ text-align: start; /* Supports LTR and RTL */
368
+ }
369
+ article {
370
+ max-width: 80ch; /* Caps line length to ~80 characters for readability */
371
+ }
372
+ ```
373
+
374
+ ```html
375
+ <!-- Good: Denotes state without colors alone -->
376
+ <div class="error-msg">
377
+ <span aria-hidden="true">❌</span>
378
+ <span>The password entered was invalid.</span>
379
+ </div>
380
+ ```
381
+
382
+ ```css
383
+ /* Dark Mode support variables */
384
+ :root {
385
+ --bg-color: #ffffff;
386
+ --text-color: #212529;
387
+ }
388
+ @media (prefers-color-scheme: dark) {
389
+ :root {
390
+ --bg-color: #121212;
391
+ --text-color: #f8f9fa;
392
+ }
393
+ }
394
+ ```
395
+
396
+ ## 10. Motions and Preferences
397
+
398
+ ### Actionable Guidelines
399
+
400
+ #### DOs
401
+ - **Support Reduced Motion media queries**: Support `@media (prefers-reduced-motion: reduce)` media queries.
402
+ - **Provide Pause mechanism**: Allow users to stop auto-running carousels banners or other persistent animations.
403
+ - **Default to static views**: Consider defaulting to static states and allowing users to opt-in to motion.
404
+
405
+ #### DON'Ts
406
+ - **Don't exceed flash limits (three per second)**: Never include rapid light-to-dark flashing. Such effects can cause seizures.
407
+
408
+ ### Code Examples
409
+
410
+ ```css
411
+ /* Good: Dampen spin states for reduced motion queries */
412
+ @media (prefers-reduced-motion: reduce) {
413
+ .spinner {
414
+ animation: none;
415
+ opacity: 0.5;
416
+ }
417
+ }
418
+ ```
419
+
420
+ ## 11. Modals and Native Dialogs
421
+
422
+ Modern browsers provide native solutions for creating modal dialogs which avoid the need for focus traps, managing the accessibility of outside content, ensuring the content is on top, and dimming the background content — all of which can be error prone and require heavy JavaScript event tracking to maintain.
423
+
424
+ ### Actionable Guidelines
425
+
426
+ #### DOs
427
+ - **Use the Native `<dialog>` Element**: Invoke the dialog using the `.showModal()` method to open it in a modal state. When in a modal state, the browser sets outside content as inert (i.e. the outside content is hidden from the accessibility tree and cannot be interacted with nor be focused).
428
+ - **Use the `inert` Attribute for Custom Overlays**: When `<dialog>` cannot be used (e.g., some non-modal overlays, framework constraints, or layouts where `<dialog>`'s top-layer/positioning behavior conflicts with the design), apply `inert` to outside content to ensure it cannot be interacted with by keyboard, pointer, or assistive technology. This requires structuring elements in such a way that the custom overlay is not a descendant of the element with `inert` set on it.
429
+
430
+ #### DON'Ts
431
+ - **Don't implement focus traps for native modal dialogs**: When a `<dialog>` element is opened in a modal state, browsers set outside content as inert which is sufficient for ensuring only the dialog’s content can be focused.
432
+
433
+ ### Code Examples
434
+
435
+ **HTML & JS: Native `<dialog>` with standard close events**
436
+ ```html
437
+ <!-- Dialog opens natively with showModal() and locks focus -->
438
+ <button id="open-btn">Open Dialog</button>
439
+
440
+ <dialog id="accessible-modal" aria-labelledby="title-id">
441
+ <h2 id="title-id">Account Settings</h2>
442
+ <p>Update your details here.</p>
443
+ <button onclick="this.closest('dialog').close()">Close Dialog</button>
444
+ </dialog>
445
+
446
+ <script>
447
+ document.getElementById('open-btn').addEventListener('click', () => {
448
+ document.getElementById('accessible-modal').showModal();
449
+ });
450
+ </script>
451
+ ```
452
+
453
+ ## 12. Testing Validations
454
+
455
+ ### Actionable Guidelines
456
+
457
+ #### DOs
458
+ - **Run Automated checks via axe-core or Lighthouse audits**: Catch missing alt texts or low contrasts (e.g., via Lighthouse in Chrome DevTools MCP).
459
+ - **Validate Sequential Navigations using keyboards alone**: Using only keyboard shortcuts, such as Tab/Shift+Tab, arrow keys, Enter, Space, and Esc, confirm every interactive element is reachable and operable, and that focus never gets stuck.
460
+ - **Test on Screen Readers with calibrated browsers**: Rely on standard bindings (e.g., JAWS with Chrome, NVDA with Firefox, Narrator with Edge, VoiceOver with Safari on macOS and iOS, TalkBack with Chrome for Android).
461
+
462
+ #### DON'Ts
463
+ - **Don't rely purely on scores**: A 100% score does not guarantee real usability.
@@ -0,0 +1,207 @@
1
+ # Accessible Error Announcement
2
+
3
+ ## The Problem
4
+ Standard HTML5 validation provides visual feedback (via `:invalid` or `:user-invalid`), but it doesn't automatically synchronize with accessibility attributes like `aria-invalid`.
5
+
6
+ If you use standard `:invalid` styling, screen readers might announce "Invalid entry" the moment a user tabs into a required field that is currently empty. This creates a disruptive experience for users using assistive technologies, as the error is announced before interaction has occurred.
7
+
8
+ ## The Solution
9
+ We want the *programmatic* state (`aria-invalid="true"`) to be applied **at the exact same moment** the *visual* state (`:user-invalid`) applies. Since `:user-invalid` relies on the browser's internal "user-interacted" flag, we can use JavaScript to check that this selector matches during standard interaction events.
10
+
11
+ See [MDN aria-invalid](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-invalid) for more details.
12
+
13
+ ### Implementation Strategy
14
+
15
+ 1. **Visual Layer**: Use CSS `:user-invalid` to show borders/icons.
16
+ 2. **Accessibility Layer**: Use `aria-invalid` and `aria-errormessage` to communicate state to Assistive Technology (AT).
17
+ 3. **Bridge Visual & Accessibility Layer**: Create a lightweight JavaScript utility that listens for `blur` and `input` events, checks if the element matches `:user-invalid`, and updates the ARIA attributes accordingly.
18
+
19
+ ## Implementation Guide
20
+
21
+ ### 1. HTML Structure
22
+ Link your input to its error message using `aria-errormessage` (or `aria-describedby` for broader support).
23
+
24
+ ```html
25
+ <form>
26
+ <div class="field">
27
+ <label for="email">Email</label>
28
+ <input
29
+ type="email"
30
+ id="email"
31
+ required
32
+ aria-errormessage="email-error"
33
+ >
34
+ <span id="email-error" class="error-msg">
35
+ Please enter a valid email address.
36
+ </span>
37
+ </div>
38
+ </form>
39
+ ```
40
+
41
+ ### 2. CSS
42
+ Control the visibility of the error message using the native pseudo-class `:user-invalid`.
43
+
44
+ ```css
45
+ .error-msg {
46
+ display: none;
47
+ color: #d93025;
48
+ }
49
+
50
+ /* Show error message when input is user-invalid */
51
+ input:user-invalid ~ .error-msg {
52
+ display: block;
53
+ }
54
+
55
+ /* Optional: Visual cues on the input itself */
56
+ input:user-invalid {
57
+ border-color: #d93025;
58
+ }
59
+ ```
60
+
61
+ ### 3. JavaScript
62
+ Since there is no "UserInvalidChanged" event, hook into standard form events to check the state.
63
+
64
+ ```javascript
65
+ const updateAriaState = (event) => {
66
+ const input = event.target;
67
+ if (!input.matches?.('input, textarea, select')) return;
68
+
69
+ // Check if the browser currently considers this input "user-invalid"
70
+ const isUserInvalid = input.matches(':user-invalid');
71
+
72
+ if (isUserInvalid) {
73
+ input.setAttribute('aria-invalid', 'true');
74
+ } else {
75
+ input.removeAttribute('aria-invalid');
76
+ }
77
+ };
78
+
79
+ // Listen on the document to handle dynamically added fields.
80
+ // 'blur' and 'focus' do not bubble, so we must use the capture phase (true).
81
+ document.addEventListener('blur', updateAriaState, true);
82
+ document.addEventListener('focus', updateAriaState, true);
83
+
84
+ // Also update on input if we've already shown the error,
85
+ // so the error clears immediately when fixed.
86
+ document.addEventListener('input', (event) => {
87
+ const input = event.target;
88
+ if (!input.matches?.('input, textarea, select')) return;
89
+
90
+ const hasAriaInvalid = input.hasAttribute('aria-invalid');
91
+ const ariaInvalid = input.getAttribute('aria-invalid');
92
+ if (hasAriaInvalid && ariaInvalid === 'true') {
93
+ updateAriaState(event);
94
+ }
95
+ });
96
+ ```
97
+
98
+ ## Fallbacking & Browser Support
99
+
100
+ The `:user-invalid` pseudo-class is widely supported (Baseline 2023), but older browsers need a fallback.
101
+
102
+ ### Feature Detection
103
+ You can check for support in CSS and JavaScript.
104
+
105
+ **JavaScript Check:**
106
+ ```javascript
107
+ if (!CSS.supports('selector(:user-invalid)')) {
108
+ // Fallback logic here
109
+ }
110
+ ```
111
+
112
+ ### CSS for Fallback
113
+ To ensure your fallback logic is visually indistinguishable from the native behavior, you must apply your error styles to both the pseudo-class and your fallback class.
114
+
115
+ ```css
116
+ /* Apply error styles to both native selector and fallback class */
117
+ input:user-invalid,
118
+ input.user-invalid-fallback {
119
+ border-color: #d93025;
120
+ background-color: #fce8e6;
121
+ }
122
+
123
+ /* Show error message for both cases */
124
+ input:user-invalid ~ .error-msg,
125
+ input.user-invalid-fallback ~ .error-msg {
126
+ display: block;
127
+ }
128
+ ```
129
+
130
+ ### Fallback Logic
131
+ If `:user-invalid` is missing manually track the interaction state using a `WeakMap`.
132
+
133
+ ```javascript
134
+ const UserInvalidFallback = (() => {
135
+ const dirtyState = new WeakMap();
136
+
137
+ const updateState = (input) => {
138
+ const isValid = input.checkValidity();
139
+
140
+ // Update both visual and ARIA state
141
+ input.classList.toggle('user-invalid-fallback', !isValid);
142
+ input.classList.toggle('user-valid-fallback', isValid);
143
+
144
+ if (!isValid) {
145
+ input.setAttribute('aria-invalid', 'true');
146
+ } else {
147
+ input.removeAttribute('aria-invalid');
148
+ }
149
+ };
150
+
151
+ const handleEvent = (event) => {
152
+ const input = event.target;
153
+
154
+ if (event.type === 'reset' && input.matches?.('form')) {
155
+ const controls = input.elements || [];
156
+ for (const control of controls) {
157
+ dirtyState.delete(control);
158
+ control.classList.remove('user-invalid-fallback');
159
+ control.classList.remove('user-valid-fallback');
160
+ control.removeAttribute('aria-invalid');
161
+ }
162
+ return;
163
+ }
164
+
165
+ if (!input.matches?.('input, textarea, select')) return;
166
+
167
+ if (event.type === 'input' || event.type === 'change') {
168
+ const state = dirtyState.get(input) || { hasInteracted: false, hasBlurred: false };
169
+ state.hasInteracted = true;
170
+ dirtyState.set(input, state);
171
+ if (state.hasBlurred) {
172
+ updateState(input);
173
+ }
174
+ } else if (event.type === 'blur') {
175
+ const state = dirtyState.get(input) || { hasInteracted: false, hasBlurred: false };
176
+ state.hasBlurred = true;
177
+ dirtyState.set(input, state);
178
+ if (state.hasInteracted) {
179
+ updateState(input);
180
+ }
181
+ }
182
+ };
183
+
184
+ const init = () => {
185
+ if (CSS.supports('selector(:user-invalid)')) return;
186
+
187
+ document.addEventListener('blur', handleEvent, true); // Capture phase required
188
+ document.addEventListener('input', handleEvent, true);
189
+ document.addEventListener('change', handleEvent, true);
190
+ document.addEventListener('reset', handleEvent, true); // Capture resets
191
+ };
192
+
193
+ return { init };
194
+ })();
195
+
196
+ // Initialize globally
197
+ UserInvalidFallback.init();
198
+ ```
199
+
200
+ ## Other Considerations
201
+
202
+ 1. **`aria-live` vs. `aria-errormessage`**:
203
+ * `aria-errormessage` connects the input to the text, but screen readers might not announce it immediately upon appearance (only when focusing the input).
204
+ * If you need *immediate* announcement when the error appears (e.g., on blur), consider adding `role="alert"` or `aria-live="polite"` to the error message container, but test thoroughly to avoid "double announcement" when the user focuses the field to fix it.
205
+
206
+ 2. **Internationalization**:
207
+ * Ensure the text content of your error message (`#email-error`) is translated. The logic remains the same.