@swiftbrowser/swift 0.1.0 → 0.2.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 +65 -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 +105 -7
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +93 -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 +3 -2
  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 +67 -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 +80 -10
  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 +11 -2
  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 +164 -37
  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 +96 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
  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 +10 -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 +498 -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 +39 -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
@@ -1,57 +1,15 @@
1
- /// Edit mode, `EditButton`, `ForEach.onDelete` / `onMove`, offset sets and
2
- /// `refreshable`. See docs/ops-protocol.md, "Phase 8: interaction".
1
+ /// Edit mode, `EditButton`, `ForEach.onDelete` / `onMove` and `refreshable`.
2
+ /// See docs/ops-protocol.md, "Phase 8: interaction".
3
3
 
4
- // MARK: - Offset sets
5
-
6
- /// A set of offsets into a collection, as `onDelete` / `onMove` report and
7
- /// `remove(atOffsets:)` / `move(fromOffsets:toOffset:)` consume. Foundation's
8
- /// `IndexSet` is not in FoundationEssentials, so the shim is generic over this
9
- /// protocol: `FoundationLite.IndexSet` conforms, and `_IndexSetLite` serves
10
- /// apps that import neither (it is what `onDelete` infers when nothing else
11
- /// pins the type).
12
- public protocol _OffsetSet {
13
- init(_offsets: [Int])
14
- /// The offsets in ascending order, without duplicates.
15
- var _offsets: [Int] { get }
16
- }
17
-
18
- /// A minimal `IndexSet`: sorted unique integers.
19
- public struct _IndexSetLite: _OffsetSet, Hashable, Sendable, Sequence, ExpressibleByArrayLiteral {
20
- public private(set) var _offsets: [Int]
21
-
22
- public init(_offsets: [Int]) {
23
- self._offsets = Array(Set(_offsets)).sorted()
24
- }
25
-
26
- public init() { _offsets = [] }
27
- public init(integer: Int) { _offsets = [integer] }
28
- public init<S: Sequence>(_ elements: S) where S.Element == Int { self.init(_offsets: Array(elements)) }
29
- public init(arrayLiteral elements: Int...) { self.init(_offsets: elements) }
30
- public init(integersIn range: Range<Int>) { _offsets = Array(range) }
31
-
32
- public var count: Int { _offsets.count }
33
- public var isEmpty: Bool { _offsets.isEmpty }
34
- public var first: Int? { _offsets.first }
35
- public var last: Int? { _offsets.last }
36
- public func contains(_ integer: Int) -> Bool { _offsets.contains(integer) }
37
-
38
- public mutating func insert(_ integer: Int) {
39
- guard !contains(integer) else { return }
40
- _offsets.append(integer)
41
- _offsets.sort()
42
- }
43
-
44
- public mutating func remove(_ integer: Int) {
45
- _offsets.removeAll { $0 == integer }
46
- }
4
+ import Foundation
47
5
 
48
- public func makeIterator() -> IndexingIterator<[Int]> { _offsets.makeIterator() }
49
- }
6
+ // MARK: - Offset sets
50
7
 
51
8
  extension RangeReplaceableCollection {
52
- /// Removes the elements at `offsets` (offsets from `startIndex`).
53
- public mutating func remove<O: _OffsetSet>(atOffsets offsets: O) {
54
- for offset in offsets._offsets.sorted(by: >) where offset >= 0 && offset < count {
9
+ /// Removes the elements at `offsets` (offsets from `startIndex`), as
10
+ /// SwiftUI's `onDelete` handlers do.
11
+ public mutating func remove(atOffsets offsets: IndexSet) {
12
+ for offset in offsets.sorted(by: >) where offset >= 0 && offset < count {
55
13
  remove(at: index(startIndex, offsetBy: offset))
56
14
  }
57
15
  }
@@ -60,8 +18,8 @@ extension RangeReplaceableCollection {
60
18
  extension MutableCollection where Self: RangeReplaceableCollection {
61
19
  /// Moves the elements at `source` so that they start at `destination`
62
20
  /// (an offset into the collection before the move), like Foundation's.
63
- public mutating func move<O: _OffsetSet>(fromOffsets source: O, toOffset destination: Int) {
64
- let offsets = source._offsets.filter { $0 >= 0 && $0 < count }
21
+ public mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
22
+ let offsets = source.filter { $0 >= 0 && $0 < count }
65
23
  guard !offsets.isEmpty else { return }
66
24
  let moving = offsets.map { self[index(startIndex, offsetBy: $0)] }
67
25
  let before = offsets.filter { $0 < destination }.count
@@ -86,7 +44,7 @@ extension ForEach: DynamicViewContent where Content: View {}
86
44
 
87
45
  /// A keyed group whose rows a `List` can delete (and, when the renderer learns
88
46
  /// to, move). The runtime wraps each row in a `listrow` with `deletable`.
89
- protocol _DeletableGroup {
47
+ protocol _DeletableGroup: _TraitBearing {
90
48
  /// Calls the group's `onDelete` with the row at `offset`; nil without one.
91
49
  var _delete: ((Int) -> Void)? { get }
92
50
  var _move: ((Int, Int) -> Void)? { get }
@@ -104,6 +62,7 @@ extension _EditableForEach: DynamicViewContent {
104
62
  extension _EditableForEach: _GroupView {
105
63
  var _children: [any View] { (base as? any _GroupView)?._children ?? [base] }
106
64
  var _keys: [AnyHashable]? { (base as? any _GroupView)?._keys }
65
+ var _spreads: Bool { (base as? any _GroupView)?._spreads ?? false }
107
66
  }
108
67
  extension _EditableForEach: _DeletableGroup {
109
68
  var _delete: ((Int) -> Void)? { delete }
@@ -113,46 +72,29 @@ extension _EditableForEach: _DeletableGroup {
113
72
  extension DynamicViewContent {
114
73
  /// Lets a `List` delete the rows: `action` receives the offsets of the
115
74
  /// removed elements in `data`. Pass `nil` to opt out.
116
- public func onDelete<O: _OffsetSet>(perform action: ((O) -> Void)?) -> _EditableForEach<Self> {
117
- _EditableForEach(base: self, delete: action.map { action in { action(O(_offsets: [$0])) } }, move: nil)
118
- }
119
-
120
- /// The offsets default to `_IndexSetLite` when nothing else pins the type.
121
- public func onDelete(perform action: ((_IndexSetLite) -> Void)?) -> _EditableForEach<Self> {
122
- _EditableForEach(base: self, delete: action.map { action in { action(_IndexSetLite(_offsets: [$0])) } }, move: nil)
75
+ public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Self> {
76
+ _EditableForEach(base: self, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: nil)
123
77
  }
124
78
 
125
79
  /// Accepted for source compatibility; the renderer offers no reordering yet.
126
- public func onMove<O: _OffsetSet>(perform action: ((O, Int) -> Void)?) -> _EditableForEach<Self> {
127
- _EditableForEach(base: self, delete: nil, move: action.map { action in { action(O(_offsets: [$0]), $1) } })
128
- }
129
-
130
- public func onMove(perform action: ((_IndexSetLite, Int) -> Void)?) -> _EditableForEach<Self> {
131
- _EditableForEach(base: self, delete: nil, move: action.map { action in { action(_IndexSetLite(_offsets: [$0]), $1) } })
80
+ public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Self> {
81
+ _EditableForEach(base: self, delete: nil, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
132
82
  }
133
83
  }
134
84
 
135
85
  extension _EditableForEach {
136
86
  /// `ForEach(...).onDelete(...).onMove(...)`: the second modifier merges into the first.
137
- public func onDelete<O: _OffsetSet>(perform action: ((O) -> Void)?) -> _EditableForEach<Base> {
138
- _EditableForEach(base: base, delete: action.map { action in { action(O(_offsets: [$0])) } }, move: move)
139
- }
140
-
141
- public func onDelete(perform action: ((_IndexSetLite) -> Void)?) -> _EditableForEach<Base> {
142
- _EditableForEach(base: base, delete: action.map { action in { action(_IndexSetLite(_offsets: [$0])) } }, move: move)
143
- }
144
-
145
- public func onMove<O: _OffsetSet>(perform action: ((O, Int) -> Void)?) -> _EditableForEach<Base> {
146
- _EditableForEach(base: base, delete: delete, move: action.map { action in { action(O(_offsets: [$0]), $1) } })
87
+ public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Base> {
88
+ _EditableForEach(base: base, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: move)
147
89
  }
148
90
 
149
- public func onMove(perform action: ((_IndexSetLite, Int) -> Void)?) -> _EditableForEach<Base> {
150
- _EditableForEach(base: base, delete: delete, move: action.map { action in { action(_IndexSetLite(_offsets: [$0]), $1) } })
91
+ public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Base> {
92
+ _EditableForEach(base: base, delete: delete, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
151
93
  }
152
94
  }
153
95
 
154
96
  /// `.deleteDisabled` / `.moveDisabled` on a row.
155
- protocol _RowEditingDisabling {
97
+ protocol _RowEditingDisabling: _TraitBearing {
156
98
  var _deleteDisabled: Bool { get }
157
99
  }
158
100
 
@@ -168,7 +110,7 @@ extension _DeleteDisabledView: _RowEditingDisabling {
168
110
  var _deleteDisabled: Bool { disabled }
169
111
  }
170
112
 
171
- extension View {
113
+ nonisolated extension View {
172
114
  public func deleteDisabled(_ isDisabled: Bool) -> some View {
173
115
  _DeleteDisabledView(content: self, disabled: isDisabled)
174
116
  }
@@ -228,10 +170,11 @@ extension EnvironmentValues {
228
170
  }
229
171
  }
230
172
 
231
- extension View {
173
+ nonisolated extension View {
232
174
  /// Pull to refresh on the `List` or `ScrollView` this modifies: the view
233
175
  /// shows a spinner (`refreshing`) while `action` runs.
234
- public func refreshable(action: @escaping @Sendable () async -> Void) -> some View {
176
+ /// The action runs in the caller's actor context, as `.task`'s does.
177
+ public func refreshable(@_inheritActorContext action: @escaping @Sendable () async -> Void) -> some View {
235
178
  environment(\._refreshAction, action)
236
179
  }
237
180
  }
@@ -59,7 +59,7 @@ extension Image {
59
59
  }
60
60
  }
61
61
 
62
- extension View {
62
+ nonisolated extension View {
63
63
  /// Translates the rendered view without affecting layout.
64
64
  public func offset(x: CGFloat = 0, y: CGFloat = 0) -> some View {
65
65
  _styled { $0.extras["offset"] = .object(["x": .number(x), "y": .number(y)]) }
@@ -175,6 +175,13 @@ extension View {
175
175
  _styled { $0.extras["tint"] = tint?._json ?? .null }
176
176
  }
177
177
 
178
+ /// A style as the tint. The page tints with a color: a gradient tints
179
+ /// with its first color, any other style with the accent color.
180
+ @_disfavoredOverload
181
+ public func tint<S: ShapeStyle>(_ tint: S?) -> some View {
182
+ _styled { $0.extras["tint"] = tint.map { _tintColor(of: $0._json) } ?? .null }
183
+ }
184
+
178
185
  public func imageScale(_ scale: Image.Scale) -> some View {
179
186
  _styled { $0.extras["imageScale"] = .string(scale.name) }
180
187
  }
@@ -186,6 +193,11 @@ extension View {
186
193
  _styled { $0.extras["badge"] = count == 0 ? .null : .string(String(count)) }
187
194
  }
188
195
 
196
+ public func badge(_ key: LocalizedStringKey?) -> some View {
197
+ _styled { $0.extras["badge"] = key.map { .string($0.key) } ?? .null }
198
+ }
199
+
200
+ @_disfavoredOverload
189
201
  public func badge<S: StringProtocol>(_ label: S?) -> some View {
190
202
  _styled { $0.extras["badge"] = label.map { .string(String($0)) } ?? .null }
191
203
  }
@@ -204,10 +216,14 @@ extension View {
204
216
  public func listItemTint(_ tint: Color?) -> some View { self }
205
217
  public func formStyle<S: FormStyle>(_ style: S) -> some View { self }
206
218
  public func headerProminence(_ prominence: Prominence) -> some View { self }
207
- public func containerShape<T: Shape>(_ shape: T) -> some View { self }
219
+ /// The shape of this container: what a `ContainerRelativeShape`, a
220
+ /// `.background(_:)` and a `.clipShape(.containerRelative)` below take
221
+ /// the corners of (its corner radius; a custom shape's are square).
222
+ public func containerShape<T: Shape>(_ shape: T) -> some View {
223
+ environment(\._containerShapeRadius, shape._cornerRadius)
224
+ }
208
225
  public func symbolVariant(_ variant: SymbolVariants) -> some View { self }
209
226
  public func symbolRenderingMode(_ mode: SymbolRenderingMode?) -> some View { self }
210
- public func blendMode(_ mode: BlendMode) -> some View { self }
211
227
  public func contentTransition(_ transition: ContentTransition) -> some View { self }
212
228
  public func textSelection<S: TextSelectability>(_ selectability: S) -> some View { self }
213
229
  public func toolbarRole(_ role: ToolbarRole) -> some View { self }
@@ -235,6 +251,52 @@ public enum BlendMode: Hashable, Sendable {
235
251
  case normal, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight,
236
252
  difference, exclusion, hue, saturation, color, luminosity, sourceAtop, destinationOver,
237
253
  destinationOut, plusDarker, plusLighter
254
+
255
+ /// The CSS `mix-blend-mode` (the Porter-Duff modes and `plusDarker`,
256
+ /// which CSS has no counterpart for, draw normally).
257
+ var _css: String {
258
+ switch self {
259
+ case .multiply: "multiply"
260
+ case .screen: "screen"
261
+ case .overlay: "overlay"
262
+ case .darken: "darken"
263
+ case .lighten: "lighten"
264
+ case .colorDodge: "color-dodge"
265
+ case .colorBurn: "color-burn"
266
+ case .softLight: "soft-light"
267
+ case .hardLight: "hard-light"
268
+ case .difference: "difference"
269
+ case .exclusion: "exclusion"
270
+ case .hue: "hue"
271
+ case .saturation: "saturation"
272
+ case .color: "color"
273
+ case .luminosity: "luminosity"
274
+ case .plusLighter: "plus-lighter"
275
+ case .normal, .sourceAtop, .destinationOver, .destinationOut, .plusDarker: "normal"
276
+ }
277
+ }
278
+ }
279
+
280
+ /// How `drawingGroup` renders (accepted for source compatibility).
281
+ public enum ColorRenderingMode: Hashable, Sendable {
282
+ case nonLinear, linear, extendedLinear
283
+ }
284
+
285
+ nonisolated extension View {
286
+ /// Draws the view in front of its siblings with a lower index (CSS
287
+ /// `z-index`); siblings with the same index draw in order.
288
+ public func zIndex(_ value: Double) -> some View {
289
+ _styled { $0.extras["zIndex"] = .number(value) }
290
+ }
291
+
292
+ /// Blends the view with what is behind it (CSS `mix-blend-mode`).
293
+ public func blendMode(_ mode: BlendMode) -> some View {
294
+ _styled { $0.extras["blendMode"] = .string(mode._css) }
295
+ }
296
+
297
+ /// Renders the view offscreen before showing it; the browser composites
298
+ /// it already, so it draws the same.
299
+ public func drawingGroup(opaque: Bool = false, colorMode: ColorRenderingMode = .nonLinear) -> some View { self }
238
300
  }
239
301
 
240
302
  public struct SafeAreaRegions: OptionSet, Sendable {
@@ -270,21 +332,57 @@ public enum ToolbarRole: Hashable, Sendable { case automatic, navigationStack, b
270
332
  /// `.onTapGesture`: a `tapgesture` element whose tap event runs the action.
271
333
  struct _TapGestureView<Content: View> {
272
334
  let content: Content
273
- let action: @MainActor () -> Void
335
+ let action: @MainActor (CGPoint) -> Void
336
+ /// The action takes the tap's location: the page sends it (`location`).
337
+ var wantsLocation = false
338
+
339
+ init(content: Content, action: @escaping @MainActor () -> Void) {
340
+ self.content = content
341
+ self.action = { _ in action() }
342
+ }
343
+
344
+ init(content: Content, locatedAction: @escaping @MainActor (CGPoint) -> Void) {
345
+ self.content = content
346
+ self.action = locatedAction
347
+ wantsLocation = true
348
+ }
274
349
  }
275
350
  extension _TapGestureView: _PrimitiveView {}
276
351
  extension _TapGestureView: _HostView {
277
352
  var _kind: String { "tapgesture" }
278
- func _props(in environment: EnvironmentValues) -> _JSON { .object([:]) }
353
+ func _props(in environment: EnvironmentValues) -> _JSON {
354
+ wantsLocation ? .object(["location": .bool(true)]) : .object([:])
355
+ }
279
356
  var _content: [any View] { [content] }
280
357
  var _handler: ((_JSON) -> Void)? {
281
358
  let action = self.action
282
- return { _ in MainActor.assumeIsolated { action() } }
359
+ return { payload in
360
+ var point = CGPoint.zero
361
+ if case .object(let fields) = payload, case .number(let x)? = fields["x"], case .number(let y)? = fields["y"] {
362
+ point = CGPoint(x: x, y: y)
363
+ }
364
+ MainActor.assumeIsolated { action(point) }
365
+ }
283
366
  }
284
367
  }
285
368
 
286
- extension View {
369
+ nonisolated extension View {
287
370
  public func onTapGesture(count: Int = 1, perform action: @escaping @MainActor () -> Void) -> some View {
288
371
  _TapGestureView(content: self, action: action)
289
372
  }
290
373
  }
374
+
375
+ /// The color a style tints with: a color as it is, a gradient's first color,
376
+ /// else the accent color.
377
+ func _tintColor(of style: _JSON) -> _JSON {
378
+ guard case .object(let fields) = style else { return .object(["name": .string("accent")]) }
379
+ if fields["r"] != nil || fields["name"] != nil || fields["named"] != nil { return style }
380
+ if let color = fields["colorGradient"] { return color }
381
+ for key in ["linearGradient", "radialGradient", "angularGradient", "ellipticalGradient"] {
382
+ if case .object(let gradient)? = fields[key], case .array(let stops)? = gradient["stops"],
383
+ case .object(let first)? = stops.first, let color = first["color"] {
384
+ return color
385
+ }
386
+ }
387
+ return .object(["name": .string("accent")])
388
+ }
@@ -0,0 +1,8 @@
1
+ // `@Entry`: declares an environment value in one line,
2
+ // `extension EnvironmentValues { @Entry var isCompact = false }`. The macro
3
+ // (Sources/SwiftDataMacros/EntryMacro.swift) writes the `EnvironmentKey` and
4
+ // the computed property over it, as Apple's does.
5
+
6
+ @attached(accessor)
7
+ @attached(peer, names: prefixed(__Key_))
8
+ public macro Entry() = #externalMacro(module: "SwiftDataMacros", type: "EntryMacro")
@@ -51,6 +51,12 @@ public enum UserInterfaceSizeClass: Hashable, Sendable {
51
51
  }
52
52
  }
53
53
 
54
+ /// The direction of the writing system: views read it to lay out or draw
55
+ /// differently for right-to-left languages.
56
+ public enum LayoutDirection: Hashable, CaseIterable, Sendable {
57
+ case leftToRight, rightToLeft
58
+ }
59
+
54
60
  /// A key for custom environment values.
55
61
  public protocol EnvironmentKey {
56
62
  associatedtype Value
@@ -60,24 +66,41 @@ public protocol EnvironmentKey {
60
66
  /// Dismisses the current presentation: in a navigation stack, pops the screen.
61
67
  public struct DismissAction: Sendable {
62
68
  let action: @MainActor () -> Void
63
-
64
- init(_ action: @escaping @MainActor () -> Void) { self.action = action }
69
+ /// What this action dismisses (a screen of a stack, a sheet), set by the
70
+ /// runtime, which re-creates the action on every pass: equal identities
71
+ /// make the environments of two passes the same (see `_Sameness`).
72
+ let identity: _RuntimeKey?
73
+
74
+ init(identity: _RuntimeKey? = nil, _ action: @escaping @MainActor () -> Void) {
75
+ self.identity = identity
76
+ self.action = action
77
+ }
65
78
 
66
79
  @MainActor public func callAsFunction() { action() }
67
80
  }
68
81
 
69
82
  /// Values propagated down the view tree.
70
83
  public struct EnvironmentValues {
71
- private var storage: [ObjectIdentifier: Any] = [:]
84
+ fileprivate var storage: [ObjectIdentifier: Any] = [:]
72
85
 
73
86
  public init() {}
74
87
 
88
+ /// Whether every stored value is the same as in `other` (`_Sameness`).
89
+ func _sameStorage(as other: EnvironmentValues) -> Bool {
90
+ guard storage.count == other.storage.count else { return false }
91
+ var budget = _Sameness.budget
92
+ for (key, value) in storage {
93
+ guard let otherValue = other.storage[key], _Sameness.same(value, otherValue, budget: &budget) else { return false }
94
+ }
95
+ return true
96
+ }
97
+
75
98
  public subscript<K: EnvironmentKey>(key: K.Type) -> K.Value {
76
99
  get {
77
100
  // An absent entry must fall back to the default even for optional
78
101
  // values: `nil as? Optional<V>` would succeed as `.some(nil)`.
79
- guard let stored = storage[ObjectIdentifier(key)] else { return K.defaultValue }
80
- return stored as? K.Value ?? K.defaultValue
102
+ guard let stored = storage[ObjectIdentifier(key)] else { return Self._default(of: key) }
103
+ return stored as? K.Value ?? Self._default(of: key)
81
104
  }
82
105
  set { storage[ObjectIdentifier(key)] = newValue }
83
106
  }
@@ -114,6 +137,30 @@ public struct EnvironmentValues {
114
137
  set { self[_VerticalSizeClassKey.self] = newValue }
115
138
  }
116
139
 
140
+ /// `.leftToRight`: the renderer lays out left to right, whatever the
141
+ /// locale. A view may set it (`.environment(\.layoutDirection, …)`) for
142
+ /// the views it contains, which read it; the layout does not mirror.
143
+ public var layoutDirection: LayoutDirection {
144
+ get { self[_LayoutDirectionKey.self] }
145
+ set { self[_LayoutDirectionKey.self] = newValue }
146
+ }
147
+
148
+ /// The font `.font(_:)` set above this view (a text style or a size;
149
+ /// `.fontWeight` and `.bold` leave it as is), nil for the default body font.
150
+ public var font: Font? {
151
+ get { self[_FontKey.self] }
152
+ set { self[_FontKey.self] = newValue }
153
+ }
154
+
155
+ /// Pixels per point: 3, the iPhone the page stands for (`UIScreen.main.scale`).
156
+ public var displayScale: CGFloat {
157
+ get { self[_DisplayScaleKey.self] }
158
+ set { self[_DisplayScaleKey.self] = newValue }
159
+ }
160
+
161
+ /// One pixel, in points.
162
+ public var pixelLength: CGFloat { 1 / displayScale }
163
+
117
164
  var _buttonStyle: String {
118
165
  get { self[_ButtonStyleKey.self] }
119
166
  set { self[_ButtonStyleKey.self] = newValue }
@@ -138,6 +185,15 @@ public struct EnvironmentValues {
138
185
  func _anyObject(_ type: Any.Type) -> Any? {
139
186
  storage[ObjectIdentifier(type)]
140
187
  }
188
+
189
+ /// Stores `object` under its dynamic type, for `@Environment(Type.self)` and `@EnvironmentObject`.
190
+ mutating func _setAnyObject(_ object: AnyObject) {
191
+ storage[ObjectIdentifier(type(of: object))] = object
192
+ }
193
+ }
194
+
195
+ extension EnvironmentValues: CustomStringConvertible {
196
+ public var description: String { "EnvironmentValues(\(storage.count) values)" }
141
197
  }
142
198
 
143
199
  /// Lets `@Environment(Type.self)` hand back nil for an optional type that was not supplied.
@@ -154,6 +210,9 @@ enum _IsEnabledKey: EnvironmentKey { static let defaultValue = true }
154
210
  enum _DynamicTypeSizeKey: EnvironmentKey { static let defaultValue = DynamicTypeSize.large }
155
211
  enum _HorizontalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .compact }
156
212
  enum _VerticalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .regular }
213
+ enum _LayoutDirectionKey: EnvironmentKey { static let defaultValue = LayoutDirection.leftToRight }
214
+ enum _FontKey: EnvironmentKey { static let defaultValue: Font? = nil }
215
+ enum _DisplayScaleKey: EnvironmentKey { static let defaultValue: CGFloat = 3 }
157
216
  enum _ButtonStyleKey: EnvironmentKey { static let defaultValue = "automatic" }
158
217
  enum _TextFieldStyleKey: EnvironmentKey { static let defaultValue = "plain" }
159
218
 
@@ -164,7 +223,17 @@ final class _EnvironmentBox {
164
223
  }
165
224
 
166
225
  /// Views expose their `Environment` properties to the runtime through this protocol.
167
- protocol _EnvironmentProperty {
226
+ protocol _EnvironmentProperty: _RuntimeProperty {
227
+ func _resolve(in environment: EnvironmentValues)
228
+ }
229
+
230
+ /// A property wrapper from another module (SwiftData's `@Query`) that reads
231
+ /// the environment of the view it belongs to: the runtime calls `_resolve`
232
+ /// before each run of the view's body, as for `@Environment`. Unlike
233
+ /// `@Environment`, such a property is part of the view's value when the
234
+ /// runtime decides whether a re-created view is unchanged (Phase 16), so a
235
+ /// parent passing a different query re-runs the view.
236
+ public protocol _EnvironmentReading: _RuntimeProperty {
168
237
  func _resolve(in environment: EnvironmentValues)
169
238
  }
170
239
 
@@ -216,7 +285,7 @@ extension Environment: _EnvironmentProperty {
216
285
 
217
286
  // MARK: - .environment(_:_:)
218
287
 
219
- protocol _EnvironmentModifying {
288
+ protocol _EnvironmentModifying: _TraitBearing {
220
289
  func _apply(to environment: inout EnvironmentValues)
221
290
  }
222
291
 
@@ -232,7 +301,7 @@ extension _EnvironmentView: _EnvironmentModifying {
232
301
  func _apply(to environment: inout EnvironmentValues) { apply(&environment) }
233
302
  }
234
303
 
235
- extension View {
304
+ nonisolated extension View {
236
305
  public func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View {
237
306
  _EnvironmentView(content: self) { $0[keyPath: keyPath] = value }
238
307
  }
@@ -268,7 +337,7 @@ extension View {
268
337
  }
269
338
 
270
339
  /// Read by the runtime, which tells the host; also sets the environment's scheme.
271
- protocol _PreferredColorSchemeModifying {
340
+ protocol _PreferredColorSchemeModifying: _TraitBearing {
272
341
  var _preferredColorScheme: ColorScheme? { get }
273
342
  }
274
343
 
@@ -353,3 +422,18 @@ extension DynamicTypeSize {
353
422
  return bodySize / 17
354
423
  }
355
424
  }
425
+
426
+ // MARK: - Keys bridged from UIKit traits
427
+
428
+ /// A key whose value, until a view sets it, comes from elsewhere: UIKit's
429
+ /// `UITraitBridgedEnvironmentKey` (iOS 17) reads it from the current traits.
430
+ public protocol _BridgedEnvironmentKey: EnvironmentKey {
431
+ static var _bridgedDefault: Any { get }
432
+ }
433
+
434
+ extension EnvironmentValues {
435
+ static func _default<K: EnvironmentKey>(of key: K.Type) -> K.Value {
436
+ if let bridged = key as? any _BridgedEnvironmentKey.Type, let value = bridged._bridgedDefault as? K.Value { return value }
437
+ return K.defaultValue
438
+ }
439
+ }
@@ -0,0 +1,6 @@
1
+ /// `Environment` is `Sendable` when its value is, as in SwiftUI, so a
2
+ /// `Sendable` style or modifier may declare `@Environment` properties
3
+ /// (ButtonKit's shake style reads `accessibilityReduceMotion`). The runtime
4
+ /// resolves the property into its box on the main actor before the body
5
+ /// runs, and only the body reads it.
6
+ extension Environment: @unchecked Sendable where Value: Sendable {}
@@ -72,7 +72,7 @@ extension EnvironmentValues {
72
72
  }
73
73
  }
74
74
 
75
- extension View {
75
+ nonisolated extension View {
76
76
  /// Binds the field's focus to a `@FocusState var isFocused: Bool`.
77
77
  public func focused(_ binding: FocusState<Bool>.Binding) -> some View {
78
78
  _EnvironmentView(content: self) {
@@ -80,6 +80,14 @@ extension View {
80
80
  }
81
81
  }
82
82
 
83
+ /// Binds a field's or text editor's focus to a plain binding: UIKit's
84
+ /// text views (`becomeFirstResponder`) drawn by a representable.
85
+ public func _focused(_ isFocused: Binding<Bool>) -> some View {
86
+ _EnvironmentView(content: self) {
87
+ $0._focus = _FocusRequest(isFocused: { isFocused.wrappedValue }, setFocused: { isFocused.wrappedValue = $0 })
88
+ }
89
+ }
90
+
83
91
  /// Binds the field's focus to one case of a `@FocusState var field: Field?`.
84
92
  public func focused<Value: Hashable>(_ binding: FocusState<Value?>.Binding, equals value: Value) -> some View {
85
93
  _EnvironmentView(content: self) {
@@ -110,7 +118,7 @@ public enum SubmitLabel: String, Hashable, Sendable {
110
118
  case done, go, send, join, route, search, `return`, next, `continue`
111
119
  }
112
120
 
113
- extension View {
121
+ nonisolated extension View {
114
122
  /// Runs `action` when a text field in this view submits (the Enter key).
115
123
  public func onSubmit(of triggers: SubmitTriggers = .text, _ action: @escaping () -> Void) -> some View {
116
124
  _EnvironmentView(content: self) { $0._onSubmit = action }
@@ -124,6 +132,6 @@ extension View {
124
132
  /// A host view whose event handler needs the environment (the focus and
125
133
  /// submit closures a text field inherits); checked by the runtime ahead of
126
134
  /// `_HostView._handler`.
127
- protocol _EnvironmentHandling {
135
+ protocol _EnvironmentHandling: _TraitBearing {
128
136
  func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)?
129
137
  }
@@ -70,7 +70,7 @@ extension EnvironmentValues {
70
70
  }
71
71
  }
72
72
 
73
- extension View {
73
+ nonisolated extension View {
74
74
  public func gaugeStyle<S: GaugeStyle>(_ style: S) -> some View {
75
75
  environment(\.gaugeStyle, (style as? any _NamedGaugeStyle)?._name ?? "automatic")
76
76
  }
@@ -209,6 +209,7 @@ extension ProgressView where Label == EmptyView, CurrentValueLabel == EmptyView
209
209
  }
210
210
 
211
211
  extension ProgressView where Label == Text, CurrentValueLabel == EmptyView {
212
+ @_disfavoredOverload
212
213
  public init<S: StringProtocol>(_ title: S) {
213
214
  fraction = nil
214
215
  label = Text(title)
@@ -272,7 +273,7 @@ extension ProgressViewStyle where Self == CircularProgressViewStyle {
272
273
  public static var circular: CircularProgressViewStyle { CircularProgressViewStyle() }
273
274
  }
274
275
 
275
- extension View {
276
+ nonisolated extension View {
276
277
  public func progressViewStyle<S: ProgressViewStyle>(_ style: S) -> some View { self }
277
278
  }
278
279