@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,69 @@
1
+ // UIKit's alerts and action sheets, as code builds them: a
2
+ // `UIAlertController` with its title, message, actions and text fields. Like
3
+ // any presented view controller (Introspectable.swift), presenting one
4
+ // records it and shows nothing, so no action's handler is called; SwiftUI's
5
+ // `.alert` and `.confirmationDialog` are what the page shows.
6
+
7
+ import Foundation
8
+ import FoundationBridge
9
+ import SwiftUI
10
+
11
+ /// An alert's button: its title, style and handler.
12
+ @MainActor
13
+ open class UIAlertAction {
14
+ public enum Style: Int, Sendable {
15
+ case `default` = 0
16
+ case cancel = 1
17
+ case destructive = 2
18
+ }
19
+
20
+ public let title: String?
21
+ public let style: Style
22
+ open var isEnabled = true
23
+ let handler: ((UIAlertAction) -> Void)?
24
+
25
+ public init(title: String?, style: Style, handler: ((UIAlertAction) -> Void)? = nil) {
26
+ self.title = title
27
+ self.style = style
28
+ self.handler = handler
29
+ }
30
+ }
31
+
32
+ /// An alert or action sheet. Presenting it shows nothing (see above).
33
+ @MainActor
34
+ open class UIAlertController: UIViewController {
35
+ public enum Style: Int, Sendable {
36
+ case actionSheet = 0
37
+ case alert = 1
38
+ }
39
+
40
+ open var message: String?
41
+ public let preferredStyle: Style
42
+ public private(set) var actions: [UIAlertAction] = []
43
+ open var preferredAction: UIAlertAction?
44
+ public private(set) var textFields: [UITextField]?
45
+ open var severity: UIAlertControllerSeverity = .default
46
+
47
+ public init(title: String?, message: String?, preferredStyle: Style) {
48
+ self.message = message
49
+ self.preferredStyle = preferredStyle
50
+ super.init(nibName: nil, bundle: nil)
51
+ self.title = title
52
+ }
53
+
54
+ public required init?(coder: NSCoder) { nil }
55
+
56
+ open func addAction(_ action: UIAlertAction) { actions.append(action) }
57
+
58
+ open func addTextField(configurationHandler: ((UITextField) -> Void)? = nil) {
59
+ let field = UITextField()
60
+ configurationHandler?(field)
61
+ textFields = (textFields ?? []) + [field]
62
+ }
63
+ }
64
+
65
+ /// How serious an alert is (Mac Catalyst); kept.
66
+ public enum UIAlertControllerSeverity: Int, Sendable {
67
+ case `default` = 0
68
+ case critical = 1
69
+ }
@@ -0,0 +1,222 @@
1
+ // The application delegate, as SwiftUI apps adopt one with
2
+ // `@UIApplicationDelegateAdaptor`, and the UIKit types its methods name.
3
+ //
4
+ // The adaptor makes the delegate once, when the app is created, sets it as
5
+ // `UIApplication.shared.delegate`, and calls
6
+ // `application(_:willFinishLaunchingWithOptions:)` then
7
+ // `application(_:didFinishLaunchingWithOptions:)` (no launch options), as
8
+ // UIKit does before the first scene. The other methods are not called: the
9
+ // page gets no device token (RemoteNotifications.swift), no remote
10
+ // notifications or background fetches. The page's one scene connects after
11
+ // launching: the delegate's `configurationForConnecting` names the scene
12
+ // delegate class, which is made and told the scene connected, and an
13
+ // observable scene delegate goes in the environment, as SwiftUI does
14
+ // (SceneDelegates.swift). Responders here are only what a delegate inherits
15
+ // from; views do not take part in a responder chain. `buildMenu(with:)` is
16
+ // never called (there is no menu bar), and alternate app icons are not
17
+ // supported (a web page has one icon).
18
+
19
+ import Foundation
20
+ import FoundationBridge
21
+ import SwiftUI
22
+
23
+ /// What an app delegate inherits: an object in UIKit's responder chain.
24
+ @MainActor
25
+ open class UIResponder {
26
+ public required init() {}
27
+
28
+ /// Nil: views do not form a responder chain here.
29
+ open var next: UIResponder? { nil }
30
+ open var canBecomeFirstResponder: Bool { false }
31
+ open var isFirstResponder: Bool { false }
32
+ @discardableResult open func becomeFirstResponder() -> Bool { false }
33
+ @discardableResult open func resignFirstResponder() -> Bool { true }
34
+
35
+ /// Never called: there is no menu bar.
36
+ open func buildMenu(with builder: any UIMenuBuilder) {}
37
+ open func validate(_ command: UICommand) {}
38
+ }
39
+
40
+ /// The app's delegate. Every method has a default; the adaptor calls the
41
+ /// launching ones (see the file comment).
42
+ @MainActor
43
+ public protocol UIApplicationDelegate: AnyObject {
44
+ func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
45
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
46
+ func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
47
+ func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: any Error)
48
+ func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult
49
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession,
50
+ options: UIScene.ConnectionOptions) -> UISceneConfiguration
51
+ func applicationDidBecomeActive(_ application: UIApplication)
52
+ func applicationWillResignActive(_ application: UIApplication)
53
+ func applicationDidEnterBackground(_ application: UIApplication)
54
+ func applicationWillEnterForeground(_ application: UIApplication)
55
+ func applicationWillTerminate(_ application: UIApplication)
56
+ }
57
+
58
+ extension UIApplicationDelegate {
59
+ public func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { true }
60
+ public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { true }
61
+ public func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {}
62
+ public func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: any Error) {}
63
+ public func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult { .noData }
64
+ public func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession,
65
+ options: UIScene.ConnectionOptions) -> UISceneConfiguration {
66
+ UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
67
+ }
68
+ public func applicationDidBecomeActive(_ application: UIApplication) {}
69
+ public func applicationWillResignActive(_ application: UIApplication) {}
70
+ public func applicationDidEnterBackground(_ application: UIApplication) {}
71
+ public func applicationWillEnterForeground(_ application: UIApplication) {}
72
+ public func applicationWillTerminate(_ application: UIApplication) {}
73
+ }
74
+
75
+ /// What a background fetch or a remote notification's handling found.
76
+ public enum UIBackgroundFetchResult: UInt, Sendable {
77
+ case newData, noData, failed
78
+ }
79
+
80
+ extension UIApplication {
81
+ /// Keys of the launch options a delegate is handed (none in the browser).
82
+ public struct LaunchOptionsKey: Hashable, RawRepresentable, Sendable {
83
+ public let rawValue: String
84
+ public init(rawValue: String) { self.rawValue = rawValue }
85
+ public static let url = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsURLKey")
86
+ public static let remoteNotification = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsRemoteNotificationKey")
87
+ public static let shortcutItem = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsShortcutItemKey")
88
+ public static let userActivityDictionary = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsUserActivityDictionaryKey")
89
+ }
90
+
91
+ /// The app's delegate: the one `@UIApplicationDelegateAdaptor` made.
92
+ public var delegate: (any UIApplicationDelegate)? {
93
+ get { _UIApplicationDelegateStorage.delegate }
94
+ set { _UIApplicationDelegateStorage.delegate = newValue }
95
+ }
96
+
97
+ /// False: a web page has one icon.
98
+ public var supportsAlternateIcons: Bool { false }
99
+ /// Nil: the primary icon.
100
+ public var alternateIconName: String? { nil }
101
+
102
+ /// Fails: alternate icons are not supported (the handler gets the error on the next turn).
103
+ public func setAlternateIconName(_ alternateIconName: String?, completionHandler: (@MainActor @Sendable ((any Error)?) -> Void)? = nil) {
104
+ guard let completionHandler else { return }
105
+ Task { @MainActor in completionHandler(Self.alternateIconsUnsupported) }
106
+ }
107
+
108
+ public func setAlternateIconName(_ alternateIconName: String?) async throws {
109
+ throw Self.alternateIconsUnsupported
110
+ }
111
+
112
+ static var alternateIconsUnsupported: NSError {
113
+ NSError(domain: "NSCocoaErrorDomain", code: 3328,
114
+ userInfo: [NSLocalizedDescriptionKey: "Alternate app icons are not supported in the browser."])
115
+ }
116
+ }
117
+
118
+ @MainActor
119
+ enum _UIApplicationDelegateStorage {
120
+ static var delegate: (any UIApplicationDelegate)?
121
+ }
122
+
123
+ /// Makes the app's delegate (see the file comment).
124
+ @MainActor
125
+ @propertyWrapper
126
+ public struct UIApplicationDelegateAdaptor<DelegateType: UIResponder & UIApplicationDelegate>: DynamicProperty {
127
+ let delegate: DelegateType
128
+
129
+ public init(_ delegateType: DelegateType.Type = DelegateType.self) {
130
+ delegate = Self.launch { delegateType.init() }
131
+ }
132
+
133
+ /// The delegate made the first time; later adaptors (the app value made again) share it.
134
+ static func launch(_ make: () -> DelegateType) -> DelegateType {
135
+ if let existing = _UIApplicationDelegateStorage.delegate as? DelegateType { return existing }
136
+ let delegate = make()
137
+ _UIApplicationDelegateStorage.delegate = delegate
138
+ _ = delegate.application(UIApplication.shared, willFinishLaunchingWithOptions: nil)
139
+ _ = delegate.application(UIApplication.shared, didFinishLaunchingWithOptions: nil)
140
+ _SceneConnection.connect(delegate)
141
+ return delegate
142
+ }
143
+
144
+ public var wrappedValue: DelegateType { delegate }
145
+ }
146
+
147
+ // MARK: - Menus
148
+
149
+ /// A menu bar's builder: there is no menu bar, so nothing is built.
150
+ @MainActor
151
+ public protocol UIMenuBuilder {
152
+ func menu(for identifier: UIMenu.Identifier) -> UIMenu?
153
+ func remove(menu removedIdentifier: UIMenu.Identifier)
154
+ func insertChild(_ childMenu: UIMenu, atStartOfMenu parentIdentifier: UIMenu.Identifier)
155
+ func insertChild(_ childMenu: UIMenu, atEndOfMenu parentIdentifier: UIMenu.Identifier)
156
+ func replace(menu replacedIdentifier: UIMenu.Identifier, with replacementMenu: UIMenu)
157
+ }
158
+
159
+ /// An element of a UIKit menu.
160
+ @MainActor
161
+ open class UIMenuElement {
162
+ public let title: String
163
+ public let image: UIImage?
164
+
165
+ init(title: String, image: UIImage?) {
166
+ self.title = title
167
+ self.image = image
168
+ }
169
+ }
170
+
171
+ /// A UIKit menu: kept, never shown.
172
+ @MainActor
173
+ open class UIMenu: UIMenuElement {
174
+ public struct Identifier: Hashable, RawRepresentable, Sendable {
175
+ public let rawValue: String
176
+ public init(rawValue: String) { self.rawValue = rawValue }
177
+ public init(_ rawValue: String) { self.rawValue = rawValue }
178
+ public static let application = Identifier("com.apple.menu.application")
179
+ public static let file = Identifier("com.apple.menu.file")
180
+ public static let edit = Identifier("com.apple.menu.edit")
181
+ public static let view = Identifier("com.apple.menu.view")
182
+ public static let window = Identifier("com.apple.menu.window")
183
+ public static let help = Identifier("com.apple.menu.help")
184
+ public static let format = Identifier("com.apple.menu.format")
185
+ public static let document = Identifier("com.apple.menu.document")
186
+ public static let toolbar = Identifier("com.apple.menu.toolbar")
187
+ public static let close = Identifier("com.apple.menu.close")
188
+ public static let newScene = Identifier("com.apple.menu.new-scene")
189
+ public static let preferences = Identifier("com.apple.menu.preferences")
190
+ }
191
+
192
+ public struct Options: OptionSet, Hashable, Sendable {
193
+ public let rawValue: UInt
194
+ public init(rawValue: UInt) { self.rawValue = rawValue }
195
+ public static let displayInline = Options(rawValue: 1 << 0)
196
+ public static let destructive = Options(rawValue: 1 << 1)
197
+ public static let singleSelection = Options(rawValue: 1 << 5)
198
+ }
199
+
200
+ public let identifier: Identifier
201
+ public let options: Options
202
+ public let children: [UIMenuElement]
203
+
204
+ public init(title: String = "", image: UIImage? = nil, identifier: Identifier? = nil, options: Options = [],
205
+ children: [UIMenuElement] = []) {
206
+ self.identifier = identifier ?? Identifier(UUID().uuidString)
207
+ self.options = options
208
+ self.children = children
209
+ super.init(title: title, image: image)
210
+ }
211
+ }
212
+
213
+ /// A menu command; kept, never shown.
214
+ @MainActor
215
+ open class UICommand: UIMenuElement {
216
+ public let action: FoundationBridge.Selector
217
+
218
+ public init(title: String, image: UIImage? = nil, action: FoundationBridge.Selector) {
219
+ self.action = action
220
+ super.init(title: title, image: image)
221
+ }
222
+ }
@@ -0,0 +1,84 @@
1
+ // UIKit's appearance proxies: `UINavigationBar.appearance().barTintColor = …`
2
+ // styles every navigation bar on iOS. The page draws its own bars, tab bars
3
+ // and lists from SwiftUI's elements, and no UIKit view of a class reaches it
4
+ // (UIView.swift, Introspectable.swift), so here a proxy only records: what is
5
+ // set on it reads back from it, and nothing else changes. Ice Cubes' theme
6
+ // sets the bars' tint this way.
7
+
8
+ import Foundation
9
+ import FoundationBridge
10
+ import SwiftUI
11
+
12
+ /// A type whose instances share settings through an appearance proxy.
13
+ @MainActor
14
+ public protocol UIAppearance: AnyObject {
15
+ /// The proxy for every instance of the class.
16
+ static func appearance() -> Self
17
+ /// The proxy for instances inside instances of `containerTypes` (outermost last).
18
+ static func appearance(whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self
19
+ /// The proxy for instances with `trait`'s traits.
20
+ static func appearance(for trait: UITraitCollection) -> Self
21
+ /// The proxy for instances with `trait`'s traits inside instances of `containerTypes`.
22
+ static func appearance(for trait: UITraitCollection,
23
+ whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self
24
+ }
25
+
26
+ /// A type an appearance proxy can be scoped to: views and view controllers.
27
+ @MainActor
28
+ public protocol UIAppearanceContainer: AnyObject {}
29
+
30
+ extension UIView: UIAppearanceContainer {}
31
+ extension UIViewController: UIAppearanceContainer {}
32
+
33
+ /// The proxies made so far, one per class and scope, kept for the app's life.
34
+ @MainActor
35
+ enum _UIAppearanceProxies {
36
+ static var proxies: [String: UIView] = [:]
37
+
38
+ /// Unarchiving an empty archive: how a proxy of a class is made without
39
+ /// knowing its initializers (`init?(coder:)` is UIView's required one).
40
+ final class Coder: NSCoder {}
41
+
42
+ static func proxy<V: UIView>(_ type: V.Type, scope: String) -> V {
43
+ let key = "\(ObjectIdentifier(type).hashValue)|\(scope)"
44
+ if let proxy = proxies[key] as? V { return proxy }
45
+ guard let proxy = type.init(coder: Coder()) else {
46
+ fatalError("\(type).init(coder:) returned nil, so it has no appearance proxy")
47
+ }
48
+ proxies[key] = proxy
49
+ return proxy
50
+ }
51
+
52
+ static func scope(_ containers: [any UIAppearanceContainer.Type], trait: UITraitCollection?) -> String {
53
+ let names = containers.map { String(reflecting: $0) }.joined(separator: ",")
54
+ return trait.map { "\(names)|\($0.userInterfaceStyle.rawValue)" } ?? names
55
+ }
56
+ }
57
+
58
+ extension UIView: UIAppearance {
59
+ /// The class's appearance proxy: an instance of the class, made once
60
+ /// (with `init?(coder:)` and an empty archive, the initializer every
61
+ /// view has), whose properties read back what the app set on them.
62
+ /// They are not copied to other instances: no UIKit view of the class is
63
+ /// drawn on the page, which follows SwiftUI's own styling.
64
+ public static func appearance() -> Self {
65
+ _UIAppearanceProxies.proxy(self, scope: "")
66
+ }
67
+
68
+ /// The proxy for views inside `containerTypes`, kept apart from the
69
+ /// class's own; recorded like it.
70
+ public static func appearance(whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self {
71
+ _UIAppearanceProxies.proxy(self, scope: _UIAppearanceProxies.scope(containerTypes, trait: nil))
72
+ }
73
+
74
+ /// The proxy for views with `trait`'s interface style; recorded.
75
+ public static func appearance(for trait: UITraitCollection) -> Self {
76
+ _UIAppearanceProxies.proxy(self, scope: _UIAppearanceProxies.scope([], trait: trait))
77
+ }
78
+
79
+ /// The proxy for views with `trait`'s interface style inside `containerTypes`; recorded.
80
+ public static func appearance(for trait: UITraitCollection,
81
+ whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self {
82
+ _UIAppearanceProxies.proxy(self, scope: _UIAppearanceProxies.scope(containerTypes, trait: trait))
83
+ }
84
+ }
@@ -0,0 +1,70 @@
1
+ // Converting between SwiftUI's `Color`, `UIColor` and Core Image's `CIColor`.
2
+ // A color with components converts exactly. A semantic color (the palette,
3
+ // `primary`, UIKit's semantic colors) becomes UIKit's semantic color of that
4
+ // name, which keeps following the color scheme through `Color(uiColor:)` and
5
+ // has its light-mode components; a color from the asset catalog is the
6
+ // page's to resolve, so it converts to black.
7
+
8
+ import Foundation
9
+ import SwiftUI
10
+
11
+ extension UIColor {
12
+ /// The color's components (see the top of this file for semantic and catalog colors).
13
+ public convenience init(_ color: Color) {
14
+ guard case .object(let fields) = color._json else { self.init(white: 0, alpha: 1); return }
15
+ func number(_ key: String) -> CGFloat? {
16
+ if case .number(let value)? = fields[key] { return CGFloat(value) }
17
+ return nil
18
+ }
19
+ if let r = number("r"), let g = number("g"), let b = number("b") {
20
+ self.init(red: r, green: g, blue: b, alpha: number("a") ?? 1)
21
+ return
22
+ }
23
+ let opacity = number("a") ?? number("opacity") ?? 1
24
+ guard case .string(let name)? = fields["name"], let base = UIColor.semanticColors[name] else {
25
+ self.init(white: 0, alpha: opacity)
26
+ return
27
+ }
28
+ if let semantic = base.semantic {
29
+ self.init(semantic: semantic.name, opacity: opacity, red: base.red, green: base.green, blue: base.blue, alpha: base.alpha * opacity)
30
+ } else {
31
+ self.init(red: base.red, green: base.green, blue: base.blue, alpha: base.alpha * opacity)
32
+ }
33
+ }
34
+
35
+ /// UIKit's color for each semantic `Color` name.
36
+ static let semanticColors: [String: UIColor] = {
37
+ var colors: [String: UIColor] = ["primary": .label, "secondary": .secondaryLabel, "clear": .clear,
38
+ // The app's accent color is the page's; system blue is its default.
39
+ "accent": UIColor(red: 0, green: 0.533, blue: 1, alpha: 1)]
40
+ let named: [UIColor] = [
41
+ .systemRed, .systemOrange, .systemYellow, .systemGreen, .systemMint, .systemTeal, .systemCyan, .systemBlue,
42
+ .systemIndigo, .systemPurple, .systemPink, .systemBrown, .systemGray,
43
+ .systemBackground, .secondarySystemBackground, .tertiarySystemBackground,
44
+ .systemGroupedBackground, .secondarySystemGroupedBackground, .tertiarySystemGroupedBackground,
45
+ .label, .secondaryLabel, .tertiaryLabel, .quaternaryLabel, .placeholderText, .separator, .opaqueSeparator,
46
+ .systemFill, .secondarySystemFill, .tertiarySystemFill, .quaternarySystemFill,
47
+ .systemGray2, .systemGray3, .systemGray4, .systemGray5, .systemGray6,
48
+ ]
49
+ for color in named {
50
+ if let name = color.semantic?.name { colors[name] = color }
51
+ }
52
+ return colors
53
+ }()
54
+
55
+ public convenience init(ciColor: CIColor) {
56
+ self.init(red: ciColor.red, green: ciColor.green, blue: ciColor.blue, alpha: ciColor.alpha)
57
+ }
58
+
59
+ public var ciColor: CIColor { CIColor(color: self) }
60
+ }
61
+
62
+ extension CIColor {
63
+ public convenience init(color: UIColor) {
64
+ self.init(red: color.red, green: color.green, blue: color.blue, alpha: color.alpha)
65
+ }
66
+
67
+ public convenience init(cgColor: CGColor) {
68
+ self.init(color: UIColor(cgColor: cgColor))
69
+ }
70
+ }
@@ -0,0 +1,225 @@
1
+ // UIKit pieces that view controllers built in code use, as far as camera
2
+ // screens (CodeScanner's `ScannerViewController`) need them: buttons, touches,
3
+ // layout guides, supported orientations and presentation delegates.
4
+ //
5
+ // - `UIButton` keeps a title, title color, image and background image per
6
+ // state and is drawn as a SwiftUI `Button` (ViewTranslation.swift) whose tap
7
+ // sends the button's `.touchUpInside` and `.primaryActionTriggered` actions.
8
+ // - Touches are not delivered: the page's taps reach buttons and SwiftUI views,
9
+ // not `touchesBegan(_:with:)`, which views and controllers have to override.
10
+ // - A view's `safeAreaLayoutGuide` and `layoutMarginsGuide` are its own edges
11
+ // (the page lays the safe area out around the app; margins are not applied).
12
+
13
+ import Foundation
14
+ import FoundationBridge
15
+ import SwiftUI
16
+
17
+ extension UIControl {
18
+ public struct State: OptionSet, Hashable, Sendable {
19
+ public let rawValue: UInt
20
+ public init(rawValue: UInt) { self.rawValue = rawValue }
21
+ public static let normal = State([])
22
+ public static let highlighted = State(rawValue: 1 << 0)
23
+ public static let disabled = State(rawValue: 1 << 1)
24
+ public static let selected = State(rawValue: 1 << 2)
25
+ public static let focused = State(rawValue: 1 << 3)
26
+ }
27
+ }
28
+
29
+ /// A button: drawn as a SwiftUI `Button` with its normal title and images.
30
+ @MainActor
31
+ open class UIButton: UIControl {
32
+ public enum ButtonType: Int, Sendable {
33
+ case custom = 0, system, detailDisclosure, infoLight, infoDark, contactAdd, close
34
+ public static let plain = ButtonType.system
35
+ }
36
+
37
+ public let buttonType: ButtonType
38
+ private var titles: [UInt: String] = [:]
39
+ private var titleColors: [UInt: UIColor] = [:]
40
+ private var images: [UInt: UIImage] = [:]
41
+ private var backgroundImages: [UInt: UIImage] = [:]
42
+
43
+ public override init(frame: CGRect) {
44
+ buttonType = .custom
45
+ super.init(frame: frame)
46
+ }
47
+
48
+ public init(type buttonType: ButtonType) {
49
+ self.buttonType = buttonType
50
+ super.init(frame: .zero)
51
+ }
52
+
53
+ public required init?(coder: NSCoder) {
54
+ buttonType = .custom
55
+ super.init(coder: coder)
56
+ }
57
+
58
+ open func setTitle(_ title: String?, for state: UIControl.State) {
59
+ titles[state.rawValue] = title
60
+ _setNeedsTranslation()
61
+ }
62
+
63
+ open func setTitleColor(_ color: UIColor?, for state: UIControl.State) {
64
+ titleColors[state.rawValue] = color
65
+ _setNeedsTranslation()
66
+ }
67
+
68
+ open func setImage(_ image: UIImage?, for state: UIControl.State) {
69
+ images[state.rawValue] = image
70
+ _setNeedsTranslation()
71
+ }
72
+
73
+ open func setBackgroundImage(_ image: UIImage?, for state: UIControl.State) {
74
+ backgroundImages[state.rawValue] = image
75
+ _setNeedsTranslation()
76
+ }
77
+
78
+ /// The value for `state`, else the normal state's, as UIKit falls back.
79
+ open func title(for state: UIControl.State) -> String? { titles[state.rawValue] ?? titles[0] }
80
+ open func titleColor(for state: UIControl.State) -> UIColor? { titleColors[state.rawValue] ?? titleColors[0] }
81
+ open func image(for state: UIControl.State) -> UIImage? { images[state.rawValue] ?? images[0] }
82
+ open func backgroundImage(for state: UIControl.State) -> UIImage? { backgroundImages[state.rawValue] ?? backgroundImages[0] }
83
+
84
+ open var currentTitle: String? { title(for: .normal) }
85
+ open var currentTitleColor: UIColor { titleColor(for: .normal) ?? (buttonType == .custom ? .white : tintColor) }
86
+ open var currentImage: UIImage? { image(for: .normal) }
87
+ open var currentBackgroundImage: UIImage? { backgroundImage(for: .normal) }
88
+
89
+ open override var intrinsicContentSize: CGSize {
90
+ let text = CGFloat(currentTitle?.count ?? 0) * 9
91
+ let image = currentImage?.size ?? .zero
92
+ let background = currentBackgroundImage?.size ?? .zero
93
+ return CGSize(width: max(text + image.width + (text > 0 ? 16 : 0), background.width, 30),
94
+ height: max(image.height, background.height, 30))
95
+ }
96
+
97
+ /// What a tap does: the actions for `.touchUpInside` and `.primaryActionTriggered`.
98
+ public func _tap() {
99
+ guard isEnabled else { return }
100
+ sendActions(for: [.touchUpInside, .primaryActionTriggered])
101
+ }
102
+ }
103
+
104
+ // MARK: - Touches
105
+
106
+ /// A finger on the screen. The page does not deliver touches to UIKit views.
107
+ @MainActor
108
+ open class UITouch {
109
+ public enum Phase: Int, Sendable { case began, moved, stationary, ended, cancelled }
110
+ public enum TouchType: Int, Sendable { case direct, indirect, pencil }
111
+
112
+ open var view: UIView?
113
+ open var window: UIWindow? { nil }
114
+ open var phase: Phase = .began
115
+ open var tapCount = 1
116
+ open var type: TouchType = .direct
117
+ open var timestamp: TimeInterval = 0
118
+ let point: CGPoint
119
+
120
+ public init() { point = .zero }
121
+
122
+ open func location(in view: UIView?) -> CGPoint { point }
123
+ open func previousLocation(in view: UIView?) -> CGPoint { point }
124
+ }
125
+
126
+ /// An event's touches.
127
+ @MainActor
128
+ open class UIEvent {
129
+ public enum EventType: Int, Sendable { case touches, motion, remoteControl, presses }
130
+ open var type: EventType { .touches }
131
+ open var allTouches: Set<UITouch>? { nil }
132
+ open var timestamp: TimeInterval { 0 }
133
+ public init() {}
134
+ }
135
+
136
+ extension UITouch: @preconcurrency Hashable {
137
+ nonisolated public static func == (lhs: UITouch, rhs: UITouch) -> Bool { lhs === rhs }
138
+ nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
139
+ }
140
+
141
+ // MARK: - Layout guides
142
+
143
+ /// A rectangle constraints can refer to: here, its view's own edges.
144
+ @MainActor
145
+ open class UILayoutGuide {
146
+ public private(set) weak var owningView: UIView?
147
+ open var identifier = ""
148
+
149
+ public init() {}
150
+ init(owningView: UIView) { self.owningView = owningView }
151
+
152
+ open var layoutFrame: CGRect { owningView?.bounds ?? .zero }
153
+
154
+ /// The view the anchors are on (a guide no view owns anchors to nothing).
155
+ private var view: UIView { owningView ?? UIView(frame: .zero) }
156
+
157
+ public var topAnchor: NSLayoutYAxisAnchor { view.topAnchor }
158
+ public var bottomAnchor: NSLayoutYAxisAnchor { view.bottomAnchor }
159
+ public var centerYAnchor: NSLayoutYAxisAnchor { view.centerYAnchor }
160
+ public var leadingAnchor: NSLayoutXAxisAnchor { view.leadingAnchor }
161
+ public var trailingAnchor: NSLayoutXAxisAnchor { view.trailingAnchor }
162
+ public var leftAnchor: NSLayoutXAxisAnchor { view.leftAnchor }
163
+ public var rightAnchor: NSLayoutXAxisAnchor { view.rightAnchor }
164
+ public var centerXAnchor: NSLayoutXAxisAnchor { view.centerXAnchor }
165
+ public var widthAnchor: NSLayoutDimension { view.widthAnchor }
166
+ public var heightAnchor: NSLayoutDimension { view.heightAnchor }
167
+ }
168
+
169
+ // MARK: - Orientation
170
+
171
+ public struct UIInterfaceOrientationMask: OptionSet, Hashable, Sendable {
172
+ public let rawValue: UInt
173
+ public init(rawValue: UInt) { self.rawValue = rawValue }
174
+ public static let portrait = UIInterfaceOrientationMask(rawValue: 1 << 1)
175
+ public static let portraitUpsideDown = UIInterfaceOrientationMask(rawValue: 1 << 2)
176
+ public static let landscapeRight = UIInterfaceOrientationMask(rawValue: 1 << 3)
177
+ public static let landscapeLeft = UIInterfaceOrientationMask(rawValue: 1 << 4)
178
+ public static let landscape: UIInterfaceOrientationMask = [.landscapeLeft, .landscapeRight]
179
+ public static let all: UIInterfaceOrientationMask = [.portrait, .portraitUpsideDown, .landscapeLeft, .landscapeRight]
180
+ public static let allButUpsideDown: UIInterfaceOrientationMask = [.portrait, .landscapeLeft, .landscapeRight]
181
+ }
182
+
183
+ /// The page's orientation: portrait, as the phone frame is.
184
+ public enum UIInterfaceOrientation: Int, Sendable {
185
+ case unknown = 0, portrait, portraitUpsideDown, landscapeLeft, landscapeRight
186
+ public var isPortrait: Bool { self == .portrait || self == .portraitUpsideDown }
187
+ public var isLandscape: Bool { self == .landscapeLeft || self == .landscapeRight }
188
+ }
189
+
190
+ extension UIWindowScene {
191
+ public var interfaceOrientation: UIInterfaceOrientation { .portrait }
192
+ }
193
+
194
+ // MARK: - Presentation delegates
195
+
196
+ /// Told about a presentation the viewer dismissed. The page's presentations
197
+ /// are SwiftUI's, so it is never called for a UIKit one.
198
+ @MainActor
199
+ public protocol UIAdaptivePresentationControllerDelegate: AnyObject {
200
+ func presentationControllerDidDismiss(_ presentationController: UIPresentationController)
201
+ func presentationControllerWillDismiss(_ presentationController: UIPresentationController)
202
+ func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool
203
+ func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)
204
+ }
205
+
206
+ extension UIAdaptivePresentationControllerDelegate {
207
+ public func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {}
208
+ public func presentationControllerWillDismiss(_ presentationController: UIPresentationController) {}
209
+ public func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { true }
210
+ public func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {}
211
+ }
212
+
213
+ // MARK: - Images from a bundle
214
+
215
+ extension UIImage {
216
+ /// The catalog image `name` (the app's catalogs: a package's are not
217
+ /// published), whatever the bundle and configuration.
218
+ public convenience init?(named name: String, in bundle: FoundationBridge.Bundle?, with configuration: UIImage.Configuration?) {
219
+ self.init(named: name)
220
+ }
221
+
222
+ public convenience init?(named name: String, in bundle: FoundationBridge.Bundle?, compatibleWith traitCollection: UITraitCollection?) {
223
+ self.init(named: name)
224
+ }
225
+ }