@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1

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.
Files changed (284) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +285 -285
  5. package/package.json +3 -3
  6. package/pipeline/lib/redact.mjs +3 -2
  7. package/pipeline/scripts/_notices.mjs +1 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +13 -1
  9. package/pipeline/scripts/pre-commit-check.sh +4 -0
  10. package/pipeline/skills/.skill-manifest.json +69 -69
  11. package/pipeline/skills/shared/README.md +70 -70
  12. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  13. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  14. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  15. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  16. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  17. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  18. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  19. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  20. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  21. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  22. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  23. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
  24. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  25. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
  26. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
  27. package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
  28. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  29. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  30. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  31. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
  32. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  34. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  35. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  37. package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
  38. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  39. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
  40. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  41. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  42. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  43. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  44. package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
  45. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  46. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
  47. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  48. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  49. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  50. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  51. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  52. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  53. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  54. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  55. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  56. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
  57. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  58. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  59. package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
  60. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  61. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  62. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  63. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  64. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  65. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  66. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  67. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  68. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  69. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  70. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  71. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  72. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  73. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  74. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  75. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  76. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  77. package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
  78. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  79. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  80. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  81. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  82. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  83. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  84. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  85. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  86. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  87. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  88. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  89. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  90. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  91. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  92. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  93. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  94. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  95. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  96. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  97. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  98. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  99. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  100. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  101. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  102. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  103. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  104. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  105. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  106. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  107. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  108. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  109. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  111. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  112. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  113. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  114. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
  115. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
  117. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
  118. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
  129. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
  130. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
  131. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  132. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  133. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  134. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  135. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  136. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  137. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  138. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  139. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  140. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  141. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  142. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  143. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  144. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  145. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  146. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  147. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  148. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  149. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  150. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  151. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  152. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  153. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  154. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  155. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  156. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  157. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  158. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  159. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  160. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  161. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  162. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  163. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  164. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  165. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  166. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  167. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  168. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  169. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  170. package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
  171. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  172. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  173. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  174. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  175. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  176. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  177. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
  178. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  179. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  180. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  181. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  182. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  183. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  184. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  185. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  186. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  187. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  188. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  189. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  190. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  191. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  192. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
  193. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  194. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  195. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  196. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  197. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  198. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  199. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  200. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  201. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  202. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  203. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  204. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  205. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  206. package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
  207. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  208. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  209. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
  210. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  211. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  212. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  213. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  214. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  215. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  216. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
  217. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  218. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  219. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  220. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
  221. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  222. package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
  223. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  224. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
  225. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  226. package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
  227. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  228. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  229. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  230. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  231. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  232. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  233. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  234. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  235. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  236. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  237. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  238. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  239. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  240. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  241. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  242. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  243. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  244. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  245. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  246. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  247. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  248. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  249. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  250. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  251. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
  252. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  253. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
  254. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  255. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
  256. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  257. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  258. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  259. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  260. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  261. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  262. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  263. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  264. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  265. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  266. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  267. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  268. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  269. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  270. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  271. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  272. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  273. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  274. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  275. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  276. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  277. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  278. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  279. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  280. package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
  281. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  282. package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
  283. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
  284. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,117 +1,147 @@
1
1
  # Media Accessibility
2
2
 
3
- Accessibility patterns for audio and video content using AVFoundation.
3
+ Back to [SKILL.md](../SKILL.md).
4
4
 
5
- ## Contents
5
+ How to make audio and video accessible with AVFoundation: tagging and choosing
6
+ caption and audio-description tracks, following system settings, and building
7
+ player controls that assistive technologies can use.
6
8
 
7
- - [Closed Captions and Subtitles](#closed-captions-and-subtitles)
8
- - [SwiftUI VideoPlayer](#swiftui-videoplayer)
9
- - [Custom Player Controls](#custom-player-controls)
9
+ ## Captions, SDH and subtitles
10
10
 
11
- ## Closed Captions and Subtitles
11
+ AVFoundation marks accessibility-related tracks with media characteristics
12
+ (`AVMediaCharacteristic`,
13
+ https://developer.apple.com/documentation/avfoundation/avmediacharacteristic).
12
14
 
13
- ### AVMediaCharacteristic Tags
15
+ | Characteristic | Meaning |
16
+ |---|---|
17
+ | `.transcribesSpokenDialogForAccessibility` | Text of what is said, as captions or SDH, for viewers who are deaf or hard of hearing |
18
+ | `.describesMusicAndSoundForAccessibility` | The text track also covers music and sound effects, not just speech |
19
+ | `.describesVideoForAccessibility` | An audio track that narrates the picture for viewers who are blind or have low vision |
20
+ | `.easyToRead` | Captions written in simpler language, for cognitive accessibility |
21
+ | `.containsOnlyForcedSubtitles` | Only the forced lines, shown where the content's language differs from the device's |
22
+ | `.languageTranslation` | Subtitles translating speech into another language |
14
23
 
15
- AVFoundation uses media characteristics to identify accessibility tracks:
16
-
17
- Docs: [AVMediaCharacteristic](https://sosumi.ai/documentation/avfoundation/avmediacharacteristic)
18
-
19
- | Characteristic | Purpose |
20
- | -------------- | ------- |
21
- | `.transcribesSpokenDialogForAccessibility` | Captions/SDH - transcribes dialog for deaf or hard of hearing users |
22
- | `.describesMusicAndSoundForAccessibility` | Captions that include descriptions of music and sound effects |
23
- | `.describesVideoForAccessibility` | Audio descriptions - narrates visual content for blind or low-vision users |
24
- | `.easyToRead` | Simplified captions for cognitive accessibility |
25
- | `.containsOnlyForcedSubtitles` | Subtitles that display only when content differs from the device language |
26
- | `.languageTranslation` | Subtitles providing a language translation |
27
-
28
- ### Selecting Accessible Media
24
+ ## Picking an accessible caption track
29
25
 
30
26
  ```swift
31
27
  import AVFoundation
32
28
 
33
- let asset = AVURLAsset(url: videoURL)
34
- let group = try await asset.load(.mediaSelectionGroup(forMediaCharacteristic: .legible))
29
+ @MainActor
30
+ func makeCaptionedItem(for movieURL: URL) async throws -> AVPlayerItem {
31
+ let movie = AVURLAsset(url: movieURL)
32
+ let item = AVPlayerItem(asset: movie)
35
33
 
36
- if let group {
37
- // Find the closed caption option
38
- let ccOptions = AVMediaSelectionGroup.mediaSelectionOptions(
39
- from: group.options,
40
- with: .transcribesSpokenDialogForAccessibility
34
+ guard let legible = try await movie.loadMediaSelectionGroup(for: .legible) else {
35
+ return item
36
+ }
37
+ let sdhOptions = AVMediaSelectionGroup.mediaSelectionOptions(
38
+ from: legible.options,
39
+ withMediaCharacteristics: [.transcribesSpokenDialogForAccessibility]
41
40
  )
42
-
43
- if let ccOption = ccOptions.first {
44
- let playerItem = AVPlayerItem(asset: asset)
45
- playerItem.select(ccOption, in: group)
41
+ if let sdh = sdhOptions.first {
42
+ item.select(sdh, in: legible)
46
43
  }
44
+ return item
47
45
  }
48
46
  ```
49
47
 
50
- ### Audio Descriptions
48
+ `AVPlayerItem` is a main-actor class. Its `select(_:in:)` is exempt only when
49
+ the deployment target is iOS 16 or later, so the function is `@MainActor` to
50
+ build for older targets too.
51
51
 
52
- ```swift
53
- let adGroup = try await asset.load(.mediaSelectionGroup(forMediaCharacteristic: .audible))
52
+ ## Picking an audio description track
54
53
 
55
- if let adGroup {
56
- let adOptions = AVMediaSelectionGroup.mediaSelectionOptions(
57
- from: adGroup.options,
58
- with: .describesVideoForAccessibility
59
- )
54
+ Same approach on the audible group:
60
55
 
61
- if let adOption = adOptions.first {
62
- playerItem.select(adOption, in: adGroup)
56
+ ```swift
57
+ @MainActor
58
+ func enableAudioDescription(on item: AVPlayerItem, source: AVAsset) async throws {
59
+ guard let audible = try await source.loadMediaSelectionGroup(for: .audible) else { return }
60
+ let described = AVMediaSelectionGroup.mediaSelectionOptions(
61
+ from: audible.options,
62
+ withMediaCharacteristics: [.describesVideoForAccessibility]
63
+ )
64
+ if let track = described.first {
65
+ item.select(track, in: audible)
63
66
  }
64
67
  }
65
68
  ```
66
69
 
67
- ### System Accessibility Settings
70
+ ## Following the system settings
68
71
 
69
- AVPlayer automatically selects captioned/described tracks when the user
70
- enables these in Settings → Accessibility → Subtitles & Captioning. You don't
71
- need manual selection unless providing a custom media selection UI.
72
+ When a user turns on captions or audio descriptions in Settings >
73
+ Accessibility > Subtitles & Captioning, `AVPlayer` picks matching tracks on its
74
+ own. Select options by hand only when you build your own media-selection UI.
72
75
 
73
- Check user preferences:
76
+ To read the caption preference yourself:
74
77
 
75
78
  ```swift
76
79
  import MediaAccessibility
77
80
 
78
- let captioningEnabled = MACaptionAppearanceIsDisplayedAutomatically(.user)
81
+ let displayType = MACaptionAppearanceGetDisplayType(.user)
82
+ let captionsShowByDefault = displayType == .alwaysOn || displayType == .automatic
79
83
  ```
80
84
 
81
- ## SwiftUI VideoPlayer
85
+ UIKit apps can also check `UIAccessibility.isClosedCaptioningEnabled` and
86
+ observe `UIAccessibility.closedCaptioningStatusDidChangeNotification`.
82
87
 
83
- SwiftUI's `VideoPlayer` inherits AVPlayer's automatic accessibility track
84
- selection:
88
+ ## SwiftUI `VideoPlayer`
89
+
90
+ `VideoPlayer` from AVKit wraps `AVPlayer`, so it gets the same automatic track
91
+ selection.
85
92
 
86
93
  ```swift
87
94
  import AVKit
88
95
  import SwiftUI
89
96
 
90
- struct AccessibleVideoView: View {
91
- let player: AVPlayer
97
+ struct LessonPlayer: View {
98
+ let lessonPlayer: AVPlayer
99
+ let lessonTitle: String
92
100
 
93
101
  var body: some View {
94
- VideoPlayer(player: player)
95
- .accessibilityLabel("Training video")
96
- .accessibilityHint("Double-tap to play or pause")
102
+ VideoPlayer(player: lessonPlayer)
103
+ .accessibilityLabel("Video: \(lessonTitle)")
104
+ .accessibilityHint("Plays or pauses the lesson")
97
105
  }
98
106
  }
99
107
  ```
100
108
 
101
- ## Custom Player Controls
109
+ ## Custom player controls
102
110
 
103
- When building custom video controls, ensure:
111
+ A custom transport bar has to provide what the system player gives you for
112
+ free:
104
113
 
105
- - Play/pause, seek, and volume controls are all focusable and labeled
106
- - Current time and duration are announced on focus changes
107
- - Captions toggle is available and labeled
108
- - Progress slider uses `accessibilityValue` to announce time position
109
- - Controls remain visible/accessible when captions overlay is active
114
+ - play/pause, seek and volume are focusable and labelled;
115
+ - current time and duration are spoken when focus reaches them;
116
+ - a captions toggle exists and is labelled;
117
+ - the scrubber reports the time position through `accessibilityValue`;
118
+ - controls stay visible and reachable while captions are on screen.
110
119
 
111
120
  ```swift
112
- Button(action: toggleCaptions) {
113
- Image(systemName: captionsEnabled ? "captions.bubble.fill" : "captions.bubble")
121
+ struct CaptionsButton: View {
122
+ @Binding var captionsOn: Bool
123
+
124
+ var body: some View {
125
+ Button(action: { captionsOn.toggle() }) {
126
+ Image(systemName: "captions.bubble")
127
+ .symbolVariant(captionsOn ? .fill : .none)
128
+ }
129
+ .accessibilityLabel(captionsOn ? "Captions on" : "Captions off")
130
+ .accessibilityHint("Turns subtitles and captions on or off")
131
+ }
132
+ }
133
+
134
+ struct Scrubber: View {
135
+ @Binding var position: Double // seconds
136
+ let duration: Double
137
+
138
+ var body: some View {
139
+ Slider(value: $position, in: 0...duration)
140
+ .accessibilityLabel("Playback position")
141
+ .accessibilityValue(
142
+ "\(Duration.seconds(position).formatted(.time(pattern: .minuteSecond))) of "
143
+ + "\(Duration.seconds(duration).formatted(.time(pattern: .minuteSecond)))"
144
+ )
145
+ }
114
146
  }
115
- .accessibilityLabel(captionsEnabled ? "Captions on" : "Captions off")
116
- .accessibilityHint("Toggles closed captions")
117
147
  ```
@@ -1,141 +1,205 @@
1
1
  # App Store Accessibility Nutrition Labels
2
2
 
3
- App Store Connect lets you declare which accessibility features your app
4
- supports. These labels appear on the product page and help users find apps
5
- that support their needs before they download.
6
-
7
- Docs:
8
- - [Overview of Accessibility Nutrition Labels](https://developer.apple.com/help/app-store-connect/manage-app-accessibility/overview-of-accessibility-nutrition-labels)
9
- - [Manage Accessibility Nutrition Labels](https://developer.apple.com/help/app-store-connect/manage-app-accessibility/manage-accessibility-nutrition-labels)
10
-
11
- ## Contents
12
-
13
- - [Current Label Categories](#current-label-categories)
14
- - [Claim Rule](#claim-rule)
15
- - [Pass / Fail Criteria](#pass--fail-criteria)
16
- - [SwiftUI Audit Example](#swiftui-audit-example)
17
- - [Related Non-Label Accessibility Work](#related-non-label-accessibility-work)
18
-
19
- ## Current Label Categories
20
-
21
- Apple's current App Store Accessibility Nutrition Labels are:
22
-
23
- | Label | What It Means | Key Implementation |
24
- |-------|---------------|-------------------|
25
- | **VoiceOver** | Users can navigate, understand, and operate the app with VoiceOver | Concise labels, values, traits, logical order, alternatives for images/charts, accessible custom controls |
26
- | **Voice Control** | Users can navigate and operate the app with voice commands | Speakable visible/accessibility labels, `accessibilityInputLabels`, custom actions for hidden or gesture-only behavior |
27
- | **Larger Text** | Text can scale to at least 200% where supported | Dynamic Type or an equivalent in-app scaling control, layouts that avoid clipping and overlap |
28
- | **Dark Interface** | The app can keep common-task UI dark | System Dark Mode or an equivalent dark mode without bright flashes in common tasks |
29
- | **Differentiate Without Color Alone** | Color is not the only way to convey information | Text, shape, icon, position, or pattern alternatives for color-coded state and data |
30
- | **Sufficient Contrast** | Text, icons, controls, and state indicators have enough contrast | Semantic colors, high-contrast variants, Reduce Transparency handling, contrast checks in light and dark appearances |
31
- | **Reduced Motion** | Problematic motion can be reduced or replaced | Respect Reduce Motion; replace parallax, spinning, scaling, depth, and ongoing motion with fades or static states where appropriate |
32
- | **Captions** | Dialogue and relevant sounds are available as text for video or audio content | Captions, SDH, subtitles, or transcripts; detect and honor system caption settings |
33
- | **Audio Descriptions** | Visual time-based content has narrated descriptions | Audio description tracks or equivalent narration for video, cut scenes, and visual-only cues |
34
-
35
- Apple states these labels appear on Apple devices running iOS 26, iPadOS 26,
36
- macOS 26, tvOS 26, visionOS 26, and watchOS 26 or later. App Store Connect asks
37
- only for labels that apply to the device type.
38
-
39
- ## Claim Rule
40
-
41
- Only claim a label when users can complete all common tasks of the app using
42
- that feature. Build a task matrix per device and test the common workflows
43
- before answering in App Store Connect.
44
-
45
- Keep claims accurate over time and do not treat App Store accessibility answers
46
- as marketing claims. Apple notes that App Review may contact developers to
47
- update intentionally misleading or harmful accessibility labels.
48
-
49
- ## Pass / Fail Criteria
3
+ Back to [SKILL.md](../SKILL.md).
4
+
5
+ App Store Connect lets a developer state which accessibility features an app
6
+ supports, and the App Store shows those statements on the product page. A
7
+ person can then judge, before installing, whether the app will work with the
8
+ way they use their device.
9
+
10
+ Apple's help pages (App Store Connect Help, section "Manage app
11
+ accessibility"):
12
+
13
+ - Overview:
14
+ https://developer.apple.com/help/app-store-connect/manage-app-accessibility/overview-of-accessibility-nutrition-labels
15
+ - Managing the labels:
16
+ https://developer.apple.com/help/app-store-connect/manage-app-accessibility/manage-accessibility-nutrition-labels
17
+
18
+ ## The nine categories
19
+
20
+ There are nine labels today. Each one below says what a user can expect when
21
+ it is shown, and what the app has to do to earn it.
22
+
23
+ 1. **VoiceOver.** A blind user can find, understand and operate everything.
24
+ Needs: concise labels with values and traits, a sensible reading order,
25
+ descriptions or text equivalents for images and charts, custom controls
26
+ that behave like real ones.
27
+ 2. **Voice Control.** Everything can be done by speaking. Needs: labels a
28
+ person can pronounce, `accessibilityInputLabels` where the label is
29
+ unwieldy, and custom actions for anything hidden behind a gesture.
30
+ 3. **Larger Text.** Text can grow to 200% or more where the platform supports
31
+ it. Needs: Dynamic Type, or an in-app text size setting that does the same
32
+ job, without clipping or overlapping.
33
+ 4. **Dark Interface.** The screens used for common tasks can stay dark. Needs:
34
+ support for system Dark Mode or an equivalent in-app theme, and no white
35
+ flashes along the way.
36
+ 5. **Differentiate Without Color Alone.** No meaning is carried by color on
37
+ its own. Needs: a second cue such as a word, shape, icon, pattern or
38
+ position.
39
+ 6. **Sufficient Contrast.** Text, icons, controls and state markers are easy to
40
+ tell from their background. Needs: semantic colors, high-contrast variants,
41
+ handling for Reduce Transparency, checks in both light and dark
42
+ appearances.
43
+ 7. **Reduced Motion.** Motion that can cause discomfort can be switched off.
44
+ Needs: the Reduce Motion setting respected, with parallax, spinning,
45
+ scaling, depth effects and continuous animation replaced by fades or still
46
+ frames.
47
+ 8. **Captions.** Speech and meaningful sounds in video and audio are available
48
+ as text. Needs: captions, SDH, subtitles or transcripts, and respect for the
49
+ caption preferences set in the system.
50
+ 9. **Audio Descriptions.** What happens on screen in time-based media is also
51
+ narrated. Needs: an audio-description track, or narration that does the
52
+ same job, for videos, cut scenes and cues that are only visual.
53
+
54
+ Facts about where the labels appear:
55
+
56
+ - Devices running iOS 26, iPadOS 26, macOS 26, tvOS 26, visionOS 26 and
57
+ watchOS 26, or anything newer, display them.
58
+ - App Store Connect only asks about labels that apply to the device type in
59
+ question.
60
+
61
+ Watch the names. Older drafts and the Settings app use different words:
62
+
63
+ | Say this (label) | Not this |
64
+ |---|---|
65
+ | Captions | Closed Captions / SDH |
66
+ | Sufficient Contrast | Increase Contrast |
67
+ | Reduced Motion | Reduce Motion (that is the setting, not the label) |
68
+
69
+ ## Rules for claiming a label
70
+
71
+ - A label is claimed only if people can get through **every** common task in
72
+ the app with that feature.
73
+ - Write the common tasks down per device type, run each one with the feature
74
+ on, and only then fill in App Store Connect.
75
+ - Re-check the answers as the app changes. They describe the product; they
76
+ are not advertising.
77
+ - If a label is intentionally misleading or harmful, App Review may contact
78
+ the developer to have it corrected.
79
+
80
+ Two important features have no label of their own at the moment: Switch
81
+ Control and Full Keyboard Access. They remain part of the job, and their
82
+ guidance lives in [SKILL.md](../SKILL.md) and the
83
+ [code patterns](a11y-patterns.md).
84
+
85
+ ## What passes and what fails
50
86
 
51
87
  ### VoiceOver
52
88
 
53
- - Every interactive element has a concise, meaningful label.
54
- - Labels avoid control types and state words that VoiceOver already announces.
55
- - Images and charts provide useful descriptions or text alternatives.
56
- - Decorative images are hidden.
57
- - Custom controls expose role, value, action, and traversal order.
58
- - Dynamic content that matters is announced with the appropriate accessibility notification.
89
+ - Short, meaningful label on every control.
90
+ - No control type or state in the label when VoiceOver already announces it.
91
+ - Charts and informative images come with a description or a text version.
92
+ - Purely decorative imagery is hidden.
93
+ - Custom controls report their role, value and action, and sit in a sensible
94
+ place in the reading order.
95
+ - Changes that matter are announced with the matching accessibility
96
+ notification.
59
97
 
60
98
  ### Voice Control
61
99
 
62
- - Common tasks work using only voice commands.
63
- - Visible labels and Voice Control names match whenever practical.
64
- - `accessibilityInputLabels` provide short spoken alternatives for long labels.
65
- - "Show Names" and "Show Numbers" expose all interactive elements.
66
- - Swipes, long presses, hover-only controls, and hidden actions have a speech-only path, usually through custom accessibility actions.
100
+ - Each common task can be finished by voice with nothing else.
101
+ - On-screen wording and the spoken name agree wherever that is practical.
102
+ - Where a label is long, `accessibilityInputLabels` offers a short spoken
103
+ version.
104
+ - Every interactive element shows up under both the names overlay and the
105
+ numbers overlay.
106
+ - Anything that needs a swipe, a long press, a hover or is otherwise hidden
107
+ has a route by speech alone, normally a custom accessibility action.
67
108
 
68
109
  ### Larger Text
69
110
 
70
- - Text reaches at least 200% of the default size where the platform supports the label.
71
- - Main workflows avoid clipped, overlapped, or severely truncated text.
72
- - Layouts adapt at accessibility text sizes, often by switching from horizontal to vertical composition.
73
- - Meaningful icons or text-like graphics scale or have an equivalent perceivable alternative.
111
+ - Where the platform supports this label, text reaches 200% of its default
112
+ size or more.
113
+ - Core workflows show no clipped, colliding or badly cut-off text.
114
+ - At accessibility sizes, layouts reflow, commonly from side-by-side to
115
+ stacked.
116
+ - Icons and images that work like text either scale with it or have an
117
+ equivalent people can perceive.
74
118
 
75
119
  ### Dark Interface
76
120
 
77
- - Common-task screens remain dark when the user selects a dark appearance or the app's dark setting.
78
- - Bright loading flashes, interstitials, and modal surfaces are avoided.
79
- - Dark mode is tested together with sufficient contrast settings.
121
+ - With dark appearance chosen in the system or in the app, common-task
122
+ screens remain dark.
123
+ - No bright splash while loading, no light interstitials, no white modal
124
+ sheets.
125
+ - Try the dark theme again with the contrast settings switched on.
80
126
 
81
127
  ### Differentiate Without Color Alone
82
128
 
83
- - Status, validation, selection, chart series, and game/team state never rely on color alone.
84
- - Use text, symbols, shape, order, pattern, or direct labels in addition to color.
85
- - Test important workflows with grayscale or color filters to find hidden reliance on color.
129
+ - Chart series, selection, validation, status and game or team state all
130
+ have a cue besides color.
131
+ - That cue can be a word, a symbol, a shape, an ordering, a pattern or a
132
+ direct label.
133
+ - Run the important flows with a grayscale or color filter on; anything that
134
+ becomes ambiguous depends on color.
86
135
 
87
136
  ### Sufficient Contrast
88
137
 
89
- - Most text meets generally accepted contrast guidance, commonly 4.5:1 against its background.
90
- - Non-text state indicators and custom controls have sufficient contrast, commonly 3:1.
91
- - Test light mode, dark mode, Increase Contrast, Bold Text, and Reduce Transparency combinations.
92
- - Custom colors provide high-contrast variants when semantic system colors are not enough.
138
+ - Body text usually needs a ratio of at least 4.5:1 with its background.
139
+ - Custom controls and non-text indicators of state usually need at least 3:1.
140
+ - Check the combinations: light and dark appearance, each with Increase
141
+ Contrast, Bold Text and Reduce Transparency.
142
+ - When semantic system colors cannot cover a case, custom colors get their own
143
+ high-contrast variants.
93
144
 
94
145
  ### Reduced Motion
95
146
 
96
- - Disable or replace parallax, spinning, scaling, vortex, multi-axis, multi-speed, and depth-simulating motion when Reduce Motion is enabled.
97
- - Stop ongoing motion such as auto-advancing carousels or provide a user control to stop it.
98
- - Preserve meaning when replacing motion; use fades, highlights, or instant transitions for state changes.
147
+ - Under Reduce Motion, turn off or replace depth simulation, vortex and
148
+ spinning effects, scaling, parallax, and motion along several axes or at
149
+ several speeds.
150
+ - Anything that keeps moving by itself, such as an auto-advancing carousel,
151
+ either stops or gives the user a control to stop it.
152
+ - The replacement still communicates the same thing: a fade, a highlight or
153
+ an immediate change.
99
154
 
100
155
  ### Captions
101
156
 
102
- - Video dialogue and comprehension-relevant sound effects are captioned.
103
- - Captions are synchronized, readable, and identify speakers where needed.
104
- - Audio-only dialogue has a transcript when time-synchronized captions do not apply.
105
- - AVFoundation media uses appropriate characteristics such as `.transcribesSpokenDialogForAccessibility` and `.describesMusicAndSoundForAccessibility`.
157
+ - Dialogue in video, and sound effects needed to follow it, are captioned.
158
+ - Captions keep time with the audio, are easy to read and name the speaker
159
+ when that is not obvious.
160
+ - Where synced captions do not fit, audio-only dialogue comes with a
161
+ transcript.
162
+ - In AVFoundation the tracks carry `.transcribesSpokenDialogForAccessibility`
163
+ and `.describesMusicAndSoundForAccessibility`
164
+ (details in [media accessibility](media-accessibility.md)).
106
165
 
107
166
  ### Audio Descriptions
108
167
 
109
- - Visual-only story, instructions, scene changes, on-screen text, and important cues are narrated.
110
- - Descriptions fit natural pauses and do not obscure essential dialogue.
111
- - AVFoundation media uses `.describesVideoForAccessibility` for audio description options.
168
+ - The narration covers on-screen text, scene changes, instructions, story
169
+ beats that are only visible, and any other important visual cue.
170
+ - It is placed in natural gaps and never talks over dialogue people need.
171
+ - In AVFoundation the description tracks carry
172
+ `.describesVideoForAccessibility`.
112
173
 
113
- ## SwiftUI Audit Example
174
+ ## Auditing a SwiftUI screen
114
175
 
115
176
  ```swift
116
- struct ContentView: View {
117
- @Environment(\.accessibilityReduceMotion) private var reduceMotion
177
+ struct RecipeHeroView: View {
118
178
  @Environment(\.dynamicTypeSize) private var typeSize
179
+ @Environment(\.accessibilityReduceMotion) private var reduceMotion
180
+ @State private var isSaved = false
181
+ let recipe: Recipe
119
182
 
120
183
  var body: some View {
121
- VStack {
122
- Image("hero")
123
- .accessibilityLabel("Mountain landscape at sunset")
124
-
125
- Text("Welcome")
126
- .font(.title)
127
-
128
- Button("Get Started") { }
129
- .accessibilityHint("Opens the onboarding flow")
184
+ let stack = typeSize.isAccessibilitySize
185
+ ? AnyLayout(VStackLayout(alignment: .leading))
186
+ : AnyLayout(HStackLayout(alignment: .top))
187
+
188
+ stack {
189
+ Image(recipe.photoName)
190
+ .resizable()
191
+ .scaledToFit()
192
+ .accessibilityLabel(recipe.photoDescription) // VoiceOver
193
+ Text(recipe.title)
194
+ .font(.title) // Larger Text
195
+ Button(isSaved ? "Saved" : "Save recipe") { isSaved.toggle() }
196
+ .accessibilityHint("Adds this recipe to your cookbook")
130
197
  }
131
- .animation(reduceMotion ? nil : .spring(), value: showContent)
198
+ .scaleEffect(isSaved ? 1.02 : 1)
199
+ .animation(reduceMotion ? nil : .spring(), value: isSaved) // Reduced Motion
132
200
  }
133
201
  }
134
202
  ```
135
203
 
136
- ## Related Non-Label Accessibility Work
137
-
138
- Switch Control and Full Keyboard Access remain important app accessibility
139
- requirements, but they are not current App Store Accessibility Nutrition Label
140
- categories. Keep their implementation guidance in `SKILL.md` and
141
- `references/a11y-patterns.md`.
204
+ Each commented line maps to one label's pass criteria, and the layout switch
205
+ covers the "reflows at accessibility sizes" check.