@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.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/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -1,264 +1,289 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: swiftui-navigation
|
|
3
|
-
description: "
|
|
3
|
+
description: "SwiftUI navigation: NavigationStack typed paths, routers, NavigationSplitView, sheets, TabView and Tab API, universal links, URL schemes, Handoff. Use when implementing or reviewing push or programmatic navigation, multi-column layouts, modal sheets, tab bars or deep linking."
|
|
4
4
|
metadata:
|
|
5
|
-
source:
|
|
5
|
+
source: multi-agent-pipeline
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# SwiftUI Navigation
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Examples target iOS 26 and Swift 6.3. Unless a line says otherwise, each
|
|
11
|
+
pattern also runs on iOS 17.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
Other skills own the neighbours: app architecture and state management are in
|
|
14
|
+
`swiftui-patterns`, stacks, grids and components in
|
|
15
|
+
`swiftui-layout-components`.
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
- [NavigationSplitView (Multi-Column)](#navigationsplitview-multi-column)
|
|
16
|
-
- [Sheet Presentation](#sheet-presentation)
|
|
17
|
-
- [Tab-Based Navigation](#tab-based-navigation)
|
|
18
|
-
- [Deep Links](#deep-links)
|
|
19
|
-
- [Common Mistakes](#common-mistakes)
|
|
20
|
-
- [Review Checklist](#review-checklist)
|
|
21
|
-
- [References](#references)
|
|
17
|
+
## NavigationStack
|
|
22
18
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
Bind `NavigationStack(path:)` to a `NavigationPath` (or a typed array) in state,
|
|
20
|
+
describe destinations with a `Hashable` enum or value type, and map each type
|
|
21
|
+
once with `.navigationDestination(for:)`.
|
|
26
22
|
|
|
27
23
|
```swift
|
|
28
|
-
struct
|
|
24
|
+
struct TrailListView: View {
|
|
29
25
|
@State private var path = NavigationPath()
|
|
26
|
+
let trails: [Trail]
|
|
30
27
|
|
|
31
28
|
var body: some View {
|
|
32
29
|
NavigationStack(path: $path) {
|
|
33
|
-
List(
|
|
34
|
-
NavigationLink(value:
|
|
35
|
-
|
|
30
|
+
List(trails) { trail in
|
|
31
|
+
NavigationLink(value: trail) {
|
|
32
|
+
TrailRow(trail: trail)
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
|
-
.navigationDestination(for:
|
|
39
|
-
|
|
35
|
+
.navigationDestination(for: Trail.self) { trail in
|
|
36
|
+
TrailDetailView(trail: trail)
|
|
40
37
|
}
|
|
41
|
-
.navigationTitle("
|
|
38
|
+
.navigationTitle("Trails")
|
|
42
39
|
}
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
42
|
```
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
```swift
|
|
50
|
-
path.append(item) // Push
|
|
51
|
-
path.removeLast() // Pop one
|
|
52
|
-
path = NavigationPath() // Pop to root
|
|
53
|
-
```
|
|
44
|
+
Driving the stack from code:
|
|
54
45
|
|
|
55
|
-
|
|
46
|
+
| Goal | Code |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| Push | `path.append(trail)` |
|
|
49
|
+
| Back one level | `path.removeLast()` |
|
|
50
|
+
| Back to root | `path = NavigationPath()` |
|
|
56
51
|
|
|
57
|
-
|
|
52
|
+
For anything bigger than one screen, move path and sheet state into a router
|
|
53
|
+
object. Give each tab its own router instance and hand it down with
|
|
54
|
+
`.environment()`. Keep the destination switch in one place: a single
|
|
55
|
+
`.navigationDestination(for:)` block or a shared modifier such as
|
|
56
|
+
`withAppRouter()`. The router, per-tab and centralised-mapping patterns are in
|
|
57
|
+
[references/navigationstack.md](references/navigationstack.md).
|
|
58
58
|
|
|
59
|
-
## NavigationSplitView
|
|
59
|
+
## NavigationSplitView
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
`NavigationSplitView` gives a sidebar and detail on iPad and Mac and collapses
|
|
62
|
+
into a push stack on iPhone.
|
|
62
63
|
|
|
63
64
|
```swift
|
|
64
|
-
struct
|
|
65
|
-
@State private var
|
|
65
|
+
struct LibraryView: View {
|
|
66
|
+
@State private var chosen: Album?
|
|
67
|
+
let albums: [Album]
|
|
66
68
|
|
|
67
69
|
var body: some View {
|
|
68
70
|
NavigationSplitView {
|
|
69
|
-
List(
|
|
70
|
-
NavigationLink(value:
|
|
71
|
+
List(albums, selection: $chosen) { album in
|
|
72
|
+
NavigationLink(album.title, value: album)
|
|
71
73
|
}
|
|
72
|
-
.navigationTitle("
|
|
74
|
+
.navigationTitle("Albums")
|
|
73
75
|
} detail: {
|
|
74
|
-
if let
|
|
75
|
-
|
|
76
|
+
if let chosen {
|
|
77
|
+
AlbumDetailView(album: chosen)
|
|
76
78
|
} else {
|
|
77
|
-
ContentUnavailableView("
|
|
79
|
+
ContentUnavailableView("No album selected", systemImage: "sidebar.leading")
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
```
|
|
83
85
|
|
|
84
|
-
###
|
|
86
|
+
### A hand-built second column
|
|
85
87
|
|
|
86
|
-
|
|
88
|
+
When the extra column does not follow the selection, for example an activity
|
|
89
|
+
feed that should sit beside whatever the main area shows, build the split
|
|
90
|
+
yourself with an `HStack(spacing: 0)`.
|
|
87
91
|
|
|
88
92
|
```swift
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
struct WorkspaceView: View {
|
|
94
|
+
@Environment(\.horizontalSizeClass) private var sizeClass
|
|
95
|
+
@AppStorage("showsActivityColumn") private var showsActivity = true
|
|
96
|
+
|
|
97
|
+
var body: some View {
|
|
98
|
+
HStack(spacing: 0) {
|
|
99
|
+
MainContentView()
|
|
100
|
+
if sizeClass == .regular && showsActivity {
|
|
101
|
+
Divider().ignoresSafeArea()
|
|
102
|
+
ActivityColumnView()
|
|
103
|
+
.environment(\.isSecondaryColumn, true)
|
|
104
|
+
.frame(maxWidth: 360)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
101
107
|
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
private var shouldShowSecondaryColumn: Bool {
|
|
105
|
-
horizontalSizeClass == .regular
|
|
106
|
-
&& showSecondaryColumn
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
private var primaryColumn: some View {
|
|
110
|
-
TabView { /* tabs */ }
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private var secondaryColumn: some View {
|
|
114
|
-
NotificationsTab()
|
|
115
|
-
.environment(\.isSecondaryColumn, true)
|
|
116
|
-
.frame(maxWidth: .secondaryColumnWidth)
|
|
117
|
-
}
|
|
118
108
|
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Use the manual HStack split when you need full control or a non-standard secondary column. Use `NavigationSplitView` when you want a standard system layout with minimal customization.
|
|
122
|
-
|
|
123
|
-
## Sheet Presentation
|
|
124
|
-
|
|
125
|
-
Prefer `.sheet(item:)` over `.sheet(isPresented:)` when state represents a selected model. Sheets should own their actions and call `dismiss()` internally.
|
|
126
109
|
|
|
127
|
-
|
|
128
|
-
@
|
|
129
|
-
|
|
130
|
-
.sheet(item: $selectedItem) { item in
|
|
131
|
-
EditItemSheet(item: item)
|
|
110
|
+
extension EnvironmentValues {
|
|
111
|
+
@Entry var isSecondaryColumn = false
|
|
132
112
|
}
|
|
133
113
|
```
|
|
134
114
|
|
|
135
|
-
|
|
115
|
+
The column only appears in a regular horizontal size class and when the user
|
|
116
|
+
has left the toggle on. Choose the manual layout when you need full control or
|
|
117
|
+
a column the system split view has no slot for; choose `NavigationSplitView`
|
|
118
|
+
when the standard sidebar-content-detail shape fits with small tweaks.
|
|
136
119
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
120
|
+
## Sheets
|
|
121
|
+
|
|
122
|
+
- When a sheet shows a particular model, use `.sheet(item:)`; keep
|
|
123
|
+
`.sheet(isPresented:)` for pure on/off states.
|
|
124
|
+
- A sheet owns its buttons and closes itself with `dismiss()`.
|
|
125
|
+
- `.presentationSizing(_:)` (iOS 18+) sets the size instead of fixed frames.
|
|
143
126
|
|
|
144
|
-
`PresentationSizing`
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
127
|
+
| `PresentationSizing` | Result |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| `.automatic` | Platform default |
|
|
130
|
+
| `.page` | Roughly paper-sized, for reading material |
|
|
131
|
+
| `.form` | Slightly narrower than `.page`, for data entry |
|
|
132
|
+
| `.fitted` | The content's ideal size |
|
|
149
133
|
|
|
150
|
-
|
|
134
|
+
`.fitted(horizontal:vertical:)` restricts fitting to the axes you pass, and
|
|
135
|
+
`.sticky(horizontal:vertical:)` lets a sheet grow along those axes but never
|
|
136
|
+
shrink back.
|
|
151
137
|
|
|
152
|
-
|
|
138
|
+
To stop a sheet with unsaved edits from being swiped away on iOS, use
|
|
139
|
+
`.interactiveDismissDisabled(hasEdits)` and confirm from your own Close button.
|
|
140
|
+
`.dismissalConfirmationDialog(_:shouldPresent:)` does this on macOS 15+ only;
|
|
141
|
+
the SDK marks it unavailable on iOS.
|
|
153
142
|
|
|
154
|
-
|
|
143
|
+
For larger apps, describe every modal as a case of an `Identifiable` enum held
|
|
144
|
+
on the router, and map the cases to views in one shared modifier. Any child can
|
|
145
|
+
then open a sheet by setting router state, with no bindings passed down. See
|
|
146
|
+
[references/sheets.md](references/sheets.md).
|
|
155
147
|
|
|
156
|
-
##
|
|
148
|
+
## Tabs
|
|
157
149
|
|
|
158
|
-
Use the `Tab`
|
|
150
|
+
Use the `Tab` type with a typed selection, and give every tab its own
|
|
151
|
+
`NavigationStack`.
|
|
159
152
|
|
|
160
153
|
```swift
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
enum HomeTab: Hashable { case today, explore, compose, profile }
|
|
155
|
+
|
|
156
|
+
struct RootTabs: View {
|
|
157
|
+
@State private var current: HomeTab = .today
|
|
158
|
+
@State private var composing = false
|
|
163
159
|
|
|
164
160
|
var body: some View {
|
|
165
|
-
TabView(selection:
|
|
166
|
-
Tab("
|
|
167
|
-
NavigationStack {
|
|
161
|
+
TabView(selection: Binding(get: { current }, set: select)) {
|
|
162
|
+
Tab("Today", systemImage: "sun.max", value: .today) {
|
|
163
|
+
NavigationStack { TodayView() }
|
|
164
|
+
}
|
|
165
|
+
Tab("Explore", systemImage: "map", value: .explore) {
|
|
166
|
+
NavigationStack { ExploreView() }
|
|
168
167
|
}
|
|
169
|
-
Tab("
|
|
170
|
-
|
|
168
|
+
Tab("New", systemImage: "plus.circle", value: .compose) {
|
|
169
|
+
Color.clear
|
|
171
170
|
}
|
|
172
|
-
Tab("
|
|
171
|
+
Tab("Me", systemImage: "person", value: .profile) {
|
|
173
172
|
NavigationStack { ProfileView() }
|
|
174
173
|
}
|
|
175
174
|
}
|
|
175
|
+
.sheet(isPresented: $composing) { ComposerView() }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private func select(_ next: HomeTab) {
|
|
179
|
+
if next == .compose {
|
|
180
|
+
composing = true
|
|
181
|
+
} else {
|
|
182
|
+
current = next
|
|
183
|
+
}
|
|
176
184
|
}
|
|
177
185
|
}
|
|
178
186
|
```
|
|
179
187
|
|
|
180
|
-
|
|
188
|
+
The custom binding sends every change through `select`, so a tab like
|
|
189
|
+
"New" can run an action instead of becoming the selected tab.
|
|
190
|
+
|
|
191
|
+
### iOS 26 additions
|
|
181
192
|
|
|
182
|
-
|
|
193
|
+
- `Tab(role: .search)` turns the tab bar into a search field while that tab is
|
|
194
|
+
active.
|
|
195
|
+
- `.tabBarMinimizeBehavior(_:)` with `.onScrollDown`, `.onScrollUp` or `.never`.
|
|
196
|
+
iPhone only.
|
|
197
|
+
- `.tabViewSidebarHeader { }` and `.tabViewSidebarFooter { }` customise the
|
|
198
|
+
sidebar on iPadOS and macOS.
|
|
199
|
+
- `.tabViewBottomAccessory { }` pins a view just above the tab bar, such as a
|
|
200
|
+
mini player.
|
|
201
|
+
- `TabSection` collects tabs under a sidebar heading; mark it with
|
|
202
|
+
`.tabPlacement(.sidebarOnly)` to keep it out of the compact bar.
|
|
183
203
|
|
|
184
|
-
|
|
185
|
-
- **`.tabBarMinimizeBehavior(_:)`** -- `.onScrollDown`, `.onScrollUp`, `.never` (iPhone only)
|
|
186
|
-
- **`.tabViewSidebarHeader/Footer`** -- customize sidebar sections on iPadOS/macOS
|
|
187
|
-
- **`.tabViewBottomAccessory { }`** -- attach content below the tab bar (e.g., Now Playing bar)
|
|
188
|
-
- **`TabSection`** -- group tabs into sidebar sections with `.tabPlacement(.sidebarOnly)`
|
|
204
|
+
More in [references/tabview.md](references/tabview.md).
|
|
189
205
|
|
|
190
|
-
|
|
206
|
+
## Deep links
|
|
191
207
|
|
|
192
|
-
|
|
208
|
+
### Universal links
|
|
193
209
|
|
|
194
|
-
|
|
210
|
+
A universal link is an ordinary HTTPS URL that opens the app when installed.
|
|
211
|
+
It needs two things:
|
|
195
212
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
2.
|
|
213
|
+
1. An `apple-app-site-association` file served from
|
|
214
|
+
`/.well-known/apple-app-site-association` on the domain.
|
|
215
|
+
2. The Associated Domains entitlement listing `applinks:example.com`.
|
|
199
216
|
|
|
200
|
-
Handle
|
|
217
|
+
Handle both entry points on the root content of the `WindowGroup`:
|
|
201
218
|
|
|
202
219
|
```swift
|
|
203
220
|
@main
|
|
204
|
-
struct
|
|
221
|
+
struct HikerApp: App {
|
|
205
222
|
@State private var router = Router()
|
|
206
223
|
|
|
207
224
|
var body: some Scene {
|
|
208
225
|
WindowGroup {
|
|
209
|
-
|
|
226
|
+
RootTabs()
|
|
210
227
|
.environment(router)
|
|
211
|
-
.onOpenURL {
|
|
228
|
+
.onOpenURL { link in _ = router.handle(url: link) }
|
|
212
229
|
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
|
|
213
|
-
|
|
214
|
-
|
|
230
|
+
if let link = activity.webpageURL {
|
|
231
|
+
_ = router.handle(url: link)
|
|
232
|
+
}
|
|
215
233
|
}
|
|
216
234
|
}
|
|
217
235
|
}
|
|
218
236
|
}
|
|
219
237
|
```
|
|
220
238
|
|
|
221
|
-
### Custom URL
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
- [ ]
|
|
239
|
+
### Custom URL schemes
|
|
240
|
+
|
|
241
|
+
List the scheme under `CFBundleURLTypes` in Info.plist and handle it in
|
|
242
|
+
`.onOpenURL`. For links people share publicly, prefer universal links: they
|
|
243
|
+
have a web fallback and the domain is verified.
|
|
244
|
+
|
|
245
|
+
### Handoff
|
|
246
|
+
|
|
247
|
+
Publish the current activity with `.userActivity()` and pick it up with
|
|
248
|
+
`.onContinueUserActivity()`. Every activity type must appear in the Info.plist
|
|
249
|
+
`NSUserActivityTypes` array. Set `isEligibleForHandoff = true` and supply a
|
|
250
|
+
`webpageURL` for devices without the app.
|
|
251
|
+
|
|
252
|
+
Details, AASA format and scheme parsing: [references/deeplinks.md](references/deeplinks.md).
|
|
253
|
+
|
|
254
|
+
## Common mistakes
|
|
255
|
+
|
|
256
|
+
- Reaching for `NavigationView`. It is deprecated; use `NavigationStack` or
|
|
257
|
+
`NavigationSplitView`.
|
|
258
|
+
- Letting every tab share one `NavigationPath`. Each tab keeps its own history.
|
|
259
|
+
- Driving a model-backed sheet with `.sheet(isPresented:)` instead of
|
|
260
|
+
`.sheet(item:)`.
|
|
261
|
+
- Putting views in the path. The path holds small `Hashable` route values.
|
|
262
|
+
- Holding an `@Observable` router as a property of another `@Observable` object.
|
|
263
|
+
- Building tabs with the older `.tabItem { }` instead of `Tab(value:)` with
|
|
264
|
+
`TabView(selection:)`.
|
|
265
|
+
- Expecting `tabBarMinimizeBehavior` to do anything on iPad. It is iPhone only.
|
|
266
|
+
- Parsing URLs in several views. The router is the one place that parses them.
|
|
267
|
+
- Giving sheets fixed frame sizes instead of `.presentationSizing(.form)`.
|
|
268
|
+
- Leaving `@MainActor` off the router class, which Swift 6 concurrency checking
|
|
269
|
+
needs.
|
|
270
|
+
|
|
271
|
+
## Review checklist
|
|
272
|
+
|
|
273
|
+
- [ ] `NavigationStack` everywhere, no `NavigationView`
|
|
274
|
+
- [ ] Each tab has its own `NavigationStack` and its own path
|
|
275
|
+
- [ ] The route enum is `Hashable` and its identifiers are stable
|
|
276
|
+
- [ ] `.navigationDestination(for:)` handles every route type that can be pushed
|
|
277
|
+
- [ ] `.sheet(item:)` is used for model-backed sheets
|
|
278
|
+
- [ ] Sheets handle their own dismissal
|
|
279
|
+
- [ ] The router is `@MainActor` and `@Observable`
|
|
280
|
+
- [ ] Incoming URLs are parsed and validated before any navigation happens
|
|
281
|
+
- [ ] Universal links have the AASA file and Associated Domains in place
|
|
282
|
+
- [ ] Tab selection uses `Tab(value:)` with a selection binding
|
|
256
283
|
|
|
257
284
|
## References
|
|
258
285
|
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
- Architecture and state management: see `swiftui-patterns` skill
|
|
264
|
-
- Layout and components: see `swiftui-layout-components` skill
|
|
286
|
+
- [references/navigationstack.md](references/navigationstack.md): routers, per-tab stacks, centralised destinations, data-driven tabs
|
|
287
|
+
- [references/sheets.md](references/sheets.md): enum sheet routing, sizing, dismissal confirmation
|
|
288
|
+
- [references/tabview.md](references/tabview.md): tab architecture, custom selection binding, dynamic tabs, iOS 26 tab API
|
|
289
|
+
- [references/deeplinks.md](references/deeplinks.md): router URL handling, universal links and AASA, custom schemes, Handoff
|