@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,60 @@
|
|
|
1
|
+
// Sheet and transition modifiers accepted for source compatibility. The
|
|
2
|
+
// page's sheet keeps its system background, corner radius and drag (to
|
|
3
|
+
// dismiss, and between detents); a navigation push or sheet keeps its own
|
|
4
|
+
// slide instead of iOS 18's zoom from a source view.
|
|
5
|
+
//
|
|
6
|
+
// `.presentationBackground`, `.presentationCornerRadius`,
|
|
7
|
+
// `.presentationBackgroundInteraction`, `.presentationSizing`,
|
|
8
|
+
// `.presentationDragIndicator`, `.interactiveDismissDisabled` (the sheet can
|
|
9
|
+
// still be dragged down), `.navigationTransition` and
|
|
10
|
+
// `.matchedTransitionSource` add nothing to the tree.
|
|
11
|
+
|
|
12
|
+
public struct PresentationBackgroundInteraction: Sendable {
|
|
13
|
+
let name: String
|
|
14
|
+
public static let automatic = PresentationBackgroundInteraction(name: "automatic")
|
|
15
|
+
public static let enabled = PresentationBackgroundInteraction(name: "enabled")
|
|
16
|
+
public static func enabled(upThrough detent: PresentationDetent) -> PresentationBackgroundInteraction { .enabled }
|
|
17
|
+
public static let disabled = PresentationBackgroundInteraction(name: "disabled")
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public struct PresentationSizing: Sendable {
|
|
21
|
+
let name: String
|
|
22
|
+
public static let automatic = PresentationSizing(name: "automatic")
|
|
23
|
+
public static let page = PresentationSizing(name: "page")
|
|
24
|
+
public static let form = PresentationSizing(name: "form")
|
|
25
|
+
public static let fitted = PresentationSizing(name: "fitted")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// A navigation transition (iOS 18); the page keeps the standard one.
|
|
29
|
+
public struct NavigationTransition: Sendable {
|
|
30
|
+
let name: String
|
|
31
|
+
public static let automatic = NavigationTransition(name: "automatic")
|
|
32
|
+
public static func zoom<ID: Hashable>(sourceID: ID, in namespace: Namespace.ID) -> NavigationTransition {
|
|
33
|
+
NavigationTransition(name: "zoom")
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// What `matchedTransitionSource(id:in:configuration:)` configures; unused.
|
|
38
|
+
public struct EmptyMatchedTransitionSourceConfiguration: Sendable {
|
|
39
|
+
public func background(_ style: Color) -> EmptyMatchedTransitionSourceConfiguration { self }
|
|
40
|
+
public func clipShape(_ shape: RoundedRectangle) -> EmptyMatchedTransitionSourceConfiguration { self }
|
|
41
|
+
public func shadow(color: Color = .black, radius: CGFloat, x: CGFloat = 0, y: CGFloat = 0)
|
|
42
|
+
-> EmptyMatchedTransitionSourceConfiguration { self }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
nonisolated extension View {
|
|
46
|
+
public func presentationBackground<S: ShapeStyle>(_ style: S) -> some View { self }
|
|
47
|
+
public func presentationBackground<V: View>(alignment: Alignment = .center, @ViewBuilder content: () -> V) -> some View { self }
|
|
48
|
+
public func presentationCornerRadius(_ cornerRadius: CGFloat?) -> some View { self }
|
|
49
|
+
public func presentationBackgroundInteraction(_ interaction: PresentationBackgroundInteraction) -> some View { self }
|
|
50
|
+
public func presentationSizing(_ sizing: PresentationSizing) -> some View { self }
|
|
51
|
+
public func presentationDragIndicator(_ visibility: Visibility) -> some View { self }
|
|
52
|
+
public func interactiveDismissDisabled(_ isDisabled: Bool = true) -> some View { self }
|
|
53
|
+
|
|
54
|
+
public func navigationTransition(_ style: NavigationTransition) -> some View { self }
|
|
55
|
+
public func matchedTransitionSource<ID: Hashable>(id: ID, in namespace: Namespace.ID) -> some View { self }
|
|
56
|
+
public func matchedTransitionSource<ID: Hashable>(
|
|
57
|
+
id: ID, in namespace: Namespace.ID,
|
|
58
|
+
configuration: (EmptyMatchedTransitionSourceConfiguration) -> EmptyMatchedTransitionSourceConfiguration
|
|
59
|
+
) -> some View { self }
|
|
60
|
+
}
|
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
// MARK: - Text
|
|
4
|
+
|
|
5
|
+
/// A localization key, as Xcode writes it in a string catalog: the literal
|
|
6
|
+
/// text with a specifier for each interpolation (`"\(count) posts"` is the
|
|
7
|
+
/// key `"%lld posts"` with the argument `count`), looked up in the app's string
|
|
8
|
+
/// tables when shown (Localization/Localization.swift). A key the tables lack
|
|
9
|
+
/// is its own text.
|
|
10
|
+
public struct LocalizedStringKey: Equatable, Sendable, ExpressibleByStringInterpolation {
|
|
11
|
+
/// The key, with `%%` for a literal percent sign when it has arguments.
|
|
12
|
+
let formatKey: String
|
|
13
|
+
let arguments: [Argument]
|
|
14
|
+
|
|
15
|
+
/// An interpolated value: one a specifier formats, or a view in the text.
|
|
16
|
+
enum Argument: Equatable, Sendable {
|
|
17
|
+
case value(_LocalizationArgument)
|
|
18
|
+
case image(Image)
|
|
19
|
+
case text(Text)
|
|
20
|
+
|
|
21
|
+
var formatted: _LocalizationArgument? {
|
|
22
|
+
if case .value(let value) = self { return value }
|
|
23
|
+
return nil
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public init(_ value: String) { formatKey = value; arguments = [] }
|
|
28
|
+
public init(stringLiteral value: String) { formatKey = value; arguments = [] }
|
|
29
|
+
public init(stringInterpolation: StringInterpolation) {
|
|
30
|
+
formatKey = stringInterpolation.key
|
|
31
|
+
arguments = stringInterpolation.arguments
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// The localized text, views left out: what titles, labels and placeholders show.
|
|
35
|
+
public var key: String { _resolved(table: nil, bundlePath: nil) }
|
|
36
|
+
|
|
37
|
+
/// The localized text from `table` in the bundle at `bundlePath` (the main bundle when nil).
|
|
38
|
+
public func _resolved(table: String?, bundlePath: String?) -> String {
|
|
39
|
+
_Localization.string(key: formatKey, arguments: arguments.map(\.formatted), table: table, bundlePath: bundlePath)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// The localized pieces, with the views in their places.
|
|
43
|
+
func _pieces(table: String?, bundlePath: String?) -> [_LocalizedPiece] {
|
|
44
|
+
_Localization.resolve(key: formatKey, arguments: arguments.map(\.formatted), table: table, bundlePath: bundlePath)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// Builds the key as SwiftUI does: each interpolation adds the specifier of
|
|
48
|
+
/// its type (`%@` for strings and views, `%lld` for `Int`, `%lf` for
|
|
49
|
+
/// `Double`…) and an argument; literal percent signs are doubled.
|
|
50
|
+
public struct StringInterpolation: StringInterpolationProtocol {
|
|
51
|
+
var key = ""
|
|
52
|
+
var arguments: [Argument] = []
|
|
53
|
+
public init(literalCapacity: Int, interpolationCount: Int) {}
|
|
54
|
+
|
|
55
|
+
public mutating func appendLiteral(_ literal: String) {
|
|
56
|
+
key += literal.replacingOccurrences(of: "%", with: "%%")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// An argument with its specifier: for the shim's own interpolations (a date with a style).
|
|
60
|
+
public mutating func _append(_ argument: _LocalizationArgument, specifier: String) {
|
|
61
|
+
key += specifier
|
|
62
|
+
arguments.append(.value(argument))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// A string the shim made (a formatted value): `%@`.
|
|
66
|
+
mutating func append(_ string: String) { _append(.string(string), specifier: "%@") }
|
|
67
|
+
|
|
68
|
+
public mutating func appendInterpolation(_ string: String) { append(string) }
|
|
69
|
+
public mutating func appendInterpolation<T>(_ value: T) { append(String(describing: value)) }
|
|
70
|
+
/// A number, with its type's specifier (`%lld` for `Int`, `%lf` for `Double`…).
|
|
71
|
+
public mutating func appendInterpolation<T: _FormatSpecifiable>(_ value: T) {
|
|
72
|
+
_append(value._localizationArgument, specifier: T._specifier)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// `"\(value, specifier: "%.1f")"`: the key holds the given specifier.
|
|
76
|
+
public mutating func appendInterpolation<T>(_ value: T, specifier: String) {
|
|
77
|
+
_append((value as? any _FormatSpecifiable)?._localizationArgument ?? .string(String(describing: value)), specifier: specifier)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// `"\(price, format: .currency(code: "USD"))"`: `%@`, the formatted value.
|
|
81
|
+
public mutating func appendInterpolation<F: FormatStyle>(_ value: F.FormatInput, format: F) where F.FormatOutput == String {
|
|
82
|
+
append(format.format(value))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// An image inline in the text: `Text("\(Image(systemName: "star")) Favorites")`.
|
|
86
|
+
public mutating func appendInterpolation(_ image: Image) {
|
|
87
|
+
key += "%@"
|
|
88
|
+
arguments.append(.image(image))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// A styled text inline: `Text("Hello \(Text("world").bold())")`.
|
|
92
|
+
public mutating func appendInterpolation(_ text: Text) {
|
|
93
|
+
key += "%@"
|
|
94
|
+
arguments.append(.text(text))
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// MARK: - Image
|
|
100
|
+
|
|
101
|
+
/// An SF Symbol (`systemName`) or an image from the app's asset catalog
|
|
102
|
+
/// (`name`, possibly namespaced like `"dough/plain-full"`). The renderer owns
|
|
103
|
+
/// the pixels: asset images come from the catalog manifest the web side
|
|
104
|
+
/// builds from `Examples/<App>/*.xcassets` (see docs/ops-protocol.md).
|
|
105
|
+
public struct Image: Equatable, Sendable {
|
|
106
|
+
enum Source: Equatable, Sendable {
|
|
107
|
+
case system(String)
|
|
108
|
+
case named(String)
|
|
109
|
+
/// Phase 13: a remote image the browser loads itself (`AsyncImage`);
|
|
110
|
+
/// `width` and `height` are its intrinsic size in points.
|
|
111
|
+
case url(String, width: Double, height: Double)
|
|
112
|
+
/// A `UIImage` or `CGImage` bitmap the page draws from its recipe
|
|
113
|
+
/// (Bitmaps.swift); `width` and `height` are its size in points.
|
|
114
|
+
case bitmap(_ImageRecipe, width: Double, height: Double)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
let source: Source
|
|
118
|
+
/// `.resizable()`: fill the proposed size instead of the intrinsic one.
|
|
119
|
+
let isResizable: Bool
|
|
120
|
+
/// `.interpolation(.none)`: scaled without smoothing (a QR code's modules
|
|
121
|
+
/// stay square). The other levels draw as the browser smooths.
|
|
122
|
+
var interpolation: Interpolation = .high
|
|
123
|
+
|
|
124
|
+
public init(systemName: String) {
|
|
125
|
+
source = .system(systemName)
|
|
126
|
+
isResizable = false
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// An image from the asset catalog, which is the whole app's: packages'
|
|
130
|
+
/// catalogs included. `Image(_:bundle:)` (FoundationBridge, which has
|
|
131
|
+
/// `Bundle`) draws the same image.
|
|
132
|
+
public init(_ name: String) {
|
|
133
|
+
source = .named(name)
|
|
134
|
+
isResizable = false
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/// A catalog image hidden from assistive technology (no bridge in the
|
|
138
|
+
/// browser, so it draws like `Image(_:)`). `bundle:` as for `Image(_:)`.
|
|
139
|
+
public init(decorative name: String) {
|
|
140
|
+
source = .named(name)
|
|
141
|
+
isResizable = false
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
init(source: Source, isResizable: Bool) {
|
|
145
|
+
self.source = source
|
|
146
|
+
self.isResizable = isResizable
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/// An image at a URL the host has already loaded (`AsyncImage` asks it
|
|
150
|
+
/// to, and learns the pixel size); `scale` turns pixels into points.
|
|
151
|
+
public init(_url url: String, pixelWidth: Double, pixelHeight: Double, scale: Double) {
|
|
152
|
+
let factor = scale > 0 ? scale : 1
|
|
153
|
+
source = .url(url, width: pixelWidth / factor, height: pixelHeight / factor)
|
|
154
|
+
isResizable = false
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// The SF Symbol name, for labels that render the icon as a glyph (tab
|
|
158
|
+
/// items, menu pickers); nil for catalog images.
|
|
159
|
+
var systemName: String? {
|
|
160
|
+
if case .system(let name) = source { return name }
|
|
161
|
+
return nil
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public func resizable() -> Image {
|
|
165
|
+
var copy = Image(source: source, isResizable: true)
|
|
166
|
+
copy.interpolation = interpolation
|
|
167
|
+
return copy
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// `.none` draws without smoothing; the other levels are the browser's.
|
|
171
|
+
public enum Interpolation: Hashable, Sendable {
|
|
172
|
+
case none, low, medium, high
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public func interpolation(_ interpolation: Interpolation) -> Image {
|
|
176
|
+
var copy = self
|
|
177
|
+
copy.interpolation = interpolation
|
|
178
|
+
return copy
|
|
179
|
+
}
|
|
180
|
+
public func antialiased(_ isAntialiased: Bool) -> Image { self }
|
|
181
|
+
|
|
182
|
+
/// Whether an image draws its own colors or, as a template, the foreground
|
|
183
|
+
/// color through its shape. SF Symbols are templates already.
|
|
184
|
+
public enum TemplateRenderingMode: Hashable, Sendable {
|
|
185
|
+
case template, original
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/// Approximation: a bitmap draws its own colors either way (tint one with
|
|
189
|
+
/// `UIImage.withTintColor(_:)`); symbols take the foreground color as before.
|
|
190
|
+
public func renderingMode(_ renderingMode: TemplateRenderingMode?) -> Image { self }
|
|
191
|
+
|
|
192
|
+
/// Symbols draw in one color here, whatever the mode (as the View modifier).
|
|
193
|
+
public func symbolRenderingMode(_ mode: SymbolRenderingMode?) -> Image { self }
|
|
194
|
+
|
|
195
|
+
/// The page draws images in the browser's range.
|
|
196
|
+
public func allowedDynamicRange(_ range: DynamicRange?) -> Image { self }
|
|
197
|
+
|
|
198
|
+
public struct DynamicRange: Hashable, Sendable {
|
|
199
|
+
let name: String
|
|
200
|
+
public static let standard = DynamicRange(name: "standard")
|
|
201
|
+
public static let constrainedHigh = DynamicRange(name: "constrainedHigh")
|
|
202
|
+
public static let high = DynamicRange(name: "high")
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
extension Image: _PrimitiveView {}
|
|
206
|
+
extension Image: _HostView {
|
|
207
|
+
var _kind: String { "image" }
|
|
208
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
209
|
+
var props: [String: _JSON]
|
|
210
|
+
switch source {
|
|
211
|
+
case .system(let name):
|
|
212
|
+
return .object(["systemName": .string(name)])
|
|
213
|
+
case .named(let name):
|
|
214
|
+
props = ["name": .string(name), "resizable": .bool(isResizable)]
|
|
215
|
+
case .url(let url, let width, let height):
|
|
216
|
+
props = ["url": .string(url), "resizable": .bool(isResizable), "width": .number(width), "height": .number(height)]
|
|
217
|
+
case .bitmap(let recipe, let width, let height):
|
|
218
|
+
props = ["bitmap": recipe.json, "resizable": .bool(isResizable), "width": .number(width), "height": .number(height)]
|
|
219
|
+
}
|
|
220
|
+
if interpolation == .none { props["interpolation"] = .string("none") }
|
|
221
|
+
return .object(props)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// MARK: - Stacks
|
|
226
|
+
|
|
227
|
+
public struct VStack<Content: View> {
|
|
228
|
+
let alignment: HorizontalAlignment
|
|
229
|
+
let spacing: CGFloat?
|
|
230
|
+
let content: Content
|
|
231
|
+
|
|
232
|
+
public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
|
|
233
|
+
@ViewBuilder content: () -> Content) {
|
|
234
|
+
self.alignment = alignment
|
|
235
|
+
self.spacing = spacing
|
|
236
|
+
self.content = content()
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
extension VStack: _PrimitiveView {}
|
|
240
|
+
extension VStack: _HostView {
|
|
241
|
+
var _kind: String { "vstack" }
|
|
242
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
243
|
+
.object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
|
|
244
|
+
}
|
|
245
|
+
var _content: [any View] { [content] }
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public struct HStack<Content: View> {
|
|
249
|
+
let alignment: VerticalAlignment
|
|
250
|
+
let spacing: CGFloat?
|
|
251
|
+
let content: Content
|
|
252
|
+
|
|
253
|
+
public init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil,
|
|
254
|
+
@ViewBuilder content: () -> Content) {
|
|
255
|
+
self.alignment = alignment
|
|
256
|
+
self.spacing = spacing
|
|
257
|
+
self.content = content()
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
extension HStack: _PrimitiveView {}
|
|
261
|
+
extension HStack: _HostView {
|
|
262
|
+
var _kind: String { "hstack" }
|
|
263
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
264
|
+
.object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
|
|
265
|
+
}
|
|
266
|
+
var _content: [any View] { [content] }
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
public struct ZStack<Content: View> {
|
|
270
|
+
let alignment: Alignment
|
|
271
|
+
let content: Content
|
|
272
|
+
|
|
273
|
+
public init(alignment: Alignment = .center, @ViewBuilder content: () -> Content) {
|
|
274
|
+
self.alignment = alignment
|
|
275
|
+
self.content = content()
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
extension ZStack: _PrimitiveView {}
|
|
279
|
+
extension ZStack: _HostView {
|
|
280
|
+
var _kind: String { "zstack" }
|
|
281
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object(["alignment": .string(alignment._name)]) }
|
|
282
|
+
var _content: [any View] { [content] }
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/// Shows the first of its children whose ideal size fits the proposed space
|
|
286
|
+
/// on `axes` (the last when none fits). The renderer measures and chooses
|
|
287
|
+
/// (see docs/ops-protocol.md, Phase 7); the children are all its candidates.
|
|
288
|
+
public struct ViewThatFits<Content: View> {
|
|
289
|
+
let axes: Axis.Set
|
|
290
|
+
let content: Content
|
|
291
|
+
|
|
292
|
+
public init(in axes: Axis.Set = [.horizontal, .vertical], @ViewBuilder content: () -> Content) {
|
|
293
|
+
self.axes = axes
|
|
294
|
+
self.content = content()
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
extension ViewThatFits: _PrimitiveView {}
|
|
298
|
+
extension ViewThatFits: _HostView {
|
|
299
|
+
var _kind: String { "viewthatfits" }
|
|
300
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object(["axes": .string(axes._name)]) }
|
|
301
|
+
var _content: [any View] { [content] }
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
public struct Spacer: Sendable {
|
|
305
|
+
let minLength: CGFloat?
|
|
306
|
+
public init(minLength: CGFloat? = nil) { self.minLength = minLength }
|
|
307
|
+
}
|
|
308
|
+
extension Spacer: _PrimitiveView {}
|
|
309
|
+
extension Spacer: _HostView {
|
|
310
|
+
var _kind: String { "spacer" }
|
|
311
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
312
|
+
.object(["minLength": minLength.map(_JSON.number) ?? .null])
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
public struct Divider: Sendable {
|
|
317
|
+
public init() {}
|
|
318
|
+
}
|
|
319
|
+
extension Divider: _PrimitiveView {}
|
|
320
|
+
extension Divider: _HostView {
|
|
321
|
+
var _kind: String { "divider" }
|
|
322
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object([:]) }
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// MARK: - ScrollView
|
|
326
|
+
|
|
327
|
+
public enum Axis: Int8, CaseIterable, Sendable {
|
|
328
|
+
case horizontal, vertical
|
|
329
|
+
|
|
330
|
+
public struct Set: OptionSet, Sendable {
|
|
331
|
+
public let rawValue: Int8
|
|
332
|
+
public init(rawValue: Int8) { self.rawValue = rawValue }
|
|
333
|
+
public static let horizontal = Set(rawValue: 1 << 0)
|
|
334
|
+
public static let vertical = Set(rawValue: 1 << 1)
|
|
335
|
+
|
|
336
|
+
/// `"horizontal"`, `"vertical"` or `"both"` (also for an empty set).
|
|
337
|
+
var _name: String {
|
|
338
|
+
if self == .horizontal { return "horizontal" }
|
|
339
|
+
if self == .vertical { return "vertical" }
|
|
340
|
+
return "both"
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
public struct ScrollView<Content: View> {
|
|
346
|
+
let axes: Axis.Set
|
|
347
|
+
let content: Content
|
|
348
|
+
/// `.refreshable`: true while the action runs.
|
|
349
|
+
@State var refreshing = false
|
|
350
|
+
|
|
351
|
+
public init(_ axes: Axis.Set = .vertical, showsIndicators: Bool = true,
|
|
352
|
+
@ViewBuilder content: () -> Content) {
|
|
353
|
+
self.axes = axes
|
|
354
|
+
self.content = content()
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
extension ScrollView: _PrimitiveView {}
|
|
358
|
+
extension ScrollView: _HostView {
|
|
359
|
+
var _kind: String { "scrollview" }
|
|
360
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
361
|
+
var props: [String: _JSON] = ["axes": .string(axes._name)]
|
|
362
|
+
_refresh(in: environment).addProps(to: &props)
|
|
363
|
+
if let snap = environment._scrollTargetBehavior { props["snap"] = .string(snap) }
|
|
364
|
+
// `.scrollDismissesKeyboard` (ScrollModifiers.swift).
|
|
365
|
+
if environment._scrollDismissesKeyboard { props["dismissesKeyboard"] = .bool(true) }
|
|
366
|
+
return .object(props)
|
|
367
|
+
}
|
|
368
|
+
var _content: [any View] { [content] }
|
|
369
|
+
}
|
|
370
|
+
extension ScrollView: _EnvironmentContent {
|
|
371
|
+
/// `.contentMargins` above (ScrollModifiers.swift): padding inside the scroll view.
|
|
372
|
+
func _content(in environment: EnvironmentValues) -> [any View] {
|
|
373
|
+
guard let margins = environment._scrollContentMargins else { return [content] }
|
|
374
|
+
return [content.padding(margins)]
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
extension ScrollView: _Refreshing {
|
|
378
|
+
func _refresh(in environment: EnvironmentValues) -> _Refresh {
|
|
379
|
+
_Refresh(action: environment._refreshAction, refreshing: $refreshing)
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// MARK: - Button
|
|
384
|
+
|
|
385
|
+
public struct ButtonRole: Equatable, Sendable {
|
|
386
|
+
let name: String
|
|
387
|
+
public static let destructive = ButtonRole(name: "destructive")
|
|
388
|
+
public static let cancel = ButtonRole(name: "cancel")
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
public struct Button<Label: View> {
|
|
392
|
+
let action: @MainActor () -> Void
|
|
393
|
+
let role: ButtonRole?
|
|
394
|
+
let label: Label
|
|
395
|
+
|
|
396
|
+
public init(action: @escaping @MainActor () -> Void, @ViewBuilder label: () -> Label) {
|
|
397
|
+
self.action = action
|
|
398
|
+
self.role = nil
|
|
399
|
+
self.label = label()
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
public init(role: ButtonRole?, action: @escaping @MainActor () -> Void,
|
|
403
|
+
@ViewBuilder label: () -> Label) {
|
|
404
|
+
self.action = action
|
|
405
|
+
self.role = role
|
|
406
|
+
self.label = label()
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
extension Button where Label == Text {
|
|
411
|
+
@_disfavoredOverload
|
|
412
|
+
public init<S: StringProtocol>(_ title: S, action: @escaping @MainActor () -> Void) {
|
|
413
|
+
self.init(action: action) { Text(title) }
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
@_disfavoredOverload
|
|
417
|
+
public init<S: StringProtocol>(_ title: S, role: ButtonRole?, action: @escaping @MainActor () -> Void) {
|
|
418
|
+
self.init(role: role, action: action) { Text(title) }
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
public init(_ titleKey: LocalizedStringKey, action: @escaping @MainActor () -> Void) {
|
|
422
|
+
self.init(action: action) { Text(titleKey) }
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
public init(_ titleKey: LocalizedStringKey, role: ButtonRole?, action: @escaping @MainActor () -> Void) {
|
|
426
|
+
self.init(role: role, action: action) { Text(titleKey) }
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
extension Button where Label == SwiftUI.Label<Text, Image> {
|
|
431
|
+
@_disfavoredOverload
|
|
432
|
+
public init<S: StringProtocol>(_ title: S, systemImage: String, action: @escaping @MainActor () -> Void) {
|
|
433
|
+
let title = String(title)
|
|
434
|
+
self.init(action: action) { SwiftUI.Label(title, systemImage: systemImage) }
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
@_disfavoredOverload
|
|
438
|
+
public init<S: StringProtocol>(_ title: S, systemImage: String, role: ButtonRole?,
|
|
439
|
+
action: @escaping @MainActor () -> Void) {
|
|
440
|
+
let title = String(title)
|
|
441
|
+
self.init(role: role, action: action) { SwiftUI.Label(title, systemImage: systemImage) }
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
public init(_ titleKey: LocalizedStringKey, systemImage: String, action: @escaping @MainActor () -> Void) {
|
|
445
|
+
self.init(action: action) { SwiftUI.Label(titleKey, systemImage: systemImage) }
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
public init(_ titleKey: LocalizedStringKey, systemImage: String, role: ButtonRole?,
|
|
449
|
+
action: @escaping @MainActor () -> Void) {
|
|
450
|
+
self.init(role: role, action: action) { SwiftUI.Label(titleKey, systemImage: systemImage) }
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
extension Button: _PrimitiveView {}
|
|
454
|
+
extension Button: _HostView {
|
|
455
|
+
var _kind: String { "button" }
|
|
456
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
457
|
+
.object([
|
|
458
|
+
// A custom `ButtonStyle` draws its own look: `plain` (ButtonStyles.swift).
|
|
459
|
+
"style": .string(environment._buttonStyle == _CustomButtonStyle.marker ? "plain" : environment._buttonStyle),
|
|
460
|
+
"role": role.map { .string($0.name) } ?? .null,
|
|
461
|
+
])
|
|
462
|
+
}
|
|
463
|
+
var _content: [any View] { [label] }
|
|
464
|
+
var _handler: ((_JSON) -> Void)? {
|
|
465
|
+
let action = self.action
|
|
466
|
+
return { _ in MainActor.assumeIsolated { action() } }
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// MARK: - Button styles
|
|
471
|
+
|
|
472
|
+
public protocol PrimitiveButtonStyle {
|
|
473
|
+
var _name: String { get }
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
public struct DefaultButtonStyle: PrimitiveButtonStyle {
|
|
477
|
+
public init() {}
|
|
478
|
+
public var _name: String { "automatic" }
|
|
479
|
+
}
|
|
480
|
+
public struct PlainButtonStyle: PrimitiveButtonStyle {
|
|
481
|
+
public init() {}
|
|
482
|
+
public var _name: String { "plain" }
|
|
483
|
+
}
|
|
484
|
+
public struct BorderedButtonStyle: PrimitiveButtonStyle {
|
|
485
|
+
public init() {}
|
|
486
|
+
public var _name: String { "bordered" }
|
|
487
|
+
}
|
|
488
|
+
public struct BorderedProminentButtonStyle: PrimitiveButtonStyle {
|
|
489
|
+
public init() {}
|
|
490
|
+
public var _name: String { "borderedProminent" }
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
public struct BorderlessButtonStyle: PrimitiveButtonStyle {
|
|
494
|
+
public init() {}
|
|
495
|
+
public var _name: String { "plain" }
|
|
496
|
+
}
|
|
497
|
+
extension PrimitiveButtonStyle where Self == BorderlessButtonStyle {
|
|
498
|
+
public static var borderless: BorderlessButtonStyle { BorderlessButtonStyle() }
|
|
499
|
+
}
|
|
500
|
+
extension PrimitiveButtonStyle where Self == DefaultButtonStyle {
|
|
501
|
+
public static var automatic: DefaultButtonStyle { DefaultButtonStyle() }
|
|
502
|
+
}
|
|
503
|
+
extension PrimitiveButtonStyle where Self == PlainButtonStyle {
|
|
504
|
+
public static var plain: PlainButtonStyle { PlainButtonStyle() }
|
|
505
|
+
}
|
|
506
|
+
extension PrimitiveButtonStyle where Self == BorderedButtonStyle {
|
|
507
|
+
public static var bordered: BorderedButtonStyle { BorderedButtonStyle() }
|
|
508
|
+
}
|
|
509
|
+
extension PrimitiveButtonStyle where Self == BorderedProminentButtonStyle {
|
|
510
|
+
public static var borderedProminent: BorderedProminentButtonStyle { BorderedProminentButtonStyle() }
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
nonisolated extension View {
|
|
514
|
+
public func buttonStyle<S: PrimitiveButtonStyle>(_ style: S) -> some View {
|
|
515
|
+
environment(\._buttonStyle, style._name)
|
|
516
|
+
}
|
|
517
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/// The sliver of Combine that SwiftUI code reaches for without importing
|
|
2
|
+
/// Combine (Apple's SwiftUI re-exports it): `onReceive(_:perform:)` on a
|
|
3
|
+
/// publisher such as `Timer.publish(…).autoconnect()`. A `_Publisher` delivers
|
|
4
|
+
/// values to one subscriber at a time, on the main actor, until cancelled.
|
|
5
|
+
public protocol _Publisher {
|
|
6
|
+
associatedtype Output
|
|
7
|
+
/// Starts delivering values; the returned cancellable stops it.
|
|
8
|
+
@MainActor func _subscribe(_ receive: @escaping @MainActor (Output) -> Void) -> any _Cancellable
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public protocol _Cancellable: Sendable {
|
|
12
|
+
func cancel()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/// A cancellable backed by a task (publishers that tick from the executor).
|
|
16
|
+
public struct _TaskCancellable: _Cancellable {
|
|
17
|
+
let task: Task<Void, Never>
|
|
18
|
+
public init(_ task: Task<Void, Never>) { self.task = task }
|
|
19
|
+
public func cancel() { task.cancel() }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Emits `make()` every `interval` seconds, from the executor's clock (the same
|
|
23
|
+
/// clock as `.task` sleeps, so headless runs stay deterministic).
|
|
24
|
+
/// `Timer.publish` in FoundationBridge wraps this with `{ Date() }`.
|
|
25
|
+
public struct _IntervalPublisher<Output: Sendable>: _Publisher, Sendable {
|
|
26
|
+
public let interval: Double
|
|
27
|
+
let make: @Sendable () -> Output
|
|
28
|
+
|
|
29
|
+
public init(every interval: Double, make: @escaping @Sendable () -> Output) {
|
|
30
|
+
self.interval = interval
|
|
31
|
+
self.make = make
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// Starts ticking as soon as `onReceive` subscribes; Combine's `autoconnect`
|
|
35
|
+
/// has the same effect, so this is the identity.
|
|
36
|
+
public func autoconnect() -> _IntervalPublisher<Output> { self }
|
|
37
|
+
|
|
38
|
+
@MainActor public func _subscribe(_ receive: @escaping @MainActor (Output) -> Void) -> any _Cancellable {
|
|
39
|
+
let interval = max(interval, 0.001)
|
|
40
|
+
let make = self.make
|
|
41
|
+
let task = Task { @MainActor in
|
|
42
|
+
while !Task.isCancelled {
|
|
43
|
+
try? await Task.sleep(for: .seconds(interval))
|
|
44
|
+
if Task.isCancelled { break }
|
|
45
|
+
receive(make())
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return _TaskCancellable(task)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// The executor-driven timer behind `Timer.scheduledTimer(withTimeInterval:repeats:block:)`:
|
|
53
|
+
/// fires `block` after `interval` seconds, again every `interval` when
|
|
54
|
+
/// repeating, until `invalidate()`. Like Foundation's, a scheduled timer stays
|
|
55
|
+
/// alive until it has fired (or forever while repeating) whether or not the
|
|
56
|
+
/// caller keeps a reference.
|
|
57
|
+
public final class _ExecutorTimer: @unchecked Sendable {
|
|
58
|
+
public let timeInterval: Double
|
|
59
|
+
public private(set) var isValid = true
|
|
60
|
+
private var task: Task<Void, Never>?
|
|
61
|
+
|
|
62
|
+
public init(interval: Double, repeats: Bool, block: @escaping @Sendable (_ExecutorTimer) -> Void) {
|
|
63
|
+
timeInterval = interval
|
|
64
|
+
task = Task { @MainActor in
|
|
65
|
+
repeat {
|
|
66
|
+
try? await Task.sleep(for: .seconds(max(interval, 0.001)))
|
|
67
|
+
guard self.isValid, !Task.isCancelled else { return }
|
|
68
|
+
block(self)
|
|
69
|
+
} while repeats && !Task.isCancelled
|
|
70
|
+
self.isValid = false
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public func invalidate() {
|
|
75
|
+
isValid = false
|
|
76
|
+
task?.cancel()
|
|
77
|
+
task = nil
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/// `onReceive` is a task that subscribes while the view is on screen (the
|
|
82
|
+
/// runtime starts it on appear and cancels it when the view leaves).
|
|
83
|
+
struct _OnReceiveView<Content: View, P: _Publisher>: View {
|
|
84
|
+
let content: Content
|
|
85
|
+
let publisher: P
|
|
86
|
+
let action: @MainActor (P.Output) -> Void
|
|
87
|
+
var body: some View {
|
|
88
|
+
let publisher = self.publisher
|
|
89
|
+
let action = self.action
|
|
90
|
+
return content.task { @MainActor in
|
|
91
|
+
let cancellable = publisher._subscribe(action)
|
|
92
|
+
// Stay alive until cancelled; the publisher drives the callbacks.
|
|
93
|
+
while !Task.isCancelled {
|
|
94
|
+
try? await Task.sleep(for: .seconds(3600))
|
|
95
|
+
}
|
|
96
|
+
cancellable.cancel()
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
nonisolated extension View {
|
|
102
|
+
/// Calls `action` with every value `publisher` emits while the view is shown.
|
|
103
|
+
@MainActor
|
|
104
|
+
public func onReceive<P: _Publisher>(_ publisher: P, perform action: @escaping @MainActor (P.Output) -> Void) -> some View {
|
|
105
|
+
_OnReceiveView(content: self, publisher: publisher, action: action)
|
|
106
|
+
}
|
|
107
|
+
}
|