@prose-reader/core 1.301.0 → 1.303.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/index.umd.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
(function(S,C){typeof exports=="object"&&typeof module<"u"?C(exports,require("@prose-reader/shared"),require("rxjs"),require("rxjs/operators"),require("@prose-reader/cfi")):typeof define=="function"&&define.amd?define(["exports","@prose-reader/shared","rxjs","rxjs/operators","@prose-reader/cfi"],C):(S=typeof globalThis<"u"?globalThis:S||self,C(S.prose={},S.shared,S.rxjs,S.operators,S.cfi))})(this,(function(S,C,r,I,X){"use strict";const F=C.Report.namespace("@prose-reader/core",void 0,{color:"#98cde7"}),In=["pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"];function
|
|
1
|
+
(function(S,C){typeof exports=="object"&&typeof module<"u"?C(exports,require("@prose-reader/shared"),require("rxjs"),require("rxjs/operators"),require("@prose-reader/cfi")):typeof define=="function"&&define.amd?define(["exports","@prose-reader/shared","rxjs","rxjs/operators","@prose-reader/cfi"],C):(S=typeof globalThis<"u"?globalThis:S||self,C(S.prose={},S.shared,S.rxjs,S.operators,S.cfi))})(this,(function(S,C,r,I,X){"use strict";const F=C.Report.namespace("@prose-reader/core",void 0,{color:"#98cde7"}),In=["pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"];function _(t,e,n){const i=String(n);t.getAttribute(e)!==i&&t.setAttribute(e,i)}function ge(t,e){t.hasAttribute(e)&&t.removeAttribute(e)}function Ye(t,e,n){t[e]!==n&&(t[e]=n)}function P(t,e,n){t.getPropertyValue(e)!==n&&t.setProperty(e,n)}function V(t,e){t.getPropertyValue(e)!==""&&t.removeProperty(e)}function vn(t,e,n){if("caretPositionFromPoint"in t)return t.caretPositionFromPoint(e,n);if("caretRangeFromPoint"in t&&typeof t.caretRangeFromPoint<"u")return t.caretRangeFromPoint(e,n)}const wn=(t,e)=>{const n="createRange"in t?t:t.ownerDocument;if(!n)return;const i="body"in t?me(t.body,e):me(t,e);if(i){let o,s=0;const a=n.createRange();return Array.from(i.childNodes).some(c=>{a.selectNodeContents(c);const l=a.getClientRects(),u=Pn(l,e);if(u){o=a.cloneRange();const d=vn(n,Math.ceil(u.left),Math.ceil(u.top));return d&&"startContainer"in d&&d.startContainer===o.startContainer&&(s=d.startOffset),d&&"offsetNode"in d&&d.offsetNode===o.startContainer&&(s=d.offset),!0}return!1}),o?{node:o.startContainer,offset:s}:{node:i,offset:0}}},me=(t,e)=>{const n=t.getBoundingClientRect(),i=Xe(n,e);let o;i!=="before"&&i!=="after"&&(o=t);for(const s of t.children){const a=me(s,e);if(a)return a}return o};function Xe(t,{left:e,right:n}){return t.left<=e&&t.right<=e?"before":t.left<=e&&t.right>e&&t.right<=n?"partially-before":t.left<=n&&t.right>n?"partially-after":t.left>n?"after":"within"}function Pn(t,e){return Array.from(t).find(n=>{const i=Xe(n,e);return i!=="before"&&i!=="after"})}const Tn=(t,e)=>{if(t.nodeType!==Node.CDATA_SECTION_NODE&&t.nodeType!==Node.DOCUMENT_TYPE_NODE){const n=t.ownerDocument?.createRange();n?.selectNodeContents(t);try{e<=(n?.endOffset||0)&&n?.setStart(t,e||0)}catch(i){F.error(i)}return n}},fe=t=>{if(t?.target&&t?.target?.ownerDocument?.defaultView){const e=t?.target?.ownerDocument?.defaultView;if(e.PointerEvent&&t instanceof e.PointerEvent)return!0}if(t?.view?.window){const e=t?.view;if(e.PointerEvent&&t instanceof e.PointerEvent)return!0}return!!In.includes(t.type)},Mn=t=>{if(fe(t))return!1;if(t?.target&&t?.target?.ownerDocument?.defaultView){const e=t?.target?.ownerDocument?.defaultView;if(e.MouseEvent)return t instanceof e.MouseEvent}if(t?.view?.window){const e=t?.view;if(e.MouseEvent)return t instanceof e.MouseEvent}return!1},$n=t=>{if(t?.target&&t?.target?.ownerDocument?.defaultView){const e=t?.target?.ownerDocument?.defaultView;if(e.TouchEvent)return t instanceof e.TouchEvent}if(t?.view?.window){const e=t?.view;if(e.TouchEvent)return t instanceof e.TouchEvent}return!1},Cn=()=>document.createElement("div"),Ge=t=>{const e=["img","video","audio","source","link","script"].join(",");return Array.from(t?.querySelectorAll(e)||[])},Fn=t=>{if(Ge(t).forEach(n=>{const i=n.getAttribute("src")||n.getAttribute("href");i?.startsWith("blob:")&&t?.defaultView?.URL.revokeObjectURL(i)}),t){const n=Array.from(t.styleSheets||[]);for(const i of n){const s=(()=>{try{return Array.from(i.cssRules||[])}catch(a){return F.warn(`Error getting rules for sheet: ${i.href}`,a),[]}})();for(const a of s)if(t.defaultView&&a instanceof t.defaultView.CSSFontFaceRule){const l=a.style.getPropertyValue("src").match(/blob:[^,\s'")]+/g);l&&l.forEach(u=>{t?.defaultView?.URL.revokeObjectURL(u)})}}}};function Ze(t,e,n=[]){if(typeof t!="object"||t===null)return!1;for(const i of e)if(!(i in t))return!1;for(const i of n)if(i in t&&typeof t[i]!="function")return!1;return!0}function Se(t){return Ze(t,["nodeType"],[])&&t.nodeType===Node.ELEMENT_NODE}function Je(t,e){return Se(t)&&t.tagName.toLowerCase()===e.toLowerCase()}function En(t){return Ze(t,["startContainer","endContainer","startOffset","endOffset","collapsed","commonAncestorContainer"],["setStart","setEnd","selectNodeContents"])}const ne=(t,e,n,i)=>{const o=t.createElement("style");return o.id=e,o.textContent=n,i?t.head.prepend(o):t.head.appendChild(o),()=>{ye(t,e)}},ye=(t,e)=>{if(t?.head){const n=t.getElementById(e);n&&n.remove()}},be=(t,e)=>{const n=new RegExp(`${e}\\s*=\\s*([^,\\s]+)`,"i");return t.match(n)?.[1]?.trim().toLowerCase()},Ie=(t,e)=>{const n=be(t,e);if(!n)return 0;const i=Number.parseFloat(n);return Number.isFinite(i)?i:0},Ke=(t,e,n,i)=>{t?.contentDocument?.head&&ne(t.contentDocument,e,n,i)},Ln=(t,e)=>{t?.contentDocument&&ye(t.contentDocument,e)},B=(t,e,n,i)=>{if(!t)return;const o=t?.contentDocument?.getElementById(e);if(o){o.textContent!==n&&(o.textContent=n);return}Ke(t,e,n,i)},ie=t=>{if(t?.contentDocument){const n=t.contentDocument.querySelector("meta[name='viewport']");if(n){const i=n.getAttribute("content");if(i){const o=be(i,"width"),s=be(i,"height"),a=Ie(i,"width"),c=Ie(i,"height");return a>0&&c>0?{hasViewport:!0,widthToken:o,heightToken:s,width:a,height:c}:{hasViewport:!0,widthToken:o,heightToken:s}}}}return{hasViewport:!1}},Qe=t=>t.pipe(r.switchMap(e=>e.src==="about:blank"&&e.contentDocument?.readyState==="complete"&&e.contentDocument.body?r.of(e):r.fromEvent(e,"load").pipe(r.take(1),r.map(()=>e)))),je=t=>t.pipe(r.switchMap(e=>{const n=e?.contentDocument?.fonts.ready;return n?r.from(n).pipe(r.map(()=>e)):r.of(e)})),An=t=>e=>{const n=t(e),i=new IntersectionObserver(s=>{s.forEach(a=>{a.isIntersecting?ge(a.target,"tab-index"):_(a.target,"tab-index","-1")})},{}),o=new Map;return n.hookManager.register("item.onDocumentLoad",async({itemId:s})=>{o.get(s)?.(),o.delete(s);const a=n.spineItemsManager.get(s);if(!a)return;const c=a.renderer.getDocumentFrame();if(!c)return;B(c,"prose-reader-accessibility",`
|
|
2
2
|
:focus-visible {
|
|
3
3
|
|
|
4
4
|
outline: -webkit-focus-ring-color auto 1px;
|
|
5
5
|
}
|
|
6
|
-
`);const l=c.contentDocument?.body.querySelectorAll("a");l?.forEach(d=>{i.observe(d)});const u=()=>{l?.forEach(d=>{i.unobserve(d)})};o.set(s,u)}),n.hookManager.register("item.onDocumentUnload",async({itemId:s})=>{o.get(s)?.(),o.delete(s)}),{...n}},
|
|
6
|
+
`);const l=c.contentDocument?.body.querySelectorAll("a");l?.forEach(d=>{i.observe(d)});const u=()=>{l?.forEach(d=>{i.unobserve(d)})};o.set(s,u)}),n.hookManager.register("item.onDocumentUnload",async({itemId:s})=>{o.get(s)?.(),o.delete(s)}),{...n}},Nn=t=>e=>{const n=t(e);return n.context.watch("rootElement").pipe(r.takeUntil(n.context.destroy$)).subscribe(i=>{if(!i)return;const o=()=>{n.settings.values.computedPageTurnMode==="controlled"&&i.scrollTo(0,0)};i.addEventListener("scroll",o)}),n.hookManager.register("item.onDocumentLoad",async({itemId:i})=>{const s=n.spineItemsManager.get(i)?.renderer.getDocumentFrame();s&&s.contentDocument?.body&&_(s.contentDocument.body,"tabindex","-1")}),n},ve=({position:t,frameElement:e})=>{const n=e.getBoundingClientRect(),i=n.width/e.offsetWidth,o=n.height/e.offsetHeight,{left:s=0,top:a=0}=n,c=t.clientX*i+s,l=t.clientY*o+a;return{clientX:c,clientY:l}},Rn=(t,e,n,i)=>{const o=e?.view?.frameElement;if(!e||!o)return t;const s=n.getSpineItemFromIframe(o),a=o,{height:c,width:l}=i.pageSize;if(!s||!(a instanceof HTMLIFrameElement))return t;if(fe(t)){const{clientX:u,clientY:d}=ve({position:t,frameElement:a}),p=new PointerEvent(t.type,{...t,pointerId:t.pointerId,clientX:u,clientY:d});return Object.defineProperty(p,"target",{value:e.target,enumerable:!0}),p}if(Mn(t)){const{clientX:u,clientY:d}=ve({position:t,frameElement:a}),p=new MouseEvent(t.type,{...t,clientX:u,clientY:d});return Object.defineProperty(p,"target",{value:e.target,enumerable:!0}),p}if($n(t)){const u=Array.from(t.touches).map(p=>{const{clientX:g,clientY:m}=ve({position:p,frameElement:a});return new Touch({identifier:p.identifier,target:p.target,clientX:g,clientY:m})}),d=new TouchEvent(t.type,{touches:u,changedTouches:u,targetTouches:u});return Object.defineProperty(d,"target",{value:e.target,enumerable:!0}),d}return t},Dn=[...["pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"]],On=t=>e=>{const n=t(e),i=new Map;return n.hookManager.register("item.onDocumentLoad",async({itemId:o})=>{i.get(o)?.(),i.delete(o);const s=n.spineItemsManager.get(o),a=s?.renderer.getDocumentFrame();if(!a||!s)return;const c=Dn.map(u=>{const d=p=>{let g=p;if(fe(p)&&(g=new PointerEvent(p.type,p)),g!==p){const m=Rn(g,p,n.spine.locator,n.viewport);n.context.value.rootElement?.dispatchEvent(m)}};return a.contentDocument?.addEventListener(u,d),()=>{a.contentDocument?.removeEventListener(u,d)}}),l=()=>{c.forEach(u=>{u()})};i.set(o,l)}),n.hookManager.register("item.onDocumentUnload",async({itemId:o})=>{i.get(o)?.(),i.delete(o)}),n},Vn=t=>{const e=new FileReader;return new Promise(n=>{e.addEventListener("load",()=>{n(e.result)},!1),e.readAsDataURL(t)})},et=(t,e)=>Object.entries(t).reduce((n,[i,o])=>e.includes(i)?{...n,[i]:o}:n,{}),we=t=>I.map(e=>et(e,t)),oe=t=>e=>e.pipe(we(t),I.distinctUntilChanged(C.isShallowEqual));function re(t){return new r.Observable(e=>{const n=new ResizeObserver(i=>{e.next(i)});return n.observe(t),()=>{n.disconnect()}})}const K=t=>e=>e.pipe(I.switchMap(n=>t.pipe(I.first(),I.map(()=>n)))),tt=t=>{let e;const n=t.subscribe(i=>{e={result:i}});return()=>(n.unsubscribe(),e?r.of(e.result):t)};function Pe(){return new r.Observable(t=>{if(window.requestIdleCallback){const n=window.requestIdleCallback(()=>{t.next(),t.complete()});return()=>cancelIdleCallback(n)}const e=setTimeout(()=>{t.next(),t.complete()},1);return()=>clearTimeout(e)})}function Te(t){return r.defer(()=>Pe().pipe(I.switchMap(t)))}const Me=(t,e)=>new r.Observable(n=>{const i=new MutationObserver(o=>{n.next(o)});return i.observe(t,e),()=>i.disconnect()});function kn(t,e){return new r.Observable(n=>{const i=new IntersectionObserver(o=>{n.next(o)},e);return i.observe(t),()=>{i.disconnect()}})}class nt{constructor(e,n){this.settingsManager=n;const i=C.shallowMergeIfDefined(this.getDefaultSettings(),e);this.outputSettings=this.computeOutputSettings(i),this.inputSettings=C.shallowMergeIfDefined(this.getDefaultSettings(),e),this.outputSettingsUpdateSubject=new r.Subject,this.values$=r.combineLatest([this.settingsManager.values$,this.outputSettingsUpdateSubject.pipe(I.startWith(this.outputSettings))]).pipe(I.map(([o,s])=>({...o,...s})),I.shareReplay(1)),this.values$.subscribe()}_prepareUpdate(e){const n=this.getCleanedParentInputSettings(e),i=this.settingsManager._prepareUpdate(n),o=C.shallowMergeIfDefined(this.inputSettings,e),s=this.computeOutputSettings(o),a=this.hasSettingsChanged(s);return{hasChanged:a||i.hasChanged,commit:()=>(this.inputSettings=o,this.outputSettings=s,!i.hasChanged&&a&&this.outputSettingsUpdateSubject.next(s),{...i.commit(),...s})}}update(e){const{commit:n}=this._prepareUpdate(e);n()}get values(){return{...this.settingsManager.values,...this.outputSettings}}watch(e){return Array.isArray(e)?this.values$.pipe(oe(e)):this.values$.pipe(I.map(n=>n[e]),I.distinctUntilChanged(C.isShallowEqual))}destroy(){this.outputSettingsUpdateSubject.complete()}}let Un=class extends nt{computeOutputSettings(e){return e}hasSettingsChanged(e){return!C.isShallowEqual(this.outputSettings,e)}getCleanedParentInputSettings(e){const{fontJustification:n,fontScale:i,fontWeight:o,lineHeight:s,...a}=e;return a}getDefaultSettings(){return{fontScale:1,fontWeight:"publisher",lineHeight:"publisher",fontJustification:"publisher"}}};const _n=t=>e=>{const{fontScale:n,lineHeight:i,fontWeight:o,fontJustification:s}=e,a=new r.Subject,c=t(e),l=new Un({fontScale:n,lineHeight:i,fontWeight:o,fontJustification:s},c.settings),u=()=>`
|
|
7
7
|
|
|
8
8
|
body {
|
|
9
9
|
${l.values.fontScale!==1?`font-size: ${l.values.fontScale}em !important;`:""}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
${l.values.fontWeight!=="publisher"?`font-weight: ${l.values.fontWeight} !important;`:""}
|
|
12
12
|
${l.values.fontJustification!=="publisher"?`text-align: ${l.values.fontJustification} !important;`:""}
|
|
13
13
|
}
|
|
14
|
-
`,d=g=>{c.spineItemsManager.items.forEach(m=>{if(m.renditionLayout!=="pre-paginated"){const h=m.renderer.getDocumentFrame();h&&
|
|
14
|
+
`,d=g=>{c.spineItemsManager.items.forEach(m=>{if(m.renditionLayout!=="pre-paginated"){const h=m.renderer.getDocumentFrame();h&&B(h,"prose-reader-fonts",u())}}),g&&c.layout()};c.hookManager.register("item.onDocumentLoad",async({itemId:g})=>{const m=c.spineItemsManager.get(g);if(m?.renditionLayout!=="pre-paginated"){const h=m?.renderer.getDocumentFrame();h&&B(h,"prose-reader-fonts",u())}});const p=g=>g.pipe(I.pairwise(),r.map(([m,h])=>h.fontScale!==m.fontScale||h.lineHeight!==m.lineHeight));return l.values$.pipe(p,I.tap(d),r.takeUntil(c.$.destroy$)).subscribe(),{...c,destroy:()=>{a.complete(),l.destroy(),c.destroy()},settings:l}},Wn=t=>e=>{const n=t(e),i=o=>r.fromEvent(o,"keyup").pipe(r.map(s=>{const{pageTurnDirection:a,computedPageTurnMode:c}=n.settings.values;if(c==="scrollable")return s;if(a==="horizontal"){if(s.key==="ArrowRight")return n.navigation.turnRight();if(s.key==="ArrowLeft")return n.navigation.turnLeft()}if(a==="vertical"){if(s.key==="ArrowDown")return n.navigation.turnRight();if(s.key==="ArrowUp")return n.navigation.turnLeft()}return s}));return i(document).pipe(r.takeUntil(n.$.destroy$)).subscribe(),n.spineItemsManager.items$.pipe(r.switchMap(o=>r.merge(...o.map(s=>s.watch("isLoaded").pipe(r.switchMap(()=>{const a=s.renderer.getDocumentFrame();return a instanceof HTMLIFrameElement&&a?.contentDocument?i(a.contentDocument):r.EMPTY}))))),r.takeUntil(n.$.destroy$)).subscribe(),n},zn=t=>t.spine.spineItemsManager.items$.pipe(r.switchMap(e=>r.merge(...e.map(n=>n.watch("isLoaded").pipe(r.switchMap(()=>{const i=n.renderer.getDocumentFrame();if(!i||!i?.contentDocument)return r.NEVER;const s=Array.from(i.contentDocument.querySelectorAll("a")).map(a=>r.fromEvent(a,"click"));return r.merge(...s)}))))),r.tap(e=>{e.preventDefault()}),r.share());class W extends r.Observable{constructor(e){super(n=>this.stateSubject.pipe(r.takeUntil(this._destroy$)).subscribe(n)),this._destroy$=new r.Subject,this.destroy$=this._destroy$.asObservable(),this.stateSubject=new r.BehaviorSubject(e),this.state$=this.stateSubject.asObservable()}next(e){this.stateSubject.next(e)}mergeCompare(e){const n={...this.value,...e};C.isShallowEqual(this.value,n)||this.stateSubject.next(n)}watch(e){return Array.isArray(e)?this.stateSubject.pipe(oe(e)):this.stateSubject.pipe(r.map(n=>n[e]),r.distinctUntilChanged(C.isShallowEqual))}get value(){return this.stateSubject.value}destroy(){this.stateSubject.complete(),this._destroy$.complete()}}const he=class he extends W{constructor(e){super({state:"idle",error:void 0,documentContainer:void 0}),this.triggerSubject=new r.Subject,this.context=e.context,this.settings=e.settings,this.hookManager=e.hookManager,this.item=e.item,this.containerElement=e.containerElement,this.resourcesHandler=e.resourcesHandler,this.viewport=e.viewport;const n=this.triggerSubject.pipe(r.filter(o=>o.type==="unload")),i=this.triggerSubject.pipe(r.filter(o=>o.type==="load"));this.loaded$=i.pipe(r.mergeMap(()=>this.value.state==="loaded"||this.value.state==="loading"?r.EMPTY:(this.mergeCompare({state:"loading",error:void 0}),this.onCreateDocument().pipe(r.first()).pipe(r.mergeMap(a=>(this.hookManager.execute("item.onDocumentCreated",{itemId:this.item.id,documentContainer:a}),this.onLoadDocument().pipe(r.endWith(null),r.first()).pipe(K(this.context.bridgeEvent.viewportFree$),r.switchMap(()=>this.hookManager.fromExecuteAsync("item.onDocumentLoad",this.item.id,{itemId:this.item.id,documentContainer:a}))))),r.map(()=>{this.mergeCompare({state:"loaded",error:void 0})}),r.takeUntil(n)))),r.share()),this.unloaded$=n.pipe(r.mergeMap(()=>this.value.state==="unloading"||this.value.state==="idle"?r.EMPTY:(this.mergeCompare({state:"unloading",error:void 0}),this.context.bridgeEvent.viewportFree$.pipe(r.first(),r.switchMap(()=>{const s=this.value.documentContainer,a=s?this.hookManager.executeAsync("item.onDocumentUnload",this.item.id,{itemId:this.item.id,documentContainer:s}).then(()=>null):Promise.resolve(null);return r.from(a).pipe(r.switchMap(()=>this.onUnload()),r.endWith(null),r.first(),r.catchError(c=>(F.error("Error unloading document",c),r.of(null))))}),r.map(()=>{this.mergeCompare({state:"idle",error:void 0})}),r.takeUntil(i)))),r.share()),r.merge(this.loaded$,this.unloaded$).pipe(r.catchError(o=>(this.mergeCompare({state:"error",error:o}),r.EMPTY)),r.takeUntil(this.destroy$)).subscribe()}setDocumentContainer(e){e.classList.add(he.DOCUMENT_CONTAINER_CLASS_NAME),this.mergeCompare({documentContainer:e})}attach(){this.documentContainer&&this.containerElement.appendChild(this.documentContainer)}detach(){this.documentContainer?.remove(),this.mergeCompare({documentContainer:void 0})}get isLoaded$(){return this.state$.pipe(r.map(e=>e.state==="loaded"))}load(){this.triggerSubject.next({type:"load"})}unload(){this.triggerSubject.next({type:"unload"})}renderHeadless(){const e=new r.Subject;return r.defer(()=>this.onRenderHeadless({release:e})).pipe(r.endWith(void 0),r.first(),r.map(n=>{if(n)return{doc:n,release:()=>{e.next(void 0)}}}),r.finalize(()=>{e.complete()}),r.catchError(n=>(F.error(n),r.of(void 0))))}layout(e){return this.onLayout(e)}destroy(){this.unload(),this.stateSubject.complete(),super.destroy()}get documentContainer(){return this.value.documentContainer}get writingMode(){}get readingDirection(){}get renditionLayout(){const e=this.item.renditionLayout;if(e)return e;const n=this.getDocumentFrame();if(n){const{hasViewport:i}=ie(n);if(i)return"pre-paginated"}return this.context.manifest?.renditionLayout??"reflowable"}};he.DOCUMENT_CONTAINER_CLASS_NAME="prose-reader-document-container";let Q=he;const Bn=t=>new URL(t.href);class se{constructor(e,n){this.item=e,this.settings=n}async getResource(){return await r.lastValueFrom(this.settings.values.getResource?.(this.item)??r.of(void 0))??Bn(this.item)}async fetchResource(){const e=await this.getResource();return e instanceof Response?e:e instanceof URL?fetch(e):e}}const it=(t,e)=>{const n=t.startsWith("file://"),i=n?t.replace("file://","http://"):t,o=new URL(e,i).toString();return n?o.replace("http://","file://"):o},Hn=async(t,e,n,i,o)=>{if(!t||!t.defaultView)return;const s=e.sheet;if(s)try{const a=Array.from(s.cssRules||[]);for(let c=0;c<a.length;c++){const l=a[c];if(t.defaultView&&l instanceof t.defaultView.CSSFontFaceRule){const u=l.style.getPropertyValue("src");if(u.match(/url\(['"]?([^'"]+)['"]?\)/g)){const p=u.split(",").map(h=>h.trim()),g=await Promise.all(p.map(async h=>{if(h.startsWith("local("))return h;const f=h.match(/url\(['"]?([^'"]+)['"]?\)/);if(!f)return h;const y=f[1]??"",b=i.manifest?.items.find(({href:T})=>`${it(n,y).toLowerCase()}`.endsWith(`${T.toLowerCase()}`));if(b){const T=new se(b,o);try{const M=await T.getResource();if(M instanceof Response){const w=await M.blob(),$=t.defaultView?.URL.createObjectURL(w);return h.replace(f[0],`url("${$}")`)}}catch(M){console.error("Error loading font:",M)}}return h})),m=l.cssText.replace(/src:\s*[^;]+;/,`src: ${g.join(", ")};`);s.deleteRule(c),s.insertRule(m,c)}}}}catch(a){console.error("Could not access stylesheet rules:",a)}},xn=(t,e,n,i,o)=>{const s=e.getAttribute("src")||e.getAttribute("href");if(!s)return r.of(null);const a=i.manifest?.items.find(({href:l})=>`${it(n,s).toLowerCase()}`.endsWith(`${l.toLowerCase()}`));if(!a)return r.of(null);const c=new se(a,o);return r.from(c.getResource()).pipe(r.mergeMap(l=>l instanceof Response?r.from(l.blob()):r.of(void 0)),r.mergeMap(l=>{if(!l)return r.of(null);const u=t?.defaultView?.URL.createObjectURL(l)??"";if(e.hasAttribute("src"))e.setAttribute("src",u);else if(e.hasAttribute("href")&&(e.setAttribute("href",u),t?.defaultView&&e instanceof t.defaultView.HTMLLinkElement))return new r.Observable(d=>{e.onload=async()=>{try{e.sheet&&await Hn(t,e,n,i,o),d.next(),d.complete()}catch(p){d.error(p)}},e.onerror=d.error});return r.of(null)}))},qn=({settings:t,item:e,context:n})=>i=>i.pipe(r.switchMap(o=>{const s=Ge(o.contentDocument),a=C.getParentPath(e.href),c=s.map(l=>xn(o.contentDocument,l,a,n,t));return c.length===0?r.of(o):r.combineLatest(c).pipe(r.map(()=>o))})),Yn=t=>{Fn(t?.contentDocument)},Xn=async(t,e)=>{if(typeof t=="string")return new Blob([t],{type:"text/html"});const n=C.parseContentType(t.headers.get("Content-Type")||"")||C.detectMimeTypeFromName(e.href);if(["image/jpg","image/jpeg","image/png","image/webp"].some(i=>i===n)){const i=await t.blob(),o=URL.createObjectURL(i),s=await createImageBitmap(i),{width:a,height:c}={width:s.width,height:s.height};return s.close(),new Blob([`
|
|
15
15
|
<html>
|
|
16
16
|
<head>
|
|
17
17
|
${e.renditionLayout==="pre-paginated"?`<meta name="viewport" content="width=${a}, height=${c}">`:""}
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
background-color: transparent;
|
|
49
49
|
border: 0px none transparent;
|
|
50
50
|
padding: 0px;
|
|
51
|
-
`,t.setAttribute("role","main"),t},Qn="body{margin:0}html,body{height:100%;width:100%}html[data-prose-reader-html-renderer-has-viewport-dimensions=false] body{display:flex}html[data-prose-reader-html-renderer-has-viewport-dimensions=false][data-prose-reader-html-renderer-spread-position=left] body{justify-content:flex-end}html[data-prose-reader-html-renderer-has-viewport-dimensions=false][data-prose-reader-html-renderer-spread-position=right] body{justify-content:flex-start}html[data-prose-reader-html-renderer-has-viewport-dimensions=false][data-prose-reader-html-renderer-spread-position=none] body{justify-content:center}:not(html.prose-reader-html-renderer-touch-enabled),:not(html.prose-reader-html-renderer-touch-enabled) body{touch-action:none}img{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;display:flex}html[data-prose-reader-html-renderer-has-viewport-dimensions=false] img{max-width:100%;height:100%;object-fit:contain}",ot=({pageHeight:t,pageWidth:e,frameElement:n})=>{const i=ie(n);let o=i.width,s=i.height;!o&&i.widthToken==="device-width"&&(o=e),!s&&i.heightToken==="device-height"&&(s=t),!s&&(o||i.widthToken==="device-width")&&(s=t),!o&&(s||i.heightToken==="device-height")&&(o=e);const a=i.hasViewport&&o&&s?{...i,width:o,height:s}:i;if(n?.contentDocument&&n.contentWindow&&a){const c=e/(a.width??1);return{computedScale:Math.min(c,t/(a.height??1)),computedWidthScale:c,viewportDimensions:a}}},rt=new WeakMap,
|
|
51
|
+
`,t.setAttribute("role","main"),t},Qn="body{margin:0}html,body{height:100%;width:100%}html[data-prose-reader-html-renderer-has-viewport-dimensions=false] body{display:flex}html[data-prose-reader-html-renderer-has-viewport-dimensions=false][data-prose-reader-html-renderer-spread-position=left] body{justify-content:flex-end}html[data-prose-reader-html-renderer-has-viewport-dimensions=false][data-prose-reader-html-renderer-spread-position=right] body{justify-content:flex-start}html[data-prose-reader-html-renderer-has-viewport-dimensions=false][data-prose-reader-html-renderer-spread-position=none] body{justify-content:center}:not(html.prose-reader-html-renderer-touch-enabled),:not(html.prose-reader-html-renderer-touch-enabled) body{touch-action:none}img{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;display:flex}html[data-prose-reader-html-renderer-has-viewport-dimensions=false] img{max-width:100%;height:100%;object-fit:contain}",ot=({pageHeight:t,pageWidth:e,frameElement:n})=>{const i=ie(n);let o=i.width,s=i.height;!o&&i.widthToken==="device-width"&&(o=e),!s&&i.heightToken==="device-height"&&(s=t),!s&&(o||i.widthToken==="device-width")&&(s=t),!o&&(s||i.heightToken==="device-height")&&(o=e);const a=i.hasViewport&&o&&s?{...i,width:o,height:s}:i;if(n?.contentDocument&&n.contentWindow&&a){const c=e/(a.width??1);return{computedScale:Math.min(c,t/(a.height??1)),computedWidthScale:c,viewportDimensions:a}}},rt=new WeakMap,k=(t,e,n)=>{t.style.getPropertyValue(e)!==n&&t.style.setProperty(e,n)},G=(t,e)=>{t.style.getPropertyValue(e)!==""&&t.style.removeProperty(e)},st=(t,e)=>{const n=`${e.width}px`,i=`${e.height}px`;t.style.width!==n&&(t.style.width=n),t.style.height!==i&&(t.style.height=i)},jn=(t,e,n)=>{const i=t.contentDocument?.documentElement;i&&i.getAttribute(e)!==n&&i.setAttribute(e,n)},ei=({hasViewportDimensions:t,viewportWidth:e,viewportHeight:n,computedScale:i,spreadPosition:o,blankPagePosition:s,isRTL:a,pageWidth:c,pageHeight:l})=>[t?"1":"0",e??"",n??"",i,o,s,a?"1":"0",c,l].join("|"),ti=({frameElement:t,viewportDimensions:e,computedScale:n,spreadPosition:i,blankPagePosition:o,isRTL:s,pageWidth:a})=>{if(e){k(t,"position","absolute"),k(t,"top","50%"),o==="before"?i==="left"?(k(t,"left",s?"0":"50%"),G(t,"right")):i==="right"?(k(t,"right",s?"50%":"0"),G(t,"left")):(k(t,"left",s?"25%":"75%"),G(t,"right")):i==="left"?(k(t,"right","0"),G(t,"left")):i==="right"?(k(t,"left","0"),G(t,"right")):(k(t,"left",o==="after"?s?"75%":"25%":"50%"),G(t,"right"));const c=i!=="none"?"0":"-50%",l=o==="before"?i==="left"?"left":i==="right"?"right":"center":i==="right"?"left":i==="left"?"right":"center";k(t,"transform",`translate(${c}, -50%) scale(${n})`),k(t,"transform-origin",`${l} center`);return}o==="before"?s?k(t,"margin-right",`${a}px`):k(t,"margin-left",`${a}px`):(G(t,"margin-left"),G(t,"margin-right"))},ni=({minPageSpread:t,blankPagePosition:e,spreadPosition:n,pageHeight:i,pageWidth:o,frameElement:s,isRTL:a})=>{const c=t*o;if(s?.contentDocument&&s?.contentWindow){const{viewportDimensions:l,computedScale:u=1}=ot({frameElement:s,pageHeight:i,pageWidth:o})??{},d=!!l,p=o,g=i,m=ei({hasViewportDimensions:d,viewportWidth:l?.width,viewportHeight:l?.height,computedScale:u,spreadPosition:n,blankPagePosition:e,isRTL:a,pageWidth:o,pageHeight:i});return rt.get(s)===m?{width:c,height:g}:(rt.set(s,m),jn(s,"data-prose-reader-html-renderer-has-viewport-dimensions",d.toString()),l?st(s,{width:l.width??1,height:l.height??1}):st(s,{width:p,height:g}),ti({frameElement:s,viewportDimensions:l,computedScale:u,spreadPosition:n,blankPagePosition:e,isRTL:a,pageWidth:o}),{width:c,height:g})}return{width:c,height:i}},ii=()=>`
|
|
52
52
|
body {
|
|
53
53
|
margin: 0;
|
|
54
54
|
}
|
|
@@ -151,18 +151,18 @@
|
|
|
151
151
|
td {
|
|
152
152
|
max-width: ${n}px;
|
|
153
153
|
}
|
|
154
|
-
`,si=({isUsingVerticalWriting:t,minimumWidth:e,pageHeight:n,pageWidth:i})=>{let a=i-0;const c=n-0;let l=i-0;return t&&(l=e-0,a=c),{columnHeight:c,columnWidth:a,width:l}},ae=(t,e)=>{P(t.style,"width",`${e.width}px`),P(t.style,"height",`${e.height}px`)},ai=({pageHeight:t,pageWidth:e,frameElement:n,manifest:i,renditionFlow:o,minPageSpread:s,isRTL:a,blankPagePosition:c,isImageType:l,enableTouch:u,isUsingVerticalWriting:d})=>{const p=s*e,g=i?.renditionLayout==="reflowable"&&o==="scrolled-continuous",m=g?Math.min(400,t):t;P(n.style,"width",`${e}px`),g?V(n.style,"height"):P(n.style,"height",`${m}px`);const{viewportDimensions:h,computedScale:f=1}=ot({frameElement:n,pageHeight:m,pageWidth:e})??{},y=i?.renditionLayout==="pre-paginated";if(n?.contentDocument&&n?.contentWindow&&n.contentDocument.body){let b=e,
|
|
154
|
+
`,si=({isUsingVerticalWriting:t,minimumWidth:e,pageHeight:n,pageWidth:i})=>{let a=i-0;const c=n-0;let l=i-0;return t&&(l=e-0,a=c),{columnHeight:c,columnWidth:a,width:l}},ae=(t,e)=>{P(t.style,"width",`${e.width}px`),P(t.style,"height",`${e.height}px`)},ai=({pageHeight:t,pageWidth:e,frameElement:n,manifest:i,renditionFlow:o,minPageSpread:s,isRTL:a,blankPagePosition:c,isImageType:l,enableTouch:u,isUsingVerticalWriting:d})=>{const p=s*e,g=i?.renditionLayout==="reflowable"&&o==="scrolled-continuous",m=g?Math.min(400,t):t;P(n.style,"width",`${e}px`),g?V(n.style,"height"):P(n.style,"height",`${m}px`);const{viewportDimensions:h,computedScale:f=1}=ot({frameElement:n,pageHeight:m,pageWidth:e})??{},y=i?.renditionLayout==="pre-paginated";if(n?.contentDocument&&n?.contentWindow&&n.contentDocument.body){let b=e,T=m;if(h?.hasViewport)B(n,"prose-reader-html-renderer-framce-css",ii()),ae(n,{width:h.width??1,height:h.height??1}),P(n.style,"position","absolute"),P(n.style,"top","50%"),P(n.style,"left",c==="before"?a?"25%":"75%":c==="after"?a?"75%":"25%":"50%"),P(n.style,"transform",`translate(-50%, -50%) scale(${f})`),P(n.style,"transform-origin","center center");else{const w=l?oi({isScrollable:o==="scrolled-continuous",enableTouch:u}):ri(si({isUsingVerticalWriting:d,minimumWidth:p,pageHeight:m,pageWidth:e}));if(B(n,"prose-reader-css",w,!0),d)T=Math.ceil(n.contentDocument.documentElement.scrollHeight/m)*m,ae(n,{width:p,height:T});else if(o==="scrolled-continuous")T=n.contentDocument.body.scrollHeight,ae(n,{width:p,height:T});else{const $=Math.ceil(n.contentDocument.documentElement.scrollWidth/e);y?b=e:b=$*e,ae(n,{width:b,height:T})}}return b%p===0?P(n.style,"margin-left","0px"):(b=b+e,a&&!d&&P(n.style,"margin-left",`${e}px`)),{width:b,height:T}}};class ci extends Q{constructor(){super(...arguments),this.isPrePaginated=()=>this.item.renditionLayout==="pre-paginated"||!this.item.renditionLayout&&this.context.manifest?.renditionLayout==="pre-paginated",this.isImageType=()=>!!(this.item.mediaType??C.detectMimeTypeFromName(this.item.href))?.startsWith("image/")}onCreateDocument(){const e=Kn();return this.setDocumentContainer(e),r.of(e)}onLoadDocument(){const e=this.getFrameElement();if(!e)throw new Error("invalid frame");return r.of(e).pipe(Jn({item:this.item,resourcesHandler:this.resourcesHandler,settings:this.settings}),K(this.context.bridgeEvent.viewportFree$),r.tap(n=>{this.prepareFrameForAttach(n),this.attach()}),Qe,r.tap(n=>{this.isPrePaginated()?B(n,"prose-reader-css",Qn):this.isImageType()}),qn({context:this.context,item:this.item,settings:this.settings}),je,r.tap(n=>{this.revealFrameAfterReady(n)}))}onUnload(){const e=this.getFrameElement();return Yn(e),$e(e),this.detach(),r.EMPTY}onLayout({minPageSpread:e,blankPagePosition:n,spreadPosition:i}){const{width:o,height:s}=this.viewport.pageSize,a=this.getFrameElement();if(!a)return r.of(void 0);const c=this.settings.values.computedPageTurnMode==="scrollable";if(a.contentDocument?.documentElement&&(_(a.contentDocument.documentElement,"data-prose-reader-html-renderer-spread-position",i),c?a.contentDocument?.documentElement.classList.add("prose-reader-html-renderer-touch-enabled"):a.contentDocument?.documentElement.classList.remove("prose-reader-html-renderer-touch-enabled")),this.isPrePaginated()){const p=ni({blankPagePosition:n,frameElement:a,isRTL:this.context.isRTL(),minPageSpread:e,pageHeight:s,pageWidth:o,spreadPosition:i});return r.of(p)}const l=!!this.writingMode?.startsWith("vertical"),u=this.isImageType(),d=ai({pageHeight:s,pageWidth:o,frameElement:a,manifest:this.context.manifest,renditionFlow:this.item.renditionFlow??this.context.manifest?.renditionFlow,blankPagePosition:n,isUsingVerticalWriting:l,isRTL:this.context.isRTL(),minPageSpread:e,isImageType:u,enableTouch:this.settings.values.computedPageTurnMode==="scrollable"});return r.of(d)}onRenderHeadless(){return r.from(this.resourcesHandler.fetchResource()).pipe(r.switchMap(e=>{if(e instanceof Response){const n=e.headers.get("content-type")??"";if(["application/xhtml+xml","application/xml","text/html","text/xml"].includes(n))return r.from(e.text()).pipe(r.map(o=>new DOMParser().parseFromString(o,n)))}return r.of(void 0)}))}getFrameElement(){const e=this.documentContainer;if(e instanceof HTMLIFrameElement)return e}prepareFrameForAttach(e){e.style.setProperty("visibility","hidden"),e.style.setProperty("pointer-events","none"),e.style.setProperty("contain","layout paint size"),e.style.setProperty("display","block")}revealFrameAfterReady(e){e.style.removeProperty("visibility"),e.style.removeProperty("pointer-events"),e.style.removeProperty("contain")}getComputedStyleAfterLoad(){const e=this.getFrameElement(),n=e?.contentDocument?.body;if(n)return e?.contentWindow?.getComputedStyle(n)}get writingMode(){if(!this.isImageType())return this.getComputedStyleAfterLoad()?.writingMode}get readingDirection(){if(this.writingMode==="vertical-rl")return"rtl";switch(this.getComputedStyleAfterLoad()?.direction){case"ltr":case"inherit":case"initial":return"ltr";case"rtl":return"rtl";default:return}}getDocumentFrame(){return this.getFrameElement()}}const at=t=>e=>{const n=t({...e,getRenderer(o){return e.getRenderer?.(o)??(a=>new ci(a))}}),i=zn(n);return i.pipe(r.takeUntil(n.$.destroy$)).subscribe(),{...n,links$:i}};function z(t){return t!=null}class ce{constructor(e){this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.width=e.width,this.height=e.height,this.x=e.x,this.y=e.y}}class E{constructor(e){this.__symbol=Symbol("SpineItemPosition"),this.x=e.x,this.y=e.y}}class le{constructor(e){this.__symbol=Symbol("SpineItemPagePosition"),this.x=e.x,this.y=e.y}}class ct extends ce{constructor(){super(...arguments),this.__symbol="SpineItemPageLayout"}}class ue extends ce{constructor(){super(...arguments),this.__symbol="SpineItemSpineLayout"}}class lt extends ce{constructor(){super(...arguments),this.__symbol="SpineItemPageSpineLayout"}}class Ce{constructor(e){this.x=e.x,this.y=e.y}}class N extends Ce{constructor(){super(...arguments),this.__symbol="SpinePosition"}static from(e){return new N(e)}}class A extends Ce{constructor(){super(...arguments),this.__symbol="UnboundSpinePosition"}static from(e){return new A(e)}}const li=(t,e)=>{const n=e.getBoundingClientRect(),{x:i,y:o}=t,{left:s,top:a}=n,c=n.width/e.offsetWidth,l=n.height/e.offsetHeight,u=i-s,d=o-a;return{x:u/c,y:d/l}},ui=(t,e)=>new A(li(t,e)),di=t=>({getSpinePositionFromClientPosition:e=>t.spine.element?ui(e,t.spine.element):void 0}),pi=t=>{let e;const n=t.context.watch("rootElement").pipe(I.switchMap(l=>l?new r.Observable(()=>(e=l.ownerDocument.createElement("div"),e.style.cssText=`
|
|
155
155
|
position: absolute;
|
|
156
156
|
left: 0;
|
|
157
157
|
top: 0;
|
|
158
158
|
width: 100%;
|
|
159
159
|
height: 100%;
|
|
160
160
|
visibility: hidden;
|
|
161
|
-
`,l.appendChild(e),()=>{e?.remove(),e=void 0})):r.NEVER)),i=l=>r.scheduled(l,r.animationFrameScheduler).pipe(I.tap(()=>{e&&P(e.style,"visibility","hidden")})),o=t.context.bridgeEvent.viewportBusy$.pipe(I.tap(()=>{e&&P(e.style,"visibility","visible")})),s=i(t.viewportFree$).pipe(I.take(1)),c=t.settings.values$.pipe(I.map(()=>t.settings.values.computedPageTurnMode),I.distinctUntilChanged()).pipe(I.switchMap(l=>l==="controlled"?o.pipe(I.switchMap(()=>s)):i(r.of(void 0))),I.takeUntil(t.$.destroy$));return r.merge(n,c)},hi="@prose-reader/core",gi=0,mi=200,
|
|
161
|
+
`,l.appendChild(e),()=>{e?.remove(),e=void 0})):r.NEVER)),i=l=>r.scheduled(l,r.animationFrameScheduler).pipe(I.tap(()=>{e&&P(e.style,"visibility","hidden")})),o=t.context.bridgeEvent.viewportBusy$.pipe(I.tap(()=>{e&&P(e.style,"visibility","visible")})),s=i(t.viewportFree$).pipe(I.take(1)),c=t.settings.values$.pipe(I.map(()=>t.settings.values.computedPageTurnMode),I.distinctUntilChanged()).pipe(I.switchMap(l=>l==="controlled"?o.pipe(I.switchMap(()=>s)):i(r.of(void 0))),I.takeUntil(t.$.destroy$));return r.merge(n,c)},hi="@prose-reader/core",gi=0,mi=200,R="prose-reader",ut=`${R}-style`,dt=`data-${R}-id`,pt=`${R}-viewport`,ht=`${R}-scroll-navigator`,gt=`${R}-spine-item`,Fe=`--${R}-absolute-viewport-width`,Ee=`--${R}-absolute-viewport-height`,Le=`${R}-enhancer-loading`,fi=`${Le}-container`,Si=`${Le}-logo`,yi=`${Le}-details`,bi=({container:t,item:e})=>{const n=t.ownerDocument.createElement("div");n.classList.add(fi);const i=n.ownerDocument.createElement("div");i.classList.add(Si),i.innerText="prose";const o=n.ownerDocument.createElement("div");return o.classList.add(yi),o.setAttribute("data-details-element","true"),o.innerText=`loading ${e.id}`,n.appendChild(i),n.appendChild(o),n},Ii=t=>t==="sepia"?"#939393":"rgb(202, 202, 202)",mt=({loadingElement:t,theme:e})=>{P(t.style,"color",Ii(e))},vi=t=>{const e=new WeakMap;t.hookManager.register("item.onBeforeContainerAttach",({element:o,item:s})=>{P(o.style,"z-index","0");const a=bi({container:o,item:s});mt({loadingElement:a,theme:t.theme.get()}),e.set(o,a),o.appendChild(a)});const n=t.spineItemsObserver.states$.pipe(I.tap(({item:o,isError:s,error:a})=>{if(!s)return;const c=e.get(o.containerElement);if(!c)return;const l=c.querySelector("[data-details-element]");l instanceof HTMLElement&&Ye(l,"innerText",a?.toString()??"Unknown error")})),i=t.theme.$.theme$.pipe(I.tap(o=>{for(const s of t.spineItemsManager.items){const a=e.get(s.containerElement);a&&mt({loadingElement:a,theme:o})}}));return r.merge(n,i)},wi=t=>{t.hookManager.register("item.onDocumentLoad",async({itemId:e})=>{const i=t.spineItemsManager.get(e)?.renderer.getDocumentFrame();i&&_(i,"scrolling","no")})},Pi=t=>{t.hookManager.register("item.onAfterLayout",({item:e,blankPagePosition:n,minimumWidth:i})=>{const o=t.spineItemsManager.get(e.id),s=o?.renderer.getDocumentFrame();if(o?.renditionLayout!=="reflowable"||!(s instanceof HTMLIFrameElement))return;const{hasViewport:a}=ie(s),{width:c}=t.viewport.pageSize,l=o?.renderer.getDocumentFrame();if(a){const u=c<i;n==="none"&&u&&l instanceof HTMLIFrameElement&&P(l.style,"left",t.context.isRTL()?"75%":"25%")}})},Ti=t=>t.spineItemsObserver.states$.pipe(r.tap(({item:e,isReady:n,isDirty:i})=>{e.containerElement.dataset.isDirty=i.toString(),e.containerElement.dataset.isReady=n.toString()}));let Mi=class extends nt{computeOutputSettings(e){return e}hasSettingsChanged(e){return!C.isShallowEqual(this.outputSettings,e)}getCleanedParentInputSettings(e){const{layoutAutoResize:n,pageHorizontalMargin:i,pageVerticalMargin:o,layoutLayerTransition:s,...a}=e;return a}getDefaultSettings(){return{layoutAutoResize:"container",pageHorizontalMargin:24,pageVerticalMargin:24,layoutLayerTransition:!0}}};const ft=({manifest:t,spreadMode:e})=>t?.renditionFlow==="scrolled-continuous"?!1:e,$i=t=>t===void 0||t==="auto"||t==="landscape"||t==="both",Ae=({manifest:t,viewport:e})=>{const n=e.width>e.height;return!!(!n&&t?.renditionSpread==="portrait"||n&&$i(t?.renditionSpread))},Ci=({manifest:t,viewport:e})=>ft({manifest:t,spreadMode:Ae({manifest:t,viewport:e})}),Fi=t=>r.combineLatest([t.viewport.watch(["width","height"]),t.context.watch("manifest")]).pipe(r.tap(([e,n])=>t.settings.update({spreadMode:Ae({manifest:n,viewport:e})}))),St=t=>e=>{const{pageHorizontalMargin:n,pageVerticalMargin:i,layoutAutoResize:o,layoutLayerTransition:s}=e,a=t(e),c=new Mi({pageHorizontalMargin:n,pageVerticalMargin:i,layoutAutoResize:o,layoutLayerTransition:s},a.settings);a.hookManager.register("onViewportOffsetAdjust",()=>{for(const f of a.spineItemsManager.items){const y=f.renderer.getDocumentFrame();if(y){y.getBoundingClientRect().left;break}}}),a.hookManager.register("item.onBeforeLayout",({item:f})=>{const y=a.spineItemsManager.get(f.id),T=!!(f.mediaType??C.detectMimeTypeFromName(f.href))?.startsWith("image/"),{pageHorizontalMargin:M=0,pageVerticalMargin:w=0}=c.values,$=a.viewport.pageSize;if(y?.renditionLayout==="reflowable"&&!T){let v=$.width-M*2;const L=$.height-w*2;let O=$.width-M*2,U=M*2;y.isUsingVerticalWriting()&&(O=$.width-M*2,v=L,U=w*2);const Y=y?.renderer.getDocumentFrame();Y&&B(Y,"prose-layout-enhancer-css",`
|
|
162
162
|
body {
|
|
163
163
|
width: ${O}px !important;
|
|
164
|
-
margin: ${w}px ${
|
|
165
|
-
column-gap: ${
|
|
164
|
+
margin: ${w}px ${M}px !important;
|
|
165
|
+
column-gap: ${U}px !important;
|
|
166
166
|
column-width: ${v}px !important;
|
|
167
167
|
height: ${L}px !important;
|
|
168
168
|
}
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
td {
|
|
177
177
|
max-width: ${v}px;
|
|
178
178
|
}
|
|
179
|
-
`)}}),Pi(a),wi(a),a.hookManager.register("item.onDocumentCreated",({documentContainer:f})=>{P(f.style,"opacity","0"),c.values.layoutLayerTransition&&P(f.style,"transition","opacity 800ms")}),a.hookManager.register("item.onBeforeLayout",({item:f})=>{const b=a.spineItemsManager.get(f.id)?.renderer.documentContainer;a.settings.values.computedPageTurnMode!=="scrollable"&&b&&U(b,"tab-index","0")});const l=a.spineItemsObserver.states$.pipe(I.filter(({isReady:f})=>f),I.tap(({item:f})=>{const y=f.renderer.documentContainer;y&&P(y.style,"opacity","1")})),u=c.values$.pipe(I.filter(({layoutAutoResize:f})=>f==="container"),I.switchMap(()=>a.context.watch("rootElement")),I.filter(W),I.switchMap(f=>re(f)),I.debounceTime(100),I.filter(W),I.tap(()=>{a?.layout()})),d=pi(a);c.watch(["pageHorizontalMargin","pageVerticalMargin"]).pipe(I.skip(1),I.tap(()=>{a.layout()}),I.takeUntil(a.$.destroy$)).subscribe();const p=a.spine.pages.pipe(I.shareReplay({refCount:!0,bufferSize:1})),g=Ti(a),m=Fi(a),h=vi(a);return r.merge(l,d,u,p,g,m,h).pipe(I.takeUntil(a.$.destroy$)).subscribe(),{...a,destroy:()=>{c.destroy(),a.destroy()},settings:c,layout$:a.spine.layout$,layoutInfo$:p,coordinates:di(a)}},Ei=t=>e=>{const n=t(e),i=new IntersectionObserver(c=>{c.forEach(l=>{const u=l.target,d=Array.from(u.contentDocument?.body.getElementsByTagName("audio")||[]);l.isIntersecting?d.forEach(p=>{p.hasAttribute("autoplay")&&p.paused&&p.readyState>=2&&p.play().catch(console.error)}):d.forEach(p=>{p.pause(),p.currentTime=0})})},{threshold:.01}),o=new IntersectionObserver(c=>{c.forEach(l=>{if(l.target.tagName==="video"){const u=l.target;l.isIntersecting?u.hasAttribute("autoplay")&&u.paused&&u.readyState>=2&&u.play().catch(console.error):(u.pause(),u.currentTime=0)}})},{threshold:.5}),s=new Map;return n.hookManager.register("item.onDocumentLoad",async({itemId:c})=>{s.get(c)?.(),s.delete(c);const l=n.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!l)return;i.observe(l);const u=l.contentDocument?.body.getElementsByTagName("video"),d=Array.from(u||[]).map(g=>(o.observe(g),()=>o.unobserve(g))),p=()=>{i.unobserve(l),d.forEach(g=>{g()})};s.set(c,p)}),n.hookManager.register("item.onDocumentUnload",async({itemId:c})=>{s.get(c)?.(),s.delete(c)}),{...n,destroy:()=>{i.disconnect(),o.disconnect(),s.clear(),n.destroy()}}},Re=t=>e=>e.pipe(r.switchMap(n=>t.pipe(r.filter(i=>i==="free"),r.first(),r.map(()=>n)))),Ne=({navigation$:t,navigationState$:e})=>t.pipe(Re(e)),yt=t=>Ne(t).pipe(r.skip(1)),bt=t=>e=>e.pipe(r.takeUntil(yt(t))),It=t=>t.navigation.navigation$.pipe(r.filter(e=>e.triggeredBy==="user"),Re(t.navigation.navigationState$),r.map(e=>{const n=e.requestedPosition,i=e.requestedVisibleArea;return n&&i?t.navigation.navigationResolver.getBoundaryForPosition(n,i):void 0}),r.filter(e=>e!==void 0),r.map(e=>({boundary:e})),r.share()),Li=(t,e)=>t.links$.pipe(r.tap(n=>{if(!Je(n.target,"a")||n.type!=="click")return;const i=new URL(n.target.href),o=`${i.origin}${i.pathname}`;t.context.manifest?.spineItems.some(a=>a.href===o)&&e.goToUrl(i)})),H=F.namespace("navigation"),Ai=({position:t,spineItem:e,pageHeight:n,pageWidth:i,spineItemLocator:o})=>{let s=new E({x:t.x-i,y:t.y});return e.isUsingVerticalWriting()&&(s=new E({x:t.x,y:t.y+n})),o.getSpineItemClosestPositionFromUnsafePosition(s,e)},vt=({position:t,navigationResolver:e,computedPageTurnDirection:n,spineItemsManager:i,spineLocator:o,viewport:s})=>{const a=n,c=o.getSpineItemFromPosition(t)||i.get(0),l=t;if(!c)return l;const u=o.getSpineItemPositionFromSpinePosition(t,c),d=Ai({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:o.spineItemLocator});return e.arePositionsDifferent(d,u)?o.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):a==="horizontal"?new A({x:t.x-s.pageSize.width,y:0}):new A({y:t.y-s.pageSize.height,x:0})},Ri=({position:t,spineItem:e,context:n,navigationResolver:i,spineItemsManager:o,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{if(l.values.computedPageTurnMode==="scrollable"&&a==="vertical")return new A({x:t.x,y:t.y-c.pageSize.height});const u=vt({position:t,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});if(e?.isUsingVerticalWriting()&&t.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&t.x!==u.x)return i.getAdjustedPositionForSpread(n.isRTL()?new A({x:u.x+c.pageSize.width,y:u.y}):new A({x:u.x-c.pageSize.width,y:u.y}));if(a==="vertical"&&t.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=vt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)},Ni=({position:t,spineItem:e,pageHeight:n,pageWidth:i,spineItemLocator:o})=>{let s=new E({x:t.x+i,y:t.y});return e.isUsingVerticalWriting()&&(s=new E({x:t.x,y:t.y-n})),o.getSpineItemClosestPositionFromUnsafePosition(s,e)},wt=({position:t,navigationResolver:e,computedPageTurnDirection:n,spineItemsManager:i,spineLocator:o,viewport:s})=>{const a=n,c=o.getSpineItemFromPosition(t)||i.get(0),l=t;if(!c)return l;const u=o.getSpineItemPositionFromSpinePosition(t,c),d=Ni({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:o.spineItemLocator});return e.arePositionsDifferent(d,u)?o.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):a==="horizontal"?new A({x:t.x+s.pageSize.width,y:0}):new A({y:t.y+s.pageSize.height,x:0})},Di=({position:t,spineItem:e,context:n,navigationResolver:i,spineItemsManager:o,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{if(l.values.computedPageTurnMode==="scrollable"&&a==="vertical")return new A({x:t.x,y:t.y+c.pageSize.height});const u=wt({position:t,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});if(e?.isUsingVerticalWriting()&&t.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&t.x!==u.x)return i.getAdjustedPositionForSpread(n.isRTL()?new A({x:u.x-c.pageSize.width,y:u.y}):new A({x:u.x+c.pageSize.width,y:u.y}));if(a==="vertical"&&t.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=wt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)};class Oi{constructor(e){this.reader=e,this.movingLastDelta={x:0,y:0},this.movingLastPosition=new R({x:0,y:0}),this.unlock=void 0}turnRight(){return this.turnRightOrBottom()}turnLeft(){return this.turnLeftOrTop()}turnTop(){return this.turnLeftOrTop()}turnBottom(){return this.turnRightOrBottom()}turnRightOrBottom(){const e=this.reader.navigation.getNavigation(),n=this.reader.spineItemsManager.get(e.spineItem);if(!n)return;const i=Di({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:n,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:i})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),n=this.reader.spineItemsManager.get(e.spineItem);if(!n)return;const i=Ri({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:n,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:i})}goToCfi(e,n={animate:!0}){return this.reader.navigation.navigate({animation:n.animate?"turn":!1,cfi:e})}goToSpineItem({indexOrId:e,...n}){const i=this.reader.spineItemsManager.get(e);if(i===void 0){H.warn("goToSpineItem",`Ignore navigation to ${e} since the item does not exist`);return}this.reader.navigation.navigate({spineItem:i.index,...n})}goToNextSpineItem(){const{endIndex:e=0}=this.reader.spine.locator.getVisibleSpineItemsFromPosition({position:this.reader.navigation.getNavigation().position,threshold:{type:"percentage",value:.5}})||{};this.goToSpineItem({indexOrId:e+1})}goToPreviousSpineItem(){const{beginIndex:e=0}=this.reader.spine.locator.getVisibleSpineItemsFromPosition({position:this.reader.navigation.getNavigation().position,threshold:{type:"percentage",value:.5}})??{};this.goToSpineItem({indexOrId:e-1})}goToUrl(e){this.reader.navigation.navigate({url:e,animation:!1})}goToRightSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="vertical"){H.warn("You cannot call this navigation method on vertical direction");return}return this.reader.context.isRTL()?this.goToPreviousSpineItem():this.goToNextSpineItem()}goToRightOrBottomSpineItem(){return this.reader.settings.values.computedPageTurnDirection==="vertical"?this.goToBottomSpineItem():this.goToRightSpineItem()}goToLeftOrTopSpineItem(){return this.reader.settings.values.computedPageTurnDirection==="vertical"?this.goToTopSpineItem():this.goToLeftSpineItem()}goToLeftSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="vertical"){H.warn("You cannot call this navigation method on vertical direction");return}return this.reader.context.isRTL()?this.goToNextSpineItem():this.goToPreviousSpineItem()}goToTopSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){H.warn("You cannot call this navigation method on horizontal direction");return}return this.goToPreviousSpineItem()}goToBottomSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){H.warn("You cannot call this navigation method on horizontal direction");return}return this.goToNextSpineItem()}goToPageOfSpineItem({pageIndex:e,spineItemId:n,...i}){const o=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:n});H.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:n,...i,position:o}),this.reader.navigation.navigate({position:o,...i})}goToAbsolutePageIndex({absolutePageIndex:e,...n}){const i=this.reader.spine.pages.fromAbsolutePageIndex(e);if(H.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...n,foundInfo:i}),i){const o=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:i.pageIndex,spineItemId:i.itemIndex});return this.reader.navigation.navigate({position:o,...n})}}}class Vi extends _{constructor(e){super({lastDelta:{x:0,y:0},lastPosition:new R({x:0,y:0}),lastStartPosition:new R({x:0,y:0}),isStarted:!1}),this.reader=e,this.unlock=void 0}start(e){this.unlock?.(),this.unlock=this.reader.navigation.lock(),this.mergeCompare({isStarted:!0,lastDelta:e,lastStartPosition:this.reader.navigation.controlledNavigationController.viewportPosition,lastPosition:this.reader.navigation.controlledNavigationController.viewportPosition})}stop(e){this.panMoveTo(e),this.mergeCompare({isStarted:!1}),this.unlock?.()}panMoveTo(e){if(this.reader.settings.values.computedPageTurnMode==="scrollable"){H.warn("pan control is not available on free page turn mode");return}if(!this.value.isStarted){H.error("Pan navigator is not started");return}const n=this.reader.settings.values.computedPageTurnDirection;let i=this.reader.navigation.getNavigation().position;if(e){const o=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,s=Math.floor(e.x)-(this.value.lastDelta?.x||0),a=Math.floor(e.y)-(this.value.lastDelta?.y||0),c=Math.floor(n==="horizontal"?this.value.lastPosition.x-s/o:0),l=Math.floor(n==="horizontal"?0:this.value.lastPosition.y-a/o);i=new R({x:c,y:l}),this.mergeCompare({lastDelta:e})}else i=this.value.lastPosition;this.mergeCompare({lastPosition:i}),this.reader.navigation.navigate({position:i,animation:!1})}}class D{constructor(){this.isDestroyed=!1,this.destroySubject=new r.Subject,this.destroy$=this.destroySubject.asObservable()}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.destroySubject.next(),this.destroySubject.complete())}}const ki=500;class Ui extends D{constructor(e,n){super(),this.scrollNavigationController=e,this.lock=n,this.navigationSubject=new r.Subject,this.navigation$=this.navigationSubject.asObservable();const i=this.scrollNavigationController.userScroll$.pipe(r.exhaustMap(o=>{const s=this.lock();return r.merge(this.scrollNavigationController.userScroll$,r.of(o)).pipe(r.debounceTime(ki,r.animationFrameScheduler),r.first(),r.tap(()=>{const a=this.scrollNavigationController.fromScrollPosition(this.scrollNavigationController.scrollPosition);this.navigationSubject.next({animation:!1,type:"scroll",position:a})}),r.finalize(()=>{s()}))}));r.merge(i).pipe(r.takeUntil(this.destroy$)).subscribe()}}const _i=t=>t.pagination.state$.pipe(r.withLatestFrom(t.context.manifest$,t.settings.values$),r.map(([e,{spineItems:n,readingDirection:i},{computedPageTurnDirection:o}])=>{const s=n.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(s-1,0),l=e.endSpineItemIndex===Math.max(s-1,0),u=e.beginSpineItemIndex===0,d=e.beginPageIndexInSpineItem===0,p=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:o==="vertical"?!1:!d,canTurnRight:o==="vertical"?!1:!p,canGoTopSpineItem:o==="vertical"&&!a,canGoBottomSpineItem:o==="vertical"&&!c,canGoLeftSpineItem:o!=="vertical"&&(i==="ltr"&&!a||i==="rtl"&&!l),canGoRightSpineItem:o!=="vertical"&&(i==="ltr"&&!c||i==="rtl"&&!u)}}),r.distinctUntilChanged(C.isShallowEqual)),Wi=({reader:t,duration:e})=>n=>{let i;const o=()=>{i?.(),i=void 0};return n.pipe(r.tap(()=>{i||(i=t?.navigation.lock())}),r.throttleTime(e,void 0,{trailing:!0,leading:!0}),r.tap(o),r.finalize(o))},zi=t=>e=>{const n=t(e),i=_i(n),o=It(n),s=new Oi(n),a=new Vi(n),c=new Ui(n.navigation.scrollNavigationController,n.navigation.lock),l=Li(n,s),u=c.navigation$.pipe(r.tap(g=>{n.navigation.navigate(g)}));return r.merge(l,u).pipe(r.takeUntil(n.$.destroy$)).subscribe(),{...n,load:g=>{const{cfi:m,...h}=g;n.load(h),m&&s.goToCfi(m,{animate:!1})},destroy:()=>{c.destroy(),n.destroy()},navigation:{...n.navigation,state$:i,outOfSpineBoundary$:o,throttleLock:({duration:g,trigger:m})=>m.pipe(Wi({duration:g,reader:n})),panNavigator:a,turnBottom:s.turnBottom.bind(s),turnTop:s.turnTop.bind(s),turnLeftOrTop:s.turnLeftOrTop.bind(s),turnRightOrBottom:s.turnRightOrBottom.bind(s),turnLeft:s.turnLeft.bind(s),turnRight:s.turnRight.bind(s),goToCfi:s.goToCfi.bind(s),goToUrl:s.goToUrl.bind(s),goToSpineItem:s.goToSpineItem.bind(s),goToNextSpineItem:s.goToNextSpineItem.bind(s),goToPreviousSpineItem:s.goToPreviousSpineItem.bind(s),goToLeftOrTopSpineItem:s.goToLeftOrTopSpineItem.bind(s),goToRightOrBottomSpineItem:s.goToRightOrBottomSpineItem.bind(s),goToTopSpineItem:s.goToTopSpineItem.bind(s),goToBottomSpineItem:s.goToBottomSpineItem.bind(s),goToLeftSpineItem:s.goToLeftSpineItem.bind(s),goToRightSpineItem:s.goToRightSpineItem.bind(s),goToPageOfSpineItem:s.goToPageOfSpineItem.bind(s),goToAbsolutePageIndex:s.goToAbsolutePageIndex.bind(s)}}},Bi=(t,e)=>{if("cfi"in e){const{itemIndex:s,...a}=t.cfi.parseCfi(e.cfi);return{...e,...a,itemIndex:s,node:null}}const n=t.spineItemsManager.get(e);if(!n)throw new Error("Spine item not found");const i=t.cfi.generateRootCfi(n.item);return{...t.cfi.parseCfi(i),cfi:i,itemIndex:n.index,node:null}},Pt=(t,e)=>{let n=t?.itemPageIndex;const{itemIndex:i,...o}=e.cfi.parseCfi(t.cfi),s=e.spineItemsManager.get(i);return s?Pe().pipe(r.withLatestFrom(s.isReady$),r.map(([,a])=>{const{node:c=null,offset:l,range:u}=a?e.cfi.resolveCfi({cfi:t.cfi}):{};s.renditionLayout!=="pre-paginated"&&c&&(n=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,l??0,s)??n);let p=t?.absolutePageIndex;return n===void 0&&(n=0),p=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:n,spineItemOrId:s})??t?.absolutePageIndex,{...t,...o,range:u,itemIndex:i,node:c,startOffset:l,absolutePageIndex:p,itemPageIndex:n}})):r.of({...t,itemIndex:i,...o})};class Tt{constructor(e){this.reader=e,this.locatorsByKey=new Map,this.deregisterMemoizedStream=n=>{const i=this.locatorsByKey.get(n);i&&(i.observerCount--,i.observerCount===0&&this.locatorsByKey.delete(n))},this.locate=(n,i)=>{const o={resource:n,meta:Bi(this.reader,n)};return Te(()=>{const s=this.reader.spineItemsManager.get(o.meta.itemIndex??0),a=s?.renditionLayout==="reflowable",c=i.mode==="shallow"||!a||!s?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([s.index]),l="cfi"in n?n.cfi:void 0,u=l?this.locatorsByKey.get(l):void 0,d=g=>g.pipe(r.finalize(()=>{l&&this.deregisterMemoizedStream(l),setTimeout(()=>{c()},1e3)}));if(l&&u)return u.observerCount++,d(u.consolidate$.pipe(r.map(({resource:g,meta:m})=>({resource:g,meta:m}))));const p=this.reader.spine.layout$.pipe(r.debounceTime(10),r.startWith(o),r.switchScan(g=>Pt(g.meta,this.reader).pipe(r.map(m=>({...g,meta:m}))),o),r.shareReplay({refCount:!0,bufferSize:1}));return l&&this.locatorsByKey.set(l,{observerCount:1,consolidate$:p}),d(p)})}}locateResource(e,n){return Array.isArray(e)?Te(()=>r.combineLatest(e.map(i=>this.locate(i,n??{}))).pipe(r.defaultIfEmpty([]))):this.locate(e,n??{})}}const Hi=F.namespace("spine"),Mt=({position:t,pageSize:e})=>new lt({...t,left:t.x,top:t.y,width:e.width,height:e.height,bottom:t.y+e.height,right:t.x+e.width}),xi=10,qi=t=>{const{spineItem:e,...n}=t;if(!t.spineItem.value.isLoaded)return{...n,firstVisibleNode:void 0};const o=t.spineItem.renderer?.getDocumentFrame()?.contentWindow?.document;return!o||o.body===null?{...n,firstVisibleNode:void 0}:{...n,firstVisibleNode:wn(o,t.layout)}},Yi=t=>new r.Observable(e=>{if(t.length===0){e.next([]),e.complete();return}let n,i=0;const o=new Array(t.length),s=()=>{n!==void 0&&(cancelAnimationFrame(n),n=void 0)},a=()=>{n=void 0;let l=0;for(;i<t.length&&l<xi;){const u=t[i];if(!u){i=t.length;break}o[i]=qi(u),i+=1,l+=1}if(i>=t.length){e.next(o),e.complete();return}c()},c=()=>{n=requestAnimationFrame(a)};return c(),()=>{s()}}),q=class q extends _{constructor(e,n,i,o,s,a){super({pages:[]}),this.spineLayout=e,this.spineItemsManager=n,this.spineItemLocator=i,this.context=o,this.locator=s,this.viewport=a,this.fromSpineItemPageIndex=(c,l)=>q.fromSpineItemPageIndex(this.value,c,l),this.fromNextPageWithinSameSpineItem=c=>q.fromNextPageWithinSameSpineItem(this.value,c),this.fromAbsolutePageIndex=c=>q.fromAbsolutePageIndex(this.value,c),this.observeFromAbsolutePageIndex=c=>this.pipe(r.map(()=>this.fromAbsolutePageIndex(c))),this.layout$=e.layout$.pipe(r.withLatestFrom(a),r.switchMap(([,{pageSize:c}])=>{const l=n.items.reduce((u,d,p)=>{for(let g=0;g<d.numberOfPages;g+=1){const m=i.getSpineItemPositionFromPageIndex({spineItem:d,pageIndex:g}),h=s.getSpinePositionFromSpineItemPosition({spineItem:d,spineItemPosition:m}),f=u.length;u.push({absoluteLayout:Mt({pageSize:c,position:h}),layout:new ct({left:m.x,right:m.x+c.width,top:m.y,bottom:m.y+c.height,width:c.width,height:c.height,x:m.x,y:m.y}),itemIndex:p,absolutePageIndex:f,spineItem:d,pageIndex:g})}return u},[]);return Yi(l)}),r.map(c=>(Hi.info("Pages layout",c),{pages:c})),r.share()),this.layout$.pipe(r.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}};q.fromSpineItemPageIndex=(e,n,i)=>{const o=typeof n=="number"?n:n.index;return e.pages.find(s=>s.itemIndex===o&&s.pageIndex===i)},q.fromNextPageWithinSameSpineItem=(e,n)=>q.fromSpineItemPageIndex(e,n.itemIndex,n.pageIndex+1),q.fromAbsolutePageIndex=(e,n)=>e.pages.find(i=>i.absolutePageIndex===n);let G=q;const j=t=>{const e=t.indexOf("#");return e>=0?t.substring(0,e):t},$t=t=>{if(!t)return;const e=t.indexOf("#");return e<0?void 0:t.substring(e+1)||void 0},Xi=t=>{try{return decodeURIComponent(t)}catch{return t}},Ct=(t,e=[])=>t.flatMap(n=>{const i=[...e,{title:n.title,path:n.path}],o=n.href||n.path;return[{chain:i,href:o,anchorId:$t(n.href)??$t(n.path)},...Ct(n.contents,i)]}),Gi=t=>{const e=new Map;return t.spineItems.forEach((n,i)=>{e.has(n.href)||e.set(n.href,i)}),e},Zi=(t,e)=>{const n=Gi(e);return Ct(t).map(i=>{const o=j(i.href),s=n.get(o)??-1;return{...i,hrefWithoutAnchor:o,spineItemIndex:s}})},Ji=({manifest:t,tocIndex:e})=>{const n=new Map;e.forEach((s,a)=>{const c=n.get(s.hrefWithoutAnchor);if(c){c.push(a);return}n.set(s.hrefWithoutAnchor,[a])});const i=new Map,o=new Map;for(const s of t.spineItems){if(i.has(s.href))continue;const a=j(s.href);let c=o.get(a);if(!c){const l=[];for(const[u,d]of n)Ki(a,u)&&l.push(...d);l.sort((u,d)=>u-d),c=l.map(u=>e[u]),o.set(a,c)}i.set(s.href,c)}return i},Ki=(t,e)=>t===e||t.endsWith(e)||e.endsWith(t),Qi=(t,e)=>{const n=t.endsWith(e),i=t.substring(0,t.lastIndexOf("/")),o=e.substring(0,e.lastIndexOf("/")),s=i!==""&&i.endsWith(o);return n||s},Ft=t=>{const[e,...n]=t;if(!e)return;const i={title:e.title,path:e.path};let o=i;for(const s of n){const a={title:s.title,path:s.path};o.subChapter=a,o=a}return i},ji=({doc:t,node:e,offset:n})=>{const i=t.createRange();if(e.nodeType===Node.TEXT_NODE||e.nodeType===Node.CDATA_SECTION_NODE||e.nodeType===Node.COMMENT_NODE){const o=e,s=Math.max(0,Math.min(n,o.length));i.setStart(o,s)}else{const o=e.childNodes.length,s=Math.max(0,Math.min(n,o));i.setStart(e,s)}return i.collapse(!0),i},eo=({rangeToTest:t,upperBoundRange:e})=>t.compareBoundaryPoints(Range.START_TO_START,e)<0,to=t=>{const e=t.createRange(),n=t.body??t.documentElement;if(n)return e.selectNodeContents(n),e.collapse(!1),e},no=({anchorNode:t,nextPageNode:e})=>t===e||t.contains(e),Et=({node:t,offset:e,candidates:n,spineItem:i,nextPageEntry:o})=>{if(!t||e===void 0||!i||n.length===0)return;const s=i.renderer.getDocumentFrame()?.contentDocument;if(!s||t.ownerDocument!==s)return;const a=o?.firstVisibleNode?.node,c=o?.firstVisibleNode?.offset,l=o?a!==void 0&&c!==void 0&&a.ownerDocument===s?ji({doc:s,node:a,offset:c}):void 0:to(s);if(!l)return;const u=o!==void 0&&a!==void 0&&a.ownerDocument===s;let d,p,g;for(const h of n){if(!h.anchorId){g=h.chain;continue}const f=s.getElementById(Xi(h.anchorId));if(!f||u&&no({anchorNode:f,nextPageNode:a}))continue;const y=s.createRange();y.setStartBefore(f),y.collapse(!0),eo({rangeToTest:y,upperBoundRange:l})&&(!p||y.compareBoundaryPoints(Range.START_TO_START,p)>0)&&(d=h.chain,p=y)}const m=d??g;return m?Ft(m):void 0},io=({candidate:t,hrefHasAnchor:e})=>{if(e||!t.anchorId)return!1;const n=t.chain[t.chain.length-1],i=t.chain[t.chain.length-2];return!n||!i?!1:j(n.path)===j(i.path)},oo=({href:t,tocIndex:e,manifest:n})=>{const i=j(t),o=t.includes("#"),s=n.spineItems.findIndex(c=>c.href===i);let a;for(const c of e)Qi(i,c.hrefWithoutAnchor)&&(s<c.spineItemIndex||io({candidate:c,hrefHasAnchor:o})||(a=c.chain));return a},ro=(t,e,n)=>{const{href:i}=n,o=oo({href:i,tocIndex:e,manifest:t});return o?Ft(o):void 0},so=(t,e)=>t?t.spineItems.reduce((i,o)=>(i[o.id]=ro(t,e,o),i),{}):{},ao=(t,e,n)=>t+e*n,co=(t,e,n)=>{const{height:i,width:o}=n.layoutInfo,{top:s,left:a}=t.spine.getSpineItemSpineLayoutInfo(n);return t.settings.values.computedPageTurnDirection==="vertical"?Math.max(0,Math.min(1,(e.y-s+t.viewport.absoluteViewport.height)/i)):Math.max(0,Math.min(1,(e.x-a+t.viewport.absoluteViewport.width)/o))},lo=(t,e,n,i,o,s)=>o.isReady$.pipe(r.first(),r.withLatestFrom(t.layoutInfo$),r.map(([a,c])=>{const l=s.renditionLayout==="pre-paginated",u=s.spineItems.length||0,d=s.spineItems.slice(0,e).reduce((b,M)=>b+(M.progressionWeight??0),0)||0,p=t.spineItemsManager.getSpineItemIndex(o)??0,g=s.spineItems.length??0,m=c.pages.filter(b=>b.itemIndex===p).length??0,h=s.spineItems[e]?.progressionWeight??(p+1)/g;let f=(n+1)*(h/m);!l&&o.renditionLayout==="reflowable"&&!a&&(f=0);let y=d+f;return s.renditionFlow==="scrolled-continuous"&&(a?f=co(t,i,o):f=0,y=ao(d,h,f)),e===u-1&&n===m-1&&y>.99?1:y})),Lt=t=>{if(t?.item.pageSpreadLeft)return"left";if(t?.item.pageSpreadRight)return"right"},At=(t,e)=>{const n=Lt(t),i=Lt(e);return n!==void 0&&i!==void 0&&n!==i},Rt=({item:t,nextItem:e,previousItem:n})=>At(t,n)||At(t,e),uo={tocCandidatesBySpineHref:new Map,chaptersInfo:{}},po=({beginItem:t,endItem:e,paginationInfo:n,chaptersData:i,pagesState:o,spineItems:s})=>{const a=t&&n.beginPageIndexInSpineItem!==void 0?G.fromSpineItemPageIndex(o,t.index,n.beginPageIndexInSpineItem):void 0,c=a?G.fromNextPageWithinSameSpineItem(o,a):void 0,l=e&&n.endPageIndexInSpineItem!==void 0?G.fromSpineItemPageIndex(o,e.index,n.endPageIndexInSpineItem):void 0,u=l?G.fromNextPageWithinSameSpineItem(o,l):void 0,d=t?Et({node:a?.firstVisibleNode?.node,offset:a?.firstVisibleNode?.offset,candidates:i.tocCandidatesBySpineHref.get(t.item.href)??[],spineItem:t,nextPageEntry:c}):void 0,p=e?Et({node:l?.firstVisibleNode?.node,offset:l?.firstVisibleNode?.offset,candidates:i.tocCandidatesBySpineHref.get(e.item.href)??[],spineItem:e,nextPageEntry:u}):void 0;return{beginChapterInfo:d??(t?i.chaptersInfo[t.item.id]:void 0),beginHasAdjacentSpreadPage:Rt({item:t,nextItem:t!==void 0?s[t.index+1]:void 0,previousItem:t!==void 0?s[t.index-1]:void 0}),beginSpineItemReadingDirection:t?.readingDirection,beginAbsolutePageIndex:a?.absolutePageIndex,endChapterInfo:p??(e?i.chaptersInfo[e.item.id]:void 0),endHasAdjacentSpreadPage:Rt({item:e,nextItem:e!==void 0?s[e.index+1]:void 0,previousItem:e!==void 0?s[e.index-1]:void 0}),endSpineItemReadingDirection:e?.readingDirection,endAbsolutePageIndex:l?.absolutePageIndex}},ho=({items:t,pagesState:e})=>{const n=t.map(()=>0);for(const i of e.pages)n[i.itemIndex]=(n[i.itemIndex]??0)+1;return{numberOfPagesPerItems:n,numberOfTotalPages:e.pages.length}},go=(t,e)=>t.numberOfTotalPages!==e.numberOfTotalPages||t.numberOfPagesPerItems.length!==e.numberOfPagesPerItems.length?!1:t.numberOfPagesPerItems.every((n,i)=>n===e.numberOfPagesPerItems[i]),mo=({reader:t,paginationInfo:e,navigationPosition:n,manifest:i})=>{const o=t.spineItemsManager.get(e.endSpineItemIndex);return o?lo(t,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n,o,i):r.of(0)},fo=t=>t.context.manifest$.pipe(r.map(e=>{if(!e)return uo;const n=Zi(e.nav?.toc??[],e);return{tocCandidatesBySpineHref:Ji({manifest:e,tocIndex:n}),chaptersInfo:so(e,n)}})),So=t=>({beginSpineItemIndex:t.beginSpineItemIndex,beginPageIndexInSpineItem:t.beginPageIndexInSpineItem,endSpineItemIndex:t.endSpineItemIndex,endPageIndexInSpineItem:t.endPageIndexInSpineItem}),yo=t=>{const e=t.pagination.state$,n=t.spine.pages.layout$,i=fo(t).pipe(r.shareReplay({bufferSize:1,refCount:!0})),o=e.pipe(r.map(So),r.distinctUntilChanged(C.isShallowEqual)),s=r.combineLatest([o,i,n,t.spineItemsManager.items$]).pipe(r.map(([p,g,m,h])=>{const f=p.beginSpineItemIndex!==void 0?h[p.beginSpineItemIndex]:void 0,y=p.endSpineItemIndex!==void 0?h[p.endSpineItemIndex]:void 0;return po({beginItem:f,endItem:y,paginationInfo:p,chaptersData:g,pagesState:m,spineItems:h})}),r.shareReplay({bufferSize:1,refCount:!0})),a=t.settings.watch(["computedSpreadMode"]).pipe(r.map(p=>p.computedSpreadMode??!1),r.distinctUntilChanged()),c=r.combineLatest([n,t.spineItemsManager.items$]).pipe(r.map(([p,g])=>ho({items:g,pagesState:p})),r.distinctUntilChanged(go)),l=r.combineLatest([e,a,s,c]).pipe(r.map(([p,g,m,h])=>({...p,...m,isUsingSpread:g,...h}))),u=Ne(t.navigation).pipe(r.map(({position:p})=>p),r.distinctUntilChanged(C.isShallowEqual)),d=r.combineLatest([e,t.layout$,u,t.context.manifest$]).pipe(r.switchMap(([p,g,m,h])=>mo({reader:t,paginationInfo:p,navigationPosition:m,manifest:h})),r.map(p=>({percentageEstimateOfBook:p})));return r.combineLatest([l,d]).pipe(r.map(([p,g])=>({...p,...g})),r.distinctUntilChanged(C.isShallowEqual),r.auditTime(5))},Nt=t=>e=>{const n=t(e),i=new r.BehaviorSubject({...n.pagination.state,beginChapterInfo:void 0,beginHasAdjacentSpreadPage:!1,beginCfi:void 0,beginPageIndexInSpineItem:void 0,isUsingSpread:!1,beginAbsolutePageIndex:0,endAbsolutePageIndex:0,numberOfTotalPages:0,beginSpineItemReadingDirection:void 0,beginSpineItemIndex:void 0,endCfi:void 0,endChapterInfo:void 0,endHasAdjacentSpreadPage:!1,endSpineItemReadingDirection:void 0,percentageEstimateOfBook:0}),o=new Tt(n),s=yo(n).pipe(r.tap(a=>F.log("Pagination",a))).subscribe(i);return{...n,locateResource:o.locateResource.bind(o),destroy:()=>{s.unsubscribe(),n.destroy()},pagination:{...n.pagination,get state(){return i.value},get state$(){return i}}}},bo=t=>({put:(s,a)=>new Promise((c,l)=>{const u=t.transaction(["store"],"readwrite");u.onerror=g=>{l(g)},u.oncomplete=()=>{c()};const p=u.objectStore("store").put(a,s);p.onsuccess=()=>{c()},p.onerror=g=>{l(g)}}),keys:()=>new Promise((s,a)=>{const c=t.transaction(["store"],"readonly");c.onerror=p=>{a(p)};const u=c.objectStore("store").openKeyCursor(),d=[];u.onsuccess=()=>{const p=u.result;if(!p){s(d);return}d.push(p.key),p.continue()},u.onerror=()=>{a(u.error)}}),get:s=>new Promise((a,c)=>{const l=t.transaction(["store"],"readwrite"),d=l.objectStore("store").get(s);d.onsuccess=()=>{let p=d.result;p===void 0&&(p=null),a(p)},l.onerror=()=>{c(d.error)}}),remove:s=>new Promise((a,c)=>{const l=t.transaction(["store"],"readwrite"),d=l.objectStore("store").delete(s);l.onerror=()=>{c(d.error)},l.oncomplete=()=>{a()},l.onabort=()=>{const p=d.error?d.error:d.transaction?.error;c(p)}})}),De=async t=>new Promise((e,n)=>{const i=window.indexedDB.open(t);i.onerror=o=>{n(o)},i.onsuccess=()=>{e(bo(i.result))},i.onupgradeneeded=()=>{i.result.createObjectStore("store")}}),Io=t=>{let e=Date.now().toString();const n=new r.Subject,i=l=>{if(typeof l=="string"||typeof l=="object"){const u=typeof l=="object"?l.id:l;return t.manifest?.spineItems.find(d=>d.id===u)}return t.manifest?.spineItems[l]},o=async(l,u)=>{const d=i(l);if(!d)return new Response("Item not found",{status:404});const g=await(await De("prose-reader")).get(`${e}_${d.id}`);if(g)return new Response(g,{status:200});const m=u&&await u(d)||await fetch(d.href);return s(d,m.clone()),m},s=(l,u)=>{n.next({id:l,data:u})};n.asObservable().pipe(I.mergeMap(({id:l,data:u})=>{const d=i(l);return d?r.from(r.forkJoin([De("prose-reader"),r.from(u.blob())])).pipe(I.switchMap(([p,g])=>r.from(p.put(`${e}_${d.id}`,g))),I.catchError(p=>(F.error(p),r.EMPTY))):r.EMPTY}),I.takeUntil(t.destroy$)).subscribe();const a=t.manifest$.pipe(I.tap(()=>{e=Date.now().toString()}));return r.merge(a).pipe(I.switchMap(()=>(F.debug("Cleanup up old cache..."),r.from(De("prose-reader")).pipe(I.switchMap(l=>r.from(l.keys()).pipe(I.map(u=>u.filter(d=>!d.toString().startsWith(e))),I.switchMap(u=>{const d=u.map(p=>l.remove(p));return r.from(Promise.all(d))}))),I.catchError(l=>(F.error(l),r.EMPTY))))),I.takeUntil(t.destroy$)).subscribe(),{get:o,destroy:()=>{n.complete()}}},vo=t=>e=>{const n=t(e),i=Io(n.context);return{...n,destroy:()=>{i.destroy(),n.destroy()}}},wo=(t,e)=>{const n=t.node.ownerDocument?.createRange(),i=t.node.compareDocumentPosition(e.node);if(n){try{if(i&Node.DOCUMENT_POSITION_PRECEDING)n.setStart(e.node,e.offset||0),n.setEnd(t.node,t.offset||0);else if(i&Node.DOCUMENT_POSITION_FOLLOWING)n.setStart(t.node,t.offset||0),n.setEnd(e.node,e.offset||0);else{const o=Math.min(t.offset||0,e.offset||0),s=Math.max(t.offset||0,e.offset||0);n.setStart(t.node,o),n.setEnd(t.node,s)}}catch(o){F.warn("Failed to create range from selection",o,{anchor:t,focus:e})}return n}},Po=({selection:t,spineItem:e})=>{const{anchorNode:n,anchorOffset:i,focusNode:o,focusOffset:s}=t;if(!(!n||!o))try{return wo({node:n,offset:i},{node:o,offset:s})}catch(a){F.warn("Failed to create range from selection",a,{selection:t,spineItem:e});return}};class To extends D{constructor(e){super();const n=e.contentDocument||e.contentWindow?.document;if(!n)this.selectionChange$=r.NEVER,this.selectionOver$=r.NEVER;else{const i=Me(n.body,{childList:!0,subtree:!0}).pipe(r.filter(s=>!!s.find(a=>a.type==="childList"&&a.removedNodes.length))),o=e.parentElement?Me(e.parentElement,{childList:!0}).pipe(r.filter(s=>!!s.find(a=>Array.from(a.removedNodes).includes(e)))):r.of(null);this.selectionChange$=r.merge(r.fromEvent(n,"selectionchange"),i).pipe(r.map(()=>n.getSelection()),r.takeUntil(r.merge(o,this.destroy$)),r.endWith(null)),this.selectionOver$=r.fromEvent(n,"pointerdown").pipe(r.switchMap(()=>r.merge(r.fromEvent(n,"pointerup"),r.fromEvent(n,"pointercancel"),r.fromEvent(n,"contextmenu")).pipe(r.first(),r.delay(0),r.map(s=>{const a=n.getSelection();return a&&!a.isCollapsed?[s,a]:void 0}),r.filter(W))),r.takeUntil(r.merge(o,this.destroy$)))}}}const Mo=t=>t.watch("isLoaded").pipe(r.switchMap(()=>{const e=t.renderer.getDocumentFrame(),n=e?.contentDocument||e?.contentWindow?.document;if(!e||!n)return r.NEVER;const i=new To(e);return r.merge(i.selectionChange$.pipe(r.map(o=>{if(o?.toString())return{type:"change",selection:o}})),i.selectionOver$.pipe(r.map(([o,s])=>({type:"over",event:o,selection:s})))).pipe(r.takeUntil(t.unloaded$),r.endWith(void 0),r.finalize(()=>{i.destroy()}))}),r.distinctUntilChanged()),$o=t=>e=>{const n=t(e);let i;const o=n.spineItemsManager.items$.pipe(r.switchMap(d=>{const p=d.map(g=>{const m=n.spineItemsManager.getSpineItemIndex(g)??0;return Mo(g).pipe(r.map(h=>{if(h)return{...h,itemIndex:m}}))});return r.merge(...p)}),r.startWith(void 0),r.distinctUntilChanged(),r.tap(d=>{i=d}),r.shareReplay({refCount:!0,bufferSize:1})),s=o,a=o.pipe(r.map(d=>!!d),r.distinctUntilChanged(),r.filter(d=>d),r.share()),c=a.pipe(r.switchMap(()=>s),r.distinctUntilChanged(),r.filter(d=>!d),r.share()),l=o.pipe(r.filter(d=>d?.type==="over"),r.share()),u=n.context.watch("rootElement").pipe(r.filter(W),r.switchMap(d=>r.fromEvent(d,"pointerdown")),r.withLatestFrom(s),r.map(([,d])=>d),r.startWith(void 0),r.shareReplay({refCount:!0,bufferSize:1}));return r.merge(s,u).pipe(r.takeUntil(n.$.destroy$)).subscribe(),{...n,selection:{selection$:s,selectionStart$:a,selectionEnd$:c,selectionOver$:l,lastSelectionOnPointerdown$:u,getSelection:()=>i,createOrderedRangeFromSelection:Po}}},Dt=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],Co=t=>e=>{const n=t(e),i=new r.BehaviorSubject(e.theme??"bright"),o=()=>{const c=Dt.find(l=>l.name===i.value);return`
|
|
179
|
+
`)}}),Pi(a),wi(a),a.hookManager.register("item.onDocumentCreated",({documentContainer:f})=>{P(f.style,"opacity","0"),c.values.layoutLayerTransition&&P(f.style,"transition","opacity 800ms")}),a.hookManager.register("item.onBeforeLayout",({item:f})=>{const b=a.spineItemsManager.get(f.id)?.renderer.documentContainer;a.settings.values.computedPageTurnMode!=="scrollable"&&b&&_(b,"tab-index","0")});const l=a.spineItemsObserver.states$.pipe(I.filter(({isReady:f})=>f),I.tap(({item:f})=>{const y=f.renderer.documentContainer;y&&P(y.style,"opacity","1")})),u=c.values$.pipe(I.filter(({layoutAutoResize:f})=>f==="container"),I.switchMap(()=>a.context.watch("rootElement")),I.filter(z),I.switchMap(f=>re(f)),I.debounceTime(100),I.filter(z),I.tap(()=>{a?.layout()})),d=pi(a);c.watch(["pageHorizontalMargin","pageVerticalMargin"]).pipe(I.skip(1),I.tap(()=>{a.layout()}),I.takeUntil(a.$.destroy$)).subscribe();const p=a.spine.pages.pipe(I.shareReplay({refCount:!0,bufferSize:1})),g=Ti(a),m=Fi(a),h=vi(a);return r.merge(l,d,u,p,g,m,h).pipe(I.takeUntil(a.$.destroy$)).subscribe(),{...a,destroy:()=>{c.destroy(),a.destroy()},settings:c,layout$:a.spine.layout$,layoutInfo$:p,coordinates:di(a)}},Ei=t=>e=>{const n=t(e),i=new IntersectionObserver(c=>{c.forEach(l=>{const u=l.target,d=Array.from(u.contentDocument?.body.getElementsByTagName("audio")||[]);l.isIntersecting?d.forEach(p=>{p.hasAttribute("autoplay")&&p.paused&&p.readyState>=2&&p.play().catch(console.error)}):d.forEach(p=>{p.pause(),p.currentTime=0})})},{threshold:.01}),o=new IntersectionObserver(c=>{c.forEach(l=>{if(l.target.tagName==="video"){const u=l.target;l.isIntersecting?u.hasAttribute("autoplay")&&u.paused&&u.readyState>=2&&u.play().catch(console.error):(u.pause(),u.currentTime=0)}})},{threshold:.5}),s=new Map;return n.hookManager.register("item.onDocumentLoad",async({itemId:c})=>{s.get(c)?.(),s.delete(c);const l=n.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!l)return;i.observe(l);const u=l.contentDocument?.body.getElementsByTagName("video"),d=Array.from(u||[]).map(g=>(o.observe(g),()=>o.unobserve(g))),p=()=>{i.unobserve(l),d.forEach(g=>{g()})};s.set(c,p)}),n.hookManager.register("item.onDocumentUnload",async({itemId:c})=>{s.get(c)?.(),s.delete(c)}),{...n,destroy:()=>{i.disconnect(),o.disconnect(),s.clear(),n.destroy()}}},Ne=t=>e=>e.pipe(r.switchMap(n=>t.pipe(r.filter(i=>i==="free"),r.first(),r.map(()=>n)))),Re=({navigation$:t,navigationState$:e})=>t.pipe(Ne(e)),yt=t=>Re(t).pipe(r.skip(1)),bt=t=>e=>e.pipe(r.takeUntil(yt(t))),It=t=>t.navigation.navigation$.pipe(r.filter(e=>e.triggeredBy==="user"),Ne(t.navigation.navigationState$),r.map(e=>{const n=e.requestedPosition,i=e.requestedVisibleArea;return n&&i?t.navigation.navigationResolver.getBoundaryForPosition(n,i):void 0}),r.filter(e=>e!==void 0),r.map(e=>({boundary:e})),r.share()),Li=(t,e)=>t.links$.pipe(r.tap(n=>{if(!Je(n.target,"a")||n.type!=="click")return;const i=new URL(n.target.href),o=`${i.origin}${i.pathname}`;t.context.manifest?.spineItems.some(a=>a.href===o)&&e.goToUrl(i)})),H=F.namespace("navigation"),Ai=({position:t,spineItem:e,pageHeight:n,pageWidth:i,spineItemLocator:o})=>{let s=new E({x:t.x-i,y:t.y});return e.isUsingVerticalWriting()&&(s=new E({x:t.x,y:t.y+n})),o.getSpineItemClosestPositionFromUnsafePosition(s,e)},vt=({position:t,navigationResolver:e,computedPageTurnDirection:n,spineItemsManager:i,spineLocator:o,viewport:s})=>{const a=n,c=o.getSpineItemFromPosition(t)||i.get(0),l=t;if(!c)return l;const u=o.getSpineItemPositionFromSpinePosition(t,c),d=Ai({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:o.spineItemLocator});return e.arePositionsDifferent(d,u)?o.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):a==="horizontal"?new A({x:t.x-s.pageSize.width,y:0}):new A({y:t.y-s.pageSize.height,x:0})},Ni=({position:t,spineItem:e,context:n,navigationResolver:i,spineItemsManager:o,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{if(l.values.computedPageTurnMode==="scrollable"&&a==="vertical")return new A({x:t.x,y:t.y-c.pageSize.height});const u=vt({position:t,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});if(e?.isUsingVerticalWriting()&&t.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&t.x!==u.x)return i.getAdjustedPositionForSpread(n.isRTL()?new A({x:u.x+c.pageSize.width,y:u.y}):new A({x:u.x-c.pageSize.width,y:u.y}));if(a==="vertical"&&t.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=vt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)},Ri=({position:t,spineItem:e,pageHeight:n,pageWidth:i,spineItemLocator:o})=>{let s=new E({x:t.x+i,y:t.y});return e.isUsingVerticalWriting()&&(s=new E({x:t.x,y:t.y-n})),o.getSpineItemClosestPositionFromUnsafePosition(s,e)},wt=({position:t,navigationResolver:e,computedPageTurnDirection:n,spineItemsManager:i,spineLocator:o,viewport:s})=>{const a=n,c=o.getSpineItemFromPosition(t)||i.get(0),l=t;if(!c)return l;const u=o.getSpineItemPositionFromSpinePosition(t,c),d=Ri({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:o.spineItemLocator});return e.arePositionsDifferent(d,u)?o.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):a==="horizontal"?new A({x:t.x+s.pageSize.width,y:0}):new A({y:t.y+s.pageSize.height,x:0})},Di=({position:t,spineItem:e,context:n,navigationResolver:i,spineItemsManager:o,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{if(l.values.computedPageTurnMode==="scrollable"&&a==="vertical")return new A({x:t.x,y:t.y+c.pageSize.height});const u=wt({position:t,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});if(e?.isUsingVerticalWriting()&&t.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&t.x!==u.x)return i.getAdjustedPositionForSpread(n.isRTL()?new A({x:u.x-c.pageSize.width,y:u.y}):new A({x:u.x+c.pageSize.width,y:u.y}));if(a==="vertical"&&t.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=wt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:o,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)};class Oi{constructor(e){this.reader=e,this.movingLastDelta={x:0,y:0},this.movingLastPosition=new N({x:0,y:0}),this.unlock=void 0}turnRight(){return this.turnRightOrBottom()}turnLeft(){return this.turnLeftOrTop()}turnTop(){return this.turnLeftOrTop()}turnBottom(){return this.turnRightOrBottom()}turnRightOrBottom(){const e=this.reader.navigation.getNavigation(),n=this.reader.spineItemsManager.get(e.spineItem);if(!n)return;const i=Di({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:n,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:i})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),n=this.reader.spineItemsManager.get(e.spineItem);if(!n)return;const i=Ni({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:n,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:i})}goToCfi(e,n={animate:!0}){return this.reader.navigation.navigate({animation:n.animate?"turn":!1,cfi:e})}goToSpineItem({indexOrId:e,...n}){const i=this.reader.spineItemsManager.get(e);if(i===void 0){H.warn("goToSpineItem",`Ignore navigation to ${e} since the item does not exist`);return}this.reader.navigation.navigate({spineItem:i.index,...n})}goToNextSpineItem(){const{endIndex:e=0}=this.reader.spine.locator.getVisibleSpineItemsFromPosition({position:this.reader.navigation.getNavigation().position,threshold:{type:"percentage",value:.5}})||{};this.goToSpineItem({indexOrId:e+1})}goToPreviousSpineItem(){const{beginIndex:e=0}=this.reader.spine.locator.getVisibleSpineItemsFromPosition({position:this.reader.navigation.getNavigation().position,threshold:{type:"percentage",value:.5}})??{};this.goToSpineItem({indexOrId:e-1})}goToUrl(e){this.reader.navigation.navigate({url:e,animation:!1})}goToRightSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="vertical"){H.warn("You cannot call this navigation method on vertical direction");return}return this.reader.context.isRTL()?this.goToPreviousSpineItem():this.goToNextSpineItem()}goToRightOrBottomSpineItem(){return this.reader.settings.values.computedPageTurnDirection==="vertical"?this.goToBottomSpineItem():this.goToRightSpineItem()}goToLeftOrTopSpineItem(){return this.reader.settings.values.computedPageTurnDirection==="vertical"?this.goToTopSpineItem():this.goToLeftSpineItem()}goToLeftSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="vertical"){H.warn("You cannot call this navigation method on vertical direction");return}return this.reader.context.isRTL()?this.goToNextSpineItem():this.goToPreviousSpineItem()}goToTopSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){H.warn("You cannot call this navigation method on horizontal direction");return}return this.goToPreviousSpineItem()}goToBottomSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){H.warn("You cannot call this navigation method on horizontal direction");return}return this.goToNextSpineItem()}goToPageOfSpineItem({pageIndex:e,spineItemId:n,...i}){const o=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:n});H.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:n,...i,position:o}),this.reader.navigation.navigate({position:o,...i})}goToAbsolutePageIndex({absolutePageIndex:e,...n}){const i=this.reader.spine.pages.fromAbsolutePageIndex(e);if(H.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...n,foundInfo:i}),i){const o=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:i.pageIndex,spineItemId:i.itemIndex});return this.reader.navigation.navigate({position:o,...n})}}}class Vi extends W{constructor(e){super({lastDelta:{x:0,y:0},lastPosition:new N({x:0,y:0}),lastStartPosition:new N({x:0,y:0}),isStarted:!1}),this.reader=e,this.unlock=void 0}start(e){this.unlock?.(),this.unlock=this.reader.navigation.lock(),this.mergeCompare({isStarted:!0,lastDelta:e,lastStartPosition:this.reader.navigation.controlledNavigationController.viewportPosition,lastPosition:this.reader.navigation.controlledNavigationController.viewportPosition})}stop(e){this.panMoveTo(e),this.mergeCompare({isStarted:!1}),this.unlock?.()}panMoveTo(e){if(this.reader.settings.values.computedPageTurnMode==="scrollable"){H.warn("pan control is not available on free page turn mode");return}if(!this.value.isStarted){H.error("Pan navigator is not started");return}const n=this.reader.settings.values.computedPageTurnDirection;let i=this.reader.navigation.getNavigation().position;if(e){const o=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,s=Math.floor(e.x)-(this.value.lastDelta?.x||0),a=Math.floor(e.y)-(this.value.lastDelta?.y||0),c=Math.floor(n==="horizontal"?this.value.lastPosition.x-s/o:0),l=Math.floor(n==="horizontal"?0:this.value.lastPosition.y-a/o);i=new N({x:c,y:l}),this.mergeCompare({lastDelta:e})}else i=this.value.lastPosition;this.mergeCompare({lastPosition:i}),this.reader.navigation.navigate({position:i,animation:!1})}}class D{constructor(){this.isDestroyed=!1,this.destroySubject=new r.Subject,this.destroy$=this.destroySubject.asObservable()}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.destroySubject.next(),this.destroySubject.complete())}}const ki=500;class Ui extends D{constructor(e,n){super(),this.scrollNavigationController=e,this.lock=n,this.navigationSubject=new r.Subject,this.navigation$=this.navigationSubject.asObservable();const i=this.scrollNavigationController.userScroll$.pipe(r.exhaustMap(o=>{const s=this.lock();return r.merge(this.scrollNavigationController.userScroll$,r.of(o)).pipe(r.debounceTime(ki,r.animationFrameScheduler),r.first(),r.tap(()=>{const a=this.scrollNavigationController.fromScrollPosition(this.scrollNavigationController.scrollPosition);this.navigationSubject.next({animation:!1,type:"scroll",position:a})}),r.finalize(()=>{s()}))}));r.merge(i).pipe(r.takeUntil(this.destroy$)).subscribe()}}const _i=t=>t.pagination.state$.pipe(r.withLatestFrom(t.context.manifest$,t.settings.values$),r.map(([e,{spineItems:n,readingDirection:i},{computedPageTurnDirection:o}])=>{const s=n.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(s-1,0),l=e.endSpineItemIndex===Math.max(s-1,0),u=e.beginSpineItemIndex===0,d=e.beginPageIndexInSpineItem===0,p=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:o==="vertical"?!1:!d,canTurnRight:o==="vertical"?!1:!p,canGoTopSpineItem:o==="vertical"&&!a,canGoBottomSpineItem:o==="vertical"&&!c,canGoLeftSpineItem:o!=="vertical"&&(i==="ltr"&&!a||i==="rtl"&&!l),canGoRightSpineItem:o!=="vertical"&&(i==="ltr"&&!c||i==="rtl"&&!u)}}),r.distinctUntilChanged(C.isShallowEqual)),Wi=({reader:t,duration:e})=>n=>{let i;const o=()=>{i?.(),i=void 0};return n.pipe(r.tap(()=>{i||(i=t?.navigation.lock())}),r.throttleTime(e,void 0,{trailing:!0,leading:!0}),r.tap(o),r.finalize(o))},zi=t=>e=>{const n=t(e),i=_i(n),o=It(n),s=new Oi(n),a=new Vi(n),c=new Ui(n.navigation.scrollNavigationController,n.navigation.lock),l=Li(n,s),u=c.navigation$.pipe(r.tap(g=>{n.navigation.navigate(g)}));return r.merge(l,u).pipe(r.takeUntil(n.$.destroy$)).subscribe(),{...n,load:g=>{const{cfi:m,...h}=g;n.load(h),m&&s.goToCfi(m,{animate:!1})},destroy:()=>{c.destroy(),n.destroy()},navigation:{...n.navigation,state$:i,outOfSpineBoundary$:o,throttleLock:({duration:g,trigger:m})=>m.pipe(Wi({duration:g,reader:n})),panNavigator:a,turnBottom:s.turnBottom.bind(s),turnTop:s.turnTop.bind(s),turnLeftOrTop:s.turnLeftOrTop.bind(s),turnRightOrBottom:s.turnRightOrBottom.bind(s),turnLeft:s.turnLeft.bind(s),turnRight:s.turnRight.bind(s),goToCfi:s.goToCfi.bind(s),goToUrl:s.goToUrl.bind(s),goToSpineItem:s.goToSpineItem.bind(s),goToNextSpineItem:s.goToNextSpineItem.bind(s),goToPreviousSpineItem:s.goToPreviousSpineItem.bind(s),goToLeftOrTopSpineItem:s.goToLeftOrTopSpineItem.bind(s),goToRightOrBottomSpineItem:s.goToRightOrBottomSpineItem.bind(s),goToTopSpineItem:s.goToTopSpineItem.bind(s),goToBottomSpineItem:s.goToBottomSpineItem.bind(s),goToLeftSpineItem:s.goToLeftSpineItem.bind(s),goToRightSpineItem:s.goToRightSpineItem.bind(s),goToPageOfSpineItem:s.goToPageOfSpineItem.bind(s),goToAbsolutePageIndex:s.goToAbsolutePageIndex.bind(s)}}},Bi=(t,e)=>{if("cfi"in e){const{itemIndex:s,...a}=t.cfi.parseCfi(e.cfi);return{...e,...a,itemIndex:s,node:null}}const n=t.spineItemsManager.get(e);if(!n)throw new Error("Spine item not found");const i=t.cfi.generateRootCfi(n.item);return{...t.cfi.parseCfi(i),cfi:i,itemIndex:n.index,node:null}},Pt=(t,e)=>{let n=t?.itemPageIndex;const{itemIndex:i,...o}=e.cfi.parseCfi(t.cfi),s=e.spineItemsManager.get(i);return s?Pe().pipe(r.withLatestFrom(s.isReady$),r.map(([,a])=>{const{node:c=null,offset:l,range:u}=a?e.cfi.resolveCfi({cfi:t.cfi}):{};s.renditionLayout!=="pre-paginated"&&c&&(n=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,l??0,s)??n);let p=t?.absolutePageIndex;return n===void 0&&(n=0),p=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:n,spineItemOrId:s})??t?.absolutePageIndex,{...t,...o,range:u,itemIndex:i,node:c,startOffset:l,absolutePageIndex:p,itemPageIndex:n}})):r.of({...t,itemIndex:i,...o})};class Tt{constructor(e){this.reader=e,this.locatorsByKey=new Map,this.deregisterMemoizedStream=n=>{const i=this.locatorsByKey.get(n);i&&(i.observerCount--,i.observerCount===0&&this.locatorsByKey.delete(n))},this.locate=(n,i)=>{const o={resource:n,meta:Bi(this.reader,n)};return Te(()=>{const s=this.reader.spineItemsManager.get(o.meta.itemIndex??0),a=s?.renditionLayout==="reflowable",c=i.mode==="shallow"||!a||!s?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([s.index]),l="cfi"in n?n.cfi:void 0,u=l?this.locatorsByKey.get(l):void 0,d=g=>g.pipe(r.finalize(()=>{l&&this.deregisterMemoizedStream(l),setTimeout(()=>{c()},1e3)}));if(l&&u)return u.observerCount++,d(u.consolidate$.pipe(r.map(({resource:g,meta:m})=>({resource:g,meta:m}))));const p=this.reader.spine.layout$.pipe(r.debounceTime(10),r.startWith(o),r.switchScan(g=>Pt(g.meta,this.reader).pipe(r.map(m=>({...g,meta:m}))),o),r.shareReplay({refCount:!0,bufferSize:1}));return l&&this.locatorsByKey.set(l,{observerCount:1,consolidate$:p}),d(p)})}}locateResource(e,n){return Array.isArray(e)?Te(()=>r.combineLatest(e.map(i=>this.locate(i,n??{}))).pipe(r.defaultIfEmpty([]))):this.locate(e,n??{})}}const Hi=F.namespace("spine"),Mt=({position:t,pageSize:e})=>new lt({...t,left:t.x,top:t.y,width:e.width,height:e.height,bottom:t.y+e.height,right:t.x+e.width}),xi=10,qi=t=>{const{spineItem:e,...n}=t;if(!t.spineItem.value.isLoaded)return{...n,firstVisibleNode:void 0};const o=t.spineItem.renderer?.getDocumentFrame()?.contentWindow?.document;return!o||o.body===null?{...n,firstVisibleNode:void 0}:{...n,firstVisibleNode:wn(o,t.layout)}},Yi=t=>new r.Observable(e=>{if(t.length===0){e.next([]),e.complete();return}let n,i=0;const o=new Array(t.length),s=()=>{n!==void 0&&(cancelAnimationFrame(n),n=void 0)},a=()=>{n=void 0;let l=0;for(;i<t.length&&l<xi;){const u=t[i];if(!u){i=t.length;break}o[i]=qi(u),i+=1,l+=1}if(i>=t.length){e.next(o),e.complete();return}c()},c=()=>{n=requestAnimationFrame(a)};return c(),()=>{s()}}),q=class q extends W{constructor(e,n,i,o,s,a){super({pages:[]}),this.spineLayout=e,this.spineItemsManager=n,this.spineItemLocator=i,this.context=o,this.locator=s,this.viewport=a,this.fromSpineItemPageIndex=(c,l)=>q.fromSpineItemPageIndex(this.value,c,l),this.fromNextPageWithinSameSpineItem=c=>q.fromNextPageWithinSameSpineItem(this.value,c),this.fromAbsolutePageIndex=c=>q.fromAbsolutePageIndex(this.value,c),this.observeFromAbsolutePageIndex=c=>this.pipe(r.map(()=>this.fromAbsolutePageIndex(c))),this.layout$=e.layout$.pipe(r.withLatestFrom(a),r.switchMap(([,{pageSize:c}])=>{const l=n.items.reduce((u,d,p)=>{for(let g=0;g<d.numberOfPages;g+=1){const m=i.getSpineItemPositionFromPageIndex({spineItem:d,pageIndex:g}),h=s.getSpinePositionFromSpineItemPosition({spineItem:d,spineItemPosition:m}),f=u.length;u.push({absoluteLayout:Mt({pageSize:c,position:h}),layout:new ct({left:m.x,right:m.x+c.width,top:m.y,bottom:m.y+c.height,width:c.width,height:c.height,x:m.x,y:m.y}),itemIndex:p,absolutePageIndex:f,spineItem:d,pageIndex:g})}return u},[]);return Yi(l)}),r.map(c=>(Hi.info("Pages layout",c),{pages:c})),r.share()),this.layout$.pipe(r.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}};q.fromSpineItemPageIndex=(e,n,i)=>{const o=typeof n=="number"?n:n.index;return e.pages.find(s=>s.itemIndex===o&&s.pageIndex===i)},q.fromNextPageWithinSameSpineItem=(e,n)=>q.fromSpineItemPageIndex(e,n.itemIndex,n.pageIndex+1),q.fromAbsolutePageIndex=(e,n)=>e.pages.find(i=>i.absolutePageIndex===n);let Z=q;const j=t=>{const e=t.indexOf("#");return e>=0?t.substring(0,e):t},$t=t=>{if(!t)return;const e=t.indexOf("#");return e<0?void 0:t.substring(e+1)||void 0},Xi=t=>{try{return decodeURIComponent(t)}catch{return t}},Ct=(t,e=[])=>t.flatMap(n=>{const i=[...e,{title:n.title,path:n.path}],o=n.href||n.path;return[{chain:i,href:o,anchorId:$t(n.href)??$t(n.path)},...Ct(n.contents,i)]}),Gi=t=>{const e=new Map;return t.spineItems.forEach((n,i)=>{e.has(n.href)||e.set(n.href,i)}),e},Zi=(t,e)=>{const n=Gi(e);return Ct(t).map(i=>{const o=j(i.href),s=n.get(o)??-1;return{...i,hrefWithoutAnchor:o,spineItemIndex:s}})},Ji=({manifest:t,tocIndex:e})=>{const n=new Map;e.forEach((s,a)=>{const c=n.get(s.hrefWithoutAnchor);if(c){c.push(a);return}n.set(s.hrefWithoutAnchor,[a])});const i=new Map,o=new Map;for(const s of t.spineItems){if(i.has(s.href))continue;const a=j(s.href);let c=o.get(a);if(!c){const l=[];for(const[u,d]of n)Ki(a,u)&&l.push(...d);l.sort((u,d)=>u-d),c=l.map(u=>e[u]),o.set(a,c)}i.set(s.href,c)}return i},Ki=(t,e)=>t===e||t.endsWith(e)||e.endsWith(t),Qi=(t,e)=>{const n=t.endsWith(e),i=t.substring(0,t.lastIndexOf("/")),o=e.substring(0,e.lastIndexOf("/")),s=i!==""&&i.endsWith(o);return n||s},Ft=t=>{const[e,...n]=t;if(!e)return;const i={title:e.title,path:e.path};let o=i;for(const s of n){const a={title:s.title,path:s.path};o.subChapter=a,o=a}return i},ji=({doc:t,node:e,offset:n})=>{const i=t.createRange();if(e.nodeType===Node.TEXT_NODE||e.nodeType===Node.CDATA_SECTION_NODE||e.nodeType===Node.COMMENT_NODE){const o=e,s=Math.max(0,Math.min(n,o.length));i.setStart(o,s)}else{const o=e.childNodes.length,s=Math.max(0,Math.min(n,o));i.setStart(e,s)}return i.collapse(!0),i},eo=({rangeToTest:t,upperBoundRange:e})=>t.compareBoundaryPoints(Range.START_TO_START,e)<0,to=t=>{const e=t.createRange(),n=t.body??t.documentElement;if(n)return e.selectNodeContents(n),e.collapse(!1),e},no=({anchorNode:t,nextPageNode:e})=>t===e||t.contains(e),Et=({node:t,offset:e,candidates:n,spineItem:i,nextPageEntry:o})=>{if(!t||e===void 0||!i||n.length===0)return;const s=i.renderer.getDocumentFrame()?.contentDocument;if(!s||t.ownerDocument!==s)return;const a=o?.firstVisibleNode?.node,c=o?.firstVisibleNode?.offset,l=o?a!==void 0&&c!==void 0&&a.ownerDocument===s?ji({doc:s,node:a,offset:c}):void 0:to(s);if(!l)return;const u=o!==void 0&&a!==void 0&&a.ownerDocument===s;let d,p,g;for(const h of n){if(!h.anchorId){g=h.chain;continue}const f=s.getElementById(Xi(h.anchorId));if(!f||u&&no({anchorNode:f,nextPageNode:a}))continue;const y=s.createRange();y.setStartBefore(f),y.collapse(!0),eo({rangeToTest:y,upperBoundRange:l})&&(!p||y.compareBoundaryPoints(Range.START_TO_START,p)>0)&&(d=h.chain,p=y)}const m=d??g;return m?Ft(m):void 0},io=({candidate:t,hrefHasAnchor:e})=>{if(e||!t.anchorId)return!1;const n=t.chain[t.chain.length-1],i=t.chain[t.chain.length-2];return!n||!i?!1:j(n.path)===j(i.path)},oo=({href:t,tocIndex:e,manifest:n})=>{const i=j(t),o=t.includes("#"),s=n.spineItems.findIndex(c=>c.href===i);let a;for(const c of e)Qi(i,c.hrefWithoutAnchor)&&(s<c.spineItemIndex||io({candidate:c,hrefHasAnchor:o})||(a=c.chain));return a},ro=(t,e,n)=>{const{href:i}=n,o=oo({href:i,tocIndex:e,manifest:t});return o?Ft(o):void 0},so=(t,e)=>t?t.spineItems.reduce((i,o)=>(i[o.id]=ro(t,e,o),i),{}):{},ao=(t,e,n)=>t+e*n,co=(t,e,n)=>{const{height:i,width:o}=n.layoutInfo,{top:s,left:a}=t.spine.getSpineItemSpineLayoutInfo(n);return t.settings.values.computedPageTurnDirection==="vertical"?Math.max(0,Math.min(1,(e.y-s+t.viewport.absoluteViewport.height)/i)):Math.max(0,Math.min(1,(e.x-a+t.viewport.absoluteViewport.width)/o))},lo=(t,e,n,i,o,s)=>o.isReady$.pipe(r.first(),r.withLatestFrom(t.layoutInfo$),r.map(([a,c])=>{const l=s.renditionLayout==="pre-paginated",u=s.spineItems.length||0,d=s.spineItems.slice(0,e).reduce((b,T)=>b+(T.progressionWeight??0),0)||0,p=t.spineItemsManager.getSpineItemIndex(o)??0,g=s.spineItems.length??0,m=c.pages.filter(b=>b.itemIndex===p).length??0,h=s.spineItems[e]?.progressionWeight??(p+1)/g;let f=(n+1)*(h/m);!l&&o.renditionLayout==="reflowable"&&!a&&(f=0);let y=d+f;return s.renditionFlow==="scrolled-continuous"&&(a?f=co(t,i,o):f=0,y=ao(d,h,f)),e===u-1&&n===m-1&&y>.99?1:y})),Lt=t=>{if(t?.item.pageSpreadLeft)return"left";if(t?.item.pageSpreadRight)return"right"},At=(t,e)=>{const n=Lt(t),i=Lt(e);return n!==void 0&&i!==void 0&&n!==i},Nt=({item:t,nextItem:e,previousItem:n})=>At(t,n)||At(t,e),uo={tocCandidatesBySpineHref:new Map,chaptersInfo:{}},po=({beginItem:t,endItem:e,paginationInfo:n,chaptersData:i,pagesState:o,spineItems:s})=>{const a=t&&n.beginPageIndexInSpineItem!==void 0?Z.fromSpineItemPageIndex(o,t.index,n.beginPageIndexInSpineItem):void 0,c=a?Z.fromNextPageWithinSameSpineItem(o,a):void 0,l=e&&n.endPageIndexInSpineItem!==void 0?Z.fromSpineItemPageIndex(o,e.index,n.endPageIndexInSpineItem):void 0,u=l?Z.fromNextPageWithinSameSpineItem(o,l):void 0,d=t?Et({node:a?.firstVisibleNode?.node,offset:a?.firstVisibleNode?.offset,candidates:i.tocCandidatesBySpineHref.get(t.item.href)??[],spineItem:t,nextPageEntry:c}):void 0,p=e?Et({node:l?.firstVisibleNode?.node,offset:l?.firstVisibleNode?.offset,candidates:i.tocCandidatesBySpineHref.get(e.item.href)??[],spineItem:e,nextPageEntry:u}):void 0;return{beginChapterInfo:d??(t?i.chaptersInfo[t.item.id]:void 0),beginHasAdjacentSpreadPage:Nt({item:t,nextItem:t!==void 0?s[t.index+1]:void 0,previousItem:t!==void 0?s[t.index-1]:void 0}),beginSpineItemReadingDirection:t?.readingDirection,beginAbsolutePageIndex:a?.absolutePageIndex,endChapterInfo:p??(e?i.chaptersInfo[e.item.id]:void 0),endHasAdjacentSpreadPage:Nt({item:e,nextItem:e!==void 0?s[e.index+1]:void 0,previousItem:e!==void 0?s[e.index-1]:void 0}),endSpineItemReadingDirection:e?.readingDirection,endAbsolutePageIndex:l?.absolutePageIndex}},ho=({items:t,pagesState:e})=>{const n=t.map(()=>0);for(const i of e.pages)n[i.itemIndex]=(n[i.itemIndex]??0)+1;return{numberOfPagesPerItems:n,numberOfTotalPages:e.pages.length}},go=(t,e)=>t.numberOfTotalPages!==e.numberOfTotalPages||t.numberOfPagesPerItems.length!==e.numberOfPagesPerItems.length?!1:t.numberOfPagesPerItems.every((n,i)=>n===e.numberOfPagesPerItems[i]),mo=({reader:t,paginationInfo:e,navigationPosition:n,manifest:i})=>{const o=t.spineItemsManager.get(e.endSpineItemIndex);return o?lo(t,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n,o,i):r.of(0)},fo=t=>t.context.manifest$.pipe(r.map(e=>{if(!e)return uo;const n=Zi(e.nav?.toc??[],e);return{tocCandidatesBySpineHref:Ji({manifest:e,tocIndex:n}),chaptersInfo:so(e,n)}})),So=t=>({beginSpineItemIndex:t.beginSpineItemIndex,beginPageIndexInSpineItem:t.beginPageIndexInSpineItem,endSpineItemIndex:t.endSpineItemIndex,endPageIndexInSpineItem:t.endPageIndexInSpineItem}),yo=t=>{const e=t.pagination.state$,n=t.spine.pages.layout$,i=fo(t).pipe(r.shareReplay({bufferSize:1,refCount:!0})),o=e.pipe(r.map(So),r.distinctUntilChanged(C.isShallowEqual)),s=r.combineLatest([o,i,n,t.spineItemsManager.items$]).pipe(r.map(([p,g,m,h])=>{const f=p.beginSpineItemIndex!==void 0?h[p.beginSpineItemIndex]:void 0,y=p.endSpineItemIndex!==void 0?h[p.endSpineItemIndex]:void 0;return po({beginItem:f,endItem:y,paginationInfo:p,chaptersData:g,pagesState:m,spineItems:h})}),r.shareReplay({bufferSize:1,refCount:!0})),a=t.settings.watch(["computedSpreadMode"]).pipe(r.map(p=>p.computedSpreadMode??!1),r.distinctUntilChanged()),c=r.combineLatest([n,t.spineItemsManager.items$]).pipe(r.map(([p,g])=>ho({items:g,pagesState:p})),r.distinctUntilChanged(go)),l=r.combineLatest([e,a,s,c]).pipe(r.map(([p,g,m,h])=>({...p,...m,isUsingSpread:g,...h}))),u=Re(t.navigation).pipe(r.map(({position:p})=>p),r.distinctUntilChanged(C.isShallowEqual)),d=r.combineLatest([e,t.layout$,u,t.context.manifest$]).pipe(r.switchMap(([p,g,m,h])=>mo({reader:t,paginationInfo:p,navigationPosition:m,manifest:h})),r.map(p=>({percentageEstimateOfBook:p})));return r.combineLatest([l,d]).pipe(r.map(([p,g])=>({...p,...g})),r.distinctUntilChanged(C.isShallowEqual),r.auditTime(5))},Rt=t=>e=>{const n=t(e),i=new r.BehaviorSubject({...n.pagination.state,beginChapterInfo:void 0,beginHasAdjacentSpreadPage:!1,beginCfi:void 0,beginPageIndexInSpineItem:void 0,isUsingSpread:!1,beginAbsolutePageIndex:0,endAbsolutePageIndex:0,numberOfTotalPages:0,beginSpineItemReadingDirection:void 0,beginSpineItemIndex:void 0,endCfi:void 0,endChapterInfo:void 0,endHasAdjacentSpreadPage:!1,endSpineItemReadingDirection:void 0,percentageEstimateOfBook:0}),o=new Tt(n),s=yo(n).pipe(r.tap(a=>F.log("Pagination",a))).subscribe(i);return{...n,locateResource:o.locateResource.bind(o),destroy:()=>{s.unsubscribe(),n.destroy()},pagination:{...n.pagination,get state(){return i.value},get state$(){return i}}}},bo=t=>({put:(s,a)=>new Promise((c,l)=>{const u=t.transaction(["store"],"readwrite");u.onerror=g=>{l(g)},u.oncomplete=()=>{c()};const p=u.objectStore("store").put(a,s);p.onsuccess=()=>{c()},p.onerror=g=>{l(g)}}),keys:()=>new Promise((s,a)=>{const c=t.transaction(["store"],"readonly");c.onerror=p=>{a(p)};const u=c.objectStore("store").openKeyCursor(),d=[];u.onsuccess=()=>{const p=u.result;if(!p){s(d);return}d.push(p.key),p.continue()},u.onerror=()=>{a(u.error)}}),get:s=>new Promise((a,c)=>{const l=t.transaction(["store"],"readwrite"),d=l.objectStore("store").get(s);d.onsuccess=()=>{let p=d.result;p===void 0&&(p=null),a(p)},l.onerror=()=>{c(d.error)}}),remove:s=>new Promise((a,c)=>{const l=t.transaction(["store"],"readwrite"),d=l.objectStore("store").delete(s);l.onerror=()=>{c(d.error)},l.oncomplete=()=>{a()},l.onabort=()=>{const p=d.error?d.error:d.transaction?.error;c(p)}})}),De=async t=>new Promise((e,n)=>{const i=window.indexedDB.open(t);i.onerror=o=>{n(o)},i.onsuccess=()=>{e(bo(i.result))},i.onupgradeneeded=()=>{i.result.createObjectStore("store")}}),Io=t=>{let e=Date.now().toString();const n=new r.Subject,i=l=>{if(typeof l=="string"||typeof l=="object"){const u=typeof l=="object"?l.id:l;return t.manifest?.spineItems.find(d=>d.id===u)}return t.manifest?.spineItems[l]},o=async(l,u)=>{const d=i(l);if(!d)return new Response("Item not found",{status:404});const g=await(await De("prose-reader")).get(`${e}_${d.id}`);if(g)return new Response(g,{status:200});const m=u&&await u(d)||await fetch(d.href);return s(d,m.clone()),m},s=(l,u)=>{n.next({id:l,data:u})};n.asObservable().pipe(I.mergeMap(({id:l,data:u})=>{const d=i(l);return d?r.from(r.forkJoin([De("prose-reader"),r.from(u.blob())])).pipe(I.switchMap(([p,g])=>r.from(p.put(`${e}_${d.id}`,g))),I.catchError(p=>(F.error(p),r.EMPTY))):r.EMPTY}),I.takeUntil(t.destroy$)).subscribe();const a=t.manifest$.pipe(I.tap(()=>{e=Date.now().toString()}));return r.merge(a).pipe(I.switchMap(()=>(F.debug("Cleanup up old cache..."),r.from(De("prose-reader")).pipe(I.switchMap(l=>r.from(l.keys()).pipe(I.map(u=>u.filter(d=>!d.toString().startsWith(e))),I.switchMap(u=>{const d=u.map(p=>l.remove(p));return r.from(Promise.all(d))}))),I.catchError(l=>(F.error(l),r.EMPTY))))),I.takeUntil(t.destroy$)).subscribe(),{get:o,destroy:()=>{n.complete()}}},vo=t=>e=>{const n=t(e),i=Io(n.context);return{...n,destroy:()=>{i.destroy(),n.destroy()}}},wo=(t,e)=>{const n=t.node.ownerDocument?.createRange(),i=t.node.compareDocumentPosition(e.node);if(n){try{if(i&Node.DOCUMENT_POSITION_PRECEDING)n.setStart(e.node,e.offset||0),n.setEnd(t.node,t.offset||0);else if(i&Node.DOCUMENT_POSITION_FOLLOWING)n.setStart(t.node,t.offset||0),n.setEnd(e.node,e.offset||0);else{const o=Math.min(t.offset||0,e.offset||0),s=Math.max(t.offset||0,e.offset||0);n.setStart(t.node,o),n.setEnd(t.node,s)}}catch(o){F.warn("Failed to create range from selection",o,{anchor:t,focus:e})}return n}},Po=({selection:t,spineItem:e})=>{const{anchorNode:n,anchorOffset:i,focusNode:o,focusOffset:s}=t;if(!(!n||!o))try{return wo({node:n,offset:i},{node:o,offset:s})}catch(a){F.warn("Failed to create range from selection",a,{selection:t,spineItem:e});return}};class To extends D{constructor(e){super();const n=e.contentDocument||e.contentWindow?.document;if(!n)this.selectionChange$=r.NEVER,this.selectionOver$=r.NEVER;else{const i=Me(n.body,{childList:!0,subtree:!0}).pipe(r.filter(s=>!!s.find(a=>a.type==="childList"&&a.removedNodes.length))),o=e.parentElement?Me(e.parentElement,{childList:!0}).pipe(r.filter(s=>!!s.find(a=>Array.from(a.removedNodes).includes(e)))):r.of(null);this.selectionChange$=r.merge(r.fromEvent(n,"selectionchange"),i).pipe(r.map(()=>n.getSelection()),r.takeUntil(r.merge(o,this.destroy$)),r.endWith(null)),this.selectionOver$=r.fromEvent(n,"pointerdown").pipe(r.switchMap(()=>r.merge(r.fromEvent(n,"pointerup"),r.fromEvent(n,"pointercancel"),r.fromEvent(n,"contextmenu")).pipe(r.first(),r.delay(0),r.map(s=>{const a=n.getSelection();return a&&!a.isCollapsed?[s,a]:void 0}),r.filter(z))),r.takeUntil(r.merge(o,this.destroy$)))}}}const Mo=t=>t.watch("isLoaded").pipe(r.switchMap(()=>{const e=t.renderer.getDocumentFrame(),n=e?.contentDocument||e?.contentWindow?.document;if(!e||!n)return r.NEVER;const i=new To(e);return r.merge(i.selectionChange$.pipe(r.map(o=>{if(o?.toString())return{type:"change",selection:o}})),i.selectionOver$.pipe(r.map(([o,s])=>({type:"over",event:o,selection:s})))).pipe(r.takeUntil(t.unloaded$),r.endWith(void 0),r.finalize(()=>{i.destroy()}))}),r.distinctUntilChanged()),$o=t=>e=>{const n=t(e);let i;const o=n.spineItemsManager.items$.pipe(r.switchMap(d=>{const p=d.map(g=>{const m=n.spineItemsManager.getSpineItemIndex(g)??0;return Mo(g).pipe(r.map(h=>{if(h)return{...h,itemIndex:m}}))});return r.merge(...p)}),r.startWith(void 0),r.distinctUntilChanged(),r.tap(d=>{i=d}),r.shareReplay({refCount:!0,bufferSize:1})),s=o,a=o.pipe(r.map(d=>!!d),r.distinctUntilChanged(),r.filter(d=>d),r.share()),c=a.pipe(r.switchMap(()=>s),r.distinctUntilChanged(),r.filter(d=>!d),r.share()),l=o.pipe(r.filter(d=>d?.type==="over"),r.share()),u=n.context.watch("rootElement").pipe(r.filter(z),r.switchMap(d=>r.fromEvent(d,"pointerdown")),r.withLatestFrom(s),r.map(([,d])=>d),r.startWith(void 0),r.shareReplay({refCount:!0,bufferSize:1}));return r.merge(s,u).pipe(r.takeUntil(n.$.destroy$)).subscribe(),{...n,selection:{selection$:s,selectionStart$:a,selectionEnd$:c,selectionOver$:l,lastSelectionOnPointerdown$:u,getSelection:()=>i,createOrderedRangeFromSelection:Po}}},Dt=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],Co=t=>e=>{const n=t(e),i=new r.BehaviorSubject(e.theme??"bright"),o=()=>{const c=Dt.find(l=>l.name===i.value);return`
|
|
180
180
|
body {
|
|
181
181
|
${c!==void 0?`background-color: ${c.backgroundColor} !important;`:""}
|
|
182
182
|
}
|
|
@@ -186,19 +186,19 @@
|
|
|
186
186
|
color: ${c.foregroundColor};
|
|
187
187
|
}
|
|
188
188
|
`:""}
|
|
189
|
-
`},s=({container:c})=>{const l=Dt.find(u=>u.name===i.value);return l&&P(c.style,"background-color",l.backgroundColor),()=>{}},a=()=>{n.spineItemsManager.items.forEach(c=>{const l=c.renderer.getDocumentFrame();l&&z(l,"prose-reader-theme",o()),s({container:c.element})})};return n.hookManager.register("item.onDocumentLoad",async({itemId:c})=>{const l=n.spineItemsManager.get(c);if(l?.renditionLayout!=="pre-paginated"){const u=l?.renderer.getDocumentFrame();u&&z(u,"prose-reader-theme",o())}}),n.spineItemsManager.items$.pipe(I.tap(c=>c.map(({element:l})=>s({container:l}))),I.takeUntil(n.$.destroy$)).subscribe(),i.pipe(I.tap(()=>{a()}),I.takeUntil(n.$.destroy$)).subscribe(),{...n,theme:{set:c=>{c!==i.value&&i.next(c)},get:()=>i.value,$:{theme$:i.asObservable()}}}},Fo=t=>e=>{const n=t(e);return{...n,utils:{isOrIsWithinValidLink:s=>!!(Se(s)&&(s.nodeName==="a"?s:s.closest("a"))?.getAttribute("href")),injectScopedCSS:(s,a,c)=>{const l=c.replace("${id}",n.id);return ne(s,`${a}-${n.id}`,l)}}}};navigator.userAgent.indexOf("")>-1&&navigator.userAgent.indexOf("Chrome")<=-1;const Eo=t=>e=>t(e),Ot=(t,e,n)=>{const{clientWidth:i,clientHeight:o}=n.value.element,s={maxX:0,minX:i*(1-e),maxY:0,minY:o*(1-e)};return{x:Math.min(Math.max(t.x,s.minX),s.maxX),y:Math.min(Math.max(t.y,s.minY),s.maxY)}},Lo=(t,e,n)=>{P(n.style,"transform-origin","0 0");const i=`translate3d(${e.x}px, ${e.y}px, 0px)`,o=`scale(${t})`;P(n.style,"transform",`${i} ${o}`)},Ao=(t,e,n,i)=>{const o=e/t,s=n.clientWidth,a=n.clientHeight,c=s/2-i.x,l=a/2-i.y;return{x:i.x+c*(1-o),y:i.y+l*(1-o)}};class Vt{constructor(e){this.x=e.x,this.y=e.y}}class Oe extends Vt{}class kt extends Vt{constructor(){super(...arguments),this.__symbol=Symbol("UnboundScrollPosition")}}class Ut extends _{constructor(e,n,i,o,s){super({element:void 0}),this.viewport=e,this.settings=n,this.hookManager=i,this.spine=o,this.context=s,this.navigateSubject=new r.Subject,this.scrollingSubject=new r.BehaviorSubject(!1),this.applyNavigationPosition=({position:p})=>{const g=this.value.element;if(!g)return;const m=this.fromSpinePosition(p);Math.round(m.x)===g.scrollLeft&&Math.round(m.y)===g.scrollTop||(this.scrollingSubject.next(!0),g.scrollTo({left:m.x,top:m.y,behavior:"instant"}),r.timer(1).pipe(r.tap(()=>{this.scrollingSubject.next(!1)}),r.takeUntil(r.merge(this.scrollingSubject.pipe(r.skip(1)),this.destroy$))).subscribe(),this.hookManager.execute("onViewportOffsetAdjust",void 0))},this.isActive=()=>this.settings.values.computedPageTurnMode==="scrollable",this.getNavigationVisibleArea=()=>this.viewport.relativeViewport;const a=this.context.pipe(oe(["rootElement"]),r.tap(({rootElement:p})=>{if(!p)return;const g=document.createElement("div");g.setAttribute(`data-${ht}`,""),g.appendChild(this.viewport.value.element),p.appendChild(g),this.update({element:g})})),c=r.combineLatest([n.watch(["computedPageTurnMode"]),this.watch("element")]).pipe(r.tap(([{computedPageTurnMode:p},g])=>{g&&(p==="scrollable"?P(g.style,"display","block"):P(g.style,"display","contents"))})),l=this.navigateSubject.pipe(r.tap(this.applyNavigationPosition));this.isNavigating$=this.scrollingSubject.asObservable();const u=r.merge(o.element$.pipe(r.filter(W),r.switchMap(p=>re(p))),o.element$.pipe(r.filter(W),r.switchMap(p=>r.fromEvent(p,"scroll"))),o.spineItemsObserver.itemResize$).pipe(r.switchMap(()=>r.timer(10).pipe(r.map(()=>!1),r.startWith(!0))),r.distinctUntilChanged(),r.startWith(!1)),d=r.combineLatest([u,this.isNavigating$]).pipe(r.map(([p,g])=>p||g),r.shareReplay(1));this.userScroll$=this.watch("element").pipe(r.filter(W),r.switchMap(p=>n.watch(["computedPageTurnMode"]).pipe(r.switchMap(({computedPageTurnMode:g})=>g==="controlled"?r.NEVER:r.fromEvent(p,"scroll").pipe(r.withLatestFrom(d),r.filter(([,m])=>!m),r.map(([m])=>m))))),r.share()),r.merge(a,c,l).pipe(r.takeUntil(this.destroy$)).subscribe()}update(e){this.mergeCompare(e)}navigate(e){this.navigateSubject.next(e)}fromScrollPosition(e){const n=this.viewport.scaleFactor;return new A({x:e.x/n,y:e.y/n})}fromSpinePosition(e){const n=this.viewport.scaleFactor;return new Oe({x:e.x*n,y:e.y*n})}get scrollPosition(){const e=this.value.element;return new Oe({x:e?.scrollLeft??0,y:e?.scrollTop??0})}}const Ro=(t,e,n,i,o)=>{const s=t.clientWidth,a=t.clientHeight,c=t.scrollLeft,l=t.scrollTop,u=c+s/2-i,d=l+a/2-o,p=n/e,g=u*p,m=d*p,h=g-s/2+i,f=m-a/2+o;return new kt({x:h,y:f})},No=(t,e)=>{const n=e.viewport,i=e.navigation.scrollNavigationController,o=n.value.element,s=i.value.element,a=i.value.element,c=Math.round(n.scaleFactor*100)/100,l=o.offsetLeft,u=o.offsetTop,d=Ro(s??Cn(),c,t,l,u),p=t<1?"down":"up";a&&U(a,`data-${N}-zooming-direction`,p),t<1?P(o.style,"transform-origin","top"):t>1&&P(o.style,"transform-origin",`${l}px ${u}px`),P(o.style,"transform",`scale(${t})`);const g=i.fromScrollPosition(d);e.navigation.navigate({position:g})},de=200;class Do extends _{constructor(e){super({isZooming:!1,currentScale:1,currentPosition:{x:0,y:0}}),this.reader=e,this.enterSubject=new r.Subject,this.exitSubject=new r.Subject;const n=this.enterSubject.pipe(r.switchMap(o=>{const{scale:s=1,animate:a=!1}=o??{},c=this.reader.viewport.value.element;U(this.viewport.element,`data-${N}-zooming`,"true");const l=this.scrollNavigationController.value.element;return l&&U(l,`data-${N}-zooming`,this.isControlled?"false":"true"),a&&this.isControlled&&P(c.style,"transition",`transform ${de}ms`),this.mergeCompare({isZooming:!0,currentScale:1,currentPosition:{x:0,y:0}}),this.updateZoom(s),s!==1&&this.isControlled?r.timer(o?.animate?de:0).pipe(r.tap(()=>{this.reader.layout()})):r.EMPTY})),i=this.exitSubject.pipe(r.switchMap(o=>{const s=this.reader.viewport.value.element;U(this.viewport.element,`data-${N}-zooming`,"false");const a=this.scrollNavigationController.value.element;return a&&(ge(a,`data-${N}-zooming-direction`),U(a,`data-${N}-zooming`,"false")),o?.animate&&this.isControlled&&P(s.style,"transition",`transform ${de}ms`),this.updateZoom(1,{x:0,y:0}),V(s.style,"transform"),this.mergeCompare({isZooming:!1}),r.timer(o?.animate?de:0).pipe(r.tap(()=>{const c=this.reader.viewport.value.element;V(c.style,"transform-origin"),V(c.style,"transition"),this.isControlled&&this.reader.layout()}),r.takeUntil(this.enterSubject))}));r.merge(n,i).pipe(r.takeUntil(this.destroy$)).subscribe()}enter(e){this.enterSubject.next(e)}exit(e){this.exitSubject.next(e)}move(e,n){this.isControlled&&(V(this.viewport.element.style,"transition"),this.updateZoom(this.value.currentScale,e,{constraints:n?.constrain==="within-viewport"?(...i)=>Ot(...i,this.reader.viewport):void 0}))}scaleAt(e,n){if(!this.value.isZooming)return;V(this.viewport.element.style,"transition");const o=Math.ceil(e*100)/100;this.updateZoom(o,void 0,{constraints:n?.constrain==="within-viewport"?(...s)=>Ot(...s,this.reader.viewport):void 0})}updateZoom(e,n,i){if(this.isControlled){const o=n||Ao(this.value.currentScale,e,this.viewport.element,this.value.currentPosition),s=i?.constraints?.(o,e)??o;return this.applyZoom(e,s),this.mergeCompare({currentScale:e,currentPosition:s})}this.applyZoom(e,n??this.value.currentPosition),this.mergeCompare({currentScale:e})}applyZoom(e,n){this.isControlled?Lo(e,n,this.viewport.element):No(e,this.reader),this.reader.viewport.layout()}get isControlled(){return this.reader.settings.values.computedPageTurnMode==="controlled"}get scrollNavigationController(){return this.reader.navigation.scrollNavigationController}get viewport(){return this.reader.viewport.value}}const Oo=t=>e=>{const n=t(e),i=new Do(n),o=()=>{i.destroy(),n.destroy()},s=i;return{...n,destroy:o,zoom:{enter:i.enter.bind(i),scaleAt:i.scaleAt.bind(i),move:i.move.bind(i),exit:i.exit.bind(i),state$:s,get state(){return i.value}}}},Ve=t=>X.generate({spineIndex:t.index,spineId:t.id}),_t=({nodeOrRange:t,offset:e,item:n})=>{const i="ownerDocument"in t?t.ownerDocument:t.startContainer.ownerDocument;return!i?.documentElement||t===i?Ve(n):En(t)?X.generate({start:{node:t.startContainer,offset:t.startOffset,spineIndex:n.index,spineId:n.id},end:{node:t.endContainer,offset:t.endOffset,spineIndex:n.index,spineId:n.id}}):X.generate({node:t,offset:e,spineIndex:n.index,spineId:n.id})},Wt=({spineItem:t,pageNode:e})=>_t({nodeOrRange:e.node,offset:e.offset,item:t}).trim(),zt=(t,e)=>_t({nodeOrRange:t,item:e}),Vo=t=>t.index.toString(),Bt=t=>t[0]?.index===6&&t.length>1,Ht=t=>{const e=X.parse(t);return X.isIndirectionOnly(e)},ko=t=>Array.isArray(t)?t[0]&&Bt(t[0])?t[0]:void 0:t.parent[0]&&Bt(t.parent[0])?t.parent[0]:void 0,ke=t=>{const e=X.parse(t),s=((ko(e)??[])[1]?.index??2)/2-1,a=X.isParsedCfiRange(e),c=a?e.end.at(-1)?.at(-1)?.offset:e.at(-1)?.at(-1)?.offset;return{isCfiRange:a,itemIndex:s,offset:c??0}},xt=({cfi:t,spineItemsManager:e})=>{const{itemIndex:n,...i}=ke(t),o=e.get(n);if(!o)return{...i,itemIndex:n,node:null};const s=o.renderer.getDocumentFrame();if(s instanceof HTMLIFrameElement){const a=s.contentWindow?.document;if(a)try{const c=X.resolve(t,a,{throwOnError:!0});return{...i,itemIndex:n,node:c.isRange?c.node?.startContainer??null:c.node??null,isCfiRange:c.isRange,range:c.isRange?c.node:void 0,offset:Array.isArray(c.offset)?c.offset.at(-1):c.offset,spineItem:o}}catch(c){return F.warn(`Error resolving cfi: ${t}.`),F.warn(c),{...i,spineItem:o,itemIndex:n,node:null}}}return{...i,itemIndex:n,spineItem:o,node:null}};class qt{constructor(e,n){this.hookManager=e,this.spineItemsManager=n,this.transformForResolve=i=>{const{finalParams:o}=this.hookManager.executeSequential("cfi.beforeResolve",{cfi:i},(s,a)=>({cfi:a??s.cfi}));return o.cfi},this.parseCfi=i=>ke(this.transformForResolve(i)),this.getSpineItemFromCfi=i=>{const{itemIndex:o}=this.parseCfi(i);if(o!==void 0)return this.spineItemsManager.get(o)},this.isRootCfi=i=>Ht(i),this.generateRootCfi=i=>this.transformGeneratedCfi({cfi:Ve(i),spineItem:i}),this.generateCfiForSpineItemPage=({spineItem:i,pageNode:o})=>this.transformGeneratedCfi({cfi:Wt({spineItem:i,pageNode:o}),spineItem:i}),this.generateCfiFromRange=(i,o)=>this.transformGeneratedCfi({cfi:zt(i,o),spineItem:o}),this.resolveCfi=i=>xt({...i,cfi:this.transformForResolve(i.cfi),spineItemsManager:this.spineItemsManager})}transformGeneratedCfi(e){const{finalParams:n}=this.hookManager.executeSequential("cfi.afterGenerate",e,(i,o)=>({...i,cfi:o??i.cfi}));return n.cfi}}const Yt=t=>t?.spineItems.every(e=>(e.renditionLayout??t.renditionLayout)==="pre-paginated");class Uo{constructor(){this.navigationSubject=new r.ReplaySubject(1),this.positionSubject=new r.ReplaySubject(1),this.viewportStateSubject=new r.BehaviorSubject("free"),this.paginationSubject=new r.ReplaySubject(1),this.pagination$=this.paginationSubject.asObservable(),this.viewportState$=this.viewportStateSubject.asObservable(),this.viewportFree$=this.viewportState$.pipe(r.filter(e=>e==="free")),this.viewportBusy$=this.viewportState$.pipe(r.filter(e=>e==="busy")),this.navigation$=this.navigationSubject.asObservable(),this.position$=this.positionSubject.asObservable()}}class Xt extends _{constructor(){super({assumedRenditionLayout:"reflowable"}),this.bridgeEvent=new Uo,this.manifest$=this.pipe(I.map(e=>e.manifest),I.filter(W),I.distinctUntilChanged()),this.isRTL=()=>this.value.manifest?.readingDirection==="rtl"}update(e){const n=this.value,i=e.manifest??n.manifest,o={...n,...e,...e.manifest&&{isFullyPrePaginated:Yt(i),assumedRenditionLayout:i?.renditionLayout??"reflowable"}};this.mergeCompare(o)}get manifest(){return this.value.manifest}get readingDirection(){return this.manifest?.readingDirection}}class Gt extends _{constructor(e,n){super({supportedPageTurnAnimation:["fade","none","slide"],supportedPageTurnMode:["controlled","scrollable"],supportedPageTurnDirection:["horizontal","vertical"],supportedComputedPageTurnDirection:["horizontal","vertical"]}),r.combineLatest([e.watch(["manifest","hasVerticalWriting"]),n.watch(["computedPageTurnMode"])]).pipe(r.map(([{manifest:i,hasVerticalWriting:o},{computedPageTurnMode:s}])=>({hasVerticalWriting:o,renditionFlow:i?.renditionFlow,renditionLayout:i?.renditionLayout,computedPageTurnMode:s})),r.distinctUntilChanged(C.isShallowEqual),r.map(({hasVerticalWriting:i,renditionFlow:o,renditionLayout:s,computedPageTurnMode:a})=>({...this.value,supportedPageTurnMode:o==="scrolled-continuous"?["scrollable"]:["controlled","scrollable"],supportedPageTurnAnimation:o==="scrolled-continuous"||a==="scrollable"?["none"]:i?["fade","none"]:["fade","none","slide"],supportedPageTurnDirection:a==="scrollable"?["vertical"]:s==="reflowable"?["horizontal"]:["horizontal","vertical"]})),r.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}}class Zt{constructor(){this._hooks=[],this._hookExecutions=[]}getHooks(e){return this._hooks.filter(n=>e===n.name)}deregister(e){return this._hooks=this._hooks.filter(n=>n!==e),this.destroy(e.name,void 0,e)}register(e,n){const o={name:e,runFn:n};return this._hooks.push(o),()=>{this.deregister(o)}}execute(e,n){return this.getHooks(e).map(i=>i.runFn(n))}async executeAsync(e,n,i,o){const s=this.getHooks(e);if(s.length===0)return Promise.resolve([]);const a=s.map(d=>{const p=new AbortController;return{name:e,id:n,ref:d,abortController:p,destroyFn:()=>(p.abort(),r.of(void 0))}});this._hookExecutions.push(...a);const c=d=>{this._hookExecutions=this._hookExecutions.filter(p=>p!==d)},l=()=>{for(const d of a)this._hookExecutions.includes(d)&&(d.abortController.abort(),c(d))};o?.aborted?l():o?.addEventListener("abort",l,{once:!0});const u=a.map(async d=>{const p={...i,signal:d.abortController.signal};try{return await Promise.resolve(),await d.ref.runFn(p)}finally{c(d)}});try{return await Promise.all(u)}finally{o?.removeEventListener("abort",l)}}fromExecuteAsync(e,n,i){return new r.Observable(o=>{const s=new AbortController;return this.executeAsync(e,n,i,s.signal).then(a=>{o.next(a),o.complete()},a=>o.error(a)),()=>{s.abort()}})}executeSequential(e,n,i){let o=n;const s=this.getHooks(e).map(a=>{const c=a.runFn(o);return o=i(o,c),c});return{finalParams:o,results:s}}destroy(e,n,i){const o=this._hookExecutions.filter(a=>i&&a.ref===i||e===a.name&&(!n||n&&n===a.id));this._hookExecutions=this._hookExecutions.filter(a=>!o.includes(a));const s=o.map(({destroyFn:a})=>a());return r.combineLatest(s)}}const _o="[data-prose-reader-spine-item][data-is-ready=false]{pointer-events:none;user-select:none;-webkit-user-select:none}.prose-reader-enhancer-loading-container{height:100%;width:100%;max-width:var(--prose-reader-absolute-viewport-width, 100%);text-align:center;display:flex;justify-content:center;align-items:center;flex-direction:column;position:absolute;left:0;top:0;color:#cacaca;background-color:#fff;z-index:1}[data-prose-reader-spine-item][data-is-ready=true] .prose-reader-enhancer-loading-container{visibility:hidden;z-index:0}.prose-reader-enhancer-loading-logo{font-size:4em}.prose-reader-enhancer-loading-details{font-size:1.2em;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:300px;width:80%}[data-prose-reader-scroll-navigator][data-prose-reader-zooming=true]{overflow:scroll}[data-prose-reader-scroll-navigator][data-prose-reader-zooming=true][data-prose-reader-zooming-direction=down]{overflow-x:auto}[data-prose-reader-scroll-navigator]{height:100%;width:100%;position:relative;overflow-y:scroll;overflow-x:hidden}[data-prose-reader-viewport]{background-color:#fff;position:relative;height:100%;width:100%}",Wo=t=>({x:-t.x,y:-t.y}),zo=t=>t instanceof DOMMatrix?new R({x:-t.e,y:-t.f}):new R({x:-t.x,y:-t.y}),Jt=F.namespace("navigation/ControlledNavigationController");class Kt extends D{constructor(e,n,i,o,s){super(),this.settings=e,this.hookManager=n,this.context=i,this.spine=o,this.viewport=s,this.navigateSubject=new r.Subject,this.element$=new r.BehaviorSubject(document.createElement("div")),this.isActive=()=>this.settings.values.computedPageTurnMode==="controlled",this.getNavigationVisibleArea=()=>this.viewport.absoluteViewport;const a=this.spine.element$.pipe(r.filter(W),r.withLatestFrom(this.element$),r.tap(([u,d])=>{d.style.cssText=`
|
|
189
|
+
`},s=({container:c})=>{const l=Dt.find(u=>u.name===i.value);return l&&P(c.style,"background-color",l.backgroundColor),()=>{}},a=()=>{n.spineItemsManager.items.forEach(c=>{const l=c.renderer.getDocumentFrame();l&&B(l,"prose-reader-theme",o()),s({container:c.element})})};return n.hookManager.register("item.onDocumentLoad",async({itemId:c})=>{const l=n.spineItemsManager.get(c);if(l?.renditionLayout!=="pre-paginated"){const u=l?.renderer.getDocumentFrame();u&&B(u,"prose-reader-theme",o())}}),n.spineItemsManager.items$.pipe(I.tap(c=>c.map(({element:l})=>s({container:l}))),I.takeUntil(n.$.destroy$)).subscribe(),i.pipe(I.tap(()=>{a()}),I.takeUntil(n.$.destroy$)).subscribe(),{...n,theme:{set:c=>{c!==i.value&&i.next(c)},get:()=>i.value,$:{theme$:i.asObservable()}}}},Fo=t=>e=>{const n=t(e);return{...n,utils:{isOrIsWithinValidLink:s=>!!(Se(s)&&(s.nodeName==="a"?s:s.closest("a"))?.getAttribute("href")),injectScopedCSS:(s,a,c)=>{const l=c.replace("${id}",n.id);return ne(s,`${a}-${n.id}`,l)}}}};navigator.userAgent.indexOf("")>-1&&navigator.userAgent.indexOf("Chrome")<=-1;const Eo=t=>e=>t(e),Ot=(t,e,n)=>{const{clientWidth:i,clientHeight:o}=n.value.element,s={maxX:0,minX:i*(1-e),maxY:0,minY:o*(1-e)};return{x:Math.min(Math.max(t.x,s.minX),s.maxX),y:Math.min(Math.max(t.y,s.minY),s.maxY)}},Lo=(t,e,n)=>{P(n.style,"transform-origin","0 0");const i=`translate3d(${e.x}px, ${e.y}px, 0px)`,o=`scale(${t})`;P(n.style,"transform",`${i} ${o}`)},Ao=(t,e,n,i)=>{const o=e/t,s=n.clientWidth,a=n.clientHeight,c=s/2-i.x,l=a/2-i.y;return{x:i.x+c*(1-o),y:i.y+l*(1-o)}};class Vt{constructor(e){this.x=e.x,this.y=e.y}}class Oe extends Vt{}class kt extends Vt{constructor(){super(...arguments),this.__symbol=Symbol("UnboundScrollPosition")}}class Ut extends W{constructor(e,n,i,o,s){super({element:void 0}),this.viewport=e,this.settings=n,this.hookManager=i,this.spine=o,this.context=s,this.navigateSubject=new r.Subject,this.scrollingSubject=new r.BehaviorSubject(!1),this.applyNavigationPosition=({position:p})=>{const g=this.value.element;if(!g)return;const m=this.fromSpinePosition(p);Math.round(m.x)===g.scrollLeft&&Math.round(m.y)===g.scrollTop||(this.scrollingSubject.next(!0),g.scrollTo({left:m.x,top:m.y,behavior:"instant"}),r.timer(1).pipe(r.tap(()=>{this.scrollingSubject.next(!1)}),r.takeUntil(r.merge(this.scrollingSubject.pipe(r.skip(1)),this.destroy$))).subscribe(),this.hookManager.execute("onViewportOffsetAdjust",void 0))},this.isActive=()=>this.settings.values.computedPageTurnMode==="scrollable",this.getNavigationVisibleArea=()=>this.viewport.relativeViewport;const a=this.context.pipe(oe(["rootElement"]),r.tap(({rootElement:p})=>{if(!p)return;const g=document.createElement("div");g.setAttribute(`data-${ht}`,""),g.appendChild(this.viewport.value.element),p.appendChild(g),this.update({element:g})})),c=r.combineLatest([n.watch(["computedPageTurnMode"]),this.watch("element")]).pipe(r.tap(([{computedPageTurnMode:p},g])=>{g&&(p==="scrollable"?P(g.style,"display","block"):P(g.style,"display","contents"))})),l=this.navigateSubject.pipe(r.tap(this.applyNavigationPosition));this.isNavigating$=this.scrollingSubject.asObservable();const u=r.merge(o.element$.pipe(r.filter(z),r.switchMap(p=>re(p))),o.element$.pipe(r.filter(z),r.switchMap(p=>r.fromEvent(p,"scroll"))),o.spineItemsObserver.itemResize$).pipe(r.switchMap(()=>r.timer(10).pipe(r.map(()=>!1),r.startWith(!0))),r.distinctUntilChanged(),r.startWith(!1)),d=r.combineLatest([u,this.isNavigating$]).pipe(r.map(([p,g])=>p||g),r.shareReplay(1));this.userScroll$=this.watch("element").pipe(r.filter(z),r.switchMap(p=>n.watch(["computedPageTurnMode"]).pipe(r.switchMap(({computedPageTurnMode:g})=>g==="controlled"?r.NEVER:r.fromEvent(p,"scroll").pipe(r.withLatestFrom(d),r.filter(([,m])=>!m),r.map(([m])=>m))))),r.share()),r.merge(a,c,l).pipe(r.takeUntil(this.destroy$)).subscribe()}update(e){this.mergeCompare(e)}navigate(e){this.navigateSubject.next(e)}fromScrollPosition(e){const n=this.viewport.scaleFactor;return new A({x:e.x/n,y:e.y/n})}fromSpinePosition(e){const n=this.viewport.scaleFactor;return new Oe({x:e.x*n,y:e.y*n})}get scrollPosition(){const e=this.value.element;return new Oe({x:e?.scrollLeft??0,y:e?.scrollTop??0})}}const No=(t,e,n,i,o)=>{const s=t.clientWidth,a=t.clientHeight,c=t.scrollLeft,l=t.scrollTop,u=c+s/2-i,d=l+a/2-o,p=n/e,g=u*p,m=d*p,h=g-s/2+i,f=m-a/2+o;return new kt({x:h,y:f})},Ro=(t,e)=>{const n=e.viewport,i=e.navigation.scrollNavigationController,o=n.value.element,s=i.value.element,a=i.value.element,c=Math.round(n.scaleFactor*100)/100,l=o.offsetLeft,u=o.offsetTop,d=No(s??Cn(),c,t,l,u),p=t<1?"down":"up";a&&_(a,`data-${R}-zooming-direction`,p),t<1?P(o.style,"transform-origin","top"):t>1&&P(o.style,"transform-origin",`${l}px ${u}px`),P(o.style,"transform",`scale(${t})`);const g=i.fromScrollPosition(d);e.navigation.navigate({position:g})},de=200;class Do extends W{constructor(e){super({isZooming:!1,currentScale:1,currentPosition:{x:0,y:0}}),this.reader=e,this.enterSubject=new r.Subject,this.exitSubject=new r.Subject;const n=this.enterSubject.pipe(r.switchMap(o=>{const{scale:s=1,animate:a=!1}=o??{},c=this.reader.viewport.value.element;_(this.viewport.element,`data-${R}-zooming`,"true");const l=this.scrollNavigationController.value.element;return l&&_(l,`data-${R}-zooming`,this.isControlled?"false":"true"),a&&this.isControlled&&P(c.style,"transition",`transform ${de}ms`),this.mergeCompare({isZooming:!0,currentScale:1,currentPosition:{x:0,y:0}}),this.updateZoom(s),s!==1&&this.isControlled?r.timer(o?.animate?de:0).pipe(r.tap(()=>{this.reader.layout()})):r.EMPTY})),i=this.exitSubject.pipe(r.switchMap(o=>{const s=this.reader.viewport.value.element;_(this.viewport.element,`data-${R}-zooming`,"false");const a=this.scrollNavigationController.value.element;return a&&(ge(a,`data-${R}-zooming-direction`),_(a,`data-${R}-zooming`,"false")),o?.animate&&this.isControlled&&P(s.style,"transition",`transform ${de}ms`),this.updateZoom(1,{x:0,y:0}),V(s.style,"transform"),this.mergeCompare({isZooming:!1}),r.timer(o?.animate?de:0).pipe(r.tap(()=>{const c=this.reader.viewport.value.element;V(c.style,"transform-origin"),V(c.style,"transition"),this.isControlled&&this.reader.layout()}),r.takeUntil(this.enterSubject))}));r.merge(n,i).pipe(r.takeUntil(this.destroy$)).subscribe()}enter(e){this.enterSubject.next(e)}exit(e){this.exitSubject.next(e)}move(e,n){this.isControlled&&(V(this.viewport.element.style,"transition"),this.updateZoom(this.value.currentScale,e,{constraints:n?.constrain==="within-viewport"?(...i)=>Ot(...i,this.reader.viewport):void 0}))}scaleAt(e,n){if(!this.value.isZooming)return;V(this.viewport.element.style,"transition");const o=Math.ceil(e*100)/100;this.updateZoom(o,void 0,{constraints:n?.constrain==="within-viewport"?(...s)=>Ot(...s,this.reader.viewport):void 0})}updateZoom(e,n,i){if(this.isControlled){const o=n||Ao(this.value.currentScale,e,this.viewport.element,this.value.currentPosition),s=i?.constraints?.(o,e)??o;return this.applyZoom(e,s),this.mergeCompare({currentScale:e,currentPosition:s})}this.applyZoom(e,n??this.value.currentPosition),this.mergeCompare({currentScale:e})}applyZoom(e,n){this.isControlled?Lo(e,n,this.viewport.element):Ro(e,this.reader),this.reader.viewport.layout()}get isControlled(){return this.reader.settings.values.computedPageTurnMode==="controlled"}get scrollNavigationController(){return this.reader.navigation.scrollNavigationController}get viewport(){return this.reader.viewport.value}}const Oo=t=>e=>{const n=t(e),i=new Do(n),o=()=>{i.destroy(),n.destroy()},s=i;return{...n,destroy:o,zoom:{enter:i.enter.bind(i),scaleAt:i.scaleAt.bind(i),move:i.move.bind(i),exit:i.exit.bind(i),state$:s,get state(){return i.value}}}},Ve=t=>X.generate({spineIndex:t.index,spineId:t.id}),_t=({nodeOrRange:t,offset:e,item:n})=>{const i="ownerDocument"in t?t.ownerDocument:t.startContainer.ownerDocument;return!i?.documentElement||t===i?Ve(n):En(t)?X.generate({start:{node:t.startContainer,offset:t.startOffset,spineIndex:n.index,spineId:n.id},end:{node:t.endContainer,offset:t.endOffset,spineIndex:n.index,spineId:n.id}}):X.generate({node:t,offset:e,spineIndex:n.index,spineId:n.id})},Wt=({spineItem:t,pageNode:e})=>_t({nodeOrRange:e.node,offset:e.offset,item:t}).trim(),zt=(t,e)=>_t({nodeOrRange:t,item:e}),Vo=t=>t.index.toString(),Bt=t=>t[0]?.index===6&&t.length>1,Ht=t=>{const e=X.parse(t);return X.isIndirectionOnly(e)},ko=t=>Array.isArray(t)?t[0]&&Bt(t[0])?t[0]:void 0:t.parent[0]&&Bt(t.parent[0])?t.parent[0]:void 0,ke=t=>{const e=X.parse(t),s=((ko(e)??[])[1]?.index??2)/2-1,a=X.isParsedCfiRange(e),c=a?e.end.at(-1)?.at(-1)?.offset:e.at(-1)?.at(-1)?.offset;return{isCfiRange:a,itemIndex:s,offset:c??0}},xt=({cfi:t,spineItemsManager:e})=>{const{itemIndex:n,...i}=ke(t),o=e.get(n);if(!o)return{...i,itemIndex:n,node:null};const s=o.renderer.getDocumentFrame();if(s instanceof HTMLIFrameElement){const a=s.contentWindow?.document;if(a)try{const c=X.resolve(t,a,{throwOnError:!0});return{...i,itemIndex:n,node:c.isRange?c.node?.startContainer??null:c.node??null,isCfiRange:c.isRange,range:c.isRange?c.node:void 0,offset:Array.isArray(c.offset)?c.offset.at(-1):c.offset,spineItem:o}}catch(c){return F.warn(`Error resolving cfi: ${t}.`),F.warn(c),{...i,spineItem:o,itemIndex:n,node:null}}}return{...i,itemIndex:n,spineItem:o,node:null}};class qt{constructor(e,n){this.hookManager=e,this.spineItemsManager=n,this.transformForResolve=i=>{const{finalParams:o}=this.hookManager.executeSequential("cfi.beforeResolve",{cfi:i},(s,a)=>({cfi:a??s.cfi}));return o.cfi},this.parseCfi=i=>ke(this.transformForResolve(i)),this.getSpineItemFromCfi=i=>{const{itemIndex:o}=this.parseCfi(i);if(o!==void 0)return this.spineItemsManager.get(o)},this.isRootCfi=i=>Ht(i),this.generateRootCfi=i=>this.transformGeneratedCfi({cfi:Ve(i),spineItem:i}),this.generateCfiForSpineItemPage=({spineItem:i,pageNode:o})=>this.transformGeneratedCfi({cfi:Wt({spineItem:i,pageNode:o}),spineItem:i}),this.generateCfiFromRange=(i,o)=>this.transformGeneratedCfi({cfi:zt(i,o),spineItem:o}),this.resolveCfi=i=>xt({...i,cfi:this.transformForResolve(i.cfi),spineItemsManager:this.spineItemsManager})}transformGeneratedCfi(e){const{finalParams:n}=this.hookManager.executeSequential("cfi.afterGenerate",e,(i,o)=>({...i,cfi:o??i.cfi}));return n.cfi}}const Yt=t=>t?.spineItems.every(e=>(e.renditionLayout??t.renditionLayout)==="pre-paginated");class Uo{constructor(){this.navigationSubject=new r.ReplaySubject(1),this.positionSubject=new r.ReplaySubject(1),this.viewportStateSubject=new r.BehaviorSubject("free"),this.paginationSubject=new r.ReplaySubject(1),this.pagination$=this.paginationSubject.asObservable(),this.viewportState$=this.viewportStateSubject.asObservable(),this.viewportFree$=this.viewportState$.pipe(r.filter(e=>e==="free")),this.viewportBusy$=this.viewportState$.pipe(r.filter(e=>e==="busy")),this.navigation$=this.navigationSubject.asObservable(),this.position$=this.positionSubject.asObservable()}}class Xt extends W{constructor(){super({assumedRenditionLayout:"reflowable"}),this.bridgeEvent=new Uo,this.manifest$=this.pipe(I.map(e=>e.manifest),I.filter(z),I.distinctUntilChanged()),this.isRTL=()=>this.value.manifest?.readingDirection==="rtl"}update(e){const n=this.value,i=e.manifest??n.manifest,o={...n,...e,...e.manifest&&{isFullyPrePaginated:Yt(i),assumedRenditionLayout:i?.renditionLayout??"reflowable"}};this.mergeCompare(o)}get manifest(){return this.value.manifest}get readingDirection(){return this.manifest?.readingDirection}}class Gt extends W{constructor(e,n){super({supportedPageTurnAnimation:["fade","none","slide"],supportedPageTurnMode:["controlled","scrollable"],supportedPageTurnDirection:["horizontal","vertical"],supportedComputedPageTurnDirection:["horizontal","vertical"]}),r.combineLatest([e.watch(["manifest","hasVerticalWriting"]),n.watch(["computedPageTurnMode"])]).pipe(r.map(([{manifest:i,hasVerticalWriting:o},{computedPageTurnMode:s}])=>({hasVerticalWriting:o,renditionFlow:i?.renditionFlow,renditionLayout:i?.renditionLayout,computedPageTurnMode:s})),r.distinctUntilChanged(C.isShallowEqual),r.map(({hasVerticalWriting:i,renditionFlow:o,renditionLayout:s,computedPageTurnMode:a})=>({...this.value,supportedPageTurnMode:o==="scrolled-continuous"?["scrollable"]:["controlled","scrollable"],supportedPageTurnAnimation:o==="scrolled-continuous"||a==="scrollable"?["none"]:i?["fade","none"]:["fade","none","slide"],supportedPageTurnDirection:a==="scrollable"?["vertical"]:s==="reflowable"?["horizontal"]:["horizontal","vertical"]})),r.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}}class Zt{constructor(){this._hooks=[],this._hookExecutions=[]}getHooks(e){return this._hooks.filter(n=>e===n.name)}deregister(e){return this._hooks=this._hooks.filter(n=>n!==e),this.destroy(e.name,void 0,e)}register(e,n){const o={name:e,runFn:n};return this._hooks.push(o),()=>{this.deregister(o)}}execute(e,n){return this.getHooks(e).map(i=>i.runFn(n))}async executeAsync(e,n,i,o){const s=this.getHooks(e);if(s.length===0)return Promise.resolve([]);const a=s.map(d=>{const p=new AbortController;return{name:e,id:n,ref:d,abortController:p,destroyFn:()=>(p.abort(),r.of(void 0))}});this._hookExecutions.push(...a);const c=d=>{this._hookExecutions=this._hookExecutions.filter(p=>p!==d)},l=()=>{for(const d of a)this._hookExecutions.includes(d)&&(d.abortController.abort(),c(d))};o?.aborted?l():o?.addEventListener("abort",l,{once:!0});const u=a.map(async d=>{const p={...i,signal:d.abortController.signal};try{return await Promise.resolve(),await d.ref.runFn(p)}finally{c(d)}});try{return await Promise.all(u)}finally{o?.removeEventListener("abort",l)}}fromExecuteAsync(e,n,i){return new r.Observable(o=>{const s=new AbortController;return this.executeAsync(e,n,i,s.signal).then(a=>{o.next(a),o.complete()},a=>o.error(a)),()=>{s.abort()}})}executeSequential(e,n,i){let o=n;const s=this.getHooks(e).map(a=>{const c=a.runFn(o);return o=i(o,c),c});return{finalParams:o,results:s}}destroy(e,n,i){const o=this._hookExecutions.filter(a=>i&&a.ref===i||e===a.name&&(!n||n&&n===a.id));this._hookExecutions=this._hookExecutions.filter(a=>!o.includes(a));const s=o.map(({destroyFn:a})=>a());return r.combineLatest(s)}}const _o="[data-prose-reader-spine-item][data-is-ready=false]{pointer-events:none;user-select:none;-webkit-user-select:none}.prose-reader-enhancer-loading-container{height:100%;width:100%;max-width:var(--prose-reader-absolute-viewport-width, 100%);text-align:center;display:flex;justify-content:center;align-items:center;flex-direction:column;position:absolute;left:0;top:0;color:#cacaca;background-color:#fff;z-index:1}[data-prose-reader-spine-item][data-is-ready=true] .prose-reader-enhancer-loading-container{visibility:hidden;z-index:0}.prose-reader-enhancer-loading-logo{font-size:4em}.prose-reader-enhancer-loading-details{font-size:1.2em;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:300px;width:80%}[data-prose-reader-scroll-navigator][data-prose-reader-zooming=true]{overflow:scroll}[data-prose-reader-scroll-navigator][data-prose-reader-zooming=true][data-prose-reader-zooming-direction=down]{overflow-x:auto}[data-prose-reader-scroll-navigator]{height:100%;width:100%;position:relative;overflow-y:scroll;overflow-x:hidden}[data-prose-reader-viewport]{background-color:#fff;position:relative;height:100%;width:100%}",Wo=t=>({x:-t.x,y:-t.y}),zo=t=>t instanceof DOMMatrix?new N({x:-t.e,y:-t.f}):new N({x:-t.x,y:-t.y}),Jt=F.namespace("navigation/ControlledNavigationController");class Kt extends D{constructor(e,n,i,o,s){super(),this.settings=e,this.hookManager=n,this.context=i,this.spine=o,this.viewport=s,this.navigateSubject=new r.Subject,this.element$=new r.BehaviorSubject(document.createElement("div")),this.isActive=()=>this.settings.values.computedPageTurnMode==="controlled",this.getNavigationVisibleArea=()=>this.viewport.absoluteViewport;const a=this.spine.element$.pipe(r.filter(z),r.withLatestFrom(this.element$),r.tap(([u,d])=>{d.style.cssText=`
|
|
190
190
|
height: 100%;
|
|
191
191
|
width: 100%;
|
|
192
192
|
position: relative;
|
|
193
|
-
`,d.className=`${N}-controlled-navigator`,d.innerHTML="",d.appendChild(u),this.viewport.value.element.appendChild(d),this.element$.next(d)})),c=e.watch(["computedPageTurnDirection","computedPageTurnMode","numberOfAdjacentSpineItemToPreLoad"]),l=r.combineLatest([c,this.element$]).pipe(r.tap(([,u])=>{e.values.computedPageTurnMode==="scrollable"?P(u.style,"display","contents"):P(u.style,"display","block")}));this.layout$=l.pipe(r.tap(()=>{Jt.info("layout",e.values)}),r.share()),this.isNavigating$=this.navigateSubject.pipe(r.distinctUntilChanged((u,d)=>C.isShallowEqual(u.position,d.position)),r.map(({animation:u,position:d})=>(Jt.info("Navigation requested",{animation:u,position:d}),{type:"manualAdjust",shouldAnimate:!(!u||u==="turn"&&e.values.computedPageTurnAnimation==="none"),animation:u,position:d})),r.switchMap(u=>{const d=this.element$.getValue();return P(d.style,"transition","none"),P(d.style,"opacity","1"),r.merge(r.of(!0),r.of(null).pipe(r.mergeMap(()=>{if(u?.type!=="manualAdjust")return r.of(!1);const p=u.animation==="snap"?e.values.snapAnimationDuration:e.values.computedPageTurnAnimationDuration,g=u.animation==="snap"?"slide":e.values.computedPageTurnAnimation;return r.of(u).pipe(u.shouldAnimate?r.delay(1,r.animationFrameScheduler):r.identity,r.tap(m=>{const h=this.element$.getValue();m.shouldAnimate?g==="fade"?(P(h.style,"transition",`opacity ${p/2}ms`),P(h.style,"opacity","0")):(u.animation==="snap"||g==="slide")&&(P(h.style,"transition",`transform ${p}ms`),P(h.style,"opacity","1")):(P(h.style,"transition","none"),P(h.style,"opacity","1"))}),r.tap(m=>{g!=="fade"&&this.applyNavigationPosition(m.position)}),u.shouldAnimate?r.delay(p/2,r.animationFrameScheduler):r.identity,r.tap(m=>{const h=this.element$.getValue();g==="fade"&&(this.applyNavigationPosition(m.position),P(h.style,"opacity","1"))}),u.shouldAnimate?r.delay(p/2,r.animationFrameScheduler):r.identity,r.tap(m=>{g==="fade"&&this.applyNavigationPosition(m.position)}))}),r.map(()=>!1)))}),r.startWith(!1),r.shareReplay(1)),r.merge(a,this.isNavigating$,this.layout$).pipe(r.takeUntil(this.destroy$)).subscribe()}applyNavigationPosition(e){const n=this.element$.getValue(),i=Wo(e);P(n.style,"transform",`translate(${i.x}px, ${i.y}px)`),this.hookManager.execute("onViewportOffsetAdjust",void 0)}navigate(e){this.navigateSubject.next(e)}get viewportPosition(){const e=this.element$.getValue(),n=window.getComputedStyle(e),i=n.transform||n.webkitTransform;if(!i||i==="none")return new R({x:0,y:0});const o=new DOMMatrix(i);return zo(o)}}const Bo=()=>t=>t.pipe(r.map(({navigation:e,pagination:n,...i})=>({navigation:{...e,paginationBeginCfi:n.beginCfi},...i}))),Ho=(t,e,n)=>t.bridgeEvent.pagination$.pipe(r.withLatestFrom(e),r.filter(([i,o])=>i.navigationId===o.id),r.switchMap(([i,o])=>(n.spineItemsManager.get(o.spineItem)?.isReady$.pipe(r.first())??r.of(!1)).pipe(r.filter(a=>a),r.map(()=>({pagination:i,navigation:o})))),Bo(),r.distinctUntilChanged((i,o)=>i.navigation.paginationBeginCfi===o.navigation.paginationBeginCfi),r.map(({navigation:i})=>({...i,meta:{triggeredBy:"pagination"},requestedPosition:i.position}))),xo=({navigationResolver:t,getNavigationVisibleArea:e})=>n=>n.pipe(r.map(([i,o])=>{const s=i.position,a=s?e():void 0,c=s&&a?t.clampPositionInSpine(s,a):void 0,l={type:"api",meta:{triggeredBy:"user"},id:Symbol("user"),animation:"turn",...i,requestedPosition:s,requestedVisibleArea:a,position:c};return{previousNavigation:o,navigation:l}})),qo=({navigationResolver:t})=>e=>e.pipe(r.map(n=>{if(n.navigation.cfi){const i=t.getNavigationForCfi(n.navigation.cfi);if(i)return{...n,navigation:{...n.navigation,position:i}}}return n})),Yo=({navigation:t,previousNavigation:e,settings:n})=>t.directionFromLastNavigation?t.directionFromLastNavigation:t.url!==void 0||t.cfi!==void 0?"anchor":e.spineItem===void 0||t.spineItem||!t.position?"forward":n.values.computedPageTurnDirection==="vertical"?t.position.y>e.position.y||t.position.y===e.position.y&&e.directionFromLastNavigation!=="backward"?"forward":"backward":Math.abs(t.position.x)>Math.abs(e.position.x)||t.position.x===e.position.x&&e.directionFromLastNavigation!=="backward"?"forward":"backward",Xo=({context:t,settings:e})=>n=>n.pipe(r.map(({navigation:i,previousNavigation:o})=>{const s=Yo({navigation:i,previousNavigation:o,settings:e}),a={...i,directionFromLastNavigation:s};return{previousNavigation:o,navigation:a,direction:s}})),Go=({spineItemsManager:t,navigationResolver:e,settings:n,viewport:i})=>o=>o.pipe(r.map(({navigation:s,...a})=>{const c=t.get(s.spineItem);if(s.position)return n.values.computedPageTurnMode==="scrollable"?{navigation:{...s,position:s.position},...a}:{navigation:{...s,position:e.clampPositionInSpine(s.position,i.absoluteViewport)},...a};if(!c)return{navigation:{...s,position:a.previousNavigation.position},...a};const l=e.getNavigationForSpineIndexOrId(c),u=n.values.computedPageTurnMode==="scrollable"?new A({x:l.x+a.previousNavigation.position.x,y:l.y}):e.clampPositionInSpine(l,i.absoluteViewport);return{navigation:{...s,position:u},...a}})),Qt=({settings:t,spineItemsManager:e,navigationResolver:n,spineLocator:i,cfi:o})=>s=>{const a=c=>{const{position:l,spineItem:u,cfi:d,directionFromLastNavigation:p}=c,{navigationSnapThreshold:g,computedPageTurnMode:m}=t.values;if(u!==void 0){const h=e.get(u);if(h)return h}if(typeof u=="number")return u>e.items.length-1?e.get(e.items.length-1):e.get(0);if(d){const h=o.getSpineItemFromCfi(d);if(h)return h}if(l&&m==="controlled"){const{beginIndex:h,endIndex:f}=i.getVisibleSpineItemsFromPosition({position:l,threshold:g,restrictToScreen:!1})??{},y=(p==="forward"||p==="anchor"?f:h)??h,b=e.get(y);if(!b)return;const{endPageIndex:M,beginPageIndex:T}=i.getVisiblePagesFromViewportPosition({position:l,spineItem:b,threshold:g,restrictToScreen:!1})??{},w=(p==="forward"||p==="anchor"?M:T)??0,$=n.getNavigationForSpineItemPage({pageIndex:w,spineItemId:b}),v=i.getVisibleSpineItemsFromPosition({position:$,threshold:g,restrictToScreen:!1}),L=p==="forward"||p==="anchor"?v?.beginIndex:v?.endIndex;return e.get(L)}return l&&m==="scrollable"?i.getSpineItemFromPosition(l):e.get(0)};return s.pipe(r.map(({navigation:c,...l})=>{const u=a(c);return{navigation:{...c,spineItem:e.getSpineItemIndex(u)},...l}}))},jt=({spine:t})=>e=>e.pipe(r.switchMap(({navigation:n,...i})=>{const o=t.getSpineItemSpineLayoutInfo(n.spineItem),s=t.spineItemsManager.get(n.spineItem);return(s?.isReady$??r.of(!1)).pipe(r.first(),r.map(a=>({navigation:{...n,spineItemHeight:o?.height,spineItemWidth:o?.width,spineItemLeft:o.left,spineItemTop:o.top,spineItemIsUsingVerticalWriting:s?.isUsingVerticalWriting(),spineItemIsReady:a},...i})))})),Ue=({settings:t,spineItemsManager:e,spineLocator:n,navigationResolver:i})=>o=>{const s=a=>{const{navigationSnapThreshold:c,computedPageTurnMode:l}=t.values,u=e.get(a.spineItem);if(!(!u||!a.position)){if(l==="controlled"){const{endPageIndex:d,beginPageIndex:p}=n.getVisiblePagesFromViewportPosition({position:a.position,spineItem:u,threshold:c,restrictToScreen:!1})??{},g=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?d:p)??0,m=i.getNavigationForSpineItemPage({pageIndex:g,spineItemId:u}),h=n.getVisiblePagesFromViewportPosition({position:m,spineItem:u,threshold:{type:"percentage",value:0},restrictToScreen:!0}),f=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?h?.beginPageIndex:h?.endPageIndex)??0;return n.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:f,spineItem:u})}return n.getSpineItemPositionFromSpinePosition(a.position,u)}};return o.pipe(r.map(({navigation:a,...c})=>({navigation:{...a,positionInSpineItem:s(a)},...c})))},Zo=({navigationResolver:t})=>e=>e.pipe(r.map(n=>{if(n.navigation.url){const i=t.getNavigationForUrl(n.navigation.url);if(i)return{...n,navigation:{...n.navigation,position:i.position,spineItem:i.spineItemId}}}return n}));class _e{constructor(){this.isLockedSubject=new r.BehaviorSubject(0),this.isLocked$=this.isLockedSubject.pipe(r.map(e=>!!e),r.distinctUntilChanged())}lock(){let e=!1;return this.isLockedSubject.next(this.isLockedSubject.getValue()+1),()=>{e||(e=!0,this.isLockedSubject.next(this.isLockedSubject.getValue()-1))}}}const Jo=({spineLocator:t,navigation:e,navigationResolver:n,spineItemsManager:i,spine:o,cfiManager:s})=>{const a=i.get(e.spineItem);return a?a.isReady$.pipe(r.first(),r.map(c=>{const l=o.getSpineItemSpineLayoutInfo(a),u=t.isPositionWithinSpineItem(e.position,a),d=l.width-(e.spineItemWidth??0),p=l.height-(e.spineItemHeight??0),g=d!==0||p!==0;if(e.url!==void 0&&(d||p||c&&!e.spineItemIsReady)){const h=n.getNavigationForUrl(e.url);if(h)return h.position}const m=e.cfi??e.paginationBeginCfi;if(m!==void 0&&!s.isRootCfi(m)&&(d||p||c&&!e.spineItemIsReady)){const h=n.getNavigationForCfi(m);if(h)return h}if(u&&g&&e.directionFromLastNavigation==="backward"){const h=new E({x:(e.positionInSpineItem?.x??0)+d,y:(e.positionInSpineItem?.y??0)+p});return n.getNavigationFromSpineItemPosition({spineItem:a,spineItemPosition:h})}if(e.positionInSpineItem&&e.spineItemHeight&&e.spineItemWidth){const h=t.spineItemLocator.getSpineItemPageIndexFromPosition({itemWidth:e.spineItemWidth,itemHeight:e.spineItemHeight,isUsingVerticalWriting:!!e.spineItemIsUsingVerticalWriting,position:e.positionInSpineItem});return n.getNavigationForSpineItemPage({pageIndex:h,spineItemId:a})}return u?n.getNavigationForPosition(e.position):n.getNavigationForSpineIndexOrId(a)})):r.of(new R({x:0,y:0}))},Ko=({navigation:t,spineLocator:e,spineItemsManager:n,settings:i,navigationResolver:o,spine:s})=>{const{spineItem:a}=t,c=n.get(a);if(!c)return new R({x:0,y:0});const{height:l,top:u}=s.getSpineItemSpineLayoutInfo(c),d=e.isPositionWithinSpineItem(t.position,c),p=t.positionInSpineItem??new E({y:0,x:0});if(i.values.computedPageTurnDirection==="vertical"){if(u===t.spineItemTop&&l===t.spineItemHeight&&d)return t.position;if(u===t.spineItemTop&&l===t.spineItemHeight&&!d)return o.getNavigationForSpineIndexOrId(c);if(u!==t.spineItemTop){const g=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(t.positionInSpineItem??new E({x:0,y:0}),c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:g,spineItem:c})}if(u===t.spineItemTop&&l!==t.spineItemHeight){const g=(t.spineItemHeight??p.y)-p.y,m=new E({y:t.directionFromLastNavigation==="backward"?l-g:p.y,x:t.position.x});if(d){const h=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(m,c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:h,spineItem:c})}if(!d){if(!(t.position.y<u)){const f=new E({y:l-g,x:t.position.x});return e.getSpinePositionFromSpineItemPosition({spineItemPosition:e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(f,c),spineItem:c})}return o.getNavigationForSpineIndexOrId(c)}}}return t.position},Qo=({navigation:t,spineItemsManager:e,settings:n,spineLocator:i,navigationResolver:o,spine:s,cfiManager:a})=>n.values.computedPageTurnMode==="scrollable"?r.of(Ko({navigation:t,spineLocator:i,navigationResolver:o,settings:n,spineItemsManager:e,spine:s})):Jo({navigation:t,spineLocator:i,navigationResolver:o,spineItemsManager:e,spine:s,cfiManager:a}),en=({settings:t,navigationResolver:e,context:n,spine:i,cfiManager:o})=>s=>s.pipe(r.switchMap(a=>Qo({spineLocator:i.locator,navigation:a.navigation,navigationResolver:e,settings:t,spineItemsManager:i.spineItemsManager,spineItemLocator:i.locator.spineItemLocator,spine:i,cfiManager:o}).pipe(r.map(c=>({...a,navigation:{...a.navigation,position:c}}))))),jo=F.namespace("navigation/InternalNavigator"),tn=(t,e)=>t===e||!!t&&!!e&&t.x===e.x&&t.y===e.y,er=(t,e)=>t===e||!!t&&!!e&&t.width===e.width&&t.height===e.height,tr=(t,e)=>t.id===e.id&&tn(t.position,e.position)&&tn(t.requestedPosition,e.requestedPosition)&&er(t.requestedVisibleArea,e.requestedVisibleArea);class nn extends D{constructor(e,n,i,o,s,a,c,l,u,d){super(),this.settings=e,this.context=n,this.userNavigation$=i,this.getActiveNavigationModeController=o,this.navigationModeLayout$=s,this.navigationResolver=a,this.spine=c,this.viewport=l,this.cfiManager=u,this.isUserInteractionLocked$=d,this.navigationSubject=new r.BehaviorSubject({animation:!1,position:new R({x:0,y:0}),meta:{triggeredBy:"user"},requestedPosition:new R({x:0,y:0}),spineItemIsReady:!1,type:"api",id:Symbol("init")}),this.navigation$=this.navigationSubject.pipe(r.map(({position:w,id:$,requestedPosition:v,requestedVisibleArea:L,meta:O})=>({position:w,id:$,requestedPosition:v,requestedVisibleArea:L,triggeredBy:O.triggeredBy})),r.distinctUntilChanged(tr),r.shareReplay(1)),this.locker=new _e;const p=()=>o().getNavigationVisibleArea(),g=i.pipe(r.withLatestFrom(this.navigationSubject),xo({navigationResolver:a,getNavigationVisibleArea:p}),Zo({navigationResolver:a}),qo({navigationResolver:a}),Xo({context:n,settings:e}),Qt({cfi:u,navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),Ue({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),jt({spine:c})).pipe(Go({navigationResolver:a,spineItemsManager:c.spineItemsManager,settings:e,viewport:l}),r.withLatestFrom(d),r.switchMap(([w,$])=>{const v=w.navigation.cfi||w.navigation.url||e.values.computedPageTurnMode==="scrollable"||$;return r.of(w).pipe(v?r.identity:en({navigationResolver:a,settings:e,spine:c,context:n,cfiManager:u}))}),Ue({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),r.map(w=>w.navigation),r.share()),m=g.pipe(r.withLatestFrom(d),r.filter(([,w])=>w),r.switchMap(([w])=>{const $=this.locker.lock();return d.pipe(r.filter(v=>!v),r.first(),r.map(()=>({navigation:{...w,animation:"snap"}})),r.finalize(()=>{$()}),r.takeUntil(g))}),r.share()),h=r.merge(s,c.layout$).pipe(r.switchMap(()=>r.of(null).pipe(r.switchMap(()=>d.pipe(r.filter(w=>!w),r.first())),r.map(()=>({navigation:{...this.navigationSubject.getValue(),animation:!1}})),r.takeUntil(r.merge(m,g))))),f=r.merge(h,m).pipe(en({navigationResolver:a,settings:e,context:n,spine:c,cfiManager:u}),r.map(({navigation:w})=>({navigation:{...w,meta:{triggeredBy:"restoration"},requestedPosition:w.position}})),Qt({cfi:u,navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),jt({spine:c}),Ue({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),r.map(({navigation:w})=>w),r.share()),y=Ho(n,this.navigationSubject,c),b=r.merge(f,g,y),M=w=>w.pipe(r.tap(([$,v])=>{jo.info(`navigation updated from ${$.meta.triggeredBy} of type ${$.type}`,{previousNavigation:v,currentNavigation:$}),this.navigationSubject.next($)})),T=w=>w.pipe(r.tap(([$])=>{const v=$.type==="scroll",L=$.meta.triggeredBy==="pagination",O=$.meta.triggeredBy==="restoration";if(v&&!O||L)return;const k={position:$.position,animation:$.animation};this.getActiveNavigationModeController().navigate(k)}));b.pipe(r.withLatestFrom(this.navigationSubject),T,M,r.takeUntil(this.destroy$)).subscribe()}get navigation(){return this.navigationSubject.getValue()}}const pe=(t,e,n)=>{const i=n-t,o=n*(e*t)/(n||1);return Math.max(0,Math.min(i,o))},We=(t,e)=>(e||0)===0||(t||0)===0?1:Math.floor(Math.max(1,t/e)),ze=(t,e,n)=>{const i=We(n,e),o=[...Array(i)].map((s,a)=>a*e);return t>=i*e?o[o.length-1]||0:o.find(s=>t<s+e)||0},on=(t,e,n)=>{const i=[...Array(n)].map((o,s)=>s*e);return t<=0||n===0?0:t>=n*e?n-1:i.findIndex(o=>t<o+e)??0},nr=({itemWidth:t,itemHeight:e,spineItemPosition:n})=>new E({x:Math.min(t,Math.max(0,n.x)),y:Math.min(e,Math.max(0,n.y))}),rn=({itemHeight:t,itemWidth:e,isUsingVerticalWriting:n,pageWidth:i,pageHeight:o,pageTurnDirection:s,pageTurnMode:a})=>s==="vertical"&&a==="scrollable"?1:n||s==="vertical"?We(t,o):We(e,i),sn=({itemWidth:t,itemHeight:e,position:n,isUsingVerticalWriting:i,pageWidth:o,pageHeight:s,pageTurnDirection:a,pageTurnMode:c,isRTL:l})=>{const d=nr({spineItemPosition:n,itemHeight:e,itemWidth:t}).x,p=rn({isUsingVerticalWriting:i,itemHeight:e,itemWidth:t,pageWidth:o,pageHeight:s,pageTurnDirection:a,pageTurnMode:c});if(i)return on(n.y,s,p);const g=on(d,o,p);return l?p-1-g:g},ir=({pageIndex:t,itemLayout:e,context:n,isUsingVerticalWriting:i,viewport:o})=>{if(i){const a=pe(o.pageSize.height,t,e.height);return new E({x:0,y:a})}const s=pe(o.pageSize.width,t,e.width);return n.isRTL()?new E({x:e.width-s-o.pageSize.width,y:0}):new E({x:s,y:0})},an=({context:t,settings:e,viewport:n})=>{const i=(c,l,u)=>{let d;c?.nodeName==="img"||c?.textContent===""&&c.nodeType===Node.ELEMENT_NODE?d=c.getBoundingClientRect().x:c&&(d=(c?Tn(c,l):void 0)?.getBoundingClientRect().x||d);const p=u.layoutInfo?.width||0,g=n.pageSize.width;if(d!==void 0){const m=ze(d,g,p);return new E({x:m,y:0})}};return{getSpineItemPositionFromNode:i,getSpineItemPositionFromPageIndex:({pageIndex:c,spineItem:l})=>ir({context:t,isUsingVerticalWriting:!!l.isUsingVerticalWriting(),itemLayout:l.layoutInfo,pageIndex:c,viewport:n}),getSpineItemPageIndexFromPosition:c=>sn({...c,isRTL:t.isRTL(),pageWidth:n.pageSize.width,pageHeight:n.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}),getSpineItemPageIndexFromNode:(c,l,u)=>{const d=i(c,l,u),{height:p,width:g}=u.layoutInfo;return d?sn({isUsingVerticalWriting:!!u.isUsingVerticalWriting(),position:d,itemHeight:p,itemWidth:g,isRTL:t.isRTL(),pageWidth:n.pageSize.width,pageHeight:n.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}):void 0},getSpineItemClosestPositionFromUnsafePosition:(c,l)=>{const{width:u,height:d}=l.layoutInfo;return new E({x:ze(c.x,n.pageSize.width,u),y:ze(c.y,n.pageSize.height,d)})},getSpineItemPagePositionFromSpineItemPosition:(c,l,u)=>{const{width:d,height:p}=u.layoutInfo,g=n.pageSize.width,m=n.pageSize.height;if(!!u.isUsingVerticalWriting()){const y=pe(m,l,p);return new le({x:c.x,y:c.y-y})}const f=pe(g,l,d);if(t.isRTL()){const y=d-(l+1)*g;return new le({x:c.x-Math.max(0,y),y:c.y})}return new le({x:c.x-f,y:c.y})}}},or=({context:t,settings:e,viewport:n})=>{const i=an({context:t,settings:e,viewport:n});return{getNavigationForLastPage:c=>{const l=c.numberOfPages;return i.getSpineItemPositionFromPageIndex({pageIndex:l-1,spineItem:c})},getNavigationForPosition:(c,l)=>i.getSpineItemClosestPositionFromUnsafePosition(l,c),getNavigationFromNode:(c,l,u)=>i.getSpineItemPositionFromNode(l,u,c)||new E({x:0,y:0})}},cn=({size:t,isRTL:e,spineItemsManager:n,spine:i})=>{const o=n.get(n.items.length-1);if(!o)return;const s=i.getSpineItemSpineLayoutInfo(o),a=Math.max(0,s.bottom-t.height);if(e){const c=n.get(0),l=c?i.getSpineItemSpineLayoutInfo(c).right:0;return{xMin:s.left,xMax:Math.max(0,l-t.width),yMin:0,yMax:a}}return{xMin:0,xMax:Math.max(0,s.right-t.width),yMin:0,yMax:a}},ln=({position:t,size:e,isRTL:n,spineItemsManager:i,spine:o})=>{const s=cn({size:e,isRTL:n,spineItemsManager:i,spine:o});if(!s)return new A({x:0,y:0});const a=Math.min(Math.max(s.yMin,t.y),s.yMax),c=n?Math.max(s.xMin,Math.min(s.xMax,t.x)):Math.min(Math.max(s.xMin,t.x),s.xMax);return new A({x:c,y:a})},rr=({position:t,size:e,isRTL:n,spineItemsManager:i,spine:o})=>{const s=cn({size:e,isRTL:n,spineItemsManager:i,spine:o});if(s){if(t.y<s.yMin)return"start";if(t.y>s.yMax)return"end";if(n){if(t.x>s.xMax)return"start";if(t.x<s.xMin)return"end"}else{if(t.x<s.xMin)return"start";if(t.x>s.xMax)return"end"}}},x=({position:t,pageSizeWidth:e,visibleAreaRectWidth:n})=>{const{x:i,y:o}=t,a=i%n!==0?i-e:i;return t instanceof A?new A({x:a,y:o}):new R({x:a,y:o})},Be=({viewportPosition:t,spineLocator:e,spineItemNavigationResolver:n,viewport:i})=>{const o=e.getSpineItemFromPosition(t);if(o){const s=e.getSpineItemPositionFromSpinePosition(t,o),a=n.getNavigationForPosition(o,s),c=e.getSpinePositionFromSpineItemPosition({spineItemPosition:a,spineItem:o});return x({position:c,pageSizeWidth:i.pageSize.width,visibleAreaRectWidth:i.absoluteViewport.width})}return new R({x:0,y:0})},sr=({pageIndex:t,spineItemsManager:e,spineItemId:n,spineLocator:i,spineItemNavigationResolver:o,viewport:s})=>{const a=e.get(n);if(!a){const u=t*s.pageSize.width;return Be({viewportPosition:new R({x:u,y:0}),spineItemNavigationResolver:o,spineLocator:i,viewport:s})}const c=i.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:t,spineItem:a}),l=i.getSpinePositionFromSpineItemPosition({spineItemPosition:c,spineItem:a});return x({position:l,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},ar=(t,e)=>{if(e&&e instanceof HTMLIFrameElement){const n=e.contentDocument,i=t.trim();if(!n||i.length===0)return;if(i.startsWith("#")){const o=i.slice(1);return o.length===0?void 0:n.getElementById(o)}try{return n.querySelector(i)}catch{return}}},cr=({anchor:t,spineItem:e,spine:n})=>{const i=ar(t,e.renderer.getDocumentFrame());return i?n.spineItemLocator.getSpineItemPositionFromNode(i,0,e)?.x??0:0},lr=({anchor:t,spineItem:e,spineLocator:n,spine:i})=>{const o=cr({anchor:t,spineItem:e,spine:i});return n.getSpinePositionFromSpineItemPosition({spineItemPosition:new E({x:o,y:0}),spineItem:e})},ur=({anchor:t,spineItem:e,spineLocator:n,spine:i,pageSizeWidth:o,visibleAreaRectWidth:s})=>{const a=lr({anchor:t,spineItem:e,spineLocator:n,spine:i});return x({position:a,pageSizeWidth:o,visibleAreaRectWidth:s})},dr=({spine:t,spineItemsManager:e,spineLocator:n,url:i,context:o,pageSizeWidth:s,visibleAreaRectWidth:a})=>{try{const c=i instanceof URL?i:new URL(i),l=`${c.origin}${c.pathname}`,u=o.manifest?.spineItems.find(d=>d.href===l);if(u){const d=e.get(u.id);if(d){const p=ur({anchor:c.hash,spineItem:d,spine:t,spineLocator:n,pageSizeWidth:s,visibleAreaRectWidth:a});return{position:x({position:p,pageSizeWidth:s,visibleAreaRectWidth:a}),spineItemId:u.id}}}return}catch(c){console.error(c);return}},pr=({spineItem:t,spineItemPosition:e,spineLocator:n,spineItemLocator:i,viewport:o})=>{const s=i.getSpineItemClosestPositionFromUnsafePosition(e,t),a=n.getSpinePositionFromSpineItemPosition({spineItemPosition:s,spineItem:t});return x({position:a,pageSizeWidth:o.pageSize.width,visibleAreaRectWidth:o.absoluteViewport.width})},hr="spineNavigator",gr=({context:t,spineItemsManager:e,locator:n,settings:i,spine:o,viewport:s,cfi:a})=>{const c=or({context:t,settings:i,viewport:s});return{getNavigationForUrl:h=>dr({context:t,spineItemsManager:e,spineLocator:n,url:h,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width,spine:o}),getNavigationForSpineItemPage:h=>sr({...h,spineItemsManager:e,spineItemNavigationResolver:c,spineLocator:n,viewport:s}),getNavigationFromSpineItemPosition:h=>pr({...h,spineItemLocator:n.spineItemLocator,spineLocator:n,viewport:s}),getNavigationForCfi:h=>{const{node:f,offset:y=0,spineItem:b}=a.resolveCfi({cfi:h});if(!b){F.warn(hr,`unable to detect item id from cfi ${h}`);return}const M=f?c.getNavigationFromNode(b,f,y):new E({x:0,y:0}),T=n.getSpinePositionFromSpineItemPosition({spineItemPosition:M,spineItem:b});return x({position:T,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},getNavigationForLastPage:h=>{const f=c.getNavigationForLastPage(h),y=n.getSpinePositionFromSpineItemPosition({spineItemPosition:f,spineItem:h});return x({position:y,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},getNavigationForSpineIndexOrId:h=>{const f=e.get(h);if(f){const y=n.getSpinePositionFromSpineItem(f);return x({position:y,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})}return new R({x:0,y:0})},getNavigationForPosition:h=>Be({viewportPosition:h,spineItemNavigationResolver:c,spineLocator:n,viewport:s}),getMostPredominantNavigationForPosition:h=>{const f=i.values.computedPageTurnDirection,y=.5,b=f==="horizontal"?h.x+s.absoluteViewport.width*y:0,M=f==="horizontal"?0:h.y+s.absoluteViewport.height*y,T=ln({position:new R({x:b,y:M}),size:s.absoluteViewport,isRTL:t.isRTL(),spineItemsManager:e,spine:o});return Be({spineItemNavigationResolver:c,spineLocator:n,viewportPosition:T,viewport:s})},clampPositionInSpine:(h,f)=>ln({position:h,size:f,isRTL:t.isRTL(),spineItemsManager:e,spine:o}),getBoundaryForPosition:(h,f=s.absoluteViewport)=>rr({position:h,size:f,isRTL:t.isRTL(),spineItemsManager:e,spine:o}),isNavigationGoingForwardFrom:(h,f)=>i.values.computedPageTurnDirection==="vertical"?h.y>f.y:h.x>f.x,arePositionsDifferent:(h,f)=>h.x!==f.x||h.y!==f.y,getAdjustedPositionForSpread:h=>x({position:h,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width}),spineItemNavigator:c}},mr=({spineItemsManager:t,context:e,hookManager:n,spine:i,settings:o,viewport:s,cfi:a})=>{const c=new r.Subject,l=c.asObservable(),u=new _e,d=a,p=gr({cfi:d,context:e,settings:o,spineItemsManager:t,locator:i.locator,spine:i,viewport:s}),g=new Kt(o,n,e,i,s),m=new Ut(s,o,n,i,e),h=[m,g],f=()=>h.find(v=>v.isActive())??g,y=r.merge(...h.flatMap(v=>v.layout$?[v.layout$]:[])),b=new nn(o,e,l,f,y,p,i,s,d,u.isLocked$),M=r.combineLatest([...h.map(v=>v.isNavigating$),u.isLocked$,b.locker.isLocked$]).pipe(r.map(v=>v.some(L=>L)?"busy":"free"),r.distinctUntilChanged(),r.shareReplay(1)),T=b.navigation$.pipe(r.map(({position:v})=>v),r.distinctUntilChanged(C.isShallowEqual),r.shareReplay(1));return{destroy:()=>{h.forEach(v=>{v.destroy()}),b.destroy()},getNavigation:()=>b.navigation,internalNavigator:b,scrollNavigationController:m,controlledNavigationController:g,navigationState$:M,navigate:v=>{F.info("User navigation",v),c.next(v)},lock:()=>u.lock(),isLocked$:u.isLocked$,navigationResolver:p,navigation$:b.navigation$,position$:T}};class un extends _{constructor(e,n){super({beginPageIndexInSpineItem:void 0,beginNumberOfPagesInSpineItem:0,beginCfi:void 0,beginSpineItemIndex:void 0,endPageIndexInSpineItem:void 0,endNumberOfPagesInSpineItem:0,endCfi:void 0,endSpineItemIndex:void 0,navigationId:void 0}),this.context=e,this.spineItemsManager=n}update(e){this.mergeCompare(e)}}class dn extends D{constructor(e,n,i,o,s,a,c){super(),this.context=e,this.pagination=n,this.spineItemsManager=i,this.spine=o,this.spineItemLocator=s,this.isNavigationLocked$=a,this.cfi=c;const l=r.merge(this.context.bridgeEvent.navigation$,o.layout$).pipe(r.switchMap(()=>{const d=({spineItem:p,position:g})=>this.spine.locator.getVisiblePagesFromViewportPosition({spineItem:p,position:g,threshold:{type:"percentage",value:.5}});return this.isNavigationLocked$.pipe(r.filter(p=>!p),r.take(1),r.withLatestFrom(this.context.bridgeEvent.navigation$),r.tap(([,p])=>{const{position:g}=p,m=this.pagination.value,{beginIndex:h,endIndex:f}=this.spine.locator.getVisibleSpineItemsFromPosition({position:g,threshold:{type:"percentage",value:.5}})??{},y=this.spineItemsManager.get(h),b=this.spineItemsManager.get(f);if(!y||!b)return;const M=m.beginCfi,T=m.endCfi,{beginPageIndex:w=0}=d({spineItem:y,position:g})??{},{endPageIndex:$=0}=d({spineItem:b,position:g})??{},v=M===void 0||this.cfi.isRootCfi(M)||m.beginSpineItemIndex!==h,L=m.endSpineItemIndex!==f||T===void 0||this.cfi.isRootCfi(T),O=v?this.cfi.generateRootCfi(y.item):M,k=L?this.cfi.generateRootCfi(b.item):T,Y=y.numberOfPages,te=b.numberOfPages;this.pagination.update({beginCfi:O,beginNumberOfPagesInSpineItem:Y,beginPageIndexInSpineItem:w,beginSpineItemIndex:h,endCfi:k,endNumberOfPagesInSpineItem:te,endPageIndexInSpineItem:$,endSpineItemIndex:f,navigationId:p.id})}))})),u=l.pipe(K(this.context.bridgeEvent.viewportFree$),r.tap(()=>{const{beginSpineItemIndex:d,endSpineItemIndex:p,beginPageIndexInSpineItem:g,endPageIndexInSpineItem:m}=this.pagination.value;if(g===void 0||m===void 0||d===void 0||p===void 0)return;const h=this.spineItemsManager.get(d),f=this.spineItemsManager.get(p);if(h===void 0||f===void 0)return;const y=this.spine.pages.fromSpineItemPageIndex(h,g),b=this.spine.pages.fromSpineItemPageIndex(f,m);this.pagination.update({beginCfi:y?.firstVisibleNode?this.cfi.generateCfiForSpineItemPage({spineItem:h.item,pageNode:y?.firstVisibleNode}):this.cfi.generateRootCfi(h.item),endCfi:b?.firstVisibleNode?this.cfi.generateCfiForSpineItemPage({spineItem:f.item,pageNode:b?.firstVisibleNode}):this.cfi.generateRootCfi(f.item)})}));r.merge(l,u).pipe(r.takeUntil(this.destroy$)).subscribe()}}class pn extends D{constructor(e){super();const n={...this.getDefaultSettings(),...e};this.inputSettings=n,this.outputSettingsUpdateSubject=new r.Subject,this._settings$=this.outputSettingsUpdateSubject.asObservable().pipe(r.shareReplay(1)),this._settings$.subscribe()}_prepareUpdate(e){const n=C.shallowMergeIfDefined(this.inputSettings,e),i=this.getOutputSettings(n),o=!C.isShallowEqual(this.outputSettings,i);return{hasChanged:o,state:i,commit:()=>(this.inputSettings=n,this.outputSettings=i,o&&this.outputSettingsUpdateSubject.next(i),i)}}update(e){const{commit:n}=this._prepareUpdate(e);n()}get values(){if(!this.outputSettings){const{commit:e}=this._prepareUpdate(this.inputSettings);return e()}return this.outputSettings}get values$(){if(!this.outputSettings){const{commit:e}=this._prepareUpdate(this.inputSettings);e()}return this._settings$}watch(e){return this.values$.pipe(we(e),r.distinctUntilChanged(C.isShallowEqual))}destroy(){super.destroy(),this.outputSettingsUpdateSubject.complete()}}class fr extends pn{constructor(e,n){super(e),this.context=n,n.watch(["manifest","hasVerticalWriting"]).pipe(r.tap(()=>this.update(this.values)),r.takeUntil(this.destroy$)).subscribe()}getComputedSettings(e){const n=this.context.manifest,i=this.context.value.hasVerticalWriting??!1,o={computedPageTurnDirection:e.pageTurnDirection,computedPageTurnAnimation:e.pageTurnAnimation,computedPageTurnMode:e.pageTurnMode,computedPageTurnAnimationDuration:0,computedSpreadMode:ft({spreadMode:e.spreadMode,manifest:n})};return n?.renditionFlow==="scrolled-continuous"&&(o.computedPageTurnMode="scrollable"),o.computedPageTurnMode==="scrollable"&&(o.computedPageTurnDirection="vertical"),i&&o.computedPageTurnAnimation==="slide"&&(F.warn(`pageTurnAnimation ${o.computedPageTurnAnimation} incompatible with current book, switching back to default`),o.computedPageTurnAnimation="none"),o.computedPageTurnMode==="scrollable"?(o.computedPageTurnAnimationDuration=0,o.computedPageTurnAnimation="none"):o.computedPageTurnAnimationDuration=e.pageTurnAnimationDuration!==void 0?e.pageTurnAnimationDuration:300,o}getOutputSettings(e){const n=this.getComputedSettings(e);return{...this.outputSettings,...e,...n}}getDefaultSettings(){return{spreadMode:!1,pageTurnAnimation:"slide",pageTurnDirection:"horizontal",pageTurnAnimationDuration:void 0,pageTurnMode:"controlled",snapAnimationDuration:300,navigationSnapThreshold:{type:"pixels",value:40},numberOfAdjacentSpineItemToPreLoad:3}}}class Sr extends Q{onUnload(){return r.EMPTY}onCreateDocument(){return r.of(document.createElement("div"))}onLoadDocument(){return r.EMPTY}onLayout(){return r.of(void 0)}onRenderHeadless(){return r.EMPTY}getDocumentFrame(){}}class yr extends D{constructor(e,n,i,o,s,a,c){super(),this.item=e,this.containerElement=n,this.context=i,this.hookManager=o,this.renderer=s,this.settings=a,this.viewport=c,this.layoutTriggerSubject=new r.Subject,this.lastLayout=null,this.computeLayoutInformation=({isLastItem:u,horizontalOffset:d})=>{let p=this.viewport.value.pageSize.width,g="none";const m=d%this.viewport.absoluteViewport.width===0,h=this.context.manifest,f=Yt(h)??!1;if(this.settings.values.computedSpreadMode){!f&&this.renderer.renditionLayout==="reflowable"&&!u&&(p=this.viewport.value.pageSize.width*2),!f&&this.renderer.renditionLayout==="reflowable"&&u&&m&&(p=this.viewport.value.pageSize.width*2);const y=m&&u&&f;this.item.pageSpreadRight&&m&&!this.context.isRTL()?(g="before",p=this.viewport.value.pageSize.width*2):this.item.pageSpreadLeft&&m&&this.context.isRTL()?(g="before",p=this.viewport.value.pageSize.width*2):y&&(this.context.isRTL()?g="before":g="after",p=this.viewport.value.pageSize.width*2)}return{minimumWidth:p,blankPagePosition:g}},this.adjustPositionOfElement=({right:u,left:d,top:p})=>{u!==void 0?P(this.containerElement.style,"right",`${u}px`):V(this.containerElement.style,"right"),d!==void 0?P(this.containerElement.style,"left",`${d}px`):V(this.containerElement.style,"left"),p!==void 0?P(this.containerElement.style,"top",`${p}px`):V(this.containerElement.style,"top")},this.updateContainerLayout=({minimumWidth:u,edgeX:d,edgeY:p})=>g=>g.pipe(r.map(m=>{const h=C.isShallowEqual(this.lastLayout?.pageSize,this.viewport.pageSize)?this.lastLayout:void 0,{width:f,height:y}=h??{},{width:b=f,height:M=y}=m??{},{width:T,height:w}=this.viewport.pageSize,$=this.validateDimension(b??T,T,u),v=this.settings.values.computedPageTurnMode==="scrollable"?M??w:this.validateDimension(M??w,w,w);return this.lastLayout={width:$,height:v,pageSize:this.viewport.pageSize},P(this.containerElement.style,"width",`${$}px`),P(this.containerElement.style,"height",`${v}px`),this.settings.values.computedPageTurnDirection==="vertical"?(this.adjustPositionOfElement({top:p,left:d}),{width:$,height:v}):(this.adjustPositionOfElement(this.context.isRTL()?{right:d,top:0}:{left:d,top:0}),{width:$,height:v})})),this.layout=u=>{const d=tt(this.didLayout$.pipe(r.first()));return this.layoutTriggerSubject.next(u),d()};const l=this.layoutTriggerSubject.pipe(r.switchMap(({spreadPosition:u,horizontalOffset:d,isLastItem:p,edgeX:g,edgeY:m})=>{const{blankPagePosition:h,minimumWidth:f}=this.computeLayoutInformation({horizontalOffset:d,isLastItem:p});this.hookManager.execute("item.onBeforeLayout",{blankPagePosition:h,item:this.item,minimumWidth:f});const y=this.renderer.layout({blankPagePosition:h,minPageSpread:f/this.viewport.pageSize.width,minimumWidth:f,spreadPosition:u});return r.merge(r.of({type:"start"}),y.pipe(this.updateContainerLayout({minimumWidth:f,edgeX:g,edgeY:m}),r.map(b=>(this.hookManager.execute("item.onAfterLayout",{blankPagePosition:h,item:this.item,minimumWidth:f}),{type:"end",data:b}))))}),r.share());this.didLayout$=l.pipe(r.filter(u=>u.type==="end"),r.map(u=>u.data),r.share())}validateDimension(e,n,i){if(e<=0)return i;const o=Math.max(e,i),a=Math.ceil(o/n)*n;return Math.max(a,n)}get layoutInfo(){const e=this.containerElement.style,n=e.width?parseFloat(e.width):0,i=e.height?parseFloat(e.height):0;return{width:n,height:i}}}class He extends _{constructor(e,n,i,o,s,a,c){super({isLoaded:!1,isReady:!1,isDirty:!1,isError:!1,error:void 0}),this.item=e,this.parentElement=n,this.context=i,this.settings=o,this.hookManager=s,this.index=a,this.viewport=c,this.load=()=>{this.renderer.load()},this.unload=()=>{this.renderer.unload()},this.markDirty=()=>{this.mergeCompare({isDirty:!0})},this.destroy=()=>{super.destroy(),this.containerElement.remove(),this.renderer.destroy()},this.isUsingVerticalWriting=()=>!!this.renderer.writingMode?.startsWith("vertical"),this.layout=p=>this._layout.layout(p),this.containerElement=br(n,e,s),n.appendChild(this.containerElement);const l=this.settings.values.getRenderer?.(e);this.resourcesHandler=new se(e,this.settings);const u={context:i,settings:o,hookManager:s,item:e,containerElement:this.containerElement,resourcesHandler:this.resourcesHandler,viewport:this.viewport};this.renderer=l?l(u):new Sr(u),this._layout=new yr(e,this.containerElement,i,s,this.renderer,this.settings,this.viewport);const d=this.renderer.state$.pipe(I.tap(({state:p,error:g})=>{this.mergeCompare({isLoaded:p==="loaded",isError:p==="error",error:p==="error"?g:void 0})}));this.didLayout$=this._layout.didLayout$.pipe(I.tap(()=>{this.mergeCompare({isDirty:!1,isReady:this.renderer.value.state==="loaded"})}),I.share()),r.merge(d,this.didLayout$).pipe(I.takeUntil(this.destroy$)).subscribe()}get isReady$(){return this.watch("isReady")}get element(){return this.containerElement}get readingDirection(){return this.renderer.readingDirection}get loaded$(){return this.renderer.loaded$}get unloaded$(){return this.renderer.unloaded$}get renditionLayout(){return this.renderer.renditionLayout}get layoutInfo(){return this._layout.layoutInfo}get numberOfPages(){return rn({isUsingVerticalWriting:!!this.isUsingVerticalWriting(),itemHeight:this._layout.layoutInfo.height,itemWidth:this._layout.layoutInfo.width,pageWidth:this.viewport.pageSize.width,pageHeight:this.viewport.pageSize.height,pageTurnDirection:this.settings.values.computedPageTurnDirection,pageTurnMode:this.settings.values.pageTurnMode})}}const br=(t,e,n)=>{const i=t.ownerDocument.createElement("div");return i.setAttribute(`data-${gt}`,""),i.classList.add("spineItem"),i.classList.add(`spineItem-${e.renditionLayout??"reflowable"}`),i.style.cssText=`
|
|
193
|
+
`,d.className=`${R}-controlled-navigator`,d.innerHTML="",d.appendChild(u),this.viewport.value.element.appendChild(d),this.element$.next(d)})),c=e.watch(["computedPageTurnDirection","computedPageTurnMode","numberOfAdjacentSpineItemToPreLoad"]),l=r.combineLatest([c,this.element$]).pipe(r.tap(([,u])=>{e.values.computedPageTurnMode==="scrollable"?P(u.style,"display","contents"):P(u.style,"display","block")}));this.layout$=l.pipe(r.tap(()=>{Jt.info("layout",e.values)}),r.share()),this.isNavigating$=this.navigateSubject.pipe(r.distinctUntilChanged((u,d)=>C.isShallowEqual(u.position,d.position)),r.map(({animation:u,position:d})=>(Jt.info("Navigation requested",{animation:u,position:d}),{type:"manualAdjust",shouldAnimate:!(!u||u==="turn"&&e.values.computedPageTurnAnimation==="none"),animation:u,position:d})),r.switchMap(u=>{const d=this.element$.getValue();return P(d.style,"transition","none"),P(d.style,"opacity","1"),r.merge(r.of(!0),r.of(null).pipe(r.mergeMap(()=>{if(u?.type!=="manualAdjust")return r.of(!1);const p=u.animation==="snap"?e.values.snapAnimationDuration:e.values.computedPageTurnAnimationDuration,g=u.animation==="snap"?"slide":e.values.computedPageTurnAnimation;return r.of(u).pipe(u.shouldAnimate?r.delay(1,r.animationFrameScheduler):r.identity,r.tap(m=>{const h=this.element$.getValue();m.shouldAnimate?g==="fade"?(P(h.style,"transition",`opacity ${p/2}ms`),P(h.style,"opacity","0")):(u.animation==="snap"||g==="slide")&&(P(h.style,"transition",`transform ${p}ms`),P(h.style,"opacity","1")):(P(h.style,"transition","none"),P(h.style,"opacity","1"))}),r.tap(m=>{g!=="fade"&&this.applyNavigationPosition(m.position)}),u.shouldAnimate?r.delay(p/2,r.animationFrameScheduler):r.identity,r.tap(m=>{const h=this.element$.getValue();g==="fade"&&(this.applyNavigationPosition(m.position),P(h.style,"opacity","1"))}),u.shouldAnimate?r.delay(p/2,r.animationFrameScheduler):r.identity,r.tap(m=>{g==="fade"&&this.applyNavigationPosition(m.position)}))}),r.map(()=>!1)))}),r.startWith(!1),r.shareReplay(1)),r.merge(a,this.isNavigating$,this.layout$).pipe(r.takeUntil(this.destroy$)).subscribe()}applyNavigationPosition(e){const n=this.element$.getValue(),i=Wo(e);P(n.style,"transform",`translate(${i.x}px, ${i.y}px)`),this.hookManager.execute("onViewportOffsetAdjust",void 0)}navigate(e){this.navigateSubject.next(e)}get viewportPosition(){const e=this.element$.getValue(),n=window.getComputedStyle(e),i=n.transform||n.webkitTransform;if(!i||i==="none")return new N({x:0,y:0});const o=new DOMMatrix(i);return zo(o)}}const Bo=()=>t=>t.pipe(r.map(({navigation:e,pagination:n,...i})=>({navigation:{...e,paginationBeginCfi:n.beginCfi},...i}))),Ho=(t,e,n)=>t.bridgeEvent.pagination$.pipe(r.withLatestFrom(e),r.filter(([i,o])=>i.navigationId===o.id),r.switchMap(([i,o])=>(n.spineItemsManager.get(o.spineItem)?.isReady$.pipe(r.first())??r.of(!1)).pipe(r.filter(a=>a),r.map(()=>({pagination:i,navigation:o})))),Bo(),r.distinctUntilChanged((i,o)=>i.navigation.paginationBeginCfi===o.navigation.paginationBeginCfi),r.map(({navigation:i})=>({...i,meta:{triggeredBy:"pagination"},requestedPosition:i.position}))),xo=({navigationResolver:t,getNavigationVisibleArea:e})=>n=>n.pipe(r.map(([i,o])=>{const s=i.position,a=s?e():void 0,c=s&&a?t.clampPositionInSpine(s,a):void 0,l={type:"api",meta:{triggeredBy:"user"},id:Symbol("user"),animation:"turn",...i,requestedPosition:s,requestedVisibleArea:a,position:c};return{previousNavigation:o,navigation:l}})),qo=({navigationResolver:t})=>e=>e.pipe(r.map(n=>{if(n.navigation.cfi){const i=t.getNavigationForCfi(n.navigation.cfi);if(i)return{...n,navigation:{...n.navigation,position:i}}}return n})),Yo=({navigation:t,previousNavigation:e,settings:n})=>t.directionFromLastNavigation?t.directionFromLastNavigation:t.url!==void 0||t.cfi!==void 0?"anchor":e.spineItem===void 0||t.spineItem||!t.position?"forward":n.values.computedPageTurnDirection==="vertical"?t.position.y>e.position.y||t.position.y===e.position.y&&e.directionFromLastNavigation!=="backward"?"forward":"backward":Math.abs(t.position.x)>Math.abs(e.position.x)||t.position.x===e.position.x&&e.directionFromLastNavigation!=="backward"?"forward":"backward",Xo=({context:t,settings:e})=>n=>n.pipe(r.map(({navigation:i,previousNavigation:o})=>{const s=Yo({navigation:i,previousNavigation:o,settings:e}),a={...i,directionFromLastNavigation:s};return{previousNavigation:o,navigation:a,direction:s}})),Go=({spineItemsManager:t,navigationResolver:e,settings:n,viewport:i})=>o=>o.pipe(r.map(({navigation:s,...a})=>{const c=t.get(s.spineItem);if(s.position)return n.values.computedPageTurnMode==="scrollable"?{navigation:{...s,position:s.position},...a}:{navigation:{...s,position:e.clampPositionInSpine(s.position,i.absoluteViewport)},...a};if(!c)return{navigation:{...s,position:a.previousNavigation.position},...a};const l=e.getNavigationForSpineIndexOrId(c),u=n.values.computedPageTurnMode==="scrollable"?new A({x:l.x+a.previousNavigation.position.x,y:l.y}):e.clampPositionInSpine(l,i.absoluteViewport);return{navigation:{...s,position:u},...a}})),Qt=({settings:t,spineItemsManager:e,navigationResolver:n,spineLocator:i,cfi:o})=>s=>{const a=c=>{const{position:l,spineItem:u,cfi:d,directionFromLastNavigation:p}=c,{navigationSnapThreshold:g,computedPageTurnMode:m}=t.values;if(u!==void 0){const h=e.get(u);if(h)return h}if(typeof u=="number")return u>e.items.length-1?e.get(e.items.length-1):e.get(0);if(d){const h=o.getSpineItemFromCfi(d);if(h)return h}if(l&&m==="controlled"){const{beginIndex:h,endIndex:f}=i.getVisibleSpineItemsFromPosition({position:l,threshold:g,restrictToScreen:!1})??{},y=(p==="forward"||p==="anchor"?f:h)??h,b=e.get(y);if(!b)return;const{endPageIndex:T,beginPageIndex:M}=i.getVisiblePagesFromViewportPosition({position:l,spineItem:b,threshold:g,restrictToScreen:!1})??{},w=(p==="forward"||p==="anchor"?T:M)??0,$=n.getNavigationForSpineItemPage({pageIndex:w,spineItemId:b}),v=i.getVisibleSpineItemsFromPosition({position:$,threshold:g,restrictToScreen:!1}),L=p==="forward"||p==="anchor"?v?.beginIndex:v?.endIndex;return e.get(L)}return l&&m==="scrollable"?i.getSpineItemFromPosition(l):e.get(0)};return s.pipe(r.map(({navigation:c,...l})=>{const u=a(c);return{navigation:{...c,spineItem:e.getSpineItemIndex(u)},...l}}))},jt=({spine:t})=>e=>e.pipe(r.switchMap(({navigation:n,...i})=>{const o=t.getSpineItemSpineLayoutInfo(n.spineItem),s=t.spineItemsManager.get(n.spineItem);return(s?.isReady$??r.of(!1)).pipe(r.first(),r.map(a=>({navigation:{...n,spineItemHeight:o?.height,spineItemWidth:o?.width,spineItemLeft:o.left,spineItemTop:o.top,spineItemIsUsingVerticalWriting:s?.isUsingVerticalWriting(),spineItemIsReady:a},...i})))})),Ue=({settings:t,spineItemsManager:e,spineLocator:n,navigationResolver:i})=>o=>{const s=a=>{const{navigationSnapThreshold:c,computedPageTurnMode:l}=t.values,u=e.get(a.spineItem);if(!(!u||!a.position)){if(l==="controlled"){const{endPageIndex:d,beginPageIndex:p}=n.getVisiblePagesFromViewportPosition({position:a.position,spineItem:u,threshold:c,restrictToScreen:!1})??{},g=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?d:p)??0,m=i.getNavigationForSpineItemPage({pageIndex:g,spineItemId:u}),h=n.getVisiblePagesFromViewportPosition({position:m,spineItem:u,threshold:{type:"percentage",value:0},restrictToScreen:!0}),f=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?h?.beginPageIndex:h?.endPageIndex)??0;return n.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:f,spineItem:u})}return n.getSpineItemPositionFromSpinePosition(a.position,u)}};return o.pipe(r.map(({navigation:a,...c})=>({navigation:{...a,positionInSpineItem:s(a)},...c})))},Zo=({navigationResolver:t})=>e=>e.pipe(r.map(n=>{if(n.navigation.url){const i=t.getNavigationForUrl(n.navigation.url);if(i)return{...n,navigation:{...n.navigation,position:i.position,spineItem:i.spineItemId}}}return n}));class _e{constructor(){this.isLockedSubject=new r.BehaviorSubject(0),this.isLocked$=this.isLockedSubject.pipe(r.map(e=>!!e),r.distinctUntilChanged())}lock(){let e=!1;return this.isLockedSubject.next(this.isLockedSubject.getValue()+1),()=>{e||(e=!0,this.isLockedSubject.next(this.isLockedSubject.getValue()-1))}}}const Jo=({spineLocator:t,navigation:e,navigationResolver:n,spineItemsManager:i,spine:o,cfiManager:s})=>{const a=i.get(e.spineItem);return a?a.isReady$.pipe(r.first(),r.map(c=>{const l=o.getSpineItemSpineLayoutInfo(a),u=t.isPositionWithinSpineItem(e.position,a),d=l.width-(e.spineItemWidth??0),p=l.height-(e.spineItemHeight??0),g=d!==0||p!==0;if(e.url!==void 0&&(d||p||c&&!e.spineItemIsReady)){const h=n.getNavigationForUrl(e.url);if(h)return h.position}const m=e.cfi??e.paginationBeginCfi;if(m!==void 0&&!s.isRootCfi(m)&&(d||p||c&&!e.spineItemIsReady)){const h=n.getNavigationForCfi(m);if(h)return h}if(u&&g&&e.directionFromLastNavigation==="backward"){const h=new E({x:(e.positionInSpineItem?.x??0)+d,y:(e.positionInSpineItem?.y??0)+p});return n.getNavigationFromSpineItemPosition({spineItem:a,spineItemPosition:h})}if(e.positionInSpineItem&&e.spineItemHeight&&e.spineItemWidth){const h=t.spineItemLocator.getSpineItemPageIndexFromPosition({itemWidth:e.spineItemWidth,itemHeight:e.spineItemHeight,isUsingVerticalWriting:!!e.spineItemIsUsingVerticalWriting,position:e.positionInSpineItem});return n.getNavigationForSpineItemPage({pageIndex:h,spineItemId:a})}return u?n.getNavigationForPosition(e.position):n.getNavigationForSpineIndexOrId(a)})):r.of(new N({x:0,y:0}))},Ko=({navigation:t,spineLocator:e,spineItemsManager:n,settings:i,navigationResolver:o,spine:s})=>{const{spineItem:a}=t,c=n.get(a);if(!c)return new N({x:0,y:0});const{height:l,top:u}=s.getSpineItemSpineLayoutInfo(c),d=e.isPositionWithinSpineItem(t.position,c),p=t.positionInSpineItem??new E({y:0,x:0});if(i.values.computedPageTurnDirection==="vertical"){if(u===t.spineItemTop&&l===t.spineItemHeight&&d)return t.position;if(u===t.spineItemTop&&l===t.spineItemHeight&&!d)return o.getNavigationForSpineIndexOrId(c);if(u!==t.spineItemTop){const g=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(t.positionInSpineItem??new E({x:0,y:0}),c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:g,spineItem:c})}if(u===t.spineItemTop&&l!==t.spineItemHeight){const g=(t.spineItemHeight??p.y)-p.y,m=new E({y:t.directionFromLastNavigation==="backward"?l-g:p.y,x:t.position.x});if(d){const h=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(m,c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:h,spineItem:c})}if(!d){if(!(t.position.y<u)){const f=new E({y:l-g,x:t.position.x});return e.getSpinePositionFromSpineItemPosition({spineItemPosition:e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(f,c),spineItem:c})}return o.getNavigationForSpineIndexOrId(c)}}}return t.position},Qo=({navigation:t,spineItemsManager:e,settings:n,spineLocator:i,navigationResolver:o,spine:s,cfiManager:a})=>n.values.computedPageTurnMode==="scrollable"?r.of(Ko({navigation:t,spineLocator:i,navigationResolver:o,settings:n,spineItemsManager:e,spine:s})):Jo({navigation:t,spineLocator:i,navigationResolver:o,spineItemsManager:e,spine:s,cfiManager:a}),en=({settings:t,navigationResolver:e,context:n,spine:i,cfiManager:o})=>s=>s.pipe(r.switchMap(a=>Qo({spineLocator:i.locator,navigation:a.navigation,navigationResolver:e,settings:t,spineItemsManager:i.spineItemsManager,spineItemLocator:i.locator.spineItemLocator,spine:i,cfiManager:o}).pipe(r.map(c=>({...a,navigation:{...a.navigation,position:c}}))))),jo=F.namespace("navigation/InternalNavigator"),tn=(t,e)=>t===e||!!t&&!!e&&t.x===e.x&&t.y===e.y,er=(t,e)=>t===e||!!t&&!!e&&t.width===e.width&&t.height===e.height,tr=(t,e)=>t.id===e.id&&tn(t.position,e.position)&&tn(t.requestedPosition,e.requestedPosition)&&er(t.requestedVisibleArea,e.requestedVisibleArea);class nn extends D{constructor(e,n,i,o,s,a,c,l,u,d){super(),this.settings=e,this.context=n,this.userNavigation$=i,this.getActiveNavigationModeController=o,this.navigationModeLayout$=s,this.navigationResolver=a,this.spine=c,this.viewport=l,this.cfiManager=u,this.isUserInteractionLocked$=d,this.navigationSubject=new r.BehaviorSubject({animation:!1,position:new N({x:0,y:0}),meta:{triggeredBy:"user"},requestedPosition:new N({x:0,y:0}),spineItemIsReady:!1,type:"api",id:Symbol("init")}),this.navigation$=this.navigationSubject.pipe(r.map(({position:w,id:$,requestedPosition:v,requestedVisibleArea:L,meta:O})=>({position:w,id:$,requestedPosition:v,requestedVisibleArea:L,triggeredBy:O.triggeredBy})),r.distinctUntilChanged(tr),r.shareReplay(1)),this.locker=new _e;const p=()=>o().getNavigationVisibleArea(),g=i.pipe(r.withLatestFrom(this.navigationSubject),xo({navigationResolver:a,getNavigationVisibleArea:p}),Zo({navigationResolver:a}),qo({navigationResolver:a}),Xo({context:n,settings:e}),Qt({cfi:u,navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),Ue({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),jt({spine:c})).pipe(Go({navigationResolver:a,spineItemsManager:c.spineItemsManager,settings:e,viewport:l}),r.withLatestFrom(d),r.switchMap(([w,$])=>{const v=w.navigation.cfi||w.navigation.url||e.values.computedPageTurnMode==="scrollable"||$;return r.of(w).pipe(v?r.identity:en({navigationResolver:a,settings:e,spine:c,context:n,cfiManager:u}))}),Ue({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),r.map(w=>w.navigation),r.share()),m=g.pipe(r.withLatestFrom(d),r.filter(([,w])=>w),r.switchMap(([w])=>{const $=this.locker.lock();return d.pipe(r.filter(v=>!v),r.first(),r.map(()=>({navigation:{...w,animation:"snap"}})),r.finalize(()=>{$()}),r.takeUntil(g))}),r.share()),h=r.merge(s,c.layout$).pipe(r.switchMap(()=>r.of(null).pipe(r.switchMap(()=>d.pipe(r.filter(w=>!w),r.first())),r.map(()=>({navigation:{...this.navigationSubject.getValue(),animation:!1}})),r.takeUntil(r.merge(m,g))))),f=r.merge(h,m).pipe(en({navigationResolver:a,settings:e,context:n,spine:c,cfiManager:u}),r.map(({navigation:w})=>({navigation:{...w,meta:{triggeredBy:"restoration"},requestedPosition:w.position}})),Qt({cfi:u,navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),jt({spine:c}),Ue({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),r.map(({navigation:w})=>w),r.share()),y=Ho(n,this.navigationSubject,c),b=r.merge(f,g,y),T=w=>w.pipe(r.tap(([$,v])=>{jo.info(`navigation updated from ${$.meta.triggeredBy} of type ${$.type}`,{previousNavigation:v,currentNavigation:$}),this.navigationSubject.next($)})),M=w=>w.pipe(r.tap(([$])=>{const v=$.type==="scroll",L=$.meta.triggeredBy==="pagination",O=$.meta.triggeredBy==="restoration";if(v&&!O||L)return;const U={position:$.position,animation:$.animation};this.getActiveNavigationModeController().navigate(U)}));b.pipe(r.withLatestFrom(this.navigationSubject),M,T,r.takeUntil(this.destroy$)).subscribe()}get navigation(){return this.navigationSubject.getValue()}}const pe=(t,e,n)=>{const i=n-t,o=n*(e*t)/(n||1);return Math.max(0,Math.min(i,o))},We=(t,e)=>(e||0)===0||(t||0)===0?1:Math.floor(Math.max(1,t/e)),ze=(t,e,n)=>{const i=We(n,e),o=[...Array(i)].map((s,a)=>a*e);return t>=i*e?o[o.length-1]||0:o.find(s=>t<s+e)||0},on=(t,e,n)=>{const i=[...Array(n)].map((o,s)=>s*e);return t<=0||n===0?0:t>=n*e?n-1:i.findIndex(o=>t<o+e)??0},nr=({itemWidth:t,itemHeight:e,spineItemPosition:n})=>new E({x:Math.min(t,Math.max(0,n.x)),y:Math.min(e,Math.max(0,n.y))}),rn=({itemHeight:t,itemWidth:e,isUsingVerticalWriting:n,pageWidth:i,pageHeight:o,pageTurnDirection:s,pageTurnMode:a})=>s==="vertical"&&a==="scrollable"?1:n||s==="vertical"?We(t,o):We(e,i),sn=({itemWidth:t,itemHeight:e,position:n,isUsingVerticalWriting:i,pageWidth:o,pageHeight:s,pageTurnDirection:a,pageTurnMode:c,isRTL:l})=>{const d=nr({spineItemPosition:n,itemHeight:e,itemWidth:t}).x,p=rn({isUsingVerticalWriting:i,itemHeight:e,itemWidth:t,pageWidth:o,pageHeight:s,pageTurnDirection:a,pageTurnMode:c});if(i)return on(n.y,s,p);const g=on(d,o,p);return l?p-1-g:g},ir=({pageIndex:t,itemLayout:e,context:n,isUsingVerticalWriting:i,viewport:o})=>{if(i){const a=pe(o.pageSize.height,t,e.height);return new E({x:0,y:a})}const s=pe(o.pageSize.width,t,e.width);return n.isRTL()?new E({x:e.width-s-o.pageSize.width,y:0}):new E({x:s,y:0})},an=({context:t,settings:e,viewport:n})=>{const i=(c,l,u)=>{let d;c?.nodeName==="img"||c?.textContent===""&&c.nodeType===Node.ELEMENT_NODE?d=c.getBoundingClientRect().x:c&&(d=(c?Tn(c,l):void 0)?.getBoundingClientRect().x||d);const p=u.layoutInfo?.width||0,g=n.pageSize.width;if(d!==void 0){const m=ze(d,g,p);return new E({x:m,y:0})}};return{getSpineItemPositionFromNode:i,getSpineItemPositionFromPageIndex:({pageIndex:c,spineItem:l})=>ir({context:t,isUsingVerticalWriting:!!l.isUsingVerticalWriting(),itemLayout:l.layoutInfo,pageIndex:c,viewport:n}),getSpineItemPageIndexFromPosition:c=>sn({...c,isRTL:t.isRTL(),pageWidth:n.pageSize.width,pageHeight:n.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}),getSpineItemPageIndexFromNode:(c,l,u)=>{const d=i(c,l,u),{height:p,width:g}=u.layoutInfo;return d?sn({isUsingVerticalWriting:!!u.isUsingVerticalWriting(),position:d,itemHeight:p,itemWidth:g,isRTL:t.isRTL(),pageWidth:n.pageSize.width,pageHeight:n.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}):void 0},getSpineItemClosestPositionFromUnsafePosition:(c,l)=>{const{width:u,height:d}=l.layoutInfo;return new E({x:ze(c.x,n.pageSize.width,u),y:ze(c.y,n.pageSize.height,d)})},getSpineItemPagePositionFromSpineItemPosition:(c,l,u)=>{const{width:d,height:p}=u.layoutInfo,g=n.pageSize.width,m=n.pageSize.height;if(!!u.isUsingVerticalWriting()){const y=pe(m,l,p);return new le({x:c.x,y:c.y-y})}const f=pe(g,l,d);if(t.isRTL()){const y=d-(l+1)*g;return new le({x:c.x-Math.max(0,y),y:c.y})}return new le({x:c.x-f,y:c.y})}}},or=({context:t,settings:e,viewport:n})=>{const i=an({context:t,settings:e,viewport:n});return{getNavigationForLastPage:c=>{const l=c.numberOfPages;return i.getSpineItemPositionFromPageIndex({pageIndex:l-1,spineItem:c})},getNavigationForPosition:(c,l)=>i.getSpineItemClosestPositionFromUnsafePosition(l,c),getNavigationFromNode:(c,l,u)=>i.getSpineItemPositionFromNode(l,u,c)||new E({x:0,y:0})}},cn=({size:t,isRTL:e,spineItemsManager:n,spine:i})=>{const o=n.get(n.items.length-1);if(!o)return;const s=i.getSpineItemSpineLayoutInfo(o),a=Math.max(0,s.bottom-t.height);if(e){const c=n.get(0),l=c?i.getSpineItemSpineLayoutInfo(c).right:0;return{xMin:s.left,xMax:Math.max(0,l-t.width),yMin:0,yMax:a}}return{xMin:0,xMax:Math.max(0,s.right-t.width),yMin:0,yMax:a}},ln=({position:t,size:e,isRTL:n,spineItemsManager:i,spine:o})=>{const s=cn({size:e,isRTL:n,spineItemsManager:i,spine:o});if(!s)return new A({x:0,y:0});const a=Math.min(Math.max(s.yMin,t.y),s.yMax),c=n?Math.max(s.xMin,Math.min(s.xMax,t.x)):Math.min(Math.max(s.xMin,t.x),s.xMax);return new A({x:c,y:a})},rr=({position:t,size:e,isRTL:n,spineItemsManager:i,spine:o})=>{const s=cn({size:e,isRTL:n,spineItemsManager:i,spine:o});if(s){if(t.y<s.yMin)return"start";if(t.y>s.yMax)return"end";if(n){if(t.x>s.xMax)return"start";if(t.x<s.xMin)return"end"}else{if(t.x<s.xMin)return"start";if(t.x>s.xMax)return"end"}}},x=({position:t,pageSizeWidth:e,visibleAreaRectWidth:n})=>{const{x:i,y:o}=t,a=i%n!==0?i-e:i;return t instanceof A?new A({x:a,y:o}):new N({x:a,y:o})},Be=({viewportPosition:t,spineLocator:e,spineItemNavigationResolver:n,viewport:i})=>{const o=e.getSpineItemFromPosition(t);if(o){const s=e.getSpineItemPositionFromSpinePosition(t,o),a=n.getNavigationForPosition(o,s),c=e.getSpinePositionFromSpineItemPosition({spineItemPosition:a,spineItem:o});return x({position:c,pageSizeWidth:i.pageSize.width,visibleAreaRectWidth:i.absoluteViewport.width})}return new N({x:0,y:0})},sr=({pageIndex:t,spineItemsManager:e,spineItemId:n,spineLocator:i,spineItemNavigationResolver:o,viewport:s})=>{const a=e.get(n);if(!a){const u=t*s.pageSize.width;return Be({viewportPosition:new N({x:u,y:0}),spineItemNavigationResolver:o,spineLocator:i,viewport:s})}const c=i.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:t,spineItem:a}),l=i.getSpinePositionFromSpineItemPosition({spineItemPosition:c,spineItem:a});return x({position:l,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},ar=(t,e)=>{if(e&&e instanceof HTMLIFrameElement){const n=e.contentDocument,i=t.trim();if(!n||i.length===0)return;if(i.startsWith("#")){const o=i.slice(1);return o.length===0?void 0:n.getElementById(o)}try{return n.querySelector(i)}catch{return}}},cr=({anchor:t,spineItem:e,spine:n})=>{const i=ar(t,e.renderer.getDocumentFrame());return i?n.spineItemLocator.getSpineItemPositionFromNode(i,0,e)?.x??0:0},lr=({anchor:t,spineItem:e,spineLocator:n,spine:i})=>{const o=cr({anchor:t,spineItem:e,spine:i});return n.getSpinePositionFromSpineItemPosition({spineItemPosition:new E({x:o,y:0}),spineItem:e})},ur=({anchor:t,spineItem:e,spineLocator:n,spine:i,pageSizeWidth:o,visibleAreaRectWidth:s})=>{const a=lr({anchor:t,spineItem:e,spineLocator:n,spine:i});return x({position:a,pageSizeWidth:o,visibleAreaRectWidth:s})},dr=({spine:t,spineItemsManager:e,spineLocator:n,url:i,context:o,pageSizeWidth:s,visibleAreaRectWidth:a})=>{try{const c=i instanceof URL?i:new URL(i),l=`${c.origin}${c.pathname}`,u=o.manifest?.spineItems.find(d=>d.href===l);if(u){const d=e.get(u.id);if(d){const p=ur({anchor:c.hash,spineItem:d,spine:t,spineLocator:n,pageSizeWidth:s,visibleAreaRectWidth:a});return{position:x({position:p,pageSizeWidth:s,visibleAreaRectWidth:a}),spineItemId:u.id}}}return}catch(c){console.error(c);return}},pr=({spineItem:t,spineItemPosition:e,spineLocator:n,spineItemLocator:i,viewport:o})=>{const s=i.getSpineItemClosestPositionFromUnsafePosition(e,t),a=n.getSpinePositionFromSpineItemPosition({spineItemPosition:s,spineItem:t});return x({position:a,pageSizeWidth:o.pageSize.width,visibleAreaRectWidth:o.absoluteViewport.width})},hr="spineNavigator",gr=({context:t,spineItemsManager:e,locator:n,settings:i,spine:o,viewport:s,cfi:a})=>{const c=or({context:t,settings:i,viewport:s});return{getNavigationForUrl:h=>dr({context:t,spineItemsManager:e,spineLocator:n,url:h,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width,spine:o}),getNavigationForSpineItemPage:h=>sr({...h,spineItemsManager:e,spineItemNavigationResolver:c,spineLocator:n,viewport:s}),getNavigationFromSpineItemPosition:h=>pr({...h,spineItemLocator:n.spineItemLocator,spineLocator:n,viewport:s}),getNavigationForCfi:h=>{const{node:f,offset:y=0,spineItem:b}=a.resolveCfi({cfi:h});if(!b){F.warn(hr,`unable to detect item id from cfi ${h}`);return}const T=f?c.getNavigationFromNode(b,f,y):new E({x:0,y:0}),M=n.getSpinePositionFromSpineItemPosition({spineItemPosition:T,spineItem:b});return x({position:M,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},getNavigationForLastPage:h=>{const f=c.getNavigationForLastPage(h),y=n.getSpinePositionFromSpineItemPosition({spineItemPosition:f,spineItem:h});return x({position:y,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},getNavigationForSpineIndexOrId:h=>{const f=e.get(h);if(f){const y=n.getSpinePositionFromSpineItem(f);return x({position:y,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})}return new N({x:0,y:0})},getNavigationForPosition:h=>Be({viewportPosition:h,spineItemNavigationResolver:c,spineLocator:n,viewport:s}),getMostPredominantNavigationForPosition:h=>{const f=i.values.computedPageTurnDirection,y=.5,b=f==="horizontal"?h.x+s.absoluteViewport.width*y:0,T=f==="horizontal"?0:h.y+s.absoluteViewport.height*y,M=ln({position:new N({x:b,y:T}),size:s.absoluteViewport,isRTL:t.isRTL(),spineItemsManager:e,spine:o});return Be({spineItemNavigationResolver:c,spineLocator:n,viewportPosition:M,viewport:s})},clampPositionInSpine:(h,f)=>ln({position:h,size:f,isRTL:t.isRTL(),spineItemsManager:e,spine:o}),getBoundaryForPosition:(h,f=s.absoluteViewport)=>rr({position:h,size:f,isRTL:t.isRTL(),spineItemsManager:e,spine:o}),isNavigationGoingForwardFrom:(h,f)=>i.values.computedPageTurnDirection==="vertical"?h.y>f.y:h.x>f.x,arePositionsDifferent:(h,f)=>h.x!==f.x||h.y!==f.y,getAdjustedPositionForSpread:h=>x({position:h,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width}),spineItemNavigator:c}},mr=({spineItemsManager:t,context:e,hookManager:n,spine:i,settings:o,viewport:s,cfi:a})=>{const c=new r.Subject,l=c.asObservable(),u=new _e,d=a,p=gr({cfi:d,context:e,settings:o,spineItemsManager:t,locator:i.locator,spine:i,viewport:s}),g=new Kt(o,n,e,i,s),m=new Ut(s,o,n,i,e),h=[m,g],f=()=>h.find(v=>v.isActive())??g,y=r.merge(...h.flatMap(v=>v.layout$?[v.layout$]:[])),b=new nn(o,e,l,f,y,p,i,s,d,u.isLocked$),T=r.combineLatest([...h.map(v=>v.isNavigating$),u.isLocked$,b.locker.isLocked$]).pipe(r.map(v=>v.some(L=>L)?"busy":"free"),r.distinctUntilChanged(),r.shareReplay(1)),M=b.navigation$.pipe(r.map(({position:v})=>v),r.distinctUntilChanged(C.isShallowEqual),r.shareReplay(1));return{destroy:()=>{h.forEach(v=>{v.destroy()}),b.destroy()},getNavigation:()=>b.navigation,internalNavigator:b,scrollNavigationController:m,controlledNavigationController:g,navigationState$:T,navigate:v=>{F.info("User navigation",v),c.next(v)},lock:()=>u.lock(),isLocked$:u.isLocked$,navigationResolver:p,navigation$:b.navigation$,position$:M}};class un extends W{constructor(e,n){super({beginPageIndexInSpineItem:void 0,beginNumberOfPagesInSpineItem:0,beginCfi:void 0,beginSpineItemIndex:void 0,endPageIndexInSpineItem:void 0,endNumberOfPagesInSpineItem:0,endCfi:void 0,endSpineItemIndex:void 0,navigationId:void 0}),this.context=e,this.spineItemsManager=n}update(e){this.mergeCompare(e)}}class dn extends D{constructor(e,n,i,o,s,a,c){super(),this.context=e,this.pagination=n,this.spineItemsManager=i,this.spine=o,this.spineItemLocator=s,this.isNavigationLocked$=a,this.cfi=c;const l=r.merge(this.context.bridgeEvent.navigation$,o.layout$).pipe(r.switchMap(()=>{const d=({spineItem:p,position:g})=>this.spine.locator.getVisiblePagesFromViewportPosition({spineItem:p,position:g,threshold:{type:"percentage",value:.5}});return this.isNavigationLocked$.pipe(r.filter(p=>!p),r.take(1),r.withLatestFrom(this.context.bridgeEvent.navigation$),r.tap(([,p])=>{const{position:g}=p,m=this.pagination.value,{beginIndex:h,endIndex:f}=this.spine.locator.getVisibleSpineItemsFromPosition({position:g,threshold:{type:"percentage",value:.5}})??{},y=this.spineItemsManager.get(h),b=this.spineItemsManager.get(f);if(!y||!b)return;const T=m.beginCfi,M=m.endCfi,{beginPageIndex:w=0}=d({spineItem:y,position:g})??{},{endPageIndex:$=0}=d({spineItem:b,position:g})??{},v=T===void 0||this.cfi.isRootCfi(T)||m.beginSpineItemIndex!==h,L=m.endSpineItemIndex!==f||M===void 0||this.cfi.isRootCfi(M),O=v?this.cfi.generateRootCfi(y.item):T,U=L?this.cfi.generateRootCfi(b.item):M,Y=y.numberOfPages,te=b.numberOfPages;this.pagination.update({beginCfi:O,beginNumberOfPagesInSpineItem:Y,beginPageIndexInSpineItem:w,beginSpineItemIndex:h,endCfi:U,endNumberOfPagesInSpineItem:te,endPageIndexInSpineItem:$,endSpineItemIndex:f,navigationId:p.id})}))})),u=l.pipe(K(this.context.bridgeEvent.viewportFree$),r.tap(()=>{const{beginSpineItemIndex:d,endSpineItemIndex:p,beginPageIndexInSpineItem:g,endPageIndexInSpineItem:m}=this.pagination.value;if(g===void 0||m===void 0||d===void 0||p===void 0)return;const h=this.spineItemsManager.get(d),f=this.spineItemsManager.get(p);if(h===void 0||f===void 0)return;const y=this.spine.pages.fromSpineItemPageIndex(h,g),b=this.spine.pages.fromSpineItemPageIndex(f,m);this.pagination.update({beginCfi:y?.firstVisibleNode?this.cfi.generateCfiForSpineItemPage({spineItem:h.item,pageNode:y?.firstVisibleNode}):this.cfi.generateRootCfi(h.item),endCfi:b?.firstVisibleNode?this.cfi.generateCfiForSpineItemPage({spineItem:f.item,pageNode:b?.firstVisibleNode}):this.cfi.generateRootCfi(f.item)})}));r.merge(l,u).pipe(r.takeUntil(this.destroy$)).subscribe()}}class pn extends D{constructor(e){super();const n={...this.getDefaultSettings(),...e};this.inputSettings=n,this.outputSettingsUpdateSubject=new r.Subject,this._settings$=this.outputSettingsUpdateSubject.asObservable().pipe(r.shareReplay(1)),this._settings$.subscribe()}_prepareUpdate(e){const n=C.shallowMergeIfDefined(this.inputSettings,e),i=this.getOutputSettings(n),o=!C.isShallowEqual(this.outputSettings,i);return{hasChanged:o,state:i,commit:()=>(this.inputSettings=n,this.outputSettings=i,o&&this.outputSettingsUpdateSubject.next(i),i)}}update(e){const{commit:n}=this._prepareUpdate(e);n()}get values(){if(!this.outputSettings){const{commit:e}=this._prepareUpdate(this.inputSettings);return e()}return this.outputSettings}get values$(){if(!this.outputSettings){const{commit:e}=this._prepareUpdate(this.inputSettings);e()}return this._settings$}watch(e){return this.values$.pipe(we(e),r.distinctUntilChanged(C.isShallowEqual))}destroy(){super.destroy(),this.outputSettingsUpdateSubject.complete()}}class fr extends pn{constructor(e,n){super(e),this.context=n,n.watch(["manifest","hasVerticalWriting"]).pipe(r.tap(()=>this.update(this.values)),r.takeUntil(this.destroy$)).subscribe()}getComputedSettings(e){const n=this.context.manifest,i=this.context.value.hasVerticalWriting??!1,o={computedPageTurnDirection:e.pageTurnDirection,computedPageTurnAnimation:e.pageTurnAnimation,computedPageTurnMode:e.pageTurnMode,computedPageTurnAnimationDuration:0,computedSpreadMode:ft({spreadMode:e.spreadMode,manifest:n})};return n?.renditionFlow==="scrolled-continuous"&&(o.computedPageTurnMode="scrollable"),o.computedPageTurnMode==="scrollable"&&(o.computedPageTurnDirection="vertical"),i&&o.computedPageTurnAnimation==="slide"&&(F.warn(`pageTurnAnimation ${o.computedPageTurnAnimation} incompatible with current book, switching back to default`),o.computedPageTurnAnimation="none"),o.computedPageTurnMode==="scrollable"?(o.computedPageTurnAnimationDuration=0,o.computedPageTurnAnimation="none"):o.computedPageTurnAnimationDuration=e.pageTurnAnimationDuration!==void 0?e.pageTurnAnimationDuration:300,o}getOutputSettings(e){const n=this.getComputedSettings(e);return{...this.outputSettings,...e,...n}}getDefaultSettings(){return{spreadMode:!1,pageTurnAnimation:"slide",pageTurnDirection:"horizontal",pageTurnAnimationDuration:void 0,pageTurnMode:"controlled",snapAnimationDuration:300,navigationSnapThreshold:{type:"pixels",value:40},numberOfAdjacentSpineItemToPreLoad:3}}}class Sr extends Q{onUnload(){return r.EMPTY}onCreateDocument(){return r.of(document.createElement("div"))}onLoadDocument(){return r.EMPTY}onLayout(){return r.of(void 0)}onRenderHeadless(){return r.EMPTY}getDocumentFrame(){}}class yr extends D{constructor(e,n,i,o,s,a,c){super(),this.item=e,this.containerElement=n,this.context=i,this.hookManager=o,this.renderer=s,this.settings=a,this.viewport=c,this.layoutTriggerSubject=new r.Subject,this.lastLayout=null,this.computeLayoutInformation=({isLastItem:u,horizontalOffset:d,spreadPosition:p})=>{let g=this.viewport.value.pageSize.width,m="none";const h=d%this.viewport.absoluteViewport.width===0,f=this.context.manifest,y=Yt(f)??!1;if(this.settings.values.computedSpreadMode){!y&&this.renderer.renditionLayout==="reflowable"&&!u&&(g=this.viewport.value.pageSize.width*2),!y&&this.renderer.renditionLayout==="reflowable"&&u&&h&&(g=this.viewport.value.pageSize.width*2);const b=h&&u&&y,T=C.getItemSpreadPosition(this.item);T!==void 0&&T!==p?(m="before",g=this.viewport.value.pageSize.width*2):b&&(this.context.isRTL()?m="before":m="after",g=this.viewport.value.pageSize.width*2)}return{minimumWidth:g,blankPagePosition:m}},this.adjustPositionOfElement=({right:u,left:d,top:p})=>{u!==void 0?P(this.containerElement.style,"right",`${u}px`):V(this.containerElement.style,"right"),d!==void 0?P(this.containerElement.style,"left",`${d}px`):V(this.containerElement.style,"left"),p!==void 0?P(this.containerElement.style,"top",`${p}px`):V(this.containerElement.style,"top")},this.updateContainerLayout=({minimumWidth:u,edgeX:d,edgeY:p})=>g=>g.pipe(r.map(m=>{const h=C.isShallowEqual(this.lastLayout?.pageSize,this.viewport.pageSize)?this.lastLayout:void 0,{width:f,height:y}=h??{},{width:b=f,height:T=y}=m??{},{width:M,height:w}=this.viewport.pageSize,$=this.validateDimension(b??M,M,u),v=this.settings.values.computedPageTurnMode==="scrollable"?T??w:this.validateDimension(T??w,w,w);return this.lastLayout={width:$,height:v,pageSize:this.viewport.pageSize},P(this.containerElement.style,"width",`${$}px`),P(this.containerElement.style,"height",`${v}px`),this.settings.values.computedPageTurnDirection==="vertical"?(this.adjustPositionOfElement({top:p,left:d}),{width:$,height:v}):(this.adjustPositionOfElement(this.context.isRTL()?{right:d,top:0}:{left:d,top:0}),{width:$,height:v})})),this.layout=u=>{const d=tt(this.didLayout$.pipe(r.first()));return this.layoutTriggerSubject.next(u),d()};const l=this.layoutTriggerSubject.pipe(r.switchMap(({spreadPosition:u,horizontalOffset:d,isLastItem:p,edgeX:g,edgeY:m})=>{const{blankPagePosition:h,minimumWidth:f}=this.computeLayoutInformation({horizontalOffset:d,isLastItem:p,spreadPosition:u});this.hookManager.execute("item.onBeforeLayout",{blankPagePosition:h,item:this.item,minimumWidth:f});const y=this.renderer.layout({blankPagePosition:h,minPageSpread:f/this.viewport.pageSize.width,minimumWidth:f,spreadPosition:u});return r.merge(r.of({type:"start"}),y.pipe(this.updateContainerLayout({minimumWidth:f,edgeX:g,edgeY:m}),r.map(b=>(this.hookManager.execute("item.onAfterLayout",{blankPagePosition:h,item:this.item,minimumWidth:f}),{type:"end",data:b}))))}),r.share());this.didLayout$=l.pipe(r.filter(u=>u.type==="end"),r.map(u=>u.data),r.share())}validateDimension(e,n,i){if(e<=0)return i;const o=Math.max(e,i),a=Math.ceil(o/n)*n;return Math.max(a,n)}get layoutInfo(){const e=this.containerElement.style,n=e.width?parseFloat(e.width):0,i=e.height?parseFloat(e.height):0;return{width:n,height:i}}}class He extends W{constructor(e,n,i,o,s,a,c){super({isLoaded:!1,isReady:!1,isDirty:!1,isError:!1,error:void 0}),this.item=e,this.parentElement=n,this.context=i,this.settings=o,this.hookManager=s,this.index=a,this.viewport=c,this.load=()=>{this.renderer.load()},this.unload=()=>{this.renderer.unload()},this.markDirty=()=>{this.mergeCompare({isDirty:!0})},this.destroy=()=>{super.destroy(),this.containerElement.remove(),this.renderer.destroy()},this.isUsingVerticalWriting=()=>!!this.renderer.writingMode?.startsWith("vertical"),this.layout=p=>this._layout.layout(p),this.containerElement=br(n,e,s),n.appendChild(this.containerElement);const l=this.settings.values.getRenderer?.(e);this.resourcesHandler=new se(e,this.settings);const u={context:i,settings:o,hookManager:s,item:e,containerElement:this.containerElement,resourcesHandler:this.resourcesHandler,viewport:this.viewport};this.renderer=l?l(u):new Sr(u),this._layout=new yr(e,this.containerElement,i,s,this.renderer,this.settings,this.viewport);const d=this.renderer.state$.pipe(I.tap(({state:p,error:g})=>{this.mergeCompare({isLoaded:p==="loaded",isError:p==="error",error:p==="error"?g:void 0})}));this.didLayout$=this._layout.didLayout$.pipe(I.tap(()=>{this.mergeCompare({isDirty:!1,isReady:this.renderer.value.state==="loaded"})}),I.share()),r.merge(d,this.didLayout$).pipe(I.takeUntil(this.destroy$)).subscribe()}get isReady$(){return this.watch("isReady")}get element(){return this.containerElement}get readingDirection(){return this.renderer.readingDirection}get loaded$(){return this.renderer.loaded$}get unloaded$(){return this.renderer.unloaded$}get renditionLayout(){return this.renderer.renditionLayout}get layoutInfo(){return this._layout.layoutInfo}get numberOfPages(){return rn({isUsingVerticalWriting:!!this.isUsingVerticalWriting(),itemHeight:this._layout.layoutInfo.height,itemWidth:this._layout.layoutInfo.width,pageWidth:this.viewport.pageSize.width,pageHeight:this.viewport.pageSize.height,pageTurnDirection:this.settings.values.computedPageTurnDirection,pageTurnMode:this.settings.values.pageTurnMode})}}const br=(t,e,n)=>{const i=t.ownerDocument.createElement("div");return i.setAttribute(`data-${gt}`,""),i.classList.add("spineItem"),i.classList.add(`spineItem-${e.renditionLayout??"reflowable"}`),i.style.cssText=`
|
|
194
194
|
position: absolute;
|
|
195
195
|
overflow: hidden;
|
|
196
|
-
`,i.dataset.isReady="false",n.execute("item.onBeforeContainerAttach",{element:i,item:e}),i};class Ir extends D{constructor(e,n,i,o,s,a){super(),this.context=e,this.spineItemsManager=n,this.spineLocator=i,this.settings=o,this.spineLayout=s,this.viewport=a,this.forcedOpenSubject=new r.BehaviorSubject(new Map);const c=this.forcedOpenSubject.pipe(r.map(d=>Array.from(d.keys()).sort((p,g)=>p-g)),r.distinctUntilChanged(C.arrayEqual),r.shareReplay({bufferSize:1,refCount:!0}));r.merge(this.context.bridgeEvent.position$,this.viewport.layout$,this.spineLayout.layout$,c,o.watch(["numberOfAdjacentSpineItemToPreLoad"])).pipe(r.debounceTime(100),K(this.context.bridgeEvent.viewportFree$),r.withLatestFrom(this.context.bridgeEvent.position$,c),r.map(([,d,p])=>{const{numberOfAdjacentSpineItemToPreLoad:g}=o.values,{beginIndex:m=0,endIndex:h=0}=i.getVisibleSpineItemsFromPosition({position:d,threshold:{type:"percentage",value:0},useAbsoluteViewport:!1})||{},f=g===1/0?0:m-g,y=g===1/0?n.items.length-1:h+g,b=Array.from({length:y-f+1},(T,w)=>f+w),M=[...p,...b];n.items.forEach((T,w)=>{M.includes(w)?T.load():T.unload()})})).pipe(r.takeUntil(this.destroy$)).subscribe()}forceOpen(e){const n=e.map(o=>typeof o=="number"?o:o.index),i=o=>{const s=this.forcedOpenSubject.value;n.forEach(a=>{const c=s.get(a)||0,l=o?c+1:c-1;l<=0?s.delete(a):s.set(a,l)}),this.forcedOpenSubject.next(s)};return i(!0),()=>{this.isDestroyed||i(!1)}}destroy(){super.destroy(),this.forcedOpenSubject.complete()}}const hn=(t,e,n)=>{const i=(n.width-e.width)/2,o=(n.height-e.height)/2;return new A({x:t.x-i,y:t.y-o})};class ee extends DOMRect{constructor(){super(...arguments),this.__symbol=Symbol("ViewportPosition")}static from(e,n){if(n){const o=e;return new ee(o.x,o.y,n.width,n.height)}const i=e;return new ee(i.x,i.y,i.width,i.height)}}class vr{constructor({width:e,height:n}){this.__symbol=Symbol("AbsoluteViewport"),this.width=e,this.height=n}}class wr{constructor({width:e,height:n}){this.__symbol=Symbol("RelativeViewport"),this.width=e,this.height=n}}const Pr=({pageIndex:t,spineItemOrId:e,spineItemsManager:n})=>{const i=n.items,o=n.get(e);if(!o)return;const{currentAbsolutePage:s}=i.reduce((a,c)=>{if(a.found)return a;const l=c.numberOfPages;return o===c&&t<=l-1?{currentAbsolutePage:a.currentAbsolutePage+t,found:!0}:{...a,currentAbsolutePage:a.currentAbsolutePage+l}},{currentAbsolutePage:0,found:!1});return s},Tr=({itemHeight:t,itemWidth:e,visibleWidthOfItem:n,visibleHeightOfItem:i,threshold:o})=>{const s=n/e,a=i/t;return o.type==="percentage"?s>=o.value&&a>=o.value:n>=o.value&&i>=o.value},Mr=({visibleWidthOfItem:t,visibleHeightOfItem:e,threshold:n,viewportPosition:i})=>{const o=t/i.width,s=e/i.height;return n.type==="percentage"?s>=n.value&&o>=n.value:e>=n.value&&t>=n.value},gn=({itemPosition:{bottom:t,left:e,right:n,top:i,width:o,height:s},threshold:a,viewportPosition:c,restrictToScreen:l})=>{const u=c.x,d=c.x+(c.width-1),p=c.y,g=Math.max(c.y+(c.height-1),0),m=Math.max(0,Math.min(n,d)-Math.max(e,u)),h=Math.max(0,Math.min(t,g)-Math.max(i,p));if(m<=0||h<=0)return{visible:!1};const y=Mr({threshold:a,visibleHeightOfItem:h,visibleWidthOfItem:m,viewportPosition:c});return l?{visible:y}:{visible:Tr({itemHeight:s,itemWidth:o,threshold:a,visibleHeightOfItem:h,visibleWidthOfItem:m})||y}},xe=({position:t,spineItemsManager:e,spineLayout:n})=>{const i=e.items.find(o=>{const{left:s,right:a,bottom:c,top:l}=n.getSpineItemSpineLayoutInfo(o),u=t.x>=s&&t.x<a,d=t.y>=l&&t.y<c;return u&&d});return t.x===0&&!i?e.items[0]:i},qe=({spineItemPosition:t,itemLayout:{left:e,top:n}})=>new R({x:e+t.x,y:n+t.y}),$r=({position:t,threshold:e,restrictToScreen:n,spineItemsManager:i,spineLayout:o,useAbsoluteViewport:s=!0,viewport:a})=>{const c=xe({position:t,spineItemsManager:i,spineLayout:o})||i.get(0),l=i.items.reduce((m,h)=>{const f=o.getSpineItemSpineLayoutInfo(h),y=s?a.absoluteViewport:a.relativeViewport,b=hn(t,a.absoluteViewport,y),M=ee.from(b,y),{visible:T}=gn({itemPosition:f,threshold:e,viewportPosition:M,restrictToScreen:n});return T?[...m,h]:m},[]),u=l[0]??c,d=l[l.length-1]??u;if(!u||!d)return;const p=i.getSpineItemIndex(u),g=i.getSpineItemIndex(d);return{beginIndex:p??0,endIndex:g??0}},Cr=({spineItemsManager:t,context:e,spineItemLocator:n,settings:i,spineLayout:o,viewport:s})=>{const a=(h,f)=>{const{left:y,top:b}=o.getSpineItemSpineLayoutInfo(f);return new E({x:Math.max(h.x-y,0),y:Math.max(h.y-b,0)})},c=h=>qe({spineItemPosition:new E({x:0,y:0}),itemLayout:o.getSpineItemSpineLayoutInfo(h)}),l=h=>t.items.find(f=>f.renderer.getDocumentFrame()===h),u=(h,f,y)=>{if(typeof y=="number"){const b=t.get(y);return b?n.getSpineItemPageIndexFromNode(h,f||0,b):void 0}return n.getSpineItemPageIndexFromNode(h,f||0,y)},d=({position:h,threshold:f,spineItem:y,restrictToScreen:b,useAbsoluteViewport:M=!0,viewport:T})=>{const w=y.numberOfPages,v=Array.from(Array(w)).map((k,Y)=>{const te=n.getSpineItemPositionFromPageIndex({pageIndex:Y,spineItem:y}),Z=qe({spineItemPosition:te,itemLayout:o.getSpineItemSpineLayoutInfo(y)});return{index:Y,absolutePosition:{width:T.pageSize.width,height:T.pageSize.height,left:Z.x,top:Z.y,bottom:Z.y+T.pageSize.height,right:Z.x+T.pageSize.width}}}).reduce((k,{absolutePosition:Y,index:te})=>{const Z=M?T.absoluteViewport:T.relativeViewport,Or=hn(h,T.absoluteViewport,Z),Vr=ee.from(Or,Z),{visible:kr}=gn({viewportPosition:Vr,restrictToScreen:b,threshold:f,itemPosition:Y});return kr?[...k,te]:k},[]),L=v[0],O=v[v.length-1]??L;if(!(L===void 0||O===void 0))return{beginPageIndex:L,endPageIndex:O}};return{getSpinePositionFromSpineItemPosition:({spineItem:h,spineItemPosition:f})=>{const y=o.getSpineItemSpineLayoutInfo(h);return qe({itemLayout:y,spineItemPosition:f})},_getAbsolutePageIndexFromPageIndex:h=>Pr({...h,spineItemsManager:t}),getSpineItemPagePositionFromSpinePosition:h=>{const f=xe({position:h,spineItemsManager:t,spineLayout:o});if(!f)return;const y=a(h,f),b=n.getSpineItemPageIndexFromPosition({itemWidth:f.layoutInfo.width,itemHeight:f.layoutInfo.height,position:y,isUsingVerticalWriting:!!f.isUsingVerticalWriting()}),M=n.getSpineItemPagePositionFromSpineItemPosition(y,b,f);return{spineItem:f,spineItemPageIndex:b,spineItemPagePosition:M,pageSize:s.value.pageSize}},getSpinePositionFromSpineItem:c,getSpineItemPositionFromSpinePosition:a,getSpineItemFromPosition:h=>xe({position:h,spineItemsManager:t,spineLayout:o}),getSpineItemFromIframe:l,getSpineItemPageIndexFromNode:u,getVisibleSpineItemsFromPosition:h=>$r({spineItemsManager:t,spineLayout:o,viewport:s,...h}),getVisiblePagesFromViewportPosition:h=>d({...h,viewport:s}),isPositionWithinSpineItem:(h,f)=>{const{bottom:y,left:b,right:M,top:T}=o.getSpineItemSpineLayoutInfo(f);return h.x>=b&&h.x<=M&&h.y<=y&&h.y>=T},spineItemLocator:n,getSafeSpineItemPositionFromUnsafeSpineItemPosition:(h,f)=>{const{height:y,width:b}=o.getSpineItemSpineLayoutInfo(f);return new E({x:Math.min(Math.max(0,h.x),b),y:Math.min(Math.max(0,h.y),y)})}}};class mn extends D{constructor(e){super(),this.spineItemsManager=e,this.states$=this.spineItemsManager.items$.pipe(r.switchMap(n=>r.merge(...n.map(i=>i.pipe(r.map(o=>({item:i,...o})),r.distinctUntilChanged(C.isShallowEqual))))),r.share()),this.itemResize$=this.spineItemsManager.items$.pipe(r.switchMap(n=>{const i=n.map(o=>re(o.element).pipe(r.map(s=>({entries:s,item:o}))));return r.merge(...i)}),r.share()),this.itemLoad$=this.spineItemsManager.items$.pipe(r.switchMap(n=>r.merge(...n.map(i=>i.loaded$.pipe(r.map(()=>i))))),r.share()),this.itemUnload$=this.spineItemsManager.items$.pipe(r.switchMap(n=>r.merge(...n.map(i=>i.unloaded$.pipe(r.map(()=>i))))),r.share())}}class Fr extends D{constructor(e,n,i,o,s){super(),this.spineItemsManager=e,this.spineItemsObserver=n,this.context=i,this.settings=o,this.viewport=s,this.externalLayoutTrigger=new r.Subject,this.spineItemsRelativeLayouts=[];const a=r.merge(n.itemLoad$,n.itemUnload$).pipe(r.map(()=>({immediate:!1}))),c=r.merge(this.externalLayoutTrigger,a);this.layout$=c.pipe(r.tap(()=>{this.spineItemsManager.items.forEach(l=>{l.markDirty()})}),r.debounce(l=>l.immediate?r.of(void 0):r.timer(50)),r.switchMap(()=>this.spineItemsManager.items.reduce((l,u,d)=>l.pipe(r.concatMap(({horizontalOffset:p,verticalOffset:g})=>{const m=p%s.absoluteViewport.width===0,h=d===e.items.length-1,f=o.values.computedPageTurnDirection==="vertical",y=i.isRTL(),b=this.getSpreadPosition(m,y),{edgeX:M,edgeY:T}=this.getStartEdges(f,m,p,g,s.absoluteViewport.height);return u.layout({spreadPosition:b,horizontalOffset:p,isLastItem:h,edgeX:M,edgeY:T}).pipe(r.map(({width:w,height:$})=>{const v=this.createSpineItemLayout(f,y,M,T,w,$,s.absoluteViewport.width);return this.spineItemsRelativeLayouts[d]=v,{horizontalOffset:M+w,verticalOffset:f?T+$:0}}))})),r.of({horizontalOffset:0,verticalOffset:0}))),r.takeUntil(this.destroy$),r.share()),this.layout$.subscribe(),this.watchForVerticalWritingUpdate()}watchForVerticalWritingUpdate(){this.spineItemsObserver.itemLoad$.pipe(r.tap(e=>{this.context.update({hasVerticalWriting:e.isUsingVerticalWriting()})}),r.takeUntil(this.destroy$)).subscribe()}layout(e={}){this.externalLayoutTrigger.next(e)}getSpineItemSpineLayoutInfo(e){const n=this.spineItemsManager.getSpineItemIndex(e)??0;return this.spineItemsRelativeLayouts[n]||new ue({left:0,right:0,top:0,bottom:0,width:0,height:0,x:0,y:0})}get numberOfPages(){return this.spineItemsManager.items.reduce((e,n)=>e+n.numberOfPages,0)}destroy(){super.destroy(),this.externalLayoutTrigger.complete()}getSpreadPosition(e,n){return this.settings.values.computedSpreadMode?e?n?"right":"left":n?"left":"right":"none"}getStartEdges(e,n,i,o,s){return e?{edgeX:n?0:i,edgeY:n?o:o-s}:{edgeX:i,edgeY:0}}createSpineItemLayout(e,n,i,o,s,a,c){if(e){const u=s+i,d=a+o;return new ue({left:i,right:u,top:o,bottom:d,height:a,width:s,x:i,y:o})}const l=n?c-i-s:i;return new ue({right:n?c-i:i+s,left:l,x:l,top:o,bottom:a,height:a,width:s,y:o})}}class fn extends D{constructor(e,n,i,o,s,a,c){super(),this.context=e,this.pagination=n,this.spineItemsManager=i,this.spineItemLocator=o,this.settings=s,this.hookManager=a,this.viewport=c,this.elementSubject=new r.BehaviorSubject(void 0),this.element$=this.elementSubject.asObservable(),this.spineItemsObserver=new mn(i),this.spineLayout=new Fr(i,this.spineItemsObserver,e,s,c),this.locator=Cr({context:e,spineItemsManager:i,spineItemLocator:o,settings:s,spineLayout:this.spineLayout,viewport:c}),this.spineItemsLoader=new Ir(this.context,i,this.locator,s,this.spineLayout,this.viewport),this.pages=new G(this.spineLayout,this.spineItemsManager,this.spineItemLocator,this.context,this.locator,this.viewport);const l=e.watch("rootElement").pipe(I.filter(W),I.tap(d=>{const p=d.ownerDocument.createElement("div");p.style.cssText=`
|
|
196
|
+
`,i.dataset.isReady="false",n.execute("item.onBeforeContainerAttach",{element:i,item:e}),i};class Ir extends D{constructor(e,n,i,o,s,a){super(),this.context=e,this.spineItemsManager=n,this.spineLocator=i,this.settings=o,this.spineLayout=s,this.viewport=a,this.forcedOpenSubject=new r.BehaviorSubject(new Map);const c=this.forcedOpenSubject.pipe(r.map(d=>Array.from(d.keys()).sort((p,g)=>p-g)),r.distinctUntilChanged(C.arrayEqual),r.shareReplay({bufferSize:1,refCount:!0}));r.merge(this.context.bridgeEvent.position$,this.viewport.layout$,this.spineLayout.layout$,c,o.watch(["numberOfAdjacentSpineItemToPreLoad"])).pipe(r.debounceTime(100),K(this.context.bridgeEvent.viewportFree$),r.withLatestFrom(this.context.bridgeEvent.position$,c),r.map(([,d,p])=>{const{numberOfAdjacentSpineItemToPreLoad:g}=o.values,{beginIndex:m=0,endIndex:h=0}=i.getVisibleSpineItemsFromPosition({position:d,threshold:{type:"percentage",value:0},useAbsoluteViewport:!1})||{},f=g===1/0?0:m-g,y=g===1/0?n.items.length-1:h+g,b=Array.from({length:y-f+1},(M,w)=>f+w),T=[...p,...b];n.items.forEach((M,w)=>{T.includes(w)?M.load():M.unload()})})).pipe(r.takeUntil(this.destroy$)).subscribe()}forceOpen(e){const n=e.map(o=>typeof o=="number"?o:o.index),i=o=>{const s=this.forcedOpenSubject.value;n.forEach(a=>{const c=s.get(a)||0,l=o?c+1:c-1;l<=0?s.delete(a):s.set(a,l)}),this.forcedOpenSubject.next(s)};return i(!0),()=>{this.isDestroyed||i(!1)}}destroy(){super.destroy(),this.forcedOpenSubject.complete()}}const hn=(t,e,n)=>{const i=(n.width-e.width)/2,o=(n.height-e.height)/2;return new A({x:t.x-i,y:t.y-o})};class ee extends DOMRect{constructor(){super(...arguments),this.__symbol=Symbol("ViewportPosition")}static from(e,n){if(n){const o=e;return new ee(o.x,o.y,n.width,n.height)}const i=e;return new ee(i.x,i.y,i.width,i.height)}}class vr{constructor({width:e,height:n}){this.__symbol=Symbol("AbsoluteViewport"),this.width=e,this.height=n}}class wr{constructor({width:e,height:n}){this.__symbol=Symbol("RelativeViewport"),this.width=e,this.height=n}}const Pr=({pageIndex:t,spineItemOrId:e,spineItemsManager:n})=>{const i=n.items,o=n.get(e);if(!o)return;const{currentAbsolutePage:s}=i.reduce((a,c)=>{if(a.found)return a;const l=c.numberOfPages;return o===c&&t<=l-1?{currentAbsolutePage:a.currentAbsolutePage+t,found:!0}:{...a,currentAbsolutePage:a.currentAbsolutePage+l}},{currentAbsolutePage:0,found:!1});return s},Tr=({itemHeight:t,itemWidth:e,visibleWidthOfItem:n,visibleHeightOfItem:i,threshold:o})=>{const s=n/e,a=i/t;return o.type==="percentage"?s>=o.value&&a>=o.value:n>=o.value&&i>=o.value},Mr=({visibleWidthOfItem:t,visibleHeightOfItem:e,threshold:n,viewportPosition:i})=>{const o=t/i.width,s=e/i.height;return n.type==="percentage"?s>=n.value&&o>=n.value:e>=n.value&&t>=n.value},gn=({itemPosition:{bottom:t,left:e,right:n,top:i,width:o,height:s},threshold:a,viewportPosition:c,restrictToScreen:l})=>{const u=c.x,d=c.x+(c.width-1),p=c.y,g=Math.max(c.y+(c.height-1),0),m=Math.max(0,Math.min(n,d)-Math.max(e,u)),h=Math.max(0,Math.min(t,g)-Math.max(i,p));if(m<=0||h<=0)return{visible:!1};const y=Mr({threshold:a,visibleHeightOfItem:h,visibleWidthOfItem:m,viewportPosition:c});return l?{visible:y}:{visible:Tr({itemHeight:s,itemWidth:o,threshold:a,visibleHeightOfItem:h,visibleWidthOfItem:m})||y}},xe=({position:t,spineItemsManager:e,spineLayout:n})=>{const i=e.items.find(o=>{const{left:s,right:a,bottom:c,top:l}=n.getSpineItemSpineLayoutInfo(o),u=t.x>=s&&t.x<a,d=t.y>=l&&t.y<c;return u&&d});return t.x===0&&!i?e.items[0]:i},qe=({spineItemPosition:t,itemLayout:{left:e,top:n}})=>new N({x:e+t.x,y:n+t.y}),$r=({position:t,threshold:e,restrictToScreen:n,spineItemsManager:i,spineLayout:o,useAbsoluteViewport:s=!0,viewport:a})=>{const c=xe({position:t,spineItemsManager:i,spineLayout:o})||i.get(0),l=i.items.reduce((m,h)=>{const f=o.getSpineItemSpineLayoutInfo(h),y=s?a.absoluteViewport:a.relativeViewport,b=hn(t,a.absoluteViewport,y),T=ee.from(b,y),{visible:M}=gn({itemPosition:f,threshold:e,viewportPosition:T,restrictToScreen:n});return M?[...m,h]:m},[]),u=l[0]??c,d=l[l.length-1]??u;if(!u||!d)return;const p=i.getSpineItemIndex(u),g=i.getSpineItemIndex(d);return{beginIndex:p??0,endIndex:g??0}},Cr=({spineItemsManager:t,context:e,spineItemLocator:n,settings:i,spineLayout:o,viewport:s})=>{const a=(h,f)=>{const{left:y,top:b}=o.getSpineItemSpineLayoutInfo(f);return new E({x:Math.max(h.x-y,0),y:Math.max(h.y-b,0)})},c=h=>qe({spineItemPosition:new E({x:0,y:0}),itemLayout:o.getSpineItemSpineLayoutInfo(h)}),l=h=>t.items.find(f=>f.renderer.getDocumentFrame()===h),u=(h,f,y)=>{if(typeof y=="number"){const b=t.get(y);return b?n.getSpineItemPageIndexFromNode(h,f||0,b):void 0}return n.getSpineItemPageIndexFromNode(h,f||0,y)},d=({position:h,threshold:f,spineItem:y,restrictToScreen:b,useAbsoluteViewport:T=!0,viewport:M})=>{const w=y.numberOfPages,v=Array.from(Array(w)).map((U,Y)=>{const te=n.getSpineItemPositionFromPageIndex({pageIndex:Y,spineItem:y}),J=qe({spineItemPosition:te,itemLayout:o.getSpineItemSpineLayoutInfo(y)});return{index:Y,absolutePosition:{width:M.pageSize.width,height:M.pageSize.height,left:J.x,top:J.y,bottom:J.y+M.pageSize.height,right:J.x+M.pageSize.width}}}).reduce((U,{absolutePosition:Y,index:te})=>{const J=T?M.absoluteViewport:M.relativeViewport,Or=hn(h,M.absoluteViewport,J),Vr=ee.from(Or,J),{visible:kr}=gn({viewportPosition:Vr,restrictToScreen:b,threshold:f,itemPosition:Y});return kr?[...U,te]:U},[]),L=v[0],O=v[v.length-1]??L;if(!(L===void 0||O===void 0))return{beginPageIndex:L,endPageIndex:O}};return{getSpinePositionFromSpineItemPosition:({spineItem:h,spineItemPosition:f})=>{const y=o.getSpineItemSpineLayoutInfo(h);return qe({itemLayout:y,spineItemPosition:f})},_getAbsolutePageIndexFromPageIndex:h=>Pr({...h,spineItemsManager:t}),getSpineItemPagePositionFromSpinePosition:h=>{const f=xe({position:h,spineItemsManager:t,spineLayout:o});if(!f)return;const y=a(h,f),b=n.getSpineItemPageIndexFromPosition({itemWidth:f.layoutInfo.width,itemHeight:f.layoutInfo.height,position:y,isUsingVerticalWriting:!!f.isUsingVerticalWriting()}),T=n.getSpineItemPagePositionFromSpineItemPosition(y,b,f);return{spineItem:f,spineItemPageIndex:b,spineItemPagePosition:T,pageSize:s.value.pageSize}},getSpinePositionFromSpineItem:c,getSpineItemPositionFromSpinePosition:a,getSpineItemFromPosition:h=>xe({position:h,spineItemsManager:t,spineLayout:o}),getSpineItemFromIframe:l,getSpineItemPageIndexFromNode:u,getVisibleSpineItemsFromPosition:h=>$r({spineItemsManager:t,spineLayout:o,viewport:s,...h}),getVisiblePagesFromViewportPosition:h=>d({...h,viewport:s}),isPositionWithinSpineItem:(h,f)=>{const{bottom:y,left:b,right:T,top:M}=o.getSpineItemSpineLayoutInfo(f);return h.x>=b&&h.x<=T&&h.y<=y&&h.y>=M},spineItemLocator:n,getSafeSpineItemPositionFromUnsafeSpineItemPosition:(h,f)=>{const{height:y,width:b}=o.getSpineItemSpineLayoutInfo(f);return new E({x:Math.min(Math.max(0,h.x),b),y:Math.min(Math.max(0,h.y),y)})}}};class mn extends D{constructor(e){super(),this.spineItemsManager=e,this.states$=this.spineItemsManager.items$.pipe(r.switchMap(n=>r.merge(...n.map(i=>i.pipe(r.map(o=>({item:i,...o})),r.distinctUntilChanged(C.isShallowEqual))))),r.share()),this.itemResize$=this.spineItemsManager.items$.pipe(r.switchMap(n=>{const i=n.map(o=>re(o.element).pipe(r.map(s=>({entries:s,item:o}))));return r.merge(...i)}),r.share()),this.itemLoad$=this.spineItemsManager.items$.pipe(r.switchMap(n=>r.merge(...n.map(i=>i.loaded$.pipe(r.map(()=>i))))),r.share()),this.itemUnload$=this.spineItemsManager.items$.pipe(r.switchMap(n=>r.merge(...n.map(i=>i.unloaded$.pipe(r.map(()=>i))))),r.share())}}class Fr extends D{constructor(e,n,i,o,s){super(),this.spineItemsManager=e,this.spineItemsObserver=n,this.context=i,this.settings=o,this.viewport=s,this.externalLayoutTrigger=new r.Subject,this.spineItemsRelativeLayouts=[];const a=r.merge(n.itemLoad$,n.itemUnload$).pipe(r.map(()=>({immediate:!1}))),c=r.merge(this.externalLayoutTrigger,a);this.layout$=c.pipe(r.tap(()=>{this.spineItemsManager.items.forEach(l=>{l.markDirty()})}),r.debounce(l=>l.immediate?r.of(void 0):r.timer(50)),r.switchMap(()=>this.spineItemsManager.items.reduce((l,u,d)=>l.pipe(r.concatMap(({horizontalOffset:p,verticalOffset:g})=>{const m=p%s.absoluteViewport.width===0,h=d===e.items.length-1,f=o.values.computedPageTurnDirection==="vertical",y=i.isRTL(),b=this.getSpreadPosition(m,y),{edgeX:T,edgeY:M}=this.getStartEdges(f,m,p,g,s.absoluteViewport.height);return u.layout({spreadPosition:b,horizontalOffset:p,isLastItem:h,edgeX:T,edgeY:M}).pipe(r.map(({width:w,height:$})=>{const v=this.createSpineItemLayout(f,y,T,M,w,$,s.absoluteViewport.width);return this.spineItemsRelativeLayouts[d]=v,{horizontalOffset:T+w,verticalOffset:f?M+$:0}}))})),r.of({horizontalOffset:0,verticalOffset:0}))),r.takeUntil(this.destroy$),r.share()),this.layout$.subscribe(),this.watchForVerticalWritingUpdate()}watchForVerticalWritingUpdate(){this.spineItemsObserver.itemLoad$.pipe(r.tap(e=>{this.context.update({hasVerticalWriting:e.isUsingVerticalWriting()})}),r.takeUntil(this.destroy$)).subscribe()}layout(e={}){this.externalLayoutTrigger.next(e)}getSpineItemSpineLayoutInfo(e){const n=this.spineItemsManager.getSpineItemIndex(e)??0;return this.spineItemsRelativeLayouts[n]||new ue({left:0,right:0,top:0,bottom:0,width:0,height:0,x:0,y:0})}get numberOfPages(){return this.spineItemsManager.items.reduce((e,n)=>e+n.numberOfPages,0)}destroy(){super.destroy(),this.externalLayoutTrigger.complete()}getSpreadPosition(e,n){return this.settings.values.computedSpreadMode?e?n?"right":"left":n?"left":"right":"none"}getStartEdges(e,n,i,o,s){return e?{edgeX:n?0:i,edgeY:n?o:o-s}:{edgeX:i,edgeY:0}}createSpineItemLayout(e,n,i,o,s,a,c){if(e){const u=s+i,d=a+o;return new ue({left:i,right:u,top:o,bottom:d,height:a,width:s,x:i,y:o})}const l=n?c-i-s:i;return new ue({right:n?c-i:i+s,left:l,x:l,top:o,bottom:a,height:a,width:s,y:o})}}class fn extends D{constructor(e,n,i,o,s,a,c){super(),this.context=e,this.pagination=n,this.spineItemsManager=i,this.spineItemLocator=o,this.settings=s,this.hookManager=a,this.viewport=c,this.elementSubject=new r.BehaviorSubject(void 0),this.element$=this.elementSubject.asObservable(),this.spineItemsObserver=new mn(i),this.spineLayout=new Fr(i,this.spineItemsObserver,e,s,c),this.locator=Cr({context:e,spineItemsManager:i,spineItemLocator:o,settings:s,spineLayout:this.spineLayout,viewport:c}),this.spineItemsLoader=new Ir(this.context,i,this.locator,s,this.spineLayout,this.viewport),this.pages=new Z(this.spineLayout,this.spineItemsManager,this.spineItemLocator,this.context,this.locator,this.viewport);const l=e.watch("rootElement").pipe(I.filter(z),I.tap(d=>{const p=d.ownerDocument.createElement("div");p.style.cssText=`
|
|
197
197
|
height: 100%;
|
|
198
198
|
position: relative;
|
|
199
|
-
`,p.className=`${
|
|
199
|
+
`,p.className=`${R}-spine`,this.elementSubject.next(p)})),u=r.combineLatest([this.context.manifest$,this.element$]).pipe(I.tap(([d,p])=>{if(!p)return;this.spineItemsManager.destroyItems();const g=d.spineItems.map((m,h)=>new He(m,p,this.context,this.settings,this.hookManager,h,this.viewport));this.spineItemsManager.addMany(g)}));r.merge(u,l).pipe(I.takeUntil(this.destroy$)).subscribe()}get element(){return this.elementSubject.getValue()}layout(e){this.spineLayout.layout(e)}getSpineItemSpineLayoutInfo(e){return this.spineLayout.getSpineItemSpineLayoutInfo(e)}get layout$(){return this.pages.layout$}destroy(){super.destroy(),this.pages.destroy(),this.spineItemsLoader.destroy(),this.elementSubject.getValue()?.remove(),this.elementSubject.complete()}}class Sn extends D{constructor(e,n){super(),this.context=e,this.settings=n,this.orderedSpineItemsSubject=new r.BehaviorSubject([]),this.items$=this.orderedSpineItemsSubject.asObservable()}get(e){return typeof e=="number"?this.orderedSpineItemsSubject.value[e]:typeof e=="string"?this.orderedSpineItemsSubject.value.find(({item:n})=>n.id===e):e}comparePositionOf(e,n){const i=this.getSpineItemIndex(e)??0,o=this.getSpineItemIndex(n)??0;return i>o?"after":i===o?"same":"before"}getSpineItemIndex(e){const n=e instanceof He?e:this.get(e);if(!n)return;const i=this.orderedSpineItemsSubject.value.indexOf(n);return i<0?void 0:i}addMany(e){this.orderedSpineItemsSubject.next([...this.orderedSpineItemsSubject.getValue(),...e])}get items(){return this.orderedSpineItemsSubject.value}destroyItems(){this.orderedSpineItemsSubject.value.forEach(e=>{e.destroy()})}}class yn extends W{constructor(e,n){const i=document.createElement("div");i.setAttribute(`data-${pt}`,""),super({element:i,pageSize:{width:1,height:1},width:1,height:1}),this.context=e,this.settingsManager=n,this.layoutSubject=new r.Subject,this.layout$=this.layoutSubject.asObservable();const o=this.settingsManager.watch(["computedSpreadMode"]).pipe(r.tap(()=>{this.mergeCompare({pageSize:this.calculatePageSize(this.value)})})),s=this.context.watch("rootElement").pipe(r.tap(()=>{this.layout()}));r.merge(o,s).pipe(r.takeUntil(this.destroy$)).subscribe()}calculatePageSize(e){const{computedSpreadMode:n}=this.settingsManager.values;return{width:n?e.width/2:e.width,height:e.height}}syncAbsoluteViewportCssVariables(e){const{style:n}=this.value.element;e.width>0?P(n,Fe,`${e.width}px`):V(n,Fe),e.height>0?P(n,Ee,`${e.height}px`):V(n,Ee)}layout(){const e={width:this.value.element.clientWidth,height:this.value.element.clientHeight};this.syncAbsoluteViewportCssVariables(e),this.mergeCompare({pageSize:this.calculatePageSize(e),...e}),this.layoutSubject.next()}get absoluteViewport(){return new vr({width:this.value.width,height:this.value.height})}get pageSize(){return this.value.pageSize}get scaleFactor(){const e=this.absoluteViewport;return e.width?(this.value.element.getBoundingClientRect()?.width||e.width)/e.width:1}get relativeViewport(){const e=this.absoluteViewport,n=this.scaleFactor;return new wr({width:e.width/n,height:e.height/n})}destroy(){super.destroy(),this.layoutSubject.complete()}}const bn=`${ut}-core`,Er=t=>{const e=crypto.randomUUID(),n=new r.Subject,i=new r.Subject,o=new Zt,s=new Xt,a=new fr(t,s),c=new Gt(s,a),l=new Sn(s,a),u=new qt(o,l),d=new yn(s,a),p=an({context:s,settings:a,viewport:d}),g=new un(s,l),m=new fn(s,g,l,p,a,o,d),h=mr({cfi:u,context:s,spineItemsManager:l,hookManager:o,spine:m,settings:a,viewport:d}),f=new dn(s,g,l,m,p,h.isLocked$,u);h.navigationState$.subscribe(s.bridgeEvent.viewportStateSubject),h.navigation$.subscribe(s.bridgeEvent.navigationSubject),h.position$.subscribe(s.bridgeEvent.positionSubject),g.subscribe(s.bridgeEvent.paginationSubject);const y=(v={})=>{n.next(v)},b=v=>{const{containerElement:L,manifest:O}=v;if(s.manifest){F.warn("loading a new book is not supported yet");return}F.log("load",{options:v});const U=Lr(L,e);s.update({manifest:O,rootElement:U}),y({immediate:!0})},T=a.watch(["computedSpreadMode"]).pipe(I.skip(1),I.tap(()=>y())),M=n.pipe(I.tap(v=>{const L=s.value.rootElement;L&&(P(L.style,"overflow","hidden"),d.layout(),m.layout(v))}),I.takeUntil(i)),w=r.merge(M,T).subscribe();ne(document,bn,_o);const $=()=>{ye(document,bn),w.unsubscribe(),l.destroy(),f.destroy(),a.destroy(),g.destroy(),s.destroy(),h.destroy(),m.destroy(),c.destroy(),i.next(),i.complete(),d.destroy()};return{id:e,context:s,spine:m,hookManager:o,cfi:u,navigation:h,spineItemsObserver:m.spineItemsObserver,spineItemsManager:l,layout:y,load:b,destroy:$,pagination:{get state(){return g.value},get state$(){return g}},settings:a,renderHeadless:v=>l.get(v)?.renderer.renderHeadless()??r.of(void 0),viewport:d,viewportState$:s.bridgeEvent.viewportState$,viewportFree$:s.bridgeEvent.viewportFree$,state$:s.manifest$.pipe(I.map(v=>v?"ready":"idle")),features:c,$:{destroy$:i}}},Lr=(t,e)=>(t.style.cssText=`
|
|
200
200
|
${t.style.cssText}
|
|
201
201
|
background-color: white;
|
|
202
202
|
position: relative;
|
|
203
|
-
`,t.classList.add(`${
|
|
203
|
+
`,t.classList.add(`${R}-reader`),t.setAttribute(dt,e),t.setAttribute("data-prose-reader-container",e),t),Ar=$o(Wn(Eo(_n(An(vo(Fo(Oo(zi(at(Ei(Nn(On(Rt(St(Co(Er)))))))))))))))),Nr=t=>e=>t(e),Rr=5e3,Dr=(t,{itemReadinessTimeoutMs:e=Rr}={})=>It(t).pipe(r.switchMap(n=>{if(n.boundary==="start")return r.of(n);const i=t.spineItemsManager.items,o=i[i.length-1];return o?o.value.isReady?r.of(n):o.isReady$.pipe(r.filter(Boolean),r.first(),r.map(()=>n),e===1/0?r.identity:r.timeout({first:e,with:()=>r.EMPTY}),bt(t.navigation)):r.EMPTY}),r.share());Object.defineProperty(S,"isShallowEqual",{enumerable:!0,get:()=>C.isShallowEqual}),S.AbstractSpinePosition=Ce,S.CSS_VAR_ABSOLUTE_VIEWPORT_HEIGHT=Ee,S.CSS_VAR_ABSOLUTE_VIEWPORT_WIDTH=Fe,S.CfiManager=qt,S.Context=Xt,S.ControlledNavigationController=Kt,S.DestroyableClass=D,S.DocumentRenderer=Q,S.Features=Gt,S.HTML_ATTRIBUTE_DATA_READER_ID=dt,S.HTML_PREFIX=R,S.HTML_PREFIX_SCROLL_NAVIGATOR=ht,S.HTML_PREFIX_SPINE_ITEM=gt,S.HTML_PREFIX_VIEWPORT=pt,S.HTML_STYLE_PREFIX=ut,S.HookManager=Zt,S.InternalNavigator=nn,S.LayoutEntry=ce,S.Locker=_e,S.PAGINATION_UPDATE_AFTER_VIEWPORT_ADJUSTMENT_DEBOUNCE=mi,S.PROSE_READER_NAMESPACE=hi,S.Pages=Z,S.Pagination=un,S.PaginationController=dn,S.ReactiveEntity=W,S.ResourceHandler=se,S.ResourcesLocator=Tt,S.ScrollNavigationController=Ut,S.ScrollPosition=Oe,S.SettingsManager=pn,S.Spine=fn,S.SpineItem=He,S.SpineItemPageLayout=ct,S.SpineItemPageSpineLayout=lt,S.SpineItemPosition=E,S.SpineItemSpineLayout=ue,S.SpineItemsManager=Sn,S.SpineItemsObserver=mn,S.SpinePosition=N,S.UnboundScrollPosition=kt,S.UnboundSpineItemPagePosition=le,S.UnboundSpinePosition=A,S.VIEWPORT_ADJUSTMENT_THROTTLE=gi,S.Viewport=yn,S.consolidate=Pt,S.createReader=Ar,S.deferIdle=Te,S.deferNextResult=tt,S.generateCfiForSpineItemPage=Wt,S.generateCfiFromRange=zt,S.generateRootCfi=Ve,S.getAttributeValueFromString=Ie,S.getBase64FromBlob=Vn,S.getFrameViewportInfo=ie,S.getItemAnchor=Vo,S.htmlEnhancer=at,S.idle=Pe,S.injectCSS=ne,S.injectCSSToFrame=Ke,S.isDefined=z,S.isHtmlElement=Se,S.isHtmlTagElement=Je,S.isRootCfi=Ht,S.layoutEnhancer=St,S.mapKeysTo=we,S.observeBookBoundaryReached=Dr,S.observeIntersection=kn,S.observeMutation=Me,S.observeNextSettledNavigation=yt,S.observeResize=re,S.observeSettledNavigation=Re,S.paginationEnhancer=Rt,S.parseCfi=ke,S.pick=et,S.removeAttributeIfPresent=ge,S.removeCSS=Ln,S.removeStylePropertyIfPresent=V,S.resolveCfi=xt,S.rootEnhancer=Nr,S.setAttributeIfChanged=_,S.setPropertyIfChanged=Ye,S.setStylePropertyIfChanged=P,S.shouldEnableSpreadModeForViewport=Ae,S.shouldUseComputedSpreadModeForViewport=Ci,S.spinePositionToSpineItemSpineLayout=Mt,S.takeUntilNextNavigationSettled=bt,S.upsertCSSToFrame=B,S.waitForFrameLoad=Qe,S.waitForFrameReady=je,S.waitForNavigationSettled=Ne,S.waitForSwitch=K,S.watchKeys=oe,Object.defineProperty(S,Symbol.toStringTag,{value:"Module"})}));
|
|
204
204
|
//# sourceMappingURL=index.umd.cjs.map
|