Skip to content

Commit 0937e79

Browse files
feat: add missing types for ViewTransition
1 parent 07296be commit 0937e79

File tree

2 files changed

+56
-16
lines changed

2 files changed

+56
-16
lines changed

packages/qwik-router/src/runtime/src/qwik-router-component.tsx

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ import type {
6666
import { loadClientData } from './use-endpoint';
6767
import { useQwikRouterEnv } from './use-functions';
6868
import { isSameOrigin, isSamePath, toUrl } from './utils';
69+
import { startViewTransition } from './view-transition';
6970

7071
/**
7172
* @deprecated Use `QWIK_ROUTER_SCROLLER` instead (will be removed in V3)
@@ -665,23 +666,13 @@ export const QwikRouterProvider = component$<QwikRouterProps>((props) => {
665666
if (isServer) {
666667
return run();
667668
}
668-
669-
if (props.viewTransition !== false && 'startViewTransition' in document) {
670-
let transition: ViewTransition;
671-
try {
672-
// Typed transition starts with Chrome 125 & Safari 18
673-
transition = document.startViewTransition({
674-
update: run,
675-
types: ['qwik-router-spa'],
676-
} as any);
677-
} catch {
678-
// Fallback for Chrome 111 until Chrome 125
679-
transition = document.startViewTransition(run);
680-
}
681-
const event = new CustomEvent('qviewTransition', { detail: transition });
682-
document.dispatchEvent(event);
683-
} else {
669+
if (props.viewTransition === false) {
684670
run();
671+
} else {
672+
startViewTransition({
673+
update: run,
674+
types: ['qwik-router-spa'],
675+
});
685676
}
686677
});
687678

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// This types are missing in current typescript version: 5.4.5
2+
3+
interface StartViewTransitionOptions {
4+
types?: string[] | null;
5+
update?: ViewTransitionUpdateCallback | null;
6+
}
7+
interface ViewTransitionUpdateCallback {
8+
(): any;
9+
}
10+
11+
interface DocumentViewTransition extends Document {
12+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/startViewTransition) */
13+
startViewTransition(
14+
callbackOptions?: ViewTransitionUpdateCallback | StartViewTransitionOptions
15+
): ViewTransition;
16+
}
17+
18+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ViewTransition) */
19+
interface ViewTransition {
20+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ViewTransition/finished) */
21+
readonly finished: Promise<undefined>;
22+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ViewTransition/ready) */
23+
readonly ready: Promise<undefined>;
24+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ViewTransition/updateCallbackDone) */
25+
readonly updateCallbackDone: Promise<undefined>;
26+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ViewTransition/skipTransition) */
27+
skipTransition(): void;
28+
types?: Set<string>;
29+
}
30+
31+
export const startViewTransition = (params: StartViewTransitionOptions) => {
32+
if (!params.update) {
33+
return;
34+
}
35+
if ('startViewTransition' in document) {
36+
let transition: ViewTransition;
37+
try {
38+
// Typed transition starts with Chrome 125 & Safari 18
39+
transition = (document as DocumentViewTransition).startViewTransition(params);
40+
} catch {
41+
// Fallback for Chrome 111 until Chrome 125
42+
transition = (document as DocumentViewTransition).startViewTransition(params.update);
43+
}
44+
const event = new CustomEvent('qviewTransition', { detail: transition });
45+
document.dispatchEvent(event);
46+
} else {
47+
params.update?.();
48+
}
49+
};

0 commit comments

Comments
 (0)