@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 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:
@@ -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;AAiBpB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAolBvE"}
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
- const runner = new Runner({ canvas });
103
- const ready = resolveAll(options.pages).then((resolved) => {
104
- resolvedPages = resolved;
105
- if (!destroyed)
106
- renderIdle();
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
- const page = resolvedPages[current];
111
- if (!page || destroyed)
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 = resolvedPages[earlier];
131
- const laterPage = resolvedPages[later];
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 < length)
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 ? length - 1 : null;
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 ${resolvedPages.length}`;
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 length = resolvedPages.length || options.pages.length;
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 ${resolvedPages.length}`;
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(resolvedPages.length - 1);
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 ${resolvedPages.length}`;
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 ${resolvedPages.length}`;
590
+ status.textContent = `Page ${current + 1} of ${pageCount}`;
490
591
  emit("change", current, previous);
491
592
  return;
492
593
  }
@@ -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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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.1.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.1.0",
34
- "@vysmo/transitions": "0.1.0",
35
- "@vysmo/easings": "0.1.0"
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
- const runner = new Runner({ canvas });
132
-
133
- const ready = resolveAll(options.pages).then((resolved) => {
134
- resolvedPages = resolved;
135
- if (!destroyed) renderIdle();
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
- const page = resolvedPages[current];
142
- if (!page || destroyed) return;
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 = resolvedPages[earlier];
167
- const laterPage = resolvedPages[later];
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 < length) return 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 ? length - 1 : null;
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 ${resolvedPages.length}`;
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 length = resolvedPages.length || options.pages.length;
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 ${resolvedPages.length}`;
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(resolvedPages.length - 1);
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 ${resolvedPages.length}`;
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 ${resolvedPages.length}`;
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 {