Skip to content

Commit e871168

Browse files
committed
Add Navigation types example to fixture
This adds navigation direction add Transition Types. This lets us specify an animation that cross-fades for normal push but slides left or right depending on if it's forward or back navigation.
1 parent b2a9ae9 commit e871168

3 files changed

Lines changed: 58 additions & 2 deletions

File tree

fixtures/view-transition/src/components/App.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, {
33
useLayoutEffect,
44
useEffect,
55
useState,
6+
unstable_addTransitionType as addTransitionType,
67
} from 'react';
78

89
import Chrome from './Chrome';
@@ -35,11 +36,23 @@ export default function App({assets, initialURL}) {
3536
if (!event.canIntercept) {
3637
return;
3738
}
39+
const navigationType = event.navigationType;
40+
const previousIndex = window.navigation.currentEntry.index;
3841
const newURL = new URL(event.destination.url);
3942
event.intercept({
4043
handler() {
4144
let promise;
4245
startTransition(() => {
46+
addTransitionType('navigation-' + navigationType);
47+
if (navigationType === 'traverse') {
48+
// For traverse types it's useful to distinguish going back or forward.
49+
const nextIndex = event.destination.index;
50+
if (nextIndex > previousIndex) {
51+
addTransitionType('navigation-forward');
52+
} else if (nextIndex < previousIndex) {
53+
addTransitionType('navigation-back');
54+
}
55+
}
4356
promise = new Promise(resolve => {
4457
setRouterState({
4558
url: newURL.pathname + newURL.search,

fixtures/view-transition/src/components/Page.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ function Component() {
3636

3737
export default function Page({url, navigate}) {
3838
const show = url === '/?b';
39-
function onTransition(viewTransition) {
39+
function onTransition(viewTransition, types) {
4040
const keyframes = [
4141
{rotate: '0deg', transformOrigin: '30px 8px'},
4242
{rotate: '360deg', transformOrigin: '30px 8px'},
@@ -59,6 +59,9 @@ export default function Page({url, navigate}) {
5959
</button>
6060
<ViewTransition className="none">
6161
<div>
62+
<ViewTransition className={transitions['slide-on-nav']}>
63+
<h1>{!show ? 'A' : 'B'}</h1>
64+
</ViewTransition>
6265
{show ? (
6366
<div>
6467
{a}

fixtures/view-transition/src/components/Transitions.module.css

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,18 @@
99
}
1010
}
1111

12-
@keyframes exit-slide-left {
12+
@keyframes enter-slide-left {
13+
0% {
14+
opacity: 0;
15+
translate: 200px 0;
16+
}
17+
100% {
18+
opacity: 1;
19+
translate: 0 0;
20+
}
21+
}
22+
23+
@keyframes exit-slide-right {
1324
0% {
1425
opacity: 1;
1526
translate: 0 0;
@@ -20,9 +31,38 @@
2031
}
2132
}
2233

34+
@keyframes exit-slide-left {
35+
0% {
36+
opacity: 1;
37+
translate: 0 0;
38+
}
39+
100% {
40+
opacity: 0;
41+
translate: -200px 0;
42+
}
43+
}
44+
2345
::view-transition-new(.enter-slide-right):only-child {
2446
animation: enter-slide-right ease-in 0.25s;
2547
}
2648
::view-transition-old(.exit-slide-left):only-child {
2749
animation: exit-slide-left ease-in 0.25s;
2850
}
51+
52+
:root:active-view-transition-type(navigation-back) {
53+
&::view-transition-new(.slide-on-nav) {
54+
animation: enter-slide-right ease-in 0.25s;
55+
}
56+
&::view-transition-old(.slide-on-nav) {
57+
animation: exit-slide-right ease-in 0.25s;
58+
}
59+
}
60+
61+
:root:active-view-transition-type(navigation-forward) {
62+
&::view-transition-new(.slide-on-nav) {
63+
animation: enter-slide-left ease-in 0.25s;
64+
}
65+
&::view-transition-old(.slide-on-nav) {
66+
animation: exit-slide-left ease-in 0.25s;
67+
}
68+
}

0 commit comments

Comments
 (0)