@swiftbrowser/swift 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +0 -4
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +105 -7
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +93 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +3 -2
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +67 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +80 -10
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +11 -2
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +164 -37
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +10 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +39 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -3,10 +3,39 @@
3
3
  /// docs/ops-protocol.md, "Phase 6 additions"): a `Color`'s own forms, or
4
4
  /// `{"hierarchical": 1...4}`, `{"linearGradient": {...}}`,
5
5
  /// `{"radialGradient": {...}}`, `{"colorGradient": color}`, `{"material": name}`.
6
+ ///
7
+ /// A style of an app's own (iOS 17) implements `resolve(in:)`, returning a
8
+ /// style it is made of; it is encoded as that style, resolved in the page's
9
+ /// environment (its color scheme, Dynamic Type size…): a change of those
10
+ /// renders every view again. An `.environment(_:_:)` of an ancestor is not
11
+ /// seen.
6
12
  public protocol ShapeStyle: Sendable {
13
+ associatedtype Resolved: ShapeStyle = Never
14
+ func resolve(in environment: EnvironmentValues) -> Resolved
7
15
  var _json: _JSON { get }
8
16
  }
9
17
 
18
+ extension ShapeStyle where Resolved == Never {
19
+ public func resolve(in environment: EnvironmentValues) -> Never {
20
+ fatalError("\(Self.self) is a built-in ShapeStyle; it has no resolved style")
21
+ }
22
+ }
23
+
24
+ extension ShapeStyle {
25
+ /// An app's own style: the style it resolves to in the page's environment.
26
+ public var _json: _JSON { resolve(in: EnvironmentValues._page)._json }
27
+ }
28
+
29
+ extension Never: ShapeStyle {
30
+ public var _json: _JSON { .null }
31
+ }
32
+
33
+ extension EnvironmentValues {
34
+ /// The environment the page sets (the runtime's base), which an app's
35
+ /// own `ShapeStyle` resolves in.
36
+ nonisolated(unsafe) static var _page = EnvironmentValues()
37
+ }
38
+
10
39
  extension Color: ShapeStyle {}
11
40
 
12
41
  // MARK: - Hierarchical (.primary ... .quaternary)
@@ -33,6 +62,38 @@ extension ShapeStyle where Self == HierarchicalShapeStyle {
33
62
  public static var quaternary: HierarchicalShapeStyle { .quaternary }
34
63
  }
35
64
 
65
+ /// iOS 17's fill style (`.fill`, `.fill.secondary`…): UIKit's system fill
66
+ /// colors, from `systemFill` to `quaternarySystemFill`.
67
+ public struct FillShapeStyle: ShapeStyle, Hashable {
68
+ let level: Int
69
+
70
+ public init() { level = 1 }
71
+ init(level: Int) { self.level = level }
72
+
73
+ public var secondary: FillShapeStyle { FillShapeStyle(level: 2) }
74
+ public var tertiary: FillShapeStyle { FillShapeStyle(level: 3) }
75
+ public var quaternary: FillShapeStyle { FillShapeStyle(level: 4) }
76
+
77
+ public var _json: _JSON {
78
+ let names = ["systemFill", "secondarySystemFill", "tertiarySystemFill", "quaternarySystemFill"]
79
+ return .object(["name": .string(names[max(0, min(3, level - 1))])])
80
+ }
81
+ }
82
+
83
+ extension ShapeStyle where Self == FillShapeStyle {
84
+ public static var fill: FillShapeStyle { FillShapeStyle() }
85
+ }
86
+
87
+ /// The separator color (`.separator`, iOS 17).
88
+ public struct SeparatorShapeStyle: ShapeStyle, Hashable {
89
+ public init() {}
90
+ public var _json: _JSON { .object(["name": .string("separator")]) }
91
+ }
92
+
93
+ extension ShapeStyle where Self == SeparatorShapeStyle {
94
+ public static var separator: SeparatorShapeStyle { SeparatorShapeStyle() }
95
+ }
96
+
36
97
  /// The view's background color (`.background` as a style).
37
98
  public struct BackgroundStyle: ShapeStyle, Hashable {
38
99
  public init() {}
@@ -99,11 +160,16 @@ public struct Gradient: Equatable, Sendable {
99
160
  }
100
161
  }
101
162
 
102
- var _json: _JSON {
163
+ var _stopsJSON: _JSON {
103
164
  .array(stops.map { .object(["color": $0.color._json, "location": .number($0.location)]) })
104
165
  }
105
166
  }
106
167
 
168
+ /// A gradient as a style paints from top to bottom, as SwiftUI draws it.
169
+ extension Gradient: ShapeStyle {
170
+ public var _json: _JSON { LinearGradient(gradient: self, startPoint: .top, endPoint: .bottom)._json }
171
+ }
172
+
107
173
  /// `Color.gradient`: a subtle vertical gradient derived from one color.
108
174
  public struct AnyGradient: ShapeStyle, Equatable {
109
175
  let color: Color
@@ -136,7 +202,7 @@ public struct LinearGradient: ShapeStyle, Equatable {
136
202
 
137
203
  public var _json: _JSON {
138
204
  .object(["linearGradient": .object([
139
- "stops": gradient._json,
205
+ "stops": gradient._stopsJSON,
140
206
  "start": startPoint._json,
141
207
  "end": endPoint._json,
142
208
  ])])
@@ -166,7 +232,7 @@ public struct RadialGradient: ShapeStyle, Equatable {
166
232
 
167
233
  public var _json: _JSON {
168
234
  .object(["radialGradient": .object([
169
- "stops": gradient._json,
235
+ "stops": gradient._stopsJSON,
170
236
  "center": center._json,
171
237
  "startRadius": .number(startRadius),
172
238
  "endRadius": .number(endRadius),
@@ -234,8 +300,9 @@ extension AnyGradient: _HostView {
234
300
 
235
301
  // MARK: - Shadows
236
302
 
237
- /// A shadow a style can carry (`.shadow(.drop(...))`). The renderer has no
238
- /// per-style shadows, so a shadowed style paints as its base style.
303
+ /// A shadow a style can carry (`.shadow(.drop(...))`). A drop shadow is the
304
+ /// style's `shadow` key, which a shape filled with the style draws (a CSS
305
+ /// `drop-shadow`); an inner shadow, and a shadow on text, are not drawn.
239
306
  public struct ShadowStyle: Equatable, Sendable {
240
307
  public enum Kind: Equatable, Sendable { case drop, inner }
241
308
 
@@ -257,9 +324,21 @@ public struct ShadowStyle: Equatable, Sendable {
257
324
  }
258
325
 
259
326
  extension ShapeStyle {
260
- /// Approximation: the shadow is dropped and the style paints as before.
327
+ /// The style with a shadow (see `ShadowStyle`).
261
328
  public func shadow(_ style: ShadowStyle) -> AnyShapeStyle {
262
- AnyShapeStyle(_json: _json)
329
+ guard style.kind == .drop, case .object(var object) = _json else { return AnyShapeStyle(_json: _json) }
330
+ object["shadow"] = .object([
331
+ "color": style.color._json, "radius": .number(style.radius), "x": .number(style.x), "y": .number(style.y),
332
+ ])
333
+ return AnyShapeStyle(_json: .object(object))
334
+ }
335
+ }
336
+
337
+ extension ShapeStyle where Self == AnyShapeStyle {
338
+ /// The foreground style with a shadow: a shape filled with it under a
339
+ /// view casts the view's shadow (`.background(.shadow(.drop(…)), in: shape)`).
340
+ public static func shadow(_ style: ShadowStyle) -> AnyShapeStyle {
341
+ ForegroundStyle().shadow(style)
263
342
  }
264
343
  }
265
344
 
@@ -274,6 +353,11 @@ public struct Material: ShapeStyle, Hashable {
274
353
  public static let thickMaterial = Material(name: "thick")
275
354
  public static let ultraThickMaterial = Material(name: "ultraThick")
276
355
  public static let bar = Material(name: "regular")
356
+ public static let ultraThin = Material(name: "ultraThin")
357
+ public static let thin = Material(name: "thin")
358
+ public static let regular = Material(name: "regular")
359
+ public static let thick = Material(name: "thick")
360
+ public static let ultraThick = Material(name: "ultraThick")
277
361
 
278
362
  public var _json: _JSON { .object(["material": .string(name)]) }
279
363
  }
@@ -297,6 +381,20 @@ public struct AnyShapeStyle: ShapeStyle {
297
381
  init(_json: _JSON) { self._json = _json }
298
382
  }
299
383
 
384
+ /// The lower levels of any style (iOS 17): the style at the opacities of
385
+ /// the secondary, tertiary and quaternary label colors.
386
+ extension ShapeStyle {
387
+ public var secondary: AnyShapeStyle { opacity(0.6) }
388
+ public var tertiary: AnyShapeStyle { opacity(0.3) }
389
+ public var quaternary: AnyShapeStyle { opacity(0.18) }
390
+ }
391
+
392
+ extension ShapeStyle {
393
+ /// The style blended with what is behind it. The page paints the style
394
+ /// as it is (a blend mode is the view's, `View.blendMode(_:)`).
395
+ public func blendMode(_ mode: BlendMode) -> AnyShapeStyle { AnyShapeStyle(self) }
396
+ }
397
+
300
398
  /// Opacity on any style: wraps the style's JSON with an `opacity` multiplier.
301
399
  extension ShapeStyle {
302
400
  public func opacity(_ opacity: Double) -> AnyShapeStyle {
@@ -0,0 +1,78 @@
1
+ /// `Shape.trim(from:to:)` and strokes with a `StrokeStyle`.
2
+ ///
3
+ /// A trimmed shape keeps the part of its outline between two fractions of
4
+ /// its path. The `shape` element carries `"trim": {"from": a, "to": b}` and the
5
+ /// page masks the shape's box with a conic gradient around its center, from
6
+ /// the 3 o'clock position clockwise, where SwiftUI's circle path starts. For a
7
+ /// circle (a progress ring) that is the exact trim; for other shapes it keeps
8
+ /// the same angles, not the same length of outline (an approximation). An
9
+ /// untrimmed shape's props are unchanged.
10
+ ///
11
+ /// `stroke(_:style:)` draws `lineWidth` like `stroke(_:lineWidth:)`. A
12
+ /// built-in shape's stroke is a CSS border, so its caps, joins and dashes
13
+ /// are not drawn; a custom shape's path is stroked with all of them.
14
+
15
+ /// A shape with a trim: what `_ShapeView` reads to send `trim`.
16
+ protocol _TrimmedShape {
17
+ var _trimFrom: CGFloat { get }
18
+ var _trimTo: CGFloat { get }
19
+ }
20
+
21
+ /// `shape.trim(from:to:)`: the part of the shape's outline between the fractions.
22
+ nonisolated public struct _TrimmedShapeView<Base: Shape>: Shape, _TrimmedShape {
23
+ public let base: Base
24
+ let from: CGFloat
25
+ let to: CGFloat
26
+
27
+ public var _name: String { base._name }
28
+ public var _cornerRadius: CGFloat { base._cornerRadius }
29
+ public func path(in rect: CGRect) -> Path { base.path(in: rect).trimmedPath(from: from, to: to) }
30
+ var _trimFrom: CGFloat { from }
31
+ var _trimTo: CGFloat { to }
32
+ }
33
+
34
+ extension _TrimmedShapeView: View {
35
+ public typealias Body = Never
36
+ public var body: Never { fatalError("A trimmed shape is a primitive view") }
37
+ }
38
+ extension _TrimmedShapeView: _PrimitiveView {}
39
+ extension _TrimmedShapeView: _HostView {
40
+ var _kind: String { "shape" }
41
+ func _props(in environment: EnvironmentValues) -> _JSON {
42
+ // As a bare shape: filled with the foreground (`fill: null`, no stroke).
43
+ _ShapeView(shape: self, fill: nil, stroke: nil)._props(in: environment)
44
+ }
45
+ }
46
+
47
+ nonisolated extension Shape {
48
+ /// The part of the outline between `startFraction` and `endFraction` (0…1).
49
+ public func trim(from startFraction: CGFloat = 0, to endFraction: CGFloat = 1) -> _TrimmedShapeView<Self> {
50
+ _TrimmedShapeView(base: self, from: max(0, min(1, startFraction)), to: max(0, min(1, endFraction)))
51
+ }
52
+
53
+ /// The outline in `content`, `style.lineWidth` wide (a custom shape's
54
+ /// caps, joins and dashes are drawn; a built-in shape's are not).
55
+ public func stroke<S: ShapeStyle>(_ content: S, style: StrokeStyle, antialiased: Bool = true) -> some View {
56
+ _ShapeView(shape: self, fill: nil, stroke: (content, style.lineWidth, false), strokeStyle: style)
57
+ }
58
+
59
+ /// The outline in the foreground style, `style.lineWidth` wide.
60
+ public func stroke(style: StrokeStyle) -> some View {
61
+ _ShapeView(shape: self, fill: nil, stroke: (ForegroundStyle(), style.lineWidth, false), strokeStyle: style)
62
+ }
63
+
64
+ /// The outline inside the shape's bounds, `style.lineWidth` wide.
65
+ public func strokeBorder<S: ShapeStyle>(_ content: S, style: StrokeStyle, antialiased: Bool = true) -> some View {
66
+ _ShapeView(shape: self, fill: nil, stroke: (content, style.lineWidth, true), strokeStyle: style)
67
+ }
68
+
69
+ /// The outline inside the shape's bounds in the foreground style.
70
+ public func strokeBorder(style: StrokeStyle, antialiased: Bool = true) -> some View {
71
+ _ShapeView(shape: self, fill: nil, stroke: (ForegroundStyle(), style.lineWidth, true), strokeStyle: style)
72
+ }
73
+ }
74
+
75
+ extension _TrimmedShape {
76
+ /// The `trim` prop.
77
+ var _trimJSON: _JSON { .object(["from": .number(_trimFrom), "to": .number(_trimTo)]) }
78
+ }
@@ -0,0 +1,193 @@
1
+ import Foundation
2
+
3
+ // `ShareLink`: a button that asks the page to share its items. The page uses
4
+ // the Web Share API (`navigator.share`) and, where the browser has none or
5
+ // refuses, downloads them instead: an image item as its file, text and links
6
+ // as a `.txt` (docs/ops-protocol.md, "Sharing"). The request is a `share`
7
+ // host request; its answer is ignored, as SwiftUI gives the app no result.
8
+
9
+ // `Transferable` is CoreTransferable's, which SwiftUI re-exports
10
+ // (Transfer.swift): `String` and `URL` items are shared as text and links,
11
+ // asset-catalog and `UIImage` `Image`s as files, and any other item as the
12
+ // bytes or the file its first exporting representation gives (a symbol
13
+ // image has no file to share).
14
+
15
+ /// The title (and image) a share sheet shows for the shared item.
16
+ public struct SharePreview<Image: Transferable, Icon: Transferable> {
17
+ let title: String
18
+ let image: Image?
19
+ let icon: Icon?
20
+
21
+ @_disfavoredOverload
22
+ public init<S: StringProtocol>(_ title: S, image: Image, icon: Icon) {
23
+ self.title = String(title); self.image = image; self.icon = icon
24
+ }
25
+
26
+ public init(_ titleKey: LocalizedStringKey, image: Image, icon: Icon) {
27
+ self.init(titleKey.key, image: image, icon: icon)
28
+ }
29
+ }
30
+
31
+ extension SharePreview where Image == Never, Icon == Never {
32
+ @_disfavoredOverload
33
+ public init<S: StringProtocol>(_ title: S) { self.title = String(title); self.image = nil; self.icon = nil }
34
+ public init(_ titleKey: LocalizedStringKey) { self.init(titleKey.key) }
35
+ }
36
+
37
+ extension SharePreview where Icon == Never {
38
+ @_disfavoredOverload
39
+ public init<S: StringProtocol>(_ title: S, image: Image) { self.title = String(title); self.image = image; self.icon = nil }
40
+ public init(_ titleKey: LocalizedStringKey, image: Image) { self.init(titleKey.key, image: image) }
41
+ }
42
+
43
+ extension SharePreview where Image == Never {
44
+ @_disfavoredOverload
45
+ public init<S: StringProtocol>(_ title: S, icon: Icon) { self.title = String(title); self.image = nil; self.icon = icon }
46
+ public init(_ titleKey: LocalizedStringKey, icon: Icon) { self.init(titleKey.key, icon: icon) }
47
+ }
48
+
49
+ /// The label of a `ShareLink` without one of its own.
50
+ public struct DefaultShareLinkLabel: View {
51
+ let title: String
52
+ public var body: some View {
53
+ Label(title, systemImage: "square.and.arrow.up")
54
+ }
55
+ }
56
+
57
+ public struct ShareLink<Data: RandomAccessCollection, PreviewImage: Transferable, PreviewIcon: Transferable, Label: View>: View
58
+ where Data.Element: Transferable {
59
+ let items: Data
60
+ let subject: Text?
61
+ let message: Text?
62
+ let previewTitle: String?
63
+ let label: Label
64
+
65
+ init(items: Data, subject: Text?, message: Text?, previewTitle: String?, label: Label) {
66
+ self.items = items
67
+ self.subject = subject
68
+ self.message = message
69
+ self.previewTitle = previewTitle
70
+ self.label = label
71
+ }
72
+
73
+ public var body: some View {
74
+ let params = sharePayload
75
+ let sources = bitmapSources
76
+ let others = _UncheckedSendableBox(transferItems)
77
+ let title = subject?.content ?? previewTitle
78
+ return Button {
79
+ for source in sources { _Runtime.shared._sendImageSource(source) }
80
+ Task { @MainActor in
81
+ // Other `Transferable` items export first (Transfer.swift);
82
+ // without them the request leaves within the tap.
83
+ let params = others.value.isEmpty ? params : await _ShareExport.payload(params, adding: others.value, title: title)
84
+ _ = try? await _Runtime.shared._hostRequest(kind: "share", params: params)
85
+ }
86
+ } label: {
87
+ label
88
+ }
89
+ }
90
+
91
+ /// The sources of the bitmap (`UIImage`) items, which the page needs
92
+ /// before it can draw them into files.
93
+ var bitmapSources: [_ImageSource] {
94
+ items.compactMap { item in
95
+ guard let image = item as? Image, case .bitmap(let recipe, _, _) = image.source else { return nil }
96
+ return recipe.source
97
+ }
98
+ }
99
+
100
+ /// The items that are not a `String`, a `URL` or an `Image`: they share
101
+ /// what their representations export (`_ShareExport`).
102
+ var transferItems: [any Transferable] {
103
+ items.compactMap { item in item is String || item is URL || item is Image ? nil : item }
104
+ }
105
+
106
+ /// `{title, text, url, images, bitmaps}`: the Web Share API's fields,
107
+ /// images as asset-catalog names the page resolves to their files,
108
+ /// bitmaps (`Image(uiImage:)`) as recipes the page draws into PNG files.
109
+ var sharePayload: _JSON {
110
+ var texts: [String] = []
111
+ var url: String?
112
+ var images: [_JSON] = []
113
+ var bitmaps: [_JSON] = []
114
+ if let message { texts.append(message.content) }
115
+ for item in items {
116
+ switch item {
117
+ case let string as String: texts.append(string)
118
+ case let link as URL: if url == nil { url = link.absoluteString } else { texts.append(link.absoluteString) }
119
+ case let image as Image:
120
+ if case .named(let name) = image.source { images.append(.string(name)) }
121
+ else if case .url(let link, _, _) = image.source, url == nil { url = link }
122
+ else if case .bitmap(let recipe, _, _) = image.source, recipe.source != nil { bitmaps.append(recipe.json) }
123
+ default: break
124
+ }
125
+ }
126
+ var fields: [String: _JSON] = [:]
127
+ if let title = subject?.content ?? previewTitle { fields["title"] = .string(title) }
128
+ if !texts.isEmpty { fields["text"] = .string(texts.joined(separator: "\n")) }
129
+ if let url { fields["url"] = .string(url) }
130
+ if !images.isEmpty { fields["images"] = .array(images) }
131
+ if !bitmaps.isEmpty { fields["bitmaps"] = .array(bitmaps) }
132
+ return .object(fields)
133
+ }
134
+ }
135
+
136
+ // MARK: One item
137
+
138
+ extension ShareLink {
139
+ public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil, @ViewBuilder label: () -> Label)
140
+ where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
141
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: label())
142
+ }
143
+
144
+ public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil,
145
+ preview: SharePreview<PreviewImage, PreviewIcon>, @ViewBuilder label: () -> Label)
146
+ where Data == CollectionOfOne<Item> {
147
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: preview.title, label: label())
148
+ }
149
+ }
150
+
151
+ extension ShareLink where Label == DefaultShareLinkLabel {
152
+ public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil)
153
+ where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
154
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: "Share"))
155
+ }
156
+
157
+ public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil,
158
+ preview: SharePreview<PreviewImage, PreviewIcon>)
159
+ where Data == CollectionOfOne<Item> {
160
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: preview.title, label: DefaultShareLinkLabel(title: "Share"))
161
+ }
162
+
163
+ public init<Item: Transferable>(_ titleKey: LocalizedStringKey, item: Item, subject: Text? = nil, message: Text? = nil)
164
+ where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
165
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: titleKey.key))
166
+ }
167
+
168
+ @_disfavoredOverload
169
+ public init<S: StringProtocol, Item: Transferable>(_ title: S, item: Item, subject: Text? = nil, message: Text? = nil)
170
+ where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
171
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: String(title)))
172
+ }
173
+
174
+ public init<Item: Transferable>(_ titleKey: LocalizedStringKey, item: Item, subject: Text? = nil, message: Text? = nil,
175
+ preview: SharePreview<PreviewImage, PreviewIcon>)
176
+ where Data == CollectionOfOne<Item> {
177
+ self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: preview.title, label: DefaultShareLinkLabel(title: titleKey.key))
178
+ }
179
+ }
180
+
181
+ // MARK: Several items
182
+
183
+ extension ShareLink where PreviewImage == Never, PreviewIcon == Never {
184
+ public init(items: Data, subject: Text? = nil, message: Text? = nil, @ViewBuilder label: () -> Label) {
185
+ self.init(items: items, subject: subject, message: message, previewTitle: nil, label: label())
186
+ }
187
+ }
188
+
189
+ extension ShareLink where PreviewImage == Never, PreviewIcon == Never, Label == DefaultShareLinkLabel {
190
+ public init(items: Data, subject: Text? = nil, message: Text? = nil) {
191
+ self.init(items: items, subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: "Share"))
192
+ }
193
+ }
@@ -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
+ }