@swiftbrowser/swift 0.1.0 → 0.3.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 +68 -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 +125 -10
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +100 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +26 -10
- 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 +71 -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 +88 -12
- 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 +14 -4
- 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 +168 -39
- 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 +86 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
- 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 +46 -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 +524 -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 +41 -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,20 +216,41 @@ 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 }
|
|
214
|
-
|
|
230
|
+
/// The size of the controls inside; a bordered button's height follows it
|
|
231
|
+
/// (the page: `large` and `extraLarge` are taller).
|
|
232
|
+
public func controlSize(_ size: ControlSize) -> some View {
|
|
233
|
+
environment(\.controlSize, size)
|
|
234
|
+
}
|
|
215
235
|
}
|
|
216
236
|
|
|
217
237
|
public enum Prominence: Hashable, Sendable { case standard, increased }
|
|
218
238
|
|
|
219
|
-
/// `.controlSize`:
|
|
220
|
-
|
|
239
|
+
/// `.controlSize`: bordered buttons take it (props `controlSize` when it is not
|
|
240
|
+
/// `regular`); other controls keep one size.
|
|
241
|
+
public enum ControlSize: Hashable, CaseIterable, Sendable {
|
|
242
|
+
case mini, small, regular, large, extraLarge
|
|
243
|
+
|
|
244
|
+
var _name: String {
|
|
245
|
+
switch self {
|
|
246
|
+
case .mini: "mini"
|
|
247
|
+
case .small: "small"
|
|
248
|
+
case .regular: "regular"
|
|
249
|
+
case .large: "large"
|
|
250
|
+
case .extraLarge: "extraLarge"
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
221
254
|
|
|
222
255
|
public struct SymbolVariants: Hashable, Sendable {
|
|
223
256
|
let name: String
|
|
@@ -235,6 +268,52 @@ public enum BlendMode: Hashable, Sendable {
|
|
|
235
268
|
case normal, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight,
|
|
236
269
|
difference, exclusion, hue, saturation, color, luminosity, sourceAtop, destinationOver,
|
|
237
270
|
destinationOut, plusDarker, plusLighter
|
|
271
|
+
|
|
272
|
+
/// The CSS `mix-blend-mode` (the Porter-Duff modes and `plusDarker`,
|
|
273
|
+
/// which CSS has no counterpart for, draw normally).
|
|
274
|
+
var _css: String {
|
|
275
|
+
switch self {
|
|
276
|
+
case .multiply: "multiply"
|
|
277
|
+
case .screen: "screen"
|
|
278
|
+
case .overlay: "overlay"
|
|
279
|
+
case .darken: "darken"
|
|
280
|
+
case .lighten: "lighten"
|
|
281
|
+
case .colorDodge: "color-dodge"
|
|
282
|
+
case .colorBurn: "color-burn"
|
|
283
|
+
case .softLight: "soft-light"
|
|
284
|
+
case .hardLight: "hard-light"
|
|
285
|
+
case .difference: "difference"
|
|
286
|
+
case .exclusion: "exclusion"
|
|
287
|
+
case .hue: "hue"
|
|
288
|
+
case .saturation: "saturation"
|
|
289
|
+
case .color: "color"
|
|
290
|
+
case .luminosity: "luminosity"
|
|
291
|
+
case .plusLighter: "plus-lighter"
|
|
292
|
+
case .normal, .sourceAtop, .destinationOver, .destinationOut, .plusDarker: "normal"
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// How `drawingGroup` renders (accepted for source compatibility).
|
|
298
|
+
public enum ColorRenderingMode: Hashable, Sendable {
|
|
299
|
+
case nonLinear, linear, extendedLinear
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
nonisolated extension View {
|
|
303
|
+
/// Draws the view in front of its siblings with a lower index (CSS
|
|
304
|
+
/// `z-index`); siblings with the same index draw in order.
|
|
305
|
+
public func zIndex(_ value: Double) -> some View {
|
|
306
|
+
_styled { $0.extras["zIndex"] = .number(value) }
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/// Blends the view with what is behind it (CSS `mix-blend-mode`).
|
|
310
|
+
public func blendMode(_ mode: BlendMode) -> some View {
|
|
311
|
+
_styled { $0.extras["blendMode"] = .string(mode._css) }
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/// Renders the view offscreen before showing it; the browser composites
|
|
315
|
+
/// it already, so it draws the same.
|
|
316
|
+
public func drawingGroup(opaque: Bool = false, colorMode: ColorRenderingMode = .nonLinear) -> some View { self }
|
|
238
317
|
}
|
|
239
318
|
|
|
240
319
|
public struct SafeAreaRegions: OptionSet, Sendable {
|
|
@@ -270,21 +349,57 @@ public enum ToolbarRole: Hashable, Sendable { case automatic, navigationStack, b
|
|
|
270
349
|
/// `.onTapGesture`: a `tapgesture` element whose tap event runs the action.
|
|
271
350
|
struct _TapGestureView<Content: View> {
|
|
272
351
|
let content: Content
|
|
273
|
-
let action: @MainActor () -> Void
|
|
352
|
+
let action: @MainActor (CGPoint) -> Void
|
|
353
|
+
/// The action takes the tap's location: the page sends it (`location`).
|
|
354
|
+
var wantsLocation = false
|
|
355
|
+
|
|
356
|
+
init(content: Content, action: @escaping @MainActor () -> Void) {
|
|
357
|
+
self.content = content
|
|
358
|
+
self.action = { _ in action() }
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
init(content: Content, locatedAction: @escaping @MainActor (CGPoint) -> Void) {
|
|
362
|
+
self.content = content
|
|
363
|
+
self.action = locatedAction
|
|
364
|
+
wantsLocation = true
|
|
365
|
+
}
|
|
274
366
|
}
|
|
275
367
|
extension _TapGestureView: _PrimitiveView {}
|
|
276
368
|
extension _TapGestureView: _HostView {
|
|
277
369
|
var _kind: String { "tapgesture" }
|
|
278
|
-
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
370
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
371
|
+
wantsLocation ? .object(["location": .bool(true)]) : .object([:])
|
|
372
|
+
}
|
|
279
373
|
var _content: [any View] { [content] }
|
|
280
374
|
var _handler: ((_JSON) -> Void)? {
|
|
281
375
|
let action = self.action
|
|
282
|
-
return {
|
|
376
|
+
return { payload in
|
|
377
|
+
var point = CGPoint.zero
|
|
378
|
+
if case .object(let fields) = payload, case .number(let x)? = fields["x"], case .number(let y)? = fields["y"] {
|
|
379
|
+
point = CGPoint(x: x, y: y)
|
|
380
|
+
}
|
|
381
|
+
MainActor.assumeIsolated { action(point) }
|
|
382
|
+
}
|
|
283
383
|
}
|
|
284
384
|
}
|
|
285
385
|
|
|
286
|
-
extension View {
|
|
386
|
+
nonisolated extension View {
|
|
287
387
|
public func onTapGesture(count: Int = 1, perform action: @escaping @MainActor () -> Void) -> some View {
|
|
288
388
|
_TapGestureView(content: self, action: action)
|
|
289
389
|
}
|
|
290
390
|
}
|
|
391
|
+
|
|
392
|
+
/// The color a style tints with: a color as it is, a gradient's first color,
|
|
393
|
+
/// else the accent color.
|
|
394
|
+
func _tintColor(of style: _JSON) -> _JSON {
|
|
395
|
+
guard case .object(let fields) = style else { return .object(["name": .string("accent")]) }
|
|
396
|
+
if fields["r"] != nil || fields["name"] != nil || fields["named"] != nil { return style }
|
|
397
|
+
if let color = fields["colorGradient"] { return color }
|
|
398
|
+
for key in ["linearGradient", "radialGradient", "angularGradient", "ellipticalGradient"] {
|
|
399
|
+
if case .object(let gradient)? = fields[key], case .array(let stops)? = gradient["stops"],
|
|
400
|
+
case .object(let first)? = stops.first, let color = first["color"] {
|
|
401
|
+
return color
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return .object(["name": .string("accent")])
|
|
405
|
+
}
|
|
@@ -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,11 +137,41 @@ 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 }
|
|
120
167
|
}
|
|
121
168
|
|
|
169
|
+
/// `.controlSize(_:)`; `regular` by default.
|
|
170
|
+
public var controlSize: ControlSize {
|
|
171
|
+
get { self[_ControlSizeKey.self] }
|
|
172
|
+
set { self[_ControlSizeKey.self] = newValue }
|
|
173
|
+
}
|
|
174
|
+
|
|
122
175
|
var _textFieldStyle: String {
|
|
123
176
|
get { self[_TextFieldStyleKey.self] }
|
|
124
177
|
set { self[_TextFieldStyleKey.self] = newValue }
|
|
@@ -138,6 +191,15 @@ public struct EnvironmentValues {
|
|
|
138
191
|
func _anyObject(_ type: Any.Type) -> Any? {
|
|
139
192
|
storage[ObjectIdentifier(type)]
|
|
140
193
|
}
|
|
194
|
+
|
|
195
|
+
/// Stores `object` under its dynamic type, for `@Environment(Type.self)` and `@EnvironmentObject`.
|
|
196
|
+
mutating func _setAnyObject(_ object: AnyObject) {
|
|
197
|
+
storage[ObjectIdentifier(type(of: object))] = object
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
extension EnvironmentValues: CustomStringConvertible {
|
|
202
|
+
public var description: String { "EnvironmentValues(\(storage.count) values)" }
|
|
141
203
|
}
|
|
142
204
|
|
|
143
205
|
/// Lets `@Environment(Type.self)` hand back nil for an optional type that was not supplied.
|
|
@@ -154,7 +216,11 @@ enum _IsEnabledKey: EnvironmentKey { static let defaultValue = true }
|
|
|
154
216
|
enum _DynamicTypeSizeKey: EnvironmentKey { static let defaultValue = DynamicTypeSize.large }
|
|
155
217
|
enum _HorizontalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .compact }
|
|
156
218
|
enum _VerticalSizeClassKey: EnvironmentKey { static let defaultValue: UserInterfaceSizeClass? = .regular }
|
|
219
|
+
enum _LayoutDirectionKey: EnvironmentKey { static let defaultValue = LayoutDirection.leftToRight }
|
|
220
|
+
enum _FontKey: EnvironmentKey { static let defaultValue: Font? = nil }
|
|
221
|
+
enum _DisplayScaleKey: EnvironmentKey { static let defaultValue: CGFloat = 3 }
|
|
157
222
|
enum _ButtonStyleKey: EnvironmentKey { static let defaultValue = "automatic" }
|
|
223
|
+
enum _ControlSizeKey: EnvironmentKey { static let defaultValue = ControlSize.regular }
|
|
158
224
|
enum _TextFieldStyleKey: EnvironmentKey { static let defaultValue = "plain" }
|
|
159
225
|
|
|
160
226
|
// MARK: - @Environment
|
|
@@ -164,7 +230,17 @@ final class _EnvironmentBox {
|
|
|
164
230
|
}
|
|
165
231
|
|
|
166
232
|
/// Views expose their `Environment` properties to the runtime through this protocol.
|
|
167
|
-
protocol _EnvironmentProperty {
|
|
233
|
+
protocol _EnvironmentProperty: _RuntimeProperty {
|
|
234
|
+
func _resolve(in environment: EnvironmentValues)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/// A property wrapper from another module (SwiftData's `@Query`) that reads
|
|
238
|
+
/// the environment of the view it belongs to: the runtime calls `_resolve`
|
|
239
|
+
/// before each run of the view's body, as for `@Environment`. Unlike
|
|
240
|
+
/// `@Environment`, such a property is part of the view's value when the
|
|
241
|
+
/// runtime decides whether a re-created view is unchanged (Phase 16), so a
|
|
242
|
+
/// parent passing a different query re-runs the view.
|
|
243
|
+
public protocol _EnvironmentReading: _RuntimeProperty {
|
|
168
244
|
func _resolve(in environment: EnvironmentValues)
|
|
169
245
|
}
|
|
170
246
|
|
|
@@ -216,7 +292,7 @@ extension Environment: _EnvironmentProperty {
|
|
|
216
292
|
|
|
217
293
|
// MARK: - .environment(_:_:)
|
|
218
294
|
|
|
219
|
-
protocol _EnvironmentModifying {
|
|
295
|
+
protocol _EnvironmentModifying: _TraitBearing {
|
|
220
296
|
func _apply(to environment: inout EnvironmentValues)
|
|
221
297
|
}
|
|
222
298
|
|
|
@@ -232,7 +308,7 @@ extension _EnvironmentView: _EnvironmentModifying {
|
|
|
232
308
|
func _apply(to environment: inout EnvironmentValues) { apply(&environment) }
|
|
233
309
|
}
|
|
234
310
|
|
|
235
|
-
extension View {
|
|
311
|
+
nonisolated extension View {
|
|
236
312
|
public func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View {
|
|
237
313
|
_EnvironmentView(content: self) { $0[keyPath: keyPath] = value }
|
|
238
314
|
}
|
|
@@ -268,7 +344,7 @@ extension View {
|
|
|
268
344
|
}
|
|
269
345
|
|
|
270
346
|
/// Read by the runtime, which tells the host; also sets the environment's scheme.
|
|
271
|
-
protocol _PreferredColorSchemeModifying {
|
|
347
|
+
protocol _PreferredColorSchemeModifying: _TraitBearing {
|
|
272
348
|
var _preferredColorScheme: ColorScheme? { get }
|
|
273
349
|
}
|
|
274
350
|
|
|
@@ -353,3 +429,18 @@ extension DynamicTypeSize {
|
|
|
353
429
|
return bodySize / 17
|
|
354
430
|
}
|
|
355
431
|
}
|
|
432
|
+
|
|
433
|
+
// MARK: - Keys bridged from UIKit traits
|
|
434
|
+
|
|
435
|
+
/// A key whose value, until a view sets it, comes from elsewhere: UIKit's
|
|
436
|
+
/// `UITraitBridgedEnvironmentKey` (iOS 17) reads it from the current traits.
|
|
437
|
+
public protocol _BridgedEnvironmentKey: EnvironmentKey {
|
|
438
|
+
static var _bridgedDefault: Any { get }
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
extension EnvironmentValues {
|
|
442
|
+
static func _default<K: EnvironmentKey>(of key: K.Type) -> K.Value {
|
|
443
|
+
if let bridged = key as? any _BridgedEnvironmentKey.Type, let value = bridged._bridgedDefault as? K.Value { return value }
|
|
444
|
+
return K.defaultValue
|
|
445
|
+
}
|
|
446
|
+
}
|
|
@@ -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
|
}
|