@swiftbrowser/swift 0.1.0 → 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 +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 +65 -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 +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- 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 +67 -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 +80 -10
- 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 +11 -2
- 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 +164 -37
- 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 +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- 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 +10 -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 +498 -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 +39 -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,99 @@
|
|
|
1
|
+
// Lazy rows. SwiftUI builds the rows of a `List` (or `Form`), and of a `LazyVStack` or
|
|
2
|
+
// `LazyHStack`, as they scroll into view: a timeline of a thousand posts
|
|
3
|
+
// mounts the few on screen. Building every row up front made long lists
|
|
4
|
+
// expensive in the browser, in time (each row's body, its elements, the
|
|
5
|
+
// page's layout of them) and in memory, which a phone's browser runs out of.
|
|
6
|
+
//
|
|
7
|
+
// Here a keyed group (`ForEach`, or a modifier spread over one) whose rows
|
|
8
|
+
// are a lazy container's rows mounts its first rows only, followed by a
|
|
9
|
+
// `lazyspacer` element standing for the rest. When the page sees the spacer
|
|
10
|
+
// come near its scroll view's visible area it sends a `lazy` event, and the
|
|
11
|
+
// group mounts the next rows (docs/ops-protocol.md, "Lazy rows"). Rows that
|
|
12
|
+
// were built stay built, as on iOS a row's state survives scrolling away.
|
|
13
|
+
//
|
|
14
|
+
// The rows of a lazy container are its content seen through groups,
|
|
15
|
+
// sections and views with a body of their own: `List { Section {
|
|
16
|
+
// ForEach(...) } }` and `List { TimelineRows() }` are lazy, while a
|
|
17
|
+
// `ForEach` inside a row's own `VStack` is part of that row and is built
|
|
18
|
+
// with it.
|
|
19
|
+
|
|
20
|
+
/// `List`, `Form`, `LazyVStack` and `LazyHStack`: their rows are built lazily.
|
|
21
|
+
protocol _LazyRowsContainer: _TraitBearing {
|
|
22
|
+
var _lazyAxis: Axis { get }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
enum _LazyRows {
|
|
26
|
+
/// Rows a group mounts before its spacer, and the rows each `lazy` event adds.
|
|
27
|
+
static let batch = 12
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// The key of a group's spacer among its rows' keys. Each batch's spacer is a
|
|
31
|
+
/// new element (keyed by the rows before it), so the page watches it afresh:
|
|
32
|
+
/// one still in view after a batch was built asks for the next.
|
|
33
|
+
struct _LazySpacerKey: Hashable {
|
|
34
|
+
let built: Int
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// The rows of a lazy group that are not built yet (`lazyspacer` element).
|
|
38
|
+
struct _LazyRowsSpacer {
|
|
39
|
+
let axis: Axis
|
|
40
|
+
let remaining: Int
|
|
41
|
+
let extend: @MainActor () -> Void
|
|
42
|
+
}
|
|
43
|
+
extension _LazyRowsSpacer: _PrimitiveView {}
|
|
44
|
+
|
|
45
|
+
extension _LazyRowsSpacer: _HostView {
|
|
46
|
+
var _kind: String { "lazyspacer" }
|
|
47
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
48
|
+
.object([
|
|
49
|
+
"axis": .string(axis == .horizontal ? "horizontal" : "vertical"),
|
|
50
|
+
"remaining": .number(Double(remaining)),
|
|
51
|
+
])
|
|
52
|
+
}
|
|
53
|
+
var _handler: ((_JSON) -> Void)? {
|
|
54
|
+
let extend = extend
|
|
55
|
+
return { _ in MainActor.assumeIsolated { extend() } }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
extension List: _LazyRowsContainer {
|
|
60
|
+
var _lazyAxis: Axis { .vertical }
|
|
61
|
+
}
|
|
62
|
+
/// A `Form` is a grouped list, on iOS as here.
|
|
63
|
+
extension Form: _LazyRowsContainer {
|
|
64
|
+
var _lazyAxis: Axis { .vertical }
|
|
65
|
+
}
|
|
66
|
+
extension LazyVStack: _LazyRowsContainer {
|
|
67
|
+
var _lazyAxis: Axis { .vertical }
|
|
68
|
+
}
|
|
69
|
+
extension LazyHStack: _LazyRowsContainer {
|
|
70
|
+
var _lazyAxis: Axis { .horizontal }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// MARK: - Lazy menus
|
|
74
|
+
|
|
75
|
+
// A `Menu`'s items and a `.contextMenu`'s are built when the menu opens, as
|
|
76
|
+
// on iOS, and dropped when it closes. Until then the `menu` / `contextmenu`
|
|
77
|
+
// element has its label (or content) only and `"deferred": true`; the page
|
|
78
|
+
// sends `{"type": "menu", "id": n, "open": true}` when the viewer opens it,
|
|
79
|
+
// shows the popover once the items arrive, and sends `"open": false` when it
|
|
80
|
+
// closes (docs/ops-protocol.md, "Lazy menus"). A timeline's rows each carry
|
|
81
|
+
// a menu or two: built eagerly they were half of Ice Cubes' page. Headless
|
|
82
|
+
// runs, whose event scripts tap menu items directly, build them eagerly.
|
|
83
|
+
|
|
84
|
+
/// `Menu` and `.contextMenu`: hosts whose items are built only while open.
|
|
85
|
+
protocol _LazyMenuHost: _TraitBearing {
|
|
86
|
+
/// The label (a `Menu`'s, in its `ZStack`) or the content (a context menu's).
|
|
87
|
+
var _menuBase: any View { get }
|
|
88
|
+
var _menuItems: any View { get }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
extension Menu: _LazyMenuHost {
|
|
92
|
+
var _menuBase: any View { ZStack { label } }
|
|
93
|
+
var _menuItems: any View { content }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
extension _ContextMenuView: _LazyMenuHost {
|
|
97
|
+
var _menuBase: any View { content }
|
|
98
|
+
var _menuItems: any View { items }
|
|
99
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Views measured by the page for code that asks for a view's size
|
|
2
|
+
// synchronously: `UIHostingController.sizeThatFits(in:)` (UIKit), which
|
|
3
|
+
// packages call to size SwiftUI views before laying them out themselves
|
|
4
|
+
// (WrappingHStack measures each item this way to break its lines). Swift has
|
|
5
|
+
// no text metrics, so the answer comes from the page, one render late:
|
|
6
|
+
//
|
|
7
|
+
// 1. The first ask for a view finds no measurement: the answer is nil (the
|
|
8
|
+
// hosting controller reports a zero size) and the view joins the pending
|
|
9
|
+
// list.
|
|
10
|
+
// 2. The render that asked also renders the pending views, off screen: as
|
|
11
|
+
// the children of a `layout` element of their own at the root, transparent
|
|
12
|
+
// and not hit-testable. The page measures a `layout` element's children
|
|
13
|
+
// (minimum, ideal and maximum size) and sends them in a `layout` event,
|
|
14
|
+
// as it does for a custom `Layout` (CustomLayout.swift).
|
|
15
|
+
// 3. The event fills the cache and asks for a render in which no body is
|
|
16
|
+
// skipped as unchanged, so the code that measured runs again and finds
|
|
17
|
+
// the sizes (the library keeps them in objects of its own, which only a
|
|
18
|
+
// body that re-runs makes again).
|
|
19
|
+
//
|
|
20
|
+
// A view is known by its reflected description (`String(reflecting:)`): its
|
|
21
|
+
// type and stored values, as SwiftUI's own diffing sees them. Content a body
|
|
22
|
+
// reads from elsewhere (an observable object) is not part of it, so such a
|
|
23
|
+
// view keeps its first measurement. Views are measured in the root's
|
|
24
|
+
// environment, as Apple's hosting controller measures them in its own,
|
|
25
|
+
// without the environment of the view that asks. A view whose description
|
|
26
|
+
// changes on every render (one that stores a new UUID each time) would be
|
|
27
|
+
// measured forever: after a few rounds in a row that only found new views,
|
|
28
|
+
// measurements are still taken but no longer re-render.
|
|
29
|
+
|
|
30
|
+
/// A view's sizes as the page measured them: for a zero, unspecified and infinite proposal.
|
|
31
|
+
struct _MeasuredSizes: Equatable {
|
|
32
|
+
var min: CGSize
|
|
33
|
+
var ideal: CGSize
|
|
34
|
+
var max: CGSize
|
|
35
|
+
|
|
36
|
+
/// The size for `proposal`, as `LayoutSubview.sizeThatFits` answers it.
|
|
37
|
+
func fitting(_ proposal: ProposedViewSize) -> CGSize {
|
|
38
|
+
CGSize(
|
|
39
|
+
width: LayoutSubview.fit(proposal.width, min: min.width, ideal: ideal.width, max: max.width),
|
|
40
|
+
height: LayoutSubview.fit(proposal.height, min: min.height, ideal: ideal.height, max: max.height)
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// The page's measurements of views, by description, and the views waiting for one.
|
|
46
|
+
@MainActor
|
|
47
|
+
public final class _ViewMeasurements {
|
|
48
|
+
public static let shared = _ViewMeasurements()
|
|
49
|
+
|
|
50
|
+
private var sizes: [String: _MeasuredSizes] = [:]
|
|
51
|
+
/// Waiting views, in the order the measuring element renders them.
|
|
52
|
+
private(set) var pending: [(key: String, view: AnyView)] = []
|
|
53
|
+
private var pendingKeys: Set<String> = []
|
|
54
|
+
/// Rounds in a row in which measurements arrived and the render that
|
|
55
|
+
/// followed asked for new views again.
|
|
56
|
+
private var rounds = 0
|
|
57
|
+
static let maxRounds = 4
|
|
58
|
+
/// The runtime that rendered last: the one to render again.
|
|
59
|
+
weak var runtime: _Runtime?
|
|
60
|
+
|
|
61
|
+
init() {}
|
|
62
|
+
|
|
63
|
+
/// The size `view` takes for `proposal`, from the page's measurement;
|
|
64
|
+
/// nil until the page has measured it, and the view is then queued.
|
|
65
|
+
public func size<V: View>(of view: V, fitting proposal: ProposedViewSize) -> CGSize? {
|
|
66
|
+
let key = String(reflecting: view)
|
|
67
|
+
if let measured = sizes[key] { return measured.fitting(proposal) }
|
|
68
|
+
if pendingKeys.insert(key).inserted {
|
|
69
|
+
pending.append((key, AnyView(view)))
|
|
70
|
+
runtime?._scheduleRender()
|
|
71
|
+
}
|
|
72
|
+
return nil
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// Records the sizes of the pending views the page measured (`keys`, in order).
|
|
76
|
+
func record(_ measured: [(key: String, sizes: _MeasuredSizes)]) {
|
|
77
|
+
var added = false
|
|
78
|
+
for (key, value) in measured where pendingKeys.contains(key) {
|
|
79
|
+
sizes[key] = value
|
|
80
|
+
pendingKeys.remove(key)
|
|
81
|
+
added = true
|
|
82
|
+
}
|
|
83
|
+
guard added else { return }
|
|
84
|
+
pending.removeAll { sizes[$0.key] != nil }
|
|
85
|
+
rounds += 1
|
|
86
|
+
if rounds <= Self.maxRounds { runtime?._renderEverything() }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Called after a render: a render that asked for nothing new ends the rounds.
|
|
90
|
+
func renderFinished() {
|
|
91
|
+
if pending.isEmpty { rounds = 0 }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Forgets everything (tests).
|
|
95
|
+
func reset() {
|
|
96
|
+
sizes = [:]
|
|
97
|
+
pending = []
|
|
98
|
+
pendingKeys = []
|
|
99
|
+
rounds = 0
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// The off-screen element that has the pending views measured: a `layout`
|
|
104
|
+
/// element whose children are the views, transparent and not hit-testable.
|
|
105
|
+
struct _MeasuringView: View {
|
|
106
|
+
let entries: [(key: String, view: AnyView)]
|
|
107
|
+
|
|
108
|
+
var body: some View {
|
|
109
|
+
_MeasuringLayout(entries: entries)
|
|
110
|
+
.opacity(0)
|
|
111
|
+
.allowsHitTesting(false)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
struct _MeasuringLayout {
|
|
116
|
+
let entries: [(key: String, view: AnyView)]
|
|
117
|
+
}
|
|
118
|
+
extension _MeasuringLayout: _PrimitiveView {}
|
|
119
|
+
extension _MeasuringLayout: _HostView {
|
|
120
|
+
var _kind: String { "layout" }
|
|
121
|
+
|
|
122
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
123
|
+
.object(["proposal": .null, "size": .null, "frames": .null])
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
var _content: [any View] { entries.map(\.view) }
|
|
127
|
+
|
|
128
|
+
var _handler: ((_JSON) -> Void)? {
|
|
129
|
+
let keys = entries.map(\.key)
|
|
130
|
+
return { event in
|
|
131
|
+
// An event for another set of children (a render added views
|
|
132
|
+
// since) is left for the event about the current ones.
|
|
133
|
+
guard let (_, subviews) = _parseLayoutEvent(event), subviews.count == keys.count else { return }
|
|
134
|
+
let measured = zip(keys, subviews).map { key, subview in
|
|
135
|
+
(key: key, sizes: _MeasuredSizes(min: subview.min, ideal: subview.ideal, max: subview.max))
|
|
136
|
+
}
|
|
137
|
+
MainActor.assumeIsolated { _ViewMeasurements.shared.record(measured) }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -12,6 +12,17 @@ public enum _Op: Equatable, Sendable {
|
|
|
12
12
|
/// The app's `UserDefaults`, whole, after a change; the host stores them
|
|
13
13
|
/// and hands them back at the next launch (`SB_DEFAULTS`).
|
|
14
14
|
case defaults(_JSON)
|
|
15
|
+
/// Phase 13: something only the host can do (`fetch`, an `image` probe);
|
|
16
|
+
/// the host answers with a `response` event carrying the same id.
|
|
17
|
+
case request(id: Int, kind: String, params: _JSON)
|
|
18
|
+
/// Phase 18: one saved batch of a SwiftData store (an object with `store`,
|
|
19
|
+
/// `put` and `delete`); the host writes it to IndexedDB and hands the
|
|
20
|
+
/// store back at the next launch (`SB_SWIFTDATA`).
|
|
21
|
+
case swiftData(_JSON)
|
|
22
|
+
/// A bitmap's source (an image file, or a generator's pixels) under its
|
|
23
|
+
/// content key, sent once before the first element that draws it; the
|
|
24
|
+
/// host keeps it for the run (docs/ops-protocol.md, "Bitmaps and Core Image").
|
|
25
|
+
case imageData(_JSON)
|
|
15
26
|
|
|
16
27
|
public var json: _JSON {
|
|
17
28
|
switch self {
|
|
@@ -35,6 +46,20 @@ public enum _Op: Equatable, Sendable {
|
|
|
35
46
|
return .object(["op": .string("event")])
|
|
36
47
|
case .defaults(let values):
|
|
37
48
|
return .object(["op": .string("defaults"), "values": values])
|
|
49
|
+
case .request(let id, let kind, let params):
|
|
50
|
+
return .object(["op": .string("request"), "id": .number(Double(id)), "kind": .string(kind), "params": params])
|
|
51
|
+
case .swiftData(let change):
|
|
52
|
+
if case .object(var fields) = change {
|
|
53
|
+
fields["op"] = .string("swiftdata")
|
|
54
|
+
return .object(fields)
|
|
55
|
+
}
|
|
56
|
+
return .object(["op": .string("swiftdata")])
|
|
57
|
+
case .imageData(let source):
|
|
58
|
+
if case .object(var fields) = source {
|
|
59
|
+
fields["op"] = .string("imagedata")
|
|
60
|
+
return .object(fields)
|
|
61
|
+
}
|
|
62
|
+
return .object(["op": .string("imagedata")])
|
|
38
63
|
}
|
|
39
64
|
}
|
|
40
65
|
}
|
|
@@ -54,34 +79,55 @@ final class _HeadlessHost: _RenderHost {
|
|
|
54
79
|
}
|
|
55
80
|
}
|
|
56
81
|
|
|
57
|
-
/// Keeps pending ops serialized as a JSON array in a
|
|
58
|
-
///
|
|
82
|
+
/// Keeps pending ops serialized as a JSON array in a heap buffer that the
|
|
83
|
+
/// browser reads out of linear memory via the `sb_ops_*` exports, and their
|
|
84
|
+
/// `.bytes` values beside it (`sb_bytes_*`) once the page has asked for them
|
|
85
|
+
/// (else as base64). The ops are serialized when the page reads them, once
|
|
86
|
+
/// per batch, not on every `apply`.
|
|
59
87
|
@MainActor
|
|
60
88
|
final class _BufferedHost: _RenderHost {
|
|
61
89
|
static let shared = _BufferedHost()
|
|
62
90
|
|
|
63
91
|
private(set) var pending: [_Op] = []
|
|
64
92
|
private var buffer: UnsafeMutableBufferPointer<UInt8> = .allocate(capacity: 2)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
93
|
+
private let outbox = _BytesOutbox()
|
|
94
|
+
private var stale = true
|
|
95
|
+
/// The page reads `.bytes` beside the JSON: it called `sb_bytes_count`.
|
|
96
|
+
private var bytesBeside = false
|
|
69
97
|
|
|
70
98
|
func apply(_ ops: [_Op]) {
|
|
71
99
|
pending.append(contentsOf: ops)
|
|
72
|
-
|
|
100
|
+
stale = true
|
|
73
101
|
}
|
|
74
102
|
|
|
75
103
|
func clear() {
|
|
76
104
|
pending.removeAll()
|
|
77
|
-
|
|
105
|
+
stale = true
|
|
78
106
|
}
|
|
79
107
|
|
|
80
|
-
var pointer: Int32 { Int32(Int(bitPattern: buffer.baseAddress)) }
|
|
81
|
-
var length: Int32 { Int32(buffer.count) }
|
|
108
|
+
var pointer: Int32 { serialize(); return Int32(Int(bitPattern: buffer.baseAddress)) }
|
|
109
|
+
var length: Int32 { serialize(); return Int32(buffer.count) }
|
|
110
|
+
|
|
111
|
+
/// The buffer's text (tests: `pointer` is a wasm32 address).
|
|
112
|
+
var text: String { serialize(); return String(decoding: buffer, as: UTF8.self) }
|
|
113
|
+
|
|
114
|
+
/// The `.bytes` values of the pending ops, by the `n` of their `{"$bytes": n}`.
|
|
115
|
+
/// The first read opts the page in: from then on the ops name them as `{"$bytes": n}`.
|
|
116
|
+
var bytes: [UnsafeMutableBufferPointer<UInt8>] {
|
|
117
|
+
if !bytesBeside {
|
|
118
|
+
bytesBeside = true
|
|
119
|
+
stale = true
|
|
120
|
+
}
|
|
121
|
+
serialize()
|
|
122
|
+
return outbox.items
|
|
123
|
+
}
|
|
82
124
|
|
|
83
|
-
private func
|
|
84
|
-
|
|
125
|
+
private func serialize() {
|
|
126
|
+
guard stale else { return }
|
|
127
|
+
stale = false
|
|
128
|
+
outbox.removeAll()
|
|
129
|
+
let json = _JSON.array(pending.map(\.json))
|
|
130
|
+
let bytes = Array((bytesBeside ? json.serialized(outbox: outbox) : json.serialized).utf8)
|
|
85
131
|
buffer.deallocate()
|
|
86
132
|
buffer = .allocate(capacity: bytes.count)
|
|
87
133
|
_ = buffer.initialize(from: bytes)
|
|
@@ -8,6 +8,11 @@ struct _Element {
|
|
|
8
8
|
var key: AnyHashable?
|
|
9
9
|
/// What makes this element a selectable or deletable `List` row (Phase 8).
|
|
10
10
|
var row: _RowMark?
|
|
11
|
+
/// `accessibilityLabel` / `accessibilityIdentifier`, for event scripts only.
|
|
12
|
+
var accessibility: _AccessibilityMark?
|
|
13
|
+
/// `.layoutValue(key:value:)` above this element, by key type: what a
|
|
14
|
+
/// custom layout's subview reads (CustomLayout.swift).
|
|
15
|
+
var layoutValues: [ObjectIdentifier: Any]?
|
|
11
16
|
/// Identity of this element value: a fresh token per produced element,
|
|
12
17
|
/// kept by copies. Two elements with one token are the same subtree (a
|
|
13
18
|
/// clean node's cached output), which the reconciler skips whole.
|
|
@@ -59,6 +64,8 @@ final class _Reconciler {
|
|
|
59
64
|
var key: AnyHashable?
|
|
60
65
|
/// The token of the element this was rendered from.
|
|
61
66
|
var token: Int
|
|
67
|
+
/// Not sent to the host; headless event scripts match it.
|
|
68
|
+
var accessibility: _AccessibilityMark?
|
|
62
69
|
}
|
|
63
70
|
|
|
64
71
|
private(set) var roots: [Rendered] = []
|
|
@@ -152,6 +159,7 @@ final class _Reconciler {
|
|
|
152
159
|
if previous.token == element.token { return previous }
|
|
153
160
|
var rendered = previous
|
|
154
161
|
rendered.token = element.token
|
|
162
|
+
rendered.accessibility = element.accessibility
|
|
155
163
|
if rendered.props != element.props {
|
|
156
164
|
ops.append(.update(id: rendered.id, props: element.props))
|
|
157
165
|
rendered.props = element.props
|
|
@@ -170,7 +178,8 @@ final class _Reconciler {
|
|
|
170
178
|
let children = element.children.enumerated().map { childIndex, child in
|
|
171
179
|
create(child, parent: id, index: childIndex, ops: &ops)
|
|
172
180
|
}
|
|
173
|
-
return Rendered(id: id, kind: element.kind, props: element.props, children: children, key: element.key,
|
|
181
|
+
return Rendered(id: id, kind: element.kind, props: element.props, children: children, key: element.key,
|
|
182
|
+
token: element.token, accessibility: element.accessibility)
|
|
174
183
|
}
|
|
175
184
|
|
|
176
185
|
private func destroy(_ rendered: Rendered, ops: inout [_Op]) {
|