@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,855 @@
1
+ // UIKit's view classes. Packages that serve both UIKit and SwiftUI apps
2
+ // declare UIKit views next to their SwiftUI ones (NukeUI's `LazyImageView`
3
+ // next to `LazyImage`), and apps put UIKit views on screen with
4
+ // `UIViewRepresentable` (Representable.swift). The classes keep their state
5
+ // (frames, subviews, images, constraints); the page draws a view that a
6
+ // representable shows by translating it into SwiftUI views
7
+ // (ViewTranslation.swift). A change to something drawn tells that
8
+ // representable, so a change made outside a SwiftUI pass (a delegate
9
+ // callback, a timer) is drawn too. Constraints are solved for the simple
10
+ // cases: an edge, center or size equal to the superview's, a sibling's or a
11
+ // constant. Layers draw their color, corner radius, border and opacity (and
12
+ // a layer that draws itself, AVFoundation's `AVPlayerLayer`, its video);
13
+ // nothing animates. A layer is displayed before its view is first drawn, and
14
+ // `setNeedsDisplay()` displays it again at once: its view's `display(_:)`
15
+ // runs, so a view that shows its content from there (Gifu's `GIFImageView`,
16
+ // a frame at a time) is drawn with it.
17
+
18
+ import Foundation
19
+ import FoundationBridge
20
+ import SwiftUI
21
+
22
+ // MARK: - Layers and animations
23
+
24
+ /// A layer: its properties, kept. Its view draws the background color, corner
25
+ /// radius, border and opacity (ViewTranslation.swift); nothing is animated.
26
+ open class CALayer: @unchecked Sendable {
27
+ open var frame: CGRect = .zero
28
+ open var bounds: CGRect = .zero
29
+ open var backgroundColor: CGColor? { didSet { _changed() } }
30
+ open var cornerRadius: CGFloat = 0 { didSet { _changed() } }
31
+ open var masksToBounds = false { didSet { _changed() } }
32
+ open var opacity: Float = 1 { didSet { _changed() } }
33
+ open var isHidden = false { didSet { _changed() } }
34
+ open var borderWidth: CGFloat = 0 { didSet { _changed() } }
35
+ open var borderColor: CGColor? { didSet { _changed() } }
36
+ open var shadowOpacity: Float = 0
37
+ open var shadowRadius: CGFloat = 3
38
+ open var shadowColor: CGColor?
39
+ open var shadowOffset: CGSize = CGSize(width: 0, height: -3)
40
+ open var contents: Any?
41
+ public private(set) var animations: [String: CAAnimation] = [:]
42
+ /// The view this is the layer of, told when something drawn changes.
43
+ weak var _view: UIView?
44
+ /// Asked to display the layer's content: its view, as on iOS.
45
+ open weak var delegate: (any CALayerDelegate)?
46
+ private var displayRequested = false
47
+ private var isDisplaying = false
48
+ /// Whether the layer was displayed once; the page displays it before
49
+ /// drawing it the first time, as iOS does a view's layer.
50
+ public private(set) var _hasDisplayed = false
51
+ /// Sublayers are kept; of their content only a `_drawing` is drawn.
52
+ public private(set) var sublayers: [CALayer]?
53
+ public private(set) weak var superlayer: CALayer?
54
+
55
+ /// Required, so a view can make its `layerClass`.
56
+ public required init() {}
57
+
58
+ /// What the layer draws, as SwiftUI, or nil (the default: a layer's own
59
+ /// content is not drawn). AVFoundation's `AVPlayerLayer` answers its
60
+ /// player's video; the view whose layer (or sublayer) it is draws it
61
+ /// filling its bounds (ViewTranslation.swift).
62
+ open var _drawing: AnyView? { nil }
63
+
64
+ open func addSublayer(_ layer: CALayer) {
65
+ insertSublayer(layer, at: UInt32(sublayers?.count ?? 0))
66
+ }
67
+
68
+ open func insertSublayer(_ layer: CALayer, at index: UInt32) {
69
+ layer.removeFromSuperlayer()
70
+ var list = sublayers ?? []
71
+ list.insert(layer, at: min(Int(index), list.count))
72
+ sublayers = list
73
+ layer.superlayer = self
74
+ _changed()
75
+ }
76
+
77
+ open func insertSublayer(_ layer: CALayer, below sibling: CALayer?) {
78
+ let index = sibling.flatMap { sibling in sublayers?.firstIndex { $0 === sibling } } ?? 0
79
+ insertSublayer(layer, at: UInt32(index))
80
+ }
81
+
82
+ open func insertSublayer(_ layer: CALayer, above sibling: CALayer?) {
83
+ let index = sibling.flatMap { sibling in sublayers?.firstIndex { $0 === sibling }.map { $0 + 1 } } ?? (sublayers?.count ?? 0)
84
+ insertSublayer(layer, at: UInt32(index))
85
+ }
86
+
87
+ open func replaceSublayer(_ oldLayer: CALayer, with newLayer: CALayer) {
88
+ guard let index = sublayers?.firstIndex(where: { $0 === oldLayer }) else { return }
89
+ oldLayer.removeFromSuperlayer()
90
+ insertSublayer(newLayer, at: UInt32(index))
91
+ }
92
+
93
+ open func removeFromSuperlayer() {
94
+ guard let parent = superlayer else { return }
95
+ parent.sublayers?.removeAll { $0 === self }
96
+ superlayer = nil
97
+ parent._changed()
98
+ }
99
+
100
+ /// Displays the layer: its delegate's `display(_:)` runs at once (on
101
+ /// iOS it waits for the frame's commit, a turn of the run loop later). A
102
+ /// request made while the layer displays is part of that display.
103
+ open func setNeedsDisplay() {
104
+ displayRequested = true
105
+ guard !isDisplaying else { return }
106
+ displayIfNeeded()
107
+ }
108
+
109
+ open func setNeedsDisplay(_ rect: CGRect) { setNeedsDisplay() }
110
+
111
+ open func needsDisplay() -> Bool { displayRequested }
112
+
113
+ open func displayIfNeeded() {
114
+ guard displayRequested else { return }
115
+ display()
116
+ }
117
+
118
+ /// Asks the delegate to display the layer.
119
+ open func display() {
120
+ displayRequested = false
121
+ _hasDisplayed = true
122
+ guard let delegate else { return }
123
+ isDisplaying = true
124
+ defer {
125
+ isDisplaying = false
126
+ displayRequested = false
127
+ }
128
+ MainActor.assumeIsolated { delegate.display(self) }
129
+ }
130
+
131
+ open func add(_ animation: CAAnimation, forKey key: String?) {
132
+ if let key { animations[key] = animation }
133
+ }
134
+
135
+ open func removeAnimation(forKey key: String) { animations[key] = nil }
136
+ open func removeAllAnimations() { animations = [:] }
137
+
138
+ /// Tells the view this layer (or its nearest superlayer) belongs to that
139
+ /// something drawn changed. Subclasses call it for their own properties.
140
+ public func _changed() {
141
+ var layer: CALayer? = self
142
+ while let current = layer, current._view == nil { layer = current.superlayer }
143
+ guard let view = layer?._view else { return }
144
+ MainActor.assumeIsolated { view._setNeedsTranslation() }
145
+ }
146
+ }
147
+
148
+ /// What a layer asks of its view. `UIView` implements `display(_:)`; a view
149
+ /// that overrides it shows its content from there.
150
+ @MainActor
151
+ public protocol CALayerDelegate: AnyObject {
152
+ func display(_ layer: CALayer)
153
+ }
154
+
155
+ open class CAAnimation: @unchecked Sendable {
156
+ open var duration: TimeInterval = 0.25
157
+ open var beginTime: TimeInterval = 0
158
+ open var repeatCount: Float = 0
159
+ open var autoreverses = false
160
+ open var isRemovedOnCompletion = true
161
+
162
+ public init() {}
163
+ }
164
+
165
+ open class CAPropertyAnimation: CAAnimation, @unchecked Sendable {
166
+ open var keyPath: String?
167
+
168
+ public convenience init(keyPath path: String?) {
169
+ self.init()
170
+ keyPath = path
171
+ }
172
+ }
173
+
174
+ open class CABasicAnimation: CAPropertyAnimation, @unchecked Sendable {
175
+ open var fromValue: Any?
176
+ open var toValue: Any?
177
+ open var byValue: Any?
178
+ }
179
+
180
+ // MARK: - Layout constraints
181
+
182
+ /// What an anchor stands for.
183
+ enum _LayoutAttribute: Sendable {
184
+ case none, leading, trailing, centerX, width, top, bottom, centerY, height
185
+
186
+ var isHorizontal: Bool { self == .leading || self == .trailing || self == .centerX || self == .width }
187
+ }
188
+
189
+ /// A priority, as Auto Layout's (1…1000). Kept; the solver ignores it.
190
+ public struct UILayoutPriority: RawRepresentable, Hashable, Comparable, Sendable, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral {
191
+ public let rawValue: Float
192
+ public init(rawValue: Float) { self.rawValue = rawValue }
193
+ public init(_ rawValue: Float) { self.rawValue = rawValue }
194
+ public init(floatLiteral value: Float) { rawValue = value }
195
+ public init(integerLiteral value: Int) { rawValue = Float(value) }
196
+ public static func < (lhs: UILayoutPriority, rhs: UILayoutPriority) -> Bool { lhs.rawValue < rhs.rawValue }
197
+ public static let required = UILayoutPriority(1000)
198
+ public static let defaultHigh = UILayoutPriority(750)
199
+ public static let defaultLow = UILayoutPriority(250)
200
+ public static let fittingSizeLevel = UILayoutPriority(50)
201
+ }
202
+
203
+ /// A constraint between two anchors (or an anchor and a constant). Active
204
+ /// constraints of the simple kinds are solved when the view tree is laid out
205
+ /// (`UIView.layoutIfNeeded`, and before the page draws it); inequalities
206
+ /// and priorities are kept and ignored.
207
+ open class NSLayoutConstraint: @unchecked Sendable {
208
+ public enum Relation: Int, Sendable { case lessThanOrEqual = -1, equal = 0, greaterThanOrEqual = 1 }
209
+
210
+ open var isActive = false {
211
+ didSet {
212
+ guard isActive != oldValue else { return }
213
+ MainActor.assumeIsolated { register(isActive) }
214
+ }
215
+ }
216
+ open var constant: CGFloat {
217
+ didSet { MainActor.assumeIsolated { (_first.item ?? _second?.item)?._setNeedsTranslation() } }
218
+ }
219
+ open var priority: UILayoutPriority = .required
220
+ open var identifier: String?
221
+ public let multiplier: CGFloat
222
+ public let relation: Relation
223
+ let _first: _AnchorRef
224
+ let _second: _AnchorRef?
225
+
226
+ init(first: _AnchorRef, second: _AnchorRef?, relation: Relation = .equal, multiplier: CGFloat = 1, constant: CGFloat) {
227
+ _first = first
228
+ _second = second
229
+ self.relation = relation
230
+ self.multiplier = multiplier
231
+ self.constant = constant
232
+ }
233
+
234
+ open class func activate(_ constraints: [NSLayoutConstraint]) {
235
+ for constraint in constraints { constraint.isActive = true }
236
+ }
237
+
238
+ open class func deactivate(_ constraints: [NSLayoutConstraint]) {
239
+ for constraint in constraints { constraint.isActive = false }
240
+ }
241
+
242
+ /// Activation keeps the constraint on both its views (they hold it, it
243
+ /// holds them weakly), as the solver looks for it from either side.
244
+ @MainActor private func register(_ active: Bool) {
245
+ for item in [_first.item, _second?.item].compactMap({ $0 }) {
246
+ if active {
247
+ if !item._layoutConstraints.contains(where: { $0 === self }) { item._layoutConstraints.append(self) }
248
+ } else {
249
+ item._layoutConstraints.removeAll { $0 === self }
250
+ }
251
+ item._setNeedsTranslation()
252
+ }
253
+ }
254
+ }
255
+
256
+ /// An anchor's view and attribute.
257
+ struct _AnchorRef: @unchecked Sendable {
258
+ weak var item: UIView?
259
+ let attribute: _LayoutAttribute
260
+ }
261
+
262
+ open class NSLayoutAnchor<AnchorType: AnyObject>: @unchecked Sendable {
263
+ let _ref: _AnchorRef
264
+
265
+ public init() { _ref = _AnchorRef(item: nil, attribute: .none) }
266
+
267
+ init(item: UIView, attribute: _LayoutAttribute) { _ref = _AnchorRef(item: item, attribute: attribute) }
268
+
269
+ open func constraint(equalTo anchor: NSLayoutAnchor<AnchorType>) -> NSLayoutConstraint {
270
+ NSLayoutConstraint(first: _ref, second: anchor._ref, constant: 0)
271
+ }
272
+ open func constraint(equalTo anchor: NSLayoutAnchor<AnchorType>, constant c: CGFloat) -> NSLayoutConstraint {
273
+ NSLayoutConstraint(first: _ref, second: anchor._ref, constant: c)
274
+ }
275
+ open func constraint(greaterThanOrEqualTo anchor: NSLayoutAnchor<AnchorType>, constant c: CGFloat = 0) -> NSLayoutConstraint {
276
+ NSLayoutConstraint(first: _ref, second: anchor._ref, relation: .greaterThanOrEqual, constant: c)
277
+ }
278
+ open func constraint(lessThanOrEqualTo anchor: NSLayoutAnchor<AnchorType>, constant c: CGFloat = 0) -> NSLayoutConstraint {
279
+ NSLayoutConstraint(first: _ref, second: anchor._ref, relation: .lessThanOrEqual, constant: c)
280
+ }
281
+ }
282
+
283
+ open class NSLayoutXAxisAnchor: NSLayoutAnchor<NSLayoutXAxisAnchor>, @unchecked Sendable {}
284
+ open class NSLayoutYAxisAnchor: NSLayoutAnchor<NSLayoutYAxisAnchor>, @unchecked Sendable {}
285
+
286
+ open class NSLayoutDimension: NSLayoutAnchor<NSLayoutDimension>, @unchecked Sendable {
287
+ open func constraint(equalToConstant c: CGFloat) -> NSLayoutConstraint {
288
+ NSLayoutConstraint(first: _ref, second: nil, constant: c)
289
+ }
290
+ open func constraint(greaterThanOrEqualToConstant c: CGFloat) -> NSLayoutConstraint {
291
+ NSLayoutConstraint(first: _ref, second: nil, relation: .greaterThanOrEqual, constant: c)
292
+ }
293
+ open func constraint(lessThanOrEqualToConstant c: CGFloat) -> NSLayoutConstraint {
294
+ NSLayoutConstraint(first: _ref, second: nil, relation: .lessThanOrEqual, constant: c)
295
+ }
296
+ open func constraint(equalTo anchor: NSLayoutDimension, multiplier m: CGFloat, constant c: CGFloat = 0) -> NSLayoutConstraint {
297
+ NSLayoutConstraint(first: _ref, second: anchor._ref, multiplier: m, constant: c)
298
+ }
299
+ }
300
+
301
+ // MARK: - Views
302
+
303
+ /// A view: frames, subviews and appearance. A representable's view is drawn
304
+ /// (ViewTranslation.swift); any other is kept and never drawn.
305
+ @MainActor
306
+ open class UIView: CALayerDelegate {
307
+ public enum ContentMode: Int, Sendable {
308
+ case scaleToFill, scaleAspectFit, scaleAspectFill, redraw, center, top, bottom, left, right
309
+ case topLeft, topRight, bottomLeft, bottomRight
310
+ }
311
+
312
+ public struct AnimationOptions: OptionSet, Sendable {
313
+ public let rawValue: UInt
314
+ public init(rawValue: UInt) { self.rawValue = rawValue }
315
+ public static let allowUserInteraction = AnimationOptions(rawValue: 1 << 1)
316
+ public static let beginFromCurrentState = AnimationOptions(rawValue: 1 << 2)
317
+ public static let curveEaseInOut = AnimationOptions([])
318
+ public static let curveEaseIn = AnimationOptions(rawValue: 1 << 16)
319
+ public static let curveEaseOut = AnimationOptions(rawValue: 2 << 16)
320
+ public static let curveLinear = AnimationOptions(rawValue: 3 << 16)
321
+ public static let transitionCrossDissolve = AnimationOptions(rawValue: 5 << 20)
322
+ }
323
+
324
+ /// How a view's frame follows its superview's size (applied when the
325
+ /// superview's bounds change, as UIKit does).
326
+ public struct AutoresizingMask: OptionSet, Sendable {
327
+ public let rawValue: UInt
328
+ public init(rawValue: UInt) { self.rawValue = rawValue }
329
+ public static let flexibleLeftMargin = AutoresizingMask(rawValue: 1 << 0)
330
+ public static let flexibleWidth = AutoresizingMask(rawValue: 1 << 1)
331
+ public static let flexibleRightMargin = AutoresizingMask(rawValue: 1 << 2)
332
+ public static let flexibleTopMargin = AutoresizingMask(rawValue: 1 << 3)
333
+ public static let flexibleHeight = AutoresizingMask(rawValue: 1 << 4)
334
+ public static let flexibleBottomMargin = AutoresizingMask(rawValue: 1 << 5)
335
+ }
336
+
337
+ private var storedBounds: CGRect
338
+ private var storedCenter: CGPoint
339
+
340
+ /// Its center and its bounds' size, in the superview's coordinates.
341
+ open var frame: CGRect {
342
+ get {
343
+ CGRect(x: storedCenter.x - storedBounds.width / 2, y: storedCenter.y - storedBounds.height / 2,
344
+ width: storedBounds.width, height: storedBounds.height)
345
+ }
346
+ set {
347
+ let oldSize = storedBounds.size
348
+ storedCenter = CGPoint(x: newValue.midX, y: newValue.midY)
349
+ storedBounds.size = newValue.size
350
+ boundsSizeChanged(from: oldSize)
351
+ _setNeedsTranslation()
352
+ }
353
+ }
354
+ open var bounds: CGRect {
355
+ get { storedBounds }
356
+ set {
357
+ let oldSize = storedBounds.size
358
+ storedBounds = newValue
359
+ boundsSizeChanged(from: oldSize)
360
+ _setNeedsTranslation()
361
+ }
362
+ }
363
+ open var center: CGPoint {
364
+ get { storedCenter }
365
+ set {
366
+ storedCenter = newValue
367
+ _setNeedsTranslation()
368
+ }
369
+ }
370
+ open var isHidden = false { didSet { _setNeedsTranslation() } }
371
+ open var alpha: CGFloat = 1 { didSet { _setNeedsTranslation() } }
372
+ open var backgroundColor: UIColor? { didSet { _setNeedsTranslation() } }
373
+ open var tintColor: UIColor! = .systemBlue { didSet { _setNeedsTranslation() } }
374
+ open var contentMode: ContentMode = .scaleToFill { didSet { _setNeedsTranslation() } }
375
+ open var clipsToBounds = false { didSet { _setNeedsTranslation() } }
376
+ open var isUserInteractionEnabled = true { didSet { _setNeedsTranslation() } }
377
+ open var translatesAutoresizingMaskIntoConstraints = true
378
+ open var autoresizingMask: AutoresizingMask = []
379
+ open var autoresizesSubviews = true
380
+ open var tag = 0
381
+ open var accessibilityLabel: String?
382
+ open var isAccessibilityElement = false
383
+ /// The view's layer, an instance of `layerClass` (made on first use).
384
+ public private(set) lazy var layer: CALayer = {
385
+ let layer = (type(of: self).layerClass as? CALayer.Type)?.init() ?? CALayer()
386
+ layer._view = self
387
+ layer.delegate = self
388
+ return layer
389
+ }()
390
+ /// The class of the view's layer (`AVPlayerLayer` for a player view).
391
+ open class var layerClass: AnyClass { CALayer.self }
392
+ public private(set) weak var superview: UIView?
393
+ public private(set) var subviews: [UIView] = []
394
+ open var intrinsicContentSize: CGSize { CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric) }
395
+ public static let noIntrinsicMetric: CGFloat = -1
396
+ public static let layoutFittingCompressedSize = CGSize(width: 0, height: 0)
397
+ public static let layoutFittingExpandedSize = CGSize(width: 1_000_000, height: 1_000_000)
398
+ /// Kept; the page follows the app's color scheme.
399
+ open var overrideUserInterfaceStyle: UIUserInterfaceStyle = .unspecified
400
+ /// The window the view is in: the nearest `UIWindow` up its superviews.
401
+ /// SwiftUI draws the page without windows, so a representable's view is
402
+ /// in none: this is nil for it.
403
+ open var window: UIWindow? {
404
+ var current: UIView? = self
405
+ while let view = current {
406
+ if let window = view as? UIWindow { return window }
407
+ current = view.superview
408
+ }
409
+ return nil
410
+ }
411
+ /// Never called: no UIKit view moves into a window on the page (a
412
+ /// representable's view included; code waiting for one never hears).
413
+ open func willMove(toWindow newWindow: UIWindow?) {}
414
+ open func didMoveToWindow() {}
415
+ /// Called when the view joins or leaves a superview.
416
+ open func willMove(toSuperview newSuperview: UIView?) {}
417
+ open func didMoveToSuperview() {}
418
+ open func didAddSubview(_ subview: UIView) {}
419
+ open func willRemoveSubview(_ subview: UIView) {}
420
+ /// Kept; the browser sends no hardware key commands to UIKit views.
421
+ open var keyCommands: [UIKeyCommand]? { nil }
422
+
423
+ /// Active constraints this view takes part in.
424
+ var _layoutConstraints: [NSLayoutConstraint] = []
425
+ /// Set on the root view of a representable (Representable.swift): told
426
+ /// when something drawn in its tree changes.
427
+ var _translationHook: (() -> Void)?
428
+ private var isLayingOut = false
429
+ private var contentHugging: [NSLayoutConstraint.Axis: UILayoutPriority] = [:]
430
+ private var compressionResistance: [NSLayoutConstraint.Axis: UILayoutPriority] = [:]
431
+
432
+ public init(frame: CGRect) {
433
+ storedBounds = CGRect(origin: .zero, size: frame.size)
434
+ storedCenter = CGPoint(x: frame.midX, y: frame.midY)
435
+ layer._view = self
436
+ }
437
+
438
+ public convenience init() { self.init(frame: .zero) }
439
+
440
+ public required init?(coder: NSCoder) {
441
+ storedBounds = .zero
442
+ storedCenter = .zero
443
+ layer._view = self
444
+ }
445
+
446
+ open func addSubview(_ view: UIView) {
447
+ view.removeFromSuperview()
448
+ view.willMove(toSuperview: self)
449
+ subviews.append(view)
450
+ view.superview = self
451
+ view.didMoveToSuperview()
452
+ didAddSubview(view)
453
+ _setNeedsTranslation()
454
+ }
455
+
456
+ open func insertSubview(_ view: UIView, at index: Int) {
457
+ view.removeFromSuperview()
458
+ view.willMove(toSuperview: self)
459
+ subviews.insert(view, at: min(index, subviews.count))
460
+ view.superview = self
461
+ view.didMoveToSuperview()
462
+ didAddSubview(view)
463
+ _setNeedsTranslation()
464
+ }
465
+
466
+ open func insertSubview(_ view: UIView, belowSubview siblingSubview: UIView) {
467
+ insertSubview(view, at: subviews.firstIndex { $0 === siblingSubview } ?? 0)
468
+ }
469
+
470
+ open func insertSubview(_ view: UIView, aboveSubview siblingSubview: UIView) {
471
+ insertSubview(view, at: (subviews.firstIndex { $0 === siblingSubview } ?? subviews.count - 1) + 1)
472
+ }
473
+
474
+ open func removeFromSuperview() {
475
+ guard let parent = superview else { return }
476
+ parent.willRemoveSubview(self)
477
+ willMove(toSuperview: nil)
478
+ parent.subviews.removeAll { $0 === self }
479
+ superview = nil
480
+ didMoveToSuperview()
481
+ parent._setNeedsTranslation()
482
+ }
483
+
484
+ open func bringSubviewToFront(_ view: UIView) {
485
+ guard let index = subviews.firstIndex(where: { $0 === view }) else { return }
486
+ subviews.append(subviews.remove(at: index))
487
+ _setNeedsTranslation()
488
+ }
489
+
490
+ open func sendSubviewToBack(_ view: UIView) {
491
+ guard let index = subviews.firstIndex(where: { $0 === view }) else { return }
492
+ subviews.insert(subviews.remove(at: index), at: 0)
493
+ _setNeedsTranslation()
494
+ }
495
+
496
+ open func isDescendant(of view: UIView) -> Bool {
497
+ var current: UIView? = self
498
+ while let candidate = current {
499
+ if candidate === view { return true }
500
+ current = candidate.superview
501
+ }
502
+ return false
503
+ }
504
+
505
+ /// The view is drawn again with its new layout.
506
+ open func setNeedsLayout() { _setNeedsTranslation() }
507
+ /// Solves the subviews' constraints and calls `layoutSubviews()`, down the tree.
508
+ open func layoutIfNeeded() { _layoutTree() }
509
+ open func layoutSubviews() {}
510
+ open func setNeedsDisplay() { layer.setNeedsDisplay() }
511
+ open func setNeedsDisplay(_ rect: CGRect) { setNeedsDisplay() }
512
+ /// The layer's delegate method: the view is drawn again. A subclass that
513
+ /// overrides it shows its content from there.
514
+ open func display(_ layer: CALayer) { _setNeedsTranslation() }
515
+ /// Whether instances answer a selector. One made from a method
516
+ /// (`#selector(display(_:))`) names a method the compiler found; one made
517
+ /// from a string names nothing that can be called.
518
+ open class func instancesRespond(to aSelector: FoundationBridge.Selector?) -> Bool { aSelector?._hasMethod ?? false }
519
+ open func setNeedsUpdateConstraints() {}
520
+ open func updateConstraints() {}
521
+ open func updateConstraintsIfNeeded() {}
522
+ /// Resizes the view to `sizeThatFits` its current size.
523
+ open func sizeToFit() {
524
+ let size = sizeThatFits(bounds.size)
525
+ frame = CGRect(origin: frame.origin, size: CGSize(width: max(0, size.width), height: max(0, size.height)))
526
+ }
527
+ open func sizeThatFits(_ size: CGSize) -> CGSize {
528
+ let intrinsic = intrinsicContentSize
529
+ return CGSize(width: intrinsic.width < 0 ? bounds.width : intrinsic.width,
530
+ height: intrinsic.height < 0 ? bounds.height : intrinsic.height)
531
+ }
532
+ open func systemLayoutSizeFitting(_ targetSize: CGSize) -> CGSize { sizeThatFits(targetSize) }
533
+ open func invalidateIntrinsicContentSize() { _setNeedsTranslation() }
534
+
535
+ open var constraints: [NSLayoutConstraint] { _layoutConstraints }
536
+ open func addConstraint(_ constraint: NSLayoutConstraint) { constraint.isActive = true }
537
+ open func addConstraints(_ constraints: [NSLayoutConstraint]) { NSLayoutConstraint.activate(constraints) }
538
+ open func removeConstraint(_ constraint: NSLayoutConstraint) { constraint.isActive = false }
539
+ open func removeConstraints(_ constraints: [NSLayoutConstraint]) { NSLayoutConstraint.deactivate(constraints) }
540
+
541
+ open func contentHuggingPriority(for axis: NSLayoutConstraint.Axis) -> UILayoutPriority {
542
+ contentHugging[axis] ?? .defaultLow
543
+ }
544
+ open func setContentHuggingPriority(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis) {
545
+ contentHugging[axis] = priority
546
+ }
547
+ open func contentCompressionResistancePriority(for axis: NSLayoutConstraint.Axis) -> UILayoutPriority {
548
+ compressionResistance[axis] ?? .defaultHigh
549
+ }
550
+ open func setContentCompressionResistancePriority(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis) {
551
+ compressionResistance[axis] = priority
552
+ }
553
+
554
+ public var topAnchor: NSLayoutYAxisAnchor { NSLayoutYAxisAnchor(item: self, attribute: .top) }
555
+ public var bottomAnchor: NSLayoutYAxisAnchor { NSLayoutYAxisAnchor(item: self, attribute: .bottom) }
556
+ public var centerYAnchor: NSLayoutYAxisAnchor { NSLayoutYAxisAnchor(item: self, attribute: .centerY) }
557
+ public var leftAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .leading) }
558
+ public var rightAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .trailing) }
559
+ public var leadingAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .leading) }
560
+ public var trailingAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .trailing) }
561
+ public var centerXAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .centerX) }
562
+ public var widthAnchor: NSLayoutDimension { NSLayoutDimension(item: self, attribute: .width) }
563
+ public var heightAnchor: NSLayoutDimension { NSLayoutDimension(item: self, attribute: .height) }
564
+ /// The view's own edges: the page lays the safe area out around the app (Controls.swift).
565
+ public private(set) lazy var safeAreaLayoutGuide = UILayoutGuide(owningView: self)
566
+ /// The view's own edges: margins are kept, not applied.
567
+ public private(set) lazy var layoutMarginsGuide = UILayoutGuide(owningView: self)
568
+ open var layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
569
+ open var preservesSuperviewLayoutMargins = false
570
+
571
+ /// Not called: the page's taps reach buttons and SwiftUI views (Controls.swift).
572
+ open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {}
573
+ open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {}
574
+ open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {}
575
+ open func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {}
576
+
577
+ /// Runs `animations` at once (nothing animates on the page), then `completion`.
578
+ public class func animate(withDuration duration: TimeInterval, delay: TimeInterval = 0, options: AnimationOptions = [],
579
+ animations: @escaping () -> Void, completion: ((Bool) -> Void)? = nil) {
580
+ animations()
581
+ completion?(true)
582
+ }
583
+
584
+ public class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void) {
585
+ animations()
586
+ }
587
+
588
+ public class func transition(with view: UIView, duration: TimeInterval, options: AnimationOptions = [],
589
+ animations: (() -> Void)?, completion: ((Bool) -> Void)? = nil) {
590
+ animations?()
591
+ completion?(true)
592
+ }
593
+
594
+ public class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void) {
595
+ actionsWithoutAnimation()
596
+ }
597
+
598
+ // MARK: Drawing and layout (internal)
599
+
600
+ /// Tells the representable showing this view, if any, that something
601
+ /// drawn changed: it is translated again (Representable.swift decides
602
+ /// whether that needs a render).
603
+ func _setNeedsTranslation() {
604
+ var current: UIView? = self
605
+ while let view = current {
606
+ if let hook = view._translationHook {
607
+ hook()
608
+ return
609
+ }
610
+ current = view.superview
611
+ }
612
+ }
613
+
614
+ /// Solves the subviews' constraints, then lets the view lay them out
615
+ /// (`layoutSubviews`), and does the same for each subview.
616
+ func _layoutTree() {
617
+ guard !isLayingOut else { return }
618
+ isLayingOut = true
619
+ defer { isLayingOut = false }
620
+ _solveSubviewConstraints()
621
+ layoutSubviews()
622
+ for subview in subviews { subview._layoutTree() }
623
+ }
624
+
625
+ /// UIKit's autoresizing: each flexible part of a subview's mask takes a
626
+ /// share of the change in this view's size.
627
+ private func boundsSizeChanged(from oldSize: CGSize) {
628
+ let newSize = storedBounds.size
629
+ guard autoresizesSubviews, newSize != oldSize, oldSize != .zero || newSize != .zero else { return }
630
+ for subview in subviews where subview.translatesAutoresizingMaskIntoConstraints && !subview.autoresizingMask.isEmpty {
631
+ let mask = subview.autoresizingMask
632
+ var frame = subview.frame
633
+ func resize(_ origin: inout CGFloat, _ length: inout CGFloat, delta: CGFloat,
634
+ flexibleLead: Bool, flexibleLength: Bool, flexibleTrail: Bool, old: CGFloat) {
635
+ guard delta != 0 else { return }
636
+ let parts = [flexibleLead ? origin : nil, flexibleLength ? length : nil,
637
+ flexibleTrail ? max(0, old - origin - length) : nil].compactMap { $0 }
638
+ let flexibleCount = [flexibleLead, flexibleLength, flexibleTrail].filter { $0 }.count
639
+ guard flexibleCount > 0 else { return }
640
+ let total = parts.reduce(0, +)
641
+ func share(_ part: CGFloat) -> CGFloat { total > 0 ? delta * part / total : delta / CGFloat(flexibleCount) }
642
+ let leadShare = flexibleLead ? share(origin) : 0
643
+ let lengthShare = flexibleLength ? share(length) : 0
644
+ origin += leadShare
645
+ length = max(0, length + lengthShare)
646
+ }
647
+ resize(&frame.origin.x, &frame.size.width, delta: newSize.width - oldSize.width,
648
+ flexibleLead: mask.contains(.flexibleLeftMargin), flexibleLength: mask.contains(.flexibleWidth),
649
+ flexibleTrail: mask.contains(.flexibleRightMargin), old: oldSize.width)
650
+ resize(&frame.origin.y, &frame.size.height, delta: newSize.height - oldSize.height,
651
+ flexibleLead: mask.contains(.flexibleTopMargin), flexibleLength: mask.contains(.flexibleHeight),
652
+ flexibleTrail: mask.contains(.flexibleBottomMargin), old: oldSize.height)
653
+ subview.frame = frame
654
+ }
655
+ }
656
+
657
+ /// Sets the frame of each subview that uses constraints from its active
658
+ /// equalities with this view, a sibling (already placed: subviews are
659
+ /// solved in order, twice, so one placed later is seen the second time)
660
+ /// or a constant. An axis the constraints do not settle keeps the frame's
661
+ /// value, or the intrinsic size for a length.
662
+ private func _solveSubviewConstraints() {
663
+ let constrained = subviews.filter { !$0.translatesAutoresizingMaskIntoConstraints && !$0._layoutConstraints.isEmpty }
664
+ guard !constrained.isEmpty else { return }
665
+ for _ in 0..<2 {
666
+ for subview in constrained { subview._solveConstraints(in: self) }
667
+ }
668
+ }
669
+
670
+ private func _solveConstraints(in parent: UIView) {
671
+ // The value of an attribute of a view this one is constrained to, in
672
+ // the parent's bounds coordinates.
673
+ func value(of ref: _AnchorRef) -> CGFloat? {
674
+ guard let item = ref.item else { return nil }
675
+ let rect: CGRect
676
+ if item === parent {
677
+ rect = CGRect(origin: .zero, size: parent.bounds.size)
678
+ } else if item.superview === parent {
679
+ rect = item.frame
680
+ } else {
681
+ return nil
682
+ }
683
+ switch ref.attribute {
684
+ case .leading: return rect.minX
685
+ case .trailing: return rect.maxX
686
+ case .centerX: return rect.midX
687
+ case .width: return rect.width
688
+ case .top: return rect.minY
689
+ case .bottom: return rect.maxY
690
+ case .centerY: return rect.midY
691
+ case .height: return rect.height
692
+ case .none: return nil
693
+ }
694
+ }
695
+ var solved: [_LayoutAttribute: CGFloat] = [:]
696
+ var aspects: [(attribute: _LayoutAttribute, of: _LayoutAttribute, multiplier: CGFloat, constant: CGFloat)] = []
697
+ for constraint in _layoutConstraints where constraint.isActive && constraint.relation == .equal {
698
+ let (mine, other, forward): (_AnchorRef, _AnchorRef?, Bool)
699
+ if constraint._first.item === self {
700
+ (mine, other, forward) = (constraint._first, constraint._second, true)
701
+ } else if let second = constraint._second, second.item === self {
702
+ (mine, other, forward) = (second, constraint._first, false)
703
+ } else {
704
+ continue
705
+ }
706
+ if let other, other.item === self {
707
+ // width = height × m + c (an aspect ratio), settled after the rest.
708
+ if forward { aspects.append((mine.attribute, other.attribute, constraint.multiplier, constraint.constant)) }
709
+ continue
710
+ }
711
+ let base: CGFloat
712
+ if let other {
713
+ guard let v = value(of: other) else { continue }
714
+ base = v
715
+ } else {
716
+ base = 0
717
+ }
718
+ // first = second × m + c; read from the second's side, second = (first − c) / m.
719
+ solved[mine.attribute] = forward
720
+ ? base * constraint.multiplier + constraint.constant
721
+ : (constraint.multiplier == 0 ? base : (base - constraint.constant) / constraint.multiplier)
722
+ }
723
+ for aspect in aspects where solved[aspect.attribute] == nil {
724
+ if let length = solved[aspect.of] { solved[aspect.attribute] = length * aspect.multiplier + aspect.constant }
725
+ }
726
+ let intrinsic = intrinsicContentSize
727
+ func axis(lead: CGFloat?, trail: CGFloat?, center: CGFloat?, length: CGFloat?,
728
+ intrinsic: CGFloat, current: (origin: CGFloat, length: CGFloat)) -> (CGFloat, CGFloat) {
729
+ var size = length
730
+ if size == nil, let lead, let trail { size = trail - lead }
731
+ if size == nil, let lead, let center { size = 2 * (center - lead) }
732
+ if size == nil, let trail, let center { size = 2 * (trail - center) }
733
+ let resolved = max(0, size ?? (intrinsic >= 0 ? intrinsic : current.length))
734
+ let origin = lead ?? trail.map { $0 - resolved } ?? center.map { $0 - resolved / 2 } ?? current.origin
735
+ return (origin, resolved)
736
+ }
737
+ let current = frame
738
+ let (x, width) = axis(lead: solved[.leading], trail: solved[.trailing], center: solved[.centerX], length: solved[.width],
739
+ intrinsic: intrinsic.width, current: (current.minX, current.width))
740
+ let (y, height) = axis(lead: solved[.top], trail: solved[.bottom], center: solved[.centerY], length: solved[.height],
741
+ intrinsic: intrinsic.height, current: (current.minY, current.height))
742
+ let next = CGRect(x: x, y: y, width: width, height: height)
743
+ if next != current { frame = next }
744
+ }
745
+ }
746
+
747
+ extension NSLayoutConstraint {
748
+ /// The two axes of a layout.
749
+ public enum Axis: Int, Sendable { case horizontal = 0, vertical = 1 }
750
+ }
751
+
752
+ /// A key command a view answers to; kept, never sent (the page sends keys to
753
+ /// the text views it draws, not to UIKit).
754
+ @MainActor
755
+ open class UIKeyCommand {
756
+ public let input: String?
757
+ public let modifierFlags: UIKeyModifierFlags
758
+ public let action: FoundationBridge.Selector?
759
+ open var title = ""
760
+ open var discoverabilityTitle: String?
761
+ open var wantsPriorityOverSystemBehavior = false
762
+
763
+ public init(input: String, modifierFlags: UIKeyModifierFlags, action: FoundationBridge.Selector) {
764
+ self.input = input
765
+ self.modifierFlags = modifierFlags
766
+ self.action = action
767
+ }
768
+
769
+ public init(title: String, action: FoundationBridge.Selector, input: String, modifierFlags: UIKeyModifierFlags = []) {
770
+ self.title = title
771
+ self.input = input
772
+ self.modifierFlags = modifierFlags
773
+ self.action = action
774
+ }
775
+
776
+ public static let inputEscape = "UIKeyInputEscape"
777
+ public static let inputUpArrow = "UIKeyInputUpArrow"
778
+ public static let inputDownArrow = "UIKeyInputDownArrow"
779
+ public static let inputLeftArrow = "UIKeyInputLeftArrow"
780
+ public static let inputRightArrow = "UIKeyInputRightArrow"
781
+ public static let inputPageUp = "UIKeyInputPageUp"
782
+ public static let inputPageDown = "UIKeyInputPageDown"
783
+ }
784
+
785
+ public struct UIKeyModifierFlags: OptionSet, Sendable {
786
+ public let rawValue: Int
787
+ public init(rawValue: Int) { self.rawValue = rawValue }
788
+ public static let alphaShift = UIKeyModifierFlags(rawValue: 1 << 16)
789
+ public static let shift = UIKeyModifierFlags(rawValue: 1 << 17)
790
+ public static let control = UIKeyModifierFlags(rawValue: 1 << 18)
791
+ public static let alternate = UIKeyModifierFlags(rawValue: 1 << 19)
792
+ public static let command = UIKeyModifierFlags(rawValue: 1 << 20)
793
+ }
794
+
795
+ /// An image view: drawn as an `image` (ViewTranslation.swift), scaled by its
796
+ /// `contentMode`. Animation images are kept, not played; a GIF file shows its
797
+ /// first frame, and a subclass that sets each frame as its image (Gifu's
798
+ /// `GIFImageView`, from `display(_:)`) is drawn a frame at a time.
799
+ @MainActor
800
+ open class UIImageView: UIView {
801
+ open var image: UIImage? { didSet { _setNeedsTranslation() } }
802
+ open var highlightedImage: UIImage? { didSet { _setNeedsTranslation() } }
803
+ open var isHighlighted = false { didSet { _setNeedsTranslation() } }
804
+ open var animationImages: [UIImage]?
805
+ open var animationDuration: TimeInterval = 0
806
+ open var animationRepeatCount = 0
807
+ open var isAnimating: Bool { false }
808
+ open var preferredSymbolConfiguration: UIImage.SymbolConfiguration?
809
+
810
+ public override init(frame: CGRect) { super.init(frame: frame) }
811
+
812
+ public convenience init(image: UIImage?) {
813
+ self.init(frame: .zero)
814
+ self.image = image
815
+ if let image { frame = CGRect(origin: .zero, size: image.size) }
816
+ }
817
+
818
+ public convenience init(image: UIImage?, highlightedImage: UIImage?) {
819
+ self.init(image: image)
820
+ self.highlightedImage = highlightedImage
821
+ }
822
+
823
+ public required init?(coder: NSCoder) { super.init(coder: coder) }
824
+
825
+ open override var intrinsicContentSize: CGSize { image?.size ?? CGSize(width: -1, height: -1) }
826
+
827
+ open func startAnimating() {}
828
+ open func stopAnimating() {}
829
+ }
830
+
831
+ /// A spinner: drawn as a `ProgressView` while it spins (or always, when it
832
+ /// does not hide when stopped).
833
+ @MainActor
834
+ open class UIActivityIndicatorView: UIView {
835
+ public enum Style: Int, Sendable { case medium = 100, large = 101 }
836
+
837
+ open var style: Style = .medium { didSet { _setNeedsTranslation() } }
838
+ open var color: UIColor! { didSet { _setNeedsTranslation() } }
839
+ open var hidesWhenStopped = true { didSet { _setNeedsTranslation() } }
840
+ public private(set) var isAnimating = false { didSet { _setNeedsTranslation() } }
841
+
842
+ public override init(frame: CGRect) { super.init(frame: frame) }
843
+
844
+ public convenience init(style: Style) {
845
+ self.init(frame: .zero)
846
+ self.style = style
847
+ }
848
+
849
+ public required init?(coder: NSCoder) { super.init(coder: coder) }
850
+
851
+ open override var intrinsicContentSize: CGSize { style == .large ? CGSize(width: 37, height: 37) : CGSize(width: 20, height: 20) }
852
+
853
+ open func startAnimating() { isAnimating = true }
854
+ open func stopAnimating() { isAnimating = false }
855
+ }