# SwiftUINavigationTransitions
[](https://github.com/davdroman/swiftui-navigation-transitions/actions/workflows/ci.yml)
[](https://swiftpackageindex.com/davdroman/swiftui-navigation-transitions)
[](https://swiftpackageindex.com/davdroman/swiftui-navigation-transitions)
[](https://swiftpackageindex.com/davdroman/swiftui-navigation-transitions/main/documentation/swiftuinavigationtransitions)
**SwiftUINavigationTransitions** integrates with SwiftUI's `NavigationStack` to customize **push and pop transitions**.
Requires iOS 16+, Mac Catalyst 16+, tvOS 16+, or visionOS 1+.
## Overview
Apply a **single modifier** directly to `NavigationStack` to control its transitions.
### The Basics
```swift
NavigationStack {
// ...
}
.customNavigationTransition(.slide)
```
---
The API is designed to resemble that of built-in SwiftUI Transitions for maximum **familiarity** and **ease of use**.
You can apply **custom animations** just like with standard SwiftUI transitions:
```swift
.customNavigationTransition(
.fade(.in).animation(.easeInOut(duration: 0.3))
)
```
You can **combine** them:
```swift
.customNavigationTransition(
.slide.combined(with: .fade(.in))
)
```
And you can **dynamically** choose between transitions based on logic:
```swift
.customNavigationTransition(
reduceMotion ? .fade(.in).animation(.linear) : .slide(.vertical)
)
```
### Transitions
The library ships with some **standard transitions** out of the box:
- [`default`](Sources/NavigationTransition/Default.swift)
- [`fade(_:)`](Sources/NavigationTransition/Fade.swift)
- [`slide(axis:)`](Sources/NavigationTransition/Slide.swift)
In addition to these, you can create fully [**custom transitions**](https://swiftpackageindex.com/davdroman/swiftui-navigation-transitions/main/documentation/swiftuinavigationtransitions/custom-transitions) in just a few lines of SwiftUI-like code!
```swift
struct Swing: NavigationTransitionProtocol {
var body: some NavigationTransitionProtocol {
Slide(axis: .horizontal)
MirrorPush {
let angle = 70.0
let offset = 150.0
OnInsertion {
ZPosition(1)
Rotate(.degrees(-angle))
Offset(x: offset)
Opacity()
Scale(0.5)
}
OnRemoval {
Rotate(.degrees(angle))
Offset(x: -offset)
}
}
}
}
```
The [**Demo**](Examples/Demo) app showcases some of these transitions in action.
### Interactivity
Choose from three interactivity options: `.disabled`, `.edgePan`, or `.contentPan`:
```swift
.customNavigationTransition(.slide, interactivity: .disabled) // disables back swipes
```
`.contentPan` supports full-screen **pop gestures** on iOS 16 and later:
```swift
.customNavigationTransition(.slide, interactivity: .contentPan)
```
This also works while maintaining the **default system transition**:
```swift
.customNavigationTransition(.default, interactivity: .contentPan)
```
## Installation
Add the package via Swift Package Manager:
``` swift
dependencies: [
.package(url: "https://github.com/davdroman/swiftui-navigation-transitions", from: "0.19.0"),
]
```
```swift
.product(name: "SwiftUINavigationTransitions", package: "swiftui-navigation-transitions"),
```
## Development
Install [Mise](https://mise.jdx.dev/), then install the project tools and Git hooks:
```sh
mise install
mise exec -- hk install --mise
```