@swiftbrowser/swift 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,200 @@
1
+ // The device and its settings, as code that reports on them reads them
2
+ // (analytics, logging, layout tweaks): an iPhone, in light mode, with the
3
+ // accessibility settings off, the browser's language direction and no
4
+ // background time (a page is not suspended into the background with work in
5
+ // flight, so a background task is just a token).
6
+
7
+ import Foundation
8
+ import FoundationBridge
9
+ import SwiftUI
10
+
11
+ public enum UIUserInterfaceIdiom: Int, Sendable {
12
+ case unspecified = -1, phone, pad, tv, carPlay, mac = 5, vision = 6
13
+ }
14
+
15
+ public enum UIDeviceOrientation: Int, Sendable {
16
+ case unknown, portrait, portraitUpsideDown, landscapeLeft, landscapeRight, faceUp, faceDown
17
+ public var isPortrait: Bool { self == .portrait || self == .portraitUpsideDown }
18
+ public var isLandscape: Bool { self == .landscapeLeft || self == .landscapeRight }
19
+ public var isFlat: Bool { self == .faceUp || self == .faceDown }
20
+ public var isValidInterfaceOrientation: Bool { isPortrait || isLandscape }
21
+ }
22
+
23
+ /// The device: an iPhone running iOS. `@preconcurrency`, as UIKit's
24
+ /// main-actor classes are when Swift imports them from Objective-C: code in
25
+ /// the Swift 5 language mode that reads them off the main actor gets a
26
+ /// warning, not an error.
27
+ @preconcurrency @MainActor
28
+ public final class UIDevice {
29
+ public static let current = UIDevice()
30
+
31
+ public enum BatteryState: Int, Sendable { case unknown, unplugged, charging, full }
32
+
33
+ public var name: String { "iPhone" }
34
+ public var model: String { "iPhone" }
35
+ public var localizedModel: String { "iPhone" }
36
+ public var systemName: String { "iOS" }
37
+ public var systemVersion: String { "18.0" }
38
+ public var userInterfaceIdiom: UIUserInterfaceIdiom { .phone }
39
+ public var orientation: UIDeviceOrientation { .portrait }
40
+ public var isBatteryMonitoringEnabled = false
41
+ public var batteryLevel: Float { -1 }
42
+ public var batteryState: BatteryState { .unknown }
43
+ public var isMultitaskingSupported: Bool { false }
44
+ public var isGeneratingDeviceOrientationNotifications: Bool { false }
45
+ public func beginGeneratingDeviceOrientationNotifications() {}
46
+ public func endGeneratingDeviceOrientationNotifications() {}
47
+
48
+ /// The same for every launch of the app in this browser: made once and kept
49
+ /// in the app's defaults (`SBIdentifierForVendor`).
50
+ public var identifierForVendor: UUID? {
51
+ let key = "SBIdentifierForVendor"
52
+ if let text = FoundationBridge.UserDefaults.standard.string(forKey: key), let id = UUID(uuidString: text) { return id }
53
+ let id = UUID()
54
+ FoundationBridge.UserDefaults.standard.set(id.uuidString, forKey: key)
55
+ return id
56
+ }
57
+
58
+ nonisolated public static let orientationDidChangeNotification = Notification.Name("UIDeviceOrientationDidChangeNotification")
59
+ nonisolated public static let batteryLevelDidChangeNotification = Notification.Name("UIDeviceBatteryLevelDidChangeNotification")
60
+ nonisolated public static let batteryStateDidChangeNotification = Notification.Name("UIDeviceBatteryStateDidChangeNotification")
61
+ }
62
+
63
+ /// The accessibility settings: all off (the page does not read the browser's).
64
+ public enum UIAccessibility {
65
+ public static var isVoiceOverRunning: Bool { false }
66
+ public static var isSwitchControlRunning: Bool { false }
67
+ public static var isReduceMotionEnabled: Bool { false }
68
+ public static var isReduceTransparencyEnabled: Bool { false }
69
+ public static var isBoldTextEnabled: Bool { false }
70
+ public static var isInvertColorsEnabled: Bool { false }
71
+ public static var isDarkerSystemColorsEnabled: Bool { false }
72
+ public static var isGrayscaleEnabled: Bool { false }
73
+ public static var isMonoAudioEnabled: Bool { false }
74
+ public static var isClosedCaptioningEnabled: Bool { false }
75
+ public static var isOnOffSwitchLabelsEnabled: Bool { false }
76
+ public static var isVideoAutoplayEnabled: Bool { true }
77
+ public static var shouldDifferentiateWithoutColor: Bool { false }
78
+ public static var prefersCrossFadeTransitions: Bool { false }
79
+ public static var buttonShapesEnabled: Bool { false }
80
+
81
+ public struct Notification: Sendable {
82
+ public let rawValue: UInt32
83
+ public init(rawValue: UInt32) { self.rawValue = rawValue }
84
+ public static let announcement = Notification(rawValue: 1008)
85
+ public static let screenChanged = Notification(rawValue: 1000)
86
+ public static let layoutChanged = Notification(rawValue: 1001)
87
+ }
88
+
89
+ /// Nothing reads it out: the page has no screen reader bridge.
90
+ public static func post(notification: Notification, argument: Any?) {}
91
+
92
+ public static let voiceOverStatusDidChangeNotification = Foundation.Notification.Name("UIAccessibilityVoiceOverStatusDidChangeNotification")
93
+ public static let reduceMotionStatusDidChangeNotification = Foundation.Notification.Name("UIAccessibilityReduceMotionStatusDidChangeNotification")
94
+ public static let boldTextStatusDidChangeNotification = Foundation.Notification.Name("UIAccessibilityBoldTextStatusDidChangeNotification")
95
+ }
96
+
97
+ public struct UIContentSizeCategory: RawRepresentable, Hashable, Sendable {
98
+ public let rawValue: String
99
+ public init(rawValue: String) { self.rawValue = rawValue }
100
+ public static let unspecified = UIContentSizeCategory(rawValue: "_UICTContentSizeCategoryUnspecified")
101
+ public static let extraSmall = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryXS")
102
+ public static let small = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryS")
103
+ public static let medium = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryM")
104
+ public static let large = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryL")
105
+ public static let extraLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryXL")
106
+ public static let extraExtraLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryXXL")
107
+ public static let extraExtraExtraLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryXXXL")
108
+ public static let accessibilityMedium = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryAccessibilityM")
109
+ public static let accessibilityLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryAccessibilityL")
110
+ public static let accessibilityExtraLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryAccessibilityXL")
111
+ public static let accessibilityExtraExtraLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryAccessibilityXXL")
112
+ public static let accessibilityExtraExtraExtraLarge = UIContentSizeCategory(rawValue: "UICTContentSizeCategoryAccessibilityXXXL")
113
+ public var isAccessibilityCategory: Bool { rawValue.contains("Accessibility") }
114
+ public static let didChangeNotification = Notification.Name("UIContentSizeCategoryDidChangeNotification")
115
+ }
116
+
117
+ public enum UIUserInterfaceStyle: Int, Sendable { case unspecified, light, dark }
118
+ public enum UIUserInterfaceLayoutDirection: Int, Sendable { case leftToRight, rightToLeft }
119
+ public enum UIUserInterfaceSizeClass: Int, Sendable { case unspecified, compact, regular }
120
+
121
+ /// The traits views and screens report: light mode, a compact-width iPhone.
122
+ public final class UITraitCollection: @unchecked Sendable {
123
+ nonisolated(unsafe) public static var current = UITraitCollection()
124
+ public init() {}
125
+
126
+ /// Traits with the given text size (and the rest as `current`'s).
127
+ public convenience init(preferredContentSizeCategory: UIContentSizeCategory) {
128
+ self.init()
129
+ self.preferredContentSizeCategory = preferredContentSizeCategory
130
+ }
131
+
132
+ /// The traits of each collection, later ones winning (only the text size varies here).
133
+ public convenience init(traitsFrom traitCollections: [UITraitCollection]) {
134
+ self.init()
135
+ if let last = traitCollections.last { preferredContentSizeCategory = last.preferredContentSizeCategory }
136
+ }
137
+
138
+ public var userInterfaceStyle: UIUserInterfaceStyle { .light }
139
+ public var userInterfaceIdiom: UIUserInterfaceIdiom { .phone }
140
+ public var horizontalSizeClass: UIUserInterfaceSizeClass { .compact }
141
+ public var verticalSizeClass: UIUserInterfaceSizeClass { .regular }
142
+ public var displayScale: CGFloat { 3 }
143
+ public private(set) var preferredContentSizeCategory: UIContentSizeCategory = .large
144
+ public var layoutDirection: UIUserInterfaceLayoutDirection { .leftToRight }
145
+ }
146
+
147
+ extension UIScreen {
148
+ public var traitCollection: UITraitCollection { UITraitCollection.current }
149
+ }
150
+
151
+ /// A background task's token. The page gets no background time, so a task is just its token.
152
+ public struct UIBackgroundTaskIdentifier: RawRepresentable, Hashable, Sendable {
153
+ public let rawValue: Int
154
+ public init(rawValue: Int) { self.rawValue = rawValue }
155
+ public static let invalid = UIBackgroundTaskIdentifier(rawValue: 0)
156
+ }
157
+
158
+ extension UIApplication {
159
+ public var preferredContentSizeCategory: UIContentSizeCategory { .large }
160
+ public var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection {
161
+ Locale.Language(identifier: Locale.current.identifier).characterDirection == .rightToLeft ? .rightToLeft : .leftToRight
162
+ }
163
+ public var backgroundTimeRemaining: TimeInterval { 0 }
164
+
165
+ public func beginBackgroundTask(withName taskName: String? = nil, expirationHandler handler: (@MainActor @Sendable () -> Void)? = nil) -> UIBackgroundTaskIdentifier {
166
+ _nextBackgroundTask += 1
167
+ return UIBackgroundTaskIdentifier(rawValue: _nextBackgroundTask)
168
+ }
169
+
170
+ public func beginBackgroundTask(expirationHandler handler: (@MainActor @Sendable () -> Void)? = nil) -> UIBackgroundTaskIdentifier {
171
+ beginBackgroundTask(withName: nil, expirationHandler: handler)
172
+ }
173
+
174
+ public func endBackgroundTask(_ identifier: UIBackgroundTaskIdentifier) {}
175
+ }
176
+
177
+ @MainActor private var _nextBackgroundTask = 0
178
+
179
+ // MARK: - Traits bridged to SwiftUI (iOS 17)
180
+
181
+ /// Traits to change, as a trait override writes them. The page's traits are
182
+ /// fixed (an iPhone), so writes are kept but change nothing else.
183
+ public protocol UIMutableTraits {
184
+ var userInterfaceIdiom: UIUserInterfaceIdiom { get set }
185
+ var userInterfaceStyle: UIUserInterfaceStyle { get set }
186
+ var horizontalSizeClass: UIUserInterfaceSizeClass { get set }
187
+ var verticalSizeClass: UIUserInterfaceSizeClass { get set }
188
+ var displayScale: CGFloat { get set }
189
+ }
190
+
191
+ /// A SwiftUI environment key that UIKit traits carry: until a view sets it,
192
+ /// its value is `read(from:)` the current traits.
193
+ public protocol UITraitBridgedEnvironmentKey: _BridgedEnvironmentKey {
194
+ static func read(from traitCollection: UITraitCollection) -> Value
195
+ static func write(to mutableTraits: inout UIMutableTraits, value: Value)
196
+ }
197
+
198
+ extension UITraitBridgedEnvironmentKey {
199
+ public static var _bridgedDefault: Any { read(from: UITraitCollection.current) }
200
+ }
@@ -0,0 +1,65 @@
1
+ // UIKit's feedback generators (impact, selection, notification), as apps
2
+ // call them on taps, refreshes and tab changes. They do nothing: a browser
3
+ // cannot drive a Taptic Engine, and the Vibration API that some Android
4
+ // browsers have only buzzes, with no lightness, sharpness or pattern to map
5
+ // these onto. Core Haptics reports the same (`supportsHaptics` is false).
6
+
7
+ import Foundation
8
+ import SwiftUI
9
+
10
+ /// The base class of the feedback generators: `prepare()` does nothing.
11
+ @MainActor
12
+ open class UIFeedbackGenerator {
13
+ public init() {}
14
+ /// iOS 17.5's form, which ties feedback to a view; the view is not used.
15
+ public init(view: UIView) {}
16
+ open func prepare() {}
17
+ }
18
+
19
+ /// Physical impacts. No feedback: the browser has no haptics.
20
+ @MainActor
21
+ open class UIImpactFeedbackGenerator: UIFeedbackGenerator {
22
+ public enum FeedbackStyle: Int, Sendable {
23
+ case light, medium, heavy, soft, rigid
24
+ }
25
+
26
+ public let style: FeedbackStyle
27
+
28
+ public init(style: FeedbackStyle) {
29
+ self.style = style
30
+ super.init()
31
+ }
32
+
33
+ public override init() {
34
+ style = .medium
35
+ super.init()
36
+ }
37
+
38
+ public init(style: FeedbackStyle, view: UIView) {
39
+ self.style = style
40
+ super.init(view: view)
41
+ }
42
+
43
+ open func impactOccurred() {}
44
+ open func impactOccurred(intensity: CGFloat) {}
45
+ open func impactOccurred(at location: CGPoint) {}
46
+ open func impactOccurred(intensity: CGFloat, at location: CGPoint) {}
47
+ }
48
+
49
+ /// Selection changes. No feedback: the browser has no haptics.
50
+ @MainActor
51
+ open class UISelectionFeedbackGenerator: UIFeedbackGenerator {
52
+ open func selectionChanged() {}
53
+ open func selectionChanged(at location: CGPoint) {}
54
+ }
55
+
56
+ /// Successes, warnings and errors. No feedback: the browser has no haptics.
57
+ @MainActor
58
+ open class UINotificationFeedbackGenerator: UIFeedbackGenerator {
59
+ public enum FeedbackType: Int, Sendable {
60
+ case success, warning, error
61
+ }
62
+
63
+ open func notificationOccurred(_ notificationType: FeedbackType) {}
64
+ open func notificationOccurred(_ notificationType: FeedbackType, at location: CGPoint) {}
65
+ }
@@ -0,0 +1,307 @@
1
+ // `UIFont`, as code that sizes things by the text uses it: a point size and a
2
+ // name, with the system font's metrics (ascender, cap height, line height)
3
+ // for that size. Text styles follow Dynamic Type with the same table the page
4
+ // lays text out with (Web/src/layout/typography.ts), so a size computed here
5
+ // matches what the page draws. The page draws every family as the system
6
+ // font (`Font.custom`), so a font is its size, weight and design.
7
+
8
+ import Foundation
9
+ import SwiftUI
10
+
11
+ open class UIFont: NSObject, NSSecureCoding, @unchecked Sendable {
12
+ public let pointSize: CGFloat
13
+ public let fontName: String
14
+ let weight: Weight
15
+ let design: UIFontDescriptor.SystemDesign
16
+
17
+ public init(name: String, size: CGFloat, weight: Weight = .regular, design: UIFontDescriptor.SystemDesign = .default) {
18
+ pointSize = size
19
+ fontName = name
20
+ self.weight = weight
21
+ self.design = design
22
+ super.init()
23
+ }
24
+
25
+ /// A font by name. Never nil: the page draws every family as the system font.
26
+ public convenience init?(name fontName: String, size fontSize: CGFloat) {
27
+ self.init(name: fontName, size: fontSize, weight: .regular, design: .default)
28
+ }
29
+
30
+ public convenience init(descriptor: UIFontDescriptor, size pointSize: CGFloat) {
31
+ self.init(name: descriptor.fontName, size: pointSize > 0 ? pointSize : descriptor.pointSize, weight: descriptor.weight, design: descriptor.design)
32
+ }
33
+
34
+ // MARK: Metrics (SF Pro's, per point)
35
+
36
+ public var familyName: String { design == .rounded ? ".AppleSystemUIFontRounded" : ".AppleSystemUIFont" }
37
+ public var ascender: CGFloat { pointSize * 0.952 }
38
+ public var descender: CGFloat { -pointSize * 0.241 }
39
+ public var capHeight: CGFloat { pointSize * 0.705 }
40
+ public var xHeight: CGFloat { pointSize * 0.53 }
41
+ public var leading: CGFloat { 0 }
42
+ /// The line height iOS uses for the standard sizes (17 → 22), else 1.2 × the size.
43
+ public var lineHeight: CGFloat { UIFont.standardLineHeights[pointSize] ?? (pointSize * 1.2).rounded() }
44
+
45
+ public var fontDescriptor: UIFontDescriptor {
46
+ UIFontDescriptor(fontName: fontName, pointSize: pointSize, weight: weight, design: design)
47
+ }
48
+
49
+ public func withSize(_ fontSize: CGFloat) -> UIFont {
50
+ UIFont(name: fontName, size: fontSize, weight: weight, design: design)
51
+ }
52
+
53
+ // MARK: System fonts
54
+
55
+ public class func systemFont(ofSize fontSize: CGFloat) -> UIFont {
56
+ systemFont(ofSize: fontSize, weight: .regular)
57
+ }
58
+
59
+ public class func systemFont(ofSize fontSize: CGFloat, weight: Weight) -> UIFont {
60
+ UIFont(name: ".SFUI-Regular", size: fontSize, weight: weight, design: .default)
61
+ }
62
+
63
+ public class func systemFont(ofSize fontSize: CGFloat, weight: Weight, width: Width) -> UIFont {
64
+ systemFont(ofSize: fontSize, weight: weight)
65
+ }
66
+
67
+ public class func boldSystemFont(ofSize fontSize: CGFloat) -> UIFont { systemFont(ofSize: fontSize, weight: .bold) }
68
+ public class func italicSystemFont(ofSize fontSize: CGFloat) -> UIFont { systemFont(ofSize: fontSize) }
69
+
70
+ public class func monospacedSystemFont(ofSize fontSize: CGFloat, weight: Weight) -> UIFont {
71
+ UIFont(name: ".SFMono-Regular", size: fontSize, weight: weight, design: .monospaced)
72
+ }
73
+
74
+ public class func monospacedDigitSystemFont(ofSize fontSize: CGFloat, weight: Weight) -> UIFont {
75
+ systemFont(ofSize: fontSize, weight: weight)
76
+ }
77
+
78
+ public class var labelFontSize: CGFloat { 17 }
79
+ public class var buttonFontSize: CGFloat { 18 }
80
+ public class var smallSystemFontSize: CGFloat { 12 }
81
+ public class var systemFontSize: CGFloat { 14 }
82
+
83
+ public class var familyNames: [String] { [] }
84
+ public class func fontNames(forFamilyName familyName: String) -> [String] { [] }
85
+
86
+ /// The font of a text style at the viewer's text size (Large unless
87
+ /// `traitCollection` says otherwise).
88
+ public class func preferredFont(forTextStyle style: TextStyle) -> UIFont {
89
+ preferredFont(forTextStyle: style, compatibleWith: nil)
90
+ }
91
+
92
+ public class func preferredFont(forTextStyle style: TextStyle, compatibleWith traitCollection: UITraitCollection?) -> UIFont {
93
+ let category = traitCollection?.preferredContentSizeCategory ?? .large
94
+ let size = style.sizes[category.dynamicTypeIndex]
95
+ let weight: Weight = style == .headline ? .semibold : .regular
96
+ return UIFont(name: ".SFUI-Regular", size: size, weight: weight, design: .default)
97
+ }
98
+
99
+ // MARK: Equality and coding
100
+
101
+ open override func isEqual(_ object: Any?) -> Bool {
102
+ guard let other = object as? UIFont else { return false }
103
+ return pointSize == other.pointSize && fontName == other.fontName && weight == other.weight && design == other.design
104
+ }
105
+
106
+ open override var hash: Int {
107
+ var hasher = Hasher()
108
+ hasher.combine(pointSize)
109
+ hasher.combine(fontName)
110
+ return hasher.finalize()
111
+ }
112
+
113
+ public static var supportsSecureCoding: Bool { true }
114
+
115
+ public func encode(with coder: NSCoder) {
116
+ coder.encode(fontName, forKey: "UIFontName")
117
+ coder.encode(Double(pointSize), forKey: "UIFontPointSize")
118
+ coder.encode(Double(weight.rawValue), forKey: "UIFontWeight")
119
+ coder.encode(design.rawValue, forKey: "UIFontDesign")
120
+ }
121
+
122
+ public required init?(coder: NSCoder) {
123
+ guard let name = coder.decodeObject(forKey: "UIFontName") as? String else { return nil }
124
+ fontName = name
125
+ pointSize = CGFloat(coder.decodeDouble(forKey: "UIFontPointSize"))
126
+ weight = Weight(rawValue: CGFloat(coder.decodeDouble(forKey: "UIFontWeight")))
127
+ design = (coder.decodeObject(forKey: "UIFontDesign") as? String).map(UIFontDescriptor.SystemDesign.init(rawValue:)) ?? .default
128
+ super.init()
129
+ }
130
+
131
+ static let standardLineHeights: [CGFloat: CGFloat] = [34: 41, 28: 34, 22: 28, 20: 25, 17: 22, 16: 21, 15: 20, 13: 18, 12: 16, 11: 13]
132
+
133
+ // MARK: Nested types
134
+
135
+ public struct Weight: RawRepresentable, Hashable, Sendable {
136
+ public let rawValue: CGFloat
137
+ public init(rawValue: CGFloat) { self.rawValue = rawValue }
138
+ public init(_ rawValue: CGFloat) { self.rawValue = rawValue }
139
+ public static let ultraLight = Weight(rawValue: -0.8)
140
+ public static let thin = Weight(rawValue: -0.6)
141
+ public static let light = Weight(rawValue: -0.4)
142
+ public static let regular = Weight(rawValue: 0)
143
+ public static let medium = Weight(rawValue: 0.23)
144
+ public static let semibold = Weight(rawValue: 0.3)
145
+ public static let bold = Weight(rawValue: 0.4)
146
+ public static let heavy = Weight(rawValue: 0.56)
147
+ public static let black = Weight(rawValue: 0.62)
148
+
149
+ /// SwiftUI's weight of the same name (the nearest for another value).
150
+ var swiftUI: Font.Weight {
151
+ let ladder: [(CGFloat, Font.Weight)] = [(-0.8, .ultraLight), (-0.6, .thin), (-0.4, .light), (0, .regular), (0.23, .medium),
152
+ (0.3, .semibold), (0.4, .bold), (0.56, .heavy), (0.62, .black)]
153
+ return ladder.min { abs($0.0 - rawValue) < abs($1.0 - rawValue) }!.1
154
+ }
155
+ }
156
+
157
+ public struct Width: RawRepresentable, Hashable, Sendable {
158
+ public let rawValue: CGFloat
159
+ public init(rawValue: CGFloat) { self.rawValue = rawValue }
160
+ public static let compressed = Width(rawValue: -0.3)
161
+ public static let condensed = Width(rawValue: -0.2)
162
+ public static let standard = Width(rawValue: 0)
163
+ public static let expanded = Width(rawValue: 0.2)
164
+ }
165
+
166
+ public struct TextStyle: RawRepresentable, Hashable, Sendable {
167
+ public let rawValue: String
168
+ public init(rawValue: String) { self.rawValue = rawValue }
169
+ public static let extraLargeTitle = TextStyle(rawValue: "UICTFontTextStyleExtraLargeTitle")
170
+ public static let extraLargeTitle2 = TextStyle(rawValue: "UICTFontTextStyleExtraLargeTitle2")
171
+ public static let largeTitle = TextStyle(rawValue: "UICTFontTextStyleTitle0")
172
+ public static let title1 = TextStyle(rawValue: "UICTFontTextStyleTitle1")
173
+ public static let title2 = TextStyle(rawValue: "UICTFontTextStyleTitle2")
174
+ public static let title3 = TextStyle(rawValue: "UICTFontTextStyleTitle3")
175
+ public static let headline = TextStyle(rawValue: "UICTFontTextStyleHeadline")
176
+ public static let subheadline = TextStyle(rawValue: "UICTFontTextStyleSubhead")
177
+ public static let body = TextStyle(rawValue: "UICTFontTextStyleBody")
178
+ public static let callout = TextStyle(rawValue: "UICTFontTextStyleCallout")
179
+ public static let footnote = TextStyle(rawValue: "UICTFontTextStyleFootnote")
180
+ public static let caption1 = TextStyle(rawValue: "UICTFontTextStyleCaption1")
181
+ public static let caption2 = TextStyle(rawValue: "UICTFontTextStyleCaption2")
182
+
183
+ /// Point sizes from xSmall to accessibility5 (Web/src/layout/typography.ts).
184
+ var sizes: [CGFloat] {
185
+ switch self {
186
+ case .largeTitle, .extraLargeTitle, .extraLargeTitle2: [31, 32, 33, 34, 36, 38, 40, 44, 48, 52, 56, 60]
187
+ case .title1: [25, 26, 27, 28, 30, 32, 34, 38, 43, 48, 53, 58]
188
+ case .title2: [19, 20, 21, 22, 24, 26, 28, 34, 39, 44, 50, 56]
189
+ case .title3: [17, 18, 19, 20, 22, 24, 26, 31, 37, 43, 49, 55]
190
+ case .callout: [13, 14, 15, 16, 18, 20, 22, 26, 32, 38, 44, 51]
191
+ case .subheadline: [12, 13, 14, 15, 17, 19, 21, 25, 30, 36, 42, 49]
192
+ case .footnote: [12, 12, 12, 13, 15, 17, 19, 23, 27, 33, 38, 44]
193
+ case .caption1: [11, 11, 11, 12, 14, 16, 18, 22, 26, 32, 37, 43]
194
+ case .caption2: [11, 11, 11, 11, 13, 15, 17, 20, 24, 29, 34, 40]
195
+ default: [14, 15, 16, 17, 19, 21, 23, 28, 33, 40, 47, 53] // body, headline
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+ /// A font's attributes: what `UIFont(descriptor:size:)` makes a font from.
202
+ public final class UIFontDescriptor: NSObject, @unchecked Sendable {
203
+ public let fontName: String
204
+ public let pointSize: CGFloat
205
+ let weight: UIFont.Weight
206
+ let design: SystemDesign
207
+
208
+ init(fontName: String, pointSize: CGFloat, weight: UIFont.Weight, design: SystemDesign) {
209
+ self.fontName = fontName
210
+ self.pointSize = pointSize
211
+ self.weight = weight
212
+ self.design = design
213
+ }
214
+
215
+ public struct SystemDesign: RawRepresentable, Hashable, Sendable {
216
+ public let rawValue: String
217
+ public init(rawValue: String) { self.rawValue = rawValue }
218
+ public static let `default` = SystemDesign(rawValue: "NSCTFontUIFontDesignDefault")
219
+ public static let rounded = SystemDesign(rawValue: "NSCTFontUIFontDesignRounded")
220
+ public static let serif = SystemDesign(rawValue: "NSCTFontUIFontDesignSerif")
221
+ public static let monospaced = SystemDesign(rawValue: "NSCTFontUIFontDesignMonospaced")
222
+ }
223
+
224
+ public func withDesign(_ design: SystemDesign) -> UIFontDescriptor? {
225
+ UIFontDescriptor(fontName: design == .rounded ? ".AppleSystemUIFontRounded-Regular" : fontName, pointSize: pointSize, weight: weight, design: design)
226
+ }
227
+
228
+ public func withSize(_ newPointSize: CGFloat) -> UIFontDescriptor {
229
+ UIFontDescriptor(fontName: fontName, pointSize: newPointSize, weight: weight, design: design)
230
+ }
231
+
232
+ public class func preferredFontDescriptor(withTextStyle style: UIFont.TextStyle) -> UIFontDescriptor {
233
+ UIFont.preferredFont(forTextStyle: style).fontDescriptor
234
+ }
235
+ }
236
+
237
+ /// Scales sizes the way Dynamic Type scales a text style: by the ratio of the
238
+ /// style's size at the viewer's setting to its size at Large.
239
+ public struct UIFontMetrics: Sendable {
240
+ let style: UIFont.TextStyle
241
+
242
+ public init(forTextStyle textStyle: UIFont.TextStyle) { style = textStyle }
243
+
244
+ public static let `default` = UIFontMetrics(forTextStyle: .body)
245
+
246
+ public func scaledValue(for value: CGFloat) -> CGFloat {
247
+ scaledValue(for: value, compatibleWith: nil)
248
+ }
249
+
250
+ public func scaledValue(for value: CGFloat, compatibleWith traitCollection: UITraitCollection?) -> CGFloat {
251
+ let category = traitCollection?.preferredContentSizeCategory ?? UITraitCollection.current.preferredContentSizeCategory
252
+ let sizes = style.sizes
253
+ return value * sizes[category.dynamicTypeIndex] / sizes[3]
254
+ }
255
+
256
+ public func scaledFont(for font: UIFont) -> UIFont {
257
+ font.withSize(scaledValue(for: font.pointSize))
258
+ }
259
+
260
+ public func scaledFont(for font: UIFont, maximumPointSize: CGFloat) -> UIFont {
261
+ font.withSize(min(maximumPointSize, scaledValue(for: font.pointSize)))
262
+ }
263
+
264
+ public func scaledFont(for font: UIFont, compatibleWith traitCollection: UITraitCollection?) -> UIFont {
265
+ font.withSize(scaledValue(for: font.pointSize, compatibleWith: traitCollection))
266
+ }
267
+ }
268
+
269
+ extension UIContentSizeCategory {
270
+ /// The column of the size tables: xSmall 0 … accessibility5 11 (Large 3).
271
+ var dynamicTypeIndex: Int {
272
+ let order: [UIContentSizeCategory] = [.extraSmall, .small, .medium, .large, .extraLarge, .extraExtraLarge, .extraExtraExtraLarge,
273
+ .accessibilityMedium, .accessibilityLarge, .accessibilityExtraLarge,
274
+ .accessibilityExtraExtraLarge, .accessibilityExtraExtraExtraLarge]
275
+ return order.firstIndex(of: self) ?? 3
276
+ }
277
+ }
278
+
279
+ extension Font {
280
+ /// The font a `UIFont` stands for: its size, weight and design.
281
+ public init(_ font: UIFont) {
282
+ let design: Font.Design = switch font.design {
283
+ case .rounded: .rounded
284
+ case .serif: .serif
285
+ case .monospaced: .monospaced
286
+ default: .default
287
+ }
288
+ self = .system(size: font.pointSize, weight: font.weight.swiftUI, design: design)
289
+ }
290
+ }
291
+
292
+ extension UIContentSizeCategory {
293
+ /// The UIKit name of a SwiftUI Dynamic Type size.
294
+ public init(_ dynamicTypeSize: DynamicTypeSize) {
295
+ let order: [UIContentSizeCategory] = [.extraSmall, .small, .medium, .large, .extraLarge, .extraExtraLarge, .extraExtraExtraLarge,
296
+ .accessibilityMedium, .accessibilityLarge, .accessibilityExtraLarge,
297
+ .accessibilityExtraExtraLarge, .accessibilityExtraExtraExtraLarge]
298
+ self = order[dynamicTypeSize.rawValue]
299
+ }
300
+ }
301
+
302
+ extension DynamicTypeSize {
303
+ /// The SwiftUI size of a UIKit content size category (Large for one it has no size for).
304
+ public init?(_ uiSizeCategory: UIContentSizeCategory) {
305
+ self.init(rawValue: uiSizeCategory.dynamicTypeIndex)
306
+ }
307
+ }