@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,983 @@
|
|
|
1
|
+
# Cross-Platform Mobile Design
|
|
2
|
+
|
|
3
|
+
> **Module Type:** Platform
|
|
4
|
+
> **Scope:** Design principles, patterns, and conventions for building mobile applications
|
|
5
|
+
> that run on both iOS and Android using cross-platform frameworks (Flutter, React Native, .NET MAUI).
|
|
6
|
+
> **Last Updated:** 2026-03-07
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Table of Contents
|
|
11
|
+
|
|
12
|
+
1. [Platform Design Language](#1-platform-design-language)
|
|
13
|
+
2. [Layout & Navigation Patterns](#2-layout--navigation-patterns)
|
|
14
|
+
3. [Component Conventions](#3-component-conventions)
|
|
15
|
+
4. [Typography & Spacing System](#4-typography--spacing-system)
|
|
16
|
+
5. [Common Mistakes](#5-common-mistakes)
|
|
17
|
+
6. [Checklist](#6-checklist)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. Platform Design Language
|
|
22
|
+
|
|
23
|
+
### 1.1 The Cross-Platform Design Challenge: Consistency vs Platform Fidelity
|
|
24
|
+
|
|
25
|
+
Cross-platform mobile design operates on a fundamental tension: users expect apps to
|
|
26
|
+
feel native to their platform, while teams want a unified brand identity and reduced
|
|
27
|
+
design/development overhead. This tension manifests in every decision from navigation
|
|
28
|
+
structure to button shape.
|
|
29
|
+
|
|
30
|
+
**Platform fidelity** means respecting the conventions users already know. iOS users
|
|
31
|
+
expect edge-swipe-to-go-back, bottom tab bars, and SF Pro typography. Android users
|
|
32
|
+
expect the system back gesture (now predictive back in Android 14+), Material Design
|
|
33
|
+
components, and Roboto typography. When an app violates these expectations, it creates
|
|
34
|
+
cognitive friction -- the app "feels wrong" even if the user cannot articulate why.
|
|
35
|
+
|
|
36
|
+
**Brand consistency** means that a user switching between iOS and Android recognizes the
|
|
37
|
+
same product: the same color palette, the same information architecture, the same
|
|
38
|
+
feature set. This does not require pixel-identical screens.
|
|
39
|
+
|
|
40
|
+
The resolution is a layered strategy:
|
|
41
|
+
|
|
42
|
+
| Layer | Approach | Example |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| Brand identity | Unified across platforms | Colors, logo, illustration style, tone |
|
|
45
|
+
| Information architecture | Unified across platforms | Same screens, same feature set, same flows |
|
|
46
|
+
| Interaction patterns | Adapted per platform | Back navigation, pull-to-refresh feel, gestures |
|
|
47
|
+
| System-level components | Native per platform | Alerts, date pickers, share sheets, keyboards |
|
|
48
|
+
| Custom components | Unified with minor tweaks | Cards, feeds, dashboards, charts |
|
|
49
|
+
|
|
50
|
+
> **Principle:** Share intent, adapt interaction. The user should accomplish the same
|
|
51
|
+
> tasks in the same number of steps on both platforms, but the micro-interactions should
|
|
52
|
+
> feel native.
|
|
53
|
+
|
|
54
|
+
### 1.2 Framework Approaches
|
|
55
|
+
|
|
56
|
+
#### Flutter (Material + Cupertino)
|
|
57
|
+
|
|
58
|
+
Flutter renders its own pixels via the Skia/Impeller engine, meaning it does not use
|
|
59
|
+
native platform UI components by default. This gives Flutter apps pixel-perfect
|
|
60
|
+
consistency across platforms but requires deliberate effort to feel native.
|
|
61
|
+
|
|
62
|
+
Flutter provides two widget libraries:
|
|
63
|
+
|
|
64
|
+
- **Material widgets** -- Implement Material Design 3 guidelines. Default on Android.
|
|
65
|
+
- **Cupertino widgets** -- Implement Apple Human Interface Guidelines. Used on iOS.
|
|
66
|
+
|
|
67
|
+
Flutter also provides **adaptive constructors** on several widgets that automatically
|
|
68
|
+
switch between Material and Cupertino variants based on the running platform:
|
|
69
|
+
|
|
70
|
+
```dart
|
|
71
|
+
// These automatically use Cupertino variants on iOS:
|
|
72
|
+
Switch.adaptive(value: _value, onChanged: _onChanged);
|
|
73
|
+
Slider.adaptive(value: _value, onChanged: _onChanged);
|
|
74
|
+
CircularProgressIndicator.adaptive();
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Additional automatic platform adaptations in Flutter include:
|
|
78
|
+
|
|
79
|
+
- **Typography:** Material package defaults to Roboto on Android and San Francisco on iOS.
|
|
80
|
+
- **Icons:** Overflow menu dots are horizontal on iOS, vertical on Android. Back arrows
|
|
81
|
+
are a simple chevron on iOS and have a stem on Android.
|
|
82
|
+
- **Scrolling physics:** iOS uses bouncing scroll physics; Android uses clamping physics.
|
|
83
|
+
- **Haptic feedback:** Text field long-press triggers a buzz on Android, not on iOS.
|
|
84
|
+
Picker scrolling triggers a light impact knock on iOS, not on Android.
|
|
85
|
+
|
|
86
|
+
> **Reference:** Flutter Automatic Platform Adaptations
|
|
87
|
+
> (https://docs.flutter.dev/ui/adaptive-responsive/platform-adaptations)
|
|
88
|
+
|
|
89
|
+
**Best practice for Flutter:** Use Material widgets as the base, then swap to Cupertino
|
|
90
|
+
for input, selection, and system-information widgets on iOS. Use adaptive constructors
|
|
91
|
+
where available. For navigation chrome (app bar, tab bar), consider platform-branching.
|
|
92
|
+
|
|
93
|
+
#### React Native (Platform-Adaptive)
|
|
94
|
+
|
|
95
|
+
React Native uses actual native platform views, so components inherently look and feel
|
|
96
|
+
native. The challenge is the inverse of Flutter: ensuring brand consistency when the
|
|
97
|
+
underlying components differ.
|
|
98
|
+
|
|
99
|
+
React Native provides two mechanisms for platform adaptation:
|
|
100
|
+
|
|
101
|
+
1. **Platform module** -- Runtime detection and conditional rendering:
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
import { Platform } from 'react-native';
|
|
105
|
+
|
|
106
|
+
const styles = StyleSheet.create({
|
|
107
|
+
container: {
|
|
108
|
+
...Platform.select({
|
|
109
|
+
ios: { shadowColor: '#000', shadowOffset: { width: 0, height: 2 } },
|
|
110
|
+
android: { elevation: 4 },
|
|
111
|
+
}),
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
2. **Platform-specific file extensions** -- Separate files that React Native resolves
|
|
117
|
+
automatically:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
Button.ios.js // iOS-specific implementation
|
|
121
|
+
Button.android.js // Android-specific implementation
|
|
122
|
+
Button.js // Shared fallback
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
React Native also provides platform-specific components like `ActionSheetIOS`,
|
|
126
|
+
`ToastAndroid`, and `DrawerLayoutAndroid`.
|
|
127
|
+
|
|
128
|
+
> **Reference:** React Native Platform-Specific Code
|
|
129
|
+
> (https://reactnative.dev/docs/platform-specific-code)
|
|
130
|
+
|
|
131
|
+
**Best practice for React Native:** Create a shared component library with a unified API
|
|
132
|
+
surface, using platform-specific files or `Platform.select()` internally to render
|
|
133
|
+
appropriate native components.
|
|
134
|
+
|
|
135
|
+
#### .NET MAUI
|
|
136
|
+
|
|
137
|
+
.NET MAUI (Multi-platform App UI) uses a **Handler architecture** that maps
|
|
138
|
+
cross-platform controls to platform-native views. Handlers replaced the older
|
|
139
|
+
Xamarin.Forms renderer system, providing more modular, performant, and testable
|
|
140
|
+
control customization.
|
|
141
|
+
|
|
142
|
+
Each UI element delegates platform-specific behavior to a handler, which translates
|
|
143
|
+
MAUI controls into native views at runtime. Mappers handle property changes per
|
|
144
|
+
platform (background color, border styles, text sizes).
|
|
145
|
+
|
|
146
|
+
**Best practice for .NET MAUI:** Leverage the handler architecture for custom controls
|
|
147
|
+
that need platform-specific behavior. Use MAUI's built-in controls, which already
|
|
148
|
+
map to native components, for standard UI elements.
|
|
149
|
+
|
|
150
|
+
### 1.3 "Write Once, Adapt Per Platform" vs "Lowest Common Denominator"
|
|
151
|
+
|
|
152
|
+
The **lowest common denominator** approach uses only features and patterns available
|
|
153
|
+
identically on both platforms. This produces apps that feel foreign on both platforms --
|
|
154
|
+
neither truly iOS nor truly Android. Avoid this.
|
|
155
|
+
|
|
156
|
+
The **write once, adapt per platform** approach shares:
|
|
157
|
+
- Business logic and state management (100% shared)
|
|
158
|
+
- Screen structure and layout (90-95% shared)
|
|
159
|
+
- Custom visual components like cards, charts, avatars (85-95% shared)
|
|
160
|
+
|
|
161
|
+
And adapts:
|
|
162
|
+
- Navigation chrome and back behavior (platform-specific)
|
|
163
|
+
- System-level UI (alerts, pickers, share sheets) (platform-native)
|
|
164
|
+
- Gestures and haptics (platform-convention)
|
|
165
|
+
- Typography rendering and font selection (platform-appropriate)
|
|
166
|
+
|
|
167
|
+
The adaptation layer is typically 5-15% of the total UI code. This overhead is
|
|
168
|
+
dramatically less expensive than maintaining two separate native codebases, while
|
|
169
|
+
producing an experience that respects both platforms.
|
|
170
|
+
|
|
171
|
+
### 1.4 When to Use Platform-Specific vs Custom Unified Components
|
|
172
|
+
|
|
173
|
+
**Use platform-specific (native) components when:**
|
|
174
|
+
- The component is a system-level interaction (alerts, action sheets, date pickers)
|
|
175
|
+
- Users have strong muscle memory for the pattern (back navigation, pull-to-refresh)
|
|
176
|
+
- The OS provides accessibility features tied to the native component
|
|
177
|
+
- The component interacts with system UI (keyboards, notification permissions)
|
|
178
|
+
|
|
179
|
+
**Use custom unified components when:**
|
|
180
|
+
- The component represents your brand identity (cards, feed items, profile layouts)
|
|
181
|
+
- The component has no native equivalent (custom charts, onboarding flows)
|
|
182
|
+
- The interaction pattern is identical across platforms (scrolling a list, tapping a card)
|
|
183
|
+
- You need visual consistency for marketing or brand reasons
|
|
184
|
+
|
|
185
|
+
**Hybrid approach for common patterns:**
|
|
186
|
+
- Bottom tab bar: Use the same information architecture, but render with native
|
|
187
|
+
styling (Cupertino tab bar on iOS, Material NavigationBar on Android)
|
|
188
|
+
- Buttons: Custom styled for brand, but with platform-appropriate feedback
|
|
189
|
+
(iOS opacity fade, Android ripple effect)
|
|
190
|
+
- Text inputs: Custom styled container, but native keyboard and text selection behavior
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 2. Layout & Navigation Patterns
|
|
195
|
+
|
|
196
|
+
### 2.1 Navigation Patterns That Work Cross-Platform
|
|
197
|
+
|
|
198
|
+
#### Bottom Tab Navigation (with Adaptation)
|
|
199
|
+
|
|
200
|
+
Bottom tabs are the single most portable navigation pattern. Both iOS and Android
|
|
201
|
+
have standardized bottom navigation:
|
|
202
|
+
|
|
203
|
+
- **iOS:** UITabBarController -- bottom tab bar with labels, up to 5 items.
|
|
204
|
+
With iOS 26 Liquid Glass, tab bars now shrink on scroll and expand when
|
|
205
|
+
scrolling back up.
|
|
206
|
+
- **Android:** Material NavigationBar -- bottom navigation with 3-5 destinations,
|
|
207
|
+
icons with optional labels.
|
|
208
|
+
|
|
209
|
+
Cross-platform implementation:
|
|
210
|
+
|
|
211
|
+
| Aspect | iOS Convention | Android Convention | Recommendation |
|
|
212
|
+
|---|---|---|---|
|
|
213
|
+
| Label visibility | Always visible | Icons only or icons+labels | Always show labels for accessibility |
|
|
214
|
+
| Active indicator | Tinted icon + label | Pill-shaped indicator behind icon | Follow platform convention |
|
|
215
|
+
| Tab count | 3-5 (More tab for overflow) | 3-5 (no overflow) | Limit to 4-5 max |
|
|
216
|
+
| Tab switching | Preserves scroll position | May reset view state | Preserve state on both |
|
|
217
|
+
| Badge style | Red circle with count | Small dot or count | Follow platform style |
|
|
218
|
+
|
|
219
|
+
#### Stack Navigation
|
|
220
|
+
|
|
221
|
+
Both platforms use a push/pop stack model for drilling into content. The chrome
|
|
222
|
+
differs but the concept is universal:
|
|
223
|
+
|
|
224
|
+
- **iOS:** UINavigationController with large titles, back chevron with previous
|
|
225
|
+
screen title, edge-swipe to go back.
|
|
226
|
+
- **Android:** TopAppBar with back arrow, system back gesture (predictive back
|
|
227
|
+
in Android 14+).
|
|
228
|
+
|
|
229
|
+
#### Patterns That Translate Well
|
|
230
|
+
|
|
231
|
+
- **Search:** Top search bar (both platforms use this pattern).
|
|
232
|
+
- **Pull-to-refresh:** Universal concept, though the visual indicator differs
|
|
233
|
+
(iOS uses a spinner, Material uses a circular progress indicator).
|
|
234
|
+
- **Infinite scroll / pagination:** Identical on both platforms.
|
|
235
|
+
- **Modal sheets:** Both platforms support bottom sheets and full-screen modals.
|
|
236
|
+
Half-sheet / drag-to-dismiss modals are now standard on both.
|
|
237
|
+
|
|
238
|
+
### 2.2 Patterns That MUST Differ
|
|
239
|
+
|
|
240
|
+
#### Back Navigation
|
|
241
|
+
|
|
242
|
+
This is the single most critical difference between iOS and Android:
|
|
243
|
+
|
|
244
|
+
**iOS:**
|
|
245
|
+
- Edge swipe from the left edge of the screen navigates back.
|
|
246
|
+
- The navigation bar shows a back button (chevron + previous screen title).
|
|
247
|
+
- There is no system-level back affordance outside the app's own UI.
|
|
248
|
+
- Users expect the swipe gesture everywhere within a navigation stack.
|
|
249
|
+
|
|
250
|
+
**Android:**
|
|
251
|
+
- System back button/gesture handles back navigation globally.
|
|
252
|
+
- **Predictive back (Android 14+):** When the user swipes from the edge, Android
|
|
253
|
+
shows a preview of the destination before the gesture completes. The current
|
|
254
|
+
screen shrinks and shifts, revealing what is behind it.
|
|
255
|
+
- The app must declare support for predictive back via `enableOnBackInvokedCallback`.
|
|
256
|
+
- Back behavior may exit the app, pop a fragment, dismiss a modal, or close a drawer
|
|
257
|
+
depending on the back stack state.
|
|
258
|
+
|
|
259
|
+
> **Reference:** Android Predictive Back Design
|
|
260
|
+
> (https://developer.android.com/design/ui/mobile/guides/patterns/predictive-back)
|
|
261
|
+
|
|
262
|
+
**Cross-platform implementation:**
|
|
263
|
+
- On iOS: Implement interactive swipe-back with the navigation controller.
|
|
264
|
+
- On Android: Support predictive back animations. Do not intercept the system
|
|
265
|
+
back gesture unless absolutely necessary.
|
|
266
|
+
- In Flutter: Use `PopScope` (replacement for `WillPopScope`) and enable
|
|
267
|
+
predictive back via `android:enableOnBackInvokedCallback="true"` in the manifest.
|
|
268
|
+
- In React Native: Use `BackHandler` on Android; rely on navigation library's
|
|
269
|
+
gesture handler on iOS.
|
|
270
|
+
|
|
271
|
+
#### Pull-to-Refresh Behavior
|
|
272
|
+
|
|
273
|
+
While both platforms support pull-to-refresh, the visual treatment differs:
|
|
274
|
+
|
|
275
|
+
- **iOS:** A spinning activity indicator appears above the list content. The content
|
|
276
|
+
bounces past its top edge (rubber-band effect).
|
|
277
|
+
- **Android (Material):** A circular progress indicator descends from the top,
|
|
278
|
+
overlaying the content. The content does not bounce.
|
|
279
|
+
|
|
280
|
+
Use the platform's native refresh indicator. Do not force the iOS spinner onto
|
|
281
|
+
Android or vice versa.
|
|
282
|
+
|
|
283
|
+
#### Swipe Gestures on List Items
|
|
284
|
+
|
|
285
|
+
- **iOS:** Swipe-to-reveal actions is a core pattern (swipe left for delete, swipe
|
|
286
|
+
right for archive). Users expect full-swipe to perform the primary action.
|
|
287
|
+
- **Android:** Swipe gestures on list items are less standardized. Material Design
|
|
288
|
+
supports swipe-to-dismiss but it is less ingrained in user expectations.
|
|
289
|
+
|
|
290
|
+
#### Context Menus and Long-Press
|
|
291
|
+
|
|
292
|
+
- **iOS:** Long-press triggers context menus with a blur/scale preview animation.
|
|
293
|
+
3D Touch / Haptic Touch provides "peek and pop" on supported devices.
|
|
294
|
+
- **Android:** Long-press triggers contextual action bars or popup menus. Material
|
|
295
|
+
Design uses a simpler popup menu without the preview animation.
|
|
296
|
+
|
|
297
|
+
### 2.3 Screen Size Strategy Across iOS and Android Device Ranges
|
|
298
|
+
|
|
299
|
+
#### iOS Device Landscape
|
|
300
|
+
|
|
301
|
+
iOS has a relatively constrained set of screen sizes:
|
|
302
|
+
|
|
303
|
+
| Device Class | Screen Width (points) | Example |
|
|
304
|
+
|---|---|---|
|
|
305
|
+
| iPhone SE | 375 | iPhone SE 3rd gen |
|
|
306
|
+
| iPhone standard | 390-393 | iPhone 15, iPhone 16 |
|
|
307
|
+
| iPhone Pro Max | 430-440 | iPhone 16 Pro Max |
|
|
308
|
+
| iPad Mini | 744 | iPad Mini 6th gen |
|
|
309
|
+
| iPad | 820-1024 | iPad Air, iPad Pro |
|
|
310
|
+
|
|
311
|
+
#### Android Device Landscape
|
|
312
|
+
|
|
313
|
+
Android has enormous screen size variation:
|
|
314
|
+
|
|
315
|
+
| Device Class | Screen Width (dp) | Examples |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| Compact phone | 320-360 | Budget Android devices |
|
|
318
|
+
| Standard phone | 360-400 | Pixel 8, Samsung Galaxy S24 |
|
|
319
|
+
| Large phone | 400-480 | Samsung Galaxy S24 Ultra |
|
|
320
|
+
| Foldable (folded) | 280-400 | Galaxy Z Fold (cover) |
|
|
321
|
+
| Foldable (unfolded) | 600-840 | Galaxy Z Fold (inner) |
|
|
322
|
+
| Tablet | 600-1280 | Samsung Galaxy Tab, Pixel Tablet |
|
|
323
|
+
|
|
324
|
+
#### Cross-Platform Screen Strategy
|
|
325
|
+
|
|
326
|
+
1. **Design for 360-393 dp/pt as the baseline.** This covers the majority of both
|
|
327
|
+
iOS and Android devices.
|
|
328
|
+
2. **Test at 320dp minimum** to catch overflow on compact Android devices.
|
|
329
|
+
3. **Use flexible layouts** (Flex/Row/Column with flex factors) rather than fixed
|
|
330
|
+
widths for all content areas.
|
|
331
|
+
4. **Define breakpoints for layout shifts:**
|
|
332
|
+
- Compact: < 600dp -- Single column, bottom nav
|
|
333
|
+
- Medium: 600-840dp -- Two-column possible, rail nav or bottom nav
|
|
334
|
+
- Expanded: > 840dp -- Multi-column, navigation rail or drawer
|
|
335
|
+
5. **Avoid designing only for the "hero" device.** A design that looks perfect on
|
|
336
|
+
iPhone 16 Pro Max may overflow on an Android device at 320dp.
|
|
337
|
+
|
|
338
|
+
### 2.4 Safe Area Handling Across Platforms
|
|
339
|
+
|
|
340
|
+
Modern devices have non-rectangular screens with notches, Dynamic Island (iPhone),
|
|
341
|
+
hole-punch cameras (Android), rounded corners, and home indicators. Safe areas define
|
|
342
|
+
the region where content is fully visible and interactive.
|
|
343
|
+
|
|
344
|
+
#### iOS Safe Areas
|
|
345
|
+
|
|
346
|
+
iOS provides `safeAreaInsets` that account for:
|
|
347
|
+
- Status bar height (Dynamic Island, notch, or standard)
|
|
348
|
+
- Home indicator at the bottom (devices without a physical home button)
|
|
349
|
+
- Rounded corners
|
|
350
|
+
- Navigation bar and tab bar overlays (especially with iOS 26 Liquid Glass where
|
|
351
|
+
bars use translucent materials)
|
|
352
|
+
|
|
353
|
+
#### Android Safe Areas
|
|
354
|
+
|
|
355
|
+
Android provides:
|
|
356
|
+
- `WindowInsets` for system bars, display cutouts, and navigation bars
|
|
357
|
+
- Edge-to-edge display (default in Android 15+) where apps draw behind system bars
|
|
358
|
+
- `displayCutout` insets for notch and hole-punch cameras
|
|
359
|
+
|
|
360
|
+
#### Cross-Platform Implementation
|
|
361
|
+
|
|
362
|
+
**React Native:** Use `react-native-safe-area-context` (not the built-in `SafeAreaView`
|
|
363
|
+
which is iOS-only and limited). The library provides `SafeAreaView` component and
|
|
364
|
+
`useSafeAreaInsets()` hook that work on both platforms:
|
|
365
|
+
|
|
366
|
+
```javascript
|
|
367
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
368
|
+
|
|
369
|
+
function MyScreen() {
|
|
370
|
+
const insets = useSafeAreaInsets();
|
|
371
|
+
return (
|
|
372
|
+
<View style={{
|
|
373
|
+
paddingTop: insets.top,
|
|
374
|
+
paddingBottom: insets.bottom,
|
|
375
|
+
paddingLeft: insets.left,
|
|
376
|
+
paddingRight: insets.right,
|
|
377
|
+
}}>
|
|
378
|
+
{/* Content */}
|
|
379
|
+
</View>
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
> **Reference:** React Navigation Safe Areas
|
|
385
|
+
> (https://reactnavigation.org/docs/handling-safe-area/)
|
|
386
|
+
|
|
387
|
+
**Flutter:** Use `SafeArea` widget or `MediaQuery.of(context).padding` to access
|
|
388
|
+
safe area insets. Flutter handles safe areas automatically in `Scaffold` with
|
|
389
|
+
`AppBar` and `BottomNavigationBar`.
|
|
390
|
+
|
|
391
|
+
```dart
|
|
392
|
+
SafeArea(
|
|
393
|
+
child: Scaffold(
|
|
394
|
+
// Scaffold already handles safe areas for its app bar and bottom bar
|
|
395
|
+
body: MyContent(),
|
|
396
|
+
),
|
|
397
|
+
)
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Key rules:**
|
|
401
|
+
- Always test in landscape orientation -- safe areas change significantly.
|
|
402
|
+
- Never hardcode status bar or notch heights. Always use system-provided insets.
|
|
403
|
+
- Account for the home indicator area on both platforms (bottom inset).
|
|
404
|
+
- On Android with edge-to-edge, draw decorative content (backgrounds, images)
|
|
405
|
+
behind system bars but keep interactive content within safe areas.
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 3. Component Conventions
|
|
410
|
+
|
|
411
|
+
### 3.1 Components That Should Look the Same Everywhere
|
|
412
|
+
|
|
413
|
+
These components represent your brand and have no strong platform convention requiring
|
|
414
|
+
differentiation:
|
|
415
|
+
|
|
416
|
+
**Cards and content containers:**
|
|
417
|
+
Cards with rounded corners, shadows/elevation, and content layout are universal.
|
|
418
|
+
Neither platform has a strongly opinionated native card component, so your custom
|
|
419
|
+
card design works everywhere.
|
|
420
|
+
|
|
421
|
+
**List items and feeds:**
|
|
422
|
+
The structure of list items (leading icon, title, subtitle, trailing action) is
|
|
423
|
+
consistent across platforms. Style them with your brand typography and colors.
|
|
424
|
+
|
|
425
|
+
**Avatars and profile elements:**
|
|
426
|
+
User avatars, profile headers, and social elements have no platform convention.
|
|
427
|
+
|
|
428
|
+
**Charts and data visualization:**
|
|
429
|
+
Custom visualizations should be identical for brand consistency and data integrity.
|
|
430
|
+
|
|
431
|
+
**Onboarding and empty states:**
|
|
432
|
+
Illustrations, empty state messages, and onboarding carousels are brand-specific.
|
|
433
|
+
|
|
434
|
+
**Custom action buttons:**
|
|
435
|
+
Primary CTA buttons (e.g., "Add to Cart", "Book Now") should maintain brand identity.
|
|
436
|
+
However, adapt the touch feedback: opacity reduction on iOS, ripple on Android.
|
|
437
|
+
|
|
438
|
+
**Media content:**
|
|
439
|
+
Image galleries, video players (custom chrome), and audio players.
|
|
440
|
+
|
|
441
|
+
### 3.2 Components That MUST Be Platform-Native
|
|
442
|
+
|
|
443
|
+
Using custom implementations of these components creates the most jarring
|
|
444
|
+
cross-platform violations:
|
|
445
|
+
|
|
446
|
+
#### Alerts and Dialogs
|
|
447
|
+
|
|
448
|
+
| Aspect | iOS (Cupertino) | Android (Material) |
|
|
449
|
+
|---|---|---|
|
|
450
|
+
| Shape | Rounded rectangle, centered | Rounded rectangle, centered |
|
|
451
|
+
| Title | Bold, centered | Bold, left-aligned (MD3) |
|
|
452
|
+
| Actions | Side-by-side buttons, bold for primary | Stacked or side-by-side text buttons |
|
|
453
|
+
| Destructive action | Red text | Follows Material color system |
|
|
454
|
+
| Style | Translucent blur background | Elevated surface with scrim |
|
|
455
|
+
|
|
456
|
+
**Never** show a Material-styled dialog on iOS or a Cupertino-styled alert on Android.
|
|
457
|
+
Users interact with system alerts across all apps; non-native alerts feel like malware.
|
|
458
|
+
|
|
459
|
+
- In Flutter: Use `showCupertinoDialog` on iOS and `showDialog` with `AlertDialog`
|
|
460
|
+
on Android.
|
|
461
|
+
- In React Native: Use the `Alert` API which automatically uses native alerts on both
|
|
462
|
+
platforms.
|
|
463
|
+
|
|
464
|
+
#### Action Sheets / Bottom Sheets
|
|
465
|
+
|
|
466
|
+
- **iOS:** `UIActionSheet` / `CupertinoActionSheet` -- slides up from the bottom with
|
|
467
|
+
a cancel button separated by a gap. Translucent blurred background.
|
|
468
|
+
- **Android:** Material Bottom Sheet -- slides up, attached to bottom edge. Can be
|
|
469
|
+
modal or persistent. No separated cancel button.
|
|
470
|
+
|
|
471
|
+
#### Date and Time Pickers
|
|
472
|
+
|
|
473
|
+
This is one of the most visible platform differences:
|
|
474
|
+
|
|
475
|
+
- **iOS:** Inline wheel picker or compact picker that expands. Integrated into the
|
|
476
|
+
content flow. Users scroll wheels to select values.
|
|
477
|
+
- **Android:** Material Date Picker -- modal dialog with a calendar grid for dates,
|
|
478
|
+
clock face for time. Users tap to select.
|
|
479
|
+
|
|
480
|
+
**Never** show an iOS-style wheel picker on Android or a calendar grid dialog on iOS.
|
|
481
|
+
These components are deeply ingrained in user muscle memory.
|
|
482
|
+
|
|
483
|
+
- In Flutter: Use `showDatePicker` (Material) vs `showCupertinoDatePicker` based on
|
|
484
|
+
platform.
|
|
485
|
+
- In React Native: Use `@react-native-community/datetimepicker` which renders native
|
|
486
|
+
pickers on both platforms.
|
|
487
|
+
|
|
488
|
+
#### Keyboards and Text Input
|
|
489
|
+
|
|
490
|
+
Keyboard appearance is entirely OS-controlled and cannot be customized. However, you
|
|
491
|
+
must configure the correct keyboard type, return key, and autocorrection behavior:
|
|
492
|
+
|
|
493
|
+
- Use `keyboardType` appropriate to the field (email, phone, number, URL).
|
|
494
|
+
- Set `textContentType` (iOS) and `autoComplete` (Android) for autofill support.
|
|
495
|
+
- Configure the return key label (`done`, `next`, `search`, `go`).
|
|
496
|
+
|
|
497
|
+
#### Share Sheets
|
|
498
|
+
|
|
499
|
+
Always invoke the native share sheet (`UIActivityViewController` on iOS,
|
|
500
|
+
`Intent.ACTION_SEND` on Android). Never build a custom share UI.
|
|
501
|
+
|
|
502
|
+
#### Permissions Dialogs
|
|
503
|
+
|
|
504
|
+
Always use system-provided permission dialogs. Custom pre-permission dialogs
|
|
505
|
+
("priming screens") can be used before triggering the system dialog, but the actual
|
|
506
|
+
permission request must be native.
|
|
507
|
+
|
|
508
|
+
### 3.3 Gesture Differences
|
|
509
|
+
|
|
510
|
+
#### iOS Edge-Swipe Back vs Android Predictive Back
|
|
511
|
+
|
|
512
|
+
| Aspect | iOS | Android |
|
|
513
|
+
|---|---|---|
|
|
514
|
+
| Trigger | Swipe from left screen edge | Swipe from left or right screen edge |
|
|
515
|
+
| Visual feedback | Current screen slides right, previous screen slides in from left | Current screen shrinks and shifts, revealing destination |
|
|
516
|
+
| Cancelable | Yes, user can stop mid-gesture | Yes, user can stop mid-gesture |
|
|
517
|
+
| Scope | Within app navigation stack only | System-wide, may exit app |
|
|
518
|
+
| Implementation | Automatic with UINavigationController | Requires `enableOnBackInvokedCallback` |
|
|
519
|
+
|
|
520
|
+
#### Tap Feedback
|
|
521
|
+
|
|
522
|
+
- **iOS:** Buttons reduce opacity on press (typically to 0.6-0.7). No ripple effect.
|
|
523
|
+
Highlighted state is subtle.
|
|
524
|
+
- **Android:** Material ripple effect radiates from the touch point. The ripple is
|
|
525
|
+
an expected part of the interaction feedback.
|
|
526
|
+
|
|
527
|
+
Cross-platform frameworks should use the appropriate feedback:
|
|
528
|
+
- In Flutter: Material `InkWell` provides ripple; use `CupertinoButton` for iOS
|
|
529
|
+
opacity feedback or create a custom wrapper that switches.
|
|
530
|
+
- In React Native: Use `TouchableOpacity` on iOS and `TouchableNativeFeedback`
|
|
531
|
+
(or `Pressable` with platform-specific `android_ripple`) on Android.
|
|
532
|
+
|
|
533
|
+
#### Scroll Behavior
|
|
534
|
+
|
|
535
|
+
- **iOS:** Rubber-band / bounce effect at scroll boundaries. Momentum-based scrolling
|
|
536
|
+
with deceleration.
|
|
537
|
+
- **Android:** Edge glow (overscroll glow) effect at scroll boundaries. Predictable
|
|
538
|
+
stop on finger lift with Material 3 stretch overscroll.
|
|
539
|
+
|
|
540
|
+
Flutter automatically applies the correct scroll physics per platform.
|
|
541
|
+
React Native's `ScrollView` also adapts bounce behavior per platform.
|
|
542
|
+
|
|
543
|
+
### 3.4 Platform-Specific Affordances to Preserve
|
|
544
|
+
|
|
545
|
+
These small details significantly impact perceived native quality:
|
|
546
|
+
|
|
547
|
+
**iOS affordances:**
|
|
548
|
+
- Large title navigation bars that collapse on scroll
|
|
549
|
+
- Haptic feedback on selection changes (picker wheels, toggles)
|
|
550
|
+
- Translucent navigation and tab bars with blur (especially with Liquid Glass in iOS 26)
|
|
551
|
+
- Dynamic Type support for system font scaling
|
|
552
|
+
- The "rubber-band" overscroll effect
|
|
553
|
+
|
|
554
|
+
**Android affordances:**
|
|
555
|
+
- Floating Action Button (FAB) for primary actions in appropriate contexts
|
|
556
|
+
- Snackbar for transient messages (instead of iOS-style toast)
|
|
557
|
+
- Material You dynamic color theming (using wallpaper-extracted colors)
|
|
558
|
+
- Predictive back gesture animations
|
|
559
|
+
- Edge-to-edge rendering behind system bars
|
|
560
|
+
|
|
561
|
+
---
|
|
562
|
+
|
|
563
|
+
## 4. Typography & Spacing System
|
|
564
|
+
|
|
565
|
+
### 4.1 Shared Spacing System
|
|
566
|
+
|
|
567
|
+
The **8dp/pt grid** is the universal foundation for cross-platform spacing. Both
|
|
568
|
+
Material Design and Apple HIG align to multiples of 8 for component sizing, margins,
|
|
569
|
+
and padding. Some systems use a 4dp sub-grid for fine adjustments.
|
|
570
|
+
|
|
571
|
+
> **Reference:** Material Design 3 Spacing
|
|
572
|
+
> (https://m3.material.io/foundations/layout/understanding-layout/spacing)
|
|
573
|
+
|
|
574
|
+
#### Core Spacing Scale
|
|
575
|
+
|
|
576
|
+
Define a shared spacing scale used on both platforms:
|
|
577
|
+
|
|
578
|
+
```
|
|
579
|
+
spacing-0: 0dp
|
|
580
|
+
spacing-0.5: 2dp (4dp sub-grid: micro adjustments)
|
|
581
|
+
spacing-1: 4dp (4dp sub-grid: icon padding, inline spacing)
|
|
582
|
+
spacing-2: 8dp (base unit: minimum component padding)
|
|
583
|
+
spacing-3: 12dp (intermediate: compact list item padding)
|
|
584
|
+
spacing-4: 16dp (standard content margin, card padding)
|
|
585
|
+
spacing-5: 20dp (comfortable component spacing)
|
|
586
|
+
spacing-6: 24dp (section spacing, generous padding)
|
|
587
|
+
spacing-8: 32dp (large section breaks)
|
|
588
|
+
spacing-10: 40dp (screen-level margins on tablets)
|
|
589
|
+
spacing-12: 48dp (touch target minimum height)
|
|
590
|
+
spacing-16: 64dp (major section dividers)
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
**Touch targets:**
|
|
594
|
+
- iOS minimum: 44x44 pt (Apple HIG)
|
|
595
|
+
- Android minimum: 48x48 dp (Material Design)
|
|
596
|
+
- **Cross-platform recommendation:** Use 48dp minimum to satisfy both, with at least
|
|
597
|
+
8dp spacing between adjacent targets.
|
|
598
|
+
|
|
599
|
+
#### Screen Margins
|
|
600
|
+
|
|
601
|
+
- **Compact screens (phones):** 16dp horizontal margin is standard on both platforms.
|
|
602
|
+
- **Medium screens (large phones, small tablets):** 24dp margins.
|
|
603
|
+
- **Expanded screens (tablets):** 24-40dp margins, or use a max-width content container.
|
|
604
|
+
|
|
605
|
+
### 4.2 Font Strategy
|
|
606
|
+
|
|
607
|
+
Three viable approaches, each with tradeoffs:
|
|
608
|
+
|
|
609
|
+
#### Option A: System Fonts (Recommended for Most Apps)
|
|
610
|
+
|
|
611
|
+
Use the system font on each platform: **SF Pro** on iOS, **Roboto** on Android.
|
|
612
|
+
|
|
613
|
+
| Pros | Cons |
|
|
614
|
+
|---|---|
|
|
615
|
+
| Feels maximally native | Slightly different visual identity per platform |
|
|
616
|
+
| Zero bundle size overhead | Text metrics differ slightly (may affect layouts) |
|
|
617
|
+
| Automatic support for Dynamic Type (iOS) and font scaling (Android) | Cannot use for web without licensing concerns (SF Pro) |
|
|
618
|
+
| OS-level rendering optimizations | |
|
|
619
|
+
| SF Pro supports Liquid Glass vibrancy on iOS 26 | |
|
|
620
|
+
|
|
621
|
+
Flutter automatically uses the correct system font when using the Material or
|
|
622
|
+
Cupertino packages. React Native uses system fonts by default.
|
|
623
|
+
|
|
624
|
+
#### Option B: Custom Brand Font (for Strong Brand Identity)
|
|
625
|
+
|
|
626
|
+
Use a single custom font (e.g., **Inter**, **IBM Plex Sans**, **Geist**) on both
|
|
627
|
+
platforms.
|
|
628
|
+
|
|
629
|
+
| Pros | Cons |
|
|
630
|
+
|---|---|
|
|
631
|
+
| Identical visual identity everywhere | Adds to app bundle size (100-400KB for variable font) |
|
|
632
|
+
| Consistent text metrics = consistent layouts | Does not benefit from OS-level font optimizations |
|
|
633
|
+
| Works across mobile, web, and desktop | May feel slightly foreign on both platforms |
|
|
634
|
+
| Variable fonts reduce weight count | Must handle Dynamic Type / font scaling manually |
|
|
635
|
+
|
|
636
|
+
If choosing a custom font, prefer **variable fonts** (e.g., Inter Variable, Roboto Flex)
|
|
637
|
+
over multiple static weights. A single variable font file replaces 6-10 weight files,
|
|
638
|
+
reducing bundle size by up to 80%.
|
|
639
|
+
|
|
640
|
+
> The Inter font family is designed specifically for computer screens with tall x-height
|
|
641
|
+
> for readability, and covers Latin, Cyrillic, and Greek scripts. It is widely used as
|
|
642
|
+
> a cross-platform bridge font.
|
|
643
|
+
|
|
644
|
+
#### Option C: Hybrid (Platform Fonts for Body, Brand Font for Headlines)
|
|
645
|
+
|
|
646
|
+
Use SF Pro / Roboto for body text (readability, native feel) and a brand font for
|
|
647
|
+
headlines and display text (identity). This is a good compromise but adds complexity.
|
|
648
|
+
|
|
649
|
+
**Recommendation:** For most applications, Option A (system fonts) is the best default.
|
|
650
|
+
Choose Option B only when brand identity is a top priority and you are willing to
|
|
651
|
+
invest in testing font scaling, accessibility, and layout consistency. Option C
|
|
652
|
+
is appropriate for apps with strong typographic brand identities (media, fashion,
|
|
653
|
+
luxury).
|
|
654
|
+
|
|
655
|
+
### 4.3 Type Scale That Works Cross-Platform
|
|
656
|
+
|
|
657
|
+
Define a shared semantic type scale that maps to appropriate sizes on each platform.
|
|
658
|
+
Use semantic names (not pixel values) in your design system:
|
|
659
|
+
|
|
660
|
+
```
|
|
661
|
+
display-large: 34sp/pt -- Hero text, landing screens
|
|
662
|
+
display-medium: 28sp/pt -- Major section headers
|
|
663
|
+
headline-large: 24sp/pt -- Screen titles
|
|
664
|
+
headline-medium: 20sp/pt -- Section titles
|
|
665
|
+
title-large: 18sp/pt -- Card titles, dialog titles
|
|
666
|
+
title-medium: 16sp/pt -- Subsection titles
|
|
667
|
+
body-large: 16sp/pt -- Primary body text
|
|
668
|
+
body-medium: 14sp/pt -- Secondary body text
|
|
669
|
+
body-small: 12sp/pt -- Captions, helper text
|
|
670
|
+
label-large: 14sp/pt -- Button text, tab labels
|
|
671
|
+
label-medium: 12sp/pt -- Small labels, badges
|
|
672
|
+
label-small: 11sp/pt -- Micro labels, timestamps
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
This scale aligns with Material Design 3's type scale while also working within
|
|
676
|
+
Apple HIG's recommended sizing ranges.
|
|
677
|
+
|
|
678
|
+
**Line heights** should follow the 4dp sub-grid:
|
|
679
|
+
|
|
680
|
+
```
|
|
681
|
+
display-large: 40dp line-height (34 + ~6 leading)
|
|
682
|
+
headline-large: 32dp line-height (24 + 8 leading)
|
|
683
|
+
body-large: 24dp line-height (16 + 8 leading)
|
|
684
|
+
body-medium: 20dp line-height (14 + 6 leading)
|
|
685
|
+
body-small: 16dp line-height (12 + 4 leading)
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
**Font weight mapping:**
|
|
689
|
+
|
|
690
|
+
| Semantic Weight | Value | iOS (SF Pro) | Android (Roboto) |
|
|
691
|
+
|---|---|---|---|
|
|
692
|
+
| Regular | 400 | Regular | Regular |
|
|
693
|
+
| Medium | 500 | Medium | Medium |
|
|
694
|
+
| Semibold | 600 | Semibold | (use Medium or Bold) |
|
|
695
|
+
| Bold | 700 | Bold | Bold |
|
|
696
|
+
|
|
697
|
+
Note: Roboto does not have a native Semibold weight. If your type scale uses Semibold,
|
|
698
|
+
map it to Medium (500) on Android or use Roboto's variable font axis for precise
|
|
699
|
+
weight matching.
|
|
700
|
+
|
|
701
|
+
#### Accessibility: Dynamic Type and Font Scaling
|
|
702
|
+
|
|
703
|
+
Both platforms support user-controlled font scaling:
|
|
704
|
+
|
|
705
|
+
- **iOS Dynamic Type:** Seven accessibility sizes from xSmall to xxxLarge, plus five
|
|
706
|
+
additional Accessibility sizes. Apps using system fonts with `UIFontTextStyle`
|
|
707
|
+
get this automatically.
|
|
708
|
+
- **Android Font Scale:** System-wide font size multiplier (default 1.0, up to 2.0).
|
|
709
|
+
Apps using `sp` units scale automatically.
|
|
710
|
+
|
|
711
|
+
**Cross-platform rules:**
|
|
712
|
+
1. Always use scalable units (sp on Android, Dynamic Type on iOS).
|
|
713
|
+
2. Test at 200% font scale on both platforms.
|
|
714
|
+
3. Do not cap font scaling for body text (this is an accessibility violation).
|
|
715
|
+
4. Constrain scaling for decorative or display text only if it breaks layout.
|
|
716
|
+
5. Ensure containers expand vertically to accommodate larger text.
|
|
717
|
+
6. Test that scaled text does not overlap or get clipped.
|
|
718
|
+
|
|
719
|
+
---
|
|
720
|
+
|
|
721
|
+
## 5. Common Mistakes
|
|
722
|
+
|
|
723
|
+
### 5.1 Using iOS Design Language on Android (or Vice Versa)
|
|
724
|
+
|
|
725
|
+
**The mistake:** Shipping an iOS-designed app directly to Android (or the reverse)
|
|
726
|
+
without platform adaptation.
|
|
727
|
+
|
|
728
|
+
**How it manifests:**
|
|
729
|
+
- iOS-style segmented controls on Android (Android has tabs or chips)
|
|
730
|
+
- Cupertino-style date picker wheels on Android (Android uses calendar/clock dialogs)
|
|
731
|
+
- Material-style FAB on iOS (iOS does not use FABs as a primary pattern)
|
|
732
|
+
- Material-style navigation drawer on iOS (iOS uses bottom tabs)
|
|
733
|
+
- Back arrows with stems (Android style) appearing on iOS
|
|
734
|
+
- iOS-style alert dialogs with side-by-side buttons on Android
|
|
735
|
+
|
|
736
|
+
**Why it matters:** Users interact with dozens of apps daily. When your app uses the
|
|
737
|
+
wrong platform's conventions, it creates an uncanny valley effect. Users subconsciously
|
|
738
|
+
perceive the app as low-quality, untrustworthy, or difficult to use.
|
|
739
|
+
|
|
740
|
+
**Fix:** Audit every system-level interaction component against both Apple HIG and
|
|
741
|
+
Material Design 3 guidelines. Use platform-adaptive components provided by your
|
|
742
|
+
framework.
|
|
743
|
+
|
|
744
|
+
### 5.2 Ignoring Platform Conventions for "Consistency"
|
|
745
|
+
|
|
746
|
+
**The mistake:** Forcing pixel-identical UI on both platforms in the name of brand
|
|
747
|
+
consistency, overriding native behaviors.
|
|
748
|
+
|
|
749
|
+
**How it manifests:**
|
|
750
|
+
- Custom back button that ignores the system back gesture on Android
|
|
751
|
+
- Custom scroll behavior that does not bounce on iOS
|
|
752
|
+
- Custom text selection handles that do not match the platform
|
|
753
|
+
- Custom keyboard accessories that break native autofill
|
|
754
|
+
- Identical alert dialogs on both platforms using a custom component
|
|
755
|
+
- Same pull-to-refresh animation on both platforms
|
|
756
|
+
|
|
757
|
+
**Why it matters:** Functional consistency (same features, same flows) matters to
|
|
758
|
+
users. Visual consistency at the component level does not. Users do not compare your
|
|
759
|
+
iOS and Android apps side by side. They compare your Android app to every other Android
|
|
760
|
+
app on their phone.
|
|
761
|
+
|
|
762
|
+
**Fix:** Consistency should live at the brand level (colors, imagery, tone, IA) and
|
|
763
|
+
the feature level (same capabilities). Component-level rendering should follow
|
|
764
|
+
platform conventions.
|
|
765
|
+
|
|
766
|
+
### 5.3 Not Testing on Both Platforms
|
|
767
|
+
|
|
768
|
+
**The mistake:** Developing primarily on one platform (often iOS, because designers
|
|
769
|
+
tend to use Macs) and treating the other as an afterthought.
|
|
770
|
+
|
|
771
|
+
**How it manifests:**
|
|
772
|
+
- Text overflow issues on Android where screen widths are smaller (320dp)
|
|
773
|
+
- Navigation bugs when using the Android system back button
|
|
774
|
+
- Status bar content invisible against colored backgrounds on one platform
|
|
775
|
+
- Safe area issues on devices with different notch shapes
|
|
776
|
+
- Font rendering differences causing layout shifts
|
|
777
|
+
- Keyboard behavior differences causing input fields to be obscured
|
|
778
|
+
|
|
779
|
+
**Testing requirements:**
|
|
780
|
+
- Test on at least one iOS device and one Android device (physical devices preferred)
|
|
781
|
+
- Test on the smallest supported screen width (320dp Android, 375pt iOS)
|
|
782
|
+
- Test on the largest screen (tablet if supported)
|
|
783
|
+
- Test with font scaling at maximum (200%)
|
|
784
|
+
- Test with system dark mode on both platforms
|
|
785
|
+
- Test with screen reader (VoiceOver on iOS, TalkBack on Android)
|
|
786
|
+
- Test with right-to-left (RTL) language if your app supports localization
|
|
787
|
+
|
|
788
|
+
### 5.4 Performance-Impacting Design Choices
|
|
789
|
+
|
|
790
|
+
**The mistake:** Designing visual effects that are expensive to render in cross-platform
|
|
791
|
+
frameworks, particularly on lower-end Android devices.
|
|
792
|
+
|
|
793
|
+
**Specific anti-patterns:**
|
|
794
|
+
|
|
795
|
+
| Design Choice | Performance Impact | Alternative |
|
|
796
|
+
|---|---|---|
|
|
797
|
+
| Heavy box shadows with large blur radius | Forces CPU-based compositing | Use `elevation` on Android, subtle shadows on iOS |
|
|
798
|
+
| Gaussian blur backgrounds | Expensive real-time computation | Use solid color with opacity, or pre-rendered blurred images |
|
|
799
|
+
| Complex gradient animations | Continuous GPU draw calls | Use static gradients, animate opacity instead |
|
|
800
|
+
| Multiple overlapping transparent layers | Overdraw multiplies rendering cost | Flatten visual hierarchy, reduce layer count |
|
|
801
|
+
| Large unoptimized images in lists | Memory pressure, janky scrolling | Resize images server-side, use progressive loading |
|
|
802
|
+
| Animated SVGs during scroll | Competes with scroll rendering | Pause animations during scroll, use raster for complex graphics |
|
|
803
|
+
| Excessive use of `ClipRRect` (Flutter) | Forces saveLayer, expensive | Use `decoration` with `borderRadius` instead |
|
|
804
|
+
|
|
805
|
+
**Performance budgets:**
|
|
806
|
+
- Target 60 FPS (16.67ms per frame) on both platforms
|
|
807
|
+
- On Flutter: Use Impeller rendering engine (default on iOS, available on Android)
|
|
808
|
+
for hardware-accelerated shaders and consistent frame pacing
|
|
809
|
+
- On React Native: Use the New Architecture (Fabric renderer + TurboModules) for
|
|
810
|
+
reduced bridge overhead on animations
|
|
811
|
+
- Test on mid-range Android devices (not just flagship phones). A design that runs
|
|
812
|
+
smoothly on a Pixel 8 may stutter on a budget device with 3GB RAM
|
|
813
|
+
|
|
814
|
+
### 5.5 Ignoring Design Tokens for Cross-Platform Consistency
|
|
815
|
+
|
|
816
|
+
**The mistake:** Defining colors, spacing, and typography values directly in platform
|
|
817
|
+
code without a shared design token system.
|
|
818
|
+
|
|
819
|
+
**How it manifests:**
|
|
820
|
+
- "Slightly different shades of blue" on iOS and Android
|
|
821
|
+
- Inconsistent padding and margins between platforms
|
|
822
|
+
- Typography weights that do not match across platforms
|
|
823
|
+
- Dark mode colors defined independently and diverging over time
|
|
824
|
+
|
|
825
|
+
**Fix:** Use a design token system. The W3C Design Tokens specification reached v1.0
|
|
826
|
+
stability in October 2025. Tools like Tokens Studio (Figma plugin) and Style Dictionary
|
|
827
|
+
can export tokens to Swift, Kotlin, Dart, and JavaScript from a single source of truth.
|
|
828
|
+
|
|
829
|
+
Token structure example:
|
|
830
|
+
```json
|
|
831
|
+
{
|
|
832
|
+
"color": {
|
|
833
|
+
"primary": { "$value": "#1a73e8", "$type": "color" },
|
|
834
|
+
"surface": { "$value": "#ffffff", "$type": "color" },
|
|
835
|
+
"on-surface": { "$value": "#1c1b1f", "$type": "color" }
|
|
836
|
+
},
|
|
837
|
+
"spacing": {
|
|
838
|
+
"sm": { "$value": "8", "$type": "dimension" },
|
|
839
|
+
"md": { "$value": "16", "$type": "dimension" },
|
|
840
|
+
"lg": { "$value": "24", "$type": "dimension" }
|
|
841
|
+
},
|
|
842
|
+
"typography": {
|
|
843
|
+
"body": {
|
|
844
|
+
"fontSize": { "$value": "16", "$type": "dimension" },
|
|
845
|
+
"lineHeight": { "$value": "24", "$type": "dimension" },
|
|
846
|
+
"fontWeight": { "$value": "400", "$type": "number" }
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
### 5.6 Neglecting Platform-Specific Accessibility
|
|
853
|
+
|
|
854
|
+
**The mistake:** Implementing accessibility generically without accounting for
|
|
855
|
+
platform-specific assistive technology behaviors.
|
|
856
|
+
|
|
857
|
+
**How it manifests:**
|
|
858
|
+
- Semantic labels that work with VoiceOver but not TalkBack (or vice versa)
|
|
859
|
+
- Custom components missing `accessibilityRole` mappings per platform
|
|
860
|
+
- Ignoring iOS `accessibilityTraits` or Android `contentDescription` conventions
|
|
861
|
+
- Not testing with platform-specific switch control or voice control
|
|
862
|
+
|
|
863
|
+
**Fix:** Test with the native screen reader on each platform. Use the framework's
|
|
864
|
+
accessibility APIs that map to native accessibility trees.
|
|
865
|
+
|
|
866
|
+
---
|
|
867
|
+
|
|
868
|
+
## 6. Checklist
|
|
869
|
+
|
|
870
|
+
### Cross-Platform Design Verification Checklist
|
|
871
|
+
|
|
872
|
+
Use this checklist before shipping any cross-platform mobile release. Every item should
|
|
873
|
+
be verified on both iOS and Android.
|
|
874
|
+
|
|
875
|
+
#### Platform Fidelity
|
|
876
|
+
|
|
877
|
+
- [ ] **Navigation pattern matches platform convention.** iOS uses bottom tab bar
|
|
878
|
+
with Cupertino styling. Android uses Material NavigationBar or navigation rail.
|
|
879
|
+
- [ ] **Back navigation works natively.** iOS supports edge-swipe back. Android
|
|
880
|
+
supports system back gesture with predictive back animation.
|
|
881
|
+
- [ ] **Alerts and dialogs use native components.** iOS shows Cupertino alerts.
|
|
882
|
+
Android shows Material dialogs. No custom alert UI for system-level interactions.
|
|
883
|
+
- [ ] **Date and time pickers use native components.** iOS shows wheel/compact picker.
|
|
884
|
+
Android shows Material calendar/clock dialog.
|
|
885
|
+
- [ ] **Share sheet invokes the native OS share UI** on both platforms.
|
|
886
|
+
- [ ] **Tap feedback matches platform.** iOS uses opacity change. Android uses
|
|
887
|
+
Material ripple effect.
|
|
888
|
+
- [ ] **Scroll physics match platform.** iOS bounces at boundaries. Android shows
|
|
889
|
+
edge glow or stretch overscroll.
|
|
890
|
+
|
|
891
|
+
#### Layout and Responsiveness
|
|
892
|
+
|
|
893
|
+
- [ ] **Tested at minimum screen width.** 320dp on Android, 375pt on iOS. No text
|
|
894
|
+
overflow, no clipped components, no horizontal scroll on single-column layouts.
|
|
895
|
+
- [ ] **Safe areas handled correctly.** Content does not render behind notches,
|
|
896
|
+
Dynamic Island, home indicators, or system bars. Tested in both portrait and
|
|
897
|
+
landscape orientations.
|
|
898
|
+
- [ ] **Keyboard behavior verified.** Input fields are not obscured by the keyboard
|
|
899
|
+
on either platform. Scroll-to-field behavior works. Return key is configured
|
|
900
|
+
correctly.
|
|
901
|
+
|
|
902
|
+
#### Typography and Accessibility
|
|
903
|
+
|
|
904
|
+
- [ ] **Font scaling tested at 200%.** Body text scales correctly. Containers expand
|
|
905
|
+
to accommodate larger text. No text truncation on critical information.
|
|
906
|
+
- [ ] **Screen reader audit completed.** All interactive elements have meaningful labels.
|
|
907
|
+
Tested with VoiceOver (iOS) and TalkBack (Android). Reading order is logical.
|
|
908
|
+
- [ ] **Touch targets meet minimum size.** At least 44pt on iOS, 48dp on Android.
|
|
909
|
+
At least 8dp spacing between adjacent targets.
|
|
910
|
+
- [ ] **Color contrast meets WCAG AA.** 4.5:1 for body text, 3:1 for large text,
|
|
911
|
+
on both light and dark themes.
|
|
912
|
+
|
|
913
|
+
#### Visual Consistency and Brand
|
|
914
|
+
|
|
915
|
+
- [ ] **Brand colors, imagery, and iconography are consistent** across platforms.
|
|
916
|
+
Verified against design tokens or shared style guide.
|
|
917
|
+
- [ ] **Dark mode implemented and tested** on both platforms. System dark mode
|
|
918
|
+
toggle is respected. All screens verified in both themes.
|
|
919
|
+
- [ ] **Design tokens are the single source of truth.** Colors, spacing, and typography
|
|
920
|
+
are not hardcoded per-platform. A shared token system generates platform values.
|
|
921
|
+
|
|
922
|
+
#### Performance
|
|
923
|
+
|
|
924
|
+
- [ ] **60 FPS maintained during scrolling and animations** on mid-range Android device
|
|
925
|
+
(not just flagship hardware). Flutter DevTools or React Native Performance Monitor
|
|
926
|
+
used to verify.
|
|
927
|
+
- [ ] **No excessive overdraw or GPU saturation** from layered transparent elements,
|
|
928
|
+
blur effects, or complex shadows on mid-range devices.
|
|
929
|
+
- [ ] **Images are appropriately sized and cached.** List views with images scroll
|
|
930
|
+
smoothly without memory spikes.
|
|
931
|
+
|
|
932
|
+
#### Testing Coverage
|
|
933
|
+
|
|
934
|
+
- [ ] **Tested on physical devices** -- at least one iOS device and one Android device.
|
|
935
|
+
Emulators/simulators alone are insufficient for gesture, haptic, and performance
|
|
936
|
+
verification.
|
|
937
|
+
- [ ] **Tested with RTL language** (if localization is supported). Layout mirrors
|
|
938
|
+
correctly. Text alignment and icon direction are appropriate.
|
|
939
|
+
|
|
940
|
+
---
|
|
941
|
+
|
|
942
|
+
## References
|
|
943
|
+
|
|
944
|
+
### Official Platform Guidelines
|
|
945
|
+
|
|
946
|
+
- **Apple Human Interface Guidelines:** https://developer.apple.com/design/human-interface-guidelines/
|
|
947
|
+
- **Material Design 3:** https://m3.material.io/
|
|
948
|
+
- **Apple Liquid Glass (iOS 26):** https://developer.apple.com/design/new-design-gallery/
|
|
949
|
+
|
|
950
|
+
### Framework Documentation
|
|
951
|
+
|
|
952
|
+
- **Flutter Platform Adaptations:** https://docs.flutter.dev/ui/adaptive-responsive/platform-adaptations
|
|
953
|
+
- **Flutter Adaptive Best Practices:** https://docs.flutter.dev/ui/adaptive-responsive/best-practices
|
|
954
|
+
- **Flutter Cupertino Widgets:** https://docs.flutter.dev/ui/widgets/cupertino
|
|
955
|
+
- **React Native Platform-Specific Code:** https://reactnative.dev/docs/platform-specific-code
|
|
956
|
+
- **Android Predictive Back:** https://developer.android.com/design/ui/mobile/guides/patterns/predictive-back
|
|
957
|
+
- **Android Predictive Back Implementation:** https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture
|
|
958
|
+
- **Flutter Predictive Back Integration:** https://docs.flutter.dev/platform-integration/android/predictive-back
|
|
959
|
+
|
|
960
|
+
### Layout and Navigation
|
|
961
|
+
|
|
962
|
+
- **Material Design 3 Layout Spacing:** https://m3.material.io/foundations/layout/understanding-layout/spacing
|
|
963
|
+
- **React Navigation Safe Areas:** https://reactnavigation.org/docs/handling-safe-area/
|
|
964
|
+
- **Expo Safe Areas:** https://docs.expo.dev/develop/user-interface/safe-areas/
|
|
965
|
+
- **NNGroup Mobile Navigation Patterns:** https://www.nngroup.com/articles/mobile-navigation-patterns/
|
|
966
|
+
|
|
967
|
+
### Design Tokens
|
|
968
|
+
|
|
969
|
+
- **W3C Design Tokens Specification:** https://www.w3.org/community/design-tokens/
|
|
970
|
+
- **Tokens Studio:** https://tokens.studio/
|
|
971
|
+
|
|
972
|
+
### Typography
|
|
973
|
+
|
|
974
|
+
- **Material Design Typography:** https://m1.material.io/style/typography.html
|
|
975
|
+
- **8-Point Grid System:** https://spec.fm/specifics/8-pt-grid
|
|
976
|
+
- **Inter Font Family:** https://rsms.me/inter/
|
|
977
|
+
|
|
978
|
+
### Cross-Platform Analysis
|
|
979
|
+
|
|
980
|
+
- **Toptal: Avoiding Bad Practices in iOS and Android Design:** https://www.toptal.com/developers/android/android-and-ios-app-design-tips
|
|
981
|
+
- **UXPin: Cross-Platform Experience Guide:** https://www.uxpin.com/studio/blog/cross-platform-experience/
|
|
982
|
+
- **InfoQ: iOS and Android Design Guidelines for React Native:** https://www.infoq.com/articles/ios-android-react-native-design-patterns/
|
|
983
|
+
- **iTitans: Design Tokens for Cross-Platform Consistency:** https://ititans.com/blog/cross-platform-mobile-ui-with-design-tokens/
|