@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,130 @@
|
|
|
1
|
+
/// `GroupBox`, `ControlGroup` and `ImageRenderer`.
|
|
2
|
+
///
|
|
3
|
+
/// - `GroupBox` is drawn as iOS draws its default style: the label in the
|
|
4
|
+
/// headline font above the content, 8 points apart, inside 16 points of
|
|
5
|
+
/// padding on a secondary-system-background rounded rectangle (radius 8).
|
|
6
|
+
/// `.groupBoxStyle` is accepted; every box uses that look.
|
|
7
|
+
/// - `ControlGroup` groups related controls. On iOS a menu shows them as a
|
|
8
|
+
/// row of compact buttons; here its content is a group: in a menu or a
|
|
9
|
+
/// context menu each control is an item of its own, elsewhere they flow in
|
|
10
|
+
/// the enclosing stack. Its label is not drawn.
|
|
11
|
+
/// - `ImageRenderer` would rasterize a view. Only the page draws views, so
|
|
12
|
+
/// `cgImage` and `uiImage` are nil (a share-as-image feature has nothing
|
|
13
|
+
/// to share); its settings are kept.
|
|
14
|
+
|
|
15
|
+
// MARK: - GroupBox
|
|
16
|
+
|
|
17
|
+
public struct GroupBox<Label: View, Content: View>: View {
|
|
18
|
+
let label: Label
|
|
19
|
+
let content: Content
|
|
20
|
+
|
|
21
|
+
public init(@ViewBuilder content: () -> Content, @ViewBuilder label: () -> Label) {
|
|
22
|
+
self.content = content()
|
|
23
|
+
self.label = label()
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public init(label: Label, @ViewBuilder content: () -> Content) {
|
|
27
|
+
self.label = label
|
|
28
|
+
self.content = content()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public var body: some View {
|
|
32
|
+
VStack(alignment: .leading, spacing: 8) {
|
|
33
|
+
label.font(.headline)
|
|
34
|
+
content
|
|
35
|
+
}
|
|
36
|
+
.padding(16)
|
|
37
|
+
.background(Color(semantic: "secondarySystemBackground"), in: RoundedRectangle(cornerRadius: 8))
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
extension GroupBox where Label == EmptyView {
|
|
42
|
+
public init(@ViewBuilder content: () -> Content) {
|
|
43
|
+
self.init(label: EmptyView(), content: content)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
extension GroupBox where Label == Text {
|
|
48
|
+
public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
|
|
49
|
+
self.init(label: Text(titleKey), content: content)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@_disfavoredOverload
|
|
53
|
+
public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
|
|
54
|
+
self.init(label: Text(title), content: content)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// A group box's look; accepted (see the file comment).
|
|
59
|
+
public protocol GroupBoxStyle {}
|
|
60
|
+
public struct DefaultGroupBoxStyle: GroupBoxStyle { public init() {} }
|
|
61
|
+
extension GroupBoxStyle where Self == DefaultGroupBoxStyle {
|
|
62
|
+
public static var automatic: DefaultGroupBoxStyle { DefaultGroupBoxStyle() }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
nonisolated extension View {
|
|
66
|
+
public func groupBoxStyle<S: GroupBoxStyle>(_ style: S) -> some View { self }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// MARK: - ControlGroup
|
|
70
|
+
|
|
71
|
+
public struct ControlGroup<Content: View> {
|
|
72
|
+
let content: Content
|
|
73
|
+
|
|
74
|
+
public init(@ViewBuilder content: () -> Content) {
|
|
75
|
+
self.content = content()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// The label (shown by a collapsed group on iOS) is not drawn.
|
|
79
|
+
public init<L: View>(@ViewBuilder content: () -> Content, @ViewBuilder label: () -> L) {
|
|
80
|
+
self.content = content()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
|
|
84
|
+
self.content = content()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@_disfavoredOverload
|
|
88
|
+
public init<S: StringProtocol>(_ title: S, @ViewBuilder content: () -> Content) {
|
|
89
|
+
self.content = content()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public init(_ titleKey: LocalizedStringKey, systemImage: String, @ViewBuilder content: () -> Content) {
|
|
93
|
+
self.content = content()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@_disfavoredOverload
|
|
97
|
+
public init<S: StringProtocol>(_ title: S, systemImage: String, @ViewBuilder content: () -> Content) {
|
|
98
|
+
self.content = content()
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
extension ControlGroup: View {
|
|
103
|
+
public typealias Body = Never
|
|
104
|
+
public var body: Never { fatalError("ControlGroup is a primitive view") }
|
|
105
|
+
}
|
|
106
|
+
extension ControlGroup: _PrimitiveView {}
|
|
107
|
+
extension ControlGroup: _GroupView {
|
|
108
|
+
var _children: [any View] { [content] }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// MARK: - ImageRenderer
|
|
112
|
+
|
|
113
|
+
/// Renders a view to an image: never, in the browser (see the file comment).
|
|
114
|
+
@MainActor
|
|
115
|
+
public final class ImageRenderer<Content: View>: ObservableObject {
|
|
116
|
+
public var content: Content
|
|
117
|
+
public var label: String?
|
|
118
|
+
public var proposedSize = ProposedViewSize.unspecified
|
|
119
|
+
public var scale: CGFloat = 1
|
|
120
|
+
public var isOpaque = false
|
|
121
|
+
|
|
122
|
+
public init(content: Content) {
|
|
123
|
+
self.content = content
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// Nil: only the page draws views.
|
|
127
|
+
public var cgImage: CGImage? { nil }
|
|
128
|
+
/// Nil: only the page draws views.
|
|
129
|
+
public var uiImage: UIImage? { nil }
|
|
130
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Focus and key presses for views that are not text fields: `.focusable()`,
|
|
2
|
+
// `.focusEffectDisabled()` and `.onKeyPress`. They serve a hardware
|
|
3
|
+
// keyboard on an iPad or a Mac. The page shows an iPhone and sends the app
|
|
4
|
+
// no key events outside text inputs, so, like the pointer modifiers
|
|
5
|
+
// (PointerAndKeyboard.swift), these are accepted and do nothing: a key-press
|
|
6
|
+
// action is never called (Ice Cubes' media viewer pages with its swipes
|
|
7
|
+
// instead of the arrow keys).
|
|
8
|
+
|
|
9
|
+
/// A key press a view handles.
|
|
10
|
+
public struct KeyPress: Sendable {
|
|
11
|
+
/// Whether the press was dealt with; an ignored one goes to the parent.
|
|
12
|
+
public enum Result: Sendable, Hashable { case handled, ignored }
|
|
13
|
+
|
|
14
|
+
/// The phases of a press an action hears.
|
|
15
|
+
public struct Phases: OptionSet, Hashable, Sendable {
|
|
16
|
+
public let rawValue: Int
|
|
17
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
18
|
+
public static let down = Phases(rawValue: 1 << 0)
|
|
19
|
+
public static let `repeat` = Phases(rawValue: 1 << 1)
|
|
20
|
+
public static let up = Phases(rawValue: 1 << 2)
|
|
21
|
+
public static let all: Phases = [.down, .repeat, .up]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public let phase: Phases
|
|
25
|
+
public let key: KeyEquivalent
|
|
26
|
+
public let characters: String
|
|
27
|
+
public let modifiers: EventModifiers
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// How a focusable view is used.
|
|
31
|
+
public struct FocusInteractions: OptionSet, Hashable, Sendable {
|
|
32
|
+
public let rawValue: Int
|
|
33
|
+
public init(rawValue: Int) { self.rawValue = rawValue }
|
|
34
|
+
public static let activate = FocusInteractions(rawValue: 1 << 0)
|
|
35
|
+
public static let edit = FocusInteractions(rawValue: 1 << 1)
|
|
36
|
+
public static let automatic: FocusInteractions = [.activate, .edit]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
nonisolated extension View {
|
|
40
|
+
/// Accepted: the view takes no keyboard focus on the page.
|
|
41
|
+
public func focusable(_ isFocusable: Bool = true) -> some View { self }
|
|
42
|
+
public func focusable(_ isFocusable: Bool = true, interactions: FocusInteractions) -> some View { self }
|
|
43
|
+
/// Accepted: the page draws no focus ring for such views.
|
|
44
|
+
public func focusEffectDisabled(_ disabled: Bool = true) -> some View { self }
|
|
45
|
+
|
|
46
|
+
/// Accepted; the action is never called (no key events reach the app).
|
|
47
|
+
public func onKeyPress(_ key: KeyEquivalent, action: @escaping () -> KeyPress.Result) -> some View { self }
|
|
48
|
+
public func onKeyPress(_ key: KeyEquivalent, phases: KeyPress.Phases,
|
|
49
|
+
action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
|
|
50
|
+
public func onKeyPress(keys: Set<KeyEquivalent>, phases: KeyPress.Phases = [.down, .repeat],
|
|
51
|
+
action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
|
|
52
|
+
public func onKeyPress(phases: KeyPress.Phases = [.down, .repeat],
|
|
53
|
+
action: @escaping (KeyPress) -> KeyPress.Result) -> some View { self }
|
|
54
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/// `LabelStyle`: how a `Label` arranges its title and icon. `Label.body`
|
|
2
|
+
/// consults the environment's style (set by `.labelStyle`).
|
|
3
|
+
public protocol LabelStyle {
|
|
4
|
+
associatedtype Body: View
|
|
5
|
+
typealias Configuration = LabelStyleConfiguration
|
|
6
|
+
@ViewBuilder @MainActor func makeBody(configuration: Configuration) -> Body
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
public struct LabelStyleConfiguration {
|
|
10
|
+
public struct Title: View {
|
|
11
|
+
let view: any View
|
|
12
|
+
public var body: some View { AnyView(view) }
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public struct Icon: View {
|
|
16
|
+
let view: any View
|
|
17
|
+
public var body: some View { AnyView(view) }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public let title: Title
|
|
21
|
+
public let icon: Icon
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public struct DefaultLabelStyle: LabelStyle {
|
|
25
|
+
public init() {}
|
|
26
|
+
public func makeBody(configuration: Configuration) -> some View {
|
|
27
|
+
HStack(spacing: 8) {
|
|
28
|
+
configuration.icon
|
|
29
|
+
configuration.title
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public struct TitleAndIconLabelStyle: LabelStyle {
|
|
35
|
+
public init() {}
|
|
36
|
+
public func makeBody(configuration: Configuration) -> some View {
|
|
37
|
+
HStack(spacing: 8) {
|
|
38
|
+
configuration.icon
|
|
39
|
+
configuration.title
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public struct IconOnlyLabelStyle: LabelStyle {
|
|
45
|
+
public init() {}
|
|
46
|
+
public func makeBody(configuration: Configuration) -> some View { configuration.icon }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public struct TitleOnlyLabelStyle: LabelStyle {
|
|
50
|
+
public init() {}
|
|
51
|
+
public func makeBody(configuration: Configuration) -> some View { configuration.title }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
extension LabelStyle where Self == DefaultLabelStyle {
|
|
55
|
+
public static var automatic: DefaultLabelStyle { DefaultLabelStyle() }
|
|
56
|
+
}
|
|
57
|
+
extension LabelStyle where Self == TitleAndIconLabelStyle {
|
|
58
|
+
public static var titleAndIcon: TitleAndIconLabelStyle { TitleAndIconLabelStyle() }
|
|
59
|
+
}
|
|
60
|
+
extension LabelStyle where Self == IconOnlyLabelStyle {
|
|
61
|
+
public static var iconOnly: IconOnlyLabelStyle { IconOnlyLabelStyle() }
|
|
62
|
+
}
|
|
63
|
+
extension LabelStyle where Self == TitleOnlyLabelStyle {
|
|
64
|
+
public static var titleOnly: TitleOnlyLabelStyle { TitleOnlyLabelStyle() }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// Type-erased style stored in the environment.
|
|
68
|
+
struct _AnyLabelStyle {
|
|
69
|
+
let make: @MainActor (LabelStyleConfiguration) -> any View
|
|
70
|
+
|
|
71
|
+
@MainActor
|
|
72
|
+
init<S: LabelStyle>(_ style: S) {
|
|
73
|
+
make = { configuration in style.makeBody(configuration: configuration) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
nonisolated init(make: @escaping @MainActor (LabelStyleConfiguration) -> any View) {
|
|
77
|
+
self.make = make
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Usable from nonisolated code (toolbars build their children there).
|
|
81
|
+
nonisolated static var iconOnly: _AnyLabelStyle {
|
|
82
|
+
_AnyLabelStyle(make: { configuration in IconOnlyLabelStyle().makeBody(configuration: configuration) })
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private struct _LabelStyleKey: EnvironmentKey {
|
|
87
|
+
static var defaultValue: _AnyLabelStyle? { nil }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
extension EnvironmentValues {
|
|
91
|
+
var _labelStyle: _AnyLabelStyle? {
|
|
92
|
+
get { self[_LabelStyleKey.self] }
|
|
93
|
+
set { self[_LabelStyleKey.self] = newValue }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
nonisolated extension View {
|
|
98
|
+
@MainActor
|
|
99
|
+
public func labelStyle<S: LabelStyle>(_ style: S) -> some View {
|
|
100
|
+
environment(\._labelStyle, _AnyLabelStyle(style))
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// Resolves a label through the environment's style. `Label.body` returns
|
|
105
|
+
/// this so the style is read where the label is mounted.
|
|
106
|
+
struct _StyledLabel: View {
|
|
107
|
+
let title: any View
|
|
108
|
+
let icon: any View
|
|
109
|
+
@Environment(\._labelStyle) private var style
|
|
110
|
+
|
|
111
|
+
var body: some View {
|
|
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))
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
public enum TextAlignment: Hashable, Sendable {
|
|
2
|
+
case leading, center, trailing
|
|
3
|
+
|
|
4
|
+
var name: String {
|
|
5
|
+
switch self {
|
|
6
|
+
case .leading: "leading"
|
|
7
|
+
case .center: "center"
|
|
8
|
+
case .trailing: "trailing"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
nonisolated extension View {
|
|
14
|
+
/// Sets the priority by which a parent stack hands out space.
|
|
15
|
+
public func layoutPriority(_ value: Double) -> some View {
|
|
16
|
+
_styled { $0.layoutPriority = value }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/// Limits the number of lines text in this view can occupy.
|
|
20
|
+
public func lineLimit(_ number: Int?) -> some View {
|
|
21
|
+
_styled { $0.lineLimit = number ?? -1 }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// `reservesSpace` is accepted and ignored: the text takes the lines it needs, up to `limit`.
|
|
25
|
+
public func lineLimit(_ limit: Int, reservesSpace: Bool) -> some View {
|
|
26
|
+
_styled { $0.lineLimit = limit }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public func multilineTextAlignment(_ alignment: TextAlignment) -> some View {
|
|
30
|
+
_styled { $0.multilineTextAlignment = alignment }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// Fixes the view at its ideal size on the given axes.
|
|
34
|
+
public func fixedSize(horizontal: Bool, vertical: Bool) -> some View {
|
|
35
|
+
_styled { $0.fixedSize = (horizontal, vertical) }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public func fixedSize() -> some View {
|
|
39
|
+
fixedSize(horizontal: true, vertical: true)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// MARK: - Color and shapes as views
|
|
44
|
+
|
|
45
|
+
extension Color: _PrimitiveView {}
|
|
46
|
+
extension Color: _HostView {
|
|
47
|
+
var _kind: String { "color" }
|
|
48
|
+
func _props(in environment: EnvironmentValues) -> _JSON { .object(["color": _json]) }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// A shape drawn as a view, optionally filled or stroked. `inset` strokes
|
|
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.
|
|
55
|
+
public struct _ShapeView<S: Shape> {
|
|
56
|
+
let shape: S
|
|
57
|
+
let fill: (any ShapeStyle)?
|
|
58
|
+
let stroke: (style: any ShapeStyle, lineWidth: CGFloat, inset: Bool)?
|
|
59
|
+
var eoFill = false
|
|
60
|
+
var strokeStyle: StrokeStyle? = nil
|
|
61
|
+
}
|
|
62
|
+
extension _ShapeView: _PrimitiveView {}
|
|
63
|
+
extension _ShapeView: _HostView {
|
|
64
|
+
var _kind: String { "shape" }
|
|
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"
|
|
71
|
+
var stroke: _JSON = .null
|
|
72
|
+
if let s = self.stroke {
|
|
73
|
+
var object: [String: _JSON] = ["color": s.style._json, "lineWidth": .number(s.lineWidth)]
|
|
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
|
+
}
|
|
85
|
+
stroke = .object(object)
|
|
86
|
+
}
|
|
87
|
+
var props: [String: _JSON] = [
|
|
88
|
+
"shape": .string(shape._name),
|
|
89
|
+
"cornerRadius": .number(_resolvedCornerRadius(shape, in: environment)),
|
|
90
|
+
"fill": fill?._json ?? .null,
|
|
91
|
+
"stroke": stroke,
|
|
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)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
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.
|
|
108
|
+
public struct FillStyle: Equatable, Sendable {
|
|
109
|
+
public var isEOFilled: Bool
|
|
110
|
+
public var isAntialiased: Bool
|
|
111
|
+
|
|
112
|
+
public init(eoFill: Bool = false, antialiased: Bool = true) {
|
|
113
|
+
isEOFilled = eoFill
|
|
114
|
+
isAntialiased = antialiased
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
nonisolated extension Shape {
|
|
119
|
+
public func fill<S: ShapeStyle>(_ style: S, style fillStyle: FillStyle = FillStyle()) -> some View {
|
|
120
|
+
_ShapeView(shape: self, fill: style, stroke: nil, eoFill: fillStyle.isEOFilled)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Filled with the foreground style.
|
|
124
|
+
public func fill(style: FillStyle = FillStyle()) -> some View {
|
|
125
|
+
_ShapeView(shape: self, fill: ForegroundStyle(), stroke: nil, eoFill: style.isEOFilled)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public func stroke<S: ShapeStyle>(_ style: S, lineWidth: CGFloat = 1) -> some View {
|
|
129
|
+
_ShapeView(shape: self, fill: nil, stroke: (style, lineWidth, false))
|
|
130
|
+
}
|
|
131
|
+
|
|
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)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// A stroke drawn inside the shape's bounds.
|
|
140
|
+
public func strokeBorder<S: ShapeStyle>(_ style: S, lineWidth: CGFloat = 1, antialiased: Bool = true) -> some View {
|
|
141
|
+
_ShapeView(shape: self, fill: nil, stroke: (style, lineWidth, true))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public func strokeBorder(lineWidth: CGFloat = 1, antialiased: Bool = true) -> some View {
|
|
145
|
+
_ShapeView(shape: self, fill: nil, stroke: (ForegroundStyle(), lineWidth, true))
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
extension Rectangle: View {
|
|
150
|
+
public typealias Body = Never
|
|
151
|
+
public var body: Never { fatalError("Rectangle is a primitive view") }
|
|
152
|
+
}
|
|
153
|
+
extension RoundedRectangle: View {
|
|
154
|
+
public typealias Body = Never
|
|
155
|
+
public var body: Never { fatalError("RoundedRectangle is a primitive view") }
|
|
156
|
+
}
|
|
157
|
+
extension Circle: View {
|
|
158
|
+
public typealias Body = Never
|
|
159
|
+
public var body: Never { fatalError("Circle is a primitive view") }
|
|
160
|
+
}
|
|
161
|
+
extension Capsule: View {
|
|
162
|
+
public typealias Body = Never
|
|
163
|
+
public var body: Never { fatalError("Capsule is a primitive view") }
|
|
164
|
+
}
|
|
165
|
+
extension Ellipse: View {
|
|
166
|
+
public typealias Body = Never
|
|
167
|
+
public var body: Never { fatalError("Ellipse is a primitive view") }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
extension Rectangle: _HostView {
|
|
171
|
+
var _kind: String { "shape" }
|
|
172
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
|
|
173
|
+
}
|
|
174
|
+
extension RoundedRectangle: _HostView {
|
|
175
|
+
var _kind: String { "shape" }
|
|
176
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
|
|
177
|
+
}
|
|
178
|
+
extension Circle: _HostView {
|
|
179
|
+
var _kind: String { "shape" }
|
|
180
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
|
|
181
|
+
}
|
|
182
|
+
extension Capsule: _HostView {
|
|
183
|
+
var _kind: String { "shape" }
|
|
184
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
|
|
185
|
+
}
|
|
186
|
+
extension Ellipse: _HostView {
|
|
187
|
+
var _kind: String { "shape" }
|
|
188
|
+
func _props(in environment: EnvironmentValues) -> _JSON { _shapeProps(self) }
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private func _shapeProps(_ shape: some Shape) -> _JSON {
|
|
192
|
+
.object([
|
|
193
|
+
"shape": .string(shape._name),
|
|
194
|
+
"cornerRadius": .number(shape._cornerRadius),
|
|
195
|
+
"fill": .null,
|
|
196
|
+
"stroke": .null,
|
|
197
|
+
])
|
|
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
|
+
}
|