@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,90 +1,87 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Lists
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
List recipes for the `swiftui-layout-components` skill.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## When to use List
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
`List` is the default for long vertical runs of similar rows. `Section`
|
|
8
|
+
headers break the rows into groups.
|
|
8
9
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
- Apply `.scrollContentBackground(.hidden)` + a custom background when you need a themed surface.
|
|
15
|
-
- Use `.listRowInsets(...)` and `.listRowSeparator(.hidden)` to tune row spacing and separators.
|
|
16
|
-
- Use `.environment(\.defaultMinListRowHeight, ...)` to control dense list layouts.
|
|
10
|
+
- `.listStyle(.grouped)` suits discovery or search pages with several sections.
|
|
11
|
+
- `.environment(\.defaultMinListRowHeight, 1)` removes the minimum row height
|
|
12
|
+
for very dense layouts.
|
|
13
|
+
- Stable row ids keep insert and delete animations and scroll positioning
|
|
14
|
+
correct.
|
|
17
15
|
|
|
18
|
-
##
|
|
16
|
+
## Feed with scroll to top
|
|
19
17
|
|
|
20
18
|
```swift
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
19
|
+
struct ActivityFeed: View {
|
|
20
|
+
let events: [ActivityEvent]
|
|
21
|
+
@Environment(\.jumpToTop) private var jumpToTop
|
|
22
|
+
@State private var position = ScrollPosition(idType: ActivityEvent.ID.self)
|
|
23
|
+
|
|
24
|
+
var body: some View {
|
|
25
|
+
List {
|
|
26
|
+
ForEach(events) { event in
|
|
27
|
+
ActivityRow(event: event)
|
|
28
|
+
.id(event.id)
|
|
29
|
+
.listRowInsets(EdgeInsets(top: 10, leading: 16, bottom: 10, trailing: 16))
|
|
30
|
+
.listRowSeparator(.hidden)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
.listStyle(.plain)
|
|
34
|
+
.scrollPosition($position)
|
|
35
|
+
.onChange(of: jumpToTop) {
|
|
36
|
+
withAnimation { position.scrollTo(edge: .top) }
|
|
37
|
+
}
|
|
34
38
|
}
|
|
35
|
-
.listStyle(.plain)
|
|
36
|
-
.environment(\.defaultMinListRowHeight, 1)
|
|
37
|
-
.scrollPosition($scrollPosition)
|
|
38
|
-
.onChange(of: selectedTabScrollToTop) {
|
|
39
|
-
withAnimation {
|
|
40
|
-
scrollPosition.scrollTo(edge: .top)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
39
|
}
|
|
45
40
|
```
|
|
46
41
|
|
|
47
|
-
|
|
42
|
+
`jumpToTop` stands for any signal, such as a counter the tab bar bumps when
|
|
43
|
+
its tab is tapped again, passed down through a custom environment value.
|
|
44
|
+
|
|
45
|
+
## Settings list
|
|
48
46
|
|
|
49
47
|
```swift
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
48
|
+
struct PrivacySettings: View {
|
|
49
|
+
var body: some View {
|
|
50
|
+
List {
|
|
51
|
+
Section("Data") {
|
|
52
|
+
NavigationLink("Location", value: PrivacyPage.location)
|
|
53
|
+
NavigationLink("Contacts", value: PrivacyPage.contacts)
|
|
54
|
+
}
|
|
55
|
+
Section {
|
|
56
|
+
Button("Delete Account", role: .destructive) { confirmDeletion() }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
.listStyle(.insetGrouped)
|
|
61
60
|
}
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
|
|
62
|
+
private func confirmDeletion() {}
|
|
64
63
|
}
|
|
65
64
|
```
|
|
66
65
|
|
|
67
|
-
##
|
|
66
|
+
## Swipe actions on rows
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
Swipe actions are a `List` row feature; the full guide with an example is in
|
|
69
|
+
the parent skill under [Swipe actions](../SKILL.md#swipe-actions). Short version: put
|
|
70
|
+
`.swipeActions(edge:allowsFullSwipe:content:)` on the row inside `ForEach`,
|
|
71
|
+
use `role: .destructive` for delete, `.tint(_:)` for other actions, and
|
|
72
|
+
mirror the actions in a context menu.
|
|
73
73
|
|
|
74
|
-
## iOS 26
|
|
75
|
-
|
|
76
|
-
Apply edge effects to lists for modern scroll behavior:
|
|
74
|
+
## Edge effect (iOS 26)
|
|
77
75
|
|
|
78
76
|
```swift
|
|
79
|
-
List {
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
.scrollEdgeEffectStyle(.soft, for: .top)
|
|
77
|
+
List(items) { ItemRow(item: $0) }
|
|
78
|
+
.scrollEdgeEffectStyle(.soft, for: .top)
|
|
83
79
|
```
|
|
84
80
|
|
|
85
|
-
|
|
81
|
+
The full edge-effect API is covered in the
|
|
82
|
+
[scroll view reference](scrollview.md).
|
|
86
83
|
|
|
87
84
|
## Pitfalls
|
|
88
85
|
|
|
89
|
-
-
|
|
90
|
-
-
|
|
86
|
+
- Heavy custom layouts inside rows; switch to `ScrollView` with `LazyVStack`.
|
|
87
|
+
- A `ScrollView` nested in a `List` fights over gestures.
|
|
@@ -1,192 +1,152 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Scroll Views
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Scroll view guidance for the `swiftui-layout-components` skill.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- [Core patterns](#core-patterns)
|
|
7
|
-
- [Example: vertical custom feed](#example-vertical-custom-feed)
|
|
8
|
-
- [ScrollPosition capabilities](#scrollposition-capabilities)
|
|
9
|
-
- [Example: horizontal chips](#example-horizontal-chips)
|
|
10
|
-
- [Example: adaptive grid](#example-adaptive-grid)
|
|
11
|
-
- [Design choices to keep](#design-choices-to-keep)
|
|
12
|
-
- [iOS 26 Scroll Edge Effects](#ios-26-scroll-edge-effects)
|
|
13
|
-
- [Pitfalls](#pitfalls)
|
|
5
|
+
## When to use ScrollView
|
|
14
6
|
|
|
15
|
-
|
|
7
|
+
Pair `ScrollView` with `LazyVStack`, `LazyHStack` or `LazyVGrid` when you need
|
|
8
|
+
a custom layout, mixed content, or horizontal or grid scrolling.
|
|
16
9
|
|
|
17
|
-
|
|
10
|
+
- Chat and custom feeds: `ScrollView` + `LazyVStack`.
|
|
11
|
+
- Chips, tags, avatars, media strips: `ScrollView(.horizontal)` + `LazyHStack`.
|
|
12
|
+
- Grids: `LazyVGrid`, with adaptive columns as the first choice.
|
|
13
|
+
- Jumping to an item, to an edge or to a point: `ScrollPosition`.
|
|
14
|
+
- An input bar that stays above the keyboard: `safeAreaInset(edge:)`.
|
|
18
15
|
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
- Prefer `ScrollView` + `LazyVStack` for chat-like or custom feed layouts.
|
|
22
|
-
- Use `ScrollView(.horizontal)` + `LazyHStack` for chips, tags, avatars, and media strips.
|
|
23
|
-
- Use `LazyVGrid` for icon/media grids; prefer adaptive columns when possible.
|
|
24
|
-
- Use `ScrollPosition` for programmatic scrolling: scroll-to-id, scroll-to-edge, and point-based offsets.
|
|
25
|
-
- Use `safeAreaInset(edge:)` for input bars that should stick above the keyboard.
|
|
26
|
-
|
|
27
|
-
## Example: vertical custom feed
|
|
16
|
+
## Conversation screen
|
|
28
17
|
|
|
29
18
|
```swift
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
struct SupportChat: View {
|
|
20
|
+
let lines: [ChatLine]
|
|
21
|
+
@State private var draft = ""
|
|
22
|
+
@State private var position = ScrollPosition(edge: .bottom)
|
|
23
|
+
|
|
24
|
+
var body: some View {
|
|
25
|
+
ScrollView {
|
|
26
|
+
LazyVStack(alignment: .leading) {
|
|
27
|
+
ForEach(lines) { ChatLineView(line: $0) }
|
|
28
|
+
}
|
|
29
|
+
.scrollTargetLayout()
|
|
30
|
+
.padding(.horizontal)
|
|
39
31
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## ScrollPosition capabilities
|
|
56
|
-
|
|
57
|
-
`ScrollPosition` (iOS 18+) replaces `ScrollViewReader` for programmatic scrolling. It is declarative, supports bidirectional position tracking, and does not require a closure wrapper.
|
|
58
|
-
|
|
59
|
-
**Setup:** Declare state and attach to the scroll view. Apply `.scrollTargetLayout()` to the inner layout container so SwiftUI can track individual view identities.
|
|
60
|
-
|
|
61
|
-
```swift
|
|
62
|
-
@State private var scrollPosition = ScrollPosition(idType: Message.ID.self)
|
|
63
|
-
|
|
64
|
-
ScrollView {
|
|
65
|
-
LazyVStack {
|
|
66
|
-
ForEach(messages) { message in
|
|
67
|
-
MessageRow(message: message)
|
|
32
|
+
.scrollPosition($position)
|
|
33
|
+
.onChange(of: lines.last?.id) {
|
|
34
|
+
withAnimation { position.scrollTo(edge: .bottom) }
|
|
35
|
+
}
|
|
36
|
+
.safeAreaInset(edge: .bottom) {
|
|
37
|
+
HStack {
|
|
38
|
+
TextField("Reply", text: $draft)
|
|
39
|
+
Button("Send", systemImage: "paperplane.fill") { send() }
|
|
40
|
+
}
|
|
41
|
+
.padding()
|
|
42
|
+
.background(.bar)
|
|
68
43
|
}
|
|
69
44
|
}
|
|
70
|
-
|
|
45
|
+
|
|
46
|
+
private func send() {}
|
|
71
47
|
}
|
|
72
|
-
.scrollPosition($scrollPosition)
|
|
73
48
|
```
|
|
74
49
|
|
|
75
|
-
|
|
50
|
+
## ScrollPosition
|
|
76
51
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
52
|
+
`ScrollPosition` arrived in iOS 18 and takes over from `ScrollViewReader`. It
|
|
53
|
+
is a value you bind, it works in both directions, and there is no reader
|
|
54
|
+
closure to wrap your content in.
|
|
80
55
|
|
|
81
|
-
|
|
56
|
+
1. Store it: `@State private var position = ScrollPosition(idType: Track.ID.self)`.
|
|
57
|
+
2. Put `.scrollTargetLayout()` on the lazy stack so item identities are tracked.
|
|
58
|
+
3. Bind it on the scroll view: `.scrollPosition($position)`.
|
|
82
59
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
60
|
+
| Goal | Call |
|
|
61
|
+
|------|------|
|
|
62
|
+
| Scroll to an item | `position.scrollTo(id: track.id, anchor: .top)` |
|
|
63
|
+
| Scroll to an edge | `position.scrollTo(edge: .bottom)` |
|
|
64
|
+
| Read the item at the anchor | `position.viewID(type: Track.ID.self)` |
|
|
65
|
+
| Know the user moved it | `position.isPositionedByUser` |
|
|
88
66
|
|
|
89
67
|
```swift
|
|
90
|
-
|
|
91
|
-
|
|
68
|
+
.onChange(of: position.isPositionedByUser) { _, byUser in
|
|
69
|
+
showJumpToLatest = byUser
|
|
92
70
|
}
|
|
93
71
|
```
|
|
94
72
|
|
|
95
|
-
|
|
73
|
+
Keep ids stable; if they change, the position jumps. Wrap `scrollTo(id:)` in
|
|
74
|
+
`withAnimation` when the move should be visible.
|
|
96
75
|
|
|
97
|
-
|
|
98
|
-
.onChange(of: scrollPosition.isPositionedByUser) { _, byUser in
|
|
99
|
-
if byUser {
|
|
100
|
-
// User scrolled manually -- show "scroll to bottom" button
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## Example: horizontal chips
|
|
76
|
+
## More shapes
|
|
106
77
|
|
|
107
78
|
```swift
|
|
108
79
|
ScrollView(.horizontal, showsIndicators: false) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
ChipView(chip: chip)
|
|
80
|
+
LazyHStack(spacing: 8) {
|
|
81
|
+
ForEach(tags) { TagChip(tag: $0) }
|
|
112
82
|
}
|
|
113
|
-
|
|
83
|
+
.padding(.horizontal)
|
|
114
84
|
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Example: adaptive grid
|
|
118
|
-
|
|
119
|
-
```swift
|
|
120
|
-
let columns = [GridItem(.adaptive(minimum: 120))]
|
|
121
85
|
|
|
122
86
|
ScrollView {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
GridItemView(item: item)
|
|
87
|
+
LazyVGrid(columns: [GridItem(.adaptive(minimum: 120))]) {
|
|
88
|
+
ForEach(albums) { AlbumTile(album: $0) }
|
|
126
89
|
}
|
|
127
|
-
|
|
128
|
-
.padding()
|
|
90
|
+
.padding()
|
|
129
91
|
}
|
|
130
92
|
```
|
|
131
93
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
- Use `Lazy*` stacks when item counts are large or unknown.
|
|
135
|
-
- Use non-lazy stacks for small, fixed-size content to avoid lazy overhead.
|
|
136
|
-
- Keep IDs stable for `ScrollPosition` tracking; changing IDs causes position jumps.
|
|
137
|
-
- Prefer explicit animations (`withAnimation`) when scrolling to an ID.
|
|
94
|
+
Choose lazy stacks for large or unknown counts, plain stacks for small fixed
|
|
95
|
+
content where lazy bookkeeping is wasted.
|
|
138
96
|
|
|
139
|
-
##
|
|
97
|
+
## Scroll edge effects (iOS 26)
|
|
140
98
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
Configure the visual treatment at scroll view edges (iOS 26+):
|
|
99
|
+
`.scrollEdgeEffectStyle(_:for:)` sets the effect per edge:
|
|
144
100
|
|
|
145
101
|
```swift
|
|
146
|
-
ScrollView {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
.scrollEdgeEffectStyle(.soft, for: .top) // Soft fading edge at top
|
|
150
|
-
.scrollEdgeEffectStyle(.hard, for: .bottom) // Hard cutoff at bottom
|
|
102
|
+
ScrollView { ArticleBody() }
|
|
103
|
+
.scrollEdgeEffectStyle(.soft, for: .top)
|
|
104
|
+
.scrollEdgeEffectStyle(.hard, for: .bottom)
|
|
151
105
|
```
|
|
152
106
|
|
|
153
|
-
`ScrollEdgeEffectStyle`
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
107
|
+
| `ScrollEdgeEffectStyle` | Look |
|
|
108
|
+
|-------------------------|------|
|
|
109
|
+
| `.automatic` | Platform default |
|
|
110
|
+
| `.soft` | Content fades out at the edge |
|
|
111
|
+
| `.hard` | Sharp cutoff with a dividing line |
|
|
157
112
|
|
|
158
|
-
|
|
113
|
+
`.scrollEdgeEffectHidden(true, for: .top)` removes the effect on that edge.
|
|
114
|
+
Apply these modifiers to the scroll view itself, not to views inside it.
|
|
159
115
|
|
|
160
|
-
###
|
|
116
|
+
### Background extension
|
|
161
117
|
|
|
162
|
-
|
|
118
|
+
`.backgroundExtensionEffect()` (iOS 26) copies a view, mirrors it and blurs it
|
|
119
|
+
into the area behind safe-area edges, for example a hero image under the
|
|
120
|
+
sidebar of a split view:
|
|
163
121
|
|
|
164
122
|
```swift
|
|
165
123
|
NavigationSplitView {
|
|
166
|
-
|
|
124
|
+
SidebarList()
|
|
167
125
|
} detail: {
|
|
168
|
-
|
|
126
|
+
Image("coastline")
|
|
127
|
+
.resizable()
|
|
128
|
+
.aspectRatio(contentMode: .fill)
|
|
169
129
|
.backgroundExtensionEffect()
|
|
170
130
|
}
|
|
171
131
|
```
|
|
172
132
|
|
|
173
|
-
|
|
133
|
+
Apple advises a single instance per screen for clarity and performance. The
|
|
134
|
+
modifier clips the view so the mirrored copies do not overlap it.
|
|
174
135
|
|
|
175
|
-
###
|
|
136
|
+
### Safe area bars
|
|
176
137
|
|
|
177
|
-
|
|
138
|
+
`.safeAreaBar(edge:)` (iOS 26) attaches a bar that takes part in the scroll
|
|
139
|
+
edge effect, unlike a plain inset:
|
|
178
140
|
|
|
179
141
|
```swift
|
|
180
|
-
|
|
181
|
-
.safeAreaBar(edge: .top) {
|
|
182
|
-
FilterBar()
|
|
183
|
-
}
|
|
142
|
+
ScrollView { ResultsGrid() }
|
|
143
|
+
.safeAreaBar(edge: .top) { FilterStrip() }
|
|
184
144
|
```
|
|
185
145
|
|
|
186
146
|
## Pitfalls
|
|
187
147
|
|
|
188
|
-
-
|
|
189
|
-
-
|
|
190
|
-
-
|
|
191
|
-
-
|
|
192
|
-
-
|
|
148
|
+
- Two scroll views on the same axis, one inside the other.
|
|
149
|
+
- `List` and `ScrollView` combined without a strong reason.
|
|
150
|
+
- `LazyVStack` for three rows: extra machinery for nothing.
|
|
151
|
+
- `scrollEdgeEffectStyle` placed on inner content instead of the scroll view.
|
|
152
|
+
- More than one `backgroundExtensionEffect()` on a screen.
|