@swiftbrowser/swift 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/// Gestures: `DragGesture`, `LongPressGesture` and `TapGesture`, attached with
|
|
2
|
+
/// `.gesture` (and its `highPriority` / `simultaneous` twins, which the shim
|
|
3
|
+
/// treats identically). A drag or long press becomes a `gesture` element
|
|
4
|
+
/// whose child is the content; the renderer tracks pointers on it and sends
|
|
5
|
+
/// `drag` / `longpress` events (see docs/ops-protocol.md, Phase 8). A plain
|
|
6
|
+
/// tap gesture is the Phase 6 `tapgesture` element.
|
|
7
|
+
|
|
8
|
+
/// Which gestures of a subtree a `.gesture` modifier competes with. Accepted
|
|
9
|
+
/// for source compatibility; the renderer resolves the innermost control.
|
|
10
|
+
public struct GestureMask: OptionSet, Sendable {
|
|
11
|
+
public let rawValue: UInt
|
|
12
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
13
|
+
public static let none = GestureMask([])
|
|
14
|
+
public static let gesture = GestureMask(rawValue: 1)
|
|
15
|
+
public static let subviews = GestureMask(rawValue: 2)
|
|
16
|
+
public static let all: GestureMask = [.gesture, .subviews]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/// What the renderer must track for a gesture and what to do with its events.
|
|
20
|
+
/// Combined gestures (`sequenced`, `simultaneously`) merge their configurations.
|
|
21
|
+
public struct _GestureConfig: Sendable {
|
|
22
|
+
var drag = false
|
|
23
|
+
var longPress = false
|
|
24
|
+
var minimumDistance: CGFloat = 10
|
|
25
|
+
var minimumDuration: Double = 0.5
|
|
26
|
+
var onDragChanged: [@MainActor (DragGesture.Value) -> Void] = []
|
|
27
|
+
var onDragEnded: [@MainActor (DragGesture.Value) -> Void] = []
|
|
28
|
+
var onLongPressChanged: [@MainActor (Bool) -> Void] = []
|
|
29
|
+
var onLongPressEnded: [@MainActor (Bool) -> Void] = []
|
|
30
|
+
var onTap: [@MainActor () -> Void] = []
|
|
31
|
+
|
|
32
|
+
func merged(with other: _GestureConfig) -> _GestureConfig {
|
|
33
|
+
var result = self
|
|
34
|
+
result.drag = drag || other.drag
|
|
35
|
+
result.longPress = longPress || other.longPress
|
|
36
|
+
result.minimumDistance = drag && other.drag ? min(minimumDistance, other.minimumDistance)
|
|
37
|
+
: (other.drag ? other.minimumDistance : minimumDistance)
|
|
38
|
+
result.minimumDuration = longPress && other.longPress ? min(minimumDuration, other.minimumDuration)
|
|
39
|
+
: (other.longPress ? other.minimumDuration : minimumDuration)
|
|
40
|
+
result.onDragChanged += other.onDragChanged
|
|
41
|
+
result.onDragEnded += other.onDragEnded
|
|
42
|
+
result.onLongPressChanged += other.onLongPressChanged
|
|
43
|
+
result.onLongPressEnded += other.onLongPressEnded
|
|
44
|
+
result.onTap += other.onTap
|
|
45
|
+
return result
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// A gesture the renderer recognizes. `Value` is what the callbacks receive.
|
|
50
|
+
public protocol Gesture {
|
|
51
|
+
associatedtype Value
|
|
52
|
+
var _config: _GestureConfig { get }
|
|
53
|
+
/// Adds callbacks for the gesture's changed / ended phases to a config
|
|
54
|
+
/// (each gesture type knows which lists its `Value` belongs in).
|
|
55
|
+
static func _adding(to config: _GestureConfig,
|
|
56
|
+
changed: (@MainActor (Value) -> Void)?,
|
|
57
|
+
ended: (@MainActor (Value) -> Void)?) -> _GestureConfig
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
extension Gesture {
|
|
61
|
+
public func onChanged(_ action: @escaping @MainActor (Value) -> Void) -> _ModifiedGesture<Self> {
|
|
62
|
+
_ModifiedGesture(_config: Self._adding(to: _config, changed: action, ended: nil))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public func onEnded(_ action: @escaping @MainActor (Value) -> Void) -> _ModifiedGesture<Self> {
|
|
66
|
+
_ModifiedGesture(_config: Self._adding(to: _config, changed: nil, ended: action))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// Both gestures are recognized; the shim does not order them.
|
|
70
|
+
public func sequenced<Other: Gesture>(before other: Other) -> _CombinedGesture<Self, Other> {
|
|
71
|
+
_CombinedGesture(_config: _config.merged(with: other._config))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public func simultaneously<Other: Gesture>(with other: Other) -> _CombinedGesture<Self, Other> {
|
|
75
|
+
_CombinedGesture(_config: _config.merged(with: other._config))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public func exclusively<Other: Gesture>(before other: Other) -> _CombinedGesture<Self, Other> {
|
|
79
|
+
_CombinedGesture(_config: _config.merged(with: other._config))
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// A gesture with `onChanged` / `onEnded` callbacks attached; keeps the base
|
|
84
|
+
/// gesture's `Value` so further callbacks can be chained.
|
|
85
|
+
public struct _ModifiedGesture<Base: Gesture>: Gesture {
|
|
86
|
+
public typealias Value = Base.Value
|
|
87
|
+
public let _config: _GestureConfig
|
|
88
|
+
|
|
89
|
+
public static func _adding(to config: _GestureConfig,
|
|
90
|
+
changed: (@MainActor (Value) -> Void)?,
|
|
91
|
+
ended: (@MainActor (Value) -> Void)?) -> _GestureConfig {
|
|
92
|
+
Base._adding(to: config, changed: changed, ended: ended)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// Two gestures combined. Its `Value` is never produced: attach callbacks to
|
|
97
|
+
/// the parts before combining them.
|
|
98
|
+
public struct _CombinedGesture<First: Gesture, Second: Gesture>: Gesture {
|
|
99
|
+
public typealias Value = Void
|
|
100
|
+
public let _config: _GestureConfig
|
|
101
|
+
|
|
102
|
+
public static func _adding(to config: _GestureConfig,
|
|
103
|
+
changed: (@MainActor (Value) -> Void)?,
|
|
104
|
+
ended: (@MainActor (Value) -> Void)?) -> _GestureConfig {
|
|
105
|
+
config
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// MARK: - DragGesture
|
|
110
|
+
|
|
111
|
+
public struct DragGesture: Gesture {
|
|
112
|
+
/// The drag so far. Coordinates are in the gesture element's own box
|
|
113
|
+
/// (`coordinateSpace` is accepted and ignored). `predictedEnd…` project
|
|
114
|
+
/// the velocity a quarter second ahead.
|
|
115
|
+
public struct Value: Equatable, Sendable {
|
|
116
|
+
public var location: CGPoint
|
|
117
|
+
public var startLocation: CGPoint
|
|
118
|
+
public var translation: CGSize
|
|
119
|
+
public var velocity: CGSize
|
|
120
|
+
|
|
121
|
+
public init(location: CGPoint = .zero, startLocation: CGPoint = .zero,
|
|
122
|
+
translation: CGSize = .zero, velocity: CGSize = .zero) {
|
|
123
|
+
self.location = location
|
|
124
|
+
self.startLocation = startLocation
|
|
125
|
+
self.translation = translation
|
|
126
|
+
self.velocity = velocity
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public var predictedEndLocation: CGPoint {
|
|
130
|
+
CGPoint(x: location.x + velocity.width / 4, y: location.y + velocity.height / 4)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public var predictedEndTranslation: CGSize {
|
|
134
|
+
CGSize(width: translation.width + velocity.width / 4, height: translation.height + velocity.height / 4)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public var minimumDistance: CGFloat
|
|
139
|
+
public var coordinateSpace: CoordinateSpace
|
|
140
|
+
|
|
141
|
+
public init(minimumDistance: CGFloat = 10, coordinateSpace: CoordinateSpace = .local) {
|
|
142
|
+
self.minimumDistance = minimumDistance
|
|
143
|
+
self.coordinateSpace = coordinateSpace
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public var _config: _GestureConfig {
|
|
147
|
+
var config = _GestureConfig()
|
|
148
|
+
config.drag = true
|
|
149
|
+
config.minimumDistance = minimumDistance
|
|
150
|
+
return config
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public static func _adding(to config: _GestureConfig,
|
|
154
|
+
changed: (@MainActor (Value) -> Void)?,
|
|
155
|
+
ended: (@MainActor (Value) -> Void)?) -> _GestureConfig {
|
|
156
|
+
var config = config
|
|
157
|
+
if let changed { config.onDragChanged.append(changed) }
|
|
158
|
+
if let ended { config.onDragEnded.append(ended) }
|
|
159
|
+
return config
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// MARK: - LongPressGesture
|
|
164
|
+
|
|
165
|
+
/// `Value` is `true` once the press is recognized. The renderer reports only
|
|
166
|
+
/// the recognition, so `onChanged(true)` and `onEnded(true)` fire together.
|
|
167
|
+
public struct LongPressGesture: Gesture {
|
|
168
|
+
public typealias Value = Bool
|
|
169
|
+
public var minimumDuration: Double
|
|
170
|
+
public var maximumDistance: CGFloat
|
|
171
|
+
|
|
172
|
+
public init(minimumDuration: Double = 0.5, maximumDistance: CGFloat = 10) {
|
|
173
|
+
self.minimumDuration = minimumDuration
|
|
174
|
+
self.maximumDistance = maximumDistance
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public var _config: _GestureConfig {
|
|
178
|
+
var config = _GestureConfig()
|
|
179
|
+
config.longPress = true
|
|
180
|
+
config.minimumDuration = minimumDuration
|
|
181
|
+
return config
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public static func _adding(to config: _GestureConfig,
|
|
185
|
+
changed: (@MainActor (Value) -> Void)?,
|
|
186
|
+
ended: (@MainActor (Value) -> Void)?) -> _GestureConfig {
|
|
187
|
+
var config = config
|
|
188
|
+
if let changed { config.onLongPressChanged.append(changed) }
|
|
189
|
+
if let ended { config.onLongPressEnded.append(ended) }
|
|
190
|
+
return config
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// MARK: - TapGesture
|
|
195
|
+
|
|
196
|
+
/// A tap; `count` is accepted and ignored (every tap is reported).
|
|
197
|
+
public struct TapGesture: Gesture {
|
|
198
|
+
public typealias Value = Void
|
|
199
|
+
public var count: Int
|
|
200
|
+
|
|
201
|
+
public init(count: Int = 1) { self.count = count }
|
|
202
|
+
|
|
203
|
+
public var _config: _GestureConfig { _GestureConfig() }
|
|
204
|
+
|
|
205
|
+
public static func _adding(to config: _GestureConfig,
|
|
206
|
+
changed: (@MainActor (Value) -> Void)?,
|
|
207
|
+
ended: (@MainActor (Value) -> Void)?) -> _GestureConfig {
|
|
208
|
+
var config = config
|
|
209
|
+
if let ended { config.onTap.append { ended(()) } }
|
|
210
|
+
return config
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// MARK: - The element
|
|
215
|
+
|
|
216
|
+
/// The `gesture` element: props say what to track, the handler parses the
|
|
217
|
+
/// renderer's `drag` / `longpress` events. A `cancelled` drag ends the
|
|
218
|
+
/// gesture with its last value (`onEnded` runs), so state the app resets in
|
|
219
|
+
/// `onEnded` is reset.
|
|
220
|
+
struct _GestureHost {
|
|
221
|
+
let content: any View
|
|
222
|
+
let config: _GestureConfig
|
|
223
|
+
}
|
|
224
|
+
extension _GestureHost: _PrimitiveView {}
|
|
225
|
+
extension _GestureHost: _HostView {
|
|
226
|
+
var _kind: String { "gesture" }
|
|
227
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
228
|
+
.object([
|
|
229
|
+
"drag": .bool(config.drag),
|
|
230
|
+
"longPress": .bool(config.longPress),
|
|
231
|
+
"minimumDistance": .number(config.minimumDistance),
|
|
232
|
+
"minimumDuration": .number(config.minimumDuration),
|
|
233
|
+
])
|
|
234
|
+
}
|
|
235
|
+
var _content: [any View] { [content] }
|
|
236
|
+
var _handler: ((_JSON) -> Void)? {
|
|
237
|
+
let config = self.config
|
|
238
|
+
return { payload in
|
|
239
|
+
guard case .object(let fields) = payload, case .string(let type)? = fields["type"] else { return }
|
|
240
|
+
MainActor.assumeIsolated {
|
|
241
|
+
switch type {
|
|
242
|
+
case "drag":
|
|
243
|
+
let value = DragGesture.Value(fields)
|
|
244
|
+
let phase: String = if case .string(let p)? = fields["phase"] { p } else { "changed" }
|
|
245
|
+
switch phase {
|
|
246
|
+
case "began", "changed":
|
|
247
|
+
for action in config.onDragChanged { action(value) }
|
|
248
|
+
case "ended", "cancelled":
|
|
249
|
+
for action in config.onDragEnded { action(value) }
|
|
250
|
+
default:
|
|
251
|
+
break
|
|
252
|
+
}
|
|
253
|
+
case "longpress":
|
|
254
|
+
for action in config.onLongPressChanged { action(true) }
|
|
255
|
+
for action in config.onLongPressEnded { action(true) }
|
|
256
|
+
default:
|
|
257
|
+
break
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
extension DragGesture.Value {
|
|
265
|
+
/// Parses a `drag` event's fields; absent fields are zero.
|
|
266
|
+
init(_ fields: [String: _JSON]) {
|
|
267
|
+
func point(_ key: String) -> CGPoint {
|
|
268
|
+
guard case .object(let o)? = fields[key] else { return .zero }
|
|
269
|
+
return CGPoint(x: _number(o["x"]), y: _number(o["y"]))
|
|
270
|
+
}
|
|
271
|
+
func size(_ key: String) -> CGSize {
|
|
272
|
+
guard case .object(let o)? = fields[key] else { return .zero }
|
|
273
|
+
return CGSize(width: _number(o["width"]), height: _number(o["height"]))
|
|
274
|
+
}
|
|
275
|
+
self.init(location: point("location"), startLocation: point("startLocation"),
|
|
276
|
+
translation: size("translation"), velocity: size("velocity"))
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
private func _number(_ json: _JSON?) -> Double {
|
|
281
|
+
if case .number(let n)? = json { return n }
|
|
282
|
+
return 0
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/// `.gesture(_:)`: the content under a `gesture` element when the gesture
|
|
286
|
+
/// drags or long-presses, under a `tapgesture` when it taps, both when it does
|
|
287
|
+
/// both, and plain when the gesture has no callbacks.
|
|
288
|
+
struct _GestureView<Content: View> {
|
|
289
|
+
let content: Content
|
|
290
|
+
let config: _GestureConfig
|
|
291
|
+
}
|
|
292
|
+
extension _GestureView: _PrimitiveView {}
|
|
293
|
+
extension _GestureView: _GroupView {
|
|
294
|
+
var _children: [any View] {
|
|
295
|
+
var inner: any View = content
|
|
296
|
+
if !config.onTap.isEmpty {
|
|
297
|
+
let taps = config.onTap
|
|
298
|
+
inner = _TapGestureView(content: AnyView(inner)) { for action in taps { action() } }
|
|
299
|
+
}
|
|
300
|
+
if config.drag || config.longPress {
|
|
301
|
+
return [_GestureHost(content: inner, config: config)]
|
|
302
|
+
}
|
|
303
|
+
return [inner]
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
nonisolated extension View {
|
|
308
|
+
public func gesture<G: Gesture>(_ gesture: G, including mask: GestureMask = .all) -> some View {
|
|
309
|
+
_GestureView(content: self, config: gesture._config)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
public func highPriorityGesture<G: Gesture>(_ gesture: G, including mask: GestureMask = .all) -> some View {
|
|
313
|
+
_GestureView(content: self, config: gesture._config)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
public func simultaneousGesture<G: Gesture>(_ gesture: G, including mask: GestureMask = .all) -> some View {
|
|
317
|
+
_GestureView(content: self, config: gesture._config)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/// `onPressingChanged` is told `true` then `false` around `action`, when
|
|
321
|
+
/// the press is recognized (the renderer reports no earlier touch-down).
|
|
322
|
+
public func onLongPressGesture(minimumDuration: Double = 0.5, maximumDistance: CGFloat = 10,
|
|
323
|
+
perform action: @escaping @MainActor () -> Void,
|
|
324
|
+
onPressingChanged: (@MainActor (Bool) -> Void)? = nil) -> some View {
|
|
325
|
+
var config = _GestureConfig()
|
|
326
|
+
config.longPress = true
|
|
327
|
+
config.minimumDuration = minimumDuration
|
|
328
|
+
config.onLongPressEnded = [{ _ in
|
|
329
|
+
onPressingChanged?(true)
|
|
330
|
+
action()
|
|
331
|
+
onPressingChanged?(false)
|
|
332
|
+
}]
|
|
333
|
+
return _GestureView(content: self, config: config)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
public func onLongPressGesture(minimumDuration: Double = 0.5, maximumDistance: CGFloat = 10,
|
|
337
|
+
pressing: (@MainActor (Bool) -> Void)?,
|
|
338
|
+
perform action: @escaping @MainActor () -> Void) -> some View {
|
|
339
|
+
onLongPressGesture(minimumDuration: minimumDuration, maximumDistance: maximumDistance,
|
|
340
|
+
perform: action, onPressingChanged: pressing)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// Grid containers. The renderer lays them out; the Swift side sends the
|
|
2
|
+
// configuration and the children. See docs/ops-protocol.md (Phase 6).
|
|
3
|
+
|
|
4
|
+
// MARK: - Grid / GridRow
|
|
5
|
+
|
|
6
|
+
/// A two-dimensional layout of rows (`GridRow`) and columns.
|
|
7
|
+
public struct Grid<Content: View> {
|
|
8
|
+
let alignment: Alignment
|
|
9
|
+
let horizontalSpacing: CGFloat?
|
|
10
|
+
let verticalSpacing: CGFloat?
|
|
11
|
+
let content: Content
|
|
12
|
+
|
|
13
|
+
public init(alignment: Alignment = .center, horizontalSpacing: CGFloat? = nil,
|
|
14
|
+
verticalSpacing: CGFloat? = nil, @ViewBuilder content: () -> Content) {
|
|
15
|
+
self.alignment = alignment
|
|
16
|
+
self.horizontalSpacing = horizontalSpacing
|
|
17
|
+
self.verticalSpacing = verticalSpacing
|
|
18
|
+
self.content = content()
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
extension Grid: _PrimitiveView {}
|
|
22
|
+
extension Grid: _HostView {
|
|
23
|
+
var _kind: String { "grid" }
|
|
24
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
25
|
+
.object([
|
|
26
|
+
"horizontalSpacing": horizontalSpacing.map(_JSON.number) ?? .null,
|
|
27
|
+
"verticalSpacing": verticalSpacing.map(_JSON.number) ?? .null,
|
|
28
|
+
"alignment": .string(alignment._name),
|
|
29
|
+
])
|
|
30
|
+
}
|
|
31
|
+
var _content: [any View] { [content] }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// One row of a `Grid`; each child is a cell.
|
|
35
|
+
public struct GridRow<Content: View> {
|
|
36
|
+
let alignment: VerticalAlignment?
|
|
37
|
+
let content: Content
|
|
38
|
+
|
|
39
|
+
public init(alignment: VerticalAlignment? = nil, @ViewBuilder content: () -> Content) {
|
|
40
|
+
self.alignment = alignment
|
|
41
|
+
self.content = content()
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
extension GridRow: _PrimitiveView {}
|
|
45
|
+
extension GridRow: _HostView {
|
|
46
|
+
var _kind: String { "gridrow" }
|
|
47
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
48
|
+
// Baseline alignments are approximated as `center` (see VerticalAlignment).
|
|
49
|
+
.object(["alignment": alignment.map { .string($0.name) } ?? .null])
|
|
50
|
+
}
|
|
51
|
+
var _content: [any View] { [content] }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/// A `styled` element carrying grid cell hints. `_Style` lives in
|
|
55
|
+
/// Modifiers.swift; this view is protocol-identical for the host.
|
|
56
|
+
struct _GridCellHintView<Content: View> {
|
|
57
|
+
let content: Content
|
|
58
|
+
let style: [String: _JSON]
|
|
59
|
+
}
|
|
60
|
+
extension _GridCellHintView: _PrimitiveView {}
|
|
61
|
+
extension _GridCellHintView: _HostView {
|
|
62
|
+
var _kind: String { "styled" }
|
|
63
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object(["style": .object(style)]) }
|
|
64
|
+
var _content: [any View] { [content] }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
nonisolated extension View {
|
|
68
|
+
/// Makes the cell span `count` columns of its `GridRow`.
|
|
69
|
+
public func gridCellColumns(_ count: Int) -> some View {
|
|
70
|
+
_GridCellHintView(content: self, style: ["gridCellColumns": .number(Double(count))])
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// Where the cell's content sits when the cell is larger than the content.
|
|
74
|
+
public func gridCellAnchor(_ anchor: UnitPoint) -> some View {
|
|
75
|
+
_GridCellHintView(content: self, style: ["gridCellAnchor": .object(["x": .number(anchor.x), "y": .number(anchor.y)])])
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Accepted for source compatibility; the renderer aligns columns by the grid's alignment.
|
|
79
|
+
public func gridColumnAlignment(_ guide: HorizontalAlignment) -> some View { self }
|
|
80
|
+
|
|
81
|
+
/// Accepted for source compatibility; cells are sized by their content.
|
|
82
|
+
public func gridCellUnsizedAxes(_ axes: Axis.Set) -> some View { self }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// MARK: - GridItem
|
|
86
|
+
|
|
87
|
+
/// A column of a `LazyVGrid` (or a row of a `LazyHGrid`).
|
|
88
|
+
public struct GridItem: Sendable {
|
|
89
|
+
public enum Size: Sendable {
|
|
90
|
+
case fixed(CGFloat)
|
|
91
|
+
case flexible(minimum: CGFloat = 10, maximum: CGFloat = .infinity)
|
|
92
|
+
case adaptive(minimum: CGFloat, maximum: CGFloat = .infinity)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public var size: Size
|
|
96
|
+
public var spacing: CGFloat?
|
|
97
|
+
public var alignment: Alignment?
|
|
98
|
+
|
|
99
|
+
public init(_ size: Size = .flexible(), spacing: CGFloat? = nil, alignment: Alignment? = nil) {
|
|
100
|
+
self.size = size
|
|
101
|
+
self.spacing = spacing
|
|
102
|
+
self.alignment = alignment
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
var _json: _JSON {
|
|
106
|
+
func bound(_ value: CGFloat) -> _JSON { value == .infinity ? .string("infinity") : .number(value) }
|
|
107
|
+
let size: _JSON = switch self.size {
|
|
108
|
+
case .fixed(let value):
|
|
109
|
+
.object(["kind": .string("fixed"), "value": .number(value)])
|
|
110
|
+
case .flexible(let minimum, let maximum):
|
|
111
|
+
.object(["kind": .string("flexible"), "minimum": .number(minimum), "maximum": bound(maximum)])
|
|
112
|
+
case .adaptive(let minimum, let maximum):
|
|
113
|
+
.object(["kind": .string("adaptive"), "minimum": .number(minimum), "maximum": bound(maximum)])
|
|
114
|
+
}
|
|
115
|
+
return .object([
|
|
116
|
+
"size": size,
|
|
117
|
+
"spacing": spacing.map(_JSON.number) ?? .null,
|
|
118
|
+
"alignment": alignment.map { .string($0._name) } ?? .null,
|
|
119
|
+
])
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Views a lazy grid keeps pinned while scrolling. Accepted for source
|
|
124
|
+
/// compatibility; the renderer does not pin.
|
|
125
|
+
public struct PinnedScrollableViews: OptionSet, Sendable {
|
|
126
|
+
public let rawValue: UInt32
|
|
127
|
+
public init(rawValue: UInt32) { self.rawValue = rawValue }
|
|
128
|
+
public static let sectionHeaders = PinnedScrollableViews(rawValue: 1 << 0)
|
|
129
|
+
public static let sectionFooters = PinnedScrollableViews(rawValue: 1 << 1)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// MARK: - LazyVGrid / LazyHGrid
|
|
133
|
+
|
|
134
|
+
/// A grid that grows vertically, filling the given columns row by row.
|
|
135
|
+
public struct LazyVGrid<Content: View> {
|
|
136
|
+
let columns: [GridItem]
|
|
137
|
+
let alignment: HorizontalAlignment
|
|
138
|
+
let spacing: CGFloat?
|
|
139
|
+
let content: Content
|
|
140
|
+
|
|
141
|
+
public init(columns: [GridItem], alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
|
|
142
|
+
pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content) {
|
|
143
|
+
self.columns = columns
|
|
144
|
+
self.alignment = alignment
|
|
145
|
+
self.spacing = spacing
|
|
146
|
+
self.content = content()
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
extension LazyVGrid: _PrimitiveView {}
|
|
150
|
+
extension LazyVGrid: _HostView {
|
|
151
|
+
var _kind: String { "lazyvgrid" }
|
|
152
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
153
|
+
.object([
|
|
154
|
+
"columns": .array(columns.map(\._json)),
|
|
155
|
+
"spacing": spacing.map(_JSON.number) ?? .null,
|
|
156
|
+
"alignment": .string(alignment.name),
|
|
157
|
+
])
|
|
158
|
+
}
|
|
159
|
+
var _content: [any View] { [content] }
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// A grid that grows horizontally, filling the given rows column by column.
|
|
163
|
+
public struct LazyHGrid<Content: View> {
|
|
164
|
+
let rows: [GridItem]
|
|
165
|
+
let alignment: VerticalAlignment
|
|
166
|
+
let spacing: CGFloat?
|
|
167
|
+
let content: Content
|
|
168
|
+
|
|
169
|
+
public init(rows: [GridItem], alignment: VerticalAlignment = .center, spacing: CGFloat? = nil,
|
|
170
|
+
pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content) {
|
|
171
|
+
self.rows = rows
|
|
172
|
+
self.alignment = alignment
|
|
173
|
+
self.spacing = spacing
|
|
174
|
+
self.content = content()
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
extension LazyHGrid: _PrimitiveView {}
|
|
178
|
+
extension LazyHGrid: _HostView {
|
|
179
|
+
var _kind: String { "lazyhgrid" }
|
|
180
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
181
|
+
.object([
|
|
182
|
+
"rows": .array(rows.map(\._json)),
|
|
183
|
+
"spacing": spacing.map(_JSON.number) ?? .null,
|
|
184
|
+
"alignment": .string(alignment.name),
|
|
185
|
+
])
|
|
186
|
+
}
|
|
187
|
+
var _content: [any View] { [content] }
|
|
188
|
+
}
|