@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,67 @@
|
|
|
1
|
+
// Home Screen quick actions (`UIApplicationShortcutItem`). A web page has no
|
|
2
|
+
// Home Screen icon menu, so the items an app sets are kept and never shown,
|
|
3
|
+
// and no shortcut ever launches the app.
|
|
4
|
+
|
|
5
|
+
import Foundation
|
|
6
|
+
|
|
7
|
+
public final class UIApplicationShortcutIcon: Hashable, @unchecked Sendable {
|
|
8
|
+
public enum IconType: Int, Sendable {
|
|
9
|
+
case compose, play, pause, add, location, search, share, prohibit, contact, home, markLocation,
|
|
10
|
+
favorite, love, cloud, invitation, confirmation, mail, message, date, time, capturePhoto,
|
|
11
|
+
captureVideo, task, taskCompleted, alarm, bookmark, shuffle, audio, update
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
enum Source: Hashable {
|
|
15
|
+
case type(IconType)
|
|
16
|
+
case systemImage(String)
|
|
17
|
+
case templateImage(String)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let source: Source
|
|
21
|
+
|
|
22
|
+
public init(type: IconType) { source = .type(type) }
|
|
23
|
+
public init(systemImageName: String) { source = .systemImage(systemImageName) }
|
|
24
|
+
public init(templateImageName: String) { source = .templateImage(templateImageName) }
|
|
25
|
+
|
|
26
|
+
public static func == (lhs: UIApplicationShortcutIcon, rhs: UIApplicationShortcutIcon) -> Bool { lhs.source == rhs.source }
|
|
27
|
+
public func hash(into hasher: inout Hasher) { hasher.combine(source) }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public class UIApplicationShortcutItem: Hashable, @unchecked Sendable {
|
|
31
|
+
public let type: String
|
|
32
|
+
public let localizedTitle: String
|
|
33
|
+
public let localizedSubtitle: String?
|
|
34
|
+
public let icon: UIApplicationShortcutIcon?
|
|
35
|
+
public let userInfo: [String: any NSSecureCoding]?
|
|
36
|
+
public var targetContentIdentifier: Any?
|
|
37
|
+
|
|
38
|
+
public init(type: String, localizedTitle: String, localizedSubtitle: String? = nil,
|
|
39
|
+
icon: UIApplicationShortcutIcon? = nil, userInfo: [String: any NSSecureCoding]? = nil) {
|
|
40
|
+
self.type = type
|
|
41
|
+
self.localizedTitle = localizedTitle
|
|
42
|
+
self.localizedSubtitle = localizedSubtitle
|
|
43
|
+
self.icon = icon
|
|
44
|
+
self.userInfo = userInfo
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public convenience init(type: String, localizedTitle: String) {
|
|
48
|
+
self.init(type: type, localizedTitle: localizedTitle, localizedSubtitle: nil, icon: nil, userInfo: nil)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public static func == (lhs: UIApplicationShortcutItem, rhs: UIApplicationShortcutItem) -> Bool {
|
|
52
|
+
lhs.type == rhs.type && lhs.localizedTitle == rhs.localizedTitle && lhs.localizedSubtitle == rhs.localizedSubtitle && lhs.icon == rhs.icon
|
|
53
|
+
}
|
|
54
|
+
public func hash(into hasher: inout Hasher) { hasher.combine(type); hasher.combine(localizedTitle) }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public final class UIMutableApplicationShortcutItem: UIApplicationShortcutItem, @unchecked Sendable {}
|
|
58
|
+
|
|
59
|
+
nonisolated(unsafe) private var _shortcutItems: [UIApplicationShortcutItem]? = nil
|
|
60
|
+
|
|
61
|
+
extension UIApplication {
|
|
62
|
+
/// Kept, never shown: the page has no Home Screen quick actions.
|
|
63
|
+
public var shortcutItems: [UIApplicationShortcutItem]? {
|
|
64
|
+
get { _shortcutItems }
|
|
65
|
+
set { _shortcutItems = newValue }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// UIImage's symbol configurations (point size, weight, scale, text style,
|
|
2
|
+
// colors) and the `UIImage(systemName:…)` initializers that take one, which
|
|
3
|
+
// symbol helpers such as SFSafeSymbols and App Intents' display images
|
|
4
|
+
// forward to. A configuration keeps its values; the image is the plain
|
|
5
|
+
// symbol, which the page draws at the size and color of where it is shown.
|
|
6
|
+
|
|
7
|
+
import Foundation
|
|
8
|
+
import SwiftUI
|
|
9
|
+
|
|
10
|
+
extension UIImage {
|
|
11
|
+
/// An image configuration: its traits, kept.
|
|
12
|
+
open class Configuration: @unchecked Sendable {
|
|
13
|
+
public fileprivate(set) var traitCollection: UITraitCollection?
|
|
14
|
+
|
|
15
|
+
public required init() {}
|
|
16
|
+
|
|
17
|
+
public func withTraitCollection(_ traitCollection: UITraitCollection?) -> Self {
|
|
18
|
+
let copy = self.copy()
|
|
19
|
+
copy.traitCollection = traitCollection
|
|
20
|
+
return copy
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public func applying(_ otherConfiguration: UIImage.Configuration?) -> Self {
|
|
24
|
+
let copy = self.copy()
|
|
25
|
+
if let other = otherConfiguration { copy.merge(other) }
|
|
26
|
+
return copy
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
func copy() -> Self {
|
|
30
|
+
let copy = Self.init()
|
|
31
|
+
copy.merge(self)
|
|
32
|
+
return copy
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// Takes the values `other` sets.
|
|
36
|
+
func merge(_ other: Configuration) {
|
|
37
|
+
traitCollection = other.traitCollection ?? traitCollection
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// A symbol's configuration: point size, weight, scale, text style and colors, kept.
|
|
42
|
+
open class SymbolConfiguration: Configuration, @unchecked Sendable {
|
|
43
|
+
public private(set) var pointSize: CGFloat?
|
|
44
|
+
public private(set) var weight: SymbolWeight?
|
|
45
|
+
public private(set) var scale: SymbolScale?
|
|
46
|
+
public private(set) var textStyle: UIFont.TextStyle?
|
|
47
|
+
public private(set) var colors: [UIColor] = []
|
|
48
|
+
public private(set) var prefersMulticolor = false
|
|
49
|
+
|
|
50
|
+
public required init() {}
|
|
51
|
+
|
|
52
|
+
public convenience init(pointSize: CGFloat) { self.init(); self.pointSize = pointSize }
|
|
53
|
+
public convenience init(weight: SymbolWeight) { self.init(); self.weight = weight }
|
|
54
|
+
public convenience init(scale: SymbolScale) { self.init(); self.scale = scale }
|
|
55
|
+
public convenience init(pointSize: CGFloat, weight: SymbolWeight, scale: SymbolScale = .default) {
|
|
56
|
+
self.init(); self.pointSize = pointSize; self.weight = weight; self.scale = scale
|
|
57
|
+
}
|
|
58
|
+
public convenience init(textStyle: UIFont.TextStyle) { self.init(); self.textStyle = textStyle }
|
|
59
|
+
public convenience init(textStyle: UIFont.TextStyle, scale: SymbolScale) { self.init(); self.textStyle = textStyle; self.scale = scale }
|
|
60
|
+
public convenience init(font: UIFont) { self.init(); self.pointSize = font.pointSize }
|
|
61
|
+
public convenience init(font: UIFont, scale: SymbolScale) { self.init(); self.pointSize = font.pointSize; self.scale = scale }
|
|
62
|
+
public convenience init(hierarchicalColor: UIColor) { self.init(); self.colors = [hierarchicalColor] }
|
|
63
|
+
public convenience init(paletteColors: [UIColor]) { self.init(); self.colors = paletteColors }
|
|
64
|
+
|
|
65
|
+
public static var unspecified: SymbolConfiguration { SymbolConfiguration() }
|
|
66
|
+
public class func configurationPreferringMulticolor() -> SymbolConfiguration {
|
|
67
|
+
let configuration = SymbolConfiguration()
|
|
68
|
+
configuration.prefersMulticolor = true
|
|
69
|
+
return configuration
|
|
70
|
+
}
|
|
71
|
+
public class func configurationWithHierarchicalColor(_ color: UIColor) -> SymbolConfiguration { .init(hierarchicalColor: color) }
|
|
72
|
+
public class func configurationWithPaletteColors(_ colors: [UIColor]) -> SymbolConfiguration { .init(paletteColors: colors) }
|
|
73
|
+
|
|
74
|
+
public func configurationWithoutPointSizeAndWeight() -> SymbolConfiguration {
|
|
75
|
+
let copy = self.copy()
|
|
76
|
+
copy.pointSize = nil
|
|
77
|
+
copy.weight = nil
|
|
78
|
+
return copy
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
override func merge(_ other: Configuration) {
|
|
82
|
+
super.merge(other)
|
|
83
|
+
guard let other = other as? SymbolConfiguration else { return }
|
|
84
|
+
pointSize = other.pointSize ?? pointSize
|
|
85
|
+
weight = other.weight ?? weight
|
|
86
|
+
scale = other.scale ?? scale
|
|
87
|
+
textStyle = other.textStyle ?? textStyle
|
|
88
|
+
colors = other.colors.isEmpty ? colors : other.colors
|
|
89
|
+
prefersMulticolor = other.prefersMulticolor || prefersMulticolor
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public func isEqual(to otherConfiguration: SymbolConfiguration?) -> Bool {
|
|
93
|
+
guard let other = otherConfiguration else { return false }
|
|
94
|
+
return pointSize == other.pointSize && weight == other.weight && scale == other.scale
|
|
95
|
+
&& textStyle == other.textStyle && colors == other.colors && prefersMulticolor == other.prefersMulticolor
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public enum SymbolWeight: Int, Sendable {
|
|
100
|
+
case unspecified = 0, ultraLight, thin, light, regular, medium, semibold, bold, heavy, black
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public enum SymbolScale: Int, Sendable {
|
|
104
|
+
case `default` = -1, unspecified = 0, small, medium, large
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/// The symbol; the configuration does not change how the page draws it.
|
|
108
|
+
public convenience init?(systemName name: String, withConfiguration configuration: UIImage.Configuration?) {
|
|
109
|
+
self.init(systemName: name)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public convenience init?(systemName name: String, compatibleWith traitCollection: UITraitCollection?) {
|
|
113
|
+
self.init(systemName: name)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// The symbol; the page draws variable symbols fully filled.
|
|
117
|
+
public convenience init?(systemName name: String, variableValue: Double, configuration: UIImage.Configuration?) {
|
|
118
|
+
self.init(systemName: name)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public func withConfiguration(_ configuration: UIImage.Configuration) -> UIImage { self }
|
|
122
|
+
public func applyingSymbolConfiguration(_ configuration: UIImage.SymbolConfiguration) -> UIImage? { self }
|
|
123
|
+
public var symbolConfiguration: UIImage.SymbolConfiguration? { nil }
|
|
124
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// UIKit's target/action APIs, with FoundationBridge's `Selector` (which the
|
|
2
|
+
// staging makes from `#selector`): `CADisplayLink`, which calls its target
|
|
3
|
+
// once a frame, and `UIControl`'s actions. The views draw nothing, but code
|
|
4
|
+
// that drives animation or state from them runs.
|
|
5
|
+
|
|
6
|
+
import Foundation
|
|
7
|
+
import FoundationBridge
|
|
8
|
+
import SwiftUI
|
|
9
|
+
|
|
10
|
+
/// Calls its target once a frame (60 a second, on the executor's clock)
|
|
11
|
+
/// while it is added to a run loop and not paused; a paused link runs no
|
|
12
|
+
/// timer at all. Not tied to the main actor, as on iOS (any thread may make
|
|
13
|
+
/// one); its target is called on the main run loop, the only one the page has.
|
|
14
|
+
open class CADisplayLink: @unchecked Sendable {
|
|
15
|
+
private let target: AnyObject
|
|
16
|
+
private let selector: FoundationBridge.Selector
|
|
17
|
+
private var timer: FoundationBridge.Timer?
|
|
18
|
+
/// Added to a run loop and not invalidated since.
|
|
19
|
+
private var isAdded = false
|
|
20
|
+
|
|
21
|
+
open var isPaused = false { didSet { if isPaused != oldValue { schedule() } } }
|
|
22
|
+
open var preferredFramesPerSecond = 60 { didSet { schedule() } }
|
|
23
|
+
open var preferredFrameRateRange = CAFrameRateRange.default
|
|
24
|
+
public private(set) var timestamp: CFTimeInterval = 0
|
|
25
|
+
public private(set) var targetTimestamp: CFTimeInterval = 0
|
|
26
|
+
open var duration: CFTimeInterval { 1 / Double(max(1, preferredFramesPerSecond)) }
|
|
27
|
+
|
|
28
|
+
public init(target: Any, selector sel: FoundationBridge.Selector) {
|
|
29
|
+
self.target = target as AnyObject
|
|
30
|
+
selector = sel
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
open func add(to runloop: FoundationBridge.RunLoop, forMode mode: FoundationBridge.RunLoop.Mode) {
|
|
34
|
+
guard !isAdded else { return }
|
|
35
|
+
isAdded = true
|
|
36
|
+
schedule()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
open func remove(from runloop: FoundationBridge.RunLoop, forMode mode: FoundationBridge.RunLoop.Mode) { invalidate() }
|
|
40
|
+
|
|
41
|
+
open func invalidate() {
|
|
42
|
+
isAdded = false
|
|
43
|
+
schedule()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// A timer while the link is added and not paused, none otherwise.
|
|
47
|
+
private func schedule() {
|
|
48
|
+
timer?.invalidate()
|
|
49
|
+
timer = nil
|
|
50
|
+
guard isAdded, !isPaused else { return }
|
|
51
|
+
nonisolated(unsafe) let link = self
|
|
52
|
+
timer = FoundationBridge.Timer.scheduledTimer(withTimeInterval: duration, repeats: true) { _ in
|
|
53
|
+
let now = FoundationBridge.CFAbsoluteTimeGetCurrent()
|
|
54
|
+
link.timestamp = now
|
|
55
|
+
link.targetTimestamp = now + link.duration
|
|
56
|
+
link.selector._perform(on: link.target, with: link)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// The frame rates a display link would like.
|
|
62
|
+
public struct CAFrameRateRange: Hashable, Sendable {
|
|
63
|
+
public var minimum: Float
|
|
64
|
+
public var maximum: Float
|
|
65
|
+
public var preferred: Float?
|
|
66
|
+
public init(minimum: Float, maximum: Float, preferred: Float? = nil) {
|
|
67
|
+
self.minimum = minimum
|
|
68
|
+
self.maximum = maximum
|
|
69
|
+
self.preferred = preferred
|
|
70
|
+
}
|
|
71
|
+
public static let `default` = CAFrameRateRange(minimum: 0, maximum: 0, preferred: 0)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// A control: its state and the actions its events send.
|
|
75
|
+
@MainActor
|
|
76
|
+
open class UIControl: UIView {
|
|
77
|
+
public struct Event: OptionSet, Hashable, Sendable {
|
|
78
|
+
public let rawValue: UInt
|
|
79
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
80
|
+
public static let touchDown = Event(rawValue: 1 << 0)
|
|
81
|
+
public static let touchDownRepeat = Event(rawValue: 1 << 1)
|
|
82
|
+
public static let touchDragInside = Event(rawValue: 1 << 2)
|
|
83
|
+
public static let touchDragOutside = Event(rawValue: 1 << 3)
|
|
84
|
+
public static let touchUpInside = Event(rawValue: 1 << 6)
|
|
85
|
+
public static let touchUpOutside = Event(rawValue: 1 << 7)
|
|
86
|
+
public static let touchCancel = Event(rawValue: 1 << 8)
|
|
87
|
+
public static let valueChanged = Event(rawValue: 1 << 12)
|
|
88
|
+
public static let primaryActionTriggered = Event(rawValue: 1 << 13)
|
|
89
|
+
public static let editingDidBegin = Event(rawValue: 1 << 16)
|
|
90
|
+
public static let editingChanged = Event(rawValue: 1 << 17)
|
|
91
|
+
public static let editingDidEnd = Event(rawValue: 1 << 18)
|
|
92
|
+
public static let editingDidEndOnExit = Event(rawValue: 1 << 19)
|
|
93
|
+
public static let allTouchEvents = Event(rawValue: 0x0000_0FFF)
|
|
94
|
+
public static let allEditingEvents = Event(rawValue: 0x000F_0000)
|
|
95
|
+
public static let allEvents = Event(rawValue: 0xFFFF_FFFF)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
open var isEnabled = true
|
|
99
|
+
open var isSelected = false
|
|
100
|
+
open var isHighlighted = false
|
|
101
|
+
|
|
102
|
+
private var actions: [(target: AnyObject?, action: FoundationBridge.Selector, events: Event)] = []
|
|
103
|
+
|
|
104
|
+
open func addTarget(_ target: Any?, action: FoundationBridge.Selector, for controlEvents: Event) {
|
|
105
|
+
actions.append((target.map { $0 as AnyObject }, action, controlEvents))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
open func removeTarget(_ target: Any?, action: FoundationBridge.Selector?, for controlEvents: Event) {
|
|
109
|
+
let object = target.map { $0 as AnyObject }
|
|
110
|
+
actions.removeAll { entry in
|
|
111
|
+
(object == nil || entry.target === object) && (action == nil || entry.action == action) && !entry.events.isDisjoint(with: controlEvents)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
open var allTargets: Set<AnyHashable> { Set(actions.compactMap { $0.target.map { ObjectIdentifier($0) } }) }
|
|
116
|
+
|
|
117
|
+
/// Sends the actions registered for `controlEvents` (with the control as the sender).
|
|
118
|
+
open func sendActions(for controlEvents: Event) {
|
|
119
|
+
for entry in actions where !entry.events.isDisjoint(with: controlEvents) {
|
|
120
|
+
if let target = entry.target { entry.action._perform(on: target, with: self) }
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// UIKit's paste customization: a text view's `pasteDelegate` may turn
|
|
2
|
+
// pasted items into text, attributed text, or nothing (an app that takes a
|
|
3
|
+
// pasted image as an attachment). In the browser the viewer pastes into the
|
|
4
|
+
// text area the page shows for an editable `UITextView`, and the browser
|
|
5
|
+
// inserts the clipboard's text itself; the edit reaches the app as any
|
|
6
|
+
// typing does (`textViewDidChange`). The page does not hand pasted images to
|
|
7
|
+
// the app yet, so the delegate is never consulted. The types are here so an
|
|
8
|
+
// app's delegate compiles and can be called directly (docs/ops-protocol.md,
|
|
9
|
+
// "Sharing and media").
|
|
10
|
+
|
|
11
|
+
import Foundation
|
|
12
|
+
import FoundationBridge
|
|
13
|
+
import SwiftUI
|
|
14
|
+
|
|
15
|
+
/// What a view accepts when something is pasted or dropped into it.
|
|
16
|
+
open class UIPasteConfiguration: @unchecked Sendable {
|
|
17
|
+
open var acceptableTypeIdentifiers: [String]
|
|
18
|
+
|
|
19
|
+
public init() { acceptableTypeIdentifiers = [] }
|
|
20
|
+
public init(acceptableTypeIdentifiers: [String]) { self.acceptableTypeIdentifiers = acceptableTypeIdentifiers }
|
|
21
|
+
public convenience init(forAccepting aClass: any NSItemProviderReading.Type) {
|
|
22
|
+
self.init(acceptableTypeIdentifiers: aClass.readableTypeIdentifiersForItemProvider)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
open func addAcceptableTypeIdentifiers(_ acceptableTypeIdentifiers: [String]) {
|
|
26
|
+
self.acceptableTypeIdentifiers += acceptableTypeIdentifiers
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
open func addTypeIdentifiers(forAccepting aClass: any NSItemProviderReading.Type) {
|
|
30
|
+
acceptableTypeIdentifiers += aClass.readableTypeIdentifiersForItemProvider
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// A responder that takes pastes.
|
|
35
|
+
@MainActor
|
|
36
|
+
public protocol UIPasteConfigurationSupporting: AnyObject {
|
|
37
|
+
var pasteConfiguration: UIPasteConfiguration? { get set }
|
|
38
|
+
func paste(itemProviders: [NSItemProvider])
|
|
39
|
+
func canPaste(_ itemProviders: [NSItemProvider]) -> Bool
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
extension UIPasteConfigurationSupporting {
|
|
43
|
+
public func paste(itemProviders: [NSItemProvider]) {}
|
|
44
|
+
public func canPaste(_ itemProviders: [NSItemProvider]) -> Bool {
|
|
45
|
+
guard let types = pasteConfiguration?.acceptableTypeIdentifiers else { return false }
|
|
46
|
+
return itemProviders.contains { provider in types.contains { provider.hasItemConformingToTypeIdentifier($0) } }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// A text input that takes pastes and has a paste delegate.
|
|
51
|
+
@MainActor
|
|
52
|
+
public protocol UITextPasteConfigurationSupporting: UIPasteConfigurationSupporting {
|
|
53
|
+
var pasteDelegate: (any UITextPasteDelegate)? { get set }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
extension UITextView: UITextPasteConfigurationSupporting {
|
|
57
|
+
/// Pastes the providers' text at the selection, as the page's own paste
|
|
58
|
+
/// does: each provider's string (or URL) in turn.
|
|
59
|
+
public func paste(itemProviders: [NSItemProvider]) {
|
|
60
|
+
for provider in itemProviders where provider.canLoadObject(ofClass: String.self) || provider.canLoadObject(ofClass: URL.self) {
|
|
61
|
+
let asURL = !provider.canLoadObject(ofClass: String.self)
|
|
62
|
+
let insert: @Sendable (String?) -> Void = { [weak self] text in
|
|
63
|
+
guard let text else { return }
|
|
64
|
+
Task { @MainActor in self?.insertText(text) }
|
|
65
|
+
}
|
|
66
|
+
if asURL {
|
|
67
|
+
provider.loadObject(ofClass: URL.self) { url, _ in insert(url?.absoluteString) }
|
|
68
|
+
} else {
|
|
69
|
+
provider.loadObject(ofClass: String.self) { string, _ in insert(string) }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// One pasted item a paste delegate transforms: it sets a result (text,
|
|
76
|
+
/// attributed text), none (the app took the item itself), or the default.
|
|
77
|
+
@MainActor
|
|
78
|
+
public protocol UITextPasteItem: AnyObject {
|
|
79
|
+
var itemProvider: NSItemProvider { get }
|
|
80
|
+
var localObject: Any? { get }
|
|
81
|
+
var defaultAttributes: [NSAttributedString.Key: Any] { get }
|
|
82
|
+
func setStringResult(_ string: String)
|
|
83
|
+
func setAttributedStringResult(_ string: NSAttributedString)
|
|
84
|
+
func setResult(string: String)
|
|
85
|
+
func setResult(attributedString: NSAttributedString)
|
|
86
|
+
func setNoResult()
|
|
87
|
+
func setDefaultResult()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
extension UITextPasteItem {
|
|
91
|
+
public func setStringResult(_ string: String) { setResult(string: string) }
|
|
92
|
+
public func setAttributedStringResult(_ string: NSAttributedString) { setResult(attributedString: string) }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// A pasted item and the result its delegate chose.
|
|
96
|
+
@MainActor
|
|
97
|
+
public final class _TextPasteItem: UITextPasteItem {
|
|
98
|
+
public enum Result {
|
|
99
|
+
case pending, string(String), attributedString(NSAttributedString), none, defaultResult
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public let itemProvider: NSItemProvider
|
|
103
|
+
public let localObject: Any?
|
|
104
|
+
public let defaultAttributes: [NSAttributedString.Key: Any]
|
|
105
|
+
public private(set) var result = Result.pending
|
|
106
|
+
|
|
107
|
+
public init(itemProvider: NSItemProvider, localObject: Any? = nil, defaultAttributes: [NSAttributedString.Key: Any] = [:]) {
|
|
108
|
+
self.itemProvider = itemProvider
|
|
109
|
+
self.localObject = localObject
|
|
110
|
+
self.defaultAttributes = defaultAttributes
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public func setResult(string: String) { result = .string(string) }
|
|
114
|
+
public func setResult(attributedString: NSAttributedString) { result = .attributedString(attributedString) }
|
|
115
|
+
public func setNoResult() { result = .none }
|
|
116
|
+
public func setDefaultResult() { result = .defaultResult }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// What a text input's paste delegate is asked. Every method has a default
|
|
120
|
+
/// (they are optional on iOS).
|
|
121
|
+
@MainActor
|
|
122
|
+
public protocol UITextPasteDelegate: AnyObject {
|
|
123
|
+
func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
124
|
+
transform item: any UITextPasteItem)
|
|
125
|
+
func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
126
|
+
combineItemAttributedStrings itemStrings: [NSAttributedString],
|
|
127
|
+
for textRange: UITextRange) -> NSAttributedString
|
|
128
|
+
func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
129
|
+
performPasteOf attributedString: NSAttributedString,
|
|
130
|
+
to textRange: UITextRange) -> UITextRange
|
|
131
|
+
func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
132
|
+
shouldAnimatePasteOf attributedString: NSAttributedString,
|
|
133
|
+
to textRange: UITextRange) -> Bool
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
extension UITextPasteDelegate {
|
|
137
|
+
public func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
138
|
+
transform item: any UITextPasteItem) {
|
|
139
|
+
item.setDefaultResult()
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
143
|
+
combineItemAttributedStrings itemStrings: [NSAttributedString],
|
|
144
|
+
for textRange: UITextRange) -> NSAttributedString {
|
|
145
|
+
let combined = NSMutableAttributedString()
|
|
146
|
+
for string in itemStrings { combined.append(string) }
|
|
147
|
+
return combined
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
151
|
+
performPasteOf attributedString: NSAttributedString,
|
|
152
|
+
to textRange: UITextRange) -> UITextRange {
|
|
153
|
+
textRange
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
public func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: any UITextPasteConfigurationSupporting,
|
|
157
|
+
shouldAnimatePasteOf attributedString: NSAttributedString,
|
|
158
|
+
to textRange: UITextRange) -> Bool {
|
|
159
|
+
false
|
|
160
|
+
}
|
|
161
|
+
}
|