@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.
- package/Package.swift +200 -9
- package/README.md +7 -9
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +0 -4
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +68 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +104 -28
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +125 -10
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +100 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +26 -10
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +71 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +88 -12
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +14 -4
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +168 -39
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +86 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Toolbar.swift +52 -16
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +46 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +524 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +41 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- 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
|
+
}
|