@swiftbrowser/swift 0.1.0 → 0.3.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 +200 -9
- package/README.md +7 -9
- 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 +0 -4
- 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/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- 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 +24 -72
- 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/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 +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- 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 +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +68 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- 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 +104 -28
- 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 +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +125 -10
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +100 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +26 -10
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +71 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +88 -12
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +14 -4
- 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 +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +168 -39
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +86 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
- 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 +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -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 +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- 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/Toolbar.swift +52 -16
- 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 +46 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +524 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- 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 +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +41 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
// `UIViewRepresentable` and `UIViewControllerRepresentable`: UIKit views in
|
|
2
|
+
// a SwiftUI tree. On Apple platforms they are SwiftUI API that needs UIKit's
|
|
3
|
+
// types; here they live in UIKit (which `import SwiftUI` brings along), built
|
|
4
|
+
// from public SwiftUI alone, so the reconciler has no special case for them:
|
|
5
|
+
//
|
|
6
|
+
// - A representable's `body` is a `_UIViewRepresentableHost` (or the
|
|
7
|
+
// controller host), a view with `@State` storage: the runtime keeps it for
|
|
8
|
+
// as long as the node is mounted, as it keeps any view's state. Its body
|
|
9
|
+
// makes the coordinator and the view the first time, calls
|
|
10
|
+
// `updateUIView` on every pass (the parent re-ran with a new
|
|
11
|
+
// representable, as SwiftUI calls it when the representable's inputs
|
|
12
|
+
// change), and `.onDisappear` dismantles the view.
|
|
13
|
+
// - The UIKit view tree is drawn by a second view, `_UIKitTranslationHost`,
|
|
14
|
+
// whose body translates it into SwiftUI views (ViewTranslation.swift).
|
|
15
|
+
// Its own `@State` revision is bumped when something drawn in the tree
|
|
16
|
+
// changes outside a pass (a delegate callback, a timer: UIView.swift's
|
|
17
|
+
// `_setNeedsTranslation`), which renders that node again without calling
|
|
18
|
+
// `updateUIView`. Changes made while the representable runs (in
|
|
19
|
+
// `makeUIView` / `updateUIView` or the translation itself) need no bump.
|
|
20
|
+
// - The translation sits in a custom `Layout`, `_UIKitViewLayout`, which the
|
|
21
|
+
// page measures like any other: it answers the representable's
|
|
22
|
+
// `sizeThatFits` when that gives a size, else the translated content's
|
|
23
|
+
// own size (a label or image its natural size, a plain view, scroll view
|
|
24
|
+
// or text area the proposal). Placing it sets the root view's frame and
|
|
25
|
+
// lays the tree out (constraints, autoresizing, `layoutSubviews`), so the
|
|
26
|
+
// UIKit code sees the size SwiftUI gave it.
|
|
27
|
+
|
|
28
|
+
import Foundation
|
|
29
|
+
import SwiftUI
|
|
30
|
+
|
|
31
|
+
// MARK: - UIViewRepresentable
|
|
32
|
+
|
|
33
|
+
/// A UIKit view in a SwiftUI view tree.
|
|
34
|
+
@MainActor @preconcurrency
|
|
35
|
+
public protocol UIViewRepresentable: View {
|
|
36
|
+
associatedtype UIViewType: UIView
|
|
37
|
+
associatedtype Coordinator = Void
|
|
38
|
+
typealias Context = UIViewRepresentableContext<Self>
|
|
39
|
+
|
|
40
|
+
/// Makes the view, once per mounted representable.
|
|
41
|
+
func makeUIView(context: Context) -> UIViewType
|
|
42
|
+
/// Brings the view up to date with the representable; called after
|
|
43
|
+
/// `makeUIView` and whenever the parent passes a new representable.
|
|
44
|
+
func updateUIView(_ uiView: UIViewType, context: Context)
|
|
45
|
+
/// Called when the representable leaves the tree.
|
|
46
|
+
static func dismantleUIView(_ uiView: UIViewType, coordinator: Coordinator)
|
|
47
|
+
/// Makes the object `context.coordinator` is, before `makeUIView`.
|
|
48
|
+
func makeCoordinator() -> Coordinator
|
|
49
|
+
/// The size for a proposal, or nil for the view's own (see the top of the file).
|
|
50
|
+
func sizeThatFits(_ proposal: ProposedViewSize, uiView: UIViewType, context: Context) -> CGSize?
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
extension UIViewRepresentable where Coordinator == Void {
|
|
54
|
+
public func makeCoordinator() {}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
extension UIViewRepresentable {
|
|
58
|
+
public static func dismantleUIView(_ uiView: UIViewType, coordinator: Coordinator) {}
|
|
59
|
+
public func sizeThatFits(_ proposal: ProposedViewSize, uiView: UIViewType, context: Context) -> CGSize? { nil }
|
|
60
|
+
public var body: _UIViewRepresentableHost<Self> { _UIViewRepresentableHost(representable: self) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// What a representable's methods get: its coordinator and the environment.
|
|
64
|
+
@MainActor
|
|
65
|
+
public struct UIViewRepresentableContext<Representable: UIViewRepresentable> {
|
|
66
|
+
public let coordinator: Representable.Coordinator
|
|
67
|
+
public var transaction: Transaction
|
|
68
|
+
public var environment: EnvironmentValues
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// A representable's body: makes, updates and dismantles its view, and
|
|
72
|
+
/// draws it through `_UIKitTranslationHost`.
|
|
73
|
+
@MainActor
|
|
74
|
+
public struct _UIViewRepresentableHost<Representable: UIViewRepresentable>: View {
|
|
75
|
+
let representable: Representable
|
|
76
|
+
@State private var storage = _RepresentableStorage<Representable.UIViewType, Representable.Coordinator>()
|
|
77
|
+
@Environment(\.self) private var environment
|
|
78
|
+
|
|
79
|
+
public var body: some View {
|
|
80
|
+
let storage = self.storage
|
|
81
|
+
let representable = self.representable
|
|
82
|
+
storage.box.busy += 1
|
|
83
|
+
defer { storage.box.busy -= 1 }
|
|
84
|
+
if storage.view == nil {
|
|
85
|
+
let coordinator = representable.makeCoordinator()
|
|
86
|
+
storage.coordinator = coordinator
|
|
87
|
+
let context = UIViewRepresentableContext<Representable>(coordinator: coordinator, transaction: Transaction(),
|
|
88
|
+
environment: environment)
|
|
89
|
+
let view = representable.makeUIView(context: context)
|
|
90
|
+
storage.view = view
|
|
91
|
+
storage.box.root = view
|
|
92
|
+
}
|
|
93
|
+
let view = storage.view!
|
|
94
|
+
let context = UIViewRepresentableContext<Representable>(coordinator: storage.coordinator!, transaction: Transaction(),
|
|
95
|
+
environment: environment)
|
|
96
|
+
representable.updateUIView(view, context: context)
|
|
97
|
+
storage.box.sizeThatFits = { proposal in representable.sizeThatFits(proposal, uiView: view, context: context) }
|
|
98
|
+
storage.box.pass += 1
|
|
99
|
+
return _UIKitTranslationHost(box: storage.box, pass: storage.box.pass)
|
|
100
|
+
.onDisappear {
|
|
101
|
+
guard let view = storage.view, let coordinator = storage.coordinator else { return }
|
|
102
|
+
storage.box.detach()
|
|
103
|
+
storage.view = nil
|
|
104
|
+
storage.coordinator = nil
|
|
105
|
+
Representable.dismantleUIView(view, coordinator: coordinator)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/// A mounted representable's view and coordinator.
|
|
111
|
+
@MainActor
|
|
112
|
+
final class _RepresentableStorage<ViewType, Coordinator> {
|
|
113
|
+
var view: ViewType?
|
|
114
|
+
var coordinator: Coordinator?
|
|
115
|
+
let box = _UIKitHostBox()
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// MARK: - UIViewControllerRepresentable
|
|
119
|
+
|
|
120
|
+
/// A UIKit view controller in a SwiftUI view tree: its `view` is drawn as a
|
|
121
|
+
/// representable's is. The controller hears `viewWillAppear` /
|
|
122
|
+
/// `viewDidAppear` when it is first drawn and the disappear pair when it
|
|
123
|
+
/// leaves the tree; `dismiss(animated:)` on it (or on a controller it
|
|
124
|
+
/// presents nothing from) dismisses the SwiftUI presentation it is in.
|
|
125
|
+
@MainActor @preconcurrency
|
|
126
|
+
public protocol UIViewControllerRepresentable: View {
|
|
127
|
+
associatedtype UIViewControllerType: UIViewController
|
|
128
|
+
associatedtype Coordinator = Void
|
|
129
|
+
typealias Context = UIViewControllerRepresentableContext<Self>
|
|
130
|
+
|
|
131
|
+
func makeUIViewController(context: Context) -> UIViewControllerType
|
|
132
|
+
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context)
|
|
133
|
+
static func dismantleUIViewController(_ uiViewController: UIViewControllerType, coordinator: Coordinator)
|
|
134
|
+
func makeCoordinator() -> Coordinator
|
|
135
|
+
func sizeThatFits(_ proposal: ProposedViewSize, uiViewController: UIViewControllerType, context: Context) -> CGSize?
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
extension UIViewControllerRepresentable where Coordinator == Void {
|
|
139
|
+
public func makeCoordinator() {}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
extension UIViewControllerRepresentable {
|
|
143
|
+
public static func dismantleUIViewController(_ uiViewController: UIViewControllerType, coordinator: Coordinator) {}
|
|
144
|
+
public func sizeThatFits(_ proposal: ProposedViewSize, uiViewController: UIViewControllerType, context: Context) -> CGSize? { nil }
|
|
145
|
+
public var body: _UIViewControllerRepresentableHost<Self> { _UIViewControllerRepresentableHost(representable: self) }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@MainActor
|
|
149
|
+
public struct UIViewControllerRepresentableContext<Representable: UIViewControllerRepresentable> {
|
|
150
|
+
public let coordinator: Representable.Coordinator
|
|
151
|
+
public var transaction: Transaction
|
|
152
|
+
public var environment: EnvironmentValues
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// A controller representable's body, like `_UIViewRepresentableHost`.
|
|
156
|
+
@MainActor
|
|
157
|
+
public struct _UIViewControllerRepresentableHost<Representable: UIViewControllerRepresentable>: View {
|
|
158
|
+
let representable: Representable
|
|
159
|
+
@State private var storage = _RepresentableStorage<Representable.UIViewControllerType, Representable.Coordinator>()
|
|
160
|
+
@Environment(\.self) private var environment
|
|
161
|
+
|
|
162
|
+
public var body: some View {
|
|
163
|
+
let storage = self.storage
|
|
164
|
+
let representable = self.representable
|
|
165
|
+
storage.box.busy += 1
|
|
166
|
+
defer { storage.box.busy -= 1 }
|
|
167
|
+
var appearing = false
|
|
168
|
+
if storage.view == nil {
|
|
169
|
+
let coordinator = representable.makeCoordinator()
|
|
170
|
+
storage.coordinator = coordinator
|
|
171
|
+
let context = UIViewControllerRepresentableContext<Representable>(coordinator: coordinator, transaction: Transaction(),
|
|
172
|
+
environment: environment)
|
|
173
|
+
let controller = representable.makeUIViewController(context: context)
|
|
174
|
+
storage.view = controller
|
|
175
|
+
storage.box.root = controller.view
|
|
176
|
+
storage.box.controller = controller
|
|
177
|
+
appearing = true
|
|
178
|
+
}
|
|
179
|
+
let controller = storage.view!
|
|
180
|
+
let dismiss = environment.dismiss
|
|
181
|
+
controller._representableDismiss = { dismiss() }
|
|
182
|
+
let context = UIViewControllerRepresentableContext<Representable>(coordinator: storage.coordinator!, transaction: Transaction(),
|
|
183
|
+
environment: environment)
|
|
184
|
+
representable.updateUIViewController(controller, context: context)
|
|
185
|
+
if appearing { controller.viewWillAppear(false) }
|
|
186
|
+
storage.box.sizeThatFits = { proposal in representable.sizeThatFits(proposal, uiViewController: controller, context: context) }
|
|
187
|
+
storage.box.pass += 1
|
|
188
|
+
return _UIKitTranslationHost(box: storage.box, pass: storage.box.pass)
|
|
189
|
+
.onAppear { controller.viewDidAppear(false) }
|
|
190
|
+
.onDisappear {
|
|
191
|
+
guard let controller = storage.view, let coordinator = storage.coordinator else { return }
|
|
192
|
+
controller.viewWillDisappear(false)
|
|
193
|
+
storage.box.detach()
|
|
194
|
+
storage.view = nil
|
|
195
|
+
storage.coordinator = nil
|
|
196
|
+
controller._representableDismiss = nil
|
|
197
|
+
controller.viewDidDisappear(false)
|
|
198
|
+
Representable.dismantleUIViewController(controller, coordinator: coordinator)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// MARK: - Drawing
|
|
204
|
+
|
|
205
|
+
/// What the two halves of a representable share: the root view, whether a
|
|
206
|
+
/// representable is running (changes then need no render), how to render the
|
|
207
|
+
/// translation again, and the representable's own `sizeThatFits`.
|
|
208
|
+
@MainActor
|
|
209
|
+
final class _UIKitHostBox {
|
|
210
|
+
var root: UIView? {
|
|
211
|
+
didSet {
|
|
212
|
+
oldValue?._translationHook = nil
|
|
213
|
+
root?._translationHook = { [weak self] in self?.changed() }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/// The controller whose view `root` is, told about layout.
|
|
217
|
+
weak var controller: UIViewController?
|
|
218
|
+
/// Above zero while the representable or the translation runs.
|
|
219
|
+
var busy = 0
|
|
220
|
+
/// Counts the representable's passes, so the translation host's value
|
|
221
|
+
/// differs on each and re-runs with it.
|
|
222
|
+
var pass = 0
|
|
223
|
+
var sizeThatFits: (ProposedViewSize) -> CGSize? = { _ in nil }
|
|
224
|
+
/// Bumps the translation host's revision (set by its body).
|
|
225
|
+
var invalidate: (() -> Void)?
|
|
226
|
+
|
|
227
|
+
func changed() {
|
|
228
|
+
guard busy == 0 else { return }
|
|
229
|
+
invalidate?()
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
func detach() {
|
|
233
|
+
root?._translationHook = nil
|
|
234
|
+
invalidate = nil
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/// The layout placed the root at `size`: lay the tree out at that size
|
|
238
|
+
/// and draw it again if it changed.
|
|
239
|
+
func placed(size: CGSize) {
|
|
240
|
+
guard let root, root.bounds.size != size || root.frame.origin != .zero else { return }
|
|
241
|
+
busy += 1
|
|
242
|
+
controller?.viewWillLayoutSubviews()
|
|
243
|
+
root.frame = CGRect(origin: .zero, size: size)
|
|
244
|
+
root._layoutTree()
|
|
245
|
+
controller?.viewDidLayoutSubviews()
|
|
246
|
+
busy -= 1
|
|
247
|
+
changed()
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/// Draws a representable's view tree: lays it out and translates it. Its
|
|
252
|
+
/// revision is what a change outside a pass bumps.
|
|
253
|
+
struct _UIKitTranslationHost: View {
|
|
254
|
+
let box: _UIKitHostBox
|
|
255
|
+
let pass: Int
|
|
256
|
+
@State private var revision = 0
|
|
257
|
+
|
|
258
|
+
var body: some View {
|
|
259
|
+
let box = self.box
|
|
260
|
+
let revision = $revision
|
|
261
|
+
box.invalidate = { revision.wrappedValue &+= 1 }
|
|
262
|
+
box.busy += 1
|
|
263
|
+
defer { box.busy -= 1 }
|
|
264
|
+
guard let root = box.root else { return AnyView(EmptyView()) }
|
|
265
|
+
root._layoutTree()
|
|
266
|
+
return AnyView(_UIKitViewLayout(box: box) { _UIViewTranslator.view(for: root, isRoot: true) })
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/// Sizes and places a representable's drawing (see the top of the file).
|
|
271
|
+
struct _UIKitViewLayout: Layout {
|
|
272
|
+
let box: _UIKitHostBox
|
|
273
|
+
|
|
274
|
+
// The layout runs on the main actor (the page's event handler), but
|
|
275
|
+
// `Layout`'s requirements are nonisolated, as SwiftUI's are.
|
|
276
|
+
func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
|
|
277
|
+
let box = self.box
|
|
278
|
+
if let size = MainActor.assumeIsolated({ box.sizeThatFits(proposal) }) { return size }
|
|
279
|
+
guard let content = subviews.first else { return proposal.replacingUnspecifiedDimensions(by: .zero) }
|
|
280
|
+
return content.sizeThatFits(proposal)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
|
|
284
|
+
subviews.first?.place(at: bounds.origin, anchor: .topLeading, proposal: ProposedViewSize(bounds.size))
|
|
285
|
+
let box = self.box
|
|
286
|
+
MainActor.assumeIsolated { box.placed(size: bounds.size) }
|
|
287
|
+
}
|
|
288
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// The safe area of UIKit views. A view is in no window on the page
|
|
2
|
+
// ("UIKit views in SwiftUI"), and SwiftUI lays the page out inside the
|
|
3
|
+
// device's safe area itself, so a view's safe-area insets are zero (a
|
|
4
|
+
// window's too: the page does not report its insets to Swift).
|
|
5
|
+
|
|
6
|
+
import Foundation
|
|
7
|
+
import SwiftUI
|
|
8
|
+
|
|
9
|
+
extension UIView {
|
|
10
|
+
/// Zero (see the file comment).
|
|
11
|
+
public var safeAreaInsets: UIEdgeInsets { .zero }
|
|
12
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// Scene delegates, as apps declare them (`UIWindowSceneDelegate`, its
|
|
2
|
+
// session and connection options). The page is the app's one scene: after
|
|
3
|
+
// launching, `@UIApplicationDelegateAdaptor` connects it, making the delegate
|
|
4
|
+
// class the app delegate's configuration names and calling
|
|
5
|
+
// `scene(_:willConnectTo:options:)`, `sceneWillEnterForeground` and
|
|
6
|
+
// `sceneDidBecomeActive` (`_SceneConnection` below). The later lifecycle
|
|
7
|
+
// (background, disconnect) is not reported.
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import Observation
|
|
11
|
+
import SwiftUI
|
|
12
|
+
|
|
13
|
+
/// What a scene tells its delegate. Every method has a default that does nothing.
|
|
14
|
+
@MainActor
|
|
15
|
+
public protocol UISceneDelegate: AnyObject {
|
|
16
|
+
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
|
|
17
|
+
func sceneDidDisconnect(_ scene: UIScene)
|
|
18
|
+
func sceneDidBecomeActive(_ scene: UIScene)
|
|
19
|
+
func sceneWillResignActive(_ scene: UIScene)
|
|
20
|
+
func sceneWillEnterForeground(_ scene: UIScene)
|
|
21
|
+
func sceneDidEnterBackground(_ scene: UIScene)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
extension UISceneDelegate {
|
|
25
|
+
public func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}
|
|
26
|
+
public func sceneDidDisconnect(_ scene: UIScene) {}
|
|
27
|
+
public func sceneDidBecomeActive(_ scene: UIScene) {}
|
|
28
|
+
public func sceneWillResignActive(_ scene: UIScene) {}
|
|
29
|
+
public func sceneWillEnterForeground(_ scene: UIScene) {}
|
|
30
|
+
public func sceneDidEnterBackground(_ scene: UIScene) {}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// A scene delegate with a window (none in the browser).
|
|
34
|
+
@MainActor
|
|
35
|
+
public protocol UIWindowSceneDelegate: UISceneDelegate {
|
|
36
|
+
var window: UIWindow? { get set }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
extension UIWindowSceneDelegate {
|
|
40
|
+
public var window: UIWindow? {
|
|
41
|
+
get { nil }
|
|
42
|
+
set {}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// A scene's session: its role and configuration, kept.
|
|
47
|
+
@MainActor
|
|
48
|
+
open class UISceneSession {
|
|
49
|
+
public struct Role: RawRepresentable, Hashable, Sendable {
|
|
50
|
+
public let rawValue: String
|
|
51
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
52
|
+
public static let windowApplication = Role(rawValue: "UIWindowSceneSessionRoleApplication")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public let role: Role
|
|
56
|
+
public let persistentIdentifier: String
|
|
57
|
+
public var userInfo: [String: Any]?
|
|
58
|
+
|
|
59
|
+
public init(role: Role = .windowApplication) {
|
|
60
|
+
self.role = role
|
|
61
|
+
persistentIdentifier = UUID().uuidString
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// How a scene configuration names its delegate class, kept.
|
|
66
|
+
@MainActor
|
|
67
|
+
open class UISceneConfiguration {
|
|
68
|
+
public let name: String?
|
|
69
|
+
public let role: UISceneSession.Role
|
|
70
|
+
public var delegateClass: AnyClass?
|
|
71
|
+
/// Makes an instance of `delegateClass`. UIKit makes one through the
|
|
72
|
+
/// Objective-C runtime; Swift without it cannot call a class's `init()`
|
|
73
|
+
/// through a metatype unless the initializer is `required`, so the
|
|
74
|
+
/// staging rewrites `configuration.delegateClass = SceneDelegate.self`
|
|
75
|
+
/// into `_setDelegateClass(SceneDelegate.self) { SceneDelegate() }`.
|
|
76
|
+
public private(set) var _makeDelegate: (() -> AnyObject)?
|
|
77
|
+
|
|
78
|
+
public init(name: String?, sessionRole: UISceneSession.Role) {
|
|
79
|
+
self.name = name
|
|
80
|
+
role = sessionRole
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// `delegateClass = type`, with the way to make one (see `_makeDelegate`).
|
|
84
|
+
public func _setDelegateClass<T: AnyObject>(_ type: T.Type, make: @escaping () -> T) {
|
|
85
|
+
delegateClass = type
|
|
86
|
+
_makeDelegate = make
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
extension UIScene {
|
|
91
|
+
/// What the scene connected with: no URLs, activities or shortcut items in the browser.
|
|
92
|
+
@MainActor
|
|
93
|
+
open class ConnectionOptions {
|
|
94
|
+
public init() {}
|
|
95
|
+
open var urlContexts: Set<AnyHashable> { [] }
|
|
96
|
+
open var shortcutItem: UIApplicationShortcutItem? { nil }
|
|
97
|
+
open var sourceApplication: String? { nil }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// MARK: - Connecting the page's scene
|
|
102
|
+
|
|
103
|
+
@MainActor
|
|
104
|
+
enum _SceneConnection {
|
|
105
|
+
/// The page's scene delegate, made once (strongly held, as `UIScene.delegate` is).
|
|
106
|
+
static var delegate: AnyObject?
|
|
107
|
+
|
|
108
|
+
/// Connects the page's scene as UIKit does after launching: asks the app
|
|
109
|
+
/// delegate for the scene's configuration, makes its delegate class, and
|
|
110
|
+
/// tells the delegate the scene connected, entered the foreground and
|
|
111
|
+
/// became active. SwiftUI puts a scene delegate that is `Observable` or an
|
|
112
|
+
/// `ObservableObject` in the environment, so `@Environment(SceneDelegate.self)`
|
|
113
|
+
/// finds it.
|
|
114
|
+
static func connect(_ appDelegate: any UIApplicationDelegate) {
|
|
115
|
+
guard delegate == nil else { return }
|
|
116
|
+
let session = UISceneSession(role: .windowApplication)
|
|
117
|
+
let configuration = appDelegate.application(UIApplication.shared, configurationForConnecting: session, options: UIScene.ConnectionOptions())
|
|
118
|
+
guard let make = configuration._makeDelegate else { return }
|
|
119
|
+
let sceneDelegate = make()
|
|
120
|
+
delegate = sceneDelegate
|
|
121
|
+
let scene = UIApplication.pageScene
|
|
122
|
+
scene.delegate = sceneDelegate as? any UISceneDelegate
|
|
123
|
+
if let sceneDelegate = sceneDelegate as? any UISceneDelegate {
|
|
124
|
+
sceneDelegate.scene(scene, willConnectTo: session, options: UIScene.ConnectionOptions())
|
|
125
|
+
sceneDelegate.sceneWillEnterForeground(scene)
|
|
126
|
+
sceneDelegate.sceneDidBecomeActive(scene)
|
|
127
|
+
}
|
|
128
|
+
if sceneDelegate is any Observable || sceneDelegate is any ObservableObject {
|
|
129
|
+
_Runtime.shared._addRootEnvironmentObject(sceneDelegate)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// UIKit's scenes, as code that looks for "the current window scene" uses
|
|
2
|
+
// them (to present StoreKit's sheets near it, say). The page is the app's
|
|
3
|
+
// one scene: `UIApplication.shared.connectedScenes` holds a single
|
|
4
|
+
// `UIWindowScene`, always foreground-active. It has no `UIWindow`s, since
|
|
5
|
+
// SwiftUI draws the page, so `windows` is empty and `keyWindow` nil.
|
|
6
|
+
|
|
7
|
+
import SwiftUI
|
|
8
|
+
|
|
9
|
+
/// A scene: one instance of the app's interface.
|
|
10
|
+
@MainActor
|
|
11
|
+
open class UIScene: Hashable {
|
|
12
|
+
public enum ActivationState: Int, Sendable {
|
|
13
|
+
case unattached = -1, foregroundActive = 0, foregroundInactive = 1, background = 2
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public init() {}
|
|
17
|
+
|
|
18
|
+
open var activationState: ActivationState { .foregroundActive }
|
|
19
|
+
/// The scene's delegate: the app delegate's configuration names its class (SceneDelegates.swift).
|
|
20
|
+
open var delegate: (any UISceneDelegate)?
|
|
21
|
+
open var title: String! = ""
|
|
22
|
+
|
|
23
|
+
nonisolated public static func == (lhs: UIScene, rhs: UIScene) -> Bool { lhs === rhs }
|
|
24
|
+
nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// A scene with windows: in the browser, the page.
|
|
28
|
+
@MainActor
|
|
29
|
+
open class UIWindowScene: UIScene {
|
|
30
|
+
open var windows: [UIWindow] { [] }
|
|
31
|
+
open var keyWindow: UIWindow? { nil }
|
|
32
|
+
open var screen: UIScreen { .main }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
extension UIApplication {
|
|
36
|
+
static let pageScene = UIWindowScene()
|
|
37
|
+
|
|
38
|
+
/// The page, the app's only scene.
|
|
39
|
+
public var connectedScenes: Set<UIScene> { [UIApplication.pageScene] }
|
|
40
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// `UIScrollView` and its delegate. A representable's scroll view is drawn as
|
|
2
|
+
// a SwiftUI `ScrollView` over its subviews when its content is larger than
|
|
3
|
+
// its bounds, else as a plain container (ViewTranslation.swift). Zooming is
|
|
4
|
+
// state: `setZoomScale` and `zoom(to:animated:)` set the scale and offset and
|
|
5
|
+
// tell the delegate at once, and the page draws the delegate's
|
|
6
|
+
// `viewForZooming` scaled about the visible rectangle's center. Pinching,
|
|
7
|
+
// panning a zoomed view and reading the user's scroll offset back are not
|
|
8
|
+
// there (`contentOffset` only changes when the app sets it).
|
|
9
|
+
|
|
10
|
+
import Foundation
|
|
11
|
+
import SwiftUI
|
|
12
|
+
|
|
13
|
+
/// Distances inside a rectangle's edges.
|
|
14
|
+
public struct UIEdgeInsets: Hashable, Sendable {
|
|
15
|
+
public var top: CGFloat
|
|
16
|
+
public var left: CGFloat
|
|
17
|
+
public var bottom: CGFloat
|
|
18
|
+
public var right: CGFloat
|
|
19
|
+
|
|
20
|
+
public init(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) {
|
|
21
|
+
(self.top, self.left, self.bottom, self.right) = (top, left, bottom, right)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public init() { self.init(top: 0, left: 0, bottom: 0, right: 0) }
|
|
25
|
+
|
|
26
|
+
public static let zero = UIEdgeInsets()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// What a scroll view tells its delegate. Every method has a default (they
|
|
30
|
+
/// are `@objc optional` on iOS).
|
|
31
|
+
@MainActor
|
|
32
|
+
public protocol UIScrollViewDelegate: AnyObject {
|
|
33
|
+
func scrollViewDidScroll(_ scrollView: UIScrollView)
|
|
34
|
+
func scrollViewDidZoom(_ scrollView: UIScrollView)
|
|
35
|
+
func scrollViewWillBeginDragging(_ scrollView: UIScrollView)
|
|
36
|
+
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
|
|
37
|
+
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
|
|
38
|
+
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)
|
|
39
|
+
func viewForZooming(in scrollView: UIScrollView) -> UIView?
|
|
40
|
+
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?)
|
|
41
|
+
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
|
|
42
|
+
func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool
|
|
43
|
+
func scrollViewDidScrollToTop(_ scrollView: UIScrollView)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
extension UIScrollViewDelegate {
|
|
47
|
+
public func scrollViewDidScroll(_ scrollView: UIScrollView) {}
|
|
48
|
+
public func scrollViewDidZoom(_ scrollView: UIScrollView) {}
|
|
49
|
+
public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {}
|
|
50
|
+
public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {}
|
|
51
|
+
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {}
|
|
52
|
+
public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {}
|
|
53
|
+
public func viewForZooming(in scrollView: UIScrollView) -> UIView? { nil }
|
|
54
|
+
public func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {}
|
|
55
|
+
public func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {}
|
|
56
|
+
public func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool { true }
|
|
57
|
+
public func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/// Gives `UIScrollView` its `delegate` from a protocol extension, so that
|
|
61
|
+
/// `UITextView` can declare a `delegate` of its own delegate type (Swift
|
|
62
|
+
/// cannot override a property with another type, as Objective-C UIKit does).
|
|
63
|
+
@MainActor
|
|
64
|
+
public protocol _UIScrollViewDelegating: AnyObject {}
|
|
65
|
+
|
|
66
|
+
extension _UIScrollViewDelegating where Self: UIScrollView {
|
|
67
|
+
public var delegate: UIScrollViewDelegate? {
|
|
68
|
+
get { _scrollDelegate }
|
|
69
|
+
set { _scrollDelegate = newValue }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// A scroll view: drawn as a `ScrollView` when a representable shows it;
|
|
74
|
+
/// offset, insets and zoom kept (see the top of the file).
|
|
75
|
+
@MainActor
|
|
76
|
+
open class UIScrollView: UIView, _UIScrollViewDelegating {
|
|
77
|
+
public enum KeyboardDismissMode: Int, Sendable { case none, onDrag, interactive, onDragWithAccessory, interactiveWithAccessory }
|
|
78
|
+
public enum ContentInsetAdjustmentBehavior: Int, Sendable { case automatic, scrollableAxes, never, always }
|
|
79
|
+
public enum IndicatorStyle: Int, Sendable { case `default`, black, white }
|
|
80
|
+
|
|
81
|
+
/// The delegate (`delegate`, from `_UIScrollViewDelegating`).
|
|
82
|
+
weak var _scrollDelegate: UIScrollViewDelegate?
|
|
83
|
+
open var contentOffset: CGPoint = .zero {
|
|
84
|
+
didSet {
|
|
85
|
+
guard contentOffset != oldValue else { return }
|
|
86
|
+
_setNeedsTranslation()
|
|
87
|
+
_scrollDelegate?.scrollViewDidScroll(self)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
open var contentSize: CGSize = .zero { didSet { _setNeedsTranslation() } }
|
|
91
|
+
open var contentInset: UIEdgeInsets = .zero { didSet { _setNeedsTranslation() } }
|
|
92
|
+
open var adjustedContentInset: UIEdgeInsets { contentInset }
|
|
93
|
+
open var contentInsetAdjustmentBehavior: ContentInsetAdjustmentBehavior = .automatic
|
|
94
|
+
open var scrollIndicatorInsets: UIEdgeInsets = .zero
|
|
95
|
+
open var verticalScrollIndicatorInsets: UIEdgeInsets = .zero
|
|
96
|
+
open var horizontalScrollIndicatorInsets: UIEdgeInsets = .zero
|
|
97
|
+
open var indicatorStyle: IndicatorStyle = .default
|
|
98
|
+
open var isScrollEnabled = true { didSet { _setNeedsTranslation() } }
|
|
99
|
+
open var isPagingEnabled = false
|
|
100
|
+
open var isDirectionalLockEnabled = false
|
|
101
|
+
open var bounces = true
|
|
102
|
+
open var alwaysBounceVertical = false
|
|
103
|
+
open var alwaysBounceHorizontal = false
|
|
104
|
+
open var showsVerticalScrollIndicator = true { didSet { _setNeedsTranslation() } }
|
|
105
|
+
open var showsHorizontalScrollIndicator = true { didSet { _setNeedsTranslation() } }
|
|
106
|
+
open var scrollsToTop = true
|
|
107
|
+
open var keyboardDismissMode: KeyboardDismissMode = .none
|
|
108
|
+
open var decelerationRate: CGFloat = 0.998
|
|
109
|
+
open var minimumZoomScale: CGFloat = 1
|
|
110
|
+
open var maximumZoomScale: CGFloat = 1
|
|
111
|
+
open var bouncesZoom = true
|
|
112
|
+
open var zoomScale: CGFloat {
|
|
113
|
+
get { storedZoomScale }
|
|
114
|
+
set { setZoomScale(newValue, animated: false) }
|
|
115
|
+
}
|
|
116
|
+
public var isTracking: Bool { false }
|
|
117
|
+
public var isDragging: Bool { false }
|
|
118
|
+
public var isDecelerating: Bool { false }
|
|
119
|
+
public var isZooming: Bool { false }
|
|
120
|
+
public var isZoomBouncing: Bool { false }
|
|
121
|
+
private var storedZoomScale: CGFloat = 1
|
|
122
|
+
|
|
123
|
+
open func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
|
|
124
|
+
self.contentOffset = contentOffset
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
open func scrollRectToVisible(_ rect: CGRect, animated: Bool) {
|
|
128
|
+
var offset = contentOffset
|
|
129
|
+
if rect.minX < offset.x { offset.x = rect.minX } else if rect.maxX > offset.x + bounds.width { offset.x = rect.maxX - bounds.width }
|
|
130
|
+
if rect.minY < offset.y { offset.y = rect.minY } else if rect.maxY > offset.y + bounds.height { offset.y = rect.maxY - bounds.height }
|
|
131
|
+
contentOffset = offset
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// Sets the scale (within the minimum and maximum) and tells the delegate
|
|
135
|
+
/// it zoomed and ended zooming, as a finished gesture would.
|
|
136
|
+
open func setZoomScale(_ scale: CGFloat, animated: Bool) {
|
|
137
|
+
let clamped = min(max(scale, minimumZoomScale), max(minimumZoomScale, maximumZoomScale))
|
|
138
|
+
guard clamped != storedZoomScale else { return }
|
|
139
|
+
let zoomed = _scrollDelegate?.viewForZooming(in: self)
|
|
140
|
+
_scrollDelegate?.scrollViewWillBeginZooming(self, with: zoomed)
|
|
141
|
+
storedZoomScale = clamped
|
|
142
|
+
_setNeedsTranslation()
|
|
143
|
+
_scrollDelegate?.scrollViewDidZoom(self)
|
|
144
|
+
_scrollDelegate?.scrollViewDidEndZooming(self, with: zoomed, atScale: clamped)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/// Zooms so that `rect` (in the zoomed view's unscaled coordinates) fills the bounds.
|
|
148
|
+
open func zoom(to rect: CGRect, animated: Bool) {
|
|
149
|
+
guard rect.width > 0, rect.height > 0 else { return }
|
|
150
|
+
let scale = min(bounds.width / rect.width, bounds.height / rect.height)
|
|
151
|
+
setZoomScale(scale, animated: animated)
|
|
152
|
+
contentOffset = CGPoint(x: max(0, rect.midX * zoomScale - bounds.width / 2),
|
|
153
|
+
y: max(0, rect.midY * zoomScale - bounds.height / 2))
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
open func flashScrollIndicators() {}
|
|
157
|
+
}
|