@zinejs/core 0.4.0 → 0.6.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 +12 -1
- package/dist/controls/arrows.d.ts +17 -0
- package/dist/controls/builtins.d.ts +8 -0
- package/dist/controls/controls.d.ts +14 -0
- package/dist/controls/icons.d.ts +51 -0
- package/dist/controls/outline.d.ts +14 -0
- package/dist/controls/qr.d.ts +16 -0
- package/dist/controls/registry.d.ts +21 -0
- package/dist/controls/search.d.ts +13 -0
- package/dist/controls/share.d.ts +13 -0
- package/dist/controls/sidebar.d.ts +24 -0
- package/dist/controls/socials.d.ts +16 -0
- package/dist/controls/styles.d.ts +3 -0
- package/dist/controls/thumbnails.d.ts +17 -0
- package/dist/controls/toolbar.d.ts +45 -0
- package/dist/controls/types.d.ts +81 -0
- package/dist/controls-BrPo8pKL.js +649 -0
- package/dist/controls-BrPo8pKL.js.map +1 -0
- package/dist/engine/deeplink.d.ts +18 -0
- package/dist/engine/emitter.d.ts +6 -0
- package/dist/engine/zoomTile.d.ts +65 -0
- package/dist/icons-D87p7JMP.js +29 -0
- package/dist/icons-D87p7JMP.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +765 -348
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +533 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/registry-5nuYFMd4.js +36 -0
- package/dist/registry-5nuYFMd4.js.map +1 -0
- package/dist/share-CyrZiFqf.js +283 -0
- package/dist/share-CyrZiFqf.js.map +1 -0
- package/dist/source/types.d.ts +61 -2
- package/dist/zine.d.ts +161 -3
- package/options.schema.json +53 -0
- package/package.json +15 -3
- package/dist/index.umd.cjs +0 -91
- package/dist/index.umd.cjs.map +0 -1
package/options.schema.json
CHANGED
|
@@ -121,6 +121,59 @@
|
|
|
121
121
|
"minimum": 0,
|
|
122
122
|
"default": 640,
|
|
123
123
|
"description": "Container widths (px) below this switch to one page per spread; 0 disables the responsive fallback."
|
|
124
|
+
},
|
|
125
|
+
"deepLink": {
|
|
126
|
+
"type": "boolean",
|
|
127
|
+
"default": true,
|
|
128
|
+
"description": "Keep the current page in the URL hash (#page=12), so a link opens where the reader was. Only the 'page' key is touched."
|
|
129
|
+
},
|
|
130
|
+
"responsiveSpread": {
|
|
131
|
+
"type": "boolean",
|
|
132
|
+
"default": true,
|
|
133
|
+
"description": "Whether a narrow container may override spreadMode and show one page at a time. False holds the configured mode at every width."
|
|
134
|
+
},
|
|
135
|
+
"disableContextMenu": {
|
|
136
|
+
"type": "boolean",
|
|
137
|
+
"default": false,
|
|
138
|
+
"description": "Suppress the browser's right-click menu over the book. A deterrent, not protection: the pages remain in the DOM."
|
|
139
|
+
},
|
|
140
|
+
"controls": {
|
|
141
|
+
"default": true,
|
|
142
|
+
"description": "Built-in toolbar. true for the default set, false for none, or an object to configure it.",
|
|
143
|
+
"oneOf": [
|
|
144
|
+
{ "type": "boolean" },
|
|
145
|
+
{
|
|
146
|
+
"type": "object",
|
|
147
|
+
"additionalProperties": false,
|
|
148
|
+
"properties": {
|
|
149
|
+
"position": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"enum": ["top", "bottom", "left", "right"],
|
|
152
|
+
"default": "bottom",
|
|
153
|
+
"description": "Which edge of the book the toolbar sits on."
|
|
154
|
+
},
|
|
155
|
+
"docked": {
|
|
156
|
+
"type": "boolean",
|
|
157
|
+
"default": true,
|
|
158
|
+
"description": "Sit outside the book in normal flow; false floats the toolbar over it."
|
|
159
|
+
},
|
|
160
|
+
"items": {
|
|
161
|
+
"type": "array",
|
|
162
|
+
"description": "Toolbar layout: control ids, '|' separators, or inline control definitions. Omit for the default set.",
|
|
163
|
+
"items": { "type": ["string", "object"] }
|
|
164
|
+
},
|
|
165
|
+
"arrows": {
|
|
166
|
+
"type": "boolean",
|
|
167
|
+
"default": true,
|
|
168
|
+
"description": "Large page-turn arrows flanking the book."
|
|
169
|
+
},
|
|
170
|
+
"className": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"description": "Extra class on the toolbar root, for styling."
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
]
|
|
124
177
|
}
|
|
125
178
|
}
|
|
126
179
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zinejs/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Framework-agnostic flipbook engine with CSS and WebGL2 renderers and no dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
],
|
|
28
28
|
"types": "./dist/index.d.ts",
|
|
29
29
|
"module": "./dist/index.js",
|
|
30
|
-
"main": "./dist/index.umd.
|
|
30
|
+
"main": "./dist/index.umd.js",
|
|
31
31
|
"exports": {
|
|
32
32
|
".": {
|
|
33
33
|
"types": "./dist/index.d.ts",
|
|
34
34
|
"import": "./dist/index.js",
|
|
35
|
-
"require": "./dist/index.umd.
|
|
35
|
+
"require": "./dist/index.umd.js"
|
|
36
36
|
},
|
|
37
37
|
"./options.schema.json": "./options.schema.json"
|
|
38
38
|
},
|
|
@@ -57,6 +57,18 @@
|
|
|
57
57
|
"path": "dist/webglRenderer-*.js",
|
|
58
58
|
"limit": "12 kB",
|
|
59
59
|
"gzip": true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "controls chunk (lazy, gzip)",
|
|
63
|
+
"path": "dist/controls-*.js",
|
|
64
|
+
"limit": "10 kB",
|
|
65
|
+
"gzip": true
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "share dialog chunk (lazy, gzip)",
|
|
69
|
+
"path": "dist/share-*.js",
|
|
70
|
+
"limit": "6 kB",
|
|
71
|
+
"gzip": true
|
|
60
72
|
}
|
|
61
73
|
],
|
|
62
74
|
"scripts": {
|
package/dist/index.umd.cjs
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ZineJS={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.defineProperty,n=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},r=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r};function i(e,t={}){let{direction:n=`ltr`,mode:r=`cover`}=t;if(e<=0)return[];let i=t=>t>=0&&t<e?t:null,a=[];if(r===`single`)for(let t=0;t<e;t++)a.push({left:null,right:t});else if(r===`double`)for(let t=0;t<e;t+=2)a.push({left:i(t),right:i(t+1)});else if(r===`cover`){a.push({left:null,right:0});for(let t=1;t<e;t+=2)a.push({left:i(t),right:i(t+1)})}else if(a.push({left:null,right:0}),e>1){for(let t=1;t<=e-2;t+=2)a.push({left:i(t),right:t+1<=e-2?i(t+1):null});a.push({left:e-1,right:null})}return n===`rtl`?a.map(e=>({left:e.right,right:e.left})):a}function a(e,t){return e<t}function o(e,t,n){let r=[],i=Math.max(0,e-n),a=Math.min(t-1,e+n);for(let e=i;e<=a;e++)r.push(e);return r}var s=class{#e;#t=new Set;constructor(e=2){this.#e=e}get mounted(){return[...this.#t].sort((e,t)=>e-t)}update(e,t){let n=new Set(o(e,t,this.#e)),r=[...n].filter(e=>!this.#t.has(e)).sort((e,t)=>e-t),i=[...this.#t].filter(e=>!n.has(e)).sort((e,t)=>e-t);for(let e of i)this.#t.delete(e);for(let e of r)this.#t.add(e);return{toMount:r,toEvict:i}}},c=class{#e=new Map;on(e,t){let n=this.#e.get(e);return n||(n=new Set,this.#e.set(e,n)),n.add(t),()=>this.off(e,t)}off(e,t){this.#e.get(e)?.delete(t)}emit(e,...t){let n=t[0],r=this.#e.get(e);if(r)for(let e of[...r])e(n)}clear(){this.#e.clear()}},l={idle:{grab:`dragging`,panStart:`zoomed-panning`,flip:`animating`},dragging:{release:`animating`},animating:{settle:`idle`},"zoomed-panning":{panEnd:`idle`}};function u(e,t){return l[e][t]??null}var d=class{#e;constructor(e=`idle`){this.#e=e}get state(){return this.#e}send(e){let t=u(this.#e,e);return t!==null&&(this.#e=t),t}},f=.3,p=class{#e;#t=null;#n=null;#r=null;#i=null;constructor(e={}){this.#e=e}get active(){return this.#t!==null}down(e,t,n,r){if(this.#t!==null)return;this.#t=e;let i={x:t,y:n,t:r};this.#n=i,this.#r=i,this.#i=i,this.#e.onStart?.({x:t,y:n,t:r})}move(e,t,n,r){e!==this.#t||this.#n===null||(this.#r=this.#i,this.#i={x:t,y:n,t:r},this.#e.onMove?.({x:t,y:n,dx:t-this.#n.x,dy:n-this.#n.y}))}up(e,t,n,r){this.#a(e,t,n,r,!1)}cancel(e,t,n,r){this.#a(e,t,n,r,!0)}#a(e,t,n,r,i){if(e!==this.#t||this.#n===null)return;let a=this.#n,o=this.#i??a,s=this.#r??a,c=o.t-s.t,l=c>0?(o.x-s.x)/c:0,u=c>0?(o.y-s.y)/c:0,d=Math.hypot(l,u);this.#o(),this.#e.onEnd?.({x:t,y:n,dx:t-a.x,dy:n-a.y,dt:r-a.t,vx:l,vy:u,swipe:!i&&d>f,canceled:i})}#o(){this.#t=null,this.#n=null,this.#r=null,this.#i=null}};function m(e,t){let{pointer:n,pinch:r}=t,i=e=>{let t=e;n?.down(t.pointerId,t.clientX,t.clientY,t.timeStamp),r?.down(t.pointerId,t.clientX,t.clientY)},a=e=>{let t=e;n?.move(t.pointerId,t.clientX,t.clientY,t.timeStamp),r?.move(t.pointerId,t.clientX,t.clientY)},o=e=>{let t=e;n?.up(t.pointerId,t.clientX,t.clientY,t.timeStamp),r?.up(t.pointerId)},s=e=>{let t=e;n?.cancel(t.pointerId,t.clientX,t.clientY,t.timeStamp),r?.cancel(t.pointerId)};return e.addEventListener(`pointerdown`,i),e.addEventListener(`pointermove`,a),e.addEventListener(`pointerup`,o),e.addEventListener(`pointercancel`,s),()=>{e.removeEventListener(`pointerdown`,i),e.removeEventListener(`pointermove`,a),e.removeEventListener(`pointerup`,o),e.removeEventListener(`pointercancel`,s)}}function h(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}var g=class{#e;#t=new Map;#n=0;#r=!1;constructor(e={}){this.#e=e}get pinching(){return this.#r}down(e,t,n){if(!(this.#t.has(e)||this.#t.size>=2)&&(this.#t.set(e,{x:t,y:n}),this.#t.size===2)){let{a:e,b:t}=this.#a();this.#n=h(e,t),this.#r=!0,this.#e.onPinchStart?.({centerX:(e.x+t.x)/2,centerY:(e.y+t.y)/2,distance:this.#n})}}move(e,t,n){let r=this.#t.get(e);if(!r||(r.x=t,r.y=n,!this.#r))return;let{a:i,b:a}=this.#a();this.#e.onPinchMove?.({centerX:(i.x+a.x)/2,centerY:(i.y+a.y)/2,scale:this.#n>0?h(i,a)/this.#n:1})}up(e){this.#i(e)}cancel(e){this.#i(e)}#i(e){this.#t.delete(e)&&this.#r&&this.#t.size<2&&(this.#r=!1,this.#n=0,this.#e.onPinchEnd?.())}#a(){let e=[...this.#t.values()],t=e[0],n=e[1];if(!t||!n)throw Error(`pinch requires two active pointers`);return{a:t,b:n}}};function _(e,t,n){let{width:r,height:i}=t;if(e.x<0||e.x>r||e.y<0||e.y>i)return`outside`;let a=e.x<=n||e.x>=r-n,o=e.y<=n||e.y>=i-n;return a&&o?`corner`:`page`}var v,y,b=n((()=>{v=[`roll`,`cone`,`leaf`,`flick`,`silk`,`simple`],y=`cone`}));function x(e){let t=e<0?0:e>1?1:e,n=Math.sin(t*Math.PI);return{angle:t*Math.PI,curl:n,shadowAlpha:n}}var S=n((()=>{})),C=r({CssRenderer:()=>D});function w(e){return e.left===null==(e.right===null)?0:e.right===null?1:-1}function T(e){let t=e===`forward`?`to right`:`to left`;return[`linear-gradient(${t}, rgba(0,0,0,0.6), rgba(0,0,0,0.15) 40%, rgba(0,0,0,0) 60%)`,`linear-gradient(${t}, transparent 40%, rgba(255,255,255,0.32) 66%, transparent 90%)`,`linear-gradient(${t}, transparent 66%, rgba(0,0,0,0.35))`].join(`,`)}var E,D,ee=n((()=>{S(),E=180/Math.PI,D=class{#e=null;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u=0;#d=0;#f=0;#p=0;#m=!1;#h=0;mount(e){let t=e.ownerDocument;return this.#e=e,this.#t=t.createElement(`div`),this.#t.className=`zine-clip`,this.#t.style.cssText=`position:relative;width:100%;height:100%;overflow:hidden;`,this.#n=t.createElement(`div`),this.#n.className=`zine-viewport`,this.#n.style.cssText=`position:absolute;inset:0;transform-origin:0 0;`,this.#r=t.createElement(`div`),this.#r.className=`zine-book`,this.#r.style.cssText=`position:absolute;inset:0;perspective:2000px;transform-style:preserve-3d;`,this.#i=this.#x(t,`zine-page-left`,`left:0;`),this.#a=this.#x(t,`zine-page-right`,`right:0;`),this.#o=t.createElement(`div`),this.#o.className=`zine-leaf`,this.#o.style.cssText=`position:absolute;top:0;width:50%;height:100%;transform-style:preserve-3d;display:none;`,this.#s=t.createElement(`canvas`),this.#s.className=`zine-leaf-front`,this.#s.style.cssText=`position:absolute;inset:0;width:100%;height:100%;backface-visibility:hidden;`,this.#c=t.createElement(`canvas`),this.#c.className=`zine-leaf-back`,this.#c.style.cssText=`position:absolute;inset:0;width:100%;height:100%;backface-visibility:hidden;transform:rotateY(180deg);`,this.#l=t.createElement(`div`),this.#l.className=`zine-leaf-shadow`,this.#l.style.cssText=`position:absolute;inset:0;opacity:0;pointer-events:none;`,this.#l.style.background=T(`forward`),this.#o.append(this.#s,this.#c,this.#l),this.#r.append(this.#i,this.#a,this.#o),this.#n.append(this.#r),this.#t.append(this.#n),e.append(this.#t),Promise.resolve()}destroy(){this.#t?.remove(),this.#e=null}renderSpread(e,t,n){n?.fill?(this.#i.style.width=`100%`,this.#a.style.display=`none`,this.#S(this.#i,t.right??t.left)):(this.#i.style.width=`50%`,this.#a.style.display=``,this.#S(this.#i,t.left),this.#S(this.#a,t.right)),this.#m=n?.fill??!1,this.#h=this.#m?0:w(t),this.#_(t),this.#v(),this.#g(this.#h),this.#o.style.display=`none`,this.#o.style.transform=``,this.#l.style.opacity=`0`}beginFlip(e,t,n,r){r?.fill?(this.#i.style.width=`100%`,this.#a.style.display=`none`,this.#o.style.width=`100%`,this.#o.style.left=`0`,this.#o.style.transformOrigin=n===`forward`?`left center`:`right center`,this.#S(this.#i,t.right??t.left),this.#S(this.#s,e.right??e.left),this.#S(this.#c,t.right??t.left)):(this.#i.style.width=`50%`,this.#a.style.display=``,this.#o.style.width=`50%`,n===`forward`?(this.#S(this.#i,e.left),this.#S(this.#a,t.right),this.#S(this.#s,e.right),this.#S(this.#c,t.left),this.#o.style.left=`50%`,this.#o.style.transformOrigin=`left center`):(this.#S(this.#a,e.right),this.#S(this.#i,t.left),this.#S(this.#s,e.left),this.#S(this.#c,t.right),this.#o.style.left=`0`,this.#o.style.transformOrigin=`right center`)),this.#u=r?.fill?0:w(e),this.#d=r?.fill?0:w(t),this.#m=r?.fill??!1,this.#_(t),this.#v(),this.#g(this.#u),this.#o.style.display=`block`,this.#o.style.transform=`rotateY(0deg)`,this.#l.style.background=T(n),this.#l.style.opacity=`0`}setFlipProgress(e,t){let n=x(e),r=n.angle*E;this.#g(this.#u+(this.#d-this.#u)*e),this.#o.style.display=`block`,this.#o.style.transform=`rotateY(${t===`forward`?-r:r}deg)`,this.#l.style.opacity=String(n.shadowAlpha)}#g(e){let t=e*(this.#p/4);this.#r.style.transform=t?`translateX(${t}px)`:``}#_(e){let t=e.left??e.right;t&&t.height&&(this.#f=t.width/t.height)}#v(){let e=this.#y();this.#p=e.width;let t=this.#r.style;t.inset=`auto`,t.left=`${e.x}px`,t.top=`${e.y}px`,t.width=`${e.width}px`,t.height=`${e.height}px`}#y(){let e=this.#e?.clientWidth??0,t=this.#e?.clientHeight??0;if(this.#f<=0||e<=0||t<=0)return{x:0,y:0,width:e,height:t};let n=(this.#m?1:2)*this.#f,r=e,i=t;return n>e/t?i=e/n:r=t*n,{x:(e-r)/2,y:(t-i)/2,width:r,height:i}}#b(){let e=this.#y();return this.#h===0?e:{x:e.x+e.width/4,y:e.y,width:e.width/2,height:e.height}}setViewTransform(e,t,n){this.#n.style.transform=`translate(${t}px, ${n}px) scale(${e})`}measure(){let e=this.#e,t=e?.clientWidth??0,n=e?.clientHeight??0,r=this.#f>0,i=r?this.#y():void 0,a=r?this.#b():void 0;return{containerWidth:t,containerHeight:n,pageWidth:t/2,pageHeight:n,book:i,content:a}}#x(e,t,n){let r=e.createElement(`canvas`);return r.className=t,r.style.cssText=`position:absolute;top:0;width:50%;height:100%;${n}`,r}#S(e,t){let n=e.getContext(`2d`);if(t===null){n?.clearRect(0,0,e.width,e.height);return}e.width=t.width,e.height=t.height,n?.drawImage(t,0,0)}}}));function te(e,t){let n=e+1,r=t+1,i=n*r,a=new Float32Array(i*2);for(let i=0;i<r;i++)for(let r=0;r<n;r++){let o=i*n+r;a[o*2]=r/e,a[o*2+1]=i/t}return{cols:e,rows:t,uvs:a,positions:new Float32Array(i*3),normals:new Float32Array(i*3)}}function O(e){let t=e.cols+1,n=e.rows+1,r=e.positions,i=e.normals;for(let e=0;e<n;e++)for(let a=0;a<t;a++){let o=a>0?a-1:a,s=a<t-1?a+1:a,c=e>0?e-1:e,l=e<n-1?e+1:e,u=(e*t+s)*3,d=(e*t+o)*3,f=(l*t+a)*3,p=(c*t+a)*3,m=r[u]-r[d],h=r[u+1]-r[d+1],g=r[u+2]-r[d+2],_=r[f]-r[p],v=r[f+1]-r[p+1],y=r[f+2]-r[p+2],b=h*y-g*v,x=g*_-m*y,S=m*v-h*_,C=Math.hypot(b,x,S)||1;b/=C,x/=C,S/=C;let w=(e*t+a)*3;i[w]=b,i[w+1]=x,i[w+2]=S}}var k=n((()=>{}));function ne(e,t,n,r){let i=e.cols+1,a=e.rows+1,o=e.positions,s=Math.max(1e-6,r<.5?r*2*Math.PI:(1-(r-.5)*2)*Math.PI),c=t/s,l=r<.5?0:-(r-.5)*2*Math.PI,u=Math.cos(l),d=Math.sin(l);for(let t=0;t<i;t++){let r=t/e.cols*s,l=Math.sin(r)*c,f=(1-Math.cos(r))*c,p=l*u+f*d,m=-l*d+f*u;for(let r=0;r<a;r++){let a=(r*i+t)*3;o[a]=p,o[a+1]=r/e.rows*n,o[a+2]=m}}O(e)}var re=n((()=>{k()}));function ie(e,t,n,r,i){let a=e.cols+1,o=e.rows+1,s=e.positions,c=!!i.fill,l=Math.sin(Math.PI*r)**.85,u=c?oe:ae,d=Math.PI/2-l*(Math.PI/2-u),f=Math.sin(d),p=Math.cos(d),m=1/Math.max(f,1e-6),h=c?ce:A,g=n*(h+((c?le:se)-h)*l),_=(i.y-.5)*2,v=_>=0,y=Math.min(1,Math.abs(_)/ue),b=1-y,x=v?n+g:-g,S=Math.hypot(t,.5*n-x),C=Math.max(S*f,t/Math.PI),w=c?r**+j:r,T=-Math.PI*w,E=Math.cos(T),D=Math.sin(T);if(l<1e-4){for(let r=0;r<o;r++){let i=r/e.rows*n;for(let n=0;n<a;n++){let o=n/e.cols*t,c=(r*a+n)*3;s[c]=o*E,s[c+1]=i,s[c+2]=-o*D}}O(e);return}for(let r=0;r<o;r++){let i=r/e.rows*n;for(let o=0;o<a;o++){let c=o/e.cols*t,l=c,u=i,d=0;if(y>1e-5){let e=v?n-i:i,t=-g,r=Math.hypot(c,e-t);if(r>1e-8){let e=r*f,i=Math.asin(Math.min(1,Math.max(0,c/r)))*m,a=1-Math.cos(i),o=r+t-e*a*f;l=e*Math.sin(i),u=v?n-o:o,d=e*a*p}}let h=l,_=u,x=d;if(b>1e-5){let e=c/C,t=C*Math.sin(e),n=C*(1-Math.cos(e));h=y*l+b*t,_=y*u+b*i,x=y*d+b*n}let S=(r*a+o)*3;s[S]=h*E+x*D,s[S+1]=_,s[S+2]=-h*D+x*E}}O(e)}var ae,oe,A,se,ce,le,ue,j,de=n((()=>{k(),ae=30*Math.PI/180,oe=44*Math.PI/180,A=1.35,se=.7,ce=1.85,le=1.15,ue=.42,j=1.08}));function fe(){let e=new Float64Array(129),t=new Float64Array(129),n=1/N,r=e=>Math.PI*e-.5*Math.sin(2*Math.PI*e);for(let i=1;i<=N;i++){let a=r((i-1)*n),o=r(i*n);e[i]=e[i-1]+.5*(Math.cos(a)+Math.cos(o))*n,t[i]=t[i-1]+.5*(Math.sin(a)+Math.sin(o))*n}return e[N]=0,{x:e,z:t}}function pe(e){let t=Math.max(0,Math.min(1,e))*N,n=Math.min(N-1,Math.floor(t)),r=t-n;return[P.x[n]+(P.x[n+1]-P.x[n])*r,P.z[n]+(P.z[n+1]-P.z[n])*r]}function me(e,t,n,r,i){let a=e.cols+1,o=e.rows+1,s=e.positions;if(r<=1e-7||r>=.9999999){let i=r<.5?1:-1;for(let r=0;r<o;r++){let o=r/e.rows*n;for(let n=0;n<a;n++){let c=(r*a+n)*3;s[c]=i*(n/e.cols)*t,s[c+1]=o,s[c+2]=0}}O(e);return}let c=Math.sin(Math.PI*r)**.72,l=Math.max(1e-6,t*M*c),u=Math.max(-1,Math.min(1,(i.y-.5)*2))*he*Math.sin(Math.PI*r)**1.15,d=Math.cos(u),f=Math.sin(u),p=-f,m=d,h=Math.abs(f)*n*.5,g=t+h/d,_=g+(-(l+h)/d-g)*r,v=n*.5;for(let r=0;r<o;r++){let i=r/e.rows*n;for(let n=0;n<a;n++){let o=n/e.cols*t,c=o-_,u=i-v,h=c*d+u*f,g=c*p+u*m,y=(r*a+n)*3;if(h<=0){s[y]=o,s[y+1]=i,s[y+2]=0;continue}let b,x;if(h<l){let[e,t]=pe(h/l);b=l*e,x=l*t}else b=-(h-l),x=l*F;s[y]=_+p*g+d*b,s[y+1]=v+m*g+f*b,s[y+2]=x}}O(e)}var M,he,N,P,F,ge=n((()=>{k(),M=.34,he=11*Math.PI/180,N=128,P=fe(),F=P.z[N]}));function _e(e,t,n,r,i){let a=e.cols+1,o=e.rows+1,s=e.cols,c=e.positions,l=t/s,u=Math.PI*r,d=-.52*Math.sin(2*Math.PI*r);for(let t=0;t<o;t++){let r=t/e.rows,o=d*(1+I*Math.abs(r-i.y)),f=r*n,p=0,m=0,h=Math.cos(u),g=Math.sin(u);c[t*a*3]=0,c[t*a*3+1]=f,c[t*a*3+2]=0;for(let e=1;e<a;e++){let n=e/s,r=u+o*n*n,i=Math.cos(r),d=Math.sin(r);p+=.5*(h+i)*l,m+=.5*(g+d)*l,h=i,g=d;let _=(t*a+e)*3;c[_]=p,c[_+1]=f,c[_+2]=m}}O(e)}var I,ve=n((()=>{k(),I=.45}));function ye(e,t,n,r,i){let a=e.cols+1,o=e.rows+1,s=e.cols,c=e.positions,l=t/s,u=!!i.fill;if(r<=1e-7||r>=.9999999){let i=r<.5?1:-1;for(let r=0;r<o;r++){let o=r/e.rows*n;for(let n=0;n<a;n++){let s=(r*a+n)*3;c[s]=i*(n/e.cols)*t,c[s+1]=o,c[s+2]=0}}O(e);return}let d=Math.PI*(u?r**+B:r),f=Math.sin(Math.PI*r)**.8,p=L*f,m=R*Math.sin(Math.PI*r)*(1-r);for(let t=0;t<o;t++){let r=t/e.rows,o=r*n,u=1-z*Math.abs(r-i.y),f=p*(.75+.25*u),h=m*u,g=0,_=0,v=Math.cos(d),y=Math.sin(d);c[t*a*3]=0,c[t*a*3+1]=o,c[t*a*3+2]=0;for(let e=1;e<a;e++){let n=e/s,r=d+f*Math.sin(2*Math.PI*n)+h*n*n,i=Math.cos(r),u=Math.sin(r);g+=.5*(v+i)*l,_+=.5*(y+u)*l,v=i,y=u;let p=(t*a+e)*3;c[p]=g,c[p+1]=o,c[p+2]=_}}O(e)}var L,R,z,B,be=n((()=>{k(),L=.52,R=.62,z=.5,B=1.12}));function xe(e,t,n,r){let i=e.cols+1,a=e.rows+1,o=e.positions,s=r*Math.PI,c=Math.cos(s),l=Math.sin(s);for(let r=0;r<i;r++){let s=r/e.cols*t,u=s*c,d=s*l;for(let t=0;t<a;t++){let a=(t*i+r)*3;o[a]=u,o[a+1]=t/e.rows*n,o[a+2]=d}}O(e)}var Se=n((()=>{k()})),V,Ce=n((()=>{re(),de(),ge(),ve(),be(),Se(),k(),b(),V={roll:{deform:ne,anchored:!1},cone:{deform:ie,anchored:!0},leaf:{deform:me,anchored:!0},flick:{deform:_e,anchored:!0},silk:{deform:ye,anchored:!0},simple:{deform:xe,anchored:!1}}}));function we(e){let t=e.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!0,depth:!1,stencil:!1,preserveDrawingBuffer:!0});if(t===null)throw Error(`WebglRenderer: could not create a WebGL2 context.`);return t}var Te=n((()=>{}));function H(e,t,n){let r=e.createProgram();if(r===null)throw Error(`WebglRenderer: could not create a program.`);let i=U(e,e.VERTEX_SHADER,t),a=U(e,e.FRAGMENT_SHADER,n);if(e.attachShader(r,i),e.attachShader(r,a),e.linkProgram(r),e.deleteShader(i),e.deleteShader(a),!e.getProgramParameter(r,e.LINK_STATUS)){let t=e.getProgramInfoLog(r);throw e.deleteProgram(r),Error(`WebglRenderer: program link failed: ${t??`unknown error`}`)}return r}function U(e,t,n){let r=e.createShader(t);if(r===null)throw Error(`WebglRenderer: could not create a shader.`);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`WebglRenderer: shader compile failed: ${t??`unknown error`}`)}return r}var Ee=n((()=>{}));function W(e){let t=e.createTexture();if(t===null)throw Error(`WebglRenderer: could not create a texture.`);return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),t}function De(e,t,n){e.bindTexture(e.TEXTURE_2D,t),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n)}var Oe=n((()=>{})),ke=r({WebglRenderer:()=>Ie});function G(e){return e.left===null==(e.right===null)?0:e.right===null?1:-1}var K,q,Ae,je,J,Y,Me,Ne,Pe,Fe,Ie,Le=n((()=>{Ce(),Te(),Ee(),Oe(),K=`#version 300 es
|
|
2
|
-
in vec2 aUnit;
|
|
3
|
-
uniform vec2 uViewport;
|
|
4
|
-
uniform vec4 uRect;
|
|
5
|
-
uniform vec3 uView;
|
|
6
|
-
out vec2 vUv;
|
|
7
|
-
void main() {
|
|
8
|
-
vec2 px = uRect.xy + aUnit * uRect.zw;
|
|
9
|
-
px = px * uView.x + uView.yz;
|
|
10
|
-
vec2 clip = px / uViewport * 2.0 - 1.0;
|
|
11
|
-
gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);
|
|
12
|
-
vUv = aUnit;
|
|
13
|
-
}`,q=`#version 300 es
|
|
14
|
-
precision mediump float;
|
|
15
|
-
in vec2 vUv;
|
|
16
|
-
uniform sampler2D uTex;
|
|
17
|
-
uniform float uGutterSide; // +1 = spine at right edge, -1 = at left edge, 0 = none
|
|
18
|
-
out vec4 outColor;
|
|
19
|
-
void main() {
|
|
20
|
-
vec4 c = texture(uTex, vUv);
|
|
21
|
-
if (uGutterSide != 0.0) {
|
|
22
|
-
float d = uGutterSide > 0.0 ? (1.0 - vUv.x) : vUv.x;
|
|
23
|
-
c.rgb *= mix(0.72, 1.0, smoothstep(0.0, 0.10, d));
|
|
24
|
-
}
|
|
25
|
-
outColor = c;
|
|
26
|
-
}`,Ae=`#version 300 es
|
|
27
|
-
in vec3 aPos; // leaf-local device px: x = bent offset from spine, y 0..H, z depth
|
|
28
|
-
in vec3 aNormal;
|
|
29
|
-
in vec2 aUv;
|
|
30
|
-
uniform vec2 uViewport;
|
|
31
|
-
uniform vec3 uView; // scale, tx, ty
|
|
32
|
-
uniform float uOriginX; // spine x in device px
|
|
33
|
-
uniform float uDir; // +1 leaf to the right of spine, -1 to the left
|
|
34
|
-
uniform float uLeafW; // leaf width in device px (perspective scale)
|
|
35
|
-
out vec2 vUv;
|
|
36
|
-
out float vFacing;
|
|
37
|
-
out float vU;
|
|
38
|
-
void main() {
|
|
39
|
-
float bookX = uOriginX + uDir * aPos.x;
|
|
40
|
-
float bookY = aPos.y;
|
|
41
|
-
float Z = aPos.z;
|
|
42
|
-
// Eye distance, in leaf widths. Keeps the perspective resolution-independent. 5.3 puts the
|
|
43
|
-
// roll's deepest point ~14% larger than flat; stronger than that (a nearer eye) balloons the
|
|
44
|
-
// turning sheet and reads more like a fisheye than a page lifting.
|
|
45
|
-
float D = uLeafW * 5.3;
|
|
46
|
-
float persp = D / max(D - Z, 1.0);
|
|
47
|
-
float cx = uViewport.x * 0.5;
|
|
48
|
-
float cy = uViewport.y * 0.5;
|
|
49
|
-
float px = cx + (bookX - cx) * persp;
|
|
50
|
-
float py = cy + (bookY - cy) * min(persp, 1.0); // Y only shrinks (top-safe)
|
|
51
|
-
vec2 p = vec2(px, py) * uView.x + uView.yz;
|
|
52
|
-
vec2 clip = p / uViewport * 2.0 - 1.0;
|
|
53
|
-
gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);
|
|
54
|
-
vUv = aUv;
|
|
55
|
-
vFacing = aNormal.z;
|
|
56
|
-
vU = aUv.x;
|
|
57
|
-
}`,je=`#version 300 es
|
|
58
|
-
precision mediump float;
|
|
59
|
-
in vec2 vUv;
|
|
60
|
-
in float vFacing;
|
|
61
|
-
in float vU;
|
|
62
|
-
uniform sampler2D uFront;
|
|
63
|
-
uniform sampler2D uBack;
|
|
64
|
-
uniform highp float uDir;
|
|
65
|
-
uniform float uGloss; // 0 disables the specular highlight (e.g. the flat 'simple' curl)
|
|
66
|
-
uniform float uAlpha; // leaf opacity; a lone page dissolves into the page landing beneath it
|
|
67
|
-
out vec4 outColor;
|
|
68
|
-
void main() {
|
|
69
|
-
// The turn mesh carries its own facing in the normal; the front points at the viewer
|
|
70
|
-
// (normal.z > 0) until the leaf passes vertical, for both flip directions. u->x still
|
|
71
|
-
// flips with uDir so a left-hand leaf reads spine-inward.
|
|
72
|
-
bool showFront = vFacing > 0.0;
|
|
73
|
-
float fx = uDir > 0.0 ? vUv.x : 1.0 - vUv.x;
|
|
74
|
-
vec4 c = showFront ? texture(uFront, vec2(fx, vUv.y)) : texture(uBack, vec2(1.0 - fx, vUv.y));
|
|
75
|
-
|
|
76
|
-
// Fold shading: the sheet darkens sharply where it curves away from the viewer, so the
|
|
77
|
-
// rolled edge reads as a deep crease with a soft highlight riding the ridge.
|
|
78
|
-
float diff = clamp(abs(vFacing), 0.0, 1.0);
|
|
79
|
-
float lit = mix(0.42, 1.0, diff);
|
|
80
|
-
lit *= mix(0.7, 1.0, smoothstep(0.0, 0.12, vU)); // spine crease matches the gutter shadow
|
|
81
|
-
|
|
82
|
-
// Glossy specular: brightest where the surface tilts ~30 deg from facing the viewer,
|
|
83
|
-
// so a thin glossy highlight rides across the sheet as it rolls.
|
|
84
|
-
float spec = pow(max(cos(acos(diff) - 0.52), 0.0), 220.0) * 0.22 * uGloss;
|
|
85
|
-
|
|
86
|
-
c.rgb = clamp(c.rgb * lit + spec, 0.0, 1.0);
|
|
87
|
-
// Premultiplied alpha (blendFunc ONE, ONE_MINUS_SRC_ALPHA): scale colour as well as alpha,
|
|
88
|
-
// or fading would brighten the sheet additively instead of dissolving it.
|
|
89
|
-
outColor = vec4(c.rgb * uAlpha, c.a * uAlpha);
|
|
90
|
-
}`,J=28,Y=36,Me=.7,Ne=.8,Pe=4e3,Fe=256*1024*1024,Ie=class{#e=null;#t=null;#n=null;#r=null;#i=null;#a=null;#o=null;#s=null;#c=null;#l=0;#u=te(J,Y);#d=new Map;#f=0;#p=null;#m={};#h={};#g={scale:1,tx:0,ty:0};#_=1;#v=null;#y=!1;#b=null;#x=0;#S=y;#C={y:.5};#w=0;#T=0;#E=0;#D=0;#O=0;#k=0;#A=!1;#j=!1;#M=null;#N=null;mount(e){this.#e=e;let t=e.ownerDocument,n=t.createElement(`canvas`);return n.style.cssText=`display:block;width:100%;height:100%;`,e.append(n),this.#t=n,n.addEventListener(`webglcontextlost`,this.#L),n.addEventListener(`webglcontextrestored`,this.#R),t.addEventListener(`visibilitychange`,this.#z),this.#n=we(n),this.#H(),Promise.resolve()}destroy(){this.#V();let e=this.#t;e!==null&&(e.removeEventListener(`webglcontextlost`,this.#L),e.removeEventListener(`webglcontextrestored`,this.#R),e.ownerDocument.removeEventListener(`visibilitychange`,this.#z));let t=this.#n;if(t!==null){for(let e of this.#d.values())t.deleteTexture(e.tex);this.#p!==null&&t.deleteTexture(this.#p),this.#a!==null&&t.deleteVertexArray(this.#a),this.#o!==null&&t.deleteVertexArray(this.#o),this.#r!==null&&t.deleteProgram(this.#r),this.#i!==null&&t.deleteProgram(this.#i),t.getExtension(`WEBGL_lose_context`)?.loseContext()}e?.remove(),this.#d.clear(),this.#f=0,this.#p=null,this.#e=null,this.#t=null,this.#n=null,this.#v=null,this.#b=null}onFatal(e){this.#N=e}renderSpread(e,t,n){this.#v=t,this.#y=n?.fill??!1,this.#b=null,this.#P(t),this.#G()}#P(e){let t=e.left??e.right;t&&t.height&&(this.#D=t.width/t.height)}beginFlip(e,t,n,r){let i=r?.fill??!1;this.#x=0,r?.curl&&(this.#S=r.curl),r?.anchor&&(this.#C=r.anchor),this.#T=i?0:G(e),this.#E=i?0:G(t),this.#P(t),i?this.#b={underLeft:null,underRight:null,underFull:t.right??t.left,front:e.right??e.left,back:e.right??e.left,dir:n===`forward`?1:-1,fill:!0}:n===`forward`?this.#b={underLeft:e.left,underRight:t.right,underFull:null,front:e.right,back:t.left,dir:1,fill:!1}:this.#b={underLeft:t.left,underRight:e.right,underFull:null,front:e.left,back:t.right,dir:-1,fill:!1},this.#G()}setFlipProgress(e,t){this.#x=e,this.#G()}setViewTransform(e,t,n){this.#g={scale:e,tx:t,ty:n},this.#G()}measure(){let e=this.#e,t=e?.clientWidth??0,n=e?.clientHeight??0,r=this.#D>0,i=r?this.#F():void 0,a=r?this.#I():void 0;return{containerWidth:t,containerHeight:n,pageWidth:t/2,pageHeight:n,book:i,content:a}}#F(){let e=this.#e,t=e?.clientWidth??0,n=e?.clientHeight??0;if(this.#D<=0||t<=0||n<=0)return{x:0,y:0,width:t,height:n};let r=(this.#y?1:2)*this.#D,i=t,a=n;return r>t/n?a=t/r:i=n*r,{x:(t-i)/2,y:(n-a)/2,width:i,height:a}}#I(){let e=this.#F();return!this.#y&&this.#v!==null&&G(this.#v)!==0?{x:e.x+e.width/4,y:e.y,width:e.width/2,height:e.height}:e}#L=e=>{e.preventDefault(),this.#A=!0,this.#M===null&&(this.#M=setTimeout(()=>this.#B(),Pe))};#R=()=>{this.#V(),this.#A=!1,this.#H(),this.#G()};#z=()=>{this.#t?.ownerDocument.visibilityState===`visible`&&this.#G()};#B(){this.#j||(this.#j=!0,this.#N?.())}#V(){this.#M!==null&&(clearTimeout(this.#M),this.#M=null)}#H(){let e=this.#n;if(e!==null){this.#r=H(e,K,q),this.#i=H(e,Ae,je);for(let t of[`uViewport`,`uRect`,`uView`,`uTex`,`uGutterSide`])this.#m[t]=e.getUniformLocation(this.#r,t);for(let t of[`uViewport`,`uView`,`uOriginX`,`uDir`,`uLeafW`,`uFront`,`uBack`,`uGloss`,`uAlpha`])this.#h[t]=e.getUniformLocation(this.#i,t);this.#a=this.#U(e,this.#r),this.#W(e,this.#i),this.#d.clear(),this.#f=0,this.#p=this.#te(e),e.useProgram(this.#r),e.uniform1i(this.#m.uTex??null,0),e.useProgram(this.#i),e.uniform1i(this.#h.uFront??null,0),e.uniform1i(this.#h.uBack??null,1),e.clearColor(0,0,0,0),e.enable(e.BLEND),e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA)}}#U(e,t){let n=e.createVertexArray(),r=e.createBuffer();if(n===null||r===null)throw Error(`WebglRenderer: could not create buffers.`);e.bindVertexArray(n),e.bindBuffer(e.ARRAY_BUFFER,r),e.bufferData(e.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,1,1]),e.STATIC_DRAW);let i=e.getAttribLocation(t,`aUnit`);return e.enableVertexAttribArray(i),e.vertexAttribPointer(i,2,e.FLOAT,!1,0,0),e.bindVertexArray(null),n}#W(e,t){let n=[];for(let e=0;e<Y;e++)for(let t=0;t<J;t++){let r=e*29+t,i=r+1,a=r+29,o=a+1;n.push(r,a,i,i,a,o)}this.#l=n.length;let r=e.createVertexArray();this.#s=e.createBuffer(),this.#c=e.createBuffer();let i=e.createBuffer(),a=e.createBuffer();if(r===null||this.#s===null||this.#c===null||i===null||a===null)throw Error(`WebglRenderer: could not create mesh buffers.`);e.bindVertexArray(r),e.bindBuffer(e.ARRAY_BUFFER,this.#s),e.bufferData(e.ARRAY_BUFFER,this.#u.positions,e.DYNAMIC_DRAW);let o=e.getAttribLocation(t,`aPos`);e.enableVertexAttribArray(o),e.vertexAttribPointer(o,3,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,this.#c),e.bufferData(e.ARRAY_BUFFER,this.#u.normals,e.DYNAMIC_DRAW);let s=e.getAttribLocation(t,`aNormal`);e.enableVertexAttribArray(s),e.vertexAttribPointer(s,3,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,i),e.bufferData(e.ARRAY_BUFFER,this.#u.uvs,e.STATIC_DRAW);let c=e.getAttribLocation(t,`aUv`);e.enableVertexAttribArray(c),e.vertexAttribPointer(c,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,a),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Uint16Array(n),e.STATIC_DRAW),e.bindVertexArray(null),this.#o=r}#G(){let e=this.#n,t=this.#t;e===null||t===null||this.#A||e.isContextLost()||(this.#ne(),e.clear(e.COLOR_BUFFER_BIT),this.#K(),this.#b===null?this.#v!==null&&this.#q():this.#J())}#K(){let e=this.#n,t=this.#t,n=t.width,r=t.height;if(this.#D>0){let e=(this.#y?1:2)*this.#D;e>n/r?(this.#O=n,this.#k=Math.round(n/e)):(this.#k=r,this.#O=Math.round(r*e))}else this.#O=n,this.#k=r;let i=Math.round((n-this.#O)/2),a=Math.round((r-this.#k)/2);e.viewport(i,a,this.#O,this.#k)}#q(){let e=this.#O,t=this.#k,n=this.#v;this.#w=this.#y?0:G(n)*(e/4),this.#X(),this.#y?this.#Z({x:0,y:0,w:e,h:t},n.right??n.left):(this.#Z({x:0,y:0,w:e/2,h:t},n.left,+!!n.right),this.#Z({x:e/2,y:0,w:e/2,h:t},n.right,n.left?-1:0))}#J(){let e=this.#n,t=this.#O,n=this.#k,r=this.#b;if(this.#w=r.fill?0:(this.#T+(this.#E-this.#T)*this.#x)*(t/4),this.#X(),r.fill?this.#Z({x:0,y:0,w:t,h:n},r.underFull):(this.#Z({x:0,y:0,w:t/2,h:n},r.underLeft,1),this.#Z({x:t/2,y:0,w:t/2,h:n},r.underRight,-1)),r.front===null&&r.back===null)return;let i=r.fill?t:t/2,a=r.fill?r.dir>0?0:t:t/2;V[this.#S].deform(this.#u,i,n,this.#x,{y:this.#C.y,fill:r.fill}),e.bindBuffer(e.ARRAY_BUFFER,this.#s),e.bufferSubData(e.ARRAY_BUFFER,0,this.#u.positions),e.bindBuffer(e.ARRAY_BUFFER,this.#c),e.bufferSubData(e.ARRAY_BUFFER,0,this.#u.normals),this.#Q(e.TEXTURE0,r.front),this.#Q(e.TEXTURE1,r.back),e.activeTexture(e.TEXTURE0),e.useProgram(this.#i),e.bindVertexArray(this.#o),e.uniform2f(this.#h.uViewport??null,t,n),e.uniform3f(this.#h.uView??null,this.#g.scale,this.#g.tx*this.#_+this.#w,this.#g.ty*this.#_),e.uniform1f(this.#h.uOriginX??null,a),e.uniform1f(this.#h.uDir??null,r.dir),e.uniform1f(this.#h.uLeafW??null,i),e.uniform1f(this.#h.uGloss??null,this.#S===`simple`?0:1),e.uniform1f(this.#h.uAlpha??null,r.fill?this.#Y():1),e.drawElements(e.TRIANGLES,this.#l,e.UNSIGNED_SHORT,0)}#Y(){let e=this.#S===`roll`||this.#S===`simple`?Me:Ne,t=(this.#x-e)/(1-e);return t<=0?1:t>=1?0:(1-t)**1.5}#X(){let e=this.#n;e.useProgram(this.#r),e.bindVertexArray(this.#a),e.activeTexture(e.TEXTURE0),e.uniform2f(this.#m.uViewport??null,this.#O,this.#k),e.uniform3f(this.#m.uView??null,this.#g.scale,this.#g.tx*this.#_+this.#w,this.#g.ty*this.#_)}#Z(e,t,n=0){let r=this.#n;t!==null&&(this.#Q(r.TEXTURE0,t),r.uniform4f(this.#m.uRect??null,e.x,e.y,e.w,e.h),r.uniform1f(this.#m.uGutterSide??null,n),r.drawArrays(r.TRIANGLE_STRIP,0,4))}#Q(e,t){let n=this.#n;n.activeTexture(e),n.bindTexture(n.TEXTURE_2D,t===null?this.#p:this.#$(t))}#$(e){let t=this.#n,n=this.#d.get(e);if(n!==void 0)return this.#d.delete(e),this.#d.set(e,n),n.tex;let r=W(t);De(t,r,e);let i=e,a=i.width*i.height*4;return this.#d.set(e,{tex:r,bytes:a}),this.#f+=a,this.#ee(),r}#ee(){let e=this.#n;for(let[t,n]of this.#d){if(this.#f<=Fe||this.#d.size<=4)break;this.#d.delete(t),this.#f-=n.bytes,e.deleteTexture(n.tex)}}#te(e){let t=W(e);return e.bindTexture(e.TEXTURE_2D,t),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,new Uint8Array([0,0,0,0])),t}#ne(){let e=this.#n,t=this.#t,n=this.#e;if(e===null||t===null||n===null)return;this.#_=typeof devicePixelRatio==`number`?devicePixelRatio:1;let r=Math.max(1,Math.round(n.clientWidth*this.#_)),i=Math.max(1,Math.round(n.clientHeight*this.#_));(t.width!==r||t.height!==i)&&(t.width=r,t.height=i,e.viewport(0,0,r,i))}}})),Re={css:async()=>new(await(Promise.resolve().then(()=>(ee(),C)))).CssRenderer,webgl2:async()=>new(await(Promise.resolve().then(()=>(Le(),ke)))).WebglRenderer},ze=!0;function Be(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&typeof e.mount==`function`}function Ve(e){return e.gpu&&ze?[`webgl2`,`css`]:[`css`]}function He(){return{gpu:Ue()}}function Ue(){try{return!!document.createElement(`canvas`).getContext(`webgl2`)}catch{return!1}}async function X(e=`auto`,t=He()){if(Be(e))return e;let n=Array.isArray(e)?e:e===`auto`?Ve(t):[e];for(let e of n){if(e===`webgl2`&&!t.gpu)continue;let n=Re[e];if(n)return n()}throw n.length===1&&n[0]===`webgl2`&&!t.gpu?Error(`renderer: 'webgl2' was forced but this device has no WebGL2. Use 'css' or 'auto'.`):Error(`renderer: none of [${n.join(`, `)}] could be loaded — use 'css' or 'auto'.`)}function We(e,t){let n=typeof t.frontCover==`string`,r=typeof t.backCover==`string`,i=t.pages!=null&&Object.keys(t.pages).length>0;return!n&&!r&&!i?e:new Ke(e,t)}function Ge(e){return fetch(e).then(t=>{if(!t.ok)throw Error(`zine: could not load image "${e}" (HTTP ${t.status}).`);return t.blob()}).then(e=>createImageBitmap(e))}var Ke=class{#e;#t;#n;#r;#i=new Map;#a=new Map;open;onPageUpdate;constructor(e,t){this.#e=e,this.#t=typeof t.frontCover==`string`?t.frontCover:null,this.#n=typeof t.backCover==`string`?t.backCover:null,this.#r=t.pages??{},typeof e.open==`function`?this.open=async()=>{await e.open(),this.#o()}:this.#o(),typeof e.onPageUpdate==`function`&&(this.onPageUpdate=t=>{e.onPageUpdate(e=>t(e+(this.#t===null?0:1)))})}get pageCount(){return this.#e.pageCount+(this.#t===null?0:1)+(this.#n===null?0:1)}get(e){let t=this.#t===null?0:1;if(this.#t!==null&&e===0)return this.#s(this.#t);if(this.#n!==null&&e===this.pageCount-1)return this.#s(this.#n);let n=e-t,r=this.#i.get(n);return r===void 0?this.#e.get(n):this.#s(r)}prefetch(e){let t=this.#t===null?0:1,n=[];for(let r of e)if(this.#t!==null&&r===0)this.#s(this.#t).catch(()=>{});else if(this.#n!==null&&r===this.pageCount-1)this.#s(this.#n).catch(()=>{});else{let e=r-t,i=this.#i.get(e);i===void 0?n.push(e):this.#s(i).catch(()=>{})}this.#e.prefetch(n)}destroy(){this.#e.destroy();for(let e of this.#a.values())e.then(e=>e.close()).catch(()=>{});this.#a.clear()}#o(){let e=this.#e.pageCount;this.#i.clear();for(let[t,n]of Object.entries(this.#r)){let r=Number(t),i=r<0?e+r:r;Number.isInteger(i)&&i>=0&&i<e&&this.#i.set(i,n)}}#s(e){let t=this.#a.get(e);return t===void 0&&(t=Ge(e).catch(t=>{throw this.#a.delete(e),t}),this.#a.set(e,t)),t}};b();var qe=.25,Je=.0015,Z=6,Ye=250,Xe=1.55,Ze=class{#e;#t;#n=new c;#r=new s(2);#i=new d;#a;#o;#s;#c=1;#l;#u;#d;#f;#p;#m=!1;#h=!1;#g=``;#_;#v=[];#y=0;#b=0;#x={left:null,right:null};#S;#C;#w;#T;#E;#D=null;#O=!1;#k=1;#A=0;#j=0;#M=null;#N=!1;#P=!1;#F=null;#I=null;#L=null;#R=null;#z=null;#B=null;#V=null;#H=null;#U=!1;#W=1;#G=!1;#K=null;#q=null;#J=null;#Y=null;#X=null;#Z;debug={setFlipProgress:(e,t)=>{this.#M?.setFlipProgress(e,t)}};constructor(e,t){tt(e,t),this.#e=e,t.width!==void 0&&(e.style.width=`${t.width}px`),t.height!==void 0&&(e.style.height=`${t.height}px`),this.#t=We(t.source,{frontCover:t.frontCover,backCover:t.backCover,pages:t.pages});let n=t.direction??`ltr`;this.#a=n,this.#o=t.spreadMode??`cover`,this.#s=t.curl??`cone`,this.#l=t.clickToFlip??`edge`,this.#u=t.clickZoneSize??64,this.#p=t.singlePageThreshold??640,this.#_=t.startPage,typeof this.#t.open!=`function`&&this.#He(),this.#S=t.flipDuration??800,this.#C=t.zoom?.enabled??!0,this.#w=t.zoom?.wheel??!0;let r=t.zoom?.doubleClick,i=r===!1?[]:[...r??[1,2,4]].sort((e,t)=>e-t);this.#T=i.length>0?i:null,this.#E=t.zoom?.max??4;let a=this.#C&&this.#T!==null,o=t.zoom?.doubleClickInFlipZone??this.#l===`half`;this.#d=this.#l!==`off`&&a&&o&&t.clickFlipDelay!==0,this.#f=this.#d?t.clickFlipDelay??Ye:0,this.#Z=this.#Se(t.renderer??`auto`)}get ready(){return this.#Z}getPageCount(){return this.#t.pageCount}getPage(){return this.#b}flipNext(){this.#Q(()=>this.#ne(this.#y+1))}flipPrev(){this.#Q(()=>this.#ne(this.#y-1))}flipTo(e){let t=Q(e,0,Math.max(0,this.#t.pageCount-1));this.#Q(()=>this.#ne(this.#Ve(t)))}#Q(e){this.#i.state===`idle`?e():this.#V?(this.#$(),e()):this.#B=e}#$(){let e=this.#V;e&&(this.#V=null,this.#F!==null&&(cancelAnimationFrame(this.#F),this.#F=null),this.#M?.setFlipProgress(e.toT,e.direction),e.onDone())}#ee(){let e=this.#B;e&&(this.#B=null,e())}getZoom(){return this.#k}setZoom(e,t){if(!this.#M||!this.#C)return;let n=Q(e,1,this.#E),r=this.#M.measure(),i=t??{x:r.containerWidth/2,y:r.containerHeight/2},a=this.#k,o=n===1?0:i.x-n/a*(i.x-this.#A),s=n===1?0:i.y-n/a*(i.y-this.#j);[o,s]=this.#te(o,s,n,r.containerWidth,r.containerHeight),this.#k=n,this.#A=o,this.#j=s,this.#M.setViewTransform(n,o,s),this.#n.emit(`zoomChanged`,{scale:n})}resetZoom(){this.setZoom(1)}#te(e,t,n,r,i){return[Q(e,r*(1-n),0),Q(t,i*(1-n),0)]}on(e,t){return this.#n.on(e,t)}destroy(){this.#P=!0,this.#F!==null&&cancelAnimationFrame(this.#F),this.#V=null,this.#B=null,this.#he(),this.#D?.disconnect(),this.#X?.(),this.#J?.(),this.#Y?.(),this.#q?.(),this.#M?.destroy(),this.#M=null,this.#t.destroy(),this.#n.clear()}#ne(e){if(e<0||e>=this.#v.length||e===this.#y||this.#i.send(`flip`)===null)return;let t=e>this.#y?`forward`:`backward`,n=this.#oe(e);this.#n.emit(`flipStart`,{from:this.#b,to:n}),this.#re(e,t,n)}async#re(e,t,n){let r=this.#v[e],i=r?await this.#Re(r):{left:null,right:null};this.#M?.beginFlip(this.#x,i,t,{fill:this.#m,curl:this.#s,anchor:{y:this.#c}}),this.#ie(0,1,t,()=>this.#ae(e,n,i))}#ie(e,t,n,r){let i=this.#ke()*Math.abs(t-e);if(i<=0){this.#M?.setFlipProgress(t,n),r();return}let a={toT:t,direction:n,onDone:r};this.#V=a;let o=performance.now(),s=c=>{if(this.#V!==a)return;let l=Math.min(1,(c-o)/i),u=this.#m?$e(l):Qe(l);this.#M?.setFlipProgress(e+(t-e)*u,n),l<1?this.#F=requestAnimationFrame(s):(this.#F=null,this.#V=null,r())};this.#F=requestAnimationFrame(s)}#ae(e,t,n){let r=this.#v[e];this.#y=e,this.#b=t,this.#x=n,r&&this.#Ne(r,n),this.#Be(),this.#i.send(`settle`),this.#Oe(),this.#n.emit(`pageChanged`,{page:t}),this.#n.emit(`flipEnd`,{page:t}),this.#ee()}#oe(e){let t=this.#v[e];if(!t)return this.#b;let n=[t.left,t.right].filter(e=>e!==null);return n.length>0?Math.min(...n):this.#b}#se(e,t){if(this.#U||!this.#M||this.#i.state!==`idle`)return;if(this.#he(),this.#k>1){if(this.#i.send(`panStart`)===null)return;this.#H={baseTx:this.#A,baseTy:this.#j};return}let n=this.#e.getBoundingClientRect(),r=this.#pe(),i={x:e-n.left-r.x,y:t-n.top-r.y};this.#R=i;let a=Math.min(r.width,r.height)*qe;if(_(i,{width:r.width,height:r.height},a)!==`corner`)return;this.#c=Q(i.y/r.height,0,1);let o=i.x>r.width/2,s=this.#a===`rtl`?!o:o,c=this.#y+(s?1:-1);c<0||c>=this.#v.length||(this.#L={direction:s?`forward`:`backward`,targetIndex:c,toPage:this.#oe(c),width:r.width})}#ce(){let e=this.#L;e&&(this.#L=null,this.#i.send(`grab`)!==null&&(this.#I={direction:e.direction,targetIndex:e.targetIndex,toPage:e.toPage,toContent:{left:null,right:null},width:e.width,t:0},this.#n.emit(`flipStart`,{from:this.#b,to:e.toPage}),this.#le(e.targetIndex,e.direction)))}async#le(e,t){let n=this.#v[e],r=n?await this.#Re(n):{left:null,right:null};this.#I?.targetIndex===e&&(this.#I.toContent=r,this.#M?.beginFlip(this.#x,r,t,{fill:this.#m,curl:this.#s,anchor:{y:this.#c}}),this.#M?.setFlipProgress(this.#I.t,t))}#ue(e,t){if(this.#U)return;if(this.#H){if(!this.#M)return;let n=this.#M.measure(),[r,i]=this.#te(this.#H.baseTx+e,this.#H.baseTy+t,this.#k,n.containerWidth,n.containerHeight);this.#A=r,this.#j=i,this.#M.setViewTransform(this.#k,r,i);return}this.#L&&Math.hypot(e,t)>Z&&this.#ce();let n=this.#I;n&&(n.t=Q((n.direction===`forward`?-e:e)/n.width,0,1),this.#M?.setFlipProgress(n.t,n.direction))}#de(e){if(this.#U)return;if(this.#H){this.#H=null,this.#i.send(`panEnd`);return}let t=this.#I;if(!t){this.#L=null,this.#fe(e);return}this.#I=null,this.#i.send(`release`);let n=e.swipe&&(t.direction===`forward`?e.dx<0:e.dx>0);t.t>=.5||n?this.#ie(t.t,1,t.direction,()=>this.#ae(t.targetIndex,t.toPage,t.toContent)):this.#ie(t.t,0,t.direction,()=>this.#ge())}#fe(e){if(this.#l===`off`||this.#k>1||!this.#R||Math.abs(e.dx)>Z||Math.abs(e.dy)>Z)return;let t=this.#me(this.#R);if(!t)return;let n=t===`forward`?1:-1;if(this.#y+n<0||this.#y+n>=this.#v.length)return;this.#c=Q(this.#R.y/this.#pe().height,0,1);let r=()=>this.#ne(this.#y+n);if(this.#he(),this.#f<=0){this.#Q(r);return}this.#z=setTimeout(()=>{this.#z=null,this.#Q(r)},this.#f)}#pe(){let e=this.#M.measure();return e.content??e.book??{x:0,y:0,width:e.containerWidth,height:e.containerHeight}}#me(e){if(!this.#M)return null;let t=this.#pe().width,n;if(n=this.#l===`half`?e.x>t/2?`right`:`left`:e.x<=this.#u?`left`:e.x>=t-this.#u?`right`:null,!n)return null;let r=this.#a===`rtl`?`left`:`right`;return n===r?`forward`:`backward`}#he(){this.#z!==null&&(clearTimeout(this.#z),this.#z=null)}#ge(){let e=this.#v[this.#y];e&&this.#Ne(e,this.#x),this.#i.send(`settle`),this.#n.emit(`flipEnd`,{page:this.#b}),this.#ee()}#_e(){if(this.#L=null,this.#he(),this.#I){this.#I=null,this.#i.send(`release`),this.#i.send(`settle`);let e=this.#v[this.#y];e&&this.#Ne(e,this.#x)}else this.#H&&(this.#H=null,this.#i.send(`panEnd`));this.#U=!0,this.#W=this.#k}#ve(e,t,n){if(!this.#U)return;let r=this.#e.getBoundingClientRect();this.setZoom(this.#W*n,{x:e-r.left,y:t-r.top})}#ye(){this.#U=!1}#be(){let e=e=>{if(!this.#w||!this.#C||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let t=this.#e.getBoundingClientRect(),n=Math.exp(-e.deltaY*Je);this.setZoom(this.#k*n,{x:e.clientX-t.left,y:e.clientY-t.top})};this.#e.addEventListener(`wheel`,e,{passive:!1}),this.#J=()=>this.#e.removeEventListener(`wheel`,e)}#xe(){let e=e=>{let t=this.#T;if(!this.#C||t===null)return;if(this.#k<=1&&this.#l!==`off`&&!this.#d){let t=this.#e.getBoundingClientRect(),n={x:e.clientX-t.left,y:e.clientY-t.top};if(this.#me(n)!==null)return}this.#he(),e.preventDefault();let n=t.find(e=>e>this.#k+1e-6)??t[0]??this.#k,r=this.#e.getBoundingClientRect();this.setZoom(n,{x:e.clientX-r.left,y:e.clientY-r.top})};this.#e.addEventListener(`dblclick`,e),this.#Y=()=>this.#e.removeEventListener(`dblclick`,e)}async#Se(e){let t=X(e);typeof this.#t.open==`function`&&(await this.#t.open(),this.#He()),this.#t.prefetch([this.#b]);let n=await t,r=await this.#Ce(n);this.#M=r,this.#t.onPageUpdate?.(e=>this.#Fe(e)),this.#je(r.measure().containerWidth);let i=new p({onStart:e=>this.#se(e.x,e.y),onMove:e=>this.#ue(e.dx,e.dy),onEnd:e=>this.#de(e)}),a=new g({onPinchStart:()=>this.#_e(),onPinchMove:e=>this.#ve(e.centerX,e.centerY,e.scale),onPinchEnd:()=>this.#ye()});this.#q=m(this.#e,{pointer:i,pinch:a}),this.#be(),this.#xe(),this.#Te(),this.#X=this.#Ee(),await this.#Me(),this.#Ie(),this.#Be(),this.#Oe(),this.#n.emit(`ready`)}async#Ce(e){try{return await e.mount(this.#e),e.onFatal?.(()=>{this.#we()}),e}catch{e.destroy();let t=await X(`css`);return await t.mount(this.#e),this.#N=!0,this.#n.emit(`rendererFallback`,{from:`webgl2`,to:`css`}),t}}async#we(){if(this.#N||this.#P)return;this.#N=!0,this.#M?.destroy(),this.#M=null;let e=await X(`css`);if(this.#P){e.destroy();return}await e.mount(this.#e),this.#M=e,this.#je(e.measure().containerWidth),await this.#Me(),this.#n.emit(`rendererFallback`,{from:`webgl2`,to:`css`})}#Te(){if(typeof matchMedia!=`function`)return;let e=matchMedia(`(prefers-reduced-motion: reduce)`);this.#G=e.matches,e.addEventListener?.(`change`,e=>{this.#G=e.matches})}#Ee(){let e=this.#e,t=e.ownerDocument;if(!t||typeof e.setAttribute!=`function`)return null;e.hasAttribute(`tabindex`)||(e.tabIndex=0),e.setAttribute(`aria-roledescription`,`flipbook`);let n=e=>this.#De(e);e.addEventListener(`keydown`,n);let r=t.createElement(`div`);return r.setAttribute(`aria-live`,`polite`),r.setAttribute(`aria-atomic`,`true`),r.style.cssText=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,e.appendChild(r),this.#K=r,()=>{e.removeEventListener(`keydown`,n),r.remove(),this.#K=null}}#De(e){let t=this.#a===`rtl`?`ArrowLeft`:`ArrowRight`;switch(e.key){case`ArrowRight`:case`ArrowLeft`:e.key===t?this.flipNext():this.flipPrev(),e.preventDefault();break;case`Home`:this.flipTo(0),e.preventDefault();break;case`End`:this.flipTo(this.#t.pageCount-1),e.preventDefault();break;default:break}}#Oe(){this.#K&&(this.#K.textContent=`Page ${this.#b+1} of ${this.#t.pageCount}`)}#ke(){return this.#G?0:this.#S*(this.#m?Xe:1)}update(){!this.#M||this.#i.state!==`idle`||(this.#je(this.#M.measure().containerWidth),this.#Me())}#Ae(){return this.#h||this.#o===`single`?`single`:this.#o}#je(e){let t=a(e,this.#p);if(t===this.#h)return;this.#h=t;let n=this.#Ae();this.#m=n===`single`,this.#v=i(this.#t.pageCount,{direction:this.#a,mode:n}),this.#y=this.#Ve(this.#b)}async#Me(){let e=this.#v[this.#y];!e||!this.#M||(this.#x=await this.#Re(e),this.#Ne(e,this.#x))}#Ne(e,t){this.#M?.renderSpread(e,t,{fill:this.#m}),this.#Pe()}#Pe(){let e=this.#M?.measure().book;if(!e||e.width<=0||e.height<=0)return;let t=(e.width/e.height).toFixed(4);t!==this.#g&&(this.#g=t,this.#e.style.aspectRatio=t)}#Fe(e){if(this.#i.state!==`idle`)return;let t=this.#v[this.#y];t&&(t.left===e||t.right===e)&&this.#Me()}#Ie(){typeof ResizeObserver>`u`||(this.#D=new ResizeObserver(()=>this.#Le()),this.#D.observe(this.#e))}#Le(){this.#O||(this.#O=!0,requestAnimationFrame(()=>{this.#O=!1,this.update()}))}async#Re(e){let[t,n]=await Promise.all([this.#ze(e.left),this.#ze(e.right)]);return{left:t,right:n}}async#ze(e){if(e===null)return null;try{return await this.#t.get(e)}catch(t){return this.#n.emit(`sourceError`,{index:e,error:t}),null}}#Be(){let{toMount:e}=this.#r.update(this.#y,this.#v.length),t=[];for(let n of e){let e=this.#v[n];e?.left!=null&&t.push(e.left),e?.right!=null&&t.push(e.right)}this.#t.prefetch(t)}#Ve(e){let t=this.#v.findIndex(t=>t.left===e||t.right===e);return t===-1?0:t}#He(){let e=this.#t.pageCount;if(!Number.isInteger(e)||e<1)throw Error(`Zine: source has ${e} pages; a Source must have at least 1 page.`);let t=this.#_;if(t!==void 0&&(!Number.isInteger(t)||t<0||t>=e))throw Error(`Zine: startPage ${JSON.stringify(t)} is out of range for a ${e}-page book (valid 0..${e-1}).`);let n=this.#Ae();this.#m=n===`single`,this.#v=i(e,{direction:this.#a,mode:n}),this.#b=Q(t??0,0,e-1),this.#y=this.#Ve(this.#b)}};function Q(e,t,n){return e<t?t:e>n?n:e}function Qe(e){return e<.5?2*e*e:1-(-2*e+2)**2/2}function $e(e){return 1-(1-Qe(e))**1.3}function et(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function tt(e,t){if(typeof e!=`object`||!e||typeof e.appendChild!=`function`||typeof e.addEventListener!=`function`)throw Error(`Zine: container must be a DOM element; received ${et(e)}.`);if(typeof t!=`object`||!t)throw Error("Zine: an options object with a `source` is required.");let n=t,r=n.source;if(typeof r!=`object`||!r||typeof r.get!=`function`||typeof r.pageCount!=`number`)throw Error("Zine: `source` is required and must be a Source, e.g. new ImageSource(urls).");let i=n.startPage;if(i!==void 0&&(typeof i!=`number`||!Number.isInteger(i)||i<0))throw Error(`Zine: startPage must be a non-negative integer; got ${JSON.stringify(i)}.`);let a=n.direction;if(a!==void 0&&a!==`ltr`&&a!==`rtl`)throw Error(`Zine: direction must be 'ltr' or 'rtl'; got ${JSON.stringify(a)}.`);let o=n.clickToFlip;if(o!==void 0&&![`edge`,`half`,`off`].includes(o))throw Error(`Zine: clickToFlip must be 'edge', 'half', or 'off'; got ${JSON.stringify(o)}.`);let s=n.curl;if(s!==void 0&&!v.includes(s))throw Error(`Zine: curl must be one of ${v.join(`, `)}; got ${JSON.stringify(s)}.`);let c=n.spreadMode;if(c!==void 0&&![`double`,`single`,`cover`,`book`].includes(c))throw Error(`Zine: spreadMode must be 'double', 'single', 'cover', or 'book'; got ${JSON.stringify(c)}.`);for(let e of[`frontCover`,`backCover`]){let t=n[e];if(t!==void 0&&typeof t!=`string`)throw Error(`Zine: ${e} must be an image URL string; got ${JSON.stringify(t)}.`)}let l=n.pages;if(l!==void 0&&(typeof l!=`object`||!l||Array.isArray(l)))throw Error(`Zine: pages must be an object mapping page indices to image URLs.`);$(n.width,`width`,1),$(n.height,`height`,1),$(n.flipDuration,`flipDuration`,0),$(n.clickZoneSize,`clickZoneSize`,0),$(n.clickFlipDelay,`clickFlipDelay`,0),$(n.singlePageThreshold,`singlePageThreshold`,0),nt(n.zoom),rt(n.renderer)}function $(e,t,n){if(e!==void 0&&(typeof e!=`number`||!Number.isFinite(e)||e<n))throw Error(`Zine: ${t} must be a number >= ${n}; got ${JSON.stringify(e)}.`)}function nt(e){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Zine: zoom must be an object, e.g. { max: 4 }.`);let t=e;if(t.enabled!==void 0&&typeof t.enabled!=`boolean`)throw Error(`Zine: zoom.enabled must be a boolean; got ${JSON.stringify(t.enabled)}.`);if(t.wheel!==void 0&&typeof t.wheel!=`boolean`)throw Error(`Zine: zoom.wheel must be a boolean; got ${JSON.stringify(t.wheel)}.`);if(t.doubleClickInFlipZone!==void 0&&typeof t.doubleClickInFlipZone!=`boolean`)throw Error(`Zine: zoom.doubleClickInFlipZone must be a boolean; got ${JSON.stringify(t.doubleClickInFlipZone)}.`);if(t.doubleClick!==void 0&&t.doubleClick!==!1){let e=t.doubleClick;if(!Array.isArray(e)||e.some(e=>typeof e!=`number`||!Number.isFinite(e)||e<1))throw Error(`Zine: zoom.doubleClick must be false or an array of zoom levels >= 1, e.g. [1, 2, 4].`)}$(t.max,`zoom.max`,1)}function rt(e){if(e!==void 0){if(typeof e==`string`){if(e!==`auto`&&e!==`css`&&e!==`webgl2`)throw Error(`Zine: renderer '${e}' is not recognized; use 'auto', 'css', 'webgl2', an array of those, or a custom Renderer.`);return}if(Array.isArray(e)){for(let t of e)if(t!==`css`&&t!==`webgl2`)throw Error(`Zine: renderer order array may only contain 'css' or 'webgl2'; got ${JSON.stringify(t)}.`);return}if(!(typeof e==`object`&&e&&typeof e.mount==`function`))throw Error(`Zine: renderer must be 'auto', 'css', 'webgl2', an array of those, or a custom Renderer instance.`)}}var it=class{pageCount;fit;#e;#t;#n=new Map;constructor(e,t={}){this.#e=e,this.pageCount=e.length,this.#t=t.preload??1,this.fit=t.fit??`contain`}get(e){let t=this.#r(e);for(let t=1;t<=this.#t;t++)this.prefetch([e-t,e+t]);return t}prefetch(e){for(let t of e)t>=0&&t<this.pageCount&&this.#r(t).catch(()=>{})}destroy(){for(let e of this.#n.values())e.then(e=>e.close()).catch(()=>{});this.#n.clear()}#r(e){let t=this.#n.get(e);if(t)return t;let n=this.#e[e];if(n===void 0)return Promise.reject(RangeError(`ImageSource: page ${e} is out of range (0..${this.pageCount-1}).`));let r=(async()=>{let t=await fetch(n);if(!t.ok)throw Error(`ImageSource: failed to fetch page ${e} (${n}) — HTTP ${t.status}.`);return createImageBitmap(await t.blob())})().catch(t=>{throw this.#n.delete(e),t});return this.#n.set(e,r),r}};b(),e.CURL_TYPES=v,e.ImageSource=it,e.Zine=Ze});
|
|
91
|
-
//# sourceMappingURL=index.umd.cjs.map
|