buildanything 1.7.1 → 2.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/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +9 -3
- package/CHANGELOG.md +112 -0
- package/README.md +2 -2
- package/agents/a11y-architect.md +166 -0
- package/agents/business-model.md +80 -29
- package/agents/code-architect.md +75 -0
- package/agents/code-reviewer.md +255 -0
- package/agents/code-simplifier.md +64 -0
- package/agents/design-brand-guardian.md +293 -53
- package/agents/design-critic.md +139 -0
- package/agents/design-inclusive-visuals-specialist.md +6 -19
- package/agents/design-ui-designer.md +335 -56
- package/agents/design-ux-architect.md +403 -55
- package/agents/design-ux-researcher.md +264 -49
- package/agents/engineering-ai-engineer.md +26 -36
- package/agents/engineering-backend-architect.md +185 -36
- package/agents/engineering-data-engineer.md +225 -43
- package/agents/engineering-devops-automator.md +227 -74
- package/agents/engineering-frontend-developer.md +210 -34
- package/agents/engineering-mobile-app-builder.md +6 -1
- package/agents/engineering-rapid-prototyper.md +30 -9
- package/agents/engineering-security-engineer.md +263 -61
- package/agents/engineering-senior-developer.md +128 -19
- package/agents/engineering-sre.md +84 -0
- package/agents/engineering-technical-writer.md +285 -41
- package/agents/feature-intel.md +110 -0
- package/agents/ios-app-review-guardian.md +66 -0
- package/agents/ios-foundation-models-specialist.md +64 -0
- package/agents/ios-storekit-specialist.md +59 -0
- package/agents/ios-swift-architect.md +129 -0
- package/agents/ios-swift-search.md +137 -0
- package/agents/ios-swift-ui-design.md +136 -0
- package/agents/marketing-app-store-optimizer.md +246 -64
- package/agents/planner.md +216 -0
- package/agents/pr-test-analyzer.md +63 -0
- package/agents/product-feedback-synthesizer.md +8 -2
- package/agents/refactor-cleaner.md +102 -0
- package/agents/security-reviewer.md +128 -0
- package/agents/silent-failure-hunter.md +54 -0
- package/agents/swift-build-resolver.md +119 -0
- package/agents/swift-reviewer.md +112 -0
- package/agents/tech-feasibility.md +21 -1
- package/agents/testing-api-tester.md +236 -59
- package/agents/testing-evidence-collector.md +26 -1
- package/agents/testing-performance-benchmarker.md +21 -1
- package/agents/testing-reality-checker.md +6 -1
- package/agents/visual-research.md +116 -0
- package/bin/adapters/cycle-counter-tool.ts +155 -0
- package/bin/adapters/scribe-tool.ts +71 -0
- package/bin/adapters/state-save-tool.ts +130 -0
- package/bin/adapters/write-lease-tool.ts +127 -0
- package/bin/buildanything-runtime.js +15 -0
- package/bin/buildanything-runtime.ts +328 -0
- package/bin/setup.js +83 -8
- package/commands/add-feature.md +2 -0
- package/commands/build.md +752 -332
- package/commands/fix.md +65 -0
- package/commands/self-check.md +121 -0
- package/commands/setup.md +114 -0
- package/commands/ux-review.md +63 -0
- package/commands/verify.md +69 -0
- package/docs/migration/agents.yaml +729 -0
- package/docs/migration/phase-graph.yaml +1088 -0
- package/docs/migration/sdk-host-compat.md +18 -0
- package/hooks/compile-writer-owner-cache.ts +171 -0
- package/hooks/hooks.json +36 -0
- package/hooks/pre-tool-use +19 -0
- package/hooks/pre-tool-use.ts +776 -0
- package/hooks/record-mode-transitions.ts +178 -0
- package/hooks/session-start +89 -2
- package/hooks/subagent-start +17 -0
- package/hooks/subagent-start.ts +471 -0
- package/hooks/subagent-stop +17 -0
- package/hooks/subagent-stop.ts +153 -0
- package/package.json +28 -5
- package/protocols/architecture-schema.md +171 -0
- package/protocols/build-fix.md +52 -0
- package/protocols/cleanup.md +54 -0
- package/protocols/decision-log.md +131 -0
- package/protocols/eval-harness.md +61 -0
- package/protocols/fake-data-detector.md +64 -0
- package/protocols/ios-context.md +234 -0
- package/protocols/ios-frameworks-map.md +323 -0
- package/protocols/ios-phase-branches.md +337 -0
- package/protocols/ios-preflight.md +27 -0
- package/protocols/launch-readiness.md +258 -0
- package/protocols/metric-loop.md +153 -0
- package/protocols/smoke-test.md +118 -0
- package/protocols/state-schema.json +388 -0
- package/protocols/state-schema.md +172 -0
- package/protocols/verify.md +127 -0
- package/protocols/visual-dna.md +185 -0
- package/protocols/web-phase-branches.md +351 -0
- package/skills/ios/_VENDORED.md +62 -0
- package/skills/ios/activitykit/LICENSE +131 -0
- package/skills/ios/activitykit/SKILL.md +505 -0
- package/skills/ios/activitykit/references/activitykit-patterns.md +868 -0
- package/skills/ios/app-intents/LICENSE +131 -0
- package/skills/ios/app-intents/SKILL.md +494 -0
- package/skills/ios/app-intents/references/appintents-advanced.md +1076 -0
- package/skills/ios/app-store-connect-metadata/SKILL.md +148 -0
- package/skills/ios/apple-on-device-ai/LICENSE +131 -0
- package/skills/ios/apple-on-device-ai/SKILL.md +505 -0
- package/skills/ios/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/skills/ios/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/skills/ios/apple-on-device-ai/references/foundation-models.md +508 -0
- package/skills/ios/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/skills/ios/asc-privacy-manifest/SKILL.md +350 -0
- package/skills/ios/hig-components-content/SKILL.md +86 -0
- package/skills/ios/hig-components-content/references/activity-views.md +79 -0
- package/skills/ios/hig-components-content/references/charts.md +180 -0
- package/skills/ios/hig-components-content/references/collections.md +48 -0
- package/skills/ios/hig-components-content/references/color-wells.md +42 -0
- package/skills/ios/hig-components-content/references/image-views.md +82 -0
- package/skills/ios/hig-components-content/references/image-wells.md +34 -0
- package/skills/ios/hig-components-content/references/lockups.md +78 -0
- package/skills/ios/hig-components-content/references/web-views.md +36 -0
- package/skills/ios/hig-components-controls/SKILL.md +88 -0
- package/skills/ios/hig-components-controls/references/combo-boxes.md +40 -0
- package/skills/ios/hig-components-controls/references/controls.md +112 -0
- package/skills/ios/hig-components-controls/references/gauges.md +74 -0
- package/skills/ios/hig-components-controls/references/labels.md +92 -0
- package/skills/ios/hig-components-controls/references/pickers.md +128 -0
- package/skills/ios/hig-components-controls/references/rating-indicators.md +38 -0
- package/skills/ios/hig-components-controls/references/segmented-controls.md +94 -0
- package/skills/ios/hig-components-controls/references/sliders.md +92 -0
- package/skills/ios/hig-components-controls/references/steppers.md +40 -0
- package/skills/ios/hig-components-controls/references/text-fields.md +88 -0
- package/skills/ios/hig-components-controls/references/text-views.md +56 -0
- package/skills/ios/hig-components-controls/references/toggles.md +127 -0
- package/skills/ios/hig-components-controls/references/token-fields.md +48 -0
- package/skills/ios/hig-components-controls/references/virtual-keyboards.md +156 -0
- package/skills/ios/hig-components-dialogs/SKILL.md +76 -0
- package/skills/ios/hig-components-dialogs/references/action-sheets.md +74 -0
- package/skills/ios/hig-components-dialogs/references/alerts.md +158 -0
- package/skills/ios/hig-components-dialogs/references/digit-entry-views.md +32 -0
- package/skills/ios/hig-components-dialogs/references/popovers.md +81 -0
- package/skills/ios/hig-components-dialogs/references/sheets.md +157 -0
- package/skills/ios/hig-components-layout/SKILL.md +99 -0
- package/skills/ios/hig-components-layout/references/boxes.md +48 -0
- package/skills/ios/hig-components-layout/references/column-views.md +44 -0
- package/skills/ios/hig-components-layout/references/lists-and-tables.md +99 -0
- package/skills/ios/hig-components-layout/references/ornaments.md +56 -0
- package/skills/ios/hig-components-layout/references/outline-views.md +64 -0
- package/skills/ios/hig-components-layout/references/panels.md +75 -0
- package/skills/ios/hig-components-layout/references/scroll-views.md +123 -0
- package/skills/ios/hig-components-layout/references/sidebars.md +109 -0
- package/skills/ios/hig-components-layout/references/split-views.md +110 -0
- package/skills/ios/hig-components-layout/references/tab-bars.md +173 -0
- package/skills/ios/hig-components-layout/references/tab-views.md +68 -0
- package/skills/ios/hig-components-layout/references/windows.md +188 -0
- package/skills/ios/hig-components-menus/SKILL.md +81 -0
- package/skills/ios/hig-components-menus/references/action-button.md +61 -0
- package/skills/ios/hig-components-menus/references/buttons.md +261 -0
- package/skills/ios/hig-components-menus/references/context-menus.md +105 -0
- package/skills/ios/hig-components-menus/references/disclosure-controls.md +84 -0
- package/skills/ios/hig-components-menus/references/dock-menus.md +40 -0
- package/skills/ios/hig-components-menus/references/edit-menus.md +88 -0
- package/skills/ios/hig-components-menus/references/menus.md +171 -0
- package/skills/ios/hig-components-menus/references/pop-up-buttons.md +70 -0
- package/skills/ios/hig-components-menus/references/pull-down-buttons.md +77 -0
- package/skills/ios/hig-components-menus/references/the-menu-bar.md +303 -0
- package/skills/ios/hig-components-menus/references/toolbars.md +256 -0
- package/skills/ios/hig-components-search/SKILL.md +68 -0
- package/skills/ios/hig-components-search/references/page-controls.md +120 -0
- package/skills/ios/hig-components-search/references/path-controls.md +40 -0
- package/skills/ios/hig-components-search/references/search-fields.md +189 -0
- package/skills/ios/hig-components-status/SKILL.md +80 -0
- package/skills/ios/hig-components-status/references/activity-rings.md +105 -0
- package/skills/ios/hig-components-status/references/progress-indicators.md +116 -0
- package/skills/ios/hig-components-status/references/status-bars.md +38 -0
- package/skills/ios/hig-components-system/SKILL.md +88 -0
- package/skills/ios/hig-components-system/references/app-clips.md +387 -0
- package/skills/ios/hig-components-system/references/app-shortcuts.md +114 -0
- package/skills/ios/hig-components-system/references/complications.md +425 -0
- package/skills/ios/hig-components-system/references/home-screen-quick-actions.md +42 -0
- package/skills/ios/hig-components-system/references/live-activities.md +442 -0
- package/skills/ios/hig-components-system/references/notifications.md +153 -0
- package/skills/ios/hig-components-system/references/top-shelf.md +135 -0
- package/skills/ios/hig-components-system/references/watch-faces.md +40 -0
- package/skills/ios/hig-components-system/references/widgets.md +517 -0
- package/skills/ios/hig-foundations/SKILL.md +98 -0
- package/skills/ios/hig-foundations/references/accessibility.md +291 -0
- package/skills/ios/hig-foundations/references/app-icons.md +210 -0
- package/skills/ios/hig-foundations/references/branding.md +44 -0
- package/skills/ios/hig-foundations/references/color.md +274 -0
- package/skills/ios/hig-foundations/references/dark-mode.md +116 -0
- package/skills/ios/hig-foundations/references/icons.md +263 -0
- package/skills/ios/hig-foundations/references/images.md +176 -0
- package/skills/ios/hig-foundations/references/immersive-experiences.md +174 -0
- package/skills/ios/hig-foundations/references/inclusion.md +189 -0
- package/skills/ios/hig-foundations/references/layout.md +425 -0
- package/skills/ios/hig-foundations/references/materials.md +238 -0
- package/skills/ios/hig-foundations/references/motion.md +103 -0
- package/skills/ios/hig-foundations/references/privacy.md +231 -0
- package/skills/ios/hig-foundations/references/right-to-left.md +206 -0
- package/skills/ios/hig-foundations/references/sf-symbols.md +310 -0
- package/skills/ios/hig-foundations/references/spatial-layout.md +142 -0
- package/skills/ios/hig-foundations/references/typography.md +1146 -0
- package/skills/ios/hig-foundations/references/writing.md +91 -0
- package/skills/ios/hig-inputs/SKILL.md +94 -0
- package/skills/ios/hig-inputs/references/apple-pencil-and-scribble.md +148 -0
- package/skills/ios/hig-inputs/references/camera-control.md +107 -0
- package/skills/ios/hig-inputs/references/digital-crown.md +83 -0
- package/skills/ios/hig-inputs/references/eyes.md +120 -0
- package/skills/ios/hig-inputs/references/focus-and-selection.md +120 -0
- package/skills/ios/hig-inputs/references/game-controls.md +156 -0
- package/skills/ios/hig-inputs/references/gestures.md +208 -0
- package/skills/ios/hig-inputs/references/gyro-and-accelerometer.md +40 -0
- package/skills/ios/hig-inputs/references/keyboards.md +234 -0
- package/skills/ios/hig-inputs/references/nearby-interactions.md +70 -0
- package/skills/ios/hig-inputs/references/pointing-devices.md +237 -0
- package/skills/ios/hig-inputs/references/remotes.md +67 -0
- package/skills/ios/hig-inputs/references/spatial-interactions.md +70 -0
- package/skills/ios/hig-patterns/SKILL.md +104 -0
- package/skills/ios/hig-patterns/references/charting-data.md +81 -0
- package/skills/ios/hig-patterns/references/collaboration-and-sharing.md +86 -0
- package/skills/ios/hig-patterns/references/drag-and-drop.md +134 -0
- package/skills/ios/hig-patterns/references/entering-data.md +69 -0
- package/skills/ios/hig-patterns/references/feedback.md +67 -0
- package/skills/ios/hig-patterns/references/file-management.md +135 -0
- package/skills/ios/hig-patterns/references/going-full-screen.md +79 -0
- package/skills/ios/hig-patterns/references/launching.md +81 -0
- package/skills/ios/hig-patterns/references/live-viewing-apps.md +79 -0
- package/skills/ios/hig-patterns/references/loading.md +59 -0
- package/skills/ios/hig-patterns/references/managing-accounts.md +107 -0
- package/skills/ios/hig-patterns/references/managing-notifications.md +99 -0
- package/skills/ios/hig-patterns/references/modality.md +82 -0
- package/skills/ios/hig-patterns/references/multitasking.md +131 -0
- package/skills/ios/hig-patterns/references/offering-help.md +117 -0
- package/skills/ios/hig-patterns/references/onboarding.md +69 -0
- package/skills/ios/hig-patterns/references/playing-audio.md +124 -0
- package/skills/ios/hig-patterns/references/playing-haptics.md +280 -0
- package/skills/ios/hig-patterns/references/playing-video.md +180 -0
- package/skills/ios/hig-patterns/references/printing.md +50 -0
- package/skills/ios/hig-patterns/references/ratings-and-reviews.md +48 -0
- package/skills/ios/hig-patterns/references/searching.md +70 -0
- package/skills/ios/hig-patterns/references/settings.md +84 -0
- package/skills/ios/hig-patterns/references/undo-and-redo.md +58 -0
- package/skills/ios/hig-patterns/references/workouts.md +76 -0
- package/skills/ios/hig-platforms/SKILL.md +84 -0
- package/skills/ios/hig-platforms/references/designing-for-games.md +159 -0
- package/skills/ios/hig-platforms/references/designing-for-ios.md +66 -0
- package/skills/ios/hig-platforms/references/designing-for-ipados.md +64 -0
- package/skills/ios/hig-platforms/references/designing-for-macos.md +70 -0
- package/skills/ios/hig-platforms/references/designing-for-tvos.md +68 -0
- package/skills/ios/hig-platforms/references/designing-for-visionos.md +85 -0
- package/skills/ios/hig-platforms/references/designing-for-watchos.md +74 -0
- package/skills/ios/hig-project-context/SKILL.md +133 -0
- package/skills/ios/hig-technologies/SKILL.md +107 -0
- package/skills/ios/hig-technologies/references/airplay.md +125 -0
- package/skills/ios/hig-technologies/references/always-on.md +62 -0
- package/skills/ios/hig-technologies/references/apple-pay.md +441 -0
- package/skills/ios/hig-technologies/references/augmented-reality.md +247 -0
- package/skills/ios/hig-technologies/references/carekit.md +224 -0
- package/skills/ios/hig-technologies/references/carplay.md +119 -0
- package/skills/ios/hig-technologies/references/game-center.md +343 -0
- package/skills/ios/hig-technologies/references/generative-ai.md +110 -0
- package/skills/ios/hig-technologies/references/healthkit.md +120 -0
- package/skills/ios/hig-technologies/references/homekit.md +343 -0
- package/skills/ios/hig-technologies/references/icloud.md +52 -0
- package/skills/ios/hig-technologies/references/id-verifier.md +73 -0
- package/skills/ios/hig-technologies/references/imessage-apps-and-stickers.md +105 -0
- package/skills/ios/hig-technologies/references/in-app-purchase.md +263 -0
- package/skills/ios/hig-technologies/references/live-photos.md +54 -0
- package/skills/ios/hig-technologies/references/mac-catalyst.md +216 -0
- package/skills/ios/hig-technologies/references/machine-learning.md +394 -0
- package/skills/ios/hig-technologies/references/maps.md +221 -0
- package/skills/ios/hig-technologies/references/nfc.md +51 -0
- package/skills/ios/hig-technologies/references/photo-editing.md +40 -0
- package/skills/ios/hig-technologies/references/researchkit.md +134 -0
- package/skills/ios/hig-technologies/references/shareplay.md +142 -0
- package/skills/ios/hig-technologies/references/shazamkit.md +47 -0
- package/skills/ios/hig-technologies/references/sign-in-with-apple.md +288 -0
- package/skills/ios/hig-technologies/references/siri.md +523 -0
- package/skills/ios/hig-technologies/references/tap-to-pay-on-iphone.md +208 -0
- package/skills/ios/hig-technologies/references/voiceover.md +90 -0
- package/skills/ios/hig-technologies/references/wallet.md +420 -0
- package/skills/ios/ios-26-platform/SKILL.md +53 -0
- package/skills/ios/ios-26-platform/references/automatic-adoption.md +161 -0
- package/skills/ios/ios-26-platform/references/backward-compat.md +238 -0
- package/skills/ios/ios-26-platform/references/liquid-glass.md +255 -0
- package/skills/ios/ios-26-platform/references/swiftui-apis.md +277 -0
- package/skills/ios/ios-26-platform/references/toolbar-navigation.md +250 -0
- package/skills/ios/ios-bootstrap/SKILL.md +107 -0
- package/skills/ios/ios-bootstrap/references/apple-docs-mcp-config.md +28 -0
- package/skills/ios/ios-bootstrap/references/new-project-dialog.md +41 -0
- package/skills/ios/ios-bootstrap/references/xcode-mcp-config.md +29 -0
- package/skills/ios/ios-debugger-agent/LICENSE +21 -0
- package/skills/ios/ios-debugger-agent/SKILL.md +58 -0
- package/skills/ios/ios-debugger-agent/agents/openai.yaml +4 -0
- package/skills/ios/ios-entitlements-generator/SKILL.md +47 -0
- package/skills/ios/ios-info-plist-hardening/SKILL.md +130 -0
- package/skills/ios/ios-maestro-flow-author/SKILL.md +68 -0
- package/skills/ios/ios-maestro-flow-author/references/input-and-scroll.yaml +17 -0
- package/skills/ios/ios-maestro-flow-author/references/modal-and-dismiss.yaml +14 -0
- package/skills/ios/ios-maestro-flow-author/references/onboarding-flow.yaml +16 -0
- package/skills/ios/ios-maestro-flow-author/references/tab-navigation.yaml +13 -0
- package/skills/ios/ios-maestro-flow-author/references/tap-and-assert.yaml +9 -0
- package/skills/ios/swift-accessibility/LICENSE +21 -0
- package/skills/ios/swift-accessibility/SKILL.md +371 -0
- package/skills/ios/swift-accessibility/examples/before-after-appkit.md +446 -0
- package/skills/ios/swift-accessibility/examples/before-after-swiftui.md +441 -0
- package/skills/ios/swift-accessibility/examples/before-after-uikit.md +464 -0
- package/skills/ios/swift-accessibility/references/assistive-access.md +441 -0
- package/skills/ios/swift-accessibility/references/display-settings.md +491 -0
- package/skills/ios/swift-accessibility/references/dynamic-type.md +420 -0
- package/skills/ios/swift-accessibility/references/media-accessibility.md +421 -0
- package/skills/ios/swift-accessibility/references/motor-input.md +393 -0
- package/skills/ios/swift-accessibility/references/nutrition-labels.md +362 -0
- package/skills/ios/swift-accessibility/references/platform-specifics.md +515 -0
- package/skills/ios/swift-accessibility/references/semantic-structure.md +585 -0
- package/skills/ios/swift-accessibility/references/testing-auditing.md +507 -0
- package/skills/ios/swift-accessibility/references/voice-control.md +317 -0
- package/skills/ios/swift-accessibility/references/voiceover-swiftui.md +584 -0
- package/skills/ios/swift-accessibility/references/voiceover-uikit.md +519 -0
- package/skills/ios/swift-accessibility/references/wcag-mapping.md +167 -0
- package/skills/ios/swift-accessibility/resources/audit-template.swift +128 -0
- package/skills/ios/swift-accessibility/resources/qa-checklist.md +258 -0
- package/skills/ios/swift-actor-persistence/SKILL.md +143 -0
- package/skills/ios/swift-concurrency/LICENSE +21 -0
- package/skills/ios/swift-concurrency/SKILL.md +171 -0
- package/skills/ios/swift-concurrency/references/_index.md +50 -0
- package/skills/ios/swift-concurrency/references/actors.md +660 -0
- package/skills/ios/swift-concurrency/references/async-algorithms.md +847 -0
- package/skills/ios/swift-concurrency/references/async-await-basics.md +266 -0
- package/skills/ios/swift-concurrency/references/async-sequences.md +710 -0
- package/skills/ios/swift-concurrency/references/core-data.md +560 -0
- package/skills/ios/swift-concurrency/references/glossary.md +135 -0
- package/skills/ios/swift-concurrency/references/linting.md +155 -0
- package/skills/ios/swift-concurrency/references/memory-management.md +569 -0
- package/skills/ios/swift-concurrency/references/migration.md +1104 -0
- package/skills/ios/swift-concurrency/references/performance.md +593 -0
- package/skills/ios/swift-concurrency/references/sendable.md +598 -0
- package/skills/ios/swift-concurrency/references/tasks.md +636 -0
- package/skills/ios/swift-concurrency/references/testing.md +592 -0
- package/skills/ios/swift-concurrency/references/threading.md +495 -0
- package/skills/ios/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/ios/swift-protocol-di-testing/SKILL.md +190 -0
- package/skills/ios/swift-security-expert/LICENSE +21 -0
- package/skills/ios/swift-security-expert/SKILL.md +470 -0
- package/skills/ios/swift-security-expert/references/biometric-authentication.md +565 -0
- package/skills/ios/swift-security-expert/references/certificate-trust.md +592 -0
- package/skills/ios/swift-security-expert/references/common-anti-patterns.md +690 -0
- package/skills/ios/swift-security-expert/references/compliance-owasp-mapping.md +537 -0
- package/skills/ios/swift-security-expert/references/credential-storage-patterns.md +721 -0
- package/skills/ios/swift-security-expert/references/cryptokit-public-key.md +505 -0
- package/skills/ios/swift-security-expert/references/cryptokit-symmetric.md +497 -0
- package/skills/ios/swift-security-expert/references/keychain-access-control.md +508 -0
- package/skills/ios/swift-security-expert/references/keychain-fundamentals.md +596 -0
- package/skills/ios/swift-security-expert/references/keychain-item-classes.md +476 -0
- package/skills/ios/swift-security-expert/references/keychain-sharing.md +458 -0
- package/skills/ios/swift-security-expert/references/migration-legacy-stores.md +727 -0
- package/skills/ios/swift-security-expert/references/secure-enclave.md +539 -0
- package/skills/ios/swift-security-expert/references/testing-security-code.md +781 -0
- package/skills/ios/swift-testing-expert/LICENSE +21 -0
- package/skills/ios/swift-testing-expert/SKILL.md +79 -0
- package/skills/ios/swift-testing-expert/references/_index.md +12 -0
- package/skills/ios/swift-testing-expert/references/async-testing-and-waiting.md +127 -0
- package/skills/ios/swift-testing-expert/references/expectations.md +145 -0
- package/skills/ios/swift-testing-expert/references/fundamentals.md +141 -0
- package/skills/ios/swift-testing-expert/references/migration-from-xctest.md +127 -0
- package/skills/ios/swift-testing-expert/references/parallelization-and-isolation.md +95 -0
- package/skills/ios/swift-testing-expert/references/parameterized-testing.md +284 -0
- package/skills/ios/swift-testing-expert/references/performance-and-best-practices.md +187 -0
- package/skills/ios/swift-testing-expert/references/traits-and-tags.md +114 -0
- package/skills/ios/swift-testing-expert/references/xcode-workflows.md +70 -0
- package/skills/ios/swiftdata-pro/LICENSE +21 -0
- package/skills/ios/swiftdata-pro/SKILL.md +102 -0
- package/skills/ios/swiftdata-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.png +0 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.svg +29 -0
- package/skills/ios/swiftdata-pro/references/class-inheritance.md +104 -0
- package/skills/ios/swiftdata-pro/references/cloudkit.md +10 -0
- package/skills/ios/swiftdata-pro/references/core-rules.md +20 -0
- package/skills/ios/swiftdata-pro/references/indexing.md +27 -0
- package/skills/ios/swiftdata-pro/references/predicates.md +73 -0
- package/skills/ios/swiftui-design-principles/AGENTS.md +21 -0
- package/skills/ios/swiftui-design-principles/LICENSE +21 -0
- package/skills/ios/swiftui-design-principles/README.md +41 -0
- package/skills/ios/swiftui-design-principles/SKILL.md +605 -0
- package/skills/ios/swiftui-design-principles/metadata.json +10 -0
- package/skills/ios/swiftui-design-tokens/SKILL.md +475 -0
- package/skills/ios/swiftui-liquid-glass/LICENSE +21 -0
- package/skills/ios/swiftui-liquid-glass/SKILL.md +95 -0
- package/skills/ios/swiftui-liquid-glass/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-liquid-glass/references/liquid-glass.md +280 -0
- package/skills/ios/swiftui-performance-audit/LICENSE +21 -0
- package/skills/ios/swiftui-performance-audit/SKILL.md +111 -0
- package/skills/ios/swiftui-performance-audit/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-performance-audit/references/code-smells.md +150 -0
- package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/skills/ios/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/skills/ios/swiftui-performance-audit/references/profiling-intake.md +44 -0
- package/skills/ios/swiftui-performance-audit/references/report-template.md +47 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
- package/skills/ios/swiftui-pro/LICENSE +21 -0
- package/skills/ios/swiftui-pro/SKILL.md +108 -0
- package/skills/ios/swiftui-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
- package/skills/ios/swiftui-pro/references/accessibility.md +13 -0
- package/skills/ios/swiftui-pro/references/api.md +39 -0
- package/skills/ios/swiftui-pro/references/data.md +43 -0
- package/skills/ios/swiftui-pro/references/design.md +31 -0
- package/skills/ios/swiftui-pro/references/hygiene.md +9 -0
- package/skills/ios/swiftui-pro/references/navigation.md +14 -0
- package/skills/ios/swiftui-pro/references/performance.md +46 -0
- package/skills/ios/swiftui-pro/references/swift.md +56 -0
- package/skills/ios/swiftui-pro/references/views.md +35 -0
- package/skills/ios/swiftui-ui-patterns/LICENSE +21 -0
- package/skills/ios/swiftui-ui-patterns/SKILL.md +100 -0
- package/skills/ios/swiftui-ui-patterns/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-ui-patterns/references/app-wiring.md +201 -0
- package/skills/ios/swiftui-ui-patterns/references/async-state.md +96 -0
- package/skills/ios/swiftui-ui-patterns/references/components-index.md +50 -0
- package/skills/ios/swiftui-ui-patterns/references/controls.md +57 -0
- package/skills/ios/swiftui-ui-patterns/references/deeplinks.md +66 -0
- package/skills/ios/swiftui-ui-patterns/references/focus.md +90 -0
- package/skills/ios/swiftui-ui-patterns/references/form.md +97 -0
- package/skills/ios/swiftui-ui-patterns/references/grids.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/haptics.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/input-toolbar.md +51 -0
- package/skills/ios/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/list.md +86 -0
- package/skills/ios/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
- package/skills/ios/swiftui-ui-patterns/references/macos-settings.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/matched-transitions.md +59 -0
- package/skills/ios/swiftui-ui-patterns/references/media.md +73 -0
- package/skills/ios/swiftui-ui-patterns/references/menu-bar.md +101 -0
- package/skills/ios/swiftui-ui-patterns/references/navigationstack.md +159 -0
- package/skills/ios/swiftui-ui-patterns/references/overlay.md +45 -0
- package/skills/ios/swiftui-ui-patterns/references/performance.md +62 -0
- package/skills/ios/swiftui-ui-patterns/references/previews.md +48 -0
- package/skills/ios/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
- package/skills/ios/swiftui-ui-patterns/references/scrollview.md +87 -0
- package/skills/ios/swiftui-ui-patterns/references/searchable.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/sheets.md +155 -0
- package/skills/ios/swiftui-ui-patterns/references/split-views.md +72 -0
- package/skills/ios/swiftui-ui-patterns/references/tabview.md +114 -0
- package/skills/ios/swiftui-ui-patterns/references/theming.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/title-menus.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/top-bar.md +49 -0
- package/skills/ios/swiftui-view-refactor/LICENSE +21 -0
- package/skills/ios/swiftui-view-refactor/SKILL.md +207 -0
- package/skills/ios/swiftui-view-refactor/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-view-refactor/references/mv-patterns.md +161 -0
- package/skills/ios/widgetkit/LICENSE +131 -0
- package/skills/ios/widgetkit/SKILL.md +502 -0
- package/skills/ios/widgetkit/references/widgetkit-advanced.md +871 -0
- package/skills/ios/writing-for-interfaces/SKILL.md +75 -0
- package/skills/web/accessibility/SKILL.md +146 -0
- package/skills/web/aceternity-ui/SKILL.md +719 -0
- package/skills/web/aceternity-ui/metadata.json +10 -0
- package/skills/web/api-design/SKILL.md +523 -0
- package/skills/web/chart-accessibility/SKILL.md +332 -0
- package/skills/web/composition-patterns/AGENTS.md +946 -0
- package/skills/web/composition-patterns/README.md +60 -0
- package/skills/web/composition-patterns/SKILL.md +89 -0
- package/skills/web/composition-patterns/metadata.json +11 -0
- package/skills/web/composition-patterns/rules/_sections.md +29 -0
- package/skills/web/composition-patterns/rules/_template.md +24 -0
- package/skills/web/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skills/web/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skills/web/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skills/web/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skills/web/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skills/web/composition-patterns/rules/state-context-interface.md +191 -0
- package/skills/web/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skills/web/composition-patterns/rules/state-lift-state.md +125 -0
- package/skills/web/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/web/database-migrations/SKILL.md +429 -0
- package/skills/web/deployment-patterns/SKILL.md +427 -0
- package/skills/web/docker-patterns/SKILL.md +364 -0
- package/skills/web/e2e-testing/SKILL.md +326 -0
- package/skills/web/lighthouse-ci/SKILL.md +361 -0
- package/skills/web/mcp-server-patterns/SKILL.md +69 -0
- package/skills/web/next-best-practices/SKILL.md +153 -0
- package/skills/web/next-best-practices/async-patterns.md +87 -0
- package/skills/web/next-best-practices/bundling.md +180 -0
- package/skills/web/next-best-practices/data-patterns.md +297 -0
- package/skills/web/next-best-practices/debug-tricks.md +105 -0
- package/skills/web/next-best-practices/directives.md +73 -0
- package/skills/web/next-best-practices/error-handling.md +227 -0
- package/skills/web/next-best-practices/file-conventions.md +140 -0
- package/skills/web/next-best-practices/font.md +245 -0
- package/skills/web/next-best-practices/functions.md +108 -0
- package/skills/web/next-best-practices/hydration-error.md +91 -0
- package/skills/web/next-best-practices/image.md +173 -0
- package/skills/web/next-best-practices/metadata.md +301 -0
- package/skills/web/next-best-practices/parallel-routes.md +287 -0
- package/skills/web/next-best-practices/route-handlers.md +146 -0
- package/skills/web/next-best-practices/rsc-boundaries.md +159 -0
- package/skills/web/next-best-practices/runtime-selection.md +39 -0
- package/skills/web/next-best-practices/scripts.md +141 -0
- package/skills/web/next-best-practices/self-hosting.md +371 -0
- package/skills/web/next-best-practices/suspense-boundaries.md +67 -0
- package/skills/web/next-cache-components/SKILL.md +411 -0
- package/skills/web/postgres-best-practices/SKILL.md +14 -0
- package/skills/web/postgres-best-practices/references/schema-design.md +9 -0
- package/skills/web/react-best-practices/AGENTS.md +3810 -0
- package/skills/web/react-best-practices/README.md +123 -0
- package/skills/web/react-best-practices/SKILL.md +149 -0
- package/skills/web/react-best-practices/metadata.json +15 -0
- package/skills/web/react-best-practices/rules/_sections.md +46 -0
- package/skills/web/react-best-practices/rules/_template.md +28 -0
- package/skills/web/react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/skills/web/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/web/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/web/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/web/react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/web/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/skills/web/react-best-practices/rules/async-defer-await.md +82 -0
- package/skills/web/react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/web/react-best-practices/rules/async-parallel.md +28 -0
- package/skills/web/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/web/react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/skills/web/react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/skills/web/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/web/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/web/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/web/react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/web/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/web/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/web/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/web/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/web/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/web/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/web/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/web/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/web/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/web/react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/web/react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/web/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/web/react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/web/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/web/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/web/react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/skills/web/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/web/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/web/react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/web/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/web/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/web/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/web/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/web/react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/web/react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/web/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/web/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/web/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/web/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/web/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/web/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/web/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/web/react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/web/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/web/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/web/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/web/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/web/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/web/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/web/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/web/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/web/react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/web/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/web/react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/skills/web/react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/skills/web/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/web/react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/skills/web/react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web/seo/SKILL.md +154 -0
- package/skills/web/web-design-guidelines/SKILL.md +39 -0
- package/skills/web/zap-scan-config/SKILL.md +444 -0
- package/skills/web/zap-scan-config/assets/.gitkeep +9 -0
- package/skills/web/zap-scan-config/assets/github_action.yml +207 -0
- package/skills/web/zap-scan-config/assets/gitlab_ci.yml +226 -0
- package/skills/web/zap-scan-config/assets/zap_automation.yaml +196 -0
- package/skills/web/zap-scan-config/assets/zap_context.xml +192 -0
- package/skills/web/zap-scan-config/references/EXAMPLE.md +40 -0
- package/skills/web/zap-scan-config/references/api_testing_guide.md +475 -0
- package/skills/web/zap-scan-config/references/authentication_guide.md +431 -0
- package/skills/web/zap-scan-config/references/false_positive_handling.md +427 -0
- package/skills/web/zap-scan-config/references/owasp_mapping.md +255 -0
- package/src/lrr/aggregator.ts +80 -0
- package/src/orchestrator/hooks/context-header.ts +95 -0
- package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
- package/src/orchestrator/hooks/token-accounting.ts +101 -0
- package/src/orchestrator/mcp/cycle-counter.ts +129 -0
- package/src/orchestrator/mcp/scribe.ts +283 -0
- package/src/orchestrator/mcp/state-save.ts +149 -0
- package/src/orchestrator/mcp/write-lease.ts +167 -0
- package/src/orchestrator/phase4-shared-context.ts +41 -0
- package/src/orchestrator/schemas/backward-edge.ts +46 -0
- package/agents/agentic-identity-trust.md +0 -121
- package/agents/data-consolidation-agent.md +0 -39
- package/agents/design-image-prompt-engineer.md +0 -105
- package/agents/design-visual-storyteller.md +0 -147
- package/agents/design-whimsy-injector.md +0 -89
- package/agents/engineering-autonomous-optimization-architect.md +0 -105
- package/agents/market-intel.md +0 -35
- package/agents/marketing-instagram-curator.md +0 -111
- package/agents/marketing-reddit-community-builder.md +0 -121
- package/agents/marketing-social-media-strategist.md +0 -74
- package/agents/marketing-tiktok-strategist.md +0 -123
- package/agents/marketing-twitter-engager.md +0 -124
- package/agents/marketing-wechat-official-account.md +0 -143
- package/agents/marketing-xiaohongshu-specialist.md +0 -136
- package/agents/marketing-zhihu-strategist.md +0 -160
- package/agents/product-behavioral-nudge-engine.md +0 -78
- package/agents/project-management-experiment-tracker.md +0 -102
- package/agents/report-distribution-agent.md +0 -43
- package/agents/risk-analysis.md +0 -45
- package/agents/sales-data-extraction-agent.md +0 -46
- package/agents/specialized-cultural-intelligence-strategist.md +0 -65
- package/agents/specialized-developer-advocate.md +0 -146
- package/agents/support-analytics-reporter.md +0 -133
- package/agents/support-executive-summary-generator.md +0 -64
- package/agents/support-finance-tracker.md +0 -145
- package/agents/support-legal-compliance-checker.md +0 -129
- package/agents/support-support-responder.md +0 -91
- package/agents/testing-accessibility-auditor.md +0 -110
- package/agents/testing-test-results-analyzer.md +0 -97
- package/agents/testing-tool-evaluator.md +0 -76
- package/agents/testing-workflow-optimizer.md +0 -99
- package/agents/user-research.md +0 -40
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
# Display Settings and Visual Accessibility
|
|
2
|
+
|
|
3
|
+
Covers four Accessibility Nutrition Label categories: **Reduced Motion**, **Sufficient Contrast**, **Dark Interface**, and **Differentiate Without Color**. Also covers Reduce Transparency, Bold Text, and Smart Invert.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
- [Reduce Motion](#reduce-motion)
|
|
7
|
+
- [Sufficient Contrast and Dark Interface](#sufficient-contrast-and-dark-interface)
|
|
8
|
+
- [Differentiate Without Color](#differentiate-without-color)
|
|
9
|
+
- [Reduce Transparency](#reduce-transparency)
|
|
10
|
+
- [Bold Text](#bold-text)
|
|
11
|
+
- [Smart Invert / Invert Colors](#smart-invert--invert-colors)
|
|
12
|
+
- [UIKit Notification Observation](#uikit-notification-observation)
|
|
13
|
+
- [Common Failures](#common-failures)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Reduce Motion
|
|
18
|
+
|
|
19
|
+
Users with vestibular disorders enable Reduce Motion to avoid nausea, dizziness, or headaches from certain animations. **Animations must not be ignored — they must be appropriately replaced.**
|
|
20
|
+
|
|
21
|
+
### Detection
|
|
22
|
+
|
|
23
|
+
```swift
|
|
24
|
+
// SwiftUI
|
|
25
|
+
@Environment(\.accessibilityReduceMotion) var reduceMotion
|
|
26
|
+
|
|
27
|
+
// UIKit
|
|
28
|
+
UIAccessibility.isReduceMotionEnabled
|
|
29
|
+
|
|
30
|
+
// watchOS
|
|
31
|
+
WKAccessibilityIsReduceMotionEnabled()
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Decision Tree
|
|
35
|
+
|
|
36
|
+
**Is the animation purely decorative?** (e.g., a bouncing logo, a particle effect)
|
|
37
|
+
→ Remove it entirely when Reduce Motion is enabled.
|
|
38
|
+
|
|
39
|
+
**Does the animation convey meaning?** (e.g., a card slides into a stack to show it was saved, a view zooms in to show hierarchy)
|
|
40
|
+
→ Replace with a motion-free alternative: fade, dissolve, highlight, color change.
|
|
41
|
+
→ Never remove — removing breaks comprehension.
|
|
42
|
+
|
|
43
|
+
### SwiftUI Patterns
|
|
44
|
+
|
|
45
|
+
```swift
|
|
46
|
+
// ✅ Pattern 1: Gate withAnimation
|
|
47
|
+
@Environment(\.accessibilityReduceMotion) var reduceMotion
|
|
48
|
+
|
|
49
|
+
Button("Show Detail") {
|
|
50
|
+
if reduceMotion {
|
|
51
|
+
isVisible = true // instant — no animation
|
|
52
|
+
} else {
|
|
53
|
+
withAnimation(.spring()) { isVisible = true }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ✅ Pattern 2: Conditional animation modifier
|
|
58
|
+
Text("Status: \(status)")
|
|
59
|
+
.animation(reduceMotion ? nil : .easeInOut(duration: 0.3), value: status)
|
|
60
|
+
|
|
61
|
+
// ✅ Pattern 3: Cross-fade instead of slide
|
|
62
|
+
if reduceMotion {
|
|
63
|
+
content.transition(.opacity) // fade — safe
|
|
64
|
+
} else {
|
|
65
|
+
content.transition(.slide) // slide — may cause issues
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### UIKit Patterns
|
|
70
|
+
|
|
71
|
+
```swift
|
|
72
|
+
// ✅ Check before animating
|
|
73
|
+
func showCard() {
|
|
74
|
+
if UIAccessibility.isReduceMotionEnabled {
|
|
75
|
+
cardView.alpha = 1 // instant appearance
|
|
76
|
+
} else {
|
|
77
|
+
UIView.animate(withDuration: 0.3) {
|
|
78
|
+
self.cardView.alpha = 1
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ✅ Observe runtime changes
|
|
84
|
+
NotificationCenter.default.addObserver(
|
|
85
|
+
forName: UIAccessibility.reduceMotionStatusDidChangeNotification,
|
|
86
|
+
object: nil, queue: .main
|
|
87
|
+
) { _ in
|
|
88
|
+
self.updateAnimationPreferences()
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Auto-Advancing Content
|
|
93
|
+
|
|
94
|
+
Carousels, slideshows, and auto-playing content must either stop or provide a manual control.
|
|
95
|
+
|
|
96
|
+
```swift
|
|
97
|
+
struct AutoScrollBanner: View {
|
|
98
|
+
@Environment(\.accessibilityReduceMotion) var reduceMotion
|
|
99
|
+
@State private var currentIndex = 0
|
|
100
|
+
|
|
101
|
+
var body: some View {
|
|
102
|
+
TabView(selection: $currentIndex) {
|
|
103
|
+
ForEach(banners.indices, id: \.self) { index in
|
|
104
|
+
BannerView(banner: banners[index]).tag(index)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
.tabViewStyle(.page)
|
|
108
|
+
.onAppear {
|
|
109
|
+
if !reduceMotion { startAutoScroll() }
|
|
110
|
+
}
|
|
111
|
+
.onChange(of: reduceMotion) { _, newValue in
|
|
112
|
+
if newValue { stopAutoScroll() }
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Nutrition Label Criteria
|
|
119
|
+
|
|
120
|
+
To indicate **Reduced Motion** support:
|
|
121
|
+
- Parallax, depth simulation, animated blur → disabled
|
|
122
|
+
- Spinning/vortex/multi-axis motion → removed or replaced
|
|
123
|
+
- Auto-advancing content → stopped or manual control provided
|
|
124
|
+
- Meaningful animations → replaced (not removed) with fade/dissolve/color shift
|
|
125
|
+
- System setting detected automatically (no in-app setting required)
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Sufficient Contrast and Dark Interface
|
|
130
|
+
|
|
131
|
+
### WCAG Contrast Ratios
|
|
132
|
+
|
|
133
|
+
| Element | Minimum Ratio | Enhanced (WCAG AAA) |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| Normal text (<18pt regular, <14pt bold) | **4.5:1** | 7:1 |
|
|
136
|
+
| Large text (≥18pt regular or ≥14pt bold) | **3:1** | 4.5:1 |
|
|
137
|
+
| Non-text interactive elements | **3:1** | — |
|
|
138
|
+
| State indicators (checkbox border) | **3:1** | — |
|
|
139
|
+
| Decorative text with no informational value | None required | — |
|
|
140
|
+
|
|
141
|
+
### Semantic Colors — Always Adapt
|
|
142
|
+
|
|
143
|
+
Use semantic colors that automatically adapt to light/dark mode and Increase Contrast.
|
|
144
|
+
|
|
145
|
+
```swift
|
|
146
|
+
// SwiftUI — semantic colors adapt automatically
|
|
147
|
+
Text("Primary content")
|
|
148
|
+
.foregroundStyle(.primary) // black in light, white in dark
|
|
149
|
+
|
|
150
|
+
Text("Secondary content")
|
|
151
|
+
.foregroundStyle(.secondary) // gray, higher contrast when needed
|
|
152
|
+
|
|
153
|
+
Rectangle()
|
|
154
|
+
.fill(Color(.systemBackground)) // white/black
|
|
155
|
+
|
|
156
|
+
// ❌ Avoid hardcoded colors — don't adapt
|
|
157
|
+
Text("Label")
|
|
158
|
+
.foregroundStyle(Color(red: 0.5, green: 0.5, blue: 0.5)) // might fail in dark mode
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```swift
|
|
162
|
+
// UIKit — UIColor semantic variants
|
|
163
|
+
label.textColor = .label // adapts to light/dark
|
|
164
|
+
label.textColor = .secondaryLabel // adapts
|
|
165
|
+
view.backgroundColor = .systemBackground
|
|
166
|
+
view.backgroundColor = .secondarySystemBackground
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Custom Colors with Dark Mode Support
|
|
170
|
+
|
|
171
|
+
```swift
|
|
172
|
+
// SwiftUI — Color Set with dark variant in asset catalog
|
|
173
|
+
Color("BrandPrimary") // define Light and Dark in Assets.xcassets
|
|
174
|
+
|
|
175
|
+
// SwiftUI does not provide an inline light/dark Color initializer.
|
|
176
|
+
// Prefer Color Sets for app-defined adaptive colors.
|
|
177
|
+
|
|
178
|
+
// UIKit — dynamic color
|
|
179
|
+
let brandColor = UIColor { traits in
|
|
180
|
+
traits.userInterfaceStyle == .dark
|
|
181
|
+
? UIColor(red: 0.0, green: 0.7, blue: 1.0, alpha: 1) // light blue on dark
|
|
182
|
+
: UIColor(red: 0.0, green: 0.4, blue: 0.8, alpha: 1) // darker blue on light
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Increase Contrast
|
|
187
|
+
|
|
188
|
+
```swift
|
|
189
|
+
// SwiftUI
|
|
190
|
+
@Environment(\.colorSchemeContrast) var contrast
|
|
191
|
+
let increaseContrast = (contrast == .increased)
|
|
192
|
+
|
|
193
|
+
// Example: boost border visibility
|
|
194
|
+
RoundedRectangle(cornerRadius: 8)
|
|
195
|
+
.stroke(increaseContrast ? Color(.label) : Color(.separator), lineWidth: increaseContrast ? 2 : 1)
|
|
196
|
+
|
|
197
|
+
// UIKit
|
|
198
|
+
UIAccessibility.isDarkerSystemColorsEnabled
|
|
199
|
+
|
|
200
|
+
NotificationCenter.default.addObserver(
|
|
201
|
+
forName: UIAccessibility.darkerSystemColorsStatusDidChangeNotification,
|
|
202
|
+
object: nil, queue: .main
|
|
203
|
+
) { _ in self.updateContrast() }
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Dark Interface — Dark Mode
|
|
207
|
+
|
|
208
|
+
```swift
|
|
209
|
+
// SwiftUI — support system Dark Mode
|
|
210
|
+
// Use semantic colors — they adapt automatically (see above)
|
|
211
|
+
|
|
212
|
+
// Detect current color scheme
|
|
213
|
+
@Environment(\.colorScheme) var colorScheme
|
|
214
|
+
|
|
215
|
+
// Force dark for testing
|
|
216
|
+
ContentView().environment(\.colorScheme, .dark)
|
|
217
|
+
|
|
218
|
+
// UIKit — respond to trait changes
|
|
219
|
+
// Pre-iOS 17:
|
|
220
|
+
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { // Deprecated in iOS 17
|
|
221
|
+
super.traitCollectionDidChange(previousTraitCollection)
|
|
222
|
+
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
|
|
223
|
+
updateColors()
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// iOS 17+ replacement:
|
|
228
|
+
registerForTraitChanges([UITraitUserInterfaceStyle.self]) { (self: Self, _) in
|
|
229
|
+
self.updateColors()
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Critical: Test Dark + Increase Contrast Together
|
|
234
|
+
|
|
235
|
+
The most common failure is correct contrast in light mode but broken in dark mode. Always test both.
|
|
236
|
+
|
|
237
|
+
```swift
|
|
238
|
+
// Simulator test: Settings → Developer → Dark Appearance
|
|
239
|
+
// AND: Settings → Accessibility → Display & Text Size → Increase Contrast
|
|
240
|
+
//
|
|
241
|
+
// Use Accessibility Inspector
|
|
242
|
+
// (Xcode → Open Developer Tool → Accessibility Inspector → Settings tab)
|
|
243
|
+
// to simulate Increase Contrast on the Simulator.
|
|
244
|
+
#Preview("Dark Mode") {
|
|
245
|
+
MyView()
|
|
246
|
+
.environment(\.colorScheme, .dark)
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Common dark mode pitfalls:**
|
|
251
|
+
- Gray text on dark background (low contrast even for normal vision)
|
|
252
|
+
- Semi-transparent overlays that don't meet contrast in dark
|
|
253
|
+
- Images with white backgrounds that invert poorly
|
|
254
|
+
- Borders and dividers that disappear in dark mode
|
|
255
|
+
|
|
256
|
+
### Nutrition Label Criteria
|
|
257
|
+
|
|
258
|
+
To indicate **Sufficient Contrast**: All common task UI meets 4.5:1 for text, 3:1 for non-text, in BOTH light and dark mode, with Increase Contrast and Bold Text enabled.
|
|
259
|
+
|
|
260
|
+
To indicate **Dark Interface**: App is dark by default OR supports system Dark Mode, with no bright flashes and consistent dark appearance across all views.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Differentiate Without Color
|
|
265
|
+
|
|
266
|
+
Up to 10% of people have some form of color vision deficiency. Color must never be the **only** indicator of meaning.
|
|
267
|
+
|
|
268
|
+
### Testing Method
|
|
269
|
+
|
|
270
|
+
Enable Grayscale color filter: Settings → Accessibility → Display & Text Size → Color Filters → Grayscale.
|
|
271
|
+
If any information becomes ambiguous or invisible in grayscale, the app fails this test.
|
|
272
|
+
|
|
273
|
+
### Detection
|
|
274
|
+
|
|
275
|
+
```swift
|
|
276
|
+
// SwiftUI
|
|
277
|
+
@Environment(\.accessibilityDifferentiateWithoutColor) var differentiateWithoutColor
|
|
278
|
+
|
|
279
|
+
// UIKit
|
|
280
|
+
UIAccessibility.shouldDifferentiateWithoutColor
|
|
281
|
+
|
|
282
|
+
NotificationCenter.default.addObserver(
|
|
283
|
+
forName: UIAccessibility.differentiateWithoutColorDidChangeNotification,
|
|
284
|
+
object: nil, queue: .main
|
|
285
|
+
) { _ in self.updateForColorAccessibility() }
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Patterns
|
|
289
|
+
|
|
290
|
+
**Status Indicators**
|
|
291
|
+
|
|
292
|
+
```swift
|
|
293
|
+
// ❌ Color only — fails grayscale
|
|
294
|
+
Circle().fill(isOnline ? .green : .red)
|
|
295
|
+
|
|
296
|
+
// ✅ Color + shape
|
|
297
|
+
Group {
|
|
298
|
+
if isOnline {
|
|
299
|
+
Circle().fill(.green) // green circle
|
|
300
|
+
} else {
|
|
301
|
+
Circle()
|
|
302
|
+
.fill(.red)
|
|
303
|
+
.overlay(
|
|
304
|
+
Image(systemName: "xmark")
|
|
305
|
+
.foregroundStyle(.white)
|
|
306
|
+
.font(.caption2)
|
|
307
|
+
)
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// VoiceOver still needs a label:
|
|
311
|
+
.accessibilityLabel(isOnline ? "Online" : "Offline")
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Charts and Data Visualization**
|
|
315
|
+
|
|
316
|
+
```swift
|
|
317
|
+
// ❌ Color only — bars indistinguishable in grayscale
|
|
318
|
+
BarMark(x: .value("Month", month), y: .value("Sales", sales))
|
|
319
|
+
.foregroundStyle(by: .value("Category", category))
|
|
320
|
+
|
|
321
|
+
// ✅ Color + pattern or symbol
|
|
322
|
+
BarMark(...)
|
|
323
|
+
.foregroundStyle(by: .value("Category", category))
|
|
324
|
+
.symbol(by: .value("Category", category)) // different symbols per category
|
|
325
|
+
|
|
326
|
+
// ✅ Or annotate directly on chart elements
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Conditional Enhancement**
|
|
330
|
+
|
|
331
|
+
```swift
|
|
332
|
+
@Environment(\.accessibilityDifferentiateWithoutColor) var differentiate
|
|
333
|
+
|
|
334
|
+
// Normally color-coded, enhanced with icons when setting is on
|
|
335
|
+
HStack {
|
|
336
|
+
if differentiate {
|
|
337
|
+
Image(systemName: status.iconName)
|
|
338
|
+
}
|
|
339
|
+
Text(status.label)
|
|
340
|
+
}
|
|
341
|
+
.foregroundStyle(status.color)
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Nutrition Label Criteria
|
|
345
|
+
|
|
346
|
+
To indicate **Differentiate Without Color**:
|
|
347
|
+
- App passes the Grayscale filter test (all information comprehensible)
|
|
348
|
+
- Status indicators use shape/icon/text in addition to color
|
|
349
|
+
- Charts/graphs use patterns, labels, or symbols in addition to color
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Reduce Transparency
|
|
354
|
+
|
|
355
|
+
```swift
|
|
356
|
+
// SwiftUI
|
|
357
|
+
@Environment(\.accessibilityReduceTransparency) var reduceTransparency
|
|
358
|
+
|
|
359
|
+
// UIKit
|
|
360
|
+
UIAccessibility.isReduceTransparencyEnabled
|
|
361
|
+
|
|
362
|
+
NotificationCenter.default.addObserver(
|
|
363
|
+
forName: UIAccessibility.reduceTransparencyStatusDidChangeNotification,
|
|
364
|
+
object: nil, queue: .main
|
|
365
|
+
) { _ in self.updateBlurEffects() }
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Replace Blur/Glass with Solid Backgrounds
|
|
369
|
+
|
|
370
|
+
```swift
|
|
371
|
+
// SwiftUI — conditional material
|
|
372
|
+
.background {
|
|
373
|
+
if reduceTransparency {
|
|
374
|
+
Color(.secondarySystemBackground) // solid
|
|
375
|
+
} else {
|
|
376
|
+
Rectangle().fill(.ultraThinMaterial) // blur
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// iOS 26 Liquid Glass [VERIFY] iOS 26 beta — API subject to change
|
|
381
|
+
if #available(iOS 26, *) {
|
|
382
|
+
content.glassEffect(
|
|
383
|
+
reduceTransparency ? .clear : .regular
|
|
384
|
+
)
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// UIKit
|
|
388
|
+
blurView.isHidden = UIAccessibility.isReduceTransparencyEnabled
|
|
389
|
+
solidBackground.isHidden = !UIAccessibility.isReduceTransparencyEnabled
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## Bold Text
|
|
395
|
+
|
|
396
|
+
When Bold Text is enabled, system fonts render heavier. Custom fonts may need to respond.
|
|
397
|
+
|
|
398
|
+
```swift
|
|
399
|
+
// SwiftUI
|
|
400
|
+
@Environment(\.legibilityWeight) var legibilityWeight
|
|
401
|
+
let boldTextEnabled = (legibilityWeight == .bold)
|
|
402
|
+
|
|
403
|
+
Text("Important")
|
|
404
|
+
.fontWeight(boldTextEnabled ? .heavy : .medium)
|
|
405
|
+
|
|
406
|
+
// UIKit
|
|
407
|
+
UIAccessibility.isBoldTextEnabled
|
|
408
|
+
|
|
409
|
+
// System fonts respond automatically when using preferredFont()
|
|
410
|
+
// Custom fonts may need manual weight adjustment:
|
|
411
|
+
NotificationCenter.default.addObserver(
|
|
412
|
+
forName: UIAccessibility.boldTextStatusDidChangeNotification,
|
|
413
|
+
object: nil, queue: .main
|
|
414
|
+
) { _ in self.updateFontWeights() }
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## Smart Invert / Invert Colors
|
|
420
|
+
|
|
421
|
+
Smart Invert intelligently inverts most UI colors but should leave images, video, and app-specific content untouched.
|
|
422
|
+
|
|
423
|
+
### Opt Out Specific Views
|
|
424
|
+
|
|
425
|
+
```swift
|
|
426
|
+
// SwiftUI — protect images, video thumbnails, maps, charts
|
|
427
|
+
AsyncImage(url: photoURL) { image in
|
|
428
|
+
image.resizable()
|
|
429
|
+
}
|
|
430
|
+
.accessibilityIgnoresInvertColors()
|
|
431
|
+
|
|
432
|
+
// UIKit
|
|
433
|
+
imageView.accessibilityIgnoresInvertColors = true
|
|
434
|
+
mapView.accessibilityIgnoresInvertColors = true
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### What to Protect
|
|
438
|
+
|
|
439
|
+
- Photos and user-generated images
|
|
440
|
+
- Video thumbnails and players
|
|
441
|
+
- Maps and satellite imagery
|
|
442
|
+
- App icons displayed within content
|
|
443
|
+
- Charts with color-coded data (the color meaning would be inverted)
|
|
444
|
+
|
|
445
|
+
### What NOT to Protect
|
|
446
|
+
|
|
447
|
+
- UI chrome (buttons, backgrounds, navigation bars) — should invert
|
|
448
|
+
- Text and icons — should invert
|
|
449
|
+
- Custom-drawn backgrounds — should invert
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## UIKit Notification Observation
|
|
454
|
+
|
|
455
|
+
Full list of accessibility status change notifications:
|
|
456
|
+
|
|
457
|
+
```swift
|
|
458
|
+
// Register all at once
|
|
459
|
+
let notifications: [(Notification.Name, Selector)] = [
|
|
460
|
+
(UIAccessibility.reduceMotionStatusDidChangeNotification, #selector(motionChanged)),
|
|
461
|
+
(UIAccessibility.darkerSystemColorsStatusDidChangeNotification, #selector(contrastChanged)),
|
|
462
|
+
(UIAccessibility.reduceTransparencyStatusDidChangeNotification, #selector(transparencyChanged)),
|
|
463
|
+
(UIAccessibility.boldTextStatusDidChangeNotification, #selector(boldTextChanged)),
|
|
464
|
+
(UIAccessibility.differentiateWithoutColorDidChangeNotification, #selector(colorChanged)),
|
|
465
|
+
(UIAccessibility.invertColorsStatusDidChangeNotification, #selector(invertChanged)),
|
|
466
|
+
(UIAccessibility.voiceOverStatusDidChangeNotification, #selector(voiceOverChanged)),
|
|
467
|
+
(UIAccessibility.switchControlStatusDidChangeNotification, #selector(switchControlChanged)),
|
|
468
|
+
(UIAccessibility.assistiveTouchStatusDidChangeNotification, #selector(assistiveTouchChanged)),
|
|
469
|
+
]
|
|
470
|
+
|
|
471
|
+
notifications.forEach { name, selector in
|
|
472
|
+
NotificationCenter.default.addObserver(self, selector: selector, name: name, object: nil)
|
|
473
|
+
}
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## Common Failures
|
|
479
|
+
|
|
480
|
+
| Failure | Category | Fix |
|
|
481
|
+
|---|---|---|
|
|
482
|
+
| Animation plays with Reduce Motion on | Reduced Motion | Gate with `accessibilityReduceMotion` |
|
|
483
|
+
| Decorative animation not removed | Reduced Motion | Remove entirely for decorative; replace for functional |
|
|
484
|
+
| Low contrast gray text in dark mode | Dark Interface / Contrast | Use `.secondary` color, test with dark + Increase Contrast |
|
|
485
|
+
| Color-only status dots | Differentiate Without Color | Add icon or shape |
|
|
486
|
+
| Blur effect used with Reduce Transparency | Reduce Transparency | Replace with opaque fallback |
|
|
487
|
+
| Photo inverts with Smart Invert | Invert Colors | Add `.accessibilityIgnoresInvertColors()` |
|
|
488
|
+
| Custom color doesn't adapt to dark mode | Dark Interface | Use `UIColor` dynamic provider or Color Set asset |
|
|
489
|
+
| Hardcoded WCAG values not checked | Sufficient Contrast | Use Accessibility Inspector contrast checker |
|
|
490
|
+
| Bold Text ignored for custom fonts | Bold Text | Listen for notification, update weight |
|
|
491
|
+
| Auto-carousel doesn't stop | Reduced Motion | Stop autoplay when `accessibilityReduceMotion` is true |
|