@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
@@ -7,6 +7,8 @@
7
7
  /// Increments or decrements a value. Kind `stepper`, props `canIncrement` /
8
8
  /// `canDecrement`; the child is the label (dropped by `labelsHidden`). A
9
9
  /// `step` event with `1` / `-1` applies the step within the bounds.
10
+ import Foundation
11
+
10
12
  public struct Stepper<Label: View> {
11
13
  let label: Label
12
14
  let increment: () -> Void
@@ -51,6 +53,7 @@ public struct Stepper<Label: View> {
51
53
  }
52
54
 
53
55
  extension Stepper where Label == Text {
56
+ @_disfavoredOverload
54
57
  public init<S: StringProtocol>(_ title: S, onIncrement: (() -> Void)?, onDecrement: (() -> Void)?,
55
58
  onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
56
59
  self.init(label: { Text(title) }, onIncrement: onIncrement, onDecrement: onDecrement,
@@ -211,13 +214,6 @@ extension Slider: _HostView {
211
214
 
212
215
  // MARK: - DatePicker
213
216
 
214
- /// A value a `DatePicker` can select: a point in time as seconds since 1970
215
- /// (UTC). `FoundationLite` conforms `Date`; the shim itself has no date type.
216
- public protocol _DatePickerValue {
217
- var _secondsSince1970: Double { get }
218
- init(_secondsSince1970: Double)
219
- }
220
-
221
217
  /// Which parts of a date a `DatePicker` shows.
222
218
  public struct DatePickerComponents: OptionSet, Sendable {
223
219
  public let rawValue: UInt
@@ -243,10 +239,10 @@ public struct DatePicker<Label: View> {
243
239
  let components: DatePickerComponents
244
240
  let set: (Double) -> Void
245
241
 
246
- init<V: _DatePickerValue>(selection: Binding<V>, minimum: Double?, maximum: Double?,
242
+ init(selection: Binding<Date>, minimum: Double?, maximum: Double?,
247
243
  displayedComponents: DatePickerComponents, label: Label) {
248
244
  self.label = label
249
- seconds = selection.wrappedValue._secondsSince1970
245
+ seconds = selection.wrappedValue.timeIntervalSince1970
250
246
  self.minimum = minimum
251
247
  self.maximum = maximum
252
248
  components = displayedComponents
@@ -254,77 +250,81 @@ public struct DatePicker<Label: View> {
254
250
  var clamped = value
255
251
  if let minimum { clamped = max(clamped, minimum) }
256
252
  if let maximum { clamped = min(clamped, maximum) }
257
- selection.wrappedValue = V(_secondsSince1970: clamped)
253
+ selection.wrappedValue = Date(timeIntervalSince1970: clamped)
258
254
  }
259
255
  }
260
256
 
261
- public init<V: _DatePickerValue>(selection: Binding<V>,
257
+ public init(selection: Binding<Date>,
262
258
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
263
259
  @ViewBuilder label: () -> Label) {
264
260
  self.init(selection: selection, minimum: nil, maximum: nil, displayedComponents: displayedComponents,
265
261
  label: label())
266
262
  }
267
263
 
268
- public init<V: _DatePickerValue>(selection: Binding<V>, in range: ClosedRange<V>,
264
+ public init(selection: Binding<Date>, in range: ClosedRange<Date>,
269
265
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
270
266
  @ViewBuilder label: () -> Label) {
271
- self.init(selection: selection, minimum: range.lowerBound._secondsSince1970,
272
- maximum: range.upperBound._secondsSince1970, displayedComponents: displayedComponents,
267
+ self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970,
268
+ maximum: range.upperBound.timeIntervalSince1970, displayedComponents: displayedComponents,
273
269
  label: label())
274
270
  }
275
271
 
276
- public init<V: _DatePickerValue>(selection: Binding<V>, in range: PartialRangeFrom<V>,
272
+ public init(selection: Binding<Date>, in range: PartialRangeFrom<Date>,
277
273
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
278
274
  @ViewBuilder label: () -> Label) {
279
- self.init(selection: selection, minimum: range.lowerBound._secondsSince1970, maximum: nil,
275
+ self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970, maximum: nil,
280
276
  displayedComponents: displayedComponents, label: label())
281
277
  }
282
278
 
283
- public init<V: _DatePickerValue>(selection: Binding<V>, in range: PartialRangeThrough<V>,
279
+ public init(selection: Binding<Date>, in range: PartialRangeThrough<Date>,
284
280
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
285
281
  @ViewBuilder label: () -> Label) {
286
- self.init(selection: selection, minimum: nil, maximum: range.upperBound._secondsSince1970,
282
+ self.init(selection: selection, minimum: nil, maximum: range.upperBound.timeIntervalSince1970,
287
283
  displayedComponents: displayedComponents, label: label())
288
284
  }
289
285
  }
290
286
 
291
287
  extension DatePicker where Label == Text {
292
- public init<S: StringProtocol, V: _DatePickerValue>(_ title: S, selection: Binding<V>,
288
+ @_disfavoredOverload
289
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>,
293
290
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
294
291
  self.init(selection: selection, displayedComponents: displayedComponents) { Text(title) }
295
292
  }
296
293
 
297
- public init<S: StringProtocol, V: _DatePickerValue>(_ title: S, selection: Binding<V>, in range: ClosedRange<V>,
294
+ @_disfavoredOverload
295
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: ClosedRange<Date>,
298
296
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
299
297
  self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
300
298
  }
301
299
 
302
- public init<S: StringProtocol, V: _DatePickerValue>(_ title: S, selection: Binding<V>, in range: PartialRangeFrom<V>,
300
+ @_disfavoredOverload
301
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
303
302
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
304
303
  self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
305
304
  }
306
305
 
307
- public init<S: StringProtocol, V: _DatePickerValue>(_ title: S, selection: Binding<V>, in range: PartialRangeThrough<V>,
306
+ @_disfavoredOverload
307
+ public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
308
308
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
309
309
  self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
310
310
  }
311
311
 
312
- public init<V: _DatePickerValue>(_ titleKey: LocalizedStringKey, selection: Binding<V>,
312
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>,
313
313
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
314
314
  self.init(selection: selection, displayedComponents: displayedComponents) { Text(titleKey) }
315
315
  }
316
316
 
317
- public init<V: _DatePickerValue>(_ titleKey: LocalizedStringKey, selection: Binding<V>, in range: ClosedRange<V>,
317
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: ClosedRange<Date>,
318
318
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
319
319
  self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
320
320
  }
321
321
 
322
- public init<V: _DatePickerValue>(_ titleKey: LocalizedStringKey, selection: Binding<V>, in range: PartialRangeFrom<V>,
322
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
323
323
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
324
324
  self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
325
325
  }
326
326
 
327
- public init<V: _DatePickerValue>(_ titleKey: LocalizedStringKey, selection: Binding<V>, in range: PartialRangeThrough<V>,
327
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
328
328
  displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
329
329
  self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
330
330
  }
@@ -369,14 +369,15 @@ extension DatePickerStyle where Self == WheelDatePickerStyle {
369
369
  public static var wheel: WheelDatePickerStyle { WheelDatePickerStyle() }
370
370
  }
371
371
 
372
- extension View {
372
+ nonisolated extension View {
373
373
  public func datePickerStyle<S: DatePickerStyle>(_ style: S) -> some View { self }
374
374
  }
375
375
 
376
376
  // MARK: - TextEditor
377
377
 
378
378
  /// Multi-line editable text. Kind `texteditor`, props `text`; `text` events
379
- /// set the binding, as for `textfield`.
379
+ /// set the binding, as for `textfield`. Inside `.focused(...)` (or UIKit's
380
+ /// `_focused`) it carries `focused` and handles `focus` events, as a field does.
380
381
  public struct TextEditor {
381
382
  let text: Binding<String>
382
383
  public init(text: Binding<String>) { self.text = text }
@@ -384,11 +385,27 @@ public struct TextEditor {
384
385
  extension TextEditor: _PrimitiveView {}
385
386
  extension TextEditor: _HostView {
386
387
  var _kind: String { "texteditor" }
387
- func _props(in environment: EnvironmentValues) -> _JSON { .object(["text": .string(text.wrappedValue)]) }
388
- var _handler: ((_JSON) -> Void)? {
388
+ func _props(in environment: EnvironmentValues) -> _JSON {
389
+ var props: [String: _JSON] = ["text": .string(text.wrappedValue)]
390
+ if let focus = environment._focus { props["focused"] = .bool(focus.isFocused()) }
391
+ return .object(props)
392
+ }
393
+ var _handler: ((_JSON) -> Void)? { _handler(in: EnvironmentValues()) }
394
+ }
395
+ extension TextEditor: _EnvironmentHandling {
396
+ /// Text (`"value"` as a string) and `focus` (`{type, value: Bool}`) events.
397
+ func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)? {
389
398
  let text = self.text
399
+ let focus = environment._focus
390
400
  return { payload in
391
- if case .string(let value) = payload { text.wrappedValue = value }
401
+ switch payload {
402
+ case .string(let value):
403
+ text.wrappedValue = value
404
+ case .object(let fields):
405
+ if case .string("focus")? = fields["type"], case .bool(let focused)? = fields["value"] { focus?.setFocused(focused) }
406
+ default:
407
+ break
408
+ }
392
409
  }
393
410
  }
394
411
  }
@@ -0,0 +1,130 @@
1
+ // `PhaseAnimator` and `.phaseAnimator` (iOS 17): the content goes through
2
+ // its phases one after another, each change animated with the animation the
3
+ // phase asks for. A task moves to the next phase once the previous change's
4
+ // animation has had its time (its duration and delay), as SwiftUI waits for
5
+ // it to finish. Without a trigger the phases cycle while the view is shown;
6
+ // with one, each change of the trigger runs through them once, back to the
7
+ // first.
8
+
9
+ public struct PhaseAnimator<Phase: Equatable, Content: View>: View {
10
+ let phases: [Phase]
11
+ let trigger: _PhaseTrigger?
12
+ let content: (Phase) -> Content
13
+ let animation: (Phase) -> Animation?
14
+
15
+ @State private var index = 0
16
+ @State private var runs = 0
17
+
18
+ /// Cycles through `phases` while the view is shown.
19
+ public init(_ phases: some Sequence<Phase>,
20
+ @ViewBuilder content: @escaping (Phase) -> Content,
21
+ animation: @escaping (Phase) -> Animation? = { _ in .default }) {
22
+ self.phases = Array(phases)
23
+ trigger = nil
24
+ self.content = content
25
+ self.animation = animation
26
+ }
27
+
28
+ /// Runs through `phases` once each time `trigger` changes.
29
+ public init(_ phases: some Sequence<Phase>, trigger: some Equatable,
30
+ @ViewBuilder content: @escaping (Phase) -> Content,
31
+ animation: @escaping (Phase) -> Animation? = { _ in .default }) {
32
+ self.phases = Array(phases)
33
+ self.trigger = _PhaseTrigger(trigger)
34
+ self.content = content
35
+ self.animation = animation
36
+ }
37
+
38
+ public var body: some View {
39
+ let phase = phases.isEmpty ? nil : phases[min(index, phases.count - 1)]
40
+ Group {
41
+ if let phase { content(phase) }
42
+ }
43
+ .onChange(of: trigger) { runs += 1 }
44
+ .task(id: runs) {
45
+ if trigger == nil {
46
+ await cycle()
47
+ } else if runs > 0 {
48
+ await runOnce()
49
+ }
50
+ }
51
+ }
52
+
53
+ /// Moves to the phase at `next`, animated, and waits for the animation.
54
+ @MainActor
55
+ private func advance(to next: Int) async -> Bool {
56
+ let animation = animation(phases[next])
57
+ withAnimation(animation) { index = next }
58
+ // The timeline's clock: virtual in tests, the executor's in headless runs.
59
+ await _TimelineClock.sleep(max(0.05, animation.map { $0._settlingTime } ?? 0.05))
60
+ return !Task.isCancelled
61
+ }
62
+
63
+ @MainActor
64
+ private func cycle() async {
65
+ guard phases.count > 1 else { return }
66
+ while !Task.isCancelled {
67
+ guard await advance(to: (index + 1) % phases.count) else { return }
68
+ }
69
+ }
70
+
71
+ @MainActor
72
+ private func runOnce() async {
73
+ guard phases.count > 1 else { return }
74
+ for next in Array(1..<phases.count) + [0] {
75
+ guard await advance(to: next) else { return }
76
+ }
77
+ }
78
+ }
79
+
80
+ /// A trigger compared by its value (`some Equatable`, not `Hashable`).
81
+ struct _PhaseTrigger: Equatable {
82
+ let value: Any
83
+ let equals: (Any) -> Bool
84
+
85
+ init<T: Equatable>(_ value: T) {
86
+ self.value = value
87
+ equals = { ($0 as? T) == value }
88
+ }
89
+
90
+ static func == (lhs: _PhaseTrigger, rhs: _PhaseTrigger) -> Bool { lhs.equals(rhs.value) }
91
+ }
92
+
93
+ extension Animation {
94
+ /// How long a change in this animation takes to settle: its delay and
95
+ /// duration, repeated as it repeats (a forever-repeating one: once).
96
+ var _settlingTime: Double {
97
+ let count = repeatForever ? 1 : Double(repeatCount ?? 1)
98
+ return delayBy + duration * count
99
+ }
100
+ }
101
+
102
+ nonisolated extension View {
103
+ /// The view goes through `phases` as `PhaseAnimator` does; `content`
104
+ /// changes the view for each phase.
105
+ @MainActor
106
+ public func phaseAnimator<Phase: Equatable>(
107
+ _ phases: some Sequence<Phase>,
108
+ @ViewBuilder content: @escaping (PlaceholderContentView<Self>, Phase) -> some View,
109
+ animation: @escaping (Phase) -> Animation? = { _ in .default }
110
+ ) -> some View {
111
+ PhaseAnimator(phases, content: { content(PlaceholderContentView(self), $0) }, animation: animation)
112
+ }
113
+
114
+ @MainActor
115
+ public func phaseAnimator<Phase: Equatable>(
116
+ _ phases: some Sequence<Phase>, trigger: some Equatable,
117
+ @ViewBuilder content: @escaping (PlaceholderContentView<Self>, Phase) -> some View,
118
+ animation: @escaping (Phase) -> Animation? = { _ in .default }
119
+ ) -> some View {
120
+ PhaseAnimator(phases, trigger: trigger, content: { content(PlaceholderContentView(self), $0) }, animation: animation)
121
+ }
122
+ }
123
+
124
+ /// The view a `.phaseAnimator` (or another modifier that hands its content
125
+ /// to a closure) changes: it draws that view.
126
+ public struct PlaceholderContentView<Value: View>: View {
127
+ let content: Value
128
+ init(_ content: Value) { self.content = content }
129
+ public var body: some View { content }
130
+ }
@@ -39,7 +39,7 @@ extension PickerStyle where Self == WheelPickerStyle {
39
39
  public static var wheel: WheelPickerStyle { WheelPickerStyle() }
40
40
  }
41
41
 
42
- extension View {
42
+ nonisolated extension View {
43
43
  public func pickerStyle<S: PickerStyle>(_ style: S) -> some View {
44
44
  environment(\._pickerStyle, style._name)
45
45
  }
@@ -62,7 +62,7 @@ extension EnvironmentValues {
62
62
 
63
63
  // MARK: - Picker
64
64
 
65
- protocol _PickerHost {
65
+ protocol _PickerHost: _TraitBearing {
66
66
  var _labelView: any View { get }
67
67
  var _options: any View { get }
68
68
  func _selectedIndex(tags: [AnyHashable?]) -> Int
@@ -86,6 +86,13 @@ public struct Picker<Label: View, SelectionValue: Hashable, Content: View> {
86
86
  }
87
87
 
88
88
  extension Picker where Label == Text {
89
+ public init(_ titleKey: LocalizedStringKey, selection: Binding<SelectionValue>, @ViewBuilder content: () -> Content) {
90
+ self.label = Text(titleKey)
91
+ self.selection = selection
92
+ self.content = content()
93
+ }
94
+
95
+ @_disfavoredOverload
89
96
  public init<S: StringProtocol>(_ title: S, selection: Binding<SelectionValue>,
90
97
  @ViewBuilder content: () -> Content) {
91
98
  self.label = Text(title)
@@ -119,6 +126,8 @@ extension Picker: _PickerHost {
119
126
  @MainActor
120
127
  func _textContent(of view: any View) -> String {
121
128
  if let text = view as? Text { return text.content }
129
+ if let text = view as? _PlainText { return text.content }
130
+ if let text = view as? _RichText { return text.text.content }
122
131
  if let label = view as? any _TabItemProviding { return _textContent(of: label._tabLabel) }
123
132
  if let tagged = view as? any _TagProviding { return _textContent(of: tagged._tagged) }
124
133
  if let group = view as? any _GroupView {
@@ -163,7 +172,8 @@ func _systemImage(of view: any View) -> String? {
163
172
 
164
173
  // MARK: - Form
165
174
 
166
- /// A container for grouped controls, drawn as a grouped list.
175
+ /// A container for grouped controls, drawn as an inset grouped list (what
176
+ /// iOS's automatic form style is on iPhone: cards inset from the edges).
167
177
  public struct Form<Content: View> {
168
178
  let content: Content
169
179
  public init(@ViewBuilder content: () -> Content) { self.content = content() }
@@ -171,6 +181,6 @@ public struct Form<Content: View> {
171
181
  extension Form: _PrimitiveView {}
172
182
  extension Form: _HostView {
173
183
  var _kind: String { "list" }
174
- func _props(in environment: EnvironmentValues) -> _JSON { .object(["style": .string("grouped")]) }
184
+ func _props(in environment: EnvironmentValues) -> _JSON { .object(["style": .string("insetGrouped")]) }
175
185
  var _content: [any View] { [content] }
176
186
  }
@@ -0,0 +1,77 @@
1
+ // Pointer and hardware-keyboard modifiers of iPad and Mac apps. The page
2
+ // shows an iPhone: there is no hover, no tooltip and no command key, so these
3
+ // are accepted and do nothing (`onHover` never calls its action, as on an
4
+ // iPhone).
5
+
6
+ public struct KeyEquivalent: Hashable, Sendable, ExpressibleByExtendedGraphemeClusterLiteral {
7
+ public let character: Character
8
+ public init(_ character: Character) { self.character = character }
9
+ public init(extendedGraphemeClusterLiteral value: Character) { character = value }
10
+
11
+ public static let upArrow = KeyEquivalent("\u{F700}")
12
+ public static let downArrow = KeyEquivalent("\u{F701}")
13
+ public static let leftArrow = KeyEquivalent("\u{F702}")
14
+ public static let rightArrow = KeyEquivalent("\u{F703}")
15
+ public static let escape = KeyEquivalent("\u{1B}")
16
+ public static let delete = KeyEquivalent("\u{8}")
17
+ public static let deleteForward = KeyEquivalent("\u{F728}")
18
+ public static let home = KeyEquivalent("\u{F729}")
19
+ public static let end = KeyEquivalent("\u{F72B}")
20
+ public static let pageUp = KeyEquivalent("\u{F72C}")
21
+ public static let pageDown = KeyEquivalent("\u{F72D}")
22
+ public static let clear = KeyEquivalent("\u{F739}")
23
+ public static let tab = KeyEquivalent("\t")
24
+ public static let space = KeyEquivalent(" ")
25
+ public static let `return` = KeyEquivalent("\r")
26
+ }
27
+
28
+ public struct EventModifiers: OptionSet, Hashable, Sendable {
29
+ public let rawValue: Int
30
+ public init(rawValue: Int) { self.rawValue = rawValue }
31
+ public static let capsLock = EventModifiers(rawValue: 1 << 0)
32
+ public static let shift = EventModifiers(rawValue: 1 << 1)
33
+ public static let control = EventModifiers(rawValue: 1 << 2)
34
+ public static let option = EventModifiers(rawValue: 1 << 3)
35
+ public static let command = EventModifiers(rawValue: 1 << 4)
36
+ public static let numericPad = EventModifiers(rawValue: 1 << 5)
37
+ public static let all: EventModifiers = [.capsLock, .shift, .control, .option, .command, .numericPad]
38
+ }
39
+
40
+ public struct KeyboardShortcut: Hashable, Sendable {
41
+ public let key: KeyEquivalent
42
+ public let modifiers: EventModifiers
43
+ public init(_ key: KeyEquivalent, modifiers: EventModifiers = .command) {
44
+ self.key = key
45
+ self.modifiers = modifiers
46
+ }
47
+ public static let defaultAction = KeyboardShortcut(.return, modifiers: [])
48
+ public static let cancelAction = KeyboardShortcut(.escape, modifiers: [])
49
+ }
50
+
51
+ nonisolated extension View {
52
+ public func keyboardShortcut(_ key: KeyEquivalent, modifiers: EventModifiers = .command) -> some View { self }
53
+ public func keyboardShortcut(_ shortcut: KeyboardShortcut) -> some View { self }
54
+ public func keyboardShortcut(_ shortcut: KeyboardShortcut?) -> some View { self }
55
+
56
+ /// Never called: an iPhone has no pointer to hover with.
57
+ public func onHover(perform action: @escaping (Bool) -> Void) -> some View { self }
58
+
59
+ /// A tooltip; the page shows none.
60
+ public func help(_ text: Text) -> some View { self }
61
+ public func help(_ textKey: LocalizedStringKey) -> some View { self }
62
+ @_disfavoredOverload
63
+ public func help<S: StringProtocol>(_ text: S) -> some View { self }
64
+ }
65
+
66
+ /// The pointer effect of an iPad; the page draws none.
67
+ public struct HoverEffect: Hashable, Sendable {
68
+ let name: String
69
+ public static let automatic = HoverEffect(name: "automatic")
70
+ public static let highlight = HoverEffect(name: "highlight")
71
+ public static let lift = HoverEffect(name: "lift")
72
+ }
73
+
74
+ nonisolated extension View {
75
+ public func hoverEffect(_ effect: HoverEffect = .automatic, isEnabled: Bool = true) -> some View { self }
76
+ public func hoverEffectDisabled(_ disabled: Bool = true) -> some View { self }
77
+ }
@@ -0,0 +1,41 @@
1
+ // `.popover`: on an iPhone (a compact width) a popover is presented as a
2
+ // sheet, so here it is one: the same `sheet` element `.sheet` makes. The
3
+ // attachment anchor and arrow edge are accepted;
4
+ // `.presentationCompactAdaptation(_:)` is accepted and changes nothing
5
+ // (a popover never draws as a bubble).
6
+
7
+ public enum PopoverAttachmentAnchor {
8
+ case rect(Anchor<CGRect>.Source)
9
+ case point(UnitPoint)
10
+ }
11
+
12
+ public struct PresentationAdaptation: Hashable, Sendable {
13
+ let name: String
14
+ public static let automatic = PresentationAdaptation(name: "automatic")
15
+ public static let none = PresentationAdaptation(name: "none")
16
+ public static let popover = PresentationAdaptation(name: "popover")
17
+ public static let sheet = PresentationAdaptation(name: "sheet")
18
+ public static let fullScreenCover = PresentationAdaptation(name: "fullScreenCover")
19
+ }
20
+
21
+ extension View {
22
+ public func popover<Content: View>(isPresented: Binding<Bool>,
23
+ attachmentAnchor: PopoverAttachmentAnchor = .rect(.bounds),
24
+ arrowEdge: Edge? = nil,
25
+ @ViewBuilder content: @escaping () -> Content) -> some View {
26
+ sheet(isPresented: isPresented, content: content)
27
+ }
28
+
29
+ public func popover<Item: Identifiable, Content: View>(item: Binding<Item?>,
30
+ attachmentAnchor: PopoverAttachmentAnchor = .rect(.bounds),
31
+ arrowEdge: Edge? = nil,
32
+ @ViewBuilder content: @escaping (Item) -> Content) -> some View {
33
+ sheet(item: item, content: content)
34
+ }
35
+ }
36
+
37
+ nonisolated extension View {
38
+ public func presentationCompactAdaptation(_ adaptation: PresentationAdaptation) -> some View { self }
39
+ public func presentationCompactAdaptation(horizontal: PresentationAdaptation,
40
+ vertical: PresentationAdaptation) -> some View { self }
41
+ }