@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,69 @@
|
|
|
1
|
+
// UIKit's alerts and action sheets, as code builds them: a
|
|
2
|
+
// `UIAlertController` with its title, message, actions and text fields. Like
|
|
3
|
+
// any presented view controller (Introspectable.swift), presenting one
|
|
4
|
+
// records it and shows nothing, so no action's handler is called; SwiftUI's
|
|
5
|
+
// `.alert` and `.confirmationDialog` are what the page shows.
|
|
6
|
+
|
|
7
|
+
import Foundation
|
|
8
|
+
import FoundationBridge
|
|
9
|
+
import SwiftUI
|
|
10
|
+
|
|
11
|
+
/// An alert's button: its title, style and handler.
|
|
12
|
+
@MainActor
|
|
13
|
+
open class UIAlertAction {
|
|
14
|
+
public enum Style: Int, Sendable {
|
|
15
|
+
case `default` = 0
|
|
16
|
+
case cancel = 1
|
|
17
|
+
case destructive = 2
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public let title: String?
|
|
21
|
+
public let style: Style
|
|
22
|
+
open var isEnabled = true
|
|
23
|
+
let handler: ((UIAlertAction) -> Void)?
|
|
24
|
+
|
|
25
|
+
public init(title: String?, style: Style, handler: ((UIAlertAction) -> Void)? = nil) {
|
|
26
|
+
self.title = title
|
|
27
|
+
self.style = style
|
|
28
|
+
self.handler = handler
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// An alert or action sheet. Presenting it shows nothing (see above).
|
|
33
|
+
@MainActor
|
|
34
|
+
open class UIAlertController: UIViewController {
|
|
35
|
+
public enum Style: Int, Sendable {
|
|
36
|
+
case actionSheet = 0
|
|
37
|
+
case alert = 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
open var message: String?
|
|
41
|
+
public let preferredStyle: Style
|
|
42
|
+
public private(set) var actions: [UIAlertAction] = []
|
|
43
|
+
open var preferredAction: UIAlertAction?
|
|
44
|
+
public private(set) var textFields: [UITextField]?
|
|
45
|
+
open var severity: UIAlertControllerSeverity = .default
|
|
46
|
+
|
|
47
|
+
public init(title: String?, message: String?, preferredStyle: Style) {
|
|
48
|
+
self.message = message
|
|
49
|
+
self.preferredStyle = preferredStyle
|
|
50
|
+
super.init(nibName: nil, bundle: nil)
|
|
51
|
+
self.title = title
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public required init?(coder: NSCoder) { nil }
|
|
55
|
+
|
|
56
|
+
open func addAction(_ action: UIAlertAction) { actions.append(action) }
|
|
57
|
+
|
|
58
|
+
open func addTextField(configurationHandler: ((UITextField) -> Void)? = nil) {
|
|
59
|
+
let field = UITextField()
|
|
60
|
+
configurationHandler?(field)
|
|
61
|
+
textFields = (textFields ?? []) + [field]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// How serious an alert is (Mac Catalyst); kept.
|
|
66
|
+
public enum UIAlertControllerSeverity: Int, Sendable {
|
|
67
|
+
case `default` = 0
|
|
68
|
+
case critical = 1
|
|
69
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// The application delegate, as SwiftUI apps adopt one with
|
|
2
|
+
// `@UIApplicationDelegateAdaptor`, and the UIKit types its methods name.
|
|
3
|
+
//
|
|
4
|
+
// The adaptor makes the delegate once, when the app is created, sets it as
|
|
5
|
+
// `UIApplication.shared.delegate`, and calls
|
|
6
|
+
// `application(_:willFinishLaunchingWithOptions:)` then
|
|
7
|
+
// `application(_:didFinishLaunchingWithOptions:)` (no launch options), as
|
|
8
|
+
// UIKit does before the first scene. The other methods are not called: the
|
|
9
|
+
// page gets no device token (RemoteNotifications.swift), no remote
|
|
10
|
+
// notifications or background fetches. The page's one scene connects after
|
|
11
|
+
// launching: the delegate's `configurationForConnecting` names the scene
|
|
12
|
+
// delegate class, which is made and told the scene connected, and an
|
|
13
|
+
// observable scene delegate goes in the environment, as SwiftUI does
|
|
14
|
+
// (SceneDelegates.swift). Responders here are only what a delegate inherits
|
|
15
|
+
// from; views do not take part in a responder chain. `buildMenu(with:)` is
|
|
16
|
+
// never called (there is no menu bar), and alternate app icons are not
|
|
17
|
+
// supported (a web page has one icon).
|
|
18
|
+
|
|
19
|
+
import Foundation
|
|
20
|
+
import FoundationBridge
|
|
21
|
+
import SwiftUI
|
|
22
|
+
|
|
23
|
+
/// What an app delegate inherits: an object in UIKit's responder chain.
|
|
24
|
+
@MainActor
|
|
25
|
+
open class UIResponder {
|
|
26
|
+
public required init() {}
|
|
27
|
+
|
|
28
|
+
/// Nil: views do not form a responder chain here.
|
|
29
|
+
open var next: UIResponder? { nil }
|
|
30
|
+
open var canBecomeFirstResponder: Bool { false }
|
|
31
|
+
open var isFirstResponder: Bool { false }
|
|
32
|
+
@discardableResult open func becomeFirstResponder() -> Bool { false }
|
|
33
|
+
@discardableResult open func resignFirstResponder() -> Bool { true }
|
|
34
|
+
|
|
35
|
+
/// Never called: there is no menu bar.
|
|
36
|
+
open func buildMenu(with builder: any UIMenuBuilder) {}
|
|
37
|
+
open func validate(_ command: UICommand) {}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// The app's delegate. Every method has a default; the adaptor calls the
|
|
41
|
+
/// launching ones (see the file comment).
|
|
42
|
+
@MainActor
|
|
43
|
+
public protocol UIApplicationDelegate: AnyObject {
|
|
44
|
+
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
|
|
45
|
+
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
|
|
46
|
+
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
|
|
47
|
+
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: any Error)
|
|
48
|
+
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult
|
|
49
|
+
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession,
|
|
50
|
+
options: UIScene.ConnectionOptions) -> UISceneConfiguration
|
|
51
|
+
func applicationDidBecomeActive(_ application: UIApplication)
|
|
52
|
+
func applicationWillResignActive(_ application: UIApplication)
|
|
53
|
+
func applicationDidEnterBackground(_ application: UIApplication)
|
|
54
|
+
func applicationWillEnterForeground(_ application: UIApplication)
|
|
55
|
+
func applicationWillTerminate(_ application: UIApplication)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
extension UIApplicationDelegate {
|
|
59
|
+
public func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { true }
|
|
60
|
+
public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { true }
|
|
61
|
+
public func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {}
|
|
62
|
+
public func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: any Error) {}
|
|
63
|
+
public func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult { .noData }
|
|
64
|
+
public func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession,
|
|
65
|
+
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
|
|
66
|
+
UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
|
|
67
|
+
}
|
|
68
|
+
public func applicationDidBecomeActive(_ application: UIApplication) {}
|
|
69
|
+
public func applicationWillResignActive(_ application: UIApplication) {}
|
|
70
|
+
public func applicationDidEnterBackground(_ application: UIApplication) {}
|
|
71
|
+
public func applicationWillEnterForeground(_ application: UIApplication) {}
|
|
72
|
+
public func applicationWillTerminate(_ application: UIApplication) {}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// What a background fetch or a remote notification's handling found.
|
|
76
|
+
public enum UIBackgroundFetchResult: UInt, Sendable {
|
|
77
|
+
case newData, noData, failed
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
extension UIApplication {
|
|
81
|
+
/// Keys of the launch options a delegate is handed (none in the browser).
|
|
82
|
+
public struct LaunchOptionsKey: Hashable, RawRepresentable, Sendable {
|
|
83
|
+
public let rawValue: String
|
|
84
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
85
|
+
public static let url = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsURLKey")
|
|
86
|
+
public static let remoteNotification = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsRemoteNotificationKey")
|
|
87
|
+
public static let shortcutItem = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsShortcutItemKey")
|
|
88
|
+
public static let userActivityDictionary = LaunchOptionsKey(rawValue: "UIApplicationLaunchOptionsUserActivityDictionaryKey")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// The app's delegate: the one `@UIApplicationDelegateAdaptor` made.
|
|
92
|
+
public var delegate: (any UIApplicationDelegate)? {
|
|
93
|
+
get { _UIApplicationDelegateStorage.delegate }
|
|
94
|
+
set { _UIApplicationDelegateStorage.delegate = newValue }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// False: a web page has one icon.
|
|
98
|
+
public var supportsAlternateIcons: Bool { false }
|
|
99
|
+
/// Nil: the primary icon.
|
|
100
|
+
public var alternateIconName: String? { nil }
|
|
101
|
+
|
|
102
|
+
/// Fails: alternate icons are not supported (the handler gets the error on the next turn).
|
|
103
|
+
public func setAlternateIconName(_ alternateIconName: String?, completionHandler: (@MainActor @Sendable ((any Error)?) -> Void)? = nil) {
|
|
104
|
+
guard let completionHandler else { return }
|
|
105
|
+
Task { @MainActor in completionHandler(Self.alternateIconsUnsupported) }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public func setAlternateIconName(_ alternateIconName: String?) async throws {
|
|
109
|
+
throw Self.alternateIconsUnsupported
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static var alternateIconsUnsupported: NSError {
|
|
113
|
+
NSError(domain: "NSCocoaErrorDomain", code: 3328,
|
|
114
|
+
userInfo: [NSLocalizedDescriptionKey: "Alternate app icons are not supported in the browser."])
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@MainActor
|
|
119
|
+
enum _UIApplicationDelegateStorage {
|
|
120
|
+
static var delegate: (any UIApplicationDelegate)?
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Makes the app's delegate (see the file comment).
|
|
124
|
+
@MainActor
|
|
125
|
+
@propertyWrapper
|
|
126
|
+
public struct UIApplicationDelegateAdaptor<DelegateType: UIResponder & UIApplicationDelegate>: DynamicProperty {
|
|
127
|
+
let delegate: DelegateType
|
|
128
|
+
|
|
129
|
+
public init(_ delegateType: DelegateType.Type = DelegateType.self) {
|
|
130
|
+
delegate = Self.launch { delegateType.init() }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/// The delegate made the first time; later adaptors (the app value made again) share it.
|
|
134
|
+
static func launch(_ make: () -> DelegateType) -> DelegateType {
|
|
135
|
+
if let existing = _UIApplicationDelegateStorage.delegate as? DelegateType { return existing }
|
|
136
|
+
let delegate = make()
|
|
137
|
+
_UIApplicationDelegateStorage.delegate = delegate
|
|
138
|
+
_ = delegate.application(UIApplication.shared, willFinishLaunchingWithOptions: nil)
|
|
139
|
+
_ = delegate.application(UIApplication.shared, didFinishLaunchingWithOptions: nil)
|
|
140
|
+
_SceneConnection.connect(delegate)
|
|
141
|
+
return delegate
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public var wrappedValue: DelegateType { delegate }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// MARK: - Menus
|
|
148
|
+
|
|
149
|
+
/// A menu bar's builder: there is no menu bar, so nothing is built.
|
|
150
|
+
@MainActor
|
|
151
|
+
public protocol UIMenuBuilder {
|
|
152
|
+
func menu(for identifier: UIMenu.Identifier) -> UIMenu?
|
|
153
|
+
func remove(menu removedIdentifier: UIMenu.Identifier)
|
|
154
|
+
func insertChild(_ childMenu: UIMenu, atStartOfMenu parentIdentifier: UIMenu.Identifier)
|
|
155
|
+
func insertChild(_ childMenu: UIMenu, atEndOfMenu parentIdentifier: UIMenu.Identifier)
|
|
156
|
+
func replace(menu replacedIdentifier: UIMenu.Identifier, with replacementMenu: UIMenu)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/// An element of a UIKit menu.
|
|
160
|
+
@MainActor
|
|
161
|
+
open class UIMenuElement {
|
|
162
|
+
public let title: String
|
|
163
|
+
public let image: UIImage?
|
|
164
|
+
|
|
165
|
+
init(title: String, image: UIImage?) {
|
|
166
|
+
self.title = title
|
|
167
|
+
self.image = image
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/// A UIKit menu: kept, never shown.
|
|
172
|
+
@MainActor
|
|
173
|
+
open class UIMenu: UIMenuElement {
|
|
174
|
+
public struct Identifier: Hashable, RawRepresentable, Sendable {
|
|
175
|
+
public let rawValue: String
|
|
176
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
177
|
+
public init(_ rawValue: String) { self.rawValue = rawValue }
|
|
178
|
+
public static let application = Identifier("com.apple.menu.application")
|
|
179
|
+
public static let file = Identifier("com.apple.menu.file")
|
|
180
|
+
public static let edit = Identifier("com.apple.menu.edit")
|
|
181
|
+
public static let view = Identifier("com.apple.menu.view")
|
|
182
|
+
public static let window = Identifier("com.apple.menu.window")
|
|
183
|
+
public static let help = Identifier("com.apple.menu.help")
|
|
184
|
+
public static let format = Identifier("com.apple.menu.format")
|
|
185
|
+
public static let document = Identifier("com.apple.menu.document")
|
|
186
|
+
public static let toolbar = Identifier("com.apple.menu.toolbar")
|
|
187
|
+
public static let close = Identifier("com.apple.menu.close")
|
|
188
|
+
public static let newScene = Identifier("com.apple.menu.new-scene")
|
|
189
|
+
public static let preferences = Identifier("com.apple.menu.preferences")
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public struct Options: OptionSet, Hashable, Sendable {
|
|
193
|
+
public let rawValue: UInt
|
|
194
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
195
|
+
public static let displayInline = Options(rawValue: 1 << 0)
|
|
196
|
+
public static let destructive = Options(rawValue: 1 << 1)
|
|
197
|
+
public static let singleSelection = Options(rawValue: 1 << 5)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public let identifier: Identifier
|
|
201
|
+
public let options: Options
|
|
202
|
+
public let children: [UIMenuElement]
|
|
203
|
+
|
|
204
|
+
public init(title: String = "", image: UIImage? = nil, identifier: Identifier? = nil, options: Options = [],
|
|
205
|
+
children: [UIMenuElement] = []) {
|
|
206
|
+
self.identifier = identifier ?? Identifier(UUID().uuidString)
|
|
207
|
+
self.options = options
|
|
208
|
+
self.children = children
|
|
209
|
+
super.init(title: title, image: image)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/// A menu command; kept, never shown.
|
|
214
|
+
@MainActor
|
|
215
|
+
open class UICommand: UIMenuElement {
|
|
216
|
+
public let action: FoundationBridge.Selector
|
|
217
|
+
|
|
218
|
+
public init(title: String, image: UIImage? = nil, action: FoundationBridge.Selector) {
|
|
219
|
+
self.action = action
|
|
220
|
+
super.init(title: title, image: image)
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// UIKit's appearance proxies: `UINavigationBar.appearance().barTintColor = …`
|
|
2
|
+
// styles every navigation bar on iOS. The page draws its own bars, tab bars
|
|
3
|
+
// and lists from SwiftUI's elements, and no UIKit view of a class reaches it
|
|
4
|
+
// (UIView.swift, Introspectable.swift), so here a proxy only records: what is
|
|
5
|
+
// set on it reads back from it, and nothing else changes. Ice Cubes' theme
|
|
6
|
+
// sets the bars' tint this way.
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import FoundationBridge
|
|
10
|
+
import SwiftUI
|
|
11
|
+
|
|
12
|
+
/// A type whose instances share settings through an appearance proxy.
|
|
13
|
+
@MainActor
|
|
14
|
+
public protocol UIAppearance: AnyObject {
|
|
15
|
+
/// The proxy for every instance of the class.
|
|
16
|
+
static func appearance() -> Self
|
|
17
|
+
/// The proxy for instances inside instances of `containerTypes` (outermost last).
|
|
18
|
+
static func appearance(whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self
|
|
19
|
+
/// The proxy for instances with `trait`'s traits.
|
|
20
|
+
static func appearance(for trait: UITraitCollection) -> Self
|
|
21
|
+
/// The proxy for instances with `trait`'s traits inside instances of `containerTypes`.
|
|
22
|
+
static func appearance(for trait: UITraitCollection,
|
|
23
|
+
whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// A type an appearance proxy can be scoped to: views and view controllers.
|
|
27
|
+
@MainActor
|
|
28
|
+
public protocol UIAppearanceContainer: AnyObject {}
|
|
29
|
+
|
|
30
|
+
extension UIView: UIAppearanceContainer {}
|
|
31
|
+
extension UIViewController: UIAppearanceContainer {}
|
|
32
|
+
|
|
33
|
+
/// The proxies made so far, one per class and scope, kept for the app's life.
|
|
34
|
+
@MainActor
|
|
35
|
+
enum _UIAppearanceProxies {
|
|
36
|
+
static var proxies: [String: UIView] = [:]
|
|
37
|
+
|
|
38
|
+
/// Unarchiving an empty archive: how a proxy of a class is made without
|
|
39
|
+
/// knowing its initializers (`init?(coder:)` is UIView's required one).
|
|
40
|
+
final class Coder: NSCoder {}
|
|
41
|
+
|
|
42
|
+
static func proxy<V: UIView>(_ type: V.Type, scope: String) -> V {
|
|
43
|
+
let key = "\(ObjectIdentifier(type).hashValue)|\(scope)"
|
|
44
|
+
if let proxy = proxies[key] as? V { return proxy }
|
|
45
|
+
guard let proxy = type.init(coder: Coder()) else {
|
|
46
|
+
fatalError("\(type).init(coder:) returned nil, so it has no appearance proxy")
|
|
47
|
+
}
|
|
48
|
+
proxies[key] = proxy
|
|
49
|
+
return proxy
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static func scope(_ containers: [any UIAppearanceContainer.Type], trait: UITraitCollection?) -> String {
|
|
53
|
+
let names = containers.map { String(reflecting: $0) }.joined(separator: ",")
|
|
54
|
+
return trait.map { "\(names)|\($0.userInterfaceStyle.rawValue)" } ?? names
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
extension UIView: UIAppearance {
|
|
59
|
+
/// The class's appearance proxy: an instance of the class, made once
|
|
60
|
+
/// (with `init?(coder:)` and an empty archive, the initializer every
|
|
61
|
+
/// view has), whose properties read back what the app set on them.
|
|
62
|
+
/// They are not copied to other instances: no UIKit view of the class is
|
|
63
|
+
/// drawn on the page, which follows SwiftUI's own styling.
|
|
64
|
+
public static func appearance() -> Self {
|
|
65
|
+
_UIAppearanceProxies.proxy(self, scope: "")
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// The proxy for views inside `containerTypes`, kept apart from the
|
|
69
|
+
/// class's own; recorded like it.
|
|
70
|
+
public static func appearance(whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self {
|
|
71
|
+
_UIAppearanceProxies.proxy(self, scope: _UIAppearanceProxies.scope(containerTypes, trait: nil))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// The proxy for views with `trait`'s interface style; recorded.
|
|
75
|
+
public static func appearance(for trait: UITraitCollection) -> Self {
|
|
76
|
+
_UIAppearanceProxies.proxy(self, scope: _UIAppearanceProxies.scope([], trait: trait))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// The proxy for views with `trait`'s interface style inside `containerTypes`; recorded.
|
|
80
|
+
public static func appearance(for trait: UITraitCollection,
|
|
81
|
+
whenContainedInInstancesOf containerTypes: [any UIAppearanceContainer.Type]) -> Self {
|
|
82
|
+
_UIAppearanceProxies.proxy(self, scope: _UIAppearanceProxies.scope(containerTypes, trait: trait))
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Converting between SwiftUI's `Color`, `UIColor` and Core Image's `CIColor`.
|
|
2
|
+
// A color with components converts exactly. A semantic color (the palette,
|
|
3
|
+
// `primary`, UIKit's semantic colors) becomes UIKit's semantic color of that
|
|
4
|
+
// name, which keeps following the color scheme through `Color(uiColor:)` and
|
|
5
|
+
// has its light-mode components; a color from the asset catalog is the
|
|
6
|
+
// page's to resolve, so it converts to black.
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import SwiftUI
|
|
10
|
+
|
|
11
|
+
extension UIColor {
|
|
12
|
+
/// The color's components (see the top of this file for semantic and catalog colors).
|
|
13
|
+
public convenience init(_ color: Color) {
|
|
14
|
+
guard case .object(let fields) = color._json else { self.init(white: 0, alpha: 1); return }
|
|
15
|
+
func number(_ key: String) -> CGFloat? {
|
|
16
|
+
if case .number(let value)? = fields[key] { return CGFloat(value) }
|
|
17
|
+
return nil
|
|
18
|
+
}
|
|
19
|
+
if let r = number("r"), let g = number("g"), let b = number("b") {
|
|
20
|
+
self.init(red: r, green: g, blue: b, alpha: number("a") ?? 1)
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
let opacity = number("a") ?? number("opacity") ?? 1
|
|
24
|
+
guard case .string(let name)? = fields["name"], let base = UIColor.semanticColors[name] else {
|
|
25
|
+
self.init(white: 0, alpha: opacity)
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
if let semantic = base.semantic {
|
|
29
|
+
self.init(semantic: semantic.name, opacity: opacity, red: base.red, green: base.green, blue: base.blue, alpha: base.alpha * opacity)
|
|
30
|
+
} else {
|
|
31
|
+
self.init(red: base.red, green: base.green, blue: base.blue, alpha: base.alpha * opacity)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// UIKit's color for each semantic `Color` name.
|
|
36
|
+
static let semanticColors: [String: UIColor] = {
|
|
37
|
+
var colors: [String: UIColor] = ["primary": .label, "secondary": .secondaryLabel, "clear": .clear,
|
|
38
|
+
// The app's accent color is the page's; system blue is its default.
|
|
39
|
+
"accent": UIColor(red: 0, green: 0.533, blue: 1, alpha: 1)]
|
|
40
|
+
let named: [UIColor] = [
|
|
41
|
+
.systemRed, .systemOrange, .systemYellow, .systemGreen, .systemMint, .systemTeal, .systemCyan, .systemBlue,
|
|
42
|
+
.systemIndigo, .systemPurple, .systemPink, .systemBrown, .systemGray,
|
|
43
|
+
.systemBackground, .secondarySystemBackground, .tertiarySystemBackground,
|
|
44
|
+
.systemGroupedBackground, .secondarySystemGroupedBackground, .tertiarySystemGroupedBackground,
|
|
45
|
+
.label, .secondaryLabel, .tertiaryLabel, .quaternaryLabel, .placeholderText, .separator, .opaqueSeparator,
|
|
46
|
+
.systemFill, .secondarySystemFill, .tertiarySystemFill, .quaternarySystemFill,
|
|
47
|
+
.systemGray2, .systemGray3, .systemGray4, .systemGray5, .systemGray6,
|
|
48
|
+
]
|
|
49
|
+
for color in named {
|
|
50
|
+
if let name = color.semantic?.name { colors[name] = color }
|
|
51
|
+
}
|
|
52
|
+
return colors
|
|
53
|
+
}()
|
|
54
|
+
|
|
55
|
+
public convenience init(ciColor: CIColor) {
|
|
56
|
+
self.init(red: ciColor.red, green: ciColor.green, blue: ciColor.blue, alpha: ciColor.alpha)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public var ciColor: CIColor { CIColor(color: self) }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
extension CIColor {
|
|
63
|
+
public convenience init(color: UIColor) {
|
|
64
|
+
self.init(red: color.red, green: color.green, blue: color.blue, alpha: color.alpha)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public convenience init(cgColor: CGColor) {
|
|
68
|
+
self.init(color: UIColor(cgColor: cgColor))
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// UIKit pieces that view controllers built in code use, as far as camera
|
|
2
|
+
// screens (CodeScanner's `ScannerViewController`) need them: buttons, touches,
|
|
3
|
+
// layout guides, supported orientations and presentation delegates.
|
|
4
|
+
//
|
|
5
|
+
// - `UIButton` keeps a title, title color, image and background image per
|
|
6
|
+
// state and is drawn as a SwiftUI `Button` (ViewTranslation.swift) whose tap
|
|
7
|
+
// sends the button's `.touchUpInside` and `.primaryActionTriggered` actions.
|
|
8
|
+
// - Touches are not delivered: the page's taps reach buttons and SwiftUI views,
|
|
9
|
+
// not `touchesBegan(_:with:)`, which views and controllers have to override.
|
|
10
|
+
// - A view's `safeAreaLayoutGuide` and `layoutMarginsGuide` are its own edges
|
|
11
|
+
// (the page lays the safe area out around the app; margins are not applied).
|
|
12
|
+
|
|
13
|
+
import Foundation
|
|
14
|
+
import FoundationBridge
|
|
15
|
+
import SwiftUI
|
|
16
|
+
|
|
17
|
+
extension UIControl {
|
|
18
|
+
public struct State: OptionSet, Hashable, Sendable {
|
|
19
|
+
public let rawValue: UInt
|
|
20
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
21
|
+
public static let normal = State([])
|
|
22
|
+
public static let highlighted = State(rawValue: 1 << 0)
|
|
23
|
+
public static let disabled = State(rawValue: 1 << 1)
|
|
24
|
+
public static let selected = State(rawValue: 1 << 2)
|
|
25
|
+
public static let focused = State(rawValue: 1 << 3)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// A button: drawn as a SwiftUI `Button` with its normal title and images.
|
|
30
|
+
@MainActor
|
|
31
|
+
open class UIButton: UIControl {
|
|
32
|
+
public enum ButtonType: Int, Sendable {
|
|
33
|
+
case custom = 0, system, detailDisclosure, infoLight, infoDark, contactAdd, close
|
|
34
|
+
public static let plain = ButtonType.system
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public let buttonType: ButtonType
|
|
38
|
+
private var titles: [UInt: String] = [:]
|
|
39
|
+
private var titleColors: [UInt: UIColor] = [:]
|
|
40
|
+
private var images: [UInt: UIImage] = [:]
|
|
41
|
+
private var backgroundImages: [UInt: UIImage] = [:]
|
|
42
|
+
|
|
43
|
+
public override init(frame: CGRect) {
|
|
44
|
+
buttonType = .custom
|
|
45
|
+
super.init(frame: frame)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public init(type buttonType: ButtonType) {
|
|
49
|
+
self.buttonType = buttonType
|
|
50
|
+
super.init(frame: .zero)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public required init?(coder: NSCoder) {
|
|
54
|
+
buttonType = .custom
|
|
55
|
+
super.init(coder: coder)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
open func setTitle(_ title: String?, for state: UIControl.State) {
|
|
59
|
+
titles[state.rawValue] = title
|
|
60
|
+
_setNeedsTranslation()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
open func setTitleColor(_ color: UIColor?, for state: UIControl.State) {
|
|
64
|
+
titleColors[state.rawValue] = color
|
|
65
|
+
_setNeedsTranslation()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
open func setImage(_ image: UIImage?, for state: UIControl.State) {
|
|
69
|
+
images[state.rawValue] = image
|
|
70
|
+
_setNeedsTranslation()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
open func setBackgroundImage(_ image: UIImage?, for state: UIControl.State) {
|
|
74
|
+
backgroundImages[state.rawValue] = image
|
|
75
|
+
_setNeedsTranslation()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// The value for `state`, else the normal state's, as UIKit falls back.
|
|
79
|
+
open func title(for state: UIControl.State) -> String? { titles[state.rawValue] ?? titles[0] }
|
|
80
|
+
open func titleColor(for state: UIControl.State) -> UIColor? { titleColors[state.rawValue] ?? titleColors[0] }
|
|
81
|
+
open func image(for state: UIControl.State) -> UIImage? { images[state.rawValue] ?? images[0] }
|
|
82
|
+
open func backgroundImage(for state: UIControl.State) -> UIImage? { backgroundImages[state.rawValue] ?? backgroundImages[0] }
|
|
83
|
+
|
|
84
|
+
open var currentTitle: String? { title(for: .normal) }
|
|
85
|
+
open var currentTitleColor: UIColor { titleColor(for: .normal) ?? (buttonType == .custom ? .white : tintColor) }
|
|
86
|
+
open var currentImage: UIImage? { image(for: .normal) }
|
|
87
|
+
open var currentBackgroundImage: UIImage? { backgroundImage(for: .normal) }
|
|
88
|
+
|
|
89
|
+
open override var intrinsicContentSize: CGSize {
|
|
90
|
+
let text = CGFloat(currentTitle?.count ?? 0) * 9
|
|
91
|
+
let image = currentImage?.size ?? .zero
|
|
92
|
+
let background = currentBackgroundImage?.size ?? .zero
|
|
93
|
+
return CGSize(width: max(text + image.width + (text > 0 ? 16 : 0), background.width, 30),
|
|
94
|
+
height: max(image.height, background.height, 30))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// What a tap does: the actions for `.touchUpInside` and `.primaryActionTriggered`.
|
|
98
|
+
public func _tap() {
|
|
99
|
+
guard isEnabled else { return }
|
|
100
|
+
sendActions(for: [.touchUpInside, .primaryActionTriggered])
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// MARK: - Touches
|
|
105
|
+
|
|
106
|
+
/// A finger on the screen. The page does not deliver touches to UIKit views.
|
|
107
|
+
@MainActor
|
|
108
|
+
open class UITouch {
|
|
109
|
+
public enum Phase: Int, Sendable { case began, moved, stationary, ended, cancelled }
|
|
110
|
+
public enum TouchType: Int, Sendable { case direct, indirect, pencil }
|
|
111
|
+
|
|
112
|
+
open var view: UIView?
|
|
113
|
+
open var window: UIWindow? { nil }
|
|
114
|
+
open var phase: Phase = .began
|
|
115
|
+
open var tapCount = 1
|
|
116
|
+
open var type: TouchType = .direct
|
|
117
|
+
open var timestamp: TimeInterval = 0
|
|
118
|
+
let point: CGPoint
|
|
119
|
+
|
|
120
|
+
public init() { point = .zero }
|
|
121
|
+
|
|
122
|
+
open func location(in view: UIView?) -> CGPoint { point }
|
|
123
|
+
open func previousLocation(in view: UIView?) -> CGPoint { point }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// An event's touches.
|
|
127
|
+
@MainActor
|
|
128
|
+
open class UIEvent {
|
|
129
|
+
public enum EventType: Int, Sendable { case touches, motion, remoteControl, presses }
|
|
130
|
+
open var type: EventType { .touches }
|
|
131
|
+
open var allTouches: Set<UITouch>? { nil }
|
|
132
|
+
open var timestamp: TimeInterval { 0 }
|
|
133
|
+
public init() {}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
extension UITouch: @preconcurrency Hashable {
|
|
137
|
+
nonisolated public static func == (lhs: UITouch, rhs: UITouch) -> Bool { lhs === rhs }
|
|
138
|
+
nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// MARK: - Layout guides
|
|
142
|
+
|
|
143
|
+
/// A rectangle constraints can refer to: here, its view's own edges.
|
|
144
|
+
@MainActor
|
|
145
|
+
open class UILayoutGuide {
|
|
146
|
+
public private(set) weak var owningView: UIView?
|
|
147
|
+
open var identifier = ""
|
|
148
|
+
|
|
149
|
+
public init() {}
|
|
150
|
+
init(owningView: UIView) { self.owningView = owningView }
|
|
151
|
+
|
|
152
|
+
open var layoutFrame: CGRect { owningView?.bounds ?? .zero }
|
|
153
|
+
|
|
154
|
+
/// The view the anchors are on (a guide no view owns anchors to nothing).
|
|
155
|
+
private var view: UIView { owningView ?? UIView(frame: .zero) }
|
|
156
|
+
|
|
157
|
+
public var topAnchor: NSLayoutYAxisAnchor { view.topAnchor }
|
|
158
|
+
public var bottomAnchor: NSLayoutYAxisAnchor { view.bottomAnchor }
|
|
159
|
+
public var centerYAnchor: NSLayoutYAxisAnchor { view.centerYAnchor }
|
|
160
|
+
public var leadingAnchor: NSLayoutXAxisAnchor { view.leadingAnchor }
|
|
161
|
+
public var trailingAnchor: NSLayoutXAxisAnchor { view.trailingAnchor }
|
|
162
|
+
public var leftAnchor: NSLayoutXAxisAnchor { view.leftAnchor }
|
|
163
|
+
public var rightAnchor: NSLayoutXAxisAnchor { view.rightAnchor }
|
|
164
|
+
public var centerXAnchor: NSLayoutXAxisAnchor { view.centerXAnchor }
|
|
165
|
+
public var widthAnchor: NSLayoutDimension { view.widthAnchor }
|
|
166
|
+
public var heightAnchor: NSLayoutDimension { view.heightAnchor }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// MARK: - Orientation
|
|
170
|
+
|
|
171
|
+
public struct UIInterfaceOrientationMask: OptionSet, Hashable, Sendable {
|
|
172
|
+
public let rawValue: UInt
|
|
173
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
174
|
+
public static let portrait = UIInterfaceOrientationMask(rawValue: 1 << 1)
|
|
175
|
+
public static let portraitUpsideDown = UIInterfaceOrientationMask(rawValue: 1 << 2)
|
|
176
|
+
public static let landscapeRight = UIInterfaceOrientationMask(rawValue: 1 << 3)
|
|
177
|
+
public static let landscapeLeft = UIInterfaceOrientationMask(rawValue: 1 << 4)
|
|
178
|
+
public static let landscape: UIInterfaceOrientationMask = [.landscapeLeft, .landscapeRight]
|
|
179
|
+
public static let all: UIInterfaceOrientationMask = [.portrait, .portraitUpsideDown, .landscapeLeft, .landscapeRight]
|
|
180
|
+
public static let allButUpsideDown: UIInterfaceOrientationMask = [.portrait, .landscapeLeft, .landscapeRight]
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/// The page's orientation: portrait, as the phone frame is.
|
|
184
|
+
public enum UIInterfaceOrientation: Int, Sendable {
|
|
185
|
+
case unknown = 0, portrait, portraitUpsideDown, landscapeLeft, landscapeRight
|
|
186
|
+
public var isPortrait: Bool { self == .portrait || self == .portraitUpsideDown }
|
|
187
|
+
public var isLandscape: Bool { self == .landscapeLeft || self == .landscapeRight }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
extension UIWindowScene {
|
|
191
|
+
public var interfaceOrientation: UIInterfaceOrientation { .portrait }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// MARK: - Presentation delegates
|
|
195
|
+
|
|
196
|
+
/// Told about a presentation the viewer dismissed. The page's presentations
|
|
197
|
+
/// are SwiftUI's, so it is never called for a UIKit one.
|
|
198
|
+
@MainActor
|
|
199
|
+
public protocol UIAdaptivePresentationControllerDelegate: AnyObject {
|
|
200
|
+
func presentationControllerDidDismiss(_ presentationController: UIPresentationController)
|
|
201
|
+
func presentationControllerWillDismiss(_ presentationController: UIPresentationController)
|
|
202
|
+
func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool
|
|
203
|
+
func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
extension UIAdaptivePresentationControllerDelegate {
|
|
207
|
+
public func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {}
|
|
208
|
+
public func presentationControllerWillDismiss(_ presentationController: UIPresentationController) {}
|
|
209
|
+
public func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { true }
|
|
210
|
+
public func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// MARK: - Images from a bundle
|
|
214
|
+
|
|
215
|
+
extension UIImage {
|
|
216
|
+
/// The catalog image `name` (the app's catalogs: a package's are not
|
|
217
|
+
/// published), whatever the bundle and configuration.
|
|
218
|
+
public convenience init?(named name: String, in bundle: FoundationBridge.Bundle?, with configuration: UIImage.Configuration?) {
|
|
219
|
+
self.init(named: name)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public convenience init?(named name: String, in bundle: FoundationBridge.Bundle?, compatibleWith traitCollection: UITraitCollection?) {
|
|
223
|
+
self.init(named: name)
|
|
224
|
+
}
|
|
225
|
+
}
|