@swiftbrowser/swift 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +200 -9
- package/README.md +7 -9
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +0 -4
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +104 -28
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Toolbar.swift +52 -16
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
// `import CoreHaptics` for the browser: the haptic engine's API, with no
|
|
2
|
+
// engine behind it. A browser cannot drive a Taptic Engine (the Vibration
|
|
3
|
+
// API buzzes some Android phones and nothing else, and has no intensity or
|
|
4
|
+
// sharpness), so `CHHapticEngine.capabilitiesForHardware()` reports neither
|
|
5
|
+
// haptics nor audio, as an iPad or a Mac does. Code that checks it, as
|
|
6
|
+
// Apple's samples and Ice Cubes' `HapticManager` do, skips haptics. Code that
|
|
7
|
+
// does not still runs: an engine starts and stops, patterns are built and
|
|
8
|
+
// validated, and players accept every call and play nothing.
|
|
9
|
+
|
|
10
|
+
import Foundation
|
|
11
|
+
|
|
12
|
+
public let CHHapticTimeImmediate: TimeInterval = 0
|
|
13
|
+
|
|
14
|
+
/// Core Haptics' errors, with Apple's codes.
|
|
15
|
+
public struct CHHapticError: Error, Hashable, Sendable {
|
|
16
|
+
public enum Code: Int, Sendable {
|
|
17
|
+
case engineNotRunning = -4805
|
|
18
|
+
case operationNotPermitted = -4806
|
|
19
|
+
case engineStartTimeout = -4808
|
|
20
|
+
case notSupported = -4809
|
|
21
|
+
case serverInitFailed = -4810
|
|
22
|
+
case serverInterrupted = -4811
|
|
23
|
+
case invalidPatternPlayer = -4812
|
|
24
|
+
case invalidPatternData = -4813
|
|
25
|
+
case invalidPatternDictionary = -4814
|
|
26
|
+
case invalidAudioSession = -4815
|
|
27
|
+
case invalidEngineParameter = -4816
|
|
28
|
+
case invalidParameterType = -4820
|
|
29
|
+
case invalidEventType = -4821
|
|
30
|
+
case invalidEventTime = -4822
|
|
31
|
+
case invalidEventDuration = -4823
|
|
32
|
+
case invalidAudioResource = -4824
|
|
33
|
+
case resourceNotAvailable = -4825
|
|
34
|
+
case badEventEntry = -4830
|
|
35
|
+
case badParameterEntry = -4831
|
|
36
|
+
case invalidTime = -4840
|
|
37
|
+
case fileNotFound = -4851
|
|
38
|
+
case insufficientPower = -4897
|
|
39
|
+
case unknownError = -4898
|
|
40
|
+
case memoryError = -4899
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public let code: Code
|
|
44
|
+
public init(_ code: Code) { self.code = code }
|
|
45
|
+
public static let notSupported = Code.notSupported
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// MARK: - Events and parameters
|
|
49
|
+
|
|
50
|
+
public struct CHHapticEvent: Sendable {
|
|
51
|
+
public struct EventType: RawRepresentable, Hashable, Sendable {
|
|
52
|
+
public let rawValue: String
|
|
53
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
54
|
+
public static let hapticTransient = EventType(rawValue: "HapticTransient")
|
|
55
|
+
public static let hapticContinuous = EventType(rawValue: "HapticContinuous")
|
|
56
|
+
public static let audioContinuous = EventType(rawValue: "AudioContinuous")
|
|
57
|
+
public static let audioCustom = EventType(rawValue: "AudioCustom")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public struct ParameterID: RawRepresentable, Hashable, Sendable {
|
|
61
|
+
public let rawValue: String
|
|
62
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
63
|
+
public static let hapticIntensity = ParameterID(rawValue: "HapticIntensity")
|
|
64
|
+
public static let hapticSharpness = ParameterID(rawValue: "HapticSharpness")
|
|
65
|
+
public static let attackTime = ParameterID(rawValue: "AttackTime")
|
|
66
|
+
public static let decayTime = ParameterID(rawValue: "DecayTime")
|
|
67
|
+
public static let releaseTime = ParameterID(rawValue: "ReleaseTime")
|
|
68
|
+
public static let sustained = ParameterID(rawValue: "Sustained")
|
|
69
|
+
public static let audioVolume = ParameterID(rawValue: "AudioVolume")
|
|
70
|
+
public static let audioPitch = ParameterID(rawValue: "AudioPitch")
|
|
71
|
+
public static let audioPan = ParameterID(rawValue: "AudioPan")
|
|
72
|
+
public static let audioBrightness = ParameterID(rawValue: "AudioBrightness")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public let type: EventType
|
|
76
|
+
public var eventParameters: [CHHapticEventParameter]
|
|
77
|
+
public var relativeTime: TimeInterval
|
|
78
|
+
public var duration: TimeInterval
|
|
79
|
+
|
|
80
|
+
public init(eventType: EventType, parameters: [CHHapticEventParameter], relativeTime: TimeInterval) {
|
|
81
|
+
self.init(eventType: eventType, parameters: parameters, relativeTime: relativeTime, duration: 0)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public init(eventType: EventType, parameters: [CHHapticEventParameter], relativeTime: TimeInterval, duration: TimeInterval) {
|
|
85
|
+
self.type = eventType
|
|
86
|
+
self.eventParameters = parameters
|
|
87
|
+
self.relativeTime = relativeTime
|
|
88
|
+
self.duration = duration
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public init(audioResourceID resID: CHHapticAudioResourceID, parameters: [CHHapticEventParameter], relativeTime: TimeInterval) {
|
|
92
|
+
self.init(eventType: .audioCustom, parameters: parameters, relativeTime: relativeTime, duration: 0)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public init(audioResourceID resID: CHHapticAudioResourceID, parameters: [CHHapticEventParameter], relativeTime: TimeInterval, duration: TimeInterval) {
|
|
96
|
+
self.init(eventType: .audioCustom, parameters: parameters, relativeTime: relativeTime, duration: duration)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public typealias CHHapticAudioResourceID = UInt
|
|
101
|
+
public typealias CHHapticEventType = CHHapticEvent.EventType
|
|
102
|
+
public typealias CHHapticEventParameterID = CHHapticEvent.ParameterID
|
|
103
|
+
|
|
104
|
+
public struct CHHapticEventParameter: Sendable {
|
|
105
|
+
public let parameterID: CHHapticEvent.ParameterID
|
|
106
|
+
public var value: Float
|
|
107
|
+
public init(parameterID: CHHapticEvent.ParameterID, value: Float) {
|
|
108
|
+
self.parameterID = parameterID
|
|
109
|
+
self.value = value
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public struct CHHapticDynamicParameter: Sendable {
|
|
114
|
+
public struct ID: RawRepresentable, Hashable, Sendable {
|
|
115
|
+
public let rawValue: String
|
|
116
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
117
|
+
public static let hapticIntensityControl = ID(rawValue: "HapticIntensityControl")
|
|
118
|
+
public static let hapticSharpnessControl = ID(rawValue: "HapticSharpnessControl")
|
|
119
|
+
public static let hapticAttackTimeControl = ID(rawValue: "HapticAttackTimeControl")
|
|
120
|
+
public static let hapticDecayTimeControl = ID(rawValue: "HapticDecayTimeControl")
|
|
121
|
+
public static let hapticReleaseTimeControl = ID(rawValue: "HapticReleaseTimeControl")
|
|
122
|
+
public static let audioVolumeControl = ID(rawValue: "AudioVolumeControl")
|
|
123
|
+
public static let audioPanControl = ID(rawValue: "AudioPanControl")
|
|
124
|
+
public static let audioBrightnessControl = ID(rawValue: "AudioBrightnessControl")
|
|
125
|
+
public static let audioPitchControl = ID(rawValue: "AudioPitchControl")
|
|
126
|
+
public static let audioAttackTimeControl = ID(rawValue: "AudioAttackTimeControl")
|
|
127
|
+
public static let audioDecayTimeControl = ID(rawValue: "AudioDecayTimeControl")
|
|
128
|
+
public static let audioReleaseTimeControl = ID(rawValue: "AudioReleaseTimeControl")
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public let parameterID: ID
|
|
132
|
+
public var value: Float
|
|
133
|
+
public var relativeTime: TimeInterval
|
|
134
|
+
public init(parameterID: ID, value: Float, relativeTime: TimeInterval) {
|
|
135
|
+
self.parameterID = parameterID
|
|
136
|
+
self.value = value
|
|
137
|
+
self.relativeTime = relativeTime
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public struct CHHapticParameterCurve: Sendable {
|
|
142
|
+
public struct ControlPoint: Sendable {
|
|
143
|
+
public var relativeTime: TimeInterval
|
|
144
|
+
public var value: Float
|
|
145
|
+
public init(relativeTime: TimeInterval, value: Float) {
|
|
146
|
+
self.relativeTime = relativeTime
|
|
147
|
+
self.value = value
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public let parameterID: CHHapticDynamicParameter.ID
|
|
152
|
+
public var relativeTime: TimeInterval
|
|
153
|
+
public var controlPoints: [ControlPoint]
|
|
154
|
+
public init(parameterID: CHHapticDynamicParameter.ID, controlPoints: [ControlPoint], relativeTime: TimeInterval) {
|
|
155
|
+
self.parameterID = parameterID
|
|
156
|
+
self.controlPoints = controlPoints
|
|
157
|
+
self.relativeTime = relativeTime
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// MARK: - Patterns
|
|
162
|
+
|
|
163
|
+
/// A pattern of events, kept as given. Its duration is the end of its last event.
|
|
164
|
+
public final class CHHapticPattern: @unchecked Sendable {
|
|
165
|
+
public struct Key: RawRepresentable, Hashable, Sendable {
|
|
166
|
+
public let rawValue: String
|
|
167
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
168
|
+
public static let version = Key(rawValue: "Version")
|
|
169
|
+
public static let pattern = Key(rawValue: "Pattern")
|
|
170
|
+
public static let event = Key(rawValue: "Event")
|
|
171
|
+
public static let eventType = Key(rawValue: "EventType")
|
|
172
|
+
public static let time = Key(rawValue: "Time")
|
|
173
|
+
public static let eventDuration = Key(rawValue: "EventDuration")
|
|
174
|
+
public static let eventParameters = Key(rawValue: "EventParameters")
|
|
175
|
+
public static let parameterID = Key(rawValue: "ParameterID")
|
|
176
|
+
public static let parameterValue = Key(rawValue: "ParameterValue")
|
|
177
|
+
public static let parameter = Key(rawValue: "Parameter")
|
|
178
|
+
public static let parameterCurve = Key(rawValue: "ParameterCurve")
|
|
179
|
+
public static let parameterCurveControlPoints = Key(rawValue: "ParameterCurveControlPoints")
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
public let events: [CHHapticEvent]
|
|
183
|
+
public let parameters: [CHHapticDynamicParameter]
|
|
184
|
+
public let parameterCurves: [CHHapticParameterCurve]
|
|
185
|
+
|
|
186
|
+
public var duration: TimeInterval {
|
|
187
|
+
events.map { $0.relativeTime + $0.duration }.max() ?? 0
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
public init(events: [CHHapticEvent], parameters: [CHHapticDynamicParameter]) throws {
|
|
191
|
+
try Self.validate(events)
|
|
192
|
+
self.events = events
|
|
193
|
+
self.parameters = parameters
|
|
194
|
+
self.parameterCurves = []
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public init(events: [CHHapticEvent], parameterCurves: [CHHapticParameterCurve]) throws {
|
|
198
|
+
try Self.validate(events)
|
|
199
|
+
self.events = events
|
|
200
|
+
self.parameters = []
|
|
201
|
+
self.parameterCurves = parameterCurves
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// A pattern from an AHAP dictionary: its `Event` entries are read; parameters and curves are not.
|
|
205
|
+
public convenience init(dictionary: [Key: Any]) throws {
|
|
206
|
+
guard let entries = dictionary[.pattern] as? [[Key: Any]] else {
|
|
207
|
+
throw CHHapticError(.invalidPatternDictionary)
|
|
208
|
+
}
|
|
209
|
+
var events: [CHHapticEvent] = []
|
|
210
|
+
for entry in entries {
|
|
211
|
+
guard let event = entry[.event] as? [Key: Any] else { continue }
|
|
212
|
+
guard let type = event[.eventType] as? String else { throw CHHapticError(.badEventEntry) }
|
|
213
|
+
let parameters = (event[.eventParameters] as? [[Key: Any]] ?? []).compactMap { parameter -> CHHapticEventParameter? in
|
|
214
|
+
guard let id = parameter[.parameterID] as? String else { return nil }
|
|
215
|
+
let value = (parameter[.parameterValue] as? Double).map(Float.init) ?? (parameter[.parameterValue] as? Float) ?? 0
|
|
216
|
+
return CHHapticEventParameter(parameterID: .init(rawValue: id), value: value)
|
|
217
|
+
}
|
|
218
|
+
events.append(CHHapticEvent(eventType: .init(rawValue: type), parameters: parameters,
|
|
219
|
+
relativeTime: event[.time] as? Double ?? 0,
|
|
220
|
+
duration: event[.eventDuration] as? Double ?? 0))
|
|
221
|
+
}
|
|
222
|
+
try self.init(events: events, parameters: [])
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/// The events as an AHAP dictionary.
|
|
226
|
+
public func exportDictionary() throws -> [Key: Any] {
|
|
227
|
+
[.version: 1.0, .pattern: events.map { event -> [Key: Any] in
|
|
228
|
+
[.event: [
|
|
229
|
+
.eventType: event.type.rawValue,
|
|
230
|
+
.time: event.relativeTime,
|
|
231
|
+
.eventDuration: event.duration,
|
|
232
|
+
.eventParameters: event.eventParameters.map { [Key.parameterID: $0.parameterID.rawValue, .parameterValue: Double($0.value)] },
|
|
233
|
+
] as [Key: Any]]
|
|
234
|
+
}]
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
private static func validate(_ events: [CHHapticEvent]) throws {
|
|
238
|
+
for event in events {
|
|
239
|
+
if event.relativeTime < 0 { throw CHHapticError(.invalidEventTime) }
|
|
240
|
+
if event.duration < 0 { throw CHHapticError(.invalidEventDuration) }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// MARK: - Players
|
|
246
|
+
|
|
247
|
+
/// Plays a pattern. Here every call succeeds and nothing is felt or heard.
|
|
248
|
+
public protocol CHHapticPatternPlayer: AnyObject {
|
|
249
|
+
var isMuted: Bool { get set }
|
|
250
|
+
func start(atTime time: TimeInterval) throws
|
|
251
|
+
func stop(atTime time: TimeInterval) throws
|
|
252
|
+
func sendParameters(_ parameters: [CHHapticDynamicParameter], atTime time: TimeInterval) throws
|
|
253
|
+
func scheduleParameterCurve(_ parameterCurve: CHHapticParameterCurve, atTime time: TimeInterval) throws
|
|
254
|
+
func cancel() throws
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
public protocol CHHapticAdvancedPatternPlayer: CHHapticPatternPlayer {
|
|
258
|
+
var loopEnabled: Bool { get set }
|
|
259
|
+
var loopEnd: TimeInterval { get set }
|
|
260
|
+
var playbackRate: Float { get set }
|
|
261
|
+
var completionHandler: CHHapticAdvancedPatternPlayerCompletionHandler? { get set }
|
|
262
|
+
func pause(atTime time: TimeInterval) throws
|
|
263
|
+
func resume(atTime time: TimeInterval) throws
|
|
264
|
+
func seek(toOffset offsetTime: TimeInterval) throws
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
public typealias CHHapticAdvancedPatternPlayerCompletionHandler = @Sendable (Error?) -> Void
|
|
268
|
+
|
|
269
|
+
final class _SilentPlayer: CHHapticAdvancedPatternPlayer, @unchecked Sendable {
|
|
270
|
+
let pattern: CHHapticPattern?
|
|
271
|
+
var isMuted = false
|
|
272
|
+
var loopEnabled = false
|
|
273
|
+
var loopEnd: TimeInterval = 0
|
|
274
|
+
var playbackRate: Float = 1
|
|
275
|
+
var completionHandler: CHHapticAdvancedPatternPlayerCompletionHandler?
|
|
276
|
+
|
|
277
|
+
init(pattern: CHHapticPattern?) { self.pattern = pattern }
|
|
278
|
+
|
|
279
|
+
func start(atTime time: TimeInterval) throws {}
|
|
280
|
+
func stop(atTime time: TimeInterval) throws {}
|
|
281
|
+
func sendParameters(_ parameters: [CHHapticDynamicParameter], atTime time: TimeInterval) throws {}
|
|
282
|
+
func scheduleParameterCurve(_ parameterCurve: CHHapticParameterCurve, atTime time: TimeInterval) throws {}
|
|
283
|
+
func cancel() throws {}
|
|
284
|
+
func pause(atTime time: TimeInterval) throws {}
|
|
285
|
+
func resume(atTime time: TimeInterval) throws {}
|
|
286
|
+
func seek(toOffset offsetTime: TimeInterval) throws {}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// MARK: - Capabilities
|
|
290
|
+
|
|
291
|
+
public protocol CHHapticParameterAttributes {
|
|
292
|
+
var minValue: Float { get }
|
|
293
|
+
var maxValue: Float { get }
|
|
294
|
+
var defaultValue: Float { get }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// What the hardware can play.
|
|
298
|
+
public protocol CHHapticDeviceCapability {
|
|
299
|
+
var supportsHaptics: Bool { get }
|
|
300
|
+
var supportsAudio: Bool { get }
|
|
301
|
+
func attributes(forEventParameter inParameter: CHHapticEvent.ParameterID, eventType type: CHHapticEvent.EventType) throws -> CHHapticParameterAttributes
|
|
302
|
+
func attributes(forDynamicParameter inParameter: CHHapticDynamicParameter.ID) throws -> CHHapticParameterAttributes
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
struct _Attributes: CHHapticParameterAttributes {
|
|
306
|
+
var minValue: Float = 0
|
|
307
|
+
var maxValue: Float = 1
|
|
308
|
+
var defaultValue: Float = 0
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/// The browser's: no haptics, no audio.
|
|
312
|
+
struct _BrowserCapability: CHHapticDeviceCapability {
|
|
313
|
+
var supportsHaptics: Bool { false }
|
|
314
|
+
var supportsAudio: Bool { false }
|
|
315
|
+
func attributes(forEventParameter inParameter: CHHapticEvent.ParameterID, eventType type: CHHapticEvent.EventType) throws -> CHHapticParameterAttributes { _Attributes() }
|
|
316
|
+
func attributes(forDynamicParameter inParameter: CHHapticDynamicParameter.ID) throws -> CHHapticParameterAttributes { _Attributes() }
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// MARK: - The engine
|
|
320
|
+
|
|
321
|
+
/// The haptic engine. `capabilitiesForHardware()` reports no haptics; the
|
|
322
|
+
/// engine still starts, stops and makes players, which play nothing.
|
|
323
|
+
open class CHHapticEngine: @unchecked Sendable {
|
|
324
|
+
public enum StoppedReason: Int, Sendable {
|
|
325
|
+
case audioSessionInterrupt = 1, applicationSuspended, idleTimeout, notifyWhenFinished,
|
|
326
|
+
engineDestroyed, gameControllerDisconnect, systemError = -1
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
public enum FinishedAction: Int, Sendable {
|
|
330
|
+
case stopEngine = 1, leaveEngineRunning
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
public typealias StoppedHandler = @Sendable (StoppedReason) -> Void
|
|
334
|
+
public typealias ResetHandler = @Sendable () -> Void
|
|
335
|
+
public typealias CompletionHandler = @Sendable (Error?) -> Void
|
|
336
|
+
public typealias FinishedHandler = @Sendable (Error?) -> FinishedAction
|
|
337
|
+
|
|
338
|
+
open var stoppedHandler: StoppedHandler = { _ in }
|
|
339
|
+
open var resetHandler: ResetHandler = {}
|
|
340
|
+
open var playsHapticsOnly = false
|
|
341
|
+
open var playsAudioOnly = false
|
|
342
|
+
open var isMutedForAudio = false
|
|
343
|
+
open var isMutedForHaptics = false
|
|
344
|
+
open var isAutoShutdownEnabled = false
|
|
345
|
+
/// Whether `start` was called more recently than `stop`.
|
|
346
|
+
public private(set) var isRunning = false
|
|
347
|
+
|
|
348
|
+
/// No haptics and no audio: the browser has no haptic engine.
|
|
349
|
+
public class func capabilitiesForHardware() -> CHHapticDeviceCapability { _BrowserCapability() }
|
|
350
|
+
|
|
351
|
+
public init() throws {}
|
|
352
|
+
public init(audioSession: AnyObject?) throws {}
|
|
353
|
+
|
|
354
|
+
/// Seconds since the engine was made (the hardware clock patterns are timed by).
|
|
355
|
+
open var currentTime: TimeInterval { Date().timeIntervalSince(created) }
|
|
356
|
+
private let created = Date()
|
|
357
|
+
|
|
358
|
+
open func start() async throws { isRunning = true }
|
|
359
|
+
open func start(completionHandler: CompletionHandler? = nil) {
|
|
360
|
+
isRunning = true
|
|
361
|
+
completionHandler?(nil)
|
|
362
|
+
}
|
|
363
|
+
open func startAndReturnError() throws { isRunning = true }
|
|
364
|
+
|
|
365
|
+
open func stop() async throws { isRunning = false }
|
|
366
|
+
open func stop(completionHandler: CompletionHandler? = nil) {
|
|
367
|
+
isRunning = false
|
|
368
|
+
completionHandler?(nil)
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/// Calls `finishedHandler` at once: no player is ever playing.
|
|
372
|
+
open func notifyWhenPlayersFinished(finishedHandler: @escaping FinishedHandler) {
|
|
373
|
+
if finishedHandler(nil) == .stopEngine { isRunning = false }
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
open func makePlayer(with pattern: CHHapticPattern) throws -> CHHapticPatternPlayer { _SilentPlayer(pattern: pattern) }
|
|
377
|
+
open func makeAdvancedPlayer(with pattern: CHHapticPattern) throws -> CHHapticAdvancedPatternPlayer { _SilentPlayer(pattern: pattern) }
|
|
378
|
+
|
|
379
|
+
/// Reads and checks an AHAP file; plays nothing.
|
|
380
|
+
open func playPattern(from url: URL) throws {
|
|
381
|
+
guard let data = try? Data(contentsOf: url) else { throw CHHapticError(.fileNotFound) }
|
|
382
|
+
try playPattern(from: data)
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/// Checks AHAP data (JSON); plays nothing.
|
|
386
|
+
open func playPattern(from data: Data) throws {
|
|
387
|
+
guard (try? JSONSerialization.jsonObject(with: data)) is [String: Any] else {
|
|
388
|
+
throw CHHapticError(.invalidPatternData)
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/// Audio resources are accepted and never played.
|
|
393
|
+
open func registerAudioResource(_ resourceURL: URL, options: [AnyHashable: Any] = [:]) throws -> CHHapticAudioResourceID {
|
|
394
|
+
nextResource += 1
|
|
395
|
+
return nextResource
|
|
396
|
+
}
|
|
397
|
+
open func unregisterAudioResource(_ resourceID: CHHapticAudioResourceID) throws {}
|
|
398
|
+
private var nextResource: CHHapticAudioResourceID = 0
|
|
399
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Core Image's color: RGBA components in 0…1, as code reads them back from a
|
|
2
|
+
// UIColor or a Color (`CIColor(color:)` is UIKit's, in Sources/UIKit).
|
|
3
|
+
|
|
4
|
+
import SwiftUI
|
|
5
|
+
|
|
6
|
+
public final class CIColor: Hashable, @unchecked Sendable, CustomStringConvertible {
|
|
7
|
+
public let red: CGFloat
|
|
8
|
+
public let green: CGFloat
|
|
9
|
+
public let blue: CGFloat
|
|
10
|
+
public let alpha: CGFloat
|
|
11
|
+
public var numberOfComponents: Int { 4 }
|
|
12
|
+
public var components: [CGFloat] { [red, green, blue, alpha] }
|
|
13
|
+
|
|
14
|
+
public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat = 1) {
|
|
15
|
+
(self.red, self.green, self.blue, self.alpha) = (red, green, blue, alpha)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// "r g b a", as Core Image writes it.
|
|
19
|
+
public convenience init(string representation: String) {
|
|
20
|
+
let values = representation.split(separator: " ").compactMap { Double($0) }.map { CGFloat($0) }
|
|
21
|
+
self.init(red: values.count > 0 ? values[0] : 0, green: values.count > 1 ? values[1] : 0,
|
|
22
|
+
blue: values.count > 2 ? values[2] : 0, alpha: values.count > 3 ? values[3] : 1)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public var stringRepresentation: String { "\(red) \(green) \(blue) \(alpha)" }
|
|
26
|
+
public var description: String { stringRepresentation }
|
|
27
|
+
|
|
28
|
+
public static let black = CIColor(red: 0, green: 0, blue: 0)
|
|
29
|
+
public static let white = CIColor(red: 1, green: 1, blue: 1)
|
|
30
|
+
public static let gray = CIColor(red: 0.5, green: 0.5, blue: 0.5)
|
|
31
|
+
public static let red = CIColor(red: 1, green: 0, blue: 0)
|
|
32
|
+
public static let green = CIColor(red: 0, green: 1, blue: 0)
|
|
33
|
+
public static let blue = CIColor(red: 0, green: 0, blue: 1)
|
|
34
|
+
public static let cyan = CIColor(red: 0, green: 1, blue: 1)
|
|
35
|
+
public static let magenta = CIColor(red: 1, green: 0, blue: 1)
|
|
36
|
+
public static let yellow = CIColor(red: 1, green: 1, blue: 0)
|
|
37
|
+
public static let clear = CIColor(red: 0, green: 0, blue: 0, alpha: 0)
|
|
38
|
+
|
|
39
|
+
public static func == (lhs: CIColor, rhs: CIColor) -> Bool { lhs.components == rhs.components }
|
|
40
|
+
public func hash(into hasher: inout Hasher) { hasher.combine(components) }
|
|
41
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
/// Options for a context; accepted and ignored.
|
|
4
|
+
public struct CIContextOption: Hashable, RawRepresentable, Sendable {
|
|
5
|
+
public let rawValue: String
|
|
6
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
7
|
+
|
|
8
|
+
public static let useSoftwareRenderer = CIContextOption(rawValue: "kCIContextUseSoftwareRenderer")
|
|
9
|
+
public static let workingColorSpace = CIContextOption(rawValue: "kCIContextWorkingColorSpace")
|
|
10
|
+
public static let outputColorSpace = CIContextOption(rawValue: "kCIContextOutputColorSpace")
|
|
11
|
+
public static let cacheIntermediates = CIContextOption(rawValue: "kCIContextCacheIntermediates")
|
|
12
|
+
public static let priorityRequestLow = CIContextOption(rawValue: "kCIContextPriorityRequestLow")
|
|
13
|
+
public static let highQualityDownsample = CIContextOption(rawValue: "kCIContextHighQualityDownsample")
|
|
14
|
+
public static let useSoftwareRendererIfNeeded = CIContextOption(rawValue: "kCIContextUseSoftwareRenderer")
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// Where Core Image renders. Rendering here is a promise: `createCGImage`
|
|
18
|
+
/// returns at once a bitmap whose recipe the page runs when the image is
|
|
19
|
+
/// drawn, so a context is cheap and holds nothing.
|
|
20
|
+
public final class CIContext: @unchecked Sendable {
|
|
21
|
+
public init() {}
|
|
22
|
+
public init(options: [CIContextOption: Any]?) {}
|
|
23
|
+
|
|
24
|
+
/// The part of `image` inside `fromRect` (rounded out to whole pixels) as
|
|
25
|
+
/// a bitmap of that size, clear where the image does not reach; nil for
|
|
26
|
+
/// an infinite or empty rectangle, as on Apple platforms.
|
|
27
|
+
public func createCGImage(_ image: CIImage, from fromRect: CGRect) -> CGImage? {
|
|
28
|
+
guard let recipe = image._recipe.rendered(in: fromRect) else { return nil }
|
|
29
|
+
return CGImage(_recipe: recipe)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Core Image's feature detectors, as code that scans a picked photo for a QR
|
|
2
|
+
// code (CodeScanner's gallery) calls them. Swift holds no decoded pixels
|
|
3
|
+
// (docs/ops-protocol.md, "Bitmaps and Core Image") and the page's
|
|
4
|
+
// `BarcodeDetector` answers asynchronously, so `features(in:)`, which is
|
|
5
|
+
// synchronous, finds nothing: the code reports that the image has no code.
|
|
6
|
+
|
|
7
|
+
import struct Foundation.Data
|
|
8
|
+
import SwiftUI
|
|
9
|
+
|
|
10
|
+
public let CIDetectorTypeQRCode = "CIDetectorTypeQRCode"
|
|
11
|
+
public let CIDetectorTypeFace = "CIDetectorTypeFace"
|
|
12
|
+
public let CIDetectorTypeRectangle = "CIDetectorTypeRectangle"
|
|
13
|
+
public let CIDetectorTypeText = "CIDetectorTypeText"
|
|
14
|
+
public let CIDetectorAccuracy = "CIDetectorAccuracy"
|
|
15
|
+
public let CIDetectorAccuracyHigh = "CIDetectorAccuracyHigh"
|
|
16
|
+
public let CIDetectorAccuracyLow = "CIDetectorAccuracyLow"
|
|
17
|
+
|
|
18
|
+
/// Finds features in an image: none, in the browser.
|
|
19
|
+
open class CIDetector: @unchecked Sendable {
|
|
20
|
+
public let type: String
|
|
21
|
+
|
|
22
|
+
public init?(ofType type: String, context: CIContext?, options: [String: Any]? = nil) {
|
|
23
|
+
self.type = type
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
open func features(in image: CIImage) -> [CIFeature] { [] }
|
|
27
|
+
open func features(in image: CIImage, options: [String: Any]? = nil) -> [CIFeature] { [] }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// Something a detector found.
|
|
31
|
+
open class CIFeature: @unchecked Sendable {
|
|
32
|
+
public let type: String
|
|
33
|
+
public let bounds: CGRect
|
|
34
|
+
|
|
35
|
+
init(type: String, bounds: CGRect) {
|
|
36
|
+
self.type = type
|
|
37
|
+
self.bounds = bounds
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// A QR code a detector found.
|
|
42
|
+
open class CIQRCodeFeature: CIFeature, @unchecked Sendable {
|
|
43
|
+
public let messageString: String?
|
|
44
|
+
public let topLeft: CGPoint
|
|
45
|
+
public let topRight: CGPoint
|
|
46
|
+
public let bottomLeft: CGPoint
|
|
47
|
+
public let bottomRight: CGPoint
|
|
48
|
+
|
|
49
|
+
init(messageString: String?, topLeft: CGPoint, topRight: CGPoint, bottomLeft: CGPoint, bottomRight: CGPoint) {
|
|
50
|
+
self.messageString = messageString
|
|
51
|
+
self.topLeft = topLeft
|
|
52
|
+
self.topRight = topRight
|
|
53
|
+
self.bottomLeft = bottomLeft
|
|
54
|
+
self.bottomRight = bottomRight
|
|
55
|
+
super.init(type: CIDetectorTypeQRCode, bounds: CGRect(x: bottomLeft.x, y: bottomLeft.y, width: topRight.x - bottomLeft.x, height: topRight.y - bottomLeft.y))
|
|
56
|
+
}
|
|
57
|
+
}
|