@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
@@ -0,0 +1,288 @@
1
+ // `UIViewRepresentable` and `UIViewControllerRepresentable`: UIKit views in
2
+ // a SwiftUI tree. On Apple platforms they are SwiftUI API that needs UIKit's
3
+ // types; here they live in UIKit (which `import SwiftUI` brings along), built
4
+ // from public SwiftUI alone, so the reconciler has no special case for them:
5
+ //
6
+ // - A representable's `body` is a `_UIViewRepresentableHost` (or the
7
+ // controller host), a view with `@State` storage: the runtime keeps it for
8
+ // as long as the node is mounted, as it keeps any view's state. Its body
9
+ // makes the coordinator and the view the first time, calls
10
+ // `updateUIView` on every pass (the parent re-ran with a new
11
+ // representable, as SwiftUI calls it when the representable's inputs
12
+ // change), and `.onDisappear` dismantles the view.
13
+ // - The UIKit view tree is drawn by a second view, `_UIKitTranslationHost`,
14
+ // whose body translates it into SwiftUI views (ViewTranslation.swift).
15
+ // Its own `@State` revision is bumped when something drawn in the tree
16
+ // changes outside a pass (a delegate callback, a timer: UIView.swift's
17
+ // `_setNeedsTranslation`), which renders that node again without calling
18
+ // `updateUIView`. Changes made while the representable runs (in
19
+ // `makeUIView` / `updateUIView` or the translation itself) need no bump.
20
+ // - The translation sits in a custom `Layout`, `_UIKitViewLayout`, which the
21
+ // page measures like any other: it answers the representable's
22
+ // `sizeThatFits` when that gives a size, else the translated content's
23
+ // own size (a label or image its natural size, a plain view, scroll view
24
+ // or text area the proposal). Placing it sets the root view's frame and
25
+ // lays the tree out (constraints, autoresizing, `layoutSubviews`), so the
26
+ // UIKit code sees the size SwiftUI gave it.
27
+
28
+ import Foundation
29
+ import SwiftUI
30
+
31
+ // MARK: - UIViewRepresentable
32
+
33
+ /// A UIKit view in a SwiftUI view tree.
34
+ @MainActor @preconcurrency
35
+ public protocol UIViewRepresentable: View {
36
+ associatedtype UIViewType: UIView
37
+ associatedtype Coordinator = Void
38
+ typealias Context = UIViewRepresentableContext<Self>
39
+
40
+ /// Makes the view, once per mounted representable.
41
+ func makeUIView(context: Context) -> UIViewType
42
+ /// Brings the view up to date with the representable; called after
43
+ /// `makeUIView` and whenever the parent passes a new representable.
44
+ func updateUIView(_ uiView: UIViewType, context: Context)
45
+ /// Called when the representable leaves the tree.
46
+ static func dismantleUIView(_ uiView: UIViewType, coordinator: Coordinator)
47
+ /// Makes the object `context.coordinator` is, before `makeUIView`.
48
+ func makeCoordinator() -> Coordinator
49
+ /// The size for a proposal, or nil for the view's own (see the top of the file).
50
+ func sizeThatFits(_ proposal: ProposedViewSize, uiView: UIViewType, context: Context) -> CGSize?
51
+ }
52
+
53
+ extension UIViewRepresentable where Coordinator == Void {
54
+ public func makeCoordinator() {}
55
+ }
56
+
57
+ extension UIViewRepresentable {
58
+ public static func dismantleUIView(_ uiView: UIViewType, coordinator: Coordinator) {}
59
+ public func sizeThatFits(_ proposal: ProposedViewSize, uiView: UIViewType, context: Context) -> CGSize? { nil }
60
+ public var body: _UIViewRepresentableHost<Self> { _UIViewRepresentableHost(representable: self) }
61
+ }
62
+
63
+ /// What a representable's methods get: its coordinator and the environment.
64
+ @MainActor
65
+ public struct UIViewRepresentableContext<Representable: UIViewRepresentable> {
66
+ public let coordinator: Representable.Coordinator
67
+ public var transaction: Transaction
68
+ public var environment: EnvironmentValues
69
+ }
70
+
71
+ /// A representable's body: makes, updates and dismantles its view, and
72
+ /// draws it through `_UIKitTranslationHost`.
73
+ @MainActor
74
+ public struct _UIViewRepresentableHost<Representable: UIViewRepresentable>: View {
75
+ let representable: Representable
76
+ @State private var storage = _RepresentableStorage<Representable.UIViewType, Representable.Coordinator>()
77
+ @Environment(\.self) private var environment
78
+
79
+ public var body: some View {
80
+ let storage = self.storage
81
+ let representable = self.representable
82
+ storage.box.busy += 1
83
+ defer { storage.box.busy -= 1 }
84
+ if storage.view == nil {
85
+ let coordinator = representable.makeCoordinator()
86
+ storage.coordinator = coordinator
87
+ let context = UIViewRepresentableContext<Representable>(coordinator: coordinator, transaction: Transaction(),
88
+ environment: environment)
89
+ let view = representable.makeUIView(context: context)
90
+ storage.view = view
91
+ storage.box.root = view
92
+ }
93
+ let view = storage.view!
94
+ let context = UIViewRepresentableContext<Representable>(coordinator: storage.coordinator!, transaction: Transaction(),
95
+ environment: environment)
96
+ representable.updateUIView(view, context: context)
97
+ storage.box.sizeThatFits = { proposal in representable.sizeThatFits(proposal, uiView: view, context: context) }
98
+ storage.box.pass += 1
99
+ return _UIKitTranslationHost(box: storage.box, pass: storage.box.pass)
100
+ .onDisappear {
101
+ guard let view = storage.view, let coordinator = storage.coordinator else { return }
102
+ storage.box.detach()
103
+ storage.view = nil
104
+ storage.coordinator = nil
105
+ Representable.dismantleUIView(view, coordinator: coordinator)
106
+ }
107
+ }
108
+ }
109
+
110
+ /// A mounted representable's view and coordinator.
111
+ @MainActor
112
+ final class _RepresentableStorage<ViewType, Coordinator> {
113
+ var view: ViewType?
114
+ var coordinator: Coordinator?
115
+ let box = _UIKitHostBox()
116
+ }
117
+
118
+ // MARK: - UIViewControllerRepresentable
119
+
120
+ /// A UIKit view controller in a SwiftUI view tree: its `view` is drawn as a
121
+ /// representable's is. The controller hears `viewWillAppear` /
122
+ /// `viewDidAppear` when it is first drawn and the disappear pair when it
123
+ /// leaves the tree; `dismiss(animated:)` on it (or on a controller it
124
+ /// presents nothing from) dismisses the SwiftUI presentation it is in.
125
+ @MainActor @preconcurrency
126
+ public protocol UIViewControllerRepresentable: View {
127
+ associatedtype UIViewControllerType: UIViewController
128
+ associatedtype Coordinator = Void
129
+ typealias Context = UIViewControllerRepresentableContext<Self>
130
+
131
+ func makeUIViewController(context: Context) -> UIViewControllerType
132
+ func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context)
133
+ static func dismantleUIViewController(_ uiViewController: UIViewControllerType, coordinator: Coordinator)
134
+ func makeCoordinator() -> Coordinator
135
+ func sizeThatFits(_ proposal: ProposedViewSize, uiViewController: UIViewControllerType, context: Context) -> CGSize?
136
+ }
137
+
138
+ extension UIViewControllerRepresentable where Coordinator == Void {
139
+ public func makeCoordinator() {}
140
+ }
141
+
142
+ extension UIViewControllerRepresentable {
143
+ public static func dismantleUIViewController(_ uiViewController: UIViewControllerType, coordinator: Coordinator) {}
144
+ public func sizeThatFits(_ proposal: ProposedViewSize, uiViewController: UIViewControllerType, context: Context) -> CGSize? { nil }
145
+ public var body: _UIViewControllerRepresentableHost<Self> { _UIViewControllerRepresentableHost(representable: self) }
146
+ }
147
+
148
+ @MainActor
149
+ public struct UIViewControllerRepresentableContext<Representable: UIViewControllerRepresentable> {
150
+ public let coordinator: Representable.Coordinator
151
+ public var transaction: Transaction
152
+ public var environment: EnvironmentValues
153
+ }
154
+
155
+ /// A controller representable's body, like `_UIViewRepresentableHost`.
156
+ @MainActor
157
+ public struct _UIViewControllerRepresentableHost<Representable: UIViewControllerRepresentable>: View {
158
+ let representable: Representable
159
+ @State private var storage = _RepresentableStorage<Representable.UIViewControllerType, Representable.Coordinator>()
160
+ @Environment(\.self) private var environment
161
+
162
+ public var body: some View {
163
+ let storage = self.storage
164
+ let representable = self.representable
165
+ storage.box.busy += 1
166
+ defer { storage.box.busy -= 1 }
167
+ var appearing = false
168
+ if storage.view == nil {
169
+ let coordinator = representable.makeCoordinator()
170
+ storage.coordinator = coordinator
171
+ let context = UIViewControllerRepresentableContext<Representable>(coordinator: coordinator, transaction: Transaction(),
172
+ environment: environment)
173
+ let controller = representable.makeUIViewController(context: context)
174
+ storage.view = controller
175
+ storage.box.root = controller.view
176
+ storage.box.controller = controller
177
+ appearing = true
178
+ }
179
+ let controller = storage.view!
180
+ let dismiss = environment.dismiss
181
+ controller._representableDismiss = { dismiss() }
182
+ let context = UIViewControllerRepresentableContext<Representable>(coordinator: storage.coordinator!, transaction: Transaction(),
183
+ environment: environment)
184
+ representable.updateUIViewController(controller, context: context)
185
+ if appearing { controller.viewWillAppear(false) }
186
+ storage.box.sizeThatFits = { proposal in representable.sizeThatFits(proposal, uiViewController: controller, context: context) }
187
+ storage.box.pass += 1
188
+ return _UIKitTranslationHost(box: storage.box, pass: storage.box.pass)
189
+ .onAppear { controller.viewDidAppear(false) }
190
+ .onDisappear {
191
+ guard let controller = storage.view, let coordinator = storage.coordinator else { return }
192
+ controller.viewWillDisappear(false)
193
+ storage.box.detach()
194
+ storage.view = nil
195
+ storage.coordinator = nil
196
+ controller._representableDismiss = nil
197
+ controller.viewDidDisappear(false)
198
+ Representable.dismantleUIViewController(controller, coordinator: coordinator)
199
+ }
200
+ }
201
+ }
202
+
203
+ // MARK: - Drawing
204
+
205
+ /// What the two halves of a representable share: the root view, whether a
206
+ /// representable is running (changes then need no render), how to render the
207
+ /// translation again, and the representable's own `sizeThatFits`.
208
+ @MainActor
209
+ final class _UIKitHostBox {
210
+ var root: UIView? {
211
+ didSet {
212
+ oldValue?._translationHook = nil
213
+ root?._translationHook = { [weak self] in self?.changed() }
214
+ }
215
+ }
216
+ /// The controller whose view `root` is, told about layout.
217
+ weak var controller: UIViewController?
218
+ /// Above zero while the representable or the translation runs.
219
+ var busy = 0
220
+ /// Counts the representable's passes, so the translation host's value
221
+ /// differs on each and re-runs with it.
222
+ var pass = 0
223
+ var sizeThatFits: (ProposedViewSize) -> CGSize? = { _ in nil }
224
+ /// Bumps the translation host's revision (set by its body).
225
+ var invalidate: (() -> Void)?
226
+
227
+ func changed() {
228
+ guard busy == 0 else { return }
229
+ invalidate?()
230
+ }
231
+
232
+ func detach() {
233
+ root?._translationHook = nil
234
+ invalidate = nil
235
+ }
236
+
237
+ /// The layout placed the root at `size`: lay the tree out at that size
238
+ /// and draw it again if it changed.
239
+ func placed(size: CGSize) {
240
+ guard let root, root.bounds.size != size || root.frame.origin != .zero else { return }
241
+ busy += 1
242
+ controller?.viewWillLayoutSubviews()
243
+ root.frame = CGRect(origin: .zero, size: size)
244
+ root._layoutTree()
245
+ controller?.viewDidLayoutSubviews()
246
+ busy -= 1
247
+ changed()
248
+ }
249
+ }
250
+
251
+ /// Draws a representable's view tree: lays it out and translates it. Its
252
+ /// revision is what a change outside a pass bumps.
253
+ struct _UIKitTranslationHost: View {
254
+ let box: _UIKitHostBox
255
+ let pass: Int
256
+ @State private var revision = 0
257
+
258
+ var body: some View {
259
+ let box = self.box
260
+ let revision = $revision
261
+ box.invalidate = { revision.wrappedValue &+= 1 }
262
+ box.busy += 1
263
+ defer { box.busy -= 1 }
264
+ guard let root = box.root else { return AnyView(EmptyView()) }
265
+ root._layoutTree()
266
+ return AnyView(_UIKitViewLayout(box: box) { _UIViewTranslator.view(for: root, isRoot: true) })
267
+ }
268
+ }
269
+
270
+ /// Sizes and places a representable's drawing (see the top of the file).
271
+ struct _UIKitViewLayout: Layout {
272
+ let box: _UIKitHostBox
273
+
274
+ // The layout runs on the main actor (the page's event handler), but
275
+ // `Layout`'s requirements are nonisolated, as SwiftUI's are.
276
+ func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
277
+ let box = self.box
278
+ if let size = MainActor.assumeIsolated({ box.sizeThatFits(proposal) }) { return size }
279
+ guard let content = subviews.first else { return proposal.replacingUnspecifiedDimensions(by: .zero) }
280
+ return content.sizeThatFits(proposal)
281
+ }
282
+
283
+ func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
284
+ subviews.first?.place(at: bounds.origin, anchor: .topLeading, proposal: ProposedViewSize(bounds.size))
285
+ let box = self.box
286
+ MainActor.assumeIsolated { box.placed(size: bounds.size) }
287
+ }
288
+ }
@@ -0,0 +1,12 @@
1
+ // The safe area of UIKit views. A view is in no window on the page
2
+ // ("UIKit views in SwiftUI"), and SwiftUI lays the page out inside the
3
+ // device's safe area itself, so a view's safe-area insets are zero (a
4
+ // window's too: the page does not report its insets to Swift).
5
+
6
+ import Foundation
7
+ import SwiftUI
8
+
9
+ extension UIView {
10
+ /// Zero (see the file comment).
11
+ public var safeAreaInsets: UIEdgeInsets { .zero }
12
+ }
@@ -0,0 +1,132 @@
1
+ // Scene delegates, as apps declare them (`UIWindowSceneDelegate`, its
2
+ // session and connection options). The page is the app's one scene: after
3
+ // launching, `@UIApplicationDelegateAdaptor` connects it, making the delegate
4
+ // class the app delegate's configuration names and calling
5
+ // `scene(_:willConnectTo:options:)`, `sceneWillEnterForeground` and
6
+ // `sceneDidBecomeActive` (`_SceneConnection` below). The later lifecycle
7
+ // (background, disconnect) is not reported.
8
+
9
+ import Foundation
10
+ import Observation
11
+ import SwiftUI
12
+
13
+ /// What a scene tells its delegate. Every method has a default that does nothing.
14
+ @MainActor
15
+ public protocol UISceneDelegate: AnyObject {
16
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
17
+ func sceneDidDisconnect(_ scene: UIScene)
18
+ func sceneDidBecomeActive(_ scene: UIScene)
19
+ func sceneWillResignActive(_ scene: UIScene)
20
+ func sceneWillEnterForeground(_ scene: UIScene)
21
+ func sceneDidEnterBackground(_ scene: UIScene)
22
+ }
23
+
24
+ extension UISceneDelegate {
25
+ public func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}
26
+ public func sceneDidDisconnect(_ scene: UIScene) {}
27
+ public func sceneDidBecomeActive(_ scene: UIScene) {}
28
+ public func sceneWillResignActive(_ scene: UIScene) {}
29
+ public func sceneWillEnterForeground(_ scene: UIScene) {}
30
+ public func sceneDidEnterBackground(_ scene: UIScene) {}
31
+ }
32
+
33
+ /// A scene delegate with a window (none in the browser).
34
+ @MainActor
35
+ public protocol UIWindowSceneDelegate: UISceneDelegate {
36
+ var window: UIWindow? { get set }
37
+ }
38
+
39
+ extension UIWindowSceneDelegate {
40
+ public var window: UIWindow? {
41
+ get { nil }
42
+ set {}
43
+ }
44
+ }
45
+
46
+ /// A scene's session: its role and configuration, kept.
47
+ @MainActor
48
+ open class UISceneSession {
49
+ public struct Role: RawRepresentable, Hashable, Sendable {
50
+ public let rawValue: String
51
+ public init(rawValue: String) { self.rawValue = rawValue }
52
+ public static let windowApplication = Role(rawValue: "UIWindowSceneSessionRoleApplication")
53
+ }
54
+
55
+ public let role: Role
56
+ public let persistentIdentifier: String
57
+ public var userInfo: [String: Any]?
58
+
59
+ public init(role: Role = .windowApplication) {
60
+ self.role = role
61
+ persistentIdentifier = UUID().uuidString
62
+ }
63
+ }
64
+
65
+ /// How a scene configuration names its delegate class, kept.
66
+ @MainActor
67
+ open class UISceneConfiguration {
68
+ public let name: String?
69
+ public let role: UISceneSession.Role
70
+ public var delegateClass: AnyClass?
71
+ /// Makes an instance of `delegateClass`. UIKit makes one through the
72
+ /// Objective-C runtime; Swift without it cannot call a class's `init()`
73
+ /// through a metatype unless the initializer is `required`, so the
74
+ /// staging rewrites `configuration.delegateClass = SceneDelegate.self`
75
+ /// into `_setDelegateClass(SceneDelegate.self) { SceneDelegate() }`.
76
+ public private(set) var _makeDelegate: (() -> AnyObject)?
77
+
78
+ public init(name: String?, sessionRole: UISceneSession.Role) {
79
+ self.name = name
80
+ role = sessionRole
81
+ }
82
+
83
+ /// `delegateClass = type`, with the way to make one (see `_makeDelegate`).
84
+ public func _setDelegateClass<T: AnyObject>(_ type: T.Type, make: @escaping () -> T) {
85
+ delegateClass = type
86
+ _makeDelegate = make
87
+ }
88
+ }
89
+
90
+ extension UIScene {
91
+ /// What the scene connected with: no URLs, activities or shortcut items in the browser.
92
+ @MainActor
93
+ open class ConnectionOptions {
94
+ public init() {}
95
+ open var urlContexts: Set<AnyHashable> { [] }
96
+ open var shortcutItem: UIApplicationShortcutItem? { nil }
97
+ open var sourceApplication: String? { nil }
98
+ }
99
+ }
100
+
101
+ // MARK: - Connecting the page's scene
102
+
103
+ @MainActor
104
+ enum _SceneConnection {
105
+ /// The page's scene delegate, made once (strongly held, as `UIScene.delegate` is).
106
+ static var delegate: AnyObject?
107
+
108
+ /// Connects the page's scene as UIKit does after launching: asks the app
109
+ /// delegate for the scene's configuration, makes its delegate class, and
110
+ /// tells the delegate the scene connected, entered the foreground and
111
+ /// became active. SwiftUI puts a scene delegate that is `Observable` or an
112
+ /// `ObservableObject` in the environment, so `@Environment(SceneDelegate.self)`
113
+ /// finds it.
114
+ static func connect(_ appDelegate: any UIApplicationDelegate) {
115
+ guard delegate == nil else { return }
116
+ let session = UISceneSession(role: .windowApplication)
117
+ let configuration = appDelegate.application(UIApplication.shared, configurationForConnecting: session, options: UIScene.ConnectionOptions())
118
+ guard let make = configuration._makeDelegate else { return }
119
+ let sceneDelegate = make()
120
+ delegate = sceneDelegate
121
+ let scene = UIApplication.pageScene
122
+ scene.delegate = sceneDelegate as? any UISceneDelegate
123
+ if let sceneDelegate = sceneDelegate as? any UISceneDelegate {
124
+ sceneDelegate.scene(scene, willConnectTo: session, options: UIScene.ConnectionOptions())
125
+ sceneDelegate.sceneWillEnterForeground(scene)
126
+ sceneDelegate.sceneDidBecomeActive(scene)
127
+ }
128
+ if sceneDelegate is any Observable || sceneDelegate is any ObservableObject {
129
+ _Runtime.shared._addRootEnvironmentObject(sceneDelegate)
130
+ }
131
+ }
132
+ }
@@ -0,0 +1,40 @@
1
+ // UIKit's scenes, as code that looks for "the current window scene" uses
2
+ // them (to present StoreKit's sheets near it, say). The page is the app's
3
+ // one scene: `UIApplication.shared.connectedScenes` holds a single
4
+ // `UIWindowScene`, always foreground-active. It has no `UIWindow`s, since
5
+ // SwiftUI draws the page, so `windows` is empty and `keyWindow` nil.
6
+
7
+ import SwiftUI
8
+
9
+ /// A scene: one instance of the app's interface.
10
+ @MainActor
11
+ open class UIScene: Hashable {
12
+ public enum ActivationState: Int, Sendable {
13
+ case unattached = -1, foregroundActive = 0, foregroundInactive = 1, background = 2
14
+ }
15
+
16
+ public init() {}
17
+
18
+ open var activationState: ActivationState { .foregroundActive }
19
+ /// The scene's delegate: the app delegate's configuration names its class (SceneDelegates.swift).
20
+ open var delegate: (any UISceneDelegate)?
21
+ open var title: String! = ""
22
+
23
+ nonisolated public static func == (lhs: UIScene, rhs: UIScene) -> Bool { lhs === rhs }
24
+ nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
25
+ }
26
+
27
+ /// A scene with windows: in the browser, the page.
28
+ @MainActor
29
+ open class UIWindowScene: UIScene {
30
+ open var windows: [UIWindow] { [] }
31
+ open var keyWindow: UIWindow? { nil }
32
+ open var screen: UIScreen { .main }
33
+ }
34
+
35
+ extension UIApplication {
36
+ static let pageScene = UIWindowScene()
37
+
38
+ /// The page, the app's only scene.
39
+ public var connectedScenes: Set<UIScene> { [UIApplication.pageScene] }
40
+ }
@@ -0,0 +1,157 @@
1
+ // `UIScrollView` and its delegate. A representable's scroll view is drawn as
2
+ // a SwiftUI `ScrollView` over its subviews when its content is larger than
3
+ // its bounds, else as a plain container (ViewTranslation.swift). Zooming is
4
+ // state: `setZoomScale` and `zoom(to:animated:)` set the scale and offset and
5
+ // tell the delegate at once, and the page draws the delegate's
6
+ // `viewForZooming` scaled about the visible rectangle's center. Pinching,
7
+ // panning a zoomed view and reading the user's scroll offset back are not
8
+ // there (`contentOffset` only changes when the app sets it).
9
+
10
+ import Foundation
11
+ import SwiftUI
12
+
13
+ /// Distances inside a rectangle's edges.
14
+ public struct UIEdgeInsets: Hashable, Sendable {
15
+ public var top: CGFloat
16
+ public var left: CGFloat
17
+ public var bottom: CGFloat
18
+ public var right: CGFloat
19
+
20
+ public init(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) {
21
+ (self.top, self.left, self.bottom, self.right) = (top, left, bottom, right)
22
+ }
23
+
24
+ public init() { self.init(top: 0, left: 0, bottom: 0, right: 0) }
25
+
26
+ public static let zero = UIEdgeInsets()
27
+ }
28
+
29
+ /// What a scroll view tells its delegate. Every method has a default (they
30
+ /// are `@objc optional` on iOS).
31
+ @MainActor
32
+ public protocol UIScrollViewDelegate: AnyObject {
33
+ func scrollViewDidScroll(_ scrollView: UIScrollView)
34
+ func scrollViewDidZoom(_ scrollView: UIScrollView)
35
+ func scrollViewWillBeginDragging(_ scrollView: UIScrollView)
36
+ func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
37
+ func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
38
+ func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)
39
+ func viewForZooming(in scrollView: UIScrollView) -> UIView?
40
+ func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?)
41
+ func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
42
+ func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool
43
+ func scrollViewDidScrollToTop(_ scrollView: UIScrollView)
44
+ }
45
+
46
+ extension UIScrollViewDelegate {
47
+ public func scrollViewDidScroll(_ scrollView: UIScrollView) {}
48
+ public func scrollViewDidZoom(_ scrollView: UIScrollView) {}
49
+ public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {}
50
+ public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {}
51
+ public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {}
52
+ public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {}
53
+ public func viewForZooming(in scrollView: UIScrollView) -> UIView? { nil }
54
+ public func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {}
55
+ public func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {}
56
+ public func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool { true }
57
+ public func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {}
58
+ }
59
+
60
+ /// Gives `UIScrollView` its `delegate` from a protocol extension, so that
61
+ /// `UITextView` can declare a `delegate` of its own delegate type (Swift
62
+ /// cannot override a property with another type, as Objective-C UIKit does).
63
+ @MainActor
64
+ public protocol _UIScrollViewDelegating: AnyObject {}
65
+
66
+ extension _UIScrollViewDelegating where Self: UIScrollView {
67
+ public var delegate: UIScrollViewDelegate? {
68
+ get { _scrollDelegate }
69
+ set { _scrollDelegate = newValue }
70
+ }
71
+ }
72
+
73
+ /// A scroll view: drawn as a `ScrollView` when a representable shows it;
74
+ /// offset, insets and zoom kept (see the top of the file).
75
+ @MainActor
76
+ open class UIScrollView: UIView, _UIScrollViewDelegating {
77
+ public enum KeyboardDismissMode: Int, Sendable { case none, onDrag, interactive, onDragWithAccessory, interactiveWithAccessory }
78
+ public enum ContentInsetAdjustmentBehavior: Int, Sendable { case automatic, scrollableAxes, never, always }
79
+ public enum IndicatorStyle: Int, Sendable { case `default`, black, white }
80
+
81
+ /// The delegate (`delegate`, from `_UIScrollViewDelegating`).
82
+ weak var _scrollDelegate: UIScrollViewDelegate?
83
+ open var contentOffset: CGPoint = .zero {
84
+ didSet {
85
+ guard contentOffset != oldValue else { return }
86
+ _setNeedsTranslation()
87
+ _scrollDelegate?.scrollViewDidScroll(self)
88
+ }
89
+ }
90
+ open var contentSize: CGSize = .zero { didSet { _setNeedsTranslation() } }
91
+ open var contentInset: UIEdgeInsets = .zero { didSet { _setNeedsTranslation() } }
92
+ open var adjustedContentInset: UIEdgeInsets { contentInset }
93
+ open var contentInsetAdjustmentBehavior: ContentInsetAdjustmentBehavior = .automatic
94
+ open var scrollIndicatorInsets: UIEdgeInsets = .zero
95
+ open var verticalScrollIndicatorInsets: UIEdgeInsets = .zero
96
+ open var horizontalScrollIndicatorInsets: UIEdgeInsets = .zero
97
+ open var indicatorStyle: IndicatorStyle = .default
98
+ open var isScrollEnabled = true { didSet { _setNeedsTranslation() } }
99
+ open var isPagingEnabled = false
100
+ open var isDirectionalLockEnabled = false
101
+ open var bounces = true
102
+ open var alwaysBounceVertical = false
103
+ open var alwaysBounceHorizontal = false
104
+ open var showsVerticalScrollIndicator = true { didSet { _setNeedsTranslation() } }
105
+ open var showsHorizontalScrollIndicator = true { didSet { _setNeedsTranslation() } }
106
+ open var scrollsToTop = true
107
+ open var keyboardDismissMode: KeyboardDismissMode = .none
108
+ open var decelerationRate: CGFloat = 0.998
109
+ open var minimumZoomScale: CGFloat = 1
110
+ open var maximumZoomScale: CGFloat = 1
111
+ open var bouncesZoom = true
112
+ open var zoomScale: CGFloat {
113
+ get { storedZoomScale }
114
+ set { setZoomScale(newValue, animated: false) }
115
+ }
116
+ public var isTracking: Bool { false }
117
+ public var isDragging: Bool { false }
118
+ public var isDecelerating: Bool { false }
119
+ public var isZooming: Bool { false }
120
+ public var isZoomBouncing: Bool { false }
121
+ private var storedZoomScale: CGFloat = 1
122
+
123
+ open func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
124
+ self.contentOffset = contentOffset
125
+ }
126
+
127
+ open func scrollRectToVisible(_ rect: CGRect, animated: Bool) {
128
+ var offset = contentOffset
129
+ if rect.minX < offset.x { offset.x = rect.minX } else if rect.maxX > offset.x + bounds.width { offset.x = rect.maxX - bounds.width }
130
+ if rect.minY < offset.y { offset.y = rect.minY } else if rect.maxY > offset.y + bounds.height { offset.y = rect.maxY - bounds.height }
131
+ contentOffset = offset
132
+ }
133
+
134
+ /// Sets the scale (within the minimum and maximum) and tells the delegate
135
+ /// it zoomed and ended zooming, as a finished gesture would.
136
+ open func setZoomScale(_ scale: CGFloat, animated: Bool) {
137
+ let clamped = min(max(scale, minimumZoomScale), max(minimumZoomScale, maximumZoomScale))
138
+ guard clamped != storedZoomScale else { return }
139
+ let zoomed = _scrollDelegate?.viewForZooming(in: self)
140
+ _scrollDelegate?.scrollViewWillBeginZooming(self, with: zoomed)
141
+ storedZoomScale = clamped
142
+ _setNeedsTranslation()
143
+ _scrollDelegate?.scrollViewDidZoom(self)
144
+ _scrollDelegate?.scrollViewDidEndZooming(self, with: zoomed, atScale: clamped)
145
+ }
146
+
147
+ /// Zooms so that `rect` (in the zoomed view's unscaled coordinates) fills the bounds.
148
+ open func zoom(to rect: CGRect, animated: Bool) {
149
+ guard rect.width > 0, rect.height > 0 else { return }
150
+ let scale = min(bounds.width / rect.width, bounds.height / rect.height)
151
+ setZoomScale(scale, animated: animated)
152
+ contentOffset = CGPoint(x: max(0, rect.midX * zoomScale - bounds.width / 2),
153
+ y: max(0, rect.midY * zoomScale - bounds.height / 2))
154
+ }
155
+
156
+ open func flashScrollIndicators() {}
157
+ }