@zinejs/core 0.7.3 → 0.8.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/dist/controls/arrows.d.ts +2 -1
- package/dist/controls/controls.d.ts +1 -1
- package/dist/controls/outline.d.ts +4 -1
- package/dist/controls/search.d.ts +4 -1
- package/dist/controls/share.d.ts +2 -1
- package/dist/controls/sidebar.d.ts +30 -0
- package/dist/controls/styles.d.ts +10 -1
- package/dist/controls/thumbnails.d.ts +4 -1
- package/dist/controls/types.d.ts +24 -1
- package/dist/controls-Djjk8Yac.js +713 -0
- package/dist/controls-Djjk8Yac.js.map +1 -0
- package/dist/engine/emitter.d.ts +4 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +241 -173
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +317 -54
- package/dist/index.umd.js.map +1 -1
- package/dist/loading/loading.d.ts +18 -0
- package/dist/loading-C0qbANt2.js +45 -0
- package/dist/loading-C0qbANt2.js.map +1 -0
- package/dist/{share-CyrZiFqf.js → share-DXAfK9rJ.js} +73 -73
- package/dist/share-DXAfK9rJ.js.map +1 -0
- package/dist/source/types.d.ts +13 -0
- package/dist/styles-CgCzjFUk.js +40 -0
- package/dist/styles-CgCzjFUk.js.map +1 -0
- package/dist/{webglRenderer-D_XGumQT.js → webglRenderer-nGRruZk2.js} +5 -4
- package/dist/webglRenderer-nGRruZk2.js.map +1 -0
- package/dist/zine.d.ts +28 -1
- package/package.json +7 -1
- package/dist/controls-Bj72hxVJ.js +0 -653
- package/dist/controls-Bj72hxVJ.js.map +0 -1
- package/dist/icons-D87p7JMP.js +0 -29
- package/dist/icons-D87p7JMP.js.map +0 -1
- package/dist/share-CyrZiFqf.js.map +0 -1
- package/dist/webglRenderer-D_XGumQT.js.map +0 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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}}},_=`page`,v=!1;function y(){return v?!1:(v=!0,!0)}function b(){v=!1}function x(e){let t=new URLSearchParams(e.replace(/^#/,``)).get(_);if(t===null)return null;let n=Number(t);return Number.isInteger(n)&&n>=1?n-1:null}function S(e,t){let n=new URLSearchParams(e.replace(/^#/,``));return n.set(_,String(t+1)),`#${n.toString()}`}function C(e,t){let n=null,r=()=>{let r=x(e.location.hash);r===null||r===n||(n=r,t(r))};return e.addEventListener(`hashchange`,r),{push(t){if(t===n)return;n=t;let r=S(e.location.hash,t);r!==e.location.hash&&e.history?.replaceState?.(e.history.state,``,r)},stop(){e.removeEventListener(`hashchange`,r)}}}var w,T,E,D=n((()=>{w=[`cone`,`simple`],T=[`roll`,`leaf`,`flick`,`silk`],E=`cone`}));function ee(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 te=n((()=>{})),ne=r({CssRenderer:()=>ae});function O(e){return e.left===null==(e.right===null)?0:e.right===null?1:-1}function re(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 ie,ae,oe=n((()=>{te(),ie=180/Math.PI,ae=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=re(`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:O(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:O(e),this.#d=r?.fill?0:O(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=re(n),this.#l.style.opacity=`0`}setFlipProgress(e,t){let n=ee(e),r=n.angle*ie;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,o=a?e=>({x:a.x*e,y:a.y*e,width:a.width*e,height:a.height*e}):void 0;return{containerWidth:t,containerHeight:n,pageWidth:t/2,pageHeight:n,book:i,content:a,screenAt:o}}#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 se(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 ce(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 le(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?de:ue,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?me:fe,g=n*(h+((c?he:pe)-h)*l),_=(i.y-.5)*2,v=_>=0,y=Math.min(1,Math.abs(_)/ge),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**+_e: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}}ce(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}}ce(e)}var ue,de,fe,pe,me,he,ge,_e,ve=n((()=>{k(),ue=30*Math.PI/180,de=44*Math.PI/180,fe=1.35,pe=.7,me=1.85,he=1.15,ge=.42,_e=1.08}));function ye(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}}ce(e)}var be=n((()=>{k()}));function xe(e){if(typeof e!=`string`)return e;let t=A[e];if(t)return t;throw T.includes(e)?Error(`Zine: the '${e}' curl is not bundled. Import it and pass the model: import { ${e} } from '@zinejs/core/curls' → curl: ${e}`):Error(`Zine: unknown curl ${JSON.stringify(e)}.`)}var Se,Ce,A,we=n((()=>{ve(),be(),D(),Se={deform:le,anchored:!0},Ce={deform:ye,anchored:!1,flat:!0,gloss:!1},A={cone:Se,simple:Ce}}));function Te(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 Ee=n((()=>{}));function De(e,t,n){let r=e.createProgram();if(r===null)throw Error(`WebglRenderer: could not create a program.`);let i=Oe(e,e.VERTEX_SHADER,t),a=Oe(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 Oe(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 ke=n((()=>{}));function Ae(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 je(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 Me=n((()=>{})),Ne=r({WebglRenderer:()=>He});function j(e){return e.left===null==(e.right===null)?0:e.right===null?1:-1}var Pe,Fe,Ie,Le,M,N,Re,ze,Be,Ve,He,Ue=n((()=>{k(),we(),D(),Ee(),ke(),Me(),Pe=`#version 300 es
|
|
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}}},_=`page`,v=!1;function y(){return v?!1:(v=!0,!0)}function b(){v=!1}function x(e){let t=new URLSearchParams(e.replace(/^#/,``)).get(_);if(t===null)return null;let n=Number(t);return Number.isInteger(n)&&n>=1?n-1:null}function S(e,t){let n=new URLSearchParams(e.replace(/^#/,``));return n.set(_,String(t+1)),`#${n.toString()}`}function C(e,t){let n=null,r=()=>{let r=x(e.location.hash);r===null||r===n||(n=r,t(r))};return e.addEventListener(`hashchange`,r),{push(t){if(t===n)return;n=t;let r=S(e.location.hash,t);r!==e.location.hash&&e.history?.replaceState?.(e.history.state,``,r)},stop(){e.removeEventListener(`hashchange`,r)}}}var w,T,E,D=n((()=>{w=[`cone`,`simple`],T=[`roll`,`leaf`,`flick`,`silk`],E=`cone`}));function ee(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 te=n((()=>{})),ne=r({CssRenderer:()=>oe});function re(e){return e.left===null==(e.right===null)?0:e.right===null?1:-1}function ie(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 ae,oe,se=n((()=>{te(),ae=180/Math.PI,oe=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=ie(`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:re(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:re(e),this.#d=r?.fill?0:re(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=ie(n),this.#l.style.opacity=`0`}setFlipProgress(e,t){let n=ee(e),r=n.angle*ae;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,o=a?e=>({x:a.x*e,y:a.y*e,width:a.width*e,height:a.height*e}):void 0;return{containerWidth:t,containerHeight:n,pageWidth:t/2,pageHeight:n,book:i,content:a,screenAt:o}}#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 ce(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 le(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?de:ue,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?me:fe,g=n*(h+((c?he:pe)-h)*l),_=(i.y-.5)*2,v=_>=0,y=Math.min(1,Math.abs(_)/ge),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**+_e: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 ue,de,fe,pe,me,he,ge,_e,ve=n((()=>{k(),ue=30*Math.PI/180,de=44*Math.PI/180,fe=1.35,pe=.7,me=1.85,he=1.15,ge=.42,_e=1.08}));function ye(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 be=n((()=>{k()}));function xe(e){if(typeof e!=`string`)return e;let t=A[e];if(t)return t;throw T.includes(e)?Error(`Zine: the '${e}' curl is not bundled. Import it and pass the model: import { ${e} } from '@zinejs/core/curls' → curl: ${e}`):Error(`Zine: unknown curl ${JSON.stringify(e)}.`)}var Se,Ce,A,we=n((()=>{ve(),be(),D(),Se={deform:le,anchored:!0},Ce={deform:ye,anchored:!1,flat:!0,gloss:!1},A={cone:Se,simple:Ce}}));function Te(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 Ee=n((()=>{}));function De(e,t,n){let r=e.createProgram();if(r===null)throw Error(`WebglRenderer: could not create a program.`);let i=Oe(e,e.VERTEX_SHADER,t),a=Oe(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 Oe(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 ke=n((()=>{}));function Ae(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 je(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 Me=n((()=>{})),Ne=r({WebglRenderer:()=>We});function j(e){return e.left===null==(e.right===null)?0:e.right===null?1:-1}var Pe,Fe,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge=n((()=>{k(),we(),D(),Ee(),ke(),Me(),Pe=`#version 300 es
|
|
2
2
|
in vec2 aUnit;
|
|
3
3
|
uniform vec2 uViewport;
|
|
4
4
|
uniform vec4 uRect;
|
|
@@ -64,6 +64,7 @@ uniform sampler2D uBack;
|
|
|
64
64
|
uniform highp float uDir;
|
|
65
65
|
uniform float uGloss; // 0 disables the specular highlight (e.g. the flat 'simple' curl)
|
|
66
66
|
uniform float uAlpha; // leaf opacity; a lone page dissolves into the page landing beneath it
|
|
67
|
+
uniform float uCrease; // spine-crease strength: 1 matches a spread's gutter; ramps from 0 for a lone leaf
|
|
67
68
|
out vec4 outColor;
|
|
68
69
|
void main() {
|
|
69
70
|
// The turn mesh carries its own facing in the normal; the front points at the viewer
|
|
@@ -77,7 +78,10 @@ void main() {
|
|
|
77
78
|
// rolled edge reads as a deep crease with a soft highlight riding the ridge.
|
|
78
79
|
float diff = clamp(abs(vFacing), 0.0, 1.0);
|
|
79
80
|
float lit = mix(0.42, 1.0, diff);
|
|
80
|
-
|
|
81
|
+
// Spine crease matches the gutter shadow on a spread. A lone page has no gutter, so uCrease
|
|
82
|
+
// ramps it in from 0 as the leaf lifts — otherwise a still-flat leaf paints a shadow band on
|
|
83
|
+
// the anchor edge before the turn even begins.
|
|
84
|
+
lit *= mix(1.0, mix(0.7, 1.0, smoothstep(0.0, 0.12, vU)), uCrease);
|
|
81
85
|
|
|
82
86
|
// Glossy specular: brightest where the surface tilts ~30 deg from facing the viewer,
|
|
83
87
|
// so a thin glossy highlight rides across the sheet as it rolls.
|
|
@@ -87,7 +91,57 @@ void main() {
|
|
|
87
91
|
// Premultiplied alpha (blendFunc ONE, ONE_MINUS_SRC_ALPHA): scale colour as well as alpha,
|
|
88
92
|
// or fading would brighten the sheet additively instead of dissolving it.
|
|
89
93
|
outColor = vec4(c.rgb * uAlpha, c.a * uAlpha);
|
|
90
|
-
}`,M=28,N=36,Re=.7,ze=.8,Be=4e3,Ve=256*1024*1024,He=class{#e=null;#t=null;#n=null;#r=null;#i=null;#a=null;#o=null;#s=null;#c=null;#l=0;#u=se(M,N);#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=A[E];#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=Te(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=xe(r.curl)),r?.anchor&&(this.#C=r.anchor),this.#T=i?0:j(e),this.#E=i?0:j(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,o=a?e=>{let t=this.#w/this.#_;return{x:(a.x-t)*e+t,y:a.y*e,width:a.width*e,height:a.height*e}}:void 0;return{containerWidth:t,containerHeight:n,pageWidth:t/2,pageHeight:n,book:i,content:a,screenAt:o}}#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&&j(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(),Be))};#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=De(e,Pe,Fe),this.#i=De(e,Ie,Le);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<N;e++)for(let t=0;t<M;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:j(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;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.gloss===!1?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.flat?Re:ze,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=Ae(t);je(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<=Ve||this.#d.size<=4)break;this.#d.delete(t),this.#f-=n.bytes,e.deleteTexture(n.tex)}}#te(e){let t=Ae(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))}}})),We={css:async()=>new(await(Promise.resolve().then(()=>(oe(),ne)))).CssRenderer,webgl2:async()=>new(await(Promise.resolve().then(()=>(Ue(),Ne)))).WebglRenderer},Ge=!0;function Ke(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&typeof e.mount==`function`}function qe(e){return e.gpu&&Ge?[`webgl2`,`css`]:[`css`]}function Je(){return{gpu:Ye()}}function Ye(){try{return!!document.createElement(`canvas`).getContext(`webgl2`)}catch{return!1}}async function P(e=`auto`,t=Je()){if(Ke(e))return e;let n=Array.isArray(e)?e:e===`auto`?qe(t):[e];for(let e of n){if(e===`webgl2`&&!t.gpu)continue;let n=We[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 Xe(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 Qe(e,t)}function Ze(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 Qe=class{#e;#t;#n;#r;#i=new Map;#a=new Map;open;onPageUpdate;getText;getDownload;getOutline;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)))}),typeof e.getText==`function`&&(this.getText=async t=>{let n=this.#t===null?0:1;if(this.#t!==null&&t===0||this.#n!==null&&t===this.pageCount-1)return``;let r=t-n;return this.#i.has(r)?``:e.getText(r)}),typeof e.getDownload==`function`&&(this.getDownload=()=>e.getDownload()),typeof e.getOutline==`function`&&(this.getOutline=async()=>{let t=await e.getOutline(),n=this.#t===null?0:1;if(n===0)return t;let r=e=>e.map(e=>({...e,page:e.page===null?null:e.page+n,children:r(e.children)}));return r(t)})}get pageCount(){return this.#e.pageCount+(this.#t===null?0:1)+(this.#n===null?0:1)}get(e,t){let n=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 r=e-n,i=this.#i.get(r);return i===void 0?this.#e.get(r,t):this.#s(i)}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=Ze(e).catch(t=>{throw this.#a.delete(e),t}),this.#a.set(e,t)),t}};function F(e,t){let n=e.createElementNS(`http://www.w3.org/2000/svg`,`svg`);return n.setAttribute(`viewBox`,`0 0 24 24`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.75`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`focusable`,`false`),n.innerHTML=t,n}var I,L=n((()=>{I={prev:`<path d="m15 18-6-6 6-6"/>`,next:`<path d="m9 18 6-6-6-6"/>`,first:`<path d="m11 17-5-5 5-5"/><path d="m18 17-5-5 5-5"/>`,last:`<path d="m6 17 5-5-5-5"/><path d="m13 17 5-5-5-5"/>`,zoomIn:`<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M11 8v6"/><path d="M8 11h6"/>`,zoomOut:`<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M8 11h6"/>`,search:`<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>`,share:`<circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><path d="m8.6 13.5 6.8 4"/><path d="m15.4 6.5-6.8 4"/>`,menu:`<circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/>`,fullscreen:`<path d="M8 3H5a2 2 0 0 0-2 2v3"/><path d="M21 8V5a2 2 0 0 0-2-2h-3"/><path d="M3 16v3a2 2 0 0 0 2 2h3"/><path d="M16 21h3a2 2 0 0 0 2-2v-3"/>`,exitFullscreen:`<path d="M8 3v3a2 2 0 0 1-2 2H3"/><path d="M21 8h-3a2 2 0 0 1-2-2V3"/><path d="M3 16h3a2 2 0 0 1 2 2v3"/><path d="M16 21v-3a2 2 0 0 1 2-2h3"/>`,thumbnails:`<path d="M7 2h10"/><path d="M5 6h14"/><rect width="18" height="12" x="3" y="10" rx="2"/>`,outline:`<path d="M21 12h-8"/><path d="M21 6h-8"/><path d="M21 18h-8"/><path d="M3 6v4c0 1.1.9 2 2 2h3"/><path d="M3 10v6c0 1.1.9 2 2 2h3"/>`,twoPages:`<path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/>`,onePage:`<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v5h6"/>`,print:`<path d="M6 9V2h12v7"/><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect width="12" height="8" x="6" y="14" rx="1"/>`,download:`<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/>`,close:`<path d="M18 6 6 18"/><path d="m6 6 12 12"/>`}}));function R(e){return B.set(e.id,e),e}function $e(e){return B.get(e)}function z(e){if(typeof e==`string`){let t=B.get(e);if(!t)throw Error(`controls: unknown control '${e}'. Register it with defineControl() or pass a definition object.`);return t}let t=B.get(e.id);return t?{...t,...e}:e}var B,V,H=n((()=>{B=new Map,V=[`prev`,`pageInput`,`next`,`|`,`zoomOut`,`zoomIn`,`search`,`share`,`menu`,`fullscreen`]})),U,et,tt=n((()=>{U=encodeURIComponent,et=[{id:`facebook`,label:`Facebook`,icon:`<path fill="currentColor" stroke="none" d="M22 12a10 10 0 1 0-11.56 9.88v-6.99H7.9V12h2.54V9.8c0-2.5 1.49-3.89 3.77-3.89 1.1 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56V12h2.78l-.45 2.89h-2.33v6.99A10 10 0 0 0 22 12Z"/>`,href:e=>`https://www.facebook.com/sharer/sharer.php?u=${U(e)}`},{id:`x`,label:`X (Twitter)`,icon:`<path fill="currentColor" stroke="none" d="M17.53 3h3.06l-6.69 7.64L21.75 21h-6.16l-4.82-6.3L5.24 21H2.18l7.15-8.17L2.25 3h6.32l4.36 5.77L17.53 3Zm-1.07 16.17h1.69L7.62 4.73H5.8l10.66 14.44Z"/>`,href:(e,t)=>`https://twitter.com/intent/tweet?url=${U(e)}&text=${U(t)}`},{id:`linkedin`,label:`LinkedIn`,icon:`<path fill="currentColor" stroke="none" d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05a3.74 3.74 0 0 1 3.37-1.85c3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.34 7.43a2.07 2.07 0 1 1 0-4.13 2.07 2.07 0 0 1 0 4.13Zm1.78 13.02H3.55V9h3.57v11.45ZM22.22 0H1.77C.79 0 0 .77 0 1.72v20.56C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.72V1.72C24 .77 23.2 0 22.22 0Z"/>`,href:e=>`https://www.linkedin.com/sharing/share-offsite/?url=${U(e)}`},{id:`whatsapp`,label:`WhatsApp`,icon:`<path fill="currentColor" stroke="none" d="M12.04 2a9.9 9.9 0 0 0-8.5 14.9L2 22l5.25-1.38A9.9 9.9 0 1 0 12.04 2Zm5.8 14.06c-.25.7-1.44 1.33-1.99 1.38-.53.05-1.02.24-3.44-.72-2.9-1.14-4.73-4.1-4.87-4.29-.14-.19-1.16-1.54-1.16-2.94s.73-2.08 1-2.37c.26-.28.57-.35.76-.35h.55c.17 0 .42-.07.65.5.24.58.8 2 .87 2.14.07.14.12.31.02.5-.09.19-.14.3-.28.47l-.42.48c-.14.14-.28.29-.12.57.16.28.7 1.16 1.51 1.88 1.04.93 1.91 1.21 2.19 1.35.28.15.44.12.6-.07.17-.19.7-.81.88-1.09.19-.28.37-.23.63-.14.25.1 1.63.77 1.9.91.29.14.48.21.55.33.07.11.07.67-.18 1.37Z"/>`,href:(e,t)=>`https://api.whatsapp.com/send?text=${U(`${t} ${e}`)}`},{id:`pinterest`,label:`Pinterest`,icon:`<path fill="currentColor" stroke="none" d="M12 2a10 10 0 0 0-3.65 19.31c-.09-.78-.17-1.98.03-2.83.19-.78 1.2-4.98 1.2-4.98s-.3-.61-.3-1.52c0-1.42.82-2.48 1.85-2.48.87 0 1.3.66 1.3 1.44 0 .88-.56 2.2-.85 3.42-.24 1.02.51 1.86 1.52 1.86 1.83 0 3.23-1.93 3.23-4.7 0-2.46-1.77-4.18-4.29-4.18-2.92 0-4.64 2.19-4.64 4.46 0 .88.34 1.83.76 2.35a.3.3 0 0 1 .07.29l-.28 1.16c-.05.19-.15.23-.34.14-1.28-.6-2.08-2.47-2.08-3.98 0-3.24 2.35-6.21 6.79-6.21 3.56 0 6.33 2.54 6.33 5.93 0 3.54-2.23 6.39-5.32 6.39-1.04 0-2.02-.54-2.35-1.18l-.64 2.44c-.23.89-.86 2.01-1.28 2.69A10 10 0 1 0 12 2Z"/>`,href:(e,t)=>`https://pinterest.com/pin/create/button/?url=${U(e)}&description=${U(t)}`},{id:`email`,label:`Email`,icon:`<path fill="currentColor" stroke="none" d="M20 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2Zm0 4.24-7.47 4.67a1 1 0 0 1-1.06 0L4 8.24V6.4l8 5 8-5v1.84Z"/>`,href:(e,t)=>`mailto:?subject=${U(t)}&body=${U(e)}`}]}));function nt(e){let t=new Uint8Array([1]);for(let n=0;n<e;n++){let e=new Uint8Array(t.length+1);for(let r=0;r<t.length;r++)e[r]=e[r]^t[r],e[r+1]=e[r+1]^Y(t[r],q[n]);t=e}return t}function rt(e,t){let n=nt(t),r=new Uint8Array(t);for(let i of e){let e=i^r[0];if(r.copyWithin(0,1),r[t-1]=0,e!==0)for(let i=0;i<t;i++)r[i]=r[i]^Y(n[i+1],e)}return r}function it(e){let t=0|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;return(t<<10|n)^21522}function W(e,t,n){for(let r=-1;r<=7;r++)for(let i=-1;i<=7;i++){let a=t+i,o=n+r;if(a<0||o<0||a>=e.size||o>=e.size)continue;let s=Math.max(Math.abs(i-3),Math.abs(r-3));X(e,a,o,s!==2&&s<=3)}}function at(e){let t=new TextEncoder().encode(e),n=G.findIndex(e=>t.length+2<=e)+1;if(n===0)throw Error(`qr: ${t.length} bytes is too long for this encoder (max 214).`);let r=G[n-1],i=[],a=(e,t)=>{for(let n=t-1;n>=0;n--)i.push(e>>>n&1)};a(4,4),a(t.length,n<10?8:16);for(let e of t)a(e,8);for(a(0,Math.min(4,r*8-i.length));i.length%8;)i.push(0);let o=new Uint8Array(r);for(let e=0;e<i.length;e+=8){let t=0;for(let n=0;n<8;n++)t=t<<1|i[e+n];o[e/8]=t}for(let e=i.length/8,t=0;e<r;e++,t++)o[e]=t%2==0?236:17;let s=ct[n-1],c=st[n-1],l=Math.floor(r/s),u=r%s,d=[],f=[];for(let e=0,t=0;e<s;e++){let n=l+ +(e>=s-u),r=o.subarray(t,t+n);t+=n,d.push(r),f.push(rt(r,c))}let p=[];for(let e=0;e<l+1;e++)for(let t of d)e<t.length&&p.push(t[e]);for(let e=0;e<c;e++)for(let t of f)p.push(t[e]);let m=n*4+17,h={size:m,modules:new Uint8Array(m*m),reserved:new Uint8Array(m*m)};W(h,0,0),W(h,m-7,0),W(h,0,m-7);for(let e=8;e<m-8;e++){let t=e%2==0;X(h,e,6,t),X(h,6,e,t)}for(let e of K[n-1])for(let t of K[n-1])if(!(e<9&&t<9||e<9&&t>m-10||e>m-10&&t<9))for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)X(h,e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!==1);X(h,8,m-8,!0);for(let e=0;e<9;e++)e!==6&&(X(h,e,8,!1),X(h,8,e,!1));for(let e=0;e<8;e++)X(h,m-1-e,8,!1),X(h,8,m-1-e,!1);X(h,8,m-8,!0);let g=0,_=p.length*8;for(let e=m-1;e>=1;e-=2){e===6&&(e=5);for(let t=0;t<m;t++)for(let n=0;n<2;n++){let r=e-n,i=e+1&2?t:m-1-t;if(h.reserved[i*m+r])continue;let a=!1;g<_&&(a=(p[g>>>3]>>>7-(g&7)&1)==1,g++),(r+i)%2==0&&(a=!a),X(h,r,i,a,!1)}}let v=it(0);for(let e=0;e<15;e++){let t=(v>>>e&1)==1,n=e<6?e:e<8?e+1:8,r=e<8?8:e<9?7:14-e;X(h,n,8,t),X(h,8,r,t),e<8?X(h,m-1-e,8,t):X(h,8,m-15+e,t)}return X(h,8,m-8,!0),{size:m,modules:h.modules}}function ot(e,t){let{size:n,modules:r}=at(e),i=``;for(let e=0;e<n;e++)for(let t=0;t<n;t++)r[e*n+t]&&(i+=`M${t} ${e}h1v1h-1z`);let a=n+4;return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${t}" viewBox="0 0 ${a} ${a}" shape-rendering="crispEdges"><rect width="${a}" height="${a}" fill="#fff"/><g transform="translate(2 2)" fill="#000">${`<path d="${i}"/>`}</g></svg>`}var G,st,ct,K,q,J,Y,X,lt=n((()=>{G=[16,28,44,64,86,108,124,154,182,216],st=[10,16,26,18,24,16,18,22,22,26],ct=[1,1,1,2,2,4,4,4,5,5],K=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50]],q=new Uint8Array(512),J=new Uint8Array(256);for(let e=0,t=1;e<255;e++)q[e]=t,J[t]=e,t<<=1,t&256&&(t^=285);for(let e=255;e<512;e++)q[e]=q[e-255];Y=(e,t)=>e===0||t===0?0:q[(J[e]+J[t])%255],X=(e,t,n,r,i=!0)=>{e.modules[n*e.size+t]=+!!r,i&&(e.reserved[n*e.size+t]=1)}})),ut=r({ShareDialog:()=>pt}),dt,ft,pt,mt=n((()=>{L(),tt(),lt(),dt=132,ft=1600,pt=class{#e;#t;#n;#r;#i=null;#a;constructor(e,t){let n=t.ownerDocument;this.#e=n,this.#r=n.activeElement;let r=e.pageLink(),i=n.title||`Flipbook`;this.#t=n.createElement(`div`),this.#t.className=`zine-share-backdrop`,this.#t.addEventListener(`pointerdown`,e=>{e.target===this.#t&&this.close()}),this.#n=n.createElement(`div`),this.#n.className=`zine-share`,this.#n.setAttribute(`role`,`dialog`),this.#n.setAttribute(`aria-modal`,`true`),this.#n.setAttribute(`aria-label`,`Share`),this.#t.appendChild(this.#n);let a=n.createElement(`div`);a.className=`zine-share-head`;let o=n.createElement(`strong`);o.textContent=`Share`;let s=n.createElement(`button`);s.type=`button`,s.className=`zine-share-close`,s.setAttribute(`aria-label`,`Close`),s.appendChild(F(n,I.close)),s.addEventListener(`click`,()=>this.close()),a.append(o,s),this.#n.append(a,this.#s(n,r),this.#l(n,r,i));let c=this.#o(n,r);c&&this.#n.insertBefore(c,this.#n.children[1]),t.ownerDocument.body.appendChild(this.#t),this.#a=e=>{e.key===`Escape`&&this.close(),e.key===`Tab`&&this.#u(e)},this.#t.addEventListener(`keydown`,this.#a),s.focus()}#o(e,t){if(!t)return null;try{let n=e.createElement(`div`);return n.className=`zine-share-qr`,n.innerHTML=ot(t,dt),n.setAttribute(`aria-label`,`QR code for this page`),n.setAttribute(`role`,`img`),n}catch{return null}}#s(e,t){let n=e.createElement(`div`);n.className=`zine-share-link`;let r=e.createElement(`input`);r.type=`text`,r.readOnly=!0,r.value=t,r.setAttribute(`aria-label`,`Link to this page`),r.addEventListener(`focus`,()=>r.select());let i=e.createElement(`button`);return i.type=`button`,i.className=`zine-share-copy`,i.textContent=`Copy`,i.addEventListener(`click`,()=>{this.#c(t,i)}),n.append(r,i),n}async#c(e,t){try{await navigator.clipboard?.writeText(e),t.textContent=`Copied`}catch{t.textContent=`Press Ctrl+C`}this.#i&&clearTimeout(this.#i),this.#i=setTimeout(()=>{t.textContent=`Copy`},ft)}#l(e,t,n){let r=e.createElement(`div`);r.className=`zine-share-socials`;for(let i of et){let a=e.createElement(`a`);a.className=`zine-share-social`,a.href=i.href(t,n),a.title=i.label,a.setAttribute(`aria-label`,`Share on ${i.label}`),i.id!==`email`&&(a.target=`_blank`,a.rel=`noopener noreferrer`),a.appendChild(F(e,i.icon)),r.appendChild(a)}return r}#u(e){let t=[...this.#n.querySelectorAll(`button, a[href], input`)].filter(e=>!e.hasAttribute(`disabled`));if(t.length===0)return;let n=t[0],r=t.at(-1),i=this.#e.activeElement;e.shiftKey&&i===n?(r.focus(),e.preventDefault()):!e.shiftKey&&i===r&&(n.focus(),e.preventDefault())}close(){this.destroy()}destroy(){this.#i&&clearTimeout(this.#i),this.#i=null,this.#t.removeEventListener(`keydown`,this.#a),this.#t.remove(),this.#r?.focus?.()}}}));function ht(){R({id:`prev`,title:`Previous page`,icon:I.prev,isDisabled:e=>!e.zine.canFlipPrev(),action:e=>e.zine.flipPrev()}),R({id:`next`,title:`Next page`,icon:I.next,isDisabled:e=>!e.zine.canFlipNext(),action:e=>e.zine.flipNext()});let e=e=>e.zine.getDirection()===`rtl`;R({id:`first`,title:`First page`,icon:t=>e(t)?I.last:I.first,isDisabled:e=>!e.zine.canFlipPrev(),action:e=>{e.zine.flipTo(0),e.close()}}),R({id:`last`,title:`Last page`,icon:t=>e(t)?I.first:I.last,isDisabled:e=>!e.zine.canFlipNext(),action:e=>{e.zine.flipTo(e.zine.getPageCount()-1),e.close()}}),R({id:`zoomIn`,title:`Zoom in`,icon:I.zoomIn,isDisabled:e=>e.zine.getZoom()>=e.zine.getMaxZoom()-1e-6,action:e=>e.zine.setZoom(e.zine.getZoom()*gt)}),R({id:`zoomOut`,title:`Zoom out`,icon:I.zoomOut,isDisabled:e=>e.zine.getZoom()<=1.000001,action:e=>e.zine.setZoom(e.zine.getZoom()/gt)}),R({id:`fullscreen`,title:`Fullscreen`,icon:I.fullscreen,isVisible:e=>typeof e.zine.container.requestFullscreen==`function`,isActive:_t,action:e=>{let t=e.zine.container.ownerDocument;_t(e)?t?.exitFullscreen?.():e.zine.container.requestFullscreen?.(),e.close()}}),R({id:`share`,title:`Share`,icon:I.share,action:e=>{e.close(),Promise.resolve().then(()=>(mt(),ut)).then(({ShareDialog:t})=>new t(e.zine,e.zine.container)).catch(()=>{navigator.clipboard?.writeText(e.zine.pageLink()).catch(()=>{})})}}),R({id:`download`,title:`Download PDF`,icon:I.download,isVisible:e=>e.zine.canDownload(),action:e=>{e.zine.download(),e.close()}}),R({id:`spread`,title:e=>e.zine.isSinglePage()?`Show two pages`:`Show one page`,icon:e=>e.zine.isSinglePage()?I.twoPages:I.onePage,isVisible:e=>!e.zine.isResponsiveSingle(),action:e=>{e.zine.toggleSpreadMode(),e.close()}}),R({id:`print`,title:`Print`,icon:I.print,isVisible:e=>e.zine.canPrint(),action:e=>{e.zine.print(),e.close()}}),R({id:`menu`,title:`More`,icon:I.menu,children:[`first`,`last`,`spread`,`thumbnails`,`outline`,`print`,`download`]})}var gt,_t,vt=n((()=>{L(),H(),gt=Math.SQRT2,_t=e=>e.zine.container.ownerDocument?.fullscreenElement===e.zine.container}));function yt(e){if(e.getElementById(bt))return;let t=e.createElement(`style`);t.id=bt,t.textContent=xt,(e.head??e.documentElement)?.appendChild(t)}var bt,xt,St=n((()=>{bt=`zine-controls-style`,xt=`
|
|
94
|
+
}`,Re=28,ze=36,Be=.7,Ve=.8,He=4e3,Ue=256*1024*1024,We=class{#e=null;#t=null;#n=null;#r=null;#i=null;#a=null;#o=null;#s=null;#c=null;#l=0;#u=ce(Re,ze);#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=A[E];#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=Te(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=xe(r.curl)),r?.anchor&&(this.#C=r.anchor),this.#T=i?0:j(e),this.#E=i?0:j(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,o=a?e=>{let t=this.#w/this.#_;return{x:(a.x-t)*e+t,y:a.y*e,width:a.width*e,height:a.height*e}}:void 0;return{containerWidth:t,containerHeight:n,pageWidth:t/2,pageHeight:n,book:i,content:a,screenAt:o}}#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&&j(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(),He))};#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=De(e,Pe,Fe),this.#i=De(e,Ie,Le);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`,`uCrease`])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<ze;e++)for(let t=0;t<Re;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:j(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;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.gloss===!1?0:1),e.uniform1f(this.#h.uAlpha??null,r.fill?this.#Y():1),e.uniform1f(this.#h.uCrease??null,r.fill?Math.min(1,this.#x/.2):1),e.drawElements(e.TRIANGLES,this.#l,e.UNSIGNED_SHORT,0)}#Y(){let e=this.#S.flat?Be:Ve,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=Ae(t);je(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<=Ue||this.#d.size<=4)break;this.#d.delete(t),this.#f-=n.bytes,e.deleteTexture(n.tex)}}#te(e){let t=Ae(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))}}})),Ke={css:async()=>new(await(Promise.resolve().then(()=>(se(),ne)))).CssRenderer,webgl2:async()=>new(await(Promise.resolve().then(()=>(Ge(),Ne)))).WebglRenderer},qe=!0;function Je(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&typeof e.mount==`function`}function Ye(e){return e.gpu&&qe?[`webgl2`,`css`]:[`css`]}function Xe(){return{gpu:Ze()}}function Ze(){try{return!!document.createElement(`canvas`).getContext(`webgl2`)}catch{return!1}}async function Qe(e=`auto`,t=Xe()){if(Je(e))return e;let n=Array.isArray(e)?e:e===`auto`?Ye(t):[e];for(let e of n){if(e===`webgl2`&&!t.gpu)continue;let n=Ke[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 $e(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 tt(e,t)}function et(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 tt=class{#e;#t;#n;#r;#i=new Map;#a=new Map;open;onPageUpdate;onProgress;getText;getDownload;getOutline;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)))}),typeof e.onProgress==`function`&&(this.onProgress=t=>e.onProgress(t)),typeof e.getText==`function`&&(this.getText=async t=>{let n=this.#t===null?0:1;if(this.#t!==null&&t===0||this.#n!==null&&t===this.pageCount-1)return``;let r=t-n;return this.#i.has(r)?``:e.getText(r)}),typeof e.getDownload==`function`&&(this.getDownload=()=>e.getDownload()),typeof e.getOutline==`function`&&(this.getOutline=async()=>{let t=await e.getOutline(),n=this.#t===null?0:1;if(n===0)return t;let r=e=>e.map(e=>({...e,page:e.page===null?null:e.page+n,children:r(e.children)}));return r(t)})}get pageCount(){return this.#e.pageCount+(this.#t===null?0:1)+(this.#n===null?0:1)}get(e,t){let n=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 r=e-n,i=this.#i.get(r);return i===void 0?this.#e.get(r,t):this.#s(i)}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=et(e).catch(t=>{throw this.#a.delete(e),t}),this.#a.set(e,t)),t}},nt=r({CSS:()=>N,mountLoading:()=>it});function rt(e){if(e.getElementById(M))return;let t=e.createElement(`style`);t.id=M,t.textContent=N,(e.head??e.documentElement)?.appendChild(t)}function it(e){let t=e.ownerDocument;rt(t);let n=t.createElement(`div`);n.className=`zine-loading`,n.setAttribute(`role`,`status`),n.setAttribute(`aria-live`,`polite`);let r=t.createElement(`div`);r.className=`zine-loading-spinner`,r.setAttribute(`aria-hidden`,`true`);let i=t.createElement(`div`);i.className=`zine-loading-text`,i.textContent=`Opening document…`;let a=t.createElement(`div`);a.className=`zine-loading-bar`,a.style.display=`none`;let o=t.createElement(`div`);o.className=`zine-loading-fill`,a.appendChild(o),n.append(r,i,a),e.appendChild(n);let s=null,c=typeof globalThis.getComputedStyle==`function`?globalThis.getComputedStyle(e):null;(!c||c.position===`static`||c.position===``)&&(s=e.style.position,e.style.position=`relative`);let l=!1,u=setTimeout(()=>{l=!0,n.classList.add(`zine-loading-shown`)},at);return{update(e){if(e.total>0){let t=Math.min(100,Math.round(e.loaded/e.total*100));i.textContent=`Downloading document… ${t}%`,a.style.display=``,o.style.width=`${t}%`}else i.textContent=`Downloading document… ${ot(e.loaded)}`,a.style.display=`none`},preparing(){i.textContent=`Preparing pages…`,a.style.display=`none`},destroy(){l||clearTimeout(u),n.remove(),s!==null&&(e.style.position=s)}}}var M,at,N,ot,st=n((()=>{M=`zine-loading-style`,at=150,N=`
|
|
95
|
+
.zine-loading {
|
|
96
|
+
position: absolute;
|
|
97
|
+
inset: 0;
|
|
98
|
+
z-index: 3;
|
|
99
|
+
display: flex;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
align-items: center;
|
|
102
|
+
justify-content: center;
|
|
103
|
+
gap: 14px;
|
|
104
|
+
padding: 24px;
|
|
105
|
+
box-sizing: border-box;
|
|
106
|
+
text-align: center;
|
|
107
|
+
font: 500 14px/1.4 system-ui, sans-serif;
|
|
108
|
+
color: var(--zine-loading-fg, #d4d4d8);
|
|
109
|
+
background: var(--zine-loading-bg, #0c0c11);
|
|
110
|
+
border-radius: inherit;
|
|
111
|
+
opacity: 0;
|
|
112
|
+
transition: opacity 150ms ease;
|
|
113
|
+
}
|
|
114
|
+
.zine-loading-shown { opacity: 1; }
|
|
115
|
+
.zine-loading-spinner {
|
|
116
|
+
width: 32px;
|
|
117
|
+
height: 32px;
|
|
118
|
+
border: 3px solid var(--zine-loading-track, rgba(255, 255, 255, 0.14));
|
|
119
|
+
border-top-color: var(--zine-loading-accent, #7dd3fc);
|
|
120
|
+
border-radius: 50%;
|
|
121
|
+
animation: zine-loading-spin 0.8s linear infinite;
|
|
122
|
+
}
|
|
123
|
+
@keyframes zine-loading-spin { to { transform: rotate(360deg); } }
|
|
124
|
+
.zine-loading-text { font-variant-numeric: tabular-nums; }
|
|
125
|
+
.zine-loading-bar {
|
|
126
|
+
width: min(240px, 70%);
|
|
127
|
+
height: 6px;
|
|
128
|
+
background: var(--zine-loading-track, rgba(255, 255, 255, 0.14));
|
|
129
|
+
border-radius: 3px;
|
|
130
|
+
overflow: hidden;
|
|
131
|
+
}
|
|
132
|
+
.zine-loading-fill {
|
|
133
|
+
width: 0;
|
|
134
|
+
height: 100%;
|
|
135
|
+
background: var(--zine-loading-accent, #7dd3fc);
|
|
136
|
+
border-radius: 3px;
|
|
137
|
+
transition: width 150ms ease-out;
|
|
138
|
+
}
|
|
139
|
+
@media (prefers-reduced-motion: reduce) {
|
|
140
|
+
.zine-loading { transition: none; }
|
|
141
|
+
.zine-loading-spinner { animation-duration: 2s; }
|
|
142
|
+
.zine-loading-fill { transition: none; }
|
|
143
|
+
}
|
|
144
|
+
`,ot=e=>`${(e/1024/1024).toFixed(1)} MB`}));function P(e,t){let n=e.createElementNS(`http://www.w3.org/2000/svg`,`svg`);return n.setAttribute(`viewBox`,`0 0 24 24`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.75`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`focusable`,`false`),n.innerHTML=t,n}var F,I=n((()=>{F={prev:`<path d="m15 18-6-6 6-6"/>`,next:`<path d="m9 18 6-6-6-6"/>`,first:`<path d="m11 17-5-5 5-5"/><path d="m18 17-5-5 5-5"/>`,last:`<path d="m6 17 5-5-5-5"/><path d="m13 17 5-5-5-5"/>`,zoomIn:`<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M11 8v6"/><path d="M8 11h6"/>`,zoomOut:`<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M8 11h6"/>`,search:`<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>`,share:`<circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><path d="m8.6 13.5 6.8 4"/><path d="m15.4 6.5-6.8 4"/>`,menu:`<circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/>`,fullscreen:`<path d="M8 3H5a2 2 0 0 0-2 2v3"/><path d="M21 8V5a2 2 0 0 0-2-2h-3"/><path d="M3 16v3a2 2 0 0 0 2 2h3"/><path d="M16 21h3a2 2 0 0 0 2-2v-3"/>`,exitFullscreen:`<path d="M8 3v3a2 2 0 0 1-2 2H3"/><path d="M21 8h-3a2 2 0 0 1-2-2V3"/><path d="M3 16h3a2 2 0 0 1 2 2v3"/><path d="M16 21v-3a2 2 0 0 1 2-2h3"/>`,thumbnails:`<path d="M7 2h10"/><path d="M5 6h14"/><rect width="18" height="12" x="3" y="10" rx="2"/>`,outline:`<path d="M21 12h-8"/><path d="M21 6h-8"/><path d="M21 18h-8"/><path d="M3 6v4c0 1.1.9 2 2 2h3"/><path d="M3 10v6c0 1.1.9 2 2 2h3"/>`,twoPages:`<path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/>`,onePage:`<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v5h6"/>`,print:`<path d="M6 9V2h12v7"/><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect width="12" height="8" x="6" y="14" rx="1"/>`,download:`<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/>`,close:`<path d="M18 6 6 18"/><path d="m6 6 12 12"/>`}}));function L(e){return R.set(e.id,e),e}function ct(e){return R.get(e)}function lt(e){if(typeof e==`string`){let t=R.get(e);if(!t)throw Error(`controls: unknown control '${e}'. Register it with defineControl() or pass a definition object.`);return t}let t=R.get(e.id);return t?{...t,...e}:e}var R,z,B=n((()=>{R=new Map,z=[`prev`,`pageInput`,`next`,`|`,`zoomOut`,`zoomIn`,`search`,`share`,`menu`,`fullscreen`]})),V,ut,dt=n((()=>{V=encodeURIComponent,ut=[{id:`facebook`,label:`Facebook`,icon:`<path fill="currentColor" stroke="none" d="M22 12a10 10 0 1 0-11.56 9.88v-6.99H7.9V12h2.54V9.8c0-2.5 1.49-3.89 3.77-3.89 1.1 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56V12h2.78l-.45 2.89h-2.33v6.99A10 10 0 0 0 22 12Z"/>`,href:e=>`https://www.facebook.com/sharer/sharer.php?u=${V(e)}`},{id:`x`,label:`X (Twitter)`,icon:`<path fill="currentColor" stroke="none" d="M17.53 3h3.06l-6.69 7.64L21.75 21h-6.16l-4.82-6.3L5.24 21H2.18l7.15-8.17L2.25 3h6.32l4.36 5.77L17.53 3Zm-1.07 16.17h1.69L7.62 4.73H5.8l10.66 14.44Z"/>`,href:(e,t)=>`https://twitter.com/intent/tweet?url=${V(e)}&text=${V(t)}`},{id:`linkedin`,label:`LinkedIn`,icon:`<path fill="currentColor" stroke="none" d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05a3.74 3.74 0 0 1 3.37-1.85c3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.34 7.43a2.07 2.07 0 1 1 0-4.13 2.07 2.07 0 0 1 0 4.13Zm1.78 13.02H3.55V9h3.57v11.45ZM22.22 0H1.77C.79 0 0 .77 0 1.72v20.56C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.72V1.72C24 .77 23.2 0 22.22 0Z"/>`,href:e=>`https://www.linkedin.com/sharing/share-offsite/?url=${V(e)}`},{id:`whatsapp`,label:`WhatsApp`,icon:`<path fill="currentColor" stroke="none" d="M12.04 2a9.9 9.9 0 0 0-8.5 14.9L2 22l5.25-1.38A9.9 9.9 0 1 0 12.04 2Zm5.8 14.06c-.25.7-1.44 1.33-1.99 1.38-.53.05-1.02.24-3.44-.72-2.9-1.14-4.73-4.1-4.87-4.29-.14-.19-1.16-1.54-1.16-2.94s.73-2.08 1-2.37c.26-.28.57-.35.76-.35h.55c.17 0 .42-.07.65.5.24.58.8 2 .87 2.14.07.14.12.31.02.5-.09.19-.14.3-.28.47l-.42.48c-.14.14-.28.29-.12.57.16.28.7 1.16 1.51 1.88 1.04.93 1.91 1.21 2.19 1.35.28.15.44.12.6-.07.17-.19.7-.81.88-1.09.19-.28.37-.23.63-.14.25.1 1.63.77 1.9.91.29.14.48.21.55.33.07.11.07.67-.18 1.37Z"/>`,href:(e,t)=>`https://api.whatsapp.com/send?text=${V(`${t} ${e}`)}`},{id:`pinterest`,label:`Pinterest`,icon:`<path fill="currentColor" stroke="none" d="M12 2a10 10 0 0 0-3.65 19.31c-.09-.78-.17-1.98.03-2.83.19-.78 1.2-4.98 1.2-4.98s-.3-.61-.3-1.52c0-1.42.82-2.48 1.85-2.48.87 0 1.3.66 1.3 1.44 0 .88-.56 2.2-.85 3.42-.24 1.02.51 1.86 1.52 1.86 1.83 0 3.23-1.93 3.23-4.7 0-2.46-1.77-4.18-4.29-4.18-2.92 0-4.64 2.19-4.64 4.46 0 .88.34 1.83.76 2.35a.3.3 0 0 1 .07.29l-.28 1.16c-.05.19-.15.23-.34.14-1.28-.6-2.08-2.47-2.08-3.98 0-3.24 2.35-6.21 6.79-6.21 3.56 0 6.33 2.54 6.33 5.93 0 3.54-2.23 6.39-5.32 6.39-1.04 0-2.02-.54-2.35-1.18l-.64 2.44c-.23.89-.86 2.01-1.28 2.69A10 10 0 1 0 12 2Z"/>`,href:(e,t)=>`https://pinterest.com/pin/create/button/?url=${V(e)}&description=${V(t)}`},{id:`email`,label:`Email`,icon:`<path fill="currentColor" stroke="none" d="M20 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2Zm0 4.24-7.47 4.67a1 1 0 0 1-1.06 0L4 8.24V6.4l8 5 8-5v1.84Z"/>`,href:(e,t)=>`mailto:?subject=${V(t)}&body=${V(e)}`}]}));function ft(e){let t=new Uint8Array([1]);for(let n=0;n<e;n++){let e=new Uint8Array(t.length+1);for(let r=0;r<t.length;r++)e[r]=e[r]^t[r],e[r+1]=e[r+1]^q(t[r],G[n]);t=e}return t}function pt(e,t){let n=ft(t),r=new Uint8Array(t);for(let i of e){let e=i^r[0];if(r.copyWithin(0,1),r[t-1]=0,e!==0)for(let i=0;i<t;i++)r[i]=r[i]^q(n[i+1],e)}return r}function mt(e){let t=0|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;return(t<<10|n)^21522}function H(e,t,n){for(let r=-1;r<=7;r++)for(let i=-1;i<=7;i++){let a=t+i,o=n+r;if(a<0||o<0||a>=e.size||o>=e.size)continue;let s=Math.max(Math.abs(i-3),Math.abs(r-3));J(e,a,o,s!==2&&s<=3)}}function ht(e){let t=new TextEncoder().encode(e),n=U.findIndex(e=>t.length+2<=e)+1;if(n===0)throw Error(`qr: ${t.length} bytes is too long for this encoder (max 214).`);let r=U[n-1],i=[],a=(e,t)=>{for(let n=t-1;n>=0;n--)i.push(e>>>n&1)};a(4,4),a(t.length,n<10?8:16);for(let e of t)a(e,8);for(a(0,Math.min(4,r*8-i.length));i.length%8;)i.push(0);let o=new Uint8Array(r);for(let e=0;e<i.length;e+=8){let t=0;for(let n=0;n<8;n++)t=t<<1|i[e+n];o[e/8]=t}for(let e=i.length/8,t=0;e<r;e++,t++)o[e]=t%2==0?236:17;let s=vt[n-1],c=_t[n-1],l=Math.floor(r/s),u=r%s,d=[],f=[];for(let e=0,t=0;e<s;e++){let n=l+ +(e>=s-u),r=o.subarray(t,t+n);t+=n,d.push(r),f.push(pt(r,c))}let p=[];for(let e=0;e<l+1;e++)for(let t of d)e<t.length&&p.push(t[e]);for(let e=0;e<c;e++)for(let t of f)p.push(t[e]);let m=n*4+17,h={size:m,modules:new Uint8Array(m*m),reserved:new Uint8Array(m*m)};H(h,0,0),H(h,m-7,0),H(h,0,m-7);for(let e=8;e<m-8;e++){let t=e%2==0;J(h,e,6,t),J(h,6,e,t)}for(let e of W[n-1])for(let t of W[n-1])if(!(e<9&&t<9||e<9&&t>m-10||e>m-10&&t<9))for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)J(h,e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!==1);J(h,8,m-8,!0);for(let e=0;e<9;e++)e!==6&&(J(h,e,8,!1),J(h,8,e,!1));for(let e=0;e<8;e++)J(h,m-1-e,8,!1),J(h,8,m-1-e,!1);J(h,8,m-8,!0);let g=0,_=p.length*8;for(let e=m-1;e>=1;e-=2){e===6&&(e=5);for(let t=0;t<m;t++)for(let n=0;n<2;n++){let r=e-n,i=e+1&2?t:m-1-t;if(h.reserved[i*m+r])continue;let a=!1;g<_&&(a=(p[g>>>3]>>>7-(g&7)&1)==1,g++),(r+i)%2==0&&(a=!a),J(h,r,i,a,!1)}}let v=mt(0);for(let e=0;e<15;e++){let t=(v>>>e&1)==1,n=e<6?e:e<8?e+1:8,r=e<8?8:e<9?7:14-e;J(h,n,8,t),J(h,8,r,t),e<8?J(h,m-1-e,8,t):J(h,8,m-15+e,t)}return J(h,8,m-8,!0),{size:m,modules:h.modules}}function gt(e,t){let{size:n,modules:r}=ht(e),i=``;for(let e=0;e<n;e++)for(let t=0;t<n;t++)r[e*n+t]&&(i+=`M${t} ${e}h1v1h-1z`);let a=n+4;return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${t}" viewBox="0 0 ${a} ${a}" shape-rendering="crispEdges"><rect width="${a}" height="${a}" fill="#fff"/><g transform="translate(2 2)" fill="#000">${`<path d="${i}"/>`}</g></svg>`}var U,_t,vt,W,G,K,q,J,yt=n((()=>{U=[16,28,44,64,86,108,124,154,182,216],_t=[10,16,26,18,24,16,18,22,22,26],vt=[1,1,1,2,2,4,4,4,5,5],W=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50]],G=new Uint8Array(512),K=new Uint8Array(256);for(let e=0,t=1;e<255;e++)G[e]=t,K[t]=e,t<<=1,t&256&&(t^=285);for(let e=255;e<512;e++)G[e]=G[e-255];q=(e,t)=>e===0||t===0?0:G[(K[e]+K[t])%255],J=(e,t,n,r,i=!0)=>{e.modules[n*e.size+t]=+!!r,i&&(e.reserved[n*e.size+t]=1)}}));function bt(e){if(e.getElementById(xt))return;let t=e.createElement(`style`);t.id=xt,t.textContent=St,(e.head??e.documentElement)?.appendChild(t)}function Y(e,t){t!==`auto`&&(e.style.colorScheme=t)}var xt,St,Ct=n((()=>{xt=`zine-controls-style`,St=`
|
|
91
145
|
/* Docked mode wraps the book so the bar can sit beside it without shrinking the container,
|
|
92
146
|
whose measured box the renderer and hit-testing both depend on.
|
|
93
147
|
The wrapper deliberately does not stretch or grow its children: the container keeps whatever
|
|
@@ -113,7 +167,7 @@ void main() {
|
|
|
113
167
|
z-index: 2;
|
|
114
168
|
box-sizing: border-box;
|
|
115
169
|
font: 500 12px/1.2 system-ui, sans-serif;
|
|
116
|
-
color: var(--zine-controls-fg, #f4f4f5);
|
|
170
|
+
color: var(--zine-controls-fg, light-dark(#18181b, #f4f4f5));
|
|
117
171
|
touch-action: auto;
|
|
118
172
|
-webkit-user-select: none;
|
|
119
173
|
user-select: none;
|
|
@@ -131,14 +185,14 @@ void main() {
|
|
|
131
185
|
padding: 3px;
|
|
132
186
|
border-radius: 8px;
|
|
133
187
|
pointer-events: auto;
|
|
134
|
-
background: var(--zine-controls-bg, rgba(24, 24, 27, 0.82));
|
|
188
|
+
background: var(--zine-controls-bg, light-dark(rgba(255, 255, 255, 0.94), rgba(24, 24, 27, 0.82)));
|
|
135
189
|
backdrop-filter: blur(8px);
|
|
136
190
|
}
|
|
137
191
|
/* Floating: lifted off the page it covers. Docked: flat, with an outline so it reads as a
|
|
138
192
|
control strip rather than a shadow hanging in empty space. */
|
|
139
193
|
.zine-controls-floating .zine-controls-bar { box-shadow: 0 2px 12px rgba(0, 0, 0, 0.28); }
|
|
140
194
|
.zine-controls-docked .zine-controls-bar {
|
|
141
|
-
border: 1px solid var(--zine-controls-hover, rgba(255, 255, 255, 0.14));
|
|
195
|
+
border: 1px solid var(--zine-controls-hover, light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.14)));
|
|
142
196
|
}
|
|
143
197
|
.zine-controls-floating.zine-controls-bottom { inset: auto 0 0 0; justify-content: center; }
|
|
144
198
|
.zine-controls-floating.zine-controls-top { inset: 0 0 auto 0; justify-content: center; }
|
|
@@ -163,9 +217,9 @@ void main() {
|
|
|
163
217
|
font: inherit;
|
|
164
218
|
}
|
|
165
219
|
.zine-controls-btn svg { width: 15px; height: 15px; }
|
|
166
|
-
.zine-controls-btn:hover:not(:disabled) { background: var(--zine-controls-hover, rgba(255,255,255,0.14)); }
|
|
220
|
+
.zine-controls-btn:hover:not(:disabled) { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.14))); }
|
|
167
221
|
.zine-controls-btn:focus-visible {
|
|
168
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
222
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
169
223
|
outline-offset: 1px;
|
|
170
224
|
}
|
|
171
225
|
.zine-controls-btn:disabled { opacity: 0.38; cursor: default; }
|
|
@@ -173,7 +227,7 @@ void main() {
|
|
|
173
227
|
.zine-controls-off { opacity: 0.38; }
|
|
174
228
|
.zine-controls-off[aria-disabled='true'] { pointer-events: none; }
|
|
175
229
|
.zine-controls-btn[aria-pressed="true"],
|
|
176
|
-
.zine-controls-btn[aria-expanded="true"] { background: var(--zine-controls-hover, rgba(255,255,255,0.14)); }
|
|
230
|
+
.zine-controls-btn[aria-expanded="true"] { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.14))); }
|
|
177
231
|
|
|
178
232
|
.zine-controls-sep {
|
|
179
233
|
width: 1px;
|
|
@@ -196,9 +250,9 @@ void main() {
|
|
|
196
250
|
.zine-controls-page input {
|
|
197
251
|
width: 2.2em;
|
|
198
252
|
padding: 2px 3px;
|
|
199
|
-
border: 1px solid var(--zine-controls-hover, rgba(255,255,255,0.2));
|
|
253
|
+
border: 1px solid var(--zine-controls-hover, light-dark(rgba(0,0,0,0.14), rgba(255,255,255,0.2)));
|
|
200
254
|
border-radius: 4px;
|
|
201
|
-
background: rgba(0, 0, 0, 0.25);
|
|
255
|
+
background: light-dark(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.25));
|
|
202
256
|
color: inherit;
|
|
203
257
|
font: inherit;
|
|
204
258
|
text-align: center;
|
|
@@ -207,7 +261,7 @@ void main() {
|
|
|
207
261
|
.zine-controls-page input::-webkit-outer-spin-button,
|
|
208
262
|
.zine-controls-page input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
|
|
209
263
|
.zine-controls-page input:focus-visible {
|
|
210
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
264
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
211
265
|
outline-offset: 0;
|
|
212
266
|
}
|
|
213
267
|
|
|
@@ -220,7 +274,7 @@ void main() {
|
|
|
220
274
|
padding: 4px;
|
|
221
275
|
border-radius: 8px;
|
|
222
276
|
pointer-events: auto;
|
|
223
|
-
background: var(--zine-controls-bg, rgba(24, 24, 27, 0.94));
|
|
277
|
+
background: var(--zine-controls-bg, light-dark(rgba(255, 255, 255, 0.94), rgba(24, 24, 27, 0.94)));
|
|
224
278
|
box-shadow: 0 6px 22px rgba(0, 0, 0, 0.36);
|
|
225
279
|
backdrop-filter: blur(8px);
|
|
226
280
|
}
|
|
@@ -238,17 +292,25 @@ void main() {
|
|
|
238
292
|
flex: 0 0 auto;
|
|
239
293
|
width: 100%;
|
|
240
294
|
padding: 6px 8px;
|
|
241
|
-
border: 1px solid var(--zine-controls-hover, rgba(255,255,255,0.2));
|
|
295
|
+
border: 1px solid var(--zine-controls-hover, light-dark(rgba(0,0,0,0.14), rgba(255,255,255,0.2)));
|
|
242
296
|
border-radius: 6px;
|
|
243
|
-
background: rgba(0, 0, 0, 0.25);
|
|
297
|
+
background: light-dark(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.25));
|
|
244
298
|
color: inherit;
|
|
245
299
|
font: inherit;
|
|
246
300
|
box-sizing: border-box;
|
|
247
301
|
}
|
|
302
|
+
/* Replace the browser's default (white) focus ring with the accent ring the other controls use. */
|
|
303
|
+
.zine-search-input:focus-visible {
|
|
304
|
+
outline: none;
|
|
305
|
+
border-color: var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
306
|
+
box-shadow: 0 0 0 1px var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
307
|
+
}
|
|
248
308
|
.zine-search-hits {
|
|
249
309
|
flex: 1 1 auto;
|
|
250
310
|
overflow-y: auto;
|
|
251
|
-
overscroll
|
|
311
|
+
/* Chain overscroll up to the page: once the list is at its end (or too short to scroll at all),
|
|
312
|
+
a further wheel scrolls the page behind, the same as scrolling over the book itself does. */
|
|
313
|
+
overscroll-behavior: auto;
|
|
252
314
|
margin-top: 5px;
|
|
253
315
|
scrollbar-width: thin;
|
|
254
316
|
}
|
|
@@ -265,9 +327,9 @@ void main() {
|
|
|
265
327
|
cursor: pointer;
|
|
266
328
|
box-sizing: border-box;
|
|
267
329
|
}
|
|
268
|
-
.zine-search-hit:hover { background: var(--zine-controls-hover, rgba(255,255,255,0.14)); }
|
|
330
|
+
.zine-search-hit:hover { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.14))); }
|
|
269
331
|
.zine-search-hit:focus-visible {
|
|
270
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
332
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
271
333
|
outline-offset: -2px;
|
|
272
334
|
}
|
|
273
335
|
.zine-search-page { display: block; font-size: 0.9em; opacity: 0.85; }
|
|
@@ -293,38 +355,106 @@ void main() {
|
|
|
293
355
|
display: inline-flex;
|
|
294
356
|
align-items: center;
|
|
295
357
|
justify-content: center;
|
|
296
|
-
width:
|
|
297
|
-
height:
|
|
358
|
+
width: 44px;
|
|
359
|
+
height: 44px;
|
|
298
360
|
padding: 0;
|
|
299
361
|
border: 0;
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
color: var(--zine-controls-fg, #f4f4f5);
|
|
362
|
+
background: none;
|
|
363
|
+
/* Light on a light page, dark on a dark one. The shadow below carries the contrast. */
|
|
364
|
+
color: var(--zine-controls-fg, light-dark(#f4f4f5, #18181b));
|
|
303
365
|
cursor: pointer;
|
|
304
|
-
backdrop-filter: blur(8px);
|
|
305
366
|
-webkit-user-select: none;
|
|
306
367
|
user-select: none;
|
|
368
|
+
/* No grey tap box on touch; the :active tint below is the press feedback instead. */
|
|
369
|
+
-webkit-tap-highlight-color: transparent;
|
|
370
|
+
}
|
|
371
|
+
.zine-arrow svg {
|
|
372
|
+
width: 36px;
|
|
373
|
+
height: 36px;
|
|
374
|
+
stroke-width: 2.25;
|
|
375
|
+
/* No backing disc, so a subtle offset shadow keeps the chevron from disappearing into a
|
|
376
|
+
matching background. It contrasts the fill: a light chevron (light mode) casts a soft dark
|
|
377
|
+
shadow, a dark chevron (dark mode) a soft light one, offset rather than a glowing halo. */
|
|
378
|
+
filter: drop-shadow(0 1px 2px light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.35)));
|
|
379
|
+
}
|
|
380
|
+
/* Feedback intensifies the chevron toward its extreme (white in light mode, black in dark)
|
|
381
|
+
rather than tinting it, so no new colour is introduced. Not tied to --zine-controls-fg: that
|
|
382
|
+
sets the resting fill, and hover has to differ from it to read as feedback. :active clears on
|
|
383
|
+
release, so tap and click feel the same; :hover is behind (hover: hover) so it never sticks on
|
|
384
|
+
touch. */
|
|
385
|
+
.zine-arrow:active:not(:disabled) { color: light-dark(#ffffff, #000000); }
|
|
386
|
+
@media (hover: hover) {
|
|
387
|
+
.zine-arrow:hover:not(:disabled) { color: light-dark(#ffffff, #000000); }
|
|
307
388
|
}
|
|
308
|
-
.zine-arrow svg { width: 22px; height: 22px; }
|
|
309
|
-
.zine-arrow:hover:not(:disabled) { background: var(--zine-controls-hover, rgba(255,255,255,0.22)); }
|
|
310
389
|
.zine-arrow:focus-visible {
|
|
311
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
390
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
312
391
|
outline-offset: 2px;
|
|
392
|
+
border-radius: 8px;
|
|
313
393
|
}
|
|
314
394
|
/* Nothing to turn to: invisible, but still occupying its slot so the book does not slide across
|
|
315
395
|
as the reader reaches a cover. */
|
|
316
396
|
.zine-arrow-hidden { visibility: hidden; }
|
|
317
|
-
/*
|
|
397
|
+
/* Device-scoped arrows (controls.arrows: 'desktop' | 'mobile'). The split follows the same 640px
|
|
398
|
+
breakpoint as the flank/overlay layouts below, so the arrows appear and disappear live as the
|
|
399
|
+
window crosses it. */
|
|
318
400
|
@media (max-width: 640px) {
|
|
319
|
-
.zine-arrow { display: none; }
|
|
401
|
+
.zine-arrows-desktop > .zine-arrow { display: none; }
|
|
402
|
+
}
|
|
403
|
+
@media (min-width: 641px) {
|
|
404
|
+
.zine-arrows-mobile > .zine-arrow { display: none; }
|
|
405
|
+
}
|
|
406
|
+
/* Too narrow to flank without squeezing the pages, so overlay the arrows on the book's edges
|
|
407
|
+
instead. The wrap sits outside the container, so painting them over it leaves the container's
|
|
408
|
+
measured box (which sizes the book and maps taps) untouched. */
|
|
409
|
+
@media (max-width: 640px) {
|
|
410
|
+
.zine-arrows-wrap { position: relative; }
|
|
411
|
+
.zine-arrow {
|
|
412
|
+
position: absolute;
|
|
413
|
+
top: 50%;
|
|
414
|
+
transform: translateY(-50%);
|
|
415
|
+
z-index: 2;
|
|
416
|
+
/* Sit back over the page so the reader can look at the book. */
|
|
417
|
+
opacity: 0.7;
|
|
418
|
+
}
|
|
419
|
+
.zine-arrow:first-child { left: -2px; }
|
|
420
|
+
.zine-arrow:last-child { right: -2px; }
|
|
320
421
|
}
|
|
321
422
|
@media (prefers-reduced-motion: no-preference) {
|
|
322
423
|
.zine-arrow { transition: background 120ms ease; }
|
|
323
424
|
}
|
|
324
425
|
|
|
325
|
-
/* Side panels (thumbnails, outline). The rail wraps the book and its docked toolbar so it
|
|
326
|
-
beside them
|
|
327
|
-
|
|
426
|
+
/* Side panels (thumbnails, outline, search). The rail wraps the book and its docked toolbar so it
|
|
427
|
+
sits beside them as a flex sibling. On a wide screen the book shrinks to make room (below); on a
|
|
428
|
+
narrow one the rail becomes a drawer over the book.
|
|
429
|
+
align-items:flex-start, not stretch: the book sizes its height from its width through its own
|
|
430
|
+
aspect-ratio, and that height is 'auto' from flex's point of view, so a stretch would override it
|
|
431
|
+
and blow the book (and the rail matched to it) up to the flex line's cross size. Left as auto, the
|
|
432
|
+
book keeps its aspect height and the holder alone stretches down to meet it (below). */
|
|
433
|
+
.zine-panel-wrap { display: flex; align-items: flex-start; gap: 8px; position: relative; }
|
|
434
|
+
|
|
435
|
+
/* The book-side slot (the bare container, or the docked-toolbar wrapper around it) yields space to
|
|
436
|
+
the fixed-width rail instead of overflowing: flex-shrink lets it fall below its own width, and
|
|
437
|
+
min-width:0 removes the automatic content floor that would otherwise stop it. The book only
|
|
438
|
+
actually shrinks if its width is elastic (a %, max-width, or the demo's min(...) with a % term);
|
|
439
|
+
a hard-coded pixel width has nothing for the % to resolve smaller against. */
|
|
440
|
+
.zine-panel-wrap > *:not(.zine-panel-holder):not(.zine-panel-scrim) {
|
|
441
|
+
flex: 0 1 auto;
|
|
442
|
+
min-width: 0;
|
|
443
|
+
}
|
|
444
|
+
/* With a docked toolbar the book lives inside .zine-controls-wrap, whose children are pinned
|
|
445
|
+
flex:0 0 auto (so the bar keeps its size). Inside a panel wrap the book child — everything but
|
|
446
|
+
the bar itself — must instead be allowed to shrink, so left/right docking flanks like the rest.
|
|
447
|
+
Top/bottom docking already shrinks through the container's own % width. */
|
|
448
|
+
.zine-panel-wrap .zine-controls-wrap > *:not(.zine-controls) {
|
|
449
|
+
flex: 0 1 auto;
|
|
450
|
+
min-width: 0;
|
|
451
|
+
min-height: 0;
|
|
452
|
+
}
|
|
453
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
454
|
+
.zine-panel-wrap > *:not(.zine-panel-holder):not(.zine-panel-scrim) {
|
|
455
|
+
transition: flex-basis 160ms ease, width 160ms ease;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
328
458
|
|
|
329
459
|
/* The holder stretches to the book's height; the rail is absolutely positioned inside it so a
|
|
330
460
|
long list scrolls rather than growing the row and running past the bottom of the book. */
|
|
@@ -334,6 +464,10 @@ void main() {
|
|
|
334
464
|
align-self: stretch;
|
|
335
465
|
min-height: 0;
|
|
336
466
|
}
|
|
467
|
+
/* The scrim dims the book behind the narrow-screen drawer. It exists on every screen but only
|
|
468
|
+
shows under the breakpoint below, so on a wide screen it takes no flex slot and never intercepts
|
|
469
|
+
a click. */
|
|
470
|
+
.zine-panel-scrim { display: none; }
|
|
337
471
|
.zine-panel {
|
|
338
472
|
position: absolute;
|
|
339
473
|
inset: 0;
|
|
@@ -341,22 +475,147 @@ void main() {
|
|
|
341
475
|
flex-direction: column;
|
|
342
476
|
gap: 6px;
|
|
343
477
|
overflow-y: auto;
|
|
344
|
-
overscroll
|
|
478
|
+
/* Chain overscroll up to the page: once the list is at its end (or too short to scroll at all),
|
|
479
|
+
a further wheel scrolls the page behind, the same as scrolling over the book itself does. */
|
|
480
|
+
overscroll-behavior: auto;
|
|
481
|
+
/* Reserve the scrollbar's lane whether or not it is showing, so rows never sit under the bar
|
|
482
|
+
and the close button (inset past this lane below) has a fixed edge to clear. */
|
|
483
|
+
scrollbar-gutter: stable;
|
|
345
484
|
padding: 6px;
|
|
346
485
|
box-sizing: border-box;
|
|
347
486
|
border-radius: 8px;
|
|
348
|
-
background: var(--zine-controls-bg, rgba(24, 24, 27, 0.82));
|
|
349
|
-
color: var(--zine-controls-fg, #f4f4f5);
|
|
487
|
+
background: var(--zine-controls-bg, light-dark(rgba(255, 255, 255, 0.94), rgba(24, 24, 27, 0.82)));
|
|
488
|
+
color: var(--zine-controls-fg, light-dark(#18181b, #f4f4f5));
|
|
350
489
|
font: 500 11px/1.2 system-ui, sans-serif;
|
|
351
490
|
scrollbar-width: thin;
|
|
352
491
|
touch-action: auto;
|
|
353
492
|
-webkit-user-select: none;
|
|
354
493
|
user-select: none;
|
|
355
494
|
}
|
|
495
|
+
/* The rail sits flush against the book's reading-start edge (left, or right in RTL), so its outer
|
|
496
|
+
corners there would round away from that edge and leave a gap. Square them; keep the interior
|
|
497
|
+
corners, which face the page, rounded. */
|
|
498
|
+
.zine-panel { border-radius: 0 8px 8px 0; }
|
|
499
|
+
.zine-panel-wrap-rtl .zine-panel { border-radius: 8px 0 0 8px; }
|
|
356
500
|
/* Overlay fallback, used when the container has no parent to wrap. */
|
|
357
501
|
.zine-panel-overlay { position: absolute; inset: 0 auto 0 0; z-index: 3; }
|
|
358
|
-
.zine-panel-active { background: var(--zine-controls-hover, rgba(255,255,255,0.18)); }
|
|
502
|
+
.zine-panel-active { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.18))); }
|
|
359
503
|
.zine-panel-note { padding: 8px; opacity: 0.66; line-height: 1.4; }
|
|
504
|
+
/* Discoverable dismiss, floated in the rail's trailing-top (interior) corner, away from the book.
|
|
505
|
+
It sits in the holder above the scrolling list so the list scrolls under it. A translucent
|
|
506
|
+
backdrop keeps the glyph legible over a thumbnail or a line of text. */
|
|
507
|
+
.zine-panel-close {
|
|
508
|
+
position: absolute;
|
|
509
|
+
top: 6px;
|
|
510
|
+
/* Inset past the reserved scrollbar gutter so the button never overlaps the bar. */
|
|
511
|
+
right: 12px;
|
|
512
|
+
z-index: 1;
|
|
513
|
+
display: inline-flex;
|
|
514
|
+
width: 24px;
|
|
515
|
+
height: 24px;
|
|
516
|
+
align-items: center;
|
|
517
|
+
justify-content: center;
|
|
518
|
+
padding: 0;
|
|
519
|
+
border: 0;
|
|
520
|
+
border-radius: 6px;
|
|
521
|
+
/* Opaque so a light thumbnail underneath never shows through and dims the glyph. */
|
|
522
|
+
background: light-dark(#f4f4f5, #27272a);
|
|
523
|
+
color: inherit;
|
|
524
|
+
cursor: pointer;
|
|
525
|
+
}
|
|
526
|
+
.zine-panel-close svg { width: 15px; height: 15px; }
|
|
527
|
+
/* Opaque hover, not the translucent hover token: a see-through backdrop over a light thumbnail
|
|
528
|
+
would wash the glyph out. Solid neutrals keep the X readable in both themes over anything. */
|
|
529
|
+
.zine-panel-close:hover { background: light-dark(#e4e4e7, #3f3f46); }
|
|
530
|
+
.zine-panel-close:focus-visible {
|
|
531
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
532
|
+
outline-offset: -2px;
|
|
533
|
+
}
|
|
534
|
+
.zine-panel-wrap-rtl .zine-panel-close { right: auto; left: 12px; }
|
|
535
|
+
/* End the search field just before the close button rather than running under it, so the two sit
|
|
536
|
+
side by side and the field's border reads cleanly. The button's inner edge is ~30px from the
|
|
537
|
+
panel's content edge (24px wide, its right edge 6px in once the reserved scrollbar gutter is
|
|
538
|
+
accounted for), so 30px leaves them flush with a hair of breathing room. width:auto lets the
|
|
539
|
+
column's stretch fill the rest, so the margin shortens the field instead of overflowing 100%. */
|
|
540
|
+
.zine-search .zine-search-input { width: auto; align-self: stretch; margin-right: 30px; }
|
|
541
|
+
.zine-panel-wrap-rtl .zine-search .zine-search-input { margin-right: 0; margin-left: 30px; }
|
|
542
|
+
|
|
543
|
+
/* Overlay panels (outline, search) on a wide screen: float over the book's start edge instead of
|
|
544
|
+
flanking it, so the book never resizes. The wrap drops to a block, laying the book out exactly as
|
|
545
|
+
it was before the panel opened; the holder sits absolute over it at full book height, with a
|
|
546
|
+
shadow so it reads as lifted off the page. thumbnails is not overlaid — it stays a flex flank and
|
|
547
|
+
shrinks the book only when the two will not otherwise both fit. */
|
|
548
|
+
@media (min-width: 641px) {
|
|
549
|
+
.zine-panel-wrap-overlay { display: block; }
|
|
550
|
+
.zine-panel-wrap-overlay .zine-panel-holder {
|
|
551
|
+
position: absolute;
|
|
552
|
+
inset: 0 auto 0 0;
|
|
553
|
+
z-index: 4;
|
|
554
|
+
box-shadow: 0 0 24px light-dark(rgba(0, 0, 0, 0.22), rgba(0, 0, 0, 0.55));
|
|
555
|
+
}
|
|
556
|
+
.zine-panel-wrap-overlay.zine-panel-wrap-rtl .zine-panel-holder { inset: 0 0 0 auto; }
|
|
557
|
+
/* Opaque over the page it floats on, unlike a flanking rail that sits against empty margin. */
|
|
558
|
+
.zine-panel-wrap-overlay .zine-panel {
|
|
559
|
+
background: var(--zine-controls-bg, light-dark(#ffffff, #18181b));
|
|
560
|
+
}
|
|
561
|
+
/* A click-away layer over the book, so pressing the page behind the floating rail closes it the
|
|
562
|
+
way tapping the scrim does on a narrow screen. Transparent here — the wide-screen rail only
|
|
563
|
+
covers an edge, so there is no need to dim the page the reader is still looking at. It sits
|
|
564
|
+
under the holder (z-index) so the rail's own rows still take their clicks. */
|
|
565
|
+
.zine-panel-wrap-overlay .zine-panel-scrim {
|
|
566
|
+
display: block;
|
|
567
|
+
position: absolute;
|
|
568
|
+
inset: 0;
|
|
569
|
+
z-index: 3;
|
|
570
|
+
background: transparent;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
@media (min-width: 641px) and (prefers-reduced-motion: no-preference) {
|
|
574
|
+
.zine-panel-wrap-overlay .zine-panel-holder { animation: zine-drawer-in 180ms ease; }
|
|
575
|
+
.zine-panel-wrap-overlay.zine-panel-wrap-rtl .zine-panel-holder { animation-name: zine-drawer-in-rtl; }
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/* Narrow screen: no room to flank, so the rail becomes a drawer over the book and the scrim dims
|
|
579
|
+
the page behind it. The wrap is position:relative, so the absolute holder and scrim below are
|
|
580
|
+
measured against it — i.e. against the book's own box. */
|
|
581
|
+
@media (max-width: 640px) {
|
|
582
|
+
/* No flanking here — the rail and scrim both overlay absolutely — so drop the flex row entirely.
|
|
583
|
+
As a plain block wrap the book keeps the exact box it had before a panel opened (its own width,
|
|
584
|
+
margin and aspect-ratio height); a flex row would instead re-resolve the book's width and, with
|
|
585
|
+
it, its aspect-derived height, enlarging the canvas and pushing the page down. */
|
|
586
|
+
.zine-panel-wrap {
|
|
587
|
+
display: block;
|
|
588
|
+
}
|
|
589
|
+
.zine-panel-holder {
|
|
590
|
+
position: absolute;
|
|
591
|
+
inset: 0 auto 0 0;
|
|
592
|
+
z-index: 4;
|
|
593
|
+
/* Cap the drawer so it never eats the whole book; its inline width still applies under this. */
|
|
594
|
+
max-width: 80%;
|
|
595
|
+
box-shadow: 0 0 24px light-dark(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.6));
|
|
596
|
+
}
|
|
597
|
+
/* RTL reads from the right, so the drawer enters from there. */
|
|
598
|
+
.zine-panel-wrap-rtl .zine-panel-holder { inset: 0 0 0 auto; }
|
|
599
|
+
/* Opaque over the page, unlike the wide-screen rail which can sit against empty margin. */
|
|
600
|
+
.zine-panel {
|
|
601
|
+
background: var(--zine-controls-bg, light-dark(#ffffff, #18181b));
|
|
602
|
+
}
|
|
603
|
+
.zine-panel-scrim {
|
|
604
|
+
display: block;
|
|
605
|
+
position: absolute;
|
|
606
|
+
inset: 0;
|
|
607
|
+
z-index: 3;
|
|
608
|
+
background: rgba(0, 0, 0, 0.4);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
@media (max-width: 640px) and (prefers-reduced-motion: no-preference) {
|
|
612
|
+
.zine-panel-holder { animation: zine-drawer-in 180ms ease; }
|
|
613
|
+
.zine-panel-wrap-rtl .zine-panel-holder { animation-name: zine-drawer-in-rtl; }
|
|
614
|
+
.zine-panel-scrim { animation: zine-scrim-in 180ms ease; }
|
|
615
|
+
}
|
|
616
|
+
@keyframes zine-drawer-in { from { transform: translateX(-100%); } to { transform: translateX(0); } }
|
|
617
|
+
@keyframes zine-drawer-in-rtl { from { transform: translateX(100%); } to { transform: translateX(0); } }
|
|
618
|
+
@keyframes zine-scrim-in { from { opacity: 0; } to { opacity: 1; } }
|
|
360
619
|
|
|
361
620
|
.zine-thumbs { align-items: center; }
|
|
362
621
|
|
|
@@ -375,22 +634,25 @@ void main() {
|
|
|
375
634
|
cursor: pointer;
|
|
376
635
|
box-sizing: border-box;
|
|
377
636
|
}
|
|
378
|
-
.zine-thumbs-row:hover { background: var(--zine-controls-hover, rgba(255,255,255,0.14)); }
|
|
637
|
+
.zine-thumbs-row:hover { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.14))); }
|
|
379
638
|
.zine-thumbs-row:focus-visible {
|
|
380
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
639
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
381
640
|
outline-offset: -2px;
|
|
382
641
|
}
|
|
383
642
|
.zine-thumbs-row.zine-panel-active .zine-thumbs-cell {
|
|
384
|
-
outline: 1px solid var(--zine-controls-accent, #7dd3fc);
|
|
643
|
+
outline: 1px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
385
644
|
}
|
|
386
645
|
|
|
387
646
|
/* Outline: a single column of headings, indented by depth. */
|
|
388
|
-
|
|
647
|
+
/* No gap: a hairline between rows is the separator instead, so a title that wraps to two lines
|
|
648
|
+
still reads as one entry rather than blending into its neighbours. */
|
|
649
|
+
.zine-outline { gap: 0; }
|
|
389
650
|
.zine-outline-row {
|
|
390
651
|
display: block;
|
|
391
652
|
width: 100%;
|
|
392
653
|
padding: 6px 8px;
|
|
393
654
|
border: 0;
|
|
655
|
+
border-bottom: 1px solid var(--zine-controls-divider, light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.1)));
|
|
394
656
|
border-radius: 5px;
|
|
395
657
|
background: transparent;
|
|
396
658
|
color: inherit;
|
|
@@ -401,11 +663,12 @@ void main() {
|
|
|
401
663
|
box-sizing: border-box;
|
|
402
664
|
overflow-wrap: anywhere;
|
|
403
665
|
}
|
|
666
|
+
.zine-outline-row:last-child { border-bottom: 0; }
|
|
404
667
|
.zine-outline-row:hover:not(:disabled) {
|
|
405
|
-
background: var(--zine-controls-hover, rgba(255,255,255,0.14));
|
|
668
|
+
background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.14)));
|
|
406
669
|
}
|
|
407
670
|
.zine-outline-row:focus-visible {
|
|
408
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
671
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
409
672
|
outline-offset: -2px;
|
|
410
673
|
}
|
|
411
674
|
/* A heading whose destination could not be resolved: shown, but nothing to click through to. */
|
|
@@ -416,7 +679,7 @@ void main() {
|
|
|
416
679
|
min-width: 0;
|
|
417
680
|
min-height: 24px;
|
|
418
681
|
display: flex;
|
|
419
|
-
background: rgba(0, 0, 0, 0.3);
|
|
682
|
+
background: light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.3));
|
|
420
683
|
border-radius: 2px;
|
|
421
684
|
overflow: hidden;
|
|
422
685
|
}
|
|
@@ -438,7 +701,7 @@ void main() {
|
|
|
438
701
|
padding: 16px;
|
|
439
702
|
background: rgba(0, 0, 0, 0.55);
|
|
440
703
|
font: 500 13px/1.4 system-ui, sans-serif;
|
|
441
|
-
color: var(--zine-controls-fg, #f4f4f5);
|
|
704
|
+
color: var(--zine-controls-fg, light-dark(#18181b, #f4f4f5));
|
|
442
705
|
}
|
|
443
706
|
.zine-share {
|
|
444
707
|
width: min(320px, 100%);
|
|
@@ -449,7 +712,7 @@ void main() {
|
|
|
449
712
|
gap: 12px;
|
|
450
713
|
padding: 14px;
|
|
451
714
|
border-radius: 12px;
|
|
452
|
-
background: var(--zine-share-bg, #1c1c20);
|
|
715
|
+
background: var(--zine-share-bg, light-dark(#ffffff, #1c1c20));
|
|
453
716
|
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.45);
|
|
454
717
|
box-sizing: border-box;
|
|
455
718
|
}
|
|
@@ -469,7 +732,7 @@ void main() {
|
|
|
469
732
|
cursor: pointer;
|
|
470
733
|
}
|
|
471
734
|
.zine-share-close svg { width: 16px; height: 16px; }
|
|
472
|
-
.zine-share-close:hover { background: var(--zine-controls-hover, rgba(255,255,255,0.14)); }
|
|
735
|
+
.zine-share-close:hover { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.08), rgba(255,255,255,0.14))); }
|
|
473
736
|
|
|
474
737
|
.zine-share-qr {
|
|
475
738
|
align-self: center;
|
|
@@ -485,9 +748,9 @@ void main() {
|
|
|
485
748
|
flex: 1 1 auto;
|
|
486
749
|
min-width: 0;
|
|
487
750
|
padding: 7px 9px;
|
|
488
|
-
border: 1px solid var(--zine-controls-hover, rgba(255,255,255,0.2));
|
|
751
|
+
border: 1px solid var(--zine-controls-hover, light-dark(rgba(0,0,0,0.14), rgba(255,255,255,0.2)));
|
|
489
752
|
border-radius: 7px;
|
|
490
|
-
background: rgba(0, 0, 0, 0.3);
|
|
753
|
+
background: light-dark(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.3));
|
|
491
754
|
color: inherit;
|
|
492
755
|
font: inherit;
|
|
493
756
|
}
|
|
@@ -497,8 +760,8 @@ void main() {
|
|
|
497
760
|
padding: 7px 12px;
|
|
498
761
|
border: 0;
|
|
499
762
|
border-radius: 7px;
|
|
500
|
-
background: var(--zine-controls-accent, #7dd3fc);
|
|
501
|
-
color: #06202c;
|
|
763
|
+
background: var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
764
|
+
color: light-dark(#ffffff, #06202c);
|
|
502
765
|
font: inherit;
|
|
503
766
|
font-weight: 600;
|
|
504
767
|
cursor: pointer;
|
|
@@ -512,22 +775,22 @@ void main() {
|
|
|
512
775
|
align-items: center;
|
|
513
776
|
justify-content: center;
|
|
514
777
|
border-radius: 8px;
|
|
515
|
-
background: rgba(255, 255, 255, 0.08);
|
|
778
|
+
background: light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.08));
|
|
516
779
|
color: inherit;
|
|
517
780
|
text-decoration: none;
|
|
518
781
|
}
|
|
519
782
|
.zine-share-social svg { width: 19px; height: 19px; }
|
|
520
|
-
.zine-share-social:hover { background: var(--zine-controls-hover, rgba(255,255,255,0.18)); }
|
|
783
|
+
.zine-share-social:hover { background: var(--zine-controls-hover, light-dark(rgba(0,0,0,0.12), rgba(255,255,255,0.18))); }
|
|
521
784
|
.zine-share-close:focus-visible,
|
|
522
785
|
.zine-share-copy:focus-visible,
|
|
523
786
|
.zine-share-social:focus-visible,
|
|
524
787
|
.zine-share-link input:focus-visible {
|
|
525
|
-
outline: 2px solid var(--zine-controls-accent, #7dd3fc);
|
|
788
|
+
outline: 2px solid var(--zine-controls-accent, light-dark(#0284c7, #7dd3fc));
|
|
526
789
|
outline-offset: 2px;
|
|
527
790
|
}
|
|
528
791
|
|
|
529
792
|
@media (prefers-reduced-motion: no-preference) {
|
|
530
793
|
.zine-controls-btn { transition: background 120ms ease; }
|
|
531
794
|
}
|
|
532
|
-
`})),Z,Ct=n((()=>{Z=class{root;#e;#t=null;constructor(e,t,n){this.#e=e.createElement(`div`),this.#e.className=`zine-panel-holder`,this.#e.style.width=`${n.width}px`,this.root=e.createElement(`div`),this.root.className=`zine-panel ${n.className}`,this.root.setAttribute(`role`,`listbox`),this.root.setAttribute(`aria-label`,n.label),this.#e.appendChild(this.root);for(let e of[`pointerdown`,`pointerup`,`pointermove`,`click`,`dblclick`,`wheel`])this.root.addEventListener(e,e=>e.stopPropagation());this.#n(e,t)}setWidth(e){this.#e.style.width=`${e}px`}#n(e,t){if(!t.parentNode){this.#e.classList.add(`zine-panel-overlay`),t.appendChild(this.#e);return}let n=t.closest(`.zine-controls-wrap`)??t,r=e.createElement(`div`);r.className=`zine-panel-wrap`,n.parentNode.insertBefore(r,n),r.append(this.#e,n),this.#t=r}destroy(){this.#e.remove();let e=this.#t;if(e?.parentNode){for(;e.firstChild;)e.parentNode.insertBefore(e.firstChild,e);e.remove()}this.#t=null}}})),wt,Tt,Et=n((()=>{Ct(),wt=78,Tt=class{#e;#t;#n;#r=[];#i=null;#a=[];constructor(e,t){this.#e=e;let n=t.ownerDocument;this.#t=n,this.#n=new Z(n,t,{className:`zine-thumbs`,label:`Pages`,width:90}),this.#o(),this.#a.push(e.on(`pageChanged`,()=>this.#l())),this.#l()}#o(){let e=this.#e.getSpreads(),t=this.#e.getDirection()===`rtl`,n=e.some(e=>e.left!==null&&e.right!==null);this.#n.root.classList.toggle(`zine-thumbs-solo`,!n),n&&this.#n.setWidth(170);for(let[r,i]of e.entries()){let e=this.#t.createElement(`button`);e.type=`button`,e.className=`zine-thumbs-row`,e.setAttribute(`role`,`option`),t&&(e.style.flexDirection=`row-reverse`);let a=[i.left,i.right].filter(e=>e!==null);n&&a.length===1&&e.classList.add(`zine-thumbs-row-lone`);for(let t of a){let n=this.#t.createElement(`span`);n.className=`zine-thumbs-cell`,n.dataset.page=String(t),e.appendChild(n)}let o=[...a].sort((e,t)=>e-t).map(e=>e+1);e.setAttribute(`aria-label`,o.length>1?`Pages ${o[0]}–${o.at(-1)}`:`Page ${o[0]??``}`);let s=this.#t.createElement(`span`);s.className=`zine-thumbs-caption`,s.textContent=o.join(`–`),e.appendChild(s),e.addEventListener(`click`,()=>{a.length>0&&this.#e.flipTo(Math.min(...a))}),this.#n.root.appendChild(e),this.#r.push({el:e,spread:r})}this.#s()}#s(){let e=[...this.#n.root.querySelectorAll(`.zine-thumbs-cell[data-page]`)];if(typeof IntersectionObserver>`u`){for(let t of e)this.#c(t);return}this.#i=new IntersectionObserver((e,t)=>{for(let n of e)n.isIntersecting&&(t.unobserve(n.target),this.#c(n.target))},{root:this.#n.root,rootMargin:`200px`});for(let t of e)this.#i.observe(t)}async#c(e){let t=Number(e.dataset.page),n=await this.#e.getPageImage(t);if(!n||!e.isConnected)return;let r=n.width,i=n.height;if(!r||!i)return;let a=Math.min(2,globalThis.devicePixelRatio||1),o=this.#t.createElement(`canvas`);o.width=Math.max(1,Math.round(wt*a)),o.height=Math.max(1,Math.round(wt*i/r*a)),o.className=`zine-thumbs-img`;let s=o.getContext(`2d`);if(s){try{s.drawImage(n,0,0,o.width,o.height)}catch{return}e.replaceChildren(o)}}#l(){let e=this.#e.getSpreadIndex();for(let{el:t,spread:n}of this.#r){let r=n===e;t.classList.toggle(`zine-panel-active`,r),t.setAttribute(`aria-selected`,String(r)),r&&t.scrollIntoView?.({block:`nearest`})}}destroy(){for(let e of this.#a)e();this.#a=[],this.#i?.disconnect(),this.#i=null,this.#n.destroy()}}})),Dt,Ot,kt,At=n((()=>{Ct(),Dt=208,Ot=12,kt=class{#e;#t;#n;#r=[];#i=[];constructor(e,t){this.#e=e;let n=t.ownerDocument;this.#t=n,this.#n=new Z(n,t,{className:`zine-outline`,label:`Outline`,width:Dt}),this.#a(`Loading…`),this.#o(),this.#i.push(e.on(`pageChanged`,()=>this.#c()))}#a(e){let t=this.#t.createElement(`div`);t.className=`zine-panel-note`,t.textContent=e,this.#n.root.replaceChildren(t)}async#o(){let e=await this.#e.getOutline();if(this.#n.root.isConnected){if(e.length===0){this.#a(`This document has no outline.`);return}this.#n.root.replaceChildren(),this.#s(e,0),this.#c()}}#s(e,t){for(let n of e){let e=this.#t.createElement(`button`);if(e.type=`button`,e.className=`zine-outline-row`,e.setAttribute(`role`,`option`),e.style.paddingLeft=`${8+t*Ot}px`,e.textContent=n.title,e.title=n.title,n.page===null)e.disabled=!0;else{let t=n.page;e.setAttribute(`aria-label`,`${n.title}, page ${t+1}`),e.addEventListener(`click`,()=>this.#e.flipTo(t)),this.#r.push({el:e,page:t})}this.#n.root.appendChild(e),n.children.length>0&&this.#s(n.children,t+1)}}#c(){let e=this.#e.getPage(),t=null,n=-1;for(let{el:r,page:i}of this.#r)r.classList.remove(`zine-panel-active`),r.removeAttribute(`aria-selected`),i<=e&&i>=n&&(t=r,n=i);t&&(t.classList.add(`zine-panel-active`),t.setAttribute(`aria-selected`,`true`),t.scrollIntoView?.({block:`nearest`}))}destroy(){for(let e of this.#i)e();this.#i=[],this.#n.destroy()}}})),jt,Mt,Nt,Pt,Ft=n((()=>{Ct(),jt=208,Mt=180,Nt=2,Pt=class{#e;#t;#n;#r;#i;#a=0;#o=null;constructor(e,t){this.#e=e;let n=t.ownerDocument;this.#t=n,this.#n=new Z(n,t,{className:`zine-search`,label:`Search results`,width:jt}),this.#r=n.createElement(`input`),this.#r.type=`search`,this.#r.className=`zine-search-input`,this.#r.placeholder=`Search…`,this.#r.setAttribute(`aria-label`,`Search the document`),this.#r.addEventListener(`input`,()=>{this.#o&&clearTimeout(this.#o),this.#o=setTimeout(()=>void this.#c(),Mt)}),this.#r.addEventListener(`keydown`,e=>{e.key===`Enter`&&(this.#o&&clearTimeout(this.#o),this.#c())}),this.#i=n.createElement(`div`),this.#i.className=`zine-search-hits`,this.#n.root.append(this.#r,this.#i),this.#r.focus()}#s(e){let t=this.#t.createElement(`div`);t.className=`zine-panel-note`,t.textContent=e,this.#i.replaceChildren(t)}async#c(){let e=this.#r.value.trim(),t=++this.#a;if(e.length<Nt){this.#i.replaceChildren();return}this.#s(`Searching…`);let n=await this.#e.search(e);if(!(t!==this.#a||!this.#n.root.isConnected)){if(n.length===0){this.#s(`No matches for “${e}”`);return}this.#i.replaceChildren(...n.map(e=>{let t=this.#t.createElement(`button`);t.type=`button`,t.className=`zine-search-hit`,t.setAttribute(`role`,`option`),t.setAttribute(`aria-label`,`Page ${e.page+1}: ${e.excerpt}`);let n=this.#t.createElement(`span`);n.className=`zine-search-page`,n.textContent=`Page ${e.page+1}`;let r=this.#t.createElement(`small`);return r.textContent=e.excerpt,t.append(n,r),t.addEventListener(`click`,()=>this.#e.flipTo(e.page)),t}))}}destroy(){this.#o&&clearTimeout(this.#o),this.#o=null,this.#a++,this.#n.destroy()}}})),It,Lt=n((()=>{L(),It=class{#e;#t;#n;#r=null;#i=[];constructor(e,t){this.#e=e;let n=t.ownerDocument,r=e.getDirection()===`rtl`;this.#t=this.#a(n,r?I.next:I.prev,`Previous page`,()=>e.flipPrev()),this.#n=this.#a(n,r?I.prev:I.next,`Next page`,()=>e.flipNext()),this.#o(n,t);let i=()=>this.#s();this.#i.push(e.on(`pageChanged`,i)),this.#i.push(e.on(`flipEnd`,i)),this.#s()}#a(e,t,n,r){let i=e.createElement(`button`);i.type=`button`,i.className=`zine-arrow`,i.title=n,i.setAttribute(`aria-label`,n),i.appendChild(F(e,t)),i.addEventListener(`click`,r);for(let e of[`pointerdown`,`pointerup`,`click`])i.addEventListener(e,e=>e.stopPropagation());return i}#o(e,t){let n=t.closest(`.zine-panel-wrap`)??t.closest(`.zine-controls-wrap`)??t,r=n.parentNode;if(!r)return;let i=e.createElement(`div`);i.className=`zine-arrows-wrap`,r.insertBefore(i,n),i.append(this.#t,n,this.#n),this.#r=i}#s(){for(let[e,t]of[[this.#t,this.#e.canFlipPrev()],[this.#n,this.#e.canFlipNext()]])e.disabled=!t,e.classList.toggle(`zine-arrow-hidden`,!t)}destroy(){for(let e of this.#i)e();this.#i=[],this.#t.remove(),this.#n.remove();let e=this.#r;if(e?.parentNode){for(;e.firstChild;)e.parentNode.insertBefore(e.firstChild,e);e.remove()}this.#r=null}}}));function Rt(e){ht(),R({id:`thumbnails`,title:()=>e.openPanel()===`thumbnails`?`Hide thumbnails`:`Show thumbnails`,icon:I.thumbnails,isVisible:e=>e.zine.isDocument(),isActive:()=>e.openPanel()===`thumbnails`,action:t=>{e.togglePanel(`thumbnails`),t.close()}}),R({id:`outline`,title:()=>e.openPanel()===`outline`?`Hide outline`:`Show outline`,icon:I.outline,isVisible:()=>e.hasOutline(),isActive:()=>e.openPanel()===`outline`,action:t=>{e.togglePanel(`outline`),t.close()}}),R({id:`pageInput`,title:`Page`,render:()=>e.makePageInput()}),R({id:`search`,title:()=>e.openPanel()===`search`?`Hide search`:`Search`,icon:I.search,isVisible:e=>e.zine.canSearch(),isActive:()=>e.openPanel()===`search`,action:()=>e.togglePanel(`search`)})}var zt,Bt,Vt,Ht=n((()=>{L(),H(),vt(),St(),Et(),At(),Ft(),Lt(),zt={thumbnails:Tt,outline:kt,search:Pt},Bt=[`pointerdown`,`pointerup`,`pointermove`,`click`,`dblclick`,`wheel`,`keydown`],Vt=class{#e;#t;#n;#r;#i=[];#a=null;#o=[];#s=null;#c=null;#l;#u=null;#d=null;#f=null;#p=null;constructor(e,t,n){this.#e=e,this.#l=t;let r=t.ownerDocument;this.#t=r,yt(r);let i=n.position??`bottom`,a=n.docked??!0;this.#n=r.createElement(`div`),this.#n.className=[`zine-controls`,`zine-controls-${i}`,a?`zine-controls-docked`:`zine-controls-floating`,n.className].filter(Boolean).join(` `),this.#n.setAttribute(`role`,`toolbar`),this.#n.setAttribute(`aria-label`,`Flipbook controls`),this.#r=r.createElement(`div`),this.#r.className=`zine-controls-bar`,this.#n.appendChild(this.#r),this.#n.addEventListener(`keydown`,e=>this.#E(e));for(let e of Bt)this.#n.addEventListener(e,e=>this.#h(e));this.#m(t,i,a);let o=()=>this.#D();this.#o.push(e.on(`pageChanged`,o)),this.#o.push(e.on(`zoomChanged`,o)),this.#o.push(e.on(`flipEnd`,o));let s=e=>{this.#a&&!this.#a.el.contains(e.target)&&this.#T()};r.addEventListener(`pointerdown`,s,!0),this.#o.push(()=>r.removeEventListener(`pointerdown`,s,!0))}#m(e,t,n){if(!n){e.appendChild(this.#n);return}let r=e.parentNode;if(!r){this.#n.classList.replace(`zine-controls-docked`,`zine-controls-floating`),e.appendChild(this.#n);return}let i=this.#t.createElement(`div`);i.className=`zine-controls-wrap zine-controls-wrap-${t}`,r.insertBefore(i,e),i.appendChild(e),t===`top`||t===`left`?i.insertBefore(this.#n,e):i.appendChild(this.#n),this.#c=i}mount(e){this.#_(e.items??V),(e.arrows??!0)&&(this.#p=new It(this.#e,this.#l)),this.#D(),this.#A()}destroy(){for(let e of this.#o)e();this.#o=[],this.#T(),this.#u?.destroy(),this.#u=null,this.#d=null,this.#n.remove();let e=this.#c;e?.parentNode&&(e.parentNode.insertBefore(e.firstChild,e),e.remove()),this.#c=null,this.#p?.destroy(),this.#p=null}#h(e){e.stopPropagation()}#g(e=()=>this.#T()){return{zine:this.#e,close:e}}#_(e){for(let t of e){if(t===`|`){let e=this.#t.createElement(`div`);e.className=`zine-controls-sep`,this.#r.appendChild(e);continue}let e=z(t),n;e.render?(n=e.render(this.#g()),this.#i.push({el:n,def:e})):n=this.#b(e,`zine-controls-btn`),this.#r.appendChild(n)}}#v(e){return typeof e.title==`function`?e.title(this.#g()):e.title}#y(e){return typeof e.icon==`function`?e.icon(this.#g()):e.icon}#b(e,t,n=!1){let r=this.#t.createElement(`button`),i=this.#v(e),a=this.#y(e);if(r.type=`button`,r.className=t,r.title=i,r.setAttribute(`aria-label`,i),a&&r.appendChild(F(this.#t,a)),n||!a){let e=this.#t.createElement(`span`);e.className=`zine-controls-label`,e.textContent=i,r.appendChild(e)}return r.addEventListener(`click`,()=>this.#x(e,r)),this.#i.push({el:r,def:e}),r}#x(e,t){if(!e.isDisabled?.(this.#g())){if(e.children){this.#a?.trigger===t?this.#T():this.#S(e,t);return}e.action?.(this.#g()),this.#D()}}#S(e,t){this.#T();let n=this.#t.createElement(`div`);n.className=`zine-controls-menu`,n.setAttribute(`role`,`menu`);let r=this.#g();for(let t of e.children??[]){if(t===`|`)continue;let e=z(t);if(e.isVisible&&!e.isVisible(r))continue;let i;e.render?(i=e.render(this.#g()),this.#i.push({el:i,def:e})):i=this.#b(e,`zine-controls-btn`,!0),i.setAttribute(`role`,`menuitem`),n.appendChild(i)}this.#C(n,t),this.#D(),n.querySelector(`button`)?.focus()}#C(e,t){this.#n.appendChild(e),this.#a={el:e,trigger:t},t.setAttribute(`aria-expanded`,`true`),this.#w(e,t)}#w(e,t){let n=this.#n.getBoundingClientRect(),r=t.getBoundingClientRect(),i=e.getBoundingClientRect();if(!n.width||!i.width)return;let a=r.left-n.left+r.width/2-i.width/2;a=Math.max(4,Math.min(a,n.width-i.width-4)),e.style.left=`${a}px`;let o=r.bottom-n.top+6,s=r.top-n.top-i.height-6;e.style.top=`${s>=0?s:o}px`}#T(){if(!this.#a)return;let{el:e,trigger:t}=this.#a;this.#a=null,t.removeAttribute(`aria-expanded`),this.#i=this.#i.filter(t=>!e.contains(t.el)),e.remove(),this.#t.activeElement&&e.contains(this.#t.activeElement)&&t.focus()}#E(e){if(e.key===`Escape`&&this.#a){let{trigger:t}=this.#a;this.#T(),t.focus(),e.preventDefault();return}let t=[...this.#n.querySelectorAll(`button, input`)],n=t.indexOf(this.#t.activeElement);if(n<0||this.#t.activeElement instanceof HTMLInputElement)return;let r=e.key===`ArrowRight`||e.key===`ArrowDown`?1:e.key===`ArrowLeft`||e.key===`ArrowUp`?-1:0;r!==0&&(t[(n+r+t.length)%t.length]?.focus(),e.preventDefault())}#D(){let e=this.#g();for(let{el:t,def:n}of this.#i){let r=n.children?this.#k(n,e):n.isVisible?.(e);r!==void 0&&(t.style.display=r?``:`none`);let i=n.isDisabled?.(e)??!1;for(let e of this.#O(t))e.disabled=i;if(this.#O(t).length||t.setAttribute(`aria-disabled`,String(i)),t.classList.toggle(`zine-controls-off`,i),n.isActive&&t.setAttribute(`aria-pressed`,String(n.isActive(e))),typeof n.title==`function`){let r=n.title(e);t.title=r,t.setAttribute(`aria-label`,r);let i=t.querySelector(`.zine-controls-label`);i&&(i.textContent=r)}typeof n.icon==`function`&&t.querySelector(`svg`)?.replaceWith(F(this.#t,n.icon(e)))}this.#s&&this.#t.activeElement!==this.#s&&(this.#s.value=String(this.#e.getPage()+1))}#O(e){return e instanceof HTMLButtonElement||e instanceof HTMLInputElement?[e]:[...e.querySelectorAll(`button, input`)]}#k(e,t){return e.isVisible&&!e.isVisible(t)?!1:(e.children??[]).some(e=>{if(e===`|`)return!1;let n=z(e);return!n.isVisible||n.isVisible(t)})}makePageInput(){let e=this.#t.createElement(`div`);e.className=`zine-controls-page`;let t=this.#t.createElement(`input`);t.type=`number`,t.min=`1`,t.max=String(this.#e.getPageCount()),t.value=String(this.#e.getPage()+1),t.setAttribute(`aria-label`,`Page number`);let n=this.#t.createElement(`span`);n.textContent=`/ ${this.#e.getPageCount()}`;let r=!1,i=()=>{if(r)return;r=!0;let e=Number(t.value),n=Math.max(0,this.#e.getPageCount()-1),i=Number.isFinite(e)?Math.min(Math.max(Math.round(e)-1,0),n):this.#e.getPage();i===this.#e.getPage()?t.value=String(this.#e.getPage()+1):this.#e.flipTo(i)};return t.addEventListener(`focus`,()=>{r=!1}),t.addEventListener(`keydown`,e=>{e.key===`Enter`&&(i(),t.blur())}),t.addEventListener(`blur`,i),e.append(t,n),this.#s=t,e}openPanel(){return this.#d}hasOutline(){return this.#f===!0}#A(){this.#f!==null||!this.#e.canOutline()||(this.#f=!1,this.#e.getOutline().then(e=>{if(e.length===0)return;this.#f=!0,this.#D();let t=this.#a;if(t){let e=this.#i.find(e=>e.el===t.trigger)?.def;this.#T(),e&&this.#S(e,t.trigger)}}))}togglePanel(e){let t=this.#d;this.#u?.destroy(),this.#u=null,this.#d=null,t!==e&&(this.#u=new zt[e](this.#e,this.#l),this.#d=e),this.#D()}}})),Ut=r({DEFAULT_ITEMS:()=>V,ICONS:()=>I,createIcon:()=>F,defineControl:()=>R,getControl:()=>$e,mountControls:()=>Wt});function Wt(e,t,n={}){let r=new Vt(e,t,n);return Rt(r),r.mount(n),()=>r.destroy()}var Gt=n((()=>{Ht(),H(),L()}));D();var Kt=.25,qt=.0015,Jt=6,Yt=250,Xt=24,Zt=2*Yt,Qt=1.55,$t=32,en=60,tn=2.5,nn=1.5,rn=120,an=.85,on=.72;function sn(e,t,n){let r=Math.max(0,t-$t),i=Math.min(e.length,t+n+$t),a=e.slice(r,i).replace(/\s+/g,` `).trim();return`${r>0?`…`:``}${a}${i<e.length?`…`:``}`}var cn=class{#e;#t;#n=new c;#r=new s(2);#i=new d;#a;#o;#s;#c;#l=1;#u;#d;#f;#p;#m;#h=!1;#g=null;#_=!1;#v;#y=``;#b;#x;#S;#C=null;#w=null;#T=[];#E=0;#D=0;#O={left:null,right:null};#k;#A;#j;#M;#N;#P=null;#F=!1;#I=1;#L=0;#R=0;#z=null;#B=!1;#V=!1;#H=null;#U=null;#W=null;#G=null;#K=null;#q=null;#J=null;#Y=0;#X=null;#Z=!1;#Q=1;#$=!1;#ee=null;#te=null;#ne=null;#re=null;#ie=null;#ae=null;#oe=-1/0;#se=null;#ce=null;#le=new Set;#ue;#de=null;#fe=1;#pe=0;#me=null;#he;debug={setFlipProgress:(e,t)=>{this.#z?.setFlipProgress(e,t)}};constructor(e,t){pn(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=Xe(t.source,{frontCover:t.frontCover,backCover:t.backCover,pages:t.pages});let n=t.direction??`ltr`;this.#a=n,this.#x=(t.deepLink??!0)&&y(),this.#S=t.disableContextMenu??!1,this.#o=t.spreadMode??`cover`,this.#s=this.#o,this.#c=t.curl??`cone`,this.#u=t.clickToFlip??`edge`,this.#d=t.clickZoneSize??64,this.#m=t.singlePageThreshold??640,this.#v=t.responsiveSpread??!0,this.#ue=t.controls??!0,this.#b=t.startPage,typeof this.#t.open!=`function`&&this.#xt(),this.#k=t.flipDuration??800,this.#A=t.zoom?.enabled??!0,this.#j=t.zoom?.wheel??!0;let r=t.zoom?.doubleClick,i=r===!1?[]:[...r??[1,2,4]].sort((e,t)=>e-t);this.#M=i.length>0?i:null,this.#N=t.zoom?.max??4;let a=this.#A&&this.#M!==null,o=t.zoom?.doubleClickInFlipZone??this.#u===`half`;this.#f=this.#u!==`off`&&a&&o&&t.clickFlipDelay!==0,this.#p=this.#f?t.clickFlipDelay??Yt:0,this.#he=this.#Ke(t.renderer??`auto`)}get ready(){return this.#he}getPageCount(){return this.#t.pageCount}getPage(){return this.#D}get container(){return this.#e}getSpreads(){return this.#T}getSpreadIndex(){return this.#E}getDirection(){return this.#a}getSpreadMode(){return this.#o}isSinglePage(){return this.#h}setSpreadMode(e){e!==this.#o&&(this.#o=e,this.#_=!1,this.#at(),this.#ot())}toggleSpreadMode(){this.setSpreadMode(this.#o===`single`?this.#s===`single`?`double`:this.#s:`single`)}getResponsiveSpread(){return this.#v}isResponsiveSingle(){return this.#_&&this.#o!==`single`}setResponsiveSpread(e){if(e!==this.#v){if(this.#v=e,e){let e=this.#z?.measure().containerWidth;if(e===void 0)return;this.#_=!1,this.#it(e)}else{if(!this.#_)return;this.#_=!1,this.#at()}this.#ot()}}getPageImage(e){return this.#vt(e)}canFlipNext(){return this.#E+1<this.#T.length}canFlipPrev(){return this.#E>0}getMaxZoom(){return this.#N}canSearch(){return typeof this.#t.getText==`function`}canDownload(){return typeof this.#t.getDownload==`function`}isDocument(){return typeof this.#t.getOutline==`function`||typeof this.#t.getText==`function`}canPrint(){return typeof this.#t.getDownload==`function`}async print(){let e=await this.getSourceFile(),t=this.#e.ownerDocument;if(!e||!t)return!1;let n=t.createElement(`iframe`);return n.style.cssText=`position:fixed;right:0;bottom:0;width:1px;height:1px;opacity:0;border:0;`,n.setAttribute(`aria-hidden`,`true`),n.src=e.url,new Promise(r=>{let i=!1,a=t=>{i||(i=!0,setTimeout(()=>{n.remove(),e.revoke&&URL.revokeObjectURL(e.url)},6e4),r(t))};n.addEventListener(`load`,()=>{try{let e=n.contentWindow;if(!e)return a(!1);e.focus(),e.print(),a(!0)}catch{a(!1)}}),n.addEventListener(`error`,()=>a(!1)),t.body.appendChild(n)})}canOutline(){return typeof this.#t.getOutline==`function`}getOutline(){if(!this.#ce){let e=this.#t.getOutline;this.#ce=typeof e==`function`?Promise.resolve(e.call(this.#t)).catch(()=>[]):Promise.resolve([])}return this.#ce}async getSourceFile(){let e=this.#t.getDownload;return typeof e==`function`?await e.call(this.#t)??null:null}async download(){let e=await this.getSourceFile();if(!e)return!1;let t=this.#e.ownerDocument;if(!t)return!1;let n=t.createElement(`a`);return n.href=e.url,n.download=e.filename,n.rel=`noopener`,t.body.appendChild(n),n.click(),n.remove(),e.revoke&&setTimeout(()=>URL.revokeObjectURL(e.url),1e4),!0}async search(e,t={}){let n=this.#t.getText,r=e.trim().toLowerCase();if(typeof n!=`function`||r===``)return[];let i=t.limit??50,a=[];for(let e=0;e<this.#t.pageCount&&a.length<i;e++){let t;try{t=await n.call(this.#t,e)}catch(t){this.#n.emit(`sourceError`,{index:e,error:t});continue}let i=t.toLowerCase().indexOf(r);i<0||a.push({page:e,excerpt:sn(t,i,r.length)})}return a}flipNext(){this.#ge(1)}flipPrev(){this.#ge(-1)}#ge(e){this.#_e(()=>this.#xe(this.#E+e))}flipTo(e){let t=Q(e,0,Math.max(0,this.#t.pageCount-1));this.#_e(()=>this.#xe(this.#bt(t)))}#_e(e){this.#i.state===`idle`?e():this.#J?(this.#q=null,this.#ve(),e()):this.#q=e}#ve(){let e=this.#J;e&&(this.#J=null,this.#H!==null&&(cancelAnimationFrame(this.#H),this.#H=null),this.#z?.setFlipProgress(e.toT,e.direction),e.onDone())}#ye(){let e=this.#q;if(!e){this.#mt();return}this.#q=null,e()}getZoom(){return this.#I}setZoom(e,t){if(!this.#z||!this.#A)return;let n=Q(e,1,this.#N),r=this.#z.measure(),i=r.screenAt?.(this.#I),a=t??(i?{x:i.x+this.#L+i.width/2,y:i.y+this.#R+i.height/2}:null)??{x:r.containerWidth/2,y:r.containerHeight/2},o=this.#I,s=n===1?0:a.x-n/o*(a.x-this.#L),c=n===1?0:a.y-n/o*(a.y-this.#R);[s,c]=this.#be(s,c,n,r.containerWidth,r.containerHeight),this.#I=n,this.#L=s,this.#R=c,this.#z.setViewTransform(n,s,c),this.#ut(),this.#n.emit(`zoomChanged`,{scale:n})}resetZoom(){this.setZoom(1)}#be(e,t,n,r,i){let a=typeof devicePixelRatio==`number`&&devicePixelRatio>0?devicePixelRatio:1,o=e=>Math.round(e*a)/a||0,s=this.#z?.measure().screenAt?.(n)??{x:0,y:0,width:r*n,height:i*n},[c,l]=ln(s.x,s.width,r),[u,d]=ln(s.y,s.height,i);return[o(Q(e,c,l)),o(Q(t,u,d))]}on(e,t){return this.#n.on(e,t)}destroy(){this.#V=!0,this.#H!==null&&cancelAnimationFrame(this.#H),this.#J=null,this.#q=null,this.#Le(),this.#P?.disconnect(),this.#C?.stop(),this.#C=null,this.#w?.(),this.#x&&b(),this.#de?.(),this.#se?.(),this.#ne?.(),this.#ie?.(),this.#re?.(),this.#te?.(),this.#me!==null&&clearTimeout(this.#me),this.#pe++,this.#z?.destroy(),this.#z=null,this.#t.destroy(),this.#n.clear()}#xe(e){if(e<0||e>=this.#T.length||e===this.#E||this.#i.send(`flip`)===null)return;let t=e>this.#E?`forward`:`backward`,n=this.#Ee(e);this.#n.emit(`flipStart`,{from:this.#D,to:n}),this.#Se(e,t,n,++this.#Y)}async#Se(e,t,n,r){let i=this.#T[e],a=i?await this.#_t(i):{left:null,right:null};r===this.#Y&&(this.#z?.beginFlip(this.#O,a,t,{fill:this.#h,curl:this.#nt(),anchor:{y:this.#l}}),this.#Ce(0,1,t,()=>this.#Te(e,n,a),()=>this.#we(n)))}#Ce(e,t,n,r,i){let a=this.#tt()*Math.abs(t-e);if(a<=0){this.#z?.setFlipProgress(t,n),r();return}let o={toT:t,direction:n,onDone:r};this.#J=o;let s=performance.now(),c=!1,l=u=>{if(this.#J!==o)return;let d=Math.min(1,(u-s)/a),f=this.#h?dn(d):un(d);i&&!c&&f>=(this.#h?on:an)&&(c=!0,i()),d<1?(this.#z?.setFlipProgress(e+(t-e)*f,n),this.#H=requestAnimationFrame(l)):(this.#z?.setFlipProgress(t,n),this.#H=null,this.#J=null,r())};this.#H=requestAnimationFrame(l)}#we(e){this.#D!==e&&(this.#D=e,this.#et(),this.#n.emit(`pageChanged`,{page:e}))}#Te(e,t,n){let r=this.#T[e];this.#E=e,this.#O=n,r&&this.#st(r,n),this.#yt(),this.#i.send(`settle`),this.#oe=performance.now(),this.#we(t),this.#n.emit(`flipEnd`,{page:t}),this.#ye()}#Ee(e){let t=this.#T[e];if(!t)return this.#D;let n=[t.left,t.right].filter(e=>e!==null);return n.length>0?Math.min(...n):this.#D}#De(e,t){if(this.#Z||!this.#z)return;if(this.#Le(),this.#I>1){if(this.#i.send(`panStart`)===null)return;this.#X={baseTx:this.#L,baseTy:this.#R};return}let n=this.#Ne(),r=this.#Pe(e,t);this.#G=r;let i=Math.min(n.width,n.height)*Kt,a=r.x>=0&&r.x<=n.width&&r.y>=0&&r.y<=n.height,o=r.x<=i||r.x>=n.width-i,s=a&&o;if(this.#i.state!==`idle`){if(!this.#J||!s){this.#W=null;return}this.#ve()}if(!s)return;this.#l=Q(r.y/n.height,0,1);let c=r.x>n.width/2,l=this.#a===`rtl`?!c:c,u=this.#E+(l?1:-1);u<0||u>=this.#T.length||(this.#W={direction:l?`forward`:`backward`,targetIndex:u,toPage:this.#Ee(u),width:n.width})}#Oe(){let e=this.#W;e&&(this.#W=null,this.#i.send(`grab`)!==null&&(this.#U={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.#D,to:e.toPage}),this.#ke(e.targetIndex,e.direction)))}async#ke(e,t){let n=this.#T[e],r=n?await this.#_t(n):{left:null,right:null};this.#U?.targetIndex===e&&(this.#U.toContent=r,this.#z?.beginFlip(this.#O,r,t,{fill:this.#h,curl:this.#nt(),anchor:{y:this.#l}}),this.#z?.setFlipProgress(this.#U.t,t))}#Ae(e,t){if(this.#Z)return;if(this.#X){if(!this.#z)return;let n=this.#z.measure(),[r,i]=this.#be(this.#X.baseTx+e,this.#X.baseTy+t,this.#I,n.containerWidth,n.containerHeight);this.#L=r,this.#R=i,this.#z.setViewTransform(this.#I,r,i),this.#ut();return}this.#W&&Math.hypot(e,t)>Jt&&this.#Oe();let n=this.#U;n&&(n.t=Q((n.direction===`forward`?-e:e)/n.width,0,1),this.#z?.setFlipProgress(n.t,n.direction))}#je(e){if(this.#Z)return;if(this.#X){this.#X=null,this.#i.send(`panEnd`);return}let t=this.#U;if(!t){this.#W=null,this.#Me(e);return}this.#U=null,this.#i.send(`release`);let n=e.swipe&&(t.direction===`forward`?e.dx<0:e.dx>0);t.t>=.5||n?this.#Ce(t.t,1,t.direction,()=>this.#Te(t.targetIndex,t.toPage,t.toContent),()=>this.#we(t.toPage)):this.#Ce(t.t,0,t.direction,()=>this.#Re())}#Me(e){if(this.#u===`off`||this.#I>1||!this.#G||Math.abs(e.dx)>Jt||Math.abs(e.dy)>Jt)return;let t=this.#Fe(this.#G);if(!t||!this.#Ie(t))return;this.#l=Q(this.#G.y/this.#Ne().height,0,1);let n=t===`forward`?1:-1,r=()=>this.#xe(this.#E+n);if(this.#Le(),this.#p<=0){this.#_e(r);return}this.#K=setTimeout(()=>{this.#K=null,this.#_e(r)},this.#p)}#Ne(){let e=this.#z.measure();return e.content??e.book??{x:0,y:0,width:e.containerWidth,height:e.containerHeight}}#Pe(e,t){let n=this.#e.getBoundingClientRect(),r=this.#Ne();return{x:e-n.left-r.x,y:t-n.top-r.y}}#Fe(e){if(!this.#z)return null;let t=this.#Ne().width,n;if(n=this.#u===`half`?e.x>t/2?`right`:`left`:e.x<=this.#d?`left`:e.x>=t-this.#d?`right`:null,!n)return null;let r=this.#a===`rtl`?`left`:`right`;return n===r?`forward`:`backward`}#Ie(e){let t=this.#E+(e===`forward`?1:-1);return t>=0&&t<this.#T.length}#Le(){this.#K!==null&&(clearTimeout(this.#K),this.#K=null)}#Re(){let e=this.#T[this.#E];e&&this.#st(e,this.#O),this.#i.send(`settle`),this.#n.emit(`flipEnd`,{page:this.#D}),this.#ye()}#ze(){if(this.#W=null,this.#Le(),this.#U){this.#U=null,this.#i.send(`release`),this.#i.send(`settle`);let e=this.#T[this.#E];e&&this.#st(e,this.#O)}else this.#X&&(this.#X=null,this.#i.send(`panEnd`));this.#Z=!0,this.#Q=this.#I}#Be(e,t,n){if(!this.#Z)return;let r=this.#e.getBoundingClientRect();this.setZoom(this.#Q*n,{x:e-r.left,y:t-r.top})}#Ve(){this.#Z=!1}#He(){if(!this.#S)return;let e=e=>e.preventDefault();this.#e.addEventListener(`contextmenu`,e),this.#re=()=>this.#e.removeEventListener(`contextmenu`,e)}#Ue(){let e=e=>{if(!this.#j||!this.#A||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let t=this.#e.getBoundingClientRect(),n=Math.exp(-e.deltaY*qt);this.setZoom(this.#I*n,{x:e.clientX-t.left,y:e.clientY-t.top})};this.#e.addEventListener(`wheel`,e,{passive:!1}),this.#ne=()=>this.#e.removeEventListener(`wheel`,e)}#We(){let e=e=>{let t=this.#M;if(!this.#A||t===null||!this.#z)return;let n=performance.now(),r=this.#ae;if(!(r!==null&&n-r.t<=Yt&&Math.hypot(e.clientX-r.x,e.clientY-r.y)<=Xt)){this.#ae={t:n,x:e.clientX,y:e.clientY};return}this.#ae=null,this.#Ge(e.clientX,e.clientY,t)};this.#e.addEventListener(`click`,e),this.#ie=()=>this.#e.removeEventListener(`click`,e)}#Ge(e,t,n){if(this.#I<=1&&this.#u!==`off`&&!this.#f){let n=this.#Pe(e,t),r=this.#Fe(n);if(r!==null&&(this.#Ie(r)||performance.now()-this.#oe<=Zt))return}this.#Le();let r=n.find(e=>e>this.#I+1e-6)??n[0]??this.#I,i=this.#e.getBoundingClientRect();this.setZoom(r,{x:e-i.left,y:t-i.top})}async#Ke(e){let t=P(e);typeof this.#t.open==`function`&&(await this.#t.open(),this.#xt()),this.#t.prefetch([this.#D]);let n=await t,r=await this.#qe(n);this.#z=r,this.#t.onPageUpdate?.(e=>this.#lt(e)),this.#it(r.measure().containerWidth);let i=new p({onStart:e=>this.#De(e.x,e.y),onMove:e=>this.#Ae(e.dx,e.dy),onEnd:e=>this.#je(e)}),a=new g({onPinchStart:()=>this.#ze(),onPinchMove:e=>this.#Be(e.centerX,e.centerY,e.scale),onPinchEnd:()=>this.#Ve()});this.#te=m(this.#e,{pointer:i,pinch:a}),this.#Ue(),this.#We(),this.#He(),this.#Ye(),this.#se=this.#Qe(),await this.#ot(),this.#ht(),this.#yt(),this.#et(),this.#Ze(),await this.#Xe(),this.#n.emit(`ready`)}async#qe(e){try{return await e.mount(this.#e),e.onFatal?.(()=>{this.#Je()}),e}catch{e.destroy();let t=await P(`css`);return await t.mount(this.#e),this.#B=!0,this.#n.emit(`rendererFallback`,{from:`webgl2`,to:`css`}),t}}async#Je(){if(this.#B||this.#V)return;this.#B=!0,this.#z?.destroy(),this.#z=null;let e=await P(`css`);if(this.#V){e.destroy();return}await e.mount(this.#e),this.#z=e,this.#it(e.measure().containerWidth),await this.#ot(),this.#n.emit(`rendererFallback`,{from:`webgl2`,to:`css`})}#Ye(){if(typeof matchMedia!=`function`)return;let e=matchMedia(`(prefers-reduced-motion: reduce)`);this.#$=e.matches,e.addEventListener?.(`change`,e=>{this.#$=e.matches})}async#Xe(){if(this.#ue===!1||this.#V)return;let e=this.#e;if(!(!e.ownerDocument||typeof e.appendChild!=`function`))try{let{mountControls:t}=await Promise.resolve().then(()=>(Gt(),Ut));if(this.#V)return;let n=this.#ue===!0?{}:this.#ue;this.#de=t(this,e,n)}catch{}}#Ze(){if(!this.#x||globalThis.location===void 0)return;let e=globalThis;this.#C=C(e,e=>{e!==this.#D&&this.flipTo(e)}),this.#C.push(this.#D),this.#w=this.#n.on(`pageChanged`,({page:e})=>{this.#C?.push(e)})}pageLink(e=this.#D){let t=globalThis.location?.href??``;if(!t)return``;let n=new URL(t);return n.hash=S(n.hash,Q(e,0,Math.max(0,this.#t.pageCount-1))),n.toString()}#Qe(){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.#$e(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.#ee=r,()=>{e.removeEventListener(`keydown`,n),r.remove(),this.#ee=null}}#$e(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}}#et(){this.#ee&&(this.#ee.textContent=`Page ${this.#D+1} of ${this.#t.pageCount}`)}#tt(){return this.#$?rn:this.#k*(this.#h?Qt:1)}#nt(){return this.#$?`simple`:this.#c}update(){!this.#z||this.#i.state!==`idle`||(this.#it(this.#z.measure().containerWidth),this.#ot())}#rt(){return this.#_||this.#o===`single`?`single`:this.#o}#it(e){let t=this.#v&&a(e,this.#m);t!==this.#_&&(this.#_=t,this.#at())}#at(){let e=this.#rt(),t=e!==this.#g;this.#g=e,this.#h=e===`single`,this.#T=i(this.#t.pageCount,{direction:this.#a,mode:e}),this.#E=this.#bt(this.#D),t&&this.#n.emit(`spreadChanged`,{mode:e,singlePage:this.#h})}async#ot(){let e=this.#T[this.#E];!e||!this.#z||(this.#O=await this.#_t(e),this.#st(e,this.#O))}#st(e,t){this.#z?.renderSpread(e,t,{fill:this.#h}),this.#ct(),this.#fe=1,this.#ut()}#ct(){let e=this.#z?.measure().book;if(!e||e.width<=0||e.height<=0)return;let t=(e.width/e.height).toFixed(4);t!==this.#y&&(this.#y=t,this.#e.style.aspectRatio=t)}#lt(e){if(this.#i.state!==`idle`){this.#le.add(e);return}let t=this.#T[this.#E];t&&(t.left===e||t.right===e)&&this.#ot()}#ut(){this.#me!==null&&clearTimeout(this.#me);let e=this.#ft();if(e!==this.#fe){if(e===1){this.#pe++,this.#fe=1,this.#ot();return}this.#me=setTimeout(()=>{this.#me=null,this.#pt()},en)}}#dt(){let e=this.#z?.measure(),t=e?.content??e?.book;if(!t||t.width<=0)return 1;let n=this.#O,r=+!!n.left+ +!!n.right;if(r===0)return 1;let i=t.width/r,a=typeof devicePixelRatio==`number`&&devicePixelRatio>0?devicePixelRatio:1,o=0;for(let e of[n.left,n.right]){if(!e||e.width<=0)continue;let t=e.width/this.#fe;o=Math.max(o,i*a/t)}return o===0?1:o}#ft(){let e=Math.max(1,nn/(typeof devicePixelRatio==`number`&&devicePixelRatio>0?devicePixelRatio:1)),t=this.#I<=1?1:this.#I,n=this.#dt()*Math.max(t,e);return n<=1.001?1:Math.min(Math.ceil(n*2)/2,tn)}async#pt(){let e=this.#T[this.#E];if(!this.#z||!e)return;let t=this.#ft();if(t===1||t===this.#fe||this.#i.state!==`idle`)return;let n=++this.#pe,r={x:0,y:0,width:1,height:1},i=await Promise.all([e.left,e.right].map(async e=>{if(e===null)return null;try{return await this.#t.get(e,{scale:t,region:r})}catch(t){return this.#n.emit(`sourceError`,{index:e,error:t}),null}}));if(n!==this.#pe||this.#ft()!==t||this.#i.state!==`idle`)return;let a=i[0]??null,o=i[1]??null;a===this.#O.left&&o===this.#O.right||(this.#fe=t,this.#O={left:a,right:o},this.#z.renderSpread(e,this.#O,{fill:this.#h}))}#mt(){if(this.#le.size===0)return;let e=this.#T[this.#E],t=e!==void 0&&[e.left,e.right].some(e=>e!==null&&this.#le.has(e));this.#le.clear(),t&&this.#ot()}#ht(){typeof ResizeObserver>`u`||(this.#P=new ResizeObserver(()=>this.#gt()),this.#P.observe(this.#e))}#gt(){this.#F||(this.#F=!0,requestAnimationFrame(()=>{this.#F=!1,this.update()}))}async#_t(e){let[t,n]=await Promise.all([this.#vt(e.left),this.#vt(e.right)]);return{left:t,right:n}}async#vt(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}}#yt(){let{toMount:e}=this.#r.update(this.#E,this.#T.length),t=[];for(let n of e){let e=this.#T[n];e?.left!=null&&t.push(e.left),e?.right!=null&&t.push(e.right)}this.#t.prefetch(t)}#bt(e){let t=this.#T.findIndex(t=>t.left===e||t.right===e);return t===-1?0:t}#xt(){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.#b;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.#rt();this.#h=n===`single`,this.#T=i(e,{direction:this.#a,mode:n});let r=this.#x?x(globalThis.location?.hash??``):null;this.#D=Q(r??t??0,0,e-1),this.#E=this.#bt(this.#D)}};function Q(e,t,n){return e<t?t:e>n?n:e}function ln(e,t,n){if(t<=n){let r=(n-t)/2-e;return[r,r]}return[n-(e+t),-e]}function un(e){return e<.5?2*e*e:1-(-2*e+2)**2/2}function dn(e){return 1-(1-un(e))**1.3}function fn(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function pn(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 ${fn(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){if(typeof s==`object`&&s){if(typeof s.deform!=`function`)throw Error(`Zine: a curl model must have a deform() function.`)}else if(T.includes(s))throw Error(`Zine: the '${String(s)}' curl is not bundled. Import it and pass the model: import { ${String(s)} } from '@zinejs/core/curls' → curl: ${String(s)}`);else if(!w.includes(s))throw Error(`Zine: curl must be ${w.join(` or `)}, or a model imported from '@zinejs/core/curls' (${T.join(`, `)}); got ${JSON.stringify(s)}.`)}for(let e of[`deepLink`,`disableContextMenu`,`responsiveSpread`])if(n[e]!==void 0&&typeof n[e]!=`boolean`)throw Error(`Zine: ${e} must be a boolean; got ${fn(n[e])}.`);let c=n.controls;if(c!==void 0&&typeof c!=`boolean`&&(typeof c!=`object`||!c))throw Error(`Zine: controls must be a boolean or an options object; got ${fn(c)}.`);let l=c?.position;if(l!==void 0&&![`top`,`bottom`,`left`,`right`].includes(l))throw Error(`Zine: controls.position must be 'top', 'bottom', 'left', or 'right'; got ${JSON.stringify(l)}.`);let u=n.spreadMode;if(u!==void 0&&![`double`,`single`,`cover`,`book`].includes(u))throw Error(`Zine: spreadMode must be 'double', 'single', 'cover', or 'book'; got ${JSON.stringify(u)}.`);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 d=n.pages;if(d!==void 0&&(typeof d!=`object`||!d||Array.isArray(d)))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),mn(n.zoom),hn(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 mn(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 hn(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 gn=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}};H(),D(),e.CURL_TYPES=w,e.DEFAULT_ITEMS=V,e.IMPORTABLE_CURLS=T,e.ImageSource=gn,e.Zine=cn,e.defineControl=R,e.getControl=$e});
|
|
795
|
+
`})),wt=r({ShareDialog:()=>Dt}),Tt,Et,Dt,Ot=n((()=>{I(),dt(),yt(),Ct(),Tt=132,Et=1600,Dt=class{#e;#t;#n;#r;#i=null;#a;constructor(e,t,n=`auto`){let r=t.ownerDocument;this.#e=r,this.#r=r.activeElement;let i=e.pageLink(),a=r.title||`Flipbook`;this.#t=r.createElement(`div`),this.#t.className=`zine-share-backdrop`,Y(this.#t,n),this.#t.addEventListener(`pointerdown`,e=>{e.target===this.#t&&this.close()}),this.#n=r.createElement(`div`),this.#n.className=`zine-share`,this.#n.setAttribute(`role`,`dialog`),this.#n.setAttribute(`aria-modal`,`true`),this.#n.setAttribute(`aria-label`,`Share`),this.#t.appendChild(this.#n);let o=r.createElement(`div`);o.className=`zine-share-head`;let s=r.createElement(`strong`);s.textContent=`Share`;let c=r.createElement(`button`);c.type=`button`,c.className=`zine-share-close`,c.setAttribute(`aria-label`,`Close`),c.appendChild(P(r,F.close)),c.addEventListener(`click`,()=>this.close()),o.append(s,c),this.#n.append(o,this.#s(r,i),this.#l(r,i,a));let l=this.#o(r,i);l&&this.#n.insertBefore(l,this.#n.children[1]),t.ownerDocument.body.appendChild(this.#t),this.#a=e=>{e.key===`Escape`&&this.close(),e.key===`Tab`&&this.#u(e)},this.#t.addEventListener(`keydown`,this.#a),c.focus()}#o(e,t){if(!t)return null;try{let n=e.createElement(`div`);return n.className=`zine-share-qr`,n.innerHTML=gt(t,Tt),n.setAttribute(`aria-label`,`QR code for this page`),n.setAttribute(`role`,`img`),n}catch{return null}}#s(e,t){let n=e.createElement(`div`);n.className=`zine-share-link`;let r=e.createElement(`input`);r.type=`text`,r.readOnly=!0,r.value=t,r.setAttribute(`aria-label`,`Link to this page`),r.addEventListener(`focus`,()=>r.select());let i=e.createElement(`button`);return i.type=`button`,i.className=`zine-share-copy`,i.textContent=`Copy`,i.addEventListener(`click`,()=>{this.#c(t,i)}),n.append(r,i),n}async#c(e,t){try{await navigator.clipboard?.writeText(e),t.textContent=`Copied`}catch{t.textContent=`Press Ctrl+C`}this.#i&&clearTimeout(this.#i),this.#i=setTimeout(()=>{t.textContent=`Copy`},Et)}#l(e,t,n){let r=e.createElement(`div`);r.className=`zine-share-socials`;for(let i of ut){let a=e.createElement(`a`);a.className=`zine-share-social`,a.href=i.href(t,n),a.title=i.label,a.setAttribute(`aria-label`,`Share on ${i.label}`),i.id!==`email`&&(a.target=`_blank`,a.rel=`noopener noreferrer`),a.appendChild(P(e,i.icon)),r.appendChild(a)}return r}#u(e){let t=[...this.#n.querySelectorAll(`button, a[href], input`)].filter(e=>!e.hasAttribute(`disabled`));if(t.length===0)return;let n=t[0],r=t.at(-1),i=this.#e.activeElement;e.shiftKey&&i===n?(r.focus(),e.preventDefault()):!e.shiftKey&&i===r&&(n.focus(),e.preventDefault())}close(){this.destroy()}destroy(){this.#i&&clearTimeout(this.#i),this.#i=null,this.#t.removeEventListener(`keydown`,this.#a),this.#t.remove(),this.#r?.focus?.()}}}));function kt(){L({id:`prev`,title:`Previous page`,icon:F.prev,isDisabled:e=>!e.zine.canFlipPrev(),action:e=>e.zine.flipPrev()}),L({id:`next`,title:`Next page`,icon:F.next,isDisabled:e=>!e.zine.canFlipNext(),action:e=>e.zine.flipNext()});let e=e=>e.zine.getDirection()===`rtl`;L({id:`first`,title:`First page`,icon:t=>e(t)?F.last:F.first,isDisabled:e=>!e.zine.canFlipPrev(),action:e=>{e.zine.flipTo(0),e.close()}}),L({id:`last`,title:`Last page`,icon:t=>e(t)?F.first:F.last,isDisabled:e=>!e.zine.canFlipNext(),action:e=>{e.zine.flipTo(e.zine.getPageCount()-1),e.close()}}),L({id:`zoomIn`,title:`Zoom in`,icon:F.zoomIn,isDisabled:e=>e.zine.getZoom()>=e.zine.getMaxZoom()-1e-6,action:e=>e.zine.setZoom(e.zine.getZoom()*At)}),L({id:`zoomOut`,title:`Zoom out`,icon:F.zoomOut,isDisabled:e=>e.zine.getZoom()<=1.000001,action:e=>e.zine.setZoom(e.zine.getZoom()/At)}),L({id:`fullscreen`,title:`Fullscreen`,icon:F.fullscreen,isVisible:e=>typeof e.zine.container.requestFullscreen==`function`,isActive:jt,action:e=>{let t=e.zine.container.ownerDocument;jt(e)?t?.exitFullscreen?.():e.zine.container.requestFullscreen?.(),e.close()}}),L({id:`share`,title:`Share`,icon:F.share,action:e=>{e.close(),Promise.resolve().then(()=>(Ot(),wt)).then(({ShareDialog:t})=>new t(e.zine,e.zine.container,e.colorScheme)).catch(()=>{navigator.clipboard?.writeText(e.zine.pageLink()).catch(()=>{})})}}),L({id:`download`,title:`Download PDF`,icon:F.download,isVisible:e=>e.zine.canDownload(),action:e=>{e.zine.download(),e.close()}}),L({id:`spread`,title:e=>e.zine.isSinglePage()?`Show two pages`:`Show one page`,icon:e=>e.zine.isSinglePage()?F.twoPages:F.onePage,isVisible:e=>!e.zine.isResponsiveSingle(),action:e=>{e.zine.toggleSpreadMode(),e.close()}}),L({id:`print`,title:`Print`,icon:F.print,isVisible:e=>e.zine.canPrint(),action:e=>{e.zine.print(),e.close()}}),L({id:`menu`,title:`More`,icon:F.menu,children:[`first`,`last`,`spread`,`thumbnails`,`outline`,`print`,`download`]})}var At,jt,Mt=n((()=>{I(),B(),At=Math.SQRT2,jt=e=>e.zine.container.ownerDocument?.fullscreenElement===e.zine.container})),X,Z=n((()=>{I(),X=class{root;#e;#t=null;#n=null;#r=null;#i=null;#a;#o=null;#s=null;constructor(e,t,n){this.#a=e,this.#e=e.createElement(`div`),this.#e.className=`zine-panel-holder`,this.#e.style.width=`${n.width}px`,this.#o=n.pageBox??null,this.root=e.createElement(`div`),this.root.className=`zine-panel ${n.className}`,this.root.setAttribute(`role`,`listbox`),this.root.setAttribute(`aria-label`,n.label),this.#e.appendChild(this.root);for(let e of[`pointerdown`,`pointerup`,`pointermove`,`click`,`dblclick`,`wheel`])this.root.addEventListener(e,e=>e.stopPropagation());this.#u(e,t,n.rtl??!1,n.overlay??!1),n.onDismiss&&this.#d(e,n.onDismiss),this.#c(t)}#c(e){this.#o&&(this.#l(),!(typeof ResizeObserver>`u`)&&(this.#s=new ResizeObserver(()=>this.#l()),this.#s.observe(e)))}#l(){let e=this.#o?.();e&&(this.#e.style.top=`${e.y}px`,this.#e.style.bottom=`auto`,this.#e.style.height=`${e.height}px`)}setWidth(e){this.#e.style.width=`${e}px`}#u(e,t,n,r){if(!t.parentNode){this.#e.classList.add(`zine-panel-overlay`),t.appendChild(this.#e);return}let i=t.closest(`.zine-controls-wrap`)??t,a=e.createElement(`div`);a.className=`zine-panel-wrap`,n&&a.classList.add(`zine-panel-wrap-rtl`),r&&a.classList.add(`zine-panel-wrap-overlay`),i.parentNode.insertBefore(a,i),a.append(this.#e,i),this.#t=a}#d(e,t){let n=e.createElement(`button`);if(n.type=`button`,n.className=`zine-panel-close`,n.setAttribute(`aria-label`,`Close`),n.appendChild(P(e,F.close)),n.addEventListener(`click`,e=>{e.stopPropagation(),t()}),this.#e.appendChild(n),this.#r=n,this.#t){let n=e.createElement(`div`);n.className=`zine-panel-scrim`,this.#t.insertBefore(n,this.#e);for(let e of[`pointerdown`,`click`])n.addEventListener(e,e=>{e.stopPropagation(),t()});this.#n=n}this.#i=e=>{e.key===`Escape`&&t()},e.addEventListener(`keydown`,this.#i)}destroy(){this.#s?.disconnect(),this.#s=null,this.#i&&=(this.#a.removeEventListener(`keydown`,this.#i),null),this.#n?.remove(),this.#n=null,this.#r=null,this.#e.remove();let e=this.#t;if(e?.parentNode){for(;e.firstChild;)e.parentNode.insertBefore(e.firstChild,e);e.remove()}this.#t=null}}})),Nt,Pt,Ft=n((()=>{Z(),Nt=78,Pt=class{root;#e;#t;#n;#r=[];#i=null;#a=[];constructor(e,t,n={}){this.#e=e;let r=t.ownerDocument;this.#t=r,this.#n=new X(r,t,{className:`zine-thumbs`,label:`Pages`,width:90,onDismiss:n.onDismiss,rtl:e.getDirection()===`rtl`,pageBox:()=>e.getPageBox()}),this.root=this.#n.root,this.#o(),this.#a.push(e.on(`pageChanged`,()=>this.#l())),this.#l()}#o(){let e=this.#e.getSpreads(),t=this.#e.getDirection()===`rtl`,n=e.some(e=>e.left!==null&&e.right!==null);this.#n.root.classList.toggle(`zine-thumbs-solo`,!n),n&&this.#n.setWidth(170);for(let[r,i]of e.entries()){let e=this.#t.createElement(`button`);e.type=`button`,e.className=`zine-thumbs-row`,e.setAttribute(`role`,`option`),t&&(e.style.flexDirection=`row-reverse`);let a=[i.left,i.right].filter(e=>e!==null);n&&a.length===1&&e.classList.add(`zine-thumbs-row-lone`);for(let t of a){let n=this.#t.createElement(`span`);n.className=`zine-thumbs-cell`,n.dataset.page=String(t),e.appendChild(n)}let o=[...a].sort((e,t)=>e-t).map(e=>e+1);e.setAttribute(`aria-label`,o.length>1?`Pages ${o[0]}–${o.at(-1)}`:`Page ${o[0]??``}`);let s=this.#t.createElement(`span`);s.className=`zine-thumbs-caption`,s.textContent=o.join(`–`),e.appendChild(s),e.addEventListener(`click`,()=>{a.length>0&&this.#e.flipTo(Math.min(...a))}),this.#n.root.appendChild(e),this.#r.push({el:e,spread:r,pages:a})}this.#s()}#s(){let e=[...this.#n.root.querySelectorAll(`.zine-thumbs-cell[data-page]`)];if(typeof IntersectionObserver>`u`){for(let t of e)this.#c(t);return}this.#i=new IntersectionObserver((e,t)=>{for(let n of e)n.isIntersecting&&(t.unobserve(n.target),this.#c(n.target))},{root:this.#n.root,rootMargin:`200px`});for(let t of e)this.#i.observe(t)}async#c(e){let t=Number(e.dataset.page),n=await this.#e.getPageImage(t);if(!n||!e.isConnected)return;let r=n.width,i=n.height;if(!r||!i)return;let a=Math.min(2,globalThis.devicePixelRatio||1),o=this.#t.createElement(`canvas`);o.width=Math.max(1,Math.round(Nt*a)),o.height=Math.max(1,Math.round(Nt*i/r*a)),o.className=`zine-thumbs-img`;let s=o.getContext(`2d`);if(s){try{s.drawImage(n,0,0,o.width,o.height)}catch{return}e.replaceChildren(o)}}#l(){let e=this.#e.getPage();for(let{el:t,pages:n}of this.#r){let r=n.includes(e);t.classList.toggle(`zine-panel-active`,r),t.setAttribute(`aria-selected`,String(r)),r&&t.scrollIntoView?.({block:`nearest`})}}destroy(){for(let e of this.#a)e();this.#a=[],this.#i?.disconnect(),this.#i=null,this.#n.destroy()}}})),It,Lt,Rt,zt=n((()=>{Z(),It=208,Lt=12,Rt=class{root;#e;#t;#n;#r=[];#i=[];constructor(e,t,n={}){this.#e=e;let r=t.ownerDocument;this.#t=r,this.#n=new X(r,t,{className:`zine-outline`,label:`Outline`,width:It,onDismiss:n.onDismiss,rtl:e.getDirection()===`rtl`,overlay:!0,pageBox:()=>e.getPageBox()}),this.root=this.#n.root,this.#a(`Loading…`),this.#o(),this.#i.push(e.on(`pageChanged`,()=>this.#c()))}#a(e){let t=this.#t.createElement(`div`);t.className=`zine-panel-note`,t.textContent=e,this.#n.root.replaceChildren(t)}async#o(){let e=await this.#e.getOutline();if(this.#n.root.isConnected){if(e.length===0){this.#a(`This document has no outline.`);return}this.#n.root.replaceChildren(),this.#s(e,0),this.#c()}}#s(e,t){for(let n of e){let e=this.#t.createElement(`button`);if(e.type=`button`,e.className=`zine-outline-row`,e.setAttribute(`role`,`option`),e.style.paddingLeft=`${8+t*Lt}px`,e.textContent=n.title,e.title=n.title,n.page===null)e.disabled=!0;else{let t=n.page;e.setAttribute(`aria-label`,`${n.title}, page ${t+1}`),e.addEventListener(`click`,()=>this.#e.flipTo(t)),this.#r.push({el:e,page:t})}this.#n.root.appendChild(e),n.children.length>0&&this.#s(n.children,t+1)}}#c(){let e=this.#e.getPage(),t=null,n=-1;for(let{el:r,page:i}of this.#r)r.classList.remove(`zine-panel-active`),r.removeAttribute(`aria-selected`),i<=e&&i>=n&&(t=r,n=i);t&&(t.classList.add(`zine-panel-active`),t.setAttribute(`aria-selected`,`true`),t.scrollIntoView?.({block:`nearest`}))}destroy(){for(let e of this.#i)e();this.#i=[],this.#n.destroy()}}})),Bt,Vt,Ht,Ut,Wt=n((()=>{Z(),Bt=208,Vt=180,Ht=2,Ut=class{root;#e;#t;#n;#r;#i;#a=0;#o=null;constructor(e,t,n={}){this.#e=e;let r=t.ownerDocument;this.#t=r,this.#n=new X(r,t,{className:`zine-search`,label:`Search results`,width:Bt,onDismiss:n.onDismiss,rtl:e.getDirection()===`rtl`,overlay:!0,pageBox:()=>e.getPageBox()}),this.root=this.#n.root,this.#r=r.createElement(`input`),this.#r.type=`search`,this.#r.className=`zine-search-input`,this.#r.placeholder=`Search…`,this.#r.setAttribute(`aria-label`,`Search the document`),this.#r.addEventListener(`input`,()=>{this.#o&&clearTimeout(this.#o),this.#o=setTimeout(()=>void this.#c(),Vt)}),this.#r.addEventListener(`keydown`,e=>{e.key===`Enter`&&(this.#o&&clearTimeout(this.#o),this.#c())}),this.#i=r.createElement(`div`),this.#i.className=`zine-search-hits`,this.#n.root.append(this.#r,this.#i),this.#r.focus()}#s(e){let t=this.#t.createElement(`div`);t.className=`zine-panel-note`,t.textContent=e,this.#i.replaceChildren(t)}async#c(){let e=this.#r.value.trim(),t=++this.#a;if(e.length<Ht){this.#i.replaceChildren();return}this.#s(`Searching…`);let n=await this.#e.search(e);if(!(t!==this.#a||!this.#n.root.isConnected)){if(n.length===0){this.#s(`No matches for “${e}”`);return}this.#i.replaceChildren(...n.map(e=>{let t=this.#t.createElement(`button`);t.type=`button`,t.className=`zine-search-hit`,t.setAttribute(`role`,`option`),t.setAttribute(`aria-label`,`Page ${e.page+1}: ${e.excerpt}`);let n=this.#t.createElement(`span`);n.className=`zine-search-page`,n.textContent=`Page ${e.page+1}`;let r=this.#t.createElement(`small`);return r.textContent=e.excerpt,t.append(n,r),t.addEventListener(`click`,()=>this.#e.flipTo(e.page)),t}))}}destroy(){this.#o&&clearTimeout(this.#o),this.#o=null,this.#a++,this.#n.destroy()}}})),Gt,Kt=n((()=>{I(),Ct(),Gt=class{#e;#t;#n;#r=null;#i;#a=[];constructor(e,t,n=`auto`,r=null){this.#e=e,this.#i=r;let i=t.ownerDocument,a=e.getDirection()===`rtl`;if(this.#t=this.#o(i,a?F.next:F.prev,`Previous page`,()=>e.flipPrev()),this.#n=this.#o(i,a?F.prev:F.next,`Next page`,()=>e.flipNext()),this.#s(i,t),this.#r)Y(this.#r,n);else for(let e of[this.#t,this.#n])Y(e,n);this.#a.push(e.on(`pageChanged`,({page:e})=>this.#c(e))),this.#a.push(e.on(`flipEnd`,()=>this.#c())),this.#c()}#o(e,t,n,r){let i=e.createElement(`button`);i.type=`button`,i.className=`zine-arrow`,i.title=n,i.setAttribute(`aria-label`,n),i.appendChild(P(e,t)),i.addEventListener(`click`,r);for(let e of[`pointerdown`,`pointerup`,`click`])i.addEventListener(e,e=>e.stopPropagation());return i}#s(e,t){let n=t.closest(`.zine-panel-wrap`)??t.closest(`.zine-controls-wrap`)??t,r=n.parentNode;if(!r)return;let i=e.createElement(`div`);i.className=`zine-arrows-wrap`,this.#i&&i.classList.add(`zine-arrows-${this.#i}`),r.insertBefore(i,n),i.append(this.#t,n,this.#n),this.#r=i}#c(e){let{prev:t,next:n}=this.#l(e);for(let[e,r]of[[this.#t,t],[this.#n,n]])e.disabled=!r,e.classList.toggle(`zine-arrow-hidden`,!r)}#l(e){if(e!==void 0){let t=this.#e.getSpreads(),n=t.findIndex(t=>t.left===e||t.right===e);if(n>=0)return{prev:n>0,next:n+1<t.length}}return{prev:this.#e.canFlipPrev(),next:this.#e.canFlipNext()}}destroy(){for(let e of this.#a)e();this.#a=[],this.#t.remove(),this.#n.remove();let e=this.#r;if(e?.parentNode){for(;e.firstChild;)e.parentNode.insertBefore(e.firstChild,e);e.remove()}this.#r=null}}}));function qt(e){kt(),L({id:`thumbnails`,title:()=>e.openPanel()===`thumbnails`?`Hide thumbnails`:`Show thumbnails`,icon:F.thumbnails,isVisible:e=>e.zine.isDocument(),isActive:()=>e.openPanel()===`thumbnails`,action:t=>{e.togglePanel(`thumbnails`),t.close()}}),L({id:`outline`,title:()=>e.openPanel()===`outline`?`Hide outline`:`Show outline`,icon:F.outline,isVisible:()=>e.hasOutline(),isActive:()=>e.openPanel()===`outline`,action:t=>{e.togglePanel(`outline`),t.close()}}),L({id:`pageInput`,title:`Page`,render:()=>e.makePageInput()}),L({id:`search`,title:()=>e.openPanel()===`search`?`Hide search`:`Search`,icon:F.search,isVisible:e=>e.zine.canSearch(),isActive:()=>e.openPanel()===`search`,action:()=>e.togglePanel(`search`)})}var Jt,Yt,Xt,Zt=n((()=>{I(),B(),Mt(),Ct(),Ft(),zt(),Wt(),Kt(),Jt={thumbnails:Pt,outline:Rt,search:Ut},Yt=[`pointerdown`,`pointerup`,`pointermove`,`click`,`dblclick`,`wheel`,`keydown`],Xt=class{#e;#t;#n;#r;#i=[];#a=null;#o=[];#s=null;#c=null;#l;#u=null;#d=null;#f=null;#p=null;#m;#h;constructor(e,t,n){this.#e=e,this.#l=t;let r=t.ownerDocument;this.#t=r,bt(r),this.#m=n.colorScheme??`auto`;let i=n.position??`bottom`;this.#h=i;let a=n.docked??!0;this.#n=r.createElement(`div`),this.#n.className=[`zine-controls`,`zine-controls-${i}`,a?`zine-controls-docked`:`zine-controls-floating`,n.className].filter(Boolean).join(` `),this.#n.setAttribute(`role`,`toolbar`),this.#n.setAttribute(`aria-label`,`Flipbook controls`),Y(this.#n,this.#m),this.#r=r.createElement(`div`),this.#r.className=`zine-controls-bar`,this.#n.appendChild(this.#r),this.#n.addEventListener(`keydown`,e=>this.#O(e));for(let e of Yt)this.#n.addEventListener(e,e=>this.#_(e));this.#g(t,i,a);let o=()=>this.#k();this.#o.push(e.on(`pageChanged`,o)),this.#o.push(e.on(`zoomChanged`,o)),this.#o.push(e.on(`flipEnd`,o));let s=e=>{if(!this.#a)return;let t=e.target;this.#a.el.contains(t)||this.#a.trigger.contains(t)||this.#D()};r.addEventListener(`pointerdown`,s,!0),this.#o.push(()=>r.removeEventListener(`pointerdown`,s,!0))}#g(e,t,n){if(!n){e.appendChild(this.#n);return}let r=e.parentNode;if(!r){this.#n.classList.replace(`zine-controls-docked`,`zine-controls-floating`),e.appendChild(this.#n);return}let i=this.#t.createElement(`div`);i.className=`zine-controls-wrap zine-controls-wrap-${t}`,r.insertBefore(i,e),i.appendChild(e),t===`top`||t===`left`?i.insertBefore(this.#n,e):i.appendChild(this.#n),this.#c=i}mount(e){this.#y(e.items??z);let t=e.arrows??!0;t!==!1&&(this.#p=new Gt(this.#e,this.#l,this.#m,t===!0?null:t)),this.#k(),this.#M()}destroy(){for(let e of this.#o)e();this.#o=[],this.#D(),this.#u?.destroy(),this.#u=null,this.#d=null,this.#n.remove();let e=this.#c;e?.parentNode&&(e.parentNode.insertBefore(e.firstChild,e),e.remove()),this.#c=null,this.#p?.destroy(),this.#p=null}#_(e){e.stopPropagation()}#v(e=()=>this.#D()){return{zine:this.#e,close:e,colorScheme:this.#m}}#y(e){for(let t of e){if(t===`|`){let e=this.#t.createElement(`div`);e.className=`zine-controls-sep`,this.#r.appendChild(e);continue}let e=lt(t),n;e.render?(n=e.render(this.#v()),this.#i.push({el:n,def:e})):n=this.#S(e,`zine-controls-btn`),this.#r.appendChild(n)}}#b(e){return typeof e.title==`function`?e.title(this.#v()):e.title}#x(e){return typeof e.icon==`function`?e.icon(this.#v()):e.icon}#S(e,t,n=!1){let r=this.#t.createElement(`button`),i=this.#b(e),a=this.#x(e);if(r.type=`button`,r.className=t,r.title=i,r.setAttribute(`aria-label`,i),a&&r.appendChild(P(this.#t,a)),n||!a){let e=this.#t.createElement(`span`);e.className=`zine-controls-label`,e.textContent=i,r.appendChild(e)}return r.addEventListener(`click`,()=>this.#C(e,r)),this.#i.push({el:r,def:e}),r}#C(e,t){if(!e.isDisabled?.(this.#v())){if(e.children){this.#a?.trigger===t?this.#D():this.#w(e,t);return}e.action?.(this.#v()),this.#k()}}#w(e,t){this.#D();let n=this.#t.createElement(`div`);n.className=`zine-controls-menu`,n.setAttribute(`role`,`menu`);let r=this.#v();for(let t of e.children??[]){if(t===`|`)continue;let e=lt(t);if(e.isVisible&&!e.isVisible(r))continue;let i;e.render?(i=e.render(this.#v()),this.#i.push({el:i,def:e})):i=this.#S(e,`zine-controls-btn`,!0),i.setAttribute(`role`,`menuitem`),n.appendChild(i)}this.#T(n,t),this.#k(),n.querySelector(`button`)?.focus()}#T(e,t){this.#n.appendChild(e),this.#a={el:e,trigger:t},t.setAttribute(`aria-expanded`,`true`),this.#E(e,t)}#E(e,t){let n=this.#n.getBoundingClientRect(),r=t.getBoundingClientRect(),i=e.getBoundingClientRect();if(!n.width||!i.width)return;let a=r.left-n.left+r.width/2-i.width/2;a=Math.max(4,Math.min(a,n.width-i.width-4)),e.style.left=`${a}px`;let o=r.bottom-n.top+6,s=r.top-n.top-i.height-6;e.style.top=`${this.#h===`bottom`||s>=0?s:o}px`}#D(){if(!this.#a)return;let{el:e,trigger:t}=this.#a;this.#a=null,t.removeAttribute(`aria-expanded`),this.#i=this.#i.filter(t=>!e.contains(t.el)),e.remove(),this.#t.activeElement&&e.contains(this.#t.activeElement)&&t.focus()}#O(e){if(e.key===`Escape`&&this.#a){let{trigger:t}=this.#a;this.#D(),t.focus(),e.preventDefault();return}let t=[...this.#n.querySelectorAll(`button, input`)],n=t.indexOf(this.#t.activeElement);if(n<0||this.#t.activeElement instanceof HTMLInputElement)return;let r=e.key===`ArrowRight`||e.key===`ArrowDown`?1:e.key===`ArrowLeft`||e.key===`ArrowUp`?-1:0;r!==0&&(t[(n+r+t.length)%t.length]?.focus(),e.preventDefault())}#k(){let e=this.#v();for(let{el:t,def:n}of this.#i){let r=n.children?this.#j(n,e):n.isVisible?.(e);r!==void 0&&(t.style.display=r?``:`none`);let i=n.isDisabled?.(e)??!1;for(let e of this.#A(t))e.disabled=i;if(this.#A(t).length||t.setAttribute(`aria-disabled`,String(i)),t.classList.toggle(`zine-controls-off`,i),n.isActive&&t.setAttribute(`aria-pressed`,String(n.isActive(e))),typeof n.title==`function`){let r=n.title(e);t.title=r,t.setAttribute(`aria-label`,r);let i=t.querySelector(`.zine-controls-label`);i&&(i.textContent=r)}typeof n.icon==`function`&&t.querySelector(`svg`)?.replaceWith(P(this.#t,n.icon(e)))}this.#s&&this.#t.activeElement!==this.#s&&(this.#s.value=String(this.#e.getPage()+1))}#A(e){return e instanceof HTMLButtonElement||e instanceof HTMLInputElement?[e]:[...e.querySelectorAll(`button, input`)]}#j(e,t){return e.isVisible&&!e.isVisible(t)?!1:(e.children??[]).some(e=>{if(e===`|`)return!1;let n=lt(e);return!n.isVisible||n.isVisible(t)})}makePageInput(){let e=this.#t.createElement(`div`);e.className=`zine-controls-page`;let t=this.#t.createElement(`input`);t.type=`number`,t.min=`1`,t.max=String(this.#e.getPageCount()),t.value=String(this.#e.getPage()+1),t.setAttribute(`aria-label`,`Page number`);let n=this.#t.createElement(`span`);n.textContent=`/ ${this.#e.getPageCount()}`;let r=!1,i=()=>{if(r)return;r=!0;let e=Number(t.value),n=Math.max(0,this.#e.getPageCount()-1),i=Number.isFinite(e)?Math.min(Math.max(Math.round(e)-1,0),n):this.#e.getPage();i===this.#e.getPage()?t.value=String(this.#e.getPage()+1):this.#e.flipTo(i)};return t.addEventListener(`focus`,()=>{r=!1}),t.addEventListener(`keydown`,e=>{e.key===`Enter`&&(i(),t.blur())}),t.addEventListener(`blur`,i),e.append(t,n),this.#s=t,e}openPanel(){return this.#d}hasOutline(){return this.#f===!0}#M(){this.#f!==null||!this.#e.canOutline()||(this.#f=!1,this.#e.getOutline().then(e=>{if(e.length===0)return;this.#f=!0,this.#k();let t=this.#a;if(t){let e=this.#i.find(e=>e.el===t.trigger)?.def;this.#D(),e&&this.#w(e,t.trigger)}}))}togglePanel(e){let t=this.#d;this.#u?.destroy(),this.#u=null,this.#d=null,t!==e&&(this.#u=new Jt[e](this.#e,this.#l,{onDismiss:()=>this.togglePanel(e)}),Y(this.#u.root,this.#m),this.#d=e),this.#k()}}})),Qt=r({DEFAULT_ITEMS:()=>z,ICONS:()=>F,createIcon:()=>P,defineControl:()=>L,getControl:()=>ct,mountControls:()=>$t});function $t(e,t,n={}){let r=new Xt(e,t,n);return qt(r),r.mount(n),()=>r.destroy()}var en=n((()=>{Zt(),B(),I()}));D();var tn=.25,nn=.0015,rn=6,an=250,on=24,sn=2*an,cn=1.55,ln=32,un=60,dn=2.5,fn=1.5,pn=120,mn=.85,hn=.72;function gn(e,t,n){let r=Math.max(0,t-ln),i=Math.min(e.length,t+n+ln),a=e.slice(r,i).replace(/\s+/g,` `).trim();return`${r>0?`…`:``}${a}${i<e.length?`…`:``}`}var _n=class{#e;#t;#n=new c;#r=new s(2);#i=new d;#a;#o;#s;#c;#l=1;#u;#d;#f;#p;#m;#h=!1;#g=null;#_=!1;#v;#y=``;#b;#x;#S;#C=null;#w=null;#T=[];#E=0;#D=0;#O={left:null,right:null};#k;#A;#j;#M;#N;#P=null;#F=!1;#I=1;#L=0;#R=0;#z=null;#B=!1;#V=!1;#H=null;#U=null;#W=null;#G=null;#K=null;#q=null;#J=null;#Y=0;#X=null;#Z=!1;#Q=1;#$=!1;#ee=null;#te=null;#ne=null;#re=null;#ie=null;#ae=null;#oe=-1/0;#se=null;#ce=null;#le=new Set;#ue;#de=null;#fe;#pe=null;#me=null;#he=`download`;#ge=1;#_e=0;#ve=null;#ye;debug={setFlipProgress:(e,t)=>{this.#z?.setFlipProgress(e,t)}};constructor(e,t){Sn(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=$e(t.source,{frontCover:t.frontCover,backCover:t.backCover,pages:t.pages});let n=t.direction??`ltr`;this.#a=n,this.#x=(t.deepLink??!0)&&y(),this.#S=t.disableContextMenu??!1,this.#o=t.spreadMode??`cover`,this.#s=this.#o,this.#c=t.curl??`cone`,this.#u=t.clickToFlip??`edge`,this.#d=t.clickZoneSize??64,this.#m=t.singlePageThreshold??640,this.#v=t.responsiveSpread??!0,this.#ue=t.controls??!0,this.#fe=t.loading??!0,this.#b=t.startPage,typeof this.#t.open!=`function`&&this.#Mt(),this.#k=t.flipDuration??800,this.#A=t.zoom?.enabled??!0,this.#j=t.zoom?.wheel??!0;let r=t.zoom?.doubleClick,i=r===!1?[]:[...r??[1,2,4]].sort((e,t)=>e-t);this.#M=i.length>0?i:null,this.#N=t.zoom?.max??4;let a=this.#A&&this.#M!==null,o=t.zoom?.doubleClickInFlipZone??this.#u===`half`;this.#f=this.#u!==`off`&&a&&o&&t.clickFlipDelay!==0,this.#p=this.#f?t.clickFlipDelay??an:0,this.#ye=this.#$e(t.renderer??`auto`)}get ready(){return this.#ye}getPageCount(){return this.#t.pageCount}getPage(){return this.#D}get container(){return this.#e}getPageBox(){return this.#z?.measure().book??null}getSpreads(){return this.#T}getSpreadIndex(){return this.#E}getDirection(){return this.#a}getSpreadMode(){return this.#o}isSinglePage(){return this.#h}setSpreadMode(e){e!==this.#o&&(this.#o=e,this.#_=!1,this.#gt(),this.#_t())}toggleSpreadMode(){this.setSpreadMode(this.#o===`single`?this.#s===`single`?`double`:this.#s:`single`)}getResponsiveSpread(){return this.#v}isResponsiveSingle(){return this.#_&&this.#o!==`single`}setResponsiveSpread(e){if(e!==this.#v){if(this.#v=e,e){let e=this.#z?.measure().containerWidth;if(e===void 0)return;this.#_=!1,this.#ht(e)}else{if(!this.#_)return;this.#_=!1,this.#gt()}this.#_t()}}getPageImage(e){return this.#kt(e)}canFlipNext(){return this.#E+1<this.#T.length}canFlipPrev(){return this.#E>0}getMaxZoom(){return this.#N}canSearch(){return typeof this.#t.getText==`function`}canDownload(){return typeof this.#t.getDownload==`function`}isDocument(){return typeof this.#t.getOutline==`function`||typeof this.#t.getText==`function`}canPrint(){return typeof this.#t.getDownload==`function`&&this.#e.ownerDocument?.defaultView?.navigator?.pdfViewerEnabled!==!1}async print(){let e=await this.getSourceFile(),t=this.#e.ownerDocument;if(!e||!t)return!1;let n=t.createElement(`iframe`);return n.style.cssText=`position:fixed;right:0;bottom:0;width:1px;height:1px;opacity:0;border:0;`,n.setAttribute(`aria-hidden`,`true`),n.src=e.url,new Promise(r=>{let i=!1,a=t=>{i||(i=!0,setTimeout(()=>{n.remove(),e.revoke&&URL.revokeObjectURL(e.url)},6e4),r(t))};n.addEventListener(`load`,()=>{try{let e=n.contentWindow;if(!e)return a(!1);e.focus(),e.print(),a(!0)}catch{a(!1)}}),n.addEventListener(`error`,()=>a(!1)),t.body.appendChild(n)})}canOutline(){return typeof this.#t.getOutline==`function`}getOutline(){if(!this.#ce){let e=this.#t.getOutline;this.#ce=typeof e==`function`?Promise.resolve(e.call(this.#t)).catch(()=>[]):Promise.resolve([])}return this.#ce}async getSourceFile(){let e=this.#t.getDownload;return typeof e==`function`?await e.call(this.#t)??null:null}async download(){let e=await this.getSourceFile();if(!e)return!1;let t=this.#e.ownerDocument;if(!t)return!1;let n=e.url,r=e.revoke??!1;if(!r&&this.#be(n,t))try{let e=await(await fetch(n)).blob();n=URL.createObjectURL(e),r=!0}catch{}let i=t.createElement(`a`);return i.href=n,i.download=e.filename,i.rel=`noopener`,t.body.appendChild(i),i.click(),i.remove(),r&&setTimeout(()=>URL.revokeObjectURL(n),1e4),!0}#be(e,t){let n=t.defaultView?.location?.href;if(!n)return!1;try{return new URL(e,n).origin!==new URL(n).origin}catch{return!1}}async search(e,t={}){let n=this.#t.getText,r=e.trim().toLowerCase();if(typeof n!=`function`||r===``)return[];let i=t.limit??50,a=[];for(let e=0;e<this.#t.pageCount&&a.length<i;e++){let t;try{t=await n.call(this.#t,e)}catch(t){this.#n.emit(`sourceError`,{index:e,error:t});continue}let i=t.toLowerCase().indexOf(r);i<0||a.push({page:e,excerpt:gn(t,i,r.length)})}return a}flipNext(){this.#xe(1)}flipPrev(){this.#xe(-1)}#xe(e){this.#Se(()=>this.#De(this.#E+e))}flipTo(e){let t=Q(e,0,Math.max(0,this.#t.pageCount-1));this.#Se(()=>this.#De(this.#jt(t)))}#Se(e){this.#i.state===`idle`?e():this.#J?(this.#q=null,this.#Ce(),e()):this.#q=e}#Ce(){let e=this.#J;e&&(this.#J=null,this.#H!==null&&(cancelAnimationFrame(this.#H),this.#H=null),this.#z?.setFlipProgress(e.toT,e.direction),e.onDone())}#we(){let e=this.#q;if(!e){this.#Tt();return}this.#q=null,e()}getZoom(){return this.#I}setZoom(e,t){if(!this.#z||!this.#A)return;let n=Q(e,1,this.#N),r=this.#z.measure(),i=r.screenAt?.(this.#I),a=t??(i?{x:i.x+this.#L+i.width/2,y:i.y+this.#R+i.height/2}:null)??{x:r.containerWidth/2,y:r.containerHeight/2},o=this.#I,s=n===1?0:a.x-n/o*(a.x-this.#L),c=n===1?0:a.y-n/o*(a.y-this.#R);[s,c]=this.#Ee(s,c,n,r.containerWidth,r.containerHeight),this.#I=n,this.#L=s,this.#R=c,this.#z.setViewTransform(n,s,c),o>1!=n>1&&this.#Te(),this.#xt(),this.#n.emit(`zoomChanged`,{scale:n})}resetZoom(){this.setZoom(1)}#Te(){this.#e.style.touchAction=this.#I>1?`none`:`pan-y`}#Ee(e,t,n,r,i){let a=typeof devicePixelRatio==`number`&&devicePixelRatio>0?devicePixelRatio:1,o=e=>Math.round(e*a)/a||0,s=this.#z?.measure().screenAt?.(n)??{x:0,y:0,width:r*n,height:i*n},[c,l]=vn(s.x,s.width,r),[u,d]=vn(s.y,s.height,i);return[o(Q(e,c,l)),o(Q(t,u,d))]}on(e,t){return this.#n.on(e,t)}destroy(){this.#V=!0,this.#H!==null&&cancelAnimationFrame(this.#H),this.#J=null,this.#q=null,this.#We(),this.#P?.disconnect(),this.#C?.stop(),this.#C=null,this.#w?.(),this.#x&&b(),this.#de?.(),this.#rt(),this.#se?.(),this.#ne?.(),this.#ie?.(),this.#re?.(),this.#te?.(),this.#ve!==null&&clearTimeout(this.#ve),this.#_e++,this.#z?.destroy(),this.#z=null,this.#t.destroy(),this.#n.clear()}#De(e){if(e<0||e>=this.#T.length||e===this.#E||this.#i.send(`flip`)===null)return;let t=e>this.#E?`forward`:`backward`,n=this.#Me(e);this.#n.emit(`flipStart`,{from:this.#D,to:n}),this.#Oe(e,t,n,++this.#Y)}async#Oe(e,t,n,r){let i=this.#T[e],a=i?await this.#Ot(i):{left:null,right:null};r===this.#Y&&(this.#z?.beginFlip(this.#O,a,t,{fill:this.#h,curl:this.#pt(),anchor:{y:this.#l}}),this.#ke(0,1,t,()=>this.#je(e,n,a),()=>this.#Ae(n)))}#ke(e,t,n,r,i){let a=this.#ft()*Math.abs(t-e);if(a<=0){this.#z?.setFlipProgress(t,n),r();return}let o={toT:t,direction:n,onDone:r};this.#J=o;let s=performance.now(),c=!1,l=u=>{if(this.#J!==o)return;let d=Math.min(1,(u-s)/a),f=this.#h?bn(d):yn(d);i&&!c&&f>=(this.#h?hn:mn)&&(c=!0,i()),d<1?(this.#z?.setFlipProgress(e+(t-e)*f,n),this.#H=requestAnimationFrame(l)):(this.#z?.setFlipProgress(t,n),this.#H=null,this.#J=null,r())};this.#H=requestAnimationFrame(l)}#Ae(e){this.#D!==e&&(this.#D=e,this.#dt(),this.#n.emit(`pageChanged`,{page:e}))}#je(e,t,n){let r=this.#T[e];this.#E=e,this.#O=n,r&&this.#vt(r,n),this.#At(),this.#i.send(`settle`),this.#oe=performance.now(),this.#Ae(t),this.#n.emit(`flipEnd`,{page:t}),this.#we()}#Me(e){let t=this.#T[e];if(!t)return this.#D;let n=[t.left,t.right].filter(e=>e!==null);return n.length>0?Math.min(...n):this.#D}#Ne(e,t){if(this.#Z||!this.#z)return;if(this.#We(),this.#I>1){if(this.#i.send(`panStart`)===null)return;this.#X={baseTx:this.#L,baseTy:this.#R};return}let n=this.#Be(),r=this.#Ve(e,t);this.#G=r;let i=Math.min(n.width,n.height)*tn,a=r.x>=0&&r.x<=n.width&&r.y>=0&&r.y<=n.height,o=r.x<=i||r.x>=n.width-i,s=a&&o;if(this.#i.state!==`idle`){if(!this.#J||!s){this.#W=null;return}this.#Ce()}if(!s)return;this.#l=Q(r.y/n.height,0,1);let c=r.x>n.width/2,l=this.#a===`rtl`?!c:c,u=this.#E+(l?1:-1);u<0||u>=this.#T.length||(this.#W={direction:l?`forward`:`backward`,targetIndex:u,toPage:this.#Me(u),width:n.width})}#Pe(){let e=this.#W;e&&(this.#W=null,this.#i.send(`grab`)!==null&&(this.#U={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.#D,to:e.toPage}),this.#Fe(e.targetIndex,e.direction)))}async#Fe(e,t){let n=this.#T[e],r=n?await this.#Ot(n):{left:null,right:null};this.#U?.targetIndex===e&&(this.#U.toContent=r,this.#z?.beginFlip(this.#O,r,t,{fill:this.#h,curl:this.#pt(),anchor:{y:this.#l}}),this.#z?.setFlipProgress(this.#U.t,t))}#Ie(e,t){if(this.#Z)return;if(this.#X){if(!this.#z)return;let n=this.#z.measure(),[r,i]=this.#Ee(this.#X.baseTx+e,this.#X.baseTy+t,this.#I,n.containerWidth,n.containerHeight);this.#L=r,this.#R=i,this.#z.setViewTransform(this.#I,r,i),this.#xt();return}this.#W&&Math.hypot(e,t)>rn&&this.#Pe();let n=this.#U;n&&(n.t=Q((n.direction===`forward`?-e:e)/n.width,0,1),this.#z?.setFlipProgress(n.t,n.direction))}#Le(e){if(this.#Z)return;if(this.#X){this.#X=null,this.#i.send(`panEnd`);return}let t=this.#U;if(!t){this.#W=null,this.#Re(e)||this.#ze(e);return}this.#U=null,this.#i.send(`release`);let n=e.swipe&&Math.abs(e.vx)>Math.abs(e.vy),r=t.direction===`forward`?e.vx<0:e.vx>0,i=n&&r,a=n&&!r;i||t.t>=.5&&!a?this.#ke(t.t,1,t.direction,()=>this.#je(t.targetIndex,t.toPage,t.toContent),()=>this.#Ae(t.toPage)):this.#ke(t.t,0,t.direction,()=>this.#Ge())}#Re(e){if(this.#I>1||!e.swipe||Math.abs(e.dx)<=Math.abs(e.dy))return!1;let t=this.#a===`rtl`?e.dx>0:e.dx<0,n=t?`forward`:`backward`;if(!this.#Ue(n))return!1;let r=t?1:-1;return this.#Se(()=>this.#De(this.#E+r)),!0}#ze(e){if(this.#u===`off`||this.#I>1||!this.#G||Math.abs(e.dx)>rn||Math.abs(e.dy)>rn)return;let t=this.#He(this.#G);if(!t||!this.#Ue(t))return;this.#l=Q(this.#G.y/this.#Be().height,0,1);let n=t===`forward`?1:-1,r=()=>this.#De(this.#E+n);if(this.#We(),this.#p<=0){this.#Se(r);return}this.#K=setTimeout(()=>{this.#K=null,this.#Se(r)},this.#p)}#Be(){let e=this.#z.measure();return e.content??e.book??{x:0,y:0,width:e.containerWidth,height:e.containerHeight}}#Ve(e,t){let n=this.#e.getBoundingClientRect(),r=this.#Be();return{x:e-n.left-r.x,y:t-n.top-r.y}}#He(e){if(!this.#z)return null;let t=this.#Be().width,n;if(n=this.#u===`half`?e.x>t/2?`right`:`left`:e.x<=this.#d?`left`:e.x>=t-this.#d?`right`:null,!n)return null;let r=this.#a===`rtl`?`left`:`right`;return n===r?`forward`:`backward`}#Ue(e){let t=this.#E+(e===`forward`?1:-1);return t>=0&&t<this.#T.length}#We(){this.#K!==null&&(clearTimeout(this.#K),this.#K=null)}#Ge(){let e=this.#T[this.#E];e&&this.#vt(e,this.#O),this.#i.send(`settle`),this.#n.emit(`flipEnd`,{page:this.#D}),this.#we()}#Ke(){if(this.#W=null,this.#We(),this.#U){this.#U=null,this.#i.send(`release`),this.#i.send(`settle`);let e=this.#T[this.#E];e&&this.#vt(e,this.#O)}else this.#X&&(this.#X=null,this.#i.send(`panEnd`));this.#Z=!0,this.#Q=this.#I}#qe(e,t,n){if(!this.#Z)return;let r=this.#e.getBoundingClientRect();this.setZoom(this.#Q*n,{x:e-r.left,y:t-r.top})}#Je(){this.#Z=!1}#Ye(){if(!this.#S)return;let e=e=>e.preventDefault();this.#e.addEventListener(`contextmenu`,e),this.#re=()=>this.#e.removeEventListener(`contextmenu`,e)}#Xe(){let e=e=>{if(!this.#j||!this.#A||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let t=this.#e.getBoundingClientRect(),n=Math.exp(-e.deltaY*nn);this.setZoom(this.#I*n,{x:e.clientX-t.left,y:e.clientY-t.top})};this.#e.addEventListener(`wheel`,e,{passive:!1}),this.#ne=()=>this.#e.removeEventListener(`wheel`,e)}#Ze(){let e=e=>{let t=this.#M;if(!this.#A||t===null||!this.#z)return;let n=performance.now(),r=this.#ae;if(!(r!==null&&n-r.t<=an&&Math.hypot(e.clientX-r.x,e.clientY-r.y)<=on)){this.#ae={t:n,x:e.clientX,y:e.clientY};return}this.#ae=null,this.#Qe(e.clientX,e.clientY,t)};this.#e.addEventListener(`click`,e),this.#ie=()=>this.#e.removeEventListener(`click`,e)}#Qe(e,t,n){if(this.#I<=1&&this.#u!==`off`&&!this.#f){let n=this.#Ve(e,t),r=this.#He(n);if(r!==null&&this.#Ue(r)||this.#i.state===`animating`||performance.now()-this.#oe<=sn)return}this.#We();let r=n.find(e=>e>this.#I+1e-6)??n[0]??this.#I,i=this.#e.getBoundingClientRect();this.setZoom(r,{x:e-i.left,y:t-i.top})}async#$e(e){let t=Qe(e);if(this.#t.onProgress?.(e=>this.#et(e)),typeof this.#t.open==`function`){this.#tt();try{await this.#t.open(),this.#Mt()}catch(e){throw this.#rt(),e}this.#nt(`preparing`)}this.#t.prefetch([this.#D]);let n=await t,r=await this.#it(n);this.#z=r,this.#t.onPageUpdate?.(e=>this.#bt(e)),this.#ht(r.measure().containerWidth);let i=new p({onStart:e=>this.#Ne(e.x,e.y),onMove:e=>this.#Ie(e.dx,e.dy),onEnd:e=>this.#Le(e)}),a=new g({onPinchStart:()=>this.#Ke(),onPinchMove:e=>this.#qe(e.centerX,e.centerY,e.scale),onPinchEnd:()=>this.#Je()});this.#te=m(this.#e,{pointer:i,pinch:a}),this.#Te(),this.#Xe(),this.#Ze(),this.#Ye(),this.#ot(),this.#se=this.#lt(),await this.#_t(),this.#rt(),this.#Et(),this.#At(),this.#dt(),this.#ct(),await this.#st(),this.#n.emit(`ready`)}#et(e){this.#me=e,this.#n.emit(`progress`,e),this.#pe?.update(e)}async#tt(){if(this.#fe===!1||this.#V)return;let e=this.#e;if(!(!e.ownerDocument||typeof e.appendChild!=`function`))try{let{mountLoading:t}=await Promise.resolve().then(()=>(st(),nt));if(this.#he===`done`||this.#V)return;this.#pe=t(e),this.#me&&this.#pe.update(this.#me),this.#he===`preparing`&&this.#pe.preparing()}catch{}}#nt(e){this.#he!==`done`&&(this.#he=e,this.#pe?.preparing())}#rt(){this.#he=`done`,this.#pe?.destroy(),this.#pe=null}async#it(e){try{return await e.mount(this.#e),e.onFatal?.(()=>{this.#at()}),e}catch{e.destroy();let t=await Qe(`css`);return await t.mount(this.#e),this.#B=!0,this.#n.emit(`rendererFallback`,{from:`webgl2`,to:`css`}),t}}async#at(){if(this.#B||this.#V)return;this.#B=!0,this.#z?.destroy(),this.#z=null;let e=await Qe(`css`);if(this.#V){e.destroy();return}await e.mount(this.#e),this.#z=e,this.#ht(e.measure().containerWidth),await this.#_t(),this.#n.emit(`rendererFallback`,{from:`webgl2`,to:`css`})}#ot(){if(typeof matchMedia!=`function`)return;let e=matchMedia(`(prefers-reduced-motion: reduce)`);this.#$=e.matches,e.addEventListener?.(`change`,e=>{this.#$=e.matches})}async#st(){if(this.#ue===!1||this.#V)return;let e=this.#e;if(!(!e.ownerDocument||typeof e.appendChild!=`function`))try{let{mountControls:t}=await Promise.resolve().then(()=>(en(),Qt));if(this.#V)return;let n=this.#ue===!0?{}:this.#ue;this.#de=t(this,e,n)}catch{}}#ct(){if(!this.#x||globalThis.location===void 0)return;let e=globalThis;this.#C=C(e,e=>{e!==this.#D&&this.flipTo(e)}),this.#C.push(this.#D),this.#w=this.#n.on(`pageChanged`,({page:e})=>{this.#C?.push(e)})}pageLink(e=this.#D){let t=globalThis.location?.href??``;if(!t)return``;let n=new URL(t);return n.hash=S(n.hash,Q(e,0,Math.max(0,this.#t.pageCount-1))),n.toString()}#lt(){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.#ut(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.#ee=r,()=>{e.removeEventListener(`keydown`,n),r.remove(),this.#ee=null}}#ut(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}}#dt(){this.#ee&&(this.#ee.textContent=`Page ${this.#D+1} of ${this.#t.pageCount}`)}#ft(){return this.#$?pn:this.#k*(this.#h?cn:1)}#pt(){return this.#$?`simple`:this.#c}update(){!this.#z||this.#i.state!==`idle`||(this.#ht(this.#z.measure().containerWidth),this.#_t())}#mt(){return this.#_||this.#o===`single`?`single`:this.#o}#ht(e){let t=this.#v&&a(e,this.#m);t!==this.#_&&(this.#_=t,this.#gt())}#gt(){let e=this.#mt(),t=e!==this.#g;this.#g=e,this.#h=e===`single`,this.#T=i(this.#t.pageCount,{direction:this.#a,mode:e}),this.#E=this.#jt(this.#D),t&&this.#n.emit(`spreadChanged`,{mode:e,singlePage:this.#h})}async#_t(){let e=this.#T[this.#E];!e||!this.#z||(this.#O=await this.#Ot(e),this.#vt(e,this.#O))}#vt(e,t){this.#z?.renderSpread(e,t,{fill:this.#h}),this.#yt(),this.#ge=1,this.#xt()}#yt(){let e=this.#z?.measure().book;if(!e||e.width<=0||e.height<=0)return;let t=(e.width/e.height).toFixed(4);t!==this.#y&&(this.#y=t,this.#e.style.aspectRatio=t)}#bt(e){if(this.#i.state!==`idle`){this.#le.add(e);return}let t=this.#T[this.#E];t&&(t.left===e||t.right===e)&&this.#_t()}#xt(){this.#ve!==null&&clearTimeout(this.#ve);let e=this.#Ct();if(e!==this.#ge){if(e===1){this.#_e++,this.#ge=1,this.#_t();return}this.#ve=setTimeout(()=>{this.#ve=null,this.#wt()},un)}}#St(){let e=this.#z?.measure(),t=e?.content??e?.book;if(!t||t.width<=0)return 1;let n=this.#O,r=+!!n.left+ +!!n.right;if(r===0)return 1;let i=t.width/r,a=typeof devicePixelRatio==`number`&&devicePixelRatio>0?devicePixelRatio:1,o=0;for(let e of[n.left,n.right]){if(!e||e.width<=0)continue;let t=e.width/this.#ge;o=Math.max(o,i*a/t)}return o===0?1:o}#Ct(){let e=Math.max(1,fn/(typeof devicePixelRatio==`number`&&devicePixelRatio>0?devicePixelRatio:1)),t=this.#I<=1?1:this.#I,n=this.#St()*Math.max(t,e);return n<=1.001?1:Math.min(Math.ceil(n*2)/2,dn)}async#wt(){let e=this.#T[this.#E];if(!this.#z||!e)return;let t=this.#Ct();if(t===1||t===this.#ge||this.#i.state!==`idle`)return;let n=++this.#_e,r={x:0,y:0,width:1,height:1},i=await Promise.all([e.left,e.right].map(async e=>{if(e===null)return null;try{return await this.#t.get(e,{scale:t,region:r})}catch(t){return this.#n.emit(`sourceError`,{index:e,error:t}),null}}));if(n!==this.#_e||this.#Ct()!==t||this.#i.state!==`idle`)return;let a=i[0]??null,o=i[1]??null;a===this.#O.left&&o===this.#O.right||(this.#ge=t,this.#O={left:a,right:o},this.#z.renderSpread(e,this.#O,{fill:this.#h}))}#Tt(){if(this.#le.size===0)return;let e=this.#T[this.#E],t=e!==void 0&&[e.left,e.right].some(e=>e!==null&&this.#le.has(e));this.#le.clear(),t&&this.#_t()}#Et(){typeof ResizeObserver>`u`||(this.#P=new ResizeObserver(()=>this.#Dt()),this.#P.observe(this.#e))}#Dt(){this.#F||(this.#F=!0,requestAnimationFrame(()=>{this.#F=!1,this.update()}))}async#Ot(e){let[t,n]=await Promise.all([this.#kt(e.left),this.#kt(e.right)]);return{left:t,right:n}}async#kt(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}}#At(){let{toMount:e}=this.#r.update(this.#E,this.#T.length),t=[];for(let n of e){let e=this.#T[n];e?.left!=null&&t.push(e.left),e?.right!=null&&t.push(e.right)}this.#t.prefetch(t)}#jt(e){let t=this.#T.findIndex(t=>t.left===e||t.right===e);return t===-1?0:t}#Mt(){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.#b;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.#mt();this.#h=n===`single`,this.#T=i(e,{direction:this.#a,mode:n});let r=this.#x?x(globalThis.location?.hash??``):null;this.#D=Q(r??t??0,0,e-1),this.#E=this.#jt(this.#D)}};function Q(e,t,n){return e<t?t:e>n?n:e}function vn(e,t,n){if(t<=n){let r=(n-t)/2-e;return[r,r]}return[n-(e+t),-e]}function yn(e){return e<.5?2*e*e:1-(-2*e+2)**2/2}function bn(e){return 1-(1-yn(e))**1.3}function xn(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function Sn(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 ${xn(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){if(typeof s==`object`&&s){if(typeof s.deform!=`function`)throw Error(`Zine: a curl model must have a deform() function.`)}else if(T.includes(s))throw Error(`Zine: the '${String(s)}' curl is not bundled. Import it and pass the model: import { ${String(s)} } from '@zinejs/core/curls' → curl: ${String(s)}`);else if(!w.includes(s))throw Error(`Zine: curl must be ${w.join(` or `)}, or a model imported from '@zinejs/core/curls' (${T.join(`, `)}); got ${JSON.stringify(s)}.`)}for(let e of[`deepLink`,`disableContextMenu`,`responsiveSpread`,`loading`])if(n[e]!==void 0&&typeof n[e]!=`boolean`)throw Error(`Zine: ${e} must be a boolean; got ${xn(n[e])}.`);let c=n.controls;if(c!==void 0&&typeof c!=`boolean`&&(typeof c!=`object`||!c))throw Error(`Zine: controls must be a boolean or an options object; got ${xn(c)}.`);let l=c?.position;if(l!==void 0&&![`top`,`bottom`,`left`,`right`].includes(l))throw Error(`Zine: controls.position must be 'top', 'bottom', 'left', or 'right'; got ${JSON.stringify(l)}.`);let u=c?.colorScheme;if(u!==void 0&&![`light`,`dark`,`auto`].includes(u))throw Error(`Zine: controls.colorScheme must be 'light', 'dark', or 'auto'; got ${JSON.stringify(u)}.`);let d=c?.arrows;if(d!==void 0&&typeof d!=`boolean`&&![`desktop`,`mobile`].includes(d))throw Error(`Zine: controls.arrows must be a boolean, 'desktop', or 'mobile'; got ${JSON.stringify(d)}.`);let f=n.spreadMode;if(f!==void 0&&![`double`,`single`,`cover`,`book`].includes(f))throw Error(`Zine: spreadMode must be 'double', 'single', 'cover', or 'book'; got ${JSON.stringify(f)}.`);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 p=n.pages;if(p!==void 0&&(typeof p!=`object`||!p||Array.isArray(p)))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),Cn(n.zoom),wn(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 Cn(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 wn(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 Tn=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(),D(),e.CURL_TYPES=w,e.DEFAULT_ITEMS=z,e.IMPORTABLE_CURLS=T,e.ImageSource=Tn,e.Zine=_n,e.defineControl=L,e.getControl=ct});
|
|
533
796
|
//# sourceMappingURL=index.umd.js.map
|