{"id":13998294,"url":"https://github.com/nathantannar4/Transmission","last_synced_at":"2025-07-23T06:31:15.190Z","repository":{"id":64029846,"uuid":"571851637","full_name":"nathantannar4/Transmission","owner":"nathantannar4","description":"Bridges UIKit presentation APIs to a SwiftUI API so you can use presentation controllers, interactive transitions and more.","archived":false,"fork":false,"pushed_at":"2024-11-22T03:06:56.000Z","size":24343,"stargazers_count":461,"open_issues_count":1,"forks_count":19,"subscribers_count":10,"default_branch":"main","last_synced_at":"2024-11-29T03:11:57.256Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nathantannar4.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-29T02:38:11.000Z","updated_at":"2024-11-28T23:35:34.000Z","dependencies_parsed_at":"2023-02-12T04:33:23.945Z","dependency_job_id":"ce7e11c7-cbbc-4502-9658-66103594332d","html_url":"https://github.com/nathantannar4/Transmission","commit_stats":{"total_commits":14,"total_committers":1,"mean_commits":14.0,"dds":0.0,"last_synced_commit":"812ac35a42a5208a23d45e7fa8c4d6314dfd59b1"},"previous_names":[],"tags_count":60,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nathantannar4%2FTransmission","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nathantannar4%2FTransmission/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nathantannar4%2FTransmission/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nathantannar4%2FTransmission/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nathantannar4","download_url":"https://codeload.github.com/nathantannar4/Transmission/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227245148,"owners_count":17753239,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-09T19:01:33.129Z","updated_at":"2025-07-23T06:31:15.176Z","avatar_url":"https://github.com/nathantannar4.png","language":"Swift","funding_links":[],"categories":["Swift"],"sub_categories":[],"readme":"\u003cimg src=\"./Logo.png\" width=\"128\"\u003e \n\n# Transmission\n\n`Transmission` aims to improve SwiftUI view presentations and transitions. It does this by bridging UIKit presentation APIs to a SwiftUI API so you can use presentation controllers, interactive transitions and more.\n\n\u003e Built using [Engine](https://github.com/nathantannar4/Engine)\n\n## See Also\n\n- [Turbocharger](https://github.com/nathantannar4/Turbocharger)\n- [Ignition](https://github.com/nathantannar4/Ignition)\n\n## Preview\n\nhttps://github.com/user-attachments/assets/5b323b24-6697-4b66-aef0-d7b085b17d79\n\n## Requirements\n\n- Deployment target: iOS 13.0, macOS 10.15, tvOS 13.0, or watchOS 6.0\n- Xcode 15+\n\n## Installation\n\n### Xcode Projects\n\nSelect `File` -\u003e `Swift Packages` -\u003e `Add Package Dependency` and enter `https://github.com/nathantannar4/Transmission`.\n\n### Swift Package Manager Projects\n\nYou can add `Transmission` as a package dependency in your `Package.swift` file:\n\n```swift\nlet package = Package(\n    //...\n    dependencies: [\n        .package(url: \"https://github.com/nathantannar4/Transmission\"),\n    ],\n    targets: [\n        .target(\n            name: \"YourPackageTarget\",\n            dependencies: [\n                .product(name: \"Transmission\", package: \"Transmission\"),\n            ],\n            //...\n        ),\n        //...\n    ],\n    //...\n)\n```\n\n## Introduction to Transmission\n\nFor some sample code to get started with `Transmission`, build and run the included \"Example\" project.\n\n### PresentationLink\n\n```swift\n@available(iOS 14.0, *)\npublic struct PresentationLinkTransition {\n\n    public static var `default`: PresentationLinkTransition\n\n    public static let sheet: PresentationLinkTransition\n    public static let currentContext: PresentationLinkTransition\n    public static let fullscreen: PresentationLinkTransition\n    public static let popover: PresentationLinkTransition\n    public static let slide: PresentationLinkTransition\n    public static let card: PresentationLinkTransition\n    @available(iOS 18.0, *)\n    public static let zoom: PresentationLinkTransition\n    public static let matchedGeometry: PresentationLinkTransition\n    public static let toast: PresentationLinkTransition\n    \n    public static func custom\u003cT: PresentationLinkTransitionRepresentable\u003e(_ transition: T) -\u003e PresentationLinkTransition\n}\n\n@available(iOS 15.0, *)\nextension SheetTransitionOptions.Detent {\n    \n    /// Creates a large detent.\n    public static let large: Detent\n\n    /// Creates a medium detent.\n    public static let medium: Detent\n\n    /// Creates a detent with an auto-resolved height of the views ideal size.\n    public static let ideal: Detent\n\n    /// Creates a detent with a constant height.\n    public static func constant(_ identifier: Identifier, height: CGFloat) -\u003e Detent\n    \n    /// Creates a detent that's height is lazily resolved.\n    public static func custom(\n        _ identifier: Identifier,\n        resolver: @escaping (ResolutionContext) -\u003e CGFloat?\n    ) -\u003e Detent\n}\n\n/// A protocol that defines a custom transition for a ``PresentationLinkTransition``\n///\n/// \u003e Tip: Use ``PresentationController`` or ``InteractivePresentationController``\n///\n@available(iOS 14.0, *)\npublic protocol PresentationLinkTransitionRepresentable {\n\n    typealias Context = PresentationLinkTransitionRepresentableContext\n    associatedtype UIPresentationControllerType: UIPresentationController\n\n    /// The presentation controller to use for the transition.\n    func makeUIPresentationController(\n        presented: UIViewController,\n        presenting: UIViewController?,\n        source: UIViewController,\n        context: Context\n    ) -\u003e UIPresentationControllerType\n\n    func updateUIPresentationController(\n        presentationController: UIPresentationControllerType,\n        context: Context\n    )\n}\n\n/// A coordinator that can be used to programatically dismiss a view.\n///\n/// See Also:\n///  - ``PresentationLink``\n///  - ``WindowLink``\n///\n@available(iOS 14.0, *)\n@frozen\npublic struct PresentationCoordinator {\n\n    public var isPresented: Bool\n    public weak var sourceView: UIView?\n\n    public func dismiss(count: Int, animation: Animation? = .default)\n    \n    public func dismiss(count: Int, transaction: Transaction)\n}\n\n@available(iOS 14.0, *)\nextension EnvironmentValues {\n    public var presentationCoordinator: PresentationCoordinator { get }\n}\n\n/// A button that presents a destination view in a new `UIViewController`.\n///\n/// The destination view is presented with the provided `transition`.\n/// By default, the ``PresentationLinkTransition/default`` transition is used.\n///\n/// See Also:\n///  - ``PresentationSourceViewLink``\n///  - ``PresentationLinkTransition``\n///  - ``PresentationLinkModifier``\n///  - ``TransitionReader``\n///\n/// \u003e Tip: You can implement custom transitions with a `UIPresentationController` and/or\n/// `UIViewControllerInteractiveTransitioning` with the ``PresentationLinkTransition/custom(_:)``\n///  transition.\n///\n@available(iOS 14.0, *)\n@frozen\npublic struct PresentationLink\u003c\n    Label: View,\n    Destination: View\n\u003e: View {\n\n    public init(\n        transition: PresentationLinkTransition = .default,\n        @ViewBuilder destination: () -\u003e Destination,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init(\n        transition: PresentationLinkTransition,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder destination: () -\u003e Destination,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension PresentationLink {\n\n    public init\u003cViewController: UIViewController\u003e(\n        transition: PresentationLinkTransition,\n        destination: @escaping () -\u003e ViewController,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init\u003cViewController: UIViewController\u003e(\n        transition: PresentationLinkTransition,\n        isPresented: Binding\u003cBool\u003e,\n        destination: @escaping () -\u003e ViewController,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension View {\n\n    public func presentation\u003cDestination: View\u003e(\n        transition: PresentationLinkTransition = .default,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder destination: () -\u003e Destination\n    ) -\u003e some View\n\n    public func presentation\u003cT, Destination: View\u003e(\n        _ value: Binding\u003cT?\u003e,\n        transition: PresentationLinkTransition = .default,\n        @ViewBuilder destination: (Binding\u003cT\u003e) -\u003e Destination\n    ) -\u003e some View\n}\n```\n\n### TransitionReader\n\n```swift\n/// A container view that defines its content as a function of its hosting view's\n/// `UIViewControllerTransitionCoordinator` transition progress.\n///\n/// \u003e Tip: Use a ``TransitionReader`` to build interactive presentation and dismissal\n/// transitions\n/// \npublic struct TransitionReader\u003cContent: View\u003e: View {\n    public struct Proxy {\n        /// The progress state of the transition from 0 to 1 where 1 is fully presented\n        public var progress: CGFloat\n\n        public var isPresented: Bool\n    }\n\n    public init(@ViewBuilder content: @escaping (Proxy) -\u003e Content)\n}\n```\n\n### DestinationLink\n\n```swift\n/// The transition and presentation style for a ``DestinationLink`` or ``DestinationLinkModifier``.\n@available(iOS 14.0, *)\npublic struct DestinationLinkTransition: Sendable {\n\n    public static let `default`: DestinationLinkTransition\n\n    @available(iOS 18.0, *)\n    public static let zoom: DestinationLinkTransition\n\n    public static func custom\u003cT: DestinationLinkTransitionRepresentable\u003e(_ transition: T) -\u003e DestinationLinkTransition\n}\n\n/// A protocol that defines a custom transition for a ``DestinationLinkTransition``\n@available(iOS 14.0, *)\n@MainActor @preconcurrency\npublic protocol DestinationLinkTransitionRepresentable {\n\n    typealias Context = DestinationLinkTransitionRepresentableContext\n\n    /// The interaction controller to use for the transition presentation.\n    ///\n    /// \u003e Note: This protocol implementation is optional and defaults to `nil`\n    ///\n    @MainActor @preconcurrency func navigationController(\n        _ navigationController: UINavigationController,\n        interactionControllerFor animationController: UIViewControllerAnimatedTransitioning,\n        context: Context\n    ) -\u003e UIViewControllerInteractiveTransitioning?\n\n    /// The animation controller to use for the transition presentation.\n    @MainActor @preconcurrency func navigationController(\n        _ navigationController: UINavigationController,\n        animationControllerFor operation: UINavigationController.Operation,\n        from fromVC: UIViewController,\n        to toVC: UIViewController,\n        context: Context\n    ) -\u003e UIViewControllerAnimatedTransitioning?\n}\n\n/// A coordinator that can be used to programatically dismiss a view.\n///\n/// See Also:\n///  - ``DestinationLink``\n///\n@available(iOS 14.0, *)\n@frozen\npublic struct DestinationCoordinator {\n    public var isPresented: Bool\n\n    public func pop(count: Int, animation: Animation? = .default)\n    \n    public func pop(count: Int, transaction: Transaction)\n}\n\n@available(iOS 14.0, *)\nextension EnvironmentValues {\n    public var destinationCoordinator: DestinationCoordinator { get }\n}\n\n/// A button that pushes a destination view in a new `UIViewController`.\n///\n/// The destination view is presented with the provided `transition`.\n/// By default, the ``DestinationLinkTransition/default`` transition is used.\n///\n/// See Also:\n///  - ``DestinationLinkModifier``\n///  - ``DestinationLinkTransition``\n///  - ``DestinationSourceViewLink``\n///  - ``TransitionReader``\n///\n/// \u003e Tip: You can implement custom transitions with the ``DestinationLinkTransition/custom(_:)``\n///  transition.\n///\n@available(iOS 14.0, *)\n@frozen\npublic struct DestinationLink\u003c\n    Label: View,\n    Destination: View\n\u003e: View {\n\n    public init(\n        transition: DestinationLinkTransition = .default,\n        @ViewBuilder destination: () -\u003e Destination,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init(\n        transition: DestinationLinkTransition,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder destination: () -\u003e Destination,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension DestinationLink {\n\n    public init\u003cViewController: UIViewController\u003e(\n        transition: DestinationLinkTransition,\n        destination: @escaping () -\u003e ViewController,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init\u003cViewController: UIViewController\u003e(\n        transition: DestinationLinkTransition,\n        isPresented: Binding\u003cBool\u003e,\n        destination: @escaping () -\u003e ViewController,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension View {\n\n    public func destination\u003cDestination: View\u003e(\n        transition: DestinationLinkTransition = .default,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder destination: () -\u003e Destination\n    ) -\u003e some View\n\n    public func destination\u003cT, Destination: View\u003e(\n        _ value: Binding\u003cT?\u003e,\n        transition: DestinationLinkTransition = .default,\n        @ViewBuilder destination: (Binding\u003cT\u003e) -\u003e Destination\n    ) -\u003e some View\n}\n```\n\n### StatusBar Style/Hidden\n\n```swift\n@available(iOS 14.0, *)\nextension View {\n\n    /// Sets the preferred status bar style of the hosting views `UIViewController`\n    public func preferredStatusBarStyle(_ style: UIStatusBarStyle) -\u003e some View\n\n    /// Sets the preferred status bar visibility of the hosting views `UIViewController`\n    public func prefersStatusBarHidden(_ isHidden: Bool = true) -\u003e some View\n}\n\n```\n\n### WindowLink\n\n```swift\n@available(iOS 14.0, *)\npublic struct WindowLinkLevel {\n\n    public static var `default`: WindowLinkLevel\n\n    public static var overlay: WindowLinkLevel\n\n    public static var background: WindowLinkLevel\n    \n    public static let alert: WindowLinkLevel\n\n    public static func custom(_ level: CGFloat) -\u003e WindowLinkLevel\n}\n\n@available(iOS 14.0, *)\npublic struct WindowLinkTransition {\n\n    public static let identity: WindowLinkTransition\n\n    public static let opacity: WindowLinkTransition\n\n    public static func move(edge: Edge) -\u003e WindowLinkTransition\n\n    public static func scale(_ multiplier: CGFloat) -\u003e WindowLinkTransition\n}\n\nextension WindowLinkTransition {\n    public func combined(with other: WindowLinkTransition) -\u003e WindowLinkTransition\n}\n\n/// A button that presents a destination view in a new `UIWindow`.\n@available(iOS 14.0, *)\n@frozen\npublic struct WindowLink\u003c\n    Label: View,\n    Destination: View\n\u003e: View {\n\n    public init(\n        level: WindowLinkLevel = .default,\n        transition: WindowLinkTransition = .opacity,\n        @ViewBuilder destination: () -\u003e Destination,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init(\n        level: WindowLinkLevel = .default,\n        transition: WindowLinkTransition = .opacity,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder destination: () -\u003e Destination,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension View {\n\n    /// A modifier that presents a destination view in a new `UIWindow`\n    public func window\u003cDestination: View\u003e(\n        level: WindowLinkLevel = .default,\n        transition: WindowLinkTransition = .opacity,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder destination: () -\u003e Destination\n    ) -\u003e some View\n\n    /// A modifier that presents a destination view in a new `UIWindow`\n    public func window\u003cT, D: View\u003e(\n        _ value: Binding\u003cT?\u003e,\n        level: WindowLinkLevel = .default,\n        transition: WindowLinkTransition = .opacity,\n        @ViewBuilder destination: (Binding\u003cT\u003e) -\u003e D\n    ) -\u003e some View\n}\n```\n\n### ShareSheetLink\n\n```swift\n/// A protocol that defines an interface for creating activities for a `UIActivityViewController`\n@available(iOS 14.0, *)\npublic protocol ShareSheetItemProvider {\n    func makeUIActivityItemSource(context: Context) -\u003e UIActivityItemSource\n    func makeUIActivity(context: Context) -\u003e UIActivity?\n\n    typealias Context = ShareSheetItemProviderContext\n}\n\n/// A share sheet provider for a string.\n@available(iOS 14.0, *)\nextension String: ShareSheetItemProvider {\n    public func makeUIActivityItemSource(context: Context) -\u003e UIActivityItemSource\n}\n\n/// A share sheet provider for a url.\n@available(iOS 14.0, *)\nextension URL: ShareSheetItemProvider {\n    public func makeUIActivityItemSource(context: Context) -\u003e UIActivityItemSource\n}\n\n/// A share sheet provider for generating an image from a view.\n@available(iOS 14.0, *)\n@frozen\npublic struct SnapshotItemProvider\u003cContent: View\u003e: ShareSheetItemProvider {\n\n    public init(label: LocalizedStringKey, content: Content)\n}\n\n/// A button that presents a `UIActivityViewController`\n@available(iOS 14.0, *)\n@frozen\npublic struct ShareSheetLink\u003c\n    Label: View\n\u003e: View {\n\n    public init(\n        items: [ShareSheetItemProvider],\n        action: ((Result\u003cUIActivity.ActivityType?, Error\u003e) -\u003e Void)? = nil,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init(\n        items: [ShareSheetItemProvider],\n        action: ((Result\u003cUIActivity.ActivityType?, Error\u003e) -\u003e Void)? = nil,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension View {\n    \n    /// A modifier that presents a `UIActivityViewController`\n    public func share(\n        items: [ShareSheetItemProvider],\n        isPresented: Binding\u003cBool\u003e,\n        action: ((Result\u003cUIActivity.ActivityType?, Error\u003e) -\u003e Void)? = nil\n    ) -\u003e some View\n}\n\n/// A modifier that presents a `UIActivityViewController`\n@available(iOS 14.0, *)\n@frozen\npublic struct ShareSheetLinkModifier: ViewModifier {\n\n    public init(\n        items: [ShareSheetItemProvider],\n        action: ((Result\u003cUIActivity.ActivityType?, Error\u003e) -\u003e Void)? = nil,\n        isPresented: Binding\u003cBool\u003e\n    )\n}\n```\n\n### QuickLookPreviewLink\n\n```swift\n/// A quick look preview provider.\n@available(iOS 14.0, *)\n@frozen\npublic struct QuickLookPreviewItem: Equatable {\n\n    public var url: URL\n    public var label: Text?\n\n    public init(url: URL, label: Text? = nil)\n}\n\n/// A button that presents a `QLPreviewController`\n@available(iOS 14.0, *)\n@frozen\npublic struct QuickLookPreviewLink\u003c\n    Label: View\n\u003e: View {\n\n    public init(\n        items: [QuickLookPreviewItem],\n        transition: QuickLookPreviewTransition = .default,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init(\n        items: [QuickLookPreviewItem],\n        transition: QuickLookPreviewTransition = .default,\n        isPresented: Binding\u003cBool\u003e,\n        @ViewBuilder label: () -\u003e Label\n    )\n\n    public init(\n        url: URL,\n        transition: QuickLookPreviewTransition = .default,\n        @ViewBuilder label: () -\u003e Label\n    )\n}\n\n@available(iOS 14.0, *)\nextension View {\n\n    /// A modifier that presents a `QLPreviewController`\n    public func quickLookPreview(\n        items: [QuickLookPreviewItem],\n        transition: QuickLookPreviewTransition = .default,\n        isPresented: Binding\u003cBool\u003e\n    ) -\u003e some View\n\n    /// A modifier that presents a `QLPreviewController`\n    public func quickLookPreview(\n        url: URL,\n        transition: QuickLookPreviewTransition = .default,\n        isPresented: Binding\u003cBool\u003e\n    ) -\u003e some View\n}\n\n/// A modifier that presents a `QLPreviewController`\n@available(iOS 14.0, *)\n@frozen\npublic struct QuickLookPreviewLinkModifier: ViewModifier {\n\n    public init(\n        items: [QuickLookPreviewItem],\n        transition: QuickLookPreviewTransition = .default,\n        isPresented: Binding\u003cBool\u003e\n    )\n}\n```\n\n## License\n\nDistributed under the BSD 2-Clause License. See ``LICENSE.md`` for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnathantannar4%2FTransmission","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnathantannar4%2FTransmission","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnathantannar4%2FTransmission/lists"}