@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
|
@@ -94,7 +94,8 @@ extension EnvironmentValues {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
extension View {
|
|
97
|
+
nonisolated extension View {
|
|
98
|
+
@MainActor
|
|
98
99
|
public func labelStyle<S: LabelStyle>(_ style: S) -> some View {
|
|
99
100
|
environment(\._labelStyle, _AnyLabelStyle(style))
|
|
100
101
|
}
|
|
@@ -108,10 +109,16 @@ struct _StyledLabel: View {
|
|
|
108
109
|
@Environment(\._labelStyle) private var style
|
|
109
110
|
|
|
110
111
|
var body: some View {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
// The icon is marked so a list row can tint it (the title keeps the
|
|
113
|
+
// row's primary color), as iOS does for labels in lists.
|
|
114
|
+
let markedIcon = AnyView(icon)._styled { $0.extras["labelIcon"] = .bool(true) }
|
|
115
|
+
let configuration = LabelStyleConfiguration(title: .init(view: title), icon: .init(view: markedIcon))
|
|
116
|
+
let styled = style?.make(configuration) ?? DefaultLabelStyle().makeBody(configuration: configuration)
|
|
117
|
+
// As on iOS, the title stays the label's accessibility label when the
|
|
118
|
+
// style shows only the icon (a toolbar button), so an event script
|
|
119
|
+
// can name the button by it.
|
|
120
|
+
let titleText = _textContent(of: title)
|
|
121
|
+
if titleText.isEmpty { return AnyView(styled) }
|
|
122
|
+
return AnyView(AnyView(styled).accessibilityLabel(titleText))
|
|
116
123
|
}
|
|
117
124
|
}
|
|
@@ -10,7 +10,7 @@ public enum TextAlignment: Hashable, Sendable {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
extension View {
|
|
13
|
+
nonisolated extension View {
|
|
14
14
|
/// Sets the priority by which a parent stack hands out space.
|
|
15
15
|
public func layoutPriority(_ value: Double) -> some View {
|
|
16
16
|
_styled { $0.layoutPriority = value }
|
|
@@ -49,32 +49,62 @@ extension Color: _HostView {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/// A shape drawn as a view, optionally filled or stroked. `inset` strokes
|
|
52
|
-
/// (`strokeBorder`) lie inside the shape's bounds.
|
|
52
|
+
/// (`strokeBorder`) lie inside the shape's bounds. A custom shape (`"path"`)
|
|
53
|
+
/// is drawn from its path (Shape.swift), with the fill rule and the whole
|
|
54
|
+
/// stroke style; a built-in shape is drawn by name.
|
|
53
55
|
public struct _ShapeView<S: Shape> {
|
|
54
56
|
let shape: S
|
|
55
57
|
let fill: (any ShapeStyle)?
|
|
56
58
|
let stroke: (style: any ShapeStyle, lineWidth: CGFloat, inset: Bool)?
|
|
59
|
+
var eoFill = false
|
|
60
|
+
var strokeStyle: StrokeStyle? = nil
|
|
57
61
|
}
|
|
58
62
|
extension _ShapeView: _PrimitiveView {}
|
|
59
63
|
extension _ShapeView: _HostView {
|
|
60
64
|
var _kind: String { "shape" }
|
|
61
65
|
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
66
|
+
// A stroked shape filled with a style is its outline in that style.
|
|
67
|
+
if stroke == nil, let stroked = shape as? any _Stroked {
|
|
68
|
+
return stroked._outlineProps(style: fill ?? ForegroundStyle(), in: environment)
|
|
69
|
+
}
|
|
70
|
+
let drawsPath = shape._name == "path"
|
|
62
71
|
var stroke: _JSON = .null
|
|
63
72
|
if let s = self.stroke {
|
|
64
73
|
var object: [String: _JSON] = ["color": s.style._json, "lineWidth": .number(s.lineWidth)]
|
|
65
|
-
|
|
74
|
+
// A path is inset by the Swift side (Shape.swift); the page strokes it as is.
|
|
75
|
+
if s.inset && !drawsPath { object["inset"] = .bool(true) }
|
|
76
|
+
if drawsPath, let style = strokeStyle {
|
|
77
|
+
object["lineCap"] = .string(["butt", "round", "square"][Int(style.lineCap.rawValue)])
|
|
78
|
+
object["lineJoin"] = .string(["miter", "round", "bevel"][Int(style.lineJoin.rawValue)])
|
|
79
|
+
object["miterLimit"] = .number(style.miterLimit)
|
|
80
|
+
if !style.dash.isEmpty {
|
|
81
|
+
object["dash"] = .array(style.dash.map(_JSON.number))
|
|
82
|
+
object["dashPhase"] = .number(style.dashPhase)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
66
85
|
stroke = .object(object)
|
|
67
86
|
}
|
|
68
|
-
|
|
87
|
+
var props: [String: _JSON] = [
|
|
69
88
|
"shape": .string(shape._name),
|
|
70
|
-
"cornerRadius": .number(shape
|
|
89
|
+
"cornerRadius": .number(_resolvedCornerRadius(shape, in: environment)),
|
|
71
90
|
"fill": fill?._json ?? .null,
|
|
72
91
|
"stroke": stroke,
|
|
73
|
-
]
|
|
92
|
+
]
|
|
93
|
+
if drawsPath {
|
|
94
|
+
// The page reports the size the path is drawn for; the runtime
|
|
95
|
+
// adds the path (`_pathProps`).
|
|
96
|
+
props["reportsSize"] = .bool(true)
|
|
97
|
+
if eoFill { props["fillRule"] = .string("evenodd") }
|
|
98
|
+
} else if let trimmed = shape as? _TrimmedShape {
|
|
99
|
+
// `.trim(from:to:)` of a built-in shape (ShapeTrim.swift); a path is trimmed itself.
|
|
100
|
+
props["trim"] = trimmed._trimJSON
|
|
101
|
+
}
|
|
102
|
+
return .object(props)
|
|
74
103
|
}
|
|
75
104
|
}
|
|
76
105
|
|
|
77
|
-
///
|
|
106
|
+
/// How a shape is filled: `eoFill` uses the even-odd rule (a path's
|
|
107
|
+
/// overlapping parts cancel out) rather than the non-zero winding rule.
|
|
78
108
|
public struct FillStyle: Equatable, Sendable {
|
|
79
109
|
public var isEOFilled: Bool
|
|
80
110
|
public var isAntialiased: Bool
|
|
@@ -85,22 +115,25 @@ public struct FillStyle: Equatable, Sendable {
|
|
|
85
115
|
}
|
|
86
116
|
}
|
|
87
117
|
|
|
88
|
-
extension Shape {
|
|
118
|
+
nonisolated extension Shape {
|
|
89
119
|
public func fill<S: ShapeStyle>(_ style: S, style fillStyle: FillStyle = FillStyle()) -> some View {
|
|
90
|
-
_ShapeView(shape: self, fill: style, stroke: nil)
|
|
120
|
+
_ShapeView(shape: self, fill: style, stroke: nil, eoFill: fillStyle.isEOFilled)
|
|
91
121
|
}
|
|
92
122
|
|
|
93
123
|
/// Filled with the foreground style.
|
|
94
124
|
public func fill(style: FillStyle = FillStyle()) -> some View {
|
|
95
|
-
_ShapeView(shape: self, fill: ForegroundStyle(), stroke: nil)
|
|
125
|
+
_ShapeView(shape: self, fill: ForegroundStyle(), stroke: nil, eoFill: style.isEOFilled)
|
|
96
126
|
}
|
|
97
127
|
|
|
98
128
|
public func stroke<S: ShapeStyle>(_ style: S, lineWidth: CGFloat = 1) -> some View {
|
|
99
129
|
_ShapeView(shape: self, fill: nil, stroke: (style, lineWidth, false))
|
|
100
130
|
}
|
|
101
131
|
|
|
102
|
-
|
|
103
|
-
|
|
132
|
+
/// The outline as a shape (iOS 17), so it can be filled or passed where a
|
|
133
|
+
/// shape goes (`.overlay(.bar, in: .capsule.stroke())`); as a view it is
|
|
134
|
+
/// the outline in the foreground style.
|
|
135
|
+
public func stroke(lineWidth: CGFloat = 1, antialiased: Bool = true) -> _StrokedShape<Self> {
|
|
136
|
+
_StrokedShape(base: self, lineWidth: lineWidth)
|
|
104
137
|
}
|
|
105
138
|
|
|
106
139
|
/// A stroke drawn inside the shape's bounds.
|
|
@@ -163,3 +196,25 @@ private func _shapeProps(_ shape: some Shape) -> _JSON {
|
|
|
163
196
|
"stroke": .null,
|
|
164
197
|
])
|
|
165
198
|
}
|
|
199
|
+
|
|
200
|
+
/// A shape's outline as a shape (`shape.stroke(lineWidth:)`, iOS 17): drawn,
|
|
201
|
+
/// or filled with a style, as the base shape stroked with that style.
|
|
202
|
+
nonisolated public struct _StrokedShape<Base: Shape>: Shape {
|
|
203
|
+
let base: Base
|
|
204
|
+
let lineWidth: CGFloat
|
|
205
|
+
|
|
206
|
+
public var _name: String { base._name }
|
|
207
|
+
public var _cornerRadius: CGFloat { base._cornerRadius }
|
|
208
|
+
/// The base's path: a custom shape's outline is drawn from it.
|
|
209
|
+
public func path(in rect: CGRect) -> Path { base.path(in: rect) }
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
protocol _Stroked {
|
|
213
|
+
func _outlineProps(style: any ShapeStyle, in environment: EnvironmentValues) -> _JSON
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
extension _StrokedShape: _Stroked {
|
|
217
|
+
func _outlineProps(style: any ShapeStyle, in environment: EnvironmentValues) -> _JSON {
|
|
218
|
+
_ShapeView(shape: base, fill: nil, stroke: (style, lineWidth, false))._props(in: environment)
|
|
219
|
+
}
|
|
220
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// `LazyVStack` and `LazyHStack`: the same `vstack` / `hstack` elements as
|
|
2
|
+
// `VStack` and `HStack`, whose `ForEach` rows are built as they come near the
|
|
3
|
+
// visible area (Runtime/LazyRows.swift), as a `List`'s are.
|
|
4
|
+
// `pinnedViews` is accepted: section headers and footers scroll with their
|
|
5
|
+
// rows instead of sticking to the scroll view's edge.
|
|
6
|
+
|
|
7
|
+
public struct LazyVStack<Content: View> {
|
|
8
|
+
let alignment: HorizontalAlignment
|
|
9
|
+
let spacing: CGFloat?
|
|
10
|
+
let content: Content
|
|
11
|
+
|
|
12
|
+
public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
|
|
13
|
+
pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content) {
|
|
14
|
+
self.alignment = alignment
|
|
15
|
+
self.spacing = spacing
|
|
16
|
+
self.content = content()
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
extension LazyVStack: _PrimitiveView {}
|
|
20
|
+
extension LazyVStack: _HostView {
|
|
21
|
+
var _kind: String { "vstack" }
|
|
22
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
23
|
+
.object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
|
|
24
|
+
}
|
|
25
|
+
var _content: [any View] { [content] }
|
|
26
|
+
}
|
|
27
|
+
extension LazyVStack: _ScrollTargetContainer {}
|
|
28
|
+
|
|
29
|
+
public struct LazyHStack<Content: View> {
|
|
30
|
+
let alignment: VerticalAlignment
|
|
31
|
+
let spacing: CGFloat?
|
|
32
|
+
let content: Content
|
|
33
|
+
|
|
34
|
+
public init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil,
|
|
35
|
+
pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content) {
|
|
36
|
+
self.alignment = alignment
|
|
37
|
+
self.spacing = spacing
|
|
38
|
+
self.content = content()
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
extension LazyHStack: _PrimitiveView {}
|
|
42
|
+
extension LazyHStack: _HostView {
|
|
43
|
+
var _kind: String { "hstack" }
|
|
44
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
45
|
+
.object(["spacing": spacing.map(_JSON.number) ?? .null, "alignment": .string(alignment.name)])
|
|
46
|
+
}
|
|
47
|
+
var _content: [any View] { [content] }
|
|
48
|
+
}
|
|
49
|
+
extension LazyHStack: _ScrollTargetContainer {}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// SwiftUI's first alert API, still common in packages: `Alert` values with
|
|
2
|
+
// `Alert.Button`s, shown by `.alert(isPresented:content:)` or
|
|
3
|
+
// `.alert(item:content:)`, and `@Environment(\.presentationMode)`. An
|
|
4
|
+
// `Alert` becomes the same `alert` element as the newer `.alert(_:isPresented:
|
|
5
|
+
// actions:message:)` (Alert.swift): each button is a `Button` with its role.
|
|
6
|
+
|
|
7
|
+
/// An alert: a title, an optional message and up to two buttons.
|
|
8
|
+
public struct Alert {
|
|
9
|
+
let title: Text
|
|
10
|
+
let message: Text?
|
|
11
|
+
let buttons: [Button]
|
|
12
|
+
|
|
13
|
+
public init(title: Text, message: Text? = nil, dismissButton: Button? = nil) {
|
|
14
|
+
self.title = title
|
|
15
|
+
self.message = message
|
|
16
|
+
buttons = dismissButton.map { [$0] } ?? []
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public init(title: Text, message: Text? = nil, primaryButton: Button, secondaryButton: Button) {
|
|
20
|
+
self.title = title
|
|
21
|
+
self.message = message
|
|
22
|
+
buttons = [primaryButton, secondaryButton]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// An alert button: a label, a role and an action.
|
|
26
|
+
public struct Button {
|
|
27
|
+
let label: Text
|
|
28
|
+
let role: ButtonRole?
|
|
29
|
+
let action: (() -> Void)?
|
|
30
|
+
|
|
31
|
+
public static func `default`(_ label: Text, action: (() -> Void)? = {}) -> Button {
|
|
32
|
+
Button(label: label, role: nil, action: action)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public static func cancel(_ label: Text, action: (() -> Void)? = {}) -> Button {
|
|
36
|
+
Button(label: label, role: .cancel, action: action)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// "Cancel".
|
|
40
|
+
public static func cancel(_ action: (() -> Void)? = {}) -> Button {
|
|
41
|
+
Button(label: Text("Cancel"), role: .cancel, action: action)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public static func destructive(_ label: Text, action: (() -> Void)? = {}) -> Button {
|
|
45
|
+
Button(label: label, role: .destructive, action: action)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// The buttons as views; "OK" when the alert has none, as SwiftUI shows.
|
|
50
|
+
@MainActor var actions: [SwiftUI.Button<Text>] {
|
|
51
|
+
let buttons = self.buttons.isEmpty ? [Button.default(Text("OK"))] : self.buttons
|
|
52
|
+
return buttons.map { button in
|
|
53
|
+
let action = button.action
|
|
54
|
+
return SwiftUI.Button(role: button.role, action: { action?() }) { button.label }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
extension View {
|
|
60
|
+
/// Shows the alert `content` makes while `isPresented` is true.
|
|
61
|
+
public func alert(isPresented: Binding<Bool>, content: () -> Alert) -> some View {
|
|
62
|
+
let alert = content()
|
|
63
|
+
return _AlertView(base: self, isPresented: isPresented, title: alert.title.content,
|
|
64
|
+
message: alert.message?.content, style: "alert",
|
|
65
|
+
actions: ForEach(Array(alert.actions.enumerated()), id: \.offset) { $0.element })
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// Shows the alert `content` makes from `item` while it is non-nil;
|
|
69
|
+
/// dismissing sets it back to nil.
|
|
70
|
+
public func alert<Item: Identifiable>(item: Binding<Item?>, content: (Item) -> Alert) -> some View {
|
|
71
|
+
let presented = Binding(get: { item.wrappedValue != nil }, set: { if !$0 { item.wrappedValue = nil } })
|
|
72
|
+
let alert = item.wrappedValue.map(content) ?? Alert(title: Text(""))
|
|
73
|
+
return _AlertView(base: self, isPresented: presented, title: alert.title.content,
|
|
74
|
+
message: alert.message?.content, style: "alert",
|
|
75
|
+
actions: ForEach(Array(alert.actions.enumerated()), id: \.offset) { $0.element })
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// MARK: - Presentation mode
|
|
80
|
+
|
|
81
|
+
/// Whether the view is presented, and how to dismiss it: `dismiss()` is the
|
|
82
|
+
/// environment's `dismiss` action.
|
|
83
|
+
public struct PresentationMode {
|
|
84
|
+
let dismissAction: DismissAction
|
|
85
|
+
|
|
86
|
+
/// True: the shim does not track this for the view.
|
|
87
|
+
public var isPresented: Bool { true }
|
|
88
|
+
|
|
89
|
+
@MainActor public mutating func dismiss() { dismissAction() }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
extension EnvironmentValues {
|
|
93
|
+
public var presentationMode: Binding<PresentationMode> {
|
|
94
|
+
let mode = PresentationMode(dismissAction: dismiss)
|
|
95
|
+
return Binding(get: { mode }, set: { _ in })
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -32,7 +32,7 @@ extension ListStyle where Self == GroupedListStyle {
|
|
|
32
32
|
public static var grouped: GroupedListStyle { GroupedListStyle() }
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
extension View {
|
|
35
|
+
nonisolated extension View {
|
|
36
36
|
public func listStyle<S: ListStyle>(_ style: S) -> some View {
|
|
37
37
|
environment(\._listStyle, style._name)
|
|
38
38
|
}
|
|
@@ -53,6 +53,12 @@ struct _ListSelection {
|
|
|
53
53
|
let accepts: (AnyHashable) -> Bool
|
|
54
54
|
/// `Set<Value>` selections toggle on tap; `Value?` selections set.
|
|
55
55
|
let isMultiple: Bool
|
|
56
|
+
/// The whole current selection, for the identity below.
|
|
57
|
+
let snapshot: () -> AnyHashable
|
|
58
|
+
/// Set by the runtime: the list and the selection the pass carried, so the
|
|
59
|
+
/// environments of two passes compare equal while the selection is unchanged
|
|
60
|
+
/// (the binding is re-created by every pass; see `_Sameness`).
|
|
61
|
+
var identity: _RuntimeKey?
|
|
56
62
|
|
|
57
63
|
init<Value: Hashable>(_ binding: Binding<Value?>) {
|
|
58
64
|
get = { binding.wrappedValue.map { AnyHashable($0) } }
|
|
@@ -67,6 +73,7 @@ struct _ListSelection {
|
|
|
67
73
|
}
|
|
68
74
|
accepts = { $0.base is Value }
|
|
69
75
|
isMultiple = false
|
|
76
|
+
snapshot = { AnyHashable(binding.wrappedValue) }
|
|
70
77
|
}
|
|
71
78
|
|
|
72
79
|
/// `get` / `set` reduce a multiple selection to one value: the first of the set.
|
|
@@ -93,11 +100,12 @@ struct _ListSelection {
|
|
|
93
100
|
}
|
|
94
101
|
accepts = { $0.base is Value }
|
|
95
102
|
isMultiple = true
|
|
103
|
+
snapshot = { AnyHashable(binding.wrappedValue) }
|
|
96
104
|
}
|
|
97
105
|
}
|
|
98
106
|
|
|
99
107
|
/// Lists that carry a selection binding; the runtime puts it in the rows' environment.
|
|
100
|
-
protocol _ListSelectionProviding {
|
|
108
|
+
protocol _ListSelectionProviding: _TraitBearing {
|
|
101
109
|
var _selection: _ListSelection? { get }
|
|
102
110
|
}
|
|
103
111
|
|
|
@@ -198,6 +206,12 @@ extension List: _HostView {
|
|
|
198
206
|
var props: [String: _JSON] = ["style": .string(environment._listStyle)]
|
|
199
207
|
if environment.editMode?.wrappedValue.isEditing == true { props["editing"] = .bool(true) }
|
|
200
208
|
_refresh(in: environment).addProps(to: &props)
|
|
209
|
+
// `.scrollDismissesKeyboard` (ScrollModifiers.swift).
|
|
210
|
+
if environment._scrollDismissesKeyboard { props["dismissesKeyboard"] = .bool(true) }
|
|
211
|
+
// `.scrollContentBackground(.hidden)` (ScrollViewReader.swift).
|
|
212
|
+
if environment._scrollContentBackground == .hidden { props["background"] = .string("hidden") }
|
|
213
|
+
// `.environment(\.defaultMinListRowHeight, 1)`: rows as short as their content.
|
|
214
|
+
if environment.defaultMinListRowHeight != 44 { props["minRowHeight"] = .number(Double(max(0, environment.defaultMinListRowHeight))) }
|
|
201
215
|
return .object(props)
|
|
202
216
|
}
|
|
203
217
|
var _content: [any View] { [content] }
|
|
@@ -211,7 +225,7 @@ extension List: _Refreshing {}
|
|
|
211
225
|
|
|
212
226
|
/// `List` and `ScrollView`: hosts whose `refresh` handler the runtime takes
|
|
213
227
|
/// from `_refresh(in:)` (the handler depends on the environment).
|
|
214
|
-
protocol _Refreshing {
|
|
228
|
+
protocol _Refreshing: _TraitBearing {
|
|
215
229
|
func _refresh(in environment: EnvironmentValues) -> _Refresh
|
|
216
230
|
}
|
|
217
231
|
extension List: _ListSelectionProviding {
|
|
@@ -224,6 +238,10 @@ public struct Section<Content: View> {
|
|
|
224
238
|
let header: String?
|
|
225
239
|
let footer: String?
|
|
226
240
|
let content: Content
|
|
241
|
+
/// Modifiers applied to the section itself (`Section { … }.disabled(x)`)
|
|
242
|
+
/// style each of its rows, as in SwiftUI, instead of boxing the section
|
|
243
|
+
/// (a `styled` around a `section` is not a section to the list layout).
|
|
244
|
+
var rowStyles: [_Style] = []
|
|
227
245
|
|
|
228
246
|
public init(@ViewBuilder content: () -> Content) {
|
|
229
247
|
self.header = nil
|
|
@@ -231,6 +249,14 @@ public struct Section<Content: View> {
|
|
|
231
249
|
self.content = content()
|
|
232
250
|
}
|
|
233
251
|
|
|
252
|
+
/// A header from a localized key.
|
|
253
|
+
public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
|
|
254
|
+
self.header = titleKey.key
|
|
255
|
+
self.footer = nil
|
|
256
|
+
self.content = content()
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@_disfavoredOverload
|
|
234
260
|
public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
|
|
235
261
|
self.header = String(title)
|
|
236
262
|
self.footer = nil
|
|
@@ -256,14 +282,27 @@ public struct Section<Content: View> {
|
|
|
256
282
|
self.footer = footer().content
|
|
257
283
|
self.content = content()
|
|
258
284
|
}
|
|
285
|
+
|
|
286
|
+
/// A header or footer that is a `Text` (or an optional one) is a string
|
|
287
|
+
/// prop, as above; any other view is a `sectionheader` / `sectionfooter`
|
|
288
|
+
/// child (SectionSupplements.swift).
|
|
289
|
+
var headerView: (any View)?
|
|
290
|
+
var footerView: (any View)?
|
|
259
291
|
}
|
|
260
|
-
/// Lets pickers look through sections for their options
|
|
261
|
-
|
|
292
|
+
/// Lets pickers look through sections for their options, and modifiers
|
|
293
|
+
/// style a section's rows.
|
|
294
|
+
protocol _SectionView: _TraitBearing {
|
|
262
295
|
var _sectionContent: any View { get }
|
|
296
|
+
func _stylingRows(_ style: _Style) -> any View
|
|
263
297
|
}
|
|
264
298
|
|
|
265
299
|
extension Section: _SectionView {
|
|
266
300
|
var _sectionContent: any View { content }
|
|
301
|
+
func _stylingRows(_ style: _Style) -> any View {
|
|
302
|
+
var copy = self
|
|
303
|
+
copy.rowStyles.append(style)
|
|
304
|
+
return copy
|
|
305
|
+
}
|
|
267
306
|
}
|
|
268
307
|
|
|
269
308
|
extension Section: _PrimitiveView {}
|
|
@@ -272,5 +311,21 @@ extension Section: _HostView {
|
|
|
272
311
|
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
273
312
|
.object(["header": header.map(_JSON.string) ?? .null, "footer": footer.map(_JSON.string) ?? .null])
|
|
274
313
|
}
|
|
275
|
-
var _content: [any View] {
|
|
314
|
+
var _content: [any View] {
|
|
315
|
+
// Each style distributes over the rows (`_StyledGroup`); a second one
|
|
316
|
+
// wraps the already styled rows again.
|
|
317
|
+
var view: any View = content
|
|
318
|
+
for style in rowStyles { view = _styledGroup(view, style) }
|
|
319
|
+
// View headers and footers come first and last, outside the row styles.
|
|
320
|
+
var children: [any View] = [view]
|
|
321
|
+
if let headerView { children.insert(_SectionSupplement(kind: "sectionheader", content: headerView), at: 0) }
|
|
322
|
+
if let footerView { children.append(_SectionSupplement(kind: "sectionfooter", content: footerView)) }
|
|
323
|
+
return children
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/// `_StyledGroup(content: view, style: style)` for an existential view.
|
|
328
|
+
func _styledGroup(_ view: any View, _ style: _Style) -> any View {
|
|
329
|
+
func open<V: View>(_ content: V) -> any View { _StyledGroup(content: content, style: style) }
|
|
330
|
+
return open(view)
|
|
276
331
|
}
|
|
@@ -13,6 +13,7 @@ public struct Menu<Label: View, Content: View> {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
extension Menu where Label == Text {
|
|
16
|
+
@_disfavoredOverload
|
|
16
17
|
public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
|
|
17
18
|
self.label = Text(title)
|
|
18
19
|
self.content = content()
|
|
@@ -20,6 +21,7 @@ extension Menu where Label == Text {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
extension Menu where Label == SwiftUI.Label<Text, Image> {
|
|
24
|
+
@_disfavoredOverload
|
|
23
25
|
public init<S: StringProtocol>(_ title: S, systemImage: String, @ViewBuilder content: () -> Content) {
|
|
24
26
|
self.label = SwiftUI.Label(String(title), systemImage: systemImage)
|
|
25
27
|
self.content = content()
|
|
@@ -39,13 +41,18 @@ public struct ButtonMenuStyle: MenuStyle { public init() {} }
|
|
|
39
41
|
extension MenuStyle where Self == DefaultMenuStyle {
|
|
40
42
|
public static var automatic: DefaultMenuStyle { DefaultMenuStyle() }
|
|
41
43
|
}
|
|
44
|
+
/// A menu whose label is a borderless button (iOS 14's style, deprecated); drawn as the default.
|
|
45
|
+
public struct BorderlessButtonMenuStyle: MenuStyle { public init() {} }
|
|
46
|
+
extension MenuStyle where Self == BorderlessButtonMenuStyle {
|
|
47
|
+
public static var borderlessButton: BorderlessButtonMenuStyle { BorderlessButtonMenuStyle() }
|
|
48
|
+
}
|
|
42
49
|
extension MenuStyle where Self == ButtonMenuStyle {
|
|
43
50
|
public static var button: ButtonMenuStyle { ButtonMenuStyle() }
|
|
44
51
|
}
|
|
45
52
|
|
|
46
53
|
public enum MenuIndicatorVisibility: Hashable, Sendable { case automatic, visible, hidden }
|
|
47
54
|
|
|
48
|
-
extension View {
|
|
55
|
+
nonisolated extension View {
|
|
49
56
|
public func menuStyle<S: MenuStyle>(_ style: S) -> some View { self }
|
|
50
57
|
public func menuIndicator(_ visibility: MenuIndicatorVisibility) -> some View { self }
|
|
51
58
|
}
|
|
@@ -37,6 +37,10 @@ struct _Style: Equatable {
|
|
|
37
37
|
var background: (any ShapeStyle)?
|
|
38
38
|
var frame: Frame?
|
|
39
39
|
var cornerRadius: CGFloat?
|
|
40
|
+
/// `.clipShape(.containerRelative)`: clipped to the container's corners.
|
|
41
|
+
var clipsToContainerShape = false
|
|
42
|
+
/// `.background(_:)`: painted in the container's shape (`.containerShape`).
|
|
43
|
+
var backgroundInContainerShape = false
|
|
40
44
|
var opacity: Double?
|
|
41
45
|
var disabled: Bool?
|
|
42
46
|
var layoutPriority: Double?
|
|
@@ -88,9 +92,31 @@ public struct _StyledView<Content: View> {
|
|
|
88
92
|
let style: _Style
|
|
89
93
|
}
|
|
90
94
|
extension _StyledView: _PrimitiveView {}
|
|
95
|
+
extension _StyledView: _EnvironmentModifying {
|
|
96
|
+
/// A font with a text style or a size is the environment's `font` below
|
|
97
|
+
/// (a weight or design alone changes the font the page draws, not that).
|
|
98
|
+
func _apply(to environment: inout EnvironmentValues) {
|
|
99
|
+
if let font = style.font, font.textStyle != nil || font.size != nil { environment.font = font }
|
|
100
|
+
}
|
|
101
|
+
}
|
|
91
102
|
extension _StyledView: _HostView {
|
|
92
103
|
var _kind: String { "styled" }
|
|
93
|
-
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
104
|
+
func _props(in environment: EnvironmentValues) -> _JSON {
|
|
105
|
+
var resolved = style
|
|
106
|
+
// `.background()` paints the background style in context, which
|
|
107
|
+
// `.backgroundStyle(_:)` sets (the system background by default).
|
|
108
|
+
if style.background is BackgroundStyle, let contextual = environment._backgroundStyle {
|
|
109
|
+
resolved.background = contextual
|
|
110
|
+
}
|
|
111
|
+
// The container's shape (`.containerShape`): a background is painted
|
|
112
|
+
// in it, and `.clipShape(.containerRelative)` clips to it.
|
|
113
|
+
let container = environment._containerShapeRadius
|
|
114
|
+
if style.clipsToContainerShape { resolved.cornerRadius = container ?? 0 }
|
|
115
|
+
if style.backgroundInContainerShape, let container, container > 0 {
|
|
116
|
+
resolved.extras["backgroundCornerRadius"] = .number(container)
|
|
117
|
+
}
|
|
118
|
+
return .object(["style": resolved._json])
|
|
119
|
+
}
|
|
94
120
|
var _content: [any View] { [content] }
|
|
95
121
|
}
|
|
96
122
|
|
|
@@ -104,21 +130,34 @@ public struct _StyledGroup<Content: View> {
|
|
|
104
130
|
extension _StyledGroup: _PrimitiveView {}
|
|
105
131
|
extension _StyledGroup: _GroupView {
|
|
106
132
|
var _children: [any View] {
|
|
107
|
-
|
|
133
|
+
// A modifier on a `Section` styles its rows (the section stays a direct
|
|
134
|
+
// child of its list, which is how the layout recognizes it).
|
|
135
|
+
if let section = content as? any _SectionView { return [section._stylingRows(style)] }
|
|
136
|
+
if let group = content as? any _GroupView, group._spreads {
|
|
108
137
|
return group._children.map { _StyledView(content: AnyView($0), style: style) }
|
|
109
138
|
}
|
|
110
139
|
return [_StyledView(content: content, style: style)]
|
|
111
140
|
}
|
|
112
141
|
|
|
113
142
|
var _keys: [AnyHashable]? {
|
|
114
|
-
if let group = content as? any _GroupView, group.
|
|
143
|
+
if let group = content as? any _GroupView, group._spreads {
|
|
115
144
|
return group._keys
|
|
116
145
|
}
|
|
117
146
|
return nil
|
|
118
147
|
}
|
|
148
|
+
|
|
149
|
+
// Asked of the content alone: a chain of modifiers asks each level once,
|
|
150
|
+
// where computing the content's children and keys at every level made
|
|
151
|
+
// the cost double with each modifier.
|
|
152
|
+
var _spreads: Bool {
|
|
153
|
+
guard let group = content as? any _GroupView, group._spreads else { return false }
|
|
154
|
+
// A styled section is one child; it keeps the section's keys.
|
|
155
|
+
if content is any _SectionView { return group._keys != nil }
|
|
156
|
+
return true
|
|
157
|
+
}
|
|
119
158
|
}
|
|
120
159
|
|
|
121
|
-
extension View {
|
|
160
|
+
nonisolated extension View {
|
|
122
161
|
func _styled(_ configure: (inout _Style) -> Void) -> _StyledGroup<Self> {
|
|
123
162
|
var style = _Style()
|
|
124
163
|
configure(&style)
|
|
@@ -139,6 +178,16 @@ extension View {
|
|
|
139
178
|
}
|
|
140
179
|
}
|
|
141
180
|
|
|
181
|
+
/// The padding a scene's content takes from its edges: 16 points on
|
|
182
|
+
/// iPhone, as `.padding()`.
|
|
183
|
+
public func scenePadding(_ edges: Edge.Set = .all) -> some View {
|
|
184
|
+
padding(edges, 16)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public func scenePadding(_ padding: ScenePadding, edges: Edge.Set = .all) -> some View {
|
|
188
|
+
self.padding(edges, 16)
|
|
189
|
+
}
|
|
190
|
+
|
|
142
191
|
public func padding(_ length: CGFloat) -> some View {
|
|
143
192
|
padding(.all, length)
|
|
144
193
|
}
|
|
@@ -182,13 +231,20 @@ extension View {
|
|
|
182
231
|
}
|
|
183
232
|
|
|
184
233
|
/// A paint behind the view: a color, gradient or material filling its box.
|
|
234
|
+
/// Painted in the container's shape (`.containerShape`), else the box, as in SwiftUI.
|
|
185
235
|
public func background<S: ShapeStyle>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View {
|
|
186
|
-
_styled {
|
|
236
|
+
_styled {
|
|
237
|
+
$0.background = style
|
|
238
|
+
$0.backgroundInContainerShape = true
|
|
239
|
+
}
|
|
187
240
|
}
|
|
188
241
|
|
|
189
242
|
/// The system background color behind the view.
|
|
190
243
|
public func background(ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View {
|
|
191
|
-
_styled {
|
|
244
|
+
_styled {
|
|
245
|
+
$0.background = BackgroundStyle()
|
|
246
|
+
$0.backgroundInContainerShape = true
|
|
247
|
+
}
|
|
192
248
|
}
|
|
193
249
|
|
|
194
250
|
public func opacity(_ opacity: Double) -> some View {
|
|
@@ -227,10 +283,15 @@ extension View {
|
|
|
227
283
|
|
|
228
284
|
public func scaledToFill() -> some View { aspectRatio(nil, contentMode: .fill) }
|
|
229
285
|
|
|
230
|
-
///
|
|
231
|
-
///
|
|
232
|
-
|
|
286
|
+
/// Names the view for `ScrollViewProxy.scrollTo(_:anchor:)` inside a
|
|
287
|
+
/// `ScrollViewReader` (ScrollViewReader.swift); elsewhere it adds nothing
|
|
288
|
+
/// to the rendered tree. A changed id does not reset the view's state.
|
|
289
|
+
public func id<ID: Hashable>(_ id: ID) -> some View {
|
|
290
|
+
_IdentifiedView(content: self, id: AnyHashable(id))
|
|
291
|
+
}
|
|
233
292
|
|
|
293
|
+
/// A compositing hint; accepted for source compatibility and currently
|
|
294
|
+
/// without effect on the rendered tree.
|
|
234
295
|
public func compositingGroup() -> some View { self }
|
|
235
296
|
|
|
236
297
|
public func cornerRadius(_ radius: CGFloat, antialiased: Bool = true) -> some View {
|
|
@@ -238,6 +299,15 @@ extension View {
|
|
|
238
299
|
}
|
|
239
300
|
|
|
240
301
|
public func clipShape<S: Shape>(_ shape: S) -> some View {
|
|
241
|
-
_styled {
|
|
302
|
+
_styled {
|
|
303
|
+
$0.cornerRadius = shape._cornerRadius
|
|
304
|
+
$0.clipsToContainerShape = shape is ContainerRelativeShape
|
|
305
|
+
}
|
|
242
306
|
}
|
|
243
307
|
}
|
|
308
|
+
|
|
309
|
+
/// The kind of scene padding (`.minimum`); iPhone has one.
|
|
310
|
+
public struct ScenePadding: Equatable, Sendable {
|
|
311
|
+
public static let minimum = ScenePadding()
|
|
312
|
+
public static let navigationBar = ScenePadding()
|
|
313
|
+
}
|