@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
|
+
// TimelineView: content re-rendered on a schedule. The shim has no Foundation
|
|
2
|
+
// `Date`, so the context carries `_TimelineDate` (seconds since 1970); Apple
|
|
3
|
+
// code reading `context.date.timeIntervalSince1970` compiles unchanged. Ticks
|
|
4
|
+
// run on the host-driven executor like `.task` does and stop when the view
|
|
5
|
+
// leaves the tree. See docs/ops-protocol.md (Phase 6).
|
|
6
|
+
|
|
7
|
+
#if canImport(WASILibc)
|
|
8
|
+
import WASILibc
|
|
9
|
+
#elseif canImport(Glibc)
|
|
10
|
+
import Glibc
|
|
11
|
+
#elseif canImport(Musl)
|
|
12
|
+
import Musl
|
|
13
|
+
#elseif canImport(Darwin)
|
|
14
|
+
import Darwin
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
// MARK: - Dates
|
|
18
|
+
|
|
19
|
+
/// A point in time, as seconds since 1970. Stands in for Foundation's `Date`.
|
|
20
|
+
public struct _TimelineDate: Hashable, Comparable, Sendable {
|
|
21
|
+
public var timeIntervalSince1970: Double
|
|
22
|
+
|
|
23
|
+
public init(timeIntervalSince1970: Double) {
|
|
24
|
+
self.timeIntervalSince1970 = timeIntervalSince1970
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// The current time (the wall clock; fixed in headless snapshots).
|
|
28
|
+
public static var now: _TimelineDate { _TimelineDate(timeIntervalSince1970: _timelineNow()) }
|
|
29
|
+
|
|
30
|
+
public func timeIntervalSince(_ other: _TimelineDate) -> Double {
|
|
31
|
+
timeIntervalSince1970 - other.timeIntervalSince1970
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public func addingTimeInterval(_ interval: Double) -> _TimelineDate {
|
|
35
|
+
_TimelineDate(timeIntervalSince1970: timeIntervalSince1970 + interval)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static func < (lhs: _TimelineDate, rhs: _TimelineDate) -> Bool {
|
|
39
|
+
lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Seconds since 1970 from the platform clock.
|
|
44
|
+
func _wallClockSeconds() -> Double {
|
|
45
|
+
var tv = timeval()
|
|
46
|
+
gettimeofday(&tv, nil)
|
|
47
|
+
return Double(tv.tv_sec) + Double(tv.tv_usec) / 1_000_000
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// How `TimelineView` reads the time and waits between ticks. Headless
|
|
51
|
+
/// snapshot runs (`SB_HEADLESS`) derive the time from the executor's virtual
|
|
52
|
+
/// clock so output is byte-stable; tests swap both for a virtual clock.
|
|
53
|
+
/// Wasm is single-threaded and tests set these from the main actor.
|
|
54
|
+
enum _TimelineClock {
|
|
55
|
+
nonisolated(unsafe) static let headless = _environment("SB_HEADLESS") == "1"
|
|
56
|
+
|
|
57
|
+
nonisolated(unsafe) static var now: () -> Double = {
|
|
58
|
+
headless ? 1_700_000_000 + Double(_HostExecutor.shared.nowNs) / 1e9 : _wallClockSeconds()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
nonisolated(unsafe) static var sleep: (Double) async -> Void = { seconds in
|
|
62
|
+
try? await Task.sleep(for: .seconds(seconds))
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
func _timelineNow() -> Double { _TimelineClock.now() }
|
|
67
|
+
|
|
68
|
+
// MARK: - Schedules
|
|
69
|
+
|
|
70
|
+
/// The mode a schedule produces entries for. Accepted for source compatibility.
|
|
71
|
+
public enum TimelineScheduleMode: Hashable, Sendable {
|
|
72
|
+
case normal, lowFrequency
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// A schedule of times at which a `TimelineView` updates. The shim's schedules
|
|
76
|
+
/// are periodic: an interval in seconds and a paused flag. A custom
|
|
77
|
+
/// conformance that does not adopt the shim's `_TimelineScheduling` ticks once
|
|
78
|
+
/// per second.
|
|
79
|
+
public protocol TimelineSchedule {}
|
|
80
|
+
|
|
81
|
+
/// What the runtime reads from a schedule.
|
|
82
|
+
protocol _TimelineScheduling {
|
|
83
|
+
/// Seconds between ticks.
|
|
84
|
+
var _interval: Double { get }
|
|
85
|
+
var _paused: Bool { get }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// Updates as often as animation needs. The default minimum interval is 1/20 s:
|
|
89
|
+
/// every tick is a round trip through the browser renderer, so 60 fps costs
|
|
90
|
+
/// too much; pass `minimumInterval` to go faster or slower.
|
|
91
|
+
public struct AnimationTimelineSchedule: TimelineSchedule, _TimelineScheduling, Sendable {
|
|
92
|
+
public var minimumInterval: Double?
|
|
93
|
+
public var paused: Bool
|
|
94
|
+
|
|
95
|
+
public init(minimumInterval: Double? = nil, paused: Bool = false) {
|
|
96
|
+
self.minimumInterval = minimumInterval
|
|
97
|
+
self.paused = paused
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
var _interval: Double { max(minimumInterval ?? 0.05, 1.0 / 60) }
|
|
101
|
+
var _paused: Bool { paused }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// Updates every `interval` seconds, starting at `startDate`.
|
|
105
|
+
public struct PeriodicTimelineSchedule: TimelineSchedule, _TimelineScheduling, Sendable {
|
|
106
|
+
public var startDate: _TimelineDate
|
|
107
|
+
public var interval: Double
|
|
108
|
+
|
|
109
|
+
public init(from startDate: _TimelineDate, by interval: Double) {
|
|
110
|
+
self.startDate = startDate
|
|
111
|
+
self.interval = interval
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
var _interval: Double { max(interval, 1.0 / 60) }
|
|
115
|
+
var _paused: Bool { false }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// Updates at the start of every minute (every 60 seconds here).
|
|
119
|
+
public struct EveryMinuteTimelineSchedule: TimelineSchedule, _TimelineScheduling, Sendable {
|
|
120
|
+
public init() {}
|
|
121
|
+
var _interval: Double { 60 }
|
|
122
|
+
var _paused: Bool { false }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
extension TimelineSchedule where Self == AnimationTimelineSchedule {
|
|
126
|
+
public static var animation: AnimationTimelineSchedule { AnimationTimelineSchedule() }
|
|
127
|
+
public static func animation(minimumInterval: Double? = nil, paused: Bool = false) -> AnimationTimelineSchedule {
|
|
128
|
+
AnimationTimelineSchedule(minimumInterval: minimumInterval, paused: paused)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
extension TimelineSchedule where Self == PeriodicTimelineSchedule {
|
|
133
|
+
public static func periodic(from startDate: _TimelineDate, by interval: Double) -> PeriodicTimelineSchedule {
|
|
134
|
+
PeriodicTimelineSchedule(from: startDate, by: interval)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
extension TimelineSchedule where Self == EveryMinuteTimelineSchedule {
|
|
139
|
+
public static var everyMinute: EveryMinuteTimelineSchedule { EveryMinuteTimelineSchedule() }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// MARK: - TimelineView
|
|
143
|
+
|
|
144
|
+
/// What a `TimelineView` passes to its content on every tick.
|
|
145
|
+
public struct TimelineViewDefaultContext {
|
|
146
|
+
/// The rate the view updates at.
|
|
147
|
+
public enum Cadence: Hashable, Sendable, Comparable {
|
|
148
|
+
case live, seconds, minutes
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public var date: _TimelineDate
|
|
152
|
+
public var cadence: Cadence
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Identity of a tick loop: when the schedule changes, the loop restarts.
|
|
156
|
+
struct _TimelineTaskID: Hashable {
|
|
157
|
+
var interval: Double
|
|
158
|
+
var paused: Bool
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// A view whose content updates on a schedule. Renders as a plain group with
|
|
162
|
+
/// a single child, `content(context)`.
|
|
163
|
+
public struct TimelineView<Schedule: TimelineSchedule, Content: View> {
|
|
164
|
+
public typealias Context = TimelineViewDefaultContext
|
|
165
|
+
|
|
166
|
+
let schedule: Schedule
|
|
167
|
+
let content: (Context) -> Content
|
|
168
|
+
/// The time of the last tick; `nil` before the first.
|
|
169
|
+
@State var tick: Double? = nil
|
|
170
|
+
|
|
171
|
+
public init(_ schedule: Schedule, @ViewBuilder content: @escaping (Context) -> Content) {
|
|
172
|
+
self.schedule = schedule
|
|
173
|
+
self.content = content
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
var interval: Double { (schedule as? any _TimelineScheduling)?._interval ?? 1 }
|
|
177
|
+
var paused: Bool { (schedule as? any _TimelineScheduling)?._paused ?? false }
|
|
178
|
+
|
|
179
|
+
var cadence: Context.Cadence {
|
|
180
|
+
interval >= 60 ? .minutes : interval >= 1 ? .seconds : .live
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
extension TimelineView: _PrimitiveView {}
|
|
184
|
+
extension TimelineView: _GroupView {
|
|
185
|
+
var _children: [any View] {
|
|
186
|
+
let date = _TimelineDate(timeIntervalSince1970: tick ?? _timelineNow())
|
|
187
|
+
return [content(Context(date: date, cadence: cadence))]
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
extension TimelineView: _TaskStarting {
|
|
191
|
+
var _taskID: AnyHashable? { AnyHashable(_TimelineTaskID(interval: interval, paused: paused)) }
|
|
192
|
+
|
|
193
|
+
var _taskAction: @Sendable () async -> Void {
|
|
194
|
+
guard !paused else { return {} }
|
|
195
|
+
let interval = self.interval
|
|
196
|
+
// The box is only touched on the main actor; the closure is built
|
|
197
|
+
// outside it, so the capture is marked as such.
|
|
198
|
+
let box = _TickBox(_tick.box)
|
|
199
|
+
return { @MainActor in
|
|
200
|
+
while !Task.isCancelled {
|
|
201
|
+
await _TimelineClock.sleep(interval)
|
|
202
|
+
if Task.isCancelled { return }
|
|
203
|
+
box.box.value = _timelineNow()
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private struct _TickBox: @unchecked Sendable {
|
|
210
|
+
let box: _StateBox<Double?>
|
|
211
|
+
init(_ box: _StateBox<Double?>) { self.box = box }
|
|
212
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/// `.toolbar` and `.searchable`. Items become `toolbar` / `searchfield`
|
|
2
|
+
/// elements inside the screen's content; when the runtime emits a `navscreen`
|
|
3
|
+
/// it hoists them to be the screen's direct children (after the content), which
|
|
4
|
+
/// is where the renderer draws the navigation bar from.
|
|
5
|
+
|
|
6
|
+
public struct ToolbarItemPlacement: Hashable, Sendable {
|
|
7
|
+
let name: String
|
|
8
|
+
|
|
9
|
+
public static let automatic = ToolbarItemPlacement(name: "trailing")
|
|
10
|
+
public static let primaryAction = ToolbarItemPlacement(name: "trailing")
|
|
11
|
+
public static let secondaryAction = ToolbarItemPlacement(name: "trailing")
|
|
12
|
+
public static let confirmationAction = ToolbarItemPlacement(name: "trailing")
|
|
13
|
+
public static let destructiveAction = ToolbarItemPlacement(name: "trailing")
|
|
14
|
+
public static let cancellationAction = ToolbarItemPlacement(name: "leading")
|
|
15
|
+
public static let navigation = ToolbarItemPlacement(name: "leading")
|
|
16
|
+
public static let principal = ToolbarItemPlacement(name: "principal")
|
|
17
|
+
public static let status = ToolbarItemPlacement(name: "bottom")
|
|
18
|
+
public static let bottomBar = ToolbarItemPlacement(name: "bottom")
|
|
19
|
+
public static let keyboard = ToolbarItemPlacement(name: "bottom")
|
|
20
|
+
public static let topBarLeading = ToolbarItemPlacement(name: "leading")
|
|
21
|
+
public static let topBarTrailing = ToolbarItemPlacement(name: "trailing")
|
|
22
|
+
public static let navigationBarLeading = ToolbarItemPlacement(name: "leading")
|
|
23
|
+
public static let navigationBarTrailing = ToolbarItemPlacement(name: "trailing")
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// Content of a `.toolbar`: items, groups, title menus or plain views, or a
|
|
27
|
+
/// type of the app's with a `body` (CustomToolbarContent.swift). Main-actor
|
|
28
|
+
/// isolated, as SwiftUI's is.
|
|
29
|
+
@MainActor @preconcurrency
|
|
30
|
+
public protocol ToolbarContent {
|
|
31
|
+
associatedtype Body: ToolbarContent
|
|
32
|
+
@ToolbarContentBuilder var body: Body { get }
|
|
33
|
+
nonisolated var _toolbarItems: [any View] { get }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// A `toolbar` element: the items of one placement.
|
|
37
|
+
struct _ToolbarGroupView {
|
|
38
|
+
let placement: ToolbarItemPlacement
|
|
39
|
+
let items: [any View]
|
|
40
|
+
}
|
|
41
|
+
extension _ToolbarGroupView: _PrimitiveView {}
|
|
42
|
+
extension _ToolbarGroupView: _HostView {
|
|
43
|
+
var _kind: String { "toolbar" }
|
|
44
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object(["placement": .string(placement.name)]) }
|
|
45
|
+
var _content: [any View] { items }
|
|
46
|
+
}
|
|
47
|
+
extension _ToolbarGroupView: _EnvironmentModifying {
|
|
48
|
+
/// Labels in a bar show their icon only, as on iOS (the title is the
|
|
49
|
+
/// accessibility label); an explicit `.labelStyle` inside an item still wins.
|
|
50
|
+
func _apply(to environment: inout EnvironmentValues) {
|
|
51
|
+
environment._labelStyle = _AnyLabelStyle.iconOnly
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
nonisolated public struct ToolbarItem<ID, Content: View>: ToolbarContent {
|
|
56
|
+
let placement: ToolbarItemPlacement
|
|
57
|
+
let content: Content
|
|
58
|
+
|
|
59
|
+
public init(placement: ToolbarItemPlacement = .automatic, @ViewBuilder content: () -> Content) where ID == Void {
|
|
60
|
+
self.placement = placement
|
|
61
|
+
self.content = content()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public init(id: ID, placement: ToolbarItemPlacement = .automatic, @ViewBuilder content: () -> Content) where ID: Hashable {
|
|
65
|
+
self.placement = placement
|
|
66
|
+
self.content = content()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
nonisolated public var _toolbarItems: [any View] { [_ToolbarGroupView(placement: placement, items: [content])] }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
nonisolated public struct ToolbarItemGroup<Content: View>: ToolbarContent {
|
|
73
|
+
let placement: ToolbarItemPlacement
|
|
74
|
+
let content: Content
|
|
75
|
+
|
|
76
|
+
public init(placement: ToolbarItemPlacement = .automatic, @ViewBuilder content: () -> Content) {
|
|
77
|
+
self.placement = placement
|
|
78
|
+
self.content = content()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
nonisolated public var _toolbarItems: [any View] { [_ToolbarGroupView(placement: placement, items: [content])] }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/// Accepted for source compatibility; the title has no menu in the browser.
|
|
85
|
+
nonisolated public struct ToolbarTitleMenu<Content: View>: ToolbarContent {
|
|
86
|
+
public init(@ViewBuilder content: () -> Content) { _ = content() }
|
|
87
|
+
nonisolated public var _toolbarItems: [any View] { [] }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// Several contents in order (a builder's block, `if`/`else` branches).
|
|
91
|
+
nonisolated public struct _ToolbarContentList: ToolbarContent {
|
|
92
|
+
let parts: [any ToolbarContent]
|
|
93
|
+
nonisolated public var _toolbarItems: [any View] { parts.flatMap(\._toolbarItems) }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
nonisolated struct _EmptyToolbarContent: ToolbarContent {
|
|
97
|
+
nonisolated var _toolbarItems: [any View] { [] }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@resultBuilder
|
|
101
|
+
public enum ToolbarContentBuilder {
|
|
102
|
+
public static func buildBlock() -> some ToolbarContent { _EmptyToolbarContent() }
|
|
103
|
+
|
|
104
|
+
public static func buildBlock<C: ToolbarContent>(_ content: C) -> C { content }
|
|
105
|
+
|
|
106
|
+
public static func buildBlock<each C: ToolbarContent>(_ content: repeat each C) -> some ToolbarContent {
|
|
107
|
+
var parts: [any ToolbarContent] = []
|
|
108
|
+
for part in repeat each content { parts.append(part) }
|
|
109
|
+
return _ToolbarContentList(parts: parts)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public static func buildExpression<C: ToolbarContent>(_ content: C) -> C { content }
|
|
113
|
+
|
|
114
|
+
public static func buildOptional<C: ToolbarContent>(_ content: C?) -> some ToolbarContent {
|
|
115
|
+
_ToolbarContentList(parts: content.map { [$0] } ?? [])
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Both branches of an `if`/`else` must build the same type.
|
|
119
|
+
public static func buildEither<T: ToolbarContent>(first: T) -> _ToolbarContentList {
|
|
120
|
+
_ToolbarContentList(parts: [first])
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public static func buildEither<F: ToolbarContent>(second: F) -> _ToolbarContentList {
|
|
124
|
+
_ToolbarContentList(parts: [second])
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// `if #available(…)`.
|
|
128
|
+
public static func buildLimitedAvailability<C: ToolbarContent>(_ content: C) -> _ToolbarContentList {
|
|
129
|
+
_ToolbarContentList(parts: [content])
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public static func buildIf<C: ToolbarContent>(_ content: C?) -> some ToolbarContent {
|
|
133
|
+
_ToolbarContentList(parts: content.map { [$0] } ?? [])
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/// The content plus its toolbar groups, as sibling children. The groups are
|
|
138
|
+
/// hoisted to the enclosing `navscreen` when elements are emitted.
|
|
139
|
+
struct _ToolbarView<Content: View> {
|
|
140
|
+
let content: Content
|
|
141
|
+
let groups: [any View]
|
|
142
|
+
}
|
|
143
|
+
extension _ToolbarView: _PrimitiveView {}
|
|
144
|
+
extension _ToolbarView: _GroupView {
|
|
145
|
+
var _children: [any View] { [content] + groups }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
nonisolated extension View {
|
|
149
|
+
public func toolbar<C: ToolbarContent>(@ToolbarContentBuilder content: () -> C) -> some View {
|
|
150
|
+
_ToolbarView(content: self, groups: content()._toolbarItems)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/// Plain views in a toolbar go to the trailing placement.
|
|
154
|
+
public func toolbar<V: View>(@ViewBuilder content: () -> V) -> some View {
|
|
155
|
+
_ToolbarView(content: self, groups: [_ToolbarGroupView(placement: .automatic, items: [content()])])
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public func toolbar(_ visibility: Visibility, for bars: ToolbarPlacement...) -> some View { self }
|
|
159
|
+
public func toolbarBackground<S: ShapeStyle>(_ style: S, for bars: ToolbarPlacement...) -> some View { self }
|
|
160
|
+
public func toolbarBackground(_ visibility: Visibility, for bars: ToolbarPlacement...) -> some View { self }
|
|
161
|
+
public func toolbarColorScheme(_ colorScheme: ColorScheme?, for bars: ToolbarPlacement...) -> some View { self }
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public enum Visibility: Hashable, Sendable { case automatic, visible, hidden }
|
|
165
|
+
|
|
166
|
+
public struct ToolbarPlacement: Hashable, Sendable {
|
|
167
|
+
let name: String
|
|
168
|
+
public static let automatic = ToolbarPlacement(name: "automatic")
|
|
169
|
+
public static let navigationBar = ToolbarPlacement(name: "navigationBar")
|
|
170
|
+
public static let tabBar = ToolbarPlacement(name: "tabBar")
|
|
171
|
+
public static let bottomBar = ToolbarPlacement(name: "bottomBar")
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// MARK: - Searchable
|
|
175
|
+
|
|
176
|
+
/// A `searchfield` element bound to the search text; hoisted into the bar.
|
|
177
|
+
struct _SearchFieldView {
|
|
178
|
+
let text: Binding<String>
|
|
179
|
+
let prompt: String
|
|
180
|
+
}
|
|
181
|
+
extension _SearchFieldView: _PrimitiveView {}
|
|
182
|
+
extension _SearchFieldView: _HostView {
|
|
183
|
+
var _kind: String { "searchfield" }
|
|
184
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
185
|
+
.object(["text": .string(text.wrappedValue), "placeholder": .string(prompt)])
|
|
186
|
+
}
|
|
187
|
+
var _handler: ((_JSON) -> Void)? {
|
|
188
|
+
let text = self.text
|
|
189
|
+
return { payload in
|
|
190
|
+
if case .string(let value) = payload { text.wrappedValue = value }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
struct _SearchableView<Content: View> {
|
|
196
|
+
let content: Content
|
|
197
|
+
let field: _SearchFieldView
|
|
198
|
+
}
|
|
199
|
+
extension _SearchableView: _PrimitiveView {}
|
|
200
|
+
extension _SearchableView: _GroupView {
|
|
201
|
+
var _children: [any View] { [content, field] }
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public struct SearchFieldPlacement: Hashable, Sendable {
|
|
205
|
+
let name: String
|
|
206
|
+
public static let automatic = SearchFieldPlacement(name: "automatic")
|
|
207
|
+
public static let toolbar = SearchFieldPlacement(name: "toolbar")
|
|
208
|
+
public static let sidebar = SearchFieldPlacement(name: "sidebar")
|
|
209
|
+
public static let navigationBarDrawer = SearchFieldPlacement(name: "navigationBarDrawer")
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
nonisolated extension View {
|
|
213
|
+
public func searchable(text: Binding<String>, placement: SearchFieldPlacement = .automatic,
|
|
214
|
+
prompt: Text? = nil) -> some View {
|
|
215
|
+
_SearchableView(content: self, field: _SearchFieldView(text: text, prompt: prompt?.content ?? "Search"))
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@_disfavoredOverload
|
|
219
|
+
public func searchable<S: StringProtocol>(text: Binding<String>, placement: SearchFieldPlacement = .automatic,
|
|
220
|
+
prompt: S) -> some View {
|
|
221
|
+
_SearchableView(content: self, field: _SearchFieldView(text: text, prompt: String(prompt)))
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public func searchable(text: Binding<String>, placement: SearchFieldPlacement = .automatic,
|
|
225
|
+
prompt: LocalizedStringKey) -> some View {
|
|
226
|
+
_SearchableView(content: self, field: _SearchFieldView(text: text, prompt: prompt.key))
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/// Suggestions under the search field. The page's search field shows
|
|
230
|
+
/// none: the views are not drawn, and searching works as typed.
|
|
231
|
+
public func searchSuggestions<S: View>(@ViewBuilder _ suggestions: () -> S) -> some View { self }
|
|
232
|
+
|
|
233
|
+
public func searchSuggestions(_ visibility: Visibility, for placements: SearchSuggestionsPlacement.Set) -> some View { self }
|
|
234
|
+
|
|
235
|
+
/// The text a suggestion completes the search with (see `searchSuggestions`).
|
|
236
|
+
public func searchCompletion(_ completion: String) -> some View { self }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/// Where search suggestions show; accepted (see `searchSuggestions`).
|
|
240
|
+
public struct SearchSuggestionsPlacement: Equatable, Sendable {
|
|
241
|
+
public static let automatic = SearchSuggestionsPlacement()
|
|
242
|
+
public static let menu = SearchSuggestionsPlacement()
|
|
243
|
+
public static let content = SearchSuggestionsPlacement()
|
|
244
|
+
|
|
245
|
+
public struct Set: OptionSet, Sendable {
|
|
246
|
+
public let rawValue: Int
|
|
247
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
248
|
+
public static let menu = Set(rawValue: 1)
|
|
249
|
+
public static let content = Set(rawValue: 2)
|
|
250
|
+
}
|
|
251
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
// As on iOS, SwiftUI brings CoreTransferable (`Transferable` and its
|
|
3
|
+
// representations) and with it UniformTypeIdentifiers' `UTType`.
|
|
4
|
+
@_exported import CoreTransferable
|
|
5
|
+
|
|
6
|
+
// SwiftUI's side of `Transferable`: `Image` as a transferable value,
|
|
7
|
+
// `ShareLink`'s export of other items, and the drag-and-drop and clipboard
|
|
8
|
+
// modifiers that take `Transferable` payloads (docs/ops-protocol.md,
|
|
9
|
+
// "Sharing and media").
|
|
10
|
+
|
|
11
|
+
// MARK: - Image
|
|
12
|
+
|
|
13
|
+
extension Image: Transferable {
|
|
14
|
+
/// Exports the bytes of an image made from a file (`Image(uiImage:
|
|
15
|
+
/// UIImage(data:))`), in that file's type; a symbol, a catalog image, a
|
|
16
|
+
/// remote image or a Core Image result has no bytes in Swift and exports
|
|
17
|
+
/// nothing. Imports any image file the page can draw.
|
|
18
|
+
public static var transferRepresentation: _TransferRepresentationList<Image> {
|
|
19
|
+
return _TransferRepresentationList(nodes: [
|
|
20
|
+
_TransferNode(
|
|
21
|
+
exportType: .image, importType: .image,
|
|
22
|
+
exporter: { item, wanted in
|
|
23
|
+
guard let image = item as? Image, case .bitmap(let recipe, _, _) = image.source, recipe.steps.isEmpty,
|
|
24
|
+
let file = recipe.source?.encodedFile, let type = UTType(mimeType: file.mime, conformingTo: .image)
|
|
25
|
+
else { return nil }
|
|
26
|
+
if let wanted, !type.conforms(to: wanted) { return nil }
|
|
27
|
+
return _TransferContent(contentType: type, data: file.data)
|
|
28
|
+
},
|
|
29
|
+
importer: { content in
|
|
30
|
+
guard let uiImage = UIImage(data: try content.loadData()) else { return nil }
|
|
31
|
+
return Image(uiImage: uiImage)
|
|
32
|
+
}),
|
|
33
|
+
])
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
extension _ImageSource {
|
|
38
|
+
/// The encoded file this source is (its bytes and MIME type); nil for a pixel buffer.
|
|
39
|
+
public var encodedFile: (data: Data, mime: String)? {
|
|
40
|
+
if case .encoded(let bytes, let mime) = payload { return (Data(bytes), mime) }
|
|
41
|
+
return nil
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
extension UIImage {
|
|
46
|
+
/// The file an image made with `UIImage(data:)` came from, unchanged
|
|
47
|
+
/// (its bytes and MIME type); nil for any other image. The pasteboard,
|
|
48
|
+
/// the photo library and item providers hand these bytes on as they are.
|
|
49
|
+
public var _encodedFile: (data: Data, mime: String)? {
|
|
50
|
+
guard case .bitmap(let recipe) = content, recipe.steps.isEmpty else { return nil }
|
|
51
|
+
return recipe.source?.encodedFile
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
extension _ImageRecipe {
|
|
56
|
+
/// The recipe as a `share` or `download` request carries it (`bitmaps`).
|
|
57
|
+
public var _json: _JSON { json }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
extension UIImage {
|
|
61
|
+
/// The asset-catalog name of `UIImage(named:)`; nil for any other image.
|
|
62
|
+
public var _catalogName: String? {
|
|
63
|
+
if case .named(let name) = content { return name }
|
|
64
|
+
return nil
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// MARK: - Sharing other items
|
|
69
|
+
|
|
70
|
+
/// A value the compiler cannot prove `Sendable` that stays on the browser's one thread.
|
|
71
|
+
struct _UncheckedSendableBox<Value>: @unchecked Sendable {
|
|
72
|
+
let value: Value
|
|
73
|
+
init(_ value: Value) { self.value = value }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// `ShareLink` items other than `String`, `URL` and `Image`: each is
|
|
77
|
+
/// exported through its first exporting representation. A `String` or `URL`
|
|
78
|
+
/// proxy joins the text and link; bytes or a file join the `files` the page
|
|
79
|
+
/// shares (`{name, type, data}`, data in base64). An item that exports
|
|
80
|
+
/// nothing, or fails, is left out.
|
|
81
|
+
@MainActor
|
|
82
|
+
enum _ShareExport {
|
|
83
|
+
static func payload(_ base: _JSON, adding items: [any Transferable], title: String?) async -> _JSON {
|
|
84
|
+
guard case .object(var fields) = base else { return base }
|
|
85
|
+
var texts: [String] = []
|
|
86
|
+
if case .string(let text)? = fields["text"] { texts.append(text) }
|
|
87
|
+
var files: [_JSON] = []
|
|
88
|
+
for item in items {
|
|
89
|
+
guard let content = try? await _Transfer.export(item) else { continue }
|
|
90
|
+
switch content.value {
|
|
91
|
+
case let text as String:
|
|
92
|
+
texts.append(text)
|
|
93
|
+
continue
|
|
94
|
+
case let url as URL:
|
|
95
|
+
if fields["url"] == nil { fields["url"] = .string(url.absoluteString) } else { texts.append(url.absoluteString) }
|
|
96
|
+
continue
|
|
97
|
+
default:
|
|
98
|
+
break
|
|
99
|
+
}
|
|
100
|
+
guard let data = try? content.loadData() else { continue }
|
|
101
|
+
var named = content
|
|
102
|
+
if named.suggestedName == nil, named.file == nil { named.suggestedName = title }
|
|
103
|
+
files.append(.object([
|
|
104
|
+
"name": .string(named.fileName),
|
|
105
|
+
"type": .string(content.contentType.preferredMIMEType ?? "application/octet-stream"),
|
|
106
|
+
"data": .string(_base64([UInt8](data))),
|
|
107
|
+
]))
|
|
108
|
+
}
|
|
109
|
+
if !texts.isEmpty { fields["text"] = .string(texts.joined(separator: "\n")) }
|
|
110
|
+
if !files.isEmpty { fields["files"] = .array(files) }
|
|
111
|
+
return .object(fields)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// MARK: - Drag and drop, copy and paste
|
|
116
|
+
|
|
117
|
+
// The page has no drag and drop between views or apps yet, and the clipboard
|
|
118
|
+
// takes text through `UIPasteboard` (UIKit). These modifiers accept their
|
|
119
|
+
// payloads and actions and leave the view as it is: nothing is dragged,
|
|
120
|
+
// nothing is dropped, and the actions are never called.
|
|
121
|
+
|
|
122
|
+
extension View {
|
|
123
|
+
/// Accepted; the view cannot be dragged in the browser.
|
|
124
|
+
public func draggable<T: Transferable>(_ payload: @autoclosure @escaping () -> T) -> some View { self }
|
|
125
|
+
|
|
126
|
+
/// Accepted; the view cannot be dragged in the browser.
|
|
127
|
+
public func draggable<T: Transferable, Preview: View>(_ payload: @autoclosure @escaping () -> T,
|
|
128
|
+
@ViewBuilder preview: () -> Preview) -> some View { self }
|
|
129
|
+
|
|
130
|
+
/// Accepted; nothing is dropped in the browser, so `action` is never called
|
|
131
|
+
/// and `isTargeted` never reports true.
|
|
132
|
+
public func dropDestination<T: Transferable>(for payloadType: T.Type = T.self,
|
|
133
|
+
action: @escaping ([T], CGPoint) -> Bool,
|
|
134
|
+
isTargeted: @escaping (Bool) -> Void = { _ in }) -> some View { self }
|
|
135
|
+
|
|
136
|
+
/// Accepted; the browser's copy command copies the page's selected text.
|
|
137
|
+
public func copyable<T: Transferable>(_ payload: @autoclosure @escaping () -> [T]) -> some View { self }
|
|
138
|
+
|
|
139
|
+
/// Accepted; the browser's cut command acts on the page's selected text.
|
|
140
|
+
public func cuttable<T: Transferable>(for payloadType: T.Type = T.self, action: @escaping () -> [T]) -> some View { self }
|
|
141
|
+
|
|
142
|
+
/// Accepted; the browser's paste command pastes text into a focused field.
|
|
143
|
+
public func pasteDestination<T: Transferable>(for payloadType: T.Type = T.self, action: @escaping ([T]) -> Void,
|
|
144
|
+
validator: @escaping ([T]) -> [T] = { $0 }) -> some View { self }
|
|
145
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/// A rectangle with a radius of its own at each corner (iOS 16). The page's
|
|
2
|
+
/// shapes, clips and shape backgrounds have one corner radius, so it is drawn
|
|
3
|
+
/// with its largest radius at every corner (an approximation; a sheet-like
|
|
4
|
+
/// panel rounded on top only is rounded at the bottom too).
|
|
5
|
+
nonisolated public struct UnevenRoundedRectangle: Shape {
|
|
6
|
+
public var cornerRadii: RectangleCornerRadii
|
|
7
|
+
public var style: RoundedCornerStyle
|
|
8
|
+
|
|
9
|
+
public init(cornerRadii: RectangleCornerRadii, style: RoundedCornerStyle = .continuous) {
|
|
10
|
+
self.cornerRadii = cornerRadii
|
|
11
|
+
self.style = style
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public init(topLeadingRadius: CGFloat = 0, bottomLeadingRadius: CGFloat = 0, bottomTrailingRadius: CGFloat = 0,
|
|
15
|
+
topTrailingRadius: CGFloat = 0, style: RoundedCornerStyle = .continuous) {
|
|
16
|
+
self.init(cornerRadii: RectangleCornerRadii(topLeading: topLeadingRadius, bottomLeading: bottomLeadingRadius,
|
|
17
|
+
bottomTrailing: bottomTrailingRadius, topTrailing: topTrailingRadius),
|
|
18
|
+
style: style)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public func path(in rect: CGRect) -> Path { Path(roundedRect: rect, cornerRadii: cornerRadii, style: style) }
|
|
22
|
+
|
|
23
|
+
public var _name: String { "roundedRectangle" }
|
|
24
|
+
public var _cornerRadius: CGFloat {
|
|
25
|
+
max(cornerRadii.topLeading, cornerRadii.bottomLeading, cornerRadii.bottomTrailing, cornerRadii.topTrailing)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// The four corner radii of an `UnevenRoundedRectangle`.
|
|
30
|
+
public struct RectangleCornerRadii: Equatable, Sendable {
|
|
31
|
+
public var topLeading: CGFloat
|
|
32
|
+
public var bottomLeading: CGFloat
|
|
33
|
+
public var bottomTrailing: CGFloat
|
|
34
|
+
public var topTrailing: CGFloat
|
|
35
|
+
|
|
36
|
+
public init(topLeading: CGFloat = 0, bottomLeading: CGFloat = 0, bottomTrailing: CGFloat = 0, topTrailing: CGFloat = 0) {
|
|
37
|
+
self.topLeading = topLeading
|
|
38
|
+
self.bottomLeading = bottomLeading
|
|
39
|
+
self.bottomTrailing = bottomTrailing
|
|
40
|
+
self.topTrailing = topTrailing
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
extension Shape where Self == UnevenRoundedRectangle {
|
|
45
|
+
public static func rect(topLeadingRadius: CGFloat = 0, bottomLeadingRadius: CGFloat = 0, bottomTrailingRadius: CGFloat = 0,
|
|
46
|
+
topTrailingRadius: CGFloat = 0, style: RoundedCornerStyle = .continuous) -> UnevenRoundedRectangle {
|
|
47
|
+
UnevenRoundedRectangle(topLeadingRadius: topLeadingRadius, bottomLeadingRadius: bottomLeadingRadius,
|
|
48
|
+
bottomTrailingRadius: bottomTrailingRadius, topTrailingRadius: topTrailingRadius, style: style)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public static func rect(cornerRadii: RectangleCornerRadii, style: RoundedCornerStyle = .continuous) -> UnevenRoundedRectangle {
|
|
52
|
+
UnevenRoundedRectangle(cornerRadii: cornerRadii, style: style)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
extension UnevenRoundedRectangle: View {
|
|
57
|
+
public typealias Body = Never
|
|
58
|
+
public var body: Never { fatalError("UnevenRoundedRectangle is a primitive view") }
|
|
59
|
+
}
|
|
60
|
+
extension UnevenRoundedRectangle: _PrimitiveView {}
|
|
61
|
+
extension UnevenRoundedRectangle: _HostView {
|
|
62
|
+
var _kind: String { "shape" }
|
|
63
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
64
|
+
_ShapeView(shape: self, fill: nil, stroke: nil)._props(in: environment)
|
|
65
|
+
}
|
|
66
|
+
}
|