@swiftbrowser/swift 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +200 -9
- package/README.md +7 -9
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +0 -4
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +104 -28
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Toolbar.swift +52 -16
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -1,57 +1,15 @@
|
|
|
1
|
-
/// Edit mode, `EditButton`, `ForEach.onDelete` / `onMove
|
|
2
|
-
///
|
|
1
|
+
/// Edit mode, `EditButton`, `ForEach.onDelete` / `onMove` and `refreshable`.
|
|
2
|
+
/// See docs/ops-protocol.md, "Phase 8: interaction".
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
/// A set of offsets into a collection, as `onDelete` / `onMove` report and
|
|
7
|
-
/// `remove(atOffsets:)` / `move(fromOffsets:toOffset:)` consume. Foundation's
|
|
8
|
-
/// `IndexSet` is not in FoundationEssentials, so the shim is generic over this
|
|
9
|
-
/// protocol: `FoundationLite.IndexSet` conforms, and `_IndexSetLite` serves
|
|
10
|
-
/// apps that import neither (it is what `onDelete` infers when nothing else
|
|
11
|
-
/// pins the type).
|
|
12
|
-
public protocol _OffsetSet {
|
|
13
|
-
init(_offsets: [Int])
|
|
14
|
-
/// The offsets in ascending order, without duplicates.
|
|
15
|
-
var _offsets: [Int] { get }
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/// A minimal `IndexSet`: sorted unique integers.
|
|
19
|
-
public struct _IndexSetLite: _OffsetSet, Hashable, Sendable, Sequence, ExpressibleByArrayLiteral {
|
|
20
|
-
public private(set) var _offsets: [Int]
|
|
21
|
-
|
|
22
|
-
public init(_offsets: [Int]) {
|
|
23
|
-
self._offsets = Array(Set(_offsets)).sorted()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public init() { _offsets = [] }
|
|
27
|
-
public init(integer: Int) { _offsets = [integer] }
|
|
28
|
-
public init<S: Sequence>(_ elements: S) where S.Element == Int { self.init(_offsets: Array(elements)) }
|
|
29
|
-
public init(arrayLiteral elements: Int...) { self.init(_offsets: elements) }
|
|
30
|
-
public init(integersIn range: Range<Int>) { _offsets = Array(range) }
|
|
31
|
-
|
|
32
|
-
public var count: Int { _offsets.count }
|
|
33
|
-
public var isEmpty: Bool { _offsets.isEmpty }
|
|
34
|
-
public var first: Int? { _offsets.first }
|
|
35
|
-
public var last: Int? { _offsets.last }
|
|
36
|
-
public func contains(_ integer: Int) -> Bool { _offsets.contains(integer) }
|
|
37
|
-
|
|
38
|
-
public mutating func insert(_ integer: Int) {
|
|
39
|
-
guard !contains(integer) else { return }
|
|
40
|
-
_offsets.append(integer)
|
|
41
|
-
_offsets.sort()
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
public mutating func remove(_ integer: Int) {
|
|
45
|
-
_offsets.removeAll { $0 == integer }
|
|
46
|
-
}
|
|
4
|
+
import Foundation
|
|
47
5
|
|
|
48
|
-
|
|
49
|
-
}
|
|
6
|
+
// MARK: - Offset sets
|
|
50
7
|
|
|
51
8
|
extension RangeReplaceableCollection {
|
|
52
|
-
/// Removes the elements at `offsets` (offsets from `startIndex`)
|
|
53
|
-
|
|
54
|
-
|
|
9
|
+
/// Removes the elements at `offsets` (offsets from `startIndex`), as
|
|
10
|
+
/// SwiftUI's `onDelete` handlers do.
|
|
11
|
+
public mutating func remove(atOffsets offsets: IndexSet) {
|
|
12
|
+
for offset in offsets.sorted(by: >) where offset >= 0 && offset < count {
|
|
55
13
|
remove(at: index(startIndex, offsetBy: offset))
|
|
56
14
|
}
|
|
57
15
|
}
|
|
@@ -60,8 +18,8 @@ extension RangeReplaceableCollection {
|
|
|
60
18
|
extension MutableCollection where Self: RangeReplaceableCollection {
|
|
61
19
|
/// Moves the elements at `source` so that they start at `destination`
|
|
62
20
|
/// (an offset into the collection before the move), like Foundation's.
|
|
63
|
-
public mutating func move
|
|
64
|
-
let offsets = source.
|
|
21
|
+
public mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
|
|
22
|
+
let offsets = source.filter { $0 >= 0 && $0 < count }
|
|
65
23
|
guard !offsets.isEmpty else { return }
|
|
66
24
|
let moving = offsets.map { self[index(startIndex, offsetBy: $0)] }
|
|
67
25
|
let before = offsets.filter { $0 < destination }.count
|
|
@@ -86,7 +44,7 @@ extension ForEach: DynamicViewContent where Content: View {}
|
|
|
86
44
|
|
|
87
45
|
/// A keyed group whose rows a `List` can delete (and, when the renderer learns
|
|
88
46
|
/// to, move). The runtime wraps each row in a `listrow` with `deletable`.
|
|
89
|
-
protocol _DeletableGroup {
|
|
47
|
+
protocol _DeletableGroup: _TraitBearing {
|
|
90
48
|
/// Calls the group's `onDelete` with the row at `offset`; nil without one.
|
|
91
49
|
var _delete: ((Int) -> Void)? { get }
|
|
92
50
|
var _move: ((Int, Int) -> Void)? { get }
|
|
@@ -104,6 +62,7 @@ extension _EditableForEach: DynamicViewContent {
|
|
|
104
62
|
extension _EditableForEach: _GroupView {
|
|
105
63
|
var _children: [any View] { (base as? any _GroupView)?._children ?? [base] }
|
|
106
64
|
var _keys: [AnyHashable]? { (base as? any _GroupView)?._keys }
|
|
65
|
+
var _spreads: Bool { (base as? any _GroupView)?._spreads ?? false }
|
|
107
66
|
}
|
|
108
67
|
extension _EditableForEach: _DeletableGroup {
|
|
109
68
|
var _delete: ((Int) -> Void)? { delete }
|
|
@@ -113,46 +72,29 @@ extension _EditableForEach: _DeletableGroup {
|
|
|
113
72
|
extension DynamicViewContent {
|
|
114
73
|
/// Lets a `List` delete the rows: `action` receives the offsets of the
|
|
115
74
|
/// removed elements in `data`. Pass `nil` to opt out.
|
|
116
|
-
public func onDelete
|
|
117
|
-
_EditableForEach(base: self, delete: action.map { action in { action(
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/// The offsets default to `_IndexSetLite` when nothing else pins the type.
|
|
121
|
-
public func onDelete(perform action: ((_IndexSetLite) -> Void)?) -> _EditableForEach<Self> {
|
|
122
|
-
_EditableForEach(base: self, delete: action.map { action in { action(_IndexSetLite(_offsets: [$0])) } }, move: nil)
|
|
75
|
+
public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Self> {
|
|
76
|
+
_EditableForEach(base: self, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: nil)
|
|
123
77
|
}
|
|
124
78
|
|
|
125
79
|
/// Accepted for source compatibility; the renderer offers no reordering yet.
|
|
126
|
-
public func onMove
|
|
127
|
-
_EditableForEach(base: self, delete: nil, move: action.map { action in { action(
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
public func onMove(perform action: ((_IndexSetLite, Int) -> Void)?) -> _EditableForEach<Self> {
|
|
131
|
-
_EditableForEach(base: self, delete: nil, move: action.map { action in { action(_IndexSetLite(_offsets: [$0]), $1) } })
|
|
80
|
+
public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Self> {
|
|
81
|
+
_EditableForEach(base: self, delete: nil, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
|
|
132
82
|
}
|
|
133
83
|
}
|
|
134
84
|
|
|
135
85
|
extension _EditableForEach {
|
|
136
86
|
/// `ForEach(...).onDelete(...).onMove(...)`: the second modifier merges into the first.
|
|
137
|
-
public func onDelete
|
|
138
|
-
_EditableForEach(base: base, delete: action.map { action in { action(
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
public func onDelete(perform action: ((_IndexSetLite) -> Void)?) -> _EditableForEach<Base> {
|
|
142
|
-
_EditableForEach(base: base, delete: action.map { action in { action(_IndexSetLite(_offsets: [$0])) } }, move: move)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public func onMove<O: _OffsetSet>(perform action: ((O, Int) -> Void)?) -> _EditableForEach<Base> {
|
|
146
|
-
_EditableForEach(base: base, delete: delete, move: action.map { action in { action(O(_offsets: [$0]), $1) } })
|
|
87
|
+
public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Base> {
|
|
88
|
+
_EditableForEach(base: base, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: move)
|
|
147
89
|
}
|
|
148
90
|
|
|
149
|
-
public func onMove(perform action: ((
|
|
150
|
-
_EditableForEach(base: base, delete: delete, move: action.map { action in { action(
|
|
91
|
+
public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Base> {
|
|
92
|
+
_EditableForEach(base: base, delete: delete, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
|
|
151
93
|
}
|
|
152
94
|
}
|
|
153
95
|
|
|
154
96
|
/// `.deleteDisabled` / `.moveDisabled` on a row.
|
|
155
|
-
protocol _RowEditingDisabling {
|
|
97
|
+
protocol _RowEditingDisabling: _TraitBearing {
|
|
156
98
|
var _deleteDisabled: Bool { get }
|
|
157
99
|
}
|
|
158
100
|
|
|
@@ -168,7 +110,7 @@ extension _DeleteDisabledView: _RowEditingDisabling {
|
|
|
168
110
|
var _deleteDisabled: Bool { disabled }
|
|
169
111
|
}
|
|
170
112
|
|
|
171
|
-
extension View {
|
|
113
|
+
nonisolated extension View {
|
|
172
114
|
public func deleteDisabled(_ isDisabled: Bool) -> some View {
|
|
173
115
|
_DeleteDisabledView(content: self, disabled: isDisabled)
|
|
174
116
|
}
|
|
@@ -228,10 +170,11 @@ extension EnvironmentValues {
|
|
|
228
170
|
}
|
|
229
171
|
}
|
|
230
172
|
|
|
231
|
-
extension View {
|
|
173
|
+
nonisolated extension View {
|
|
232
174
|
/// Pull to refresh on the `List` or `ScrollView` this modifies: the view
|
|
233
175
|
/// shows a spinner (`refreshing`) while `action` runs.
|
|
234
|
-
|
|
176
|
+
/// The action runs in the caller's actor context, as `.task`'s does.
|
|
177
|
+
public func refreshable(@_inheritActorContext action: @escaping @Sendable () async -> Void) -> some View {
|
|
235
178
|
environment(\._refreshAction, action)
|
|
236
179
|
}
|
|
237
180
|
}
|
|
@@ -59,7 +59,7 @@ extension Image {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
extension View {
|
|
62
|
+
nonisolated extension View {
|
|
63
63
|
/// Translates the rendered view without affecting layout.
|
|
64
64
|
public func offset(x: CGFloat = 0, y: CGFloat = 0) -> some View {
|
|
65
65
|
_styled { $0.extras["offset"] = .object(["x": .number(x), "y": .number(y)]) }
|
|
@@ -175,6 +175,13 @@ extension View {
|
|
|
175
175
|
_styled { $0.extras["tint"] = tint?._json ?? .null }
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
/// A style as the tint. The page tints with a color: a gradient tints
|
|
179
|
+
/// with its first color, any other style with the accent color.
|
|
180
|
+
@_disfavoredOverload
|
|
181
|
+
public func tint<S: ShapeStyle>(_ tint: S?) -> some View {
|
|
182
|
+
_styled { $0.extras["tint"] = tint.map { _tintColor(of: $0._json) } ?? .null }
|
|
183
|
+
}
|
|
184
|
+
|
|
178
185
|
public func imageScale(_ scale: Image.Scale) -> some View {
|
|
179
186
|
_styled { $0.extras["imageScale"] = .string(scale.name) }
|
|
180
187
|
}
|
|
@@ -186,6 +193,11 @@ extension View {
|
|
|
186
193
|
_styled { $0.extras["badge"] = count == 0 ? .null : .string(String(count)) }
|
|
187
194
|
}
|
|
188
195
|
|
|
196
|
+
public func badge(_ key: LocalizedStringKey?) -> some View {
|
|
197
|
+
_styled { $0.extras["badge"] = key.map { .string($0.key) } ?? .null }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
@_disfavoredOverload
|
|
189
201
|
public func badge<S: StringProtocol>(_ label: S?) -> some View {
|
|
190
202
|
_styled { $0.extras["badge"] = label.map { .string(String($0)) } ?? .null }
|
|
191
203
|
}
|
|
@@ -204,10 +216,14 @@ extension View {
|
|
|
204
216
|
public func listItemTint(_ tint: Color?) -> some View { self }
|
|
205
217
|
public func formStyle<S: FormStyle>(_ style: S) -> some View { self }
|
|
206
218
|
public func headerProminence(_ prominence: Prominence) -> some View { self }
|
|
207
|
-
|
|
219
|
+
/// The shape of this container: what a `ContainerRelativeShape`, a
|
|
220
|
+
/// `.background(_:)` and a `.clipShape(.containerRelative)` below take
|
|
221
|
+
/// the corners of (its corner radius; a custom shape's are square).
|
|
222
|
+
public func containerShape<T: Shape>(_ shape: T) -> some View {
|
|
223
|
+
environment(\._containerShapeRadius, shape._cornerRadius)
|
|
224
|
+
}
|
|
208
225
|
public func symbolVariant(_ variant: SymbolVariants) -> some View { self }
|
|
209
226
|
public func symbolRenderingMode(_ mode: SymbolRenderingMode?) -> some View { self }
|
|
210
|
-
public func blendMode(_ mode: BlendMode) -> some View { self }
|
|
211
227
|
public func contentTransition(_ transition: ContentTransition) -> some View { self }
|
|
212
228
|
public func textSelection<S: TextSelectability>(_ selectability: S) -> some View { self }
|
|
213
229
|
public func toolbarRole(_ role: ToolbarRole) -> some View { self }
|
|
@@ -235,6 +251,52 @@ public enum BlendMode: Hashable, Sendable {
|
|
|
235
251
|
case normal, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight,
|
|
236
252
|
difference, exclusion, hue, saturation, color, luminosity, sourceAtop, destinationOver,
|
|
237
253
|
destinationOut, plusDarker, plusLighter
|
|
254
|
+
|
|
255
|
+
/// The CSS `mix-blend-mode` (the Porter-Duff modes and `plusDarker`,
|
|
256
|
+
/// which CSS has no counterpart for, draw normally).
|
|
257
|
+
var _css: String {
|
|
258
|
+
switch self {
|
|
259
|
+
case .multiply: "multiply"
|
|
260
|
+
case .screen: "screen"
|
|
261
|
+
case .overlay: "overlay"
|
|
262
|
+
case .darken: "darken"
|
|
263
|
+
case .lighten: "lighten"
|
|
264
|
+
case .colorDodge: "color-dodge"
|
|
265
|
+
case .colorBurn: "color-burn"
|
|
266
|
+
case .softLight: "soft-light"
|
|
267
|
+
case .hardLight: "hard-light"
|
|
268
|
+
case .difference: "difference"
|
|
269
|
+
case .exclusion: "exclusion"
|
|
270
|
+
case .hue: "hue"
|
|
271
|
+
case .saturation: "saturation"
|
|
272
|
+
case .color: "color"
|
|
273
|
+
case .luminosity: "luminosity"
|
|
274
|
+
case .plusLighter: "plus-lighter"
|
|
275
|
+
case .normal, .sourceAtop, .destinationOver, .destinationOut, .plusDarker: "normal"
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/// How `drawingGroup` renders (accepted for source compatibility).
|
|
281
|
+
public enum ColorRenderingMode: Hashable, Sendable {
|
|
282
|
+
case nonLinear, linear, extendedLinear
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
nonisolated extension View {
|
|
286
|
+
/// Draws the view in front of its siblings with a lower index (CSS
|
|
287
|
+
/// `z-index`); siblings with the same index draw in order.
|
|
288
|
+
public func zIndex(_ value: Double) -> some View {
|
|
289
|
+
_styled { $0.extras["zIndex"] = .number(value) }
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/// Blends the view with what is behind it (CSS `mix-blend-mode`).
|
|
293
|
+
public func blendMode(_ mode: BlendMode) -> some View {
|
|
294
|
+
_styled { $0.extras["blendMode"] = .string(mode._css) }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// Renders the view offscreen before showing it; the browser composites
|
|
298
|
+
/// it already, so it draws the same.
|
|
299
|
+
public func drawingGroup(opaque: Bool = false, colorMode: ColorRenderingMode = .nonLinear) -> some View { self }
|
|
238
300
|
}
|
|
239
301
|
|
|
240
302
|
public struct SafeAreaRegions: OptionSet, Sendable {
|
|
@@ -270,21 +332,57 @@ public enum ToolbarRole: Hashable, Sendable { case automatic, navigationStack, b
|
|
|
270
332
|
/// `.onTapGesture`: a `tapgesture` element whose tap event runs the action.
|
|
271
333
|
struct _TapGestureView<Content: View> {
|
|
272
334
|
let content: Content
|
|
273
|
-
let action: @MainActor () -> Void
|
|
335
|
+
let action: @MainActor (CGPoint) -> Void
|
|
336
|
+
/// The action takes the tap's location: the page sends it (`location`).
|
|
337
|
+
var wantsLocation = false
|
|
338
|
+
|
|
339
|
+
init(content: Content, action: @escaping @MainActor () -> Void) {
|
|
340
|
+
self.content = content
|
|
341
|
+
self.action = { _ in action() }
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
init(content: Content, locatedAction: @escaping @MainActor (CGPoint) -> Void) {
|
|
345
|
+
self.content = content
|
|
346
|
+
self.action = locatedAction
|
|
347
|
+
wantsLocation = true
|
|
348
|
+
}
|
|
274
349
|
}
|
|
275
350
|
extension _TapGestureView: _PrimitiveView {}
|
|
276
351
|
extension _TapGestureView: _HostView {
|
|
277
352
|
var _kind: String { "tapgesture" }
|
|
278
|
-
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
353
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
354
|
+
wantsLocation ? .object(["location": .bool(true)]) : .object([:])
|
|
355
|
+
}
|
|
279
356
|
var _content: [any View] { [content] }
|
|
280
357
|
var _handler: ((_JSON) -> Void)? {
|
|
281
358
|
let action = self.action
|
|
282
|
-
return {
|
|
359
|
+
return { payload in
|
|
360
|
+
var point = CGPoint.zero
|
|
361
|
+
if case .object(let fields) = payload, case .number(let x)? = fields["x"], case .number(let y)? = fields["y"] {
|
|
362
|
+
point = CGPoint(x: x, y: y)
|
|
363
|
+
}
|
|
364
|
+
MainActor.assumeIsolated { action(point) }
|
|
365
|
+
}
|
|
283
366
|
}
|
|
284
367
|
}
|
|
285
368
|
|
|
286
|
-
extension View {
|
|
369
|
+
nonisolated extension View {
|
|
287
370
|
public func onTapGesture(count: Int = 1, perform action: @escaping @MainActor () -> Void) -> some View {
|
|
288
371
|
_TapGestureView(content: self, action: action)
|
|
289
372
|
}
|
|
290
373
|
}
|
|
374
|
+
|
|
375
|
+
/// The color a style tints with: a color as it is, a gradient's first color,
|
|
376
|
+
/// else the accent color.
|
|
377
|
+
func _tintColor(of style: _JSON) -> _JSON {
|
|
378
|
+
guard case .object(let fields) = style else { return .object(["name": .string("accent")]) }
|
|
379
|
+
if fields["r"] != nil || fields["name"] != nil || fields["named"] != nil { return style }
|
|
380
|
+
if let color = fields["colorGradient"] { return color }
|
|
381
|
+
for key in ["linearGradient", "radialGradient", "angularGradient", "ellipticalGradient"] {
|
|
382
|
+
if case .object(let gradient)? = fields[key], case .array(let stops)? = gradient["stops"],
|
|
383
|
+
case .object(let first)? = stops.first, let color = first["color"] {
|
|
384
|
+
return color
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return .object(["name": .string("accent")])
|
|
388
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// `@Entry`: declares an environment value in one line,
|
|
2
|
+
// `extension EnvironmentValues { @Entry var isCompact = false }`. The macro
|
|
3
|
+
// (Sources/SwiftDataMacros/EntryMacro.swift) writes the `EnvironmentKey` and
|
|
4
|
+
// the computed property over it, as Apple's does.
|
|
5
|
+
|
|
6
|
+
@attached(accessor)
|
|
7
|
+
@attached(peer, names: prefixed(__Key_))
|
|
8
|
+
public macro Entry() = #externalMacro(module: "SwiftDataMacros", type: "EntryMacro")
|
|
@@ -51,6 +51,12 @@ public enum UserInterfaceSizeClass: Hashable, Sendable {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
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
|
+
|
|
54
60
|
/// A key for custom environment values.
|
|
55
61
|
public protocol EnvironmentKey {
|
|
56
62
|
associatedtype Value
|
|
@@ -60,24 +66,41 @@ public protocol EnvironmentKey {
|
|
|
60
66
|
/// Dismisses the current presentation: in a navigation stack, pops the screen.
|
|
61
67
|
public struct DismissAction: Sendable {
|
|
62
68
|
let action: @MainActor () -> Void
|
|
63
|
-
|
|
64
|
-
|
|
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
|
+
}
|
|
65
78
|
|
|
66
79
|
@MainActor public func callAsFunction() { action() }
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
/// Values propagated down the view tree.
|
|
70
83
|
public struct EnvironmentValues {
|
|
71
|
-
|
|
84
|
+
fileprivate var storage: [ObjectIdentifier: Any] = [:]
|
|
72
85
|
|
|
73
86
|
public init() {}
|
|
74
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
|
+
|
|
75
98
|
public subscript<K: EnvironmentKey>(key: K.Type) -> K.Value {
|
|
76
99
|
get {
|
|
77
100
|
// An absent entry must fall back to the default even for optional
|
|
78
101
|
// values: `nil as? Optional<V>` would succeed as `.some(nil)`.
|
|
79
|
-
guard let stored = storage[ObjectIdentifier(key)] else { return
|
|
80
|
-
return stored as? K.Value ??
|
|
102
|
+
guard let stored = storage[ObjectIdentifier(key)] else { return Self._default(of: key) }
|
|
103
|
+
return stored as? K.Value ?? Self._default(of: key)
|
|
81
104
|
}
|
|
82
105
|
set { storage[ObjectIdentifier(key)] = newValue }
|
|
83
106
|
}
|
|
@@ -114,6 +137,30 @@ public struct EnvironmentValues {
|
|
|
114
137
|
set { self[_VerticalSizeClassKey.self] = newValue }
|
|
115
138
|
}
|
|
116
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
|
+
|
|
117
164
|
var _buttonStyle: String {
|
|
118
165
|
get { self[_ButtonStyleKey.self] }
|
|
119
166
|
set { self[_ButtonStyleKey.self] = newValue }
|
|
@@ -138,6 +185,15 @@ public struct EnvironmentValues {
|
|
|
138
185
|
func _anyObject(_ type: Any.Type) -> Any? {
|
|
139
186
|
storage[ObjectIdentifier(type)]
|
|
140
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)" }
|
|
141
197
|
}
|
|
142
198
|
|
|
143
199
|
/// Lets `@Environment(Type.self)` hand back nil for an optional type that was not supplied.
|
|
@@ -154,6 +210,9 @@ enum _IsEnabledKey: EnvironmentKey { static let defaultValue = true }
|
|
|
154
210
|
enum _DynamicTypeSizeKey: EnvironmentKey { static let defaultValue = DynamicTypeSize.large }
|
|
155
211
|
enum _HorizontalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .compact }
|
|
156
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 }
|
|
157
216
|
enum _ButtonStyleKey: EnvironmentKey { static let defaultValue = "automatic" }
|
|
158
217
|
enum _TextFieldStyleKey: EnvironmentKey { static let defaultValue = "plain" }
|
|
159
218
|
|
|
@@ -164,7 +223,17 @@ final class _EnvironmentBox {
|
|
|
164
223
|
}
|
|
165
224
|
|
|
166
225
|
/// Views expose their `Environment` properties to the runtime through this protocol.
|
|
167
|
-
protocol _EnvironmentProperty {
|
|
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 {
|
|
168
237
|
func _resolve(in environment: EnvironmentValues)
|
|
169
238
|
}
|
|
170
239
|
|
|
@@ -216,7 +285,7 @@ extension Environment: _EnvironmentProperty {
|
|
|
216
285
|
|
|
217
286
|
// MARK: - .environment(_:_:)
|
|
218
287
|
|
|
219
|
-
protocol _EnvironmentModifying {
|
|
288
|
+
protocol _EnvironmentModifying: _TraitBearing {
|
|
220
289
|
func _apply(to environment: inout EnvironmentValues)
|
|
221
290
|
}
|
|
222
291
|
|
|
@@ -232,7 +301,7 @@ extension _EnvironmentView: _EnvironmentModifying {
|
|
|
232
301
|
func _apply(to environment: inout EnvironmentValues) { apply(&environment) }
|
|
233
302
|
}
|
|
234
303
|
|
|
235
|
-
extension View {
|
|
304
|
+
nonisolated extension View {
|
|
236
305
|
public func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View {
|
|
237
306
|
_EnvironmentView(content: self) { $0[keyPath: keyPath] = value }
|
|
238
307
|
}
|
|
@@ -268,7 +337,7 @@ extension View {
|
|
|
268
337
|
}
|
|
269
338
|
|
|
270
339
|
/// Read by the runtime, which tells the host; also sets the environment's scheme.
|
|
271
|
-
protocol _PreferredColorSchemeModifying {
|
|
340
|
+
protocol _PreferredColorSchemeModifying: _TraitBearing {
|
|
272
341
|
var _preferredColorScheme: ColorScheme? { get }
|
|
273
342
|
}
|
|
274
343
|
|
|
@@ -353,3 +422,18 @@ extension DynamicTypeSize {
|
|
|
353
422
|
return bodySize / 17
|
|
354
423
|
}
|
|
355
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 {}
|
|
@@ -72,7 +72,7 @@ extension EnvironmentValues {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
extension View {
|
|
75
|
+
nonisolated extension View {
|
|
76
76
|
/// Binds the field's focus to a `@FocusState var isFocused: Bool`.
|
|
77
77
|
public func focused(_ binding: FocusState<Bool>.Binding) -> some View {
|
|
78
78
|
_EnvironmentView(content: self) {
|
|
@@ -80,6 +80,14 @@ extension View {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
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
|
+
|
|
83
91
|
/// Binds the field's focus to one case of a `@FocusState var field: Field?`.
|
|
84
92
|
public func focused<Value: Hashable>(_ binding: FocusState<Value?>.Binding, equals value: Value) -> some View {
|
|
85
93
|
_EnvironmentView(content: self) {
|
|
@@ -110,7 +118,7 @@ public enum SubmitLabel: String, Hashable, Sendable {
|
|
|
110
118
|
case done, go, send, join, route, search, `return`, next, `continue`
|
|
111
119
|
}
|
|
112
120
|
|
|
113
|
-
extension View {
|
|
121
|
+
nonisolated extension View {
|
|
114
122
|
/// Runs `action` when a text field in this view submits (the Enter key).
|
|
115
123
|
public func onSubmit(of triggers: SubmitTriggers = .text, _ action: @escaping () -> Void) -> some View {
|
|
116
124
|
_EnvironmentView(content: self) { $0._onSubmit = action }
|
|
@@ -124,6 +132,6 @@ extension View {
|
|
|
124
132
|
/// A host view whose event handler needs the environment (the focus and
|
|
125
133
|
/// submit closures a text field inherits); checked by the runtime ahead of
|
|
126
134
|
/// `_HostView._handler`.
|
|
127
|
-
protocol _EnvironmentHandling {
|
|
135
|
+
protocol _EnvironmentHandling: _TraitBearing {
|
|
128
136
|
func _handler(in environment: EnvironmentValues) -> ((_JSON) -> Void)?
|
|
129
137
|
}
|
|
@@ -70,7 +70,7 @@ extension EnvironmentValues {
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
extension View {
|
|
73
|
+
nonisolated extension View {
|
|
74
74
|
public func gaugeStyle<S: GaugeStyle>(_ style: S) -> some View {
|
|
75
75
|
environment(\.gaugeStyle, (style as? any _NamedGaugeStyle)?._name ?? "automatic")
|
|
76
76
|
}
|
|
@@ -209,6 +209,7 @@ extension ProgressView where Label == EmptyView, CurrentValueLabel == EmptyView
|
|
|
209
209
|
}
|
|
210
210
|
|
|
211
211
|
extension ProgressView where Label == Text, CurrentValueLabel == EmptyView {
|
|
212
|
+
@_disfavoredOverload
|
|
212
213
|
public init<S: StringProtocol>(_ title: S) {
|
|
213
214
|
fraction = nil
|
|
214
215
|
label = Text(title)
|
|
@@ -272,7 +273,7 @@ extension ProgressViewStyle where Self == CircularProgressViewStyle {
|
|
|
272
273
|
public static var circular: CircularProgressViewStyle { CircularProgressViewStyle() }
|
|
273
274
|
}
|
|
274
275
|
|
|
275
|
-
extension View {
|
|
276
|
+
nonisolated extension View {
|
|
276
277
|
public func progressViewStyle<S: ProgressViewStyle>(_ style: S) -> some View { self }
|
|
277
278
|
}
|
|
278
279
|
|