@swiftbrowser/swift 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +0 -4
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +68 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +125 -10
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +100 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +26 -10
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +71 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +88 -12
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +14 -4
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +168 -39
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +86 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +46 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +524 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +41 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -13,6 +13,7 @@ public struct Menu<Label: View, Content: View> {
13
13
  }
14
14
 
15
15
  extension Menu where Label == Text {
16
+ @_disfavoredOverload
16
17
  public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
17
18
  self.label = Text(title)
18
19
  self.content = content()
@@ -20,6 +21,7 @@ extension Menu where Label == Text {
20
21
  }
21
22
 
22
23
  extension Menu where Label == SwiftUI.Label<Text, Image> {
24
+ @_disfavoredOverload
23
25
  public init<S: StringProtocol>(_ title: S, systemImage: String, @ViewBuilder content: () -> Content) {
24
26
  self.label = SwiftUI.Label(String(title), systemImage: systemImage)
25
27
  self.content = content()
@@ -39,13 +41,18 @@ public struct ButtonMenuStyle: MenuStyle { public init() {} }
39
41
  extension MenuStyle where Self == DefaultMenuStyle {
40
42
  public static var automatic: DefaultMenuStyle { DefaultMenuStyle() }
41
43
  }
44
+ /// A menu whose label is a borderless button (iOS 14's style, deprecated); drawn as the default.
45
+ public struct BorderlessButtonMenuStyle: MenuStyle { public init() {} }
46
+ extension MenuStyle where Self == BorderlessButtonMenuStyle {
47
+ public static var borderlessButton: BorderlessButtonMenuStyle { BorderlessButtonMenuStyle() }
48
+ }
42
49
  extension MenuStyle where Self == ButtonMenuStyle {
43
50
  public static var button: ButtonMenuStyle { ButtonMenuStyle() }
44
51
  }
45
52
 
46
53
  public enum MenuIndicatorVisibility: Hashable, Sendable { case automatic, visible, hidden }
47
54
 
48
- extension View {
55
+ nonisolated extension View {
49
56
  public func menuStyle<S: MenuStyle>(_ style: S) -> some View { self }
50
57
  public func menuIndicator(_ visibility: MenuIndicatorVisibility) -> some View { self }
51
58
  }
@@ -37,6 +37,10 @@ struct _Style: Equatable {
37
37
  var background: (any ShapeStyle)?
38
38
  var frame: Frame?
39
39
  var cornerRadius: CGFloat?
40
+ /// `.clipShape(.containerRelative)`: clipped to the container's corners.
41
+ var clipsToContainerShape = false
42
+ /// `.background(_:)`: painted in the container's shape (`.containerShape`).
43
+ var backgroundInContainerShape = false
40
44
  var opacity: Double?
41
45
  var disabled: Bool?
42
46
  var layoutPriority: Double?
@@ -88,9 +92,31 @@ public struct _StyledView<Content: View> {
88
92
  let style: _Style
89
93
  }
90
94
  extension _StyledView: _PrimitiveView {}
95
+ extension _StyledView: _EnvironmentModifying {
96
+ /// A font with a text style or a size is the environment's `font` below
97
+ /// (a weight or design alone changes the font the page draws, not that).
98
+ func _apply(to environment: inout EnvironmentValues) {
99
+ if let font = style.font, font.textStyle != nil || font.size != nil { environment.font = font }
100
+ }
101
+ }
91
102
  extension _StyledView: _HostView {
92
103
  var _kind: String { "styled" }
93
- func _props(in environment: EnvironmentValues) -> _JSON { .object(["style": style._json]) }
104
+ func _props(in environment: EnvironmentValues) -> _JSON {
105
+ var resolved = style
106
+ // `.background()` paints the background style in context, which
107
+ // `.backgroundStyle(_:)` sets (the system background by default).
108
+ if style.background is BackgroundStyle, let contextual = environment._backgroundStyle {
109
+ resolved.background = contextual
110
+ }
111
+ // The container's shape (`.containerShape`): a background is painted
112
+ // in it, and `.clipShape(.containerRelative)` clips to it.
113
+ let container = environment._containerShapeRadius
114
+ if style.clipsToContainerShape { resolved.cornerRadius = container ?? 0 }
115
+ if style.backgroundInContainerShape, let container, container > 0 {
116
+ resolved.extras["backgroundCornerRadius"] = .number(container)
117
+ }
118
+ return .object(["style": resolved._json])
119
+ }
94
120
  var _content: [any View] { [content] }
95
121
  }
96
122
 
@@ -104,21 +130,40 @@ public struct _StyledGroup<Content: View> {
104
130
  extension _StyledGroup: _PrimitiveView {}
105
131
  extension _StyledGroup: _GroupView {
106
132
  var _children: [any View] {
107
- if let group = content as? any _GroupView, group._children.count != 1 || group._keys != nil {
108
- return group._children.map { _StyledView(content: AnyView($0), style: style) }
133
+ // A modifier on a `Section` styles its rows (the section stays a direct
134
+ // child of its list, which is how the layout recognizes it).
135
+ if let section = content as? any _SectionView { return [section._stylingRows(style)] }
136
+ if let group = content as? any _GroupView, group._spreads {
137
+ let target = _spreadTarget(group)
138
+ var children = target._children
139
+ // A view of the group that is absent (`if locked { badge }` when not
140
+ // locked) gets no styled element: an empty one would take a stack's
141
+ // spacing. Keyed children keep their places.
142
+ if target._keys == nil { children.removeAll(where: _rendersNothing) }
143
+ return children.map { _StyledView(content: AnyView($0), style: style) }
109
144
  }
110
145
  return [_StyledView(content: content, style: style)]
111
146
  }
112
147
 
113
148
  var _keys: [AnyHashable]? {
114
- if let group = content as? any _GroupView, group._children.count != 1 || group._keys != nil {
115
- return group._keys
149
+ if let group = content as? any _GroupView, group._spreads {
150
+ return _spreadTarget(group)._keys
116
151
  }
117
152
  return nil
118
153
  }
154
+
155
+ // Asked of the content alone: a chain of modifiers asks each level once,
156
+ // where computing the content's children and keys at every level made
157
+ // the cost double with each modifier.
158
+ var _spreads: Bool {
159
+ guard let group = content as? any _GroupView, group._spreads else { return false }
160
+ // A styled section is one child; it keeps the section's keys.
161
+ if content is any _SectionView { return group._keys != nil }
162
+ return true
163
+ }
119
164
  }
120
165
 
121
- extension View {
166
+ nonisolated extension View {
122
167
  func _styled(_ configure: (inout _Style) -> Void) -> _StyledGroup<Self> {
123
168
  var style = _Style()
124
169
  configure(&style)
@@ -139,6 +184,16 @@ extension View {
139
184
  }
140
185
  }
141
186
 
187
+ /// The padding a scene's content takes from its edges: 16 points on
188
+ /// iPhone, as `.padding()`.
189
+ public func scenePadding(_ edges: Edge.Set = .all) -> some View {
190
+ padding(edges, 16)
191
+ }
192
+
193
+ public func scenePadding(_ padding: ScenePadding, edges: Edge.Set = .all) -> some View {
194
+ self.padding(edges, 16)
195
+ }
196
+
142
197
  public func padding(_ length: CGFloat) -> some View {
143
198
  padding(.all, length)
144
199
  }
@@ -182,13 +237,20 @@ extension View {
182
237
  }
183
238
 
184
239
  /// A paint behind the view: a color, gradient or material filling its box.
240
+ /// Painted in the container's shape (`.containerShape`), else the box, as in SwiftUI.
185
241
  public func background<S: ShapeStyle>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View {
186
- _styled { $0.background = style }
242
+ _styled {
243
+ $0.background = style
244
+ $0.backgroundInContainerShape = true
245
+ }
187
246
  }
188
247
 
189
248
  /// The system background color behind the view.
190
249
  public func background(ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View {
191
- _styled { $0.background = BackgroundStyle() }
250
+ _styled {
251
+ $0.background = BackgroundStyle()
252
+ $0.backgroundInContainerShape = true
253
+ }
192
254
  }
193
255
 
194
256
  public func opacity(_ opacity: Double) -> some View {
@@ -227,10 +289,15 @@ extension View {
227
289
 
228
290
  public func scaledToFill() -> some View { aspectRatio(nil, contentMode: .fill) }
229
291
 
230
- /// Identity and compositing hints; accepted for source compatibility and
231
- /// currently without effect on the rendered tree.
232
- public func id<ID: Hashable>(_ id: ID) -> some View { self }
292
+ /// Names the view for `ScrollViewProxy.scrollTo(_:anchor:)` inside a
293
+ /// `ScrollViewReader` (ScrollViewReader.swift); elsewhere it adds nothing
294
+ /// to the rendered tree. A changed id does not reset the view's state.
295
+ public func id<ID: Hashable>(_ id: ID) -> some View {
296
+ _IdentifiedView(content: self, id: AnyHashable(id))
297
+ }
233
298
 
299
+ /// A compositing hint; accepted for source compatibility and currently
300
+ /// without effect on the rendered tree.
234
301
  public func compositingGroup() -> some View { self }
235
302
 
236
303
  public func cornerRadius(_ radius: CGFloat, antialiased: Bool = true) -> some View {
@@ -238,6 +305,15 @@ extension View {
238
305
  }
239
306
 
240
307
  public func clipShape<S: Shape>(_ shape: S) -> some View {
241
- _styled { $0.cornerRadius = shape._cornerRadius }
308
+ _styled {
309
+ $0.cornerRadius = shape._cornerRadius
310
+ $0.clipsToContainerShape = shape is ContainerRelativeShape
311
+ }
242
312
  }
243
313
  }
314
+
315
+ /// The kind of scene padding (`.minimum`); iPhone has one.
316
+ public struct ScenePadding: Equatable, Sendable {
317
+ public static let minimum = ScenePadding()
318
+ public static let navigationBar = ScenePadding()
319
+ }
@@ -0,0 +1,100 @@
1
+ // Smaller modifiers Ice Cubes uses.
2
+ //
3
+ // Drawn: `.border(_:width:)` (a stroke inside the view's box, as an
4
+ // overlay), `.edgesIgnoringSafeArea(_:)` (`.ignoresSafeArea(edges:)`),
5
+ // `.safeAreaBar(edge:…)` (iOS 26; as `.safeAreaInset`, see
6
+ // ScrollModifiers.swift) and `.scrollPosition(id:anchor:)` (setting the
7
+ // binding scrolls to the view with that `.id`, as `ScrollViewProxy.scrollTo`;
8
+ // scrolling by hand does not update the binding).
9
+ //
10
+ // Accepted without effect: `.buttonBorderShape(_:)` (bordered buttons stay
11
+ // capsules), `.truncationMode(_:)` (text truncates at its tail),
12
+ // `.lineSpacing(_:)` (lines keep the font's line height),
13
+ // `.controlGroupStyle(_:)`, `.listRowHoverEffectDisabled(_:)`,
14
+ // `.searchScopes(_:scopes:)` (no scope bar is drawn under the search field)
15
+ // and, on toolbar items, `.sharedBackgroundVisibility(_:)` and
16
+ // `.matchedTransitionSource(id:in:)`.
17
+
18
+ public struct ButtonBorderShape: Equatable, Sendable {
19
+ let name: String
20
+ public static let automatic = ButtonBorderShape(name: "automatic")
21
+ public static let capsule = ButtonBorderShape(name: "capsule")
22
+ public static let circle = ButtonBorderShape(name: "circle")
23
+ public static let roundedRectangle = ButtonBorderShape(name: "roundedRectangle")
24
+ public static func roundedRectangle(radius: CGFloat) -> ButtonBorderShape { .roundedRectangle }
25
+ }
26
+
27
+ public protocol ControlGroupStyle {}
28
+ public struct AutomaticControlGroupStyle: ControlGroupStyle { public init() {} }
29
+ public struct MenuControlGroupStyle: ControlGroupStyle { public init() {} }
30
+ public struct CompactMenuControlGroupStyle: ControlGroupStyle { public init() {} }
31
+ public struct NavigationControlGroupStyle: ControlGroupStyle { public init() {} }
32
+ public struct PaletteControlGroupStyle: ControlGroupStyle { public init() {} }
33
+ extension ControlGroupStyle where Self == AutomaticControlGroupStyle {
34
+ public static var automatic: AutomaticControlGroupStyle { AutomaticControlGroupStyle() }
35
+ }
36
+ extension ControlGroupStyle where Self == MenuControlGroupStyle {
37
+ public static var menu: MenuControlGroupStyle { MenuControlGroupStyle() }
38
+ }
39
+ extension ControlGroupStyle where Self == CompactMenuControlGroupStyle {
40
+ public static var compactMenu: CompactMenuControlGroupStyle { CompactMenuControlGroupStyle() }
41
+ }
42
+ extension ControlGroupStyle where Self == NavigationControlGroupStyle {
43
+ public static var navigation: NavigationControlGroupStyle { NavigationControlGroupStyle() }
44
+ }
45
+ extension ControlGroupStyle where Self == PaletteControlGroupStyle {
46
+ public static var palette: PaletteControlGroupStyle { PaletteControlGroupStyle() }
47
+ }
48
+
49
+ /// When a search's scope bar shows; accepted.
50
+ public struct SearchScopeActivation: Sendable {
51
+ let name: String
52
+ public static let automatic = SearchScopeActivation(name: "automatic")
53
+ public static let onTextEntry = SearchScopeActivation(name: "onTextEntry")
54
+ public static let onSearchPresentation = SearchScopeActivation(name: "onSearchPresentation")
55
+ }
56
+
57
+ nonisolated extension View {
58
+ public func border<S: ShapeStyle>(_ content: S, width: CGFloat = 1) -> some View {
59
+ overlay { Rectangle().strokeBorder(content, lineWidth: width) }
60
+ }
61
+
62
+ public func edgesIgnoringSafeArea(_ edges: Edge.Set) -> some View {
63
+ ignoresSafeArea(.all, edges: edges)
64
+ }
65
+
66
+ public func safeAreaBar<V: View>(edge: VerticalEdge, alignment: HorizontalAlignment = .center,
67
+ spacing: CGFloat? = nil, @ViewBuilder content: () -> V) -> some View {
68
+ safeAreaInset(edge: edge, alignment: alignment, spacing: spacing, content: content)
69
+ }
70
+
71
+ public func buttonBorderShape(_ shape: ButtonBorderShape) -> some View { self }
72
+ public func truncationMode(_ mode: Text.TruncationMode) -> some View { self }
73
+ public func lineSpacing(_ lineSpacing: CGFloat) -> some View { self }
74
+ public func controlGroupStyle<S: ControlGroupStyle>(_ style: S) -> some View { self }
75
+ public func listRowHoverEffectDisabled(_ disabled: Bool = true) -> some View { self }
76
+
77
+ public func searchScopes<V: Hashable, S: View>(_ scope: Binding<V>, @ViewBuilder scopes: () -> S) -> some View { self }
78
+ public func searchScopes<V: Hashable, S: View>(_ scope: Binding<V>, activation: SearchScopeActivation,
79
+ @ViewBuilder _ scopes: () -> S) -> some View { self }
80
+ }
81
+
82
+ extension View {
83
+ /// Scrolls to the view whose `.id` the binding holds whenever the binding
84
+ /// changes (see the top of this file).
85
+ public func scrollPosition<ID: Hashable>(id: Binding<ID?>, anchor: UnitPoint? = nil) -> some View {
86
+ ScrollViewReader { proxy in
87
+ self.onChange(of: id.wrappedValue) { _, target in
88
+ if let target { proxy.scrollTo(target, anchor: anchor) }
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ extension ToolbarContent {
95
+ /// Accepted: toolbar items share the bar's background.
96
+ public nonisolated func sharedBackgroundVisibility(_ visibility: Visibility) -> Self { self }
97
+
98
+ /// Accepted (no zoom transitions on the page).
99
+ public nonisolated func matchedTransitionSource<ID: Hashable>(id: ID, in namespace: Namespace.ID) -> Self { self }
100
+ }
@@ -0,0 +1,44 @@
1
+ // `@Namespace` and `.matchedGeometryEffect`. A namespace is an identifier
2
+ // that lasts as long as its view is mounted (its storage is a `State`), so
3
+ // code that passes it around or keys things by it (ButtonKit's triggers, Ice
4
+ // Cubes' media viewer) works. The page does not animate a view from one
5
+ // place to another, so `.matchedGeometryEffect` leaves the view as it is:
6
+ // the change happens without the shared-element animation.
7
+
8
+ /// An identifier for a group of matched views, stable while the view is mounted.
9
+ @propertyWrapper
10
+ public struct Namespace: DynamicProperty {
11
+ public struct ID: Hashable, Sendable {
12
+ let value: Int
13
+ }
14
+
15
+ nonisolated(unsafe) static var lastID = 0
16
+ let state: State<ID>
17
+
18
+ public init() {
19
+ Namespace.lastID += 1
20
+ state = State(wrappedValue: ID(value: Namespace.lastID))
21
+ }
22
+
23
+ public var wrappedValue: ID { state.wrappedValue }
24
+ }
25
+
26
+ extension Namespace: _StateProperty {
27
+ var _box: any _AnyStateBox { state.box }
28
+ }
29
+
30
+ /// Which of a view's geometry `.matchedGeometryEffect` would match.
31
+ public struct MatchedGeometryProperties: OptionSet, Hashable, Sendable {
32
+ public let rawValue: UInt32
33
+ public init(rawValue: UInt32) { self.rawValue = rawValue }
34
+ public static let position = MatchedGeometryProperties(rawValue: 1)
35
+ public static let size = MatchedGeometryProperties(rawValue: 2)
36
+ public static let frame: MatchedGeometryProperties = [.position, .size]
37
+ }
38
+
39
+ nonisolated extension View {
40
+ /// The view unchanged: the page has no shared-element animation.
41
+ public func matchedGeometryEffect<ID: Hashable>(id: ID, in namespace: Namespace.ID,
42
+ properties: MatchedGeometryProperties = .frame,
43
+ anchor: UnitPoint = .center, isSource: Bool = true) -> some View { self }
44
+ }
@@ -23,7 +23,7 @@ public struct NavigationPath: Equatable {
23
23
  }
24
24
  }
25
25
 
26
- protocol _NavigationStackView {
26
+ protocol _NavigationStackView: _TraitBearing {
27
27
  var _root: any View { get }
28
28
  var _pushedBox: _StateBox<[_PushedScreen]> { get }
29
29
  /// Value-based path, when the stack was created with one.
@@ -87,7 +87,7 @@ extension _PathScreenValue: _GroupView {
87
87
  var _children: [any View] { [] }
88
88
  }
89
89
 
90
- protocol _DestinationRegistering {
90
+ protocol _DestinationRegistering: _TraitBearing {
91
91
  var _destinationType: ObjectIdentifier { get }
92
92
  var _destinationTypeName: String { get }
93
93
  func _destination(for value: Any) -> (any View)?
@@ -110,7 +110,7 @@ extension _DestinationView: _DestinationRegistering {
110
110
  }
111
111
  }
112
112
 
113
- extension View {
113
+ nonisolated extension View {
114
114
  /// Associates a destination view with values of `data`'s type pushed by
115
115
  /// `NavigationLink(value:)` or appended to the stack's path.
116
116
  public func navigationDestination<D: Hashable, C: View>(for data: D.Type,
@@ -119,7 +119,7 @@ extension View {
119
119
  }
120
120
  }
121
121
 
122
- protocol _NavigationValueLinkView {
122
+ protocol _NavigationValueLinkView: _TraitBearing {
123
123
  var _value: AnyHashable? { get }
124
124
  }
125
125
 
@@ -156,7 +156,7 @@ extension _NavScreenView: _HostView {
156
156
  var _content: [any View] { [content] }
157
157
  }
158
158
 
159
- protocol _NavigationLinkView {
159
+ protocol _NavigationLinkView: _TraitBearing {
160
160
  var _destination: any View { get }
161
161
  }
162
162
 
@@ -180,12 +180,26 @@ public struct NavigationLink<Label: View, Destination: View> {
180
180
  }
181
181
 
182
182
  extension NavigationLink where Label == Text {
183
+ public init(_ titleKey: LocalizedStringKey, @ViewBuilder destination: () -> Destination) {
184
+ self.destination = destination()
185
+ self.value = nil
186
+ self.label = Text(titleKey)
187
+ }
188
+
189
+ public init(_ titleKey: LocalizedStringKey, destination: Destination) {
190
+ self.destination = destination
191
+ self.value = nil
192
+ self.label = Text(titleKey)
193
+ }
194
+
195
+ @_disfavoredOverload
183
196
  public init<S: StringProtocol>(_ title: S, @ViewBuilder destination: () -> Destination) {
184
197
  self.destination = destination()
185
198
  self.value = nil
186
199
  self.label = Text(title)
187
200
  }
188
201
 
202
+ @_disfavoredOverload
189
203
  public init<S: StringProtocol>(_ title: S, destination: Destination) {
190
204
  self.destination = destination
191
205
  self.value = nil
@@ -237,7 +251,7 @@ extension NavigationSplitViewStyle where Self == ProminentDetailNavigationSplitV
237
251
  public static var prominentDetail: ProminentDetailNavigationSplitViewStyle { ProminentDetailNavigationSplitViewStyle() }
238
252
  }
239
253
 
240
- extension View {
254
+ nonisolated extension View {
241
255
  public func navigationSplitViewColumnWidth(_ width: CGFloat) -> some View { self }
242
256
  public func navigationSplitViewColumnWidth(min: CGFloat? = nil, ideal: CGFloat, max: CGFloat? = nil) -> some View { self }
243
257
  public func navigationSplitViewStyle<S: NavigationSplitViewStyle>(_ style: S) -> some View { self }
@@ -247,7 +261,7 @@ extension View {
247
261
  /// renders a `navsplit` of two stacks (regular) or one stack rooted at the
248
262
  /// sidebar that pushes the detail while the sidebar's list selection is set
249
263
  /// (compact). The sidebar's `List(selection:)` is found as it is reconciled.
250
- protocol _NavigationSplitHost {
264
+ protocol _NavigationSplitHost: _TraitBearing {
251
265
  var _sidebar: any View { get }
252
266
  var _detail: any View { get }
253
267
  /// Screens pushed from the compact detail (links inside it).
@@ -332,7 +346,7 @@ public enum NavigationBarItem {
332
346
  }
333
347
  }
334
348
 
335
- protocol _NavigationTitleModifying {
349
+ protocol _NavigationTitleModifying: _TraitBearing {
336
350
  var _title: String? { get }
337
351
  var _displayMode: String? { get }
338
352
  }
@@ -351,7 +365,8 @@ extension _NavigationTitleView: _NavigationTitleModifying {
351
365
  var _displayMode: String? { displayMode }
352
366
  }
353
367
 
354
- extension View {
368
+ nonisolated extension View {
369
+ @_disfavoredOverload
355
370
  public func navigationTitle<S: StringProtocol>(_ title: S) -> some View {
356
371
  _NavigationTitleView(content: self, title: String(title), displayMode: nil)
357
372
  }
@@ -0,0 +1,55 @@
1
+ /// `navigationDestination(isPresented:destination:)` (iOS 16) and
2
+ /// `navigationDestination(item:destination:)` (iOS 17): a destination shown
3
+ /// while a binding says so. The runtime pushes only screens a link or a path
4
+ /// names, so here the destination is presented as a sheet, in a navigation
5
+ /// stack of its own (an approximation: it slides up instead of in, and is
6
+ /// dismissed by swiping it down or with a Back button in its bar). Dismissing
7
+ /// it sets `isPresented` to false, or `item` to nil, as popping does on iOS.
8
+ nonisolated extension View {
9
+ @MainActor
10
+ public func navigationDestination<V: View>(isPresented: Binding<Bool>, @ViewBuilder destination: () -> V) -> some View {
11
+ sheet(isPresented: isPresented) {
12
+ _PresentedDestination(isPresented: isPresented) { destination() }
13
+ }
14
+ }
15
+
16
+ @MainActor
17
+ public func navigationDestination<D: Hashable, C: View>(item: Binding<D?>,
18
+ @ViewBuilder destination: @escaping (D) -> C) -> some View {
19
+ let isPresented = Binding<Bool>(
20
+ get: { item.wrappedValue != nil },
21
+ set: { if !$0 { item.wrappedValue = nil } }
22
+ )
23
+ return sheet(isPresented: isPresented) {
24
+ _PresentedDestination(isPresented: isPresented) {
25
+ if let value = item.wrappedValue { destination(value) }
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ /// A presented destination: its own stack with a Back button.
32
+ struct _PresentedDestination<Content: View>: View {
33
+ let isPresented: Binding<Bool>
34
+ let content: Content
35
+
36
+ init(isPresented: Binding<Bool>, @ViewBuilder content: () -> Content) {
37
+ self.isPresented = isPresented
38
+ self.content = content()
39
+ }
40
+
41
+ var body: some View {
42
+ NavigationStack {
43
+ content
44
+ .toolbar {
45
+ ToolbarItem(placement: .topBarLeading) {
46
+ Button {
47
+ isPresented.wrappedValue = false
48
+ } label: {
49
+ Label("Back", systemImage: "chevron.backward")
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
@@ -72,6 +72,20 @@ public final class ObservableObjectPublisher {
72
72
  subscribers[ObjectIdentifier(owner)] = (_WeakOwner(owner), onChange)
73
73
  }
74
74
 
75
+ /// Combine's subscriptions (Sources/Combine/ObjectWillChange.swift):
76
+ /// `onChange` runs on each `send()` while the returned token is alive
77
+ /// and not unsubscribed.
78
+ public func _subscribe(_ onChange: @escaping () -> Void) -> AnyObject {
79
+ let token = _WeakOwner(self)
80
+ _subscribe(owner: token, onChange)
81
+ return token
82
+ }
83
+
84
+ /// Ends a subscription `_subscribe(_:)` made.
85
+ public func _unsubscribe(_ token: AnyObject) {
86
+ subscribers[ObjectIdentifier(token)] = nil
87
+ }
88
+
75
89
  static func _publisher(for object: AnyObject) -> ObservableObjectPublisher {
76
90
  let id = ObjectIdentifier(object)
77
91
  if let existing = registry[id], existing._owner === object { return existing }
@@ -118,7 +132,7 @@ public struct Published<Value> {
118
132
 
119
133
  /// Views expose properties that observe an `ObservableObject` through this
120
134
  /// protocol; the runtime finds them by reflection and wires invalidation.
121
- protocol _ObservingProperty {
135
+ protocol _ObservingProperty: _RuntimeProperty {
122
136
  /// Subscribes `onChange` to the observed object on behalf of `owner`
123
137
  /// (the mounted view), see `ObservableObjectPublisher._subscribe`.
124
138
  func _observe(owner: AnyObject, _ onChange: @escaping () -> Void)
@@ -271,7 +285,7 @@ extension EnvironmentObject: _ObservingProperty {
271
285
  }
272
286
  }
273
287
 
274
- extension View {
288
+ nonisolated extension View {
275
289
  /// Supplies `object` to every `EnvironmentObject` of its type in the subtree.
276
290
  public func environmentObject<T: ObservableObject>(_ object: T) -> some View {
277
291
  _EnvironmentView(content: self) { $0._setObject(object) }