@swiftbrowser/swift 0.0.0-stage → 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 (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  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 +61 -0
  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/FoundationBridge/Bundle.swift +119 -0
  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 +29 -0
  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/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,60 @@
1
+ // Sheet and transition modifiers accepted for source compatibility. The
2
+ // page's sheet keeps its system background, corner radius and drag (to
3
+ // dismiss, and between detents); a navigation push or sheet keeps its own
4
+ // slide instead of iOS 18's zoom from a source view.
5
+ //
6
+ // `.presentationBackground`, `.presentationCornerRadius`,
7
+ // `.presentationBackgroundInteraction`, `.presentationSizing`,
8
+ // `.presentationDragIndicator`, `.interactiveDismissDisabled` (the sheet can
9
+ // still be dragged down), `.navigationTransition` and
10
+ // `.matchedTransitionSource` add nothing to the tree.
11
+
12
+ public struct PresentationBackgroundInteraction: Sendable {
13
+ let name: String
14
+ public static let automatic = PresentationBackgroundInteraction(name: "automatic")
15
+ public static let enabled = PresentationBackgroundInteraction(name: "enabled")
16
+ public static func enabled(upThrough detent: PresentationDetent) -> PresentationBackgroundInteraction { .enabled }
17
+ public static let disabled = PresentationBackgroundInteraction(name: "disabled")
18
+ }
19
+
20
+ public struct PresentationSizing: Sendable {
21
+ let name: String
22
+ public static let automatic = PresentationSizing(name: "automatic")
23
+ public static let page = PresentationSizing(name: "page")
24
+ public static let form = PresentationSizing(name: "form")
25
+ public static let fitted = PresentationSizing(name: "fitted")
26
+ }
27
+
28
+ /// A navigation transition (iOS 18); the page keeps the standard one.
29
+ public struct NavigationTransition: Sendable {
30
+ let name: String
31
+ public static let automatic = NavigationTransition(name: "automatic")
32
+ public static func zoom<ID: Hashable>(sourceID: ID, in namespace: Namespace.ID) -> NavigationTransition {
33
+ NavigationTransition(name: "zoom")
34
+ }
35
+ }
36
+
37
+ /// What `matchedTransitionSource(id:in:configuration:)` configures; unused.
38
+ public struct EmptyMatchedTransitionSourceConfiguration: Sendable {
39
+ public func background(_ style: Color) -> EmptyMatchedTransitionSourceConfiguration { self }
40
+ public func clipShape(_ shape: RoundedRectangle) -> EmptyMatchedTransitionSourceConfiguration { self }
41
+ public func shadow(color: Color = .black, radius: CGFloat, x: CGFloat = 0, y: CGFloat = 0)
42
+ -> EmptyMatchedTransitionSourceConfiguration { self }
43
+ }
44
+
45
+ nonisolated extension View {
46
+ public func presentationBackground<S: ShapeStyle>(_ style: S) -> some View { self }
47
+ public func presentationBackground<V: View>(alignment: Alignment = .center, @ViewBuilder content: () -> V) -> some View { self }
48
+ public func presentationCornerRadius(_ cornerRadius: CGFloat?) -> some View { self }
49
+ public func presentationBackgroundInteraction(_ interaction: PresentationBackgroundInteraction) -> some View { self }
50
+ public func presentationSizing(_ sizing: PresentationSizing) -> some View { self }
51
+ public func presentationDragIndicator(_ visibility: Visibility) -> some View { self }
52
+ public func interactiveDismissDisabled(_ isDisabled: Bool = true) -> some View { self }
53
+
54
+ public func navigationTransition(_ style: NavigationTransition) -> some View { self }
55
+ public func matchedTransitionSource<ID: Hashable>(id: ID, in namespace: Namespace.ID) -> some View { self }
56
+ public func matchedTransitionSource<ID: Hashable>(
57
+ id: ID, in namespace: Namespace.ID,
58
+ configuration: (EmptyMatchedTransitionSourceConfiguration) -> EmptyMatchedTransitionSourceConfiguration
59
+ ) -> some View { self }
60
+ }
@@ -0,0 +1,517 @@
1
+ import Foundation
2
+
3
+ // MARK: - Text
4
+
5
+ /// A localization key, as Xcode writes it in a string catalog: the literal
6
+ /// text with a specifier for each interpolation (`"\(count) posts"` is the
7
+ /// key `"%lld posts"` with the argument `count`), looked up in the app's string
8
+ /// tables when shown (Localization/Localization.swift). A key the tables lack
9
+ /// is its own text.
10
+ public struct LocalizedStringKey: Equatable, Sendable, ExpressibleByStringInterpolation {
11
+ /// The key, with `%%` for a literal percent sign when it has arguments.
12
+ let formatKey: String
13
+ let arguments: [Argument]
14
+
15
+ /// An interpolated value: one a specifier formats, or a view in the text.
16
+ enum Argument: Equatable, Sendable {
17
+ case value(_LocalizationArgument)
18
+ case image(Image)
19
+ case text(Text)
20
+
21
+ var formatted: _LocalizationArgument? {
22
+ if case .value(let value) = self { return value }
23
+ return nil
24
+ }
25
+ }
26
+
27
+ public init(_ value: String) { formatKey = value; arguments = [] }
28
+ public init(stringLiteral value: String) { formatKey = value; arguments = [] }
29
+ public init(stringInterpolation: StringInterpolation) {
30
+ formatKey = stringInterpolation.key
31
+ arguments = stringInterpolation.arguments
32
+ }
33
+
34
+ /// The localized text, views left out: what titles, labels and placeholders show.
35
+ public var key: String { _resolved(table: nil, bundlePath: nil) }
36
+
37
+ /// The localized text from `table` in the bundle at `bundlePath` (the main bundle when nil).
38
+ public func _resolved(table: String?, bundlePath: String?) -> String {
39
+ _Localization.string(key: formatKey, arguments: arguments.map(\.formatted), table: table, bundlePath: bundlePath)
40
+ }
41
+
42
+ /// The localized pieces, with the views in their places.
43
+ func _pieces(table: String?, bundlePath: String?) -> [_LocalizedPiece] {
44
+ _Localization.resolve(key: formatKey, arguments: arguments.map(\.formatted), table: table, bundlePath: bundlePath)
45
+ }
46
+
47
+ /// Builds the key as SwiftUI does: each interpolation adds the specifier of
48
+ /// its type (`%@` for strings and views, `%lld` for `Int`, `%lf` for
49
+ /// `Double`…) and an argument; literal percent signs are doubled.
50
+ public struct StringInterpolation: StringInterpolationProtocol {
51
+ var key = ""
52
+ var arguments: [Argument] = []
53
+ public init(literalCapacity: Int, interpolationCount: Int) {}
54
+
55
+ public mutating func appendLiteral(_ literal: String) {
56
+ key += literal.replacingOccurrences(of: "%", with: "%%")
57
+ }
58
+
59
+ /// An argument with its specifier: for the shim's own interpolations (a date with a style).
60
+ public mutating func _append(_ argument: _LocalizationArgument, specifier: String) {
61
+ key += specifier
62
+ arguments.append(.value(argument))
63
+ }
64
+
65
+ /// A string the shim made (a formatted value): `%@`.
66
+ mutating func append(_ string: String) { _append(.string(string), specifier: "%@") }
67
+
68
+ public mutating func appendInterpolation(_ string: String) { append(string) }
69
+ public mutating func appendInterpolation<T>(_ value: T) { append(String(describing: value)) }
70
+ /// A number, with its type's specifier (`%lld` for `Int`, `%lf` for `Double`…).
71
+ public mutating func appendInterpolation<T: _FormatSpecifiable>(_ value: T) {
72
+ _append(value._localizationArgument, specifier: T._specifier)
73
+ }
74
+
75
+ /// `"\(value, specifier: "%.1f")"`: the key holds the given specifier.
76
+ public mutating func appendInterpolation<T>(_ value: T, specifier: String) {
77
+ _append((value as? any _FormatSpecifiable)?._localizationArgument ?? .string(String(describing: value)), specifier: specifier)
78
+ }
79
+
80
+ /// `"\(price, format: .currency(code: "USD"))"`: `%@`, the formatted value.
81
+ public mutating func appendInterpolation<F: FormatStyle>(_ value: F.FormatInput, format: F) where F.FormatOutput == String {
82
+ append(format.format(value))
83
+ }
84
+
85
+ /// An image inline in the text: `Text("\(Image(systemName: "star")) Favorites")`.
86
+ public mutating func appendInterpolation(_ image: Image) {
87
+ key += "%@"
88
+ arguments.append(.image(image))
89
+ }
90
+
91
+ /// A styled text inline: `Text("Hello \(Text("world").bold())")`.
92
+ public mutating func appendInterpolation(_ text: Text) {
93
+ key += "%@"
94
+ arguments.append(.text(text))
95
+ }
96
+ }
97
+ }
98
+
99
+ // MARK: - Image
100
+
101
+ /// An SF Symbol (`systemName`) or an image from the app's asset catalog
102
+ /// (`name`, possibly namespaced like `"dough/plain-full"`). The renderer owns
103
+ /// the pixels: asset images come from the catalog manifest the web side
104
+ /// builds from `Examples/<App>/*.xcassets` (see docs/ops-protocol.md).
105
+ public struct Image: Equatable, Sendable {
106
+ enum Source: Equatable, Sendable {
107
+ case system(String)
108
+ case named(String)
109
+ /// Phase 13: a remote image the browser loads itself (`AsyncImage`);
110
+ /// `width` and `height` are its intrinsic size in points.
111
+ case url(String, width: Double, height: Double)
112
+ /// A `UIImage` or `CGImage` bitmap the page draws from its recipe
113
+ /// (Bitmaps.swift); `width` and `height` are its size in points.
114
+ case bitmap(_ImageRecipe, width: Double, height: Double)
115
+ }
116
+
117
+ let source: Source
118
+ /// `.resizable()`: fill the proposed size instead of the intrinsic one.
119
+ let isResizable: Bool
120
+ /// `.interpolation(.none)`: scaled without smoothing (a QR code's modules
121
+ /// stay square). The other levels draw as the browser smooths.
122
+ var interpolation: Interpolation = .high
123
+
124
+ public init(systemName: String) {
125
+ source = .system(systemName)
126
+ isResizable = false
127
+ }
128
+
129
+ /// An image from the asset catalog, which is the whole app's: packages'
130
+ /// catalogs included. `Image(_:bundle:)` (FoundationBridge, which has
131
+ /// `Bundle`) draws the same image.
132
+ public init(_ name: String) {
133
+ source = .named(name)
134
+ isResizable = false
135
+ }
136
+
137
+ /// A catalog image hidden from assistive technology (no bridge in the
138
+ /// browser, so it draws like `Image(_:)`). `bundle:` as for `Image(_:)`.
139
+ public init(decorative name: String) {
140
+ source = .named(name)
141
+ isResizable = false
142
+ }
143
+
144
+ init(source: Source, isResizable: Bool) {
145
+ self.source = source
146
+ self.isResizable = isResizable
147
+ }
148
+
149
+ /// An image at a URL the host has already loaded (`AsyncImage` asks it
150
+ /// to, and learns the pixel size); `scale` turns pixels into points.
151
+ public init(_url url: String, pixelWidth: Double, pixelHeight: Double, scale: Double) {
152
+ let factor = scale > 0 ? scale : 1
153
+ source = .url(url, width: pixelWidth / factor, height: pixelHeight / factor)
154
+ isResizable = false
155
+ }
156
+
157
+ /// The SF Symbol name, for labels that render the icon as a glyph (tab
158
+ /// items, menu pickers); nil for catalog images.
159
+ var systemName: String? {
160
+ if case .system(let name) = source { return name }
161
+ return nil
162
+ }
163
+
164
+ public func resizable() -> Image {
165
+ var copy = Image(source: source, isResizable: true)
166
+ copy.interpolation = interpolation
167
+ return copy
168
+ }
169
+
170
+ /// `.none` draws without smoothing; the other levels are the browser's.
171
+ public enum Interpolation: Hashable, Sendable {
172
+ case none, low, medium, high
173
+ }
174
+
175
+ public func interpolation(_ interpolation: Interpolation) -> Image {
176
+ var copy = self
177
+ copy.interpolation = interpolation
178
+ return copy
179
+ }
180
+ public func antialiased(_ isAntialiased: Bool) -> Image { self }
181
+
182
+ /// Whether an image draws its own colors or, as a template, the foreground
183
+ /// color through its shape. SF Symbols are templates already.
184
+ public enum TemplateRenderingMode: Hashable, Sendable {
185
+ case template, original
186
+ }
187
+
188
+ /// Approximation: a bitmap draws its own colors either way (tint one with
189
+ /// `UIImage.withTintColor(_:)`); symbols take the foreground color as before.
190
+ public func renderingMode(_ renderingMode: TemplateRenderingMode?) -> Image { self }
191
+
192
+ /// Symbols draw in one color here, whatever the mode (as the View modifier).
193
+ public func symbolRenderingMode(_ mode: SymbolRenderingMode?) -> Image { self }
194
+
195
+ /// The page draws images in the browser's range.
196
+ public func allowedDynamicRange(_ range: DynamicRange?) -> Image { self }
197
+
198
+ public struct DynamicRange: Hashable, Sendable {
199
+ let name: String
200
+ public static let standard = DynamicRange(name: "standard")
201
+ public static let constrainedHigh = DynamicRange(name: "constrainedHigh")
202
+ public static let high = DynamicRange(name: "high")
203
+ }
204
+ }
205
+ extension Image: _PrimitiveView {}
206
+ extension Image: _HostView {
207
+ var _kind: String { "image" }
208
+ func _props(in environment: EnvironmentValues) -> _JSON {
209
+ var props: [String: _JSON]
210
+ switch source {
211
+ case .system(let name):
212
+ return .object(["systemName": .string(name)])
213
+ case .named(let name):
214
+ props = ["name": .string(name), "resizable": .bool(isResizable)]
215
+ case .url(let url, let width, let height):
216
+ props = ["url": .string(url), "resizable": .bool(isResizable), "width": .number(width), "height": .number(height)]
217
+ case .bitmap(let recipe, let width, let height):
218
+ props = ["bitmap": recipe.json, "resizable": .bool(isResizable), "width": .number(width), "height": .number(height)]
219
+ }
220
+ if interpolation == .none { props["interpolation"] = .string("none") }
221
+ return .object(props)
222
+ }
223
+ }
224
+
225
+ // MARK: - Stacks
226
+
227
+ public struct VStack<Content: View> {
228
+ let alignment: HorizontalAlignment
229
+ let spacing: CGFloat?
230
+ let content: Content
231
+
232
+ public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
233
+ @ViewBuilder content: () -> Content) {
234
+ self.alignment = alignment
235
+ self.spacing = spacing
236
+ self.content = content()
237
+ }
238
+ }
239
+ extension VStack: _PrimitiveView {}
240
+ extension VStack: _HostView {
241
+ var _kind: String { "vstack" }
242
+ func _props(in environment: EnvironmentValues) -> _JSON {
243
+ .object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
244
+ }
245
+ var _content: [any View] { [content] }
246
+ }
247
+
248
+ public struct HStack<Content: View> {
249
+ let alignment: VerticalAlignment
250
+ let spacing: CGFloat?
251
+ let content: Content
252
+
253
+ public init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil,
254
+ @ViewBuilder content: () -> Content) {
255
+ self.alignment = alignment
256
+ self.spacing = spacing
257
+ self.content = content()
258
+ }
259
+ }
260
+ extension HStack: _PrimitiveView {}
261
+ extension HStack: _HostView {
262
+ var _kind: String { "hstack" }
263
+ func _props(in environment: EnvironmentValues) -> _JSON {
264
+ .object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
265
+ }
266
+ var _content: [any View] { [content] }
267
+ }
268
+
269
+ public struct ZStack<Content: View> {
270
+ let alignment: Alignment
271
+ let content: Content
272
+
273
+ public init(alignment: Alignment = .center, @ViewBuilder content: () -> Content) {
274
+ self.alignment = alignment
275
+ self.content = content()
276
+ }
277
+ }
278
+ extension ZStack: _PrimitiveView {}
279
+ extension ZStack: _HostView {
280
+ var _kind: String { "zstack" }
281
+ func _props(in environment: EnvironmentValues) -> _JSON { .object(["alignment": .string(alignment._name)]) }
282
+ var _content: [any View] { [content] }
283
+ }
284
+
285
+ /// Shows the first of its children whose ideal size fits the proposed space
286
+ /// on `axes` (the last when none fits). The renderer measures and chooses
287
+ /// (see docs/ops-protocol.md, Phase 7); the children are all its candidates.
288
+ public struct ViewThatFits<Content: View> {
289
+ let axes: Axis.Set
290
+ let content: Content
291
+
292
+ public init(in axes: Axis.Set = [.horizontal, .vertical], @ViewBuilder content: () -> Content) {
293
+ self.axes = axes
294
+ self.content = content()
295
+ }
296
+ }
297
+ extension ViewThatFits: _PrimitiveView {}
298
+ extension ViewThatFits: _HostView {
299
+ var _kind: String { "viewthatfits" }
300
+ func _props(in environment: EnvironmentValues) -> _JSON { .object(["axes": .string(axes._name)]) }
301
+ var _content: [any View] { [content] }
302
+ }
303
+
304
+ public struct Spacer: Sendable {
305
+ let minLength: CGFloat?
306
+ public init(minLength: CGFloat? = nil) { self.minLength = minLength }
307
+ }
308
+ extension Spacer: _PrimitiveView {}
309
+ extension Spacer: _HostView {
310
+ var _kind: String { "spacer" }
311
+ func _props(in environment: EnvironmentValues) -> _JSON {
312
+ .object(["minLength": minLength.map(_JSON.number) ?? .null])
313
+ }
314
+ }
315
+
316
+ public struct Divider: Sendable {
317
+ public init() {}
318
+ }
319
+ extension Divider: _PrimitiveView {}
320
+ extension Divider: _HostView {
321
+ var _kind: String { "divider" }
322
+ func _props(in environment: EnvironmentValues) -> _JSON { .object([:]) }
323
+ }
324
+
325
+ // MARK: - ScrollView
326
+
327
+ public enum Axis: Int8, CaseIterable, Sendable {
328
+ case horizontal, vertical
329
+
330
+ public struct Set: OptionSet, Sendable {
331
+ public let rawValue: Int8
332
+ public init(rawValue: Int8) { self.rawValue = rawValue }
333
+ public static let horizontal = Set(rawValue: 1 << 0)
334
+ public static let vertical = Set(rawValue: 1 << 1)
335
+
336
+ /// `"horizontal"`, `"vertical"` or `"both"` (also for an empty set).
337
+ var _name: String {
338
+ if self == .horizontal { return "horizontal" }
339
+ if self == .vertical { return "vertical" }
340
+ return "both"
341
+ }
342
+ }
343
+ }
344
+
345
+ public struct ScrollView<Content: View> {
346
+ let axes: Axis.Set
347
+ let content: Content
348
+ /// `.refreshable`: true while the action runs.
349
+ @State var refreshing = false
350
+
351
+ public init(_ axes: Axis.Set = .vertical, showsIndicators: Bool = true,
352
+ @ViewBuilder content: () -> Content) {
353
+ self.axes = axes
354
+ self.content = content()
355
+ }
356
+ }
357
+ extension ScrollView: _PrimitiveView {}
358
+ extension ScrollView: _HostView {
359
+ var _kind: String { "scrollview" }
360
+ func _props(in environment: EnvironmentValues) -> _JSON {
361
+ var props: [String: _JSON] = ["axes": .string(axes._name)]
362
+ _refresh(in: environment).addProps(to: &props)
363
+ if let snap = environment._scrollTargetBehavior { props["snap"] = .string(snap) }
364
+ // `.scrollDismissesKeyboard` (ScrollModifiers.swift).
365
+ if environment._scrollDismissesKeyboard { props["dismissesKeyboard"] = .bool(true) }
366
+ return .object(props)
367
+ }
368
+ var _content: [any View] { [content] }
369
+ }
370
+ extension ScrollView: _EnvironmentContent {
371
+ /// `.contentMargins` above (ScrollModifiers.swift): padding inside the scroll view.
372
+ func _content(in environment: EnvironmentValues) -> [any View] {
373
+ guard let margins = environment._scrollContentMargins else { return [content] }
374
+ return [content.padding(margins)]
375
+ }
376
+ }
377
+ extension ScrollView: _Refreshing {
378
+ func _refresh(in environment: EnvironmentValues) -> _Refresh {
379
+ _Refresh(action: environment._refreshAction, refreshing: $refreshing)
380
+ }
381
+ }
382
+
383
+ // MARK: - Button
384
+
385
+ public struct ButtonRole: Equatable, Sendable {
386
+ let name: String
387
+ public static let destructive = ButtonRole(name: "destructive")
388
+ public static let cancel = ButtonRole(name: "cancel")
389
+ }
390
+
391
+ public struct Button<Label: View> {
392
+ let action: @MainActor () -> Void
393
+ let role: ButtonRole?
394
+ let label: Label
395
+
396
+ public init(action: @escaping @MainActor () -> Void, @ViewBuilder label: () -> Label) {
397
+ self.action = action
398
+ self.role = nil
399
+ self.label = label()
400
+ }
401
+
402
+ public init(role: ButtonRole?, action: @escaping @MainActor () -> Void,
403
+ @ViewBuilder label: () -> Label) {
404
+ self.action = action
405
+ self.role = role
406
+ self.label = label()
407
+ }
408
+ }
409
+
410
+ extension Button where Label == Text {
411
+ @_disfavoredOverload
412
+ public init<S: StringProtocol>(_ title: S, action: @escaping @MainActor () -> Void) {
413
+ self.init(action: action) { Text(title) }
414
+ }
415
+
416
+ @_disfavoredOverload
417
+ public init<S: StringProtocol>(_ title: S, role: ButtonRole?, action: @escaping @MainActor () -> Void) {
418
+ self.init(role: role, action: action) { Text(title) }
419
+ }
420
+
421
+ public init(_ titleKey: LocalizedStringKey, action: @escaping @MainActor () -> Void) {
422
+ self.init(action: action) { Text(titleKey) }
423
+ }
424
+
425
+ public init(_ titleKey: LocalizedStringKey, role: ButtonRole?, action: @escaping @MainActor () -> Void) {
426
+ self.init(role: role, action: action) { Text(titleKey) }
427
+ }
428
+ }
429
+
430
+ extension Button where Label == SwiftUI.Label<Text, Image> {
431
+ @_disfavoredOverload
432
+ public init<S: StringProtocol>(_ title: S, systemImage: String, action: @escaping @MainActor () -> Void) {
433
+ let title = String(title)
434
+ self.init(action: action) { SwiftUI.Label(title, systemImage: systemImage) }
435
+ }
436
+
437
+ @_disfavoredOverload
438
+ public init<S: StringProtocol>(_ title: S, systemImage: String, role: ButtonRole?,
439
+ action: @escaping @MainActor () -> Void) {
440
+ let title = String(title)
441
+ self.init(role: role, action: action) { SwiftUI.Label(title, systemImage: systemImage) }
442
+ }
443
+
444
+ public init(_ titleKey: LocalizedStringKey, systemImage: String, action: @escaping @MainActor () -> Void) {
445
+ self.init(action: action) { SwiftUI.Label(titleKey, systemImage: systemImage) }
446
+ }
447
+
448
+ public init(_ titleKey: LocalizedStringKey, systemImage: String, role: ButtonRole?,
449
+ action: @escaping @MainActor () -> Void) {
450
+ self.init(role: role, action: action) { SwiftUI.Label(titleKey, systemImage: systemImage) }
451
+ }
452
+ }
453
+ extension Button: _PrimitiveView {}
454
+ extension Button: _HostView {
455
+ var _kind: String { "button" }
456
+ func _props(in environment: EnvironmentValues) -> _JSON {
457
+ .object([
458
+ // A custom `ButtonStyle` draws its own look: `plain` (ButtonStyles.swift).
459
+ "style": .string(environment._buttonStyle == _CustomButtonStyle.marker ? "plain" : environment._buttonStyle),
460
+ "role": role.map { .string($0.name) } ?? .null,
461
+ ])
462
+ }
463
+ var _content: [any View] { [label] }
464
+ var _handler: ((_JSON) -> Void)? {
465
+ let action = self.action
466
+ return { _ in MainActor.assumeIsolated { action() } }
467
+ }
468
+ }
469
+
470
+ // MARK: - Button styles
471
+
472
+ public protocol PrimitiveButtonStyle {
473
+ var _name: String { get }
474
+ }
475
+
476
+ public struct DefaultButtonStyle: PrimitiveButtonStyle {
477
+ public init() {}
478
+ public var _name: String { "automatic" }
479
+ }
480
+ public struct PlainButtonStyle: PrimitiveButtonStyle {
481
+ public init() {}
482
+ public var _name: String { "plain" }
483
+ }
484
+ public struct BorderedButtonStyle: PrimitiveButtonStyle {
485
+ public init() {}
486
+ public var _name: String { "bordered" }
487
+ }
488
+ public struct BorderedProminentButtonStyle: PrimitiveButtonStyle {
489
+ public init() {}
490
+ public var _name: String { "borderedProminent" }
491
+ }
492
+
493
+ public struct BorderlessButtonStyle: PrimitiveButtonStyle {
494
+ public init() {}
495
+ public var _name: String { "plain" }
496
+ }
497
+ extension PrimitiveButtonStyle where Self == BorderlessButtonStyle {
498
+ public static var borderless: BorderlessButtonStyle { BorderlessButtonStyle() }
499
+ }
500
+ extension PrimitiveButtonStyle where Self == DefaultButtonStyle {
501
+ public static var automatic: DefaultButtonStyle { DefaultButtonStyle() }
502
+ }
503
+ extension PrimitiveButtonStyle where Self == PlainButtonStyle {
504
+ public static var plain: PlainButtonStyle { PlainButtonStyle() }
505
+ }
506
+ extension PrimitiveButtonStyle where Self == BorderedButtonStyle {
507
+ public static var bordered: BorderedButtonStyle { BorderedButtonStyle() }
508
+ }
509
+ extension PrimitiveButtonStyle where Self == BorderedProminentButtonStyle {
510
+ public static var borderedProminent: BorderedProminentButtonStyle { BorderedProminentButtonStyle() }
511
+ }
512
+
513
+ nonisolated extension View {
514
+ public func buttonStyle<S: PrimitiveButtonStyle>(_ style: S) -> some View {
515
+ environment(\._buttonStyle, style._name)
516
+ }
517
+ }
@@ -0,0 +1,107 @@
1
+ /// The sliver of Combine that SwiftUI code reaches for without importing
2
+ /// Combine (Apple's SwiftUI re-exports it): `onReceive(_:perform:)` on a
3
+ /// publisher such as `Timer.publish(…).autoconnect()`. A `_Publisher` delivers
4
+ /// values to one subscriber at a time, on the main actor, until cancelled.
5
+ public protocol _Publisher {
6
+ associatedtype Output
7
+ /// Starts delivering values; the returned cancellable stops it.
8
+ @MainActor func _subscribe(_ receive: @escaping @MainActor (Output) -> Void) -> any _Cancellable
9
+ }
10
+
11
+ public protocol _Cancellable: Sendable {
12
+ func cancel()
13
+ }
14
+
15
+ /// A cancellable backed by a task (publishers that tick from the executor).
16
+ public struct _TaskCancellable: _Cancellable {
17
+ let task: Task<Void, Never>
18
+ public init(_ task: Task<Void, Never>) { self.task = task }
19
+ public func cancel() { task.cancel() }
20
+ }
21
+
22
+ /// Emits `make()` every `interval` seconds, from the executor's clock (the same
23
+ /// clock as `.task` sleeps, so headless runs stay deterministic).
24
+ /// `Timer.publish` in FoundationBridge wraps this with `{ Date() }`.
25
+ public struct _IntervalPublisher<Output: Sendable>: _Publisher, Sendable {
26
+ public let interval: Double
27
+ let make: @Sendable () -> Output
28
+
29
+ public init(every interval: Double, make: @escaping @Sendable () -> Output) {
30
+ self.interval = interval
31
+ self.make = make
32
+ }
33
+
34
+ /// Starts ticking as soon as `onReceive` subscribes; Combine's `autoconnect`
35
+ /// has the same effect, so this is the identity.
36
+ public func autoconnect() -> _IntervalPublisher<Output> { self }
37
+
38
+ @MainActor public func _subscribe(_ receive: @escaping @MainActor (Output) -> Void) -> any _Cancellable {
39
+ let interval = max(interval, 0.001)
40
+ let make = self.make
41
+ let task = Task { @MainActor in
42
+ while !Task.isCancelled {
43
+ try? await Task.sleep(for: .seconds(interval))
44
+ if Task.isCancelled { break }
45
+ receive(make())
46
+ }
47
+ }
48
+ return _TaskCancellable(task)
49
+ }
50
+ }
51
+
52
+ /// The executor-driven timer behind `Timer.scheduledTimer(withTimeInterval:repeats:block:)`:
53
+ /// fires `block` after `interval` seconds, again every `interval` when
54
+ /// repeating, until `invalidate()`. Like Foundation's, a scheduled timer stays
55
+ /// alive until it has fired (or forever while repeating) whether or not the
56
+ /// caller keeps a reference.
57
+ public final class _ExecutorTimer: @unchecked Sendable {
58
+ public let timeInterval: Double
59
+ public private(set) var isValid = true
60
+ private var task: Task<Void, Never>?
61
+
62
+ public init(interval: Double, repeats: Bool, block: @escaping @Sendable (_ExecutorTimer) -> Void) {
63
+ timeInterval = interval
64
+ task = Task { @MainActor in
65
+ repeat {
66
+ try? await Task.sleep(for: .seconds(max(interval, 0.001)))
67
+ guard self.isValid, !Task.isCancelled else { return }
68
+ block(self)
69
+ } while repeats && !Task.isCancelled
70
+ self.isValid = false
71
+ }
72
+ }
73
+
74
+ public func invalidate() {
75
+ isValid = false
76
+ task?.cancel()
77
+ task = nil
78
+ }
79
+ }
80
+
81
+ /// `onReceive` is a task that subscribes while the view is on screen (the
82
+ /// runtime starts it on appear and cancels it when the view leaves).
83
+ struct _OnReceiveView<Content: View, P: _Publisher>: View {
84
+ let content: Content
85
+ let publisher: P
86
+ let action: @MainActor (P.Output) -> Void
87
+ var body: some View {
88
+ let publisher = self.publisher
89
+ let action = self.action
90
+ return content.task { @MainActor in
91
+ let cancellable = publisher._subscribe(action)
92
+ // Stay alive until cancelled; the publisher drives the callbacks.
93
+ while !Task.isCancelled {
94
+ try? await Task.sleep(for: .seconds(3600))
95
+ }
96
+ cancellable.cancel()
97
+ }
98
+ }
99
+ }
100
+
101
+ nonisolated extension View {
102
+ /// Calls `action` with every value `publisher` emits while the view is shown.
103
+ @MainActor
104
+ public func onReceive<P: _Publisher>(_ publisher: P, perform action: @escaping @MainActor (P.Output) -> Void) -> some View {
105
+ _OnReceiveView(content: self, publisher: publisher, action: action)
106
+ }
107
+ }