@swiftbrowser/swift 0.1.0 → 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 (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 +65 -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 +105 -7
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +93 -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 +3 -2
  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 +67 -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 +80 -10
  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 +11 -2
  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 +164 -37
  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 +96 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
  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 +10 -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 +498 -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 +39 -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,117 @@
1
+ // The views that show a player: `_AVPlayerVideo` draws one as the page's
2
+ // `video` element (AVKit's `VideoPlayer` and `AVPlayerViewController` use it,
3
+ // with the native controls), and `AVPlayerLayer` is a UIKit layer whose
4
+ // drawing is that view without controls, so a UIView whose layer (or a
5
+ // sublayer of it) is a player layer shows the video (ViewTranslation.swift).
6
+
7
+ import Foundation
8
+ import SwiftUI
9
+ import struct SwiftUI.CGSize
10
+ import struct SwiftUI.CGRect
11
+ import UIKit
12
+
13
+ /// How a video fits its layer: letterboxed, cropped to fill, or stretched.
14
+ public struct AVLayerVideoGravity: RawRepresentable, Hashable, Sendable {
15
+ public let rawValue: String
16
+ public init(rawValue: String) { self.rawValue = rawValue }
17
+ public init(_ rawValue: String) { self.rawValue = rawValue }
18
+ public static let resizeAspect = AVLayerVideoGravity("AVLayerVideoGravityResizeAspect")
19
+ public static let resizeAspectFill = AVLayerVideoGravity("AVLayerVideoGravityResizeAspectFill")
20
+ public static let resize = AVLayerVideoGravity("AVLayerVideoGravityResize")
21
+
22
+ /// The `video` element's `gravity` (CSS `object-fit` contain, cover, fill).
23
+ var _pageName: String {
24
+ switch self {
25
+ case .resizeAspectFill: "resizeAspectFill"
26
+ case .resize: "resize"
27
+ default: "resizeAspect"
28
+ }
29
+ }
30
+ }
31
+
32
+ /// A player drawn as a `video` element: black while there is no player. Each
33
+ /// player gets its own surface (keyed by identity), so a view that is handed
34
+ /// another player attaches to it afresh.
35
+ public struct _AVPlayerVideo: View {
36
+ let player: AVPlayer?
37
+ let gravity: AVLayerVideoGravity
38
+ let controls: Bool
39
+
40
+ nonisolated public init(player: AVPlayer?, gravity: AVLayerVideoGravity, controls: Bool) {
41
+ self.player = player
42
+ self.gravity = gravity
43
+ self.controls = controls
44
+ }
45
+
46
+ public var body: some View {
47
+ if let player {
48
+ ForEach([ObjectIdentifier(player)], id: \.self) { _ in
49
+ _AVPlayerSurfaceView(player: player, gravity: gravity, controls: controls)
50
+ }
51
+ } else {
52
+ Color.black
53
+ }
54
+ }
55
+ }
56
+
57
+ /// The identity of one view showing a player.
58
+ final class _AVPlayerSurface {}
59
+
60
+ /// One view of one player: attaches while it is on screen, and draws the
61
+ /// element with the player's props (its body reads the player's observed
62
+ /// state, so a change of rate, mute, item or seek draws it again).
63
+ struct _AVPlayerSurfaceView: View {
64
+ let player: AVPlayer
65
+ let gravity: AVLayerVideoGravity
66
+ let controls: Bool
67
+ @State private var surface = _AVPlayerSurface()
68
+
69
+ var body: some View {
70
+ let id = ObjectIdentifier(surface)
71
+ let player = self.player
72
+ _VideoElement(props: player._videoProps(surface: id, gravity: gravity, controls: controls)) { [weak player] event in
73
+ player?._event(event, from: id)
74
+ }
75
+ .onAppear { player._attach(id) }
76
+ .onDisappear { player._detach(id) }
77
+ }
78
+ }
79
+
80
+ /// A layer that shows a player's video. In a UIView (as its `layerClass` or
81
+ /// a sublayer), the view draws the player filling its bounds, with
82
+ /// `videoGravity`, and no controls.
83
+ open class AVPlayerLayer: CALayer, @unchecked Sendable {
84
+ open var player: AVPlayer? { didSet { if player !== oldValue { _changed() } } }
85
+ open var videoGravity: AVLayerVideoGravity = .resizeAspect { didSet { if videoGravity != oldValue { _changed() } } }
86
+ /// Whether the native controls show (AVKit's player view controller sets it).
87
+ public var _showsControls = false { didSet { if _showsControls != oldValue { _changed() } } }
88
+ open var pixelBufferAttributes: [String: Any]?
89
+
90
+ public convenience init(player: AVPlayer?) {
91
+ self.init()
92
+ self.player = player
93
+ }
94
+
95
+ /// True once the current item's first frame can show (the page read its metadata).
96
+ open var isReadyForDisplay: Bool { player?.currentItem?.status == .readyToPlay }
97
+
98
+ /// Where the video is drawn in the layer's bounds, for its gravity.
99
+ open var videoRect: CGRect {
100
+ guard let size = player?.currentItem?.presentationSize, size.width > 0, size.height > 0 else { return .zero }
101
+ let box = bounds
102
+ switch videoGravity {
103
+ case .resize:
104
+ return box
105
+ default:
106
+ let fit = videoGravity == .resizeAspectFill
107
+ ? max(box.width / size.width, box.height / size.height)
108
+ : min(box.width / size.width, box.height / size.height)
109
+ let width = size.width * fit, height = size.height * fit
110
+ return CGRect(x: box.midX - width / 2, y: box.midY - height / 2, width: width, height: height)
111
+ }
112
+ }
113
+
114
+ open override var _drawing: AnyView? {
115
+ AnyView(_AVPlayerVideo(player: player, gravity: videoGravity, controls: _showsControls))
116
+ }
117
+ }
@@ -0,0 +1,132 @@
1
+ // `import AVKit` for the browser: SwiftUI's `VideoPlayer` and UIKit's
2
+ // `AVPlayerViewController`, both drawn as the page's `video` element with its
3
+ // native controls (docs/ops-protocol.md, "Video and audio"). The player is
4
+ // AVFoundation's `AVPlayer`, which AVKit re-exports as on iOS.
5
+ //
6
+ // Picture in Picture, AirPlay routes and the system's now-playing info are
7
+ // not available: their types answer that they are unsupported.
8
+ @_exported import AVFoundation
9
+ import SwiftUI
10
+ import UIKit
11
+
12
+ /// A view that plays `player`'s current item with the browser's playback
13
+ /// controls, letterboxed on black, filling the space it is offered.
14
+ /// `videoOverlay` is drawn over the video (and over the controls where it
15
+ /// has content, so a full-size overlay takes the taps).
16
+ public struct VideoPlayer<VideoOverlay: View>: View {
17
+ let player: AVPlayer?
18
+ let overlay: VideoOverlay
19
+
20
+ public init(player: AVPlayer?, @ViewBuilder videoOverlay: () -> VideoOverlay) {
21
+ self.player = player
22
+ overlay = videoOverlay()
23
+ }
24
+
25
+ public var body: some View {
26
+ ZStack {
27
+ _AVPlayerVideo(player: player, gravity: .resizeAspect, controls: true)
28
+ overlay
29
+ }
30
+ }
31
+ }
32
+
33
+ extension VideoPlayer where VideoOverlay == EmptyView {
34
+ public init(player: AVPlayer?) {
35
+ self.init(player: player) { EmptyView() }
36
+ }
37
+ }
38
+
39
+ // MARK: - AVPlayerViewController
40
+
41
+ /// What an `AVPlayerViewController` tells its owner. Every method is optional;
42
+ /// full screen and Picture in Picture never start in the browser build.
43
+ @MainActor
44
+ public protocol AVPlayerViewControllerDelegate: AnyObject {
45
+ func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_ playerViewController: AVPlayerViewController) -> Bool
46
+ func playerViewControllerWillStartPictureInPicture(_ playerViewController: AVPlayerViewController)
47
+ func playerViewControllerDidStopPictureInPicture(_ playerViewController: AVPlayerViewController)
48
+ }
49
+
50
+ extension AVPlayerViewControllerDelegate {
51
+ public func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_ playerViewController: AVPlayerViewController) -> Bool { true }
52
+ public func playerViewControllerWillStartPictureInPicture(_ playerViewController: AVPlayerViewController) {}
53
+ public func playerViewControllerDidStopPictureInPicture(_ playerViewController: AVPlayerViewController) {}
54
+ }
55
+
56
+ /// The view of an `AVPlayerViewController`: its layer is the player layer.
57
+ final class _AVPlayerControllerView: UIView {
58
+ override class var layerClass: AnyClass { AVPlayerLayer.self }
59
+ var playerLayer: AVPlayerLayer { layer as! AVPlayerLayer }
60
+ }
61
+
62
+ /// A controller whose view plays `player` (with the native controls unless
63
+ /// `showsPlaybackControls` is off). Shown by a `UIViewControllerRepresentable`
64
+ /// or as a child controller's view, it draws like `VideoPlayer`; the
65
+ /// `contentOverlayView` is drawn over the video.
66
+ @MainActor
67
+ open class AVPlayerViewController: UIViewController {
68
+ open var player: AVPlayer? { didSet { playerLayer?.player = player } }
69
+ open var showsPlaybackControls = true { didSet { playerLayer?._showsControls = showsPlaybackControls } }
70
+ open var videoGravity: AVLayerVideoGravity = .resizeAspect { didSet { playerLayer?.videoGravity = videoGravity } }
71
+ open weak var delegate: (any AVPlayerViewControllerDelegate)?
72
+ open var allowsPictureInPicturePlayback = true
73
+ open var canStartPictureInPictureAutomaticallyFromInline = false
74
+ open var entersFullScreenWhenPlaybackBegins = false
75
+ open var exitsFullScreenWhenPlaybackEnds = false
76
+ open var updatesNowPlayingInfoCenter = true
77
+ open var requiresLinearPlayback = false
78
+ open var showsTimecodes = false
79
+ open var allowsVideoFrameAnalysis = false
80
+ open var speeds: [AVPlaybackSpeed] = AVPlaybackSpeed.systemDefaultSpeeds
81
+ open var isReadyForDisplay: Bool { playerLayer?.isReadyForDisplay ?? false }
82
+ open var videoBounds: CGRect { playerLayer?.videoRect ?? .zero }
83
+ /// A view over the video, below the controls.
84
+ public private(set) lazy var contentOverlayView: UIView? = {
85
+ let overlay = UIView(frame: view.bounds)
86
+ overlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
87
+ view.addSubview(overlay)
88
+ return overlay
89
+ }()
90
+
91
+ private var playerLayer: AVPlayerLayer? { (viewIfLoaded as? _AVPlayerControllerView)?.playerLayer }
92
+
93
+ open override func loadView() {
94
+ let playerView = _AVPlayerControllerView()
95
+ playerView.playerLayer.player = player
96
+ playerView.playerLayer._showsControls = showsPlaybackControls
97
+ playerView.playerLayer.videoGravity = videoGravity
98
+ playerView.backgroundColor = .black
99
+ view = playerView
100
+ }
101
+ }
102
+
103
+ /// A playback speed the controls offer (the browser's own menu applies).
104
+ public struct AVPlaybackSpeed: Hashable, Sendable {
105
+ public let rate: Float
106
+ public let localizedName: String
107
+ public init(rate: Float, localizedName: String) {
108
+ self.rate = rate
109
+ self.localizedName = localizedName
110
+ }
111
+ public static let systemDefaultSpeeds = [0.5, 1, 1.25, 1.5, 2].map { AVPlaybackSpeed(rate: Float($0), localizedName: "\($0)×") }
112
+ }
113
+
114
+ // MARK: - Picture in Picture and routes
115
+
116
+ /// Picture in Picture is not available in the browser build.
117
+ @MainActor
118
+ open class AVPictureInPictureController {
119
+ public static func isPictureInPictureSupported() -> Bool { false }
120
+ public let playerLayer: AVPlayerLayer
121
+ open var isPictureInPictureActive: Bool { false }
122
+ open var isPictureInPicturePossible: Bool { false }
123
+ open var canStartPictureInPictureAutomaticallyFromInline = false
124
+
125
+ /// Nil: Picture in Picture is not supported.
126
+ public init?(playerLayer: AVPlayerLayer) {
127
+ return nil
128
+ }
129
+
130
+ open func startPictureInPicture() {}
131
+ open func stopPictureInPicture() {}
132
+ }
@@ -0,0 +1,122 @@
1
+ // `import Accelerate` for the browser: vImage's buffers and box convolutions,
2
+ // as image code calls them (Nuke's Gaussian blur runs three box passes over
3
+ // a Core Graphics context's memory). A buffer over a `CGContext`'s `data` has
4
+ // no pixels here (the page draws them), so a convolution between two contexts
5
+ // becomes a recipe step on the destination (`CGContext._boxConvolve`), and
6
+ // the page blurs. A buffer of real memory is convolved on the spot.
7
+
8
+ import CoreGraphics
9
+ import SwiftUI
10
+
11
+ public typealias vImagePixelCount = UInt
12
+ public typealias vImage_Flags = UInt32
13
+ public typealias vImage_Error = Int
14
+
15
+ public let kvImageNoFlags: Int = 0
16
+ public let kvImageLeaveAlphaUnchanged: Int = 1
17
+ public let kvImageCopyInPlace: Int = 2
18
+ public let kvImageBackgroundColorFill: Int = 4
19
+ public let kvImageEdgeExtend: Int = 8
20
+ public let kvImageDoNotTile: Int = 16
21
+ public let kvImageHighQualityResampling: Int = 32
22
+ public let kvImageTruncateKernel: Int = 64
23
+ public let kvImageGetTempBufferSize: Int = 128
24
+
25
+ public let kvImageNoError: Int = 0
26
+ public let kvImageRoiLargerThanInputBuffer: Int = -21766
27
+ public let kvImageInvalidKernelSize: Int = -21767
28
+ public let kvImageNullPointerArgument: Int = -21772
29
+
30
+ /// A bitmap in memory: `height` rows of `rowBytes` bytes at `data`.
31
+ public struct vImage_Buffer {
32
+ public var data: UnsafeMutableRawPointer!
33
+ public var height: vImagePixelCount
34
+ public var width: vImagePixelCount
35
+ public var rowBytes: Int
36
+
37
+ public init() {
38
+ data = nil
39
+ height = 0
40
+ width = 0
41
+ rowBytes = 0
42
+ }
43
+
44
+ public init(data: UnsafeMutableRawPointer!, height: vImagePixelCount, width: vImagePixelCount, rowBytes: Int) {
45
+ self.data = data
46
+ self.height = height
47
+ self.width = width
48
+ self.rowBytes = rowBytes
49
+ }
50
+ }
51
+
52
+ /// A box blur of a four-channel, eight-bit image: each pixel becomes the mean
53
+ /// of the `kernel_width` × `kernel_height` box around it.
54
+ public func vImageBoxConvolve_ARGB8888(_ src: UnsafePointer<vImage_Buffer>, _ dest: UnsafePointer<vImage_Buffer>, _ tempBuffer: UnsafeMutableRawPointer?,
55
+ _ srcOffsetToROI_X: vImagePixelCount, _ srcOffsetToROI_Y: vImagePixelCount,
56
+ _ kernel_height: UInt32, _ kernel_width: UInt32, _ backgroundColor: UnsafePointer<UInt8>?, _ flags: vImage_Flags) -> vImage_Error {
57
+ _boxConvolve(src.pointee, dest.pointee, channels: 4, offset: (Int(srcOffsetToROI_X), Int(srcOffsetToROI_Y)),
58
+ kernel: (Int(kernel_width), Int(kernel_height)), background: backgroundColor, flags: flags)
59
+ }
60
+
61
+ /// The same for one eight-bit channel.
62
+ public func vImageBoxConvolve_Planar8(_ src: UnsafePointer<vImage_Buffer>, _ dest: UnsafePointer<vImage_Buffer>, _ tempBuffer: UnsafeMutableRawPointer?,
63
+ _ srcOffsetToROI_X: vImagePixelCount, _ srcOffsetToROI_Y: vImagePixelCount,
64
+ _ kernel_height: UInt32, _ kernel_width: UInt32, _ backgroundColor: UInt8, _ flags: vImage_Flags) -> vImage_Error {
65
+ var background = backgroundColor
66
+ return _boxConvolve(src.pointee, dest.pointee, channels: 1, offset: (Int(srcOffsetToROI_X), Int(srcOffsetToROI_Y)),
67
+ kernel: (Int(kernel_width), Int(kernel_height)), background: &background, flags: flags)
68
+ }
69
+
70
+ func _boxConvolve(_ src: vImage_Buffer, _ dest: vImage_Buffer, channels: Int, offset: (Int, Int), kernel: (Int, Int),
71
+ background: UnsafePointer<UInt8>?, flags: vImage_Flags) -> vImage_Error {
72
+ guard kernel.0 > 0, kernel.1 > 0, kernel.0 % 2 == 1, kernel.1 % 2 == 1 else { return kvImageInvalidKernelSize }
73
+ if Int(flags) & kvImageGetTempBufferSize != 0 { return 0 }
74
+ guard let srcData = src.data, let destData = dest.data else { return kvImageNullPointerArgument }
75
+ let extend = Int(flags) & kvImageEdgeExtend != 0
76
+ // Contexts: the page has the pixels; record the blur.
77
+ if let from = CGContext._context(withData: srcData), let to = CGContext._context(withData: destData) {
78
+ to._boxConvolve(from: from, kernelWidth: kernel.0, kernelHeight: kernel.1, extendEdges: extend)
79
+ return kvImageNoError
80
+ }
81
+ let width = Int(dest.width), height = Int(dest.height)
82
+ guard offset.0 + width <= Int(src.width), offset.1 + height <= Int(src.height) else { return kvImageRoiLargerThanInputBuffer }
83
+ let input = srcData.assumingMemoryBound(to: UInt8.self)
84
+ let output = destData.assumingMemoryBound(to: UInt8.self)
85
+ let rx = kernel.0 / 2, ry = kernel.1 / 2
86
+ let area = kernel.0 * kernel.1
87
+ let copyAlpha = Int(flags) & kvImageLeaveAlphaUnchanged != 0 && channels == 4
88
+ // Into a separate buffer first, so the source and destination may be the same memory.
89
+ var result = [UInt8](repeating: 0, count: width * height * channels)
90
+ for y in 0..<height {
91
+ for x in 0..<width {
92
+ for c in 0..<channels {
93
+ var sum = 0
94
+ for ky in -ry...ry {
95
+ for kx in -rx...rx {
96
+ var sx = offset.0 + x + kx, sy = offset.1 + y + ky
97
+ if sx < 0 || sy < 0 || sx >= Int(src.width) || sy >= Int(src.height) {
98
+ if extend {
99
+ sx = min(max(sx, 0), Int(src.width) - 1)
100
+ sy = min(max(sy, 0), Int(src.height) - 1)
101
+ } else {
102
+ sum += Int(background?[c] ?? 0)
103
+ continue
104
+ }
105
+ }
106
+ sum += Int(input[sy * src.rowBytes + sx * channels + c])
107
+ }
108
+ }
109
+ result[(y * width + x) * channels + c] = UInt8((sum + area / 2) / area)
110
+ }
111
+ }
112
+ }
113
+ for y in 0..<height {
114
+ for x in 0..<width {
115
+ for c in 0..<channels {
116
+ if copyAlpha && c == 0 { continue }
117
+ output[y * dest.rowBytes + x * channels + c] = result[(y * width + x) * channels + c]
118
+ }
119
+ }
120
+ }
121
+ return kvImageNoError
122
+ }
@@ -0,0 +1,144 @@
1
+ // `import AppIntents` for the browser: the types apps declare their intents,
2
+ // entities, enums and App Shortcuts with, and SwiftUI's `Button(intent:)`.
3
+ //
4
+ // Nothing outside the app runs an intent here: the browser has no Shortcuts,
5
+ // Siri, Spotlight, widgets or Action button, so an `AppShortcutsProvider`'s
6
+ // shortcuts, an intent's title, description and phrases, and an entity's
7
+ // queries are declarations nobody reads. What the app does with its own
8
+ // intents still happens: a `Button(intent:)` (and ButtonKit's
9
+ // `AsyncButton(intent:)`) runs the intent's `perform()` when tapped, as on
10
+ // iOS, with the parameters the app set on it. A parameter the app left unset
11
+ // has no Shortcuts to ask for it: an optional one reads nil, any other one
12
+ // stops the app with a message naming it.
13
+
14
+ import Foundation
15
+ import FoundationBridge
16
+ import SwiftUI
17
+ import UIKit
18
+ import UniformTypeIdentifiers
19
+
20
+ // MARK: - Intents
21
+
22
+ /// An action of the app's. In the browser only the app itself performs one
23
+ /// (through `Button(intent:)`); `title`, `openAppWhenRun` and the rest are kept
24
+ /// for the declarations to compile.
25
+ public protocol AppIntent: Sendable {
26
+ associatedtype PerformResult: IntentResult
27
+ static var title: LocalizedStringResource { get }
28
+ /// Whether Shortcuts opens the app first: the app is always open in the browser.
29
+ static var openAppWhenRun: Bool { get }
30
+ static var isDiscoverable: Bool { get }
31
+ static var authenticationPolicy: IntentAuthenticationPolicy { get }
32
+ init()
33
+ func perform() async throws -> PerformResult
34
+ }
35
+
36
+ extension AppIntent {
37
+ public static var openAppWhenRun: Bool { false }
38
+ public static var isDiscoverable: Bool { true }
39
+ public static var authenticationPolicy: IntentAuthenticationPolicy { .alwaysAllowed }
40
+ }
41
+
42
+ /// Intents that continue in the app, play audio, drive a Live Activity or
43
+ /// configure a widget: markers here, as nothing outside the app runs them.
44
+ public protocol ForegroundContinuableIntent: AppIntent {}
45
+ public protocol AudioPlaybackIntent: AppIntent {}
46
+ public protocol LiveActivityIntent: AppIntent {}
47
+ public protocol WidgetConfigurationIntent: AppIntent {}
48
+ public protocol SystemIntent: AppIntent {}
49
+
50
+ public enum IntentAuthenticationPolicy: Sendable {
51
+ case alwaysAllowed, requiresAuthentication, requiresLocalDeviceAuthentication
52
+ }
53
+
54
+ /// How an intent describes itself to Shortcuts (kept, not shown).
55
+ public struct IntentDescription: Sendable, ExpressibleByStringInterpolation {
56
+ public var descriptionText: LocalizedStringResource
57
+ public var categoryName: LocalizedStringResource?
58
+ public var searchKeywords: [LocalizedStringResource]
59
+ public var resultValueName: LocalizedStringResource?
60
+
61
+ public init(_ descriptionText: LocalizedStringResource, categoryName: LocalizedStringResource? = nil,
62
+ searchKeywords: [LocalizedStringResource] = [], resultValueName: LocalizedStringResource? = nil) {
63
+ self.descriptionText = descriptionText
64
+ self.categoryName = categoryName
65
+ self.searchKeywords = searchKeywords
66
+ self.resultValueName = resultValueName
67
+ }
68
+
69
+ public init(stringLiteral value: String) { self.init(LocalizedStringResource(stringLiteral: value)) }
70
+ public init(stringInterpolation: LocalizedStringResource.StringInterpolation) {
71
+ self.init(LocalizedStringResource(stringInterpolation: stringInterpolation))
72
+ }
73
+ }
74
+
75
+ /// What Siri would say. `perform()` results keep it; nothing speaks it.
76
+ public struct IntentDialog: Sendable, ExpressibleByStringInterpolation {
77
+ public var full: LocalizedStringResource
78
+ public var supporting: LocalizedStringResource
79
+ public var systemImageName: String?
80
+
81
+ public init(_ resource: LocalizedStringResource) {
82
+ full = resource
83
+ supporting = resource
84
+ }
85
+
86
+ public init(full: LocalizedStringResource, supporting: LocalizedStringResource, systemImageName: String? = nil) {
87
+ self.full = full
88
+ self.supporting = supporting
89
+ self.systemImageName = systemImageName
90
+ }
91
+
92
+ public init(stringLiteral value: String) { self.init(LocalizedStringResource(stringLiteral: value)) }
93
+ public init(stringInterpolation: LocalizedStringResource.StringInterpolation) {
94
+ self.init(LocalizedStringResource(stringInterpolation: stringInterpolation))
95
+ }
96
+ }
97
+
98
+ // MARK: - Results
99
+
100
+ /// What `perform()` returns. Results are made with `.result(…)`.
101
+ public protocol IntentResult: Sendable {}
102
+ public protocol ProvidesDialog: IntentResult {}
103
+ public protocol ShowsSnippetView: IntentResult {}
104
+ public protocol OpensIntent: IntentResult {}
105
+ public protocol ReturnsValue<Value>: IntentResult {
106
+ associatedtype Value
107
+ }
108
+
109
+ /// Every result: its value, dialog, snippet view and the intent it opens, as given.
110
+ public struct IntentResultContainer<Value>: IntentResult, ProvidesDialog, ShowsSnippetView, OpensIntent, ReturnsValue, @unchecked Sendable {
111
+ public let value: Value?
112
+ public let dialog: IntentDialog?
113
+ /// The snippet view, which nothing shows.
114
+ public let view: (any View)?
115
+ /// The intent to run next, which nothing runs.
116
+ public let opensIntent: (any AppIntent)?
117
+ }
118
+
119
+ extension IntentResult where Self == IntentResultContainer<Never> {
120
+ public static func result() -> Self { .init(value: nil, dialog: nil, view: nil, opensIntent: nil) }
121
+ public static func result(dialog: IntentDialog) -> Self { .init(value: nil, dialog: dialog, view: nil, opensIntent: nil) }
122
+ public static func result(view: some View) -> Self { .init(value: nil, dialog: nil, view: view, opensIntent: nil) }
123
+ public static func result(dialog: IntentDialog, view: some View) -> Self { .init(value: nil, dialog: dialog, view: view, opensIntent: nil) }
124
+ public static func result(dialog: IntentDialog, @ViewBuilder content: () -> some View) -> Self {
125
+ .init(value: nil, dialog: dialog, view: content(), opensIntent: nil)
126
+ }
127
+ public static func result(opensIntent: some AppIntent, dialog: IntentDialog? = nil) -> Self {
128
+ .init(value: nil, dialog: dialog, view: nil, opensIntent: opensIntent)
129
+ }
130
+ public static func result<Value>(value: Value, dialog: IntentDialog? = nil) -> IntentResultContainer<Value> {
131
+ .init(value: value, dialog: dialog, view: nil, opensIntent: nil)
132
+ }
133
+ public static func result<Value>(value: Value, dialog: IntentDialog? = nil, view: some View) -> IntentResultContainer<Value> {
134
+ .init(value: value, dialog: dialog, view: view, opensIntent: nil)
135
+ }
136
+ public static func result<Value>(value: Value, opensIntent: some AppIntent, dialog: IntentDialog? = nil) -> IntentResultContainer<Value> {
137
+ .init(value: value, dialog: dialog, view: nil, opensIntent: opensIntent)
138
+ }
139
+ }
140
+
141
+ /// An intent's error that carries a message for Siri (kept in `localizedStringResource`).
142
+ public protocol CustomLocalizedStringResourceConvertible {
143
+ var localizedStringResource: LocalizedStringResource { get }
144
+ }