@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
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/// `Animatable`, `GeometryEffect`, `ProjectionTransform` and `AnimatableModifier`.
|
|
2
|
+
///
|
|
3
|
+
/// SwiftUI animates a type's `animatableData` by interpolating it frame by
|
|
4
|
+
/// frame and evaluating the view (or effect) at each step. The browser
|
|
5
|
+
/// animates the styles a pass sends (Phase 3), not Swift values, so here a
|
|
6
|
+
/// modifier or effect is evaluated at its final `animatableData` only: the
|
|
7
|
+
/// page animates the change between the transform the old value gave and the
|
|
8
|
+
/// one the new value gives. An effect whose start and end look the same (a
|
|
9
|
+
/// shake that returns to rest after each whole unit) does not move.
|
|
10
|
+
///
|
|
11
|
+
/// A `GeometryEffect`'s `effectValue(size:)` is asked with a zero size: the
|
|
12
|
+
/// Swift side does not know the view's laid-out size (as for `.visualEffect`'s
|
|
13
|
+
/// proxy). Its transform is drawn as an offset, a rotation and a scale about
|
|
14
|
+
/// the view's top-leading corner, the origin SwiftUI's projection uses; a
|
|
15
|
+
/// shear and the perspective row are not drawn.
|
|
16
|
+
|
|
17
|
+
// MARK: - Vector arithmetic
|
|
18
|
+
|
|
19
|
+
/// A value SwiftUI can interpolate: it adds, subtracts and scales.
|
|
20
|
+
public protocol VectorArithmetic: AdditiveArithmetic {
|
|
21
|
+
mutating func scale(by rhs: Double)
|
|
22
|
+
var magnitudeSquared: Double { get }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
extension VectorArithmetic {
|
|
26
|
+
/// The value scaled by `rhs`.
|
|
27
|
+
public func scaled(by rhs: Double) -> Self {
|
|
28
|
+
var copy = self
|
|
29
|
+
copy.scale(by: rhs)
|
|
30
|
+
return copy
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// The value `amount` of the way from `self` to `other`.
|
|
34
|
+
public func interpolated(towards other: Self, amount: Double) -> Self {
|
|
35
|
+
self + (other - self).scaled(by: amount)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
extension Double: VectorArithmetic {
|
|
40
|
+
public mutating func scale(by rhs: Double) { self *= rhs }
|
|
41
|
+
public var magnitudeSquared: Double { self * self }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
extension Float: VectorArithmetic {
|
|
45
|
+
public mutating func scale(by rhs: Double) { self *= Float(rhs) }
|
|
46
|
+
public var magnitudeSquared: Double { Double(self * self) }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// No animatable data: the default of an `Animatable` type.
|
|
50
|
+
public struct EmptyAnimatableData: VectorArithmetic, Hashable, Sendable {
|
|
51
|
+
public init() {}
|
|
52
|
+
public static var zero: EmptyAnimatableData { EmptyAnimatableData() }
|
|
53
|
+
public static func + (lhs: Self, rhs: Self) -> Self { lhs }
|
|
54
|
+
public static func - (lhs: Self, rhs: Self) -> Self { lhs }
|
|
55
|
+
public mutating func scale(by rhs: Double) {}
|
|
56
|
+
public var magnitudeSquared: Double { 0 }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// Two animatable values interpolated together.
|
|
60
|
+
public struct AnimatablePair<First: VectorArithmetic, Second: VectorArithmetic>: VectorArithmetic {
|
|
61
|
+
public var first: First
|
|
62
|
+
public var second: Second
|
|
63
|
+
|
|
64
|
+
public init(_ first: First, _ second: Second) {
|
|
65
|
+
self.first = first
|
|
66
|
+
self.second = second
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public static var zero: Self { Self(.zero, .zero) }
|
|
70
|
+
public static func + (lhs: Self, rhs: Self) -> Self { Self(lhs.first + rhs.first, lhs.second + rhs.second) }
|
|
71
|
+
public static func - (lhs: Self, rhs: Self) -> Self { Self(lhs.first - rhs.first, lhs.second - rhs.second) }
|
|
72
|
+
public mutating func scale(by rhs: Double) {
|
|
73
|
+
first.scale(by: rhs)
|
|
74
|
+
second.scale(by: rhs)
|
|
75
|
+
}
|
|
76
|
+
public var magnitudeSquared: Double { first.magnitudeSquared + second.magnitudeSquared }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
extension AnimatablePair: Equatable {}
|
|
80
|
+
extension AnimatablePair: Sendable where First: Sendable, Second: Sendable {}
|
|
81
|
+
|
|
82
|
+
// MARK: - Animatable
|
|
83
|
+
|
|
84
|
+
/// A type whose `animatableData` SwiftUI interpolates. In the browser a
|
|
85
|
+
/// modifier or effect is evaluated at the final value (see the file comment);
|
|
86
|
+
/// a custom `Shape` sends its path along the way (Shape.swift).
|
|
87
|
+
public protocol Animatable {
|
|
88
|
+
associatedtype AnimatableData: VectorArithmetic = EmptyAnimatableData
|
|
89
|
+
var animatableData: AnimatableData { get set }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
extension Animatable where AnimatableData == EmptyAnimatableData {
|
|
93
|
+
public var animatableData: EmptyAnimatableData {
|
|
94
|
+
get { EmptyAnimatableData() }
|
|
95
|
+
set {}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
extension CGPoint: Animatable {
|
|
100
|
+
public var animatableData: AnimatablePair<CGFloat, CGFloat> {
|
|
101
|
+
get { AnimatablePair(x, y) }
|
|
102
|
+
set { (x, y) = (newValue.first, newValue.second) }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
extension CGSize: Animatable {
|
|
107
|
+
public var animatableData: AnimatablePair<CGFloat, CGFloat> {
|
|
108
|
+
get { AnimatablePair(width, height) }
|
|
109
|
+
set { (width, height) = (newValue.first, newValue.second) }
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
extension CGRect: Animatable {
|
|
114
|
+
public var animatableData: AnimatablePair<CGPoint.AnimatableData, CGSize.AnimatableData> {
|
|
115
|
+
get { AnimatablePair(origin.animatableData, size.animatableData) }
|
|
116
|
+
set { (origin.animatableData, size.animatableData) = (newValue.first, newValue.second) }
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// A modifier whose `animatableData` is interpolated (deprecated in SwiftUI
|
|
121
|
+
/// for `Animatable` & `ViewModifier`). Its body runs with the final value.
|
|
122
|
+
public protocol AnimatableModifier: Animatable, ViewModifier {}
|
|
123
|
+
|
|
124
|
+
// MARK: - Projection transforms
|
|
125
|
+
|
|
126
|
+
/// A 3×3 projective transform, applied to row vectors as in Core Animation:
|
|
127
|
+
/// (x, y, 1) × m.
|
|
128
|
+
public struct ProjectionTransform: Equatable, Sendable {
|
|
129
|
+
public var m11: CGFloat = 1, m12: CGFloat = 0, m13: CGFloat = 0
|
|
130
|
+
public var m21: CGFloat = 0, m22: CGFloat = 1, m23: CGFloat = 0
|
|
131
|
+
public var m31: CGFloat = 0, m32: CGFloat = 0, m33: CGFloat = 1
|
|
132
|
+
|
|
133
|
+
/// The identity.
|
|
134
|
+
public init() {}
|
|
135
|
+
|
|
136
|
+
public var isIdentity: Bool { self == ProjectionTransform() }
|
|
137
|
+
/// Whether the perspective column is (0, 0, 1).
|
|
138
|
+
public var isAffine: Bool { m13 == 0 && m23 == 0 && m33 == 1 }
|
|
139
|
+
|
|
140
|
+
/// The transform of `self` followed by `rhs`.
|
|
141
|
+
public func concatenating(_ rhs: ProjectionTransform) -> ProjectionTransform {
|
|
142
|
+
var r = ProjectionTransform()
|
|
143
|
+
r.m11 = m11 * rhs.m11 + m12 * rhs.m21 + m13 * rhs.m31
|
|
144
|
+
r.m12 = m11 * rhs.m12 + m12 * rhs.m22 + m13 * rhs.m32
|
|
145
|
+
r.m13 = m11 * rhs.m13 + m12 * rhs.m23 + m13 * rhs.m33
|
|
146
|
+
r.m21 = m21 * rhs.m11 + m22 * rhs.m21 + m23 * rhs.m31
|
|
147
|
+
r.m22 = m21 * rhs.m12 + m22 * rhs.m22 + m23 * rhs.m32
|
|
148
|
+
r.m23 = m21 * rhs.m13 + m22 * rhs.m23 + m23 * rhs.m33
|
|
149
|
+
r.m31 = m31 * rhs.m11 + m32 * rhs.m21 + m33 * rhs.m31
|
|
150
|
+
r.m32 = m31 * rhs.m12 + m32 * rhs.m22 + m33 * rhs.m32
|
|
151
|
+
r.m33 = m31 * rhs.m13 + m32 * rhs.m23 + m33 * rhs.m33
|
|
152
|
+
return r
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// The offset, rotation (radians) and scale whose composition about the
|
|
156
|
+
/// origin, scale first, gives the affine part; nil for a shear.
|
|
157
|
+
var _decomposed: (tx: CGFloat, ty: CGFloat, angle: CGFloat, sx: CGFloat, sy: CGFloat)? {
|
|
158
|
+
let sx = (m11 * m11 + m12 * m12).squareRoot()
|
|
159
|
+
guard sx > 0 else { return nil }
|
|
160
|
+
let angle = _atan2(m12, m11)
|
|
161
|
+
let sy = (m11 * m22 - m12 * m21) / sx
|
|
162
|
+
// Without a shear the second row is the first turned a quarter, scaled by sy / sx.
|
|
163
|
+
let expected21 = -m12 / sx * sy, expected22 = m11 / sx * sy
|
|
164
|
+
guard abs(m21 - expected21) < 1e-9, abs(m22 - expected22) < 1e-9 else { return nil }
|
|
165
|
+
return (m31, m32, angle, sx, sy)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/// atan2 without Foundation (the shim does not import it).
|
|
170
|
+
func _atan2(_ y: CGFloat, _ x: CGFloat) -> CGFloat {
|
|
171
|
+
if x == 0 { return y > 0 ? .pi / 2 : (y < 0 ? -.pi / 2 : 0) }
|
|
172
|
+
var angle = _atan(y / x)
|
|
173
|
+
if x < 0 { angle += y >= 0 ? .pi : -.pi }
|
|
174
|
+
return angle
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/// atan by argument reduction (|z| ≤ tan(π/12)) and its series.
|
|
178
|
+
func _atan(_ z: CGFloat) -> CGFloat {
|
|
179
|
+
if z < 0 { return -_atan(-z) }
|
|
180
|
+
if z > 1 { return .pi / 2 - _atan(1 / z) }
|
|
181
|
+
let tan15 = 0.2679491924311227
|
|
182
|
+
if z > tan15 {
|
|
183
|
+
// atan(z) = π/6 + atan((z√3 − 1) / (z + √3))
|
|
184
|
+
let root3 = 1.7320508075688772
|
|
185
|
+
return .pi / 6 + _atan((z * root3 - 1) / (z + root3))
|
|
186
|
+
}
|
|
187
|
+
var term = z, sum = z
|
|
188
|
+
let z2 = z * z
|
|
189
|
+
for n in 1..<12 {
|
|
190
|
+
term *= -z2
|
|
191
|
+
sum += term / CGFloat(2 * n + 1)
|
|
192
|
+
}
|
|
193
|
+
return sum
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
nonisolated extension View {
|
|
197
|
+
/// Draws the view through `transform` (its affine part: offset, rotation
|
|
198
|
+
/// and scale about the top-leading corner; a shear draws untransformed).
|
|
199
|
+
public func projectionEffect(_ transform: ProjectionTransform) -> some View {
|
|
200
|
+
_styled { style in
|
|
201
|
+
guard !transform.isIdentity, let parts = transform._decomposed else { return }
|
|
202
|
+
// Differences below a billionth of a point (sin(4π)) are rounding, not movement.
|
|
203
|
+
let negligible = 1e-9
|
|
204
|
+
if abs(parts.tx) > negligible || abs(parts.ty) > negligible {
|
|
205
|
+
style.extras["offset"] = .object(["x": .number(parts.tx), "y": .number(parts.ty)])
|
|
206
|
+
}
|
|
207
|
+
if abs(parts.angle) > negligible {
|
|
208
|
+
style.extras["rotation"] = .number(parts.angle * 180 / .pi)
|
|
209
|
+
style.extras["rotationAnchor"] = UnitPoint.topLeading._json
|
|
210
|
+
}
|
|
211
|
+
if abs(parts.sx - 1) > negligible || abs(parts.sy - 1) > negligible {
|
|
212
|
+
style.extras["scale"] = .object(["x": .number(parts.sx), "y": .number(parts.sy)])
|
|
213
|
+
style.extras["scaleAnchor"] = UnitPoint.topLeading._json
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// MARK: - Geometry effects
|
|
220
|
+
|
|
221
|
+
/// A modifier that moves its view with a projection transform. Its body
|
|
222
|
+
/// draws `effectValue(size:)` (asked with a zero size, at the final
|
|
223
|
+
/// `animatableData`; see the file comment).
|
|
224
|
+
public protocol GeometryEffect: Animatable, ViewModifier {
|
|
225
|
+
func effectValue(size: CGSize) -> ProjectionTransform
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
extension GeometryEffect {
|
|
229
|
+
public func body(content: Content) -> some View {
|
|
230
|
+
content.projectionEffect(effectValue(size: .zero))
|
|
231
|
+
}
|
|
232
|
+
}
|
|
@@ -81,6 +81,13 @@ public struct GeometryProxy {
|
|
|
81
81
|
public func frame(in coordinateSpace: CoordinateSpace) -> CGRect {
|
|
82
82
|
CGRect(origin: .zero, size: size)
|
|
83
83
|
}
|
|
84
|
+
|
|
85
|
+
/// The bounds of the space named `coordinateSpace` around this view (iOS
|
|
86
|
+
/// 17), as the view sees them. The browser reports a view's own size
|
|
87
|
+
/// only, so there are none (nil, as outside such a space).
|
|
88
|
+
public func bounds(of coordinateSpace: CoordinateSpace) -> CGRect? {
|
|
89
|
+
coordinateSpace == .local ? CGRect(origin: .zero, size: size) : nil
|
|
90
|
+
}
|
|
84
91
|
}
|
|
85
92
|
|
|
86
93
|
public enum CoordinateSpace: Hashable {
|
|
@@ -89,17 +96,21 @@ public enum CoordinateSpace: Hashable {
|
|
|
89
96
|
|
|
90
97
|
public var isGlobal: Bool { self == .global }
|
|
91
98
|
public var isLocal: Bool { self == .local }
|
|
99
|
+
|
|
100
|
+
/// The nearest scroll view's space (iOS 17).
|
|
101
|
+
public static var scrollView: CoordinateSpace { .named("_SwiftBrowser.scrollView") }
|
|
102
|
+
public static func scrollView(axis: Axis) -> CoordinateSpace { scrollView }
|
|
92
103
|
}
|
|
93
104
|
/// `AnyHashable` is not `Sendable`; names are value types in practice.
|
|
94
105
|
extension CoordinateSpace: @unchecked Sendable {}
|
|
95
106
|
|
|
96
|
-
extension View {
|
|
107
|
+
nonisolated extension View {
|
|
97
108
|
/// Names a coordinate space; accepted for source compatibility (geometry
|
|
98
109
|
/// is always reported in the view's own box).
|
|
99
110
|
public func coordinateSpace<T: Hashable>(name: T) -> some View { self }
|
|
100
111
|
}
|
|
101
112
|
|
|
102
|
-
protocol _GeometryReading {
|
|
113
|
+
protocol _GeometryReading: _TraitBearing {
|
|
103
114
|
func _content(for size: CGSize) -> any View
|
|
104
115
|
}
|
|
105
116
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// `@GestureState` and `Gesture.updating(_:body:)`: state that a gesture
|
|
2
|
+
// sets while it runs and that returns to its initial value when it ends. It
|
|
3
|
+
// is stored like `@State` (so it survives re-renders and a change re-renders
|
|
4
|
+
// the view); `updating` sets it from the gesture's changed events and resets
|
|
5
|
+
// it on the ended event. The transaction the body may set is ignored, and a
|
|
6
|
+
// cancelled gesture resets like an ended one.
|
|
7
|
+
|
|
8
|
+
@propertyWrapper
|
|
9
|
+
public struct GestureState<Value>: DynamicProperty {
|
|
10
|
+
let state: State<Value>
|
|
11
|
+
let initial: Value
|
|
12
|
+
|
|
13
|
+
public init(wrappedValue: Value) {
|
|
14
|
+
state = State(wrappedValue: wrappedValue)
|
|
15
|
+
initial = wrappedValue
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public init(initialValue: Value) {
|
|
19
|
+
self.init(wrappedValue: initialValue)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public init(wrappedValue: Value, resetTransaction: Transaction) {
|
|
23
|
+
self.init(wrappedValue: wrappedValue)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public init(wrappedValue: Value, reset: @escaping (Value, inout Transaction) -> Void) {
|
|
27
|
+
self.init(wrappedValue: wrappedValue)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public var wrappedValue: Value { state.wrappedValue }
|
|
31
|
+
|
|
32
|
+
public var projectedValue: GestureState<Value> { self }
|
|
33
|
+
|
|
34
|
+
/// Sets the stored value (`updating`'s body result).
|
|
35
|
+
func _set(_ value: Value) { state.wrappedValue = value }
|
|
36
|
+
|
|
37
|
+
func _reset() { state.wrappedValue = initial }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
extension GestureState where Value: ExpressibleByNilLiteral {
|
|
41
|
+
public init(resetTransaction: Transaction = Transaction()) {
|
|
42
|
+
self.init(wrappedValue: nil)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
extension GestureState: _StateProperty {
|
|
47
|
+
var _box: any _AnyStateBox { state.box }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
extension Gesture {
|
|
51
|
+
/// Runs `body` with each changed value to update `state`, which returns
|
|
52
|
+
/// to its initial value when the gesture ends.
|
|
53
|
+
@MainActor
|
|
54
|
+
public func updating<State>(_ state: GestureState<State>,
|
|
55
|
+
body: @escaping (Value, inout State, inout Transaction) -> Void) -> _ModifiedGesture<Self> {
|
|
56
|
+
let changed: @MainActor (Value) -> Void = { value in
|
|
57
|
+
var current = state.wrappedValue
|
|
58
|
+
var transaction = Transaction()
|
|
59
|
+
body(value, ¤t, &transaction)
|
|
60
|
+
state._set(current)
|
|
61
|
+
}
|
|
62
|
+
let ended: @MainActor (Value) -> Void = { _ in state._reset() }
|
|
63
|
+
return _ModifiedGesture(_config: Self._adding(to: _config, changed: changed, ended: ended))
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -304,7 +304,7 @@ extension _GestureView: _GroupView {
|
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
|
|
307
|
-
extension View {
|
|
307
|
+
nonisolated extension View {
|
|
308
308
|
public func gesture<G: Gesture>(_ gesture: G, including mask: GestureMask = .all) -> some View {
|
|
309
309
|
_GestureView(content: self, config: gesture._config)
|
|
310
310
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// iOS 26 Liquid Glass. The page has no refracting glass, so a glass effect
|
|
2
|
+
// is approximated by what it looks like at rest: a translucent material
|
|
3
|
+
// (`regularMaterial`, `ultraThinMaterial` for `.clear`) filling the given
|
|
4
|
+
// shape behind the view, under the glass's tint when it has one. The
|
|
5
|
+
// `interactive` response to touches (the glass swelling under a finger),
|
|
6
|
+
// the merging of nearby glass shapes in a `GlassEffectContainer` and the
|
|
7
|
+
// morphing between `glassEffectID`s are not drawn: containers lay their
|
|
8
|
+
// content out as given and ids are accepted. The glass button styles draw
|
|
9
|
+
// as the bordered ones (`.glass` as `.bordered`, `.glassProminent` as
|
|
10
|
+
// `.borderedProminent`).
|
|
11
|
+
|
|
12
|
+
/// The material of a glass effect.
|
|
13
|
+
public struct Glass: Equatable, Sendable {
|
|
14
|
+
enum Variant: Equatable, Sendable {
|
|
15
|
+
case regular, clear, identity
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let variant: Variant
|
|
19
|
+
let tintColor: Color?
|
|
20
|
+
let isInteractive: Bool
|
|
21
|
+
|
|
22
|
+
/// Glass over ordinary content.
|
|
23
|
+
public static let regular = Glass(variant: .regular, tintColor: nil, isInteractive: false)
|
|
24
|
+
/// More transparent glass, for media-rich backgrounds.
|
|
25
|
+
public static let clear = Glass(variant: .clear, tintColor: nil, isInteractive: false)
|
|
26
|
+
/// No glass at all: the view draws as if the effect were not applied.
|
|
27
|
+
public static let identity = Glass(variant: .identity, tintColor: nil, isInteractive: false)
|
|
28
|
+
|
|
29
|
+
/// Tinted glass: the color is laid over the material.
|
|
30
|
+
public func tint(_ color: Color?) -> Glass {
|
|
31
|
+
Glass(variant: variant, tintColor: color, isInteractive: isInteractive)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// Accepted; the page's glass does not react to touches.
|
|
35
|
+
public func interactive(_ isEnabled: Bool = true) -> Glass {
|
|
36
|
+
Glass(variant: variant, tintColor: tintColor, isInteractive: isEnabled)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var material: Material { variant == .clear ? .ultraThinMaterial : .regularMaterial }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// The glass behind a view: the material, then the tint, in the shape.
|
|
43
|
+
struct _GlassEffectView<Content: View, S: Shape> {
|
|
44
|
+
let content: Content
|
|
45
|
+
let glass: Glass
|
|
46
|
+
let shape: S
|
|
47
|
+
}
|
|
48
|
+
extension _GlassEffectView: View {
|
|
49
|
+
var body: some View {
|
|
50
|
+
if glass.variant == .identity {
|
|
51
|
+
content
|
|
52
|
+
} else if let tint = glass.tintColor {
|
|
53
|
+
content.background(tint, in: shape).background(glass.material, in: shape)
|
|
54
|
+
} else {
|
|
55
|
+
content.background(glass.material, in: shape)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
nonisolated extension View {
|
|
61
|
+
/// Draws Liquid Glass behind the view in `shape` (a capsule by default);
|
|
62
|
+
/// see the top of this file for the approximation.
|
|
63
|
+
public func glassEffect<S: Shape>(_ glass: Glass = .regular, in shape: S = Capsule()) -> some View {
|
|
64
|
+
_GlassEffectView(content: self, glass: glass, shape: shape)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public func glassEffect(_ glass: Glass = .regular, isEnabled: Bool) -> some View {
|
|
68
|
+
_GlassEffectView(content: self, glass: isEnabled ? glass : .identity, shape: Capsule())
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// Accepted: glass shapes keep their own outlines (no morphing between ids).
|
|
72
|
+
public func glassEffectID<ID: Hashable & Sendable>(_ id: ID?, in namespace: Namespace.ID) -> some View { self }
|
|
73
|
+
|
|
74
|
+
/// Accepted: glass shapes keep their own outlines (no union is drawn).
|
|
75
|
+
public func glassEffectUnion<ID: Hashable & Sendable>(id: ID?, namespace: Namespace.ID) -> some View { self }
|
|
76
|
+
|
|
77
|
+
/// Accepted: glass appears and disappears with the view's own transition.
|
|
78
|
+
public func glassEffectTransition(_ transition: GlassEffectTransition) -> some View { self }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/// How glass appears and disappears; accepted (see `glassEffectTransition`).
|
|
82
|
+
public struct GlassEffectTransition: Equatable, Sendable {
|
|
83
|
+
let name: String
|
|
84
|
+
public static let matchedGeometry = GlassEffectTransition(name: "matchedGeometry")
|
|
85
|
+
public static func matchedGeometry(properties: MatchedGeometryProperties = .frame,
|
|
86
|
+
anchor: UnitPoint = .center) -> GlassEffectTransition { .matchedGeometry }
|
|
87
|
+
public static let materialize = GlassEffectTransition(name: "materialize")
|
|
88
|
+
public static let identity = GlassEffectTransition(name: "identity")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// Groups glass shapes so they can merge on iOS; here it lays its content
|
|
92
|
+
/// out as given (a group: the content's views are its parent's children).
|
|
93
|
+
public struct GlassEffectContainer<Content: View> {
|
|
94
|
+
let content: Content
|
|
95
|
+
|
|
96
|
+
public init(spacing: CGFloat? = nil, @ViewBuilder content: () -> Content) {
|
|
97
|
+
self.content = content()
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
extension GlassEffectContainer: _PrimitiveView {}
|
|
101
|
+
extension GlassEffectContainer: _GroupView {
|
|
102
|
+
var _children: [any View] { [content] }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// MARK: - Glass button styles
|
|
106
|
+
|
|
107
|
+
/// `.buttonStyle(.glass)`: drawn as `.bordered` (a gray capsule).
|
|
108
|
+
public struct GlassButtonStyle: PrimitiveButtonStyle {
|
|
109
|
+
public init() {}
|
|
110
|
+
public init(_ glass: Glass) {}
|
|
111
|
+
public var _name: String { "bordered" }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// `.buttonStyle(.glassProminent)`: drawn as `.borderedProminent` (a tinted capsule).
|
|
115
|
+
public struct GlassProminentButtonStyle: PrimitiveButtonStyle {
|
|
116
|
+
public init() {}
|
|
117
|
+
public var _name: String { "borderedProminent" }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
extension PrimitiveButtonStyle where Self == GlassButtonStyle {
|
|
121
|
+
public static var glass: GlassButtonStyle { GlassButtonStyle() }
|
|
122
|
+
public static func glass(_ glass: Glass) -> GlassButtonStyle { GlassButtonStyle(glass) }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
extension PrimitiveButtonStyle where Self == GlassProminentButtonStyle {
|
|
126
|
+
public static var glassProminent: GlassProminentButtonStyle { GlassProminentButtonStyle() }
|
|
127
|
+
}
|
|
@@ -64,7 +64,7 @@ extension _GridCellHintView: _HostView {
|
|
|
64
64
|
var _content: [any View] { [content] }
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
extension View {
|
|
67
|
+
nonisolated extension View {
|
|
68
68
|
/// Makes the cell span `count` columns of its `GridRow`.
|
|
69
69
|
public func gridCellColumns(_ count: Int) -> some View {
|
|
70
70
|
_GridCellHintView(content: self, style: ["gridCellColumns": .number(Double(count))])
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/// `GroupBox`, `ControlGroup` and `ImageRenderer`.
|
|
2
|
+
///
|
|
3
|
+
/// - `GroupBox` is drawn as iOS draws its default style: the label in the
|
|
4
|
+
/// headline font above the content, 8 points apart, inside 16 points of
|
|
5
|
+
/// padding on a secondary-system-background rounded rectangle (radius 8).
|
|
6
|
+
/// `.groupBoxStyle` is accepted; every box uses that look.
|
|
7
|
+
/// - `ControlGroup` groups related controls. On iOS a menu shows them as a
|
|
8
|
+
/// row of compact buttons; here its content is a group: in a menu or a
|
|
9
|
+
/// context menu each control is an item of its own, elsewhere they flow in
|
|
10
|
+
/// the enclosing stack. Its label is not drawn.
|
|
11
|
+
/// - `ImageRenderer` would rasterize a view. Only the page draws views, so
|
|
12
|
+
/// `cgImage` and `uiImage` are nil (a share-as-image feature has nothing
|
|
13
|
+
/// to share); its settings are kept.
|
|
14
|
+
|
|
15
|
+
// MARK: - GroupBox
|
|
16
|
+
|
|
17
|
+
public struct GroupBox<Label: View, Content: View>: View {
|
|
18
|
+
let label: Label
|
|
19
|
+
let content: Content
|
|
20
|
+
|
|
21
|
+
public init(@ViewBuilder content: () -> Content, @ViewBuilder label: () -> Label) {
|
|
22
|
+
self.content = content()
|
|
23
|
+
self.label = label()
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public init(label: Label, @ViewBuilder content: () -> Content) {
|
|
27
|
+
self.label = label
|
|
28
|
+
self.content = content()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public var body: some View {
|
|
32
|
+
VStack(alignment: .leading, spacing: 8) {
|
|
33
|
+
label.font(.headline)
|
|
34
|
+
content
|
|
35
|
+
}
|
|
36
|
+
.padding(16)
|
|
37
|
+
.background(Color(semantic: "secondarySystemBackground"), in: RoundedRectangle(cornerRadius: 8))
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
extension GroupBox where Label == EmptyView {
|
|
42
|
+
public init(@ViewBuilder content: () -> Content) {
|
|
43
|
+
self.init(label: EmptyView(), content: content)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
extension GroupBox where Label == Text {
|
|
48
|
+
public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
|
|
49
|
+
self.init(label: Text(titleKey), content: content)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@_disfavoredOverload
|
|
53
|
+
public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
|
|
54
|
+
self.init(label: Text(title), content: content)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// A group box's look; accepted (see the file comment).
|
|
59
|
+
public protocol GroupBoxStyle {}
|
|
60
|
+
public struct DefaultGroupBoxStyle: GroupBoxStyle { public init() {} }
|
|
61
|
+
extension GroupBoxStyle where Self == DefaultGroupBoxStyle {
|
|
62
|
+
public static var automatic: DefaultGroupBoxStyle { DefaultGroupBoxStyle() }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
nonisolated extension View {
|
|
66
|
+
public func groupBoxStyle<S: GroupBoxStyle>(_ style: S) -> some View { self }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// MARK: - ControlGroup
|
|
70
|
+
|
|
71
|
+
public struct ControlGroup<Content: View> {
|
|
72
|
+
let content: Content
|
|
73
|
+
|
|
74
|
+
public init(@ViewBuilder content: () -> Content) {
|
|
75
|
+
self.content = content()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// The label (shown by a collapsed group on iOS) is not drawn.
|
|
79
|
+
public init<L: View>(@ViewBuilder content: () -> Content, @ViewBuilder label: () -> L) {
|
|
80
|
+
self.content = content()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
|
|
84
|
+
self.content = content()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@_disfavoredOverload
|
|
88
|
+
public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
|
|
89
|
+
self.content = content()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public init(_ titleKey: LocalizedStringKey, systemImage: String, @ViewBuilder content: () -> Content) {
|
|
93
|
+
self.content = content()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@_disfavoredOverload
|
|
97
|
+
public init<S: StringProtocol>(_ title: S, systemImage: String, @ViewBuilder content: () -> Content) {
|
|
98
|
+
self.content = content()
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
extension ControlGroup: View {
|
|
103
|
+
public typealias Body = Never
|
|
104
|
+
public var body: Never { fatalError("ControlGroup is a primitive view") }
|
|
105
|
+
}
|
|
106
|
+
extension ControlGroup: _PrimitiveView {}
|
|
107
|
+
extension ControlGroup: _GroupView {
|
|
108
|
+
var _children: [any View] { [content] }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// MARK: - ImageRenderer
|
|
112
|
+
|
|
113
|
+
/// Renders a view to an image: never, in the browser (see the file comment).
|
|
114
|
+
@MainActor
|
|
115
|
+
public final class ImageRenderer<Content: View>: ObservableObject {
|
|
116
|
+
public var content: Content
|
|
117
|
+
public var label: String?
|
|
118
|
+
public var proposedSize = ProposedViewSize.unspecified
|
|
119
|
+
public var scale: CGFloat = 1
|
|
120
|
+
public var isOpaque = false
|
|
121
|
+
|
|
122
|
+
public init(content: Content) {
|
|
123
|
+
self.content = content
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// Nil: only the page draws views.
|
|
127
|
+
public var cgImage: CGImage? { nil }
|
|
128
|
+
/// Nil: only the page draws views.
|
|
129
|
+
public var uiImage: UIImage? { nil }
|
|
130
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Focus and key presses for views that are not text fields: `.focusable()`,
|
|
2
|
+
// `.focusEffectDisabled()` and `.onKeyPress`. They serve a hardware
|
|
3
|
+
// keyboard on an iPad or a Mac. The page shows an iPhone and sends the app
|
|
4
|
+
// no key events outside text inputs, so, like the pointer modifiers
|
|
5
|
+
// (PointerAndKeyboard.swift), these are accepted and do nothing: a key-press
|
|
6
|
+
// action is never called (Ice Cubes' media viewer pages with its swipes
|
|
7
|
+
// instead of the arrow keys).
|
|
8
|
+
|
|
9
|
+
/// A key press a view handles.
|
|
10
|
+
public struct KeyPress: Sendable {
|
|
11
|
+
/// Whether the press was dealt with; an ignored one goes to the parent.
|
|
12
|
+
public enum Result: Sendable, Hashable { case handled, ignored }
|
|
13
|
+
|
|
14
|
+
/// The phases of a press an action hears.
|
|
15
|
+
public struct Phases: OptionSet, Hashable, Sendable {
|
|
16
|
+
public let rawValue: Int
|
|
17
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
18
|
+
public static let down = Phases(rawValue: 1 << 0)
|
|
19
|
+
public static let `repeat` = Phases(rawValue: 1 << 1)
|
|
20
|
+
public static let up = Phases(rawValue: 1 << 2)
|
|
21
|
+
public static let all: Phases = [.down, .repeat, .up]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public let phase: Phases
|
|
25
|
+
public let key: KeyEquivalent
|
|
26
|
+
public let characters: String
|
|
27
|
+
public let modifiers: EventModifiers
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// How a focusable view is used.
|
|
31
|
+
public struct FocusInteractions: OptionSet, Hashable, Sendable {
|
|
32
|
+
public let rawValue: Int
|
|
33
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
34
|
+
public static let activate = FocusInteractions(rawValue: 1 << 0)
|
|
35
|
+
public static let edit = FocusInteractions(rawValue: 1 << 1)
|
|
36
|
+
public static let automatic: FocusInteractions = [.activate, .edit]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
nonisolated extension View {
|
|
40
|
+
/// Accepted: the view takes no keyboard focus on the page.
|
|
41
|
+
public func focusable(_ isFocusable: Bool = true) -> some View { self }
|
|
42
|
+
public func focusable(_ isFocusable: Bool = true, interactions: FocusInteractions) -> some View { self }
|
|
43
|
+
/// Accepted: the page draws no focus ring for such views.
|
|
44
|
+
public func focusEffectDisabled(_ disabled: Bool = true) -> some View { self }
|
|
45
|
+
|
|
46
|
+
/// Accepted; the action is never called (no key events reach the app).
|
|
47
|
+
public func onKeyPress(_ key: KeyEquivalent, action: @escaping () -> KeyPress.Result) -> some View { self }
|
|
48
|
+
public func onKeyPress(_ key: KeyEquivalent, phases: KeyPress.Phases,
|
|
49
|
+
action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
|
|
50
|
+
public func onKeyPress(keys: Set<KeyEquivalent>, phases: KeyPress.Phases = [.down, .repeat],
|
|
51
|
+
action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
|
|
52
|
+
public func onKeyPress(phases: KeyPress.Phases = [.down, .repeat],
|
|
53
|
+
action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
|
|
54
|
+
}
|