@swiftbrowser/swift 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,130 @@
1
+ /// `GroupBox`, `ControlGroup` and `ImageRenderer`.
2
+ ///
3
+ /// - `GroupBox` is drawn as iOS draws its default style: the label in the
4
+ /// headline font above the content, 8 points apart, inside 16 points of
5
+ /// padding on a secondary-system-background rounded rectangle (radius 8).
6
+ /// `.groupBoxStyle` is accepted; every box uses that look.
7
+ /// - `ControlGroup` groups related controls. On iOS a menu shows them as a
8
+ /// row of compact buttons; here its content is a group: in a menu or a
9
+ /// context menu each control is an item of its own, elsewhere they flow in
10
+ /// the enclosing stack. Its label is not drawn.
11
+ /// - `ImageRenderer` would rasterize a view. Only the page draws views, so
12
+ /// `cgImage` and `uiImage` are nil (a share-as-image feature has nothing
13
+ /// to share); its settings are kept.
14
+
15
+ // MARK: - GroupBox
16
+
17
+ public struct GroupBox<Label: View, Content: View>: View {
18
+ let label: Label
19
+ let content: Content
20
+
21
+ public init(@ViewBuilder content: () -> Content, @ViewBuilder label: () -> Label) {
22
+ self.content = content()
23
+ self.label = label()
24
+ }
25
+
26
+ public init(label: Label, @ViewBuilder content: () -> Content) {
27
+ self.label = label
28
+ self.content = content()
29
+ }
30
+
31
+ public var body: some View {
32
+ VStack(alignment: .leading, spacing: 8) {
33
+ label.font(.headline)
34
+ content
35
+ }
36
+ .padding(16)
37
+ .background(Color(semantic: "secondarySystemBackground"), in: RoundedRectangle(cornerRadius: 8))
38
+ }
39
+ }
40
+
41
+ extension GroupBox where Label == EmptyView {
42
+ public init(@ViewBuilder content: () -> Content) {
43
+ self.init(label: EmptyView(), content: content)
44
+ }
45
+ }
46
+
47
+ extension GroupBox where Label == Text {
48
+ public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
49
+ self.init(label: Text(titleKey), content: content)
50
+ }
51
+
52
+ @_disfavoredOverload
53
+ public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
54
+ self.init(label: Text(title), content: content)
55
+ }
56
+ }
57
+
58
+ /// A group box's look; accepted (see the file comment).
59
+ public protocol GroupBoxStyle {}
60
+ public struct DefaultGroupBoxStyle: GroupBoxStyle { public init() {} }
61
+ extension GroupBoxStyle where Self == DefaultGroupBoxStyle {
62
+ public static var automatic: DefaultGroupBoxStyle { DefaultGroupBoxStyle() }
63
+ }
64
+
65
+ nonisolated extension View {
66
+ public func groupBoxStyle<S: GroupBoxStyle>(_ style: S) -> some View { self }
67
+ }
68
+
69
+ // MARK: - ControlGroup
70
+
71
+ public struct ControlGroup<Content: View> {
72
+ let content: Content
73
+
74
+ public init(@ViewBuilder content: () -> Content) {
75
+ self.content = content()
76
+ }
77
+
78
+ /// The label (shown by a collapsed group on iOS) is not drawn.
79
+ public init<L: View>(@ViewBuilder content: () -> Content, @ViewBuilder label: () -> L) {
80
+ self.content = content()
81
+ }
82
+
83
+ public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
84
+ self.content = content()
85
+ }
86
+
87
+ @_disfavoredOverload
88
+ public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
89
+ self.content = content()
90
+ }
91
+
92
+ public init(_ titleKey: LocalizedStringKey, systemImage: String, @ViewBuilder content: () -> Content) {
93
+ self.content = content()
94
+ }
95
+
96
+ @_disfavoredOverload
97
+ public init<S: StringProtocol>(_ title: S, systemImage: String, @ViewBuilder content: () -> Content) {
98
+ self.content = content()
99
+ }
100
+ }
101
+
102
+ extension ControlGroup: View {
103
+ public typealias Body = Never
104
+ public var body: Never { fatalError("ControlGroup is a primitive view") }
105
+ }
106
+ extension ControlGroup: _PrimitiveView {}
107
+ extension ControlGroup: _GroupView {
108
+ var _children: [any View] { [content] }
109
+ }
110
+
111
+ // MARK: - ImageRenderer
112
+
113
+ /// Renders a view to an image: never, in the browser (see the file comment).
114
+ @MainActor
115
+ public final class ImageRenderer<Content: View>: ObservableObject {
116
+ public var content: Content
117
+ public var label: String?
118
+ public var proposedSize = ProposedViewSize.unspecified
119
+ public var scale: CGFloat = 1
120
+ public var isOpaque = false
121
+
122
+ public init(content: Content) {
123
+ self.content = content
124
+ }
125
+
126
+ /// Nil: only the page draws views.
127
+ public var cgImage: CGImage? { nil }
128
+ /// Nil: only the page draws views.
129
+ public var uiImage: UIImage? { nil }
130
+ }
@@ -0,0 +1,54 @@
1
+ // Focus and key presses for views that are not text fields: `.focusable()`,
2
+ // `.focusEffectDisabled()` and `.onKeyPress`. They serve a hardware
3
+ // keyboard on an iPad or a Mac. The page shows an iPhone and sends the app
4
+ // no key events outside text inputs, so, like the pointer modifiers
5
+ // (PointerAndKeyboard.swift), these are accepted and do nothing: a key-press
6
+ // action is never called (Ice Cubes' media viewer pages with its swipes
7
+ // instead of the arrow keys).
8
+
9
+ /// A key press a view handles.
10
+ public struct KeyPress: Sendable {
11
+ /// Whether the press was dealt with; an ignored one goes to the parent.
12
+ public enum Result: Sendable, Hashable { case handled, ignored }
13
+
14
+ /// The phases of a press an action hears.
15
+ public struct Phases: OptionSet, Hashable, Sendable {
16
+ public let rawValue: Int
17
+ public init(rawValue: Int) { self.rawValue = rawValue }
18
+ public static let down = Phases(rawValue: 1 << 0)
19
+ public static let `repeat` = Phases(rawValue: 1 << 1)
20
+ public static let up = Phases(rawValue: 1 << 2)
21
+ public static let all: Phases = [.down, .repeat, .up]
22
+ }
23
+
24
+ public let phase: Phases
25
+ public let key: KeyEquivalent
26
+ public let characters: String
27
+ public let modifiers: EventModifiers
28
+ }
29
+
30
+ /// How a focusable view is used.
31
+ public struct FocusInteractions: OptionSet, Hashable, Sendable {
32
+ public let rawValue: Int
33
+ public init(rawValue: Int) { self.rawValue = rawValue }
34
+ public static let activate = FocusInteractions(rawValue: 1 << 0)
35
+ public static let edit = FocusInteractions(rawValue: 1 << 1)
36
+ public static let automatic: FocusInteractions = [.activate, .edit]
37
+ }
38
+
39
+ nonisolated extension View {
40
+ /// Accepted: the view takes no keyboard focus on the page.
41
+ public func focusable(_ isFocusable: Bool = true) -> some View { self }
42
+ public func focusable(_ isFocusable: Bool = true, interactions: FocusInteractions) -> some View { self }
43
+ /// Accepted: the page draws no focus ring for such views.
44
+ public func focusEffectDisabled(_ disabled: Bool = true) -> some View { self }
45
+
46
+ /// Accepted; the action is never called (no key events reach the app).
47
+ public func onKeyPress(_ key: KeyEquivalent, action: @escaping () -> KeyPress.Result) -> some View { self }
48
+ public func onKeyPress(_ key: KeyEquivalent, phases: KeyPress.Phases,
49
+ action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
50
+ public func onKeyPress(keys: Set<KeyEquivalent>, phases: KeyPress.Phases = [.down, .repeat],
51
+ action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
52
+ public func onKeyPress(phases: KeyPress.Phases = [.down, .repeat],
53
+ action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
54
+ }
@@ -0,0 +1,124 @@
1
+ /// `LabelStyle`: how a `Label` arranges its title and icon. `Label.body`
2
+ /// consults the environment's style (set by `.labelStyle`).
3
+ public protocol LabelStyle {
4
+ associatedtype Body: View
5
+ typealias Configuration = LabelStyleConfiguration
6
+ @ViewBuilder @MainActor func makeBody(configuration: Configuration) -> Body
7
+ }
8
+
9
+ public struct LabelStyleConfiguration {
10
+ public struct Title: View {
11
+ let view: any View
12
+ public var body: some View { AnyView(view) }
13
+ }
14
+
15
+ public struct Icon: View {
16
+ let view: any View
17
+ public var body: some View { AnyView(view) }
18
+ }
19
+
20
+ public let title: Title
21
+ public let icon: Icon
22
+ }
23
+
24
+ public struct DefaultLabelStyle: LabelStyle {
25
+ public init() {}
26
+ public func makeBody(configuration: Configuration) -> some View {
27
+ HStack(spacing: 8) {
28
+ configuration.icon
29
+ configuration.title
30
+ }
31
+ }
32
+ }
33
+
34
+ public struct TitleAndIconLabelStyle: LabelStyle {
35
+ public init() {}
36
+ public func makeBody(configuration: Configuration) -> some View {
37
+ HStack(spacing: 8) {
38
+ configuration.icon
39
+ configuration.title
40
+ }
41
+ }
42
+ }
43
+
44
+ public struct IconOnlyLabelStyle: LabelStyle {
45
+ public init() {}
46
+ public func makeBody(configuration: Configuration) -> some View { configuration.icon }
47
+ }
48
+
49
+ public struct TitleOnlyLabelStyle: LabelStyle {
50
+ public init() {}
51
+ public func makeBody(configuration: Configuration) -> some View { configuration.title }
52
+ }
53
+
54
+ extension LabelStyle where Self == DefaultLabelStyle {
55
+ public static var automatic: DefaultLabelStyle { DefaultLabelStyle() }
56
+ }
57
+ extension LabelStyle where Self == TitleAndIconLabelStyle {
58
+ public static var titleAndIcon: TitleAndIconLabelStyle { TitleAndIconLabelStyle() }
59
+ }
60
+ extension LabelStyle where Self == IconOnlyLabelStyle {
61
+ public static var iconOnly: IconOnlyLabelStyle { IconOnlyLabelStyle() }
62
+ }
63
+ extension LabelStyle where Self == TitleOnlyLabelStyle {
64
+ public static var titleOnly: TitleOnlyLabelStyle { TitleOnlyLabelStyle() }
65
+ }
66
+
67
+ /// Type-erased style stored in the environment.
68
+ struct _AnyLabelStyle {
69
+ let make: @MainActor (LabelStyleConfiguration) -> any View
70
+
71
+ @MainActor
72
+ init<S: LabelStyle>(_ style: S) {
73
+ make = { configuration in style.makeBody(configuration: configuration) }
74
+ }
75
+
76
+ nonisolated init(make: @escaping @MainActor (LabelStyleConfiguration) -> any View) {
77
+ self.make = make
78
+ }
79
+
80
+ /// Usable from nonisolated code (toolbars build their children there).
81
+ nonisolated static var iconOnly: _AnyLabelStyle {
82
+ _AnyLabelStyle(make: { configuration in IconOnlyLabelStyle().makeBody(configuration: configuration) })
83
+ }
84
+ }
85
+
86
+ private struct _LabelStyleKey: EnvironmentKey {
87
+ static var defaultValue: _AnyLabelStyle? { nil }
88
+ }
89
+
90
+ extension EnvironmentValues {
91
+ var _labelStyle: _AnyLabelStyle? {
92
+ get { self[_LabelStyleKey.self] }
93
+ set { self[_LabelStyleKey.self] = newValue }
94
+ }
95
+ }
96
+
97
+ nonisolated extension View {
98
+ @MainActor
99
+ public func labelStyle<S: LabelStyle>(_ style: S) -> some View {
100
+ environment(\._labelStyle, _AnyLabelStyle(style))
101
+ }
102
+ }
103
+
104
+ /// Resolves a label through the environment's style. `Label.body` returns
105
+ /// this so the style is read where the label is mounted.
106
+ struct _StyledLabel: View {
107
+ let title: any View
108
+ let icon: any View
109
+ @Environment(\._labelStyle) private var style
110
+
111
+ var body: some View {
112
+ // The icon is marked so a list row can tint it (the title keeps the
113
+ // row's primary color), as iOS does for labels in lists.
114
+ let markedIcon = AnyView(icon)._styled { $0.extras["labelIcon"] = .bool(true) }
115
+ let configuration = LabelStyleConfiguration(title: .init(view: title), icon: .init(view: markedIcon))
116
+ let styled = style?.make(configuration) ?? DefaultLabelStyle().makeBody(configuration: configuration)
117
+ // As on iOS, the title stays the label's accessibility label when the
118
+ // style shows only the icon (a toolbar button), so an event script
119
+ // can name the button by it.
120
+ let titleText = _textContent(of: title)
121
+ if titleText.isEmpty { return AnyView(styled) }
122
+ return AnyView(AnyView(styled).accessibilityLabel(titleText))
123
+ }
124
+ }
@@ -0,0 +1,220 @@
1
+ public enum TextAlignment: Hashable, Sendable {
2
+ case leading, center, trailing
3
+
4
+ var name: String {
5
+ switch self {
6
+ case .leading: "leading"
7
+ case .center: "center"
8
+ case .trailing: "trailing"
9
+ }
10
+ }
11
+ }
12
+
13
+ nonisolated extension View {
14
+ /// Sets the priority by which a parent stack hands out space.
15
+ public func layoutPriority(_ value: Double) -> some View {
16
+ _styled { $0.layoutPriority = value }
17
+ }
18
+
19
+ /// Limits the number of lines text in this view can occupy.
20
+ public func lineLimit(_ number: Int?) -> some View {
21
+ _styled { $0.lineLimit = number ?? -1 }
22
+ }
23
+
24
+ /// `reservesSpace` is accepted and ignored: the text takes the lines it needs, up to `limit`.
25
+ public func lineLimit(_ limit: Int, reservesSpace: Bool) -> some View {
26
+ _styled { $0.lineLimit = limit }
27
+ }
28
+
29
+ public func multilineTextAlignment(_ alignment: TextAlignment) -> some View {
30
+ _styled { $0.multilineTextAlignment = alignment }
31
+ }
32
+
33
+ /// Fixes the view at its ideal size on the given axes.
34
+ public func fixedSize(horizontal: Bool, vertical: Bool) -> some View {
35
+ _styled { $0.fixedSize = (horizontal, vertical) }
36
+ }
37
+
38
+ public func fixedSize() -> some View {
39
+ fixedSize(horizontal: true, vertical: true)
40
+ }
41
+ }
42
+
43
+ // MARK: - Color and shapes as views
44
+
45
+ extension Color: _PrimitiveView {}
46
+ extension Color: _HostView {
47
+ var _kind: String { "color" }
48
+ func _props(in environment: EnvironmentValues) -> _JSON { .object(["color": _json]) }
49
+ }
50
+
51
+ /// A shape drawn as a view, optionally filled or stroked. `inset` strokes
52
+ /// (`strokeBorder`) lie inside the shape's bounds. A custom shape (`"path"`)
53
+ /// is drawn from its path (Shape.swift), with the fill rule and the whole
54
+ /// stroke style; a built-in shape is drawn by name.
55
+ public struct _ShapeView<S: Shape> {
56
+ let shape: S
57
+ let fill: (any ShapeStyle)?
58
+ let stroke: (style: any ShapeStyle, lineWidth: CGFloat, inset: Bool)?
59
+ var eoFill = false
60
+ var strokeStyle: StrokeStyle? = nil
61
+ }
62
+ extension _ShapeView: _PrimitiveView {}
63
+ extension _ShapeView: _HostView {
64
+ var _kind: String { "shape" }
65
+ func _props(in environment: EnvironmentValues) -> _JSON {
66
+ // A stroked shape filled with a style is its outline in that style.
67
+ if stroke == nil, let stroked = shape as? any _Stroked {
68
+ return stroked._outlineProps(style: fill ?? ForegroundStyle(), in: environment)
69
+ }
70
+ let drawsPath = shape._name == "path"
71
+ var stroke: _JSON = .null
72
+ if let s = self.stroke {
73
+ var object: [String: _JSON] = ["color": s.style._json, "lineWidth": .number(s.lineWidth)]
74
+ // A path is inset by the Swift side (Shape.swift); the page strokes it as is.
75
+ if s.inset && !drawsPath { object["inset"] = .bool(true) }
76
+ if drawsPath, let style = strokeStyle {
77
+ object["lineCap"] = .string(["butt", "round", "square"][Int(style.lineCap.rawValue)])
78
+ object["lineJoin"] = .string(["miter", "round", "bevel"][Int(style.lineJoin.rawValue)])
79
+ object["miterLimit"] = .number(style.miterLimit)
80
+ if !style.dash.isEmpty {
81
+ object["dash"] = .array(style.dash.map(_JSON.number))
82
+ object["dashPhase"] = .number(style.dashPhase)
83
+ }
84
+ }
85
+ stroke = .object(object)
86
+ }
87
+ var props: [String: _JSON] = [
88
+ "shape": .string(shape._name),
89
+ "cornerRadius": .number(_resolvedCornerRadius(shape, in: environment)),
90
+ "fill": fill?._json ?? .null,
91
+ "stroke": stroke,
92
+ ]
93
+ if drawsPath {
94
+ // The page reports the size the path is drawn for; the runtime
95
+ // adds the path (`_pathProps`).
96
+ props["reportsSize"] = .bool(true)
97
+ if eoFill { props["fillRule"] = .string("evenodd") }
98
+ } else if let trimmed = shape as? _TrimmedShape {
99
+ // `.trim(from:to:)` of a built-in shape (ShapeTrim.swift); a path is trimmed itself.
100
+ props["trim"] = trimmed._trimJSON
101
+ }
102
+ return .object(props)
103
+ }
104
+ }
105
+
106
+ /// How a shape is filled: `eoFill` uses the even-odd rule (a path's
107
+ /// overlapping parts cancel out) rather than the non-zero winding rule.
108
+ public struct FillStyle: Equatable, Sendable {
109
+ public var isEOFilled: Bool
110
+ public var isAntialiased: Bool
111
+
112
+ public init(eoFill: Bool = false, antialiased: Bool = true) {
113
+ isEOFilled = eoFill
114
+ isAntialiased = antialiased
115
+ }
116
+ }
117
+
118
+ nonisolated extension Shape {
119
+ public func fill<S: ShapeStyle>(_ style: S, style fillStyle: FillStyle = FillStyle()) -> some View {
120
+ _ShapeView(shape: self, fill: style, stroke: nil, eoFill: fillStyle.isEOFilled)
121
+ }
122
+
123
+ /// Filled with the foreground style.
124
+ public func fill(style: FillStyle = FillStyle()) -> some View {
125
+ _ShapeView(shape: self, fill: ForegroundStyle(), stroke: nil, eoFill: style.isEOFilled)
126
+ }
127
+
128
+ public func stroke<S: ShapeStyle>(_ style: S, lineWidth: CGFloat = 1) -> some View {
129
+ _ShapeView(shape: self, fill: nil, stroke: (style, lineWidth, false))
130
+ }
131
+
132
+ /// The outline as a shape (iOS 17), so it can be filled or passed where a
133
+ /// shape goes (`.overlay(.bar, in: .capsule.stroke())`); as a view it is
134
+ /// the outline in the foreground style.
135
+ public func stroke(lineWidth: CGFloat = 1, antialiased: Bool = true) -> _StrokedShape<Self> {
136
+ _StrokedShape(base: self, lineWidth: lineWidth)
137
+ }
138
+
139
+ /// A stroke drawn inside the shape's bounds.
140
+ public func strokeBorder<S: ShapeStyle>(_ style: S, lineWidth: CGFloat = 1, antialiased: Bool = true) -> some View {
141
+ _ShapeView(shape: self, fill: nil, stroke: (style, lineWidth, true))
142
+ }
143
+
144
+ public func strokeBorder(lineWidth: CGFloat = 1, antialiased: Bool = true) -> some View {
145
+ _ShapeView(shape: self, fill: nil, stroke: (ForegroundStyle(), lineWidth, true))
146
+ }
147
+ }
148
+
149
+ extension Rectangle: View {
150
+ public typealias Body = Never
151
+ public var body: Never { fatalError("Rectangle is a primitive view") }
152
+ }
153
+ extension RoundedRectangle: View {
154
+ public typealias Body = Never
155
+ public var body: Never { fatalError("RoundedRectangle is a primitive view") }
156
+ }
157
+ extension Circle: View {
158
+ public typealias Body = Never
159
+ public var body: Never { fatalError("Circle is a primitive view") }
160
+ }
161
+ extension Capsule: View {
162
+ public typealias Body = Never
163
+ public var body: Never { fatalError("Capsule is a primitive view") }
164
+ }
165
+ extension Ellipse: View {
166
+ public typealias Body = Never
167
+ public var body: Never { fatalError("Ellipse is a primitive view") }
168
+ }
169
+
170
+ extension Rectangle: _HostView {
171
+ var _kind: String { "shape" }
172
+ func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
173
+ }
174
+ extension RoundedRectangle: _HostView {
175
+ var _kind: String { "shape" }
176
+ func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
177
+ }
178
+ extension Circle: _HostView {
179
+ var _kind: String { "shape" }
180
+ func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
181
+ }
182
+ extension Capsule: _HostView {
183
+ var _kind: String { "shape" }
184
+ func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
185
+ }
186
+ extension Ellipse: _HostView {
187
+ var _kind: String { "shape" }
188
+ func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
189
+ }
190
+
191
+ private func _shapeProps(_ shape: some Shape) -> _JSON {
192
+ .object([
193
+ "shape": .string(shape._name),
194
+ "cornerRadius": .number(shape._cornerRadius),
195
+ "fill": .null,
196
+ "stroke": .null,
197
+ ])
198
+ }
199
+
200
+ /// A shape's outline as a shape (`shape.stroke(lineWidth:)`, iOS 17): drawn,
201
+ /// or filled with a style, as the base shape stroked with that style.
202
+ nonisolated public struct _StrokedShape<Base: Shape>: Shape {
203
+ let base: Base
204
+ let lineWidth: CGFloat
205
+
206
+ public var _name: String { base._name }
207
+ public var _cornerRadius: CGFloat { base._cornerRadius }
208
+ /// The base's path: a custom shape's outline is drawn from it.
209
+ public func path(in rect: CGRect) -> Path { base.path(in: rect) }
210
+ }
211
+
212
+ protocol _Stroked {
213
+ func _outlineProps(style: any ShapeStyle, in environment: EnvironmentValues) -> _JSON
214
+ }
215
+
216
+ extension _StrokedShape: _Stroked {
217
+ func _outlineProps(style: any ShapeStyle, in environment: EnvironmentValues) -> _JSON {
218
+ _ShapeView(shape: base, fill: nil, stroke: (style, lineWidth, false))._props(in: environment)
219
+ }
220
+ }
@@ -0,0 +1,49 @@
1
+ // `LazyVStack` and `LazyHStack`: the same `vstack` / `hstack` elements as
2
+ // `VStack` and `HStack`, whose `ForEach` rows are built as they come near the
3
+ // visible area (Runtime/LazyRows.swift), as a `List`'s are.
4
+ // `pinnedViews` is accepted: section headers and footers scroll with their
5
+ // rows instead of sticking to the scroll view's edge.
6
+
7
+ public struct LazyVStack<Content: View> {
8
+ let alignment: HorizontalAlignment
9
+ let spacing: CGFloat?
10
+ let content: Content
11
+
12
+ public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
13
+ pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content) {
14
+ self.alignment = alignment
15
+ self.spacing = spacing
16
+ self.content = content()
17
+ }
18
+ }
19
+ extension LazyVStack: _PrimitiveView {}
20
+ extension LazyVStack: _HostView {
21
+ var _kind: String { "vstack" }
22
+ func _props(in environment: EnvironmentValues) -> _JSON {
23
+ .object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
24
+ }
25
+ var _content: [any View] { [content] }
26
+ }
27
+ extension LazyVStack: _ScrollTargetContainer {}
28
+
29
+ public struct LazyHStack<Content: View> {
30
+ let alignment: VerticalAlignment
31
+ let spacing: CGFloat?
32
+ let content: Content
33
+
34
+ public init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil,
35
+ pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content) {
36
+ self.alignment = alignment
37
+ self.spacing = spacing
38
+ self.content = content()
39
+ }
40
+ }
41
+ extension LazyHStack: _PrimitiveView {}
42
+ extension LazyHStack: _HostView {
43
+ var _kind: String { "hstack" }
44
+ func _props(in environment: EnvironmentValues) -> _JSON {
45
+ .object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
46
+ }
47
+ var _content: [any View] { [content] }
48
+ }
49
+ extension LazyHStack: _ScrollTargetContainer {}
@@ -0,0 +1,97 @@
1
+ // SwiftUI's first alert API, still common in packages: `Alert` values with
2
+ // `Alert.Button`s, shown by `.alert(isPresented:content:)` or
3
+ // `.alert(item:content:)`, and `@Environment(\.presentationMode)`. An
4
+ // `Alert` becomes the same `alert` element as the newer `.alert(_:isPresented:
5
+ // actions:message:)` (Alert.swift): each button is a `Button` with its role.
6
+
7
+ /// An alert: a title, an optional message and up to two buttons.
8
+ public struct Alert {
9
+ let title: Text
10
+ let message: Text?
11
+ let buttons: [Button]
12
+
13
+ public init(title: Text, message: Text? = nil, dismissButton: Button? = nil) {
14
+ self.title = title
15
+ self.message = message
16
+ buttons = dismissButton.map { [$0] } ?? []
17
+ }
18
+
19
+ public init(title: Text, message: Text? = nil, primaryButton: Button, secondaryButton: Button) {
20
+ self.title = title
21
+ self.message = message
22
+ buttons = [primaryButton, secondaryButton]
23
+ }
24
+
25
+ /// An alert button: a label, a role and an action.
26
+ public struct Button {
27
+ let label: Text
28
+ let role: ButtonRole?
29
+ let action: (() -> Void)?
30
+
31
+ public static func `default`(_ label: Text, action: (() -> Void)? = {}) -> Button {
32
+ Button(label: label, role: nil, action: action)
33
+ }
34
+
35
+ public static func cancel(_ label: Text, action: (() -> Void)? = {}) -> Button {
36
+ Button(label: label, role: .cancel, action: action)
37
+ }
38
+
39
+ /// "Cancel".
40
+ public static func cancel(_ action: (() -> Void)? = {}) -> Button {
41
+ Button(label: Text("Cancel"), role: .cancel, action: action)
42
+ }
43
+
44
+ public static func destructive(_ label: Text, action: (() -> Void)? = {}) -> Button {
45
+ Button(label: label, role: .destructive, action: action)
46
+ }
47
+ }
48
+
49
+ /// The buttons as views; "OK" when the alert has none, as SwiftUI shows.
50
+ @MainActor var actions: [SwiftUI.Button<Text>] {
51
+ let buttons = self.buttons.isEmpty ? [Button.default(Text("OK"))] : self.buttons
52
+ return buttons.map { button in
53
+ let action = button.action
54
+ return SwiftUI.Button(role: button.role, action: { action?() }) { button.label }
55
+ }
56
+ }
57
+ }
58
+
59
+ extension View {
60
+ /// Shows the alert `content` makes while `isPresented` is true.
61
+ public func alert(isPresented: Binding<Bool>, content: () -> Alert) -> some View {
62
+ let alert = content()
63
+ return _AlertView(base: self, isPresented: isPresented, title: alert.title.content,
64
+ message: alert.message?.content, style: "alert",
65
+ actions: ForEach(Array(alert.actions.enumerated()), id: \.offset) { $0.element })
66
+ }
67
+
68
+ /// Shows the alert `content` makes from `item` while it is non-nil;
69
+ /// dismissing sets it back to nil.
70
+ public func alert<Item: Identifiable>(item: Binding<Item?>, content: (Item) -> Alert) -> some View {
71
+ let presented = Binding(get: { item.wrappedValue != nil }, set: { if !$0 { item.wrappedValue = nil } })
72
+ let alert = item.wrappedValue.map(content) ?? Alert(title: Text(""))
73
+ return _AlertView(base: self, isPresented: presented, title: alert.title.content,
74
+ message: alert.message?.content, style: "alert",
75
+ actions: ForEach(Array(alert.actions.enumerated()), id: \.offset) { $0.element })
76
+ }
77
+ }
78
+
79
+ // MARK: - Presentation mode
80
+
81
+ /// Whether the view is presented, and how to dismiss it: `dismiss()` is the
82
+ /// environment's `dismiss` action.
83
+ public struct PresentationMode {
84
+ let dismissAction: DismissAction
85
+
86
+ /// True: the shim does not track this for the view.
87
+ public var isPresented: Bool { true }
88
+
89
+ @MainActor public mutating func dismiss() { dismissAction() }
90
+ }
91
+
92
+ extension EnvironmentValues {
93
+ public var presentationMode: Binding<PresentationMode> {
94
+ let mode = PresentationMode(dismissAction: dismiss)
95
+ return Binding(get: { mode }, set: { _ in })
96
+ }
97
+ }