@swiftbrowser/swift 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +214 -0
- package/README.md +10 -2
- 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 +61 -0
- 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/FoundationBridge/Bundle.swift +119 -0
- 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 +29 -0
- 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/Locale.swift +86 -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 +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- 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 +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- 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 +237 -0
- 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 +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- 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 +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- 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 +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -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 +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- 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/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- 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 +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- 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 +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// MARK: - Picker styles
|
|
2
|
+
|
|
3
|
+
public protocol PickerStyle {
|
|
4
|
+
var _name: String { get }
|
|
5
|
+
}
|
|
6
|
+
public struct DefaultPickerStyle: PickerStyle {
|
|
7
|
+
public init() {}
|
|
8
|
+
public var _name: String { "menu" }
|
|
9
|
+
}
|
|
10
|
+
public struct SegmentedPickerStyle: PickerStyle {
|
|
11
|
+
public init() {}
|
|
12
|
+
public var _name: String { "segmented" }
|
|
13
|
+
}
|
|
14
|
+
public struct MenuPickerStyle: PickerStyle {
|
|
15
|
+
public init() {}
|
|
16
|
+
public var _name: String { "menu" }
|
|
17
|
+
}
|
|
18
|
+
public struct InlinePickerStyle: PickerStyle {
|
|
19
|
+
public init() {}
|
|
20
|
+
public var _name: String { "inline" }
|
|
21
|
+
}
|
|
22
|
+
public struct WheelPickerStyle: PickerStyle {
|
|
23
|
+
public init() {}
|
|
24
|
+
public var _name: String { "menu" }
|
|
25
|
+
}
|
|
26
|
+
extension PickerStyle where Self == DefaultPickerStyle {
|
|
27
|
+
public static var automatic: DefaultPickerStyle { DefaultPickerStyle() }
|
|
28
|
+
}
|
|
29
|
+
extension PickerStyle where Self == SegmentedPickerStyle {
|
|
30
|
+
public static var segmented: SegmentedPickerStyle { SegmentedPickerStyle() }
|
|
31
|
+
}
|
|
32
|
+
extension PickerStyle where Self == MenuPickerStyle {
|
|
33
|
+
public static var menu: MenuPickerStyle { MenuPickerStyle() }
|
|
34
|
+
}
|
|
35
|
+
extension PickerStyle where Self == InlinePickerStyle {
|
|
36
|
+
public static var inline: InlinePickerStyle { InlinePickerStyle() }
|
|
37
|
+
}
|
|
38
|
+
extension PickerStyle where Self == WheelPickerStyle {
|
|
39
|
+
public static var wheel: WheelPickerStyle { WheelPickerStyle() }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
nonisolated extension View {
|
|
43
|
+
public func pickerStyle<S: PickerStyle>(_ style: S) -> some View {
|
|
44
|
+
environment(\._pickerStyle, style._name)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
enum _PickerStyleKey: EnvironmentKey { static let defaultValue = "menu" }
|
|
49
|
+
enum _ListStyleKey: EnvironmentKey { static let defaultValue = "insetGrouped" }
|
|
50
|
+
|
|
51
|
+
extension EnvironmentValues {
|
|
52
|
+
var _pickerStyle: String {
|
|
53
|
+
get { self[_PickerStyleKey.self] }
|
|
54
|
+
set { self[_PickerStyleKey.self] = newValue }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
var _listStyle: String {
|
|
58
|
+
get { self[_ListStyleKey.self] }
|
|
59
|
+
set { self[_ListStyleKey.self] = newValue }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// MARK: - Picker
|
|
64
|
+
|
|
65
|
+
protocol _PickerHost: _TraitBearing {
|
|
66
|
+
var _labelView: any View { get }
|
|
67
|
+
var _options: any View { get }
|
|
68
|
+
func _selectedIndex(tags: [AnyHashable?]) -> Int
|
|
69
|
+
func _select(index: Int, tags: [AnyHashable?])
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// A control for selecting one of several options. Options are the content's
|
|
73
|
+
/// children; each option's label is its text, and its identity is its `tag`
|
|
74
|
+
/// (or its `ForEach` id).
|
|
75
|
+
public struct Picker<Label: View, SelectionValue: Hashable, Content: View> {
|
|
76
|
+
let label: any View
|
|
77
|
+
let selection: Binding<SelectionValue>
|
|
78
|
+
let content: Content
|
|
79
|
+
|
|
80
|
+
public init(selection: Binding<SelectionValue>, @ViewBuilder content: () -> Content,
|
|
81
|
+
@ViewBuilder label: () -> Label) {
|
|
82
|
+
self.label = label()
|
|
83
|
+
self.selection = selection
|
|
84
|
+
self.content = content()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
extension Picker where Label == Text {
|
|
89
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<SelectionValue>, @ViewBuilder content: () -> Content) {
|
|
90
|
+
self.label = Text(titleKey)
|
|
91
|
+
self.selection = selection
|
|
92
|
+
self.content = content()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@_disfavoredOverload
|
|
96
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<SelectionValue>,
|
|
97
|
+
@ViewBuilder content: () -> Content) {
|
|
98
|
+
self.label = Text(title)
|
|
99
|
+
self.selection = selection
|
|
100
|
+
self.content = content()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
extension Picker: _PrimitiveView {}
|
|
105
|
+
extension Picker: _HostView {
|
|
106
|
+
var _kind: String { "picker" }
|
|
107
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object([:]) }
|
|
108
|
+
// Options, selection and the handler are produced by the runtime.
|
|
109
|
+
}
|
|
110
|
+
extension Picker: _PickerHost {
|
|
111
|
+
var _labelView: any View { label }
|
|
112
|
+
var _options: any View { content }
|
|
113
|
+
|
|
114
|
+
func _selectedIndex(tags: [AnyHashable?]) -> Int {
|
|
115
|
+
let current = AnyHashable(selection.wrappedValue)
|
|
116
|
+
return tags.firstIndex { $0 == current } ?? 0
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
func _select(index: Int, tags: [AnyHashable?]) {
|
|
120
|
+
guard index < tags.count, let tag = tags[index], let value = tag.base as? SelectionValue else { return }
|
|
121
|
+
selection.wrappedValue = value
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/// The plain text of a label view: the first `Text` found, if any.
|
|
126
|
+
@MainActor
|
|
127
|
+
func _textContent(of view: any View) -> String {
|
|
128
|
+
if let text = view as? Text { return text.content }
|
|
129
|
+
if let text = view as? _PlainText { return text.content }
|
|
130
|
+
if let text = view as? _RichText { return text.text.content }
|
|
131
|
+
if let label = view as? any _TabItemProviding { return _textContent(of: label._tabLabel) }
|
|
132
|
+
if let tagged = view as? any _TagProviding { return _textContent(of: tagged._tagged) }
|
|
133
|
+
if let group = view as? any _GroupView {
|
|
134
|
+
for child in group._children {
|
|
135
|
+
let text = _textContent(of: child)
|
|
136
|
+
if !text.isEmpty { return text }
|
|
137
|
+
}
|
|
138
|
+
return ""
|
|
139
|
+
}
|
|
140
|
+
if let host = view as? any _HostView {
|
|
141
|
+
for child in host._content {
|
|
142
|
+
let text = _textContent(of: child)
|
|
143
|
+
if !text.isEmpty { return text }
|
|
144
|
+
}
|
|
145
|
+
return ""
|
|
146
|
+
}
|
|
147
|
+
func open<V: View>(_ view: V) -> any View { view.body }
|
|
148
|
+
return _textContent(of: open(view))
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// The first system image name in a label view, if any.
|
|
152
|
+
@MainActor
|
|
153
|
+
func _systemImage(of view: any View) -> String? {
|
|
154
|
+
if let image = view as? Image { return image.systemName }
|
|
155
|
+
if let label = view as? any _TabItemProviding { return _systemImage(of: label._tabLabel) }
|
|
156
|
+
if let tagged = view as? any _TagProviding { return _systemImage(of: tagged._tagged) }
|
|
157
|
+
if let group = view as? any _GroupView {
|
|
158
|
+
for child in group._children {
|
|
159
|
+
if let name = _systemImage(of: child) { return name }
|
|
160
|
+
}
|
|
161
|
+
return nil
|
|
162
|
+
}
|
|
163
|
+
if let host = view as? any _HostView {
|
|
164
|
+
for child in host._content {
|
|
165
|
+
if let name = _systemImage(of: child) { return name }
|
|
166
|
+
}
|
|
167
|
+
return nil
|
|
168
|
+
}
|
|
169
|
+
func open<V: View>(_ view: V) -> any View { view.body }
|
|
170
|
+
return _systemImage(of: open(view))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// MARK: - Form
|
|
174
|
+
|
|
175
|
+
/// A container for grouped controls, drawn as a grouped list.
|
|
176
|
+
public struct Form<Content: View> {
|
|
177
|
+
let content: Content
|
|
178
|
+
public init(@ViewBuilder content: () -> Content) { self.content = content() }
|
|
179
|
+
}
|
|
180
|
+
extension Form: _PrimitiveView {}
|
|
181
|
+
extension Form: _HostView {
|
|
182
|
+
var _kind: String { "list" }
|
|
183
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object(["style": .string("grouped")]) }
|
|
184
|
+
var _content: [any View] { [content] }
|
|
185
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Pointer and hardware-keyboard modifiers of iPad and Mac apps. The page
|
|
2
|
+
// shows an iPhone: there is no hover, no tooltip and no command key, so these
|
|
3
|
+
// are accepted and do nothing (`onHover` never calls its action, as on an
|
|
4
|
+
// iPhone).
|
|
5
|
+
|
|
6
|
+
public struct KeyEquivalent: Hashable, Sendable, ExpressibleByExtendedGraphemeClusterLiteral {
|
|
7
|
+
public let character: Character
|
|
8
|
+
public init(_ character: Character) { self.character = character }
|
|
9
|
+
public init(extendedGraphemeClusterLiteral value: Character) { character = value }
|
|
10
|
+
|
|
11
|
+
public static let upArrow = KeyEquivalent("\u{F700}")
|
|
12
|
+
public static let downArrow = KeyEquivalent("\u{F701}")
|
|
13
|
+
public static let leftArrow = KeyEquivalent("\u{F702}")
|
|
14
|
+
public static let rightArrow = KeyEquivalent("\u{F703}")
|
|
15
|
+
public static let escape = KeyEquivalent("\u{1B}")
|
|
16
|
+
public static let delete = KeyEquivalent("\u{8}")
|
|
17
|
+
public static let deleteForward = KeyEquivalent("\u{F728}")
|
|
18
|
+
public static let home = KeyEquivalent("\u{F729}")
|
|
19
|
+
public static let end = KeyEquivalent("\u{F72B}")
|
|
20
|
+
public static let pageUp = KeyEquivalent("\u{F72C}")
|
|
21
|
+
public static let pageDown = KeyEquivalent("\u{F72D}")
|
|
22
|
+
public static let clear = KeyEquivalent("\u{F739}")
|
|
23
|
+
public static let tab = KeyEquivalent("\t")
|
|
24
|
+
public static let space = KeyEquivalent(" ")
|
|
25
|
+
public static let `return` = KeyEquivalent("\r")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public struct EventModifiers: OptionSet, Hashable, Sendable {
|
|
29
|
+
public let rawValue: Int
|
|
30
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
31
|
+
public static let capsLock = EventModifiers(rawValue: 1 << 0)
|
|
32
|
+
public static let shift = EventModifiers(rawValue: 1 << 1)
|
|
33
|
+
public static let control = EventModifiers(rawValue: 1 << 2)
|
|
34
|
+
public static let option = EventModifiers(rawValue: 1 << 3)
|
|
35
|
+
public static let command = EventModifiers(rawValue: 1 << 4)
|
|
36
|
+
public static let numericPad = EventModifiers(rawValue: 1 << 5)
|
|
37
|
+
public static let all: EventModifiers = [.capsLock, .shift, .control, .option, .command, .numericPad]
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public struct KeyboardShortcut: Hashable, Sendable {
|
|
41
|
+
public let key: KeyEquivalent
|
|
42
|
+
public let modifiers: EventModifiers
|
|
43
|
+
public init(_ key: KeyEquivalent, modifiers: EventModifiers = .command) {
|
|
44
|
+
self.key = key
|
|
45
|
+
self.modifiers = modifiers
|
|
46
|
+
}
|
|
47
|
+
public static let defaultAction = KeyboardShortcut(.return, modifiers: [])
|
|
48
|
+
public static let cancelAction = KeyboardShortcut(.escape, modifiers: [])
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
nonisolated extension View {
|
|
52
|
+
public func keyboardShortcut(_ key: KeyEquivalent, modifiers: EventModifiers = .command) -> some View { self }
|
|
53
|
+
public func keyboardShortcut(_ shortcut: KeyboardShortcut) -> some View { self }
|
|
54
|
+
public func keyboardShortcut(_ shortcut: KeyboardShortcut?) -> some View { self }
|
|
55
|
+
|
|
56
|
+
/// Never called: an iPhone has no pointer to hover with.
|
|
57
|
+
public func onHover(perform action: @escaping (Bool) -> Void) -> some View { self }
|
|
58
|
+
|
|
59
|
+
/// A tooltip; the page shows none.
|
|
60
|
+
public func help(_ text: Text) -> some View { self }
|
|
61
|
+
public func help(_ textKey: LocalizedStringKey) -> some View { self }
|
|
62
|
+
@_disfavoredOverload
|
|
63
|
+
public func help<S: StringProtocol>(_ text: S) -> some View { self }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// The pointer effect of an iPad; the page draws none.
|
|
67
|
+
public struct HoverEffect: Hashable, Sendable {
|
|
68
|
+
let name: String
|
|
69
|
+
public static let automatic = HoverEffect(name: "automatic")
|
|
70
|
+
public static let highlight = HoverEffect(name: "highlight")
|
|
71
|
+
public static let lift = HoverEffect(name: "lift")
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
nonisolated extension View {
|
|
75
|
+
public func hoverEffect(_ effect: HoverEffect = .automatic, isEnabled: Bool = true) -> some View { self }
|
|
76
|
+
public func hoverEffectDisabled(_ disabled: Bool = true) -> some View { self }
|
|
77
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// `.popover`: on an iPhone (a compact width) a popover is presented as a
|
|
2
|
+
// sheet, so here it is one: the same `sheet` element `.sheet` makes. The
|
|
3
|
+
// attachment anchor and arrow edge are accepted;
|
|
4
|
+
// `.presentationCompactAdaptation(_:)` is accepted and changes nothing
|
|
5
|
+
// (a popover never draws as a bubble).
|
|
6
|
+
|
|
7
|
+
public enum PopoverAttachmentAnchor {
|
|
8
|
+
case rect(Anchor<CGRect>.Source)
|
|
9
|
+
case point(UnitPoint)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public struct PresentationAdaptation: Hashable, Sendable {
|
|
13
|
+
let name: String
|
|
14
|
+
public static let automatic = PresentationAdaptation(name: "automatic")
|
|
15
|
+
public static let none = PresentationAdaptation(name: "none")
|
|
16
|
+
public static let popover = PresentationAdaptation(name: "popover")
|
|
17
|
+
public static let sheet = PresentationAdaptation(name: "sheet")
|
|
18
|
+
public static let fullScreenCover = PresentationAdaptation(name: "fullScreenCover")
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
extension View {
|
|
22
|
+
public func popover<Content: View>(isPresented: Binding<Bool>,
|
|
23
|
+
attachmentAnchor: PopoverAttachmentAnchor = .rect(.bounds),
|
|
24
|
+
arrowEdge: Edge? = nil,
|
|
25
|
+
@ViewBuilder content: @escaping () -> Content) -> some View {
|
|
26
|
+
sheet(isPresented: isPresented, content: content)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public func popover<Item: Identifiable, Content: View>(item: Binding<Item?>,
|
|
30
|
+
attachmentAnchor: PopoverAttachmentAnchor = .rect(.bounds),
|
|
31
|
+
arrowEdge: Edge? = nil,
|
|
32
|
+
@ViewBuilder content: @escaping (Item) -> Content) -> some View {
|
|
33
|
+
sheet(item: item, content: content)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
nonisolated extension View {
|
|
38
|
+
public func presentationCompactAdaptation(_ adaptation: PresentationAdaptation) -> some View { self }
|
|
39
|
+
public func presentationCompactAdaptation(horizontal: PresentationAdaptation,
|
|
40
|
+
vertical: PresentationAdaptation) -> some View { self }
|
|
41
|
+
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// Preferences: values views pass up to their ancestors, the way environment
|
|
2
|
+
// values pass down. A view sets one with `.preference(key:value:)`; the
|
|
3
|
+
// reconciler combines a subtree's values with the key's `reduce` (children in
|
|
4
|
+
// order) after the subtree's bodies ran, and `.onPreferenceChange`,
|
|
5
|
+
// `.overlayPreferenceValue` and `.backgroundPreferenceValue` read the result.
|
|
6
|
+
// A subtree that is skipped keeps the values it produced last time.
|
|
7
|
+
//
|
|
8
|
+
// Anchors: the Swift side has no layout, so an anchor resolves against the
|
|
9
|
+
// size the renderer reports for the anchored view (its element carries
|
|
10
|
+
// `reportsSize`, like a `GeometryReader`'s), in the view's own coordinates:
|
|
11
|
+
// `.bounds` is `CGRect(origin: .zero, size: measured)`. Until the first
|
|
12
|
+
// report it is zero, and the preference updates when the size arrives.
|
|
13
|
+
|
|
14
|
+
/// A named value produced by a view, combined over a subtree with `reduce`.
|
|
15
|
+
public protocol PreferenceKey {
|
|
16
|
+
associatedtype Value
|
|
17
|
+
static var defaultValue: Value { get }
|
|
18
|
+
static func reduce(value: inout Value, nextValue: () -> Value)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
extension PreferenceKey where Value: ExpressibleByNilLiteral {
|
|
22
|
+
public static var defaultValue: Value { nil }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// The preference values a subtree produced, by key type.
|
|
26
|
+
struct _PreferenceValues {
|
|
27
|
+
struct Entry {
|
|
28
|
+
var value: Any
|
|
29
|
+
/// The key's `reduce`, for combining with a later sibling's value.
|
|
30
|
+
let reduce: (Any, Any) -> Any
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
var entries: [ObjectIdentifier: Entry] = [:]
|
|
34
|
+
|
|
35
|
+
var isEmpty: Bool { entries.isEmpty }
|
|
36
|
+
|
|
37
|
+
subscript<K: PreferenceKey>(key: K.Type) -> K.Value? {
|
|
38
|
+
entries[ObjectIdentifier(key)]?.value as? K.Value
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// The key's combined value, or its default when nothing in the subtree set it.
|
|
42
|
+
func value<K: PreferenceKey>(of key: K.Type) -> K.Value { self[key] ?? K.defaultValue }
|
|
43
|
+
|
|
44
|
+
mutating func set<K: PreferenceKey>(_ key: K.Type, to value: K.Value) {
|
|
45
|
+
entries[ObjectIdentifier(key)] = Entry(value: value) { first, next in
|
|
46
|
+
var combined = first as! K.Value
|
|
47
|
+
K.reduce(value: &combined) { next as! K.Value }
|
|
48
|
+
return combined
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
mutating func remove<K: PreferenceKey>(_ key: K.Type) {
|
|
53
|
+
entries[ObjectIdentifier(key)] = nil
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/// Adds a later sibling's values: a key both set is reduced, in order.
|
|
57
|
+
mutating func merge(_ later: _PreferenceValues) {
|
|
58
|
+
for (key, entry) in later.entries {
|
|
59
|
+
if var existing = entries[key] {
|
|
60
|
+
existing.value = existing.reduce(existing.value, entry.value)
|
|
61
|
+
entries[key] = existing
|
|
62
|
+
} else {
|
|
63
|
+
entries[key] = entry
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// A view that changes its subtree's preference values (after its children's are combined).
|
|
70
|
+
protocol _PreferenceWriting: _TraitBearing {
|
|
71
|
+
func _write(_ values: inout _PreferenceValues, measured: CGSize)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// A view that reads its subtree's combined values.
|
|
75
|
+
protocol _PreferenceReading: _TraitBearing {
|
|
76
|
+
/// Called after the subtree reconciled; `last` is what the previous call returned.
|
|
77
|
+
@MainActor func _read(_ values: _PreferenceValues, last: Any?) -> (keep: Any?, action: (@MainActor () -> Void)?)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// A view whose element reports its laid-out size (`reportsSize`).
|
|
81
|
+
protocol _SizeReporting: _TraitBearing {}
|
|
82
|
+
|
|
83
|
+
/// `overlayPreferenceValue` / `backgroundPreferenceValue`: the decoration is
|
|
84
|
+
/// made from the base's combined value, after the base reconciled.
|
|
85
|
+
protocol _PreferenceValueDecorating: _TraitBearing {
|
|
86
|
+
var _base: any View { get }
|
|
87
|
+
func _decoration(from values: _PreferenceValues) -> any View
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// MARK: - Setting
|
|
91
|
+
|
|
92
|
+
struct _PreferenceView<Content: View, Key: PreferenceKey> {
|
|
93
|
+
let content: Content
|
|
94
|
+
let value: Key.Value
|
|
95
|
+
}
|
|
96
|
+
extension _PreferenceView: _PrimitiveView, _GroupView {
|
|
97
|
+
var _children: [any View] { [content] }
|
|
98
|
+
}
|
|
99
|
+
extension _PreferenceView: _PreferenceWriting {
|
|
100
|
+
func _write(_ values: inout _PreferenceValues, measured: CGSize) { values.set(Key.self, to: value) }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
struct _TransformPreferenceView<Content: View, Key: PreferenceKey> {
|
|
104
|
+
let content: Content
|
|
105
|
+
let transform: (inout Key.Value) -> Void
|
|
106
|
+
}
|
|
107
|
+
extension _TransformPreferenceView: _PrimitiveView, _GroupView {
|
|
108
|
+
var _children: [any View] { [content] }
|
|
109
|
+
}
|
|
110
|
+
extension _TransformPreferenceView: _PreferenceWriting {
|
|
111
|
+
func _write(_ values: inout _PreferenceValues, measured: CGSize) {
|
|
112
|
+
var value = values.value(of: Key.self)
|
|
113
|
+
transform(&value)
|
|
114
|
+
values.set(Key.self, to: value)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
nonisolated extension View {
|
|
119
|
+
/// Sets the key's value for this view; it replaces what the content set for the key.
|
|
120
|
+
public func preference<K: PreferenceKey>(key: K.Type = K.self, value: K.Value) -> some View {
|
|
121
|
+
_PreferenceView<Self, K>(content: self, value: value)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Changes the key's value the content produced (its default when it set none).
|
|
125
|
+
public func transformPreference<K: PreferenceKey>(_ key: K.Type = K.self, _ callback: @escaping (inout K.Value) -> Void) -> some View {
|
|
126
|
+
_TransformPreferenceView<Self, K>(content: self, transform: callback)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// MARK: - Reading
|
|
131
|
+
|
|
132
|
+
struct _PreferenceChangeView<Content: View, Key: PreferenceKey> where Key.Value: Equatable {
|
|
133
|
+
let content: Content
|
|
134
|
+
let action: (Key.Value) -> Void
|
|
135
|
+
}
|
|
136
|
+
extension _PreferenceChangeView: _PrimitiveView, _GroupView {
|
|
137
|
+
var _children: [any View] { [content] }
|
|
138
|
+
}
|
|
139
|
+
extension _PreferenceChangeView: _PreferenceReading {
|
|
140
|
+
@MainActor func _read(_ values: _PreferenceValues, last: Any?) -> (keep: Any?, action: (@MainActor () -> Void)?) {
|
|
141
|
+
let value = values.value(of: Key.self)
|
|
142
|
+
if let last = last as? Key.Value, last == value { return (last, nil) }
|
|
143
|
+
let action = self.action
|
|
144
|
+
return (value, { action(value) })
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
struct _PreferenceDecorationView<Content: View, Key: PreferenceKey, Decoration: View> {
|
|
149
|
+
let content: Content
|
|
150
|
+
let decoration: (Key.Value) -> Decoration
|
|
151
|
+
let role: String
|
|
152
|
+
let alignment: Alignment
|
|
153
|
+
}
|
|
154
|
+
extension _PreferenceDecorationView: _PrimitiveView {}
|
|
155
|
+
extension _PreferenceDecorationView: _HostView {
|
|
156
|
+
var _kind: String { "decorated" }
|
|
157
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
158
|
+
.object(["role": .string(role), "alignment": .string(alignment._name)])
|
|
159
|
+
}
|
|
160
|
+
var _content: [any View] { [content] }
|
|
161
|
+
}
|
|
162
|
+
extension _PreferenceDecorationView: _PreferenceValueDecorating {
|
|
163
|
+
var _base: any View { content }
|
|
164
|
+
func _decoration(from values: _PreferenceValues) -> any View { decoration(values.value(of: Key.self)) }
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
nonisolated extension View {
|
|
168
|
+
/// Runs `action` after a render in which the key's combined value in this
|
|
169
|
+
/// subtree changed (and after the first, with its initial value).
|
|
170
|
+
public func onPreferenceChange<K: PreferenceKey>(_ key: K.Type = K.self, perform action: @escaping (K.Value) -> Void) -> some View where K.Value: Equatable {
|
|
171
|
+
_PreferenceChangeView<Self, K>(content: self, action: action)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/// An overlay made from the key's combined value in this view.
|
|
175
|
+
public func overlayPreferenceValue<K: PreferenceKey, V: View>(_ key: K.Type, alignment: Alignment = .center, @ViewBuilder _ transform: @escaping (K.Value) -> V) -> some View {
|
|
176
|
+
_PreferenceDecorationView<Self, K, V>(content: self, decoration: transform, role: "overlay", alignment: alignment)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/// A background made from the key's combined value in this view.
|
|
180
|
+
public func backgroundPreferenceValue<K: PreferenceKey, V: View>(_ key: K.Type, alignment: Alignment = .center, @ViewBuilder _ transform: @escaping (K.Value) -> V) -> some View {
|
|
181
|
+
_PreferenceDecorationView<Self, K, V>(content: self, decoration: transform, role: "background", alignment: alignment)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// MARK: - Anchors
|
|
186
|
+
|
|
187
|
+
/// A geometric value of a view, resolved with a `GeometryProxy` subscript.
|
|
188
|
+
public struct Anchor<Value> {
|
|
189
|
+
let value: Value
|
|
190
|
+
|
|
191
|
+
/// How to make an anchor from a view's bounds.
|
|
192
|
+
public struct Source {
|
|
193
|
+
let resolve: (CGRect) -> Value
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
extension Anchor: Equatable where Value: Equatable {}
|
|
197
|
+
extension Anchor: Hashable where Value: Hashable {}
|
|
198
|
+
extension Anchor: Sendable where Value: Sendable {}
|
|
199
|
+
|
|
200
|
+
extension Anchor.Source where Value == CGRect {
|
|
201
|
+
public static var bounds: Anchor<CGRect>.Source { .init { $0 } }
|
|
202
|
+
public static func rect(_ r: CGRect) -> Anchor<CGRect>.Source { .init { _ in r } }
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
extension Anchor.Source where Value == CGPoint {
|
|
206
|
+
public static func point(_ p: CGPoint) -> Anchor<CGPoint>.Source { .init { _ in p } }
|
|
207
|
+
public static func unitPoint(_ p: UnitPoint) -> Anchor<CGPoint>.Source {
|
|
208
|
+
.init { CGPoint(x: $0.minX + p.x * $0.width, y: $0.minY + p.y * $0.height) }
|
|
209
|
+
}
|
|
210
|
+
public static var topLeading: Anchor<CGPoint>.Source { unitPoint(.topLeading) }
|
|
211
|
+
public static var top: Anchor<CGPoint>.Source { unitPoint(.top) }
|
|
212
|
+
public static var topTrailing: Anchor<CGPoint>.Source { unitPoint(.topTrailing) }
|
|
213
|
+
public static var leading: Anchor<CGPoint>.Source { unitPoint(.leading) }
|
|
214
|
+
public static var center: Anchor<CGPoint>.Source { unitPoint(.center) }
|
|
215
|
+
public static var trailing: Anchor<CGPoint>.Source { unitPoint(.trailing) }
|
|
216
|
+
public static var bottomLeading: Anchor<CGPoint>.Source { unitPoint(.bottomLeading) }
|
|
217
|
+
public static var bottom: Anchor<CGPoint>.Source { unitPoint(.bottom) }
|
|
218
|
+
public static var bottomTrailing: Anchor<CGPoint>.Source { unitPoint(.bottomTrailing) }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
extension GeometryProxy {
|
|
222
|
+
/// The anchor's value, in the anchored view's own coordinates (see the file comment).
|
|
223
|
+
public subscript<T>(anchor: Anchor<T>) -> T { anchor.value }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
struct _AnchorPreferenceView<Content: View, A, Key: PreferenceKey> {
|
|
227
|
+
let content: Content
|
|
228
|
+
let source: Anchor<A>.Source
|
|
229
|
+
/// Sets the value (`anchorPreference`) or changes it (`transformAnchorPreference`).
|
|
230
|
+
let write: (inout _PreferenceValues, Anchor<A>) -> Void
|
|
231
|
+
}
|
|
232
|
+
extension _AnchorPreferenceView: _PrimitiveView, _SizeReporting {}
|
|
233
|
+
extension _AnchorPreferenceView: _HostView {
|
|
234
|
+
var _kind: String { "zstack" }
|
|
235
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
236
|
+
.object(["alignment": .string(Alignment.center._name), "reportsSize": .bool(true)])
|
|
237
|
+
}
|
|
238
|
+
var _content: [any View] { [content] }
|
|
239
|
+
}
|
|
240
|
+
extension _AnchorPreferenceView: _PreferenceWriting {
|
|
241
|
+
func _write(_ values: inout _PreferenceValues, measured: CGSize) {
|
|
242
|
+
write(&values, Anchor(value: source.resolve(CGRect(origin: .zero, size: measured))))
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
nonisolated extension View {
|
|
247
|
+
/// Sets the key's value from an anchor of this view's bounds.
|
|
248
|
+
public func anchorPreference<A, K: PreferenceKey>(key: K.Type = K.self, value: Anchor<A>.Source, transform: @escaping (Anchor<A>) -> K.Value) -> some View {
|
|
249
|
+
_AnchorPreferenceView<Self, A, K>(content: self, source: value) { values, anchor in
|
|
250
|
+
values.set(K.self, to: transform(anchor))
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/// Changes the key's value with an anchor of this view's bounds.
|
|
255
|
+
public func transformAnchorPreference<A, K: PreferenceKey>(key: K.Type = K.self, value: Anchor<A>.Source, transform: @escaping (inout K.Value, Anchor<A>) -> Void) -> some View {
|
|
256
|
+
_AnchorPreferenceView<Self, A, K>(content: self, source: value) { values, anchor in
|
|
257
|
+
var current = values.value(of: K.self)
|
|
258
|
+
transform(¤t, anchor)
|
|
259
|
+
values.set(K.self, to: current)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/// A height a sheet can rest at.
|
|
2
|
+
public struct PresentationDetent: Hashable, Sendable {
|
|
3
|
+
let name: String
|
|
4
|
+
public static let medium = PresentationDetent(name: "medium")
|
|
5
|
+
public static let large = PresentationDetent(name: "large")
|
|
6
|
+
/// A sheet this many points tall (`"height:<points>"`, capped at the large height).
|
|
7
|
+
public static func height(_ height: CGFloat) -> PresentationDetent { PresentationDetent(name: "height:\(Double(height))") }
|
|
8
|
+
/// A sheet this fraction of the screen tall (`"fraction:<f>"`, capped at the large height).
|
|
9
|
+
public static func fraction(_ fraction: CGFloat) -> PresentationDetent { PresentationDetent(name: "fraction:\(Double(fraction))") }
|
|
10
|
+
|
|
11
|
+
/// Orders detents smallest first (a height counts against an 852pt screen).
|
|
12
|
+
var _order: Double {
|
|
13
|
+
if name == "medium" { return 0.5 }
|
|
14
|
+
if name.hasPrefix("height:") { return (Double(name.dropFirst(7)) ?? 852) / 852 }
|
|
15
|
+
if name.hasPrefix("fraction:") { return Double(name.dropFirst(9)) ?? 1 }
|
|
16
|
+
return 1
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/// Views that present a sheet. The runtime mounts the sheet content as a
|
|
21
|
+
/// second child and emits it as a root-level `sheet` element while presented.
|
|
22
|
+
protocol _SheetPresenting: _TraitBearing {
|
|
23
|
+
var _isPresented: Binding<Bool> { get }
|
|
24
|
+
var _onDismiss: (@MainActor () -> Void)? { get }
|
|
25
|
+
var _base: any View { get }
|
|
26
|
+
var _sheetContent: any View { get }
|
|
27
|
+
/// `.fullScreenCover`: the sheet's detents are `["full"]`.
|
|
28
|
+
var _fullScreen: Bool { get }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
struct _SheetView<Base: View, Content: View> {
|
|
32
|
+
let base: Base
|
|
33
|
+
let isPresented: Binding<Bool>
|
|
34
|
+
let onDismiss: (@MainActor () -> Void)?
|
|
35
|
+
let content: Content
|
|
36
|
+
var fullScreen = false
|
|
37
|
+
}
|
|
38
|
+
extension _SheetView: _PrimitiveView {}
|
|
39
|
+
extension _SheetView: _GroupView {
|
|
40
|
+
// Only the base is a regular child; the runtime adds the sheet content.
|
|
41
|
+
var _children: [any View] { [base] }
|
|
42
|
+
}
|
|
43
|
+
extension _SheetView: _SheetPresenting {
|
|
44
|
+
var _isPresented: Binding<Bool> { isPresented }
|
|
45
|
+
var _onDismiss: (@MainActor () -> Void)? { onDismiss }
|
|
46
|
+
var _base: any View { base }
|
|
47
|
+
var _sheetContent: any View { content }
|
|
48
|
+
var _fullScreen: Bool { fullScreen }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protocol _DetentsModifying: _TraitBearing {
|
|
52
|
+
var _detents: [String] { get }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
struct _DetentsView<Content: View> {
|
|
56
|
+
let content: Content
|
|
57
|
+
let detents: [String]
|
|
58
|
+
}
|
|
59
|
+
extension _DetentsView: _PrimitiveView {}
|
|
60
|
+
extension _DetentsView: _GroupView {
|
|
61
|
+
var _children: [any View] { [content] }
|
|
62
|
+
}
|
|
63
|
+
extension _DetentsView: _DetentsModifying {
|
|
64
|
+
var _detents: [String] { detents }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
extension View {
|
|
68
|
+
/// Presents a sheet when `isPresented` is true.
|
|
69
|
+
public func sheet<Content: View>(isPresented: Binding<Bool>,
|
|
70
|
+
onDismiss: (@MainActor () -> Void)? = nil,
|
|
71
|
+
@ViewBuilder content: () -> Content) -> some View {
|
|
72
|
+
_SheetView(base: self, isPresented: isPresented, onDismiss: onDismiss, content: content())
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// Presents a sheet for a non-nil item; dismissing sets it back to nil.
|
|
76
|
+
public func sheet<Item: Identifiable, Content: View>(item: Binding<Item?>,
|
|
77
|
+
onDismiss: (@MainActor () -> Void)? = nil,
|
|
78
|
+
@ViewBuilder content: @escaping (Item) -> Content) -> some View {
|
|
79
|
+
let isPresented = Binding<Bool>(
|
|
80
|
+
get: { item.wrappedValue != nil },
|
|
81
|
+
set: { if !$0 { item.wrappedValue = nil } }
|
|
82
|
+
)
|
|
83
|
+
return _SheetView(base: self, isPresented: isPresented, onDismiss: onDismiss,
|
|
84
|
+
content: _ItemSheetContent(item: item, content: content))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// Presents a sheet that fills the screen (`detents: ["full"]`).
|
|
88
|
+
public func fullScreenCover<Content: View>(isPresented: Binding<Bool>,
|
|
89
|
+
onDismiss: (@MainActor () -> Void)? = nil,
|
|
90
|
+
@ViewBuilder content: () -> Content) -> some View {
|
|
91
|
+
_SheetView(base: self, isPresented: isPresented, onDismiss: onDismiss, content: content(), fullScreen: true)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public func fullScreenCover<Item: Identifiable, Content: View>(item: Binding<Item?>,
|
|
95
|
+
onDismiss: (@MainActor () -> Void)? = nil,
|
|
96
|
+
@ViewBuilder content: @escaping (Item) -> Content) -> some View {
|
|
97
|
+
let isPresented = Binding<Bool>(
|
|
98
|
+
get: { item.wrappedValue != nil },
|
|
99
|
+
set: { if !$0 { item.wrappedValue = nil } }
|
|
100
|
+
)
|
|
101
|
+
return _SheetView(base: self, isPresented: isPresented, onDismiss: onDismiss,
|
|
102
|
+
content: _ItemSheetContent(item: item, content: content), fullScreen: true)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public func presentationDetents(_ detents: Set<PresentationDetent>) -> some View {
|
|
106
|
+
// Smallest first: the page presents the sheet at the first.
|
|
107
|
+
let sorted = detents.sorted { ($0._order, $0.name) < ($1._order, $1.name) }
|
|
108
|
+
return _DetentsView(content: self, detents: sorted.map(\.name))
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/// The content of `.sheet(item:)`, built from the current item (empty once it is nil).
|
|
113
|
+
struct _ItemSheetContent<Item: Identifiable, Content: View>: View {
|
|
114
|
+
let item: Binding<Item?>
|
|
115
|
+
let content: (Item) -> Content
|
|
116
|
+
|
|
117
|
+
var body: some View {
|
|
118
|
+
if let value = item.wrappedValue {
|
|
119
|
+
content(value)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|