@flight-framework/transitions 0.1.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/README.md +232 -0
- package/dist/adapters/react/index.d.ts +210 -0
- package/dist/adapters/react/index.js +261 -0
- package/dist/adapters/react/index.js.map +1 -0
- package/dist/adapters/solid/index.d.ts +5 -0
- package/dist/adapters/solid/index.js +9 -0
- package/dist/adapters/solid/index.js.map +1 -0
- package/dist/adapters/svelte/index.d.ts +5 -0
- package/dist/adapters/svelte/index.js +9 -0
- package/dist/adapters/svelte/index.js.map +1 -0
- package/dist/adapters/vue/index.d.ts +5 -0
- package/dist/adapters/vue/index.js +9 -0
- package/dist/adapters/vue/index.js.map +1 -0
- package/dist/chunk-4SF4GHDQ.js +252 -0
- package/dist/chunk-4SF4GHDQ.js.map +1 -0
- package/dist/chunk-7R3FXL3A.js +442 -0
- package/dist/chunk-7R3FXL3A.js.map +1 -0
- package/dist/chunk-BAILQEFB.js +136 -0
- package/dist/chunk-BAILQEFB.js.map +1 -0
- package/dist/chunk-ITLC6KJ4.js +138 -0
- package/dist/chunk-ITLC6KJ4.js.map +1 -0
- package/dist/chunk-JRRJMJDL.js +121 -0
- package/dist/chunk-JRRJMJDL.js.map +1 -0
- package/dist/chunk-UZUZC3MA.js +190 -0
- package/dist/chunk-UZUZC3MA.js.map +1 -0
- package/dist/chunk-W7HSR35B.js +3 -0
- package/dist/chunk-W7HSR35B.js.map +1 -0
- package/dist/chunk-WDXXYC7B.js +70 -0
- package/dist/chunk-WDXXYC7B.js.map +1 -0
- package/dist/chunk-XLVYHPII.js +3 -0
- package/dist/chunk-XLVYHPII.js.map +1 -0
- package/dist/chunk-ZBJ6FSAK.js +438 -0
- package/dist/chunk-ZBJ6FSAK.js.map +1 -0
- package/dist/component/index.d.ts +87 -0
- package/dist/component/index.js +5 -0
- package/dist/component/index.js.map +1 -0
- package/dist/config/index.d.ts +93 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/index.d.ts +107 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.d.ts +112 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/page/index.d.ts +87 -0
- package/dist/page/index.js +7 -0
- package/dist/page/index.js.map +1 -0
- package/dist/presets/index.d.ts +192 -0
- package/dist/presets/index.js +3 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/router/index.d.ts +104 -0
- package/dist/router/index.js +7 -0
- package/dist/router/index.js.map +1 -0
- package/dist/transition-manager-CuO0S_Yn.d.ts +62 -0
- package/dist/types-BT3SCjiY.d.ts +272 -0
- package/dist/view-transition-Hp-Q9vWJ.d.ts +97 -0
- package/package.json +110 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { prefersReducedMotion, onReducedMotionChange, DEFAULT_EASING, DEFAULT_DURATION, resolveTransition } from './chunk-4SF4GHDQ.js';
|
|
2
|
+
|
|
3
|
+
// src/core/view-transition.ts
|
|
4
|
+
var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
5
|
+
function isViewTransitionSupported() {
|
|
6
|
+
if (!isBrowser) return false;
|
|
7
|
+
return "startViewTransition" in document && typeof document.startViewTransition === "function";
|
|
8
|
+
}
|
|
9
|
+
function isCrossDocumentTransitionSupported() {
|
|
10
|
+
if (!isBrowser) return false;
|
|
11
|
+
return "onpagereveal" in window;
|
|
12
|
+
}
|
|
13
|
+
function startViewTransition(updateCallback, options = {}) {
|
|
14
|
+
if (!isBrowser) {
|
|
15
|
+
return createImmediateTransition(updateCallback);
|
|
16
|
+
}
|
|
17
|
+
if (options.skipTransition) {
|
|
18
|
+
return createImmediateTransition(updateCallback);
|
|
19
|
+
}
|
|
20
|
+
if (isViewTransitionSupported()) {
|
|
21
|
+
return createNativeTransition(updateCallback, options);
|
|
22
|
+
}
|
|
23
|
+
return createFallbackTransition(updateCallback, options);
|
|
24
|
+
}
|
|
25
|
+
function createNativeTransition(updateCallback, options) {
|
|
26
|
+
if (options.name) {
|
|
27
|
+
document.documentElement.style.setProperty(
|
|
28
|
+
"view-transition-name",
|
|
29
|
+
options.name
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
const typesAttr = options.types?.join(" ");
|
|
33
|
+
if (typesAttr) {
|
|
34
|
+
document.documentElement.setAttribute("data-transition-types", typesAttr);
|
|
35
|
+
}
|
|
36
|
+
const nativeTransition = document.startViewTransition(async () => {
|
|
37
|
+
if (options.classes?.old) {
|
|
38
|
+
document.documentElement.classList.add(options.classes.old);
|
|
39
|
+
}
|
|
40
|
+
await updateCallback();
|
|
41
|
+
if (options.classes?.new) {
|
|
42
|
+
document.documentElement.classList.add(options.classes.new);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
nativeTransition.finished.finally(() => {
|
|
46
|
+
if (options.classes?.old) {
|
|
47
|
+
document.documentElement.classList.remove(options.classes.old);
|
|
48
|
+
}
|
|
49
|
+
if (options.classes?.new) {
|
|
50
|
+
document.documentElement.classList.remove(options.classes.new);
|
|
51
|
+
}
|
|
52
|
+
if (options.name) {
|
|
53
|
+
document.documentElement.style.removeProperty("view-transition-name");
|
|
54
|
+
}
|
|
55
|
+
if (typesAttr) {
|
|
56
|
+
document.documentElement.removeAttribute("data-transition-types");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
ready: nativeTransition.ready,
|
|
61
|
+
finished: nativeTransition.finished,
|
|
62
|
+
updateCallbackDone: nativeTransition.updateCallbackDone,
|
|
63
|
+
skipTransition: () => nativeTransition.skipTransition(),
|
|
64
|
+
isNative: true
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function createFallbackTransition(updateCallback, options) {
|
|
68
|
+
let skipRequested = false;
|
|
69
|
+
const execute = async () => {
|
|
70
|
+
const container = document.documentElement;
|
|
71
|
+
container.classList.add("flight-transition-leaving");
|
|
72
|
+
if (options.classes?.old) {
|
|
73
|
+
container.classList.add(options.classes.old);
|
|
74
|
+
}
|
|
75
|
+
if (!skipRequested) {
|
|
76
|
+
await waitForTransition(container);
|
|
77
|
+
}
|
|
78
|
+
await updateCallback();
|
|
79
|
+
container.classList.remove("flight-transition-leaving");
|
|
80
|
+
if (options.classes?.old) {
|
|
81
|
+
container.classList.remove(options.classes.old);
|
|
82
|
+
}
|
|
83
|
+
container.classList.add("flight-transition-entering");
|
|
84
|
+
if (options.classes?.new) {
|
|
85
|
+
container.classList.add(options.classes.new);
|
|
86
|
+
}
|
|
87
|
+
if (!skipRequested) {
|
|
88
|
+
await waitForTransition(container);
|
|
89
|
+
}
|
|
90
|
+
container.classList.remove("flight-transition-entering");
|
|
91
|
+
if (options.classes?.new) {
|
|
92
|
+
container.classList.remove(options.classes.new);
|
|
93
|
+
}
|
|
94
|
+
return { ready: true, finished: true };
|
|
95
|
+
};
|
|
96
|
+
let readyResolve;
|
|
97
|
+
let finishedResolve;
|
|
98
|
+
let updateDoneResolve;
|
|
99
|
+
const ready = new Promise((resolve) => {
|
|
100
|
+
readyResolve = resolve;
|
|
101
|
+
});
|
|
102
|
+
const finished = new Promise((resolve) => {
|
|
103
|
+
finishedResolve = resolve;
|
|
104
|
+
});
|
|
105
|
+
const updateCallbackDone = new Promise((resolve) => {
|
|
106
|
+
updateDoneResolve = resolve;
|
|
107
|
+
});
|
|
108
|
+
queueMicrotask(async () => {
|
|
109
|
+
try {
|
|
110
|
+
readyResolve();
|
|
111
|
+
await execute();
|
|
112
|
+
updateDoneResolve();
|
|
113
|
+
finishedResolve();
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error("[Flight Transitions] Fallback transition error:", error);
|
|
116
|
+
finishedResolve();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
ready,
|
|
121
|
+
finished,
|
|
122
|
+
updateCallbackDone,
|
|
123
|
+
skipTransition: () => {
|
|
124
|
+
skipRequested = true;
|
|
125
|
+
},
|
|
126
|
+
isNative: false
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function waitForTransition(element, _phase) {
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
const styles = getComputedStyle(element);
|
|
132
|
+
const duration = parseFloat(styles.transitionDuration) || 0;
|
|
133
|
+
const delay = parseFloat(styles.transitionDelay) || 0;
|
|
134
|
+
const totalTime = (duration + delay) * 1e3;
|
|
135
|
+
if (totalTime <= 0) {
|
|
136
|
+
resolve();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let resolved = false;
|
|
140
|
+
const onEnd = () => {
|
|
141
|
+
if (resolved) return;
|
|
142
|
+
resolved = true;
|
|
143
|
+
element.removeEventListener("transitionend", onEnd);
|
|
144
|
+
resolve();
|
|
145
|
+
};
|
|
146
|
+
element.addEventListener("transitionend", onEnd, { once: true });
|
|
147
|
+
setTimeout(onEnd, totalTime + 50);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function createImmediateTransition(updateCallback) {
|
|
151
|
+
const updateCallbackDone = (async () => {
|
|
152
|
+
await updateCallback();
|
|
153
|
+
})();
|
|
154
|
+
return {
|
|
155
|
+
ready: Promise.resolve(),
|
|
156
|
+
finished: updateCallbackDone.then(() => {
|
|
157
|
+
}),
|
|
158
|
+
updateCallbackDone,
|
|
159
|
+
skipTransition: () => {
|
|
160
|
+
},
|
|
161
|
+
isNative: false
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function enableCrossDocumentTransitions(options = {}) {
|
|
165
|
+
if (!isBrowser || !isCrossDocumentTransitionSupported()) {
|
|
166
|
+
return () => {
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const { enabled = true, types = [] } = options;
|
|
170
|
+
if (!enabled) {
|
|
171
|
+
return () => {
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const styleId = "flight-cross-document-transitions";
|
|
175
|
+
let style = document.getElementById(styleId);
|
|
176
|
+
if (!style) {
|
|
177
|
+
style = document.createElement("style");
|
|
178
|
+
style.id = styleId;
|
|
179
|
+
style.textContent = `
|
|
180
|
+
@view-transition {
|
|
181
|
+
navigation: auto;
|
|
182
|
+
}
|
|
183
|
+
`;
|
|
184
|
+
document.head.appendChild(style);
|
|
185
|
+
}
|
|
186
|
+
const handlePageReveal = (event) => {
|
|
187
|
+
const pageRevealEvent = event;
|
|
188
|
+
const viewTransition = pageRevealEvent.viewTransition;
|
|
189
|
+
if (viewTransition && types.length > 0) {
|
|
190
|
+
document.documentElement.setAttribute(
|
|
191
|
+
"data-transition-types",
|
|
192
|
+
types.join(" ")
|
|
193
|
+
);
|
|
194
|
+
viewTransition.finished.then(() => {
|
|
195
|
+
document.documentElement.removeAttribute("data-transition-types");
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
const handlePageSwap = (event) => {
|
|
200
|
+
const pageSwapEvent = event;
|
|
201
|
+
const viewTransition = pageSwapEvent.viewTransition;
|
|
202
|
+
if (viewTransition && types.length > 0) {
|
|
203
|
+
document.documentElement.setAttribute(
|
|
204
|
+
"data-transition-types",
|
|
205
|
+
types.join(" ")
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
window.addEventListener("pagereveal", handlePageReveal);
|
|
210
|
+
window.addEventListener("pageswap", handlePageSwap);
|
|
211
|
+
return () => {
|
|
212
|
+
window.removeEventListener("pagereveal", handlePageReveal);
|
|
213
|
+
window.removeEventListener("pageswap", handlePageSwap);
|
|
214
|
+
style?.remove();
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// src/core/transition-manager.ts
|
|
219
|
+
function createTransitionManager(initialConfig = {}) {
|
|
220
|
+
let config = normalizeConfig(initialConfig);
|
|
221
|
+
let state = createInitialState();
|
|
222
|
+
let listeners = /* @__PURE__ */ new Set();
|
|
223
|
+
let reducedMotionCleanup = null;
|
|
224
|
+
let shouldReduceMotion = false;
|
|
225
|
+
if (typeof window !== "undefined") {
|
|
226
|
+
shouldReduceMotion = prefersReducedMotion();
|
|
227
|
+
reducedMotionCleanup = onReducedMotionChange((prefersReduced) => {
|
|
228
|
+
shouldReduceMotion = prefersReduced;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
function createInitialState() {
|
|
232
|
+
return {
|
|
233
|
+
isTransitioning: false,
|
|
234
|
+
direction: "forward",
|
|
235
|
+
phase: "idle",
|
|
236
|
+
currentTransition: null,
|
|
237
|
+
fromPath: null,
|
|
238
|
+
toPath: null
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function setState(partial) {
|
|
242
|
+
state = { ...state, ...partial };
|
|
243
|
+
notifyListeners();
|
|
244
|
+
}
|
|
245
|
+
function notifyListeners() {
|
|
246
|
+
listeners.forEach((listener) => {
|
|
247
|
+
try {
|
|
248
|
+
listener(state);
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error("[Flight Transitions] Listener error:", error);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function normalizeConfig(input) {
|
|
255
|
+
return {
|
|
256
|
+
enabled: input.enabled ?? true,
|
|
257
|
+
viewTransitions: input.viewTransitions ?? true,
|
|
258
|
+
pageTransition: input.pageTransition ?? "fade",
|
|
259
|
+
layoutTransition: input.layoutTransition ?? false,
|
|
260
|
+
duration: input.duration ?? DEFAULT_DURATION,
|
|
261
|
+
easing: input.easing ?? DEFAULT_EASING,
|
|
262
|
+
reduceMotion: input.reduceMotion ?? "respect-system",
|
|
263
|
+
crossDocument: input.crossDocument ?? false
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function shouldApplyReducedMotion() {
|
|
267
|
+
switch (config.reduceMotion) {
|
|
268
|
+
case "always-reduce":
|
|
269
|
+
return true;
|
|
270
|
+
case "ignore":
|
|
271
|
+
return false;
|
|
272
|
+
case "respect-system":
|
|
273
|
+
default:
|
|
274
|
+
return shouldReduceMotion;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async function startPageTransition(to, pageConfig) {
|
|
278
|
+
if (!config.enabled) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (state.isTransitioning) {
|
|
282
|
+
console.warn("[Flight Transitions] Transition already in progress");
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const from = state.toPath ?? getCurrentPath();
|
|
286
|
+
const direction = determineDirection(from, to);
|
|
287
|
+
const transitionInput = getTransitionForNavigation(
|
|
288
|
+
direction,
|
|
289
|
+
pageConfig
|
|
290
|
+
);
|
|
291
|
+
const transition = resolveTransition(
|
|
292
|
+
transitionInput,
|
|
293
|
+
shouldApplyReducedMotion()
|
|
294
|
+
);
|
|
295
|
+
if (!transition) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const context = {
|
|
299
|
+
from,
|
|
300
|
+
to,
|
|
301
|
+
direction,
|
|
302
|
+
transition,
|
|
303
|
+
startTime: performance.now()
|
|
304
|
+
};
|
|
305
|
+
pageConfig?.onStart?.(context);
|
|
306
|
+
setState({
|
|
307
|
+
isTransitioning: true,
|
|
308
|
+
direction,
|
|
309
|
+
phase: "leaving",
|
|
310
|
+
currentTransition: transition,
|
|
311
|
+
fromPath: from,
|
|
312
|
+
toPath: to
|
|
313
|
+
});
|
|
314
|
+
try {
|
|
315
|
+
if (config.viewTransitions && isViewTransitionSupported()) {
|
|
316
|
+
await executeWithViewTransition(transition);
|
|
317
|
+
} else {
|
|
318
|
+
await executeWithFallback(transition);
|
|
319
|
+
}
|
|
320
|
+
} finally {
|
|
321
|
+
setState({
|
|
322
|
+
isTransitioning: false,
|
|
323
|
+
phase: "idle",
|
|
324
|
+
currentTransition: null
|
|
325
|
+
});
|
|
326
|
+
pageConfig?.onComplete?.(context);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function getTransitionForNavigation(direction, pageConfig) {
|
|
330
|
+
if (pageConfig) {
|
|
331
|
+
if (direction === "back" && pageConfig.backTransition !== void 0) {
|
|
332
|
+
return pageConfig.backTransition;
|
|
333
|
+
}
|
|
334
|
+
if (pageConfig.default !== void 0) {
|
|
335
|
+
return pageConfig.default;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return config.pageTransition ?? "fade";
|
|
339
|
+
}
|
|
340
|
+
function determineDirection(from, to) {
|
|
341
|
+
if (from.length > to.length && to !== "/") {
|
|
342
|
+
return "back";
|
|
343
|
+
}
|
|
344
|
+
return "forward";
|
|
345
|
+
}
|
|
346
|
+
function getCurrentPath() {
|
|
347
|
+
if (typeof window === "undefined") return "/";
|
|
348
|
+
return window.location.pathname;
|
|
349
|
+
}
|
|
350
|
+
async function executeWithViewTransition(transition) {
|
|
351
|
+
return new Promise((resolve) => {
|
|
352
|
+
const viewTransition = startViewTransition(
|
|
353
|
+
() => {
|
|
354
|
+
setState({ phase: "entering" });
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
name: transition.name,
|
|
358
|
+
classes: {
|
|
359
|
+
old: `flight-transition-${transition.name}-leave`,
|
|
360
|
+
new: `flight-transition-${transition.name}-enter`
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
);
|
|
364
|
+
viewTransition.finished.then(() => {
|
|
365
|
+
setState({ phase: "complete" });
|
|
366
|
+
resolve();
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
async function executeWithFallback(transition) {
|
|
371
|
+
const leaveDuration = transition.leave.options.duration || 150;
|
|
372
|
+
const enterDuration = transition.enter.options.duration || 150;
|
|
373
|
+
await wait(leaveDuration);
|
|
374
|
+
setState({ phase: "entering" });
|
|
375
|
+
await wait(enterDuration);
|
|
376
|
+
setState({ phase: "complete" });
|
|
377
|
+
}
|
|
378
|
+
const manager = {
|
|
379
|
+
getState() {
|
|
380
|
+
return { ...state };
|
|
381
|
+
},
|
|
382
|
+
getConfig() {
|
|
383
|
+
return { ...config };
|
|
384
|
+
},
|
|
385
|
+
configure(newConfig) {
|
|
386
|
+
config = normalizeConfig({ ...config, ...newConfig });
|
|
387
|
+
},
|
|
388
|
+
subscribe(listener) {
|
|
389
|
+
listeners.add(listener);
|
|
390
|
+
return () => {
|
|
391
|
+
listeners.delete(listener);
|
|
392
|
+
};
|
|
393
|
+
},
|
|
394
|
+
startPageTransition,
|
|
395
|
+
skipTransition() {
|
|
396
|
+
if (state.isTransitioning) {
|
|
397
|
+
setState({
|
|
398
|
+
isTransitioning: false,
|
|
399
|
+
phase: "idle",
|
|
400
|
+
currentTransition: null
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
isEnabled() {
|
|
405
|
+
return config.enabled ?? false;
|
|
406
|
+
},
|
|
407
|
+
isViewTransitionSupported() {
|
|
408
|
+
return isViewTransitionSupported();
|
|
409
|
+
},
|
|
410
|
+
setDirection(direction) {
|
|
411
|
+
setState({ direction });
|
|
412
|
+
},
|
|
413
|
+
destroy() {
|
|
414
|
+
listeners.clear();
|
|
415
|
+
reducedMotionCleanup?.();
|
|
416
|
+
state = createInitialState();
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
return manager;
|
|
420
|
+
}
|
|
421
|
+
var globalManager = null;
|
|
422
|
+
function getTransitionManager() {
|
|
423
|
+
if (!globalManager) {
|
|
424
|
+
globalManager = createTransitionManager();
|
|
425
|
+
}
|
|
426
|
+
return globalManager;
|
|
427
|
+
}
|
|
428
|
+
function initTransitions(config) {
|
|
429
|
+
if (globalManager) {
|
|
430
|
+
globalManager.configure(config);
|
|
431
|
+
} else {
|
|
432
|
+
globalManager = createTransitionManager(config);
|
|
433
|
+
}
|
|
434
|
+
return globalManager;
|
|
435
|
+
}
|
|
436
|
+
function wait(ms) {
|
|
437
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
export { createTransitionManager, enableCrossDocumentTransitions, getTransitionManager, initTransitions, isCrossDocumentTransitionSupported, isViewTransitionSupported, startViewTransition };
|
|
441
|
+
//# sourceMappingURL=chunk-7R3FXL3A.js.map
|
|
442
|
+
//# sourceMappingURL=chunk-7R3FXL3A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/view-transition.ts","../src/core/transition-manager.ts"],"names":[],"mappings":"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","file":"chunk-7R3FXL3A.js","sourcesContent":["/**\r\n * @flight-framework/transitions - View Transition API Wrapper\r\n * \r\n * Provides a cross-browser wrapper for the View Transitions API with\r\n * automatic fallback for unsupported browsers.\r\n * \r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\r\n */\r\n\r\nimport type {\r\n ViewTransition,\r\n ViewTransitionOptions,\r\n ViewTransitionResult,\r\n} from './types';\r\n\r\n// =============================================================================\r\n// BROWSER DETECTION\r\n// =============================================================================\r\n\r\n/** Check if code is running in browser environment */\r\nconst isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\r\n\r\n/**\r\n * Check if the browser supports the View Transitions API\r\n * @returns true if startViewTransition is available\r\n */\r\nexport function isViewTransitionSupported(): boolean {\r\n if (!isBrowser) return false;\r\n return 'startViewTransition' in document &&\r\n typeof document.startViewTransition === 'function';\r\n}\r\n\r\n/**\r\n * Check if cross-document view transitions are supported\r\n * @returns true if @view-transition CSS at-rule is supported\r\n */\r\nexport function isCrossDocumentTransitionSupported(): boolean {\r\n if (!isBrowser) return false;\r\n // Check for pagereveal event support (indicates cross-document support)\r\n return 'onpagereveal' in window;\r\n}\r\n\r\n// =============================================================================\r\n// VIEW TRANSITION WRAPPER\r\n// =============================================================================\r\n\r\n/**\r\n * Start a view transition with automatic fallback\r\n * \r\n * Uses the native View Transitions API when available, otherwise\r\n * provides a compatible fallback that executes the callback immediately.\r\n * \r\n * @example\r\n * ```typescript\r\n * const transition = startViewTransition(() => {\r\n * // Update the DOM\r\n * document.getElementById('content').innerHTML = newContent;\r\n * });\r\n * \r\n * // Wait for animation to be ready\r\n * await transition.ready;\r\n * \r\n * // Wait for animation to complete\r\n * await transition.finished;\r\n * ```\r\n */\r\nexport function startViewTransition(\r\n updateCallback: () => void | Promise<void>,\r\n options: ViewTransitionOptions = {}\r\n): ViewTransitionResult {\r\n // Server-side rendering: return immediate resolution\r\n if (!isBrowser) {\r\n return createImmediateTransition(updateCallback);\r\n }\r\n\r\n // Skip transition if explicitly requested\r\n if (options.skipTransition) {\r\n return createImmediateTransition(updateCallback);\r\n }\r\n\r\n // Use native API if supported\r\n if (isViewTransitionSupported()) {\r\n return createNativeTransition(updateCallback, options);\r\n }\r\n\r\n // Fallback for unsupported browsers\r\n return createFallbackTransition(updateCallback, options);\r\n}\r\n\r\n// =============================================================================\r\n// NATIVE IMPLEMENTATION\r\n// =============================================================================\r\n\r\n/**\r\n * Create a transition using the native View Transitions API\r\n */\r\nfunction createNativeTransition(\r\n updateCallback: () => void | Promise<void>,\r\n options: ViewTransitionOptions\r\n): ViewTransitionResult {\r\n // Set view-transition-name if provided\r\n if (options.name) {\r\n document.documentElement.style.setProperty(\r\n 'view-transition-name',\r\n options.name\r\n );\r\n }\r\n\r\n // Set transition types if provided (for @starting-style support)\r\n const typesAttr = options.types?.join(' ');\r\n if (typesAttr) {\r\n document.documentElement.setAttribute('data-transition-types', typesAttr);\r\n }\r\n\r\n // Start the native transition\r\n const nativeTransition = document.startViewTransition!(async () => {\r\n // Apply old phase class\r\n if (options.classes?.old) {\r\n document.documentElement.classList.add(options.classes.old);\r\n }\r\n\r\n // Execute the DOM update\r\n await updateCallback();\r\n\r\n // Apply new phase class\r\n if (options.classes?.new) {\r\n document.documentElement.classList.add(options.classes.new);\r\n }\r\n }) as ViewTransition;\r\n\r\n // Clean up after transition\r\n nativeTransition.finished.finally(() => {\r\n // Remove custom classes\r\n if (options.classes?.old) {\r\n document.documentElement.classList.remove(options.classes.old);\r\n }\r\n if (options.classes?.new) {\r\n document.documentElement.classList.remove(options.classes.new);\r\n }\r\n // Remove transition name\r\n if (options.name) {\r\n document.documentElement.style.removeProperty('view-transition-name');\r\n }\r\n // Remove types\r\n if (typesAttr) {\r\n document.documentElement.removeAttribute('data-transition-types');\r\n }\r\n });\r\n\r\n return {\r\n ready: nativeTransition.ready,\r\n finished: nativeTransition.finished,\r\n updateCallbackDone: nativeTransition.updateCallbackDone,\r\n skipTransition: () => nativeTransition.skipTransition(),\r\n isNative: true,\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// FALLBACK IMPLEMENTATION\r\n// =============================================================================\r\n\r\n/**\r\n * Create a fallback transition for browsers without View Transitions API\r\n * Uses CSS transitions with class-based animation\r\n */\r\nfunction createFallbackTransition(\r\n updateCallback: () => void | Promise<void>,\r\n options: ViewTransitionOptions\r\n): ViewTransitionResult {\r\n let skipRequested = false;\r\n\r\n const execute = async (): Promise<{ ready: boolean; finished: boolean }> => {\r\n const container = document.documentElement;\r\n\r\n // Add leaving class for CSS transition\r\n container.classList.add('flight-transition-leaving');\r\n if (options.classes?.old) {\r\n container.classList.add(options.classes.old);\r\n }\r\n\r\n // Wait for leave animation (or skip if requested)\r\n if (!skipRequested) {\r\n await waitForTransition(container, 'leave');\r\n }\r\n\r\n // Execute the DOM update\r\n await updateCallback();\r\n\r\n // Switch to entering phase\r\n container.classList.remove('flight-transition-leaving');\r\n if (options.classes?.old) {\r\n container.classList.remove(options.classes.old);\r\n }\r\n container.classList.add('flight-transition-entering');\r\n if (options.classes?.new) {\r\n container.classList.add(options.classes.new);\r\n }\r\n\r\n // Wait for enter animation (or skip if requested)\r\n if (!skipRequested) {\r\n await waitForTransition(container, 'enter');\r\n }\r\n\r\n // Clean up\r\n container.classList.remove('flight-transition-entering');\r\n if (options.classes?.new) {\r\n container.classList.remove(options.classes.new);\r\n }\r\n\r\n return { ready: true, finished: true };\r\n };\r\n\r\n // Track promises\r\n let readyResolve: () => void;\r\n let finishedResolve: () => void;\r\n let updateDoneResolve: () => void;\r\n\r\n const ready = new Promise<void>((resolve) => { readyResolve = resolve; });\r\n const finished = new Promise<void>((resolve) => { finishedResolve = resolve; });\r\n const updateCallbackDone = new Promise<void>((resolve) => { updateDoneResolve = resolve; });\r\n\r\n // Execute asynchronously\r\n queueMicrotask(async () => {\r\n try {\r\n readyResolve!();\r\n await execute();\r\n updateDoneResolve!();\r\n finishedResolve!();\r\n } catch (error) {\r\n console.error('[Flight Transitions] Fallback transition error:', error);\r\n finishedResolve!();\r\n }\r\n });\r\n\r\n return {\r\n ready,\r\n finished,\r\n updateCallbackDone,\r\n skipTransition: () => { skipRequested = true; },\r\n isNative: false,\r\n };\r\n}\r\n\r\n/**\r\n * Wait for CSS transition to complete on an element\r\n */\r\nfunction waitForTransition(\r\n element: HTMLElement,\r\n _phase: 'leave' | 'enter'\r\n): Promise<void> {\r\n return new Promise((resolve) => {\r\n // Get computed transition duration\r\n const styles = getComputedStyle(element);\r\n const duration = parseFloat(styles.transitionDuration) || 0;\r\n const delay = parseFloat(styles.transitionDelay) || 0;\r\n const totalTime = (duration + delay) * 1000;\r\n\r\n if (totalTime <= 0) {\r\n resolve();\r\n return;\r\n }\r\n\r\n // Use transitionend event with timeout fallback\r\n let resolved = false;\r\n\r\n const onEnd = () => {\r\n if (resolved) return;\r\n resolved = true;\r\n element.removeEventListener('transitionend', onEnd);\r\n resolve();\r\n };\r\n\r\n element.addEventListener('transitionend', onEnd, { once: true });\r\n\r\n // Fallback timeout (add 50ms buffer)\r\n setTimeout(onEnd, totalTime + 50);\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// IMMEDIATE TRANSITION (SSR/Skip)\r\n// =============================================================================\r\n\r\n/**\r\n * Create an immediate transition (no animation)\r\n * Used for SSR or when transitions are skipped\r\n */\r\nfunction createImmediateTransition(\r\n updateCallback: () => void | Promise<void>\r\n): ViewTransitionResult {\r\n let updateDone = false;\r\n\r\n const updateCallbackDone = (async () => {\r\n await updateCallback();\r\n updateDone = true;\r\n })();\r\n\r\n return {\r\n ready: Promise.resolve(),\r\n finished: updateCallbackDone.then(() => { }),\r\n updateCallbackDone,\r\n skipTransition: () => { },\r\n isNative: false,\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// CROSS-DOCUMENT TRANSITIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Options for cross-document (MPA) transitions\r\n */\r\nexport interface CrossDocumentTransitionOptions {\r\n /** Enable transitions for same-origin navigations */\r\n enabled?: boolean;\r\n /** Types to apply to the transition */\r\n types?: string[];\r\n}\r\n\r\n/**\r\n * Enable cross-document view transitions for MPA navigations\r\n * \r\n * This injects the necessary CSS and sets up event listeners for\r\n * pagereveal and pageswap events.\r\n * \r\n * @example\r\n * ```typescript\r\n * enableCrossDocumentTransitions({\r\n * enabled: true,\r\n * types: ['slide-left']\r\n * });\r\n * ```\r\n */\r\nexport function enableCrossDocumentTransitions(\r\n options: CrossDocumentTransitionOptions = {}\r\n): () => void {\r\n if (!isBrowser || !isCrossDocumentTransitionSupported()) {\r\n return () => { };\r\n }\r\n\r\n const { enabled = true, types = [] } = options;\r\n\r\n if (!enabled) {\r\n return () => { };\r\n }\r\n\r\n // Inject @view-transition CSS rule\r\n const styleId = 'flight-cross-document-transitions';\r\n let style = document.getElementById(styleId) as HTMLStyleElement | null;\r\n\r\n if (!style) {\r\n style = document.createElement('style');\r\n style.id = styleId;\r\n style.textContent = `\r\n @view-transition {\r\n navigation: auto;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n\r\n // Handle page reveal (incoming page)\r\n const handlePageReveal = (event: Event) => {\r\n const pageRevealEvent = event as PageRevealEvent;\r\n const viewTransition = pageRevealEvent.viewTransition;\r\n\r\n if (viewTransition && types.length > 0) {\r\n // Apply transition types\r\n document.documentElement.setAttribute(\r\n 'data-transition-types',\r\n types.join(' ')\r\n );\r\n\r\n viewTransition.finished.then(() => {\r\n document.documentElement.removeAttribute('data-transition-types');\r\n });\r\n }\r\n };\r\n\r\n // Handle page swap (outgoing page)\r\n const handlePageSwap = (event: Event) => {\r\n const pageSwapEvent = event as PageSwapEvent;\r\n const viewTransition = pageSwapEvent.viewTransition;\r\n\r\n if (viewTransition && types.length > 0) {\r\n document.documentElement.setAttribute(\r\n 'data-transition-types',\r\n types.join(' ')\r\n );\r\n }\r\n };\r\n\r\n window.addEventListener('pagereveal', handlePageReveal);\r\n window.addEventListener('pageswap', handlePageSwap);\r\n\r\n // Return cleanup function\r\n return () => {\r\n window.removeEventListener('pagereveal', handlePageReveal);\r\n window.removeEventListener('pageswap', handlePageSwap);\r\n style?.remove();\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// TYPE DECLARATIONS FOR BROWSER EVENTS\r\n// =============================================================================\r\n\r\ninterface PageRevealEvent extends Event {\r\n readonly viewTransition: ViewTransition | null;\r\n}\r\n\r\ninterface PageSwapEvent extends Event {\r\n readonly viewTransition: ViewTransition | null;\r\n readonly activation: NavigationActivation | null;\r\n}\r\n\r\ninterface NavigationActivation {\r\n readonly entry: NavigationHistoryEntry;\r\n readonly from: NavigationHistoryEntry | null;\r\n readonly navigationType: NavigationHistoryEntryType;\r\n}\r\n\r\ninterface NavigationHistoryEntry {\r\n readonly id: string;\r\n readonly index: number;\r\n readonly key: string;\r\n readonly sameDocument: boolean;\r\n readonly url: string | null;\r\n}\r\n\r\ntype NavigationHistoryEntryType = 'push' | 'replace' | 'reload' | 'traverse';\r\n\r\n// Extend Document interface for startViewTransition\r\ndeclare global {\r\n interface Document {\r\n startViewTransition(callback: () => void | Promise<void>): ViewTransition;\r\n }\r\n\r\n interface WindowEventMap {\r\n pagereveal: PageRevealEvent;\r\n pageswap: PageSwapEvent;\r\n }\r\n}\r\n\r\nexport { };\r\n","/**\r\n * @flight-framework/transitions - Transition Manager\r\n * \r\n * Central orchestrator for all transition operations.\r\n * Manages state, configuration, and coordinates between different\r\n * transition types (page, layout, component).\r\n */\r\n\r\nimport type {\r\n TransitionsConfig,\r\n TransitionState,\r\n TransitionListener,\r\n ResolvedTransition,\r\n TransitionDirection,\r\n TransitionContext,\r\n PageTransitionConfig,\r\n ReduceMotionBehavior,\r\n TransitionPreset,\r\n CustomTransition,\r\n} from './types';\r\nimport {\r\n startViewTransition,\r\n isViewTransitionSupported,\r\n} from './view-transition';\r\nimport {\r\n resolveTransition,\r\n prefersReducedMotion,\r\n onReducedMotionChange,\r\n DEFAULT_DURATION,\r\n DEFAULT_EASING,\r\n} from './animation-engine';\r\n\r\n// =============================================================================\r\n// TRANSITION MANAGER\r\n// =============================================================================\r\n\r\n/**\r\n * Create a new transition manager instance\r\n * \r\n * @example\r\n * ```typescript\r\n * const manager = createTransitionManager({\r\n * pageTransition: 'fade',\r\n * duration: 200,\r\n * });\r\n * \r\n * // Subscribe to state changes\r\n * manager.subscribe((state) => {\r\n * console.log('Transition state:', state);\r\n * });\r\n * \r\n * // Start a transition\r\n * await manager.startPageTransition('/new-page');\r\n * ```\r\n */\r\nexport function createTransitionManager(\r\n initialConfig: TransitionsConfig = {}\r\n): TransitionManager {\r\n // Internal state\r\n let config: TransitionsConfig = normalizeConfig(initialConfig);\r\n let state: TransitionState = createInitialState();\r\n let listeners: Set<TransitionListener> = new Set();\r\n let reducedMotionCleanup: (() => void) | null = null;\r\n let shouldReduceMotion = false;\r\n\r\n // Initialize reduced motion detection\r\n if (typeof window !== 'undefined') {\r\n shouldReduceMotion = prefersReducedMotion();\r\n reducedMotionCleanup = onReducedMotionChange((prefersReduced) => {\r\n shouldReduceMotion = prefersReduced;\r\n });\r\n }\r\n\r\n // ==========================================================================\r\n // STATE MANAGEMENT\r\n // ==========================================================================\r\n\r\n function createInitialState(): TransitionState {\r\n return {\r\n isTransitioning: false,\r\n direction: 'forward',\r\n phase: 'idle',\r\n currentTransition: null,\r\n fromPath: null,\r\n toPath: null,\r\n };\r\n }\r\n\r\n function setState(partial: Partial<TransitionState>): void {\r\n state = { ...state, ...partial };\r\n notifyListeners();\r\n }\r\n\r\n function notifyListeners(): void {\r\n listeners.forEach((listener) => {\r\n try {\r\n listener(state);\r\n } catch (error) {\r\n console.error('[Flight Transitions] Listener error:', error);\r\n }\r\n });\r\n }\r\n\r\n // ==========================================================================\r\n // CONFIGURATION\r\n // ==========================================================================\r\n\r\n function normalizeConfig(input: TransitionsConfig): TransitionsConfig {\r\n return {\r\n enabled: input.enabled ?? true,\r\n viewTransitions: input.viewTransitions ?? true,\r\n pageTransition: input.pageTransition ?? 'fade',\r\n layoutTransition: input.layoutTransition ?? false,\r\n duration: input.duration ?? DEFAULT_DURATION,\r\n easing: input.easing ?? DEFAULT_EASING,\r\n reduceMotion: input.reduceMotion ?? 'respect-system',\r\n crossDocument: input.crossDocument ?? false,\r\n };\r\n }\r\n\r\n function shouldApplyReducedMotion(): boolean {\r\n switch (config.reduceMotion) {\r\n case 'always-reduce':\r\n return true;\r\n case 'ignore':\r\n return false;\r\n case 'respect-system':\r\n default:\r\n return shouldReduceMotion;\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // PAGE TRANSITIONS\r\n // ==========================================================================\r\n\r\n async function startPageTransition(\r\n to: string,\r\n pageConfig?: PageTransitionConfig\r\n ): Promise<void> {\r\n // Check if transitions are enabled\r\n if (!config.enabled) {\r\n return;\r\n }\r\n\r\n // Already transitioning - skip\r\n if (state.isTransitioning) {\r\n console.warn('[Flight Transitions] Transition already in progress');\r\n return;\r\n }\r\n\r\n const from = state.toPath ?? getCurrentPath();\r\n const direction = determineDirection(from, to);\r\n\r\n // Resolve the transition to use\r\n const transitionInput = getTransitionForNavigation(\r\n direction,\r\n pageConfig\r\n );\r\n\r\n const transition = resolveTransition(\r\n transitionInput,\r\n shouldApplyReducedMotion()\r\n );\r\n\r\n // If no transition resolved, just return\r\n if (!transition) {\r\n return;\r\n }\r\n\r\n // Create context for callbacks\r\n const context: TransitionContext = {\r\n from,\r\n to,\r\n direction,\r\n transition,\r\n startTime: performance.now(),\r\n };\r\n\r\n // Call onStart callback\r\n pageConfig?.onStart?.(context);\r\n\r\n // Update state to transitioning\r\n setState({\r\n isTransitioning: true,\r\n direction,\r\n phase: 'leaving',\r\n currentTransition: transition,\r\n fromPath: from,\r\n toPath: to,\r\n });\r\n\r\n try {\r\n // Use View Transitions API if enabled and supported\r\n if (config.viewTransitions && isViewTransitionSupported()) {\r\n await executeWithViewTransition(transition);\r\n } else {\r\n await executeWithFallback(transition);\r\n }\r\n } finally {\r\n // Update state to complete\r\n setState({\r\n isTransitioning: false,\r\n phase: 'idle',\r\n currentTransition: null,\r\n });\r\n\r\n // Call onComplete callback\r\n pageConfig?.onComplete?.(context);\r\n }\r\n }\r\n\r\n function getTransitionForNavigation(\r\n direction: TransitionDirection,\r\n pageConfig?: PageTransitionConfig\r\n ): TransitionPreset | CustomTransition | false {\r\n // Page-specific config takes priority\r\n if (pageConfig) {\r\n if (direction === 'back' && pageConfig.backTransition !== undefined) {\r\n return pageConfig.backTransition;\r\n }\r\n if (pageConfig.default !== undefined) {\r\n return pageConfig.default;\r\n }\r\n }\r\n\r\n // Fall back to global config\r\n return config.pageTransition ?? 'fade';\r\n }\r\n\r\n function determineDirection(from: string, to: string): TransitionDirection {\r\n // Simple heuristic: if going to a shorter path, it's likely \"back\"\r\n // This can be overridden by the navigation API\r\n if (from.length > to.length && to !== '/') {\r\n return 'back';\r\n }\r\n return 'forward';\r\n }\r\n\r\n function getCurrentPath(): string {\r\n if (typeof window === 'undefined') return '/';\r\n return window.location.pathname;\r\n }\r\n\r\n // ==========================================================================\r\n // TRANSITION EXECUTION\r\n // ==========================================================================\r\n\r\n async function executeWithViewTransition(\r\n transition: ResolvedTransition\r\n ): Promise<void> {\r\n return new Promise((resolve) => {\r\n const viewTransition = startViewTransition(\r\n () => {\r\n // DOM update happens here\r\n // This is called by the router when it updates the page\r\n setState({ phase: 'entering' });\r\n },\r\n {\r\n name: transition.name,\r\n classes: {\r\n old: `flight-transition-${transition.name}-leave`,\r\n new: `flight-transition-${transition.name}-enter`,\r\n },\r\n }\r\n );\r\n\r\n viewTransition.finished.then(() => {\r\n setState({ phase: 'complete' });\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n async function executeWithFallback(\r\n transition: ResolvedTransition\r\n ): Promise<void> {\r\n // For fallback, we just wait for the durations\r\n const leaveDuration = transition.leave.options.duration as number || 150;\r\n const enterDuration = transition.enter.options.duration as number || 150;\r\n\r\n // Leave phase\r\n await wait(leaveDuration);\r\n setState({ phase: 'entering' });\r\n\r\n // Enter phase\r\n await wait(enterDuration);\r\n setState({ phase: 'complete' });\r\n }\r\n\r\n // ==========================================================================\r\n // PUBLIC INTERFACE\r\n // ==========================================================================\r\n\r\n const manager: TransitionManager = {\r\n getState(): TransitionState {\r\n return { ...state };\r\n },\r\n\r\n getConfig(): TransitionsConfig {\r\n return { ...config };\r\n },\r\n\r\n configure(newConfig: TransitionsConfig): void {\r\n config = normalizeConfig({ ...config, ...newConfig });\r\n },\r\n\r\n subscribe(listener: TransitionListener): () => void {\r\n listeners.add(listener);\r\n return () => {\r\n listeners.delete(listener);\r\n };\r\n },\r\n\r\n startPageTransition,\r\n\r\n skipTransition(): void {\r\n if (state.isTransitioning) {\r\n setState({\r\n isTransitioning: false,\r\n phase: 'idle',\r\n currentTransition: null,\r\n });\r\n }\r\n },\r\n\r\n isEnabled(): boolean {\r\n return config.enabled ?? false;\r\n },\r\n\r\n isViewTransitionSupported(): boolean {\r\n return isViewTransitionSupported();\r\n },\r\n\r\n setDirection(direction: TransitionDirection): void {\r\n setState({ direction });\r\n },\r\n\r\n destroy(): void {\r\n listeners.clear();\r\n reducedMotionCleanup?.();\r\n state = createInitialState();\r\n },\r\n };\r\n\r\n return manager;\r\n}\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\nexport interface TransitionManager {\r\n /** Get current transition state (readonly copy) */\r\n getState(): TransitionState;\r\n /** Get current configuration (readonly copy) */\r\n getConfig(): TransitionsConfig;\r\n /** Update configuration */\r\n configure(config: TransitionsConfig): void;\r\n /** Subscribe to state changes, returns unsubscribe function */\r\n subscribe(listener: TransitionListener): () => void;\r\n /** Start a page transition */\r\n startPageTransition(to: string, config?: PageTransitionConfig): Promise<void>;\r\n /** Skip the current transition immediately */\r\n skipTransition(): void;\r\n /** Check if transitions are enabled */\r\n isEnabled(): boolean;\r\n /** Check if View Transitions API is supported */\r\n isViewTransitionSupported(): boolean;\r\n /** Set the navigation direction */\r\n setDirection(direction: TransitionDirection): void;\r\n /** Clean up resources */\r\n destroy(): void;\r\n}\r\n\r\n// =============================================================================\r\n// SINGLETON INSTANCE\r\n// =============================================================================\r\n\r\nlet globalManager: TransitionManager | null = null;\r\n\r\n/**\r\n * Get or create the global transition manager instance\r\n */\r\nexport function getTransitionManager(): TransitionManager {\r\n if (!globalManager) {\r\n globalManager = createTransitionManager();\r\n }\r\n return globalManager;\r\n}\r\n\r\n/**\r\n * Initialize the global transition manager with configuration\r\n */\r\nexport function initTransitions(config: TransitionsConfig): TransitionManager {\r\n if (globalManager) {\r\n globalManager.configure(config);\r\n } else {\r\n globalManager = createTransitionManager(config);\r\n }\r\n return globalManager;\r\n}\r\n\r\n// =============================================================================\r\n// UTILITIES\r\n// =============================================================================\r\n\r\nfunction wait(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n"]}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { flip } from './chunk-4SF4GHDQ.js';
|
|
2
|
+
|
|
3
|
+
// src/layout/layout-transition.ts
|
|
4
|
+
var layoutTransitionConfigs = /* @__PURE__ */ new Map();
|
|
5
|
+
function defineLayoutTransition(layoutId, config) {
|
|
6
|
+
layoutTransitionConfigs.set(layoutId, config);
|
|
7
|
+
}
|
|
8
|
+
function getLayoutTransition(layoutId) {
|
|
9
|
+
return layoutTransitionConfigs.get(layoutId);
|
|
10
|
+
}
|
|
11
|
+
function clearLayoutTransitions() {
|
|
12
|
+
layoutTransitionConfigs.clear();
|
|
13
|
+
}
|
|
14
|
+
var sharedElementRegistry = /* @__PURE__ */ new Map();
|
|
15
|
+
function registerSharedElement(name, element) {
|
|
16
|
+
sharedElementRegistry.set(name, element);
|
|
17
|
+
element.style.viewTransitionName = name;
|
|
18
|
+
}
|
|
19
|
+
function unregisterSharedElement(name) {
|
|
20
|
+
const element = sharedElementRegistry.get(name);
|
|
21
|
+
if (element) {
|
|
22
|
+
element.style.viewTransitionName = "";
|
|
23
|
+
}
|
|
24
|
+
sharedElementRegistry.delete(name);
|
|
25
|
+
}
|
|
26
|
+
function getSharedElement(name) {
|
|
27
|
+
return sharedElementRegistry.get(name);
|
|
28
|
+
}
|
|
29
|
+
function clearSharedElements() {
|
|
30
|
+
sharedElementRegistry.forEach((element) => {
|
|
31
|
+
element.style.viewTransitionName = "";
|
|
32
|
+
});
|
|
33
|
+
sharedElementRegistry.clear();
|
|
34
|
+
}
|
|
35
|
+
function getSharedElementNames() {
|
|
36
|
+
return Array.from(sharedElementRegistry.keys());
|
|
37
|
+
}
|
|
38
|
+
async function animateSharedElement(options) {
|
|
39
|
+
const { name, duration = 300, easing, onComplete } = options;
|
|
40
|
+
const element = sharedElementRegistry.get(name);
|
|
41
|
+
if (!element) {
|
|
42
|
+
console.warn(`[Flight Transitions] Shared element "${name}" not found`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await new Promise((resolve) => {
|
|
46
|
+
flip(element, () => {
|
|
47
|
+
}, {
|
|
48
|
+
duration,
|
|
49
|
+
easing,
|
|
50
|
+
onComplete: () => {
|
|
51
|
+
onComplete?.();
|
|
52
|
+
resolve();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
var persistentLayouts = /* @__PURE__ */ new Set();
|
|
58
|
+
function markLayoutPersistent(layoutId) {
|
|
59
|
+
persistentLayouts.add(layoutId);
|
|
60
|
+
}
|
|
61
|
+
function isLayoutPersistent(layoutId) {
|
|
62
|
+
return persistentLayouts.has(layoutId);
|
|
63
|
+
}
|
|
64
|
+
function clearPersistentLayouts() {
|
|
65
|
+
persistentLayouts.clear();
|
|
66
|
+
}
|
|
67
|
+
async function executeLayoutTransition(fromLayoutId, toLayoutId, updateDOM) {
|
|
68
|
+
const toConfig = layoutTransitionConfigs.get(toLayoutId);
|
|
69
|
+
if (fromLayoutId === toLayoutId && toConfig?.persist) {
|
|
70
|
+
await updateDOM();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (toConfig?.sharedElements) {
|
|
74
|
+
for (const config of toConfig.sharedElements) {
|
|
75
|
+
const element = sharedElementRegistry.get(config.name);
|
|
76
|
+
if (element) {
|
|
77
|
+
element.style.viewTransitionName = config.name;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
await updateDOM();
|
|
82
|
+
}
|
|
83
|
+
function autoRegisterSharedElements() {
|
|
84
|
+
if (typeof document === "undefined") return;
|
|
85
|
+
const elements = document.querySelectorAll("[data-transition-name]");
|
|
86
|
+
elements.forEach((el) => {
|
|
87
|
+
if (el instanceof HTMLElement) {
|
|
88
|
+
const name = el.dataset.transitionName;
|
|
89
|
+
if (name) {
|
|
90
|
+
registerSharedElement(name, el);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function setupSharedElementObserver() {
|
|
96
|
+
if (typeof document === "undefined") return () => {
|
|
97
|
+
};
|
|
98
|
+
const observer = new MutationObserver((mutations) => {
|
|
99
|
+
for (const mutation of mutations) {
|
|
100
|
+
mutation.addedNodes.forEach((node) => {
|
|
101
|
+
if (node instanceof HTMLElement) {
|
|
102
|
+
const name = node.dataset?.transitionName;
|
|
103
|
+
if (name) {
|
|
104
|
+
registerSharedElement(name, node);
|
|
105
|
+
}
|
|
106
|
+
const children = node.querySelectorAll("[data-transition-name]");
|
|
107
|
+
children.forEach((child) => {
|
|
108
|
+
if (child instanceof HTMLElement) {
|
|
109
|
+
const childName = child.dataset.transitionName;
|
|
110
|
+
if (childName) {
|
|
111
|
+
registerSharedElement(childName, child);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
mutation.removedNodes.forEach((node) => {
|
|
118
|
+
if (node instanceof HTMLElement) {
|
|
119
|
+
const name = node.dataset?.transitionName;
|
|
120
|
+
if (name) {
|
|
121
|
+
unregisterSharedElement(name);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
observer.observe(document.body, {
|
|
128
|
+
childList: true,
|
|
129
|
+
subtree: true
|
|
130
|
+
});
|
|
131
|
+
return () => observer.disconnect();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export { animateSharedElement, autoRegisterSharedElements, clearLayoutTransitions, clearPersistentLayouts, clearSharedElements, defineLayoutTransition, executeLayoutTransition, getLayoutTransition, getSharedElement, getSharedElementNames, isLayoutPersistent, markLayoutPersistent, registerSharedElement, setupSharedElementObserver, unregisterSharedElement };
|
|
135
|
+
//# sourceMappingURL=chunk-BAILQEFB.js.map
|
|
136
|
+
//# sourceMappingURL=chunk-BAILQEFB.js.map
|