postext-folio 0.0.0-stage → 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.
@@ -0,0 +1,95 @@
1
+ import { type PageSource } from "./pageFlip";
2
+ /** A page of the book: its source, or its source with a text alternative. */
3
+ export type FolioPage = PageSource | {
4
+ src: PageSource;
5
+ alt?: string;
6
+ };
7
+ export interface FolioLabels {
8
+ /** The viewer's accessible name. */
9
+ region: string;
10
+ prev: string;
11
+ next: string;
12
+ /** The pages on show, for the live count under the book: page indexes
13
+ * (0-based) and the page count. */
14
+ count: (pages: number[], total: number) => string;
15
+ }
16
+ export interface FolioOptions {
17
+ pages: FolioPage[];
18
+ /** Whether the first page is a recto (it opens alone, on the right of a
19
+ * left-bound book). Default true. */
20
+ firstPageRecto?: boolean;
21
+ /** The edge the book is bound on. A right-bound book lies mirrored: page
22
+ * 1 alone on the left, pairs [3 | 2], and its pages turn leftward. */
23
+ binding?: "left" | "right";
24
+ /** The page to open on (0-based). Default 0. */
25
+ at?: number;
26
+ /** `double` shows spreads and turns leaves in 3D; `single` one page at a
27
+ * time; `auto` (default) is single in a box narrower than 560 px. */
28
+ mode?: "auto" | "single" | "double";
29
+ /** A page's width / height, when the pages cannot tell it yet (blank
30
+ * until painted). Default: the first sized page's, else 1 : √2. */
31
+ aspect?: number;
32
+ /** The colour of blank pages (any CSS colour). Default white. */
33
+ paper?: string;
34
+ /** Turns leaves in 3D when WebGL2 is there and the reader has not asked
35
+ * for reduced motion. Default true. */
36
+ animate?: boolean;
37
+ /** Draws the ‹ › buttons and the page count. Default true. */
38
+ controls?: boolean;
39
+ labels?: Partial<FolioLabels>;
40
+ /** Told of every spread that settles: its index and the pages on show. */
41
+ onChange?: (state: FolioState) => void;
42
+ /** Told as soon as the book is sent to another spread (a button, a key,
43
+ * a page let go past halfway), before its leaves have landed. */
44
+ onTarget?: (state: FolioState) => void;
45
+ /** Told when the page slots change size: a host painting pages for the
46
+ * viewer paints them at `deviceWidth` × `deviceHeight` pixels, so they
47
+ * are shown 1:1 both at rest and on a turning leaf. */
48
+ onLayout?: (size: FolioPageSize) => void;
49
+ }
50
+ /** One page slot of the spread: its CSS size, and the device pixels it
51
+ * covers (the size a page bitmap is shown 1:1 at). */
52
+ export interface FolioPageSize {
53
+ width: number;
54
+ height: number;
55
+ deviceWidth: number;
56
+ deviceHeight: number;
57
+ }
58
+ export interface FolioState {
59
+ spread: number;
60
+ /** The page indexes on show (one or two). */
61
+ pages: number[];
62
+ }
63
+ export interface FolioViewer {
64
+ /** The viewer's root element. */
65
+ readonly element: HTMLElement;
66
+ /** Turns to the spread that shows page `index`. */
67
+ goToPage(index: number): void;
68
+ /** Turns to spread `index`. */
69
+ goToSpread(index: number): void;
70
+ next(): void;
71
+ prev(): void;
72
+ /** Replaces the pages (a relayout, or more pages painted), staying on
73
+ * the page on show unless `at` says otherwise. */
74
+ setPages(pages: FolioPage[], options?: Pick<FolioOptions, "firstPageRecto" | "binding" | "at" | "paper" | "mode">): void;
75
+ /** The page slot's size, as last laid out. */
76
+ readonly pageSize: FolioPageSize;
77
+ /** Swaps the labels (a host that changes language). */
78
+ setLabels(labels: Partial<FolioLabels>): void;
79
+ readonly state: FolioState;
80
+ dispose(): void;
81
+ }
82
+ /** Below this width (px) `mode: 'auto'` shows one page at a time. */
83
+ export declare const SINGLE_BELOW = 560;
84
+ /**
85
+ * A book on the page: the pages in spreads by the recto rule, turned with
86
+ * the ‹ › buttons, ←/→, a swipe, a click on a page, or taken by hand and
87
+ * dragged over, the leaves curling in three.js with their shadows. The
88
+ * WebGL canvas draws the book still and turning alike, so a page never
89
+ * changes look when it lands; the DOM pages under it (images or canvases)
90
+ * are its textures' sources and the pages' text alternatives. Without
91
+ * WebGL2, or with reduced motion, the DOM pages show and the spreads
92
+ * simply change.
93
+ */
94
+ export declare function createFolio(container: HTMLElement, options: FolioOptions): FolioViewer;
95
+ //# sourceMappingURL=viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"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"}
package/dist/viewer.js ADDED
@@ -0,0 +1,442 @@
1
+ import { canFlip, PageFlipper } from "./pageFlip";
2
+ import { spreadOfPage, spreadsOf } from "./spreads";
3
+ import { injectStyles } from "./styles";
4
+ const DEFAULT_LABELS = {
5
+ region: "Book",
6
+ prev: "Previous pages",
7
+ next: "Next pages",
8
+ count: (pages, total) => pages.length > 1 ? `Pages ${pages[0] + 1}–${pages[pages.length - 1] + 1} of ${total}` : `Page ${(pages[0] ?? 0) + 1} of ${total}`,
9
+ };
10
+ /** A press on a page that moves less than this (px) is a click: it turns
11
+ * the page (the recto forward, the verso back). */
12
+ const CLICK_SLOP = 6;
13
+ /** A horizontal swipe longer than this (px) turns the spread. */
14
+ const SWIPE = 40;
15
+ /** Below this width (px) `mode: 'auto'` shows one page at a time. */
16
+ export const SINGLE_BELOW = 560;
17
+ /** Space kept round the book (CSS px): beside it for the ‹ › buttons, and
18
+ * above and below it for the page count (and a lifted leaf's corner). */
19
+ const GAP = 12;
20
+ const MIN_MARGIN_Y = 20;
21
+ const CHEVRON = (dir) => `<svg aria-hidden="true" viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="${dir === "left" ? "m15 18-6-6 6-6" : "m9 18 6-6-6-6"}"/></svg>`;
22
+ const sourceOf = (page) => (page && typeof page === "object" && "src" in page ? page.src : (page ?? null));
23
+ const altOf = (page) => (page && typeof page === "object" && "src" in page ? page.alt : undefined);
24
+ /** The natural width / height of a page source, when it is known. */
25
+ function aspectOf(src) {
26
+ if (!src || typeof src === "string")
27
+ return null;
28
+ const w = src instanceof HTMLCanvasElement ? src.width : src.naturalWidth;
29
+ const h = src instanceof HTMLCanvasElement ? src.height : src.naturalHeight;
30
+ return w > 0 && h > 0 ? w / h : null;
31
+ }
32
+ /** A CSS colour as 0 … 1 channels. */
33
+ function rgbOf(color) {
34
+ const ctx = document.createElement("canvas").getContext("2d");
35
+ if (!ctx)
36
+ return null;
37
+ ctx.fillStyle = "#fff";
38
+ ctx.fillStyle = color;
39
+ ctx.fillRect(0, 0, 1, 1);
40
+ const d = ctx.getImageData(0, 0, 1, 1).data;
41
+ return [d[0] / 255, d[1] / 255, d[2] / 255];
42
+ }
43
+ /**
44
+ * A book on the page: the pages in spreads by the recto rule, turned with
45
+ * the ‹ › buttons, ←/→, a swipe, a click on a page, or taken by hand and
46
+ * dragged over, the leaves curling in three.js with their shadows. The
47
+ * WebGL canvas draws the book still and turning alike, so a page never
48
+ * changes look when it lands; the DOM pages under it (images or canvases)
49
+ * are its textures' sources and the pages' text alternatives. Without
50
+ * WebGL2, or with reduced motion, the DOM pages show and the spreads
51
+ * simply change.
52
+ */
53
+ export function createFolio(container, options) {
54
+ injectStyles(container);
55
+ let labels = { ...DEFAULT_LABELS, ...options.labels };
56
+ let pages = options.pages;
57
+ let firstPageRecto = options.firstPageRecto ?? true;
58
+ let binding = options.binding ?? "left";
59
+ let mode = options.mode ?? "auto";
60
+ let paper = options.paper ?? "#fff";
61
+ const animate = options.animate ?? true;
62
+ const controls = options.controls ?? true;
63
+ const root = document.createElement("div");
64
+ root.className = "postext-folio";
65
+ root.tabIndex = 0;
66
+ root.setAttribute("role", "group");
67
+ root.setAttribute("aria-roledescription", "carousel");
68
+ const prevBtn = document.createElement("button");
69
+ const nextBtn = document.createElement("button");
70
+ for (const btn of [prevBtn, nextBtn]) {
71
+ btn.type = "button";
72
+ btn.className = "postext-folio-nav";
73
+ }
74
+ const spreadEl = document.createElement("div");
75
+ spreadEl.className = "postext-folio-spread";
76
+ const count = document.createElement("p");
77
+ count.className = "postext-folio-count";
78
+ count.setAttribute("aria-live", "polite");
79
+ prevBtn.classList.add("is-prev");
80
+ nextBtn.classList.add("is-next");
81
+ root.append(spreadEl, prevBtn, nextBtn);
82
+ if (controls)
83
+ root.append(count);
84
+ else
85
+ prevBtn.hidden = nextBtn.hidden = true;
86
+ container.append(root);
87
+ let single = false;
88
+ let spreads = [];
89
+ let current = 0;
90
+ let shown = 0;
91
+ let flipper = null;
92
+ let flipCanvas = null;
93
+ let holding = null;
94
+ let press = null;
95
+ let swipe = null;
96
+ let disposed = false;
97
+ let slot = { width: 0, height: 0, deviceWidth: 0, deviceHeight: 0 };
98
+ const rtl = () => binding === "right";
99
+ const pagesOf = (s) => (s ?? [null, null]).filter((i) => i !== null);
100
+ const bookOf = () => spreads.map((s) => s.map((i) => (i === null ? null : sourceOf(pages[i]))));
101
+ function aspect() {
102
+ if (options.aspect)
103
+ return options.aspect;
104
+ for (const page of pages) {
105
+ const ar = aspectOf(sourceOf(page));
106
+ if (ar)
107
+ return ar;
108
+ }
109
+ return 1 / Math.SQRT2;
110
+ }
111
+ /**
112
+ * Fits the book into the box, as large as it goes: the ‹ › buttons and
113
+ * the count sit in the margins round it. The spread lies on the device
114
+ * pixel grid, its page slots a whole number of device pixels wide, so a
115
+ * page painted at that size is shown 1:1 in the DOM and on the canvas
116
+ * alike. The WebGL canvas covers the box, centred on the spread (the
117
+ * camera maps the spread onto it 1:1), with room for a lifted leaf.
118
+ */
119
+ function fit() {
120
+ const dpr = window.devicePixelRatio || 1;
121
+ const box = root.getBoundingClientRect();
122
+ const across = single ? 1 : 2;
123
+ const ar = aspect();
124
+ const marginX = controls ? prevBtn.offsetWidth + 2 * GAP : GAP;
125
+ const marginY = Math.max(MIN_MARGIN_Y, controls ? count.offsetHeight + 2 * GAP : GAP);
126
+ const availW = Math.max(0, box.width - 2 * marginX);
127
+ const availH = Math.max(0, box.height - 2 * marginY);
128
+ const slotCss = Math.min(availW / across, availH > 0 ? availH * ar : Infinity);
129
+ const deviceWidth = Math.max(1, Math.floor(slotCss * dpr));
130
+ const deviceHeight = Math.max(1, Math.round(deviceWidth / ar));
131
+ const boxW = Math.floor(box.width * dpr);
132
+ const boxH = Math.floor(box.height * dpr);
133
+ const left = Math.max(0, Math.floor((boxW - across * deviceWidth) / 2));
134
+ const top = Math.max(0, Math.floor((boxH - deviceHeight) / 2));
135
+ Object.assign(spreadEl.style, {
136
+ left: `${left / dpr}px`,
137
+ top: `${top / dpr}px`,
138
+ width: `${(across * deviceWidth) / dpr}px`,
139
+ height: `${deviceHeight / dpr}px`,
140
+ });
141
+ if (flipCanvas) {
142
+ // Symmetric about the spread, so the canvas centre is the spread's.
143
+ Object.assign(flipCanvas.style, {
144
+ left: "0px",
145
+ top: "0px",
146
+ width: `${(2 * left + across * deviceWidth) / dpr}px`,
147
+ height: `${(2 * top + deviceHeight) / dpr}px`,
148
+ });
149
+ }
150
+ const next = { width: deviceWidth / dpr, height: deviceHeight / dpr, deviceWidth, deviceHeight };
151
+ if (next.deviceWidth !== slot.deviceWidth || next.deviceHeight !== slot.deviceHeight) {
152
+ slot = next;
153
+ options.onLayout?.(slot);
154
+ }
155
+ flipper?.redraw();
156
+ }
157
+ function pageEl(i, slot) {
158
+ const el = document.createElement("div");
159
+ el.className = "postext-folio-page";
160
+ if (!single)
161
+ el.classList.add(slot === 0 ? "is-verso" : "is-recto");
162
+ const src = i === null ? null : sourceOf(pages[i]);
163
+ if (src === null) {
164
+ el.classList.add("is-empty");
165
+ el.setAttribute("aria-hidden", "true");
166
+ }
167
+ else if (src === "") {
168
+ el.classList.add("is-blank");
169
+ el.setAttribute("aria-hidden", "true");
170
+ }
171
+ else {
172
+ const alt = altOf(pages[i]) ?? "";
173
+ if (typeof src === "string") {
174
+ const img = document.createElement("img");
175
+ img.src = src;
176
+ img.alt = alt;
177
+ img.draggable = false;
178
+ img.decoding = "async";
179
+ el.append(img);
180
+ }
181
+ else {
182
+ // The page's own element (a canvas, or a decoded image), shown as is.
183
+ src.classList.add("postext-folio-surface");
184
+ if (src instanceof HTMLCanvasElement) {
185
+ src.setAttribute("role", "img");
186
+ if (alt)
187
+ src.setAttribute("aria-label", alt);
188
+ }
189
+ else {
190
+ src.alt = alt;
191
+ src.draggable = false;
192
+ }
193
+ el.append(src);
194
+ }
195
+ }
196
+ return el;
197
+ }
198
+ function render() {
199
+ const s = spreads[shown] ?? [null, null];
200
+ const slots = single ? [s[0] ?? s[1]] : s;
201
+ spreadEl.replaceChildren(...slots.map((i, side) => pageEl(i, side)));
202
+ spreadEl.classList.toggle("is-solo", single);
203
+ spreadEl.classList.toggle("is-by-hand", !!flipper);
204
+ // The canvas draws the book, still or turning; the DOM pages stay as
205
+ // the textures' sources and the pages' text alternatives.
206
+ spreadEl.classList.toggle("is-gl", !!flipper);
207
+ const on = pagesOf(spreads[current]);
208
+ count.textContent = on.length ? labels.count(on, pages.length) : "";
209
+ prevBtn.disabled = current <= 0;
210
+ nextBtn.disabled = current >= spreads.length - 1;
211
+ // The settled spread, drawn at rest.
212
+ flipper?.clear();
213
+ }
214
+ function settle(index) {
215
+ shown = index;
216
+ render();
217
+ options.onChange?.({ spread: index, pages: pagesOf(spreads[index]) });
218
+ }
219
+ function go(index) {
220
+ const to = Math.max(0, Math.min(spreads.length - 1, index));
221
+ if (to === current && to === shown)
222
+ return;
223
+ current = to;
224
+ options.onTarget?.({ spread: to, pages: pagesOf(spreads[to]) });
225
+ if (flipper) {
226
+ flipper.go(to);
227
+ // The count and buttons follow the hand at once.
228
+ count.textContent = labels.count(pagesOf(spreads[to]), pages.length);
229
+ prevBtn.disabled = to <= 0;
230
+ nextBtn.disabled = to >= spreads.length - 1;
231
+ }
232
+ else
233
+ settle(to);
234
+ }
235
+ function setUpFlipper() {
236
+ flipper?.dispose();
237
+ flipper = null;
238
+ flipCanvas?.remove();
239
+ flipCanvas = null;
240
+ if (single || !animate || spreads.length < 2 || !canFlip())
241
+ return;
242
+ flipCanvas = document.createElement("canvas");
243
+ flipCanvas.className = "postext-folio-flip";
244
+ flipCanvas.setAttribute("aria-hidden", "true");
245
+ root.append(flipCanvas);
246
+ flipper = new PageFlipper(flipCanvas, spreadEl, bookOf(), shown, settle, (i) => {
247
+ current = i;
248
+ options.onTarget?.({ spread: i, pages: pagesOf(spreads[i]) });
249
+ count.textContent = labels.count(pagesOf(spreads[i]), pages.length);
250
+ }, binding, { persistent: true });
251
+ const rgb = rgbOf(paper);
252
+ if (rgb)
253
+ flipper.setPaper(...rgb);
254
+ }
255
+ /** Lays the book out again: spreads, mode, flipper. */
256
+ function rebuild(atPage) {
257
+ single = mode === "single" || (mode === "auto" && root.clientWidth > 0 && root.clientWidth < SINGLE_BELOW);
258
+ spreads = single ? pages.map((_, i) => [null, i]) : spreadsOf(pages.length, firstPageRecto);
259
+ current = shown = spreadOfPage(spreads, atPage);
260
+ root.dir = rtl() ? "rtl" : "ltr";
261
+ root.style.setProperty("--postext-folio-paper", paper);
262
+ root.classList.toggle("is-single", single);
263
+ prevBtn.innerHTML = CHEVRON(rtl() ? "right" : "left");
264
+ nextBtn.innerHTML = CHEVRON(rtl() ? "left" : "right");
265
+ setUpFlipper();
266
+ fit();
267
+ render();
268
+ }
269
+ function applyLabels() {
270
+ root.setAttribute("aria-label", labels.region);
271
+ prevBtn.setAttribute("aria-label", labels.prev);
272
+ nextBtn.setAttribute("aria-label", labels.next);
273
+ }
274
+ // ── Input ──
275
+ prevBtn.addEventListener("click", () => go(current - 1));
276
+ nextBtn.addEventListener("click", () => go(current + 1));
277
+ root.addEventListener("keydown", (event) => {
278
+ if (event.target !== root)
279
+ return;
280
+ const forward = rtl() ? "ArrowLeft" : "ArrowRight";
281
+ const back = rtl() ? "ArrowRight" : "ArrowLeft";
282
+ if (event.key === back || event.key === "PageUp")
283
+ go(current - 1);
284
+ else if (event.key === forward || event.key === "PageDown")
285
+ go(current + 1);
286
+ else if (event.key === "Home")
287
+ go(0);
288
+ else if (event.key === "End")
289
+ go(spreads.length - 1);
290
+ else
291
+ return;
292
+ event.preventDefault();
293
+ });
294
+ root.addEventListener("pointerdown", (event) => {
295
+ if (event.pointerType !== "mouse")
296
+ swipe = { x: event.clientX, y: event.clientY };
297
+ });
298
+ root.addEventListener("pointerup", (event) => {
299
+ const start = swipe;
300
+ swipe = null;
301
+ if (!start)
302
+ return;
303
+ const dx = event.clientX - start.x;
304
+ if (Math.abs(dx) > SWIPE && Math.abs(dx) > Math.abs(event.clientY - start.y))
305
+ go(current + ((dx < 0) !== rtl() ? 1 : -1));
306
+ });
307
+ spreadEl.addEventListener("pointerdown", (event) => {
308
+ if (event.button !== 0 || holding)
309
+ return;
310
+ press = { x: event.clientX, y: event.clientY };
311
+ if (!flipper?.grab(event))
312
+ return;
313
+ event.preventDefault();
314
+ event.stopPropagation();
315
+ // The hold follows the pointer anywhere: the window hears it even if
316
+ // the capture is lost, and a move with the button up means the release
317
+ // was missed.
318
+ const id = event.pointerId;
319
+ const start = press;
320
+ const onMove = (e) => {
321
+ if (e.pointerId !== id)
322
+ return;
323
+ if ((e.buttons & 1) === 0)
324
+ end(false);
325
+ else
326
+ flipper?.drag(e);
327
+ };
328
+ const onUp = (e) => {
329
+ if (e.pointerId === id)
330
+ end(Math.hypot(e.clientX - start.x, e.clientY - start.y) < CLICK_SLOP);
331
+ };
332
+ const onCancel = (e) => {
333
+ if (e.pointerId === id)
334
+ end(false);
335
+ };
336
+ const onBlur = () => end(false);
337
+ const end = (click) => {
338
+ window.removeEventListener("pointermove", onMove);
339
+ window.removeEventListener("pointerup", onUp, true);
340
+ window.removeEventListener("pointercancel", onCancel);
341
+ window.removeEventListener("blur", onBlur);
342
+ spreadEl.classList.remove("is-held");
343
+ holding = null;
344
+ press = null;
345
+ flipper?.release(click);
346
+ };
347
+ window.addEventListener("pointermove", onMove);
348
+ // Captured, so the stage's swipe does not hear the hold's release.
349
+ window.addEventListener("pointerup", onUp, true);
350
+ window.addEventListener("pointercancel", onCancel);
351
+ window.addEventListener("blur", onBlur);
352
+ holding = end;
353
+ swipe = null;
354
+ spreadEl.classList.add("is-held");
355
+ try {
356
+ spreadEl.setPointerCapture(id);
357
+ }
358
+ catch {
359
+ // The window listeners carry the hold without it.
360
+ }
361
+ });
362
+ spreadEl.addEventListener("pointerup", (event) => {
363
+ if (holding)
364
+ return;
365
+ const start = press;
366
+ press = null;
367
+ const click = !!start && Math.hypot(event.clientX - start.x, event.clientY - start.y) < CLICK_SLOP;
368
+ if (!click || !event.target.closest(".postext-folio-page:not(.is-empty)"))
369
+ return;
370
+ // A click on the recto turns forward, on the verso back (pages already
371
+ // in the air: it joins them).
372
+ const rect = spreadEl.getBoundingClientRect();
373
+ swipe = null;
374
+ if (single)
375
+ go(current + 1);
376
+ else
377
+ go(current + ((event.clientX > rect.left + rect.width / 2) !== rtl() ? 1 : -1));
378
+ });
379
+ let lastWidth = -1;
380
+ const observer = new ResizeObserver(() => {
381
+ if (disposed)
382
+ return;
383
+ const w = root.clientWidth;
384
+ const wasSingle = single;
385
+ const nowSingle = mode === "single" || (mode === "auto" && w > 0 && w < SINGLE_BELOW);
386
+ if (lastWidth >= 0 && nowSingle !== wasSingle)
387
+ rebuild(pagesOf(spreads[shown])[0] ?? 0);
388
+ else
389
+ fit();
390
+ lastWidth = w;
391
+ });
392
+ observer.observe(root);
393
+ applyLabels();
394
+ rebuild(options.at ?? 0);
395
+ return {
396
+ element: root,
397
+ goToPage: (index) => go(spreadOfPage(spreads, index)),
398
+ goToSpread: go,
399
+ next: () => go(current + 1),
400
+ prev: () => go(current - 1),
401
+ setLabels(next) {
402
+ labels = { ...labels, ...next };
403
+ applyLabels();
404
+ render();
405
+ },
406
+ get pageSize() {
407
+ return slot;
408
+ },
409
+ get state() {
410
+ return { spread: current, pages: pagesOf(spreads[current]) };
411
+ },
412
+ setPages(next, opts = {}) {
413
+ const atPage = opts.at ?? pagesOf(spreads[shown])[0] ?? 0;
414
+ const relayout = next.length !== pages.length ||
415
+ (opts.firstPageRecto ?? firstPageRecto) !== firstPageRecto ||
416
+ (opts.binding ?? binding) !== binding ||
417
+ (opts.mode ?? mode) !== mode ||
418
+ (opts.paper ?? paper) !== paper;
419
+ pages = next;
420
+ firstPageRecto = opts.firstPageRecto ?? firstPageRecto;
421
+ binding = opts.binding ?? binding;
422
+ mode = opts.mode ?? mode;
423
+ paper = opts.paper ?? paper;
424
+ if (relayout)
425
+ return rebuild(atPage);
426
+ // Same spreads: the leaves take their new pages where they lie.
427
+ flipper?.setBook(bookOf(), opts.at !== undefined ? spreadOfPage(spreads, opts.at) : undefined);
428
+ if (opts.at !== undefined)
429
+ current = shown = spreadOfPage(spreads, opts.at);
430
+ fit();
431
+ render();
432
+ },
433
+ dispose() {
434
+ disposed = true;
435
+ observer.disconnect();
436
+ holding?.(false);
437
+ flipper?.dispose();
438
+ root.remove();
439
+ },
440
+ };
441
+ }
442
+ //# sourceMappingURL=viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,57 @@
1
1
  {
2
2
  "name": "postext-folio",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "A 3D book viewer for Postext documents and page images: three.js leaves that curl, cast real shadows and turn by hand, for left- and right-bound books.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "homepage": "https://postext.dev/",
8
+ "keywords": [
9
+ "postext",
10
+ "flipbook",
11
+ "page-flip",
12
+ "page-curl",
13
+ "book",
14
+ "three",
15
+ "webgl",
16
+ "viewer",
17
+ "typography"
18
+ ],
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/drnachio/postext.git",
22
+ "directory": "packages/postext-folio"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "sideEffects": false,
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.js"
32
+ },
33
+ "./package.json": "./package.json"
34
+ },
35
+ "peerDependencies": {
36
+ "postext": "^1.12.0",
37
+ "three": ">=0.160.0"
38
+ },
39
+ "devDependencies": {
40
+ "@postext/typescript-config": "0.0.0",
41
+ "@types/node": "^26.5.0",
42
+ "@types/three": "^0.186.0",
43
+ "eslint": "^9.39.4",
44
+ "postext": "1.12.0",
45
+ "three": "^0.186.1",
46
+ "typescript": "^6.0.3",
47
+ "typescript-eslint": "^8.70.0",
48
+ "vitest": "^5.0.0"
49
+ },
50
+ "scripts": {
51
+ "build": "rm -rf dist && tsc",
52
+ "dev": "tsc --watch",
53
+ "check-types": "tsc --noEmit",
54
+ "lint": "eslint .",
55
+ "test": "vitest run"
56
+ }
6
57
  }