@wazir-dev/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/AGENTS.md +111 -0
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +21 -0
  5. package/README.md +314 -0
  6. package/assets/composition-engine.mmd +34 -0
  7. package/assets/demo-script.sh +17 -0
  8. package/assets/logo-dark.svg +14 -0
  9. package/assets/logo.svg +14 -0
  10. package/assets/pipeline.mmd +39 -0
  11. package/assets/record-demo.sh +51 -0
  12. package/docs/README.md +51 -0
  13. package/docs/adapters/context-mode.md +60 -0
  14. package/docs/concepts/architecture.md +87 -0
  15. package/docs/concepts/artifact-model.md +60 -0
  16. package/docs/concepts/composition-engine.md +36 -0
  17. package/docs/concepts/indexing-and-recall.md +160 -0
  18. package/docs/concepts/observability.md +41 -0
  19. package/docs/concepts/roles-and-workflows.md +59 -0
  20. package/docs/concepts/terminology-policy.md +27 -0
  21. package/docs/getting-started/01-installation.md +78 -0
  22. package/docs/getting-started/02-first-run.md +102 -0
  23. package/docs/getting-started/03-adding-to-project.md +15 -0
  24. package/docs/getting-started/04-host-setup.md +15 -0
  25. package/docs/guides/ci-integration.md +15 -0
  26. package/docs/guides/creating-skills.md +15 -0
  27. package/docs/guides/expertise-module-authoring.md +15 -0
  28. package/docs/guides/hook-development.md +15 -0
  29. package/docs/guides/memory-and-learnings.md +34 -0
  30. package/docs/guides/multi-host-export.md +15 -0
  31. package/docs/guides/troubleshooting.md +101 -0
  32. package/docs/guides/writing-custom-roles.md +15 -0
  33. package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
  34. package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
  35. package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
  36. package/docs/readmes/INDEX.md +99 -0
  37. package/docs/readmes/features/expertise/README.md +171 -0
  38. package/docs/readmes/features/exports/README.md +222 -0
  39. package/docs/readmes/features/hooks/README.md +103 -0
  40. package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
  41. package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
  42. package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
  43. package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
  44. package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
  45. package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
  46. package/docs/readmes/features/hooks/session-start.md +119 -0
  47. package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
  48. package/docs/readmes/features/roles/README.md +157 -0
  49. package/docs/readmes/features/roles/clarifier.md +152 -0
  50. package/docs/readmes/features/roles/content-author.md +190 -0
  51. package/docs/readmes/features/roles/designer.md +193 -0
  52. package/docs/readmes/features/roles/executor.md +184 -0
  53. package/docs/readmes/features/roles/learner.md +210 -0
  54. package/docs/readmes/features/roles/planner.md +182 -0
  55. package/docs/readmes/features/roles/researcher.md +164 -0
  56. package/docs/readmes/features/roles/reviewer.md +184 -0
  57. package/docs/readmes/features/roles/specifier.md +162 -0
  58. package/docs/readmes/features/roles/verifier.md +215 -0
  59. package/docs/readmes/features/schemas/README.md +178 -0
  60. package/docs/readmes/features/skills/README.md +63 -0
  61. package/docs/readmes/features/skills/brainstorming.md +96 -0
  62. package/docs/readmes/features/skills/debugging.md +148 -0
  63. package/docs/readmes/features/skills/design.md +120 -0
  64. package/docs/readmes/features/skills/prepare-next.md +109 -0
  65. package/docs/readmes/features/skills/run-audit.md +159 -0
  66. package/docs/readmes/features/skills/scan-project.md +109 -0
  67. package/docs/readmes/features/skills/self-audit.md +176 -0
  68. package/docs/readmes/features/skills/tdd.md +137 -0
  69. package/docs/readmes/features/skills/using-skills.md +92 -0
  70. package/docs/readmes/features/skills/verification.md +120 -0
  71. package/docs/readmes/features/skills/writing-plans.md +104 -0
  72. package/docs/readmes/features/tooling/README.md +320 -0
  73. package/docs/readmes/features/workflows/README.md +186 -0
  74. package/docs/readmes/features/workflows/author.md +181 -0
  75. package/docs/readmes/features/workflows/clarify.md +154 -0
  76. package/docs/readmes/features/workflows/design-review.md +171 -0
  77. package/docs/readmes/features/workflows/design.md +169 -0
  78. package/docs/readmes/features/workflows/discover.md +162 -0
  79. package/docs/readmes/features/workflows/execute.md +173 -0
  80. package/docs/readmes/features/workflows/learn.md +167 -0
  81. package/docs/readmes/features/workflows/plan-review.md +165 -0
  82. package/docs/readmes/features/workflows/plan.md +170 -0
  83. package/docs/readmes/features/workflows/prepare-next.md +167 -0
  84. package/docs/readmes/features/workflows/review.md +169 -0
  85. package/docs/readmes/features/workflows/run-audit.md +191 -0
  86. package/docs/readmes/features/workflows/spec-challenge.md +159 -0
  87. package/docs/readmes/features/workflows/specify.md +160 -0
  88. package/docs/readmes/features/workflows/verify.md +177 -0
  89. package/docs/readmes/packages/README.md +50 -0
  90. package/docs/readmes/packages/ajv.md +117 -0
  91. package/docs/readmes/packages/context-mode.md +118 -0
  92. package/docs/readmes/packages/gray-matter.md +116 -0
  93. package/docs/readmes/packages/node-test.md +137 -0
  94. package/docs/readmes/packages/yaml.md +112 -0
  95. package/docs/reference/configuration-reference.md +159 -0
  96. package/docs/reference/expertise-index.md +52 -0
  97. package/docs/reference/git-flow.md +43 -0
  98. package/docs/reference/hooks.md +87 -0
  99. package/docs/reference/host-exports.md +50 -0
  100. package/docs/reference/launch-checklist.md +172 -0
  101. package/docs/reference/marketplace-listings.md +76 -0
  102. package/docs/reference/release-process.md +34 -0
  103. package/docs/reference/roles-reference.md +77 -0
  104. package/docs/reference/skills.md +33 -0
  105. package/docs/reference/templates.md +29 -0
  106. package/docs/reference/tooling-cli.md +94 -0
  107. package/docs/truth-claims.yaml +222 -0
  108. package/expertise/PROGRESS.md +63 -0
  109. package/expertise/README.md +18 -0
  110. package/expertise/antipatterns/PROGRESS.md +56 -0
  111. package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
  112. package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
  113. package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
  114. package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
  115. package/expertise/antipatterns/backend/index.md +24 -0
  116. package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
  117. package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
  118. package/expertise/antipatterns/code/async-antipatterns.md +622 -0
  119. package/expertise/antipatterns/code/code-smells.md +1186 -0
  120. package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
  121. package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
  122. package/expertise/antipatterns/code/index.md +27 -0
  123. package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
  124. package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
  125. package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
  126. package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
  127. package/expertise/antipatterns/design/dark-patterns.md +1121 -0
  128. package/expertise/antipatterns/design/index.md +22 -0
  129. package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
  130. package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
  131. package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
  132. package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
  133. package/expertise/antipatterns/frontend/index.md +23 -0
  134. package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
  135. package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
  136. package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
  137. package/expertise/antipatterns/index.md +31 -0
  138. package/expertise/antipatterns/performance/index.md +20 -0
  139. package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
  140. package/expertise/antipatterns/performance/premature-optimization.md +623 -0
  141. package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
  142. package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
  143. package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
  144. package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
  145. package/expertise/antipatterns/process/index.md +23 -0
  146. package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
  147. package/expertise/antipatterns/security/index.md +20 -0
  148. package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
  149. package/expertise/antipatterns/security/security-theater.md +843 -0
  150. package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
  151. package/expertise/architecture/PROGRESS.md +70 -0
  152. package/expertise/architecture/data/caching-architecture.md +671 -0
  153. package/expertise/architecture/data/data-consistency.md +574 -0
  154. package/expertise/architecture/data/data-modeling.md +536 -0
  155. package/expertise/architecture/data/event-streams-and-queues.md +634 -0
  156. package/expertise/architecture/data/index.md +25 -0
  157. package/expertise/architecture/data/search-architecture.md +663 -0
  158. package/expertise/architecture/data/sql-vs-nosql.md +708 -0
  159. package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
  160. package/expertise/architecture/decisions/build-vs-buy.md +616 -0
  161. package/expertise/architecture/decisions/index.md +23 -0
  162. package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
  163. package/expertise/architecture/decisions/technology-selection.md +616 -0
  164. package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
  165. package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
  166. package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
  167. package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
  168. package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
  169. package/expertise/architecture/distributed/index.md +25 -0
  170. package/expertise/architecture/distributed/saga-pattern.md +797 -0
  171. package/expertise/architecture/foundations/architectural-thinking.md +460 -0
  172. package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
  173. package/expertise/architecture/foundations/design-principles-solid.md +649 -0
  174. package/expertise/architecture/foundations/domain-driven-design.md +719 -0
  175. package/expertise/architecture/foundations/index.md +25 -0
  176. package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
  177. package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
  178. package/expertise/architecture/index.md +34 -0
  179. package/expertise/architecture/integration/api-design-graphql.md +638 -0
  180. package/expertise/architecture/integration/api-design-grpc.md +804 -0
  181. package/expertise/architecture/integration/api-design-rest.md +892 -0
  182. package/expertise/architecture/integration/index.md +25 -0
  183. package/expertise/architecture/integration/third-party-integration.md +795 -0
  184. package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
  185. package/expertise/architecture/integration/websockets-realtime.md +791 -0
  186. package/expertise/architecture/mobile-architecture/index.md +22 -0
  187. package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
  188. package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
  189. package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
  190. package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
  191. package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
  192. package/expertise/architecture/patterns/event-driven.md +797 -0
  193. package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
  194. package/expertise/architecture/patterns/index.md +27 -0
  195. package/expertise/architecture/patterns/layered-architecture.md +736 -0
  196. package/expertise/architecture/patterns/microservices.md +753 -0
  197. package/expertise/architecture/patterns/modular-monolith.md +692 -0
  198. package/expertise/architecture/patterns/monolith.md +626 -0
  199. package/expertise/architecture/patterns/plugin-architecture.md +735 -0
  200. package/expertise/architecture/patterns/serverless.md +780 -0
  201. package/expertise/architecture/scaling/database-scaling.md +615 -0
  202. package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
  203. package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
  204. package/expertise/architecture/scaling/index.md +24 -0
  205. package/expertise/architecture/scaling/multi-tenancy.md +800 -0
  206. package/expertise/architecture/scaling/stateless-design.md +787 -0
  207. package/expertise/backend/embedded-firmware.md +625 -0
  208. package/expertise/backend/go.md +853 -0
  209. package/expertise/backend/index.md +24 -0
  210. package/expertise/backend/java-spring.md +448 -0
  211. package/expertise/backend/node-typescript.md +625 -0
  212. package/expertise/backend/python-fastapi.md +724 -0
  213. package/expertise/backend/rust.md +458 -0
  214. package/expertise/backend/solidity.md +711 -0
  215. package/expertise/composition-map.yaml +443 -0
  216. package/expertise/content/foundations/content-modeling.md +395 -0
  217. package/expertise/content/foundations/editorial-standards.md +449 -0
  218. package/expertise/content/foundations/index.md +24 -0
  219. package/expertise/content/foundations/microcopy.md +455 -0
  220. package/expertise/content/foundations/terminology-governance.md +509 -0
  221. package/expertise/content/index.md +34 -0
  222. package/expertise/content/patterns/accessibility-copy.md +518 -0
  223. package/expertise/content/patterns/index.md +24 -0
  224. package/expertise/content/patterns/notification-content.md +433 -0
  225. package/expertise/content/patterns/sample-content.md +486 -0
  226. package/expertise/content/patterns/state-copy.md +439 -0
  227. package/expertise/design/PROGRESS.md +58 -0
  228. package/expertise/design/disciplines/dark-mode-theming.md +577 -0
  229. package/expertise/design/disciplines/design-systems.md +595 -0
  230. package/expertise/design/disciplines/index.md +25 -0
  231. package/expertise/design/disciplines/information-architecture.md +800 -0
  232. package/expertise/design/disciplines/interaction-design.md +788 -0
  233. package/expertise/design/disciplines/responsive-design.md +552 -0
  234. package/expertise/design/disciplines/usability-testing.md +516 -0
  235. package/expertise/design/disciplines/user-research.md +792 -0
  236. package/expertise/design/foundations/accessibility-design.md +796 -0
  237. package/expertise/design/foundations/color-theory.md +797 -0
  238. package/expertise/design/foundations/iconography.md +795 -0
  239. package/expertise/design/foundations/index.md +26 -0
  240. package/expertise/design/foundations/motion-and-animation.md +653 -0
  241. package/expertise/design/foundations/rtl-design.md +585 -0
  242. package/expertise/design/foundations/spacing-and-layout.md +607 -0
  243. package/expertise/design/foundations/typography.md +800 -0
  244. package/expertise/design/foundations/visual-hierarchy.md +761 -0
  245. package/expertise/design/index.md +32 -0
  246. package/expertise/design/patterns/authentication-flows.md +474 -0
  247. package/expertise/design/patterns/content-consumption.md +789 -0
  248. package/expertise/design/patterns/data-display.md +618 -0
  249. package/expertise/design/patterns/e-commerce.md +1494 -0
  250. package/expertise/design/patterns/feedback-and-states.md +642 -0
  251. package/expertise/design/patterns/forms-and-input.md +819 -0
  252. package/expertise/design/patterns/gamification.md +801 -0
  253. package/expertise/design/patterns/index.md +31 -0
  254. package/expertise/design/patterns/microinteractions.md +449 -0
  255. package/expertise/design/patterns/navigation.md +800 -0
  256. package/expertise/design/patterns/notifications.md +705 -0
  257. package/expertise/design/patterns/onboarding.md +700 -0
  258. package/expertise/design/patterns/search-and-filter.md +601 -0
  259. package/expertise/design/patterns/settings-and-preferences.md +768 -0
  260. package/expertise/design/patterns/social-and-community.md +748 -0
  261. package/expertise/design/platforms/desktop-native.md +612 -0
  262. package/expertise/design/platforms/index.md +25 -0
  263. package/expertise/design/platforms/mobile-android.md +825 -0
  264. package/expertise/design/platforms/mobile-cross-platform.md +983 -0
  265. package/expertise/design/platforms/mobile-ios.md +699 -0
  266. package/expertise/design/platforms/tablet.md +794 -0
  267. package/expertise/design/platforms/web-dashboard.md +790 -0
  268. package/expertise/design/platforms/web-responsive.md +550 -0
  269. package/expertise/design/psychology/behavioral-nudges.md +449 -0
  270. package/expertise/design/psychology/cognitive-load.md +1191 -0
  271. package/expertise/design/psychology/error-psychology.md +778 -0
  272. package/expertise/design/psychology/index.md +22 -0
  273. package/expertise/design/psychology/persuasive-design.md +736 -0
  274. package/expertise/design/psychology/user-mental-models.md +623 -0
  275. package/expertise/design/tooling/open-pencil.md +266 -0
  276. package/expertise/frontend/angular.md +1073 -0
  277. package/expertise/frontend/desktop-electron.md +546 -0
  278. package/expertise/frontend/flutter.md +782 -0
  279. package/expertise/frontend/index.md +27 -0
  280. package/expertise/frontend/native-android.md +409 -0
  281. package/expertise/frontend/native-ios.md +490 -0
  282. package/expertise/frontend/react-native.md +1160 -0
  283. package/expertise/frontend/react.md +808 -0
  284. package/expertise/frontend/vue.md +1089 -0
  285. package/expertise/humanize/domain-rules-code.md +79 -0
  286. package/expertise/humanize/domain-rules-content.md +67 -0
  287. package/expertise/humanize/domain-rules-technical-docs.md +56 -0
  288. package/expertise/humanize/index.md +35 -0
  289. package/expertise/humanize/self-audit-checklist.md +87 -0
  290. package/expertise/humanize/sentence-patterns.md +218 -0
  291. package/expertise/humanize/vocabulary-blacklist.md +105 -0
  292. package/expertise/i18n/PROGRESS.md +65 -0
  293. package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
  294. package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
  295. package/expertise/i18n/advanced/complex-scripts.md +30 -0
  296. package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
  297. package/expertise/i18n/advanced/testing-i18n.md +28 -0
  298. package/expertise/i18n/content/content-adaptation.md +23 -0
  299. package/expertise/i18n/content/locale-specific-formatting.md +23 -0
  300. package/expertise/i18n/content/machine-translation-integration.md +28 -0
  301. package/expertise/i18n/content/translation-management.md +29 -0
  302. package/expertise/i18n/foundations/date-time-calendars.md +67 -0
  303. package/expertise/i18n/foundations/i18n-architecture.md +272 -0
  304. package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
  305. package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
  306. package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
  307. package/expertise/i18n/foundations/string-externalization.md +236 -0
  308. package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
  309. package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
  310. package/expertise/i18n/index.md +38 -0
  311. package/expertise/i18n/platform/backend-i18n.md +31 -0
  312. package/expertise/i18n/platform/flutter-i18n.md +148 -0
  313. package/expertise/i18n/platform/native-android-i18n.md +36 -0
  314. package/expertise/i18n/platform/native-ios-i18n.md +36 -0
  315. package/expertise/i18n/platform/react-i18n.md +103 -0
  316. package/expertise/i18n/platform/web-css-i18n.md +81 -0
  317. package/expertise/i18n/rtl/arabic-specific.md +175 -0
  318. package/expertise/i18n/rtl/hebrew-specific.md +149 -0
  319. package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
  320. package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
  321. package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
  322. package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
  323. package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
  324. package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
  325. package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
  326. package/expertise/i18n/rtl/rtl-typography.md +160 -0
  327. package/expertise/index.md +113 -0
  328. package/expertise/index.yaml +216 -0
  329. package/expertise/infrastructure/cloud-aws.md +597 -0
  330. package/expertise/infrastructure/cloud-gcp.md +599 -0
  331. package/expertise/infrastructure/cybersecurity.md +816 -0
  332. package/expertise/infrastructure/database-mongodb.md +447 -0
  333. package/expertise/infrastructure/database-postgres.md +400 -0
  334. package/expertise/infrastructure/devops-cicd.md +787 -0
  335. package/expertise/infrastructure/index.md +27 -0
  336. package/expertise/performance/PROGRESS.md +50 -0
  337. package/expertise/performance/backend/api-latency.md +1204 -0
  338. package/expertise/performance/backend/background-jobs.md +506 -0
  339. package/expertise/performance/backend/connection-pooling.md +1209 -0
  340. package/expertise/performance/backend/database-query-optimization.md +515 -0
  341. package/expertise/performance/backend/index.md +23 -0
  342. package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
  343. package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
  344. package/expertise/performance/foundations/caching-strategies.md +489 -0
  345. package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
  346. package/expertise/performance/foundations/index.md +24 -0
  347. package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
  348. package/expertise/performance/foundations/memory-management.md +964 -0
  349. package/expertise/performance/foundations/performance-budgets.md +1314 -0
  350. package/expertise/performance/index.md +31 -0
  351. package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
  352. package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
  353. package/expertise/performance/infrastructure/index.md +22 -0
  354. package/expertise/performance/infrastructure/load-balancing.md +1081 -0
  355. package/expertise/performance/infrastructure/observability.md +1079 -0
  356. package/expertise/performance/mobile/index.md +23 -0
  357. package/expertise/performance/mobile/mobile-animations.md +544 -0
  358. package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
  359. package/expertise/performance/mobile/mobile-network.md +452 -0
  360. package/expertise/performance/mobile/mobile-rendering.md +599 -0
  361. package/expertise/performance/mobile/mobile-startup-time.md +505 -0
  362. package/expertise/performance/platform-specific/flutter-performance.md +647 -0
  363. package/expertise/performance/platform-specific/index.md +22 -0
  364. package/expertise/performance/platform-specific/node-performance.md +1307 -0
  365. package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
  366. package/expertise/performance/platform-specific/react-performance.md +1403 -0
  367. package/expertise/performance/web/bundle-optimization.md +1239 -0
  368. package/expertise/performance/web/image-and-media.md +636 -0
  369. package/expertise/performance/web/index.md +24 -0
  370. package/expertise/performance/web/network-optimization.md +1133 -0
  371. package/expertise/performance/web/rendering-performance.md +1098 -0
  372. package/expertise/performance/web/ssr-and-hydration.md +918 -0
  373. package/expertise/performance/web/web-vitals.md +1374 -0
  374. package/expertise/quality/accessibility.md +985 -0
  375. package/expertise/quality/evidence-based-verification.md +499 -0
  376. package/expertise/quality/index.md +24 -0
  377. package/expertise/quality/ml-model-audit.md +614 -0
  378. package/expertise/quality/performance.md +600 -0
  379. package/expertise/quality/testing-api.md +891 -0
  380. package/expertise/quality/testing-mobile.md +496 -0
  381. package/expertise/quality/testing-web.md +849 -0
  382. package/expertise/security/PROGRESS.md +54 -0
  383. package/expertise/security/agentic-identity.md +540 -0
  384. package/expertise/security/compliance-frameworks.md +601 -0
  385. package/expertise/security/data/data-encryption.md +364 -0
  386. package/expertise/security/data/data-privacy-gdpr.md +692 -0
  387. package/expertise/security/data/database-security.md +1171 -0
  388. package/expertise/security/data/index.md +22 -0
  389. package/expertise/security/data/pii-handling.md +531 -0
  390. package/expertise/security/foundations/authentication.md +1041 -0
  391. package/expertise/security/foundations/authorization.md +603 -0
  392. package/expertise/security/foundations/cryptography.md +1001 -0
  393. package/expertise/security/foundations/index.md +25 -0
  394. package/expertise/security/foundations/owasp-top-10.md +1354 -0
  395. package/expertise/security/foundations/secrets-management.md +1217 -0
  396. package/expertise/security/foundations/secure-sdlc.md +700 -0
  397. package/expertise/security/foundations/supply-chain-security.md +698 -0
  398. package/expertise/security/index.md +31 -0
  399. package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
  400. package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
  401. package/expertise/security/infrastructure/container-security.md +721 -0
  402. package/expertise/security/infrastructure/incident-response.md +1295 -0
  403. package/expertise/security/infrastructure/index.md +24 -0
  404. package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
  405. package/expertise/security/infrastructure/network-security.md +1337 -0
  406. package/expertise/security/mobile/index.md +23 -0
  407. package/expertise/security/mobile/mobile-android-security.md +1218 -0
  408. package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
  409. package/expertise/security/mobile/mobile-data-storage.md +1265 -0
  410. package/expertise/security/mobile/mobile-ios-security.md +1401 -0
  411. package/expertise/security/mobile/mobile-network-security.md +1520 -0
  412. package/expertise/security/smart-contract-security.md +594 -0
  413. package/expertise/security/testing/index.md +22 -0
  414. package/expertise/security/testing/penetration-testing.md +1258 -0
  415. package/expertise/security/testing/security-code-review.md +1765 -0
  416. package/expertise/security/testing/threat-modeling.md +1074 -0
  417. package/expertise/security/testing/vulnerability-scanning.md +1062 -0
  418. package/expertise/security/web/api-security.md +586 -0
  419. package/expertise/security/web/cors-and-headers.md +433 -0
  420. package/expertise/security/web/csrf.md +562 -0
  421. package/expertise/security/web/file-upload.md +1477 -0
  422. package/expertise/security/web/index.md +25 -0
  423. package/expertise/security/web/injection.md +1375 -0
  424. package/expertise/security/web/session-management.md +1101 -0
  425. package/expertise/security/web/xss.md +1158 -0
  426. package/exports/README.md +17 -0
  427. package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
  428. package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
  429. package/exports/hosts/claude/.claude/agents/designer.md +55 -0
  430. package/exports/hosts/claude/.claude/agents/executor.md +55 -0
  431. package/exports/hosts/claude/.claude/agents/learner.md +51 -0
  432. package/exports/hosts/claude/.claude/agents/planner.md +53 -0
  433. package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
  434. package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
  435. package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
  436. package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
  437. package/exports/hosts/claude/.claude/commands/author.md +42 -0
  438. package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
  439. package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
  440. package/exports/hosts/claude/.claude/commands/design.md +44 -0
  441. package/exports/hosts/claude/.claude/commands/discover.md +37 -0
  442. package/exports/hosts/claude/.claude/commands/execute.md +48 -0
  443. package/exports/hosts/claude/.claude/commands/learn.md +38 -0
  444. package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
  445. package/exports/hosts/claude/.claude/commands/plan.md +39 -0
  446. package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
  447. package/exports/hosts/claude/.claude/commands/review.md +40 -0
  448. package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
  449. package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
  450. package/exports/hosts/claude/.claude/commands/specify.md +38 -0
  451. package/exports/hosts/claude/.claude/commands/verify.md +37 -0
  452. package/exports/hosts/claude/.claude/settings.json +34 -0
  453. package/exports/hosts/claude/CLAUDE.md +19 -0
  454. package/exports/hosts/claude/export.manifest.json +38 -0
  455. package/exports/hosts/claude/host-package.json +67 -0
  456. package/exports/hosts/codex/AGENTS.md +19 -0
  457. package/exports/hosts/codex/export.manifest.json +38 -0
  458. package/exports/hosts/codex/host-package.json +41 -0
  459. package/exports/hosts/cursor/.cursor/hooks.json +16 -0
  460. package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
  461. package/exports/hosts/cursor/export.manifest.json +38 -0
  462. package/exports/hosts/cursor/host-package.json +42 -0
  463. package/exports/hosts/gemini/GEMINI.md +19 -0
  464. package/exports/hosts/gemini/export.manifest.json +38 -0
  465. package/exports/hosts/gemini/host-package.json +41 -0
  466. package/hooks/README.md +18 -0
  467. package/hooks/definitions/loop_cap_guard.yaml +21 -0
  468. package/hooks/definitions/post_tool_capture.yaml +24 -0
  469. package/hooks/definitions/pre_compact_summary.yaml +19 -0
  470. package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
  471. package/hooks/definitions/protected_path_write_guard.yaml +19 -0
  472. package/hooks/definitions/session_start.yaml +19 -0
  473. package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
  474. package/hooks/loop-cap-guard +17 -0
  475. package/hooks/post-tool-lint +36 -0
  476. package/hooks/protected-path-write-guard +17 -0
  477. package/hooks/session-start +41 -0
  478. package/llms-full.txt +2355 -0
  479. package/llms.txt +43 -0
  480. package/package.json +79 -0
  481. package/roles/README.md +20 -0
  482. package/roles/clarifier.md +42 -0
  483. package/roles/content-author.md +63 -0
  484. package/roles/designer.md +55 -0
  485. package/roles/executor.md +55 -0
  486. package/roles/learner.md +51 -0
  487. package/roles/planner.md +53 -0
  488. package/roles/researcher.md +43 -0
  489. package/roles/reviewer.md +54 -0
  490. package/roles/specifier.md +47 -0
  491. package/roles/verifier.md +71 -0
  492. package/schemas/README.md +24 -0
  493. package/schemas/accepted-learning.schema.json +20 -0
  494. package/schemas/author-artifact.schema.json +156 -0
  495. package/schemas/clarification.schema.json +19 -0
  496. package/schemas/design-artifact.schema.json +80 -0
  497. package/schemas/docs-claim.schema.json +18 -0
  498. package/schemas/export-manifest.schema.json +20 -0
  499. package/schemas/hook.schema.json +67 -0
  500. package/schemas/host-export-package.schema.json +18 -0
  501. package/schemas/implementation-plan.schema.json +19 -0
  502. package/schemas/proposed-learning.schema.json +19 -0
  503. package/schemas/research.schema.json +18 -0
  504. package/schemas/review.schema.json +29 -0
  505. package/schemas/run-manifest.schema.json +18 -0
  506. package/schemas/spec-challenge.schema.json +18 -0
  507. package/schemas/spec.schema.json +20 -0
  508. package/schemas/usage.schema.json +102 -0
  509. package/schemas/verification-proof.schema.json +29 -0
  510. package/schemas/wazir-manifest.schema.json +173 -0
  511. package/skills/README.md +40 -0
  512. package/skills/brainstorming/SKILL.md +77 -0
  513. package/skills/debugging/SKILL.md +50 -0
  514. package/skills/design/SKILL.md +61 -0
  515. package/skills/dispatching-parallel-agents/SKILL.md +128 -0
  516. package/skills/executing-plans/SKILL.md +70 -0
  517. package/skills/finishing-a-development-branch/SKILL.md +169 -0
  518. package/skills/humanize/SKILL.md +123 -0
  519. package/skills/init-pipeline/SKILL.md +124 -0
  520. package/skills/prepare-next/SKILL.md +20 -0
  521. package/skills/receiving-code-review/SKILL.md +123 -0
  522. package/skills/requesting-code-review/SKILL.md +105 -0
  523. package/skills/requesting-code-review/code-reviewer.md +108 -0
  524. package/skills/run-audit/SKILL.md +197 -0
  525. package/skills/scan-project/SKILL.md +41 -0
  526. package/skills/self-audit/SKILL.md +153 -0
  527. package/skills/subagent-driven-development/SKILL.md +154 -0
  528. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  529. package/skills/subagent-driven-development/implementer-prompt.md +102 -0
  530. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  531. package/skills/tdd/SKILL.md +23 -0
  532. package/skills/using-git-worktrees/SKILL.md +163 -0
  533. package/skills/using-skills/SKILL.md +95 -0
  534. package/skills/verification/SKILL.md +22 -0
  535. package/skills/wazir/SKILL.md +463 -0
  536. package/skills/writing-plans/SKILL.md +30 -0
  537. package/skills/writing-skills/SKILL.md +157 -0
  538. package/skills/writing-skills/anthropic-best-practices.md +122 -0
  539. package/skills/writing-skills/persuasion-principles.md +50 -0
  540. package/templates/README.md +20 -0
  541. package/templates/artifacts/README.md +10 -0
  542. package/templates/artifacts/accepted-learning.md +19 -0
  543. package/templates/artifacts/accepted-learning.template.json +12 -0
  544. package/templates/artifacts/author.md +74 -0
  545. package/templates/artifacts/author.template.json +19 -0
  546. package/templates/artifacts/clarification.md +21 -0
  547. package/templates/artifacts/clarification.template.json +12 -0
  548. package/templates/artifacts/execute-notes.md +19 -0
  549. package/templates/artifacts/implementation-plan.md +21 -0
  550. package/templates/artifacts/implementation-plan.template.json +11 -0
  551. package/templates/artifacts/learning-proposal.md +19 -0
  552. package/templates/artifacts/next-run-handoff.md +21 -0
  553. package/templates/artifacts/plan-review.md +19 -0
  554. package/templates/artifacts/proposed-learning.template.json +12 -0
  555. package/templates/artifacts/research.md +21 -0
  556. package/templates/artifacts/research.template.json +12 -0
  557. package/templates/artifacts/review-findings.md +19 -0
  558. package/templates/artifacts/review.template.json +11 -0
  559. package/templates/artifacts/run-manifest.template.json +8 -0
  560. package/templates/artifacts/spec-challenge.md +19 -0
  561. package/templates/artifacts/spec-challenge.template.json +11 -0
  562. package/templates/artifacts/spec.md +21 -0
  563. package/templates/artifacts/spec.template.json +12 -0
  564. package/templates/artifacts/verification-proof.md +19 -0
  565. package/templates/artifacts/verification-proof.template.json +11 -0
  566. package/templates/examples/accepted-learning.example.json +14 -0
  567. package/templates/examples/author.example.json +152 -0
  568. package/templates/examples/clarification.example.json +15 -0
  569. package/templates/examples/docs-claim.example.json +8 -0
  570. package/templates/examples/export-manifest.example.json +7 -0
  571. package/templates/examples/host-export-package.example.json +11 -0
  572. package/templates/examples/implementation-plan.example.json +17 -0
  573. package/templates/examples/proposed-learning.example.json +13 -0
  574. package/templates/examples/research.example.json +15 -0
  575. package/templates/examples/research.example.md +6 -0
  576. package/templates/examples/review.example.json +17 -0
  577. package/templates/examples/run-manifest.example.json +9 -0
  578. package/templates/examples/spec-challenge.example.json +14 -0
  579. package/templates/examples/spec.example.json +21 -0
  580. package/templates/examples/verification-proof.example.json +21 -0
  581. package/templates/examples/wazir-manifest.example.yaml +65 -0
  582. package/templates/task-definition-schema.md +99 -0
  583. package/tooling/README.md +20 -0
  584. package/tooling/src/adapters/context-mode.js +50 -0
  585. package/tooling/src/capture/command.js +376 -0
  586. package/tooling/src/capture/store.js +99 -0
  587. package/tooling/src/capture/usage.js +270 -0
  588. package/tooling/src/checks/branches.js +50 -0
  589. package/tooling/src/checks/brand-truth.js +110 -0
  590. package/tooling/src/checks/changelog.js +231 -0
  591. package/tooling/src/checks/command-registry.js +36 -0
  592. package/tooling/src/checks/commits.js +102 -0
  593. package/tooling/src/checks/docs-drift.js +103 -0
  594. package/tooling/src/checks/docs-truth.js +201 -0
  595. package/tooling/src/checks/runtime-surface.js +156 -0
  596. package/tooling/src/cli.js +116 -0
  597. package/tooling/src/command-options.js +56 -0
  598. package/tooling/src/commands/validate.js +320 -0
  599. package/tooling/src/doctor/command.js +91 -0
  600. package/tooling/src/export/command.js +77 -0
  601. package/tooling/src/export/compiler.js +498 -0
  602. package/tooling/src/guards/loop-cap-guard.js +52 -0
  603. package/tooling/src/guards/protected-path-write-guard.js +67 -0
  604. package/tooling/src/index/command.js +152 -0
  605. package/tooling/src/index/storage.js +1061 -0
  606. package/tooling/src/index/summarizers.js +261 -0
  607. package/tooling/src/loaders.js +18 -0
  608. package/tooling/src/project-root.js +22 -0
  609. package/tooling/src/recall/command.js +225 -0
  610. package/tooling/src/schema-validator.js +30 -0
  611. package/tooling/src/state-root.js +40 -0
  612. package/tooling/src/status/command.js +71 -0
  613. package/wazir.manifest.yaml +135 -0
  614. package/workflows/README.md +19 -0
  615. package/workflows/author.md +42 -0
  616. package/workflows/clarify.md +38 -0
  617. package/workflows/design-review.md +46 -0
  618. package/workflows/design.md +44 -0
  619. package/workflows/discover.md +37 -0
  620. package/workflows/execute.md +48 -0
  621. package/workflows/learn.md +38 -0
  622. package/workflows/plan-review.md +42 -0
  623. package/workflows/plan.md +39 -0
  624. package/workflows/prepare-next.md +37 -0
  625. package/workflows/review.md +40 -0
  626. package/workflows/run-audit.md +41 -0
  627. package/workflows/spec-challenge.md +41 -0
  628. package/workflows/specify.md +38 -0
  629. package/workflows/verify.md +37 -0
@@ -0,0 +1,819 @@
1
+ # Forms and Input Patterns — Expertise Module (Pattern)
2
+
3
+ > Forms are the primary mechanism through which users provide data to digital products. A well-designed form reduces cognitive load, minimizes errors, and accelerates task completion. This module covers form anatomy, validation strategies, micro-interactions, accessibility requirements, cross-platform adaptation, and common anti-patterns, synthesizing research from Baymard Institute, Nielsen Norman Group, Material Design 3, and industry leaders like Stripe, Typeform, and Linear.
4
+
5
+ ---
6
+
7
+ ## 1. Pattern Anatomy
8
+
9
+ ### Form Types
10
+
11
+ Forms exist on a spectrum from simple single-field inputs to complex multi-page wizards. Choosing the correct type depends on data complexity, user context, and task criticality.
12
+
13
+ **Single-Page Forms**
14
+ All fields are visible on one scrollable page. The user fills in data top-to-bottom, then submits.
15
+
16
+ - Best for: login, sign-up (3-7 fields), contact forms, feedback, search filters
17
+ - Advantages: full context visible, no navigation overhead, simple mental model
18
+ - Risks: long forms cause scroll fatigue; more than 12-15 fields warrant restructuring
19
+ - Key metric: Baymard Institute found the average checkout contains 11.3 form fields; 22% of users abandon due to perceived complexity
20
+
21
+ **Multi-Step / Wizard Forms**
22
+ Data collection is split across sequential steps, each containing a logical group of 3-7 fields. A progress indicator shows the user's position.
23
+
24
+ - Best for: checkout flows, onboarding, account setup, applications, surveys
25
+ - Advantages: reduces perceived complexity, enables per-step validation, supports save-and-resume
26
+ - Risks: users lose context of overall form length; back-navigation can lose data if not designed carefully
27
+ - Guidelines: each step should contain a maximum of 5-9 fields; logically group related questions; always show a progress bar or step indicator; auto-save data on each step transition
28
+
29
+ **Inline Editing**
30
+ Users click on displayed content to switch it into an editable state, make changes, and save — all within the same view context.
31
+
32
+ - Best for: profile pages, settings, data tables, CMS content, list views
33
+ - Advantages: eliminates navigation to separate edit pages; feels fast and direct
34
+ - Risks: discoverability is low if edit affordances are invisible; accidental edits can occur without confirmation
35
+ - Guidelines: provide clear hover/focus affordances (pencil icon, underline, background highlight); always offer cancel and confirm actions; use role-based permissions to control who sees edit affordances
36
+
37
+ **Conversational / One-at-a-Time Forms**
38
+ A single question is presented per screen with smooth transitions between questions. Typeform pioneered this approach.
39
+
40
+ - Best for: surveys, lead generation, onboarding quizzes, applications where engagement matters more than speed
41
+ - Advantages: reduces visual overwhelm; feels personal and conversational; higher engagement for non-urgent tasks
42
+ - Risks: slower for power users who want to scan all fields; poor for reference-heavy data entry where users need to see multiple fields simultaneously
43
+ - Guidelines: limit to fewer than 10 questions for best completion rates (Typeform research shows 6 as the sweet spot); use conditional logic to skip irrelevant questions
44
+
45
+ ### When to Use Each Variant
46
+
47
+ | Criteria | Single-Page | Multi-Step | Inline Edit | Conversational |
48
+ |---|---|---|---|---|
49
+ | Number of fields | 1-12 | 8-40+ | 1-5 per item | 1-15 |
50
+ | Task frequency | Any | Infrequent | Frequent | Infrequent |
51
+ | Data relationships | Independent | Grouped by topic | Isolated values | Sequential |
52
+ | User expertise | Any | Novice-friendly | Intermediate+ | Any |
53
+ | Mobile suitability | Good | Excellent | Moderate | Excellent |
54
+ | Save/resume needed | Rarely | Often | Not applicable | Sometimes |
55
+
56
+ ### Form Structure
57
+
58
+ Every form field consists of up to six visual components. Consistent placement of these components across all fields in a form is essential.
59
+
60
+ ```
61
+ ┌─────────────────────────────────────────┐
62
+ │ Label Text * │ ← Label (above or beside input)
63
+ │ ┌─────────────────────────────────────┐ │
64
+ │ │ Placeholder text │ │ ← Input container
65
+ │ └─────────────────────────────────────┘ │
66
+ │ Helper text or character count (0/100) │ ← Helper / counter
67
+ │ ✕ Error message when validation fails │ ← Error message
68
+ │ │
69
+ │ [ Cancel ] [ Submit ] │ ← Action buttons
70
+ └─────────────────────────────────────────┘
71
+ ```
72
+
73
+ **Labels**
74
+ - Place labels above the input field (preferred for mobile and scanning speed) or to the left for dense desktop forms
75
+ - NNG research: forms with top-aligned labels completed significantly faster than left-aligned labels
76
+ - Never use placeholder text as the sole label — it disappears on input and fails WCAG 3.3.2
77
+ - Use sentence case for labels; avoid ALL CAPS (harder to read, feels aggressive)
78
+ - Keep labels concise: "Email address" not "Please enter your email address below"
79
+
80
+ **Inputs**
81
+ - Match input type to data: text, email, tel, number, url, password, date, time, search
82
+ - Size the input to hint at expected data length (zip code field shorter than street address)
83
+ - Provide visible borders/outlines — low-contrast or borderless inputs reduce discoverability
84
+
85
+ **Helpers**
86
+ - Place helper text below the input field in a smaller, muted typeface
87
+ - Use helpers for formatting hints ("MM/DD/YYYY"), constraints ("Must be 8+ characters"), or context ("We'll never share your email")
88
+ - Helper text must persist while the user types (unlike placeholders)
89
+
90
+ **Errors**
91
+ - Display inline below the field with a red/error-color indicator and an icon
92
+ - Be specific: "Email must include @ and a domain" not "Invalid input"
93
+ - Baymard found 99% of sites fail to provide adaptive error messages that explain the specific problem
94
+
95
+ **Actions**
96
+ - Primary action (Submit, Continue, Save) should be visually prominent
97
+ - Secondary action (Cancel, Back) should be visually subordinate but accessible
98
+ - Place action buttons at the bottom-left of the form, aligned with field edges
99
+ - Never use a "Reset" / "Clear form" button — NNG has warned against this for over 15 years
100
+
101
+ ---
102
+
103
+ ## 2. Best-in-Class Examples
104
+
105
+ ### Stripe Checkout
106
+ **Why it excels:** Stripe's checkout is the gold standard for payment forms. It uses a single vertical column, auto-detects card brand from the first digits (displaying the card logo), auto-formats the card number into 4-digit groups, runs Luhn validation while typing, and auto-advances the cursor when a field is complete. Error messages are inline and specific. The form adapts between embedded, overlay, and redirect modes. Mobile abandonment data drove their design — they observed 79% mobile abandonment rates industrywide and optimized aggressively against that.
107
+
108
+ **Key takeaways:** Auto-format and auto-advance for structured data; detect and display context (card brand); real-time validation for payment fields; guest checkout by default.
109
+
110
+ ### Linear
111
+ **Why it excels:** Linear uses inline editing throughout its issue tracker. Click any field (title, description, status, assignee, priority) to edit it in place. Changes save automatically with optimistic UI updates. The keyboard-first design allows rapid issue creation with minimal mouse interaction. Forms use command palette patterns (Cmd+K) for assignment and labeling rather than traditional dropdowns.
112
+
113
+ **Key takeaways:** Inline editing for frequent-edit interfaces; auto-save with optimistic updates; keyboard-first interaction; command palettes as form input alternatives.
114
+
115
+ ### Typeform
116
+ **Why it excels:** Typeform pioneered the one-question-at-a-time conversational form. Each question occupies the full viewport with elegant typography and smooth transitions. Conditional logic personalizes the path. The design philosophy centers on "human experience" over utilitarian data collection.
117
+
118
+ **Key takeaways:** Full-screen single questions reduce overwhelm; smooth transitions maintain flow; conditional logic eliminates irrelevant fields; design for engagement when completion rate is the primary metric.
119
+
120
+ ### Apple (Account Creation & Apple ID)
121
+ **Why it excels:** Apple's sign-up forms are minimal and security-focused. Password fields include inline strength meters with real-time requirement checklists. Two-factor verification is integrated seamlessly. The forms use native iOS pickers for date and country selection. Labels are always visible above fields. Error states are clear and specific.
122
+
123
+ **Key takeaways:** Security-focused forms benefit from real-time requirement feedback; native platform controls for selection inputs; minimal field count with progressive disclosure for optional information.
124
+
125
+ ### Google (Account Sign-Up)
126
+ **Why it excels:** Google's Gmail sign-up follows Hick's Law with minimal design, generous white space, and zero distracting elements. The multi-step flow breaks creation into logical chunks (name, email choice, password, phone verification, profile). Each step contains 2-4 fields maximum. The neutral, concise copy sets a relaxed tone.
127
+
128
+ **Key takeaways:** Multi-step with minimal fields per step; neutral copy tone; social proof through ecosystem branding; progressive disclosure across steps.
129
+
130
+ ### Shopify (Merchant Onboarding)
131
+ **Why it excels:** Shopify's merchant onboarding uses a wizard pattern that adapts based on business type. Smart defaults pre-fill currency, language, and tax settings based on location. Address fields use Google Places autocomplete. The progress indicator shows percentage complete and estimated time remaining.
132
+
133
+ **Key takeaways:** Smart defaults from context (location, business type); address autocomplete integration; time-remaining estimates in multi-step forms; adaptive paths based on user input.
134
+
135
+ ### Notion
136
+ **Why it excels:** Notion uses inline editing as its core interaction model. Every block of content is directly editable. Database properties use type-specific inputs (date pickers, select menus, relation lookups) that appear inline. The slash-command system (/) serves as a form of structured input that eliminates traditional form UI entirely.
137
+
138
+ **Key takeaways:** Content-as-form paradigm; type-specific inline editors; slash-command structured input; direct manipulation over modal editing.
139
+
140
+ ### gov.uk (Government Digital Service)
141
+ **Why it excels:** The UK Government Digital Service sets the accessibility standard for forms. Every form follows a "one thing per page" pattern. Labels are large and above fields. Error summaries appear at the top of the page with anchor links to each problem field. The design system is fully WCAG 2.2 AA compliant and extensively user-tested with assistive technology users.
142
+
143
+ **Key takeaways:** One thing per page for complex government forms; error summary with anchor links; large, clear labels; extensive assistive technology testing; open-source design system.
144
+
145
+ ---
146
+
147
+ ## 3. User Flow Mapping
148
+
149
+ ### Happy Path
150
+
151
+ ```
152
+ [Form loads] → [User focuses first field] → [Types data] →
153
+ [Moves to next field (Tab/click)] → [Real-time validation confirms ✓] →
154
+ [Completes all fields] → [Clicks submit] → [Loading state] →
155
+ [Success confirmation] → [Redirect or next step]
156
+ ```
157
+
158
+ Key design requirements for the happy path:
159
+ - Auto-focus the first input on form load (unless the form is below the fold)
160
+ - Show positive validation feedback (green checkmark) as fields are completed correctly
161
+ - Disable the submit button during submission to prevent double-submit
162
+ - Show a loading/spinner state on the submit button during processing
163
+ - Display a clear success message or redirect on completion
164
+
165
+ ### Validation Errors
166
+
167
+ ```
168
+ [User submits form] → [Client-side validation catches errors] →
169
+ [Scroll to first error] → [Focus first error field] →
170
+ [Display inline error messages] → [Error summary at top (optional)] →
171
+ [User corrects field] → [Error clears immediately on valid input] →
172
+ [User re-submits] → [Success]
173
+ ```
174
+
175
+ **Reward Early, Punish Late Pattern (recommended):**
176
+ This is the most effective validation timing strategy, validated by Smashing Magazine and Baymard research:
177
+
178
+ - If a field is in a valid state and the user is editing it, wait until blur (leaving the field) to validate — "punish late"
179
+ - If a field is in an invalid/error state and the user is correcting it, validate on every keystroke so the error clears immediately when fixed — "reward early"
180
+ - Never validate empty fields while the user is still typing (premature validation)
181
+ - Validate empty required fields only on form submission
182
+
183
+ Research shows that the "validate on blur" method results in forms completed 7-10 seconds faster than "validate while typing" methods, with better satisfaction ratings.
184
+
185
+ ### Server Errors
186
+
187
+ ```
188
+ [User submits valid form] → [Request sent to server] →
189
+ [Server returns error (409 conflict, 422 validation, 500 error)] →
190
+ [Re-enable submit button] → [Show server error message] →
191
+ [Preserve all user input] → [Map server field errors to inline messages] →
192
+ [User corrects and re-submits]
193
+ ```
194
+
195
+ Design requirements:
196
+ - Never clear form data on server error — this is a critical anti-pattern
197
+ - Map server-side field errors to the specific inline field when possible
198
+ - For general server errors (500), display a banner/toast with a retry option
199
+ - For conflict errors (e.g., "email already exists"), show inline on the specific field
200
+ - Log detailed error information for debugging but show user-friendly messages
201
+
202
+ ### Timeout
203
+
204
+ ```
205
+ [User submits form] → [Request takes too long] →
206
+ [Show timeout message after threshold (e.g., 30 seconds)] →
207
+ [Offer retry button] → [Preserve all form data] →
208
+ [Optionally show "Check status" link if submission may have succeeded]
209
+ ```
210
+
211
+ ### Multi-Step Form Progress and Back Navigation
212
+
213
+ ```
214
+ Step 1: [Contact Info] → validates → saves to state/server →
215
+ Step 2: [Shipping Address] → validates → saves →
216
+ Step 3: [Payment] → validates → saves →
217
+ Step 4: [Review & Confirm] → submit
218
+
219
+ Back navigation at any step:
220
+ [Step 3] ← Back ← [Step 2 with preserved data] ← Back ← [Step 1 with preserved data]
221
+ ```
222
+
223
+ Design requirements:
224
+ - Auto-save all data on step transitions — do not require the user to click "Save"
225
+ - Back button must restore all previously entered data exactly as left
226
+ - Browser back button should navigate to the previous form step, not leave the form entirely
227
+ - Show a confirmation dialog if the user tries to leave the form with unsaved data
228
+ - On the review step, allow editing any section by clicking on it (jump to that step)
229
+ - Progress indicator should show completed steps as clickable links for random access
230
+
231
+ ### Edge Cases
232
+
233
+ **Session Expiry During Form**
234
+ - Auto-save form data to localStorage/sessionStorage periodically (every 30 seconds or on field blur)
235
+ - On session expiry, show a modal: "Your session has expired. Your progress has been saved. Please log in to continue."
236
+ - After re-authentication, restore the form state from saved data
237
+ - Never silently lose form data due to session timeout
238
+
239
+ **Network Loss**
240
+ - Detect offline state and show a non-blocking banner: "You're offline. Your changes will be saved when you reconnect."
241
+ - Queue form submissions and retry when connectivity returns
242
+ - Use optimistic UI: show the form as submitted with a pending indicator
243
+ - For critical forms (payments), explicitly warn that submission requires connectivity
244
+
245
+ **Duplicate Submission**
246
+ - Disable the submit button immediately on first click and show a loading state
247
+ - Use idempotency tokens: generate a unique token on form load, send with submission, reject duplicates server-side
248
+ - If a second submission is detected, show: "This form has already been submitted" with a link to the result
249
+ - Never process duplicate payment transactions — use idempotency keys (Stripe pattern)
250
+
251
+ ---
252
+
253
+ ## 4. Micro-Interactions
254
+
255
+ ### Input Focus Animation
256
+
257
+ When a user taps or clicks into a field, the transition should provide clear visual feedback without being distracting.
258
+
259
+ **Recommended implementations:**
260
+ - Border color transitions from neutral gray to brand/primary color (150-200ms ease)
261
+ - Material Design 3: animated underline that expands from center outward for filled variant; border color change for outlined variant
262
+ - Floating label animates upward and scales down (transform: translateY + scale) when field receives focus or contains value
263
+ - Subtle background color shift (e.g., white to light blue tint) for filled text field variants
264
+ - Focus ring for keyboard users: 2px solid outline with 2px offset, high-contrast color
265
+
266
+ ```css
267
+ /* Example focus transition */
268
+ .input-field {
269
+ border: 1.5px solid #79747E;
270
+ transition: border-color 150ms ease, box-shadow 150ms ease;
271
+ }
272
+ .input-field:focus {
273
+ border-color: #6750A4;
274
+ box-shadow: 0 0 0 1px #6750A4;
275
+ }
276
+ /* Keyboard-only focus ring */
277
+ .input-field:focus-visible {
278
+ outline: 2px solid #6750A4;
279
+ outline-offset: 2px;
280
+ }
281
+ ```
282
+
283
+ ### Error Shake
284
+
285
+ When a user submits a form with errors or enters invalid data, a subtle horizontal shake draws attention without causing anxiety.
286
+
287
+ - Use a short animation: 3-4 oscillations over 300-400ms
288
+ - Amplitude: 4-6px horizontal displacement maximum
289
+ - Combine with color change (border turns red) and error message appearance
290
+ - Apply to the specific field with the error, not the entire form
291
+ - Never shake on every keystroke — only on blur validation failure or submit
292
+
293
+ ```css
294
+ @keyframes shake {
295
+ 0%, 100% { transform: translateX(0); }
296
+ 20%, 60% { transform: translateX(-4px); }
297
+ 40%, 80% { transform: translateX(4px); }
298
+ }
299
+ .input-error {
300
+ animation: shake 0.3s ease-in-out;
301
+ border-color: #B3261E;
302
+ }
303
+ ```
304
+
305
+ ### Success Checkmark
306
+
307
+ When a field passes validation, a green checkmark provides positive reinforcement and a sense of progress.
308
+
309
+ - Animate the checkmark drawing itself (SVG stroke-dashoffset animation) over 200-300ms
310
+ - Place the checkmark inside the field on the trailing edge, or immediately after the field
311
+ - Use green (#1B7D3A or similar) that passes 3:1 contrast ratio against the background
312
+ - Combine with a subtle border color change to green
313
+ - Do not show checkmarks prematurely — wait until the field is fully valid (e.g., complete email format)
314
+
315
+ ### Real-Time Validation Timing
316
+
317
+ **When to validate:**
318
+
319
+ | Scenario | Trigger | Rationale |
320
+ |---|---|---|
321
+ | Required field, first visit | On blur (leaving field) | Don't interrupt typing |
322
+ | Required field, previously invalid | On keystroke (onChange) | Reward early — clear error ASAP |
323
+ | Email format | On blur | User may not have finished typing |
324
+ | Password strength | On keystroke | User needs real-time feedback to meet requirements |
325
+ | Username availability | On blur + debounce (300ms) | Requires server call; avoid excessive requests |
326
+ | Credit card number | On blur + Luhn check | Validate complete number, not partial |
327
+ | Phone number | On blur | User may be entering with different formats |
328
+ | Empty required fields | On form submit only | Don't flag fields the user hasn't reached yet |
329
+
330
+ ### Character Counters
331
+
332
+ - Show remaining characters, not total typed: "47 / 280" or "233 remaining"
333
+ - Position below the input field, right-aligned
334
+ - Change color to warning (amber) at 80% capacity
335
+ - Change color to error (red) at 100% — prevent further input or show overflow indicator
336
+ - For text areas, update the counter on every keystroke
337
+ - Announce counter updates to screen readers using aria-live="polite" (debounced)
338
+
339
+ ### Password Strength Meters
340
+
341
+ - Display a horizontal bar below the password field that fills proportionally with strength
342
+ - Use a 4-level scale: Weak (red), Fair (orange), Good (yellow-green), Strong (green)
343
+ - Update on every keystroke as the user types
344
+ - Show requirement checklist below the meter: 8+ characters, uppercase, number, symbol
345
+ - Check each requirement off with a green checkmark as it is met
346
+ - Use aria-describedby to associate the strength indicator with the password field
347
+ - Provide text label alongside color: "Strong" not just a green bar (for color-blind users)
348
+
349
+ ### Auto-Formatting
350
+
351
+ Auto-formatting transforms raw user input into a readable, structured format as the user types.
352
+
353
+ **Credit Card Numbers:**
354
+ - Insert spaces every 4 digits: `4242 4242 4242 4242`
355
+ - Auto-detect card brand from first digits and display logo (Visa: 4xxx, Mastercard: 5xxx, Amex: 3xxx)
356
+ - Amex uses 4-6-5 grouping: `3782 822463 10005`
357
+ - Auto-advance cursor to next field (expiry) when card number is complete
358
+
359
+ **Phone Numbers:**
360
+ - Format based on detected country: US `(555) 123-4567`, UK `+44 7911 123456`
361
+ - Accept input in any format and normalize
362
+ - Use `type="tel"` to trigger numeric keyboard on mobile
363
+
364
+ **Dates:**
365
+ - Auto-insert separators: typing `03072026` becomes `03/07/2026`
366
+ - Prefer native date pickers on mobile; formatted text input on desktop
367
+ - Accept multiple formats and normalize (MM/DD/YYYY, DD/MM/YYYY based on locale)
368
+
369
+ **Currency:**
370
+ - Add currency symbol and thousand separators as user types
371
+ - Right-align currency values in input fields
372
+ - Auto-add decimal places on blur: `42` becomes `$42.00`
373
+
374
+ ---
375
+
376
+ ## 5. Anti-Patterns
377
+
378
+ ### 1. Placeholder Text as Labels
379
+ **Problem:** Labels placed inside the input field as placeholder text disappear when the user starts typing. Users forget what data the field requires, especially in longer forms, when switching between fields, or when using autofill. Screen readers may not announce placeholders consistently.
380
+ **Fix:** Always use a visible, persistent label above or beside the field. Placeholders may supplement labels with example data but must never replace them. NNG has explicitly stated: "Placeholders in form fields are harmful."
381
+
382
+ ### 2. Validation Only on Submit
383
+ **Problem:** Users fill out an entire form, click submit, and only then discover multiple errors. They must scroll to find and fix each error with no guidance on which fields failed. This is especially punishing on long forms.
384
+ **Fix:** Use the "reward early, punish late" pattern: validate on blur for first-visit fields, validate on keystroke for fields with existing errors. Combine inline validation with an error summary at the top of the form on submit.
385
+
386
+ ### 3. Clearing Form Data on Error
387
+ **Problem:** When a form submission fails (client-side or server-side), all entered data is erased, forcing the user to re-enter everything from scratch. This is one of the most rage-inducing form experiences.
388
+ **Fix:** Always preserve user input on error. Store form state in component state or sessionStorage. Repopulate all fields after failed submission. Only clear sensitive fields (passwords) if required by security policy.
389
+
390
+ ### 4. Unnecessary Required Fields
391
+ **Problem:** Marking fields as required when the data is not genuinely needed (e.g., phone number for a newsletter signup, company name for an individual account). Each required field adds friction and potential abandonment.
392
+ **Fix:** Apply the NNG EAS framework: Eliminate unnecessary fields first. Mark only genuinely required fields. Clearly label optional fields. Default to collecting minimal data and request additional information progressively.
393
+
394
+ ### 5. CAPTCHA Overuse
395
+ **Problem:** CAPTCHAs (especially distorted text or image grid challenges) add significant friction, delay form completion, and are inaccessible to many users with visual or cognitive disabilities. Aggressive CAPTCHAs can block legitimate users.
396
+ **Fix:** Use invisible reCAPTCHA v3 or Cloudflare Turnstile (no user interaction required). Reserve visible CAPTCHAs for high-risk actions only (account creation, payment). Never use CAPTCHAs on login forms for returning users. Provide audio alternatives when visual CAPTCHAs are necessary.
397
+
398
+ ### 6. Disabled Submit Buttons Without Explanation
399
+ **Problem:** The submit button is grayed out and unclickable, but the user cannot determine why. They scan the form for errors but find no error messages or indicators of what is incomplete.
400
+ **Fix:** Either keep the submit button always enabled and show errors on click, or if disabling it, show a tooltip/message explaining what is needed: "Complete all required fields to continue." Highlight incomplete required fields with a visual indicator.
401
+
402
+ ### 7. Multi-Column Form Layouts
403
+ **Problem:** Forms laid out in multiple columns disrupt the natural top-to-bottom reading flow. Users may miss fields in the right column or fill fields in the wrong order. Baymard found 16% of e-commerce sites make this mistake.
404
+ **Fix:** Use single-column layout for all forms. The only exceptions are short, logically related field pairs (City + State, First Name + Last Name, Expiry + CVV) where the relationship is obvious and the fields fit naturally on one line.
405
+
406
+ ### 8. Vague or Generic Error Messages
407
+ **Problem:** Messages like "Invalid input," "Error," or "Please fix the errors below" without specifying which field has what problem. 99% of sites do not adapt error messages to the specific issue (Baymard Institute).
408
+ **Fix:** Write error messages that (1) identify which field has the problem, (2) explain what went wrong specifically, and (3) tell the user how to fix it. Example: "Email must include an @ symbol and a domain (e.g., name@example.com)."
409
+
410
+ ### 9. Auto-Advancing Focus Prematurely
411
+ **Problem:** Automatically moving focus to the next field when the current field reaches its maximum length. This breaks users who need to correct input, interferes with screen readers, and confuses users who did not expect the jump.
412
+ **Fix:** Auto-advance only for highly structured, universally understood sequences (credit card number to expiry, OTP code fields). Never auto-advance for general text inputs. Always allow the user to manually return to the previous field.
413
+
414
+ ### 10. Using Dropdowns for Short Lists
415
+ **Problem:** A dropdown/select menu for 2-5 options requires two clicks (open menu, select option) and hides the options until clicked. For short lists, this adds unnecessary interaction cost.
416
+ **Fix:** Use radio buttons for 2-5 options (all visible at once, single click to select). Use segmented controls for 2-4 options on mobile. Reserve dropdowns for 6+ options. Use a searchable combobox/autocomplete for 15+ options.
417
+
418
+ ### 11. Forcing Account Creation Before Checkout
419
+ **Problem:** Requiring users to create an account before they can complete a purchase. Stripe research shows forced account creation is "one of the fastest ways to lose a sale."
420
+ **Fix:** Always offer guest checkout. Offer account creation after order completion when friction cost is zero. Social login options (Google, Apple) reduce registration friction for users who want accounts.
421
+
422
+ ### 12. Reset / Clear Form Buttons
423
+ **Problem:** A "Reset" or "Clear" button positioned next to the submit button. Users accidentally click it and lose all their entered data. NNG has warned against this pattern for over 15 years.
424
+ **Fix:** Remove reset buttons entirely. If a clear function is genuinely needed (rare), place it far from the submit button and require confirmation: "Are you sure you want to clear all fields?"
425
+
426
+ ---
427
+
428
+ ## 6. Accessibility Requirements
429
+
430
+ ### Label Association
431
+
432
+ Every form input must have a programmatically associated label. This is the single most important form accessibility requirement.
433
+
434
+ ```html
435
+ <!-- Explicit association (preferred) -->
436
+ <label for="email">Email address</label>
437
+ <input type="email" id="email" name="email" />
438
+
439
+ <!-- Implicit association (wrapping) -->
440
+ <label>
441
+ Email address
442
+ <input type="email" name="email" />
443
+ </label>
444
+
445
+ <!-- For inputs without visible labels (e.g., search) -->
446
+ <input type="search" aria-label="Search products" />
447
+ ```
448
+
449
+ - Use the `for`/`id` pattern (explicit association) as the primary method — it is the most robustly supported across all assistive technologies
450
+ - Never rely solely on `placeholder`, `title`, or `aria-describedby` as the accessible name
451
+ - Screen readers announce: "[Label text], [input type], [state]" — e.g., "Email address, edit text, required"
452
+ - Test with screen readers: VoiceOver (macOS/iOS), NVDA (Windows), TalkBack (Android)
453
+
454
+ ### Error Announcement
455
+
456
+ Errors must be announced to assistive technology users, not just displayed visually.
457
+
458
+ ```html
459
+ <label for="email">Email address *</label>
460
+ <input
461
+ type="email"
462
+ id="email"
463
+ aria-required="true"
464
+ aria-invalid="true"
465
+ aria-describedby="email-error"
466
+ />
467
+ <span id="email-error" role="alert">
468
+ Please enter a valid email address
469
+ </span>
470
+ ```
471
+
472
+ - Use `aria-invalid="true"` on the input when validation fails
473
+ - Use `aria-describedby` to link the error message element to the input
474
+ - Use `role="alert"` or `aria-live="assertive"` on the error message container so screen readers announce the error immediately when it appears
475
+ - For error summaries at the top of the form, move focus to the summary on submit and include anchor links to each error field
476
+ - Remove `aria-invalid` and the error message when the user corrects the input
477
+
478
+ ### Focus Management
479
+
480
+ ```
481
+ [Form submission fails] →
482
+ [Focus moves to error summary or first error field] →
483
+ [User corrects error] →
484
+ [Focus remains in corrected field] →
485
+ [User tabs to next field naturally]
486
+ ```
487
+
488
+ - On form submission with errors, move focus to either the error summary (if present) or the first field with an error
489
+ - On multi-step forms, move focus to the first field of the new step when advancing
490
+ - On modal/dialog forms, trap focus within the modal (no Tab escape to background content)
491
+ - On form completion, move focus to the success message or the next logical element
492
+ - Never remove focus from the current field during typing (no focus-stealing)
493
+
494
+ ### Keyboard Navigation
495
+
496
+ - All form fields must be reachable and operable via keyboard alone
497
+ - Tab order must follow the visual order (use logical DOM order, not `tabindex` hacks)
498
+ - `Tab` moves forward through fields; `Shift+Tab` moves backward
499
+ - `Enter` should submit the form when focus is on a text input (native HTML behavior)
500
+ - `Space` toggles checkboxes and activates buttons
501
+ - `Arrow keys` navigate radio button groups, select options, and date pickers
502
+ - Custom components (date pickers, comboboxes, tag inputs) must implement ARIA widget patterns with full keyboard support
503
+ - Avoid `tabindex` values greater than 0 — they break natural tab order
504
+
505
+ ### Form Instructions
506
+
507
+ ```html
508
+ <!-- Required field indication -->
509
+ <label for="name">
510
+ Full name <span aria-hidden="true">*</span>
511
+ <span class="sr-only">(required)</span>
512
+ </label>
513
+ <input type="text" id="name" aria-required="true" />
514
+
515
+ <!-- Field with format instructions -->
516
+ <label for="phone">Phone number</label>
517
+ <input
518
+ type="tel"
519
+ id="phone"
520
+ aria-describedby="phone-hint"
521
+ />
522
+ <span id="phone-hint">Format: (555) 123-4567</span>
523
+
524
+ <!-- Group of related fields -->
525
+ <fieldset>
526
+ <legend>Shipping address</legend>
527
+ <label for="street">Street</label>
528
+ <input type="text" id="street" autocomplete="street-address" />
529
+ <!-- ... more address fields ... -->
530
+ </fieldset>
531
+ ```
532
+
533
+ - Use `aria-required="true"` on required fields (supplements the visual asterisk)
534
+ - Use `<fieldset>` and `<legend>` to group related fields (address, payment details, radio groups)
535
+ - Use `aria-describedby` to link helper text and format hints to their input
536
+ - Provide form-level instructions before the form if the form has special requirements
537
+ - Mark both required and optional fields explicitly — Baymard testing found 32% of participants missed required fields when only optional fields were marked
538
+
539
+ ### Color and Contrast
540
+
541
+ - Error states must not rely on color alone — use icons (warning triangle, X mark) alongside red borders/text
542
+ - Error text must meet 4.5:1 contrast ratio against the background (WCAG 1.4.3)
543
+ - Form field borders must meet 3:1 contrast ratio against adjacent colors (WCAG 1.4.11)
544
+ - Focus indicators must meet 3:1 contrast ratio and have sufficient size (WCAG 2.4.13)
545
+ - Success and error states should use icons and text labels, not just green/red colors (support for color-blind users)
546
+
547
+ ---
548
+
549
+ ## 7. Cross-Platform Adaptation
550
+
551
+ ### iOS
552
+
553
+ **Native Pickers:**
554
+ - Use `UIDatePicker` with `.compact` style for date fields in space-constrained layouts — it opens a modal calendar view on tap
555
+ - Use `.inline` style for date pickers in settings or filters where the calendar should be always visible
556
+ - Use `.wheels` style only when it matches the mental model (time selection, slot pickers)
557
+ - Use `UIMenu` (pull-down buttons) for lists of 2-7 items instead of picker wheels
558
+ - For long lists (countries, currencies), use a searchable table view, not a picker wheel
559
+
560
+ **Keyboard Types:**
561
+ - `.emailAddress` — includes `@` and `.` prominently
562
+ - `.phonePad` — numeric-only with `+`, `*`, `#`
563
+ - `.numberPad` — 0-9 only (no decimal, no negative)
564
+ - `.decimalPad` — 0-9 with decimal point
565
+ - `.URL` — includes `/`, `.`, `.com` button
566
+ - `.asciiCapable` — prevents emoji keyboard
567
+ - Set `textContentType` for autofill: `.emailAddress`, `.password`, `.newPassword`, `.oneTimeCode`, `.fullName`, `.streetAddressLine1`, etc.
568
+
569
+ **Input Accessories:**
570
+ - Add a toolbar above the keyboard with "Previous" / "Next" / "Done" buttons for multi-field forms
571
+ - "Done" button dismisses the keyboard (critical for `.numberPad` which lacks a return key)
572
+ - Use `inputAccessoryView` for contextual actions (paste, scan, clear)
573
+ - Support password autofill with `textContentType: .password` and associated domains
574
+
575
+ **Platform Conventions:**
576
+ - Minimum touch target: 44x44 points (Apple HIG)
577
+ - Use `UITextField` and `UITextView` for standard text entry
578
+ - Support Dynamic Type: form labels and inputs must scale with the user's preferred text size
579
+ - Support Smart Invert and Dark Mode for all form components
580
+
581
+ ### Android
582
+
583
+ **Material Text Fields:**
584
+ - **Filled variant:** Has a solid background fill and bottom-line indicator. Better for high-density forms and settings. Visually heavier, stands out on white backgrounds.
585
+ - **Outlined variant:** Has a border stroke around the field. Better for minimal designs and forms where fields need clear boundaries. Lighter visual weight.
586
+ - Both variants support floating labels that animate from placeholder to top-label on focus
587
+ - Both support leading/trailing icons, prefix/suffix text, helper text, error text, and character counter
588
+ - Use `TextInputLayout` wrapping `TextInputEditText` for proper Material theming
589
+
590
+ **Keyboard Types:**
591
+ - `inputType="textEmailAddress"` — email keyboard with `@`
592
+ - `inputType="phone"` — phone dialer layout
593
+ - `inputType="number"` — numeric keyboard
594
+ - `inputType="numberDecimal"` — numeric with decimal
595
+ - `inputType="textPassword"` — obscured input with visibility toggle
596
+ - `inputType="textUri"` — URL keyboard with `/` and `.com`
597
+ - Set `android:autofillHints` for autofill: `emailAddress`, `password`, `postalCode`, `creditCardNumber`, etc.
598
+
599
+ **Platform Conventions:**
600
+ - Minimum touch target: 48x48 dp (Material Design)
601
+ - Use `TextInputLayout` for consistent label animation, error display, and helper text
602
+ - Support edge-to-edge layouts — form fields should not be obscured by system bars
603
+ - Handle `windowSoftInputMode` to ensure fields are visible when the keyboard appears (`adjustResize` or `adjustPan`)
604
+
605
+ ### Web
606
+
607
+ **HTML5 Input Types:**
608
+ ```html
609
+ <input type="email" /> <!-- Email keyboard on mobile, built-in validation -->
610
+ <input type="tel" /> <!-- Phone keyboard on mobile -->
611
+ <input type="url" /> <!-- URL keyboard on mobile -->
612
+ <input type="number" /> <!-- Numeric keyboard, spinner controls -->
613
+ <input type="search" /> <!-- Search keyboard with "Go" button, clear icon -->
614
+ <input type="date" /> <!-- Native date picker on mobile/modern browsers -->
615
+ <input type="time" /> <!-- Native time picker -->
616
+ <input type="password" /> <!-- Obscured input, password manager integration -->
617
+ <input type="range" /> <!-- Slider control -->
618
+ <input type="color" /> <!-- Color picker -->
619
+ ```
620
+
621
+ **Autocomplete Attributes:**
622
+ ```html
623
+ <!-- Identity -->
624
+ <input autocomplete="name" /> <!-- Full name -->
625
+ <input autocomplete="given-name" /> <!-- First name -->
626
+ <input autocomplete="family-name" /> <!-- Last name -->
627
+ <input autocomplete="email" /> <!-- Email address -->
628
+ <input autocomplete="tel" /> <!-- Phone number -->
629
+ <input autocomplete="bday" /> <!-- Birthday -->
630
+
631
+ <!-- Address -->
632
+ <input autocomplete="street-address" /> <!-- Street line -->
633
+ <input autocomplete="address-level2" /> <!-- City -->
634
+ <input autocomplete="address-level1" /> <!-- State/Province -->
635
+ <input autocomplete="postal-code" /> <!-- Zip/Postal code -->
636
+ <input autocomplete="country" /> <!-- Country -->
637
+
638
+ <!-- Payment -->
639
+ <input autocomplete="cc-name" /> <!-- Cardholder name -->
640
+ <input autocomplete="cc-number" /> <!-- Card number -->
641
+ <input autocomplete="cc-exp" /> <!-- Expiry (MM/YY) -->
642
+ <input autocomplete="cc-csc" /> <!-- CVV/CVC -->
643
+
644
+ <!-- Authentication -->
645
+ <input autocomplete="username" /> <!-- Username -->
646
+ <input autocomplete="current-password" /> <!-- Existing password -->
647
+ <input autocomplete="new-password" /> <!-- New password (signup/change) -->
648
+ <input autocomplete="one-time-code" /> <!-- OTP/2FA code -->
649
+ ```
650
+
651
+ Proper `autocomplete` attributes enable browser autofill and password managers, dramatically reducing form completion time. They also fulfill WCAG 2.1 SC 1.3.5 (Identify Input Purpose), which is required for AA conformance.
652
+
653
+ **Autofill Best Practices:**
654
+ - Always use standard `autocomplete` values — they map to browser and OS autofill systems
655
+ - Use `autocomplete="off"` only for truly sensitive fields where autofill is a security risk (not for login forms — browsers override this for password fields)
656
+ - Group address fields in a single `<fieldset>` so autofill can populate them as a unit
657
+ - Test autofill in Chrome, Safari, Firefox, and Edge — each has different autofill behaviors
658
+ - Use `autocomplete="new-password"` on password creation fields so browsers offer to generate and save passwords
659
+
660
+ **Responsive Form Design:**
661
+ - Single-column layout on all screen widths below 768px
662
+ - Labels above fields on mobile; labels may be inline on wide desktop layouts
663
+ - Touch targets: minimum 44x44 CSS pixels (WCAG 2.5.8 specifies 24x24 minimum, but 44px is the best practice per Apple and Google guidelines)
664
+ - Full-width inputs on mobile; constrained width (max 500-600px) on desktop
665
+ - Ensure the keyboard does not obscure the active input (use `scrollIntoView` or CSS `scroll-margin`)
666
+
667
+ ---
668
+
669
+ ## 8. Decision Tree
670
+
671
+ ### Single Page vs. Multi-Step
672
+
673
+ ```
674
+ How many fields does the form have?
675
+ ├── 1-8 fields
676
+ │ └── Use single-page form
677
+ ├── 9-15 fields
678
+ │ ├── Can fields be logically grouped into 2-3 sections?
679
+ │ │ ├── Yes → Use multi-step form (2-3 steps)
680
+ │ │ └── No → Use single-page with section dividers
681
+ │ └── Is the form on mobile?
682
+ │ ├── Yes → Prefer multi-step (reduces scroll)
683
+ │ └── No → Single-page with sections is acceptable
684
+ ├── 16-30 fields
685
+ │ └── Use multi-step form (3-5 steps, 5-7 fields each)
686
+ └── 30+ fields
687
+ └── Use multi-step form with save-and-resume capability
688
+ └── Consider breaking into multiple separate forms/sessions
689
+ ```
690
+
691
+ ### When to Auto-Save
692
+
693
+ ```
694
+ What type of data is being edited?
695
+ ├── Content creation (documents, posts, notes)
696
+ │ └── Auto-save (user expects it, data loss is costly)
697
+ ├── Settings / preferences / toggles
698
+ │ └── Auto-save per control (imperative controls)
699
+ ├── Profile information
700
+ │ ├── Non-sensitive fields (name, bio, avatar)
701
+ │ │ └── Auto-save is acceptable
702
+ │ └── Sensitive fields (email, password, payment)
703
+ │ └── Explicit save with confirmation
704
+ ├── Financial transactions (orders, payments, transfers)
705
+ │ └── Always explicit save/submit with confirmation
706
+ ├── Multi-step wizards
707
+ │ └── Auto-save on step transition; explicit submit on final step
708
+ ├── Forms with validation dependencies
709
+ │ └── Explicit save (auto-save may persist invalid states)
710
+ └── Collaborative editing (multiple users)
711
+ └── Auto-save with conflict resolution (CRDT/OT)
712
+ ```
713
+
714
+ **Rule of thumb:** If the change has financial, security, or privacy implications, require explicit save. If the change is recoverable and low-risk, auto-save. Never mix auto-save and explicit save patterns within the same form.
715
+
716
+ ### Inline vs. Modal Editing
717
+
718
+ ```
719
+ Where does the edit happen?
720
+ ├── User is viewing a list/table of items
721
+ │ ├── Editing 1-3 fields per item → Inline editing
722
+ │ └── Editing 4+ fields per item → Modal or detail page
723
+ ├── User is viewing a detail/profile page
724
+ │ ├── Fields are independent (each can be saved alone)
725
+ │ │ └── Inline editing (click to edit, auto-save)
726
+ │ └── Fields are interdependent (must be saved together)
727
+ │ └── Modal or edit mode with explicit save
728
+ ├── Edit is destructive or irreversible
729
+ │ └── Modal with confirmation dialog
730
+ ├── Edit requires context not visible inline
731
+ │ └── Modal or slide-over panel
732
+ └── User is on mobile
733
+ ├── Simple field edit → Inline with full-width input
734
+ └── Complex edit → Full-screen modal (not overlay)
735
+ ```
736
+
737
+ ### Input Type Selection
738
+
739
+ ```
740
+ What data type is being collected?
741
+ ├── Free text (name, comment, description)
742
+ │ ├── Short (< 100 chars) → <input type="text">
743
+ │ └── Long (100+ chars) → <textarea> with auto-resize
744
+ ├── Email → <input type="email">
745
+ ├── Phone → <input type="tel"> with auto-formatting
746
+ ├── URL → <input type="url">
747
+ ├── Number
748
+ │ ├── Precise value needed → <input type="text" inputmode="numeric">
749
+ │ │ (type="number" has UX issues with spinners and scroll hijacking)
750
+ │ └── Approximate value → <input type="range"> (slider)
751
+ ├── Date
752
+ │ ├── Mobile → Native date picker (<input type="date">)
753
+ │ └── Desktop → Custom date picker or formatted text input
754
+ ├── Password → <input type="password"> with visibility toggle
755
+ ├── Selection from options
756
+ │ ├── 2-5 options → Radio buttons (single) or checkboxes (multi)
757
+ │ ├── 6-15 options → Dropdown select or combobox
758
+ │ └── 15+ options → Searchable combobox / autocomplete
759
+ ├── Boolean → Checkbox (forms) or toggle switch (settings)
760
+ ├── File → <input type="file"> with drag-and-drop zone
761
+ └── Color → <input type="color"> or custom color picker
762
+ ```
763
+
764
+ ---
765
+
766
+ ## Quick Reference Checklist
767
+
768
+ Use this checklist when designing or reviewing any form:
769
+
770
+ ### Structure and Layout
771
+ - [ ] Single-column layout (no multi-column field arrangements)
772
+ - [ ] Labels positioned above fields (not inside as placeholders)
773
+ - [ ] Logical field grouping with fieldsets and visual section breaks
774
+ - [ ] Field width hints at expected input length
775
+ - [ ] Action buttons at bottom-left, primary action visually prominent
776
+
777
+ ### Fields and Inputs
778
+ - [ ] Only genuinely required fields are marked required; optional fields are labeled
779
+ - [ ] Correct HTML5 input types used (email, tel, url, number, date)
780
+ - [ ] Autocomplete attributes set for all identity, address, and payment fields
781
+ - [ ] Appropriate keyboard type triggers on mobile (numeric pad for phone, email keyboard for email)
782
+ - [ ] Dropdowns replaced with radio buttons for 2-5 options
783
+
784
+ ### Validation and Errors
785
+ - [ ] "Reward early, punish late" validation pattern implemented
786
+ - [ ] Error messages are specific, actionable, and positioned inline below the field
787
+ - [ ] Form data is never cleared on validation error
788
+ - [ ] Empty required fields validated on submit only (not prematurely on blur)
789
+ - [ ] Server errors display user-friendly messages and preserve all input
790
+
791
+ ### Accessibility
792
+ - [ ] Every input has a programmatic label (for/id association or aria-label)
793
+ - [ ] Error messages linked via aria-describedby; inputs marked aria-invalid on error
794
+ - [ ] Focus moves to first error field or error summary on failed submission
795
+ - [ ] Full keyboard operability (Tab, Shift+Tab, Enter, Space, Arrow keys)
796
+ - [ ] Color is not the sole indicator of state (icons and text supplement color)
797
+ - [ ] Touch targets are minimum 44x44px (48x48dp on Android)
798
+
799
+ ### Multi-Step Forms
800
+ - [ ] Progress indicator visible (step count, progress bar, or percentage)
801
+ - [ ] Data auto-saved on each step transition
802
+ - [ ] Back navigation preserves all previously entered data
803
+ - [ ] Browser back button navigates to previous step (not away from form)
804
+
805
+ ---
806
+
807
+ ## Sources and References
808
+
809
+ Research and guidelines referenced in this module:
810
+
811
+ - Baymard Institute — Checkout UX research, inline form validation studies, form field benchmarks (baymard.com)
812
+ - Nielsen Norman Group — Top 10 form design recommendations, EAS framework, placeholder text research, required fields guidelines (nngroup.com)
813
+ - Material Design 3 — Text field components, filled vs outlined variants, input interaction guidelines (m3.material.io)
814
+ - Smashing Magazine — Complete guide to inline validation UX, "reward early, punish late" pattern (smashingmagazine.com)
815
+ - Apple Human Interface Guidelines — Pickers, inputs, keyboard types, touch target sizing (developer.apple.com)
816
+ - W3C WAI — WCAG 2.2 form accessibility, multi-page form tutorials, ARIA techniques (w3.org)
817
+ - Stripe — Checkout UI design strategies, payment form optimization, mobile checkout best practices (stripe.com)
818
+ - UK Government Digital Service — GOV.UK Design System form patterns (design-system.service.gov.uk)
819
+ - Smart Interface Design Patterns — Inline validation UX analysis (smart-interface-design-patterns.com)