@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,399 @@
1
+ // `import CoreHaptics` for the browser: the haptic engine's API, with no
2
+ // engine behind it. A browser cannot drive a Taptic Engine (the Vibration
3
+ // API buzzes some Android phones and nothing else, and has no intensity or
4
+ // sharpness), so `CHHapticEngine.capabilitiesForHardware()` reports neither
5
+ // haptics nor audio, as an iPad or a Mac does. Code that checks it, as
6
+ // Apple's samples and Ice Cubes' `HapticManager` do, skips haptics. Code that
7
+ // does not still runs: an engine starts and stops, patterns are built and
8
+ // validated, and players accept every call and play nothing.
9
+
10
+ import Foundation
11
+
12
+ public let CHHapticTimeImmediate: TimeInterval = 0
13
+
14
+ /// Core Haptics' errors, with Apple's codes.
15
+ public struct CHHapticError: Error, Hashable, Sendable {
16
+ public enum Code: Int, Sendable {
17
+ case engineNotRunning = -4805
18
+ case operationNotPermitted = -4806
19
+ case engineStartTimeout = -4808
20
+ case notSupported = -4809
21
+ case serverInitFailed = -4810
22
+ case serverInterrupted = -4811
23
+ case invalidPatternPlayer = -4812
24
+ case invalidPatternData = -4813
25
+ case invalidPatternDictionary = -4814
26
+ case invalidAudioSession = -4815
27
+ case invalidEngineParameter = -4816
28
+ case invalidParameterType = -4820
29
+ case invalidEventType = -4821
30
+ case invalidEventTime = -4822
31
+ case invalidEventDuration = -4823
32
+ case invalidAudioResource = -4824
33
+ case resourceNotAvailable = -4825
34
+ case badEventEntry = -4830
35
+ case badParameterEntry = -4831
36
+ case invalidTime = -4840
37
+ case fileNotFound = -4851
38
+ case insufficientPower = -4897
39
+ case unknownError = -4898
40
+ case memoryError = -4899
41
+ }
42
+
43
+ public let code: Code
44
+ public init(_ code: Code) { self.code = code }
45
+ public static let notSupported = Code.notSupported
46
+ }
47
+
48
+ // MARK: - Events and parameters
49
+
50
+ public struct CHHapticEvent: Sendable {
51
+ public struct EventType: RawRepresentable, Hashable, Sendable {
52
+ public let rawValue: String
53
+ public init(rawValue: String) { self.rawValue = rawValue }
54
+ public static let hapticTransient = EventType(rawValue: "HapticTransient")
55
+ public static let hapticContinuous = EventType(rawValue: "HapticContinuous")
56
+ public static let audioContinuous = EventType(rawValue: "AudioContinuous")
57
+ public static let audioCustom = EventType(rawValue: "AudioCustom")
58
+ }
59
+
60
+ public struct ParameterID: RawRepresentable, Hashable, Sendable {
61
+ public let rawValue: String
62
+ public init(rawValue: String) { self.rawValue = rawValue }
63
+ public static let hapticIntensity = ParameterID(rawValue: "HapticIntensity")
64
+ public static let hapticSharpness = ParameterID(rawValue: "HapticSharpness")
65
+ public static let attackTime = ParameterID(rawValue: "AttackTime")
66
+ public static let decayTime = ParameterID(rawValue: "DecayTime")
67
+ public static let releaseTime = ParameterID(rawValue: "ReleaseTime")
68
+ public static let sustained = ParameterID(rawValue: "Sustained")
69
+ public static let audioVolume = ParameterID(rawValue: "AudioVolume")
70
+ public static let audioPitch = ParameterID(rawValue: "AudioPitch")
71
+ public static let audioPan = ParameterID(rawValue: "AudioPan")
72
+ public static let audioBrightness = ParameterID(rawValue: "AudioBrightness")
73
+ }
74
+
75
+ public let type: EventType
76
+ public var eventParameters: [CHHapticEventParameter]
77
+ public var relativeTime: TimeInterval
78
+ public var duration: TimeInterval
79
+
80
+ public init(eventType: EventType, parameters: [CHHapticEventParameter], relativeTime: TimeInterval) {
81
+ self.init(eventType: eventType, parameters: parameters, relativeTime: relativeTime, duration: 0)
82
+ }
83
+
84
+ public init(eventType: EventType, parameters: [CHHapticEventParameter], relativeTime: TimeInterval, duration: TimeInterval) {
85
+ self.type = eventType
86
+ self.eventParameters = parameters
87
+ self.relativeTime = relativeTime
88
+ self.duration = duration
89
+ }
90
+
91
+ public init(audioResourceID resID: CHHapticAudioResourceID, parameters: [CHHapticEventParameter], relativeTime: TimeInterval) {
92
+ self.init(eventType: .audioCustom, parameters: parameters, relativeTime: relativeTime, duration: 0)
93
+ }
94
+
95
+ public init(audioResourceID resID: CHHapticAudioResourceID, parameters: [CHHapticEventParameter], relativeTime: TimeInterval, duration: TimeInterval) {
96
+ self.init(eventType: .audioCustom, parameters: parameters, relativeTime: relativeTime, duration: duration)
97
+ }
98
+ }
99
+
100
+ public typealias CHHapticAudioResourceID = UInt
101
+ public typealias CHHapticEventType = CHHapticEvent.EventType
102
+ public typealias CHHapticEventParameterID = CHHapticEvent.ParameterID
103
+
104
+ public struct CHHapticEventParameter: Sendable {
105
+ public let parameterID: CHHapticEvent.ParameterID
106
+ public var value: Float
107
+ public init(parameterID: CHHapticEvent.ParameterID, value: Float) {
108
+ self.parameterID = parameterID
109
+ self.value = value
110
+ }
111
+ }
112
+
113
+ public struct CHHapticDynamicParameter: Sendable {
114
+ public struct ID: RawRepresentable, Hashable, Sendable {
115
+ public let rawValue: String
116
+ public init(rawValue: String) { self.rawValue = rawValue }
117
+ public static let hapticIntensityControl = ID(rawValue: "HapticIntensityControl")
118
+ public static let hapticSharpnessControl = ID(rawValue: "HapticSharpnessControl")
119
+ public static let hapticAttackTimeControl = ID(rawValue: "HapticAttackTimeControl")
120
+ public static let hapticDecayTimeControl = ID(rawValue: "HapticDecayTimeControl")
121
+ public static let hapticReleaseTimeControl = ID(rawValue: "HapticReleaseTimeControl")
122
+ public static let audioVolumeControl = ID(rawValue: "AudioVolumeControl")
123
+ public static let audioPanControl = ID(rawValue: "AudioPanControl")
124
+ public static let audioBrightnessControl = ID(rawValue: "AudioBrightnessControl")
125
+ public static let audioPitchControl = ID(rawValue: "AudioPitchControl")
126
+ public static let audioAttackTimeControl = ID(rawValue: "AudioAttackTimeControl")
127
+ public static let audioDecayTimeControl = ID(rawValue: "AudioDecayTimeControl")
128
+ public static let audioReleaseTimeControl = ID(rawValue: "AudioReleaseTimeControl")
129
+ }
130
+
131
+ public let parameterID: ID
132
+ public var value: Float
133
+ public var relativeTime: TimeInterval
134
+ public init(parameterID: ID, value: Float, relativeTime: TimeInterval) {
135
+ self.parameterID = parameterID
136
+ self.value = value
137
+ self.relativeTime = relativeTime
138
+ }
139
+ }
140
+
141
+ public struct CHHapticParameterCurve: Sendable {
142
+ public struct ControlPoint: Sendable {
143
+ public var relativeTime: TimeInterval
144
+ public var value: Float
145
+ public init(relativeTime: TimeInterval, value: Float) {
146
+ self.relativeTime = relativeTime
147
+ self.value = value
148
+ }
149
+ }
150
+
151
+ public let parameterID: CHHapticDynamicParameter.ID
152
+ public var relativeTime: TimeInterval
153
+ public var controlPoints: [ControlPoint]
154
+ public init(parameterID: CHHapticDynamicParameter.ID, controlPoints: [ControlPoint], relativeTime: TimeInterval) {
155
+ self.parameterID = parameterID
156
+ self.controlPoints = controlPoints
157
+ self.relativeTime = relativeTime
158
+ }
159
+ }
160
+
161
+ // MARK: - Patterns
162
+
163
+ /// A pattern of events, kept as given. Its duration is the end of its last event.
164
+ public final class CHHapticPattern: @unchecked Sendable {
165
+ public struct Key: RawRepresentable, Hashable, Sendable {
166
+ public let rawValue: String
167
+ public init(rawValue: String) { self.rawValue = rawValue }
168
+ public static let version = Key(rawValue: "Version")
169
+ public static let pattern = Key(rawValue: "Pattern")
170
+ public static let event = Key(rawValue: "Event")
171
+ public static let eventType = Key(rawValue: "EventType")
172
+ public static let time = Key(rawValue: "Time")
173
+ public static let eventDuration = Key(rawValue: "EventDuration")
174
+ public static let eventParameters = Key(rawValue: "EventParameters")
175
+ public static let parameterID = Key(rawValue: "ParameterID")
176
+ public static let parameterValue = Key(rawValue: "ParameterValue")
177
+ public static let parameter = Key(rawValue: "Parameter")
178
+ public static let parameterCurve = Key(rawValue: "ParameterCurve")
179
+ public static let parameterCurveControlPoints = Key(rawValue: "ParameterCurveControlPoints")
180
+ }
181
+
182
+ public let events: [CHHapticEvent]
183
+ public let parameters: [CHHapticDynamicParameter]
184
+ public let parameterCurves: [CHHapticParameterCurve]
185
+
186
+ public var duration: TimeInterval {
187
+ events.map { $0.relativeTime + $0.duration }.max() ?? 0
188
+ }
189
+
190
+ public init(events: [CHHapticEvent], parameters: [CHHapticDynamicParameter]) throws {
191
+ try Self.validate(events)
192
+ self.events = events
193
+ self.parameters = parameters
194
+ self.parameterCurves = []
195
+ }
196
+
197
+ public init(events: [CHHapticEvent], parameterCurves: [CHHapticParameterCurve]) throws {
198
+ try Self.validate(events)
199
+ self.events = events
200
+ self.parameters = []
201
+ self.parameterCurves = parameterCurves
202
+ }
203
+
204
+ /// A pattern from an AHAP dictionary: its `Event` entries are read; parameters and curves are not.
205
+ public convenience init(dictionary: [Key: Any]) throws {
206
+ guard let entries = dictionary[.pattern] as? [[Key: Any]] else {
207
+ throw CHHapticError(.invalidPatternDictionary)
208
+ }
209
+ var events: [CHHapticEvent] = []
210
+ for entry in entries {
211
+ guard let event = entry[.event] as? [Key: Any] else { continue }
212
+ guard let type = event[.eventType] as? String else { throw CHHapticError(.badEventEntry) }
213
+ let parameters = (event[.eventParameters] as? [[Key: Any]] ?? []).compactMap { parameter -> CHHapticEventParameter? in
214
+ guard let id = parameter[.parameterID] as? String else { return nil }
215
+ let value = (parameter[.parameterValue] as? Double).map(Float.init) ?? (parameter[.parameterValue] as? Float) ?? 0
216
+ return CHHapticEventParameter(parameterID: .init(rawValue: id), value: value)
217
+ }
218
+ events.append(CHHapticEvent(eventType: .init(rawValue: type), parameters: parameters,
219
+ relativeTime: event[.time] as? Double ?? 0,
220
+ duration: event[.eventDuration] as? Double ?? 0))
221
+ }
222
+ try self.init(events: events, parameters: [])
223
+ }
224
+
225
+ /// The events as an AHAP dictionary.
226
+ public func exportDictionary() throws -> [Key: Any] {
227
+ [.version: 1.0, .pattern: events.map { event -> [Key: Any] in
228
+ [.event: [
229
+ .eventType: event.type.rawValue,
230
+ .time: event.relativeTime,
231
+ .eventDuration: event.duration,
232
+ .eventParameters: event.eventParameters.map { [Key.parameterID: $0.parameterID.rawValue, .parameterValue: Double($0.value)] },
233
+ ] as [Key: Any]]
234
+ }]
235
+ }
236
+
237
+ private static func validate(_ events: [CHHapticEvent]) throws {
238
+ for event in events {
239
+ if event.relativeTime < 0 { throw CHHapticError(.invalidEventTime) }
240
+ if event.duration < 0 { throw CHHapticError(.invalidEventDuration) }
241
+ }
242
+ }
243
+ }
244
+
245
+ // MARK: - Players
246
+
247
+ /// Plays a pattern. Here every call succeeds and nothing is felt or heard.
248
+ public protocol CHHapticPatternPlayer: AnyObject {
249
+ var isMuted: Bool { get set }
250
+ func start(atTime time: TimeInterval) throws
251
+ func stop(atTime time: TimeInterval) throws
252
+ func sendParameters(_ parameters: [CHHapticDynamicParameter], atTime time: TimeInterval) throws
253
+ func scheduleParameterCurve(_ parameterCurve: CHHapticParameterCurve, atTime time: TimeInterval) throws
254
+ func cancel() throws
255
+ }
256
+
257
+ public protocol CHHapticAdvancedPatternPlayer: CHHapticPatternPlayer {
258
+ var loopEnabled: Bool { get set }
259
+ var loopEnd: TimeInterval { get set }
260
+ var playbackRate: Float { get set }
261
+ var completionHandler: CHHapticAdvancedPatternPlayerCompletionHandler? { get set }
262
+ func pause(atTime time: TimeInterval) throws
263
+ func resume(atTime time: TimeInterval) throws
264
+ func seek(toOffset offsetTime: TimeInterval) throws
265
+ }
266
+
267
+ public typealias CHHapticAdvancedPatternPlayerCompletionHandler = @Sendable (Error?) -> Void
268
+
269
+ final class _SilentPlayer: CHHapticAdvancedPatternPlayer, @unchecked Sendable {
270
+ let pattern: CHHapticPattern?
271
+ var isMuted = false
272
+ var loopEnabled = false
273
+ var loopEnd: TimeInterval = 0
274
+ var playbackRate: Float = 1
275
+ var completionHandler: CHHapticAdvancedPatternPlayerCompletionHandler?
276
+
277
+ init(pattern: CHHapticPattern?) { self.pattern = pattern }
278
+
279
+ func start(atTime time: TimeInterval) throws {}
280
+ func stop(atTime time: TimeInterval) throws {}
281
+ func sendParameters(_ parameters: [CHHapticDynamicParameter], atTime time: TimeInterval) throws {}
282
+ func scheduleParameterCurve(_ parameterCurve: CHHapticParameterCurve, atTime time: TimeInterval) throws {}
283
+ func cancel() throws {}
284
+ func pause(atTime time: TimeInterval) throws {}
285
+ func resume(atTime time: TimeInterval) throws {}
286
+ func seek(toOffset offsetTime: TimeInterval) throws {}
287
+ }
288
+
289
+ // MARK: - Capabilities
290
+
291
+ public protocol CHHapticParameterAttributes {
292
+ var minValue: Float { get }
293
+ var maxValue: Float { get }
294
+ var defaultValue: Float { get }
295
+ }
296
+
297
+ /// What the hardware can play.
298
+ public protocol CHHapticDeviceCapability {
299
+ var supportsHaptics: Bool { get }
300
+ var supportsAudio: Bool { get }
301
+ func attributes(forEventParameter inParameter: CHHapticEvent.ParameterID, eventType type: CHHapticEvent.EventType) throws -> CHHapticParameterAttributes
302
+ func attributes(forDynamicParameter inParameter: CHHapticDynamicParameter.ID) throws -> CHHapticParameterAttributes
303
+ }
304
+
305
+ struct _Attributes: CHHapticParameterAttributes {
306
+ var minValue: Float = 0
307
+ var maxValue: Float = 1
308
+ var defaultValue: Float = 0
309
+ }
310
+
311
+ /// The browser's: no haptics, no audio.
312
+ struct _BrowserCapability: CHHapticDeviceCapability {
313
+ var supportsHaptics: Bool { false }
314
+ var supportsAudio: Bool { false }
315
+ func attributes(forEventParameter inParameter: CHHapticEvent.ParameterID, eventType type: CHHapticEvent.EventType) throws -> CHHapticParameterAttributes { _Attributes() }
316
+ func attributes(forDynamicParameter inParameter: CHHapticDynamicParameter.ID) throws -> CHHapticParameterAttributes { _Attributes() }
317
+ }
318
+
319
+ // MARK: - The engine
320
+
321
+ /// The haptic engine. `capabilitiesForHardware()` reports no haptics; the
322
+ /// engine still starts, stops and makes players, which play nothing.
323
+ open class CHHapticEngine: @unchecked Sendable {
324
+ public enum StoppedReason: Int, Sendable {
325
+ case audioSessionInterrupt = 1, applicationSuspended, idleTimeout, notifyWhenFinished,
326
+ engineDestroyed, gameControllerDisconnect, systemError = -1
327
+ }
328
+
329
+ public enum FinishedAction: Int, Sendable {
330
+ case stopEngine = 1, leaveEngineRunning
331
+ }
332
+
333
+ public typealias StoppedHandler = @Sendable (StoppedReason) -> Void
334
+ public typealias ResetHandler = @Sendable () -> Void
335
+ public typealias CompletionHandler = @Sendable (Error?) -> Void
336
+ public typealias FinishedHandler = @Sendable (Error?) -> FinishedAction
337
+
338
+ open var stoppedHandler: StoppedHandler = { _ in }
339
+ open var resetHandler: ResetHandler = {}
340
+ open var playsHapticsOnly = false
341
+ open var playsAudioOnly = false
342
+ open var isMutedForAudio = false
343
+ open var isMutedForHaptics = false
344
+ open var isAutoShutdownEnabled = false
345
+ /// Whether `start` was called more recently than `stop`.
346
+ public private(set) var isRunning = false
347
+
348
+ /// No haptics and no audio: the browser has no haptic engine.
349
+ public class func capabilitiesForHardware() -> CHHapticDeviceCapability { _BrowserCapability() }
350
+
351
+ public init() throws {}
352
+ public init(audioSession: AnyObject?) throws {}
353
+
354
+ /// Seconds since the engine was made (the hardware clock patterns are timed by).
355
+ open var currentTime: TimeInterval { Date().timeIntervalSince(created) }
356
+ private let created = Date()
357
+
358
+ open func start() async throws { isRunning = true }
359
+ open func start(completionHandler: CompletionHandler? = nil) {
360
+ isRunning = true
361
+ completionHandler?(nil)
362
+ }
363
+ open func startAndReturnError() throws { isRunning = true }
364
+
365
+ open func stop() async throws { isRunning = false }
366
+ open func stop(completionHandler: CompletionHandler? = nil) {
367
+ isRunning = false
368
+ completionHandler?(nil)
369
+ }
370
+
371
+ /// Calls `finishedHandler` at once: no player is ever playing.
372
+ open func notifyWhenPlayersFinished(finishedHandler: @escaping FinishedHandler) {
373
+ if finishedHandler(nil) == .stopEngine { isRunning = false }
374
+ }
375
+
376
+ open func makePlayer(with pattern: CHHapticPattern) throws -> CHHapticPatternPlayer { _SilentPlayer(pattern: pattern) }
377
+ open func makeAdvancedPlayer(with pattern: CHHapticPattern) throws -> CHHapticAdvancedPatternPlayer { _SilentPlayer(pattern: pattern) }
378
+
379
+ /// Reads and checks an AHAP file; plays nothing.
380
+ open func playPattern(from url: URL) throws {
381
+ guard let data = try? Data(contentsOf: url) else { throw CHHapticError(.fileNotFound) }
382
+ try playPattern(from: data)
383
+ }
384
+
385
+ /// Checks AHAP data (JSON); plays nothing.
386
+ open func playPattern(from data: Data) throws {
387
+ guard (try? JSONSerialization.jsonObject(with: data)) is [String: Any] else {
388
+ throw CHHapticError(.invalidPatternData)
389
+ }
390
+ }
391
+
392
+ /// Audio resources are accepted and never played.
393
+ open func registerAudioResource(_ resourceURL: URL, options: [AnyHashable: Any] = [:]) throws -> CHHapticAudioResourceID {
394
+ nextResource += 1
395
+ return nextResource
396
+ }
397
+ open func unregisterAudioResource(_ resourceID: CHHapticAudioResourceID) throws {}
398
+ private var nextResource: CHHapticAudioResourceID = 0
399
+ }
@@ -0,0 +1,41 @@
1
+ // Core Image's color: RGBA components in 0…1, as code reads them back from a
2
+ // UIColor or a Color (`CIColor(color:)` is UIKit's, in Sources/UIKit).
3
+
4
+ import SwiftUI
5
+
6
+ public final class CIColor: Hashable, @unchecked Sendable, CustomStringConvertible {
7
+ public let red: CGFloat
8
+ public let green: CGFloat
9
+ public let blue: CGFloat
10
+ public let alpha: CGFloat
11
+ public var numberOfComponents: Int { 4 }
12
+ public var components: [CGFloat] { [red, green, blue, alpha] }
13
+
14
+ public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat = 1) {
15
+ (self.red, self.green, self.blue, self.alpha) = (red, green, blue, alpha)
16
+ }
17
+
18
+ /// "r g b a", as Core Image writes it.
19
+ public convenience init(string representation: String) {
20
+ let values = representation.split(separator: " ").compactMap { Double($0) }.map { CGFloat($0) }
21
+ self.init(red: values.count > 0 ? values[0] : 0, green: values.count > 1 ? values[1] : 0,
22
+ blue: values.count > 2 ? values[2] : 0, alpha: values.count > 3 ? values[3] : 1)
23
+ }
24
+
25
+ public var stringRepresentation: String { "\(red) \(green) \(blue) \(alpha)" }
26
+ public var description: String { stringRepresentation }
27
+
28
+ public static let black = CIColor(red: 0, green: 0, blue: 0)
29
+ public static let white = CIColor(red: 1, green: 1, blue: 1)
30
+ public static let gray = CIColor(red: 0.5, green: 0.5, blue: 0.5)
31
+ public static let red = CIColor(red: 1, green: 0, blue: 0)
32
+ public static let green = CIColor(red: 0, green: 1, blue: 0)
33
+ public static let blue = CIColor(red: 0, green: 0, blue: 1)
34
+ public static let cyan = CIColor(red: 0, green: 1, blue: 1)
35
+ public static let magenta = CIColor(red: 1, green: 0, blue: 1)
36
+ public static let yellow = CIColor(red: 1, green: 1, blue: 0)
37
+ public static let clear = CIColor(red: 0, green: 0, blue: 0, alpha: 0)
38
+
39
+ public static func == (lhs: CIColor, rhs: CIColor) -> Bool { lhs.components == rhs.components }
40
+ public func hash(into hasher: inout Hasher) { hasher.combine(components) }
41
+ }
@@ -0,0 +1,31 @@
1
+ import SwiftUI
2
+
3
+ /// Options for a context; accepted and ignored.
4
+ public struct CIContextOption: Hashable, RawRepresentable, Sendable {
5
+ public let rawValue: String
6
+ public init(rawValue: String) { self.rawValue = rawValue }
7
+
8
+ public static let useSoftwareRenderer = CIContextOption(rawValue: "kCIContextUseSoftwareRenderer")
9
+ public static let workingColorSpace = CIContextOption(rawValue: "kCIContextWorkingColorSpace")
10
+ public static let outputColorSpace = CIContextOption(rawValue: "kCIContextOutputColorSpace")
11
+ public static let cacheIntermediates = CIContextOption(rawValue: "kCIContextCacheIntermediates")
12
+ public static let priorityRequestLow = CIContextOption(rawValue: "kCIContextPriorityRequestLow")
13
+ public static let highQualityDownsample = CIContextOption(rawValue: "kCIContextHighQualityDownsample")
14
+ public static let useSoftwareRendererIfNeeded = CIContextOption(rawValue: "kCIContextUseSoftwareRenderer")
15
+ }
16
+
17
+ /// Where Core Image renders. Rendering here is a promise: `createCGImage`
18
+ /// returns at once a bitmap whose recipe the page runs when the image is
19
+ /// drawn, so a context is cheap and holds nothing.
20
+ public final class CIContext: @unchecked Sendable {
21
+ public init() {}
22
+ public init(options: [CIContextOption: Any]?) {}
23
+
24
+ /// The part of `image` inside `fromRect` (rounded out to whole pixels) as
25
+ /// a bitmap of that size, clear where the image does not reach; nil for
26
+ /// an infinite or empty rectangle, as on Apple platforms.
27
+ public func createCGImage(_ image: CIImage, from fromRect: CGRect) -> CGImage? {
28
+ guard let recipe = image._recipe.rendered(in: fromRect) else { return nil }
29
+ return CGImage(_recipe: recipe)
30
+ }
31
+ }
@@ -0,0 +1,57 @@
1
+ // Core Image's feature detectors, as code that scans a picked photo for a QR
2
+ // code (CodeScanner's gallery) calls them. Swift holds no decoded pixels
3
+ // (docs/ops-protocol.md, "Bitmaps and Core Image") and the page's
4
+ // `BarcodeDetector` answers asynchronously, so `features(in:)`, which is
5
+ // synchronous, finds nothing: the code reports that the image has no code.
6
+
7
+ import struct Foundation.Data
8
+ import SwiftUI
9
+
10
+ public let CIDetectorTypeQRCode = "CIDetectorTypeQRCode"
11
+ public let CIDetectorTypeFace = "CIDetectorTypeFace"
12
+ public let CIDetectorTypeRectangle = "CIDetectorTypeRectangle"
13
+ public let CIDetectorTypeText = "CIDetectorTypeText"
14
+ public let CIDetectorAccuracy = "CIDetectorAccuracy"
15
+ public let CIDetectorAccuracyHigh = "CIDetectorAccuracyHigh"
16
+ public let CIDetectorAccuracyLow = "CIDetectorAccuracyLow"
17
+
18
+ /// Finds features in an image: none, in the browser.
19
+ open class CIDetector: @unchecked Sendable {
20
+ public let type: String
21
+
22
+ public init?(ofType type: String, context: CIContext?, options: [String: Any]? = nil) {
23
+ self.type = type
24
+ }
25
+
26
+ open func features(in image: CIImage) -> [CIFeature] { [] }
27
+ open func features(in image: CIImage, options: [String: Any]? = nil) -> [CIFeature] { [] }
28
+ }
29
+
30
+ /// Something a detector found.
31
+ open class CIFeature: @unchecked Sendable {
32
+ public let type: String
33
+ public let bounds: CGRect
34
+
35
+ init(type: String, bounds: CGRect) {
36
+ self.type = type
37
+ self.bounds = bounds
38
+ }
39
+ }
40
+
41
+ /// A QR code a detector found.
42
+ open class CIQRCodeFeature: CIFeature, @unchecked Sendable {
43
+ public let messageString: String?
44
+ public let topLeft: CGPoint
45
+ public let topRight: CGPoint
46
+ public let bottomLeft: CGPoint
47
+ public let bottomRight: CGPoint
48
+
49
+ init(messageString: String?, topLeft: CGPoint, topRight: CGPoint, bottomLeft: CGPoint, bottomRight: CGPoint) {
50
+ self.messageString = messageString
51
+ self.topLeft = topLeft
52
+ self.topRight = topRight
53
+ self.bottomLeft = bottomLeft
54
+ self.bottomRight = bottomRight
55
+ super.init(type: CIDetectorTypeQRCode, bounds: CGRect(x: bottomLeft.x, y: bottomLeft.y, width: topRight.x - bottomLeft.x, height: topRight.y - bottomLeft.y))
56
+ }
57
+ }