@swiftbrowser/swift 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +0 -4
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +68 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +125 -10
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +100 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +26 -10
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +71 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +88 -12
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +14 -4
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +168 -39
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +86 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +46 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +524 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +41 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -0,0 +1,199 @@
1
+ /// `VStackLayout`, `HStackLayout`, `ZStackLayout` and `AnyLayout` (iOS 16):
2
+ /// the stacks as `Layout` values, so that a view can switch its layout
3
+ /// (`let layout = isCompact ? AnyLayout(VStackLayout()) : AnyLayout(HStackLayout())`).
4
+ ///
5
+ /// Used as a container (`VStackLayout(spacing: 0) { … }`), a stack layout is
6
+ /// the stack itself: the same `vstack` / `hstack` / `zstack` element, laid out
7
+ /// by the page. `AnyLayout` does the same for a stack it wraps, and is a
8
+ /// custom `layout` element (Phase 6) for any other layout. Switching an
9
+ /// `AnyLayout` between kinds rebuilds its content (approximation: SwiftUI
10
+ /// keeps the children's state and animates them to their new places).
11
+ ///
12
+ /// Their `Layout` methods compute the stacks in Swift too, for a custom
13
+ /// layout that delegates to one: subviews get the proposal (a vertical
14
+ /// stack's height and a horizontal stack's width shared evenly), are placed
15
+ /// one after the other `spacing` apart (8 by default) and aligned across
16
+ /// the axis.
17
+
18
+ public struct VStackLayout: Layout {
19
+ public var alignment: HorizontalAlignment
20
+ public var spacing: CGFloat?
21
+
22
+ public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil) {
23
+ self.alignment = alignment
24
+ self.spacing = spacing
25
+ }
26
+
27
+ public static var layoutProperties: LayoutProperties {
28
+ var properties = LayoutProperties()
29
+ properties.stackOrientation = .vertical
30
+ return properties
31
+ }
32
+
33
+ public func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
34
+ let sizes = _stackSizes(subviews, proposal: proposal, vertical: true)
35
+ let gap = spacing ?? 8
36
+ return CGSize(width: sizes.map(\.width).max() ?? 0,
37
+ height: sizes.map(\.height).reduce(0, +) + gap * CGFloat(max(0, sizes.count - 1)))
38
+ }
39
+
40
+ public func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
41
+ let sizes = _stackSizes(subviews, proposal: proposal, vertical: true)
42
+ var y = bounds.minY
43
+ for (subview, size) in zip(subviews, sizes) {
44
+ let x: CGFloat = switch alignment.name {
45
+ case "leading": bounds.minX
46
+ case "trailing": bounds.maxX - size.width
47
+ default: bounds.midX - size.width / 2
48
+ }
49
+ subview.place(at: CGPoint(x: x, y: y), anchor: .topLeading, proposal: ProposedViewSize(size))
50
+ y += size.height + (spacing ?? 8)
51
+ }
52
+ }
53
+
54
+ /// The stack itself: a `VStack` of the content.
55
+ public func callAsFunction<V: View>(@ViewBuilder _ content: () -> V) -> some View {
56
+ VStack(alignment: alignment, spacing: spacing, content: content)
57
+ }
58
+ }
59
+
60
+ public struct HStackLayout: Layout {
61
+ public var alignment: VerticalAlignment
62
+ public var spacing: CGFloat?
63
+
64
+ public init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil) {
65
+ self.alignment = alignment
66
+ self.spacing = spacing
67
+ }
68
+
69
+ public static var layoutProperties: LayoutProperties {
70
+ var properties = LayoutProperties()
71
+ properties.stackOrientation = .horizontal
72
+ return properties
73
+ }
74
+
75
+ public func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
76
+ let sizes = _stackSizes(subviews, proposal: proposal, vertical: false)
77
+ let gap = spacing ?? 8
78
+ return CGSize(width: sizes.map(\.width).reduce(0, +) + gap * CGFloat(max(0, sizes.count - 1)),
79
+ height: sizes.map(\.height).max() ?? 0)
80
+ }
81
+
82
+ public func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
83
+ let sizes = _stackSizes(subviews, proposal: proposal, vertical: false)
84
+ var x = bounds.minX
85
+ for (subview, size) in zip(subviews, sizes) {
86
+ let y: CGFloat = switch alignment.name {
87
+ case "top": bounds.minY
88
+ case "bottom": bounds.maxY - size.height
89
+ default: bounds.midY - size.height / 2
90
+ }
91
+ subview.place(at: CGPoint(x: x, y: y), anchor: .topLeading, proposal: ProposedViewSize(size))
92
+ x += size.width + (spacing ?? 8)
93
+ }
94
+ }
95
+
96
+ /// The stack itself: an `HStack` of the content.
97
+ public func callAsFunction<V: View>(@ViewBuilder _ content: () -> V) -> some View {
98
+ HStack(alignment: alignment, spacing: spacing, content: content)
99
+ }
100
+ }
101
+
102
+ public struct ZStackLayout: Layout {
103
+ public var alignment: Alignment
104
+
105
+ public init(alignment: Alignment = .center) {
106
+ self.alignment = alignment
107
+ }
108
+
109
+ public func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
110
+ let sizes = subviews.map { $0.sizeThatFits(proposal) }
111
+ return CGSize(width: sizes.map(\.width).max() ?? 0, height: sizes.map(\.height).max() ?? 0)
112
+ }
113
+
114
+ public func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
115
+ for subview in subviews {
116
+ let size = subview.sizeThatFits(proposal)
117
+ let x: CGFloat = switch alignment.horizontal.name {
118
+ case "leading": bounds.minX
119
+ case "trailing": bounds.maxX - size.width
120
+ default: bounds.midX - size.width / 2
121
+ }
122
+ let y: CGFloat = switch alignment.vertical.name {
123
+ case "top": bounds.minY
124
+ case "bottom": bounds.maxY - size.height
125
+ default: bounds.midY - size.height / 2
126
+ }
127
+ subview.place(at: CGPoint(x: x, y: y), anchor: .topLeading, proposal: ProposedViewSize(size))
128
+ }
129
+ }
130
+
131
+ /// The stack itself: a `ZStack` of the content.
132
+ public func callAsFunction<V: View>(@ViewBuilder _ content: () -> V) -> some View {
133
+ ZStack(alignment: alignment, content: content)
134
+ }
135
+ }
136
+
137
+ /// Each subview's size along a stack: the proposal's length along the axis
138
+ /// shared evenly, the full proposal across it.
139
+ func _stackSizes(_ subviews: LayoutSubviews, proposal: ProposedViewSize, vertical: Bool) -> [CGSize] {
140
+ let count = CGFloat(max(1, subviews.count))
141
+ let share: ProposedViewSize = vertical
142
+ ? ProposedViewSize(width: proposal.width, height: proposal.height.map { $0 / count })
143
+ : ProposedViewSize(width: proposal.width.map { $0 / count }, height: proposal.height)
144
+ return subviews.map { $0.sizeThatFits(share) }
145
+ }
146
+
147
+ /// A layout chosen at run time.
148
+ public struct AnyLayout: Layout {
149
+ let base: any Layout
150
+
151
+ public init<L: Layout>(_ layout: L) {
152
+ if let any = layout as? AnyLayout { base = any.base } else { base = layout }
153
+ }
154
+
155
+ public typealias Cache = _AnyLayoutCache
156
+
157
+ public static var layoutProperties: LayoutProperties { LayoutProperties() }
158
+
159
+ public func makeCache(subviews: Subviews) -> Cache {
160
+ func make<L: Layout>(_ layout: L) -> Any { layout.makeCache(subviews: subviews) }
161
+ return _AnyLayoutCache(value: make(base))
162
+ }
163
+
164
+ public func updateCache(_ cache: inout Cache, subviews: Subviews) {
165
+ cache = makeCache(subviews: subviews)
166
+ }
167
+
168
+ public func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout Cache) -> CGSize {
169
+ func size<L: Layout>(_ layout: L) -> CGSize {
170
+ var typed = cache.value as! L.Cache
171
+ defer { cache.value = typed }
172
+ return layout.sizeThatFits(proposal: proposal, subviews: subviews, cache: &typed)
173
+ }
174
+ return size(base)
175
+ }
176
+
177
+ public func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout Cache) {
178
+ func place<L: Layout>(_ layout: L) {
179
+ var typed = cache.value as! L.Cache
180
+ layout.placeSubviews(in: bounds, proposal: proposal, subviews: subviews, cache: &typed)
181
+ cache.value = typed
182
+ }
183
+ place(base)
184
+ }
185
+
186
+ /// The wrapped stack's own element for a stack layout, else a `layout` element.
187
+ public func callAsFunction<V: View>(@ViewBuilder _ content: () -> V) -> some View {
188
+ let content = content()
189
+ if let stack = base as? VStackLayout { return AnyView(stack { content }) }
190
+ if let stack = base as? HStackLayout { return AnyView(stack { content }) }
191
+ if let stack = base as? ZStackLayout { return AnyView(stack { content }) }
192
+ return AnyView(_LayoutView(layout: self, content: content))
193
+ }
194
+ }
195
+
196
+ /// `AnyLayout`'s cache: the wrapped layout's.
197
+ public struct _AnyLayoutCache {
198
+ var value: Any
199
+ }
@@ -18,7 +18,7 @@ protocol _AnyStateBox: AnyObject {
18
18
  }
19
19
 
20
20
  /// Views expose their `State` properties to the runtime through this protocol.
21
- protocol _StateProperty {
21
+ protocol _StateProperty: _RuntimeProperty {
22
22
  var _box: any _AnyStateBox { get }
23
23
  }
24
24
 
@@ -101,10 +101,21 @@ extension State: _StateProperty {
101
101
  public struct Binding<Value>: DynamicProperty {
102
102
  let getter: () -> Value
103
103
  let setter: (Value) -> Void
104
+ /// What the binding points at, for a binding the runtime re-creates on
105
+ /// every pass (a node's edit mode); nil for every other binding, which
106
+ /// then never compares equal (see `_Sameness`).
107
+ let identity: _RuntimeKey?
104
108
 
105
109
  public init(get: @escaping () -> Value, set: @escaping (Value) -> Void) {
106
110
  getter = get
107
111
  setter = set
112
+ identity = nil
113
+ }
114
+
115
+ init(identity: _RuntimeKey, get: @escaping () -> Value, set: @escaping (Value) -> Void) {
116
+ getter = get
117
+ setter = set
118
+ self.identity = identity
108
119
  }
109
120
 
110
121
  public static func constant(_ value: Value) -> Binding<Value> {
@@ -118,6 +129,12 @@ public struct Binding<Value>: DynamicProperty {
118
129
 
119
130
  public var projectedValue: Binding<Value> { self }
120
131
 
132
+ /// The binding itself: what a `$name` closure parameter (`ForEach($items) { $item in … }`)
133
+ /// is made from. It must be declared in the type for the compiler to find it.
134
+ public init(projectedValue: Binding<Value>) {
135
+ self = projectedValue
136
+ }
137
+
121
138
  public subscript<Subject>(dynamicMember keyPath: WritableKeyPath<Value, Subject>) -> Binding<Subject> {
122
139
  Binding<Subject>(
123
140
  get: { self.wrappedValue[keyPath: keyPath] },
@@ -0,0 +1,121 @@
1
+ import Foundation
2
+
3
+ // Smaller SwiftUI API that Ice Cubes' status rows and composer use.
4
+
5
+ extension LocalizedStringKey.StringInterpolation {
6
+ /// `"Closes in \(date, style: .timer)"`: the date formatted as
7
+ /// `Text(date, style:)` formats it, when the text is made (TextDates.swift).
8
+ public mutating func appendInterpolation(_ date: Date, style: Text.DateStyle) {
9
+ _append(.string(Text._format(date, style: style, now: Date())), specifier: "%@")
10
+ }
11
+ }
12
+
13
+ extension AnyTransition {
14
+ /// Moves in from `edge` while fading in, and out toward the opposite edge
15
+ /// while fading out (iOS 16).
16
+ public static func push(from edge: Edge) -> AnyTransition {
17
+ let opposite: Edge = switch edge {
18
+ case .top: .bottom
19
+ case .bottom: .top
20
+ case .leading: .trailing
21
+ case .trailing: .leading
22
+ }
23
+ return .asymmetric(insertion: .move(edge: edge).combined(with: .opacity),
24
+ removal: .move(edge: opposite).combined(with: .opacity))
25
+ }
26
+ }
27
+
28
+ /// Space between toolbar items (iOS 26), which separates Liquid Glass
29
+ /// groups. The page lays a placement's items out in a row of its own, so the
30
+ /// spacer adds nothing.
31
+ nonisolated public struct ToolbarSpacer: ToolbarContent {
32
+ public init(_ sizing: SpacerSizing = .flexible, placement: ToolbarItemPlacement = .automatic) {}
33
+ nonisolated public var _toolbarItems: [any View] { [] }
34
+ }
35
+
36
+ /// How much room a `ToolbarSpacer` takes.
37
+ public struct SpacerSizing: Hashable, Sendable {
38
+ let name: String
39
+ public static let flexible = SpacerSizing(name: "flexible")
40
+ public static let fixed = SpacerSizing(name: "fixed")
41
+ }
42
+
43
+ nonisolated extension View {
44
+ /// Accepted: the actions are for assistive technologies the page does not bridge.
45
+ public func accessibilityActions<Content: View>(@ViewBuilder _ content: () -> Content) -> some View { self }
46
+ }
47
+
48
+ /// The view's tint as a style (`.foregroundStyle(.tint)`): the nearest
49
+ /// `.tint(_:)`, else the accent color, resolved by the page.
50
+ public struct TintShapeStyle: ShapeStyle, Hashable {
51
+ public init() {}
52
+ public var _json: _JSON { .object(["name": .string("tint")]) }
53
+ }
54
+
55
+ extension ShapeStyle where Self == TintShapeStyle {
56
+ public static var tint: TintShapeStyle { TintShapeStyle() }
57
+ }
58
+
59
+ private struct _DefaultMinListRowHeightKey: EnvironmentKey {
60
+ static var defaultValue: CGFloat { 44 }
61
+ }
62
+
63
+ private struct _DefaultMinListHeaderHeightKey: EnvironmentKey {
64
+ static var defaultValue: CGFloat? { nil }
65
+ }
66
+
67
+ extension EnvironmentValues {
68
+ /// A list row's minimum height, 44 by default: the page sizes a `List`'s
69
+ /// rows to their content, at least this (the list's `minRowHeight` prop).
70
+ public var defaultMinListRowHeight: CGFloat {
71
+ get { self[_DefaultMinListRowHeightKey.self] }
72
+ set { self[_DefaultMinListRowHeightKey.self] = newValue }
73
+ }
74
+
75
+ /// A list section header's minimum height; recorded.
76
+ public var defaultMinListHeaderHeight: CGFloat? {
77
+ get { self[_DefaultMinListHeaderHeightKey.self] }
78
+ set { self[_DefaultMinListHeaderHeightKey.self] = newValue }
79
+ }
80
+ }
81
+
82
+ extension GeometryProxy {
83
+ /// Zero: the page does not report the safe area to Swift.
84
+ public var safeAreaInsets: EdgeInsets { EdgeInsets() }
85
+ }
86
+
87
+ nonisolated extension View {
88
+ /// The navigation title from a localized key (the key's text: no string tables are loaded).
89
+ public func navigationTitle(_ titleKey: LocalizedStringKey) -> some View {
90
+ navigationTitle(Text(titleKey))
91
+ }
92
+ }
93
+
94
+ extension Font {
95
+ /// The same font: digits keep their proportional widths on the page.
96
+ public func monospacedDigit() -> Font { self }
97
+ }
98
+
99
+ nonisolated extension View {
100
+ /// The sheet's detents with the one `selection` names first, so the page
101
+ /// presents the sheet at it (the page reports no resizing: the binding
102
+ /// changes only when the app sets it).
103
+ public func presentationDetents(_ detents: Set<PresentationDetent>, selection: Binding<PresentationDetent>) -> some View {
104
+ let sorted = detents.sorted { ($0._order, $0.name) < ($1._order, $1.name) }
105
+ let selected = selection.wrappedValue
106
+ let ordered = sorted.contains(selected) ? [selected] + sorted.filter { $0 != selected } : sorted
107
+ return _DetentsView(content: self, detents: ordered.map(\.name))
108
+ }
109
+ }
110
+
111
+ extension SearchFieldPlacement {
112
+ /// When the navigation bar's search field shows.
113
+ public enum NavigationBarDrawerDisplayMode: Hashable, Sendable {
114
+ case automatic, always
115
+ }
116
+
117
+ /// The search field in the navigation bar's drawer; the page always shows it there.
118
+ public static func navigationBarDrawer(displayMode: NavigationBarDrawerDisplayMode) -> SearchFieldPlacement {
119
+ .navigationBarDrawer
120
+ }
121
+ }
@@ -0,0 +1,203 @@
1
+ // SF Symbols' effects (the Symbols framework's types, which SwiftUI
2
+ // re-exports on iOS, as here) and the modifiers that apply them:
3
+ // `.symbolEffect(.pulse, isActive:)`, `.symbolEffect(.bounce, value:)`,
4
+ // `.contentTransition(.symbolEffect(.replace))`. An effect keeps the options
5
+ // it was built with. The page draws a symbol as a still glyph, with no
6
+ // layers to animate, so the modifiers return the view unchanged: the symbol
7
+ // shows, without the bounce, pulse or replacement animation.
8
+ //
9
+ // The Symbols module (Sources/Symbols) re-exports these types for files that
10
+ // `import Symbols`.
11
+
12
+ // MARK: - Effect kinds
13
+
14
+ /// A symbol effect: its options, kept.
15
+ public protocol SymbolEffect: Hashable, Sendable {}
16
+ /// Plays once each time a value changes (`.symbolEffect(_:value:)`).
17
+ public protocol DiscreteSymbolEffect: SymbolEffect {}
18
+ /// Plays while active (`.symbolEffect(_:isActive:)`).
19
+ public protocol IndefiniteSymbolEffect: SymbolEffect {}
20
+ /// Shows or hides a symbol.
21
+ public protocol TransitionSymbolEffect: SymbolEffect {}
22
+ /// Replaces one symbol with another (`.contentTransition(.symbolEffect(…))`).
23
+ public protocol ContentTransitionSymbolEffect: SymbolEffect {}
24
+
25
+ /// How the effects below are built: a list of option names.
26
+ public protocol _SymbolEffectOptions {
27
+ var _options: [String] { get }
28
+ init(_options: [String])
29
+ }
30
+
31
+ extension _SymbolEffectOptions {
32
+ func adding(_ option: String) -> Self { Self(_options: _options + [option]) }
33
+ public var byLayer: Self { adding("byLayer") }
34
+ public var wholeSymbol: Self { adding("wholeSymbol") }
35
+ }
36
+
37
+ public struct BounceSymbolEffect: DiscreteSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
38
+ public let _options: [String]
39
+ public init(_options: [String]) { self._options = _options }
40
+ public var up: Self { adding("up") }
41
+ public var down: Self { adding("down") }
42
+ }
43
+
44
+ public struct PulseSymbolEffect: DiscreteSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
45
+ public let _options: [String]
46
+ public init(_options: [String]) { self._options = _options }
47
+ }
48
+
49
+ public struct VariableColorSymbolEffect: DiscreteSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
50
+ public let _options: [String]
51
+ public init(_options: [String]) { self._options = _options }
52
+ public var iterative: Self { adding("iterative") }
53
+ public var cumulative: Self { adding("cumulative") }
54
+ public var reversing: Self { adding("reversing") }
55
+ public var nonReversing: Self { adding("nonReversing") }
56
+ public var hideInactiveLayers: Self { adding("hideInactiveLayers") }
57
+ public var dimInactiveLayers: Self { adding("dimInactiveLayers") }
58
+ }
59
+
60
+ public struct ScaleSymbolEffect: IndefiniteSymbolEffect, _SymbolEffectOptions {
61
+ public let _options: [String]
62
+ public init(_options: [String]) { self._options = _options }
63
+ public var up: Self { adding("up") }
64
+ public var down: Self { adding("down") }
65
+ }
66
+
67
+ public struct AppearSymbolEffect: TransitionSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
68
+ public let _options: [String]
69
+ public init(_options: [String]) { self._options = _options }
70
+ public var up: Self { adding("up") }
71
+ public var down: Self { adding("down") }
72
+ }
73
+
74
+ public struct DisappearSymbolEffect: TransitionSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
75
+ public let _options: [String]
76
+ public init(_options: [String]) { self._options = _options }
77
+ public var up: Self { adding("up") }
78
+ public var down: Self { adding("down") }
79
+ }
80
+
81
+ public struct ReplaceSymbolEffect: ContentTransitionSymbolEffect, _SymbolEffectOptions {
82
+ public let _options: [String]
83
+ public init(_options: [String]) { self._options = _options }
84
+ public var downUp: Self { adding("downUp") }
85
+ public var upUp: Self { adding("upUp") }
86
+ public var offUp: Self { adding("offUp") }
87
+ public func magic(fallback: ReplaceSymbolEffect) -> Self { adding("magic") }
88
+ }
89
+
90
+ public struct AutomaticSymbolEffect: ContentTransitionSymbolEffect, TransitionSymbolEffect, _SymbolEffectOptions {
91
+ public let _options: [String]
92
+ public init(_options: [String]) { self._options = _options }
93
+ }
94
+
95
+ public struct BreatheSymbolEffect: DiscreteSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
96
+ public let _options: [String]
97
+ public init(_options: [String]) { self._options = _options }
98
+ public var plain: Self { adding("plain") }
99
+ public var pulse: Self { adding("pulse") }
100
+ }
101
+
102
+ public struct RotateSymbolEffect: DiscreteSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
103
+ public let _options: [String]
104
+ public init(_options: [String]) { self._options = _options }
105
+ public var clockwise: Self { adding("clockwise") }
106
+ public var counterClockwise: Self { adding("counterClockwise") }
107
+ }
108
+
109
+ public struct WiggleSymbolEffect: DiscreteSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
110
+ public let _options: [String]
111
+ public init(_options: [String]) { self._options = _options }
112
+ public var up: Self { adding("up") }
113
+ public var down: Self { adding("down") }
114
+ public var left: Self { adding("left") }
115
+ public var right: Self { adding("right") }
116
+ public var forward: Self { adding("forward") }
117
+ public var backward: Self { adding("backward") }
118
+ public var clockwise: Self { adding("clockwise") }
119
+ public var counterClockwise: Self { adding("counterClockwise") }
120
+ public static func custom(angle: Angle) -> Self { Self(_options: ["custom"]) }
121
+ public func custom(angle: Angle) -> Self { adding("custom") }
122
+ }
123
+
124
+ public struct DrawOnSymbolEffect: TransitionSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
125
+ public let _options: [String]
126
+ public init(_options: [String]) { self._options = _options }
127
+ public var individually: Self { adding("individually") }
128
+ }
129
+
130
+ public struct DrawOffSymbolEffect: TransitionSymbolEffect, IndefiniteSymbolEffect, _SymbolEffectOptions {
131
+ public let _options: [String]
132
+ public init(_options: [String]) { self._options = _options }
133
+ public var individually: Self { adding("individually") }
134
+ }
135
+
136
+ extension SymbolEffect where Self == BounceSymbolEffect { public static var bounce: BounceSymbolEffect { .init(_options: []) } }
137
+ extension SymbolEffect where Self == PulseSymbolEffect { public static var pulse: PulseSymbolEffect { .init(_options: []) } }
138
+ extension SymbolEffect where Self == VariableColorSymbolEffect { public static var variableColor: VariableColorSymbolEffect { .init(_options: []) } }
139
+ extension SymbolEffect where Self == ScaleSymbolEffect { public static var scale: ScaleSymbolEffect { .init(_options: []) } }
140
+ extension SymbolEffect where Self == AppearSymbolEffect { public static var appear: AppearSymbolEffect { .init(_options: []) } }
141
+ extension SymbolEffect where Self == DisappearSymbolEffect { public static var disappear: DisappearSymbolEffect { .init(_options: []) } }
142
+ extension SymbolEffect where Self == ReplaceSymbolEffect { public static var replace: ReplaceSymbolEffect { .init(_options: []) } }
143
+ extension SymbolEffect where Self == AutomaticSymbolEffect { public static var automatic: AutomaticSymbolEffect { .init(_options: []) } }
144
+ extension SymbolEffect where Self == BreatheSymbolEffect { public static var breathe: BreatheSymbolEffect { .init(_options: []) } }
145
+ extension SymbolEffect where Self == RotateSymbolEffect { public static var rotate: RotateSymbolEffect { .init(_options: []) } }
146
+ extension SymbolEffect where Self == WiggleSymbolEffect { public static var wiggle: WiggleSymbolEffect { .init(_options: []) } }
147
+ extension SymbolEffect where Self == DrawOnSymbolEffect { public static var drawOn: DrawOnSymbolEffect { .init(_options: []) } }
148
+ extension SymbolEffect where Self == DrawOffSymbolEffect { public static var drawOff: DrawOffSymbolEffect { .init(_options: []) } }
149
+
150
+ /// How an effect plays: repeats and speed, kept.
151
+ public struct SymbolEffectOptions: Hashable, Sendable {
152
+ public var repeatCount: Int?
153
+ public var isRepeating: Bool?
154
+ public var speed: Double = 1
155
+
156
+ public struct RepeatBehavior: Hashable, Sendable {
157
+ let count: Int?
158
+ public static let continuous = RepeatBehavior(count: nil)
159
+ public static func periodic(_ count: Int? = nil, delay: Double? = nil) -> RepeatBehavior { RepeatBehavior(count: count) }
160
+ }
161
+
162
+ public static let `default` = SymbolEffectOptions()
163
+ public static var repeating: SymbolEffectOptions { SymbolEffectOptions(isRepeating: true) }
164
+ public static var nonRepeating: SymbolEffectOptions { SymbolEffectOptions(isRepeating: false) }
165
+ public static func `repeat`(_ count: Int) -> SymbolEffectOptions { SymbolEffectOptions(repeatCount: count) }
166
+ public static func `repeat`(_ behavior: RepeatBehavior) -> SymbolEffectOptions { SymbolEffectOptions(isRepeating: true) }
167
+ public static func speed(_ speed: Double) -> SymbolEffectOptions { SymbolEffectOptions(speed: speed) }
168
+
169
+ public var repeating: SymbolEffectOptions { var copy = self; copy.isRepeating = true; return copy }
170
+ public var nonRepeating: SymbolEffectOptions { var copy = self; copy.isRepeating = false; return copy }
171
+ public func `repeat`(_ count: Int) -> SymbolEffectOptions { var copy = self; copy.repeatCount = count; return copy }
172
+ public func `repeat`(_ behavior: RepeatBehavior) -> SymbolEffectOptions { var copy = self; copy.isRepeating = true; return copy }
173
+ public func speed(_ speed: Double) -> SymbolEffectOptions { var copy = self; copy.speed = speed; return copy }
174
+ }
175
+
176
+ // MARK: - Modifiers
177
+
178
+ nonisolated extension View {
179
+ /// The view unchanged: the page does not animate symbols.
180
+ public func symbolEffect<T: IndefiniteSymbolEffect>(_ effect: T, options: SymbolEffectOptions = .default, isActive: Bool = true) -> some View { self }
181
+
182
+ /// The view unchanged: the page does not animate symbols.
183
+ public func symbolEffect<T: DiscreteSymbolEffect, U: Equatable>(_ effect: T, options: SymbolEffectOptions = .default, value: U) -> some View { self }
184
+
185
+ public func symbolEffectsRemoved(_ isEnabled: Bool = true) -> some View { self }
186
+ }
187
+
188
+ extension ContentTransition {
189
+ /// A symbol replacement; the page swaps the symbol without animating it.
190
+ public static var symbolEffect: ContentTransition { ContentTransition(name: "symbolEffect") }
191
+ public static func symbolEffect<T: ContentTransitionSymbolEffect>(_ effect: T, options: SymbolEffectOptions = .default) -> ContentTransition {
192
+ ContentTransition(name: "symbolEffect")
193
+ }
194
+ /// Digits that roll to `value`; the page shows the new text without rolling.
195
+ public static func numericText(value: Double) -> ContentTransition { ContentTransition(name: "numericText") }
196
+ }
197
+
198
+ extension Image {
199
+ /// The symbol; the page draws variable symbols fully filled, whatever the value.
200
+ public init(systemName: String, variableValue: Double?) {
201
+ self.init(systemName: systemName)
202
+ }
203
+ }