@vysmo/flipbook 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/LICENSE +21 -0
- package/README.md +100 -0
- package/dist/create.d.ts +18 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +598 -0
- package/dist/create.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +10 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +26 -0
- package/dist/loader.js.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
- package/src/__tests__/create.test.ts +465 -0
- package/src/__tests__/ssr.test.ts +18 -0
- package/src/__tests__/types-check.ts +91 -0
- package/src/create.ts +653 -0
- package/src/index.ts +9 -0
- package/src/loader.ts +31 -0
- package/src/types.ts +123 -0
package/dist/create.js
ADDED
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
import { animate } from "@vysmo/animations";
|
|
2
|
+
import { cubicInOut } from "@vysmo/easings";
|
|
3
|
+
import { Runner, pageCurl } from "@vysmo/transitions";
|
|
4
|
+
import { resolveAll } from "./loader.js";
|
|
5
|
+
const DEFAULT_DURATION_MS = 900;
|
|
6
|
+
const DEFAULT_TILT = 0.12;
|
|
7
|
+
const DEFAULT_BACK_COLOR = [0.97, 0.96, 0.94];
|
|
8
|
+
const DRAG_THRESHOLD_PX = 5;
|
|
9
|
+
const DEFAULT_DRAG_COMMIT = 0.5;
|
|
10
|
+
const DEFAULT_AUTOPLAY_MS = 4000;
|
|
11
|
+
/**
|
|
12
|
+
* Create a WebGL flipbook around the page-curl mesh transition.
|
|
13
|
+
*
|
|
14
|
+
* Pass a container element + an array of page sources (image URLs,
|
|
15
|
+
* `HTMLImageElement`s, canvases, or videos) and you get a fully wired
|
|
16
|
+
* flipbook: click halves to flip, arrow keys for keyboard nav, drag the
|
|
17
|
+
* corner mid-flip to scrub the curl manually (release past 50% to commit,
|
|
18
|
+
* less to revert), optional autoplay with pause-on-hover.
|
|
19
|
+
*
|
|
20
|
+
* The handle exposes `.next()`, `.prev()`, `.goTo(index)`, `.play()`,
|
|
21
|
+
* `.pause()`, `.dispose()`, plus `.on(event, listener)` for lifecycle
|
|
22
|
+
* (`change`, `flipstart`, `flipend`).
|
|
23
|
+
*
|
|
24
|
+
* @throws Error if `options.pages` is empty.
|
|
25
|
+
*/
|
|
26
|
+
export function createFlipbook(options) {
|
|
27
|
+
if (options.pages.length === 0) {
|
|
28
|
+
throw new Error("createFlipbook requires at least one page.");
|
|
29
|
+
}
|
|
30
|
+
const axis = options.axis ?? "horizontal";
|
|
31
|
+
const userTilt = options.tilt ?? DEFAULT_TILT;
|
|
32
|
+
const backColor = options.backColor ?? DEFAULT_BACK_COLOR;
|
|
33
|
+
const flipDuration = options.flipDuration ?? DEFAULT_DURATION_MS;
|
|
34
|
+
const ease = options.ease ?? cubicInOut;
|
|
35
|
+
const loop = options.loop ?? false;
|
|
36
|
+
const clickNav = options.clickNavigation ?? true;
|
|
37
|
+
const dragNav = options.dragNavigation ?? true;
|
|
38
|
+
const dragCommitThreshold = clamp01(options.dragCommitThreshold ?? DEFAULT_DRAG_COMMIT);
|
|
39
|
+
const keyboardNav = options.keyboardNavigation ?? true;
|
|
40
|
+
const ariaLabel = options.ariaLabel ?? "Flipbook";
|
|
41
|
+
// Autoplay config: false/undefined → off, true → default interval,
|
|
42
|
+
// { intervalMs } → custom interval. Resolved into a normalized shape.
|
|
43
|
+
const autoplayInterval = options.autoplay === true
|
|
44
|
+
? DEFAULT_AUTOPLAY_MS
|
|
45
|
+
: typeof options.autoplay === "object" && options.autoplay
|
|
46
|
+
? Math.max(250, options.autoplay.intervalMs)
|
|
47
|
+
: null;
|
|
48
|
+
// Forward flip = next page. Curl peels from the +sweepDir side toward
|
|
49
|
+
// the -sweepDir (pinned) side. Horizontal: pinned spine on the left,
|
|
50
|
+
// right edge peels left. Vertical: pinned binding at the top, bottom
|
|
51
|
+
// edge peels up (wall-calendar style).
|
|
52
|
+
const baseTilt = axis === "horizontal" ? 0 : -Math.PI / 2;
|
|
53
|
+
let current = clampIndex(options.initialPage ?? 0, options.pages.length);
|
|
54
|
+
let isFlipping = false;
|
|
55
|
+
let destroyed = false;
|
|
56
|
+
let resolvedPages = [];
|
|
57
|
+
let pendingTween = null;
|
|
58
|
+
const listeners = {
|
|
59
|
+
change: new Set(),
|
|
60
|
+
flipstart: new Set(),
|
|
61
|
+
flipend: new Set(),
|
|
62
|
+
};
|
|
63
|
+
// --- DOM setup --------------------------------------------------------
|
|
64
|
+
const wrapper = document.createElement("div");
|
|
65
|
+
wrapper.setAttribute("data-page-flip-wrapper", "");
|
|
66
|
+
wrapper.setAttribute("role", "region");
|
|
67
|
+
wrapper.setAttribute("aria-roledescription", "flipbook");
|
|
68
|
+
wrapper.setAttribute("aria-label", ariaLabel);
|
|
69
|
+
wrapper.tabIndex = 0;
|
|
70
|
+
Object.assign(wrapper.style, {
|
|
71
|
+
position: "relative",
|
|
72
|
+
width: "100%",
|
|
73
|
+
height: "100%",
|
|
74
|
+
overflow: "hidden",
|
|
75
|
+
outline: "none",
|
|
76
|
+
userSelect: "none",
|
|
77
|
+
touchAction: axis === "horizontal" ? "pan-y" : "pan-x",
|
|
78
|
+
});
|
|
79
|
+
options.container.appendChild(wrapper);
|
|
80
|
+
const canvas = document.createElement("canvas");
|
|
81
|
+
canvas.setAttribute("data-page-flip-canvas", "");
|
|
82
|
+
Object.assign(canvas.style, {
|
|
83
|
+
display: "block",
|
|
84
|
+
width: "100%",
|
|
85
|
+
height: "100%",
|
|
86
|
+
});
|
|
87
|
+
wrapper.appendChild(canvas);
|
|
88
|
+
const status = document.createElement("div");
|
|
89
|
+
status.setAttribute("aria-live", "polite");
|
|
90
|
+
status.setAttribute("aria-atomic", "true");
|
|
91
|
+
Object.assign(status.style, {
|
|
92
|
+
position: "absolute",
|
|
93
|
+
width: "1px",
|
|
94
|
+
height: "1px",
|
|
95
|
+
overflow: "hidden",
|
|
96
|
+
clip: "rect(0 0 0 0)",
|
|
97
|
+
clipPath: "inset(50%)",
|
|
98
|
+
whiteSpace: "nowrap",
|
|
99
|
+
});
|
|
100
|
+
wrapper.appendChild(status);
|
|
101
|
+
syncCanvasSize();
|
|
102
|
+
const runner = new Runner({ canvas });
|
|
103
|
+
const ready = resolveAll(options.pages).then((resolved) => {
|
|
104
|
+
resolvedPages = resolved;
|
|
105
|
+
if (!destroyed)
|
|
106
|
+
renderIdle();
|
|
107
|
+
});
|
|
108
|
+
// --- Rendering --------------------------------------------------------
|
|
109
|
+
function renderIdle() {
|
|
110
|
+
const page = resolvedPages[current];
|
|
111
|
+
if (!page || destroyed)
|
|
112
|
+
return;
|
|
113
|
+
runner.render(pageCurl, {
|
|
114
|
+
from: page,
|
|
115
|
+
to: page,
|
|
116
|
+
progress: 0,
|
|
117
|
+
params: { tilt: baseTilt + userTilt, backColor },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function renderFlip(direction, fromIdx, toIdx, internalProgress) {
|
|
121
|
+
// Internal progress: 0 = `current` visible, 1 = `target` visible.
|
|
122
|
+
// The page-curl shader is one-directional (always peels from the
|
|
123
|
+
// +sweepDir edge toward the -sweepDir edge). To play it as a true
|
|
124
|
+
// time-reverse for backward flips, we keep the same shader-level
|
|
125
|
+
// sweep direction and instead swap the texture pair + invert the
|
|
126
|
+
// shader's progress. That way the curl appears from the same side
|
|
127
|
+
// it disappeared into during the forward flip, unrolling backward.
|
|
128
|
+
const earlier = direction === "forward" ? fromIdx : toIdx;
|
|
129
|
+
const later = direction === "forward" ? toIdx : fromIdx;
|
|
130
|
+
const earlierPage = resolvedPages[earlier];
|
|
131
|
+
const laterPage = resolvedPages[later];
|
|
132
|
+
if (!earlierPage || !laterPage || destroyed)
|
|
133
|
+
return;
|
|
134
|
+
const forwardProgress = direction === "forward" ? internalProgress : 1 - internalProgress;
|
|
135
|
+
runner.render(pageCurl, {
|
|
136
|
+
from: earlierPage,
|
|
137
|
+
to: laterPage,
|
|
138
|
+
progress: forwardProgress,
|
|
139
|
+
params: { tilt: baseTilt + userTilt, backColor },
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// --- Navigation -------------------------------------------------------
|
|
143
|
+
function targetFor(direction) {
|
|
144
|
+
const length = resolvedPages.length || options.pages.length;
|
|
145
|
+
if (direction === "forward") {
|
|
146
|
+
if (current + 1 < length)
|
|
147
|
+
return current + 1;
|
|
148
|
+
return loop ? 0 : null;
|
|
149
|
+
}
|
|
150
|
+
if (current - 1 >= 0)
|
|
151
|
+
return current - 1;
|
|
152
|
+
return loop ? length - 1 : null;
|
|
153
|
+
}
|
|
154
|
+
async function playFlip(direction, fromIdx, toIdx, startProgress = 0) {
|
|
155
|
+
if (destroyed)
|
|
156
|
+
return;
|
|
157
|
+
if (isFlipping)
|
|
158
|
+
return;
|
|
159
|
+
isFlipping = true;
|
|
160
|
+
if (startProgress <= 0)
|
|
161
|
+
emit("flipstart", fromIdx, toIdx);
|
|
162
|
+
const remaining = Math.max(0, 1 - startProgress);
|
|
163
|
+
const duration = Math.max(1, flipDuration * remaining);
|
|
164
|
+
const tween = animate({
|
|
165
|
+
from: startProgress,
|
|
166
|
+
to: 1,
|
|
167
|
+
duration,
|
|
168
|
+
ease,
|
|
169
|
+
onUpdate: (p) => renderFlip(direction, fromIdx, toIdx, p),
|
|
170
|
+
});
|
|
171
|
+
pendingTween = { stop: () => tween.stop() };
|
|
172
|
+
try {
|
|
173
|
+
await tween.finished;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
isFlipping = false;
|
|
177
|
+
pendingTween = null;
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
pendingTween = null;
|
|
181
|
+
const previous = current;
|
|
182
|
+
current = toIdx;
|
|
183
|
+
isFlipping = false;
|
|
184
|
+
renderIdle();
|
|
185
|
+
status.textContent = `Page ${current + 1} of ${resolvedPages.length}`;
|
|
186
|
+
emit("change", current, previous);
|
|
187
|
+
emit("flipend", fromIdx, toIdx);
|
|
188
|
+
}
|
|
189
|
+
async function revertFlip(direction, fromIdx, toIdx, startProgress) {
|
|
190
|
+
if (destroyed)
|
|
191
|
+
return;
|
|
192
|
+
if (isFlipping)
|
|
193
|
+
return;
|
|
194
|
+
isFlipping = true;
|
|
195
|
+
const duration = Math.max(1, flipDuration * Math.max(0, startProgress));
|
|
196
|
+
const tween = animate({
|
|
197
|
+
from: startProgress,
|
|
198
|
+
to: 0,
|
|
199
|
+
duration,
|
|
200
|
+
ease,
|
|
201
|
+
onUpdate: (p) => renderFlip(direction, fromIdx, toIdx, p),
|
|
202
|
+
});
|
|
203
|
+
pendingTween = { stop: () => tween.stop() };
|
|
204
|
+
try {
|
|
205
|
+
await tween.finished;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
isFlipping = false;
|
|
209
|
+
pendingTween = null;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
pendingTween = null;
|
|
213
|
+
isFlipping = false;
|
|
214
|
+
renderIdle();
|
|
215
|
+
}
|
|
216
|
+
function next() {
|
|
217
|
+
if (destroyed || isFlipping || dragState !== "idle")
|
|
218
|
+
return Promise.resolve();
|
|
219
|
+
const target = targetFor("forward");
|
|
220
|
+
if (target === null)
|
|
221
|
+
return Promise.resolve();
|
|
222
|
+
return playFlip("forward", current, target);
|
|
223
|
+
}
|
|
224
|
+
function prev() {
|
|
225
|
+
if (destroyed || isFlipping || dragState !== "idle")
|
|
226
|
+
return Promise.resolve();
|
|
227
|
+
const target = targetFor("backward");
|
|
228
|
+
if (target === null)
|
|
229
|
+
return Promise.resolve();
|
|
230
|
+
return playFlip("backward", current, target);
|
|
231
|
+
}
|
|
232
|
+
async function goTo(index, opts = {}) {
|
|
233
|
+
if (destroyed || dragState !== "idle")
|
|
234
|
+
return;
|
|
235
|
+
const length = resolvedPages.length || options.pages.length;
|
|
236
|
+
const target = clampIndex(index, length);
|
|
237
|
+
if (target === current && !isFlipping)
|
|
238
|
+
return;
|
|
239
|
+
if (opts.instant) {
|
|
240
|
+
const previous = current;
|
|
241
|
+
current = target;
|
|
242
|
+
renderIdle();
|
|
243
|
+
status.textContent = `Page ${current + 1} of ${resolvedPages.length}`;
|
|
244
|
+
emit("change", current, previous);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (isFlipping)
|
|
248
|
+
return;
|
|
249
|
+
const direction = target > current ? "forward" : "backward";
|
|
250
|
+
await playFlip(direction, current, target);
|
|
251
|
+
}
|
|
252
|
+
let dragState = "idle";
|
|
253
|
+
let dragStartX = 0;
|
|
254
|
+
let dragStartY = 0;
|
|
255
|
+
let dragDirection = null;
|
|
256
|
+
let dragTarget = null;
|
|
257
|
+
let dragProgress = 0;
|
|
258
|
+
let dragPointerId = -1;
|
|
259
|
+
function primaryDelta(e) {
|
|
260
|
+
return axis === "horizontal" ? e.clientX - dragStartX : e.clientY - dragStartY;
|
|
261
|
+
}
|
|
262
|
+
function wrapperExtent() {
|
|
263
|
+
const rect = wrapper.getBoundingClientRect();
|
|
264
|
+
return axis === "horizontal" ? rect.width : rect.height;
|
|
265
|
+
}
|
|
266
|
+
function onPointerDown(e) {
|
|
267
|
+
if (!dragNav && !clickNav)
|
|
268
|
+
return;
|
|
269
|
+
if (isFlipping)
|
|
270
|
+
return;
|
|
271
|
+
if (e.pointerType === "mouse" && e.button !== 0)
|
|
272
|
+
return;
|
|
273
|
+
dragStartX = e.clientX;
|
|
274
|
+
dragStartY = e.clientY;
|
|
275
|
+
dragState = "potential";
|
|
276
|
+
dragDirection = null;
|
|
277
|
+
dragTarget = null;
|
|
278
|
+
dragProgress = 0;
|
|
279
|
+
dragPointerId = e.pointerId;
|
|
280
|
+
try {
|
|
281
|
+
wrapper.setPointerCapture(e.pointerId);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// setPointerCapture can throw if the pointer is already released
|
|
285
|
+
// (e.g. fast-fired synthetic events). Drag still works inside the
|
|
286
|
+
// wrapper without capture; we just lose tracking if the pointer
|
|
287
|
+
// exits during the drag. Acceptable degradation.
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
function onPointerMove(e) {
|
|
291
|
+
if (dragState === "idle" || e.pointerId !== dragPointerId)
|
|
292
|
+
return;
|
|
293
|
+
const delta = primaryDelta(e);
|
|
294
|
+
if (dragState === "potential" &&
|
|
295
|
+
Math.abs(delta) < DRAG_THRESHOLD_PX) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (!dragNav) {
|
|
299
|
+
// Beyond click threshold but drag is disabled — abort to a click.
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
dragState = "active";
|
|
303
|
+
// Forward = dragging in the page-leaving direction (left for
|
|
304
|
+
// horizontal, up for vertical). Backward = the opposite.
|
|
305
|
+
const direction = delta < 0 ? "forward" : "backward";
|
|
306
|
+
if (direction !== dragDirection) {
|
|
307
|
+
dragDirection = direction;
|
|
308
|
+
dragTarget = targetFor(direction);
|
|
309
|
+
}
|
|
310
|
+
if (dragTarget === null) {
|
|
311
|
+
// No valid target in this direction — render idle and pin progress.
|
|
312
|
+
dragProgress = 0;
|
|
313
|
+
renderIdle();
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const extent = wrapperExtent();
|
|
317
|
+
const progress = extent > 0 ? Math.min(1, Math.abs(delta) / extent) : 0;
|
|
318
|
+
dragProgress = progress;
|
|
319
|
+
renderFlip(direction, current, dragTarget, progress);
|
|
320
|
+
}
|
|
321
|
+
function onPointerUp(e) {
|
|
322
|
+
if (e.pointerId !== dragPointerId)
|
|
323
|
+
return;
|
|
324
|
+
const wasState = dragState;
|
|
325
|
+
dragState = "idle";
|
|
326
|
+
try {
|
|
327
|
+
if (wrapper.hasPointerCapture(e.pointerId)) {
|
|
328
|
+
wrapper.releasePointerCapture(e.pointerId);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
// Ignore — capture state mismatches (e.g. test envs) shouldn't
|
|
333
|
+
// disrupt the click/commit decision below.
|
|
334
|
+
}
|
|
335
|
+
if (wasState === "potential") {
|
|
336
|
+
if (clickNav)
|
|
337
|
+
handleClick(e);
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (wasState === "active") {
|
|
341
|
+
const direction = dragDirection;
|
|
342
|
+
const target = dragTarget;
|
|
343
|
+
const progress = dragProgress;
|
|
344
|
+
dragDirection = null;
|
|
345
|
+
dragTarget = null;
|
|
346
|
+
dragProgress = 0;
|
|
347
|
+
if (direction === null || target === null) {
|
|
348
|
+
renderIdle();
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (progress >= dragCommitThreshold) {
|
|
352
|
+
emit("flipstart", current, target);
|
|
353
|
+
void playFlip(direction, current, target, progress);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
void revertFlip(direction, current, target, progress);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function onPointerCancel(e) {
|
|
361
|
+
if (e.pointerId !== dragPointerId)
|
|
362
|
+
return;
|
|
363
|
+
dragState = "idle";
|
|
364
|
+
if (dragDirection !== null && dragTarget !== null && dragProgress > 0) {
|
|
365
|
+
const direction = dragDirection;
|
|
366
|
+
const target = dragTarget;
|
|
367
|
+
const progress = dragProgress;
|
|
368
|
+
dragDirection = null;
|
|
369
|
+
dragTarget = null;
|
|
370
|
+
dragProgress = 0;
|
|
371
|
+
void revertFlip(direction, current, target, progress);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
renderIdle();
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
function handleClick(e) {
|
|
378
|
+
const rect = wrapper.getBoundingClientRect();
|
|
379
|
+
if (axis === "horizontal") {
|
|
380
|
+
const x = e.clientX - rect.left;
|
|
381
|
+
if (x < rect.width / 2)
|
|
382
|
+
void prev();
|
|
383
|
+
else
|
|
384
|
+
void next();
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
const y = e.clientY - rect.top;
|
|
388
|
+
if (y < rect.height / 2)
|
|
389
|
+
void prev();
|
|
390
|
+
else
|
|
391
|
+
void next();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function onKeyDown(e) {
|
|
395
|
+
let handled = true;
|
|
396
|
+
switch (e.key) {
|
|
397
|
+
case "ArrowRight":
|
|
398
|
+
case "ArrowDown":
|
|
399
|
+
void next();
|
|
400
|
+
break;
|
|
401
|
+
case "ArrowLeft":
|
|
402
|
+
case "ArrowUp":
|
|
403
|
+
void prev();
|
|
404
|
+
break;
|
|
405
|
+
case "Home":
|
|
406
|
+
void goTo(0);
|
|
407
|
+
break;
|
|
408
|
+
case "End":
|
|
409
|
+
void goTo(resolvedPages.length - 1);
|
|
410
|
+
break;
|
|
411
|
+
default:
|
|
412
|
+
handled = false;
|
|
413
|
+
}
|
|
414
|
+
if (handled)
|
|
415
|
+
e.preventDefault();
|
|
416
|
+
}
|
|
417
|
+
if (clickNav || dragNav) {
|
|
418
|
+
wrapper.addEventListener("pointerdown", onPointerDown);
|
|
419
|
+
wrapper.addEventListener("pointermove", onPointerMove);
|
|
420
|
+
wrapper.addEventListener("pointerup", onPointerUp);
|
|
421
|
+
wrapper.addEventListener("pointercancel", onPointerCancel);
|
|
422
|
+
}
|
|
423
|
+
if (keyboardNav)
|
|
424
|
+
wrapper.addEventListener("keydown", onKeyDown);
|
|
425
|
+
// --- Canvas sizing ----------------------------------------------------
|
|
426
|
+
function syncCanvasSize() {
|
|
427
|
+
const rect = options.container.getBoundingClientRect();
|
|
428
|
+
const dpr = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1;
|
|
429
|
+
const w = Math.max(1, Math.round(rect.width * dpr));
|
|
430
|
+
const h = Math.max(1, Math.round(rect.height * dpr));
|
|
431
|
+
if (canvas.width !== w)
|
|
432
|
+
canvas.width = w;
|
|
433
|
+
if (canvas.height !== h)
|
|
434
|
+
canvas.height = h;
|
|
435
|
+
}
|
|
436
|
+
const resizeObserver = typeof ResizeObserver !== "undefined"
|
|
437
|
+
? new ResizeObserver(() => {
|
|
438
|
+
syncCanvasSize();
|
|
439
|
+
if (!isFlipping && dragState === "idle")
|
|
440
|
+
renderIdle();
|
|
441
|
+
})
|
|
442
|
+
: null;
|
|
443
|
+
resizeObserver?.observe(options.container);
|
|
444
|
+
void ready.then(() => {
|
|
445
|
+
if (!destroyed) {
|
|
446
|
+
renderIdle();
|
|
447
|
+
status.textContent = `Page ${current + 1} of ${resolvedPages.length}`;
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
// --- Externally-driven progress (seek) -------------------------------
|
|
451
|
+
// External seek state. While `isSeeking` is true, the runner renders
|
|
452
|
+
// a forward-direction curl from `current` to the next page at the
|
|
453
|
+
// last-given `seekProgress`. Calling next/prev/goTo resets to idle;
|
|
454
|
+
// a new seek replaces any in-flight tween.
|
|
455
|
+
let isSeeking = false;
|
|
456
|
+
let seekTarget = null;
|
|
457
|
+
function seek(progress) {
|
|
458
|
+
if (destroyed)
|
|
459
|
+
return;
|
|
460
|
+
if (dragState !== "idle")
|
|
461
|
+
return; // drag has authority over the curl
|
|
462
|
+
pendingTween?.stop();
|
|
463
|
+
pendingTween = null;
|
|
464
|
+
isFlipping = false;
|
|
465
|
+
const p = clamp01(progress);
|
|
466
|
+
const target = seekTarget ?? targetFor("forward");
|
|
467
|
+
if (target === null) {
|
|
468
|
+
// No next page (and not looping): nothing to scrub. Render idle so
|
|
469
|
+
// any prior in-flight curl resolves.
|
|
470
|
+
isSeeking = false;
|
|
471
|
+
seekTarget = null;
|
|
472
|
+
renderIdle();
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
if (p <= 0) {
|
|
476
|
+
// Back to idle on the current page.
|
|
477
|
+
isSeeking = false;
|
|
478
|
+
seekTarget = null;
|
|
479
|
+
renderIdle();
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
if (p >= 1) {
|
|
483
|
+
// Commit: target becomes current. Emits change like a regular flip.
|
|
484
|
+
const previous = current;
|
|
485
|
+
current = target;
|
|
486
|
+
isSeeking = false;
|
|
487
|
+
seekTarget = null;
|
|
488
|
+
renderIdle();
|
|
489
|
+
status.textContent = `Page ${current + 1} of ${resolvedPages.length}`;
|
|
490
|
+
emit("change", current, previous);
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
// Mid-curl: keep target locked for the duration of the scrub so
|
|
494
|
+
// crossing 0/1 thresholds doesn't bounce between targets.
|
|
495
|
+
isSeeking = true;
|
|
496
|
+
seekTarget = target;
|
|
497
|
+
renderFlip("forward", current, target, p);
|
|
498
|
+
}
|
|
499
|
+
// --- Autoplay ---------------------------------------------------------
|
|
500
|
+
let autoplayTimer = null;
|
|
501
|
+
function play() {
|
|
502
|
+
if (destroyed || autoplayTimer !== null || autoplayInterval === null)
|
|
503
|
+
return;
|
|
504
|
+
autoplayTimer = setInterval(() => {
|
|
505
|
+
// next() no-ops while flipping or dragging — that's the desired
|
|
506
|
+
// pause-during-interaction behavior.
|
|
507
|
+
void next();
|
|
508
|
+
}, autoplayInterval);
|
|
509
|
+
}
|
|
510
|
+
function pause() {
|
|
511
|
+
if (autoplayTimer === null)
|
|
512
|
+
return;
|
|
513
|
+
clearInterval(autoplayTimer);
|
|
514
|
+
autoplayTimer = null;
|
|
515
|
+
}
|
|
516
|
+
if (autoplayInterval !== null) {
|
|
517
|
+
// Auto-start if autoplay was configured at construction time.
|
|
518
|
+
void ready.then(() => {
|
|
519
|
+
if (!destroyed)
|
|
520
|
+
play();
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
// --- Events -----------------------------------------------------------
|
|
524
|
+
function emit(event, ...args) {
|
|
525
|
+
for (const cb of listeners[event]) {
|
|
526
|
+
cb(...args);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function on(event, cb) {
|
|
530
|
+
listeners[event].add(cb);
|
|
531
|
+
return () => {
|
|
532
|
+
listeners[event].delete(cb);
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
return {
|
|
536
|
+
get current() {
|
|
537
|
+
return current;
|
|
538
|
+
},
|
|
539
|
+
get length() {
|
|
540
|
+
return options.pages.length;
|
|
541
|
+
},
|
|
542
|
+
get isFlipping() {
|
|
543
|
+
return isFlipping;
|
|
544
|
+
},
|
|
545
|
+
get isPlaying() {
|
|
546
|
+
return autoplayTimer !== null;
|
|
547
|
+
},
|
|
548
|
+
ready,
|
|
549
|
+
next,
|
|
550
|
+
prev,
|
|
551
|
+
goTo,
|
|
552
|
+
seek,
|
|
553
|
+
play,
|
|
554
|
+
pause,
|
|
555
|
+
on: on,
|
|
556
|
+
destroy() {
|
|
557
|
+
if (destroyed)
|
|
558
|
+
return;
|
|
559
|
+
destroyed = true;
|
|
560
|
+
pause();
|
|
561
|
+
pendingTween?.stop();
|
|
562
|
+
pendingTween = null;
|
|
563
|
+
resizeObserver?.disconnect();
|
|
564
|
+
if (clickNav || dragNav) {
|
|
565
|
+
wrapper.removeEventListener("pointerdown", onPointerDown);
|
|
566
|
+
wrapper.removeEventListener("pointermove", onPointerMove);
|
|
567
|
+
wrapper.removeEventListener("pointerup", onPointerUp);
|
|
568
|
+
wrapper.removeEventListener("pointercancel", onPointerCancel);
|
|
569
|
+
}
|
|
570
|
+
if (keyboardNav)
|
|
571
|
+
wrapper.removeEventListener("keydown", onKeyDown);
|
|
572
|
+
runner.dispose();
|
|
573
|
+
wrapper.remove();
|
|
574
|
+
for (const key of Object.keys(listeners)) {
|
|
575
|
+
listeners[key].clear();
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
function clampIndex(index, length) {
|
|
581
|
+
if (!Number.isFinite(index))
|
|
582
|
+
return 0;
|
|
583
|
+
if (index < 0)
|
|
584
|
+
return 0;
|
|
585
|
+
if (index >= length)
|
|
586
|
+
return Math.max(0, length - 1);
|
|
587
|
+
return Math.floor(index);
|
|
588
|
+
}
|
|
589
|
+
function clamp01(n) {
|
|
590
|
+
if (!Number.isFinite(n))
|
|
591
|
+
return 0;
|
|
592
|
+
if (n < 0)
|
|
593
|
+
return 0;
|
|
594
|
+
if (n > 1)
|
|
595
|
+
return 1;
|
|
596
|
+
return n;
|
|
597
|
+
}
|
|
598
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PageSource } from "./types.js";
|
|
2
|
+
export type ResolvedPage = HTMLImageElement | HTMLCanvasElement;
|
|
3
|
+
/**
|
|
4
|
+
* Normalise a single page source into an element the `Runner` can use
|
|
5
|
+
* as a `TextureSource`. Strings are loaded into a new `Image`; existing
|
|
6
|
+
* image elements are awaited on; canvases pass through instantly.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolvePage(source: PageSource): Promise<ResolvedPage>;
|
|
9
|
+
export declare function resolveAll(sources: readonly PageSource[]): Promise<ResolvedPage[]>;
|
|
10
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAEhE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAe3E;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,SAAS,UAAU,EAAE,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAEzB"}
|