@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,411 @@
1
+ /// `Stepper`, `Slider`, `DatePicker` and `TextEditor`: the `stepper`,
2
+ /// `slider`, `datepicker` and `texteditor` elements (docs/ops-protocol.md,
3
+ /// Phase 8). Each control's handler receives the event's `value`.
4
+
5
+ // MARK: - Stepper
6
+
7
+ /// Increments or decrements a value. Kind `stepper`, props `canIncrement` /
8
+ /// `canDecrement`; the child is the label (dropped by `labelsHidden`). A
9
+ /// `step` event with `1` / `-1` applies the step within the bounds.
10
+ import Foundation
11
+
12
+ public struct Stepper<Label: View> {
13
+ let label: Label
14
+ let increment: () -> Void
15
+ let decrement: () -> Void
16
+ let canIncrement: Bool
17
+ let canDecrement: Bool
18
+ let onEditingChanged: (Bool) -> Void
19
+
20
+ public init(@ViewBuilder label: () -> Label,
21
+ onIncrement: (() -> Void)?,
22
+ onDecrement: (() -> Void)?,
23
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
24
+ self.label = label()
25
+ increment = onIncrement ?? {}
26
+ decrement = onDecrement ?? {}
27
+ canIncrement = onIncrement != nil
28
+ canDecrement = onDecrement != nil
29
+ self.onEditingChanged = onEditingChanged
30
+ }
31
+
32
+ public init<V: Strideable>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride = 1,
33
+ @ViewBuilder label: () -> Label,
34
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
35
+ self.label = label()
36
+ increment = { value.wrappedValue = min(value.wrappedValue.advanced(by: step), bounds.upperBound) }
37
+ decrement = { value.wrappedValue = max(value.wrappedValue.advanced(by: -step), bounds.lowerBound) }
38
+ canIncrement = value.wrappedValue < bounds.upperBound
39
+ canDecrement = value.wrappedValue > bounds.lowerBound
40
+ self.onEditingChanged = onEditingChanged
41
+ }
42
+
43
+ public init<V: Strideable>(value: Binding<V>, step: V.Stride = 1,
44
+ @ViewBuilder label: () -> Label,
45
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
46
+ self.label = label()
47
+ increment = { value.wrappedValue = value.wrappedValue.advanced(by: step) }
48
+ decrement = { value.wrappedValue = value.wrappedValue.advanced(by: -step) }
49
+ canIncrement = true
50
+ canDecrement = true
51
+ self.onEditingChanged = onEditingChanged
52
+ }
53
+ }
54
+
55
+ extension Stepper where Label == Text {
56
+ @_disfavoredOverload
57
+ public init<S: StringProtocol>(_ title: S, onIncrement: (() -> Void)?, onDecrement: (() -> Void)?,
58
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
59
+ self.init(label: { Text(title) }, onIncrement: onIncrement, onDecrement: onDecrement,
60
+ onEditingChanged: onEditingChanged)
61
+ }
62
+
63
+ public init<S: StringProtocol, V: Strideable>(_ title: S, value: Binding<V>, in bounds: ClosedRange<V>,
64
+ step: V.Stride = 1,
65
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
66
+ self.init(value: value, in: bounds, step: step, label: { Text(title) }, onEditingChanged: onEditingChanged)
67
+ }
68
+
69
+ public init<S: StringProtocol, V: Strideable>(_ title: S, value: Binding<V>, step: V.Stride = 1,
70
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
71
+ self.init(value: value, step: step, label: { Text(title) }, onEditingChanged: onEditingChanged)
72
+ }
73
+
74
+ public init(_ titleKey: LocalizedStringKey, onIncrement: (() -> Void)?, onDecrement: (() -> Void)?,
75
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
76
+ self.init(label: { Text(titleKey) }, onIncrement: onIncrement, onDecrement: onDecrement,
77
+ onEditingChanged: onEditingChanged)
78
+ }
79
+
80
+ public init<V: Strideable>(_ titleKey: LocalizedStringKey, value: Binding<V>, in bounds: ClosedRange<V>,
81
+ step: V.Stride = 1, onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
82
+ self.init(value: value, in: bounds, step: step, label: { Text(titleKey) }, onEditingChanged: onEditingChanged)
83
+ }
84
+
85
+ public init<V: Strideable>(_ titleKey: LocalizedStringKey, value: Binding<V>, step: V.Stride = 1,
86
+ onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
87
+ self.init(value: value, step: step, label: { Text(titleKey) }, onEditingChanged: onEditingChanged)
88
+ }
89
+ }
90
+
91
+ extension Stepper: _PrimitiveView {}
92
+ extension Stepper: _HostView {
93
+ var _kind: String { "stepper" }
94
+ func _props(in environment: EnvironmentValues) -> _JSON {
95
+ .object(["canIncrement": .bool(canIncrement), "canDecrement": .bool(canDecrement)])
96
+ }
97
+ var _content: [any View] { Label.self is EmptyView.Type ? [] : [_GaugeLabel(label: label)] }
98
+ var _handler: ((_JSON) -> Void)? {
99
+ let increment = self.increment
100
+ let decrement = self.decrement
101
+ let canIncrement = self.canIncrement
102
+ let canDecrement = self.canDecrement
103
+ let onEditingChanged = self.onEditingChanged
104
+ return { payload in
105
+ guard case .number(let direction) = payload, direction != 0 else { return }
106
+ if direction > 0, !canIncrement { return }
107
+ if direction < 0, !canDecrement { return }
108
+ onEditingChanged(true)
109
+ direction > 0 ? increment() : decrement()
110
+ onEditingChanged(false)
111
+ }
112
+ }
113
+ }
114
+
115
+ // MARK: - Slider
116
+
117
+ /// Selects a value from a range. Kind `slider`, props `value`, `min`, `max`,
118
+ /// `step` (null when free) and `labels`, which names the children present in
119
+ /// order: `"label"`, `"min"` (minimumValueLabel), `"max"` (maximumValueLabel).
120
+ public struct Slider<Label: View, ValueLabel: View> {
121
+ let value: Double
122
+ let bounds: ClosedRange<Double>
123
+ let step: Double?
124
+ let set: (Double) -> Void
125
+ let label: Label
126
+ let minimumValueLabel: ValueLabel
127
+ let maximumValueLabel: ValueLabel
128
+ let onEditingChanged: (Bool) -> Void
129
+
130
+ init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride?,
131
+ label: Label, minimumValueLabel: ValueLabel, maximumValueLabel: ValueLabel,
132
+ onEditingChanged: @escaping (Bool) -> Void) where V.Stride: BinaryFloatingPoint {
133
+ self.value = Double(value.wrappedValue)
134
+ self.bounds = Double(bounds.lowerBound)...Double(bounds.upperBound)
135
+ self.step = step.map { Double($0) }
136
+ let range = bounds
137
+ set = { value.wrappedValue = min(max(V($0), range.lowerBound), range.upperBound) }
138
+ self.label = label
139
+ self.minimumValueLabel = minimumValueLabel
140
+ self.maximumValueLabel = maximumValueLabel
141
+ self.onEditingChanged = onEditingChanged
142
+ }
143
+
144
+ public init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride? = nil,
145
+ @ViewBuilder label: () -> Label,
146
+ @ViewBuilder minimumValueLabel: () -> ValueLabel,
147
+ @ViewBuilder maximumValueLabel: () -> ValueLabel,
148
+ onEditingChanged: @escaping (Bool) -> Void = { _ in })
149
+ where V.Stride: BinaryFloatingPoint {
150
+ self.init(value: value, in: bounds, step: step, label: label(),
151
+ minimumValueLabel: minimumValueLabel(), maximumValueLabel: maximumValueLabel(),
152
+ onEditingChanged: onEditingChanged)
153
+ }
154
+ }
155
+
156
+ extension Slider where ValueLabel == EmptyView {
157
+ public init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride? = nil,
158
+ @ViewBuilder label: () -> Label,
159
+ onEditingChanged: @escaping (Bool) -> Void = { _ in })
160
+ where V.Stride: BinaryFloatingPoint {
161
+ self.init(value: value, in: bounds, step: step, label: label(),
162
+ minimumValueLabel: EmptyView(), maximumValueLabel: EmptyView(),
163
+ onEditingChanged: onEditingChanged)
164
+ }
165
+ }
166
+
167
+ extension Slider where Label == EmptyView, ValueLabel == EmptyView {
168
+ public init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V> = 0...1, step: V.Stride? = nil,
169
+ onEditingChanged: @escaping (Bool) -> Void = { _ in })
170
+ where V.Stride: BinaryFloatingPoint {
171
+ self.init(value: value, in: bounds, step: step, label: EmptyView(),
172
+ minimumValueLabel: EmptyView(), maximumValueLabel: EmptyView(),
173
+ onEditingChanged: onEditingChanged)
174
+ }
175
+ }
176
+
177
+ extension Slider: _PrimitiveView {}
178
+ extension Slider: _HostView {
179
+ var _kind: String { "slider" }
180
+
181
+ private var hasValueLabels: Bool { !(ValueLabel.self is EmptyView.Type) }
182
+
183
+ func _props(in environment: EnvironmentValues) -> _JSON {
184
+ var labels: [_JSON] = []
185
+ if !(Label.self is EmptyView.Type), !environment.labelsHidden { labels.append(.string("label")) }
186
+ if hasValueLabels { labels += [.string("min"), .string("max")] }
187
+ return .object([
188
+ "value": .number(value),
189
+ "min": .number(bounds.lowerBound),
190
+ "max": .number(bounds.upperBound),
191
+ "step": step.map(_JSON.number) ?? .null,
192
+ "labels": .array(labels),
193
+ ])
194
+ }
195
+
196
+ var _content: [any View] {
197
+ var children: [any View] = []
198
+ if !(Label.self is EmptyView.Type) { children.append(_GaugeLabel(label: label)) }
199
+ if hasValueLabels { children += [minimumValueLabel, maximumValueLabel] }
200
+ return children
201
+ }
202
+
203
+ var _handler: ((_JSON) -> Void)? {
204
+ let set = self.set
205
+ let onEditingChanged = self.onEditingChanged
206
+ return { payload in
207
+ guard case .number(let value) = payload else { return }
208
+ onEditingChanged(true)
209
+ set(value)
210
+ onEditingChanged(false)
211
+ }
212
+ }
213
+ }
214
+
215
+ // MARK: - DatePicker
216
+
217
+ /// Which parts of a date a `DatePicker` shows.
218
+ public struct DatePickerComponents: OptionSet, Sendable {
219
+ public let rawValue: UInt
220
+ public init(rawValue: UInt) { self.rawValue = rawValue }
221
+ public static let hourAndMinute = DatePickerComponents(rawValue: 1 << 0)
222
+ public static let date = DatePickerComponents(rawValue: 1 << 1)
223
+
224
+ var _name: String {
225
+ if self == .date { return "date" }
226
+ if self == .hourAndMinute { return "hourAndMinute" }
227
+ return "dateAndTime"
228
+ }
229
+ }
230
+
231
+ /// Picks a date and/or time. Kind `datepicker`, props `seconds`, `components`,
232
+ /// `min`, `max`; the child is the label (dropped by `labelsHidden`). A `date`
233
+ /// event carries the new seconds since 1970.
234
+ public struct DatePicker<Label: View> {
235
+ let label: Label
236
+ let seconds: Double
237
+ let minimum: Double?
238
+ let maximum: Double?
239
+ let components: DatePickerComponents
240
+ let set: (Double) -> Void
241
+
242
+ init(selection: Binding<Date>, minimum: Double?, maximum: Double?,
243
+ displayedComponents: DatePickerComponents, label: Label) {
244
+ self.label = label
245
+ seconds = selection.wrappedValue.timeIntervalSince1970
246
+ self.minimum = minimum
247
+ self.maximum = maximum
248
+ components = displayedComponents
249
+ set = { value in
250
+ var clamped = value
251
+ if let minimum { clamped = max(clamped, minimum) }
252
+ if let maximum { clamped = min(clamped, maximum) }
253
+ selection.wrappedValue = Date(timeIntervalSince1970: clamped)
254
+ }
255
+ }
256
+
257
+ public init(selection: Binding<Date>,
258
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
259
+ @ViewBuilder label: () -> Label) {
260
+ self.init(selection: selection, minimum: nil, maximum: nil, displayedComponents: displayedComponents,
261
+ label: label())
262
+ }
263
+
264
+ public init(selection: Binding<Date>, in range: ClosedRange<Date>,
265
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
266
+ @ViewBuilder label: () -> Label) {
267
+ self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970,
268
+ maximum: range.upperBound.timeIntervalSince1970, displayedComponents: displayedComponents,
269
+ label: label())
270
+ }
271
+
272
+ public init(selection: Binding<Date>, in range: PartialRangeFrom<Date>,
273
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
274
+ @ViewBuilder label: () -> Label) {
275
+ self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970, maximum: nil,
276
+ displayedComponents: displayedComponents, label: label())
277
+ }
278
+
279
+ public init(selection: Binding<Date>, in range: PartialRangeThrough<Date>,
280
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
281
+ @ViewBuilder label: () -> Label) {
282
+ self.init(selection: selection, minimum: nil, maximum: range.upperBound.timeIntervalSince1970,
283
+ displayedComponents: displayedComponents, label: label())
284
+ }
285
+ }
286
+
287
+ extension DatePicker where Label == Text {
288
+ @_disfavoredOverload
289
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>,
290
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
291
+ self.init(selection: selection, displayedComponents: displayedComponents) { Text(title) }
292
+ }
293
+
294
+ @_disfavoredOverload
295
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: ClosedRange<Date>,
296
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
297
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
298
+ }
299
+
300
+ @_disfavoredOverload
301
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
302
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
303
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
304
+ }
305
+
306
+ @_disfavoredOverload
307
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
308
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
309
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
310
+ }
311
+
312
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>,
313
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
314
+ self.init(selection: selection, displayedComponents: displayedComponents) { Text(titleKey) }
315
+ }
316
+
317
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: ClosedRange<Date>,
318
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
319
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
320
+ }
321
+
322
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
323
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
324
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
325
+ }
326
+
327
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
328
+ displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
329
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
330
+ }
331
+ }
332
+
333
+ extension DatePicker: _PrimitiveView {}
334
+ extension DatePicker: _HostView {
335
+ var _kind: String { "datepicker" }
336
+ func _props(in environment: EnvironmentValues) -> _JSON {
337
+ .object([
338
+ "seconds": .number(seconds),
339
+ "components": .string(components._name),
340
+ "min": minimum.map(_JSON.number) ?? .null,
341
+ "max": maximum.map(_JSON.number) ?? .null,
342
+ ])
343
+ }
344
+ var _content: [any View] { Label.self is EmptyView.Type ? [] : [_GaugeLabel(label: label)] }
345
+ var _handler: ((_JSON) -> Void)? {
346
+ let set = self.set
347
+ return { payload in
348
+ if case .number(let seconds) = payload { set(seconds) }
349
+ }
350
+ }
351
+ }
352
+
353
+ /// `.datePickerStyle`: accepted for source compatibility; pickers are compact.
354
+ public protocol DatePickerStyle {}
355
+ public struct DefaultDatePickerStyle: DatePickerStyle { public init() {} }
356
+ public struct CompactDatePickerStyle: DatePickerStyle { public init() {} }
357
+ public struct GraphicalDatePickerStyle: DatePickerStyle { public init() {} }
358
+ public struct WheelDatePickerStyle: DatePickerStyle { public init() {} }
359
+ extension DatePickerStyle where Self == DefaultDatePickerStyle {
360
+ public static var automatic: DefaultDatePickerStyle { DefaultDatePickerStyle() }
361
+ }
362
+ extension DatePickerStyle where Self == CompactDatePickerStyle {
363
+ public static var compact: CompactDatePickerStyle { CompactDatePickerStyle() }
364
+ }
365
+ extension DatePickerStyle where Self == GraphicalDatePickerStyle {
366
+ public static var graphical: GraphicalDatePickerStyle { GraphicalDatePickerStyle() }
367
+ }
368
+ extension DatePickerStyle where Self == WheelDatePickerStyle {
369
+ public static var wheel: WheelDatePickerStyle { WheelDatePickerStyle() }
370
+ }
371
+
372
+ nonisolated extension View {
373
+ public func datePickerStyle<S: DatePickerStyle>(_ style: S) -> some View { self }
374
+ }
375
+
376
+ // MARK: - TextEditor
377
+
378
+ /// Multi-line editable text. Kind `texteditor`, props `text`; `text` events
379
+ /// set the binding, as for `textfield`. Inside `.focused(...)` (or UIKit's
380
+ /// `_focused`) it carries `focused` and handles `focus` events, as a field does.
381
+ public struct TextEditor {
382
+ let text: Binding<String>
383
+ public init(text: Binding<String>) { self.text = text }
384
+ }
385
+ extension TextEditor: _PrimitiveView {}
386
+ extension TextEditor: _HostView {
387
+ var _kind: String { "texteditor" }
388
+ func _props(in environment: EnvironmentValues) -> _JSON {
389
+ var props: [String: _JSON] = ["text": .string(text.wrappedValue)]
390
+ if let focus = environment._focus { props["focused"] = .bool(focus.isFocused()) }
391
+ return .object(props)
392
+ }
393
+ var _handler: ((_JSON) -> Void)? { _handler(in: EnvironmentValues()) }
394
+ }
395
+ extension TextEditor: _EnvironmentHandling {
396
+ /// Text (`"value"` as a string) and `focus` (`{type, value: Bool}`) events.
397
+ func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)? {
398
+ let text = self.text
399
+ let focus = environment._focus
400
+ return { payload in
401
+ switch payload {
402
+ case .string(let value):
403
+ text.wrappedValue = value
404
+ case .object(let fields):
405
+ if case .string("focus")? = fields["type"], case .bool(let focused)? = fields["value"] { focus?.setFocused(focused) }
406
+ default:
407
+ break
408
+ }
409
+ }
410
+ }
411
+ }
@@ -0,0 +1,130 @@
1
+ // `PhaseAnimator` and `.phaseAnimator` (iOS 17): the content goes through
2
+ // its phases one after another, each change animated with the animation the
3
+ // phase asks for. A task moves to the next phase once the previous change's
4
+ // animation has had its time (its duration and delay), as SwiftUI waits for
5
+ // it to finish. Without a trigger the phases cycle while the view is shown;
6
+ // with one, each change of the trigger runs through them once, back to the
7
+ // first.
8
+
9
+ public struct PhaseAnimator<Phase: Equatable, Content: View>: View {
10
+ let phases: [Phase]
11
+ let trigger: _PhaseTrigger?
12
+ let content: (Phase) -> Content
13
+ let animation: (Phase) -> Animation?
14
+
15
+ @State private var index = 0
16
+ @State private var runs = 0
17
+
18
+ /// Cycles through `phases` while the view is shown.
19
+ public init(_ phases: some Sequence<Phase>,
20
+ @ViewBuilder content: @escaping (Phase) -> Content,
21
+ animation: @escaping (Phase) -> Animation? = { _ in .default }) {
22
+ self.phases = Array(phases)
23
+ trigger = nil
24
+ self.content = content
25
+ self.animation = animation
26
+ }
27
+
28
+ /// Runs through `phases` once each time `trigger` changes.
29
+ public init(_ phases: some Sequence<Phase>, trigger: some Equatable,
30
+ @ViewBuilder content: @escaping (Phase) -> Content,
31
+ animation: @escaping (Phase) -> Animation? = { _ in .default }) {
32
+ self.phases = Array(phases)
33
+ self.trigger = _PhaseTrigger(trigger)
34
+ self.content = content
35
+ self.animation = animation
36
+ }
37
+
38
+ public var body: some View {
39
+ let phase = phases.isEmpty ? nil : phases[min(index, phases.count - 1)]
40
+ Group {
41
+ if let phase { content(phase) }
42
+ }
43
+ .onChange(of: trigger) { runs += 1 }
44
+ .task(id: runs) {
45
+ if trigger == nil {
46
+ await cycle()
47
+ } else if runs > 0 {
48
+ await runOnce()
49
+ }
50
+ }
51
+ }
52
+
53
+ /// Moves to the phase at `next`, animated, and waits for the animation.
54
+ @MainActor
55
+ private func advance(to next: Int) async -> Bool {
56
+ let animation = animation(phases[next])
57
+ withAnimation(animation) { index = next }
58
+ // The timeline's clock: virtual in tests, the executor's in headless runs.
59
+ await _TimelineClock.sleep(max(0.05, animation.map { $0._settlingTime } ?? 0.05))
60
+ return !Task.isCancelled
61
+ }
62
+
63
+ @MainActor
64
+ private func cycle() async {
65
+ guard phases.count > 1 else { return }
66
+ while !Task.isCancelled {
67
+ guard await advance(to: (index + 1) % phases.count) else { return }
68
+ }
69
+ }
70
+
71
+ @MainActor
72
+ private func runOnce() async {
73
+ guard phases.count > 1 else { return }
74
+ for next in Array(1..<phases.count) + [0] {
75
+ guard await advance(to: next) else { return }
76
+ }
77
+ }
78
+ }
79
+
80
+ /// A trigger compared by its value (`some Equatable`, not `Hashable`).
81
+ struct _PhaseTrigger: Equatable {
82
+ let value: Any
83
+ let equals: (Any) -> Bool
84
+
85
+ init<T: Equatable>(_ value: T) {
86
+ self.value = value
87
+ equals = { ($0 as? T) == value }
88
+ }
89
+
90
+ static func == (lhs: _PhaseTrigger, rhs: _PhaseTrigger) -> Bool { lhs.equals(rhs.value) }
91
+ }
92
+
93
+ extension Animation {
94
+ /// How long a change in this animation takes to settle: its delay and
95
+ /// duration, repeated as it repeats (a forever-repeating one: once).
96
+ var _settlingTime: Double {
97
+ let count = repeatForever ? 1 : Double(repeatCount ?? 1)
98
+ return delayBy + duration * count
99
+ }
100
+ }
101
+
102
+ nonisolated extension View {
103
+ /// The view goes through `phases` as `PhaseAnimator` does; `content`
104
+ /// changes the view for each phase.
105
+ @MainActor
106
+ public func phaseAnimator<Phase: Equatable>(
107
+ _ phases: some Sequence<Phase>,
108
+ @ViewBuilder content: @escaping (PlaceholderContentView<Self>, Phase) -> some View,
109
+ animation: @escaping (Phase) -> Animation? = { _ in .default }
110
+ ) -> some View {
111
+ PhaseAnimator(phases, content: { content(PlaceholderContentView(self), $0) }, animation: animation)
112
+ }
113
+
114
+ @MainActor
115
+ public func phaseAnimator<Phase: Equatable>(
116
+ _ phases: some Sequence<Phase>, trigger: some Equatable,
117
+ @ViewBuilder content: @escaping (PlaceholderContentView<Self>, Phase) -> some View,
118
+ animation: @escaping (Phase) -> Animation? = { _ in .default }
119
+ ) -> some View {
120
+ PhaseAnimator(phases, trigger: trigger, content: { content(PlaceholderContentView(self), $0) }, animation: animation)
121
+ }
122
+ }
123
+
124
+ /// The view a `.phaseAnimator` (or another modifier that hands its content
125
+ /// to a closure) changes: it draws that view.
126
+ public struct PlaceholderContentView<Value: View>: View {
127
+ let content: Value
128
+ init(_ content: Value) { self.content = content }
129
+ public var body: some View { content }
130
+ }