@swiftbrowser/swift 0.1.0 → 0.3.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.
Files changed (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +0 -4
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +68 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +125 -10
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +100 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +26 -10
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +71 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +88 -12
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +14 -4
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +168 -39
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +86 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +46 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +524 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +41 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -67,22 +67,38 @@ public struct AccessibilityChildBehavior: Hashable, Sendable {
67
67
  public static let combine = AccessibilityChildBehavior(name: "combine")
68
68
  }
69
69
 
70
- extension View {
71
- public func accessibilityLabel(_ label: Text) -> some View { self }
72
- public func accessibilityLabel<S: StringProtocol>(_ label: S) -> some View { self }
73
- public func accessibilityLabel(_ labelKey: LocalizedStringKey) -> some View { self }
70
+ nonisolated extension View {
71
+ /// The label is not drawn; headless event scripts can address the
72
+ /// element by it (`tap:"Wrong"`, docs/ops-protocol.md).
73
+ public func accessibilityLabel(_ label: Text) -> some View {
74
+ _AccessibilityView(content: self, mark: _AccessibilityMark(label: label.content))
75
+ }
76
+ @_disfavoredOverload
77
+ public func accessibilityLabel<S: StringProtocol>(_ label: S) -> some View {
78
+ _AccessibilityView(content: self, mark: _AccessibilityMark(label: String(label)))
79
+ }
80
+ public func accessibilityLabel(_ labelKey: LocalizedStringKey) -> some View {
81
+ _AccessibilityView(content: self, mark: _AccessibilityMark(label: labelKey.key))
82
+ }
83
+ /// Not drawn; headless event scripts can address the element by it
84
+ /// (`tap:@save`, docs/ops-protocol.md), as UI tests do on iOS.
85
+ public func accessibilityIdentifier(_ identifier: String) -> some View {
86
+ _AccessibilityView(content: self, mark: _AccessibilityMark(identifier: identifier))
87
+ }
74
88
  public func accessibilityHint(_ hint: Text) -> some View { self }
89
+ @_disfavoredOverload
75
90
  public func accessibilityHint<S: StringProtocol>(_ hint: S) -> some View { self }
76
91
  public func accessibilityHint(_ hintKey: LocalizedStringKey) -> some View { self }
77
92
  public func accessibilityValue(_ value: Text) -> some View { self }
93
+ @_disfavoredOverload
78
94
  public func accessibilityValue<S: StringProtocol>(_ value: S) -> some View { self }
79
95
  public func accessibilityValue(_ valueKey: LocalizedStringKey) -> some View { self }
80
96
  public func accessibilityHidden(_ hidden: Bool) -> some View { self }
81
97
  public func accessibilityAddTraits(_ traits: AccessibilityTraits) -> some View { self }
82
98
  public func accessibilityRemoveTraits(_ traits: AccessibilityTraits) -> some View { self }
83
- public func accessibilityIdentifier(_ identifier: String) -> some View { self }
84
99
  public func accessibilityElement(children: AccessibilityChildBehavior = .ignore) -> some View { self }
85
100
  public func accessibilitySortPriority(_ sortPriority: Double) -> some View { self }
101
+ public func accessibilityRespondsToUserInteraction(_ respondsToUserInteraction: Bool = true) -> some View { self }
86
102
  public func accessibilityInputLabels(_ inputLabels: [Text]) -> some View { self }
87
103
  public func accessibilityInputLabels<S: StringProtocol>(_ inputLabels: [S]) -> some View { self }
88
104
  public func accessibilityInputLabels(_ inputLabelKeys: [LocalizedStringKey]) -> some View { self }
@@ -124,9 +140,42 @@ public struct TextInputAutocapitalization: Hashable, Sendable {
124
140
  public static let characters = TextInputAutocapitalization(name: "characters")
125
141
  }
126
142
 
127
- extension View {
143
+ nonisolated extension View {
128
144
  public func keyboardType(_ type: UIKeyboardType) -> some View { self }
129
145
  public func textContentType(_ textContentType: UITextContentType?) -> some View { self }
130
146
  public func autocorrectionDisabled(_ disable: Bool = true) -> some View { self }
147
+ /// The deprecated spelling of `autocorrectionDisabled(_:)`.
148
+ public func disableAutocorrection(_ disable: Bool?) -> some View { self }
131
149
  public func textInputAutocapitalization(_ autocapitalization: TextInputAutocapitalization?) -> some View { self }
132
150
  }
151
+
152
+ // MARK: - Labels and identifiers kept for event scripts
153
+
154
+ /// An `accessibilityLabel` / `accessibilityIdentifier` carried by the
155
+ /// elements a view produces. It is not sent to the renderer: headless event
156
+ /// scripts resolve selectors against it (Sources/SwiftUI/Runtime/Replay.swift).
157
+ struct _AccessibilityMark: Equatable {
158
+ var label: String?
159
+ var identifier: String?
160
+
161
+ /// Fills what `self` lacks from an outer modifier's mark; the innermost wins.
162
+ func merged(with outer: _AccessibilityMark) -> _AccessibilityMark {
163
+ _AccessibilityMark(label: label ?? outer.label, identifier: identifier ?? outer.identifier)
164
+ }
165
+ }
166
+
167
+ protocol _AccessibilityProviding: _TraitBearing {
168
+ var _accessibility: _AccessibilityMark { get }
169
+ }
170
+
171
+ struct _AccessibilityView<Content: View> {
172
+ let content: Content
173
+ let mark: _AccessibilityMark
174
+ }
175
+ extension _AccessibilityView: _PrimitiveView {}
176
+ extension _AccessibilityView: _GroupView {
177
+ var _children: [any View] { [content] }
178
+ }
179
+ extension _AccessibilityView: _AccessibilityProviding {
180
+ var _accessibility: _AccessibilityMark { mark }
181
+ }
@@ -0,0 +1,33 @@
1
+ // More accessibility modifiers. The page has no assistive-technology bridge
2
+ // (see Accessibility.swift): a label still names the element for event
3
+ // scripts; actions, representations and the pre-iOS 14 `accessibility(…)`
4
+ // spellings of the other modifiers are accepted and change nothing.
5
+
6
+ public struct AccessibilityActionKind: Hashable, Sendable {
7
+ let name: String
8
+ public static let `default` = AccessibilityActionKind(name: "default")
9
+ public static let escape = AccessibilityActionKind(name: "escape")
10
+ public static let magicTap = AccessibilityActionKind(name: "magicTap")
11
+ public init(named name: Text) { self.name = name.content }
12
+ init(name: String) { self.name = name }
13
+ }
14
+
15
+ nonisolated extension View {
16
+ public func accessibilityRepresentation<V: View>(@ViewBuilder representation: () -> V) -> some View { self }
17
+
18
+ public func accessibilityAction(_ actionKind: AccessibilityActionKind = .default,
19
+ _ handler: @escaping () -> Void) -> some View { self }
20
+ public func accessibilityAction(named name: Text, _ handler: @escaping () -> Void) -> some View { self }
21
+ public func accessibilityAction(named nameKey: LocalizedStringKey, _ handler: @escaping () -> Void) -> some View { self }
22
+ @_disfavoredOverload
23
+ public func accessibilityAction<S: StringProtocol>(named name: S, _ handler: @escaping () -> Void) -> some View { self }
24
+
25
+ /// The pre-iOS 14 spellings.
26
+ public func accessibility(label: Text) -> some View { accessibilityLabel(label) }
27
+ public func accessibility(hint: Text) -> some View { self }
28
+ public func accessibility(value: Text) -> some View { self }
29
+ public func accessibility(hidden: Bool) -> some View { self }
30
+ public func accessibility(addTraits traits: AccessibilityTraits) -> some View { self }
31
+ public func accessibility(removeTraits traits: AccessibilityTraits) -> some View { self }
32
+ public func accessibility(identifier: String) -> some View { accessibilityIdentifier(identifier) }
33
+ }
@@ -0,0 +1,63 @@
1
+ /// `@AccessibilityFocusState` and `.accessibilityFocused`: where VoiceOver's
2
+ /// focus is. The page has no bridge to the browser's screen readers for the
3
+ /// app to move their focus, so the state is kept as the app sets it (a
4
+ /// `State`, like `@FocusState`'s) and moves nowhere on its own.
5
+ @propertyWrapper
6
+ public struct AccessibilityFocusState<Value: Hashable>: DynamicProperty {
7
+ let state: State<Value>
8
+
9
+ public init() where Value == Bool {
10
+ state = State(wrappedValue: false)
11
+ }
12
+
13
+ public init<T: Hashable>() where Value == T? {
14
+ state = State(wrappedValue: nil)
15
+ }
16
+
17
+ public init(for technologies: AccessibilityTechnologies) where Value == Bool {
18
+ state = State(wrappedValue: false)
19
+ }
20
+
21
+ public init<T: Hashable>(for technologies: AccessibilityTechnologies) where Value == T? {
22
+ state = State(wrappedValue: nil)
23
+ }
24
+
25
+ public var wrappedValue: Value {
26
+ get { state.wrappedValue }
27
+ nonmutating set { state.wrappedValue = newValue }
28
+ }
29
+
30
+ public var projectedValue: AccessibilityFocusState<Value>.Binding { Binding(state: state) }
31
+
32
+ /// `$focus`: what `.accessibilityFocused` takes.
33
+ @propertyWrapper
34
+ public struct Binding {
35
+ let state: State<Value>
36
+
37
+ public var wrappedValue: Value {
38
+ get { state.wrappedValue }
39
+ nonmutating set { state.wrappedValue = newValue }
40
+ }
41
+
42
+ public var projectedValue: AccessibilityFocusState<Value>.Binding { self }
43
+ }
44
+ }
45
+
46
+ extension AccessibilityFocusState: _StateProperty {
47
+ var _box: any _AnyStateBox { state.box }
48
+ }
49
+
50
+ /// The assistive technologies a focus state follows.
51
+ public struct AccessibilityTechnologies: OptionSet, Hashable, Sendable {
52
+ public let rawValue: Int
53
+ public init(rawValue: Int) { self.rawValue = rawValue }
54
+ public static let voiceOver = AccessibilityTechnologies(rawValue: 1 << 0)
55
+ public static let switchControl = AccessibilityTechnologies(rawValue: 1 << 1)
56
+ }
57
+
58
+ nonisolated extension View {
59
+ /// Accepted: no screen reader's focus is moved (see `AccessibilityFocusState`).
60
+ public func accessibilityFocused(_ binding: AccessibilityFocusState<Bool>.Binding) -> some View { self }
61
+ public func accessibilityFocused<Value: Hashable>(_ binding: AccessibilityFocusState<Value>.Binding,
62
+ equals value: Value) -> some View { self }
63
+ }
@@ -5,7 +5,7 @@
5
5
  /// a tap on the alert's own id dismisses without an action.
6
6
 
7
7
  /// Views that present an alert or a confirmation dialog.
8
- protocol _AlertPresenting {
8
+ protocol _AlertPresenting: _TraitBearing {
9
9
  var _isPresented: Binding<Bool> { get }
10
10
  var _base: any View { get }
11
11
  var _alertActions: any View { get }
@@ -0,0 +1,68 @@
1
+ // Custom alignments (`AlignmentID`) and `.alignmentGuide`. The page lays
2
+ // out stacks with the built-in guides only, so a custom alignment aligns like
3
+ // the built-in one its default value matches (an `AlignmentID` whose
4
+ // `defaultValue` is the height is `.bottom`).
5
+ //
6
+ // `.alignmentGuide(g) { d in … }` moves the view's guide `g`: where a stack,
7
+ // a `ZStack`, a frame or an overlay aligns the view by `g`, the view's guide
8
+ // value, not the default (0, half or all of its width or height), meets the
9
+ // container's. The page knows the view's size, Swift knows the closure: the
10
+ // closure is evaluated at three sizes and sent as `a + b·width + c·height`,
11
+ // which is exact for the guides apps write (`d[.trailing] + 4`,
12
+ // `d.height / 2`, `-10`) and a straight-line fit for any other. The list-row
13
+ // separator guides are accepted and change nothing.
14
+
15
+ public protocol AlignmentID {
16
+ static func defaultValue(in context: ViewDimensions) -> CGFloat
17
+ }
18
+
19
+ extension HorizontalAlignment {
20
+ /// The built-in guide `id`'s default value matches: leading at 0, trailing at the width, else center.
21
+ public init(_ id: AlignmentID.Type) {
22
+ switch id.defaultValue(in: ViewDimensions(width: 1, height: 1)) {
23
+ case 0: self = .leading
24
+ case 1: self = .trailing
25
+ default: self = .center
26
+ }
27
+ }
28
+
29
+ /// Where a list row's separator starts: accepted, the page draws full-width
30
+ /// separators. A guide of its own, which no stack or frame aligns by: as
31
+ /// `.leading`, Ice Cubes' `.alignmentGuide(.listRowSeparatorLeading) { _ in -100 }`
32
+ /// moved its embedded posts 100 points right in their leading `VStack`.
33
+ public static let listRowSeparatorLeading = HorizontalAlignment(name: "listRowSeparatorLeading")
34
+ public static let listRowSeparatorTrailing = HorizontalAlignment(name: "listRowSeparatorTrailing")
35
+ }
36
+
37
+ extension VerticalAlignment {
38
+ /// The built-in guide `id`'s default value matches: top at 0, bottom at the height, else center.
39
+ public init(_ id: AlignmentID.Type) {
40
+ switch id.defaultValue(in: ViewDimensions(width: 1, height: 1)) {
41
+ case 0: self = .top
42
+ case 1: self = .bottom
43
+ default: self = .center
44
+ }
45
+ }
46
+ }
47
+
48
+ nonisolated extension View {
49
+ /// Moves the view's horizontal guide `g` to `computeValue(dimensions)`.
50
+ public func alignmentGuide(_ g: HorizontalAlignment, computeValue: @escaping (ViewDimensions) -> CGFloat) -> some View {
51
+ _styled { $0.extras["alignmentGuide"] = _alignmentGuideJSON(axis: "horizontal", name: g.name, computeValue) }
52
+ }
53
+
54
+ /// Moves the view's vertical guide `g` to `computeValue(dimensions)`.
55
+ public func alignmentGuide(_ g: VerticalAlignment, computeValue: @escaping (ViewDimensions) -> CGFloat) -> some View {
56
+ _styled { $0.extras["alignmentGuide"] = _alignmentGuideJSON(axis: "vertical", name: g.name, computeValue) }
57
+ }
58
+ }
59
+
60
+ /// `{"axis", "name", "value": [a, b, c]}`: the guide is `a + b·width + c·height`,
61
+ /// fitted from the closure at sizes 0×0, 100×0 and 0×100.
62
+ func _alignmentGuideJSON(axis: String, name: String, _ computeValue: (ViewDimensions) -> CGFloat) -> _JSON {
63
+ let origin = computeValue(ViewDimensions(width: 0, height: 0))
64
+ let wide = computeValue(ViewDimensions(width: 100, height: 0))
65
+ let tall = computeValue(ViewDimensions(width: 0, height: 100))
66
+ let terms = [origin, (wide - origin) / 100, (tall - origin) / 100].map { $0.isFinite ? _round2($0 * 100) / 100 : 0 }
67
+ return .object(["axis": .string(axis), "name": .string(name), "value": .array(terms.map(_JSON.number))])
68
+ }
@@ -108,8 +108,9 @@ extension Binding {
108
108
  let setter = self.setter
109
109
  return Binding(get: getter) { value in
110
110
  // Bindings are written from the main actor (event handlers, bodies).
111
- MainActor.assumeIsolated { _Runtime.shared.beginTransaction(animation) }
111
+ let outer = MainActor.assumeIsolated { _Runtime.shared.beginTransaction(animation) }
112
112
  setter(value)
113
+ MainActor.assumeIsolated { _Runtime.shared.endTransaction(outer) }
113
114
  }
114
115
  }
115
116
  }
@@ -118,8 +119,23 @@ extension Binding {
118
119
  @MainActor
119
120
  public func withAnimation<Result>(_ animation: Animation? = .default,
120
121
  _ body: () throws -> Result) rethrows -> Result {
121
- _Runtime.shared.beginTransaction(animation)
122
- return try body()
122
+ try _Runtime.shared.runInTransaction(animation, body)
123
+ }
124
+
125
+ /// Runs `body` in `transaction`: its animation (none when it disables
126
+ /// animations) animates the view changes `body` causes.
127
+ @MainActor
128
+ public func withTransaction<Result>(_ transaction: Transaction, _ body: () throws -> Result) rethrows -> Result {
129
+ try _Runtime.shared.runInTransaction(transaction.disablesAnimations ? nil : transaction.animation, body)
130
+ }
131
+
132
+ /// `withTransaction` with one property of a fresh transaction set.
133
+ @MainActor
134
+ public func withTransaction<Result, Value>(_ keyPath: WritableKeyPath<Transaction, Value>, _ value: Value,
135
+ _ body: () throws -> Result) rethrows -> Result {
136
+ var transaction = Transaction()
137
+ transaction[keyPath: keyPath] = value
138
+ return try withTransaction(transaction, body)
123
139
  }
124
140
 
125
141
  // MARK: - Transitions
@@ -169,6 +185,11 @@ public struct AnyTransition: Sendable {
169
185
  AnyTransition(parts: [Part(kind: "scale", scale: scale)])
170
186
  }
171
187
 
188
+ /// iOS 17's spelling, `.scale(0.5)`.
189
+ public static func scale(_ scale: Double, anchor: UnitPoint = .center) -> AnyTransition {
190
+ AnyTransition(parts: [Part(kind: "scale", scale: scale)])
191
+ }
192
+
172
193
  /// Slides in from / out to the given offset (points).
173
194
  public static func offset(x: CGFloat = 0, y: CGFloat = 0) -> AnyTransition {
174
195
  AnyTransition(parts: [Part(kind: "offset", offset: CGSize(width: x, height: y))])
@@ -212,7 +233,7 @@ extension Edge {
212
233
  // MARK: - Modifiers
213
234
 
214
235
  /// Views whose subtree animates when `value` changes.
215
- protocol _AnimatedView {
236
+ protocol _AnimatedView: _TraitBearing {
216
237
  var _animation: Animation? { get }
217
238
  /// Whether the tracked value differs from a previously stored one.
218
239
  func _changed(since previous: Any?) -> Bool
@@ -240,7 +261,7 @@ extension _AnimationView: _AnimatedView {
240
261
  }
241
262
  }
242
263
 
243
- extension View {
264
+ nonisolated extension View {
244
265
  /// Animates changes to this view whenever `value` changes.
245
266
  public func animation<V: Equatable>(_ animation: Animation?, value: V) -> some View {
246
267
  _AnimationView(content: self, animation: animation, value: value)
@@ -251,3 +272,14 @@ extension View {
251
272
  _styled { $0.transition = transition }
252
273
  }
253
274
  }
275
+
276
+ // MARK: - Transaction
277
+
278
+ /// The context of a state change. Accepted where SwiftUI takes one
279
+ /// (`AsyncImage(url:transaction:content:)`); the renderer animates what
280
+ /// `withAnimation` asked for, so the value itself is not consulted.
281
+ public struct Transaction: Sendable {
282
+ public var animation: Animation?
283
+ public var disablesAnimations: Bool = false
284
+ public init(animation: Animation? = nil) { self.animation = animation }
285
+ }
@@ -9,7 +9,7 @@ extension Never: Scene {}
9
9
 
10
10
  /// Scenes the runtime can mount directly.
11
11
  protocol _RootScene {
12
- var _rootView: any View { get }
12
+ @MainActor var _rootView: any View { get }
13
13
  }
14
14
 
15
15
  @resultBuilder
@@ -39,6 +39,36 @@ extension WindowGroup: _RootScene {
39
39
  var _rootView: any View { content }
40
40
  }
41
41
 
42
+ /// A scene whose root view is wrapped in a view modifier: how another module
43
+ /// adds a scene modifier (SwiftData's `.modelContainer`) that applies to the
44
+ /// whole window's content.
45
+ public struct _RootModifiedScene<Content: Scene, Modifier: ViewModifier> {
46
+ let content: Content
47
+ let modifier: Modifier
48
+ }
49
+
50
+ extension _RootModifiedScene: Scene {
51
+ public typealias Body = Never
52
+ public var body: Never { fatalError("_RootModifiedScene is a primitive scene") }
53
+ }
54
+
55
+ extension _RootModifiedScene: _RootScene {
56
+ var _rootView: any View {
57
+ guard let root = content as? any _RootScene else {
58
+ fatalError("\(Content.self) is not a scene the runtime can present. Use WindowGroup.")
59
+ }
60
+ func wrap<V: View>(_ view: V) -> any View { view.modifier(modifier) }
61
+ return wrap(root._rootView)
62
+ }
63
+ }
64
+
65
+ extension Scene {
66
+ /// Applies `modifier` to the scene's root view.
67
+ public func _modifyingRootView<M: ViewModifier>(_ modifier: M) -> _RootModifiedScene<Self, M> {
68
+ _RootModifiedScene(content: self, modifier: modifier)
69
+ }
70
+ }
71
+
42
72
  /// The structure and behavior of an app. Mark the conforming type `@main`.
43
73
  @MainActor @preconcurrency
44
74
  public protocol App {
@@ -0,0 +1,35 @@
1
+ // A binding to a mutable collection is a collection of bindings to its
2
+ // elements, as in SwiftUI (iOS 15): `$items.isEmpty`, `$items.count` and
3
+ // `$items[0]` read and write through the binding to the whole collection.
4
+
5
+ extension Binding: Sequence where Value: MutableCollection {
6
+ public typealias Element = Binding<Value.Element>
7
+ public typealias Iterator = IndexingIterator<Binding<Value>>
8
+ public typealias SubSequence = Slice<Binding<Value>>
9
+ }
10
+
11
+ extension Binding: Collection where Value: MutableCollection {
12
+ public typealias Index = Value.Index
13
+ public typealias Indices = Value.Indices
14
+
15
+ public var startIndex: Value.Index { wrappedValue.startIndex }
16
+ public var endIndex: Value.Index { wrappedValue.endIndex }
17
+ public var indices: Value.Indices { wrappedValue.indices }
18
+
19
+ public func index(after i: Value.Index) -> Value.Index { wrappedValue.index(after: i) }
20
+
21
+ public func formIndex(after i: inout Value.Index) { wrappedValue.formIndex(after: &i) }
22
+
23
+ public subscript(position: Value.Index) -> Binding<Value.Element> {
24
+ let whole = self
25
+ return Binding<Value.Element>(get: { whole.wrappedValue[position] }, set: { whole.wrappedValue[position] = $0 })
26
+ }
27
+ }
28
+
29
+ extension Binding: BidirectionalCollection where Value: BidirectionalCollection, Value: MutableCollection {
30
+ public func index(before i: Value.Index) -> Value.Index { wrappedValue.index(before: i) }
31
+
32
+ public func formIndex(before i: inout Value.Index) { wrappedValue.formIndex(before: &i) }
33
+ }
34
+
35
+ extension Binding: RandomAccessCollection where Value: RandomAccessCollection, Value: MutableCollection {}
@@ -0,0 +1,27 @@
1
+ /// `ForEach($items) { $item in … }` (iOS 15): a row per element, each with a
2
+ /// binding to its element (`Binding(projectedValue:)`, in State.swift, lets
3
+ /// the closure take its parameter as `$item`). Plus the older
4
+ /// `Picker(selection:label:content:)`.
5
+
6
+ extension ForEach where Content: View {
7
+ /// A row per element of the bound collection, identified by its `id`.
8
+ public init<C: MutableCollection & RandomAccessCollection>(
9
+ _ data: Binding<C>, @ViewBuilder content: @escaping (Binding<C.Element>) -> Content
10
+ ) where Data == [Binding<C.Element>], C.Element: Identifiable, ID == C.Element.ID {
11
+ self.init(_data: data.map { $0 }, id: { $0.wrappedValue.id }, content: content)
12
+ }
13
+
14
+ /// A row per element of the bound collection, identified by `id`.
15
+ public init<C: MutableCollection & RandomAccessCollection>(
16
+ _ data: Binding<C>, id: KeyPath<C.Element, ID>, @ViewBuilder content: @escaping (Binding<C.Element>) -> Content
17
+ ) where Data == [Binding<C.Element>] {
18
+ self.init(_data: data.map { $0 }, id: { $0.wrappedValue[keyPath: id] }, content: content)
19
+ }
20
+ }
21
+
22
+ extension Picker {
23
+ /// The pre-iOS 16 form, with the label first.
24
+ public init(selection: Binding<SelectionValue>, label: Label, @ViewBuilder content: () -> Content) {
25
+ self.init(selection: selection, content: content, label: { label })
26
+ }
27
+ }