@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.
- package/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- 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)
|