@swiftbrowser/swift 0.1.0 → 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 +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 +65 -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 +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- 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 +67 -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 +80 -10
- 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 +11 -2
- 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 +164 -37
- 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 +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- 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 +10 -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 +498 -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 +39 -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
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
/// Increments or decrements a value. Kind `stepper`, props `canIncrement` /
|
|
8
8
|
/// `canDecrement`; the child is the label (dropped by `labelsHidden`). A
|
|
9
9
|
/// `step` event with `1` / `-1` applies the step within the bounds.
|
|
10
|
+
import Foundation
|
|
11
|
+
|
|
10
12
|
public struct Stepper<Label: View> {
|
|
11
13
|
let label: Label
|
|
12
14
|
let increment: () -> Void
|
|
@@ -51,6 +53,7 @@ public struct Stepper<Label: View> {
|
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
extension Stepper where Label == Text {
|
|
56
|
+
@_disfavoredOverload
|
|
54
57
|
public init<S: StringProtocol>(_ title: S, onIncrement: (() -> Void)?, onDecrement: (() -> Void)?,
|
|
55
58
|
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
56
59
|
self.init(label: { Text(title) }, onIncrement: onIncrement, onDecrement: onDecrement,
|
|
@@ -211,13 +214,6 @@ extension Slider: _HostView {
|
|
|
211
214
|
|
|
212
215
|
// MARK: - DatePicker
|
|
213
216
|
|
|
214
|
-
/// A value a `DatePicker` can select: a point in time as seconds since 1970
|
|
215
|
-
/// (UTC). `FoundationLite` conforms `Date`; the shim itself has no date type.
|
|
216
|
-
public protocol _DatePickerValue {
|
|
217
|
-
var _secondsSince1970: Double { get }
|
|
218
|
-
init(_secondsSince1970: Double)
|
|
219
|
-
}
|
|
220
|
-
|
|
221
217
|
/// Which parts of a date a `DatePicker` shows.
|
|
222
218
|
public struct DatePickerComponents: OptionSet, Sendable {
|
|
223
219
|
public let rawValue: UInt
|
|
@@ -243,10 +239,10 @@ public struct DatePicker<Label: View> {
|
|
|
243
239
|
let components: DatePickerComponents
|
|
244
240
|
let set: (Double) -> Void
|
|
245
241
|
|
|
246
|
-
init
|
|
242
|
+
init(selection: Binding<Date>, minimum: Double?, maximum: Double?,
|
|
247
243
|
displayedComponents: DatePickerComponents, label: Label) {
|
|
248
244
|
self.label = label
|
|
249
|
-
seconds = selection.wrappedValue.
|
|
245
|
+
seconds = selection.wrappedValue.timeIntervalSince1970
|
|
250
246
|
self.minimum = minimum
|
|
251
247
|
self.maximum = maximum
|
|
252
248
|
components = displayedComponents
|
|
@@ -254,77 +250,81 @@ public struct DatePicker<Label: View> {
|
|
|
254
250
|
var clamped = value
|
|
255
251
|
if let minimum { clamped = max(clamped, minimum) }
|
|
256
252
|
if let maximum { clamped = min(clamped, maximum) }
|
|
257
|
-
selection.wrappedValue =
|
|
253
|
+
selection.wrappedValue = Date(timeIntervalSince1970: clamped)
|
|
258
254
|
}
|
|
259
255
|
}
|
|
260
256
|
|
|
261
|
-
public init
|
|
257
|
+
public init(selection: Binding<Date>,
|
|
262
258
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
263
259
|
@ViewBuilder label: () -> Label) {
|
|
264
260
|
self.init(selection: selection, minimum: nil, maximum: nil, displayedComponents: displayedComponents,
|
|
265
261
|
label: label())
|
|
266
262
|
}
|
|
267
263
|
|
|
268
|
-
public init
|
|
264
|
+
public init(selection: Binding<Date>, in range: ClosedRange<Date>,
|
|
269
265
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
270
266
|
@ViewBuilder label: () -> Label) {
|
|
271
|
-
self.init(selection: selection, minimum: range.lowerBound.
|
|
272
|
-
maximum: range.upperBound.
|
|
267
|
+
self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970,
|
|
268
|
+
maximum: range.upperBound.timeIntervalSince1970, displayedComponents: displayedComponents,
|
|
273
269
|
label: label())
|
|
274
270
|
}
|
|
275
271
|
|
|
276
|
-
public init
|
|
272
|
+
public init(selection: Binding<Date>, in range: PartialRangeFrom<Date>,
|
|
277
273
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
278
274
|
@ViewBuilder label: () -> Label) {
|
|
279
|
-
self.init(selection: selection, minimum: range.lowerBound.
|
|
275
|
+
self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970, maximum: nil,
|
|
280
276
|
displayedComponents: displayedComponents, label: label())
|
|
281
277
|
}
|
|
282
278
|
|
|
283
|
-
public init
|
|
279
|
+
public init(selection: Binding<Date>, in range: PartialRangeThrough<Date>,
|
|
284
280
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
285
281
|
@ViewBuilder label: () -> Label) {
|
|
286
|
-
self.init(selection: selection, minimum: nil, maximum: range.upperBound.
|
|
282
|
+
self.init(selection: selection, minimum: nil, maximum: range.upperBound.timeIntervalSince1970,
|
|
287
283
|
displayedComponents: displayedComponents, label: label())
|
|
288
284
|
}
|
|
289
285
|
}
|
|
290
286
|
|
|
291
287
|
extension DatePicker where Label == Text {
|
|
292
|
-
|
|
288
|
+
@_disfavoredOverload
|
|
289
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>,
|
|
293
290
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
294
291
|
self.init(selection: selection, displayedComponents: displayedComponents) { Text(title) }
|
|
295
292
|
}
|
|
296
293
|
|
|
297
|
-
|
|
294
|
+
@_disfavoredOverload
|
|
295
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: ClosedRange<Date>,
|
|
298
296
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
299
297
|
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
|
|
300
298
|
}
|
|
301
299
|
|
|
302
|
-
|
|
300
|
+
@_disfavoredOverload
|
|
301
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
|
|
303
302
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
304
303
|
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
|
|
305
304
|
}
|
|
306
305
|
|
|
307
|
-
|
|
306
|
+
@_disfavoredOverload
|
|
307
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
|
|
308
308
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
309
309
|
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
-
public init
|
|
312
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>,
|
|
313
313
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
314
314
|
self.init(selection: selection, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
315
315
|
}
|
|
316
316
|
|
|
317
|
-
public init
|
|
317
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: ClosedRange<Date>,
|
|
318
318
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
319
319
|
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
320
320
|
}
|
|
321
321
|
|
|
322
|
-
public init
|
|
322
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
|
|
323
323
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
324
324
|
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
325
325
|
}
|
|
326
326
|
|
|
327
|
-
public init
|
|
327
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
|
|
328
328
|
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
329
329
|
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
330
330
|
}
|
|
@@ -369,14 +369,15 @@ extension DatePickerStyle where Self == WheelDatePickerStyle {
|
|
|
369
369
|
public static var wheel: WheelDatePickerStyle { WheelDatePickerStyle() }
|
|
370
370
|
}
|
|
371
371
|
|
|
372
|
-
extension View {
|
|
372
|
+
nonisolated extension View {
|
|
373
373
|
public func datePickerStyle<S: DatePickerStyle>(_ style: S) -> some View { self }
|
|
374
374
|
}
|
|
375
375
|
|
|
376
376
|
// MARK: - TextEditor
|
|
377
377
|
|
|
378
378
|
/// Multi-line editable text. Kind `texteditor`, props `text`; `text` events
|
|
379
|
-
/// set the binding, as for `textfield`.
|
|
379
|
+
/// set the binding, as for `textfield`. Inside `.focused(...)` (or UIKit's
|
|
380
|
+
/// `_focused`) it carries `focused` and handles `focus` events, as a field does.
|
|
380
381
|
public struct TextEditor {
|
|
381
382
|
let text: Binding<String>
|
|
382
383
|
public init(text: Binding<String>) { self.text = text }
|
|
@@ -384,11 +385,27 @@ public struct TextEditor {
|
|
|
384
385
|
extension TextEditor: _PrimitiveView {}
|
|
385
386
|
extension TextEditor: _HostView {
|
|
386
387
|
var _kind: String { "texteditor" }
|
|
387
|
-
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
388
|
-
|
|
388
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
389
|
+
var props: [String: _JSON] = ["text": .string(text.wrappedValue)]
|
|
390
|
+
if let focus = environment._focus { props["focused"] = .bool(focus.isFocused()) }
|
|
391
|
+
return .object(props)
|
|
392
|
+
}
|
|
393
|
+
var _handler: ((_JSON) -> Void)? { _handler(in: EnvironmentValues()) }
|
|
394
|
+
}
|
|
395
|
+
extension TextEditor: _EnvironmentHandling {
|
|
396
|
+
/// Text (`"value"` as a string) and `focus` (`{type, value: Bool}`) events.
|
|
397
|
+
func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)? {
|
|
389
398
|
let text = self.text
|
|
399
|
+
let focus = environment._focus
|
|
390
400
|
return { payload in
|
|
391
|
-
|
|
401
|
+
switch payload {
|
|
402
|
+
case .string(let value):
|
|
403
|
+
text.wrappedValue = value
|
|
404
|
+
case .object(let fields):
|
|
405
|
+
if case .string("focus")? = fields["type"], case .bool(let focused)? = fields["value"] { focus?.setFocused(focused) }
|
|
406
|
+
default:
|
|
407
|
+
break
|
|
408
|
+
}
|
|
392
409
|
}
|
|
393
410
|
}
|
|
394
411
|
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// `PhaseAnimator` and `.phaseAnimator` (iOS 17): the content goes through
|
|
2
|
+
// its phases one after another, each change animated with the animation the
|
|
3
|
+
// phase asks for. A task moves to the next phase once the previous change's
|
|
4
|
+
// animation has had its time (its duration and delay), as SwiftUI waits for
|
|
5
|
+
// it to finish. Without a trigger the phases cycle while the view is shown;
|
|
6
|
+
// with one, each change of the trigger runs through them once, back to the
|
|
7
|
+
// first.
|
|
8
|
+
|
|
9
|
+
public struct PhaseAnimator<Phase: Equatable, Content: View>: View {
|
|
10
|
+
let phases: [Phase]
|
|
11
|
+
let trigger: _PhaseTrigger?
|
|
12
|
+
let content: (Phase) -> Content
|
|
13
|
+
let animation: (Phase) -> Animation?
|
|
14
|
+
|
|
15
|
+
@State private var index = 0
|
|
16
|
+
@State private var runs = 0
|
|
17
|
+
|
|
18
|
+
/// Cycles through `phases` while the view is shown.
|
|
19
|
+
public init(_ phases: some Sequence<Phase>,
|
|
20
|
+
@ViewBuilder content: @escaping (Phase) -> Content,
|
|
21
|
+
animation: @escaping (Phase) -> Animation? = { _ in .default }) {
|
|
22
|
+
self.phases = Array(phases)
|
|
23
|
+
trigger = nil
|
|
24
|
+
self.content = content
|
|
25
|
+
self.animation = animation
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// Runs through `phases` once each time `trigger` changes.
|
|
29
|
+
public init(_ phases: some Sequence<Phase>, trigger: some Equatable,
|
|
30
|
+
@ViewBuilder content: @escaping (Phase) -> Content,
|
|
31
|
+
animation: @escaping (Phase) -> Animation? = { _ in .default }) {
|
|
32
|
+
self.phases = Array(phases)
|
|
33
|
+
self.trigger = _PhaseTrigger(trigger)
|
|
34
|
+
self.content = content
|
|
35
|
+
self.animation = animation
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public var body: some View {
|
|
39
|
+
let phase = phases.isEmpty ? nil : phases[min(index, phases.count - 1)]
|
|
40
|
+
Group {
|
|
41
|
+
if let phase { content(phase) }
|
|
42
|
+
}
|
|
43
|
+
.onChange(of: trigger) { runs += 1 }
|
|
44
|
+
.task(id: runs) {
|
|
45
|
+
if trigger == nil {
|
|
46
|
+
await cycle()
|
|
47
|
+
} else if runs > 0 {
|
|
48
|
+
await runOnce()
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Moves to the phase at `next`, animated, and waits for the animation.
|
|
54
|
+
@MainActor
|
|
55
|
+
private func advance(to next: Int) async -> Bool {
|
|
56
|
+
let animation = animation(phases[next])
|
|
57
|
+
withAnimation(animation) { index = next }
|
|
58
|
+
// The timeline's clock: virtual in tests, the executor's in headless runs.
|
|
59
|
+
await _TimelineClock.sleep(max(0.05, animation.map { $0._settlingTime } ?? 0.05))
|
|
60
|
+
return !Task.isCancelled
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@MainActor
|
|
64
|
+
private func cycle() async {
|
|
65
|
+
guard phases.count > 1 else { return }
|
|
66
|
+
while !Task.isCancelled {
|
|
67
|
+
guard await advance(to: (index + 1) % phases.count) else { return }
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@MainActor
|
|
72
|
+
private func runOnce() async {
|
|
73
|
+
guard phases.count > 1 else { return }
|
|
74
|
+
for next in Array(1..<phases.count) + [0] {
|
|
75
|
+
guard await advance(to: next) else { return }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// A trigger compared by its value (`some Equatable`, not `Hashable`).
|
|
81
|
+
struct _PhaseTrigger: Equatable {
|
|
82
|
+
let value: Any
|
|
83
|
+
let equals: (Any) -> Bool
|
|
84
|
+
|
|
85
|
+
init<T: Equatable>(_ value: T) {
|
|
86
|
+
self.value = value
|
|
87
|
+
equals = { ($0 as? T) == value }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static func == (lhs: _PhaseTrigger, rhs: _PhaseTrigger) -> Bool { lhs.equals(rhs.value) }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
extension Animation {
|
|
94
|
+
/// How long a change in this animation takes to settle: its delay and
|
|
95
|
+
/// duration, repeated as it repeats (a forever-repeating one: once).
|
|
96
|
+
var _settlingTime: Double {
|
|
97
|
+
let count = repeatForever ? 1 : Double(repeatCount ?? 1)
|
|
98
|
+
return delayBy + duration * count
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
nonisolated extension View {
|
|
103
|
+
/// The view goes through `phases` as `PhaseAnimator` does; `content`
|
|
104
|
+
/// changes the view for each phase.
|
|
105
|
+
@MainActor
|
|
106
|
+
public func phaseAnimator<Phase: Equatable>(
|
|
107
|
+
_ phases: some Sequence<Phase>,
|
|
108
|
+
@ViewBuilder content: @escaping (PlaceholderContentView<Self>, Phase) -> some View,
|
|
109
|
+
animation: @escaping (Phase) -> Animation? = { _ in .default }
|
|
110
|
+
) -> some View {
|
|
111
|
+
PhaseAnimator(phases, content: { content(PlaceholderContentView(self), $0) }, animation: animation)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@MainActor
|
|
115
|
+
public func phaseAnimator<Phase: Equatable>(
|
|
116
|
+
_ phases: some Sequence<Phase>, trigger: some Equatable,
|
|
117
|
+
@ViewBuilder content: @escaping (PlaceholderContentView<Self>, Phase) -> some View,
|
|
118
|
+
animation: @escaping (Phase) -> Animation? = { _ in .default }
|
|
119
|
+
) -> some View {
|
|
120
|
+
PhaseAnimator(phases, trigger: trigger, content: { content(PlaceholderContentView(self), $0) }, animation: animation)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// The view a `.phaseAnimator` (or another modifier that hands its content
|
|
125
|
+
/// to a closure) changes: it draws that view.
|
|
126
|
+
public struct PlaceholderContentView<Value: View>: View {
|
|
127
|
+
let content: Value
|
|
128
|
+
init(_ content: Value) { self.content = content }
|
|
129
|
+
public var body: some View { content }
|
|
130
|
+
}
|
|
@@ -39,7 +39,7 @@ extension PickerStyle where Self == WheelPickerStyle {
|
|
|
39
39
|
public static var wheel: WheelPickerStyle { WheelPickerStyle() }
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
extension View {
|
|
42
|
+
nonisolated extension View {
|
|
43
43
|
public func pickerStyle<S: PickerStyle>(_ style: S) -> some View {
|
|
44
44
|
environment(\._pickerStyle, style._name)
|
|
45
45
|
}
|
|
@@ -62,7 +62,7 @@ extension EnvironmentValues {
|
|
|
62
62
|
|
|
63
63
|
// MARK: - Picker
|
|
64
64
|
|
|
65
|
-
protocol _PickerHost {
|
|
65
|
+
protocol _PickerHost: _TraitBearing {
|
|
66
66
|
var _labelView: any View { get }
|
|
67
67
|
var _options: any View { get }
|
|
68
68
|
func _selectedIndex(tags: [AnyHashable?]) -> Int
|
|
@@ -86,6 +86,13 @@ public struct Picker<Label: View, SelectionValue: Hashable, Content: View> {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
extension Picker where Label == Text {
|
|
89
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<SelectionValue>, @ViewBuilder content: () -> Content) {
|
|
90
|
+
self.label = Text(titleKey)
|
|
91
|
+
self.selection = selection
|
|
92
|
+
self.content = content()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@_disfavoredOverload
|
|
89
96
|
public init<S: StringProtocol>(_ title: S, selection: Binding<SelectionValue>,
|
|
90
97
|
@ViewBuilder content: () -> Content) {
|
|
91
98
|
self.label = Text(title)
|
|
@@ -119,6 +126,8 @@ extension Picker: _PickerHost {
|
|
|
119
126
|
@MainActor
|
|
120
127
|
func _textContent(of view: any View) -> String {
|
|
121
128
|
if let text = view as? Text { return text.content }
|
|
129
|
+
if let text = view as? _PlainText { return text.content }
|
|
130
|
+
if let text = view as? _RichText { return text.text.content }
|
|
122
131
|
if let label = view as? any _TabItemProviding { return _textContent(of: label._tabLabel) }
|
|
123
132
|
if let tagged = view as? any _TagProviding { return _textContent(of: tagged._tagged) }
|
|
124
133
|
if let group = view as? any _GroupView {
|
|
@@ -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
|
+
}
|