@swiftbrowser/swift 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,855 @@
|
|
|
1
|
+
// UIKit's view classes. Packages that serve both UIKit and SwiftUI apps
|
|
2
|
+
// declare UIKit views next to their SwiftUI ones (NukeUI's `LazyImageView`
|
|
3
|
+
// next to `LazyImage`), and apps put UIKit views on screen with
|
|
4
|
+
// `UIViewRepresentable` (Representable.swift). The classes keep their state
|
|
5
|
+
// (frames, subviews, images, constraints); the page draws a view that a
|
|
6
|
+
// representable shows by translating it into SwiftUI views
|
|
7
|
+
// (ViewTranslation.swift). A change to something drawn tells that
|
|
8
|
+
// representable, so a change made outside a SwiftUI pass (a delegate
|
|
9
|
+
// callback, a timer) is drawn too. Constraints are solved for the simple
|
|
10
|
+
// cases: an edge, center or size equal to the superview's, a sibling's or a
|
|
11
|
+
// constant. Layers draw their color, corner radius, border and opacity (and
|
|
12
|
+
// a layer that draws itself, AVFoundation's `AVPlayerLayer`, its video);
|
|
13
|
+
// nothing animates. A layer is displayed before its view is first drawn, and
|
|
14
|
+
// `setNeedsDisplay()` displays it again at once: its view's `display(_:)`
|
|
15
|
+
// runs, so a view that shows its content from there (Gifu's `GIFImageView`,
|
|
16
|
+
// a frame at a time) is drawn with it.
|
|
17
|
+
|
|
18
|
+
import Foundation
|
|
19
|
+
import FoundationBridge
|
|
20
|
+
import SwiftUI
|
|
21
|
+
|
|
22
|
+
// MARK: - Layers and animations
|
|
23
|
+
|
|
24
|
+
/// A layer: its properties, kept. Its view draws the background color, corner
|
|
25
|
+
/// radius, border and opacity (ViewTranslation.swift); nothing is animated.
|
|
26
|
+
open class CALayer: @unchecked Sendable {
|
|
27
|
+
open var frame: CGRect = .zero
|
|
28
|
+
open var bounds: CGRect = .zero
|
|
29
|
+
open var backgroundColor: CGColor? { didSet { _changed() } }
|
|
30
|
+
open var cornerRadius: CGFloat = 0 { didSet { _changed() } }
|
|
31
|
+
open var masksToBounds = false { didSet { _changed() } }
|
|
32
|
+
open var opacity: Float = 1 { didSet { _changed() } }
|
|
33
|
+
open var isHidden = false { didSet { _changed() } }
|
|
34
|
+
open var borderWidth: CGFloat = 0 { didSet { _changed() } }
|
|
35
|
+
open var borderColor: CGColor? { didSet { _changed() } }
|
|
36
|
+
open var shadowOpacity: Float = 0
|
|
37
|
+
open var shadowRadius: CGFloat = 3
|
|
38
|
+
open var shadowColor: CGColor?
|
|
39
|
+
open var shadowOffset: CGSize = CGSize(width: 0, height: -3)
|
|
40
|
+
open var contents: Any?
|
|
41
|
+
public private(set) var animations: [String: CAAnimation] = [:]
|
|
42
|
+
/// The view this is the layer of, told when something drawn changes.
|
|
43
|
+
weak var _view: UIView?
|
|
44
|
+
/// Asked to display the layer's content: its view, as on iOS.
|
|
45
|
+
open weak var delegate: (any CALayerDelegate)?
|
|
46
|
+
private var displayRequested = false
|
|
47
|
+
private var isDisplaying = false
|
|
48
|
+
/// Whether the layer was displayed once; the page displays it before
|
|
49
|
+
/// drawing it the first time, as iOS does a view's layer.
|
|
50
|
+
public private(set) var _hasDisplayed = false
|
|
51
|
+
/// Sublayers are kept; of their content only a `_drawing` is drawn.
|
|
52
|
+
public private(set) var sublayers: [CALayer]?
|
|
53
|
+
public private(set) weak var superlayer: CALayer?
|
|
54
|
+
|
|
55
|
+
/// Required, so a view can make its `layerClass`.
|
|
56
|
+
public required init() {}
|
|
57
|
+
|
|
58
|
+
/// What the layer draws, as SwiftUI, or nil (the default: a layer's own
|
|
59
|
+
/// content is not drawn). AVFoundation's `AVPlayerLayer` answers its
|
|
60
|
+
/// player's video; the view whose layer (or sublayer) it is draws it
|
|
61
|
+
/// filling its bounds (ViewTranslation.swift).
|
|
62
|
+
open var _drawing: AnyView? { nil }
|
|
63
|
+
|
|
64
|
+
open func addSublayer(_ layer: CALayer) {
|
|
65
|
+
insertSublayer(layer, at: UInt32(sublayers?.count ?? 0))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
open func insertSublayer(_ layer: CALayer, at index: UInt32) {
|
|
69
|
+
layer.removeFromSuperlayer()
|
|
70
|
+
var list = sublayers ?? []
|
|
71
|
+
list.insert(layer, at: min(Int(index), list.count))
|
|
72
|
+
sublayers = list
|
|
73
|
+
layer.superlayer = self
|
|
74
|
+
_changed()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
open func insertSublayer(_ layer: CALayer, below sibling: CALayer?) {
|
|
78
|
+
let index = sibling.flatMap { sibling in sublayers?.firstIndex { $0 === sibling } } ?? 0
|
|
79
|
+
insertSublayer(layer, at: UInt32(index))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
open func insertSublayer(_ layer: CALayer, above sibling: CALayer?) {
|
|
83
|
+
let index = sibling.flatMap { sibling in sublayers?.firstIndex { $0 === sibling }.map { $0 + 1 } } ?? (sublayers?.count ?? 0)
|
|
84
|
+
insertSublayer(layer, at: UInt32(index))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
open func replaceSublayer(_ oldLayer: CALayer, with newLayer: CALayer) {
|
|
88
|
+
guard let index = sublayers?.firstIndex(where: { $0 === oldLayer }) else { return }
|
|
89
|
+
oldLayer.removeFromSuperlayer()
|
|
90
|
+
insertSublayer(newLayer, at: UInt32(index))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
open func removeFromSuperlayer() {
|
|
94
|
+
guard let parent = superlayer else { return }
|
|
95
|
+
parent.sublayers?.removeAll { $0 === self }
|
|
96
|
+
superlayer = nil
|
|
97
|
+
parent._changed()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// Displays the layer: its delegate's `display(_:)` runs at once (on
|
|
101
|
+
/// iOS it waits for the frame's commit, a turn of the run loop later). A
|
|
102
|
+
/// request made while the layer displays is part of that display.
|
|
103
|
+
open func setNeedsDisplay() {
|
|
104
|
+
displayRequested = true
|
|
105
|
+
guard !isDisplaying else { return }
|
|
106
|
+
displayIfNeeded()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
open func setNeedsDisplay(_ rect: CGRect) { setNeedsDisplay() }
|
|
110
|
+
|
|
111
|
+
open func needsDisplay() -> Bool { displayRequested }
|
|
112
|
+
|
|
113
|
+
open func displayIfNeeded() {
|
|
114
|
+
guard displayRequested else { return }
|
|
115
|
+
display()
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// Asks the delegate to display the layer.
|
|
119
|
+
open func display() {
|
|
120
|
+
displayRequested = false
|
|
121
|
+
_hasDisplayed = true
|
|
122
|
+
guard let delegate else { return }
|
|
123
|
+
isDisplaying = true
|
|
124
|
+
defer {
|
|
125
|
+
isDisplaying = false
|
|
126
|
+
displayRequested = false
|
|
127
|
+
}
|
|
128
|
+
MainActor.assumeIsolated { delegate.display(self) }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
open func add(_ animation: CAAnimation, forKey key: String?) {
|
|
132
|
+
if let key { animations[key] = animation }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
open func removeAnimation(forKey key: String) { animations[key] = nil }
|
|
136
|
+
open func removeAllAnimations() { animations = [:] }
|
|
137
|
+
|
|
138
|
+
/// Tells the view this layer (or its nearest superlayer) belongs to that
|
|
139
|
+
/// something drawn changed. Subclasses call it for their own properties.
|
|
140
|
+
public func _changed() {
|
|
141
|
+
var layer: CALayer? = self
|
|
142
|
+
while let current = layer, current._view == nil { layer = current.superlayer }
|
|
143
|
+
guard let view = layer?._view else { return }
|
|
144
|
+
MainActor.assumeIsolated { view._setNeedsTranslation() }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/// What a layer asks of its view. `UIView` implements `display(_:)`; a view
|
|
149
|
+
/// that overrides it shows its content from there.
|
|
150
|
+
@MainActor
|
|
151
|
+
public protocol CALayerDelegate: AnyObject {
|
|
152
|
+
func display(_ layer: CALayer)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
open class CAAnimation: @unchecked Sendable {
|
|
156
|
+
open var duration: TimeInterval = 0.25
|
|
157
|
+
open var beginTime: TimeInterval = 0
|
|
158
|
+
open var repeatCount: Float = 0
|
|
159
|
+
open var autoreverses = false
|
|
160
|
+
open var isRemovedOnCompletion = true
|
|
161
|
+
|
|
162
|
+
public init() {}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
open class CAPropertyAnimation: CAAnimation, @unchecked Sendable {
|
|
166
|
+
open var keyPath: String?
|
|
167
|
+
|
|
168
|
+
public convenience init(keyPath path: String?) {
|
|
169
|
+
self.init()
|
|
170
|
+
keyPath = path
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
open class CABasicAnimation: CAPropertyAnimation, @unchecked Sendable {
|
|
175
|
+
open var fromValue: Any?
|
|
176
|
+
open var toValue: Any?
|
|
177
|
+
open var byValue: Any?
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// MARK: - Layout constraints
|
|
181
|
+
|
|
182
|
+
/// What an anchor stands for.
|
|
183
|
+
enum _LayoutAttribute: Sendable {
|
|
184
|
+
case none, leading, trailing, centerX, width, top, bottom, centerY, height
|
|
185
|
+
|
|
186
|
+
var isHorizontal: Bool { self == .leading || self == .trailing || self == .centerX || self == .width }
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/// A priority, as Auto Layout's (1…1000). Kept; the solver ignores it.
|
|
190
|
+
public struct UILayoutPriority: RawRepresentable, Hashable, Comparable, Sendable, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral {
|
|
191
|
+
public let rawValue: Float
|
|
192
|
+
public init(rawValue: Float) { self.rawValue = rawValue }
|
|
193
|
+
public init(_ rawValue: Float) { self.rawValue = rawValue }
|
|
194
|
+
public init(floatLiteral value: Float) { rawValue = value }
|
|
195
|
+
public init(integerLiteral value: Int) { rawValue = Float(value) }
|
|
196
|
+
public static func < (lhs: UILayoutPriority, rhs: UILayoutPriority) -> Bool { lhs.rawValue < rhs.rawValue }
|
|
197
|
+
public static let required = UILayoutPriority(1000)
|
|
198
|
+
public static let defaultHigh = UILayoutPriority(750)
|
|
199
|
+
public static let defaultLow = UILayoutPriority(250)
|
|
200
|
+
public static let fittingSizeLevel = UILayoutPriority(50)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/// A constraint between two anchors (or an anchor and a constant). Active
|
|
204
|
+
/// constraints of the simple kinds are solved when the view tree is laid out
|
|
205
|
+
/// (`UIView.layoutIfNeeded`, and before the page draws it); inequalities
|
|
206
|
+
/// and priorities are kept and ignored.
|
|
207
|
+
open class NSLayoutConstraint: @unchecked Sendable {
|
|
208
|
+
public enum Relation: Int, Sendable { case lessThanOrEqual = -1, equal = 0, greaterThanOrEqual = 1 }
|
|
209
|
+
|
|
210
|
+
open var isActive = false {
|
|
211
|
+
didSet {
|
|
212
|
+
guard isActive != oldValue else { return }
|
|
213
|
+
MainActor.assumeIsolated { register(isActive) }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
open var constant: CGFloat {
|
|
217
|
+
didSet { MainActor.assumeIsolated { (_first.item ?? _second?.item)?._setNeedsTranslation() } }
|
|
218
|
+
}
|
|
219
|
+
open var priority: UILayoutPriority = .required
|
|
220
|
+
open var identifier: String?
|
|
221
|
+
public let multiplier: CGFloat
|
|
222
|
+
public let relation: Relation
|
|
223
|
+
let _first: _AnchorRef
|
|
224
|
+
let _second: _AnchorRef?
|
|
225
|
+
|
|
226
|
+
init(first: _AnchorRef, second: _AnchorRef?, relation: Relation = .equal, multiplier: CGFloat = 1, constant: CGFloat) {
|
|
227
|
+
_first = first
|
|
228
|
+
_second = second
|
|
229
|
+
self.relation = relation
|
|
230
|
+
self.multiplier = multiplier
|
|
231
|
+
self.constant = constant
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
open class func activate(_ constraints: [NSLayoutConstraint]) {
|
|
235
|
+
for constraint in constraints { constraint.isActive = true }
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
open class func deactivate(_ constraints: [NSLayoutConstraint]) {
|
|
239
|
+
for constraint in constraints { constraint.isActive = false }
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/// Activation keeps the constraint on both its views (they hold it, it
|
|
243
|
+
/// holds them weakly), as the solver looks for it from either side.
|
|
244
|
+
@MainActor private func register(_ active: Bool) {
|
|
245
|
+
for item in [_first.item, _second?.item].compactMap({ $0 }) {
|
|
246
|
+
if active {
|
|
247
|
+
if !item._layoutConstraints.contains(where: { $0 === self }) { item._layoutConstraints.append(self) }
|
|
248
|
+
} else {
|
|
249
|
+
item._layoutConstraints.removeAll { $0 === self }
|
|
250
|
+
}
|
|
251
|
+
item._setNeedsTranslation()
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// An anchor's view and attribute.
|
|
257
|
+
struct _AnchorRef: @unchecked Sendable {
|
|
258
|
+
weak var item: UIView?
|
|
259
|
+
let attribute: _LayoutAttribute
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
open class NSLayoutAnchor<AnchorType: AnyObject>: @unchecked Sendable {
|
|
263
|
+
let _ref: _AnchorRef
|
|
264
|
+
|
|
265
|
+
public init() { _ref = _AnchorRef(item: nil, attribute: .none) }
|
|
266
|
+
|
|
267
|
+
init(item: UIView, attribute: _LayoutAttribute) { _ref = _AnchorRef(item: item, attribute: attribute) }
|
|
268
|
+
|
|
269
|
+
open func constraint(equalTo anchor: NSLayoutAnchor<AnchorType>) -> NSLayoutConstraint {
|
|
270
|
+
NSLayoutConstraint(first: _ref, second: anchor._ref, constant: 0)
|
|
271
|
+
}
|
|
272
|
+
open func constraint(equalTo anchor: NSLayoutAnchor<AnchorType>, constant c: CGFloat) -> NSLayoutConstraint {
|
|
273
|
+
NSLayoutConstraint(first: _ref, second: anchor._ref, constant: c)
|
|
274
|
+
}
|
|
275
|
+
open func constraint(greaterThanOrEqualTo anchor: NSLayoutAnchor<AnchorType>, constant c: CGFloat = 0) -> NSLayoutConstraint {
|
|
276
|
+
NSLayoutConstraint(first: _ref, second: anchor._ref, relation: .greaterThanOrEqual, constant: c)
|
|
277
|
+
}
|
|
278
|
+
open func constraint(lessThanOrEqualTo anchor: NSLayoutAnchor<AnchorType>, constant c: CGFloat = 0) -> NSLayoutConstraint {
|
|
279
|
+
NSLayoutConstraint(first: _ref, second: anchor._ref, relation: .lessThanOrEqual, constant: c)
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
open class NSLayoutXAxisAnchor: NSLayoutAnchor<NSLayoutXAxisAnchor>, @unchecked Sendable {}
|
|
284
|
+
open class NSLayoutYAxisAnchor: NSLayoutAnchor<NSLayoutYAxisAnchor>, @unchecked Sendable {}
|
|
285
|
+
|
|
286
|
+
open class NSLayoutDimension: NSLayoutAnchor<NSLayoutDimension>, @unchecked Sendable {
|
|
287
|
+
open func constraint(equalToConstant c: CGFloat) -> NSLayoutConstraint {
|
|
288
|
+
NSLayoutConstraint(first: _ref, second: nil, constant: c)
|
|
289
|
+
}
|
|
290
|
+
open func constraint(greaterThanOrEqualToConstant c: CGFloat) -> NSLayoutConstraint {
|
|
291
|
+
NSLayoutConstraint(first: _ref, second: nil, relation: .greaterThanOrEqual, constant: c)
|
|
292
|
+
}
|
|
293
|
+
open func constraint(lessThanOrEqualToConstant c: CGFloat) -> NSLayoutConstraint {
|
|
294
|
+
NSLayoutConstraint(first: _ref, second: nil, relation: .lessThanOrEqual, constant: c)
|
|
295
|
+
}
|
|
296
|
+
open func constraint(equalTo anchor: NSLayoutDimension, multiplier m: CGFloat, constant c: CGFloat = 0) -> NSLayoutConstraint {
|
|
297
|
+
NSLayoutConstraint(first: _ref, second: anchor._ref, multiplier: m, constant: c)
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// MARK: - Views
|
|
302
|
+
|
|
303
|
+
/// A view: frames, subviews and appearance. A representable's view is drawn
|
|
304
|
+
/// (ViewTranslation.swift); any other is kept and never drawn.
|
|
305
|
+
@MainActor
|
|
306
|
+
open class UIView: CALayerDelegate {
|
|
307
|
+
public enum ContentMode: Int, Sendable {
|
|
308
|
+
case scaleToFill, scaleAspectFit, scaleAspectFill, redraw, center, top, bottom, left, right
|
|
309
|
+
case topLeft, topRight, bottomLeft, bottomRight
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
public struct AnimationOptions: OptionSet, Sendable {
|
|
313
|
+
public let rawValue: UInt
|
|
314
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
315
|
+
public static let allowUserInteraction = AnimationOptions(rawValue: 1 << 1)
|
|
316
|
+
public static let beginFromCurrentState = AnimationOptions(rawValue: 1 << 2)
|
|
317
|
+
public static let curveEaseInOut = AnimationOptions([])
|
|
318
|
+
public static let curveEaseIn = AnimationOptions(rawValue: 1 << 16)
|
|
319
|
+
public static let curveEaseOut = AnimationOptions(rawValue: 2 << 16)
|
|
320
|
+
public static let curveLinear = AnimationOptions(rawValue: 3 << 16)
|
|
321
|
+
public static let transitionCrossDissolve = AnimationOptions(rawValue: 5 << 20)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/// How a view's frame follows its superview's size (applied when the
|
|
325
|
+
/// superview's bounds change, as UIKit does).
|
|
326
|
+
public struct AutoresizingMask: OptionSet, Sendable {
|
|
327
|
+
public let rawValue: UInt
|
|
328
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
329
|
+
public static let flexibleLeftMargin = AutoresizingMask(rawValue: 1 << 0)
|
|
330
|
+
public static let flexibleWidth = AutoresizingMask(rawValue: 1 << 1)
|
|
331
|
+
public static let flexibleRightMargin = AutoresizingMask(rawValue: 1 << 2)
|
|
332
|
+
public static let flexibleTopMargin = AutoresizingMask(rawValue: 1 << 3)
|
|
333
|
+
public static let flexibleHeight = AutoresizingMask(rawValue: 1 << 4)
|
|
334
|
+
public static let flexibleBottomMargin = AutoresizingMask(rawValue: 1 << 5)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
private var storedBounds: CGRect
|
|
338
|
+
private var storedCenter: CGPoint
|
|
339
|
+
|
|
340
|
+
/// Its center and its bounds' size, in the superview's coordinates.
|
|
341
|
+
open var frame: CGRect {
|
|
342
|
+
get {
|
|
343
|
+
CGRect(x: storedCenter.x - storedBounds.width / 2, y: storedCenter.y - storedBounds.height / 2,
|
|
344
|
+
width: storedBounds.width, height: storedBounds.height)
|
|
345
|
+
}
|
|
346
|
+
set {
|
|
347
|
+
let oldSize = storedBounds.size
|
|
348
|
+
storedCenter = CGPoint(x: newValue.midX, y: newValue.midY)
|
|
349
|
+
storedBounds.size = newValue.size
|
|
350
|
+
boundsSizeChanged(from: oldSize)
|
|
351
|
+
_setNeedsTranslation()
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
open var bounds: CGRect {
|
|
355
|
+
get { storedBounds }
|
|
356
|
+
set {
|
|
357
|
+
let oldSize = storedBounds.size
|
|
358
|
+
storedBounds = newValue
|
|
359
|
+
boundsSizeChanged(from: oldSize)
|
|
360
|
+
_setNeedsTranslation()
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
open var center: CGPoint {
|
|
364
|
+
get { storedCenter }
|
|
365
|
+
set {
|
|
366
|
+
storedCenter = newValue
|
|
367
|
+
_setNeedsTranslation()
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
open var isHidden = false { didSet { _setNeedsTranslation() } }
|
|
371
|
+
open var alpha: CGFloat = 1 { didSet { _setNeedsTranslation() } }
|
|
372
|
+
open var backgroundColor: UIColor? { didSet { _setNeedsTranslation() } }
|
|
373
|
+
open var tintColor: UIColor! = .systemBlue { didSet { _setNeedsTranslation() } }
|
|
374
|
+
open var contentMode: ContentMode = .scaleToFill { didSet { _setNeedsTranslation() } }
|
|
375
|
+
open var clipsToBounds = false { didSet { _setNeedsTranslation() } }
|
|
376
|
+
open var isUserInteractionEnabled = true { didSet { _setNeedsTranslation() } }
|
|
377
|
+
open var translatesAutoresizingMaskIntoConstraints = true
|
|
378
|
+
open var autoresizingMask: AutoresizingMask = []
|
|
379
|
+
open var autoresizesSubviews = true
|
|
380
|
+
open var tag = 0
|
|
381
|
+
open var accessibilityLabel: String?
|
|
382
|
+
open var isAccessibilityElement = false
|
|
383
|
+
/// The view's layer, an instance of `layerClass` (made on first use).
|
|
384
|
+
public private(set) lazy var layer: CALayer = {
|
|
385
|
+
let layer = (type(of: self).layerClass as? CALayer.Type)?.init() ?? CALayer()
|
|
386
|
+
layer._view = self
|
|
387
|
+
layer.delegate = self
|
|
388
|
+
return layer
|
|
389
|
+
}()
|
|
390
|
+
/// The class of the view's layer (`AVPlayerLayer` for a player view).
|
|
391
|
+
open class var layerClass: AnyClass { CALayer.self }
|
|
392
|
+
public private(set) weak var superview: UIView?
|
|
393
|
+
public private(set) var subviews: [UIView] = []
|
|
394
|
+
open var intrinsicContentSize: CGSize { CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric) }
|
|
395
|
+
public static let noIntrinsicMetric: CGFloat = -1
|
|
396
|
+
public static let layoutFittingCompressedSize = CGSize(width: 0, height: 0)
|
|
397
|
+
public static let layoutFittingExpandedSize = CGSize(width: 1_000_000, height: 1_000_000)
|
|
398
|
+
/// Kept; the page follows the app's color scheme.
|
|
399
|
+
open var overrideUserInterfaceStyle: UIUserInterfaceStyle = .unspecified
|
|
400
|
+
/// The window the view is in: the nearest `UIWindow` up its superviews.
|
|
401
|
+
/// SwiftUI draws the page without windows, so a representable's view is
|
|
402
|
+
/// in none: this is nil for it.
|
|
403
|
+
open var window: UIWindow? {
|
|
404
|
+
var current: UIView? = self
|
|
405
|
+
while let view = current {
|
|
406
|
+
if let window = view as? UIWindow { return window }
|
|
407
|
+
current = view.superview
|
|
408
|
+
}
|
|
409
|
+
return nil
|
|
410
|
+
}
|
|
411
|
+
/// Never called: no UIKit view moves into a window on the page (a
|
|
412
|
+
/// representable's view included; code waiting for one never hears).
|
|
413
|
+
open func willMove(toWindow newWindow: UIWindow?) {}
|
|
414
|
+
open func didMoveToWindow() {}
|
|
415
|
+
/// Called when the view joins or leaves a superview.
|
|
416
|
+
open func willMove(toSuperview newSuperview: UIView?) {}
|
|
417
|
+
open func didMoveToSuperview() {}
|
|
418
|
+
open func didAddSubview(_ subview: UIView) {}
|
|
419
|
+
open func willRemoveSubview(_ subview: UIView) {}
|
|
420
|
+
/// Kept; the browser sends no hardware key commands to UIKit views.
|
|
421
|
+
open var keyCommands: [UIKeyCommand]? { nil }
|
|
422
|
+
|
|
423
|
+
/// Active constraints this view takes part in.
|
|
424
|
+
var _layoutConstraints: [NSLayoutConstraint] = []
|
|
425
|
+
/// Set on the root view of a representable (Representable.swift): told
|
|
426
|
+
/// when something drawn in its tree changes.
|
|
427
|
+
var _translationHook: (() -> Void)?
|
|
428
|
+
private var isLayingOut = false
|
|
429
|
+
private var contentHugging: [NSLayoutConstraint.Axis: UILayoutPriority] = [:]
|
|
430
|
+
private var compressionResistance: [NSLayoutConstraint.Axis: UILayoutPriority] = [:]
|
|
431
|
+
|
|
432
|
+
public init(frame: CGRect) {
|
|
433
|
+
storedBounds = CGRect(origin: .zero, size: frame.size)
|
|
434
|
+
storedCenter = CGPoint(x: frame.midX, y: frame.midY)
|
|
435
|
+
layer._view = self
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
public convenience init() { self.init(frame: .zero) }
|
|
439
|
+
|
|
440
|
+
public required init?(coder: NSCoder) {
|
|
441
|
+
storedBounds = .zero
|
|
442
|
+
storedCenter = .zero
|
|
443
|
+
layer._view = self
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
open func addSubview(_ view: UIView) {
|
|
447
|
+
view.removeFromSuperview()
|
|
448
|
+
view.willMove(toSuperview: self)
|
|
449
|
+
subviews.append(view)
|
|
450
|
+
view.superview = self
|
|
451
|
+
view.didMoveToSuperview()
|
|
452
|
+
didAddSubview(view)
|
|
453
|
+
_setNeedsTranslation()
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
open func insertSubview(_ view: UIView, at index: Int) {
|
|
457
|
+
view.removeFromSuperview()
|
|
458
|
+
view.willMove(toSuperview: self)
|
|
459
|
+
subviews.insert(view, at: min(index, subviews.count))
|
|
460
|
+
view.superview = self
|
|
461
|
+
view.didMoveToSuperview()
|
|
462
|
+
didAddSubview(view)
|
|
463
|
+
_setNeedsTranslation()
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
open func insertSubview(_ view: UIView, belowSubview siblingSubview: UIView) {
|
|
467
|
+
insertSubview(view, at: subviews.firstIndex { $0 === siblingSubview } ?? 0)
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
open func insertSubview(_ view: UIView, aboveSubview siblingSubview: UIView) {
|
|
471
|
+
insertSubview(view, at: (subviews.firstIndex { $0 === siblingSubview } ?? subviews.count - 1) + 1)
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
open func removeFromSuperview() {
|
|
475
|
+
guard let parent = superview else { return }
|
|
476
|
+
parent.willRemoveSubview(self)
|
|
477
|
+
willMove(toSuperview: nil)
|
|
478
|
+
parent.subviews.removeAll { $0 === self }
|
|
479
|
+
superview = nil
|
|
480
|
+
didMoveToSuperview()
|
|
481
|
+
parent._setNeedsTranslation()
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
open func bringSubviewToFront(_ view: UIView) {
|
|
485
|
+
guard let index = subviews.firstIndex(where: { $0 === view }) else { return }
|
|
486
|
+
subviews.append(subviews.remove(at: index))
|
|
487
|
+
_setNeedsTranslation()
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
open func sendSubviewToBack(_ view: UIView) {
|
|
491
|
+
guard let index = subviews.firstIndex(where: { $0 === view }) else { return }
|
|
492
|
+
subviews.insert(subviews.remove(at: index), at: 0)
|
|
493
|
+
_setNeedsTranslation()
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
open func isDescendant(of view: UIView) -> Bool {
|
|
497
|
+
var current: UIView? = self
|
|
498
|
+
while let candidate = current {
|
|
499
|
+
if candidate === view { return true }
|
|
500
|
+
current = candidate.superview
|
|
501
|
+
}
|
|
502
|
+
return false
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/// The view is drawn again with its new layout.
|
|
506
|
+
open func setNeedsLayout() { _setNeedsTranslation() }
|
|
507
|
+
/// Solves the subviews' constraints and calls `layoutSubviews()`, down the tree.
|
|
508
|
+
open func layoutIfNeeded() { _layoutTree() }
|
|
509
|
+
open func layoutSubviews() {}
|
|
510
|
+
open func setNeedsDisplay() { layer.setNeedsDisplay() }
|
|
511
|
+
open func setNeedsDisplay(_ rect: CGRect) { setNeedsDisplay() }
|
|
512
|
+
/// The layer's delegate method: the view is drawn again. A subclass that
|
|
513
|
+
/// overrides it shows its content from there.
|
|
514
|
+
open func display(_ layer: CALayer) { _setNeedsTranslation() }
|
|
515
|
+
/// Whether instances answer a selector. One made from a method
|
|
516
|
+
/// (`#selector(display(_:))`) names a method the compiler found; one made
|
|
517
|
+
/// from a string names nothing that can be called.
|
|
518
|
+
open class func instancesRespond(to aSelector: FoundationBridge.Selector?) -> Bool { aSelector?._hasMethod ?? false }
|
|
519
|
+
open func setNeedsUpdateConstraints() {}
|
|
520
|
+
open func updateConstraints() {}
|
|
521
|
+
open func updateConstraintsIfNeeded() {}
|
|
522
|
+
/// Resizes the view to `sizeThatFits` its current size.
|
|
523
|
+
open func sizeToFit() {
|
|
524
|
+
let size = sizeThatFits(bounds.size)
|
|
525
|
+
frame = CGRect(origin: frame.origin, size: CGSize(width: max(0, size.width), height: max(0, size.height)))
|
|
526
|
+
}
|
|
527
|
+
open func sizeThatFits(_ size: CGSize) -> CGSize {
|
|
528
|
+
let intrinsic = intrinsicContentSize
|
|
529
|
+
return CGSize(width: intrinsic.width < 0 ? bounds.width : intrinsic.width,
|
|
530
|
+
height: intrinsic.height < 0 ? bounds.height : intrinsic.height)
|
|
531
|
+
}
|
|
532
|
+
open func systemLayoutSizeFitting(_ targetSize: CGSize) -> CGSize { sizeThatFits(targetSize) }
|
|
533
|
+
open func invalidateIntrinsicContentSize() { _setNeedsTranslation() }
|
|
534
|
+
|
|
535
|
+
open var constraints: [NSLayoutConstraint] { _layoutConstraints }
|
|
536
|
+
open func addConstraint(_ constraint: NSLayoutConstraint) { constraint.isActive = true }
|
|
537
|
+
open func addConstraints(_ constraints: [NSLayoutConstraint]) { NSLayoutConstraint.activate(constraints) }
|
|
538
|
+
open func removeConstraint(_ constraint: NSLayoutConstraint) { constraint.isActive = false }
|
|
539
|
+
open func removeConstraints(_ constraints: [NSLayoutConstraint]) { NSLayoutConstraint.deactivate(constraints) }
|
|
540
|
+
|
|
541
|
+
open func contentHuggingPriority(for axis: NSLayoutConstraint.Axis) -> UILayoutPriority {
|
|
542
|
+
contentHugging[axis] ?? .defaultLow
|
|
543
|
+
}
|
|
544
|
+
open func setContentHuggingPriority(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis) {
|
|
545
|
+
contentHugging[axis] = priority
|
|
546
|
+
}
|
|
547
|
+
open func contentCompressionResistancePriority(for axis: NSLayoutConstraint.Axis) -> UILayoutPriority {
|
|
548
|
+
compressionResistance[axis] ?? .defaultHigh
|
|
549
|
+
}
|
|
550
|
+
open func setContentCompressionResistancePriority(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis) {
|
|
551
|
+
compressionResistance[axis] = priority
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
public var topAnchor: NSLayoutYAxisAnchor { NSLayoutYAxisAnchor(item: self, attribute: .top) }
|
|
555
|
+
public var bottomAnchor: NSLayoutYAxisAnchor { NSLayoutYAxisAnchor(item: self, attribute: .bottom) }
|
|
556
|
+
public var centerYAnchor: NSLayoutYAxisAnchor { NSLayoutYAxisAnchor(item: self, attribute: .centerY) }
|
|
557
|
+
public var leftAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .leading) }
|
|
558
|
+
public var rightAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .trailing) }
|
|
559
|
+
public var leadingAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .leading) }
|
|
560
|
+
public var trailingAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .trailing) }
|
|
561
|
+
public var centerXAnchor: NSLayoutXAxisAnchor { NSLayoutXAxisAnchor(item: self, attribute: .centerX) }
|
|
562
|
+
public var widthAnchor: NSLayoutDimension { NSLayoutDimension(item: self, attribute: .width) }
|
|
563
|
+
public var heightAnchor: NSLayoutDimension { NSLayoutDimension(item: self, attribute: .height) }
|
|
564
|
+
/// The view's own edges: the page lays the safe area out around the app (Controls.swift).
|
|
565
|
+
public private(set) lazy var safeAreaLayoutGuide = UILayoutGuide(owningView: self)
|
|
566
|
+
/// The view's own edges: margins are kept, not applied.
|
|
567
|
+
public private(set) lazy var layoutMarginsGuide = UILayoutGuide(owningView: self)
|
|
568
|
+
open var layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
|
|
569
|
+
open var preservesSuperviewLayoutMargins = false
|
|
570
|
+
|
|
571
|
+
/// Not called: the page's taps reach buttons and SwiftUI views (Controls.swift).
|
|
572
|
+
open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {}
|
|
573
|
+
open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {}
|
|
574
|
+
open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {}
|
|
575
|
+
open func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {}
|
|
576
|
+
|
|
577
|
+
/// Runs `animations` at once (nothing animates on the page), then `completion`.
|
|
578
|
+
public class func animate(withDuration duration: TimeInterval, delay: TimeInterval = 0, options: AnimationOptions = [],
|
|
579
|
+
animations: @escaping () -> Void, completion: ((Bool) -> Void)? = nil) {
|
|
580
|
+
animations()
|
|
581
|
+
completion?(true)
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
public class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void) {
|
|
585
|
+
animations()
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
public class func transition(with view: UIView, duration: TimeInterval, options: AnimationOptions = [],
|
|
589
|
+
animations: (() -> Void)?, completion: ((Bool) -> Void)? = nil) {
|
|
590
|
+
animations?()
|
|
591
|
+
completion?(true)
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
public class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void) {
|
|
595
|
+
actionsWithoutAnimation()
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// MARK: Drawing and layout (internal)
|
|
599
|
+
|
|
600
|
+
/// Tells the representable showing this view, if any, that something
|
|
601
|
+
/// drawn changed: it is translated again (Representable.swift decides
|
|
602
|
+
/// whether that needs a render).
|
|
603
|
+
func _setNeedsTranslation() {
|
|
604
|
+
var current: UIView? = self
|
|
605
|
+
while let view = current {
|
|
606
|
+
if let hook = view._translationHook {
|
|
607
|
+
hook()
|
|
608
|
+
return
|
|
609
|
+
}
|
|
610
|
+
current = view.superview
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/// Solves the subviews' constraints, then lets the view lay them out
|
|
615
|
+
/// (`layoutSubviews`), and does the same for each subview.
|
|
616
|
+
func _layoutTree() {
|
|
617
|
+
guard !isLayingOut else { return }
|
|
618
|
+
isLayingOut = true
|
|
619
|
+
defer { isLayingOut = false }
|
|
620
|
+
_solveSubviewConstraints()
|
|
621
|
+
layoutSubviews()
|
|
622
|
+
for subview in subviews { subview._layoutTree() }
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/// UIKit's autoresizing: each flexible part of a subview's mask takes a
|
|
626
|
+
/// share of the change in this view's size.
|
|
627
|
+
private func boundsSizeChanged(from oldSize: CGSize) {
|
|
628
|
+
let newSize = storedBounds.size
|
|
629
|
+
guard autoresizesSubviews, newSize != oldSize, oldSize != .zero || newSize != .zero else { return }
|
|
630
|
+
for subview in subviews where subview.translatesAutoresizingMaskIntoConstraints && !subview.autoresizingMask.isEmpty {
|
|
631
|
+
let mask = subview.autoresizingMask
|
|
632
|
+
var frame = subview.frame
|
|
633
|
+
func resize(_ origin: inout CGFloat, _ length: inout CGFloat, delta: CGFloat,
|
|
634
|
+
flexibleLead: Bool, flexibleLength: Bool, flexibleTrail: Bool, old: CGFloat) {
|
|
635
|
+
guard delta != 0 else { return }
|
|
636
|
+
let parts = [flexibleLead ? origin : nil, flexibleLength ? length : nil,
|
|
637
|
+
flexibleTrail ? max(0, old - origin - length) : nil].compactMap { $0 }
|
|
638
|
+
let flexibleCount = [flexibleLead, flexibleLength, flexibleTrail].filter { $0 }.count
|
|
639
|
+
guard flexibleCount > 0 else { return }
|
|
640
|
+
let total = parts.reduce(0, +)
|
|
641
|
+
func share(_ part: CGFloat) -> CGFloat { total > 0 ? delta * part / total : delta / CGFloat(flexibleCount) }
|
|
642
|
+
let leadShare = flexibleLead ? share(origin) : 0
|
|
643
|
+
let lengthShare = flexibleLength ? share(length) : 0
|
|
644
|
+
origin += leadShare
|
|
645
|
+
length = max(0, length + lengthShare)
|
|
646
|
+
}
|
|
647
|
+
resize(&frame.origin.x, &frame.size.width, delta: newSize.width - oldSize.width,
|
|
648
|
+
flexibleLead: mask.contains(.flexibleLeftMargin), flexibleLength: mask.contains(.flexibleWidth),
|
|
649
|
+
flexibleTrail: mask.contains(.flexibleRightMargin), old: oldSize.width)
|
|
650
|
+
resize(&frame.origin.y, &frame.size.height, delta: newSize.height - oldSize.height,
|
|
651
|
+
flexibleLead: mask.contains(.flexibleTopMargin), flexibleLength: mask.contains(.flexibleHeight),
|
|
652
|
+
flexibleTrail: mask.contains(.flexibleBottomMargin), old: oldSize.height)
|
|
653
|
+
subview.frame = frame
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/// Sets the frame of each subview that uses constraints from its active
|
|
658
|
+
/// equalities with this view, a sibling (already placed: subviews are
|
|
659
|
+
/// solved in order, twice, so one placed later is seen the second time)
|
|
660
|
+
/// or a constant. An axis the constraints do not settle keeps the frame's
|
|
661
|
+
/// value, or the intrinsic size for a length.
|
|
662
|
+
private func _solveSubviewConstraints() {
|
|
663
|
+
let constrained = subviews.filter { !$0.translatesAutoresizingMaskIntoConstraints && !$0._layoutConstraints.isEmpty }
|
|
664
|
+
guard !constrained.isEmpty else { return }
|
|
665
|
+
for _ in 0..<2 {
|
|
666
|
+
for subview in constrained { subview._solveConstraints(in: self) }
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
private func _solveConstraints(in parent: UIView) {
|
|
671
|
+
// The value of an attribute of a view this one is constrained to, in
|
|
672
|
+
// the parent's bounds coordinates.
|
|
673
|
+
func value(of ref: _AnchorRef) -> CGFloat? {
|
|
674
|
+
guard let item = ref.item else { return nil }
|
|
675
|
+
let rect: CGRect
|
|
676
|
+
if item === parent {
|
|
677
|
+
rect = CGRect(origin: .zero, size: parent.bounds.size)
|
|
678
|
+
} else if item.superview === parent {
|
|
679
|
+
rect = item.frame
|
|
680
|
+
} else {
|
|
681
|
+
return nil
|
|
682
|
+
}
|
|
683
|
+
switch ref.attribute {
|
|
684
|
+
case .leading: return rect.minX
|
|
685
|
+
case .trailing: return rect.maxX
|
|
686
|
+
case .centerX: return rect.midX
|
|
687
|
+
case .width: return rect.width
|
|
688
|
+
case .top: return rect.minY
|
|
689
|
+
case .bottom: return rect.maxY
|
|
690
|
+
case .centerY: return rect.midY
|
|
691
|
+
case .height: return rect.height
|
|
692
|
+
case .none: return nil
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
var solved: [_LayoutAttribute: CGFloat] = [:]
|
|
696
|
+
var aspects: [(attribute: _LayoutAttribute, of: _LayoutAttribute, multiplier: CGFloat, constant: CGFloat)] = []
|
|
697
|
+
for constraint in _layoutConstraints where constraint.isActive && constraint.relation == .equal {
|
|
698
|
+
let (mine, other, forward): (_AnchorRef, _AnchorRef?, Bool)
|
|
699
|
+
if constraint._first.item === self {
|
|
700
|
+
(mine, other, forward) = (constraint._first, constraint._second, true)
|
|
701
|
+
} else if let second = constraint._second, second.item === self {
|
|
702
|
+
(mine, other, forward) = (second, constraint._first, false)
|
|
703
|
+
} else {
|
|
704
|
+
continue
|
|
705
|
+
}
|
|
706
|
+
if let other, other.item === self {
|
|
707
|
+
// width = height × m + c (an aspect ratio), settled after the rest.
|
|
708
|
+
if forward { aspects.append((mine.attribute, other.attribute, constraint.multiplier, constraint.constant)) }
|
|
709
|
+
continue
|
|
710
|
+
}
|
|
711
|
+
let base: CGFloat
|
|
712
|
+
if let other {
|
|
713
|
+
guard let v = value(of: other) else { continue }
|
|
714
|
+
base = v
|
|
715
|
+
} else {
|
|
716
|
+
base = 0
|
|
717
|
+
}
|
|
718
|
+
// first = second × m + c; read from the second's side, second = (first − c) / m.
|
|
719
|
+
solved[mine.attribute] = forward
|
|
720
|
+
? base * constraint.multiplier + constraint.constant
|
|
721
|
+
: (constraint.multiplier == 0 ? base : (base - constraint.constant) / constraint.multiplier)
|
|
722
|
+
}
|
|
723
|
+
for aspect in aspects where solved[aspect.attribute] == nil {
|
|
724
|
+
if let length = solved[aspect.of] { solved[aspect.attribute] = length * aspect.multiplier + aspect.constant }
|
|
725
|
+
}
|
|
726
|
+
let intrinsic = intrinsicContentSize
|
|
727
|
+
func axis(lead: CGFloat?, trail: CGFloat?, center: CGFloat?, length: CGFloat?,
|
|
728
|
+
intrinsic: CGFloat, current: (origin: CGFloat, length: CGFloat)) -> (CGFloat, CGFloat) {
|
|
729
|
+
var size = length
|
|
730
|
+
if size == nil, let lead, let trail { size = trail - lead }
|
|
731
|
+
if size == nil, let lead, let center { size = 2 * (center - lead) }
|
|
732
|
+
if size == nil, let trail, let center { size = 2 * (trail - center) }
|
|
733
|
+
let resolved = max(0, size ?? (intrinsic >= 0 ? intrinsic : current.length))
|
|
734
|
+
let origin = lead ?? trail.map { $0 - resolved } ?? center.map { $0 - resolved / 2 } ?? current.origin
|
|
735
|
+
return (origin, resolved)
|
|
736
|
+
}
|
|
737
|
+
let current = frame
|
|
738
|
+
let (x, width) = axis(lead: solved[.leading], trail: solved[.trailing], center: solved[.centerX], length: solved[.width],
|
|
739
|
+
intrinsic: intrinsic.width, current: (current.minX, current.width))
|
|
740
|
+
let (y, height) = axis(lead: solved[.top], trail: solved[.bottom], center: solved[.centerY], length: solved[.height],
|
|
741
|
+
intrinsic: intrinsic.height, current: (current.minY, current.height))
|
|
742
|
+
let next = CGRect(x: x, y: y, width: width, height: height)
|
|
743
|
+
if next != current { frame = next }
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
extension NSLayoutConstraint {
|
|
748
|
+
/// The two axes of a layout.
|
|
749
|
+
public enum Axis: Int, Sendable { case horizontal = 0, vertical = 1 }
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/// A key command a view answers to; kept, never sent (the page sends keys to
|
|
753
|
+
/// the text views it draws, not to UIKit).
|
|
754
|
+
@MainActor
|
|
755
|
+
open class UIKeyCommand {
|
|
756
|
+
public let input: String?
|
|
757
|
+
public let modifierFlags: UIKeyModifierFlags
|
|
758
|
+
public let action: FoundationBridge.Selector?
|
|
759
|
+
open var title = ""
|
|
760
|
+
open var discoverabilityTitle: String?
|
|
761
|
+
open var wantsPriorityOverSystemBehavior = false
|
|
762
|
+
|
|
763
|
+
public init(input: String, modifierFlags: UIKeyModifierFlags, action: FoundationBridge.Selector) {
|
|
764
|
+
self.input = input
|
|
765
|
+
self.modifierFlags = modifierFlags
|
|
766
|
+
self.action = action
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
public init(title: String, action: FoundationBridge.Selector, input: String, modifierFlags: UIKeyModifierFlags = []) {
|
|
770
|
+
self.title = title
|
|
771
|
+
self.input = input
|
|
772
|
+
self.modifierFlags = modifierFlags
|
|
773
|
+
self.action = action
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
public static let inputEscape = "UIKeyInputEscape"
|
|
777
|
+
public static let inputUpArrow = "UIKeyInputUpArrow"
|
|
778
|
+
public static let inputDownArrow = "UIKeyInputDownArrow"
|
|
779
|
+
public static let inputLeftArrow = "UIKeyInputLeftArrow"
|
|
780
|
+
public static let inputRightArrow = "UIKeyInputRightArrow"
|
|
781
|
+
public static let inputPageUp = "UIKeyInputPageUp"
|
|
782
|
+
public static let inputPageDown = "UIKeyInputPageDown"
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
public struct UIKeyModifierFlags: OptionSet, Sendable {
|
|
786
|
+
public let rawValue: Int
|
|
787
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
788
|
+
public static let alphaShift = UIKeyModifierFlags(rawValue: 1 << 16)
|
|
789
|
+
public static let shift = UIKeyModifierFlags(rawValue: 1 << 17)
|
|
790
|
+
public static let control = UIKeyModifierFlags(rawValue: 1 << 18)
|
|
791
|
+
public static let alternate = UIKeyModifierFlags(rawValue: 1 << 19)
|
|
792
|
+
public static let command = UIKeyModifierFlags(rawValue: 1 << 20)
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
/// An image view: drawn as an `image` (ViewTranslation.swift), scaled by its
|
|
796
|
+
/// `contentMode`. Animation images are kept, not played; a GIF file shows its
|
|
797
|
+
/// first frame, and a subclass that sets each frame as its image (Gifu's
|
|
798
|
+
/// `GIFImageView`, from `display(_:)`) is drawn a frame at a time.
|
|
799
|
+
@MainActor
|
|
800
|
+
open class UIImageView: UIView {
|
|
801
|
+
open var image: UIImage? { didSet { _setNeedsTranslation() } }
|
|
802
|
+
open var highlightedImage: UIImage? { didSet { _setNeedsTranslation() } }
|
|
803
|
+
open var isHighlighted = false { didSet { _setNeedsTranslation() } }
|
|
804
|
+
open var animationImages: [UIImage]?
|
|
805
|
+
open var animationDuration: TimeInterval = 0
|
|
806
|
+
open var animationRepeatCount = 0
|
|
807
|
+
open var isAnimating: Bool { false }
|
|
808
|
+
open var preferredSymbolConfiguration: UIImage.SymbolConfiguration?
|
|
809
|
+
|
|
810
|
+
public override init(frame: CGRect) { super.init(frame: frame) }
|
|
811
|
+
|
|
812
|
+
public convenience init(image: UIImage?) {
|
|
813
|
+
self.init(frame: .zero)
|
|
814
|
+
self.image = image
|
|
815
|
+
if let image { frame = CGRect(origin: .zero, size: image.size) }
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
public convenience init(image: UIImage?, highlightedImage: UIImage?) {
|
|
819
|
+
self.init(image: image)
|
|
820
|
+
self.highlightedImage = highlightedImage
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
public required init?(coder: NSCoder) { super.init(coder: coder) }
|
|
824
|
+
|
|
825
|
+
open override var intrinsicContentSize: CGSize { image?.size ?? CGSize(width: -1, height: -1) }
|
|
826
|
+
|
|
827
|
+
open func startAnimating() {}
|
|
828
|
+
open func stopAnimating() {}
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/// A spinner: drawn as a `ProgressView` while it spins (or always, when it
|
|
832
|
+
/// does not hide when stopped).
|
|
833
|
+
@MainActor
|
|
834
|
+
open class UIActivityIndicatorView: UIView {
|
|
835
|
+
public enum Style: Int, Sendable { case medium = 100, large = 101 }
|
|
836
|
+
|
|
837
|
+
open var style: Style = .medium { didSet { _setNeedsTranslation() } }
|
|
838
|
+
open var color: UIColor! { didSet { _setNeedsTranslation() } }
|
|
839
|
+
open var hidesWhenStopped = true { didSet { _setNeedsTranslation() } }
|
|
840
|
+
public private(set) var isAnimating = false { didSet { _setNeedsTranslation() } }
|
|
841
|
+
|
|
842
|
+
public override init(frame: CGRect) { super.init(frame: frame) }
|
|
843
|
+
|
|
844
|
+
public convenience init(style: Style) {
|
|
845
|
+
self.init(frame: .zero)
|
|
846
|
+
self.style = style
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
public required init?(coder: NSCoder) { super.init(coder: coder) }
|
|
850
|
+
|
|
851
|
+
open override var intrinsicContentSize: CGSize { style == .large ? CGSize(width: 37, height: 37) : CGSize(width: 20, height: 20) }
|
|
852
|
+
|
|
853
|
+
open func startAnimating() { isAnimating = true }
|
|
854
|
+
open func stopAnimating() { isAnimating = false }
|
|
855
|
+
}
|