@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,439 @@
|
|
|
1
|
+
@_exported import Observation
|
|
2
|
+
|
|
3
|
+
public enum ColorScheme: Hashable, Sendable {
|
|
4
|
+
case light, dark
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/// The user's preferred text size.
|
|
8
|
+
public enum DynamicTypeSize: Int, Hashable, Comparable, CaseIterable, Sendable {
|
|
9
|
+
case xSmall, small, medium, large, xLarge, xxLarge, xxxLarge
|
|
10
|
+
case accessibility1, accessibility2, accessibility3, accessibility4, accessibility5
|
|
11
|
+
|
|
12
|
+
public static func < (lhs: DynamicTypeSize, rhs: DynamicTypeSize) -> Bool { lhs.rawValue < rhs.rawValue }
|
|
13
|
+
|
|
14
|
+
public var isAccessibilitySize: Bool { self >= .accessibility1 }
|
|
15
|
+
|
|
16
|
+
var name: String {
|
|
17
|
+
switch self {
|
|
18
|
+
case .xSmall: "xSmall"
|
|
19
|
+
case .small: "small"
|
|
20
|
+
case .medium: "medium"
|
|
21
|
+
case .large: "large"
|
|
22
|
+
case .xLarge: "xLarge"
|
|
23
|
+
case .xxLarge: "xxLarge"
|
|
24
|
+
case .xxxLarge: "xxxLarge"
|
|
25
|
+
case .accessibility1: "accessibility1"
|
|
26
|
+
case .accessibility2: "accessibility2"
|
|
27
|
+
case .accessibility3: "accessibility3"
|
|
28
|
+
case .accessibility4: "accessibility4"
|
|
29
|
+
case .accessibility5: "accessibility5"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
init?(name: String) {
|
|
34
|
+
guard let match = Self.allCases.first(where: { $0.name == name }) else { return nil }
|
|
35
|
+
self = match
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// The horizontal or vertical size class of the window the view is in.
|
|
40
|
+
/// The renderer reports `regular` for screens at least 700 CSS px wide
|
|
41
|
+
/// (see docs/ops-protocol.md, Phase 7); headless runs are compact.
|
|
42
|
+
public enum UserInterfaceSizeClass: Hashable, Sendable {
|
|
43
|
+
case compact, regular
|
|
44
|
+
|
|
45
|
+
init?(name: String) {
|
|
46
|
+
switch name {
|
|
47
|
+
case "compact": self = .compact
|
|
48
|
+
case "regular": self = .regular
|
|
49
|
+
default: return nil
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/// The direction of the writing system: views read it to lay out or draw
|
|
55
|
+
/// differently for right-to-left languages.
|
|
56
|
+
public enum LayoutDirection: Hashable, CaseIterable, Sendable {
|
|
57
|
+
case leftToRight, rightToLeft
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/// A key for custom environment values.
|
|
61
|
+
public protocol EnvironmentKey {
|
|
62
|
+
associatedtype Value
|
|
63
|
+
static var defaultValue: Value { get }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// Dismisses the current presentation: in a navigation stack, pops the screen.
|
|
67
|
+
public struct DismissAction: Sendable {
|
|
68
|
+
let action: @MainActor () -> Void
|
|
69
|
+
/// What this action dismisses (a screen of a stack, a sheet), set by the
|
|
70
|
+
/// runtime, which re-creates the action on every pass: equal identities
|
|
71
|
+
/// make the environments of two passes the same (see `_Sameness`).
|
|
72
|
+
let identity: _RuntimeKey?
|
|
73
|
+
|
|
74
|
+
init(identity: _RuntimeKey? = nil, _ action: @escaping @MainActor () -> Void) {
|
|
75
|
+
self.identity = identity
|
|
76
|
+
self.action = action
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@MainActor public func callAsFunction() { action() }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Values propagated down the view tree.
|
|
83
|
+
public struct EnvironmentValues {
|
|
84
|
+
fileprivate var storage: [ObjectIdentifier: Any] = [:]
|
|
85
|
+
|
|
86
|
+
public init() {}
|
|
87
|
+
|
|
88
|
+
/// Whether every stored value is the same as in `other` (`_Sameness`).
|
|
89
|
+
func _sameStorage(as other: EnvironmentValues) -> Bool {
|
|
90
|
+
guard storage.count == other.storage.count else { return false }
|
|
91
|
+
var budget = _Sameness.budget
|
|
92
|
+
for (key, value) in storage {
|
|
93
|
+
guard let otherValue = other.storage[key], _Sameness.same(value, otherValue, budget: &budget) else { return false }
|
|
94
|
+
}
|
|
95
|
+
return true
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public subscript<K: EnvironmentKey>(key: K.Type) -> K.Value {
|
|
99
|
+
get {
|
|
100
|
+
// An absent entry must fall back to the default even for optional
|
|
101
|
+
// values: `nil as? Optional<V>` would succeed as `.some(nil)`.
|
|
102
|
+
guard let stored = storage[ObjectIdentifier(key)] else { return Self._default(of: key) }
|
|
103
|
+
return stored as? K.Value ?? Self._default(of: key)
|
|
104
|
+
}
|
|
105
|
+
set { storage[ObjectIdentifier(key)] = newValue }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public var colorScheme: ColorScheme {
|
|
109
|
+
get { self[_ColorSchemeKey.self] }
|
|
110
|
+
set { self[_ColorSchemeKey.self] = newValue }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public var dismiss: DismissAction {
|
|
114
|
+
get { self[_DismissKey.self] }
|
|
115
|
+
set { self[_DismissKey.self] = newValue }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public var dynamicTypeSize: DynamicTypeSize {
|
|
119
|
+
get { self[_DynamicTypeSizeKey.self] }
|
|
120
|
+
set { self[_DynamicTypeSizeKey.self] = newValue }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public var isEnabled: Bool {
|
|
124
|
+
get { self[_IsEnabledKey.self] }
|
|
125
|
+
set { self[_IsEnabledKey.self] = newValue }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// `.compact` until the renderer's first `environment` event says otherwise.
|
|
129
|
+
public var horizontalSizeClass: UserInterfaceSizeClass? {
|
|
130
|
+
get { self[_HorizontalSizeClassKey.self] }
|
|
131
|
+
set { self[_HorizontalSizeClassKey.self] = newValue }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// Always `.regular`: the browser never reports a vertically compact window.
|
|
135
|
+
public var verticalSizeClass: UserInterfaceSizeClass? {
|
|
136
|
+
get { self[_VerticalSizeClassKey.self] }
|
|
137
|
+
set { self[_VerticalSizeClassKey.self] = newValue }
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/// `.leftToRight`: the renderer lays out left to right, whatever the
|
|
141
|
+
/// locale. A view may set it (`.environment(\.layoutDirection, …)`) for
|
|
142
|
+
/// the views it contains, which read it; the layout does not mirror.
|
|
143
|
+
public var layoutDirection: LayoutDirection {
|
|
144
|
+
get { self[_LayoutDirectionKey.self] }
|
|
145
|
+
set { self[_LayoutDirectionKey.self] = newValue }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/// The font `.font(_:)` set above this view (a text style or a size;
|
|
149
|
+
/// `.fontWeight` and `.bold` leave it as is), nil for the default body font.
|
|
150
|
+
public var font: Font? {
|
|
151
|
+
get { self[_FontKey.self] }
|
|
152
|
+
set { self[_FontKey.self] = newValue }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Pixels per point: 3, the iPhone the page stands for (`UIScreen.main.scale`).
|
|
156
|
+
public var displayScale: CGFloat {
|
|
157
|
+
get { self[_DisplayScaleKey.self] }
|
|
158
|
+
set { self[_DisplayScaleKey.self] = newValue }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// One pixel, in points.
|
|
162
|
+
public var pixelLength: CGFloat { 1 / displayScale }
|
|
163
|
+
|
|
164
|
+
var _buttonStyle: String {
|
|
165
|
+
get { self[_ButtonStyleKey.self] }
|
|
166
|
+
set { self[_ButtonStyleKey.self] = newValue }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
var _textFieldStyle: String {
|
|
170
|
+
get { self[_TextFieldStyleKey.self] }
|
|
171
|
+
set { self[_TextFieldStyleKey.self] = newValue }
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Objects supplied by `.environmentObject(_:)`, keyed by their type. A
|
|
175
|
+
// type's identifier never collides with an `EnvironmentKey`'s.
|
|
176
|
+
func _object<T: AnyObject>(_ type: T.Type) -> T? {
|
|
177
|
+
storage[ObjectIdentifier(type)] as? T
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
mutating func _setObject<T: AnyObject>(_ object: T) {
|
|
181
|
+
storage[ObjectIdentifier(T.self)] = object
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/// The object stored for a type, looked up dynamically (`@Environment(Favorites.self)`).
|
|
185
|
+
func _anyObject(_ type: Any.Type) -> Any? {
|
|
186
|
+
storage[ObjectIdentifier(type)]
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/// Stores `object` under its dynamic type, for `@Environment(Type.self)` and `@EnvironmentObject`.
|
|
190
|
+
mutating func _setAnyObject(_ object: AnyObject) {
|
|
191
|
+
storage[ObjectIdentifier(type(of: object))] = object
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
extension EnvironmentValues: CustomStringConvertible {
|
|
196
|
+
public var description: String { "EnvironmentValues(\(storage.count) values)" }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/// Lets `@Environment(Type.self)` hand back nil for an optional type that was not supplied.
|
|
200
|
+
protocol _OptionalValue {
|
|
201
|
+
static var _none: Self { get }
|
|
202
|
+
}
|
|
203
|
+
extension Optional: _OptionalValue {
|
|
204
|
+
static var _none: Self { nil }
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
enum _ColorSchemeKey: EnvironmentKey { static let defaultValue = ColorScheme.light }
|
|
208
|
+
enum _DismissKey: EnvironmentKey { static let defaultValue = DismissAction {} }
|
|
209
|
+
enum _IsEnabledKey: EnvironmentKey { static let defaultValue = true }
|
|
210
|
+
enum _DynamicTypeSizeKey: EnvironmentKey { static let defaultValue = DynamicTypeSize.large }
|
|
211
|
+
enum _HorizontalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .compact }
|
|
212
|
+
enum _VerticalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .regular }
|
|
213
|
+
enum _LayoutDirectionKey: EnvironmentKey { static let defaultValue = LayoutDirection.leftToRight }
|
|
214
|
+
enum _FontKey: EnvironmentKey { static let defaultValue: Font? = nil }
|
|
215
|
+
enum _DisplayScaleKey: EnvironmentKey { static let defaultValue: CGFloat = 3 }
|
|
216
|
+
enum _ButtonStyleKey: EnvironmentKey { static let defaultValue = "automatic" }
|
|
217
|
+
enum _TextFieldStyleKey: EnvironmentKey { static let defaultValue = "plain" }
|
|
218
|
+
|
|
219
|
+
// MARK: - @Environment
|
|
220
|
+
|
|
221
|
+
final class _EnvironmentBox {
|
|
222
|
+
var value: Any?
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/// Views expose their `Environment` properties to the runtime through this protocol.
|
|
226
|
+
protocol _EnvironmentProperty: _RuntimeProperty {
|
|
227
|
+
func _resolve(in environment: EnvironmentValues)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// A property wrapper from another module (SwiftData's `@Query`) that reads
|
|
231
|
+
/// the environment of the view it belongs to: the runtime calls `_resolve`
|
|
232
|
+
/// before each run of the view's body, as for `@Environment`. Unlike
|
|
233
|
+
/// `@Environment`, such a property is part of the view's value when the
|
|
234
|
+
/// runtime decides whether a re-created view is unchanged (Phase 16), so a
|
|
235
|
+
/// parent passing a different query re-runs the view.
|
|
236
|
+
public protocol _EnvironmentReading: _RuntimeProperty {
|
|
237
|
+
func _resolve(in environment: EnvironmentValues)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/// Reads a value from the environment the runtime resolved for the view.
|
|
241
|
+
@propertyWrapper
|
|
242
|
+
public struct Environment<Value>: DynamicProperty {
|
|
243
|
+
let keyPath: KeyPath<EnvironmentValues, Value>?
|
|
244
|
+
/// `@Environment(Favorites.self)`: the `@Observable` type to look up (its non-optional form).
|
|
245
|
+
let objectType: Any.Type?
|
|
246
|
+
let box = _EnvironmentBox()
|
|
247
|
+
|
|
248
|
+
public init(_ keyPath: KeyPath<EnvironmentValues, Value>) {
|
|
249
|
+
self.keyPath = keyPath
|
|
250
|
+
objectType = nil
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/// Reads the object when an ancestor supplied one, else nil.
|
|
254
|
+
public init<T: AnyObject & Observable>(_ objectType: T?.Type) where Value == T? {
|
|
255
|
+
keyPath = nil
|
|
256
|
+
self.objectType = T.self
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
public var wrappedValue: Value {
|
|
260
|
+
if let value = box.value as? Value { return value }
|
|
261
|
+
if let keyPath { return EnvironmentValues()[keyPath: keyPath] }
|
|
262
|
+
if let none = Value.self as? any _OptionalValue.Type { return none._none as! Value }
|
|
263
|
+
fatalError("No Observable object of type \(objectType.map { String(describing: $0) } ?? "\(Value.self)") found. A View.environment(_:) for \(objectType.map { String(describing: $0) } ?? "\(Value.self)") may be missing as an ancestor of this view.")
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
extension Environment where Value: AnyObject & Observable {
|
|
268
|
+
/// Reads the `@Observable` object a `.environment(_:)` ancestor supplied; a
|
|
269
|
+
/// missing object is a programming error, as in SwiftUI.
|
|
270
|
+
public init(_ objectType: Value.Type) {
|
|
271
|
+
keyPath = nil
|
|
272
|
+
self.objectType = objectType
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
extension Environment: _EnvironmentProperty {
|
|
277
|
+
func _resolve(in environment: EnvironmentValues) {
|
|
278
|
+
if let keyPath {
|
|
279
|
+
box.value = environment[keyPath: keyPath]
|
|
280
|
+
} else if let objectType {
|
|
281
|
+
box.value = environment._anyObject(objectType)
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// MARK: - .environment(_:_:)
|
|
287
|
+
|
|
288
|
+
protocol _EnvironmentModifying: _TraitBearing {
|
|
289
|
+
func _apply(to environment: inout EnvironmentValues)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
struct _EnvironmentView<Content: View> {
|
|
293
|
+
let content: Content
|
|
294
|
+
let apply: (inout EnvironmentValues) -> Void
|
|
295
|
+
}
|
|
296
|
+
extension _EnvironmentView: _PrimitiveView {}
|
|
297
|
+
extension _EnvironmentView: _GroupView {
|
|
298
|
+
var _children: [any View] { [content] }
|
|
299
|
+
}
|
|
300
|
+
extension _EnvironmentView: _EnvironmentModifying {
|
|
301
|
+
func _apply(to environment: inout EnvironmentValues) { apply(&environment) }
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
nonisolated extension View {
|
|
305
|
+
public func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View {
|
|
306
|
+
_EnvironmentView(content: self) { $0[keyPath: keyPath] = value }
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/// Supplies an `@Observable` object to `@Environment(T.self)` readers below.
|
|
310
|
+
public func environment<T: AnyObject & Observable>(_ object: T?) -> some View {
|
|
311
|
+
_EnvironmentView(content: self) { if let object { $0._setObject(object) } }
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/// The color scheme this view wants for the whole window: the subtree
|
|
315
|
+
/// renders in it and the host switches the page's theme (a root `update`
|
|
316
|
+
/// with `colorScheme`). `nil` returns to the viewer's setting.
|
|
317
|
+
public func preferredColorScheme(_ colorScheme: ColorScheme?) -> some View {
|
|
318
|
+
_PreferredColorSchemeView(content: self, scheme: colorScheme)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
public func dynamicTypeSize(_ size: DynamicTypeSize) -> some View {
|
|
322
|
+
environment(\.dynamicTypeSize, size)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/// Clamps the Dynamic Type size the subtree sees to `range` (`...DynamicTypeSize.xxxLarge`).
|
|
326
|
+
public func dynamicTypeSize<T: RangeExpression>(_ range: T) -> some View where T.Bound == DynamicTypeSize {
|
|
327
|
+
_EnvironmentView(content: self) { environment in
|
|
328
|
+
let current = environment.dynamicTypeSize
|
|
329
|
+
if range.contains(current) { return }
|
|
330
|
+
// The nearest size inside the range.
|
|
331
|
+
let ordered = DynamicTypeSize.allCases.filter { range.contains($0) }
|
|
332
|
+
if let nearest = ordered.min(by: { abs($0.rawValue - current.rawValue) < abs($1.rawValue - current.rawValue) }) {
|
|
333
|
+
environment.dynamicTypeSize = nearest
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/// Read by the runtime, which tells the host; also sets the environment's scheme.
|
|
340
|
+
protocol _PreferredColorSchemeModifying: _TraitBearing {
|
|
341
|
+
var _preferredColorScheme: ColorScheme? { get }
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
struct _PreferredColorSchemeView<Content: View> {
|
|
345
|
+
let content: Content
|
|
346
|
+
let scheme: ColorScheme?
|
|
347
|
+
}
|
|
348
|
+
extension _PreferredColorSchemeView: _PrimitiveView {}
|
|
349
|
+
extension _PreferredColorSchemeView: _GroupView {
|
|
350
|
+
var _children: [any View] { [content] }
|
|
351
|
+
}
|
|
352
|
+
extension _PreferredColorSchemeView: _EnvironmentModifying {
|
|
353
|
+
func _apply(to environment: inout EnvironmentValues) {
|
|
354
|
+
if let scheme { environment.colorScheme = scheme }
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
extension _PreferredColorSchemeView: _PreferredColorSchemeModifying {
|
|
358
|
+
var _preferredColorScheme: ColorScheme? { scheme }
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// MARK: - @Bindable
|
|
362
|
+
|
|
363
|
+
/// Creates bindings to the properties of an `@Observable` object.
|
|
364
|
+
@propertyWrapper
|
|
365
|
+
@dynamicMemberLookup
|
|
366
|
+
public struct Bindable<Value: AnyObject & Observable> {
|
|
367
|
+
public var wrappedValue: Value
|
|
368
|
+
|
|
369
|
+
public init(wrappedValue: Value) { self.wrappedValue = wrappedValue }
|
|
370
|
+
public init(_ wrappedValue: Value) { self.wrappedValue = wrappedValue }
|
|
371
|
+
|
|
372
|
+
public var projectedValue: Bindable<Value> { self }
|
|
373
|
+
|
|
374
|
+
public subscript<Subject>(dynamicMember keyPath: ReferenceWritableKeyPath<Value, Subject>) -> Binding<Subject> {
|
|
375
|
+
let object = wrappedValue
|
|
376
|
+
return Binding(get: { object[keyPath: keyPath] }, set: { object[keyPath: keyPath] = $0 })
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// MARK: - @ScaledMetric
|
|
381
|
+
|
|
382
|
+
/// A value that scales with the Dynamic Type size, like SwiftUI's. The scale
|
|
383
|
+
/// factors follow the body text style's step sizes (17pt at `large`).
|
|
384
|
+
@propertyWrapper
|
|
385
|
+
public struct ScaledMetric<Value: BinaryFloatingPoint>: DynamicProperty {
|
|
386
|
+
let base: Value
|
|
387
|
+
let box = _EnvironmentBox()
|
|
388
|
+
|
|
389
|
+
public init(wrappedValue: Value, relativeTo textStyle: Font.TextStyle = .body) {
|
|
390
|
+
base = wrappedValue
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
public var wrappedValue: Value {
|
|
394
|
+
let size = (box.value as? DynamicTypeSize) ?? .large
|
|
395
|
+
return base * Value(size._bodyScale)
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
extension ScaledMetric: _EnvironmentProperty {
|
|
400
|
+
func _resolve(in environment: EnvironmentValues) {
|
|
401
|
+
box.value = environment.dynamicTypeSize
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
extension DynamicTypeSize {
|
|
406
|
+
/// Body point size at this setting divided by the default 17.
|
|
407
|
+
var _bodyScale: Double {
|
|
408
|
+
let bodySize: Double = switch self {
|
|
409
|
+
case .xSmall: 14
|
|
410
|
+
case .small: 15
|
|
411
|
+
case .medium: 16
|
|
412
|
+
case .large: 17
|
|
413
|
+
case .xLarge: 19
|
|
414
|
+
case .xxLarge: 21
|
|
415
|
+
case .xxxLarge: 23
|
|
416
|
+
case .accessibility1: 28
|
|
417
|
+
case .accessibility2: 33
|
|
418
|
+
case .accessibility3: 40
|
|
419
|
+
case .accessibility4: 47
|
|
420
|
+
case .accessibility5: 53
|
|
421
|
+
}
|
|
422
|
+
return bodySize / 17
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// MARK: - Keys bridged from UIKit traits
|
|
427
|
+
|
|
428
|
+
/// A key whose value, until a view sets it, comes from elsewhere: UIKit's
|
|
429
|
+
/// `UITraitBridgedEnvironmentKey` (iOS 17) reads it from the current traits.
|
|
430
|
+
public protocol _BridgedEnvironmentKey: EnvironmentKey {
|
|
431
|
+
static var _bridgedDefault: Any { get }
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
extension EnvironmentValues {
|
|
435
|
+
static func _default<K: EnvironmentKey>(of key: K.Type) -> K.Value {
|
|
436
|
+
if let bridged = key as? any _BridgedEnvironmentKey.Type, let value = bridged._bridgedDefault as? K.Value { return value }
|
|
437
|
+
return K.defaultValue
|
|
438
|
+
}
|
|
439
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// `Environment` is `Sendable` when its value is, as in SwiftUI, so a
|
|
2
|
+
/// `Sendable` style or modifier may declare `@Environment` properties
|
|
3
|
+
/// (ButtonKit's shake style reads `accessibilityReduceMotion`). The runtime
|
|
4
|
+
/// resolves the property into its box on the main actor before the body
|
|
5
|
+
/// runs, and only the body reads it.
|
|
6
|
+
extension Environment: @unchecked Sendable where Value: Sendable {}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/// `@FocusState`, `.focused(_:)`, `.onSubmit` and `.submitLabel` for text
|
|
2
|
+
/// fields (docs/ops-protocol.md, "Phase 12"). A field inside `.focused(...)`
|
|
3
|
+
/// carries a `focused` prop the host honors (focusing or blurring its input)
|
|
4
|
+
/// and reports `focus` events back; a field inside `.onSubmit` carries
|
|
5
|
+
/// `submit: true` and reports `submit` events (the Enter key).
|
|
6
|
+
|
|
7
|
+
// MARK: - @FocusState
|
|
8
|
+
|
|
9
|
+
/// Which view has keyboard focus: a `Bool` for one field, or an optional
|
|
10
|
+
/// `Hashable` naming one of several. Storage is a `State`, so it persists
|
|
11
|
+
/// across re-renders like SwiftUI's.
|
|
12
|
+
@propertyWrapper
|
|
13
|
+
public struct FocusState<Value: Hashable>: DynamicProperty {
|
|
14
|
+
let state: State<Value>
|
|
15
|
+
|
|
16
|
+
public init() where Value == Bool {
|
|
17
|
+
state = State(wrappedValue: false)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public init<T: Hashable>() where Value == T? {
|
|
21
|
+
state = State(wrappedValue: nil)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public var wrappedValue: Value {
|
|
25
|
+
get { state.wrappedValue }
|
|
26
|
+
nonmutating set { state.wrappedValue = newValue }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public var projectedValue: FocusState<Value>.Binding { Binding(state: state) }
|
|
30
|
+
|
|
31
|
+
/// `$focus`: what `.focused(_:)` and `.focused(_:equals:)` take.
|
|
32
|
+
@propertyWrapper
|
|
33
|
+
public struct Binding {
|
|
34
|
+
let state: State<Value>
|
|
35
|
+
|
|
36
|
+
public var wrappedValue: Value {
|
|
37
|
+
get { state.wrappedValue }
|
|
38
|
+
nonmutating set { state.wrappedValue = newValue }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public var projectedValue: FocusState<Value>.Binding { self }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
extension FocusState: _StateProperty {
|
|
46
|
+
var _box: any _AnyStateBox { state.box }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// What a focused field reads from its environment: whether it should have
|
|
50
|
+
/// focus now, and how to record a focus change the host reports.
|
|
51
|
+
struct _FocusRequest {
|
|
52
|
+
let isFocused: () -> Bool
|
|
53
|
+
let setFocused: (Bool) -> Void
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
enum _FocusKey: EnvironmentKey { nonisolated(unsafe) static let defaultValue: _FocusRequest? = nil }
|
|
57
|
+
enum _OnSubmitKey: EnvironmentKey { nonisolated(unsafe) static let defaultValue: (() -> Void)? = nil }
|
|
58
|
+
enum _SubmitLabelKey: EnvironmentKey { static let defaultValue: String? = nil }
|
|
59
|
+
|
|
60
|
+
extension EnvironmentValues {
|
|
61
|
+
var _focus: _FocusRequest? {
|
|
62
|
+
get { self[_FocusKey.self] }
|
|
63
|
+
set { self[_FocusKey.self] = newValue }
|
|
64
|
+
}
|
|
65
|
+
var _onSubmit: (() -> Void)? {
|
|
66
|
+
get { self[_OnSubmitKey.self] }
|
|
67
|
+
set { self[_OnSubmitKey.self] = newValue }
|
|
68
|
+
}
|
|
69
|
+
var _submitLabel: String? {
|
|
70
|
+
get { self[_SubmitLabelKey.self] }
|
|
71
|
+
set { self[_SubmitLabelKey.self] = newValue }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
nonisolated extension View {
|
|
76
|
+
/// Binds the field's focus to a `@FocusState var isFocused: Bool`.
|
|
77
|
+
public func focused(_ binding: FocusState<Bool>.Binding) -> some View {
|
|
78
|
+
_EnvironmentView(content: self) {
|
|
79
|
+
$0._focus = _FocusRequest(isFocused: { binding.wrappedValue }, setFocused: { binding.wrappedValue = $0 })
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// Binds a field's or text editor's focus to a plain binding: UIKit's
|
|
84
|
+
/// text views (`becomeFirstResponder`) drawn by a representable.
|
|
85
|
+
public func _focused(_ isFocused: Binding<Bool>) -> some View {
|
|
86
|
+
_EnvironmentView(content: self) {
|
|
87
|
+
$0._focus = _FocusRequest(isFocused: { isFocused.wrappedValue }, setFocused: { isFocused.wrappedValue = $0 })
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// Binds the field's focus to one case of a `@FocusState var field: Field?`.
|
|
92
|
+
public func focused<Value: Hashable>(_ binding: FocusState<Value?>.Binding, equals value: Value) -> some View {
|
|
93
|
+
_EnvironmentView(content: self) {
|
|
94
|
+
$0._focus = _FocusRequest(
|
|
95
|
+
isFocused: { binding.wrappedValue == value },
|
|
96
|
+
setFocused: { focused in
|
|
97
|
+
if focused {
|
|
98
|
+
binding.wrappedValue = value
|
|
99
|
+
} else if binding.wrappedValue == value {
|
|
100
|
+
binding.wrappedValue = nil
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// MARK: - onSubmit / submitLabel
|
|
108
|
+
|
|
109
|
+
public struct SubmitTriggers: OptionSet, Sendable {
|
|
110
|
+
public let rawValue: Int
|
|
111
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
112
|
+
public static let text = SubmitTriggers(rawValue: 1)
|
|
113
|
+
public static let search = SubmitTriggers(rawValue: 2)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// The label of the keyboard's return key (`enterkeyhint` in the browser).
|
|
117
|
+
public enum SubmitLabel: String, Hashable, Sendable {
|
|
118
|
+
case done, go, send, join, route, search, `return`, next, `continue`
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
nonisolated extension View {
|
|
122
|
+
/// Runs `action` when a text field in this view submits (the Enter key).
|
|
123
|
+
public func onSubmit(of triggers: SubmitTriggers = .text, _ action: @escaping () -> Void) -> some View {
|
|
124
|
+
_EnvironmentView(content: self) { $0._onSubmit = action }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public func submitLabel(_ label: SubmitLabel) -> some View {
|
|
128
|
+
_EnvironmentView(content: self) { $0._submitLabel = label.rawValue }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// A host view whose event handler needs the environment (the focus and
|
|
133
|
+
/// submit closures a text field inherits); checked by the runtime ahead of
|
|
134
|
+
/// `_HostView._handler`.
|
|
135
|
+
protocol _EnvironmentHandling: _TraitBearing {
|
|
136
|
+
func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)?
|
|
137
|
+
}
|