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,280 @@
|
|
|
1
|
+
# Implementing Liquid Glass Design in SwiftUI
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Liquid Glass is a dynamic material introduced in iOS that combines the optical properties of glass with a sense of fluidity. It blurs content behind it, reflects color and light from surrounding content, and reacts to touch and pointer interactions in real time. This guide covers how to implement and customize Liquid Glass effects in SwiftUI applications. You should always seek guides on Liquid Glass when asked for help adopting new Apple design.
|
|
6
|
+
|
|
7
|
+
Key features of Liquid Glass:
|
|
8
|
+
- Blurs content behind the material
|
|
9
|
+
- Reflects color and light from surrounding content
|
|
10
|
+
- Reacts to touch and pointer interactions
|
|
11
|
+
- Can morph between shapes during transitions
|
|
12
|
+
- Available for standard and custom components
|
|
13
|
+
|
|
14
|
+
## Basic Implementation
|
|
15
|
+
|
|
16
|
+
### Adding Liquid Glass to a View
|
|
17
|
+
|
|
18
|
+
The simplest way to add Liquid Glass to a view is using the `glassEffect()` modifier:
|
|
19
|
+
|
|
20
|
+
```swift
|
|
21
|
+
Text("Hello, World!")
|
|
22
|
+
.font(.title)
|
|
23
|
+
.padding()
|
|
24
|
+
.glassEffect()
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
By default, this applies the regular variant of Glass within a Capsule shape behind the view's content.
|
|
28
|
+
|
|
29
|
+
### Customizing the Shape
|
|
30
|
+
|
|
31
|
+
You can specify a different shape for the Liquid Glass effect:
|
|
32
|
+
|
|
33
|
+
```swift
|
|
34
|
+
Text("Hello, World!")
|
|
35
|
+
.font(.title)
|
|
36
|
+
.padding()
|
|
37
|
+
.glassEffect(in: .rect(cornerRadius: 16.0))
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Common shape options:
|
|
41
|
+
- `.capsule` (default)
|
|
42
|
+
- `.rect(cornerRadius: CGFloat)`
|
|
43
|
+
- `.circle`
|
|
44
|
+
|
|
45
|
+
## Customizing Liquid Glass Effects
|
|
46
|
+
|
|
47
|
+
### Glass Variants and Properties
|
|
48
|
+
|
|
49
|
+
You can customize the Liquid Glass effect by configuring the `Glass` structure:
|
|
50
|
+
|
|
51
|
+
```swift
|
|
52
|
+
Text("Hello, World!")
|
|
53
|
+
.font(.title)
|
|
54
|
+
.padding()
|
|
55
|
+
.glassEffect(.regular.tint(.orange).interactive())
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Key customization options:
|
|
59
|
+
- `.regular` - Standard glass effect
|
|
60
|
+
- `.tint(Color)` - Add a color tint to suggest prominence
|
|
61
|
+
- `.interactive(Bool)` - Make the glass react to touch and pointer interactions
|
|
62
|
+
|
|
63
|
+
### Making Interactive Glass
|
|
64
|
+
|
|
65
|
+
To make Liquid Glass react to touch and pointer interactions:
|
|
66
|
+
|
|
67
|
+
```swift
|
|
68
|
+
Text("Hello, World!")
|
|
69
|
+
.font(.title)
|
|
70
|
+
.padding()
|
|
71
|
+
.glassEffect(.regular.interactive(true))
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Or more concisely:
|
|
75
|
+
|
|
76
|
+
```swift
|
|
77
|
+
Text("Hello, World!")
|
|
78
|
+
.font(.title)
|
|
79
|
+
.padding()
|
|
80
|
+
.glassEffect(.regular.interactive())
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Working with Multiple Glass Effects
|
|
84
|
+
|
|
85
|
+
### Using GlassEffectContainer
|
|
86
|
+
|
|
87
|
+
When applying Liquid Glass effects to multiple views, use `GlassEffectContainer` for better rendering performance and to enable blending and morphing effects:
|
|
88
|
+
|
|
89
|
+
```swift
|
|
90
|
+
GlassEffectContainer(spacing: 40.0) {
|
|
91
|
+
HStack(spacing: 40.0) {
|
|
92
|
+
Image(systemName: "scribble.variable")
|
|
93
|
+
.frame(width: 80.0, height: 80.0)
|
|
94
|
+
.font(.system(size: 36))
|
|
95
|
+
.glassEffect()
|
|
96
|
+
|
|
97
|
+
Image(systemName: "eraser.fill")
|
|
98
|
+
.frame(width: 80.0, height: 80.0)
|
|
99
|
+
.font(.system(size: 36))
|
|
100
|
+
.glassEffect()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The `spacing` parameter controls how the Liquid Glass effects interact with each other:
|
|
106
|
+
- Smaller spacing: Views need to be closer to merge effects
|
|
107
|
+
- Larger spacing: Effects merge at greater distances
|
|
108
|
+
|
|
109
|
+
### Uniting Multiple Glass Effects
|
|
110
|
+
|
|
111
|
+
To combine multiple views into a single Liquid Glass effect, use the `glassEffectUnion` modifier:
|
|
112
|
+
|
|
113
|
+
```swift
|
|
114
|
+
@Namespace private var namespace
|
|
115
|
+
|
|
116
|
+
// Later in your view:
|
|
117
|
+
GlassEffectContainer(spacing: 20.0) {
|
|
118
|
+
HStack(spacing: 20.0) {
|
|
119
|
+
ForEach(symbolSet.indices, id: \.self) { item in
|
|
120
|
+
Image(systemName: symbolSet[item])
|
|
121
|
+
.frame(width: 80.0, height: 80.0)
|
|
122
|
+
.font(.system(size: 36))
|
|
123
|
+
.glassEffect()
|
|
124
|
+
.glassEffectUnion(id: item < 2 ? "1" : "2", namespace: namespace)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
This is useful when creating views dynamically or with views that live outside of an HStack or VStack.
|
|
131
|
+
|
|
132
|
+
## Morphing Effects and Transitions
|
|
133
|
+
|
|
134
|
+
### Creating Morphing Transitions
|
|
135
|
+
|
|
136
|
+
To create morphing effects during transitions between views with Liquid Glass:
|
|
137
|
+
|
|
138
|
+
1. Create a namespace using the `@Namespace` property wrapper
|
|
139
|
+
2. Associate each Liquid Glass effect with a unique identifier using `glassEffectID`
|
|
140
|
+
3. Use animations when changing the view hierarchy
|
|
141
|
+
|
|
142
|
+
```swift
|
|
143
|
+
@State private var isExpanded: Bool = false
|
|
144
|
+
@Namespace private var namespace
|
|
145
|
+
|
|
146
|
+
var body: some View {
|
|
147
|
+
GlassEffectContainer(spacing: 40.0) {
|
|
148
|
+
HStack(spacing: 40.0) {
|
|
149
|
+
Image(systemName: "scribble.variable")
|
|
150
|
+
.frame(width: 80.0, height: 80.0)
|
|
151
|
+
.font(.system(size: 36))
|
|
152
|
+
.glassEffect()
|
|
153
|
+
.glassEffectID("pencil", in: namespace)
|
|
154
|
+
|
|
155
|
+
if isExpanded {
|
|
156
|
+
Image(systemName: "eraser.fill")
|
|
157
|
+
.frame(width: 80.0, height: 80.0)
|
|
158
|
+
.font(.system(size: 36))
|
|
159
|
+
.glassEffect()
|
|
160
|
+
.glassEffectID("eraser", in: namespace)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
Button("Toggle") {
|
|
166
|
+
withAnimation {
|
|
167
|
+
isExpanded.toggle()
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
.buttonStyle(.glass)
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The morphing effect occurs when views with Liquid Glass appear or disappear due to view hierarchy changes.
|
|
175
|
+
|
|
176
|
+
## Button Styling with Liquid Glass
|
|
177
|
+
|
|
178
|
+
### Glass Button Style
|
|
179
|
+
|
|
180
|
+
SwiftUI provides built-in button styles for Liquid Glass:
|
|
181
|
+
|
|
182
|
+
```swift
|
|
183
|
+
Button("Click Me") {
|
|
184
|
+
// Action
|
|
185
|
+
}
|
|
186
|
+
.buttonStyle(.glass)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Glass Prominent Button Style
|
|
190
|
+
|
|
191
|
+
For a more prominent glass button:
|
|
192
|
+
|
|
193
|
+
```swift
|
|
194
|
+
Button("Important Action") {
|
|
195
|
+
// Action
|
|
196
|
+
}
|
|
197
|
+
.buttonStyle(.glassProminent)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Advanced Techniques
|
|
201
|
+
|
|
202
|
+
### Background Extension Effect
|
|
203
|
+
|
|
204
|
+
To stretch content behind a sidebar or inspector with the background extension effect:
|
|
205
|
+
|
|
206
|
+
```swift
|
|
207
|
+
NavigationSplitView {
|
|
208
|
+
// Sidebar content
|
|
209
|
+
} detail: {
|
|
210
|
+
// Detail content
|
|
211
|
+
.background {
|
|
212
|
+
// Background content that extends under the sidebar
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Extending Horizontal Scrolling Under Sidebar
|
|
218
|
+
|
|
219
|
+
To extend horizontal scroll views under a sidebar or inspector:
|
|
220
|
+
|
|
221
|
+
```swift
|
|
222
|
+
ScrollView(.horizontal) {
|
|
223
|
+
// Scrollable content
|
|
224
|
+
}
|
|
225
|
+
.scrollExtensionMode(.underSidebar)
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Best Practices
|
|
229
|
+
|
|
230
|
+
1. **Container Usage**: Always use `GlassEffectContainer` when applying Liquid Glass to multiple views for better performance and morphing effects.
|
|
231
|
+
|
|
232
|
+
2. **Effect Order**: Apply the `.glassEffect()` modifier after other modifiers that affect the appearance of the view.
|
|
233
|
+
|
|
234
|
+
3. **Spacing Consideration**: Carefully choose spacing values in containers to control how and when glass effects merge.
|
|
235
|
+
|
|
236
|
+
4. **Animation**: Use animations when changing view hierarchies to enable smooth morphing transitions.
|
|
237
|
+
|
|
238
|
+
5. **Interactivity**: Add `.interactive()` to glass effects that should respond to user interaction.
|
|
239
|
+
|
|
240
|
+
6. **Consistent Design**: Maintain consistent shapes and styles across your app for a cohesive look and feel.
|
|
241
|
+
|
|
242
|
+
## Example: Custom Badge with Liquid Glass
|
|
243
|
+
|
|
244
|
+
```swift
|
|
245
|
+
struct BadgeView: View {
|
|
246
|
+
let symbol: String
|
|
247
|
+
let color: Color
|
|
248
|
+
|
|
249
|
+
var body: some View {
|
|
250
|
+
ZStack {
|
|
251
|
+
Image(systemName: "hexagon.fill")
|
|
252
|
+
.foregroundColor(color)
|
|
253
|
+
.font(.system(size: 50))
|
|
254
|
+
|
|
255
|
+
Image(systemName: symbol)
|
|
256
|
+
.foregroundColor(.white)
|
|
257
|
+
.font(.system(size: 30))
|
|
258
|
+
}
|
|
259
|
+
.glassEffect(.regular, in: .rect(cornerRadius: 16))
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Usage:
|
|
264
|
+
GlassEffectContainer(spacing: 20) {
|
|
265
|
+
HStack(spacing: 20) {
|
|
266
|
+
BadgeView(symbol: "star.fill", color: .blue)
|
|
267
|
+
BadgeView(symbol: "heart.fill", color: .red)
|
|
268
|
+
BadgeView(symbol: "leaf.fill", color: .green)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## References
|
|
274
|
+
|
|
275
|
+
- [Applying Liquid Glass to custom views](https://developer.apple.com/documentation/SwiftUI/Applying-Liquid-Glass-to-custom-views)
|
|
276
|
+
- [Landmarks: Building an app with Liquid Glass](https://developer.apple.com/documentation/SwiftUI/Landmarks-Building-an-app-with-Liquid-Glass)
|
|
277
|
+
- [SwiftUI View.glassEffect(_:in:isEnabled:)](https://developer.apple.com/documentation/SwiftUI/View/glassEffect(_:in:isEnabled:))
|
|
278
|
+
- [SwiftUI GlassEffectContainer](https://developer.apple.com/documentation/SwiftUI/GlassEffectContainer)
|
|
279
|
+
- [SwiftUI GlassEffectTransition](https://developer.apple.com/documentation/SwiftUI/GlassEffectTransition)
|
|
280
|
+
- [SwiftUI GlassButtonStyle](https://developer.apple.com/documentation/SwiftUI/GlassButtonStyle)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Thomas Ricouard
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swiftui-performance-audit
|
|
3
|
+
description: Audit and improve SwiftUI runtime performance from code review and architecture. Use for requests to diagnose slow rendering, janky scrolling, high CPU/memory usage, excessive view updates, or layout thrash in SwiftUI apps, and to provide guidance for user-run Instruments profiling when code review alone is insufficient.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SwiftUI Performance Audit
|
|
7
|
+
|
|
8
|
+
## Quick start
|
|
9
|
+
|
|
10
|
+
Use this skill to diagnose SwiftUI performance issues from code first, then request profiling evidence when code review alone cannot explain the symptoms.
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. Classify the symptom: slow rendering, janky scrolling, high CPU, memory growth, hangs, or excessive view updates.
|
|
15
|
+
2. If code is available, start with a code-first review using `references/code-smells.md`.
|
|
16
|
+
3. If code is not available, ask for the smallest useful slice: target view, data flow, reproduction steps, and deployment target.
|
|
17
|
+
4. If code review is inconclusive or runtime evidence is required, guide the user through profiling with `references/profiling-intake.md`.
|
|
18
|
+
5. Summarize likely causes, evidence, remediation, and validation steps using `references/report-template.md`.
|
|
19
|
+
|
|
20
|
+
## 1. Intake
|
|
21
|
+
|
|
22
|
+
Collect:
|
|
23
|
+
- Target view or feature code.
|
|
24
|
+
- Symptoms and exact reproduction steps.
|
|
25
|
+
- Data flow: `@State`, `@Binding`, environment dependencies, and observable models.
|
|
26
|
+
- Whether the issue shows up on device or simulator, and whether it was observed in Debug or Release.
|
|
27
|
+
|
|
28
|
+
Ask the user to classify the issue if possible:
|
|
29
|
+
- CPU spike or battery drain
|
|
30
|
+
- Janky scrolling or dropped frames
|
|
31
|
+
- High memory or image pressure
|
|
32
|
+
- Hangs or unresponsive interactions
|
|
33
|
+
- Excessive or unexpectedly broad view updates
|
|
34
|
+
|
|
35
|
+
For the full profiling intake checklist, read `references/profiling-intake.md`.
|
|
36
|
+
|
|
37
|
+
## 2. Code-First Review
|
|
38
|
+
|
|
39
|
+
Focus on:
|
|
40
|
+
- Invalidation storms from broad observation or environment reads.
|
|
41
|
+
- Unstable identity in lists and `ForEach`.
|
|
42
|
+
- Heavy derived work in `body` or view builders.
|
|
43
|
+
- Layout thrash from complex hierarchies, `GeometryReader`, or preference chains.
|
|
44
|
+
- Large image decode or resize work on the main thread.
|
|
45
|
+
- Animation or transition work applied too broadly.
|
|
46
|
+
|
|
47
|
+
Use `references/code-smells.md` for the detailed smell catalog and fix guidance.
|
|
48
|
+
|
|
49
|
+
Provide:
|
|
50
|
+
- Likely root causes with code references.
|
|
51
|
+
- Suggested fixes and refactors.
|
|
52
|
+
- If needed, a minimal repro or instrumentation suggestion.
|
|
53
|
+
|
|
54
|
+
## 3. Guide the User to Profile
|
|
55
|
+
|
|
56
|
+
If code review does not explain the issue, ask for runtime evidence:
|
|
57
|
+
- A trace export or screenshots of the SwiftUI timeline and Time Profiler call tree.
|
|
58
|
+
- Device/OS/build configuration.
|
|
59
|
+
- The exact interaction being profiled.
|
|
60
|
+
- Before/after metrics if the user is comparing a change.
|
|
61
|
+
|
|
62
|
+
Use `references/profiling-intake.md` for the exact checklist and collection steps.
|
|
63
|
+
|
|
64
|
+
## 4. Analyze and Diagnose
|
|
65
|
+
|
|
66
|
+
- Map the evidence to the most likely category: invalidation, identity churn, layout thrash, main-thread work, image cost, or animation cost.
|
|
67
|
+
- Prioritize problems by impact, not by how easy they are to explain.
|
|
68
|
+
- Distinguish code-level suspicion from trace-backed evidence.
|
|
69
|
+
- Call out when profiling is still insufficient and what additional evidence would reduce uncertainty.
|
|
70
|
+
|
|
71
|
+
## 5. Remediate
|
|
72
|
+
|
|
73
|
+
Apply targeted fixes:
|
|
74
|
+
- Narrow state scope and reduce broad observation fan-out.
|
|
75
|
+
- Stabilize identities for `ForEach` and lists.
|
|
76
|
+
- Move heavy work out of `body` into derived state updated from inputs, model-layer precomputation, memoized helpers, or background preprocessing. Use `@State` only for view-owned state, not as an ad hoc cache for arbitrary computation.
|
|
77
|
+
- Use `equatable()` only when equality is cheaper than recomputing the subtree and the inputs are truly value-semantic.
|
|
78
|
+
- Downsample images before rendering.
|
|
79
|
+
- Reduce layout complexity or use fixed sizing where possible.
|
|
80
|
+
|
|
81
|
+
Use `references/code-smells.md` for examples, Observation-specific fan-out guidance, and remediation patterns.
|
|
82
|
+
|
|
83
|
+
## 6. Verify
|
|
84
|
+
|
|
85
|
+
Ask the user to re-run the same capture and compare with baseline metrics.
|
|
86
|
+
Summarize the delta (CPU, frame drops, memory peak) if provided.
|
|
87
|
+
|
|
88
|
+
## Outputs
|
|
89
|
+
|
|
90
|
+
Provide:
|
|
91
|
+
- A short metrics table (before/after if available).
|
|
92
|
+
- Top issues (ordered by impact).
|
|
93
|
+
- Proposed fixes with estimated effort.
|
|
94
|
+
|
|
95
|
+
Use `references/report-template.md` when formatting the final audit.
|
|
96
|
+
|
|
97
|
+
## References
|
|
98
|
+
|
|
99
|
+
- Profiling intake and collection checklist: `references/profiling-intake.md`
|
|
100
|
+
- Common code smells and remediation patterns: `references/code-smells.md`
|
|
101
|
+
- Audit output template: `references/report-template.md`
|
|
102
|
+
- Add Apple documentation and WWDC resources under `references/` as they are supplied by the user.
|
|
103
|
+
- Optimizing SwiftUI performance with Instruments: `references/optimizing-swiftui-performance-instruments.md`
|
|
104
|
+
- Understanding and improving SwiftUI performance: `references/understanding-improving-swiftui-performance.md`
|
|
105
|
+
- Understanding hangs in your app: `references/understanding-hangs-in-your-app.md`
|
|
106
|
+
- Demystify SwiftUI performance (WWDC23): `references/demystify-swiftui-performance-wwdc23.md`
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
Vendored from: https://github.com/Dimillian/Skills/tree/main/swiftui-performance-audit
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Common code smells and remediation patterns
|
|
2
|
+
|
|
3
|
+
## Intent
|
|
4
|
+
|
|
5
|
+
Use this reference during code-first review to map visible SwiftUI patterns to likely runtime costs and safer remediation guidance.
|
|
6
|
+
|
|
7
|
+
## High-priority smells
|
|
8
|
+
|
|
9
|
+
### Expensive formatters in `body`
|
|
10
|
+
|
|
11
|
+
```swift
|
|
12
|
+
var body: some View {
|
|
13
|
+
let number = NumberFormatter()
|
|
14
|
+
let measure = MeasurementFormatter()
|
|
15
|
+
Text(measure.string(from: .init(value: meters, unit: .meters)))
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Prefer cached formatters in a model or dedicated helper:
|
|
20
|
+
|
|
21
|
+
```swift
|
|
22
|
+
final class DistanceFormatter {
|
|
23
|
+
static let shared = DistanceFormatter()
|
|
24
|
+
let number = NumberFormatter()
|
|
25
|
+
let measure = MeasurementFormatter()
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Heavy computed properties
|
|
30
|
+
|
|
31
|
+
```swift
|
|
32
|
+
var filtered: [Item] {
|
|
33
|
+
items.filter { $0.isEnabled }
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Prefer deriving this once per meaningful input change in a model/helper, or store derived view-owned state only when the view truly owns the transformation lifecycle.
|
|
38
|
+
|
|
39
|
+
### Sorting or filtering inside `body`
|
|
40
|
+
|
|
41
|
+
```swift
|
|
42
|
+
List {
|
|
43
|
+
ForEach(items.sorted(by: sortRule)) { item in
|
|
44
|
+
Row(item)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Prefer sorting before render work begins:
|
|
50
|
+
|
|
51
|
+
```swift
|
|
52
|
+
let sortedItems = items.sorted(by: sortRule)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Inline filtering inside `ForEach`
|
|
56
|
+
|
|
57
|
+
```swift
|
|
58
|
+
ForEach(items.filter { $0.isEnabled }) { item in
|
|
59
|
+
Row(item)
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Prefer a prefiltered collection with stable identity.
|
|
64
|
+
|
|
65
|
+
### Unstable identity
|
|
66
|
+
|
|
67
|
+
```swift
|
|
68
|
+
ForEach(items, id: \.self) { item in
|
|
69
|
+
Row(item)
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Avoid `id: \.self` for non-stable values or collections that reorder. Use a stable domain identifier.
|
|
74
|
+
|
|
75
|
+
### Top-level conditional view swapping
|
|
76
|
+
|
|
77
|
+
```swift
|
|
78
|
+
var content: some View {
|
|
79
|
+
if isEditing {
|
|
80
|
+
editingView
|
|
81
|
+
} else {
|
|
82
|
+
readOnlyView
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Prefer one stable base view and localize conditions to sections or modifiers. This reduces root identity churn and makes diffing cheaper.
|
|
88
|
+
|
|
89
|
+
### Image decoding on the main thread
|
|
90
|
+
|
|
91
|
+
```swift
|
|
92
|
+
Image(uiImage: UIImage(data: data)!)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Prefer decode and downsample work off the main thread, then store the processed image.
|
|
96
|
+
|
|
97
|
+
## Observation fan-out
|
|
98
|
+
|
|
99
|
+
### Broad `@Observable` reads on iOS 17+
|
|
100
|
+
|
|
101
|
+
```swift
|
|
102
|
+
@Observable final class Model {
|
|
103
|
+
var items: [Item] = []
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
var body: some View {
|
|
107
|
+
Row(isFavorite: model.items.contains(item))
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
If many views read the same broad collection or root model, small changes can fan out into wide invalidation. Prefer narrower derived inputs, smaller observable surfaces, or per-item state closer to the leaf views.
|
|
112
|
+
|
|
113
|
+
### Broad `ObservableObject` reads on iOS 16 and earlier
|
|
114
|
+
|
|
115
|
+
```swift
|
|
116
|
+
final class Model: ObservableObject {
|
|
117
|
+
@Published var items: [Item] = []
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The same warning applies to legacy observation. Avoid having many descendants observe a large shared object when they only need one derived field.
|
|
122
|
+
|
|
123
|
+
## Remediation notes
|
|
124
|
+
|
|
125
|
+
### `@State` is not a generic cache
|
|
126
|
+
|
|
127
|
+
Use `@State` for view-owned state and derived values that intentionally belong to the view lifecycle. Do not move arbitrary expensive computation into `@State` unless you also define when and why it updates.
|
|
128
|
+
|
|
129
|
+
Better alternatives:
|
|
130
|
+
- precompute in the model or store
|
|
131
|
+
- update derived state in response to a specific input change
|
|
132
|
+
- memoize in a dedicated helper
|
|
133
|
+
- preprocess on a background task before rendering
|
|
134
|
+
|
|
135
|
+
### `equatable()` is conditional guidance
|
|
136
|
+
|
|
137
|
+
Use `equatable()` only when:
|
|
138
|
+
- equality is cheaper than recomputing the subtree, and
|
|
139
|
+
- the view inputs are value-semantic and stable enough for meaningful equality checks
|
|
140
|
+
|
|
141
|
+
Do not apply `equatable()` as a blanket fix for all redraws.
|
|
142
|
+
|
|
143
|
+
## Triage order
|
|
144
|
+
|
|
145
|
+
When multiple smells appear together, prioritize in this order:
|
|
146
|
+
1. Broad invalidation and observation fan-out
|
|
147
|
+
2. Unstable identity and list churn
|
|
148
|
+
3. Main-thread work during render
|
|
149
|
+
4. Image decode or resize cost
|
|
150
|
+
5. Layout and animation complexity
|
package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Demystify SwiftUI Performance (WWDC23) (Summary)
|
|
2
|
+
|
|
3
|
+
Context: WWDC23 session on building a mental model for SwiftUI performance and triaging hangs/hitches.
|
|
4
|
+
|
|
5
|
+
## Performance loop
|
|
6
|
+
|
|
7
|
+
- Measure -> Identify -> Optimize -> Re-measure.
|
|
8
|
+
- Focus on concrete symptoms (slow navigation, broken animations, spinning cursor).
|
|
9
|
+
|
|
10
|
+
## Dependencies and updates
|
|
11
|
+
|
|
12
|
+
- Views form a dependency graph; dynamic properties are a frequent source of updates.
|
|
13
|
+
- Use `Self._printChanges()` in debug only to inspect extra dependencies.
|
|
14
|
+
- Eliminate unnecessary dependencies by extracting views or narrowing state.
|
|
15
|
+
- Consider `@Observable` for more granular property tracking.
|
|
16
|
+
|
|
17
|
+
## Common causes of slow updates
|
|
18
|
+
|
|
19
|
+
- Expensive view bodies (string interpolation, filtering, formatting).
|
|
20
|
+
- Dynamic property instantiation and state initialization in `body`.
|
|
21
|
+
- Slow identity resolution in lists/tables.
|
|
22
|
+
- Hidden work: bundle lookups, heap allocations, repeated string construction.
|
|
23
|
+
|
|
24
|
+
## Avoid slow initialization in view bodies
|
|
25
|
+
|
|
26
|
+
- Don’t create heavy models synchronously in view bodies.
|
|
27
|
+
- Use `.task` to fetch async data and keep `init` lightweight.
|
|
28
|
+
|
|
29
|
+
## Lists and tables identity rules
|
|
30
|
+
|
|
31
|
+
- Stable identity is critical for performance and animation.
|
|
32
|
+
- Ensure a constant number of views per element in `ForEach`.
|
|
33
|
+
- Avoid inline filtering in `ForEach`; pre-filter and cache collections.
|
|
34
|
+
- Avoid `AnyView` in list rows; it hides identity and increases cost.
|
|
35
|
+
- Flatten nested `ForEach` when possible to reduce overhead.
|
|
36
|
+
|
|
37
|
+
## Table specifics
|
|
38
|
+
|
|
39
|
+
- `TableRow` resolves to a single row; row count must be constant.
|
|
40
|
+
- Prefer the streamlined `Table` initializer to enforce constant rows.
|
|
41
|
+
- Use explicit IDs for back deployment when needed.
|
|
42
|
+
|
|
43
|
+
## Debugging aids
|
|
44
|
+
|
|
45
|
+
- Use Instruments for hangs and hitches.
|
|
46
|
+
- Use `_printChanges` to validate dependency assumptions during debug.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Optimizing SwiftUI Performance with Instruments (Summary)
|
|
2
|
+
|
|
3
|
+
Context: WWDC session introducing the next-generation SwiftUI Instrument in Instruments 26 and how to diagnose SwiftUI-specific bottlenecks.
|
|
4
|
+
|
|
5
|
+
## Key takeaways
|
|
6
|
+
|
|
7
|
+
- Profile SwiftUI issues with the SwiftUI template (SwiftUI instrument + Time Profiler + Hangs/Hitches).
|
|
8
|
+
- Long view body updates are a common bottleneck; use "Long View Body Updates" to identify slow bodies.
|
|
9
|
+
- Set inspection range on a long update and correlate with Time Profiler to find expensive frames.
|
|
10
|
+
- Keep work out of `body`: move formatting, sorting, image decoding, and other expensive work into cached or precomputed paths.
|
|
11
|
+
- Use Cause & Effect Graph to diagnose *why* updates occur; SwiftUI is declarative, so backtraces are often unhelpful.
|
|
12
|
+
- Avoid broad dependencies that trigger many updates (e.g., `@Observable` arrays or global environment reads).
|
|
13
|
+
- Prefer granular view models and scoped state so only the affected view updates.
|
|
14
|
+
- Environment values update checks still cost time; avoid placing fast-changing values (timers, geometry) in environment.
|
|
15
|
+
- Profile early and often during feature development to catch regressions.
|
|
16
|
+
|
|
17
|
+
## Suggested workflow (condensed)
|
|
18
|
+
|
|
19
|
+
1. Record a trace in Release mode using the SwiftUI template.
|
|
20
|
+
2. Inspect "Long View Body Updates" and "Other Long Updates."
|
|
21
|
+
3. Zoom into a long update, then inspect Time Profiler for hot frames.
|
|
22
|
+
4. Fix slow body work by moving heavy logic into precomputed/cache paths.
|
|
23
|
+
5. Use Cause & Effect Graph to identify unintended update fan-out.
|
|
24
|
+
6. Re-record and compare the update counts and hitch frequency.
|
|
25
|
+
|
|
26
|
+
## Example patterns from the session
|
|
27
|
+
|
|
28
|
+
- Caching formatted distance strings in a location manager instead of computing in `body`.
|
|
29
|
+
- Replacing a dependency on a global favorites array with per-item view models to reduce update fan-out.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Profiling intake and collection checklist
|
|
2
|
+
|
|
3
|
+
## Intent
|
|
4
|
+
|
|
5
|
+
Use this checklist when code review alone cannot explain the SwiftUI performance issue and you need runtime evidence from the user.
|
|
6
|
+
|
|
7
|
+
## Ask for first
|
|
8
|
+
|
|
9
|
+
- Exact symptom: CPU spike, dropped frames, memory growth, hangs, or excessive view updates.
|
|
10
|
+
- Exact interaction: scrolling, typing, initial load, navigation push/pop, animation, sheet presentation, or background refresh.
|
|
11
|
+
- Target device and OS version.
|
|
12
|
+
- Whether the issue was reproduced on a real device or only in Simulator.
|
|
13
|
+
- Build configuration: Debug or Release.
|
|
14
|
+
- Whether the user already has a baseline or before/after comparison.
|
|
15
|
+
|
|
16
|
+
## Default profiling request
|
|
17
|
+
|
|
18
|
+
Ask the user to:
|
|
19
|
+
- Run the app in a Release build when possible.
|
|
20
|
+
- Use the SwiftUI Instruments template.
|
|
21
|
+
- Reproduce the exact problematic interaction only long enough to capture the issue.
|
|
22
|
+
- Capture the SwiftUI timeline and Time Profiler together.
|
|
23
|
+
- Export the trace or provide screenshots of the key SwiftUI lanes and the Time Profiler call tree.
|
|
24
|
+
|
|
25
|
+
## Ask for these artifacts
|
|
26
|
+
|
|
27
|
+
- Trace export or screenshots of the relevant SwiftUI lanes
|
|
28
|
+
- Time Profiler call tree screenshot or export
|
|
29
|
+
- Device/OS/build configuration
|
|
30
|
+
- A short note describing what action was happening at the time of the capture
|
|
31
|
+
- If memory is involved, the memory graph or Allocations data if available
|
|
32
|
+
|
|
33
|
+
## When to ask for more
|
|
34
|
+
|
|
35
|
+
- Ask for a second capture if the first run mixes multiple interactions.
|
|
36
|
+
- Ask for a before/after pair if the user has already tried a fix.
|
|
37
|
+
- Ask for a device capture if the issue only appears in Simulator or if scrolling smoothness matters.
|
|
38
|
+
|
|
39
|
+
## Common traps
|
|
40
|
+
|
|
41
|
+
- Debug builds can distort SwiftUI timing and allocation behavior.
|
|
42
|
+
- Simulator traces can miss device-only rendering or memory issues.
|
|
43
|
+
- Mixed interactions in one capture make attribution harder.
|
|
44
|
+
- Screenshots without the reproduction note are much harder to interpret.
|