@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,212 @@
|
|
|
1
|
+
/// Edit mode, `EditButton`, `ForEach.onDelete` / `onMove` and `refreshable`.
|
|
2
|
+
/// See docs/ops-protocol.md, "Phase 8: interaction".
|
|
3
|
+
|
|
4
|
+
import Foundation
|
|
5
|
+
|
|
6
|
+
// MARK: - Offset sets
|
|
7
|
+
|
|
8
|
+
extension RangeReplaceableCollection {
|
|
9
|
+
/// Removes the elements at `offsets` (offsets from `startIndex`), as
|
|
10
|
+
/// SwiftUI's `onDelete` handlers do.
|
|
11
|
+
public mutating func remove(atOffsets offsets: IndexSet) {
|
|
12
|
+
for offset in offsets.sorted(by: >) where offset >= 0 && offset < count {
|
|
13
|
+
remove(at: index(startIndex, offsetBy: offset))
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
extension MutableCollection where Self: RangeReplaceableCollection {
|
|
19
|
+
/// Moves the elements at `source` so that they start at `destination`
|
|
20
|
+
/// (an offset into the collection before the move), like Foundation's.
|
|
21
|
+
public mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
|
|
22
|
+
let offsets = source.filter { $0 >= 0 && $0 < count }
|
|
23
|
+
guard !offsets.isEmpty else { return }
|
|
24
|
+
let moving = offsets.map { self[index(startIndex, offsetBy: $0)] }
|
|
25
|
+
let before = offsets.filter { $0 < destination }.count
|
|
26
|
+
for offset in offsets.sorted(by: >) {
|
|
27
|
+
remove(at: index(startIndex, offsetBy: offset))
|
|
28
|
+
}
|
|
29
|
+
let target = Swift.max(0, Swift.min(destination - before, count))
|
|
30
|
+
insert(contentsOf: moving, at: index(startIndex, offsetBy: target))
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// MARK: - onDelete / onMove
|
|
35
|
+
|
|
36
|
+
/// A view built from a collection, like SwiftUI's: `ForEach` and what
|
|
37
|
+
/// `onDelete` / `onMove` return.
|
|
38
|
+
public protocol DynamicViewContent: View {
|
|
39
|
+
associatedtype Data: Collection
|
|
40
|
+
var data: Data { get }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
extension ForEach: DynamicViewContent where Content: View {}
|
|
44
|
+
|
|
45
|
+
/// A keyed group whose rows a `List` can delete (and, when the renderer learns
|
|
46
|
+
/// to, move). The runtime wraps each row in a `listrow` with `deletable`.
|
|
47
|
+
protocol _DeletableGroup: _TraitBearing {
|
|
48
|
+
/// Calls the group's `onDelete` with the row at `offset`; nil without one.
|
|
49
|
+
var _delete: ((Int) -> Void)? { get }
|
|
50
|
+
var _move: ((Int, Int) -> Void)? { get }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public struct _EditableForEach<Base: DynamicViewContent> {
|
|
54
|
+
let base: Base
|
|
55
|
+
let delete: ((Int) -> Void)?
|
|
56
|
+
let move: ((Int, Int) -> Void)?
|
|
57
|
+
}
|
|
58
|
+
extension _EditableForEach: _PrimitiveView {}
|
|
59
|
+
extension _EditableForEach: DynamicViewContent {
|
|
60
|
+
public var data: Base.Data { base.data }
|
|
61
|
+
}
|
|
62
|
+
extension _EditableForEach: _GroupView {
|
|
63
|
+
var _children: [any View] { (base as? any _GroupView)?._children ?? [base] }
|
|
64
|
+
var _keys: [AnyHashable]? { (base as? any _GroupView)?._keys }
|
|
65
|
+
var _spreads: Bool { (base as? any _GroupView)?._spreads ?? false }
|
|
66
|
+
}
|
|
67
|
+
extension _EditableForEach: _DeletableGroup {
|
|
68
|
+
var _delete: ((Int) -> Void)? { delete }
|
|
69
|
+
var _move: ((Int, Int) -> Void)? { move }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
extension DynamicViewContent {
|
|
73
|
+
/// Lets a `List` delete the rows: `action` receives the offsets of the
|
|
74
|
+
/// removed elements in `data`. Pass `nil` to opt out.
|
|
75
|
+
public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Self> {
|
|
76
|
+
_EditableForEach(base: self, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: nil)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// Accepted for source compatibility; the renderer offers no reordering yet.
|
|
80
|
+
public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Self> {
|
|
81
|
+
_EditableForEach(base: self, delete: nil, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
extension _EditableForEach {
|
|
86
|
+
/// `ForEach(...).onDelete(...).onMove(...)`: the second modifier merges into the first.
|
|
87
|
+
public func onDelete(perform action: ((IndexSet) -> Void)?) -> _EditableForEach<Base> {
|
|
88
|
+
_EditableForEach(base: base, delete: action.map { action in { action(IndexSet(integer: $0)) } }, move: move)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public func onMove(perform action: ((IndexSet, Int) -> Void)?) -> _EditableForEach<Base> {
|
|
92
|
+
_EditableForEach(base: base, delete: delete, move: action.map { action in { action(IndexSet(integer: $0), $1) } })
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// `.deleteDisabled` / `.moveDisabled` on a row.
|
|
97
|
+
protocol _RowEditingDisabling: _TraitBearing {
|
|
98
|
+
var _deleteDisabled: Bool { get }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
struct _DeleteDisabledView<Content: View> {
|
|
102
|
+
let content: Content
|
|
103
|
+
let disabled: Bool
|
|
104
|
+
}
|
|
105
|
+
extension _DeleteDisabledView: _PrimitiveView {}
|
|
106
|
+
extension _DeleteDisabledView: _GroupView {
|
|
107
|
+
var _children: [any View] { [content] }
|
|
108
|
+
}
|
|
109
|
+
extension _DeleteDisabledView: _RowEditingDisabling {
|
|
110
|
+
var _deleteDisabled: Bool { disabled }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
nonisolated extension View {
|
|
114
|
+
public func deleteDisabled(_ isDisabled: Bool) -> some View {
|
|
115
|
+
_DeleteDisabledView(content: self, disabled: isDisabled)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// Accepted for source compatibility; rows cannot be moved yet.
|
|
119
|
+
public func moveDisabled(_ isDisabled: Bool) -> some View { self }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// MARK: - Edit mode
|
|
123
|
+
|
|
124
|
+
/// Whether a view is being edited. Each `navscreen` (and a `List` outside
|
|
125
|
+
/// a navigation stack) owns an edit mode the runtime puts in the environment
|
|
126
|
+
/// as a binding; `EditButton` toggles it and `List` reports it as `editing`.
|
|
127
|
+
public enum EditMode: Hashable, Sendable {
|
|
128
|
+
case inactive
|
|
129
|
+
case transient
|
|
130
|
+
case active
|
|
131
|
+
|
|
132
|
+
public var isEditing: Bool { self != .inactive }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
enum _EditModeKey: EnvironmentKey { static var defaultValue: Binding<EditMode>? { nil } }
|
|
136
|
+
|
|
137
|
+
extension EnvironmentValues {
|
|
138
|
+
public var editMode: Binding<EditMode>? {
|
|
139
|
+
get { self[_EditModeKey.self] }
|
|
140
|
+
set { self[_EditModeKey.self] = newValue }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/// A button that toggles the enclosing edit mode between "Edit" and "Done".
|
|
145
|
+
public struct EditButton: View {
|
|
146
|
+
@Environment(\.editMode) private var editMode
|
|
147
|
+
|
|
148
|
+
public init() {}
|
|
149
|
+
|
|
150
|
+
public var body: some View {
|
|
151
|
+
let isEditing = editMode?.wrappedValue.isEditing == true
|
|
152
|
+
let mode = editMode
|
|
153
|
+
return Button(isEditing ? "Done" : "Edit") {
|
|
154
|
+
mode?.wrappedValue = isEditing ? .inactive : .active
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// MARK: - Refreshable
|
|
160
|
+
|
|
161
|
+
enum _RefreshActionKey: EnvironmentKey {
|
|
162
|
+
static var defaultValue: (@Sendable () async -> Void)? { nil }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
extension EnvironmentValues {
|
|
166
|
+
/// `.refreshable`'s action, read by the `List` / `ScrollView` it wraps.
|
|
167
|
+
var _refreshAction: (@Sendable () async -> Void)? {
|
|
168
|
+
get { self[_RefreshActionKey.self] }
|
|
169
|
+
set { self[_RefreshActionKey.self] = newValue }
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
nonisolated extension View {
|
|
174
|
+
/// Pull to refresh on the `List` or `ScrollView` this modifies: the view
|
|
175
|
+
/// shows a spinner (`refreshing`) while `action` runs.
|
|
176
|
+
/// The action runs in the caller's actor context, as `.task`'s does.
|
|
177
|
+
public func refreshable(@_inheritActorContext action: @escaping @Sendable () async -> Void) -> some View {
|
|
178
|
+
environment(\._refreshAction, action)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/// Shared by `List` and `ScrollView`: the `refreshable` / `refreshing` props
|
|
183
|
+
/// and the `refresh` handler, driven by a `@State` flag on the view.
|
|
184
|
+
struct _Refresh {
|
|
185
|
+
let action: (@Sendable () async -> Void)?
|
|
186
|
+
let refreshing: Binding<Bool>
|
|
187
|
+
|
|
188
|
+
func addProps(to props: inout [String: _JSON]) {
|
|
189
|
+
guard action != nil else { return }
|
|
190
|
+
props["refreshable"] = .bool(true)
|
|
191
|
+
props["refreshing"] = .bool(refreshing.wrappedValue)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
@MainActor var handler: ((_JSON) -> Void)? {
|
|
195
|
+
guard let action else { return nil }
|
|
196
|
+
// Main-actor closures are Sendable; the binding itself is not.
|
|
197
|
+
let refreshing = self.refreshing
|
|
198
|
+
let isRefreshing: @MainActor () -> Bool = { refreshing.wrappedValue }
|
|
199
|
+
let setRefreshing: @MainActor (Bool) -> Void = { refreshing.wrappedValue = $0 }
|
|
200
|
+
return { payload in
|
|
201
|
+
guard case .object(let fields) = payload, case .string("refresh")? = fields["type"] else { return }
|
|
202
|
+
MainActor.assumeIsolated {
|
|
203
|
+
guard !isRefreshing() else { return }
|
|
204
|
+
setRefreshing(true)
|
|
205
|
+
Task {
|
|
206
|
+
await action()
|
|
207
|
+
setRefreshing(false)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/// Visual effects and hints that need no layout logic on the Swift side: the
|
|
2
|
+
/// renderer applies them from the `styled` element's style keys (see
|
|
3
|
+
/// docs/ops-protocol.md, "Phase 6 additions").
|
|
4
|
+
|
|
5
|
+
public struct Angle: Hashable, Sendable, Comparable {
|
|
6
|
+
public var radians: Double
|
|
7
|
+
|
|
8
|
+
public var degrees: Double {
|
|
9
|
+
get { radians * 180 / .pi }
|
|
10
|
+
set { radians = newValue * .pi / 180 }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public init() { radians = 0 }
|
|
14
|
+
public init(radians: Double) { self.radians = radians }
|
|
15
|
+
public init(degrees: Double) { radians = degrees * .pi / 180 }
|
|
16
|
+
|
|
17
|
+
public static func radians(_ radians: Double) -> Angle { Angle(radians: radians) }
|
|
18
|
+
public static func degrees(_ degrees: Double) -> Angle { Angle(degrees: degrees) }
|
|
19
|
+
public static let zero = Angle()
|
|
20
|
+
|
|
21
|
+
public static func < (lhs: Angle, rhs: Angle) -> Bool { lhs.radians < rhs.radians }
|
|
22
|
+
|
|
23
|
+
public static prefix func - (angle: Angle) -> Angle { Angle(radians: -angle.radians) }
|
|
24
|
+
public static func + (lhs: Angle, rhs: Angle) -> Angle { Angle(radians: lhs.radians + rhs.radians) }
|
|
25
|
+
public static func - (lhs: Angle, rhs: Angle) -> Angle { Angle(radians: lhs.radians - rhs.radians) }
|
|
26
|
+
public static func * (lhs: Angle, rhs: Double) -> Angle { Angle(radians: lhs.radians * rhs) }
|
|
27
|
+
public static func * (lhs: Double, rhs: Angle) -> Angle { Angle(radians: lhs * rhs.radians) }
|
|
28
|
+
public static func / (lhs: Angle, rhs: Double) -> Angle { Angle(radians: lhs.radians / rhs) }
|
|
29
|
+
public static func += (lhs: inout Angle, rhs: Angle) { lhs = lhs + rhs }
|
|
30
|
+
public static func -= (lhs: inout Angle, rhs: Angle) { lhs = lhs - rhs }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// `.formStyle`: accepted for source compatibility; forms are always grouped.
|
|
34
|
+
public protocol FormStyle {}
|
|
35
|
+
public struct AutomaticFormStyle: FormStyle { public init() {} }
|
|
36
|
+
public struct GroupedFormStyle: FormStyle { public init() {} }
|
|
37
|
+
public struct ColumnsFormStyle: FormStyle { public init() {} }
|
|
38
|
+
extension FormStyle where Self == AutomaticFormStyle {
|
|
39
|
+
public static var automatic: AutomaticFormStyle { AutomaticFormStyle() }
|
|
40
|
+
}
|
|
41
|
+
extension FormStyle where Self == GroupedFormStyle {
|
|
42
|
+
public static var grouped: GroupedFormStyle { GroupedFormStyle() }
|
|
43
|
+
}
|
|
44
|
+
extension FormStyle where Self == ColumnsFormStyle {
|
|
45
|
+
public static var columns: ColumnsFormStyle { ColumnsFormStyle() }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
extension Image {
|
|
49
|
+
public enum Scale: Hashable, Sendable {
|
|
50
|
+
case small, medium, large
|
|
51
|
+
|
|
52
|
+
var name: String {
|
|
53
|
+
switch self {
|
|
54
|
+
case .small: "small"
|
|
55
|
+
case .medium: "medium"
|
|
56
|
+
case .large: "large"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
nonisolated extension View {
|
|
63
|
+
/// Translates the rendered view without affecting layout.
|
|
64
|
+
public func offset(x: CGFloat = 0, y: CGFloat = 0) -> some View {
|
|
65
|
+
_styled { $0.extras["offset"] = .object(["x": .number(x), "y": .number(y)]) }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public func offset(_ offset: CGSize) -> some View {
|
|
69
|
+
self.offset(x: offset.width, y: offset.height)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public func rotationEffect(_ angle: Angle, anchor: UnitPoint = .center) -> some View {
|
|
73
|
+
_styled {
|
|
74
|
+
$0.extras["rotation"] = .number(angle.degrees)
|
|
75
|
+
$0.extras["rotationAnchor"] = anchor._json
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public func scaleEffect(_ scale: CGFloat, anchor: UnitPoint = .center) -> some View {
|
|
80
|
+
scaleEffect(x: scale, y: scale, anchor: anchor)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public func scaleEffect(_ scale: CGSize, anchor: UnitPoint = .center) -> some View {
|
|
84
|
+
scaleEffect(x: scale.width, y: scale.height, anchor: anchor)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public func scaleEffect(x: CGFloat = 1, y: CGFloat = 1, anchor: UnitPoint = .center) -> some View {
|
|
88
|
+
_styled {
|
|
89
|
+
$0.extras["scale"] = .object(["x": .number(x), "y": .number(y)])
|
|
90
|
+
$0.extras["scaleAnchor"] = anchor._json
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Rotates the view in 3D about `axis` through `anchor`: the `rotation3D`
|
|
95
|
+
/// style hint (angle in degrees; the renderer applies the perspective).
|
|
96
|
+
public func rotation3DEffect(_ angle: Angle, axis: (x: CGFloat, y: CGFloat, z: CGFloat),
|
|
97
|
+
anchor: UnitPoint = .center, anchorZ: CGFloat = 0,
|
|
98
|
+
perspective: CGFloat = 1) -> some View {
|
|
99
|
+
_styled {
|
|
100
|
+
$0.extras["rotation3D"] = .object([
|
|
101
|
+
"angle": .number(angle.degrees),
|
|
102
|
+
"axis": .object(["x": .number(axis.x), "y": .number(axis.y), "z": .number(axis.z)]),
|
|
103
|
+
"anchor": anchor._json,
|
|
104
|
+
"perspective": .number(perspective),
|
|
105
|
+
])
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/// A Gaussian blur of `radius` points (`opaque` is accepted and ignored).
|
|
110
|
+
public func blur(radius: CGFloat, opaque: Bool = false) -> some View {
|
|
111
|
+
_styled { $0.extras["blur"] = .number(radius) }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// `false` makes the subtree ignore pointer events (`hitTesting: false`).
|
|
115
|
+
public func allowsHitTesting(_ enabled: Bool) -> some View {
|
|
116
|
+
_styled { if !enabled { $0.extras["hitTesting"] = .bool(false) } }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Lets the view extend under the safe area on `edges`: the
|
|
120
|
+
/// `ignoresSafeArea` hint, `"all"` or the list of edges. `regions` is accepted
|
|
121
|
+
/// and ignored (the browser has no keyboard safe area).
|
|
122
|
+
public func ignoresSafeArea(_ regions: SafeAreaRegions = .all, edges: Edge.Set = .all) -> some View {
|
|
123
|
+
_styled {
|
|
124
|
+
if edges == .all {
|
|
125
|
+
$0.extras["ignoresSafeArea"] = .string("all")
|
|
126
|
+
} else {
|
|
127
|
+
let names = Edge.allCases.filter { edges.contains(Edge.Set(rawValue: 1 << $0.rawValue)) }.map(\.name)
|
|
128
|
+
$0.extras["ignoresSafeArea"] = .array(names.map(_JSON.string))
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public func shadow(color: Color = Color(white: 0, opacity: 0.33), radius: CGFloat, x: CGFloat = 0, y: CGFloat = 0) -> some View {
|
|
134
|
+
_styled {
|
|
135
|
+
$0.extras["shadow"] = .object([
|
|
136
|
+
"color": color._json, "radius": .number(radius), "x": .number(x), "y": .number(y),
|
|
137
|
+
])
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public func clipped(antialiased: Bool = false) -> some View {
|
|
142
|
+
_styled { $0.extras["clipped"] = .bool(true) }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/// Keeps the view's layout but draws nothing.
|
|
146
|
+
public func hidden() -> some View {
|
|
147
|
+
_styled { $0.extras["hidden"] = .bool(true) }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// Masks the view with a paint: a `Color` or gradient mask becomes the
|
|
151
|
+
/// `mask` style hint (its alpha clips the view). Any other mask view is
|
|
152
|
+
/// not supported and leaves the view unmasked.
|
|
153
|
+
public func mask<Mask: View>(alignment: Alignment = .center, @ViewBuilder _ mask: () -> Mask) -> some View {
|
|
154
|
+
self.mask(mask())
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public func mask<Mask: View>(_ mask: Mask) -> some View {
|
|
158
|
+
_styled {
|
|
159
|
+
if let style = mask as? any ShapeStyle { $0.extras["mask"] = style._json }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// Fixes the view's center at a point in its parent's coordinate space; the
|
|
164
|
+
/// view then fills the proposed space.
|
|
165
|
+
public func position(x: CGFloat, y: CGFloat) -> some View {
|
|
166
|
+
_styled { $0.extras["position"] = .object(["x": .number(x), "y": .number(y)]) }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public func position(_ position: CGPoint) -> some View {
|
|
170
|
+
self.position(x: position.x, y: position.y)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/// The accent color for controls in the subtree (gauges, toggles, buttons).
|
|
174
|
+
public func tint(_ tint: Color?) -> some View {
|
|
175
|
+
_styled { $0.extras["tint"] = tint?._json ?? .null }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/// A style as the tint. The page tints with a color: a gradient tints
|
|
179
|
+
/// with its first color, any other style with the accent color.
|
|
180
|
+
@_disfavoredOverload
|
|
181
|
+
public func tint<S: ShapeStyle>(_ tint: S?) -> some View {
|
|
182
|
+
_styled { $0.extras["tint"] = tint.map { _tintColor(of: $0._json) } ?? .null }
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
public func imageScale(_ scale: Image.Scale) -> some View {
|
|
186
|
+
_styled { $0.extras["imageScale"] = .string(scale.name) }
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// MARK: List rows
|
|
190
|
+
|
|
191
|
+
/// Trailing text in a list row.
|
|
192
|
+
public func badge(_ count: Int) -> some View {
|
|
193
|
+
_styled { $0.extras["badge"] = count == 0 ? .null : .string(String(count)) }
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public func badge(_ key: LocalizedStringKey?) -> some View {
|
|
197
|
+
_styled { $0.extras["badge"] = key.map { .string($0.key) } ?? .null }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
@_disfavoredOverload
|
|
201
|
+
public func badge<S: StringProtocol>(_ label: S?) -> some View {
|
|
202
|
+
_styled { $0.extras["badge"] = label.map { .string(String($0)) } ?? .null }
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public func badge(_ label: Text?) -> some View {
|
|
206
|
+
_styled { $0.extras["badge"] = label.map { .string($0.content) } ?? .null }
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public func listRowInsets(_ insets: EdgeInsets?) -> some View {
|
|
210
|
+
_styled { $0.extras["listRowInsets"] = insets?._json ?? .null }
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// MARK: Accepted without effect (yet)
|
|
214
|
+
|
|
215
|
+
public func listRowBackground<V: View>(_ view: V?) -> some View { self }
|
|
216
|
+
public func listItemTint(_ tint: Color?) -> some View { self }
|
|
217
|
+
public func formStyle<S: FormStyle>(_ style: S) -> some View { self }
|
|
218
|
+
public func headerProminence(_ prominence: Prominence) -> some View { self }
|
|
219
|
+
/// The shape of this container: what a `ContainerRelativeShape`, a
|
|
220
|
+
/// `.background(_:)` and a `.clipShape(.containerRelative)` below take
|
|
221
|
+
/// the corners of (its corner radius; a custom shape's are square).
|
|
222
|
+
public func containerShape<T: Shape>(_ shape: T) -> some View {
|
|
223
|
+
environment(\._containerShapeRadius, shape._cornerRadius)
|
|
224
|
+
}
|
|
225
|
+
public func symbolVariant(_ variant: SymbolVariants) -> some View { self }
|
|
226
|
+
public func symbolRenderingMode(_ mode: SymbolRenderingMode?) -> some View { self }
|
|
227
|
+
public func contentTransition(_ transition: ContentTransition) -> some View { self }
|
|
228
|
+
public func textSelection<S: TextSelectability>(_ selectability: S) -> some View { self }
|
|
229
|
+
public func toolbarRole(_ role: ToolbarRole) -> some View { self }
|
|
230
|
+
public func controlSize(_ size: ControlSize) -> some View { self }
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public enum Prominence: Hashable, Sendable { case standard, increased }
|
|
234
|
+
|
|
235
|
+
/// `.controlSize`: accepted for source compatibility; controls keep one size.
|
|
236
|
+
public enum ControlSize: Hashable, CaseIterable, Sendable { case mini, small, regular, large, extraLarge }
|
|
237
|
+
|
|
238
|
+
public struct SymbolVariants: Hashable, Sendable {
|
|
239
|
+
let name: String
|
|
240
|
+
public static let none = SymbolVariants(name: "none")
|
|
241
|
+
public static let circle = SymbolVariants(name: "circle")
|
|
242
|
+
public static let square = SymbolVariants(name: "square")
|
|
243
|
+
public static let rectangle = SymbolVariants(name: "rectangle")
|
|
244
|
+
public static let fill = SymbolVariants(name: "fill")
|
|
245
|
+
public static let slash = SymbolVariants(name: "slash")
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public enum SymbolRenderingMode: Hashable, Sendable { case monochrome, multicolor, hierarchical, palette }
|
|
249
|
+
|
|
250
|
+
public enum BlendMode: Hashable, Sendable {
|
|
251
|
+
case normal, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight,
|
|
252
|
+
difference, exclusion, hue, saturation, color, luminosity, sourceAtop, destinationOver,
|
|
253
|
+
destinationOut, plusDarker, plusLighter
|
|
254
|
+
|
|
255
|
+
/// The CSS `mix-blend-mode` (the Porter-Duff modes and `plusDarker`,
|
|
256
|
+
/// which CSS has no counterpart for, draw normally).
|
|
257
|
+
var _css: String {
|
|
258
|
+
switch self {
|
|
259
|
+
case .multiply: "multiply"
|
|
260
|
+
case .screen: "screen"
|
|
261
|
+
case .overlay: "overlay"
|
|
262
|
+
case .darken: "darken"
|
|
263
|
+
case .lighten: "lighten"
|
|
264
|
+
case .colorDodge: "color-dodge"
|
|
265
|
+
case .colorBurn: "color-burn"
|
|
266
|
+
case .softLight: "soft-light"
|
|
267
|
+
case .hardLight: "hard-light"
|
|
268
|
+
case .difference: "difference"
|
|
269
|
+
case .exclusion: "exclusion"
|
|
270
|
+
case .hue: "hue"
|
|
271
|
+
case .saturation: "saturation"
|
|
272
|
+
case .color: "color"
|
|
273
|
+
case .luminosity: "luminosity"
|
|
274
|
+
case .plusLighter: "plus-lighter"
|
|
275
|
+
case .normal, .sourceAtop, .destinationOver, .destinationOut, .plusDarker: "normal"
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/// How `drawingGroup` renders (accepted for source compatibility).
|
|
281
|
+
public enum ColorRenderingMode: Hashable, Sendable {
|
|
282
|
+
case nonLinear, linear, extendedLinear
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
nonisolated extension View {
|
|
286
|
+
/// Draws the view in front of its siblings with a lower index (CSS
|
|
287
|
+
/// `z-index`); siblings with the same index draw in order.
|
|
288
|
+
public func zIndex(_ value: Double) -> some View {
|
|
289
|
+
_styled { $0.extras["zIndex"] = .number(value) }
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/// Blends the view with what is behind it (CSS `mix-blend-mode`).
|
|
293
|
+
public func blendMode(_ mode: BlendMode) -> some View {
|
|
294
|
+
_styled { $0.extras["blendMode"] = .string(mode._css) }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// Renders the view offscreen before showing it; the browser composites
|
|
298
|
+
/// it already, so it draws the same.
|
|
299
|
+
public func drawingGroup(opaque: Bool = false, colorMode: ColorRenderingMode = .nonLinear) -> some View { self }
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
public struct SafeAreaRegions: OptionSet, Sendable {
|
|
303
|
+
public let rawValue: UInt
|
|
304
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
305
|
+
public static let container = SafeAreaRegions(rawValue: 1)
|
|
306
|
+
public static let keyboard = SafeAreaRegions(rawValue: 2)
|
|
307
|
+
public static let all: SafeAreaRegions = [.container, .keyboard]
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public struct ContentTransition: Hashable, Sendable {
|
|
311
|
+
let name: String
|
|
312
|
+
public static let identity = ContentTransition(name: "identity")
|
|
313
|
+
public static let opacity = ContentTransition(name: "opacity")
|
|
314
|
+
public static let interpolate = ContentTransition(name: "interpolate")
|
|
315
|
+
public static func numericText(countsDown: Bool = false) -> ContentTransition { ContentTransition(name: "numericText") }
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
public protocol TextSelectability {}
|
|
319
|
+
public struct EnabledTextSelectability: TextSelectability { public init() {} }
|
|
320
|
+
public struct DisabledTextSelectability: TextSelectability { public init() {} }
|
|
321
|
+
extension TextSelectability where Self == EnabledTextSelectability {
|
|
322
|
+
public static var enabled: EnabledTextSelectability { EnabledTextSelectability() }
|
|
323
|
+
}
|
|
324
|
+
extension TextSelectability where Self == DisabledTextSelectability {
|
|
325
|
+
public static var disabled: DisabledTextSelectability { DisabledTextSelectability() }
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
public enum ToolbarRole: Hashable, Sendable { case automatic, navigationStack, browser, editor }
|
|
329
|
+
|
|
330
|
+
// MARK: - Tap gesture
|
|
331
|
+
|
|
332
|
+
/// `.onTapGesture`: a `tapgesture` element whose tap event runs the action.
|
|
333
|
+
struct _TapGestureView<Content: View> {
|
|
334
|
+
let content: Content
|
|
335
|
+
let action: @MainActor (CGPoint) -> Void
|
|
336
|
+
/// The action takes the tap's location: the page sends it (`location`).
|
|
337
|
+
var wantsLocation = false
|
|
338
|
+
|
|
339
|
+
init(content: Content, action: @escaping @MainActor () -> Void) {
|
|
340
|
+
self.content = content
|
|
341
|
+
self.action = { _ in action() }
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
init(content: Content, locatedAction: @escaping @MainActor (CGPoint) -> Void) {
|
|
345
|
+
self.content = content
|
|
346
|
+
self.action = locatedAction
|
|
347
|
+
wantsLocation = true
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
extension _TapGestureView: _PrimitiveView {}
|
|
351
|
+
extension _TapGestureView: _HostView {
|
|
352
|
+
var _kind: String { "tapgesture" }
|
|
353
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
354
|
+
wantsLocation ? .object(["location": .bool(true)]) : .object([:])
|
|
355
|
+
}
|
|
356
|
+
var _content: [any View] { [content] }
|
|
357
|
+
var _handler: ((_JSON) -> Void)? {
|
|
358
|
+
let action = self.action
|
|
359
|
+
return { payload in
|
|
360
|
+
var point = CGPoint.zero
|
|
361
|
+
if case .object(let fields) = payload, case .number(let x)? = fields["x"], case .number(let y)? = fields["y"] {
|
|
362
|
+
point = CGPoint(x: x, y: y)
|
|
363
|
+
}
|
|
364
|
+
MainActor.assumeIsolated { action(point) }
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
nonisolated extension View {
|
|
370
|
+
public func onTapGesture(count: Int = 1, perform action: @escaping @MainActor () -> Void) -> some View {
|
|
371
|
+
_TapGestureView(content: self, action: action)
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/// The color a style tints with: a color as it is, a gradient's first color,
|
|
376
|
+
/// else the accent color.
|
|
377
|
+
func _tintColor(of style: _JSON) -> _JSON {
|
|
378
|
+
guard case .object(let fields) = style else { return .object(["name": .string("accent")]) }
|
|
379
|
+
if fields["r"] != nil || fields["name"] != nil || fields["named"] != nil { return style }
|
|
380
|
+
if let color = fields["colorGradient"] { return color }
|
|
381
|
+
for key in ["linearGradient", "radialGradient", "angularGradient", "ellipticalGradient"] {
|
|
382
|
+
if case .object(let gradient)? = fields[key], case .array(let stops)? = gradient["stops"],
|
|
383
|
+
case .object(let first)? = stops.first, let color = first["color"] {
|
|
384
|
+
return color
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return .object(["name": .string("accent")])
|
|
388
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// `@Entry`: declares an environment value in one line,
|
|
2
|
+
// `extension EnvironmentValues { @Entry var isCompact = false }`. The macro
|
|
3
|
+
// (Sources/SwiftDataMacros/EntryMacro.swift) writes the `EnvironmentKey` and
|
|
4
|
+
// the computed property over it, as Apple's does.
|
|
5
|
+
|
|
6
|
+
@attached(accessor)
|
|
7
|
+
@attached(peer, names: prefixed(__Key_))
|
|
8
|
+
public macro Entry() = #externalMacro(module: "SwiftDataMacros", type: "EntryMacro")
|