@swiftbrowser/swift 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,212 @@
1
+ /// Edit mode, `EditButton`, `ForEach.onDelete` / `onMove` and `refreshable`.
2
+ /// See docs/ops-protocol.md, "Phase 8: interaction".
3
+
4
+ import Foundation
5
+
6
+ // MARK: - Offset sets
7
+
8
+ extension RangeReplaceableCollection {
9
+ /// Removes the elements at `offsets` (offsets from `startIndex`), as
10
+ /// SwiftUI's `onDelete` handlers do.
11
+ public mutating func remove(atOffsets offsets: IndexSet) {
12
+ for offset in offsets.sorted(by: >) where offset >= 0 && offset < count {
13
+ remove(at: index(startIndex, offsetBy: offset))
14
+ }
15
+ }
16
+ }
17
+
18
+ extension MutableCollection where Self: RangeReplaceableCollection {
19
+ /// Moves the elements at `source` so that they start at `destination`
20
+ /// (an offset into the collection before the move), like Foundation's.
21
+ public mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
22
+ let offsets = source.filter { $0 >= 0 && $0 < count }
23
+ guard !offsets.isEmpty else { return }
24
+ let moving = offsets.map { self[index(startIndex, offsetBy: $0)] }
25
+ let before = offsets.filter { $0 < destination }.count
26
+ for offset in offsets.sorted(by: >) {
27
+ remove(at: index(startIndex, offsetBy: offset))
28
+ }
29
+ let target = Swift.max(0, Swift.min(destination - before, count))
30
+ insert(contentsOf: moving, at: index(startIndex, offsetBy: target))
31
+ }
32
+ }
33
+
34
+ // MARK: - onDelete / onMove
35
+
36
+ /// A view built from a collection, like SwiftUI's: `ForEach` and what
37
+ /// `onDelete` / `onMove` return.
38
+ public protocol DynamicViewContent: View {
39
+ associatedtype Data: Collection
40
+ var data: Data { get }
41
+ }
42
+
43
+ extension ForEach: DynamicViewContent where Content: View {}
44
+
45
+ /// A keyed group whose rows a `List` can delete (and, when the renderer learns
46
+ /// to, move). The runtime wraps each row in a `listrow` with `deletable`.
47
+ protocol _DeletableGroup: _TraitBearing {
48
+ /// Calls the group's `onDelete` with the row at `offset`; nil without one.
49
+ var _delete: ((Int) -> Void)? { get }
50
+ var _move: ((Int, Int) -> Void)? { get }
51
+ }
52
+
53
+ public struct _EditableForEach<Base: DynamicViewContent> {
54
+ let base: Base
55
+ let delete: ((Int) -> Void)?
56
+ let move: ((Int, Int) -> Void)?
57
+ }
58
+ extension _EditableForEach: _PrimitiveView {}
59
+ extension _EditableForEach: DynamicViewContent {
60
+ public var data: Base.Data { base.data }
61
+ }
62
+ extension _EditableForEach: _GroupView {
63
+ var _children: [any View] { (base as? any _GroupView)?._children ?? [base] }
64
+ var _keys: [AnyHashable]? { (base as? any _GroupView)?._keys }
65
+ var _spreads: Bool { (base as? any _GroupView)?._spreads ?? false }
66
+ }
67
+ extension _EditableForEach: _DeletableGroup {
68
+ var _delete: ((Int) -> Void)? { delete }
69
+ var _move: ((Int, Int) -> Void)? { move }
70
+ }
71
+
72
+ extension DynamicViewContent {
73
+ /// Lets a `List` delete the rows: `action` receives the offsets of the
74
+ /// removed elements in `data`. Pass `nil` to opt out.
75
+ public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Self> {
76
+ _EditableForEach(base: self, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: nil)
77
+ }
78
+
79
+ /// Accepted for source compatibility; the renderer offers no reordering yet.
80
+ public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Self> {
81
+ _EditableForEach(base: self, delete: nil, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
82
+ }
83
+ }
84
+
85
+ extension _EditableForEach {
86
+ /// `ForEach(...).onDelete(...).onMove(...)`: the second modifier merges into the first.
87
+ public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Base> {
88
+ _EditableForEach(base: base, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: move)
89
+ }
90
+
91
+ public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Base> {
92
+ _EditableForEach(base: base, delete: delete, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
93
+ }
94
+ }
95
+
96
+ /// `.deleteDisabled` / `.moveDisabled` on a row.
97
+ protocol _RowEditingDisabling: _TraitBearing {
98
+ var _deleteDisabled: Bool { get }
99
+ }
100
+
101
+ struct _DeleteDisabledView<Content: View> {
102
+ let content: Content
103
+ let disabled: Bool
104
+ }
105
+ extension _DeleteDisabledView: _PrimitiveView {}
106
+ extension _DeleteDisabledView: _GroupView {
107
+ var _children: [any View] { [content] }
108
+ }
109
+ extension _DeleteDisabledView: _RowEditingDisabling {
110
+ var _deleteDisabled: Bool { disabled }
111
+ }
112
+
113
+ nonisolated extension View {
114
+ public func deleteDisabled(_ isDisabled: Bool) -> some View {
115
+ _DeleteDisabledView(content: self, disabled: isDisabled)
116
+ }
117
+
118
+ /// Accepted for source compatibility; rows cannot be moved yet.
119
+ public func moveDisabled(_ isDisabled: Bool) -> some View { self }
120
+ }
121
+
122
+ // MARK: - Edit mode
123
+
124
+ /// Whether a view is being edited. Each `navscreen` (and a `List` outside
125
+ /// a navigation stack) owns an edit mode the runtime puts in the environment
126
+ /// as a binding; `EditButton` toggles it and `List` reports it as `editing`.
127
+ public enum EditMode: Hashable, Sendable {
128
+ case inactive
129
+ case transient
130
+ case active
131
+
132
+ public var isEditing: Bool { self != .inactive }
133
+ }
134
+
135
+ enum _EditModeKey: EnvironmentKey { static var defaultValue: Binding<EditMode>? { nil } }
136
+
137
+ extension EnvironmentValues {
138
+ public var editMode: Binding<EditMode>? {
139
+ get { self[_EditModeKey.self] }
140
+ set { self[_EditModeKey.self] = newValue }
141
+ }
142
+ }
143
+
144
+ /// A button that toggles the enclosing edit mode between "Edit" and "Done".
145
+ public struct EditButton: View {
146
+ @Environment(\.editMode) private var editMode
147
+
148
+ public init() {}
149
+
150
+ public var body: some View {
151
+ let isEditing = editMode?.wrappedValue.isEditing == true
152
+ let mode = editMode
153
+ return Button(isEditing ? "Done" : "Edit") {
154
+ mode?.wrappedValue = isEditing ? .inactive : .active
155
+ }
156
+ }
157
+ }
158
+
159
+ // MARK: - Refreshable
160
+
161
+ enum _RefreshActionKey: EnvironmentKey {
162
+ static var defaultValue: (@Sendable () async -> Void)? { nil }
163
+ }
164
+
165
+ extension EnvironmentValues {
166
+ /// `.refreshable`'s action, read by the `List` / `ScrollView` it wraps.
167
+ var _refreshAction: (@Sendable () async -> Void)? {
168
+ get { self[_RefreshActionKey.self] }
169
+ set { self[_RefreshActionKey.self] = newValue }
170
+ }
171
+ }
172
+
173
+ nonisolated extension View {
174
+ /// Pull to refresh on the `List` or `ScrollView` this modifies: the view
175
+ /// shows a spinner (`refreshing`) while `action` runs.
176
+ /// The action runs in the caller's actor context, as `.task`'s does.
177
+ public func refreshable(@_inheritActorContext action: @escaping @Sendable () async -> Void) -> some View {
178
+ environment(\._refreshAction, action)
179
+ }
180
+ }
181
+
182
+ /// Shared by `List` and `ScrollView`: the `refreshable` / `refreshing` props
183
+ /// and the `refresh` handler, driven by a `@State` flag on the view.
184
+ struct _Refresh {
185
+ let action: (@Sendable () async -> Void)?
186
+ let refreshing: Binding<Bool>
187
+
188
+ func addProps(to props: inout [String: _JSON]) {
189
+ guard action != nil else { return }
190
+ props["refreshable"] = .bool(true)
191
+ props["refreshing"] = .bool(refreshing.wrappedValue)
192
+ }
193
+
194
+ @MainActor var handler: ((_JSON) -> Void)? {
195
+ guard let action else { return nil }
196
+ // Main-actor closures are Sendable; the binding itself is not.
197
+ let refreshing = self.refreshing
198
+ let isRefreshing: @MainActor () -> Bool = { refreshing.wrappedValue }
199
+ let setRefreshing: @MainActor (Bool) -> Void = { refreshing.wrappedValue = $0 }
200
+ return { payload in
201
+ guard case .object(let fields) = payload, case .string("refresh")? = fields["type"] else { return }
202
+ MainActor.assumeIsolated {
203
+ guard !isRefreshing() else { return }
204
+ setRefreshing(true)
205
+ Task {
206
+ await action()
207
+ setRefreshing(false)
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
@@ -0,0 +1,388 @@
1
+ /// Visual effects and hints that need no layout logic on the Swift side: the
2
+ /// renderer applies them from the `styled` element's style keys (see
3
+ /// docs/ops-protocol.md, "Phase 6 additions").
4
+
5
+ public struct Angle: Hashable, Sendable, Comparable {
6
+ public var radians: Double
7
+
8
+ public var degrees: Double {
9
+ get { radians * 180 / .pi }
10
+ set { radians = newValue * .pi / 180 }
11
+ }
12
+
13
+ public init() { radians = 0 }
14
+ public init(radians: Double) { self.radians = radians }
15
+ public init(degrees: Double) { radians = degrees * .pi / 180 }
16
+
17
+ public static func radians(_ radians: Double) -> Angle { Angle(radians: radians) }
18
+ public static func degrees(_ degrees: Double) -> Angle { Angle(degrees: degrees) }
19
+ public static let zero = Angle()
20
+
21
+ public static func < (lhs: Angle, rhs: Angle) -> Bool { lhs.radians < rhs.radians }
22
+
23
+ public static prefix func - (angle: Angle) -> Angle { Angle(radians: -angle.radians) }
24
+ public static func + (lhs: Angle, rhs: Angle) -> Angle { Angle(radians: lhs.radians + rhs.radians) }
25
+ public static func - (lhs: Angle, rhs: Angle) -> Angle { Angle(radians: lhs.radians - rhs.radians) }
26
+ public static func * (lhs: Angle, rhs: Double) -> Angle { Angle(radians: lhs.radians * rhs) }
27
+ public static func * (lhs: Double, rhs: Angle) -> Angle { Angle(radians: lhs * rhs.radians) }
28
+ public static func / (lhs: Angle, rhs: Double) -> Angle { Angle(radians: lhs.radians / rhs) }
29
+ public static func += (lhs: inout Angle, rhs: Angle) { lhs = lhs + rhs }
30
+ public static func -= (lhs: inout Angle, rhs: Angle) { lhs = lhs - rhs }
31
+ }
32
+
33
+ /// `.formStyle`: accepted for source compatibility; forms are always grouped.
34
+ public protocol FormStyle {}
35
+ public struct AutomaticFormStyle: FormStyle { public init() {} }
36
+ public struct GroupedFormStyle: FormStyle { public init() {} }
37
+ public struct ColumnsFormStyle: FormStyle { public init() {} }
38
+ extension FormStyle where Self == AutomaticFormStyle {
39
+ public static var automatic: AutomaticFormStyle { AutomaticFormStyle() }
40
+ }
41
+ extension FormStyle where Self == GroupedFormStyle {
42
+ public static var grouped: GroupedFormStyle { GroupedFormStyle() }
43
+ }
44
+ extension FormStyle where Self == ColumnsFormStyle {
45
+ public static var columns: ColumnsFormStyle { ColumnsFormStyle() }
46
+ }
47
+
48
+ extension Image {
49
+ public enum Scale: Hashable, Sendable {
50
+ case small, medium, large
51
+
52
+ var name: String {
53
+ switch self {
54
+ case .small: "small"
55
+ case .medium: "medium"
56
+ case .large: "large"
57
+ }
58
+ }
59
+ }
60
+ }
61
+
62
+ nonisolated extension View {
63
+ /// Translates the rendered view without affecting layout.
64
+ public func offset(x: CGFloat = 0, y: CGFloat = 0) -> some View {
65
+ _styled { $0.extras["offset"] = .object(["x": .number(x), "y": .number(y)]) }
66
+ }
67
+
68
+ public func offset(_ offset: CGSize) -> some View {
69
+ self.offset(x: offset.width, y: offset.height)
70
+ }
71
+
72
+ public func rotationEffect(_ angle: Angle, anchor: UnitPoint = .center) -> some View {
73
+ _styled {
74
+ $0.extras["rotation"] = .number(angle.degrees)
75
+ $0.extras["rotationAnchor"] = anchor._json
76
+ }
77
+ }
78
+
79
+ public func scaleEffect(_ scale: CGFloat, anchor: UnitPoint = .center) -> some View {
80
+ scaleEffect(x: scale, y: scale, anchor: anchor)
81
+ }
82
+
83
+ public func scaleEffect(_ scale: CGSize, anchor: UnitPoint = .center) -> some View {
84
+ scaleEffect(x: scale.width, y: scale.height, anchor: anchor)
85
+ }
86
+
87
+ public func scaleEffect(x: CGFloat = 1, y: CGFloat = 1, anchor: UnitPoint = .center) -> some View {
88
+ _styled {
89
+ $0.extras["scale"] = .object(["x": .number(x), "y": .number(y)])
90
+ $0.extras["scaleAnchor"] = anchor._json
91
+ }
92
+ }
93
+
94
+ /// Rotates the view in 3D about `axis` through `anchor`: the `rotation3D`
95
+ /// style hint (angle in degrees; the renderer applies the perspective).
96
+ public func rotation3DEffect(_ angle: Angle, axis: (x: CGFloat, y: CGFloat, z: CGFloat),
97
+ anchor: UnitPoint = .center, anchorZ: CGFloat = 0,
98
+ perspective: CGFloat = 1) -> some View {
99
+ _styled {
100
+ $0.extras["rotation3D"] = .object([
101
+ "angle": .number(angle.degrees),
102
+ "axis": .object(["x": .number(axis.x), "y": .number(axis.y), "z": .number(axis.z)]),
103
+ "anchor": anchor._json,
104
+ "perspective": .number(perspective),
105
+ ])
106
+ }
107
+ }
108
+
109
+ /// A Gaussian blur of `radius` points (`opaque` is accepted and ignored).
110
+ public func blur(radius: CGFloat, opaque: Bool = false) -> some View {
111
+ _styled { $0.extras["blur"] = .number(radius) }
112
+ }
113
+
114
+ /// `false` makes the subtree ignore pointer events (`hitTesting: false`).
115
+ public func allowsHitTesting(_ enabled: Bool) -> some View {
116
+ _styled { if !enabled { $0.extras["hitTesting"] = .bool(false) } }
117
+ }
118
+
119
+ /// Lets the view extend under the safe area on `edges`: the
120
+ /// `ignoresSafeArea` hint, `"all"` or the list of edges. `regions` is accepted
121
+ /// and ignored (the browser has no keyboard safe area).
122
+ public func ignoresSafeArea(_ regions: SafeAreaRegions = .all, edges: Edge.Set = .all) -> some View {
123
+ _styled {
124
+ if edges == .all {
125
+ $0.extras["ignoresSafeArea"] = .string("all")
126
+ } else {
127
+ let names = Edge.allCases.filter { edges.contains(Edge.Set(rawValue: 1 << $0.rawValue)) }.map(\.name)
128
+ $0.extras["ignoresSafeArea"] = .array(names.map(_JSON.string))
129
+ }
130
+ }
131
+ }
132
+
133
+ public func shadow(color: Color = Color(white: 0, opacity: 0.33), radius: CGFloat, x: CGFloat = 0, y: CGFloat = 0) -> some View {
134
+ _styled {
135
+ $0.extras["shadow"] = .object([
136
+ "color": color._json, "radius": .number(radius), "x": .number(x), "y": .number(y),
137
+ ])
138
+ }
139
+ }
140
+
141
+ public func clipped(antialiased: Bool = false) -> some View {
142
+ _styled { $0.extras["clipped"] = .bool(true) }
143
+ }
144
+
145
+ /// Keeps the view's layout but draws nothing.
146
+ public func hidden() -> some View {
147
+ _styled { $0.extras["hidden"] = .bool(true) }
148
+ }
149
+
150
+ /// Masks the view with a paint: a `Color` or gradient mask becomes the
151
+ /// `mask` style hint (its alpha clips the view). Any other mask view is
152
+ /// not supported and leaves the view unmasked.
153
+ public func mask<Mask: View>(alignment: Alignment = .center, @ViewBuilder _ mask: () -> Mask) -> some View {
154
+ self.mask(mask())
155
+ }
156
+
157
+ public func mask<Mask: View>(_ mask: Mask) -> some View {
158
+ _styled {
159
+ if let style = mask as? any ShapeStyle { $0.extras["mask"] = style._json }
160
+ }
161
+ }
162
+
163
+ /// Fixes the view's center at a point in its parent's coordinate space; the
164
+ /// view then fills the proposed space.
165
+ public func position(x: CGFloat, y: CGFloat) -> some View {
166
+ _styled { $0.extras["position"] = .object(["x": .number(x), "y": .number(y)]) }
167
+ }
168
+
169
+ public func position(_ position: CGPoint) -> some View {
170
+ self.position(x: position.x, y: position.y)
171
+ }
172
+
173
+ /// The accent color for controls in the subtree (gauges, toggles, buttons).
174
+ public func tint(_ tint: Color?) -> some View {
175
+ _styled { $0.extras["tint"] = tint?._json ?? .null }
176
+ }
177
+
178
+ /// A style as the tint. The page tints with a color: a gradient tints
179
+ /// with its first color, any other style with the accent color.
180
+ @_disfavoredOverload
181
+ public func tint<S: ShapeStyle>(_ tint: S?) -> some View {
182
+ _styled { $0.extras["tint"] = tint.map { _tintColor(of: $0._json) } ?? .null }
183
+ }
184
+
185
+ public func imageScale(_ scale: Image.Scale) -> some View {
186
+ _styled { $0.extras["imageScale"] = .string(scale.name) }
187
+ }
188
+
189
+ // MARK: List rows
190
+
191
+ /// Trailing text in a list row.
192
+ public func badge(_ count: Int) -> some View {
193
+ _styled { $0.extras["badge"] = count == 0 ? .null : .string(String(count)) }
194
+ }
195
+
196
+ public func badge(_ key: LocalizedStringKey?) -> some View {
197
+ _styled { $0.extras["badge"] = key.map { .string($0.key) } ?? .null }
198
+ }
199
+
200
+ @_disfavoredOverload
201
+ public func badge<S: StringProtocol>(_ label: S?) -> some View {
202
+ _styled { $0.extras["badge"] = label.map { .string(String($0)) } ?? .null }
203
+ }
204
+
205
+ public func badge(_ label: Text?) -> some View {
206
+ _styled { $0.extras["badge"] = label.map { .string($0.content) } ?? .null }
207
+ }
208
+
209
+ public func listRowInsets(_ insets: EdgeInsets?) -> some View {
210
+ _styled { $0.extras["listRowInsets"] = insets?._json ?? .null }
211
+ }
212
+
213
+ // MARK: Accepted without effect (yet)
214
+
215
+ public func listRowBackground<V: View>(_ view: V?) -> some View { self }
216
+ public func listItemTint(_ tint: Color?) -> some View { self }
217
+ public func formStyle<S: FormStyle>(_ style: S) -> some View { self }
218
+ public func headerProminence(_ prominence: Prominence) -> some View { self }
219
+ /// The shape of this container: what a `ContainerRelativeShape`, a
220
+ /// `.background(_:)` and a `.clipShape(.containerRelative)` below take
221
+ /// the corners of (its corner radius; a custom shape's are square).
222
+ public func containerShape<T: Shape>(_ shape: T) -> some View {
223
+ environment(\._containerShapeRadius, shape._cornerRadius)
224
+ }
225
+ public func symbolVariant(_ variant: SymbolVariants) -> some View { self }
226
+ public func symbolRenderingMode(_ mode: SymbolRenderingMode?) -> some View { self }
227
+ public func contentTransition(_ transition: ContentTransition) -> some View { self }
228
+ public func textSelection<S: TextSelectability>(_ selectability: S) -> some View { self }
229
+ public func toolbarRole(_ role: ToolbarRole) -> some View { self }
230
+ public func controlSize(_ size: ControlSize) -> some View { self }
231
+ }
232
+
233
+ public enum Prominence: Hashable, Sendable { case standard, increased }
234
+
235
+ /// `.controlSize`: accepted for source compatibility; controls keep one size.
236
+ public enum ControlSize: Hashable, CaseIterable, Sendable { case mini, small, regular, large, extraLarge }
237
+
238
+ public struct SymbolVariants: Hashable, Sendable {
239
+ let name: String
240
+ public static let none = SymbolVariants(name: "none")
241
+ public static let circle = SymbolVariants(name: "circle")
242
+ public static let square = SymbolVariants(name: "square")
243
+ public static let rectangle = SymbolVariants(name: "rectangle")
244
+ public static let fill = SymbolVariants(name: "fill")
245
+ public static let slash = SymbolVariants(name: "slash")
246
+ }
247
+
248
+ public enum SymbolRenderingMode: Hashable, Sendable { case monochrome, multicolor, hierarchical, palette }
249
+
250
+ public enum BlendMode: Hashable, Sendable {
251
+ case normal, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight,
252
+ difference, exclusion, hue, saturation, color, luminosity, sourceAtop, destinationOver,
253
+ destinationOut, plusDarker, plusLighter
254
+
255
+ /// The CSS `mix-blend-mode` (the Porter-Duff modes and `plusDarker`,
256
+ /// which CSS has no counterpart for, draw normally).
257
+ var _css: String {
258
+ switch self {
259
+ case .multiply: "multiply"
260
+ case .screen: "screen"
261
+ case .overlay: "overlay"
262
+ case .darken: "darken"
263
+ case .lighten: "lighten"
264
+ case .colorDodge: "color-dodge"
265
+ case .colorBurn: "color-burn"
266
+ case .softLight: "soft-light"
267
+ case .hardLight: "hard-light"
268
+ case .difference: "difference"
269
+ case .exclusion: "exclusion"
270
+ case .hue: "hue"
271
+ case .saturation: "saturation"
272
+ case .color: "color"
273
+ case .luminosity: "luminosity"
274
+ case .plusLighter: "plus-lighter"
275
+ case .normal, .sourceAtop, .destinationOver, .destinationOut, .plusDarker: "normal"
276
+ }
277
+ }
278
+ }
279
+
280
+ /// How `drawingGroup` renders (accepted for source compatibility).
281
+ public enum ColorRenderingMode: Hashable, Sendable {
282
+ case nonLinear, linear, extendedLinear
283
+ }
284
+
285
+ nonisolated extension View {
286
+ /// Draws the view in front of its siblings with a lower index (CSS
287
+ /// `z-index`); siblings with the same index draw in order.
288
+ public func zIndex(_ value: Double) -> some View {
289
+ _styled { $0.extras["zIndex"] = .number(value) }
290
+ }
291
+
292
+ /// Blends the view with what is behind it (CSS `mix-blend-mode`).
293
+ public func blendMode(_ mode: BlendMode) -> some View {
294
+ _styled { $0.extras["blendMode"] = .string(mode._css) }
295
+ }
296
+
297
+ /// Renders the view offscreen before showing it; the browser composites
298
+ /// it already, so it draws the same.
299
+ public func drawingGroup(opaque: Bool = false, colorMode: ColorRenderingMode = .nonLinear) -> some View { self }
300
+ }
301
+
302
+ public struct SafeAreaRegions: OptionSet, Sendable {
303
+ public let rawValue: UInt
304
+ public init(rawValue: UInt) { self.rawValue = rawValue }
305
+ public static let container = SafeAreaRegions(rawValue: 1)
306
+ public static let keyboard = SafeAreaRegions(rawValue: 2)
307
+ public static let all: SafeAreaRegions = [.container, .keyboard]
308
+ }
309
+
310
+ public struct ContentTransition: Hashable, Sendable {
311
+ let name: String
312
+ public static let identity = ContentTransition(name: "identity")
313
+ public static let opacity = ContentTransition(name: "opacity")
314
+ public static let interpolate = ContentTransition(name: "interpolate")
315
+ public static func numericText(countsDown: Bool = false) -> ContentTransition { ContentTransition(name: "numericText") }
316
+ }
317
+
318
+ public protocol TextSelectability {}
319
+ public struct EnabledTextSelectability: TextSelectability { public init() {} }
320
+ public struct DisabledTextSelectability: TextSelectability { public init() {} }
321
+ extension TextSelectability where Self == EnabledTextSelectability {
322
+ public static var enabled: EnabledTextSelectability { EnabledTextSelectability() }
323
+ }
324
+ extension TextSelectability where Self == DisabledTextSelectability {
325
+ public static var disabled: DisabledTextSelectability { DisabledTextSelectability() }
326
+ }
327
+
328
+ public enum ToolbarRole: Hashable, Sendable { case automatic, navigationStack, browser, editor }
329
+
330
+ // MARK: - Tap gesture
331
+
332
+ /// `.onTapGesture`: a `tapgesture` element whose tap event runs the action.
333
+ struct _TapGestureView<Content: View> {
334
+ let content: Content
335
+ let action: @MainActor (CGPoint) -> Void
336
+ /// The action takes the tap's location: the page sends it (`location`).
337
+ var wantsLocation = false
338
+
339
+ init(content: Content, action: @escaping @MainActor () -> Void) {
340
+ self.content = content
341
+ self.action = { _ in action() }
342
+ }
343
+
344
+ init(content: Content, locatedAction: @escaping @MainActor (CGPoint) -> Void) {
345
+ self.content = content
346
+ self.action = locatedAction
347
+ wantsLocation = true
348
+ }
349
+ }
350
+ extension _TapGestureView: _PrimitiveView {}
351
+ extension _TapGestureView: _HostView {
352
+ var _kind: String { "tapgesture" }
353
+ func _props(in environment: EnvironmentValues) -> _JSON {
354
+ wantsLocation ? .object(["location": .bool(true)]) : .object([:])
355
+ }
356
+ var _content: [any View] { [content] }
357
+ var _handler: ((_JSON) -> Void)? {
358
+ let action = self.action
359
+ return { payload in
360
+ var point = CGPoint.zero
361
+ if case .object(let fields) = payload, case .number(let x)? = fields["x"], case .number(let y)? = fields["y"] {
362
+ point = CGPoint(x: x, y: y)
363
+ }
364
+ MainActor.assumeIsolated { action(point) }
365
+ }
366
+ }
367
+ }
368
+
369
+ nonisolated extension View {
370
+ public func onTapGesture(count: Int = 1, perform action: @escaping @MainActor () -> Void) -> some View {
371
+ _TapGestureView(content: self, action: action)
372
+ }
373
+ }
374
+
375
+ /// The color a style tints with: a color as it is, a gradient's first color,
376
+ /// else the accent color.
377
+ func _tintColor(of style: _JSON) -> _JSON {
378
+ guard case .object(let fields) = style else { return .object(["name": .string("accent")]) }
379
+ if fields["r"] != nil || fields["name"] != nil || fields["named"] != nil { return style }
380
+ if let color = fields["colorGradient"] { return color }
381
+ for key in ["linearGradient", "radialGradient", "angularGradient", "ellipticalGradient"] {
382
+ if case .object(let gradient)? = fields[key], case .array(let stops)? = gradient["stops"],
383
+ case .object(let first)? = stops.first, let color = first["color"] {
384
+ return color
385
+ }
386
+ }
387
+ return .object(["name": .string("accent")])
388
+ }
@@ -0,0 +1,8 @@
1
+ // `@Entry`: declares an environment value in one line,
2
+ // `extension EnvironmentValues { @Entry var isCompact = false }`. The macro
3
+ // (Sources/SwiftDataMacros/EntryMacro.swift) writes the `EnvironmentKey` and
4
+ // the computed property over it, as Apple's does.
5
+
6
+ @attached(accessor)
7
+ @attached(peer, names: prefixed(__Key_))
8
+ public macro Entry() = #externalMacro(module: "SwiftDataMacros", type: "EntryMacro")