@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,439 @@
1
+ @_exported import Observation
2
+
3
+ public enum ColorScheme: Hashable, Sendable {
4
+ case light, dark
5
+ }
6
+
7
+ /// The user's preferred text size.
8
+ public enum DynamicTypeSize: Int, Hashable, Comparable, CaseIterable, Sendable {
9
+ case xSmall, small, medium, large, xLarge, xxLarge, xxxLarge
10
+ case accessibility1, accessibility2, accessibility3, accessibility4, accessibility5
11
+
12
+ public static func < (lhs: DynamicTypeSize, rhs: DynamicTypeSize) -> Bool { lhs.rawValue < rhs.rawValue }
13
+
14
+ public var isAccessibilitySize: Bool { self >= .accessibility1 }
15
+
16
+ var name: String {
17
+ switch self {
18
+ case .xSmall: "xSmall"
19
+ case .small: "small"
20
+ case .medium: "medium"
21
+ case .large: "large"
22
+ case .xLarge: "xLarge"
23
+ case .xxLarge: "xxLarge"
24
+ case .xxxLarge: "xxxLarge"
25
+ case .accessibility1: "accessibility1"
26
+ case .accessibility2: "accessibility2"
27
+ case .accessibility3: "accessibility3"
28
+ case .accessibility4: "accessibility4"
29
+ case .accessibility5: "accessibility5"
30
+ }
31
+ }
32
+
33
+ init?(name: String) {
34
+ guard let match = Self.allCases.first(where: { $0.name == name }) else { return nil }
35
+ self = match
36
+ }
37
+ }
38
+
39
+ /// The horizontal or vertical size class of the window the view is in.
40
+ /// The renderer reports `regular` for screens at least 700 CSS px wide
41
+ /// (see docs/ops-protocol.md, Phase 7); headless runs are compact.
42
+ public enum UserInterfaceSizeClass: Hashable, Sendable {
43
+ case compact, regular
44
+
45
+ init?(name: String) {
46
+ switch name {
47
+ case "compact": self = .compact
48
+ case "regular": self = .regular
49
+ default: return nil
50
+ }
51
+ }
52
+ }
53
+
54
+ /// The direction of the writing system: views read it to lay out or draw
55
+ /// differently for right-to-left languages.
56
+ public enum LayoutDirection: Hashable, CaseIterable, Sendable {
57
+ case leftToRight, rightToLeft
58
+ }
59
+
60
+ /// A key for custom environment values.
61
+ public protocol EnvironmentKey {
62
+ associatedtype Value
63
+ static var defaultValue: Value { get }
64
+ }
65
+
66
+ /// Dismisses the current presentation: in a navigation stack, pops the screen.
67
+ public struct DismissAction: Sendable {
68
+ let action: @MainActor () -> Void
69
+ /// What this action dismisses (a screen of a stack, a sheet), set by the
70
+ /// runtime, which re-creates the action on every pass: equal identities
71
+ /// make the environments of two passes the same (see `_Sameness`).
72
+ let identity: _RuntimeKey?
73
+
74
+ init(identity: _RuntimeKey? = nil, _ action: @escaping @MainActor () -> Void) {
75
+ self.identity = identity
76
+ self.action = action
77
+ }
78
+
79
+ @MainActor public func callAsFunction() { action() }
80
+ }
81
+
82
+ /// Values propagated down the view tree.
83
+ public struct EnvironmentValues {
84
+ fileprivate var storage: [ObjectIdentifier: Any] = [:]
85
+
86
+ public init() {}
87
+
88
+ /// Whether every stored value is the same as in `other` (`_Sameness`).
89
+ func _sameStorage(as other: EnvironmentValues) -> Bool {
90
+ guard storage.count == other.storage.count else { return false }
91
+ var budget = _Sameness.budget
92
+ for (key, value) in storage {
93
+ guard let otherValue = other.storage[key], _Sameness.same(value, otherValue, budget: &budget) else { return false }
94
+ }
95
+ return true
96
+ }
97
+
98
+ public subscript<K: EnvironmentKey>(key: K.Type) -> K.Value {
99
+ get {
100
+ // An absent entry must fall back to the default even for optional
101
+ // values: `nil as? Optional<V>` would succeed as `.some(nil)`.
102
+ guard let stored = storage[ObjectIdentifier(key)] else { return Self._default(of: key) }
103
+ return stored as? K.Value ?? Self._default(of: key)
104
+ }
105
+ set { storage[ObjectIdentifier(key)] = newValue }
106
+ }
107
+
108
+ public var colorScheme: ColorScheme {
109
+ get { self[_ColorSchemeKey.self] }
110
+ set { self[_ColorSchemeKey.self] = newValue }
111
+ }
112
+
113
+ public var dismiss: DismissAction {
114
+ get { self[_DismissKey.self] }
115
+ set { self[_DismissKey.self] = newValue }
116
+ }
117
+
118
+ public var dynamicTypeSize: DynamicTypeSize {
119
+ get { self[_DynamicTypeSizeKey.self] }
120
+ set { self[_DynamicTypeSizeKey.self] = newValue }
121
+ }
122
+
123
+ public var isEnabled: Bool {
124
+ get { self[_IsEnabledKey.self] }
125
+ set { self[_IsEnabledKey.self] = newValue }
126
+ }
127
+
128
+ /// `.compact` until the renderer's first `environment` event says otherwise.
129
+ public var horizontalSizeClass: UserInterfaceSizeClass? {
130
+ get { self[_HorizontalSizeClassKey.self] }
131
+ set { self[_HorizontalSizeClassKey.self] = newValue }
132
+ }
133
+
134
+ /// Always `.regular`: the browser never reports a vertically compact window.
135
+ public var verticalSizeClass: UserInterfaceSizeClass? {
136
+ get { self[_VerticalSizeClassKey.self] }
137
+ set { self[_VerticalSizeClassKey.self] = newValue }
138
+ }
139
+
140
+ /// `.leftToRight`: the renderer lays out left to right, whatever the
141
+ /// locale. A view may set it (`.environment(\.layoutDirection, …)`) for
142
+ /// the views it contains, which read it; the layout does not mirror.
143
+ public var layoutDirection: LayoutDirection {
144
+ get { self[_LayoutDirectionKey.self] }
145
+ set { self[_LayoutDirectionKey.self] = newValue }
146
+ }
147
+
148
+ /// The font `.font(_:)` set above this view (a text style or a size;
149
+ /// `.fontWeight` and `.bold` leave it as is), nil for the default body font.
150
+ public var font: Font? {
151
+ get { self[_FontKey.self] }
152
+ set { self[_FontKey.self] = newValue }
153
+ }
154
+
155
+ /// Pixels per point: 3, the iPhone the page stands for (`UIScreen.main.scale`).
156
+ public var displayScale: CGFloat {
157
+ get { self[_DisplayScaleKey.self] }
158
+ set { self[_DisplayScaleKey.self] = newValue }
159
+ }
160
+
161
+ /// One pixel, in points.
162
+ public var pixelLength: CGFloat { 1 / displayScale }
163
+
164
+ var _buttonStyle: String {
165
+ get { self[_ButtonStyleKey.self] }
166
+ set { self[_ButtonStyleKey.self] = newValue }
167
+ }
168
+
169
+ var _textFieldStyle: String {
170
+ get { self[_TextFieldStyleKey.self] }
171
+ set { self[_TextFieldStyleKey.self] = newValue }
172
+ }
173
+
174
+ // Objects supplied by `.environmentObject(_:)`, keyed by their type. A
175
+ // type's identifier never collides with an `EnvironmentKey`'s.
176
+ func _object<T: AnyObject>(_ type: T.Type) -> T? {
177
+ storage[ObjectIdentifier(type)] as? T
178
+ }
179
+
180
+ mutating func _setObject<T: AnyObject>(_ object: T) {
181
+ storage[ObjectIdentifier(T.self)] = object
182
+ }
183
+
184
+ /// The object stored for a type, looked up dynamically (`@Environment(Favorites.self)`).
185
+ func _anyObject(_ type: Any.Type) -> Any? {
186
+ storage[ObjectIdentifier(type)]
187
+ }
188
+
189
+ /// Stores `object` under its dynamic type, for `@Environment(Type.self)` and `@EnvironmentObject`.
190
+ mutating func _setAnyObject(_ object: AnyObject) {
191
+ storage[ObjectIdentifier(type(of: object))] = object
192
+ }
193
+ }
194
+
195
+ extension EnvironmentValues: CustomStringConvertible {
196
+ public var description: String { "EnvironmentValues(\(storage.count) values)" }
197
+ }
198
+
199
+ /// Lets `@Environment(Type.self)` hand back nil for an optional type that was not supplied.
200
+ protocol _OptionalValue {
201
+ static var _none: Self { get }
202
+ }
203
+ extension Optional: _OptionalValue {
204
+ static var _none: Self { nil }
205
+ }
206
+
207
+ enum _ColorSchemeKey: EnvironmentKey { static let defaultValue = ColorScheme.light }
208
+ enum _DismissKey: EnvironmentKey { static let defaultValue = DismissAction {} }
209
+ enum _IsEnabledKey: EnvironmentKey { static let defaultValue = true }
210
+ enum _DynamicTypeSizeKey: EnvironmentKey { static let defaultValue = DynamicTypeSize.large }
211
+ enum _HorizontalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .compact }
212
+ enum _VerticalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .regular }
213
+ enum _LayoutDirectionKey: EnvironmentKey { static let defaultValue = LayoutDirection.leftToRight }
214
+ enum _FontKey: EnvironmentKey { static let defaultValue: Font? = nil }
215
+ enum _DisplayScaleKey: EnvironmentKey { static let defaultValue: CGFloat = 3 }
216
+ enum _ButtonStyleKey: EnvironmentKey { static let defaultValue = "automatic" }
217
+ enum _TextFieldStyleKey: EnvironmentKey { static let defaultValue = "plain" }
218
+
219
+ // MARK: - @Environment
220
+
221
+ final class _EnvironmentBox {
222
+ var value: Any?
223
+ }
224
+
225
+ /// Views expose their `Environment` properties to the runtime through this protocol.
226
+ protocol _EnvironmentProperty: _RuntimeProperty {
227
+ func _resolve(in environment: EnvironmentValues)
228
+ }
229
+
230
+ /// A property wrapper from another module (SwiftData's `@Query`) that reads
231
+ /// the environment of the view it belongs to: the runtime calls `_resolve`
232
+ /// before each run of the view's body, as for `@Environment`. Unlike
233
+ /// `@Environment`, such a property is part of the view's value when the
234
+ /// runtime decides whether a re-created view is unchanged (Phase 16), so a
235
+ /// parent passing a different query re-runs the view.
236
+ public protocol _EnvironmentReading: _RuntimeProperty {
237
+ func _resolve(in environment: EnvironmentValues)
238
+ }
239
+
240
+ /// Reads a value from the environment the runtime resolved for the view.
241
+ @propertyWrapper
242
+ public struct Environment<Value>: DynamicProperty {
243
+ let keyPath: KeyPath<EnvironmentValues, Value>?
244
+ /// `@Environment(Favorites.self)`: the `@Observable` type to look up (its non-optional form).
245
+ let objectType: Any.Type?
246
+ let box = _EnvironmentBox()
247
+
248
+ public init(_ keyPath: KeyPath<EnvironmentValues, Value>) {
249
+ self.keyPath = keyPath
250
+ objectType = nil
251
+ }
252
+
253
+ /// Reads the object when an ancestor supplied one, else nil.
254
+ public init<T: AnyObject & Observable>(_ objectType: T?.Type) where Value == T? {
255
+ keyPath = nil
256
+ self.objectType = T.self
257
+ }
258
+
259
+ public var wrappedValue: Value {
260
+ if let value = box.value as? Value { return value }
261
+ if let keyPath { return EnvironmentValues()[keyPath: keyPath] }
262
+ if let none = Value.self as? any _OptionalValue.Type { return none._none as! Value }
263
+ fatalError("No Observable object of type \(objectType.map { String(describing: $0) } ?? "\(Value.self)") found. A View.environment(_:) for \(objectType.map { String(describing: $0) } ?? "\(Value.self)") may be missing as an ancestor of this view.")
264
+ }
265
+ }
266
+
267
+ extension Environment where Value: AnyObject & Observable {
268
+ /// Reads the `@Observable` object a `.environment(_:)` ancestor supplied; a
269
+ /// missing object is a programming error, as in SwiftUI.
270
+ public init(_ objectType: Value.Type) {
271
+ keyPath = nil
272
+ self.objectType = objectType
273
+ }
274
+ }
275
+
276
+ extension Environment: _EnvironmentProperty {
277
+ func _resolve(in environment: EnvironmentValues) {
278
+ if let keyPath {
279
+ box.value = environment[keyPath: keyPath]
280
+ } else if let objectType {
281
+ box.value = environment._anyObject(objectType)
282
+ }
283
+ }
284
+ }
285
+
286
+ // MARK: - .environment(_:_:)
287
+
288
+ protocol _EnvironmentModifying: _TraitBearing {
289
+ func _apply(to environment: inout EnvironmentValues)
290
+ }
291
+
292
+ struct _EnvironmentView<Content: View> {
293
+ let content: Content
294
+ let apply: (inout EnvironmentValues) -> Void
295
+ }
296
+ extension _EnvironmentView: _PrimitiveView {}
297
+ extension _EnvironmentView: _GroupView {
298
+ var _children: [any View] { [content] }
299
+ }
300
+ extension _EnvironmentView: _EnvironmentModifying {
301
+ func _apply(to environment: inout EnvironmentValues) { apply(&environment) }
302
+ }
303
+
304
+ nonisolated extension View {
305
+ public func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View {
306
+ _EnvironmentView(content: self) { $0[keyPath: keyPath] = value }
307
+ }
308
+
309
+ /// Supplies an `@Observable` object to `@Environment(T.self)` readers below.
310
+ public func environment<T: AnyObject & Observable>(_ object: T?) -> some View {
311
+ _EnvironmentView(content: self) { if let object { $0._setObject(object) } }
312
+ }
313
+
314
+ /// The color scheme this view wants for the whole window: the subtree
315
+ /// renders in it and the host switches the page's theme (a root `update`
316
+ /// with `colorScheme`). `nil` returns to the viewer's setting.
317
+ public func preferredColorScheme(_ colorScheme: ColorScheme?) -> some View {
318
+ _PreferredColorSchemeView(content: self, scheme: colorScheme)
319
+ }
320
+
321
+ public func dynamicTypeSize(_ size: DynamicTypeSize) -> some View {
322
+ environment(\.dynamicTypeSize, size)
323
+ }
324
+
325
+ /// Clamps the Dynamic Type size the subtree sees to `range` (`...DynamicTypeSize.xxxLarge`).
326
+ public func dynamicTypeSize<T: RangeExpression>(_ range: T) -> some View where T.Bound == DynamicTypeSize {
327
+ _EnvironmentView(content: self) { environment in
328
+ let current = environment.dynamicTypeSize
329
+ if range.contains(current) { return }
330
+ // The nearest size inside the range.
331
+ let ordered = DynamicTypeSize.allCases.filter { range.contains($0) }
332
+ if let nearest = ordered.min(by: { abs($0.rawValue - current.rawValue) < abs($1.rawValue - current.rawValue) }) {
333
+ environment.dynamicTypeSize = nearest
334
+ }
335
+ }
336
+ }
337
+ }
338
+
339
+ /// Read by the runtime, which tells the host; also sets the environment's scheme.
340
+ protocol _PreferredColorSchemeModifying: _TraitBearing {
341
+ var _preferredColorScheme: ColorScheme? { get }
342
+ }
343
+
344
+ struct _PreferredColorSchemeView<Content: View> {
345
+ let content: Content
346
+ let scheme: ColorScheme?
347
+ }
348
+ extension _PreferredColorSchemeView: _PrimitiveView {}
349
+ extension _PreferredColorSchemeView: _GroupView {
350
+ var _children: [any View] { [content] }
351
+ }
352
+ extension _PreferredColorSchemeView: _EnvironmentModifying {
353
+ func _apply(to environment: inout EnvironmentValues) {
354
+ if let scheme { environment.colorScheme = scheme }
355
+ }
356
+ }
357
+ extension _PreferredColorSchemeView: _PreferredColorSchemeModifying {
358
+ var _preferredColorScheme: ColorScheme? { scheme }
359
+ }
360
+
361
+ // MARK: - @Bindable
362
+
363
+ /// Creates bindings to the properties of an `@Observable` object.
364
+ @propertyWrapper
365
+ @dynamicMemberLookup
366
+ public struct Bindable<Value: AnyObject & Observable> {
367
+ public var wrappedValue: Value
368
+
369
+ public init(wrappedValue: Value) { self.wrappedValue = wrappedValue }
370
+ public init(_ wrappedValue: Value) { self.wrappedValue = wrappedValue }
371
+
372
+ public var projectedValue: Bindable<Value> { self }
373
+
374
+ public subscript<Subject>(dynamicMember keyPath: ReferenceWritableKeyPath<Value, Subject>) -> Binding<Subject> {
375
+ let object = wrappedValue
376
+ return Binding(get: { object[keyPath: keyPath] }, set: { object[keyPath: keyPath] = $0 })
377
+ }
378
+ }
379
+
380
+ // MARK: - @ScaledMetric
381
+
382
+ /// A value that scales with the Dynamic Type size, like SwiftUI's. The scale
383
+ /// factors follow the body text style's step sizes (17pt at `large`).
384
+ @propertyWrapper
385
+ public struct ScaledMetric<Value: BinaryFloatingPoint>: DynamicProperty {
386
+ let base: Value
387
+ let box = _EnvironmentBox()
388
+
389
+ public init(wrappedValue: Value, relativeTo textStyle: Font.TextStyle = .body) {
390
+ base = wrappedValue
391
+ }
392
+
393
+ public var wrappedValue: Value {
394
+ let size = (box.value as? DynamicTypeSize) ?? .large
395
+ return base * Value(size._bodyScale)
396
+ }
397
+ }
398
+
399
+ extension ScaledMetric: _EnvironmentProperty {
400
+ func _resolve(in environment: EnvironmentValues) {
401
+ box.value = environment.dynamicTypeSize
402
+ }
403
+ }
404
+
405
+ extension DynamicTypeSize {
406
+ /// Body point size at this setting divided by the default 17.
407
+ var _bodyScale: Double {
408
+ let bodySize: Double = switch self {
409
+ case .xSmall: 14
410
+ case .small: 15
411
+ case .medium: 16
412
+ case .large: 17
413
+ case .xLarge: 19
414
+ case .xxLarge: 21
415
+ case .xxxLarge: 23
416
+ case .accessibility1: 28
417
+ case .accessibility2: 33
418
+ case .accessibility3: 40
419
+ case .accessibility4: 47
420
+ case .accessibility5: 53
421
+ }
422
+ return bodySize / 17
423
+ }
424
+ }
425
+
426
+ // MARK: - Keys bridged from UIKit traits
427
+
428
+ /// A key whose value, until a view sets it, comes from elsewhere: UIKit's
429
+ /// `UITraitBridgedEnvironmentKey` (iOS 17) reads it from the current traits.
430
+ public protocol _BridgedEnvironmentKey: EnvironmentKey {
431
+ static var _bridgedDefault: Any { get }
432
+ }
433
+
434
+ extension EnvironmentValues {
435
+ static func _default<K: EnvironmentKey>(of key: K.Type) -> K.Value {
436
+ if let bridged = key as? any _BridgedEnvironmentKey.Type, let value = bridged._bridgedDefault as? K.Value { return value }
437
+ return K.defaultValue
438
+ }
439
+ }
@@ -0,0 +1,6 @@
1
+ /// `Environment` is `Sendable` when its value is, as in SwiftUI, so a
2
+ /// `Sendable` style or modifier may declare `@Environment` properties
3
+ /// (ButtonKit's shake style reads `accessibilityReduceMotion`). The runtime
4
+ /// resolves the property into its box on the main actor before the body
5
+ /// runs, and only the body reads it.
6
+ extension Environment: @unchecked Sendable where Value: Sendable {}
@@ -0,0 +1,137 @@
1
+ /// `@FocusState`, `.focused(_:)`, `.onSubmit` and `.submitLabel` for text
2
+ /// fields (docs/ops-protocol.md, "Phase 12"). A field inside `.focused(...)`
3
+ /// carries a `focused` prop the host honors (focusing or blurring its input)
4
+ /// and reports `focus` events back; a field inside `.onSubmit` carries
5
+ /// `submit: true` and reports `submit` events (the Enter key).
6
+
7
+ // MARK: - @FocusState
8
+
9
+ /// Which view has keyboard focus: a `Bool` for one field, or an optional
10
+ /// `Hashable` naming one of several. Storage is a `State`, so it persists
11
+ /// across re-renders like SwiftUI's.
12
+ @propertyWrapper
13
+ public struct FocusState<Value: Hashable>: DynamicProperty {
14
+ let state: State<Value>
15
+
16
+ public init() where Value == Bool {
17
+ state = State(wrappedValue: false)
18
+ }
19
+
20
+ public init<T: Hashable>() where Value == T? {
21
+ state = State(wrappedValue: nil)
22
+ }
23
+
24
+ public var wrappedValue: Value {
25
+ get { state.wrappedValue }
26
+ nonmutating set { state.wrappedValue = newValue }
27
+ }
28
+
29
+ public var projectedValue: FocusState<Value>.Binding { Binding(state: state) }
30
+
31
+ /// `$focus`: what `.focused(_:)` and `.focused(_:equals:)` take.
32
+ @propertyWrapper
33
+ public struct Binding {
34
+ let state: State<Value>
35
+
36
+ public var wrappedValue: Value {
37
+ get { state.wrappedValue }
38
+ nonmutating set { state.wrappedValue = newValue }
39
+ }
40
+
41
+ public var projectedValue: FocusState<Value>.Binding { self }
42
+ }
43
+ }
44
+
45
+ extension FocusState: _StateProperty {
46
+ var _box: any _AnyStateBox { state.box }
47
+ }
48
+
49
+ /// What a focused field reads from its environment: whether it should have
50
+ /// focus now, and how to record a focus change the host reports.
51
+ struct _FocusRequest {
52
+ let isFocused: () -> Bool
53
+ let setFocused: (Bool) -> Void
54
+ }
55
+
56
+ enum _FocusKey: EnvironmentKey { nonisolated(unsafe) static let defaultValue: _FocusRequest? = nil }
57
+ enum _OnSubmitKey: EnvironmentKey { nonisolated(unsafe) static let defaultValue: (() -> Void)? = nil }
58
+ enum _SubmitLabelKey: EnvironmentKey { static let defaultValue: String? = nil }
59
+
60
+ extension EnvironmentValues {
61
+ var _focus: _FocusRequest? {
62
+ get { self[_FocusKey.self] }
63
+ set { self[_FocusKey.self] = newValue }
64
+ }
65
+ var _onSubmit: (() -> Void)? {
66
+ get { self[_OnSubmitKey.self] }
67
+ set { self[_OnSubmitKey.self] = newValue }
68
+ }
69
+ var _submitLabel: String? {
70
+ get { self[_SubmitLabelKey.self] }
71
+ set { self[_SubmitLabelKey.self] = newValue }
72
+ }
73
+ }
74
+
75
+ nonisolated extension View {
76
+ /// Binds the field's focus to a `@FocusState var isFocused: Bool`.
77
+ public func focused(_ binding: FocusState<Bool>.Binding) -> some View {
78
+ _EnvironmentView(content: self) {
79
+ $0._focus = _FocusRequest(isFocused: { binding.wrappedValue }, setFocused: { binding.wrappedValue = $0 })
80
+ }
81
+ }
82
+
83
+ /// Binds a field's or text editor's focus to a plain binding: UIKit's
84
+ /// text views (`becomeFirstResponder`) drawn by a representable.
85
+ public func _focused(_ isFocused: Binding<Bool>) -> some View {
86
+ _EnvironmentView(content: self) {
87
+ $0._focus = _FocusRequest(isFocused: { isFocused.wrappedValue }, setFocused: { isFocused.wrappedValue = $0 })
88
+ }
89
+ }
90
+
91
+ /// Binds the field's focus to one case of a `@FocusState var field: Field?`.
92
+ public func focused<Value: Hashable>(_ binding: FocusState<Value?>.Binding, equals value: Value) -> some View {
93
+ _EnvironmentView(content: self) {
94
+ $0._focus = _FocusRequest(
95
+ isFocused: { binding.wrappedValue == value },
96
+ setFocused: { focused in
97
+ if focused {
98
+ binding.wrappedValue = value
99
+ } else if binding.wrappedValue == value {
100
+ binding.wrappedValue = nil
101
+ }
102
+ })
103
+ }
104
+ }
105
+ }
106
+
107
+ // MARK: - onSubmit / submitLabel
108
+
109
+ public struct SubmitTriggers: OptionSet, Sendable {
110
+ public let rawValue: Int
111
+ public init(rawValue: Int) { self.rawValue = rawValue }
112
+ public static let text = SubmitTriggers(rawValue: 1)
113
+ public static let search = SubmitTriggers(rawValue: 2)
114
+ }
115
+
116
+ /// The label of the keyboard's return key (`enterkeyhint` in the browser).
117
+ public enum SubmitLabel: String, Hashable, Sendable {
118
+ case done, go, send, join, route, search, `return`, next, `continue`
119
+ }
120
+
121
+ nonisolated extension View {
122
+ /// Runs `action` when a text field in this view submits (the Enter key).
123
+ public func onSubmit(of triggers: SubmitTriggers = .text, _ action: @escaping () -> Void) -> some View {
124
+ _EnvironmentView(content: self) { $0._onSubmit = action }
125
+ }
126
+
127
+ public func submitLabel(_ label: SubmitLabel) -> some View {
128
+ _EnvironmentView(content: self) { $0._submitLabel = label.rawValue }
129
+ }
130
+ }
131
+
132
+ /// A host view whose event handler needs the environment (the focus and
133
+ /// submit closures a text field inherits); checked by the runtime ahead of
134
+ /// `_HostView._handler`.
135
+ protocol _EnvironmentHandling: _TraitBearing {
136
+ func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)?
137
+ }