@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,411 @@
|
|
|
1
|
+
/// `Stepper`, `Slider`, `DatePicker` and `TextEditor`: the `stepper`,
|
|
2
|
+
/// `slider`, `datepicker` and `texteditor` elements (docs/ops-protocol.md,
|
|
3
|
+
/// Phase 8). Each control's handler receives the event's `value`.
|
|
4
|
+
|
|
5
|
+
// MARK: - Stepper
|
|
6
|
+
|
|
7
|
+
/// Increments or decrements a value. Kind `stepper`, props `canIncrement` /
|
|
8
|
+
/// `canDecrement`; the child is the label (dropped by `labelsHidden`). A
|
|
9
|
+
/// `step` event with `1` / `-1` applies the step within the bounds.
|
|
10
|
+
import Foundation
|
|
11
|
+
|
|
12
|
+
public struct Stepper<Label: View> {
|
|
13
|
+
let label: Label
|
|
14
|
+
let increment: () -> Void
|
|
15
|
+
let decrement: () -> Void
|
|
16
|
+
let canIncrement: Bool
|
|
17
|
+
let canDecrement: Bool
|
|
18
|
+
let onEditingChanged: (Bool) -> Void
|
|
19
|
+
|
|
20
|
+
public init(@ViewBuilder label: () -> Label,
|
|
21
|
+
onIncrement: (() -> Void)?,
|
|
22
|
+
onDecrement: (() -> Void)?,
|
|
23
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
24
|
+
self.label = label()
|
|
25
|
+
increment = onIncrement ?? {}
|
|
26
|
+
decrement = onDecrement ?? {}
|
|
27
|
+
canIncrement = onIncrement != nil
|
|
28
|
+
canDecrement = onDecrement != nil
|
|
29
|
+
self.onEditingChanged = onEditingChanged
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public init<V: Strideable>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride = 1,
|
|
33
|
+
@ViewBuilder label: () -> Label,
|
|
34
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
35
|
+
self.label = label()
|
|
36
|
+
increment = { value.wrappedValue = min(value.wrappedValue.advanced(by: step), bounds.upperBound) }
|
|
37
|
+
decrement = { value.wrappedValue = max(value.wrappedValue.advanced(by: -step), bounds.lowerBound) }
|
|
38
|
+
canIncrement = value.wrappedValue < bounds.upperBound
|
|
39
|
+
canDecrement = value.wrappedValue > bounds.lowerBound
|
|
40
|
+
self.onEditingChanged = onEditingChanged
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public init<V: Strideable>(value: Binding<V>, step: V.Stride = 1,
|
|
44
|
+
@ViewBuilder label: () -> Label,
|
|
45
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
46
|
+
self.label = label()
|
|
47
|
+
increment = { value.wrappedValue = value.wrappedValue.advanced(by: step) }
|
|
48
|
+
decrement = { value.wrappedValue = value.wrappedValue.advanced(by: -step) }
|
|
49
|
+
canIncrement = true
|
|
50
|
+
canDecrement = true
|
|
51
|
+
self.onEditingChanged = onEditingChanged
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
extension Stepper where Label == Text {
|
|
56
|
+
@_disfavoredOverload
|
|
57
|
+
public init<S: StringProtocol>(_ title: S, onIncrement: (() -> Void)?, onDecrement: (() -> Void)?,
|
|
58
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
59
|
+
self.init(label: { Text(title) }, onIncrement: onIncrement, onDecrement: onDecrement,
|
|
60
|
+
onEditingChanged: onEditingChanged)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public init<S: StringProtocol, V: Strideable>(_ title: S, value: Binding<V>, in bounds: ClosedRange<V>,
|
|
64
|
+
step: V.Stride = 1,
|
|
65
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
66
|
+
self.init(value: value, in: bounds, step: step, label: { Text(title) }, onEditingChanged: onEditingChanged)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public init<S: StringProtocol, V: Strideable>(_ title: S, value: Binding<V>, step: V.Stride = 1,
|
|
70
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
71
|
+
self.init(value: value, step: step, label: { Text(title) }, onEditingChanged: onEditingChanged)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public init(_ titleKey: LocalizedStringKey, onIncrement: (() -> Void)?, onDecrement: (() -> Void)?,
|
|
75
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
76
|
+
self.init(label: { Text(titleKey) }, onIncrement: onIncrement, onDecrement: onDecrement,
|
|
77
|
+
onEditingChanged: onEditingChanged)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public init<V: Strideable>(_ titleKey: LocalizedStringKey, value: Binding<V>, in bounds: ClosedRange<V>,
|
|
81
|
+
step: V.Stride = 1, onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
82
|
+
self.init(value: value, in: bounds, step: step, label: { Text(titleKey) }, onEditingChanged: onEditingChanged)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public init<V: Strideable>(_ titleKey: LocalizedStringKey, value: Binding<V>, step: V.Stride = 1,
|
|
86
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in }) {
|
|
87
|
+
self.init(value: value, step: step, label: { Text(titleKey) }, onEditingChanged: onEditingChanged)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
extension Stepper: _PrimitiveView {}
|
|
92
|
+
extension Stepper: _HostView {
|
|
93
|
+
var _kind: String { "stepper" }
|
|
94
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
95
|
+
.object(["canIncrement": .bool(canIncrement), "canDecrement": .bool(canDecrement)])
|
|
96
|
+
}
|
|
97
|
+
var _content: [any View] { Label.self is EmptyView.Type ? [] : [_GaugeLabel(label: label)] }
|
|
98
|
+
var _handler: ((_JSON) -> Void)? {
|
|
99
|
+
let increment = self.increment
|
|
100
|
+
let decrement = self.decrement
|
|
101
|
+
let canIncrement = self.canIncrement
|
|
102
|
+
let canDecrement = self.canDecrement
|
|
103
|
+
let onEditingChanged = self.onEditingChanged
|
|
104
|
+
return { payload in
|
|
105
|
+
guard case .number(let direction) = payload, direction != 0 else { return }
|
|
106
|
+
if direction > 0, !canIncrement { return }
|
|
107
|
+
if direction < 0, !canDecrement { return }
|
|
108
|
+
onEditingChanged(true)
|
|
109
|
+
direction > 0 ? increment() : decrement()
|
|
110
|
+
onEditingChanged(false)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// MARK: - Slider
|
|
116
|
+
|
|
117
|
+
/// Selects a value from a range. Kind `slider`, props `value`, `min`, `max`,
|
|
118
|
+
/// `step` (null when free) and `labels`, which names the children present in
|
|
119
|
+
/// order: `"label"`, `"min"` (minimumValueLabel), `"max"` (maximumValueLabel).
|
|
120
|
+
public struct Slider<Label: View, ValueLabel: View> {
|
|
121
|
+
let value: Double
|
|
122
|
+
let bounds: ClosedRange<Double>
|
|
123
|
+
let step: Double?
|
|
124
|
+
let set: (Double) -> Void
|
|
125
|
+
let label: Label
|
|
126
|
+
let minimumValueLabel: ValueLabel
|
|
127
|
+
let maximumValueLabel: ValueLabel
|
|
128
|
+
let onEditingChanged: (Bool) -> Void
|
|
129
|
+
|
|
130
|
+
init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride?,
|
|
131
|
+
label: Label, minimumValueLabel: ValueLabel, maximumValueLabel: ValueLabel,
|
|
132
|
+
onEditingChanged: @escaping (Bool) -> Void) where V.Stride: BinaryFloatingPoint {
|
|
133
|
+
self.value = Double(value.wrappedValue)
|
|
134
|
+
self.bounds = Double(bounds.lowerBound)...Double(bounds.upperBound)
|
|
135
|
+
self.step = step.map { Double($0) }
|
|
136
|
+
let range = bounds
|
|
137
|
+
set = { value.wrappedValue = min(max(V($0), range.lowerBound), range.upperBound) }
|
|
138
|
+
self.label = label
|
|
139
|
+
self.minimumValueLabel = minimumValueLabel
|
|
140
|
+
self.maximumValueLabel = maximumValueLabel
|
|
141
|
+
self.onEditingChanged = onEditingChanged
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride? = nil,
|
|
145
|
+
@ViewBuilder label: () -> Label,
|
|
146
|
+
@ViewBuilder minimumValueLabel: () -> ValueLabel,
|
|
147
|
+
@ViewBuilder maximumValueLabel: () -> ValueLabel,
|
|
148
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in })
|
|
149
|
+
where V.Stride: BinaryFloatingPoint {
|
|
150
|
+
self.init(value: value, in: bounds, step: step, label: label(),
|
|
151
|
+
minimumValueLabel: minimumValueLabel(), maximumValueLabel: maximumValueLabel(),
|
|
152
|
+
onEditingChanged: onEditingChanged)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
extension Slider where ValueLabel == EmptyView {
|
|
157
|
+
public init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V>, step: V.Stride? = nil,
|
|
158
|
+
@ViewBuilder label: () -> Label,
|
|
159
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in })
|
|
160
|
+
where V.Stride: BinaryFloatingPoint {
|
|
161
|
+
self.init(value: value, in: bounds, step: step, label: label(),
|
|
162
|
+
minimumValueLabel: EmptyView(), maximumValueLabel: EmptyView(),
|
|
163
|
+
onEditingChanged: onEditingChanged)
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
extension Slider where Label == EmptyView, ValueLabel == EmptyView {
|
|
168
|
+
public init<V: BinaryFloatingPoint>(value: Binding<V>, in bounds: ClosedRange<V> = 0...1, step: V.Stride? = nil,
|
|
169
|
+
onEditingChanged: @escaping (Bool) -> Void = { _ in })
|
|
170
|
+
where V.Stride: BinaryFloatingPoint {
|
|
171
|
+
self.init(value: value, in: bounds, step: step, label: EmptyView(),
|
|
172
|
+
minimumValueLabel: EmptyView(), maximumValueLabel: EmptyView(),
|
|
173
|
+
onEditingChanged: onEditingChanged)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
extension Slider: _PrimitiveView {}
|
|
178
|
+
extension Slider: _HostView {
|
|
179
|
+
var _kind: String { "slider" }
|
|
180
|
+
|
|
181
|
+
private var hasValueLabels: Bool { !(ValueLabel.self is EmptyView.Type) }
|
|
182
|
+
|
|
183
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
184
|
+
var labels: [_JSON] = []
|
|
185
|
+
if !(Label.self is EmptyView.Type), !environment.labelsHidden { labels.append(.string("label")) }
|
|
186
|
+
if hasValueLabels { labels += [.string("min"), .string("max")] }
|
|
187
|
+
return .object([
|
|
188
|
+
"value": .number(value),
|
|
189
|
+
"min": .number(bounds.lowerBound),
|
|
190
|
+
"max": .number(bounds.upperBound),
|
|
191
|
+
"step": step.map(_JSON.number) ?? .null,
|
|
192
|
+
"labels": .array(labels),
|
|
193
|
+
])
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
var _content: [any View] {
|
|
197
|
+
var children: [any View] = []
|
|
198
|
+
if !(Label.self is EmptyView.Type) { children.append(_GaugeLabel(label: label)) }
|
|
199
|
+
if hasValueLabels { children += [minimumValueLabel, maximumValueLabel] }
|
|
200
|
+
return children
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
var _handler: ((_JSON) -> Void)? {
|
|
204
|
+
let set = self.set
|
|
205
|
+
let onEditingChanged = self.onEditingChanged
|
|
206
|
+
return { payload in
|
|
207
|
+
guard case .number(let value) = payload else { return }
|
|
208
|
+
onEditingChanged(true)
|
|
209
|
+
set(value)
|
|
210
|
+
onEditingChanged(false)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// MARK: - DatePicker
|
|
216
|
+
|
|
217
|
+
/// Which parts of a date a `DatePicker` shows.
|
|
218
|
+
public struct DatePickerComponents: OptionSet, Sendable {
|
|
219
|
+
public let rawValue: UInt
|
|
220
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
221
|
+
public static let hourAndMinute = DatePickerComponents(rawValue: 1 << 0)
|
|
222
|
+
public static let date = DatePickerComponents(rawValue: 1 << 1)
|
|
223
|
+
|
|
224
|
+
var _name: String {
|
|
225
|
+
if self == .date { return "date" }
|
|
226
|
+
if self == .hourAndMinute { return "hourAndMinute" }
|
|
227
|
+
return "dateAndTime"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/// Picks a date and/or time. Kind `datepicker`, props `seconds`, `components`,
|
|
232
|
+
/// `min`, `max`; the child is the label (dropped by `labelsHidden`). A `date`
|
|
233
|
+
/// event carries the new seconds since 1970.
|
|
234
|
+
public struct DatePicker<Label: View> {
|
|
235
|
+
let label: Label
|
|
236
|
+
let seconds: Double
|
|
237
|
+
let minimum: Double?
|
|
238
|
+
let maximum: Double?
|
|
239
|
+
let components: DatePickerComponents
|
|
240
|
+
let set: (Double) -> Void
|
|
241
|
+
|
|
242
|
+
init(selection: Binding<Date>, minimum: Double?, maximum: Double?,
|
|
243
|
+
displayedComponents: DatePickerComponents, label: Label) {
|
|
244
|
+
self.label = label
|
|
245
|
+
seconds = selection.wrappedValue.timeIntervalSince1970
|
|
246
|
+
self.minimum = minimum
|
|
247
|
+
self.maximum = maximum
|
|
248
|
+
components = displayedComponents
|
|
249
|
+
set = { value in
|
|
250
|
+
var clamped = value
|
|
251
|
+
if let minimum { clamped = max(clamped, minimum) }
|
|
252
|
+
if let maximum { clamped = min(clamped, maximum) }
|
|
253
|
+
selection.wrappedValue = Date(timeIntervalSince1970: clamped)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
public init(selection: Binding<Date>,
|
|
258
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
259
|
+
@ViewBuilder label: () -> Label) {
|
|
260
|
+
self.init(selection: selection, minimum: nil, maximum: nil, displayedComponents: displayedComponents,
|
|
261
|
+
label: label())
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
public init(selection: Binding<Date>, in range: ClosedRange<Date>,
|
|
265
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
266
|
+
@ViewBuilder label: () -> Label) {
|
|
267
|
+
self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970,
|
|
268
|
+
maximum: range.upperBound.timeIntervalSince1970, displayedComponents: displayedComponents,
|
|
269
|
+
label: label())
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
public init(selection: Binding<Date>, in range: PartialRangeFrom<Date>,
|
|
273
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
274
|
+
@ViewBuilder label: () -> Label) {
|
|
275
|
+
self.init(selection: selection, minimum: range.lowerBound.timeIntervalSince1970, maximum: nil,
|
|
276
|
+
displayedComponents: displayedComponents, label: label())
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
public init(selection: Binding<Date>, in range: PartialRangeThrough<Date>,
|
|
280
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date],
|
|
281
|
+
@ViewBuilder label: () -> Label) {
|
|
282
|
+
self.init(selection: selection, minimum: nil, maximum: range.upperBound.timeIntervalSince1970,
|
|
283
|
+
displayedComponents: displayedComponents, label: label())
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
extension DatePicker where Label == Text {
|
|
288
|
+
@_disfavoredOverload
|
|
289
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>,
|
|
290
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
291
|
+
self.init(selection: selection, displayedComponents: displayedComponents) { Text(title) }
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
@_disfavoredOverload
|
|
295
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: ClosedRange<Date>,
|
|
296
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
297
|
+
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
@_disfavoredOverload
|
|
301
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
|
|
302
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
303
|
+
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
@_disfavoredOverload
|
|
307
|
+
public init<S: StringProtocol>(_ title: S, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
|
|
308
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
309
|
+
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(title) }
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>,
|
|
313
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
314
|
+
self.init(selection: selection, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: ClosedRange<Date>,
|
|
318
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
319
|
+
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeFrom<Date>,
|
|
323
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
324
|
+
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
public init(_ titleKey: LocalizedStringKey, selection: Binding<Date>, in range: PartialRangeThrough<Date>,
|
|
328
|
+
displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
|
|
329
|
+
self.init(selection: selection, in: range, displayedComponents: displayedComponents) { Text(titleKey) }
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
extension DatePicker: _PrimitiveView {}
|
|
334
|
+
extension DatePicker: _HostView {
|
|
335
|
+
var _kind: String { "datepicker" }
|
|
336
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
337
|
+
.object([
|
|
338
|
+
"seconds": .number(seconds),
|
|
339
|
+
"components": .string(components._name),
|
|
340
|
+
"min": minimum.map(_JSON.number) ?? .null,
|
|
341
|
+
"max": maximum.map(_JSON.number) ?? .null,
|
|
342
|
+
])
|
|
343
|
+
}
|
|
344
|
+
var _content: [any View] { Label.self is EmptyView.Type ? [] : [_GaugeLabel(label: label)] }
|
|
345
|
+
var _handler: ((_JSON) -> Void)? {
|
|
346
|
+
let set = self.set
|
|
347
|
+
return { payload in
|
|
348
|
+
if case .number(let seconds) = payload { set(seconds) }
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/// `.datePickerStyle`: accepted for source compatibility; pickers are compact.
|
|
354
|
+
public protocol DatePickerStyle {}
|
|
355
|
+
public struct DefaultDatePickerStyle: DatePickerStyle { public init() {} }
|
|
356
|
+
public struct CompactDatePickerStyle: DatePickerStyle { public init() {} }
|
|
357
|
+
public struct GraphicalDatePickerStyle: DatePickerStyle { public init() {} }
|
|
358
|
+
public struct WheelDatePickerStyle: DatePickerStyle { public init() {} }
|
|
359
|
+
extension DatePickerStyle where Self == DefaultDatePickerStyle {
|
|
360
|
+
public static var automatic: DefaultDatePickerStyle { DefaultDatePickerStyle() }
|
|
361
|
+
}
|
|
362
|
+
extension DatePickerStyle where Self == CompactDatePickerStyle {
|
|
363
|
+
public static var compact: CompactDatePickerStyle { CompactDatePickerStyle() }
|
|
364
|
+
}
|
|
365
|
+
extension DatePickerStyle where Self == GraphicalDatePickerStyle {
|
|
366
|
+
public static var graphical: GraphicalDatePickerStyle { GraphicalDatePickerStyle() }
|
|
367
|
+
}
|
|
368
|
+
extension DatePickerStyle where Self == WheelDatePickerStyle {
|
|
369
|
+
public static var wheel: WheelDatePickerStyle { WheelDatePickerStyle() }
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
nonisolated extension View {
|
|
373
|
+
public func datePickerStyle<S: DatePickerStyle>(_ style: S) -> some View { self }
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// MARK: - TextEditor
|
|
377
|
+
|
|
378
|
+
/// Multi-line editable text. Kind `texteditor`, props `text`; `text` events
|
|
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.
|
|
381
|
+
public struct TextEditor {
|
|
382
|
+
let text: Binding<String>
|
|
383
|
+
public init(text: Binding<String>) { self.text = text }
|
|
384
|
+
}
|
|
385
|
+
extension TextEditor: _PrimitiveView {}
|
|
386
|
+
extension TextEditor: _HostView {
|
|
387
|
+
var _kind: String { "texteditor" }
|
|
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)? {
|
|
398
|
+
let text = self.text
|
|
399
|
+
let focus = environment._focus
|
|
400
|
+
return { payload in
|
|
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
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
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
|
+
}
|