@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
@@ -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,20 +216,41 @@ 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 }
214
- public func controlSize(_ size: ControlSize) -> some View { self }
230
+ /// The size of the controls inside; a bordered button's height follows it
231
+ /// (the page: `large` and `extraLarge` are taller).
232
+ public func controlSize(_ size: ControlSize) -> some View {
233
+ environment(\.controlSize, size)
234
+ }
215
235
  }
216
236
 
217
237
  public enum Prominence: Hashable, Sendable { case standard, increased }
218
238
 
219
- /// `.controlSize`: accepted for source compatibility; controls keep one size.
220
- public enum ControlSize: Hashable, CaseIterable, Sendable { case mini, small, regular, large, extraLarge }
239
+ /// `.controlSize`: bordered buttons take it (props `controlSize` when it is not
240
+ /// `regular`); other controls keep one size.
241
+ public enum ControlSize: Hashable, CaseIterable, Sendable {
242
+ case mini, small, regular, large, extraLarge
243
+
244
+ var _name: String {
245
+ switch self {
246
+ case .mini: "mini"
247
+ case .small: "small"
248
+ case .regular: "regular"
249
+ case .large: "large"
250
+ case .extraLarge: "extraLarge"
251
+ }
252
+ }
253
+ }
221
254
 
222
255
  public struct SymbolVariants: Hashable, Sendable {
223
256
  let name: String
@@ -235,6 +268,52 @@ public enum BlendMode: Hashable, Sendable {
235
268
  case normal, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight,
236
269
  difference, exclusion, hue, saturation, color, luminosity, sourceAtop, destinationOver,
237
270
  destinationOut, plusDarker, plusLighter
271
+
272
+ /// The CSS `mix-blend-mode` (the Porter-Duff modes and `plusDarker`,
273
+ /// which CSS has no counterpart for, draw normally).
274
+ var _css: String {
275
+ switch self {
276
+ case .multiply: "multiply"
277
+ case .screen: "screen"
278
+ case .overlay: "overlay"
279
+ case .darken: "darken"
280
+ case .lighten: "lighten"
281
+ case .colorDodge: "color-dodge"
282
+ case .colorBurn: "color-burn"
283
+ case .softLight: "soft-light"
284
+ case .hardLight: "hard-light"
285
+ case .difference: "difference"
286
+ case .exclusion: "exclusion"
287
+ case .hue: "hue"
288
+ case .saturation: "saturation"
289
+ case .color: "color"
290
+ case .luminosity: "luminosity"
291
+ case .plusLighter: "plus-lighter"
292
+ case .normal, .sourceAtop, .destinationOver, .destinationOut, .plusDarker: "normal"
293
+ }
294
+ }
295
+ }
296
+
297
+ /// How `drawingGroup` renders (accepted for source compatibility).
298
+ public enum ColorRenderingMode: Hashable, Sendable {
299
+ case nonLinear, linear, extendedLinear
300
+ }
301
+
302
+ nonisolated extension View {
303
+ /// Draws the view in front of its siblings with a lower index (CSS
304
+ /// `z-index`); siblings with the same index draw in order.
305
+ public func zIndex(_ value: Double) -> some View {
306
+ _styled { $0.extras["zIndex"] = .number(value) }
307
+ }
308
+
309
+ /// Blends the view with what is behind it (CSS `mix-blend-mode`).
310
+ public func blendMode(_ mode: BlendMode) -> some View {
311
+ _styled { $0.extras["blendMode"] = .string(mode._css) }
312
+ }
313
+
314
+ /// Renders the view offscreen before showing it; the browser composites
315
+ /// it already, so it draws the same.
316
+ public func drawingGroup(opaque: Bool = false, colorMode: ColorRenderingMode = .nonLinear) -> some View { self }
238
317
  }
239
318
 
240
319
  public struct SafeAreaRegions: OptionSet, Sendable {
@@ -270,21 +349,57 @@ public enum ToolbarRole: Hashable, Sendable { case automatic, navigationStack, b
270
349
  /// `.onTapGesture`: a `tapgesture` element whose tap event runs the action.
271
350
  struct _TapGestureView<Content: View> {
272
351
  let content: Content
273
- let action: @MainActor () -> Void
352
+ let action: @MainActor (CGPoint) -> Void
353
+ /// The action takes the tap's location: the page sends it (`location`).
354
+ var wantsLocation = false
355
+
356
+ init(content: Content, action: @escaping @MainActor () -> Void) {
357
+ self.content = content
358
+ self.action = { _ in action() }
359
+ }
360
+
361
+ init(content: Content, locatedAction: @escaping @MainActor (CGPoint) -> Void) {
362
+ self.content = content
363
+ self.action = locatedAction
364
+ wantsLocation = true
365
+ }
274
366
  }
275
367
  extension _TapGestureView: _PrimitiveView {}
276
368
  extension _TapGestureView: _HostView {
277
369
  var _kind: String { "tapgesture" }
278
- func _props(in environment: EnvironmentValues) -> _JSON { .object([:]) }
370
+ func _props(in environment: EnvironmentValues) -> _JSON {
371
+ wantsLocation ? .object(["location": .bool(true)]) : .object([:])
372
+ }
279
373
  var _content: [any View] { [content] }
280
374
  var _handler: ((_JSON) -> Void)? {
281
375
  let action = self.action
282
- return { _ in MainActor.assumeIsolated { action() } }
376
+ return { payload in
377
+ var point = CGPoint.zero
378
+ if case .object(let fields) = payload, case .number(let x)? = fields["x"], case .number(let y)? = fields["y"] {
379
+ point = CGPoint(x: x, y: y)
380
+ }
381
+ MainActor.assumeIsolated { action(point) }
382
+ }
283
383
  }
284
384
  }
285
385
 
286
- extension View {
386
+ nonisolated extension View {
287
387
  public func onTapGesture(count: Int = 1, perform action: @escaping @MainActor () -> Void) -> some View {
288
388
  _TapGestureView(content: self, action: action)
289
389
  }
290
390
  }
391
+
392
+ /// The color a style tints with: a color as it is, a gradient's first color,
393
+ /// else the accent color.
394
+ func _tintColor(of style: _JSON) -> _JSON {
395
+ guard case .object(let fields) = style else { return .object(["name": .string("accent")]) }
396
+ if fields["r"] != nil || fields["name"] != nil || fields["named"] != nil { return style }
397
+ if let color = fields["colorGradient"] { return color }
398
+ for key in ["linearGradient", "radialGradient", "angularGradient", "ellipticalGradient"] {
399
+ if case .object(let gradient)? = fields[key], case .array(let stops)? = gradient["stops"],
400
+ case .object(let first)? = stops.first, let color = first["color"] {
401
+ return color
402
+ }
403
+ }
404
+ return .object(["name": .string("accent")])
405
+ }
@@ -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,11 +137,41 @@ 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 }
120
167
  }
121
168
 
169
+ /// `.controlSize(_:)`; `regular` by default.
170
+ public var controlSize: ControlSize {
171
+ get { self[_ControlSizeKey.self] }
172
+ set { self[_ControlSizeKey.self] = newValue }
173
+ }
174
+
122
175
  var _textFieldStyle: String {
123
176
  get { self[_TextFieldStyleKey.self] }
124
177
  set { self[_TextFieldStyleKey.self] = newValue }
@@ -138,6 +191,15 @@ public struct EnvironmentValues {
138
191
  func _anyObject(_ type: Any.Type) -> Any? {
139
192
  storage[ObjectIdentifier(type)]
140
193
  }
194
+
195
+ /// Stores `object` under its dynamic type, for `@Environment(Type.self)` and `@EnvironmentObject`.
196
+ mutating func _setAnyObject(_ object: AnyObject) {
197
+ storage[ObjectIdentifier(type(of: object))] = object
198
+ }
199
+ }
200
+
201
+ extension EnvironmentValues: CustomStringConvertible {
202
+ public var description: String { "EnvironmentValues(\(storage.count) values)" }
141
203
  }
142
204
 
143
205
  /// Lets `@Environment(Type.self)` hand back nil for an optional type that was not supplied.
@@ -154,7 +216,11 @@ enum _IsEnabledKey: EnvironmentKey { static let defaultValue = true }
154
216
  enum _DynamicTypeSizeKey: EnvironmentKey { static let defaultValue = DynamicTypeSize.large }
155
217
  enum _HorizontalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .compact }
156
218
  enum _VerticalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .regular }
219
+ enum _LayoutDirectionKey: EnvironmentKey { static let defaultValue = LayoutDirection.leftToRight }
220
+ enum _FontKey: EnvironmentKey { static let defaultValue: Font? = nil }
221
+ enum _DisplayScaleKey: EnvironmentKey { static let defaultValue: CGFloat = 3 }
157
222
  enum _ButtonStyleKey: EnvironmentKey { static let defaultValue = "automatic" }
223
+ enum _ControlSizeKey: EnvironmentKey { static let defaultValue = ControlSize.regular }
158
224
  enum _TextFieldStyleKey: EnvironmentKey { static let defaultValue = "plain" }
159
225
 
160
226
  // MARK: - @Environment
@@ -164,7 +230,17 @@ final class _EnvironmentBox {
164
230
  }
165
231
 
166
232
  /// Views expose their `Environment` properties to the runtime through this protocol.
167
- protocol _EnvironmentProperty {
233
+ protocol _EnvironmentProperty: _RuntimeProperty {
234
+ func _resolve(in environment: EnvironmentValues)
235
+ }
236
+
237
+ /// A property wrapper from another module (SwiftData's `@Query`) that reads
238
+ /// the environment of the view it belongs to: the runtime calls `_resolve`
239
+ /// before each run of the view's body, as for `@Environment`. Unlike
240
+ /// `@Environment`, such a property is part of the view's value when the
241
+ /// runtime decides whether a re-created view is unchanged (Phase 16), so a
242
+ /// parent passing a different query re-runs the view.
243
+ public protocol _EnvironmentReading: _RuntimeProperty {
168
244
  func _resolve(in environment: EnvironmentValues)
169
245
  }
170
246
 
@@ -216,7 +292,7 @@ extension Environment: _EnvironmentProperty {
216
292
 
217
293
  // MARK: - .environment(_:_:)
218
294
 
219
- protocol _EnvironmentModifying {
295
+ protocol _EnvironmentModifying: _TraitBearing {
220
296
  func _apply(to environment: inout EnvironmentValues)
221
297
  }
222
298
 
@@ -232,7 +308,7 @@ extension _EnvironmentView: _EnvironmentModifying {
232
308
  func _apply(to environment: inout EnvironmentValues) { apply(&environment) }
233
309
  }
234
310
 
235
- extension View {
311
+ nonisolated extension View {
236
312
  public func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View {
237
313
  _EnvironmentView(content: self) { $0[keyPath: keyPath] = value }
238
314
  }
@@ -268,7 +344,7 @@ extension View {
268
344
  }
269
345
 
270
346
  /// Read by the runtime, which tells the host; also sets the environment's scheme.
271
- protocol _PreferredColorSchemeModifying {
347
+ protocol _PreferredColorSchemeModifying: _TraitBearing {
272
348
  var _preferredColorScheme: ColorScheme? { get }
273
349
  }
274
350
 
@@ -353,3 +429,18 @@ extension DynamicTypeSize {
353
429
  return bodySize / 17
354
430
  }
355
431
  }
432
+
433
+ // MARK: - Keys bridged from UIKit traits
434
+
435
+ /// A key whose value, until a view sets it, comes from elsewhere: UIKit's
436
+ /// `UITraitBridgedEnvironmentKey` (iOS 17) reads it from the current traits.
437
+ public protocol _BridgedEnvironmentKey: EnvironmentKey {
438
+ static var _bridgedDefault: Any { get }
439
+ }
440
+
441
+ extension EnvironmentValues {
442
+ static func _default<K: EnvironmentKey>(of key: K.Type) -> K.Value {
443
+ if let bridged = key as? any _BridgedEnvironmentKey.Type, let value = bridged._bridgedDefault as? K.Value { return value }
444
+ return K.defaultValue
445
+ }
446
+ }
@@ -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
  }