@vysmo/flipbook 0.1.0 → 0.2.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 +28 -0
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +120 -19
- package/dist/create.js.map +1 -1
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/lazy.test.ts +155 -0
- package/src/create.ts +115 -19
- package/src/types.ts +22 -0
package/README.md
CHANGED
|
@@ -35,6 +35,34 @@ flip.prev();
|
|
|
35
35
|
flip.goTo(2);
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
## Lazy mode for long books
|
|
39
|
+
|
|
40
|
+
`createFlipbook` eagerly decodes every page by default. For books with
|
|
41
|
+
many pages, set `lazy: true` and only the current page + `preloadWindow`
|
|
42
|
+
neighbours on each side are loaded onto the GPU at a time. The runner's
|
|
43
|
+
LRU evicts URL textures outside the window automatically.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { createFlipbook } from "@vysmo/flipbook";
|
|
47
|
+
|
|
48
|
+
// Any length — only ~3 textures held on the GPU at a time.
|
|
49
|
+
const pages = Array.from({ length: 80 }, (_, i) => `/pages/${i}.jpg`);
|
|
50
|
+
|
|
51
|
+
createFlipbook({
|
|
52
|
+
container: document.querySelector("#book")!,
|
|
53
|
+
pages,
|
|
54
|
+
lazy: true,
|
|
55
|
+
preloadWindow: 1, // current + N each side; default 1
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
DOM-source pages (`HTMLImageElement`, `HTMLCanvasElement`) mixed in a
|
|
60
|
+
lazy `pages` array are always considered loaded — they're in memory by
|
|
61
|
+
definition. Only URL strings go through the lazy load path.
|
|
62
|
+
|
|
63
|
+
For Next.js — pass `next/image` optimizer URLs straight into `pages`.
|
|
64
|
+
See the [Vysmo + Next.js guide](https://vysmo.com/guides/nextjs).
|
|
65
|
+
|
|
38
66
|
## Pages
|
|
39
67
|
|
|
40
68
|
`pages` accepts:
|
package/dist/create.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;AAoBpB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAirBvE"}
|
package/dist/create.js
CHANGED
|
@@ -38,6 +38,9 @@ export function createFlipbook(options) {
|
|
|
38
38
|
const dragCommitThreshold = clamp01(options.dragCommitThreshold ?? DEFAULT_DRAG_COMMIT);
|
|
39
39
|
const keyboardNav = options.keyboardNavigation ?? true;
|
|
40
40
|
const ariaLabel = options.ariaLabel ?? "Flipbook";
|
|
41
|
+
const lazy = options.lazy === true;
|
|
42
|
+
const preloadWindow = Math.max(0, Math.floor(options.preloadWindow ?? 1));
|
|
43
|
+
const pageCount = options.pages.length;
|
|
41
44
|
// Autoplay config: false/undefined → off, true → default interval,
|
|
42
45
|
// { intervalMs } → custom interval. Resolved into a normalized shape.
|
|
43
46
|
const autoplayInterval = options.autoplay === true
|
|
@@ -99,16 +102,107 @@ export function createFlipbook(options) {
|
|
|
99
102
|
});
|
|
100
103
|
wrapper.appendChild(status);
|
|
101
104
|
syncCanvasSize();
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
// Lazy mode: bound the runner's URL-keyed texture cache to roughly
|
|
106
|
+
// the size of our preload window. +2 cushion handles the "drag-scrubbing
|
|
107
|
+
// across an edge of the window" moment where both the new neighbour
|
|
108
|
+
// and the pre-existing edge are momentarily resident.
|
|
109
|
+
const runner = new Runner({
|
|
110
|
+
canvas,
|
|
111
|
+
...(lazy
|
|
112
|
+
? { textureCache: { maxUrlEntries: 2 * preloadWindow + 1 + 2 } }
|
|
113
|
+
: {}),
|
|
107
114
|
});
|
|
115
|
+
// --- Page loading -----------------------------------------------------
|
|
116
|
+
//
|
|
117
|
+
// Eager (default): every page decoded up front; `resolvedPages[i]` is
|
|
118
|
+
// populated for all i once `ready` resolves.
|
|
119
|
+
//
|
|
120
|
+
// Lazy: only current + N preload-window neighbours are loaded. URL
|
|
121
|
+
// pages pass through to runner (fetch + decode + upload via texture
|
|
122
|
+
// cache + LRU eviction). Non-URL DOM pages are always considered ready.
|
|
123
|
+
/**
|
|
124
|
+
* What `runner.render()` consumes for page index `i`. Eager → the
|
|
125
|
+
* pre-decoded image/canvas. Lazy → the original source (URL string
|
|
126
|
+
* or DOM element); URLs must have been preloaded via `loadWindowAround`.
|
|
127
|
+
*/
|
|
128
|
+
function renderSource(i) {
|
|
129
|
+
if (!lazy)
|
|
130
|
+
return resolvedPages[i];
|
|
131
|
+
return options.pages[i];
|
|
132
|
+
}
|
|
133
|
+
function isLoaded(i) {
|
|
134
|
+
if (!lazy)
|
|
135
|
+
return resolvedPages[i] !== undefined;
|
|
136
|
+
const src = options.pages[i];
|
|
137
|
+
if (typeof src !== "string")
|
|
138
|
+
return true;
|
|
139
|
+
return loadedLazy.has(i);
|
|
140
|
+
}
|
|
141
|
+
const loadedLazy = new Set();
|
|
142
|
+
const pendingLazyLoads = new Map();
|
|
143
|
+
function loadIndexLazy(i) {
|
|
144
|
+
if (!lazy || loadedLazy.has(i))
|
|
145
|
+
return Promise.resolve();
|
|
146
|
+
const src = options.pages[i];
|
|
147
|
+
if (typeof src !== "string") {
|
|
148
|
+
loadedLazy.add(i);
|
|
149
|
+
return Promise.resolve();
|
|
150
|
+
}
|
|
151
|
+
const pending = pendingLazyLoads.get(i);
|
|
152
|
+
if (pending)
|
|
153
|
+
return pending;
|
|
154
|
+
const p = runner
|
|
155
|
+
.preload([src])
|
|
156
|
+
.then(() => {
|
|
157
|
+
loadedLazy.add(i);
|
|
158
|
+
pendingLazyLoads.delete(i);
|
|
159
|
+
})
|
|
160
|
+
.catch((err) => {
|
|
161
|
+
pendingLazyLoads.delete(i);
|
|
162
|
+
throw err;
|
|
163
|
+
});
|
|
164
|
+
pendingLazyLoads.set(i, p);
|
|
165
|
+
return p;
|
|
166
|
+
}
|
|
167
|
+
async function loadWindowAround(i) {
|
|
168
|
+
if (!lazy)
|
|
169
|
+
return;
|
|
170
|
+
await loadIndexLazy(i);
|
|
171
|
+
for (let offset = 1; offset <= preloadWindow; offset++) {
|
|
172
|
+
const ahead = wrapIndex(i + offset);
|
|
173
|
+
const behind = wrapIndex(i - offset);
|
|
174
|
+
if (ahead !== null)
|
|
175
|
+
void loadIndexLazy(ahead);
|
|
176
|
+
if (behind !== null)
|
|
177
|
+
void loadIndexLazy(behind);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function wrapIndex(i) {
|
|
181
|
+
if (pageCount === 0)
|
|
182
|
+
return null;
|
|
183
|
+
if (loop) {
|
|
184
|
+
return ((i % pageCount) + pageCount) % pageCount;
|
|
185
|
+
}
|
|
186
|
+
if (i < 0 || i >= pageCount)
|
|
187
|
+
return null;
|
|
188
|
+
return i;
|
|
189
|
+
}
|
|
190
|
+
const ready = lazy
|
|
191
|
+
? loadWindowAround(current).then(() => {
|
|
192
|
+
if (!destroyed)
|
|
193
|
+
renderIdle();
|
|
194
|
+
})
|
|
195
|
+
: resolveAll(options.pages).then((resolved) => {
|
|
196
|
+
resolvedPages = resolved;
|
|
197
|
+
if (!destroyed)
|
|
198
|
+
renderIdle();
|
|
199
|
+
});
|
|
108
200
|
// --- Rendering --------------------------------------------------------
|
|
109
201
|
function renderIdle() {
|
|
110
|
-
|
|
111
|
-
|
|
202
|
+
if (destroyed)
|
|
203
|
+
return;
|
|
204
|
+
const page = renderSource(current);
|
|
205
|
+
if (!page || !isLoaded(current))
|
|
112
206
|
return;
|
|
113
207
|
runner.render(pageCurl, {
|
|
114
208
|
from: page,
|
|
@@ -127,10 +221,12 @@ export function createFlipbook(options) {
|
|
|
127
221
|
// it disappeared into during the forward flip, unrolling backward.
|
|
128
222
|
const earlier = direction === "forward" ? fromIdx : toIdx;
|
|
129
223
|
const later = direction === "forward" ? toIdx : fromIdx;
|
|
130
|
-
const earlierPage =
|
|
131
|
-
const laterPage =
|
|
224
|
+
const earlierPage = renderSource(earlier);
|
|
225
|
+
const laterPage = renderSource(later);
|
|
132
226
|
if (!earlierPage || !laterPage || destroyed)
|
|
133
227
|
return;
|
|
228
|
+
if (!isLoaded(earlier) || !isLoaded(later))
|
|
229
|
+
return;
|
|
134
230
|
const forwardProgress = direction === "forward" ? internalProgress : 1 - internalProgress;
|
|
135
231
|
runner.render(pageCurl, {
|
|
136
232
|
from: earlierPage,
|
|
@@ -141,21 +237,25 @@ export function createFlipbook(options) {
|
|
|
141
237
|
}
|
|
142
238
|
// --- Navigation -------------------------------------------------------
|
|
143
239
|
function targetFor(direction) {
|
|
144
|
-
const length = resolvedPages.length || options.pages.length;
|
|
145
240
|
if (direction === "forward") {
|
|
146
|
-
if (current + 1 <
|
|
241
|
+
if (current + 1 < pageCount)
|
|
147
242
|
return current + 1;
|
|
148
243
|
return loop ? 0 : null;
|
|
149
244
|
}
|
|
150
245
|
if (current - 1 >= 0)
|
|
151
246
|
return current - 1;
|
|
152
|
-
return loop ?
|
|
247
|
+
return loop ? pageCount - 1 : null;
|
|
153
248
|
}
|
|
154
249
|
async function playFlip(direction, fromIdx, toIdx, startProgress = 0) {
|
|
155
250
|
if (destroyed)
|
|
156
251
|
return;
|
|
157
252
|
if (isFlipping)
|
|
158
253
|
return;
|
|
254
|
+
// Lazy mode: ensure target page is loaded before we start flipping
|
|
255
|
+
// (renderFlip would otherwise silently no-op for an un-preloaded URL).
|
|
256
|
+
// Pulls neighbours into the window for the next flip too.
|
|
257
|
+
if (lazy)
|
|
258
|
+
await loadWindowAround(toIdx);
|
|
159
259
|
isFlipping = true;
|
|
160
260
|
if (startProgress <= 0)
|
|
161
261
|
emit("flipstart", fromIdx, toIdx);
|
|
@@ -182,7 +282,7 @@ export function createFlipbook(options) {
|
|
|
182
282
|
current = toIdx;
|
|
183
283
|
isFlipping = false;
|
|
184
284
|
renderIdle();
|
|
185
|
-
status.textContent = `Page ${current + 1} of ${
|
|
285
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
186
286
|
emit("change", current, previous);
|
|
187
287
|
emit("flipend", fromIdx, toIdx);
|
|
188
288
|
}
|
|
@@ -232,15 +332,16 @@ export function createFlipbook(options) {
|
|
|
232
332
|
async function goTo(index, opts = {}) {
|
|
233
333
|
if (destroyed || dragState !== "idle")
|
|
234
334
|
return;
|
|
235
|
-
const
|
|
236
|
-
const target = clampIndex(index, length);
|
|
335
|
+
const target = clampIndex(index, pageCount);
|
|
237
336
|
if (target === current && !isFlipping)
|
|
238
337
|
return;
|
|
239
338
|
if (opts.instant) {
|
|
339
|
+
if (lazy)
|
|
340
|
+
await loadWindowAround(target);
|
|
240
341
|
const previous = current;
|
|
241
342
|
current = target;
|
|
242
343
|
renderIdle();
|
|
243
|
-
status.textContent = `Page ${current + 1} of ${
|
|
344
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
244
345
|
emit("change", current, previous);
|
|
245
346
|
return;
|
|
246
347
|
}
|
|
@@ -406,7 +507,7 @@ export function createFlipbook(options) {
|
|
|
406
507
|
void goTo(0);
|
|
407
508
|
break;
|
|
408
509
|
case "End":
|
|
409
|
-
void goTo(
|
|
510
|
+
void goTo(pageCount - 1);
|
|
410
511
|
break;
|
|
411
512
|
default:
|
|
412
513
|
handled = false;
|
|
@@ -444,7 +545,7 @@ export function createFlipbook(options) {
|
|
|
444
545
|
void ready.then(() => {
|
|
445
546
|
if (!destroyed) {
|
|
446
547
|
renderIdle();
|
|
447
|
-
status.textContent = `Page ${current + 1} of ${
|
|
548
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
448
549
|
}
|
|
449
550
|
});
|
|
450
551
|
// --- Externally-driven progress (seek) -------------------------------
|
|
@@ -486,7 +587,7 @@ export function createFlipbook(options) {
|
|
|
486
587
|
isSeeking = false;
|
|
487
588
|
seekTarget = null;
|
|
488
589
|
renderIdle();
|
|
489
|
-
status.textContent = `Page ${current + 1} of ${
|
|
590
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
490
591
|
emit("change", current, previous);
|
|
491
592
|
return;
|
|
492
593
|
}
|
package/dist/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -71,6 +71,28 @@ export interface FlipbookOptions {
|
|
|
71
71
|
};
|
|
72
72
|
/** Accessible label exposed via `aria-label`. Default `"Flipbook"`. */
|
|
73
73
|
ariaLabel?: string;
|
|
74
|
+
/**
|
|
75
|
+
* Lazy-load mode. When `true`, only the current page and its
|
|
76
|
+
* neighbours (see `preloadWindow`) are fetched + uploaded to the GPU;
|
|
77
|
+
* out-of-window pages are evicted from the texture cache via the
|
|
78
|
+
* runner's LRU policy. Default `false` — all pages eagerly resolved
|
|
79
|
+
* (preserves v0.1 behavior).
|
|
80
|
+
*
|
|
81
|
+
* Worth turning on for long flipbooks (>10–20 pages) or when driving
|
|
82
|
+
* the flipbook from a Next.js page where the homepage shouldn't block
|
|
83
|
+
* on dozens of image decodes. Works with URL string sources;
|
|
84
|
+
* `HTMLImageElement` / `HTMLCanvasElement` sources passed in still
|
|
85
|
+
* load up front (they're already in memory).
|
|
86
|
+
*/
|
|
87
|
+
lazy?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* In `lazy: true` mode, how many pages on each side of the current
|
|
90
|
+
* index to keep resident on the GPU. Default 1 — current page plus
|
|
91
|
+
* immediate prev/next are always loaded ahead of user navigation.
|
|
92
|
+
* Higher values trade GPU memory for fewer load stalls on rapid
|
|
93
|
+
* flips. Ignored when `lazy` is false.
|
|
94
|
+
*/
|
|
95
|
+
preloadWindow?: number;
|
|
74
96
|
}
|
|
75
97
|
export interface FlipOptions {
|
|
76
98
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,EAAE,WAAW,CAAC;IACvB,6FAA6F;IAC7F,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,gFAAgF;IAChF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vysmo/flipbook",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "WebGL flipbook driven by the @vysmo/transitions page-curl mesh shader. Click halves, keyboard nav, drag corners to scrub mid-flip. Drop-in component or headless API.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"LICENSE"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@vysmo/animations": "0.
|
|
34
|
-
"@vysmo/
|
|
35
|
-
"@vysmo/
|
|
33
|
+
"@vysmo/animations": "0.2.0",
|
|
34
|
+
"@vysmo/easings": "0.2.0",
|
|
35
|
+
"@vysmo/transitions": "0.2.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@vitest/browser": "^3.2.4",
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { createFlipbook, type FlipbookHandle } from "../index.js";
|
|
3
|
+
|
|
4
|
+
let container: HTMLElement;
|
|
5
|
+
const handles: FlipbookHandle[] = [];
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
container = document.createElement("div");
|
|
9
|
+
container.style.width = "400px";
|
|
10
|
+
container.style.height = "300px";
|
|
11
|
+
document.body.appendChild(container);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
for (const h of handles.splice(0)) h.destroy();
|
|
16
|
+
container.remove();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
function track(h: FlipbookHandle): FlipbookHandle {
|
|
20
|
+
handles.push(h);
|
|
21
|
+
return h;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function makeCanvas(color: string): HTMLCanvasElement {
|
|
25
|
+
const c = document.createElement("canvas");
|
|
26
|
+
c.width = 16;
|
|
27
|
+
c.height = 16;
|
|
28
|
+
const ctx = c.getContext("2d")!;
|
|
29
|
+
ctx.fillStyle = color;
|
|
30
|
+
ctx.fillRect(0, 0, 16, 16);
|
|
31
|
+
return c;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function blobUrl(color: string): Promise<string> {
|
|
35
|
+
const c = makeCanvas(color);
|
|
36
|
+
const blob: Blob = await new Promise((resolve, reject) => {
|
|
37
|
+
c.toBlob((b) => (b ? resolve(b) : reject(new Error("toBlob failed"))));
|
|
38
|
+
});
|
|
39
|
+
return URL.createObjectURL(blob);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
describe("createFlipbook: lazy mode", () => {
|
|
43
|
+
it("ready resolves once the initial page is loaded (URL sources)", async () => {
|
|
44
|
+
const urls = await Promise.all([
|
|
45
|
+
blobUrl("#ff0000"),
|
|
46
|
+
blobUrl("#00ff00"),
|
|
47
|
+
blobUrl("#0000ff"),
|
|
48
|
+
]);
|
|
49
|
+
const f = track(
|
|
50
|
+
createFlipbook({
|
|
51
|
+
container,
|
|
52
|
+
pages: urls,
|
|
53
|
+
lazy: true,
|
|
54
|
+
flipDuration: 30,
|
|
55
|
+
}),
|
|
56
|
+
);
|
|
57
|
+
await f.ready;
|
|
58
|
+
expect(f.current).toBe(0);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("navigating to an out-of-window page awaits its load", async () => {
|
|
62
|
+
const urls = await Promise.all([
|
|
63
|
+
blobUrl("#aa0000"),
|
|
64
|
+
blobUrl("#00aa00"),
|
|
65
|
+
blobUrl("#0000aa"),
|
|
66
|
+
blobUrl("#aaaa00"),
|
|
67
|
+
blobUrl("#00aaaa"),
|
|
68
|
+
]);
|
|
69
|
+
const f = track(
|
|
70
|
+
createFlipbook({
|
|
71
|
+
container,
|
|
72
|
+
pages: urls,
|
|
73
|
+
lazy: true,
|
|
74
|
+
preloadWindow: 1,
|
|
75
|
+
flipDuration: 30,
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
await f.ready;
|
|
79
|
+
await f.goTo(4);
|
|
80
|
+
expect(f.current).toBe(4);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("DOM-source pages in a lazy flipbook are treated as already loaded", async () => {
|
|
84
|
+
const pages = [makeCanvas("#ff0000"), makeCanvas("#00ff00")];
|
|
85
|
+
const f = track(
|
|
86
|
+
createFlipbook({
|
|
87
|
+
container,
|
|
88
|
+
pages,
|
|
89
|
+
lazy: true,
|
|
90
|
+
flipDuration: 30,
|
|
91
|
+
}),
|
|
92
|
+
);
|
|
93
|
+
await f.ready;
|
|
94
|
+
expect(f.current).toBe(0);
|
|
95
|
+
await f.next();
|
|
96
|
+
expect(f.current).toBe(1);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("mixed array (URL + DOM) lazy-loads URL pages, leaves DOM pages as-is", async () => {
|
|
100
|
+
const url1 = await blobUrl("#ff8800");
|
|
101
|
+
const canvas = makeCanvas("#0088ff");
|
|
102
|
+
const url2 = await blobUrl("#88ff00");
|
|
103
|
+
const f = track(
|
|
104
|
+
createFlipbook({
|
|
105
|
+
container,
|
|
106
|
+
pages: [url1, canvas, url2],
|
|
107
|
+
lazy: true,
|
|
108
|
+
flipDuration: 30,
|
|
109
|
+
}),
|
|
110
|
+
);
|
|
111
|
+
await f.ready;
|
|
112
|
+
await f.next();
|
|
113
|
+
expect(f.current).toBe(1);
|
|
114
|
+
await f.next();
|
|
115
|
+
expect(f.current).toBe(2);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("eager mode (default) is unaffected by lazy code paths", async () => {
|
|
119
|
+
const urls = await Promise.all([blobUrl("#abcdef"), blobUrl("#fedcba")]);
|
|
120
|
+
const f = track(
|
|
121
|
+
createFlipbook({
|
|
122
|
+
container,
|
|
123
|
+
pages: urls,
|
|
124
|
+
flipDuration: 30,
|
|
125
|
+
}),
|
|
126
|
+
);
|
|
127
|
+
await f.ready;
|
|
128
|
+
expect(f.current).toBe(0);
|
|
129
|
+
await f.next();
|
|
130
|
+
expect(f.current).toBe(1);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("preloadWindow > 1 keeps a wider window navigable", async () => {
|
|
134
|
+
const urls = await Promise.all([
|
|
135
|
+
blobUrl("#100000"),
|
|
136
|
+
blobUrl("#001000"),
|
|
137
|
+
blobUrl("#000010"),
|
|
138
|
+
blobUrl("#101000"),
|
|
139
|
+
blobUrl("#001010"),
|
|
140
|
+
]);
|
|
141
|
+
const f = track(
|
|
142
|
+
createFlipbook({
|
|
143
|
+
container,
|
|
144
|
+
pages: urls,
|
|
145
|
+
lazy: true,
|
|
146
|
+
preloadWindow: 2,
|
|
147
|
+
flipDuration: 30,
|
|
148
|
+
}),
|
|
149
|
+
);
|
|
150
|
+
await f.ready;
|
|
151
|
+
for (let i = 0; i < urls.length; i++) await f.goTo(i);
|
|
152
|
+
for (let i = urls.length - 1; i >= 0; i--) await f.goTo(i);
|
|
153
|
+
expect(f.current).toBe(0);
|
|
154
|
+
});
|
|
155
|
+
});
|
package/src/create.ts
CHANGED
|
@@ -10,6 +10,9 @@ import type {
|
|
|
10
10
|
FlipbookOptions,
|
|
11
11
|
} from "./types.js";
|
|
12
12
|
|
|
13
|
+
/** What can be passed to `runner.render()` after resolution. */
|
|
14
|
+
type RenderPage = string | HTMLImageElement | HTMLCanvasElement;
|
|
15
|
+
|
|
13
16
|
type EventMap = {
|
|
14
17
|
change: (current: number, previous: number) => void;
|
|
15
18
|
flipstart: (from: number, to: number) => void;
|
|
@@ -56,6 +59,9 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
56
59
|
const dragCommitThreshold = clamp01(options.dragCommitThreshold ?? DEFAULT_DRAG_COMMIT);
|
|
57
60
|
const keyboardNav = options.keyboardNavigation ?? true;
|
|
58
61
|
const ariaLabel = options.ariaLabel ?? "Flipbook";
|
|
62
|
+
const lazy = options.lazy === true;
|
|
63
|
+
const preloadWindow = Math.max(0, Math.floor(options.preloadWindow ?? 1));
|
|
64
|
+
const pageCount = options.pages.length;
|
|
59
65
|
|
|
60
66
|
// Autoplay config: false/undefined → off, true → default interval,
|
|
61
67
|
// { intervalMs } → custom interval. Resolved into a normalized shape.
|
|
@@ -128,18 +134,104 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
128
134
|
|
|
129
135
|
syncCanvasSize();
|
|
130
136
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
137
|
+
// Lazy mode: bound the runner's URL-keyed texture cache to roughly
|
|
138
|
+
// the size of our preload window. +2 cushion handles the "drag-scrubbing
|
|
139
|
+
// across an edge of the window" moment where both the new neighbour
|
|
140
|
+
// and the pre-existing edge are momentarily resident.
|
|
141
|
+
const runner = new Runner({
|
|
142
|
+
canvas,
|
|
143
|
+
...(lazy
|
|
144
|
+
? { textureCache: { maxUrlEntries: 2 * preloadWindow + 1 + 2 } }
|
|
145
|
+
: {}),
|
|
136
146
|
});
|
|
137
147
|
|
|
148
|
+
// --- Page loading -----------------------------------------------------
|
|
149
|
+
//
|
|
150
|
+
// Eager (default): every page decoded up front; `resolvedPages[i]` is
|
|
151
|
+
// populated for all i once `ready` resolves.
|
|
152
|
+
//
|
|
153
|
+
// Lazy: only current + N preload-window neighbours are loaded. URL
|
|
154
|
+
// pages pass through to runner (fetch + decode + upload via texture
|
|
155
|
+
// cache + LRU eviction). Non-URL DOM pages are always considered ready.
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* What `runner.render()` consumes for page index `i`. Eager → the
|
|
159
|
+
* pre-decoded image/canvas. Lazy → the original source (URL string
|
|
160
|
+
* or DOM element); URLs must have been preloaded via `loadWindowAround`.
|
|
161
|
+
*/
|
|
162
|
+
function renderSource(i: number): RenderPage | undefined {
|
|
163
|
+
if (!lazy) return resolvedPages[i];
|
|
164
|
+
return options.pages[i];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function isLoaded(i: number): boolean {
|
|
168
|
+
if (!lazy) return resolvedPages[i] !== undefined;
|
|
169
|
+
const src = options.pages[i];
|
|
170
|
+
if (typeof src !== "string") return true;
|
|
171
|
+
return loadedLazy.has(i);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const loadedLazy = new Set<number>();
|
|
175
|
+
const pendingLazyLoads = new Map<number, Promise<void>>();
|
|
176
|
+
|
|
177
|
+
function loadIndexLazy(i: number): Promise<void> {
|
|
178
|
+
if (!lazy || loadedLazy.has(i)) return Promise.resolve();
|
|
179
|
+
const src = options.pages[i];
|
|
180
|
+
if (typeof src !== "string") {
|
|
181
|
+
loadedLazy.add(i);
|
|
182
|
+
return Promise.resolve();
|
|
183
|
+
}
|
|
184
|
+
const pending = pendingLazyLoads.get(i);
|
|
185
|
+
if (pending) return pending;
|
|
186
|
+
const p = runner
|
|
187
|
+
.preload([src])
|
|
188
|
+
.then(() => {
|
|
189
|
+
loadedLazy.add(i);
|
|
190
|
+
pendingLazyLoads.delete(i);
|
|
191
|
+
})
|
|
192
|
+
.catch((err) => {
|
|
193
|
+
pendingLazyLoads.delete(i);
|
|
194
|
+
throw err;
|
|
195
|
+
});
|
|
196
|
+
pendingLazyLoads.set(i, p);
|
|
197
|
+
return p;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function loadWindowAround(i: number): Promise<void> {
|
|
201
|
+
if (!lazy) return;
|
|
202
|
+
await loadIndexLazy(i);
|
|
203
|
+
for (let offset = 1; offset <= preloadWindow; offset++) {
|
|
204
|
+
const ahead = wrapIndex(i + offset);
|
|
205
|
+
const behind = wrapIndex(i - offset);
|
|
206
|
+
if (ahead !== null) void loadIndexLazy(ahead);
|
|
207
|
+
if (behind !== null) void loadIndexLazy(behind);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function wrapIndex(i: number): number | null {
|
|
212
|
+
if (pageCount === 0) return null;
|
|
213
|
+
if (loop) {
|
|
214
|
+
return ((i % pageCount) + pageCount) % pageCount;
|
|
215
|
+
}
|
|
216
|
+
if (i < 0 || i >= pageCount) return null;
|
|
217
|
+
return i;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const ready = lazy
|
|
221
|
+
? loadWindowAround(current).then(() => {
|
|
222
|
+
if (!destroyed) renderIdle();
|
|
223
|
+
})
|
|
224
|
+
: resolveAll(options.pages).then((resolved) => {
|
|
225
|
+
resolvedPages = resolved;
|
|
226
|
+
if (!destroyed) renderIdle();
|
|
227
|
+
});
|
|
228
|
+
|
|
138
229
|
// --- Rendering --------------------------------------------------------
|
|
139
230
|
|
|
140
231
|
function renderIdle(): void {
|
|
141
|
-
|
|
142
|
-
|
|
232
|
+
if (destroyed) return;
|
|
233
|
+
const page = renderSource(current);
|
|
234
|
+
if (!page || !isLoaded(current)) return;
|
|
143
235
|
runner.render(pageCurl, {
|
|
144
236
|
from: page,
|
|
145
237
|
to: page,
|
|
@@ -163,9 +255,10 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
163
255
|
// it disappeared into during the forward flip, unrolling backward.
|
|
164
256
|
const earlier = direction === "forward" ? fromIdx : toIdx;
|
|
165
257
|
const later = direction === "forward" ? toIdx : fromIdx;
|
|
166
|
-
const earlierPage =
|
|
167
|
-
const laterPage =
|
|
258
|
+
const earlierPage = renderSource(earlier);
|
|
259
|
+
const laterPage = renderSource(later);
|
|
168
260
|
if (!earlierPage || !laterPage || destroyed) return;
|
|
261
|
+
if (!isLoaded(earlier) || !isLoaded(later)) return;
|
|
169
262
|
const forwardProgress =
|
|
170
263
|
direction === "forward" ? internalProgress : 1 - internalProgress;
|
|
171
264
|
runner.render(pageCurl, {
|
|
@@ -179,13 +272,12 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
179
272
|
// --- Navigation -------------------------------------------------------
|
|
180
273
|
|
|
181
274
|
function targetFor(direction: Direction): number | null {
|
|
182
|
-
const length = resolvedPages.length || options.pages.length;
|
|
183
275
|
if (direction === "forward") {
|
|
184
|
-
if (current + 1 <
|
|
276
|
+
if (current + 1 < pageCount) return current + 1;
|
|
185
277
|
return loop ? 0 : null;
|
|
186
278
|
}
|
|
187
279
|
if (current - 1 >= 0) return current - 1;
|
|
188
|
-
return loop ?
|
|
280
|
+
return loop ? pageCount - 1 : null;
|
|
189
281
|
}
|
|
190
282
|
|
|
191
283
|
async function playFlip(
|
|
@@ -196,6 +288,10 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
196
288
|
): Promise<void> {
|
|
197
289
|
if (destroyed) return;
|
|
198
290
|
if (isFlipping) return;
|
|
291
|
+
// Lazy mode: ensure target page is loaded before we start flipping
|
|
292
|
+
// (renderFlip would otherwise silently no-op for an un-preloaded URL).
|
|
293
|
+
// Pulls neighbours into the window for the next flip too.
|
|
294
|
+
if (lazy) await loadWindowAround(toIdx);
|
|
199
295
|
isFlipping = true;
|
|
200
296
|
if (startProgress <= 0) emit("flipstart", fromIdx, toIdx);
|
|
201
297
|
|
|
@@ -223,7 +319,7 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
223
319
|
current = toIdx;
|
|
224
320
|
isFlipping = false;
|
|
225
321
|
renderIdle();
|
|
226
|
-
status.textContent = `Page ${current + 1} of ${
|
|
322
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
227
323
|
emit("change", current, previous);
|
|
228
324
|
emit("flipend", fromIdx, toIdx);
|
|
229
325
|
}
|
|
@@ -277,14 +373,14 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
277
373
|
|
|
278
374
|
async function goTo(index: number, opts: FlipOptions = {}): Promise<void> {
|
|
279
375
|
if (destroyed || dragState !== "idle") return;
|
|
280
|
-
const
|
|
281
|
-
const target = clampIndex(index, length);
|
|
376
|
+
const target = clampIndex(index, pageCount);
|
|
282
377
|
if (target === current && !isFlipping) return;
|
|
283
378
|
if (opts.instant) {
|
|
379
|
+
if (lazy) await loadWindowAround(target);
|
|
284
380
|
const previous = current;
|
|
285
381
|
current = target;
|
|
286
382
|
renderIdle();
|
|
287
|
-
status.textContent = `Page ${current + 1} of ${
|
|
383
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
288
384
|
emit("change", current, previous);
|
|
289
385
|
return;
|
|
290
386
|
}
|
|
@@ -450,7 +546,7 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
450
546
|
void goTo(0);
|
|
451
547
|
break;
|
|
452
548
|
case "End":
|
|
453
|
-
void goTo(
|
|
549
|
+
void goTo(pageCount - 1);
|
|
454
550
|
break;
|
|
455
551
|
default:
|
|
456
552
|
handled = false;
|
|
@@ -489,7 +585,7 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
489
585
|
void ready.then(() => {
|
|
490
586
|
if (!destroyed) {
|
|
491
587
|
renderIdle();
|
|
492
|
-
status.textContent = `Page ${current + 1} of ${
|
|
588
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
493
589
|
}
|
|
494
590
|
});
|
|
495
591
|
|
|
@@ -535,7 +631,7 @@ export function createFlipbook(options: FlipbookOptions): FlipbookHandle {
|
|
|
535
631
|
isSeeking = false;
|
|
536
632
|
seekTarget = null;
|
|
537
633
|
renderIdle();
|
|
538
|
-
status.textContent = `Page ${current + 1} of ${
|
|
634
|
+
status.textContent = `Page ${current + 1} of ${pageCount}`;
|
|
539
635
|
emit("change", current, previous);
|
|
540
636
|
return;
|
|
541
637
|
}
|
package/src/types.ts
CHANGED
|
@@ -72,6 +72,28 @@ export interface FlipbookOptions {
|
|
|
72
72
|
autoplay?: boolean | { intervalMs: number };
|
|
73
73
|
/** Accessible label exposed via `aria-label`. Default `"Flipbook"`. */
|
|
74
74
|
ariaLabel?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Lazy-load mode. When `true`, only the current page and its
|
|
77
|
+
* neighbours (see `preloadWindow`) are fetched + uploaded to the GPU;
|
|
78
|
+
* out-of-window pages are evicted from the texture cache via the
|
|
79
|
+
* runner's LRU policy. Default `false` — all pages eagerly resolved
|
|
80
|
+
* (preserves v0.1 behavior).
|
|
81
|
+
*
|
|
82
|
+
* Worth turning on for long flipbooks (>10–20 pages) or when driving
|
|
83
|
+
* the flipbook from a Next.js page where the homepage shouldn't block
|
|
84
|
+
* on dozens of image decodes. Works with URL string sources;
|
|
85
|
+
* `HTMLImageElement` / `HTMLCanvasElement` sources passed in still
|
|
86
|
+
* load up front (they're already in memory).
|
|
87
|
+
*/
|
|
88
|
+
lazy?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* In `lazy: true` mode, how many pages on each side of the current
|
|
91
|
+
* index to keep resident on the GPU. Default 1 — current page plus
|
|
92
|
+
* immediate prev/next are always loaded ahead of user navigation.
|
|
93
|
+
* Higher values trade GPU memory for fewer load stalls on rapid
|
|
94
|
+
* flips. Ignored when `lazy` is false.
|
|
95
|
+
*/
|
|
96
|
+
preloadWindow?: number;
|
|
75
97
|
}
|
|
76
98
|
|
|
77
99
|
export interface FlipOptions {
|