@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,204 @@
|
|
|
1
|
+
// Drawing images with UIKit: `UIGraphicsImageRenderer`, the older
|
|
2
|
+
// `UIGraphicsBeginImageContext` functions, `UIImage.draw(in:)`, and an
|
|
3
|
+
// image's rendering mode and tint. Drawing goes into Core Graphics'
|
|
4
|
+
// recording context (Sources/CoreGraphics), so the result is a recipe the
|
|
5
|
+
// page draws: an image drawn into a renderer is that image scaled and placed
|
|
6
|
+
// on the renderer's canvas (how apps resize images, EmojiText's emoji among
|
|
7
|
+
// them). As in that context, the image drawn last is the canvas's content.
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import SwiftUI
|
|
11
|
+
|
|
12
|
+
// MARK: - Rendering mode and tint
|
|
13
|
+
|
|
14
|
+
extension UIImage {
|
|
15
|
+
public enum RenderingMode: Int, Sendable {
|
|
16
|
+
case automatic, alwaysOriginal, alwaysTemplate
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public var renderingMode: RenderingMode { RenderingMode(rawValue: _renderingMode) ?? .automatic }
|
|
20
|
+
|
|
21
|
+
/// SF Symbols are templates: they draw in the tint or foreground color.
|
|
22
|
+
public var isSymbolImage: Bool { _isSymbol }
|
|
23
|
+
|
|
24
|
+
public func withRenderingMode(_ renderingMode: RenderingMode) -> UIImage {
|
|
25
|
+
_copy(renderingMode: renderingMode.rawValue)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// The image's shape filled with `color` (a bitmap's alpha, in the color).
|
|
29
|
+
/// A symbol keeps its own drawing: it takes the foreground color where shown.
|
|
30
|
+
public func withTintColor(_ color: UIColor) -> UIImage {
|
|
31
|
+
withTintColor(color, renderingMode: .alwaysOriginal)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public func withTintColor(_ color: UIColor, renderingMode: RenderingMode) -> UIImage {
|
|
35
|
+
guard let recipe = _recipe, recipe.source != nil else { return _copy(renderingMode: renderingMode.rawValue) }
|
|
36
|
+
let tinted = recipe.adding(.object([
|
|
37
|
+
"op": .string("tint"),
|
|
38
|
+
"r": .number(color.red), "g": .number(color.green), "b": .number(color.blue), "a": .number(color.alpha),
|
|
39
|
+
]), extent: recipe.extent)
|
|
40
|
+
return _copy(recipe: tinted, renderingMode: renderingMode.rawValue)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// MARK: - Drawing into the current context
|
|
45
|
+
|
|
46
|
+
/// The contexts pushed by renderers and `UIGraphicsPushContext`, innermost last.
|
|
47
|
+
nonisolated(unsafe) private var contextStack: [CGContext] = []
|
|
48
|
+
/// The contexts `UIGraphicsBeginImageContext…` made, with their scale.
|
|
49
|
+
nonisolated(unsafe) private var imageContexts: [(context: CGContext, scale: CGFloat)] = []
|
|
50
|
+
|
|
51
|
+
public func UIGraphicsGetCurrentContext() -> CGContext? { contextStack.last }
|
|
52
|
+
public func UIGraphicsPushContext(_ context: CGContext) { contextStack.append(context) }
|
|
53
|
+
public func UIGraphicsPopContext() { _ = contextStack.popLast() }
|
|
54
|
+
|
|
55
|
+
public func UIGraphicsBeginImageContext(_ size: CGSize) {
|
|
56
|
+
UIGraphicsBeginImageContextWithOptions(size, false, 1)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// A scale of 0 is the screen's (3).
|
|
60
|
+
public func UIGraphicsBeginImageContextWithOptions(_ size: CGSize, _ opaque: Bool, _ scale: CGFloat) {
|
|
61
|
+
let factor = scale > 0 ? scale : UIScreen.main.scale
|
|
62
|
+
guard let context = _uiKitContext(size: size, scale: factor) else { return }
|
|
63
|
+
imageContexts.append((context, factor))
|
|
64
|
+
contextStack.append(context)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public func UIGraphicsGetImageFromCurrentImageContext() -> UIImage? {
|
|
68
|
+
guard let (context, scale) = imageContexts.last, let image = context.makeImage() else { return nil }
|
|
69
|
+
return UIImage(cgImage: image, scale: scale, orientation: .up)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public func UIGraphicsEndImageContext() {
|
|
73
|
+
guard let (context, _) = imageContexts.popLast() else { return }
|
|
74
|
+
if let index = contextStack.lastIndex(where: { $0 === context }) { contextStack.remove(at: index) }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/// A bitmap context of `size` points at `scale` pixels per point, in UIKit's
|
|
78
|
+
/// coordinates: points, origin at the top left.
|
|
79
|
+
func _uiKitContext(size: CGSize, scale: CGFloat) -> CGContext? {
|
|
80
|
+
let width = Int((size.width * scale).rounded(.up)), height = Int((size.height * scale).rounded(.up))
|
|
81
|
+
guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: width * 4,
|
|
82
|
+
space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
|
|
83
|
+
else { return nil }
|
|
84
|
+
context.translateBy(x: 0, y: CGFloat(height))
|
|
85
|
+
context.scaleBy(x: scale, y: -scale)
|
|
86
|
+
return context
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
extension UIImage {
|
|
90
|
+
/// Draws the image scaled into `rect` (points, in the current context's
|
|
91
|
+
/// coordinates). A symbol or catalog image has no bitmap here and draws nothing.
|
|
92
|
+
public func draw(in rect: CGRect) {
|
|
93
|
+
guard let context = UIGraphicsGetCurrentContext(), let cgImage else { return }
|
|
94
|
+
context.draw(cgImage, in: rect)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public func draw(in rect: CGRect, blendMode: CGBlendMode, alpha: CGFloat) { draw(in: rect) }
|
|
98
|
+
|
|
99
|
+
public func draw(at point: CGPoint) { draw(in: CGRect(origin: point, size: size)) }
|
|
100
|
+
|
|
101
|
+
public func draw(at point: CGPoint, blendMode: CGBlendMode, alpha: CGFloat) { draw(at: point) }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// MARK: - UIGraphicsImageRenderer
|
|
105
|
+
|
|
106
|
+
public class UIGraphicsRendererFormat: @unchecked Sendable {
|
|
107
|
+
public init() {}
|
|
108
|
+
public var bounds: CGRect = .zero
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public final class UIGraphicsImageRendererFormat: UIGraphicsRendererFormat, @unchecked Sendable {
|
|
112
|
+
/// Pixels per point: the screen's (3) by default.
|
|
113
|
+
public var scale: CGFloat = UIScreen.main.scale
|
|
114
|
+
public var opaque = false
|
|
115
|
+
public var preferredRange: Range = .automatic
|
|
116
|
+
|
|
117
|
+
public enum Range: Int, Sendable { case unspecified = -1, automatic, `default`, extended, standard }
|
|
118
|
+
|
|
119
|
+
public override init() { super.init() }
|
|
120
|
+
|
|
121
|
+
public init(for traitCollection: UITraitCollection) {
|
|
122
|
+
super.init()
|
|
123
|
+
scale = traitCollection.displayScale
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public class func `default`() -> UIGraphicsImageRendererFormat { UIGraphicsImageRendererFormat() }
|
|
127
|
+
public class func preferred() -> UIGraphicsImageRendererFormat { UIGraphicsImageRendererFormat() }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public class UIGraphicsRendererContext: @unchecked Sendable {
|
|
131
|
+
public let cgContext: CGContext
|
|
132
|
+
init(cgContext: CGContext) { self.cgContext = cgContext }
|
|
133
|
+
|
|
134
|
+
public func fill(_ rect: CGRect) { cgContext.fill(rect) }
|
|
135
|
+
public func fill(_ rect: CGRect, blendMode: CGBlendMode) { cgContext.fill(rect) }
|
|
136
|
+
public func stroke(_ rect: CGRect) { cgContext.stroke(rect) }
|
|
137
|
+
public func stroke(_ rect: CGRect, blendMode: CGBlendMode) { cgContext.stroke(rect) }
|
|
138
|
+
public func clip(to rect: CGRect) { cgContext.clip(to: rect) }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public final class UIGraphicsImageRendererContext: UIGraphicsRendererContext, @unchecked Sendable {
|
|
142
|
+
public let format: UIGraphicsImageRendererFormat
|
|
143
|
+
|
|
144
|
+
init(cgContext: CGContext, format: UIGraphicsImageRendererFormat) {
|
|
145
|
+
self.format = format
|
|
146
|
+
super.init(cgContext: cgContext)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/// What has been drawn so far.
|
|
150
|
+
public var currentImage: UIImage {
|
|
151
|
+
cgContext.makeImage().map { UIImage(cgImage: $0, scale: format.scale, orientation: .up) } ?? UIImage()
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public class UIGraphicsRenderer: @unchecked Sendable {
|
|
156
|
+
public init() {}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/// Makes images by drawing: `renderer.image { context in … }`.
|
|
160
|
+
public final class UIGraphicsImageRenderer: UIGraphicsRenderer, @unchecked Sendable {
|
|
161
|
+
public let format: UIGraphicsImageRendererFormat
|
|
162
|
+
let size: CGSize
|
|
163
|
+
|
|
164
|
+
public init(size: CGSize) {
|
|
165
|
+
self.size = size
|
|
166
|
+
format = .default()
|
|
167
|
+
format.bounds = CGRect(origin: .zero, size: size)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
public init(size: CGSize, format: UIGraphicsImageRendererFormat) {
|
|
171
|
+
self.size = size
|
|
172
|
+
self.format = format
|
|
173
|
+
format.bounds = CGRect(origin: .zero, size: size)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public init(bounds: CGRect, format: UIGraphicsImageRendererFormat = .default()) {
|
|
177
|
+
size = bounds.size
|
|
178
|
+
self.format = format
|
|
179
|
+
format.bounds = bounds
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
public typealias DrawingActions = (UIGraphicsImageRendererContext) -> Void
|
|
183
|
+
|
|
184
|
+
/// The image `actions` draw, `size` points at the format's scale.
|
|
185
|
+
public func image(actions: DrawingActions) -> UIImage {
|
|
186
|
+
guard let context = _uiKitContext(size: size, scale: format.scale) else { return UIImage() }
|
|
187
|
+
let rendererContext = UIGraphicsImageRendererContext(cgContext: context, format: format)
|
|
188
|
+
contextStack.append(context)
|
|
189
|
+
actions(rendererContext)
|
|
190
|
+
if let index = contextStack.lastIndex(where: { $0 === context }) { contextStack.remove(at: index) }
|
|
191
|
+
return rendererContext.currentImage
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/// Nil: the browser build cannot encode images (as `UIImage.pngData()`).
|
|
195
|
+
public func pngData(actions: DrawingActions) -> Data {
|
|
196
|
+
_ = image(actions: actions)
|
|
197
|
+
return Data()
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public func jpegData(withCompressionQuality compressionQuality: CGFloat, actions: DrawingActions) -> Data {
|
|
201
|
+
_ = image(actions: actions)
|
|
202
|
+
return Data()
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// SwiftUI inside UIKit inside SwiftUI, and the controllers representables
|
|
2
|
+
// wrap. A `UIHostingController`'s view is a `_UIHostingView` holding the root
|
|
3
|
+
// view; when a representable's tree contains it, the translation draws the
|
|
4
|
+
// root view inline, as a subtree of the representable (ViewTranslation.swift),
|
|
5
|
+
// so its state lives as long as the hosting view keeps its place. A hosting
|
|
6
|
+
// controller that no representable shows (presented, pushed, or a window's
|
|
7
|
+
// root) draws nothing.
|
|
8
|
+
//
|
|
9
|
+
// `UIImagePickerController` has no camera or library here:
|
|
10
|
+
// `isSourceTypeAvailable` is false for every source, and a picker that is
|
|
11
|
+
// shown anyway draws a "camera unavailable" notice whose Cancel button
|
|
12
|
+
// tells the delegate, as the picker's own Cancel would. Code that presents
|
|
13
|
+
// the picker with `present(_:animated:)` shows nothing.
|
|
14
|
+
|
|
15
|
+
import Foundation
|
|
16
|
+
import FoundationBridge
|
|
17
|
+
import SwiftUI
|
|
18
|
+
|
|
19
|
+
// MARK: - Hosting controllers
|
|
20
|
+
|
|
21
|
+
/// What a hosting controller's view sizes itself by; kept.
|
|
22
|
+
public struct UIHostingControllerSizingOptions: OptionSet, Sendable {
|
|
23
|
+
public let rawValue: Int
|
|
24
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
25
|
+
public static let preferredContentSize = UIHostingControllerSizingOptions(rawValue: 1 << 0)
|
|
26
|
+
public static let intrinsicContentSize = UIHostingControllerSizingOptions(rawValue: 1 << 1)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// A view controller whose view is a SwiftUI view.
|
|
30
|
+
@MainActor
|
|
31
|
+
open class UIHostingController<Content: View>: UIViewController {
|
|
32
|
+
/// The SwiftUI view; setting it draws the new one.
|
|
33
|
+
open var rootView: Content {
|
|
34
|
+
didSet { (viewIfLoaded as? _UIHostingView)?.rootView = AnyView(rootView) }
|
|
35
|
+
}
|
|
36
|
+
open var sizingOptions: UIHostingControllerSizingOptions = []
|
|
37
|
+
open var safeAreaRegions: SafeAreaRegions = .all
|
|
38
|
+
|
|
39
|
+
public init(rootView: Content) {
|
|
40
|
+
self.rootView = rootView
|
|
41
|
+
super.init(nibName: nil, bundle: nil)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public required init?(coder: NSCoder) { return nil }
|
|
45
|
+
|
|
46
|
+
open override func loadView() {
|
|
47
|
+
view = _UIHostingView(rootView: AnyView(rootView))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// The root view's size for `size`, from the page's measurement of it
|
|
51
|
+
/// (`_ViewMeasurements`, SwiftUI/Runtime/Measurements.swift): zero until
|
|
52
|
+
/// the page has measured it, which a render later it has, and the code
|
|
53
|
+
/// that asked runs again.
|
|
54
|
+
open func sizeThatFits(in size: CGSize) -> CGSize {
|
|
55
|
+
_UIHostingView.measuredSize(of: AnyView(rootView), fitting: size)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// A hosting controller's view: drawn as its root view.
|
|
60
|
+
@MainActor
|
|
61
|
+
public final class _UIHostingView: UIView {
|
|
62
|
+
var rootView: AnyView { didSet { _setNeedsTranslation() } }
|
|
63
|
+
|
|
64
|
+
init(rootView: AnyView) {
|
|
65
|
+
self.rootView = rootView
|
|
66
|
+
super.init(frame: .zero)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public required init?(coder: NSCoder) { return nil }
|
|
70
|
+
|
|
71
|
+
/// Measured by the page, like the controller's `sizeThatFits(in:)`.
|
|
72
|
+
public override func sizeThatFits(_ size: CGSize) -> CGSize {
|
|
73
|
+
Self.measuredSize(of: rootView, fitting: size)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// The root view's ideal size, measured by the page (zero until it is).
|
|
77
|
+
public override var intrinsicContentSize: CGSize {
|
|
78
|
+
_ViewMeasurements.shared.size(of: rootView, fitting: .unspecified) ?? .zero
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static func measuredSize(of view: AnyView, fitting size: CGSize) -> CGSize {
|
|
82
|
+
_ViewMeasurements.shared.size(of: view, fitting: ProposedViewSize(size)) ?? .zero
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// MARK: - Navigation controller delegate
|
|
87
|
+
|
|
88
|
+
/// What a navigation controller tells its delegate; kept (nothing calls it).
|
|
89
|
+
@MainActor
|
|
90
|
+
public protocol UINavigationControllerDelegate: AnyObject {
|
|
91
|
+
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool)
|
|
92
|
+
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
extension UINavigationControllerDelegate {
|
|
96
|
+
public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {}
|
|
97
|
+
public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// A view controller transition's coordinator (`viewWillTransition(to:with:)`); never used.
|
|
101
|
+
@MainActor
|
|
102
|
+
public protocol UIViewControllerTransitionCoordinator: AnyObject {}
|
|
103
|
+
|
|
104
|
+
// MARK: - Image picker
|
|
105
|
+
|
|
106
|
+
/// What an image picker tells its delegate. Cancelling dismisses the picker
|
|
107
|
+
/// unless the delegate says otherwise, as on iOS.
|
|
108
|
+
@MainActor
|
|
109
|
+
public protocol UIImagePickerControllerDelegate: AnyObject {
|
|
110
|
+
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any])
|
|
111
|
+
func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
extension UIImagePickerControllerDelegate {
|
|
115
|
+
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {}
|
|
116
|
+
public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
|
|
117
|
+
picker.dismiss(animated: true)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// The system's camera and photo picker: unavailable in the browser (see the
|
|
122
|
+
/// top of the file).
|
|
123
|
+
@MainActor
|
|
124
|
+
open class UIImagePickerController: UINavigationController {
|
|
125
|
+
public enum SourceType: Int, Sendable { case photoLibrary, camera, savedPhotosAlbum }
|
|
126
|
+
public enum CameraDevice: Int, Sendable { case rear, front }
|
|
127
|
+
public enum CameraCaptureMode: Int, Sendable { case photo, video }
|
|
128
|
+
public enum CameraFlashMode: Int, Sendable { case off = -1, auto = 0, on = 1 }
|
|
129
|
+
public enum QualityType: Int, Sendable { case typeHigh, typeMedium, typeLow, type640x480, typeIFrame1280x720, typeIFrame960x540 }
|
|
130
|
+
|
|
131
|
+
public struct InfoKey: Hashable, RawRepresentable, Sendable {
|
|
132
|
+
public let rawValue: String
|
|
133
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
134
|
+
public static let mediaType = InfoKey(rawValue: "UIImagePickerControllerMediaType")
|
|
135
|
+
public static let originalImage = InfoKey(rawValue: "UIImagePickerControllerOriginalImage")
|
|
136
|
+
public static let editedImage = InfoKey(rawValue: "UIImagePickerControllerEditedImage")
|
|
137
|
+
public static let cropRect = InfoKey(rawValue: "UIImagePickerControllerCropRect")
|
|
138
|
+
public static let mediaURL = InfoKey(rawValue: "UIImagePickerControllerMediaURL")
|
|
139
|
+
public static let imageURL = InfoKey(rawValue: "UIImagePickerControllerImageURL")
|
|
140
|
+
public static let mediaMetadata = InfoKey(rawValue: "UIImagePickerControllerMediaMetadata")
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
open weak var delegate: (any UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
|
|
144
|
+
open var sourceType: SourceType = .photoLibrary
|
|
145
|
+
open var mediaTypes: [String] = ["public.image"]
|
|
146
|
+
open var allowsEditing = false
|
|
147
|
+
open var cameraDevice: CameraDevice = .rear
|
|
148
|
+
open var cameraCaptureMode: CameraCaptureMode = .photo
|
|
149
|
+
open var cameraFlashMode: CameraFlashMode = .auto
|
|
150
|
+
open var videoQuality: QualityType = .typeMedium
|
|
151
|
+
open var videoMaximumDuration: TimeInterval = 600
|
|
152
|
+
open var showsCameraControls = true
|
|
153
|
+
|
|
154
|
+
/// False: the browser build has no camera or photo library to pick from.
|
|
155
|
+
open class func isSourceTypeAvailable(_ sourceType: SourceType) -> Bool { false }
|
|
156
|
+
open class func availableMediaTypes(for sourceType: SourceType) -> [String]? { nil }
|
|
157
|
+
open class func isCameraDeviceAvailable(_ cameraDevice: CameraDevice) -> Bool { false }
|
|
158
|
+
|
|
159
|
+
open func takePicture() {}
|
|
160
|
+
|
|
161
|
+
open override func loadView() {
|
|
162
|
+
view = _UIHostingView(rootView: AnyView(_ImagePickerUnavailableView(picker: self)))
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/// What a shown image picker draws.
|
|
167
|
+
private struct _ImagePickerUnavailableView: View {
|
|
168
|
+
let picker: UIImagePickerController
|
|
169
|
+
|
|
170
|
+
var body: some View {
|
|
171
|
+
VStack(spacing: 16) {
|
|
172
|
+
ContentUnavailableView(picker.sourceType == .camera ? "Camera Unavailable" : "Photos Unavailable",
|
|
173
|
+
systemImage: picker.sourceType == .camera ? "camera" : "photo",
|
|
174
|
+
description: Text("This app is running in a browser."))
|
|
175
|
+
Button("Cancel") {
|
|
176
|
+
if let delegate = picker.delegate {
|
|
177
|
+
delegate.imagePickerControllerDidCancel(picker)
|
|
178
|
+
} else {
|
|
179
|
+
picker.dismiss(animated: true)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
.padding()
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// On iOS UIKit's views, view controllers and presentation controllers are
|
|
2
|
+
// NSObjects, and NSObject is Equatable and Hashable: two objects are equal
|
|
3
|
+
// when they are the same object (`isEqual:`'s default) and hash by address.
|
|
4
|
+
// Code relies on it: `controllers.contains(controller)`, a `Set<UIView>`, a
|
|
5
|
+
// dictionary keyed by view (SwiftUI-Introspect walks ancestors that way).
|
|
6
|
+
// The shim's classes are not NSObjects, so they get the same identity
|
|
7
|
+
// conformances here.
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
extension UIView: Hashable {
|
|
12
|
+
nonisolated public static func == (lhs: UIView, rhs: UIView) -> Bool { lhs === rhs }
|
|
13
|
+
nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
extension UIViewController: Hashable {
|
|
17
|
+
nonisolated public static func == (lhs: UIViewController, rhs: UIViewController) -> Bool { lhs === rhs }
|
|
18
|
+
nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
extension UIPresentationController: Hashable {
|
|
22
|
+
nonisolated public static func == (lhs: UIPresentationController, rhs: UIPresentationController) -> Bool { lhs === rhs }
|
|
23
|
+
nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
|
|
24
|
+
}
|