@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
@@ -0,0 +1,638 @@
1
+ // The SwiftUI map (iOS 17's `Map` with `Annotation`, `Marker`, overlays and
2
+ // `MapReader`, and iOS 14's `Map(coordinateRegion:annotationItems:)`).
3
+ //
4
+ // A map is a surface with a grid of latitude and longitude lines; its content
5
+ // is views that place themselves with the map's projection (Geometry.swift),
6
+ // which the map hands down in the environment. `MapReader`'s proxy converts
7
+ // between points in the map and coordinates with the same projection, so a
8
+ // tap on the map (`onTapGesture { point in }`) finds the coordinate under it.
9
+
10
+ @_exported import CoreLocation
11
+ #if canImport(WASILibc)
12
+ import WASILibc
13
+ #elseif canImport(Glibc)
14
+ import Glibc
15
+ #elseif canImport(Musl)
16
+ import Musl
17
+ #elseif canImport(Darwin)
18
+ import Darwin
19
+ #endif
20
+ import SwiftUI
21
+
22
+ // MARK: - Content
23
+
24
+ /// Something drawn on a map. Map content is made of views here, so any
25
+ /// `MapContent` is also a `View`; `MapContentBuilder` is `ViewBuilder`.
26
+ public protocol MapContent: View {}
27
+
28
+ public typealias MapContentBuilder = ViewBuilder
29
+
30
+ /// A map without content.
31
+ public struct EmptyMapContent: MapContent {
32
+ public init() {}
33
+ public var body: some View { EmptyView() }
34
+ }
35
+
36
+ extension MapContent {
37
+ /// Whether annotations show their titles; accepted (titles are shown).
38
+ public func annotationTitles(_ visibility: Visibility) -> Self { self }
39
+ /// Which annotations the map may hide when crowded; accepted.
40
+ public func annotationSubtitles(_ visibility: Visibility) -> Self { self }
41
+ }
42
+
43
+ /// The user's location; the browser's map has none, so nothing is drawn.
44
+ public struct UserAnnotation: MapContent {
45
+ public init(anchor: UnitPoint = .center) {}
46
+ public var body: some View { EmptyView() }
47
+ }
48
+
49
+ // MARK: - Map
50
+
51
+ /// A map showing a region, with content placed on it.
52
+ public struct Map<Content: View>: View {
53
+ let position: MapCameraPosition
54
+ let binding: Binding<MapCameraPosition>?
55
+ let content: Content
56
+ @Environment(\._mapProxy) private var proxy
57
+
58
+ public init(initialPosition: MapCameraPosition = .automatic, bounds: MapCameraBounds? = nil,
59
+ interactionModes: MapInteractionModes = .all, scope: Namespace.ID? = nil,
60
+ @MapContentBuilder content: () -> Content) {
61
+ position = initialPosition
62
+ binding = nil
63
+ self.content = content()
64
+ }
65
+
66
+ public init(position: Binding<MapCameraPosition>, bounds: MapCameraBounds? = nil,
67
+ interactionModes: MapInteractionModes = .all, scope: Namespace.ID? = nil,
68
+ @MapContentBuilder content: () -> Content) {
69
+ self.position = position.wrappedValue
70
+ binding = position
71
+ self.content = content()
72
+ }
73
+
74
+ public init<SelectedValue: Hashable>(initialPosition: MapCameraPosition = .automatic, bounds: MapCameraBounds? = nil,
75
+ interactionModes: MapInteractionModes = .all, selection: Binding<SelectedValue?>,
76
+ scope: Namespace.ID? = nil, @MapContentBuilder content: () -> Content) {
77
+ self.init(initialPosition: initialPosition, bounds: bounds, interactionModes: interactionModes, scope: scope, content: content)
78
+ }
79
+
80
+ public init<SelectedValue: Hashable>(position: Binding<MapCameraPosition>, bounds: MapCameraBounds? = nil,
81
+ interactionModes: MapInteractionModes = .all, selection: Binding<SelectedValue?>,
82
+ scope: Namespace.ID? = nil, @MapContentBuilder content: () -> Content) {
83
+ self.init(position: position, bounds: bounds, interactionModes: interactionModes, scope: scope, content: content)
84
+ }
85
+
86
+ /// The region shown: the position's (read again from a binding), else the world.
87
+ var region: MKCoordinateRegion {
88
+ (binding?.wrappedValue ?? position).shownRegion ?? .world
89
+ }
90
+
91
+ public var body: some View {
92
+ GeometryReader { geometry in
93
+ let size = geometry.size
94
+ let projection = size.width > 0 && size.height > 0 ? _MapProjection(region: region, size: size) : nil
95
+ let _ = proxy?.projection = projection
96
+ ZStack(alignment: .topLeading) {
97
+ _MapSurface(projection: projection)
98
+ if let projection {
99
+ content.environment(\._mapProjection, projection)
100
+ }
101
+ }
102
+ .frame(width: size.width, height: size.height)
103
+ .clipped()
104
+ }
105
+ }
106
+ }
107
+
108
+ extension Map where Content == EmptyMapContent {
109
+ public init(initialPosition: MapCameraPosition = .automatic, bounds: MapCameraBounds? = nil,
110
+ interactionModes: MapInteractionModes = .all, scope: Namespace.ID? = nil) {
111
+ self.init(initialPosition: initialPosition, bounds: bounds, interactionModes: interactionModes, scope: scope) { EmptyMapContent() }
112
+ }
113
+
114
+ public init(position: Binding<MapCameraPosition>, bounds: MapCameraBounds? = nil,
115
+ interactionModes: MapInteractionModes = .all, scope: Namespace.ID? = nil) {
116
+ self.init(position: position, bounds: bounds, interactionModes: interactionModes, scope: scope) { EmptyMapContent() }
117
+ }
118
+
119
+ /// iOS 14: a map of a region, without annotations.
120
+ public init(coordinateRegion: Binding<MKCoordinateRegion>, interactionModes: MapInteractionModes = .all,
121
+ showsUserLocation: Bool = false, userTrackingMode: Binding<MapUserTrackingMode>? = nil) {
122
+ self.init(initialPosition: .region(coordinateRegion.wrappedValue), interactionModes: interactionModes) { EmptyMapContent() }
123
+ }
124
+ }
125
+
126
+ /// The map's surface: a plain land color with a grid of latitude and
127
+ /// longitude lines, at a spacing that suits the region shown.
128
+ struct _MapSurface: View {
129
+ let projection: _MapProjection?
130
+
131
+ var body: some View {
132
+ ZStack(alignment: .bottomLeading) {
133
+ Rectangle().fill(Color(red: 0.93, green: 0.92, blue: 0.88))
134
+ if let projection {
135
+ _Graticule(projection: projection).stroke(Color(red: 0.8, green: 0.84, blue: 0.88), lineWidth: 1)
136
+ }
137
+ Text("Map preview")
138
+ .font(.caption2)
139
+ .foregroundStyle(Color(red: 0.45, green: 0.45, blue: 0.45))
140
+ .padding(6)
141
+ }
142
+ }
143
+ }
144
+
145
+ /// Lines of latitude and longitude across the visible region.
146
+ struct _Graticule: Shape {
147
+ let projection: _MapProjection
148
+
149
+ func path(in rect: CGRect) -> Path {
150
+ let visible = projection.visible
151
+ let extent = max(abs(visible.east - visible.west), abs(visible.north - visible.south))
152
+ let steps: [Double] = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 15, 30]
153
+ let step = steps.first { extent / $0 <= 12 } ?? 30
154
+ var path = Path()
155
+ var longitude = (visible.west / step).rounded(.down) * step
156
+ while longitude <= visible.east {
157
+ let x = projection.point(for: CLLocationCoordinate2D(latitude: 0, longitude: longitude)).x
158
+ path.move(to: CGPoint(x: x, y: rect.minY))
159
+ path.addLine(to: CGPoint(x: x, y: rect.maxY))
160
+ longitude += step
161
+ }
162
+ var latitude = (max(-85, visible.south) / step).rounded(.down) * step
163
+ while latitude <= min(85, visible.north) {
164
+ let y = projection.point(for: CLLocationCoordinate2D(latitude: latitude, longitude: 0)).y
165
+ path.move(to: CGPoint(x: rect.minX, y: y))
166
+ path.addLine(to: CGPoint(x: rect.maxX, y: y))
167
+ latitude += step
168
+ }
169
+ return path
170
+ }
171
+ }
172
+
173
+ // MARK: - Reader and proxy
174
+
175
+ /// The current projection of a map inside a `MapReader`, kept across renders.
176
+ @MainActor public final class _MapProxyBox {
177
+ var projection: _MapProjection?
178
+ init() {}
179
+ }
180
+
181
+ struct _MapProxyKey: EnvironmentKey {
182
+ static let defaultValue: _MapProxyBox? = nil
183
+ }
184
+
185
+ extension EnvironmentValues {
186
+ /// The `MapReader` a map reports its projection to.
187
+ public var _mapProxy: _MapProxyBox? {
188
+ get { self[_MapProxyKey.self] }
189
+ set { self[_MapProxyKey.self] = newValue }
190
+ }
191
+ }
192
+
193
+ /// Converts between points in a map and coordinates.
194
+ @MainActor public struct MapProxy {
195
+ let box: _MapProxyBox
196
+
197
+ /// The coordinate at `point` in the map's coordinates; nil before the map is laid out.
198
+ public func convert(_ point: CGPoint, from coordinateSpace: CoordinateSpace) -> CLLocationCoordinate2D? {
199
+ box.projection?.coordinate(at: point)
200
+ }
201
+
202
+ /// Where `coordinate` is in the map's coordinates; nil before the map is laid out.
203
+ public func convert(_ coordinate: CLLocationCoordinate2D, to coordinateSpace: CoordinateSpace) -> CGPoint? {
204
+ box.projection?.point(for: coordinate)
205
+ }
206
+
207
+ /// The region the map shows; nil before the map is laid out.
208
+ public var region: MKCoordinateRegion? {
209
+ guard let projection = box.projection else { return nil }
210
+ let visible = projection.visible
211
+ return MKCoordinateRegion(
212
+ center: CLLocationCoordinate2D(latitude: (visible.north + visible.south) / 2, longitude: (visible.east + visible.west) / 2),
213
+ span: MKCoordinateSpan(latitudeDelta: visible.north - visible.south, longitudeDelta: visible.east - visible.west))
214
+ }
215
+ }
216
+
217
+ /// A view whose content can convert between the map's points and coordinates.
218
+ public struct MapReader<Content: View>: View {
219
+ @State private var box = _MapProxyBox()
220
+ let content: (MapProxy) -> Content
221
+
222
+ public init(@ViewBuilder content: @escaping (MapProxy) -> Content) {
223
+ self.content = content
224
+ }
225
+
226
+ public var body: some View {
227
+ content(MapProxy(box: box)).environment(\._mapProxy, box)
228
+ }
229
+ }
230
+
231
+ // MARK: - Annotations and markers
232
+
233
+ /// A view at a coordinate, with its title below it.
234
+ public struct Annotation<Label: View, Content: View>: MapContent {
235
+ let coordinate: CLLocationCoordinate2D
236
+ let content: Content
237
+ let label: Label
238
+ @Environment(\._mapProjection) private var projection
239
+
240
+ public init(coordinate: CLLocationCoordinate2D, anchor: UnitPoint = .center,
241
+ @ViewBuilder content: () -> Content, @ViewBuilder label: () -> Label) {
242
+ self.coordinate = coordinate
243
+ self.content = content()
244
+ self.label = label()
245
+ }
246
+
247
+ public var body: some View {
248
+ if let projection {
249
+ let point = projection.point(for: coordinate)
250
+ content
251
+ .overlay(alignment: .bottom) { _MapTitle(label: label) }
252
+ .position(x: point.x, y: point.y)
253
+ }
254
+ }
255
+ }
256
+
257
+ extension Annotation where Label == Text {
258
+ public init(_ titleKey: LocalizedStringKey, coordinate: CLLocationCoordinate2D, anchor: UnitPoint = .center,
259
+ @ViewBuilder content: () -> Content) {
260
+ self.init(coordinate: coordinate, anchor: anchor, content: content) { Text(titleKey) }
261
+ }
262
+
263
+ @_disfavoredOverload
264
+ public init<S: StringProtocol>(_ title: S, coordinate: CLLocationCoordinate2D, anchor: UnitPoint = .center,
265
+ @ViewBuilder content: () -> Content) {
266
+ self.init(coordinate: coordinate, anchor: anchor, content: content) { Text(String(title)) }
267
+ }
268
+ }
269
+
270
+ /// An annotation's or marker's title, below it.
271
+ struct _MapTitle<Label: View>: View {
272
+ let label: Label
273
+ var body: some View {
274
+ label
275
+ .font(.caption2.weight(.semibold))
276
+ .foregroundStyle(Color(red: 0.2, green: 0.2, blue: 0.2))
277
+ .fixedSize()
278
+ .offset(y: 16)
279
+ }
280
+ }
281
+
282
+ /// A balloon at a coordinate: a symbol, a monogram or nothing, on a colored circle.
283
+ public struct Marker<Label: View>: MapContent {
284
+ let coordinate: CLLocationCoordinate2D
285
+ let label: Label
286
+ var symbol: String?
287
+ var monogram: Text?
288
+ var color: Color = .red
289
+ @Environment(\._mapProjection) private var projection
290
+
291
+ public init(coordinate: CLLocationCoordinate2D, @ViewBuilder label: () -> Label) {
292
+ self.coordinate = coordinate
293
+ self.label = label()
294
+ }
295
+
296
+ /// The marker's color (red by default, as in MapKit).
297
+ public func tint(_ tint: Color?) -> Marker {
298
+ var copy = self
299
+ copy.color = tint ?? .red
300
+ return copy
301
+ }
302
+
303
+ public var body: some View {
304
+ if let projection {
305
+ let point = projection.point(for: coordinate)
306
+ ZStack {
307
+ Circle().fill(color)
308
+ if let monogram {
309
+ monogram.font(.caption.bold()).foregroundStyle(.white)
310
+ } else {
311
+ Image(systemName: symbol ?? "mappin").font(.caption.bold()).foregroundStyle(.white)
312
+ }
313
+ }
314
+ .frame(width: 28, height: 28)
315
+ .overlay(alignment: .bottom) { _MapTitle(label: label) }
316
+ .position(x: point.x, y: point.y)
317
+ }
318
+ }
319
+ }
320
+
321
+ extension Marker where Label == Text {
322
+ public init(_ titleKey: LocalizedStringKey, coordinate: CLLocationCoordinate2D) {
323
+ self.init(coordinate: coordinate) { Text(titleKey) }
324
+ }
325
+
326
+ @_disfavoredOverload
327
+ public init<S: StringProtocol>(_ title: S, coordinate: CLLocationCoordinate2D) {
328
+ self.init(coordinate: coordinate) { Text(String(title)) }
329
+ }
330
+
331
+ public init(_ titleKey: LocalizedStringKey, systemImage: String, coordinate: CLLocationCoordinate2D) {
332
+ self.init(titleKey, coordinate: coordinate)
333
+ symbol = systemImage
334
+ }
335
+
336
+ @_disfavoredOverload
337
+ public init<S: StringProtocol>(_ title: S, systemImage: String, coordinate: CLLocationCoordinate2D) {
338
+ self.init(title, coordinate: coordinate)
339
+ symbol = systemImage
340
+ }
341
+
342
+ public init(_ titleKey: LocalizedStringKey, monogram: Text, coordinate: CLLocationCoordinate2D) {
343
+ self.init(titleKey, coordinate: coordinate)
344
+ self.monogram = monogram
345
+ }
346
+
347
+ @_disfavoredOverload
348
+ public init<S: StringProtocol>(_ title: S, monogram: Text, coordinate: CLLocationCoordinate2D) {
349
+ self.init(title, coordinate: coordinate)
350
+ self.monogram = monogram
351
+ }
352
+ }
353
+
354
+ // MARK: - Overlays
355
+
356
+ /// A line through coordinates.
357
+ public struct MapPolyline: MapContent {
358
+ public enum ContourStyle: Sendable { case straight, geodesic }
359
+
360
+ let coordinates: [CLLocationCoordinate2D]
361
+ var stroke: AnyShapeStyle = AnyShapeStyle(Color.blue)
362
+ var lineWidth: CGFloat = 3
363
+ @Environment(\._mapProjection) private var projection
364
+
365
+ public init(coordinates: [CLLocationCoordinate2D], contourStyle: ContourStyle = .straight) {
366
+ self.coordinates = coordinates
367
+ }
368
+
369
+ public func stroke<S: ShapeStyle>(_ content: S, lineWidth: CGFloat = 1) -> MapPolyline {
370
+ var copy = self
371
+ copy.stroke = AnyShapeStyle(content)
372
+ copy.lineWidth = lineWidth
373
+ return copy
374
+ }
375
+
376
+ public func stroke<S: ShapeStyle>(_ content: S, style: StrokeStyle) -> MapPolyline {
377
+ stroke(content, lineWidth: style.lineWidth)
378
+ }
379
+
380
+ public var body: some View {
381
+ if let projection {
382
+ _MapOutline(points: coordinates.map(projection.point(for:)), closed: false)
383
+ .stroke(stroke, style: StrokeStyle(lineWidth: lineWidth, lineCap: .round, lineJoin: .round))
384
+ }
385
+ }
386
+ }
387
+
388
+ /// A filled shape with corners at coordinates.
389
+ public struct MapPolygon: MapContent {
390
+ let coordinates: [CLLocationCoordinate2D]
391
+ var fill: AnyShapeStyle = AnyShapeStyle(Color.blue.opacity(0.3))
392
+ var stroke: AnyShapeStyle?
393
+ var lineWidth: CGFloat = 1
394
+ @Environment(\._mapProjection) private var projection
395
+
396
+ public init(coordinates: [CLLocationCoordinate2D]) {
397
+ self.coordinates = coordinates
398
+ }
399
+
400
+ public func foregroundStyle<S: ShapeStyle>(_ style: S) -> MapPolygon {
401
+ var copy = self
402
+ copy.fill = AnyShapeStyle(style)
403
+ return copy
404
+ }
405
+
406
+ public func stroke<S: ShapeStyle>(_ content: S, lineWidth: CGFloat = 1) -> MapPolygon {
407
+ var copy = self
408
+ copy.stroke = AnyShapeStyle(content)
409
+ copy.lineWidth = lineWidth
410
+ return copy
411
+ }
412
+
413
+ public var body: some View {
414
+ if let projection {
415
+ let outline = _MapOutline(points: coordinates.map(projection.point(for:)), closed: true)
416
+ ZStack {
417
+ outline.fill(fill)
418
+ if let stroke { outline.stroke(stroke, lineWidth: lineWidth) }
419
+ }
420
+ }
421
+ }
422
+ }
423
+
424
+ /// A circle of `radius` meters around a coordinate.
425
+ public struct MapCircle: MapContent {
426
+ let center: CLLocationCoordinate2D
427
+ let radius: CLLocationDistance
428
+ var fill: AnyShapeStyle = AnyShapeStyle(Color.blue.opacity(0.3))
429
+ var stroke: AnyShapeStyle?
430
+ var lineWidth: CGFloat = 1
431
+ @Environment(\._mapProjection) private var projection
432
+
433
+ public init(center: CLLocationCoordinate2D, radius: CLLocationDistance) {
434
+ self.center = center
435
+ self.radius = radius
436
+ }
437
+
438
+ public func foregroundStyle<S: ShapeStyle>(_ style: S) -> MapCircle {
439
+ var copy = self
440
+ copy.fill = AnyShapeStyle(style)
441
+ return copy
442
+ }
443
+
444
+ public func stroke<S: ShapeStyle>(_ content: S, lineWidth: CGFloat = 1) -> MapCircle {
445
+ var copy = self
446
+ copy.stroke = AnyShapeStyle(content)
447
+ copy.lineWidth = lineWidth
448
+ return copy
449
+ }
450
+
451
+ /// Points around the circle, as coordinates.
452
+ var outline: [CLLocationCoordinate2D] {
453
+ let metersPerDegree = 111_320.0
454
+ let latitudeRadius = radius / metersPerDegree
455
+ let longitudeRadius = radius / (metersPerDegree * max(0.01, cos(center.latitude * .pi / 180)))
456
+ return (0..<72).map { step in
457
+ let angle = Double(step) / 72 * 2 * .pi
458
+ return CLLocationCoordinate2D(latitude: center.latitude + latitudeRadius * sin(angle),
459
+ longitude: center.longitude + longitudeRadius * cos(angle))
460
+ }
461
+ }
462
+
463
+ public var body: some View {
464
+ if let projection {
465
+ let shape = _MapOutline(points: outline.map(projection.point(for:)), closed: true)
466
+ ZStack {
467
+ shape.fill(fill)
468
+ if let stroke { shape.stroke(stroke, lineWidth: lineWidth) }
469
+ }
470
+ }
471
+ }
472
+ }
473
+
474
+ /// Points joined by straight lines (and closed, for an area).
475
+ struct _MapOutline: Shape {
476
+ let points: [CGPoint]
477
+ let closed: Bool
478
+
479
+ func path(in rect: CGRect) -> Path {
480
+ var path = Path()
481
+ path.addLines(points)
482
+ if closed { path.closeSubpath() }
483
+ return path
484
+ }
485
+ }
486
+
487
+ // MARK: - iOS 14 annotations
488
+
489
+ /// iOS 14 map annotations (`Map(coordinateRegion:annotationItems:annotationContent:)`).
490
+ public protocol MapAnnotationProtocol: View {}
491
+
492
+ /// iOS 14: a balloon marker at a coordinate.
493
+ public struct MapMarker: MapAnnotationProtocol {
494
+ let coordinate: CLLocationCoordinate2D
495
+ let tint: Color?
496
+
497
+ public init(coordinate: CLLocationCoordinate2D, tint: Color? = nil) {
498
+ self.coordinate = coordinate
499
+ self.tint = tint
500
+ }
501
+
502
+ public var body: some View {
503
+ Marker(coordinate: coordinate) { EmptyView() }.tint(tint)
504
+ }
505
+ }
506
+
507
+ /// iOS 14: a pin at a coordinate.
508
+ public struct MapPin: MapAnnotationProtocol {
509
+ let coordinate: CLLocationCoordinate2D
510
+ let tint: Color?
511
+
512
+ public init(coordinate: CLLocationCoordinate2D, tint: Color? = nil) {
513
+ self.coordinate = coordinate
514
+ self.tint = tint
515
+ }
516
+
517
+ public var body: some View {
518
+ Marker(coordinate: coordinate) { EmptyView() }.tint(tint)
519
+ }
520
+ }
521
+
522
+ /// iOS 14: a view at a coordinate.
523
+ public struct MapAnnotation<Content: View>: MapAnnotationProtocol {
524
+ let coordinate: CLLocationCoordinate2D
525
+ let content: Content
526
+
527
+ public init(coordinate: CLLocationCoordinate2D, anchorPoint: CGPoint = CGPoint(x: 0.5, y: 0.5),
528
+ @ViewBuilder content: () -> Content) {
529
+ self.coordinate = coordinate
530
+ self.content = content()
531
+ }
532
+
533
+ public var body: some View {
534
+ Annotation(coordinate: coordinate, content: { content }, label: { EmptyView() })
535
+ }
536
+ }
537
+
538
+ /// iOS 14 annotations over a collection: one per element.
539
+ public struct _MapAnnotations<Items: RandomAccessCollection, Item: MapAnnotationProtocol>: MapContent
540
+ where Items.Element: Identifiable {
541
+ let items: Items
542
+ let content: (Items.Element) -> Item
543
+
544
+ public var body: some View {
545
+ ForEach(items) { item in content(item) }
546
+ }
547
+ }
548
+
549
+ extension Map {
550
+ /// iOS 14: a map of a region with an annotation for each item.
551
+ public init<Items: RandomAccessCollection, Item: MapAnnotationProtocol>(
552
+ coordinateRegion: Binding<MKCoordinateRegion>, interactionModes: MapInteractionModes = .all,
553
+ showsUserLocation: Bool = false, userTrackingMode: Binding<MapUserTrackingMode>? = nil,
554
+ annotationItems: Items, annotationContent: @escaping (Items.Element) -> Item
555
+ ) where Items.Element: Identifiable, Content == _MapAnnotations<Items, Item> {
556
+ self.init(initialPosition: .region(coordinateRegion.wrappedValue), interactionModes: interactionModes) {
557
+ _MapAnnotations(items: annotationItems, content: annotationContent)
558
+ }
559
+ }
560
+ }
561
+
562
+ // MARK: - Styles and controls
563
+
564
+ /// How a map is drawn; accepted (the browser's map is a plain surface).
565
+ public struct MapStyle: Sendable {
566
+ public enum Elevation: Sendable { case automatic, flat, realistic }
567
+ public enum StandardEmphasis: Sendable { case automatic, muted }
568
+
569
+ public static var standard: MapStyle { MapStyle() }
570
+ public static var hybrid: MapStyle { MapStyle() }
571
+ public static var imagery: MapStyle { MapStyle() }
572
+
573
+ public static func standard(elevation: Elevation = .automatic, emphasis: StandardEmphasis = .automatic,
574
+ pointsOfInterest: PointOfInterestCategories = .all, showsTraffic: Bool = false) -> MapStyle {
575
+ MapStyle()
576
+ }
577
+
578
+ public static func hybrid(elevation: Elevation = .automatic, pointsOfInterest: PointOfInterestCategories = .all,
579
+ showsTraffic: Bool = false) -> MapStyle {
580
+ MapStyle()
581
+ }
582
+
583
+ public static func imagery(elevation: Elevation = .automatic) -> MapStyle { MapStyle() }
584
+ }
585
+
586
+ /// Points of interest a map shows; accepted.
587
+ public struct PointOfInterestCategories: Sendable {
588
+ public static var all: PointOfInterestCategories { PointOfInterestCategories() }
589
+ public static var excludingAll: PointOfInterestCategories { PointOfInterestCategories() }
590
+ }
591
+
592
+ /// When a map reports camera changes.
593
+ public enum MapCameraUpdateFrequency: Sendable { case continuous, onEnd }
594
+
595
+ /// A camera change: the map's camera and region.
596
+ public struct MapCameraUpdateContext: Sendable {
597
+ public let camera: MapCamera
598
+ public let region: MKCoordinateRegion
599
+ }
600
+
601
+ /// The map's controls; none are drawn in the browser.
602
+ public struct MapUserLocationButton: View {
603
+ public init(scope: Namespace.ID? = nil) {}
604
+ public var body: some View { EmptyView() }
605
+ }
606
+
607
+ public struct MapCompass: View {
608
+ public init(scope: Namespace.ID? = nil) {}
609
+ public var body: some View { EmptyView() }
610
+ }
611
+
612
+ public struct MapScaleView: View {
613
+ public init(anchorEdge: HorizontalEdge = .leading, scope: Namespace.ID? = nil) {}
614
+ public var body: some View { EmptyView() }
615
+ }
616
+
617
+ public struct MapPitchToggle: View {
618
+ public init(scope: Namespace.ID? = nil) {}
619
+ public var body: some View { EmptyView() }
620
+ }
621
+
622
+ nonisolated extension View {
623
+ /// The map's style; accepted.
624
+ public func mapStyle(_ style: MapStyle) -> some View { self }
625
+
626
+ /// The map's controls; accepted (none are drawn).
627
+ public func mapControls<C: View>(@ViewBuilder _ content: () -> C) -> some View { self }
628
+
629
+ /// Whether the map's controls show; accepted.
630
+ public func mapControlVisibility(_ visibility: Visibility) -> some View { self }
631
+
632
+ /// Camera changes; the browser's map does not move, so none are reported.
633
+ public func onMapCameraChange(frequency: MapCameraUpdateFrequency = .onEnd,
634
+ _ action: @escaping () -> Void) -> some View { self }
635
+
636
+ public func onMapCameraChange(frequency: MapCameraUpdateFrequency = .onEnd,
637
+ _ action: @escaping (MapCameraUpdateContext) -> Void) -> some View { self }
638
+ }