@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,409 @@
|
|
|
1
|
+
/// Paints: colors, hierarchical label/fill levels, gradients and materials.
|
|
2
|
+
/// A style serializes to the JSON the renderer resolves (see
|
|
3
|
+
/// docs/ops-protocol.md, "Phase 6 additions"): a `Color`'s own forms, or
|
|
4
|
+
/// `{"hierarchical": 1...4}`, `{"linearGradient": {...}}`,
|
|
5
|
+
/// `{"radialGradient": {...}}`, `{"colorGradient": color}`, `{"material": name}`.
|
|
6
|
+
///
|
|
7
|
+
/// A style of an app's own (iOS 17) implements `resolve(in:)`, returning a
|
|
8
|
+
/// style it is made of; it is encoded as that style, resolved in the page's
|
|
9
|
+
/// environment (its color scheme, Dynamic Type size…): a change of those
|
|
10
|
+
/// renders every view again. An `.environment(_:_:)` of an ancestor is not
|
|
11
|
+
/// seen.
|
|
12
|
+
public protocol ShapeStyle: Sendable {
|
|
13
|
+
associatedtype Resolved: ShapeStyle = Never
|
|
14
|
+
func resolve(in environment: EnvironmentValues) -> Resolved
|
|
15
|
+
var _json: _JSON { get }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
extension ShapeStyle where Resolved == Never {
|
|
19
|
+
public func resolve(in environment: EnvironmentValues) -> Never {
|
|
20
|
+
fatalError("\(Self.self) is a built-in ShapeStyle; it has no resolved style")
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
extension ShapeStyle {
|
|
25
|
+
/// An app's own style: the style it resolves to in the page's environment.
|
|
26
|
+
public var _json: _JSON { resolve(in: EnvironmentValues._page)._json }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
extension Never: ShapeStyle {
|
|
30
|
+
public var _json: _JSON { .null }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
extension EnvironmentValues {
|
|
34
|
+
/// The environment the page sets (the runtime's base), which an app's
|
|
35
|
+
/// own `ShapeStyle` resolves in.
|
|
36
|
+
nonisolated(unsafe) static var _page = EnvironmentValues()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
extension Color: ShapeStyle {}
|
|
40
|
+
|
|
41
|
+
// MARK: - Hierarchical (.primary ... .quaternary)
|
|
42
|
+
|
|
43
|
+
public struct HierarchicalShapeStyle: ShapeStyle, Hashable {
|
|
44
|
+
let level: Int
|
|
45
|
+
|
|
46
|
+
public static let primary = HierarchicalShapeStyle(level: 1)
|
|
47
|
+
public static let secondary = HierarchicalShapeStyle(level: 2)
|
|
48
|
+
public static let tertiary = HierarchicalShapeStyle(level: 3)
|
|
49
|
+
public static let quaternary = HierarchicalShapeStyle(level: 4)
|
|
50
|
+
|
|
51
|
+
public var _json: _JSON { .object(["hierarchical": .number(Double(level))]) }
|
|
52
|
+
|
|
53
|
+
public func opacity(_ opacity: Double) -> AnyShapeStyle {
|
|
54
|
+
AnyShapeStyle(_json: .object(["hierarchical": .number(Double(level)), "opacity": .number(opacity)]))
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
extension ShapeStyle where Self == HierarchicalShapeStyle {
|
|
59
|
+
public static var primary: HierarchicalShapeStyle { .primary }
|
|
60
|
+
public static var secondary: HierarchicalShapeStyle { .secondary }
|
|
61
|
+
public static var tertiary: HierarchicalShapeStyle { .tertiary }
|
|
62
|
+
public static var quaternary: HierarchicalShapeStyle { .quaternary }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// iOS 17's fill style (`.fill`, `.fill.secondary`…): UIKit's system fill
|
|
66
|
+
/// colors, from `systemFill` to `quaternarySystemFill`.
|
|
67
|
+
public struct FillShapeStyle: ShapeStyle, Hashable {
|
|
68
|
+
let level: Int
|
|
69
|
+
|
|
70
|
+
public init() { level = 1 }
|
|
71
|
+
init(level: Int) { self.level = level }
|
|
72
|
+
|
|
73
|
+
public var secondary: FillShapeStyle { FillShapeStyle(level: 2) }
|
|
74
|
+
public var tertiary: FillShapeStyle { FillShapeStyle(level: 3) }
|
|
75
|
+
public var quaternary: FillShapeStyle { FillShapeStyle(level: 4) }
|
|
76
|
+
|
|
77
|
+
public var _json: _JSON {
|
|
78
|
+
let names = ["systemFill", "secondarySystemFill", "tertiarySystemFill", "quaternarySystemFill"]
|
|
79
|
+
return .object(["name": .string(names[max(0, min(3, level - 1))])])
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
extension ShapeStyle where Self == FillShapeStyle {
|
|
84
|
+
public static var fill: FillShapeStyle { FillShapeStyle() }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// The separator color (`.separator`, iOS 17).
|
|
88
|
+
public struct SeparatorShapeStyle: ShapeStyle, Hashable {
|
|
89
|
+
public init() {}
|
|
90
|
+
public var _json: _JSON { .object(["name": .string("separator")]) }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
extension ShapeStyle where Self == SeparatorShapeStyle {
|
|
94
|
+
public static var separator: SeparatorShapeStyle { SeparatorShapeStyle() }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// The view's background color (`.background` as a style).
|
|
98
|
+
public struct BackgroundStyle: ShapeStyle, Hashable {
|
|
99
|
+
public init() {}
|
|
100
|
+
public var _json: _JSON { .object(["name": .string("systemBackground")]) }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
extension ShapeStyle where Self == BackgroundStyle {
|
|
104
|
+
public static var background: BackgroundStyle { BackgroundStyle() }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/// The current foreground color (`.foreground` as a style; `currentColor`).
|
|
108
|
+
public struct ForegroundStyle: ShapeStyle, Hashable {
|
|
109
|
+
public init() {}
|
|
110
|
+
public var _json: _JSON { .object(["name": .string("primary")]) }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
extension ShapeStyle where Self == ForegroundStyle {
|
|
114
|
+
public static var foreground: ForegroundStyle { ForegroundStyle() }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The named colors, reachable as styles (`.fill(.indigo)`, `.background(.red)`).
|
|
118
|
+
extension ShapeStyle where Self == Color {
|
|
119
|
+
public static var red: Color { .red }
|
|
120
|
+
public static var orange: Color { .orange }
|
|
121
|
+
public static var yellow: Color { .yellow }
|
|
122
|
+
public static var green: Color { .green }
|
|
123
|
+
public static var mint: Color { .mint }
|
|
124
|
+
public static var teal: Color { .teal }
|
|
125
|
+
public static var cyan: Color { .cyan }
|
|
126
|
+
public static var blue: Color { .blue }
|
|
127
|
+
public static var indigo: Color { .indigo }
|
|
128
|
+
public static var purple: Color { .purple }
|
|
129
|
+
public static var pink: Color { .pink }
|
|
130
|
+
public static var brown: Color { .brown }
|
|
131
|
+
public static var gray: Color { .gray }
|
|
132
|
+
public static var black: Color { .black }
|
|
133
|
+
public static var white: Color { .white }
|
|
134
|
+
public static var clear: Color { .clear }
|
|
135
|
+
public static var accentColor: Color { .accentColor }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// MARK: - Gradients
|
|
139
|
+
|
|
140
|
+
public struct Gradient: Equatable, Sendable {
|
|
141
|
+
public struct Stop: Equatable, Sendable {
|
|
142
|
+
public var color: Color
|
|
143
|
+
public var location: CGFloat
|
|
144
|
+
|
|
145
|
+
public init(color: Color, location: CGFloat) {
|
|
146
|
+
self.color = color
|
|
147
|
+
self.location = location
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public var stops: [Stop]
|
|
152
|
+
|
|
153
|
+
public init(stops: [Stop]) { self.stops = stops }
|
|
154
|
+
|
|
155
|
+
/// Evenly spaced stops.
|
|
156
|
+
public init(colors: [Color]) {
|
|
157
|
+
let count = max(colors.count - 1, 1)
|
|
158
|
+
stops = colors.enumerated().map { index, color in
|
|
159
|
+
Stop(color: color, location: colors.count == 1 ? 0 : CGFloat(index) / CGFloat(count))
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
var _stopsJSON: _JSON {
|
|
164
|
+
.array(stops.map { .object(["color": $0.color._json, "location": .number($0.location)]) })
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/// A gradient as a style paints from top to bottom, as SwiftUI draws it.
|
|
169
|
+
extension Gradient: ShapeStyle {
|
|
170
|
+
public var _json: _JSON { LinearGradient(gradient: self, startPoint: .top, endPoint: .bottom)._json }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/// `Color.gradient`: a subtle vertical gradient derived from one color.
|
|
174
|
+
public struct AnyGradient: ShapeStyle, Equatable {
|
|
175
|
+
let color: Color
|
|
176
|
+
|
|
177
|
+
public var _json: _JSON { .object(["colorGradient": color._json]) }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
extension Color {
|
|
181
|
+
public var gradient: AnyGradient { AnyGradient(color: self) }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public struct LinearGradient: ShapeStyle, Equatable {
|
|
185
|
+
public var gradient: Gradient
|
|
186
|
+
public var startPoint: UnitPoint
|
|
187
|
+
public var endPoint: UnitPoint
|
|
188
|
+
|
|
189
|
+
public init(gradient: Gradient, startPoint: UnitPoint, endPoint: UnitPoint) {
|
|
190
|
+
self.gradient = gradient
|
|
191
|
+
self.startPoint = startPoint
|
|
192
|
+
self.endPoint = endPoint
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
public init(colors: [Color], startPoint: UnitPoint, endPoint: UnitPoint) {
|
|
196
|
+
self.init(gradient: Gradient(colors: colors), startPoint: startPoint, endPoint: endPoint)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
public init(stops: [Gradient.Stop], startPoint: UnitPoint, endPoint: UnitPoint) {
|
|
200
|
+
self.init(gradient: Gradient(stops: stops), startPoint: startPoint, endPoint: endPoint)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public var _json: _JSON {
|
|
204
|
+
.object(["linearGradient": .object([
|
|
205
|
+
"stops": gradient._stopsJSON,
|
|
206
|
+
"start": startPoint._json,
|
|
207
|
+
"end": endPoint._json,
|
|
208
|
+
])])
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public struct RadialGradient: ShapeStyle, Equatable {
|
|
213
|
+
public var gradient: Gradient
|
|
214
|
+
public var center: UnitPoint
|
|
215
|
+
public var startRadius: CGFloat
|
|
216
|
+
public var endRadius: CGFloat
|
|
217
|
+
|
|
218
|
+
public init(gradient: Gradient, center: UnitPoint, startRadius: CGFloat, endRadius: CGFloat) {
|
|
219
|
+
self.gradient = gradient
|
|
220
|
+
self.center = center
|
|
221
|
+
self.startRadius = startRadius
|
|
222
|
+
self.endRadius = endRadius
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
public init(colors: [Color], center: UnitPoint, startRadius: CGFloat, endRadius: CGFloat) {
|
|
226
|
+
self.init(gradient: Gradient(colors: colors), center: center, startRadius: startRadius, endRadius: endRadius)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
public init(stops: [Gradient.Stop], center: UnitPoint, startRadius: CGFloat, endRadius: CGFloat) {
|
|
230
|
+
self.init(gradient: Gradient(stops: stops), center: center, startRadius: startRadius, endRadius: endRadius)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public var _json: _JSON {
|
|
234
|
+
.object(["radialGradient": .object([
|
|
235
|
+
"stops": gradient._stopsJSON,
|
|
236
|
+
"center": center._json,
|
|
237
|
+
"startRadius": .number(startRadius),
|
|
238
|
+
"endRadius": .number(endRadius),
|
|
239
|
+
])])
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
extension ShapeStyle where Self == LinearGradient {
|
|
244
|
+
public static func linearGradient(_ gradient: Gradient, startPoint: UnitPoint, endPoint: UnitPoint) -> LinearGradient {
|
|
245
|
+
LinearGradient(gradient: gradient, startPoint: startPoint, endPoint: endPoint)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public static func linearGradient(colors: [Color], startPoint: UnitPoint, endPoint: UnitPoint) -> LinearGradient {
|
|
249
|
+
LinearGradient(colors: colors, startPoint: startPoint, endPoint: endPoint)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public static func linearGradient(stops: [Gradient.Stop], startPoint: UnitPoint, endPoint: UnitPoint) -> LinearGradient {
|
|
253
|
+
LinearGradient(stops: stops, startPoint: startPoint, endPoint: endPoint)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
extension ShapeStyle where Self == RadialGradient {
|
|
258
|
+
public static func radialGradient(_ gradient: Gradient, center: UnitPoint, startRadius: CGFloat,
|
|
259
|
+
endRadius: CGFloat) -> RadialGradient {
|
|
260
|
+
RadialGradient(gradient: gradient, center: center, startRadius: startRadius, endRadius: endRadius)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public static func radialGradient(colors: [Color], center: UnitPoint, startRadius: CGFloat,
|
|
264
|
+
endRadius: CGFloat) -> RadialGradient {
|
|
265
|
+
RadialGradient(colors: colors, center: center, startRadius: startRadius, endRadius: endRadius)
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
extension UnitPoint {
|
|
270
|
+
var _json: _JSON { .object(["x": .number(x), "y": .number(y)]) }
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Gradients as views: a rectangle filled with the gradient (a `shape` element).
|
|
274
|
+
private func _gradientViewProps(_ style: some ShapeStyle) -> _JSON {
|
|
275
|
+
.object([
|
|
276
|
+
"shape": .string("rectangle"),
|
|
277
|
+
"cornerRadius": .number(0),
|
|
278
|
+
"fill": style._json,
|
|
279
|
+
"stroke": .null,
|
|
280
|
+
])
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
extension LinearGradient: _PrimitiveView {}
|
|
284
|
+
extension LinearGradient: _HostView {
|
|
285
|
+
var _kind: String { "shape" }
|
|
286
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _gradientViewProps(self) }
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
extension RadialGradient: _PrimitiveView {}
|
|
290
|
+
extension RadialGradient: _HostView {
|
|
291
|
+
var _kind: String { "shape" }
|
|
292
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _gradientViewProps(self) }
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
extension AnyGradient: _PrimitiveView {}
|
|
296
|
+
extension AnyGradient: _HostView {
|
|
297
|
+
var _kind: String { "shape" }
|
|
298
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _gradientViewProps(self) }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// MARK: - Shadows
|
|
302
|
+
|
|
303
|
+
/// A shadow a style can carry (`.shadow(.drop(...))`). A drop shadow is the
|
|
304
|
+
/// style's `shadow` key, which a shape filled with the style draws (a CSS
|
|
305
|
+
/// `drop-shadow`); an inner shadow, and a shadow on text, are not drawn.
|
|
306
|
+
public struct ShadowStyle: Equatable, Sendable {
|
|
307
|
+
public enum Kind: Equatable, Sendable { case drop, inner }
|
|
308
|
+
|
|
309
|
+
public let kind: Kind
|
|
310
|
+
public let color: Color
|
|
311
|
+
public let radius: CGFloat
|
|
312
|
+
public let x: CGFloat
|
|
313
|
+
public let y: CGFloat
|
|
314
|
+
|
|
315
|
+
public static func drop(color: Color = Color(white: 0, opacity: 0.33), radius: CGFloat,
|
|
316
|
+
x: CGFloat = 0, y: CGFloat = 0) -> ShadowStyle {
|
|
317
|
+
ShadowStyle(kind: .drop, color: color, radius: radius, x: x, y: y)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
public static func inner(color: Color = Color(white: 0, opacity: 0.55), radius: CGFloat,
|
|
321
|
+
x: CGFloat = 0, y: CGFloat = 0) -> ShadowStyle {
|
|
322
|
+
ShadowStyle(kind: .inner, color: color, radius: radius, x: x, y: y)
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
extension ShapeStyle {
|
|
327
|
+
/// The style with a shadow (see `ShadowStyle`).
|
|
328
|
+
public func shadow(_ style: ShadowStyle) -> AnyShapeStyle {
|
|
329
|
+
guard style.kind == .drop, case .object(var object) = _json else { return AnyShapeStyle(_json: _json) }
|
|
330
|
+
object["shadow"] = .object([
|
|
331
|
+
"color": style.color._json, "radius": .number(style.radius), "x": .number(style.x), "y": .number(style.y),
|
|
332
|
+
])
|
|
333
|
+
return AnyShapeStyle(_json: .object(object))
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
extension ShapeStyle where Self == AnyShapeStyle {
|
|
338
|
+
/// The foreground style with a shadow: a shape filled with it under a
|
|
339
|
+
/// view casts the view's shadow (`.background(.shadow(.drop(…)), in: shape)`).
|
|
340
|
+
public static func shadow(_ style: ShadowStyle) -> AnyShapeStyle {
|
|
341
|
+
ForegroundStyle().shadow(style)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// MARK: - Materials
|
|
346
|
+
|
|
347
|
+
public struct Material: ShapeStyle, Hashable {
|
|
348
|
+
let name: String
|
|
349
|
+
|
|
350
|
+
public static let ultraThinMaterial = Material(name: "ultraThin")
|
|
351
|
+
public static let thinMaterial = Material(name: "thin")
|
|
352
|
+
public static let regularMaterial = Material(name: "regular")
|
|
353
|
+
public static let thickMaterial = Material(name: "thick")
|
|
354
|
+
public static let ultraThickMaterial = Material(name: "ultraThick")
|
|
355
|
+
public static let bar = Material(name: "regular")
|
|
356
|
+
public static let ultraThin = Material(name: "ultraThin")
|
|
357
|
+
public static let thin = Material(name: "thin")
|
|
358
|
+
public static let regular = Material(name: "regular")
|
|
359
|
+
public static let thick = Material(name: "thick")
|
|
360
|
+
public static let ultraThick = Material(name: "ultraThick")
|
|
361
|
+
|
|
362
|
+
public var _json: _JSON { .object(["material": .string(name)]) }
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
extension ShapeStyle where Self == Material {
|
|
366
|
+
public static var ultraThinMaterial: Material { .ultraThinMaterial }
|
|
367
|
+
public static var thinMaterial: Material { .thinMaterial }
|
|
368
|
+
public static var regularMaterial: Material { .regularMaterial }
|
|
369
|
+
public static var thickMaterial: Material { .thickMaterial }
|
|
370
|
+
public static var ultraThickMaterial: Material { .ultraThickMaterial }
|
|
371
|
+
public static var bar: Material { .bar }
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// MARK: - Type erasure
|
|
375
|
+
|
|
376
|
+
public struct AnyShapeStyle: ShapeStyle {
|
|
377
|
+
public let _json: _JSON
|
|
378
|
+
|
|
379
|
+
public init<S: ShapeStyle>(_ style: S) { _json = style._json }
|
|
380
|
+
|
|
381
|
+
init(_json: _JSON) { self._json = _json }
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/// The lower levels of any style (iOS 17): the style at the opacities of
|
|
385
|
+
/// the secondary, tertiary and quaternary label colors.
|
|
386
|
+
extension ShapeStyle {
|
|
387
|
+
public var secondary: AnyShapeStyle { opacity(0.6) }
|
|
388
|
+
public var tertiary: AnyShapeStyle { opacity(0.3) }
|
|
389
|
+
public var quaternary: AnyShapeStyle { opacity(0.18) }
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
extension ShapeStyle {
|
|
393
|
+
/// The style blended with what is behind it. The page paints the style
|
|
394
|
+
/// as it is (a blend mode is the view's, `View.blendMode(_:)`).
|
|
395
|
+
public func blendMode(_ mode: BlendMode) -> AnyShapeStyle { AnyShapeStyle(self) }
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/// Opacity on any style: wraps the style's JSON with an `opacity` multiplier.
|
|
399
|
+
extension ShapeStyle {
|
|
400
|
+
public func opacity(_ opacity: Double) -> AnyShapeStyle {
|
|
401
|
+
if let color = self as? Color { return AnyShapeStyle(color.opacity(opacity)) }
|
|
402
|
+
if case .object(var fields) = _json {
|
|
403
|
+
let existing: Double = if case .number(let n)? = fields["opacity"] { n } else { 1 }
|
|
404
|
+
fields["opacity"] = .number(existing * opacity)
|
|
405
|
+
return AnyShapeStyle(_json: .object(fields))
|
|
406
|
+
}
|
|
407
|
+
return AnyShapeStyle(_json: _json)
|
|
408
|
+
}
|
|
409
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/// `Shape.trim(from:to:)` and strokes with a `StrokeStyle`.
|
|
2
|
+
///
|
|
3
|
+
/// A trimmed shape keeps the part of its outline between two fractions of
|
|
4
|
+
/// its path. The `shape` element carries `"trim": {"from": a, "to": b}` and the
|
|
5
|
+
/// page masks the shape's box with a conic gradient around its center, from
|
|
6
|
+
/// the 3 o'clock position clockwise, where SwiftUI's circle path starts. For a
|
|
7
|
+
/// circle (a progress ring) that is the exact trim; for other shapes it keeps
|
|
8
|
+
/// the same angles, not the same length of outline (an approximation). An
|
|
9
|
+
/// untrimmed shape's props are unchanged.
|
|
10
|
+
///
|
|
11
|
+
/// `stroke(_:style:)` draws `lineWidth` like `stroke(_:lineWidth:)`. A
|
|
12
|
+
/// built-in shape's stroke is a CSS border, so its caps, joins and dashes
|
|
13
|
+
/// are not drawn; a custom shape's path is stroked with all of them.
|
|
14
|
+
|
|
15
|
+
/// A shape with a trim: what `_ShapeView` reads to send `trim`.
|
|
16
|
+
protocol _TrimmedShape {
|
|
17
|
+
var _trimFrom: CGFloat { get }
|
|
18
|
+
var _trimTo: CGFloat { get }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// `shape.trim(from:to:)`: the part of the shape's outline between the fractions.
|
|
22
|
+
nonisolated public struct _TrimmedShapeView<Base: Shape>: Shape, _TrimmedShape {
|
|
23
|
+
public let base: Base
|
|
24
|
+
let from: CGFloat
|
|
25
|
+
let to: CGFloat
|
|
26
|
+
|
|
27
|
+
public var _name: String { base._name }
|
|
28
|
+
public var _cornerRadius: CGFloat { base._cornerRadius }
|
|
29
|
+
public func path(in rect: CGRect) -> Path { base.path(in: rect).trimmedPath(from: from, to: to) }
|
|
30
|
+
var _trimFrom: CGFloat { from }
|
|
31
|
+
var _trimTo: CGFloat { to }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
extension _TrimmedShapeView: View {
|
|
35
|
+
public typealias Body = Never
|
|
36
|
+
public var body: Never { fatalError("A trimmed shape is a primitive view") }
|
|
37
|
+
}
|
|
38
|
+
extension _TrimmedShapeView: _PrimitiveView {}
|
|
39
|
+
extension _TrimmedShapeView: _HostView {
|
|
40
|
+
var _kind: String { "shape" }
|
|
41
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
42
|
+
// As a bare shape: filled with the foreground (`fill: null`, no stroke).
|
|
43
|
+
_ShapeView(shape: self, fill: nil, stroke: nil)._props(in: environment)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
nonisolated extension Shape {
|
|
48
|
+
/// The part of the outline between `startFraction` and `endFraction` (0…1).
|
|
49
|
+
public func trim(from startFraction: CGFloat = 0, to endFraction: CGFloat = 1) -> _TrimmedShapeView<Self> {
|
|
50
|
+
_TrimmedShapeView(base: self, from: max(0, min(1, startFraction)), to: max(0, min(1, endFraction)))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// The outline in `content`, `style.lineWidth` wide (a custom shape's
|
|
54
|
+
/// caps, joins and dashes are drawn; a built-in shape's are not).
|
|
55
|
+
public func stroke<S: ShapeStyle>(_ content: S, style: StrokeStyle, antialiased: Bool = true) -> some View {
|
|
56
|
+
_ShapeView(shape: self, fill: nil, stroke: (content, style.lineWidth, false), strokeStyle: style)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// The outline in the foreground style, `style.lineWidth` wide.
|
|
60
|
+
public func stroke(style: StrokeStyle) -> some View {
|
|
61
|
+
_ShapeView(shape: self, fill: nil, stroke: (ForegroundStyle(), style.lineWidth, false), strokeStyle: style)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// The outline inside the shape's bounds, `style.lineWidth` wide.
|
|
65
|
+
public func strokeBorder<S: ShapeStyle>(_ content: S, style: StrokeStyle, antialiased: Bool = true) -> some View {
|
|
66
|
+
_ShapeView(shape: self, fill: nil, stroke: (content, style.lineWidth, true), strokeStyle: style)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// The outline inside the shape's bounds in the foreground style.
|
|
70
|
+
public func strokeBorder(style: StrokeStyle, antialiased: Bool = true) -> some View {
|
|
71
|
+
_ShapeView(shape: self, fill: nil, stroke: (ForegroundStyle(), style.lineWidth, true), strokeStyle: style)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
extension _TrimmedShape {
|
|
76
|
+
/// The `trim` prop.
|
|
77
|
+
var _trimJSON: _JSON { .object(["from": .number(_trimFrom), "to": .number(_trimTo)]) }
|
|
78
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
// `ShareLink`: a button that asks the page to share its items. The page uses
|
|
4
|
+
// the Web Share API (`navigator.share`) and, where the browser has none or
|
|
5
|
+
// refuses, downloads them instead: an image item as its file, text and links
|
|
6
|
+
// as a `.txt` (docs/ops-protocol.md, "Sharing"). The request is a `share`
|
|
7
|
+
// host request; its answer is ignored, as SwiftUI gives the app no result.
|
|
8
|
+
|
|
9
|
+
// `Transferable` is CoreTransferable's, which SwiftUI re-exports
|
|
10
|
+
// (Transfer.swift): `String` and `URL` items are shared as text and links,
|
|
11
|
+
// asset-catalog and `UIImage` `Image`s as files, and any other item as the
|
|
12
|
+
// bytes or the file its first exporting representation gives (a symbol
|
|
13
|
+
// image has no file to share).
|
|
14
|
+
|
|
15
|
+
/// The title (and image) a share sheet shows for the shared item.
|
|
16
|
+
public struct SharePreview<Image: Transferable, Icon: Transferable> {
|
|
17
|
+
let title: String
|
|
18
|
+
let image: Image?
|
|
19
|
+
let icon: Icon?
|
|
20
|
+
|
|
21
|
+
@_disfavoredOverload
|
|
22
|
+
public init<S: StringProtocol>(_ title: S, image: Image, icon: Icon) {
|
|
23
|
+
self.title = String(title); self.image = image; self.icon = icon
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public init(_ titleKey: LocalizedStringKey, image: Image, icon: Icon) {
|
|
27
|
+
self.init(titleKey.key, image: image, icon: icon)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
extension SharePreview where Image == Never, Icon == Never {
|
|
32
|
+
@_disfavoredOverload
|
|
33
|
+
public init<S: StringProtocol>(_ title: S) { self.title = String(title); self.image = nil; self.icon = nil }
|
|
34
|
+
public init(_ titleKey: LocalizedStringKey) { self.init(titleKey.key) }
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
extension SharePreview where Icon == Never {
|
|
38
|
+
@_disfavoredOverload
|
|
39
|
+
public init<S: StringProtocol>(_ title: S, image: Image) { self.title = String(title); self.image = image; self.icon = nil }
|
|
40
|
+
public init(_ titleKey: LocalizedStringKey, image: Image) { self.init(titleKey.key, image: image) }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
extension SharePreview where Image == Never {
|
|
44
|
+
@_disfavoredOverload
|
|
45
|
+
public init<S: StringProtocol>(_ title: S, icon: Icon) { self.title = String(title); self.image = nil; self.icon = icon }
|
|
46
|
+
public init(_ titleKey: LocalizedStringKey, icon: Icon) { self.init(titleKey.key, icon: icon) }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// The label of a `ShareLink` without one of its own.
|
|
50
|
+
public struct DefaultShareLinkLabel: View {
|
|
51
|
+
let title: String
|
|
52
|
+
public var body: some View {
|
|
53
|
+
Label(title, systemImage: "square.and.arrow.up")
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public struct ShareLink<Data: RandomAccessCollection, PreviewImage: Transferable, PreviewIcon: Transferable, Label: View>: View
|
|
58
|
+
where Data.Element: Transferable {
|
|
59
|
+
let items: Data
|
|
60
|
+
let subject: Text?
|
|
61
|
+
let message: Text?
|
|
62
|
+
let previewTitle: String?
|
|
63
|
+
let label: Label
|
|
64
|
+
|
|
65
|
+
init(items: Data, subject: Text?, message: Text?, previewTitle: String?, label: Label) {
|
|
66
|
+
self.items = items
|
|
67
|
+
self.subject = subject
|
|
68
|
+
self.message = message
|
|
69
|
+
self.previewTitle = previewTitle
|
|
70
|
+
self.label = label
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public var body: some View {
|
|
74
|
+
let params = sharePayload
|
|
75
|
+
let sources = bitmapSources
|
|
76
|
+
let others = _UncheckedSendableBox(transferItems)
|
|
77
|
+
let title = subject?.content ?? previewTitle
|
|
78
|
+
return Button {
|
|
79
|
+
for source in sources { _Runtime.shared._sendImageSource(source) }
|
|
80
|
+
Task { @MainActor in
|
|
81
|
+
// Other `Transferable` items export first (Transfer.swift);
|
|
82
|
+
// without them the request leaves within the tap.
|
|
83
|
+
let params = others.value.isEmpty ? params : await _ShareExport.payload(params, adding: others.value, title: title)
|
|
84
|
+
_ = try? await _Runtime.shared._hostRequest(kind: "share", params: params)
|
|
85
|
+
}
|
|
86
|
+
} label: {
|
|
87
|
+
label
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// The sources of the bitmap (`UIImage`) items, which the page needs
|
|
92
|
+
/// before it can draw them into files.
|
|
93
|
+
var bitmapSources: [_ImageSource] {
|
|
94
|
+
items.compactMap { item in
|
|
95
|
+
guard let image = item as? Image, case .bitmap(let recipe, _, _) = image.source else { return nil }
|
|
96
|
+
return recipe.source
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// The items that are not a `String`, a `URL` or an `Image`: they share
|
|
101
|
+
/// what their representations export (`_ShareExport`).
|
|
102
|
+
var transferItems: [any Transferable] {
|
|
103
|
+
items.compactMap { item in item is String || item is URL || item is Image ? nil : item }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// `{title, text, url, images, bitmaps}`: the Web Share API's fields,
|
|
107
|
+
/// images as asset-catalog names the page resolves to their files,
|
|
108
|
+
/// bitmaps (`Image(uiImage:)`) as recipes the page draws into PNG files.
|
|
109
|
+
var sharePayload: _JSON {
|
|
110
|
+
var texts: [String] = []
|
|
111
|
+
var url: String?
|
|
112
|
+
var images: [_JSON] = []
|
|
113
|
+
var bitmaps: [_JSON] = []
|
|
114
|
+
if let message { texts.append(message.content) }
|
|
115
|
+
for item in items {
|
|
116
|
+
switch item {
|
|
117
|
+
case let string as String: texts.append(string)
|
|
118
|
+
case let link as URL: if url == nil { url = link.absoluteString } else { texts.append(link.absoluteString) }
|
|
119
|
+
case let image as Image:
|
|
120
|
+
if case .named(let name) = image.source { images.append(.string(name)) }
|
|
121
|
+
else if case .url(let link, _, _) = image.source, url == nil { url = link }
|
|
122
|
+
else if case .bitmap(let recipe, _, _) = image.source, recipe.source != nil { bitmaps.append(recipe.json) }
|
|
123
|
+
default: break
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
var fields: [String: _JSON] = [:]
|
|
127
|
+
if let title = subject?.content ?? previewTitle { fields["title"] = .string(title) }
|
|
128
|
+
if !texts.isEmpty { fields["text"] = .string(texts.joined(separator: "\n")) }
|
|
129
|
+
if let url { fields["url"] = .string(url) }
|
|
130
|
+
if !images.isEmpty { fields["images"] = .array(images) }
|
|
131
|
+
if !bitmaps.isEmpty { fields["bitmaps"] = .array(bitmaps) }
|
|
132
|
+
return .object(fields)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// MARK: One item
|
|
137
|
+
|
|
138
|
+
extension ShareLink {
|
|
139
|
+
public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil, @ViewBuilder label: () -> Label)
|
|
140
|
+
where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
|
|
141
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: label())
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil,
|
|
145
|
+
preview: SharePreview<PreviewImage, PreviewIcon>, @ViewBuilder label: () -> Label)
|
|
146
|
+
where Data == CollectionOfOne<Item> {
|
|
147
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: preview.title, label: label())
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
extension ShareLink where Label == DefaultShareLinkLabel {
|
|
152
|
+
public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil)
|
|
153
|
+
where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
|
|
154
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: "Share"))
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public init<Item: Transferable>(item: Item, subject: Text? = nil, message: Text? = nil,
|
|
158
|
+
preview: SharePreview<PreviewImage, PreviewIcon>)
|
|
159
|
+
where Data == CollectionOfOne<Item> {
|
|
160
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: preview.title, label: DefaultShareLinkLabel(title: "Share"))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public init<Item: Transferable>(_ titleKey: LocalizedStringKey, item: Item, subject: Text? = nil, message: Text? = nil)
|
|
164
|
+
where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
|
|
165
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: titleKey.key))
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@_disfavoredOverload
|
|
169
|
+
public init<S: StringProtocol, Item: Transferable>(_ title: S, item: Item, subject: Text? = nil, message: Text? = nil)
|
|
170
|
+
where Data == CollectionOfOne<Item>, PreviewImage == Never, PreviewIcon == Never {
|
|
171
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: String(title)))
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public init<Item: Transferable>(_ titleKey: LocalizedStringKey, item: Item, subject: Text? = nil, message: Text? = nil,
|
|
175
|
+
preview: SharePreview<PreviewImage, PreviewIcon>)
|
|
176
|
+
where Data == CollectionOfOne<Item> {
|
|
177
|
+
self.init(items: CollectionOfOne(item), subject: subject, message: message, previewTitle: preview.title, label: DefaultShareLinkLabel(title: titleKey.key))
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// MARK: Several items
|
|
182
|
+
|
|
183
|
+
extension ShareLink where PreviewImage == Never, PreviewIcon == Never {
|
|
184
|
+
public init(items: Data, subject: Text? = nil, message: Text? = nil, @ViewBuilder label: () -> Label) {
|
|
185
|
+
self.init(items: items, subject: subject, message: message, previewTitle: nil, label: label())
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
extension ShareLink where PreviewImage == Never, PreviewIcon == Never, Label == DefaultShareLinkLabel {
|
|
190
|
+
public init(items: Data, subject: Text? = nil, message: Text? = nil) {
|
|
191
|
+
self.init(items: items, subject: subject, message: message, previewTitle: nil, label: DefaultShareLinkLabel(title: "Share"))
|
|
192
|
+
}
|
|
193
|
+
}
|