@swiftbrowser/swift 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,212 @@
1
+ // TimelineView: content re-rendered on a schedule. The shim has no Foundation
2
+ // `Date`, so the context carries `_TimelineDate` (seconds since 1970); Apple
3
+ // code reading `context.date.timeIntervalSince1970` compiles unchanged. Ticks
4
+ // run on the host-driven executor like `.task` does and stop when the view
5
+ // leaves the tree. See docs/ops-protocol.md (Phase 6).
6
+
7
+ #if canImport(WASILibc)
8
+ import WASILibc
9
+ #elseif canImport(Glibc)
10
+ import Glibc
11
+ #elseif canImport(Musl)
12
+ import Musl
13
+ #elseif canImport(Darwin)
14
+ import Darwin
15
+ #endif
16
+
17
+ // MARK: - Dates
18
+
19
+ /// A point in time, as seconds since 1970. Stands in for Foundation's `Date`.
20
+ public struct _TimelineDate: Hashable, Comparable, Sendable {
21
+ public var timeIntervalSince1970: Double
22
+
23
+ public init(timeIntervalSince1970: Double) {
24
+ self.timeIntervalSince1970 = timeIntervalSince1970
25
+ }
26
+
27
+ /// The current time (the wall clock; fixed in headless snapshots).
28
+ public static var now: _TimelineDate { _TimelineDate(timeIntervalSince1970: _timelineNow()) }
29
+
30
+ public func timeIntervalSince(_ other: _TimelineDate) -> Double {
31
+ timeIntervalSince1970 - other.timeIntervalSince1970
32
+ }
33
+
34
+ public func addingTimeInterval(_ interval: Double) -> _TimelineDate {
35
+ _TimelineDate(timeIntervalSince1970: timeIntervalSince1970 + interval)
36
+ }
37
+
38
+ public static func < (lhs: _TimelineDate, rhs: _TimelineDate) -> Bool {
39
+ lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970
40
+ }
41
+ }
42
+
43
+ /// Seconds since 1970 from the platform clock.
44
+ func _wallClockSeconds() -> Double {
45
+ var tv = timeval()
46
+ gettimeofday(&tv, nil)
47
+ return Double(tv.tv_sec) + Double(tv.tv_usec) / 1_000_000
48
+ }
49
+
50
+ /// How `TimelineView` reads the time and waits between ticks. Headless
51
+ /// snapshot runs (`SB_HEADLESS`) derive the time from the executor's virtual
52
+ /// clock so output is byte-stable; tests swap both for a virtual clock.
53
+ /// Wasm is single-threaded and tests set these from the main actor.
54
+ enum _TimelineClock {
55
+ nonisolated(unsafe) static let headless = _environment("SB_HEADLESS") == "1"
56
+
57
+ nonisolated(unsafe) static var now: () -> Double = {
58
+ headless ? 1_700_000_000 + Double(_HostExecutor.shared.nowNs) / 1e9 : _wallClockSeconds()
59
+ }
60
+
61
+ nonisolated(unsafe) static var sleep: (Double) async -> Void = { seconds in
62
+ try? await Task.sleep(for: .seconds(seconds))
63
+ }
64
+ }
65
+
66
+ func _timelineNow() -> Double { _TimelineClock.now() }
67
+
68
+ // MARK: - Schedules
69
+
70
+ /// The mode a schedule produces entries for. Accepted for source compatibility.
71
+ public enum TimelineScheduleMode: Hashable, Sendable {
72
+ case normal, lowFrequency
73
+ }
74
+
75
+ /// A schedule of times at which a `TimelineView` updates. The shim's schedules
76
+ /// are periodic: an interval in seconds and a paused flag. A custom
77
+ /// conformance that does not adopt the shim's `_TimelineScheduling` ticks once
78
+ /// per second.
79
+ public protocol TimelineSchedule {}
80
+
81
+ /// What the runtime reads from a schedule.
82
+ protocol _TimelineScheduling {
83
+ /// Seconds between ticks.
84
+ var _interval: Double { get }
85
+ var _paused: Bool { get }
86
+ }
87
+
88
+ /// Updates as often as animation needs. The default minimum interval is 1/20 s:
89
+ /// every tick is a round trip through the browser renderer, so 60 fps costs
90
+ /// too much; pass `minimumInterval` to go faster or slower.
91
+ public struct AnimationTimelineSchedule: TimelineSchedule, _TimelineScheduling, Sendable {
92
+ public var minimumInterval: Double?
93
+ public var paused: Bool
94
+
95
+ public init(minimumInterval: Double? = nil, paused: Bool = false) {
96
+ self.minimumInterval = minimumInterval
97
+ self.paused = paused
98
+ }
99
+
100
+ var _interval: Double { max(minimumInterval ?? 0.05, 1.0 / 60) }
101
+ var _paused: Bool { paused }
102
+ }
103
+
104
+ /// Updates every `interval` seconds, starting at `startDate`.
105
+ public struct PeriodicTimelineSchedule: TimelineSchedule, _TimelineScheduling, Sendable {
106
+ public var startDate: _TimelineDate
107
+ public var interval: Double
108
+
109
+ public init(from startDate: _TimelineDate, by interval: Double) {
110
+ self.startDate = startDate
111
+ self.interval = interval
112
+ }
113
+
114
+ var _interval: Double { max(interval, 1.0 / 60) }
115
+ var _paused: Bool { false }
116
+ }
117
+
118
+ /// Updates at the start of every minute (every 60 seconds here).
119
+ public struct EveryMinuteTimelineSchedule: TimelineSchedule, _TimelineScheduling, Sendable {
120
+ public init() {}
121
+ var _interval: Double { 60 }
122
+ var _paused: Bool { false }
123
+ }
124
+
125
+ extension TimelineSchedule where Self == AnimationTimelineSchedule {
126
+ public static var animation: AnimationTimelineSchedule { AnimationTimelineSchedule() }
127
+ public static func animation(minimumInterval: Double? = nil, paused: Bool = false) -> AnimationTimelineSchedule {
128
+ AnimationTimelineSchedule(minimumInterval: minimumInterval, paused: paused)
129
+ }
130
+ }
131
+
132
+ extension TimelineSchedule where Self == PeriodicTimelineSchedule {
133
+ public static func periodic(from startDate: _TimelineDate, by interval: Double) -> PeriodicTimelineSchedule {
134
+ PeriodicTimelineSchedule(from: startDate, by: interval)
135
+ }
136
+ }
137
+
138
+ extension TimelineSchedule where Self == EveryMinuteTimelineSchedule {
139
+ public static var everyMinute: EveryMinuteTimelineSchedule { EveryMinuteTimelineSchedule() }
140
+ }
141
+
142
+ // MARK: - TimelineView
143
+
144
+ /// What a `TimelineView` passes to its content on every tick.
145
+ public struct TimelineViewDefaultContext {
146
+ /// The rate the view updates at.
147
+ public enum Cadence: Hashable, Sendable, Comparable {
148
+ case live, seconds, minutes
149
+ }
150
+
151
+ public var date: _TimelineDate
152
+ public var cadence: Cadence
153
+ }
154
+
155
+ /// Identity of a tick loop: when the schedule changes, the loop restarts.
156
+ struct _TimelineTaskID: Hashable {
157
+ var interval: Double
158
+ var paused: Bool
159
+ }
160
+
161
+ /// A view whose content updates on a schedule. Renders as a plain group with
162
+ /// a single child, `content(context)`.
163
+ public struct TimelineView<Schedule: TimelineSchedule, Content: View> {
164
+ public typealias Context = TimelineViewDefaultContext
165
+
166
+ let schedule: Schedule
167
+ let content: (Context) -> Content
168
+ /// The time of the last tick; `nil` before the first.
169
+ @State var tick: Double? = nil
170
+
171
+ public init(_ schedule: Schedule, @ViewBuilder content: @escaping (Context) -> Content) {
172
+ self.schedule = schedule
173
+ self.content = content
174
+ }
175
+
176
+ var interval: Double { (schedule as? any _TimelineScheduling)?._interval ?? 1 }
177
+ var paused: Bool { (schedule as? any _TimelineScheduling)?._paused ?? false }
178
+
179
+ var cadence: Context.Cadence {
180
+ interval >= 60 ? .minutes : interval >= 1 ? .seconds : .live
181
+ }
182
+ }
183
+ extension TimelineView: _PrimitiveView {}
184
+ extension TimelineView: _GroupView {
185
+ var _children: [any View] {
186
+ let date = _TimelineDate(timeIntervalSince1970: tick ?? _timelineNow())
187
+ return [content(Context(date: date, cadence: cadence))]
188
+ }
189
+ }
190
+ extension TimelineView: _TaskStarting {
191
+ var _taskID: AnyHashable? { AnyHashable(_TimelineTaskID(interval: interval, paused: paused)) }
192
+
193
+ var _taskAction: @Sendable () async -> Void {
194
+ guard !paused else { return {} }
195
+ let interval = self.interval
196
+ // The box is only touched on the main actor; the closure is built
197
+ // outside it, so the capture is marked as such.
198
+ let box = _TickBox(_tick.box)
199
+ return { @MainActor in
200
+ while !Task.isCancelled {
201
+ await _TimelineClock.sleep(interval)
202
+ if Task.isCancelled { return }
203
+ box.box.value = _timelineNow()
204
+ }
205
+ }
206
+ }
207
+ }
208
+
209
+ private struct _TickBox: @unchecked Sendable {
210
+ let box: _StateBox<Double?>
211
+ init(_ box: _StateBox<Double?>) { self.box = box }
212
+ }
@@ -0,0 +1,251 @@
1
+ /// `.toolbar` and `.searchable`. Items become `toolbar` / `searchfield`
2
+ /// elements inside the screen's content; when the runtime emits a `navscreen`
3
+ /// it hoists them to be the screen's direct children (after the content), which
4
+ /// is where the renderer draws the navigation bar from.
5
+
6
+ public struct ToolbarItemPlacement: Hashable, Sendable {
7
+ let name: String
8
+
9
+ public static let automatic = ToolbarItemPlacement(name: "trailing")
10
+ public static let primaryAction = ToolbarItemPlacement(name: "trailing")
11
+ public static let secondaryAction = ToolbarItemPlacement(name: "trailing")
12
+ public static let confirmationAction = ToolbarItemPlacement(name: "trailing")
13
+ public static let destructiveAction = ToolbarItemPlacement(name: "trailing")
14
+ public static let cancellationAction = ToolbarItemPlacement(name: "leading")
15
+ public static let navigation = ToolbarItemPlacement(name: "leading")
16
+ public static let principal = ToolbarItemPlacement(name: "principal")
17
+ public static let status = ToolbarItemPlacement(name: "bottom")
18
+ public static let bottomBar = ToolbarItemPlacement(name: "bottom")
19
+ public static let keyboard = ToolbarItemPlacement(name: "bottom")
20
+ public static let topBarLeading = ToolbarItemPlacement(name: "leading")
21
+ public static let topBarTrailing = ToolbarItemPlacement(name: "trailing")
22
+ public static let navigationBarLeading = ToolbarItemPlacement(name: "leading")
23
+ public static let navigationBarTrailing = ToolbarItemPlacement(name: "trailing")
24
+ }
25
+
26
+ /// Content of a `.toolbar`: items, groups, title menus or plain views, or a
27
+ /// type of the app's with a `body` (CustomToolbarContent.swift). Main-actor
28
+ /// isolated, as SwiftUI's is.
29
+ @MainActor @preconcurrency
30
+ public protocol ToolbarContent {
31
+ associatedtype Body: ToolbarContent
32
+ @ToolbarContentBuilder var body: Body { get }
33
+ nonisolated var _toolbarItems: [any View] { get }
34
+ }
35
+
36
+ /// A `toolbar` element: the items of one placement.
37
+ struct _ToolbarGroupView {
38
+ let placement: ToolbarItemPlacement
39
+ let items: [any View]
40
+ }
41
+ extension _ToolbarGroupView: _PrimitiveView {}
42
+ extension _ToolbarGroupView: _HostView {
43
+ var _kind: String { "toolbar" }
44
+ func _props(in environment: EnvironmentValues) -> _JSON { .object(["placement": .string(placement.name)]) }
45
+ var _content: [any View] { items }
46
+ }
47
+ extension _ToolbarGroupView: _EnvironmentModifying {
48
+ /// Labels in a bar show their icon only, as on iOS (the title is the
49
+ /// accessibility label); an explicit `.labelStyle` inside an item still wins.
50
+ func _apply(to environment: inout EnvironmentValues) {
51
+ environment._labelStyle = _AnyLabelStyle.iconOnly
52
+ }
53
+ }
54
+
55
+ nonisolated public struct ToolbarItem<ID, Content: View>: ToolbarContent {
56
+ let placement: ToolbarItemPlacement
57
+ let content: Content
58
+
59
+ public init(placement: ToolbarItemPlacement = .automatic, @ViewBuilder content: () -> Content) where ID == Void {
60
+ self.placement = placement
61
+ self.content = content()
62
+ }
63
+
64
+ public init(id: ID, placement: ToolbarItemPlacement = .automatic, @ViewBuilder content: () -> Content) where ID: Hashable {
65
+ self.placement = placement
66
+ self.content = content()
67
+ }
68
+
69
+ nonisolated public var _toolbarItems: [any View] { [_ToolbarGroupView(placement: placement, items: [content])] }
70
+ }
71
+
72
+ nonisolated public struct ToolbarItemGroup<Content: View>: ToolbarContent {
73
+ let placement: ToolbarItemPlacement
74
+ let content: Content
75
+
76
+ public init(placement: ToolbarItemPlacement = .automatic, @ViewBuilder content: () -> Content) {
77
+ self.placement = placement
78
+ self.content = content()
79
+ }
80
+
81
+ nonisolated public var _toolbarItems: [any View] { [_ToolbarGroupView(placement: placement, items: [content])] }
82
+ }
83
+
84
+ /// Accepted for source compatibility; the title has no menu in the browser.
85
+ nonisolated public struct ToolbarTitleMenu<Content: View>: ToolbarContent {
86
+ public init(@ViewBuilder content: () -> Content) { _ = content() }
87
+ nonisolated public var _toolbarItems: [any View] { [] }
88
+ }
89
+
90
+ /// Several contents in order (a builder's block, `if`/`else` branches).
91
+ nonisolated public struct _ToolbarContentList: ToolbarContent {
92
+ let parts: [any ToolbarContent]
93
+ nonisolated public var _toolbarItems: [any View] { parts.flatMap(\._toolbarItems) }
94
+ }
95
+
96
+ nonisolated struct _EmptyToolbarContent: ToolbarContent {
97
+ nonisolated var _toolbarItems: [any View] { [] }
98
+ }
99
+
100
+ @resultBuilder
101
+ public enum ToolbarContentBuilder {
102
+ public static func buildBlock() -> some ToolbarContent { _EmptyToolbarContent() }
103
+
104
+ public static func buildBlock<C: ToolbarContent>(_ content: C) -> C { content }
105
+
106
+ public static func buildBlock<each C: ToolbarContent>(_ content: repeat each C) -> some ToolbarContent {
107
+ var parts: [any ToolbarContent] = []
108
+ for part in repeat each content { parts.append(part) }
109
+ return _ToolbarContentList(parts: parts)
110
+ }
111
+
112
+ public static func buildExpression<C: ToolbarContent>(_ content: C) -> C { content }
113
+
114
+ public static func buildOptional<C: ToolbarContent>(_ content: C?) -> some ToolbarContent {
115
+ _ToolbarContentList(parts: content.map { [$0] } ?? [])
116
+ }
117
+
118
+ // Both branches of an `if`/`else` must build the same type.
119
+ public static func buildEither<T: ToolbarContent>(first: T) -> _ToolbarContentList {
120
+ _ToolbarContentList(parts: [first])
121
+ }
122
+
123
+ public static func buildEither<F: ToolbarContent>(second: F) -> _ToolbarContentList {
124
+ _ToolbarContentList(parts: [second])
125
+ }
126
+
127
+ /// `if #available(…)`.
128
+ public static func buildLimitedAvailability<C: ToolbarContent>(_ content: C) -> _ToolbarContentList {
129
+ _ToolbarContentList(parts: [content])
130
+ }
131
+
132
+ public static func buildIf<C: ToolbarContent>(_ content: C?) -> some ToolbarContent {
133
+ _ToolbarContentList(parts: content.map { [$0] } ?? [])
134
+ }
135
+ }
136
+
137
+ /// The content plus its toolbar groups, as sibling children. The groups are
138
+ /// hoisted to the enclosing `navscreen` when elements are emitted.
139
+ struct _ToolbarView<Content: View> {
140
+ let content: Content
141
+ let groups: [any View]
142
+ }
143
+ extension _ToolbarView: _PrimitiveView {}
144
+ extension _ToolbarView: _GroupView {
145
+ var _children: [any View] { [content] + groups }
146
+ }
147
+
148
+ nonisolated extension View {
149
+ public func toolbar<C: ToolbarContent>(@ToolbarContentBuilder content: () -> C) -> some View {
150
+ _ToolbarView(content: self, groups: content()._toolbarItems)
151
+ }
152
+
153
+ /// Plain views in a toolbar go to the trailing placement.
154
+ public func toolbar<V: View>(@ViewBuilder content: () -> V) -> some View {
155
+ _ToolbarView(content: self, groups: [_ToolbarGroupView(placement: .automatic, items: [content()])])
156
+ }
157
+
158
+ public func toolbar(_ visibility: Visibility, for bars: ToolbarPlacement...) -> some View { self }
159
+ public func toolbarBackground<S: ShapeStyle>(_ style: S, for bars: ToolbarPlacement...) -> some View { self }
160
+ public func toolbarBackground(_ visibility: Visibility, for bars: ToolbarPlacement...) -> some View { self }
161
+ public func toolbarColorScheme(_ colorScheme: ColorScheme?, for bars: ToolbarPlacement...) -> some View { self }
162
+ }
163
+
164
+ public enum Visibility: Hashable, Sendable { case automatic, visible, hidden }
165
+
166
+ public struct ToolbarPlacement: Hashable, Sendable {
167
+ let name: String
168
+ public static let automatic = ToolbarPlacement(name: "automatic")
169
+ public static let navigationBar = ToolbarPlacement(name: "navigationBar")
170
+ public static let tabBar = ToolbarPlacement(name: "tabBar")
171
+ public static let bottomBar = ToolbarPlacement(name: "bottomBar")
172
+ }
173
+
174
+ // MARK: - Searchable
175
+
176
+ /// A `searchfield` element bound to the search text; hoisted into the bar.
177
+ struct _SearchFieldView {
178
+ let text: Binding<String>
179
+ let prompt: String
180
+ }
181
+ extension _SearchFieldView: _PrimitiveView {}
182
+ extension _SearchFieldView: _HostView {
183
+ var _kind: String { "searchfield" }
184
+ func _props(in environment: EnvironmentValues) -> _JSON {
185
+ .object(["text": .string(text.wrappedValue), "placeholder": .string(prompt)])
186
+ }
187
+ var _handler: ((_JSON) -> Void)? {
188
+ let text = self.text
189
+ return { payload in
190
+ if case .string(let value) = payload { text.wrappedValue = value }
191
+ }
192
+ }
193
+ }
194
+
195
+ struct _SearchableView<Content: View> {
196
+ let content: Content
197
+ let field: _SearchFieldView
198
+ }
199
+ extension _SearchableView: _PrimitiveView {}
200
+ extension _SearchableView: _GroupView {
201
+ var _children: [any View] { [content, field] }
202
+ }
203
+
204
+ public struct SearchFieldPlacement: Hashable, Sendable {
205
+ let name: String
206
+ public static let automatic = SearchFieldPlacement(name: "automatic")
207
+ public static let toolbar = SearchFieldPlacement(name: "toolbar")
208
+ public static let sidebar = SearchFieldPlacement(name: "sidebar")
209
+ public static let navigationBarDrawer = SearchFieldPlacement(name: "navigationBarDrawer")
210
+ }
211
+
212
+ nonisolated extension View {
213
+ public func searchable(text: Binding<String>, placement: SearchFieldPlacement = .automatic,
214
+ prompt: Text? = nil) -> some View {
215
+ _SearchableView(content: self, field: _SearchFieldView(text: text, prompt: prompt?.content ?? "Search"))
216
+ }
217
+
218
+ @_disfavoredOverload
219
+ public func searchable<S: StringProtocol>(text: Binding<String>, placement: SearchFieldPlacement = .automatic,
220
+ prompt: S) -> some View {
221
+ _SearchableView(content: self, field: _SearchFieldView(text: text, prompt: String(prompt)))
222
+ }
223
+
224
+ public func searchable(text: Binding<String>, placement: SearchFieldPlacement = .automatic,
225
+ prompt: LocalizedStringKey) -> some View {
226
+ _SearchableView(content: self, field: _SearchFieldView(text: text, prompt: prompt.key))
227
+ }
228
+
229
+ /// Suggestions under the search field. The page's search field shows
230
+ /// none: the views are not drawn, and searching works as typed.
231
+ public func searchSuggestions<S: View>(@ViewBuilder _ suggestions: () -> S) -> some View { self }
232
+
233
+ public func searchSuggestions(_ visibility: Visibility, for placements: SearchSuggestionsPlacement.Set) -> some View { self }
234
+
235
+ /// The text a suggestion completes the search with (see `searchSuggestions`).
236
+ public func searchCompletion(_ completion: String) -> some View { self }
237
+ }
238
+
239
+ /// Where search suggestions show; accepted (see `searchSuggestions`).
240
+ public struct SearchSuggestionsPlacement: Equatable, Sendable {
241
+ public static let automatic = SearchSuggestionsPlacement()
242
+ public static let menu = SearchSuggestionsPlacement()
243
+ public static let content = SearchSuggestionsPlacement()
244
+
245
+ public struct Set: OptionSet, Sendable {
246
+ public let rawValue: Int
247
+ public init(rawValue: Int) { self.rawValue = rawValue }
248
+ public static let menu = Set(rawValue: 1)
249
+ public static let content = Set(rawValue: 2)
250
+ }
251
+ }
@@ -0,0 +1,145 @@
1
+ import Foundation
2
+ // As on iOS, SwiftUI brings CoreTransferable (`Transferable` and its
3
+ // representations) and with it UniformTypeIdentifiers' `UTType`.
4
+ @_exported import CoreTransferable
5
+
6
+ // SwiftUI's side of `Transferable`: `Image` as a transferable value,
7
+ // `ShareLink`'s export of other items, and the drag-and-drop and clipboard
8
+ // modifiers that take `Transferable` payloads (docs/ops-protocol.md,
9
+ // "Sharing and media").
10
+
11
+ // MARK: - Image
12
+
13
+ extension Image: Transferable {
14
+ /// Exports the bytes of an image made from a file (`Image(uiImage:
15
+ /// UIImage(data:))`), in that file's type; a symbol, a catalog image, a
16
+ /// remote image or a Core Image result has no bytes in Swift and exports
17
+ /// nothing. Imports any image file the page can draw.
18
+ public static var transferRepresentation: _TransferRepresentationList<Image> {
19
+ return _TransferRepresentationList(nodes: [
20
+ _TransferNode(
21
+ exportType: .image, importType: .image,
22
+ exporter: { item, wanted in
23
+ guard let image = item as? Image, case .bitmap(let recipe, _, _) = image.source, recipe.steps.isEmpty,
24
+ let file = recipe.source?.encodedFile, let type = UTType(mimeType: file.mime, conformingTo: .image)
25
+ else { return nil }
26
+ if let wanted, !type.conforms(to: wanted) { return nil }
27
+ return _TransferContent(contentType: type, data: file.data)
28
+ },
29
+ importer: { content in
30
+ guard let uiImage = UIImage(data: try content.loadData()) else { return nil }
31
+ return Image(uiImage: uiImage)
32
+ }),
33
+ ])
34
+ }
35
+ }
36
+
37
+ extension _ImageSource {
38
+ /// The encoded file this source is (its bytes and MIME type); nil for a pixel buffer.
39
+ public var encodedFile: (data: Data, mime: String)? {
40
+ if case .encoded(let bytes, let mime) = payload { return (Data(bytes), mime) }
41
+ return nil
42
+ }
43
+ }
44
+
45
+ extension UIImage {
46
+ /// The file an image made with `UIImage(data:)` came from, unchanged
47
+ /// (its bytes and MIME type); nil for any other image. The pasteboard,
48
+ /// the photo library and item providers hand these bytes on as they are.
49
+ public var _encodedFile: (data: Data, mime: String)? {
50
+ guard case .bitmap(let recipe) = content, recipe.steps.isEmpty else { return nil }
51
+ return recipe.source?.encodedFile
52
+ }
53
+ }
54
+
55
+ extension _ImageRecipe {
56
+ /// The recipe as a `share` or `download` request carries it (`bitmaps`).
57
+ public var _json: _JSON { json }
58
+ }
59
+
60
+ extension UIImage {
61
+ /// The asset-catalog name of `UIImage(named:)`; nil for any other image.
62
+ public var _catalogName: String? {
63
+ if case .named(let name) = content { return name }
64
+ return nil
65
+ }
66
+ }
67
+
68
+ // MARK: - Sharing other items
69
+
70
+ /// A value the compiler cannot prove `Sendable` that stays on the browser's one thread.
71
+ struct _UncheckedSendableBox<Value>: @unchecked Sendable {
72
+ let value: Value
73
+ init(_ value: Value) { self.value = value }
74
+ }
75
+
76
+ /// `ShareLink` items other than `String`, `URL` and `Image`: each is
77
+ /// exported through its first exporting representation. A `String` or `URL`
78
+ /// proxy joins the text and link; bytes or a file join the `files` the page
79
+ /// shares (`{name, type, data}`, data in base64). An item that exports
80
+ /// nothing, or fails, is left out.
81
+ @MainActor
82
+ enum _ShareExport {
83
+ static func payload(_ base: _JSON, adding items: [any Transferable], title: String?) async -> _JSON {
84
+ guard case .object(var fields) = base else { return base }
85
+ var texts: [String] = []
86
+ if case .string(let text)? = fields["text"] { texts.append(text) }
87
+ var files: [_JSON] = []
88
+ for item in items {
89
+ guard let content = try? await _Transfer.export(item) else { continue }
90
+ switch content.value {
91
+ case let text as String:
92
+ texts.append(text)
93
+ continue
94
+ case let url as URL:
95
+ if fields["url"] == nil { fields["url"] = .string(url.absoluteString) } else { texts.append(url.absoluteString) }
96
+ continue
97
+ default:
98
+ break
99
+ }
100
+ guard let data = try? content.loadData() else { continue }
101
+ var named = content
102
+ if named.suggestedName == nil, named.file == nil { named.suggestedName = title }
103
+ files.append(.object([
104
+ "name": .string(named.fileName),
105
+ "type": .string(content.contentType.preferredMIMEType ?? "application/octet-stream"),
106
+ "data": .string(_base64([UInt8](data))),
107
+ ]))
108
+ }
109
+ if !texts.isEmpty { fields["text"] = .string(texts.joined(separator: "\n")) }
110
+ if !files.isEmpty { fields["files"] = .array(files) }
111
+ return .object(fields)
112
+ }
113
+ }
114
+
115
+ // MARK: - Drag and drop, copy and paste
116
+
117
+ // The page has no drag and drop between views or apps yet, and the clipboard
118
+ // takes text through `UIPasteboard` (UIKit). These modifiers accept their
119
+ // payloads and actions and leave the view as it is: nothing is dragged,
120
+ // nothing is dropped, and the actions are never called.
121
+
122
+ extension View {
123
+ /// Accepted; the view cannot be dragged in the browser.
124
+ public func draggable<T: Transferable>(_ payload: @autoclosure @escaping () -> T) -> some View { self }
125
+
126
+ /// Accepted; the view cannot be dragged in the browser.
127
+ public func draggable<T: Transferable, Preview: View>(_ payload: @autoclosure @escaping () -> T,
128
+ @ViewBuilder preview: () -> Preview) -> some View { self }
129
+
130
+ /// Accepted; nothing is dropped in the browser, so `action` is never called
131
+ /// and `isTargeted` never reports true.
132
+ public func dropDestination<T: Transferable>(for payloadType: T.Type = T.self,
133
+ action: @escaping ([T], CGPoint) -> Bool,
134
+ isTargeted: @escaping (Bool) -> Void = { _ in }) -> some View { self }
135
+
136
+ /// Accepted; the browser's copy command copies the page's selected text.
137
+ public func copyable<T: Transferable>(_ payload: @autoclosure @escaping () -> [T]) -> some View { self }
138
+
139
+ /// Accepted; the browser's cut command acts on the page's selected text.
140
+ public func cuttable<T: Transferable>(for payloadType: T.Type = T.self, action: @escaping () -> [T]) -> some View { self }
141
+
142
+ /// Accepted; the browser's paste command pastes text into a focused field.
143
+ public func pasteDestination<T: Transferable>(for payloadType: T.Type = T.self, action: @escaping ([T]) -> Void,
144
+ validator: @escaping ([T]) -> [T] = { $0 }) -> some View { self }
145
+ }
@@ -0,0 +1,66 @@
1
+ /// A rectangle with a radius of its own at each corner (iOS 16). The page's
2
+ /// shapes, clips and shape backgrounds have one corner radius, so it is drawn
3
+ /// with its largest radius at every corner (an approximation; a sheet-like
4
+ /// panel rounded on top only is rounded at the bottom too).
5
+ nonisolated public struct UnevenRoundedRectangle: Shape {
6
+ public var cornerRadii: RectangleCornerRadii
7
+ public var style: RoundedCornerStyle
8
+
9
+ public init(cornerRadii: RectangleCornerRadii, style: RoundedCornerStyle = .continuous) {
10
+ self.cornerRadii = cornerRadii
11
+ self.style = style
12
+ }
13
+
14
+ public init(topLeadingRadius: CGFloat = 0, bottomLeadingRadius: CGFloat = 0, bottomTrailingRadius: CGFloat = 0,
15
+ topTrailingRadius: CGFloat = 0, style: RoundedCornerStyle = .continuous) {
16
+ self.init(cornerRadii: RectangleCornerRadii(topLeading: topLeadingRadius, bottomLeading: bottomLeadingRadius,
17
+ bottomTrailing: bottomTrailingRadius, topTrailing: topTrailingRadius),
18
+ style: style)
19
+ }
20
+
21
+ public func path(in rect: CGRect) -> Path { Path(roundedRect: rect, cornerRadii: cornerRadii, style: style) }
22
+
23
+ public var _name: String { "roundedRectangle" }
24
+ public var _cornerRadius: CGFloat {
25
+ max(cornerRadii.topLeading, cornerRadii.bottomLeading, cornerRadii.bottomTrailing, cornerRadii.topTrailing)
26
+ }
27
+ }
28
+
29
+ /// The four corner radii of an `UnevenRoundedRectangle`.
30
+ public struct RectangleCornerRadii: Equatable, Sendable {
31
+ public var topLeading: CGFloat
32
+ public var bottomLeading: CGFloat
33
+ public var bottomTrailing: CGFloat
34
+ public var topTrailing: CGFloat
35
+
36
+ public init(topLeading: CGFloat = 0, bottomLeading: CGFloat = 0, bottomTrailing: CGFloat = 0, topTrailing: CGFloat = 0) {
37
+ self.topLeading = topLeading
38
+ self.bottomLeading = bottomLeading
39
+ self.bottomTrailing = bottomTrailing
40
+ self.topTrailing = topTrailing
41
+ }
42
+ }
43
+
44
+ extension Shape where Self == UnevenRoundedRectangle {
45
+ public static func rect(topLeadingRadius: CGFloat = 0, bottomLeadingRadius: CGFloat = 0, bottomTrailingRadius: CGFloat = 0,
46
+ topTrailingRadius: CGFloat = 0, style: RoundedCornerStyle = .continuous) -> UnevenRoundedRectangle {
47
+ UnevenRoundedRectangle(topLeadingRadius: topLeadingRadius, bottomLeadingRadius: bottomLeadingRadius,
48
+ bottomTrailingRadius: bottomTrailingRadius, topTrailingRadius: topTrailingRadius, style: style)
49
+ }
50
+
51
+ public static func rect(cornerRadii: RectangleCornerRadii, style: RoundedCornerStyle = .continuous) -> UnevenRoundedRectangle {
52
+ UnevenRoundedRectangle(cornerRadii: cornerRadii, style: style)
53
+ }
54
+ }
55
+
56
+ extension UnevenRoundedRectangle: View {
57
+ public typealias Body = Never
58
+ public var body: Never { fatalError("UnevenRoundedRectangle is a primitive view") }
59
+ }
60
+ extension UnevenRoundedRectangle: _PrimitiveView {}
61
+ extension UnevenRoundedRectangle: _HostView {
62
+ var _kind: String { "shape" }
63
+ func _props(in environment: EnvironmentValues) -> _JSON {
64
+ _ShapeView(shape: self, fill: nil, stroke: nil)._props(in: environment)
65
+ }
66
+ }