@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,204 @@
1
+ // Drawing images with UIKit: `UIGraphicsImageRenderer`, the older
2
+ // `UIGraphicsBeginImageContext` functions, `UIImage.draw(in:)`, and an
3
+ // image's rendering mode and tint. Drawing goes into Core Graphics'
4
+ // recording context (Sources/CoreGraphics), so the result is a recipe the
5
+ // page draws: an image drawn into a renderer is that image scaled and placed
6
+ // on the renderer's canvas (how apps resize images, EmojiText's emoji among
7
+ // them). As in that context, the image drawn last is the canvas's content.
8
+
9
+ import Foundation
10
+ import SwiftUI
11
+
12
+ // MARK: - Rendering mode and tint
13
+
14
+ extension UIImage {
15
+ public enum RenderingMode: Int, Sendable {
16
+ case automatic, alwaysOriginal, alwaysTemplate
17
+ }
18
+
19
+ public var renderingMode: RenderingMode { RenderingMode(rawValue: _renderingMode) ?? .automatic }
20
+
21
+ /// SF Symbols are templates: they draw in the tint or foreground color.
22
+ public var isSymbolImage: Bool { _isSymbol }
23
+
24
+ public func withRenderingMode(_ renderingMode: RenderingMode) -> UIImage {
25
+ _copy(renderingMode: renderingMode.rawValue)
26
+ }
27
+
28
+ /// The image's shape filled with `color` (a bitmap's alpha, in the color).
29
+ /// A symbol keeps its own drawing: it takes the foreground color where shown.
30
+ public func withTintColor(_ color: UIColor) -> UIImage {
31
+ withTintColor(color, renderingMode: .alwaysOriginal)
32
+ }
33
+
34
+ public func withTintColor(_ color: UIColor, renderingMode: RenderingMode) -> UIImage {
35
+ guard let recipe = _recipe, recipe.source != nil else { return _copy(renderingMode: renderingMode.rawValue) }
36
+ let tinted = recipe.adding(.object([
37
+ "op": .string("tint"),
38
+ "r": .number(color.red), "g": .number(color.green), "b": .number(color.blue), "a": .number(color.alpha),
39
+ ]), extent: recipe.extent)
40
+ return _copy(recipe: tinted, renderingMode: renderingMode.rawValue)
41
+ }
42
+ }
43
+
44
+ // MARK: - Drawing into the current context
45
+
46
+ /// The contexts pushed by renderers and `UIGraphicsPushContext`, innermost last.
47
+ nonisolated(unsafe) private var contextStack: [CGContext] = []
48
+ /// The contexts `UIGraphicsBeginImageContext…` made, with their scale.
49
+ nonisolated(unsafe) private var imageContexts: [(context: CGContext, scale: CGFloat)] = []
50
+
51
+ public func UIGraphicsGetCurrentContext() -> CGContext? { contextStack.last }
52
+ public func UIGraphicsPushContext(_ context: CGContext) { contextStack.append(context) }
53
+ public func UIGraphicsPopContext() { _ = contextStack.popLast() }
54
+
55
+ public func UIGraphicsBeginImageContext(_ size: CGSize) {
56
+ UIGraphicsBeginImageContextWithOptions(size, false, 1)
57
+ }
58
+
59
+ /// A scale of 0 is the screen's (3).
60
+ public func UIGraphicsBeginImageContextWithOptions(_ size: CGSize, _ opaque: Bool, _ scale: CGFloat) {
61
+ let factor = scale > 0 ? scale : UIScreen.main.scale
62
+ guard let context = _uiKitContext(size: size, scale: factor) else { return }
63
+ imageContexts.append((context, factor))
64
+ contextStack.append(context)
65
+ }
66
+
67
+ public func UIGraphicsGetImageFromCurrentImageContext() -> UIImage? {
68
+ guard let (context, scale) = imageContexts.last, let image = context.makeImage() else { return nil }
69
+ return UIImage(cgImage: image, scale: scale, orientation: .up)
70
+ }
71
+
72
+ public func UIGraphicsEndImageContext() {
73
+ guard let (context, _) = imageContexts.popLast() else { return }
74
+ if let index = contextStack.lastIndex(where: { $0 === context }) { contextStack.remove(at: index) }
75
+ }
76
+
77
+ /// A bitmap context of `size` points at `scale` pixels per point, in UIKit's
78
+ /// coordinates: points, origin at the top left.
79
+ func _uiKitContext(size: CGSize, scale: CGFloat) -> CGContext? {
80
+ let width = Int((size.width * scale).rounded(.up)), height = Int((size.height * scale).rounded(.up))
81
+ guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: width * 4,
82
+ space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
83
+ else { return nil }
84
+ context.translateBy(x: 0, y: CGFloat(height))
85
+ context.scaleBy(x: scale, y: -scale)
86
+ return context
87
+ }
88
+
89
+ extension UIImage {
90
+ /// Draws the image scaled into `rect` (points, in the current context's
91
+ /// coordinates). A symbol or catalog image has no bitmap here and draws nothing.
92
+ public func draw(in rect: CGRect) {
93
+ guard let context = UIGraphicsGetCurrentContext(), let cgImage else { return }
94
+ context.draw(cgImage, in: rect)
95
+ }
96
+
97
+ public func draw(in rect: CGRect, blendMode: CGBlendMode, alpha: CGFloat) { draw(in: rect) }
98
+
99
+ public func draw(at point: CGPoint) { draw(in: CGRect(origin: point, size: size)) }
100
+
101
+ public func draw(at point: CGPoint, blendMode: CGBlendMode, alpha: CGFloat) { draw(at: point) }
102
+ }
103
+
104
+ // MARK: - UIGraphicsImageRenderer
105
+
106
+ public class UIGraphicsRendererFormat: @unchecked Sendable {
107
+ public init() {}
108
+ public var bounds: CGRect = .zero
109
+ }
110
+
111
+ public final class UIGraphicsImageRendererFormat: UIGraphicsRendererFormat, @unchecked Sendable {
112
+ /// Pixels per point: the screen's (3) by default.
113
+ public var scale: CGFloat = UIScreen.main.scale
114
+ public var opaque = false
115
+ public var preferredRange: Range = .automatic
116
+
117
+ public enum Range: Int, Sendable { case unspecified = -1, automatic, `default`, extended, standard }
118
+
119
+ public override init() { super.init() }
120
+
121
+ public init(for traitCollection: UITraitCollection) {
122
+ super.init()
123
+ scale = traitCollection.displayScale
124
+ }
125
+
126
+ public class func `default`() -> UIGraphicsImageRendererFormat { UIGraphicsImageRendererFormat() }
127
+ public class func preferred() -> UIGraphicsImageRendererFormat { UIGraphicsImageRendererFormat() }
128
+ }
129
+
130
+ public class UIGraphicsRendererContext: @unchecked Sendable {
131
+ public let cgContext: CGContext
132
+ init(cgContext: CGContext) { self.cgContext = cgContext }
133
+
134
+ public func fill(_ rect: CGRect) { cgContext.fill(rect) }
135
+ public func fill(_ rect: CGRect, blendMode: CGBlendMode) { cgContext.fill(rect) }
136
+ public func stroke(_ rect: CGRect) { cgContext.stroke(rect) }
137
+ public func stroke(_ rect: CGRect, blendMode: CGBlendMode) { cgContext.stroke(rect) }
138
+ public func clip(to rect: CGRect) { cgContext.clip(to: rect) }
139
+ }
140
+
141
+ public final class UIGraphicsImageRendererContext: UIGraphicsRendererContext, @unchecked Sendable {
142
+ public let format: UIGraphicsImageRendererFormat
143
+
144
+ init(cgContext: CGContext, format: UIGraphicsImageRendererFormat) {
145
+ self.format = format
146
+ super.init(cgContext: cgContext)
147
+ }
148
+
149
+ /// What has been drawn so far.
150
+ public var currentImage: UIImage {
151
+ cgContext.makeImage().map { UIImage(cgImage: $0, scale: format.scale, orientation: .up) } ?? UIImage()
152
+ }
153
+ }
154
+
155
+ public class UIGraphicsRenderer: @unchecked Sendable {
156
+ public init() {}
157
+ }
158
+
159
+ /// Makes images by drawing: `renderer.image { context in … }`.
160
+ public final class UIGraphicsImageRenderer: UIGraphicsRenderer, @unchecked Sendable {
161
+ public let format: UIGraphicsImageRendererFormat
162
+ let size: CGSize
163
+
164
+ public init(size: CGSize) {
165
+ self.size = size
166
+ format = .default()
167
+ format.bounds = CGRect(origin: .zero, size: size)
168
+ }
169
+
170
+ public init(size: CGSize, format: UIGraphicsImageRendererFormat) {
171
+ self.size = size
172
+ self.format = format
173
+ format.bounds = CGRect(origin: .zero, size: size)
174
+ }
175
+
176
+ public init(bounds: CGRect, format: UIGraphicsImageRendererFormat = .default()) {
177
+ size = bounds.size
178
+ self.format = format
179
+ format.bounds = bounds
180
+ }
181
+
182
+ public typealias DrawingActions = (UIGraphicsImageRendererContext) -> Void
183
+
184
+ /// The image `actions` draw, `size` points at the format's scale.
185
+ public func image(actions: DrawingActions) -> UIImage {
186
+ guard let context = _uiKitContext(size: size, scale: format.scale) else { return UIImage() }
187
+ let rendererContext = UIGraphicsImageRendererContext(cgContext: context, format: format)
188
+ contextStack.append(context)
189
+ actions(rendererContext)
190
+ if let index = contextStack.lastIndex(where: { $0 === context }) { contextStack.remove(at: index) }
191
+ return rendererContext.currentImage
192
+ }
193
+
194
+ /// Nil: the browser build cannot encode images (as `UIImage.pngData()`).
195
+ public func pngData(actions: DrawingActions) -> Data {
196
+ _ = image(actions: actions)
197
+ return Data()
198
+ }
199
+
200
+ public func jpegData(withCompressionQuality compressionQuality: CGFloat, actions: DrawingActions) -> Data {
201
+ _ = image(actions: actions)
202
+ return Data()
203
+ }
204
+ }
@@ -0,0 +1,185 @@
1
+ // SwiftUI inside UIKit inside SwiftUI, and the controllers representables
2
+ // wrap. A `UIHostingController`'s view is a `_UIHostingView` holding the root
3
+ // view; when a representable's tree contains it, the translation draws the
4
+ // root view inline, as a subtree of the representable (ViewTranslation.swift),
5
+ // so its state lives as long as the hosting view keeps its place. A hosting
6
+ // controller that no representable shows (presented, pushed, or a window's
7
+ // root) draws nothing.
8
+ //
9
+ // `UIImagePickerController` has no camera or library here:
10
+ // `isSourceTypeAvailable` is false for every source, and a picker that is
11
+ // shown anyway draws a "camera unavailable" notice whose Cancel button
12
+ // tells the delegate, as the picker's own Cancel would. Code that presents
13
+ // the picker with `present(_:animated:)` shows nothing.
14
+
15
+ import Foundation
16
+ import FoundationBridge
17
+ import SwiftUI
18
+
19
+ // MARK: - Hosting controllers
20
+
21
+ /// What a hosting controller's view sizes itself by; kept.
22
+ public struct UIHostingControllerSizingOptions: OptionSet, Sendable {
23
+ public let rawValue: Int
24
+ public init(rawValue: Int) { self.rawValue = rawValue }
25
+ public static let preferredContentSize = UIHostingControllerSizingOptions(rawValue: 1 << 0)
26
+ public static let intrinsicContentSize = UIHostingControllerSizingOptions(rawValue: 1 << 1)
27
+ }
28
+
29
+ /// A view controller whose view is a SwiftUI view.
30
+ @MainActor
31
+ open class UIHostingController<Content: View>: UIViewController {
32
+ /// The SwiftUI view; setting it draws the new one.
33
+ open var rootView: Content {
34
+ didSet { (viewIfLoaded as? _UIHostingView)?.rootView = AnyView(rootView) }
35
+ }
36
+ open var sizingOptions: UIHostingControllerSizingOptions = []
37
+ open var safeAreaRegions: SafeAreaRegions = .all
38
+
39
+ public init(rootView: Content) {
40
+ self.rootView = rootView
41
+ super.init(nibName: nil, bundle: nil)
42
+ }
43
+
44
+ public required init?(coder: NSCoder) { return nil }
45
+
46
+ open override func loadView() {
47
+ view = _UIHostingView(rootView: AnyView(rootView))
48
+ }
49
+
50
+ /// The root view's size for `size`, from the page's measurement of it
51
+ /// (`_ViewMeasurements`, SwiftUI/Runtime/Measurements.swift): zero until
52
+ /// the page has measured it, which a render later it has, and the code
53
+ /// that asked runs again.
54
+ open func sizeThatFits(in size: CGSize) -> CGSize {
55
+ _UIHostingView.measuredSize(of: AnyView(rootView), fitting: size)
56
+ }
57
+ }
58
+
59
+ /// A hosting controller's view: drawn as its root view.
60
+ @MainActor
61
+ public final class _UIHostingView: UIView {
62
+ var rootView: AnyView { didSet { _setNeedsTranslation() } }
63
+
64
+ init(rootView: AnyView) {
65
+ self.rootView = rootView
66
+ super.init(frame: .zero)
67
+ }
68
+
69
+ public required init?(coder: NSCoder) { return nil }
70
+
71
+ /// Measured by the page, like the controller's `sizeThatFits(in:)`.
72
+ public override func sizeThatFits(_ size: CGSize) -> CGSize {
73
+ Self.measuredSize(of: rootView, fitting: size)
74
+ }
75
+
76
+ /// The root view's ideal size, measured by the page (zero until it is).
77
+ public override var intrinsicContentSize: CGSize {
78
+ _ViewMeasurements.shared.size(of: rootView, fitting: .unspecified) ?? .zero
79
+ }
80
+
81
+ static func measuredSize(of view: AnyView, fitting size: CGSize) -> CGSize {
82
+ _ViewMeasurements.shared.size(of: view, fitting: ProposedViewSize(size)) ?? .zero
83
+ }
84
+ }
85
+
86
+ // MARK: - Navigation controller delegate
87
+
88
+ /// What a navigation controller tells its delegate; kept (nothing calls it).
89
+ @MainActor
90
+ public protocol UINavigationControllerDelegate: AnyObject {
91
+ func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool)
92
+ func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
93
+ }
94
+
95
+ extension UINavigationControllerDelegate {
96
+ public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {}
97
+ public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {}
98
+ }
99
+
100
+ /// A view controller transition's coordinator (`viewWillTransition(to:with:)`); never used.
101
+ @MainActor
102
+ public protocol UIViewControllerTransitionCoordinator: AnyObject {}
103
+
104
+ // MARK: - Image picker
105
+
106
+ /// What an image picker tells its delegate. Cancelling dismisses the picker
107
+ /// unless the delegate says otherwise, as on iOS.
108
+ @MainActor
109
+ public protocol UIImagePickerControllerDelegate: AnyObject {
110
+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any])
111
+ func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
112
+ }
113
+
114
+ extension UIImagePickerControllerDelegate {
115
+ public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {}
116
+ public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
117
+ picker.dismiss(animated: true)
118
+ }
119
+ }
120
+
121
+ /// The system's camera and photo picker: unavailable in the browser (see the
122
+ /// top of the file).
123
+ @MainActor
124
+ open class UIImagePickerController: UINavigationController {
125
+ public enum SourceType: Int, Sendable { case photoLibrary, camera, savedPhotosAlbum }
126
+ public enum CameraDevice: Int, Sendable { case rear, front }
127
+ public enum CameraCaptureMode: Int, Sendable { case photo, video }
128
+ public enum CameraFlashMode: Int, Sendable { case off = -1, auto = 0, on = 1 }
129
+ public enum QualityType: Int, Sendable { case typeHigh, typeMedium, typeLow, type640x480, typeIFrame1280x720, typeIFrame960x540 }
130
+
131
+ public struct InfoKey: Hashable, RawRepresentable, Sendable {
132
+ public let rawValue: String
133
+ public init(rawValue: String) { self.rawValue = rawValue }
134
+ public static let mediaType = InfoKey(rawValue: "UIImagePickerControllerMediaType")
135
+ public static let originalImage = InfoKey(rawValue: "UIImagePickerControllerOriginalImage")
136
+ public static let editedImage = InfoKey(rawValue: "UIImagePickerControllerEditedImage")
137
+ public static let cropRect = InfoKey(rawValue: "UIImagePickerControllerCropRect")
138
+ public static let mediaURL = InfoKey(rawValue: "UIImagePickerControllerMediaURL")
139
+ public static let imageURL = InfoKey(rawValue: "UIImagePickerControllerImageURL")
140
+ public static let mediaMetadata = InfoKey(rawValue: "UIImagePickerControllerMediaMetadata")
141
+ }
142
+
143
+ open weak var delegate: (any UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
144
+ open var sourceType: SourceType = .photoLibrary
145
+ open var mediaTypes: [String] = ["public.image"]
146
+ open var allowsEditing = false
147
+ open var cameraDevice: CameraDevice = .rear
148
+ open var cameraCaptureMode: CameraCaptureMode = .photo
149
+ open var cameraFlashMode: CameraFlashMode = .auto
150
+ open var videoQuality: QualityType = .typeMedium
151
+ open var videoMaximumDuration: TimeInterval = 600
152
+ open var showsCameraControls = true
153
+
154
+ /// False: the browser build has no camera or photo library to pick from.
155
+ open class func isSourceTypeAvailable(_ sourceType: SourceType) -> Bool { false }
156
+ open class func availableMediaTypes(for sourceType: SourceType) -> [String]? { nil }
157
+ open class func isCameraDeviceAvailable(_ cameraDevice: CameraDevice) -> Bool { false }
158
+
159
+ open func takePicture() {}
160
+
161
+ open override func loadView() {
162
+ view = _UIHostingView(rootView: AnyView(_ImagePickerUnavailableView(picker: self)))
163
+ }
164
+ }
165
+
166
+ /// What a shown image picker draws.
167
+ private struct _ImagePickerUnavailableView: View {
168
+ let picker: UIImagePickerController
169
+
170
+ var body: some View {
171
+ VStack(spacing: 16) {
172
+ ContentUnavailableView(picker.sourceType == .camera ? "Camera Unavailable" : "Photos Unavailable",
173
+ systemImage: picker.sourceType == .camera ? "camera" : "photo",
174
+ description: Text("This app is running in a browser."))
175
+ Button("Cancel") {
176
+ if let delegate = picker.delegate {
177
+ delegate.imagePickerControllerDidCancel(picker)
178
+ } else {
179
+ picker.dismiss(animated: true)
180
+ }
181
+ }
182
+ }
183
+ .padding()
184
+ }
185
+ }
@@ -0,0 +1,24 @@
1
+ // On iOS UIKit's views, view controllers and presentation controllers are
2
+ // NSObjects, and NSObject is Equatable and Hashable: two objects are equal
3
+ // when they are the same object (`isEqual:`'s default) and hash by address.
4
+ // Code relies on it: `controllers.contains(controller)`, a `Set<UIView>`, a
5
+ // dictionary keyed by view (SwiftUI-Introspect walks ancestors that way).
6
+ // The shim's classes are not NSObjects, so they get the same identity
7
+ // conformances here.
8
+
9
+ import Foundation
10
+
11
+ extension UIView: Hashable {
12
+ nonisolated public static func == (lhs: UIView, rhs: UIView) -> Bool { lhs === rhs }
13
+ nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
14
+ }
15
+
16
+ extension UIViewController: Hashable {
17
+ nonisolated public static func == (lhs: UIViewController, rhs: UIViewController) -> Bool { lhs === rhs }
18
+ nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
19
+ }
20
+
21
+ extension UIPresentationController: Hashable {
22
+ nonisolated public static func == (lhs: UIPresentationController, rhs: UIPresentationController) -> Bool { lhs === rhs }
23
+ nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
24
+ }