@prose-reader/core 1.245.0 → 1.246.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/enhancers/layout/fixIframeScrollbar.d.ts +2 -0
- package/dist/index.js +255 -251
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +11 -11
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +4 -4
package/dist/index.umd.cjs
CHANGED
|
@@ -202,7 +202,7 @@
|
|
|
202
202
|
width: 100%;
|
|
203
203
|
height: 100%;
|
|
204
204
|
visibility: hidden;
|
|
205
|
-
`,l.appendChild(e),()=>{e?.remove(),e=void 0})):i.NEVER)),o=l=>i.scheduled(l,i.animationFrameScheduler).pipe(b.tap(()=>{e?.style.setProperty("visibility","hidden")})),s=n.context.bridgeEvent.viewportBusy$.pipe(b.tap(()=>{e?.style.setProperty("visibility","visible")})),r=o(n.viewportFree$).pipe(b.take(1)),c=n.settings.values$.pipe(b.map(()=>n.settings.values.computedPageTurnMode),b.distinctUntilChanged()).pipe(b.switchMap(l=>l==="controlled"?s.pipe(b.switchMap(()=>r)):o(i.of(void 0))),b.takeUntil(n.$.destroy$));return i.merge(t,c)},Cn=n=>{n.hookManager.register("item.onAfterLayout",({item:e,blankPagePosition:t,minimumWidth:o})=>{const s=n.spineItemsManager.get(e.id),r=s?.renderer.getDocumentFrame();if(s?.renditionLayout!=="reflowable"||!(r instanceof HTMLIFrameElement))return;const{hasViewport:a}=Y(r),{width:c}=n.viewport.pageSize,l=s?.renderer.getDocumentFrame();if(a){const u=c<o;t==="none"&&u&&l instanceof HTMLIFrameElement&&l?.style.setProperty("left",n.context.isRTL()?"75%":"25%")}})},
|
|
205
|
+
`,l.appendChild(e),()=>{e?.remove(),e=void 0})):i.NEVER)),o=l=>i.scheduled(l,i.animationFrameScheduler).pipe(b.tap(()=>{e?.style.setProperty("visibility","hidden")})),s=n.context.bridgeEvent.viewportBusy$.pipe(b.tap(()=>{e?.style.setProperty("visibility","visible")})),r=o(n.viewportFree$).pipe(b.take(1)),c=n.settings.values$.pipe(b.map(()=>n.settings.values.computedPageTurnMode),b.distinctUntilChanged()).pipe(b.switchMap(l=>l==="controlled"?s.pipe(b.switchMap(()=>r)):o(i.of(void 0))),b.takeUntil(n.$.destroy$));return i.merge(t,c)},Cn=n=>{n.hookManager.register("item.onDocumentLoad",({itemId:e})=>{n.spineItemsManager.get(e)?.renderer.getDocumentFrame()?.setAttribute("scrolling","no")})},Rn=n=>{n.hookManager.register("item.onAfterLayout",({item:e,blankPagePosition:t,minimumWidth:o})=>{const s=n.spineItemsManager.get(e.id),r=s?.renderer.getDocumentFrame();if(s?.renditionLayout!=="reflowable"||!(r instanceof HTMLIFrameElement))return;const{hasViewport:a}=Y(r),{width:c}=n.viewport.pageSize,l=s?.renderer.getDocumentFrame();if(a){const u=c<o;t==="none"&&u&&l instanceof HTMLIFrameElement&&l?.style.setProperty("left",n.context.isRTL()?"75%":"25%")}})},An=n=>n.spineItemsManager.items$.pipe(i.switchMap(e=>i.merge(...e.map(t=>t.pipe(i.tap(o=>{t.containerElement.dataset.isDirty=o.iDirty.toString(),t.containerElement.dataset.isReady=o.isReady.toString()}))))));let Dn=class extends We{computeOutputSettings(e){return e}hasSettingsChanged(e){return!$.isShallowEqual(this.outputSettings,e)}getCleanedParentInputSettings(e){const{layoutAutoResize:t,pageHorizontalMargin:o,pageVerticalMargin:s,layoutLayerTransition:r,...a}=e;return a}getDefaultSettings(){return{layoutAutoResize:"container",pageHorizontalMargin:24,pageVerticalMargin:24,layoutLayerTransition:!0}}};const Nn=n=>i.combineLatest([n.viewport.watch(["width","height"]),n.context.watch("manifest")]).pipe(i.tap(([{width:e,height:t},o])=>{const s=e>t;return!s&&o?.renditionSpread==="portrait"?n.settings.update({spreadMode:!0}):s&&(o?.renditionSpread===void 0||o?.renditionSpread==="auto"||o?.renditionSpread==="landscape"||o?.renditionSpread==="both")?n.settings.update({spreadMode:!0}):n.settings.update({spreadMode:!1})})),Je=n=>e=>{const{pageHorizontalMargin:t,pageVerticalMargin:o,layoutAutoResize:s,layoutLayerTransition:r}=e,a=n(e),c=new Dn({pageHorizontalMargin:t,pageVerticalMargin:o,layoutAutoResize:s,layoutLayerTransition:r},a.settings);a.hookManager.register("onViewportOffsetAdjust",()=>{let g=!1;a.spineItemsManager.items.forEach(f=>{const y=f.renderer.getDocumentFrame();!g&&y&&(y.getBoundingClientRect().left,g=!0)})}),a.hookManager.register("item.onBeforeLayout",({item:g})=>{const f=a.spineItemsManager.get(g.id),S=!!(g.mediaType??$.detectMimeTypeFromName(g.href))?.startsWith("image/"),{pageHorizontalMargin:w=0,pageVerticalMargin:v=0}=c.values,M=a.viewport.pageSize;if(f?.renditionLayout==="reflowable"&&!S){let P=M.width-w*2;const E=M.height-v*2;let A=M.width-w*2,R=w*2;f.isUsingVerticalWriting()&&(A=M.width-w*2,P=E,R=v*2);const W=f?.renderer.getDocumentFrame();W&&D(W,"prose-layout-enhancer-css",`
|
|
206
206
|
body {
|
|
207
207
|
width: ${A}px !important;
|
|
208
208
|
margin: ${v}px ${w}px !important;
|
|
@@ -220,7 +220,7 @@
|
|
|
220
220
|
td {
|
|
221
221
|
max-width: ${P}px;
|
|
222
222
|
}
|
|
223
|
-
`)}}),Cn(a),a.hookManager.register("item.onDocumentCreated",({documentContainer:g})=>{g.style.opacity="0",c.values.layoutLayerTransition&&(g.style.transition="opacity 300ms")}),a.hookManager.register("item.onBeforeLayout",({item:g})=>{const y=a.spineItemsManager.get(g.id)?.renderer.documentContainer;a.settings.values.computedPageTurnMode!=="scrollable"&&y?.setAttribute("tab-index","0")});const l=a.spineItemsObserver.itemIsReady$.pipe(b.filter(({isReady:g})=>g),b.tap(({item:g})=>{const f=g.renderer.documentContainer;f&&(f.style.opacity="1")})),u=c.values$.pipe(b.filter(({layoutAutoResize:g})=>g==="container"),b.switchMap(()=>a.context.watch("rootElement")),b.filter(z),b.switchMap(g=>Z(g)),b.debounceTime(100),b.filter(z),b.tap(()=>{a?.layout()})),p=En(a);c.watch(["pageHorizontalMargin","pageVerticalMargin"]).pipe(b.skip(1),b.tap(()=>{a.layout()}),b.takeUntil(a.$.destroy$)).subscribe();const d=a.spine.pages.pipe(b.shareReplay({refCount:!0,bufferSize:1})),h=
|
|
223
|
+
`)}}),Rn(a),Cn(a),a.hookManager.register("item.onDocumentCreated",({documentContainer:g})=>{g.style.opacity="0",c.values.layoutLayerTransition&&(g.style.transition="opacity 300ms")}),a.hookManager.register("item.onBeforeLayout",({item:g})=>{const y=a.spineItemsManager.get(g.id)?.renderer.documentContainer;a.settings.values.computedPageTurnMode!=="scrollable"&&y?.setAttribute("tab-index","0")});const l=a.spineItemsObserver.itemIsReady$.pipe(b.filter(({isReady:g})=>g),b.tap(({item:g})=>{const f=g.renderer.documentContainer;f&&(f.style.opacity="1")})),u=c.values$.pipe(b.filter(({layoutAutoResize:g})=>g==="container"),b.switchMap(()=>a.context.watch("rootElement")),b.filter(z),b.switchMap(g=>Z(g)),b.debounceTime(100),b.filter(z),b.tap(()=>{a?.layout()})),p=En(a);c.watch(["pageHorizontalMargin","pageVerticalMargin"]).pipe(b.skip(1),b.tap(()=>{a.layout()}),b.takeUntil(a.$.destroy$)).subscribe();const d=a.spine.pages.pipe(b.shareReplay({refCount:!0,bufferSize:1})),h=An(a),m=Nn(a);return i.merge(l,p,u,d,h,m).pipe(b.takeUntil(a.$.destroy$)).subscribe(),{...a,destroy:()=>{c.destroy(),a.destroy()},settings:c,layout$:a.spine.layout$,layoutInfo$:d,coordinates:Ln(a)}},Ke=`${`${k}-enhancer-loading`}-container`,On=(n,e)=>{const t=n.ownerDocument.createElement("div");return t.classList.add(Ke),t.style.cssText=`
|
|
224
224
|
height: 100%;
|
|
225
225
|
width: 100%;
|
|
226
226
|
max-width: ${e.absoluteViewport.width}px;
|
|
@@ -235,7 +235,7 @@
|
|
|
235
235
|
color: rgb(202, 202, 202);
|
|
236
236
|
background-color: white;
|
|
237
237
|
z-index: 1;
|
|
238
|
-
`,t},
|
|
238
|
+
`,t},Vn=({container:n,item:e})=>{const t=n.ownerDocument.createElement("div");t.innerText="prose",t.style.cssText=`
|
|
239
239
|
font-size: 4em;
|
|
240
240
|
`;const o=n.ownerDocument.createElement("div");return o.innerText=`loading ${e.id}`,o.style.cssText=`
|
|
241
241
|
font-size: 1.2em;
|
|
@@ -244,7 +244,7 @@
|
|
|
244
244
|
overflow: hidden;
|
|
245
245
|
max-width: 300px;
|
|
246
246
|
width: 80%;
|
|
247
|
-
`,n.appendChild(t),n.appendChild(o),n},Vn=n=>e=>{const{loadingElementCreate:t=On}=e,o=n(e),s=l=>i.of(l.reduce((u,{item:p,element:d})=>{d.style.zIndex="0";const h=d.querySelector(`.${Ke}`);if(h instanceof HTMLElement)return u[p.id]=h,u;const m=t({container:Nn(d,o.viewport),item:p});return d.appendChild(m),u[p.id]=m,u},{})),r=l=>i.combineLatest([o.spine.layout$,o.theme.$.theme$]).pipe(b.map(([,u])=>({width:o.viewport.absoluteViewport.width,theme:u})),b.distinctUntilChanged($.isShallowEqual),b.tap(({width:u,theme:p})=>{Object.values(l).forEach(d=>{d.style.setProperty("max-width",`${u}px`),d.style.setProperty("color",p==="sepia"?"#939393":"rgb(202, 202, 202)")})})),a=l=>o.spineItemsObserver.itemIsReady$.pipe(b.tap(({item:u,isReady:p})=>{l[u.item.id]?.style.setProperty("visibility",p?"hidden":"visible"),l[u.item.id]?.style.setProperty("z-index",p?"0":"1")})),c=o.spineItemsManager.items$.pipe(b.switchMap(l=>s(l)),b.shareReplay(1),b.takeUntil(o.context.destroy$));return c.pipe(b.switchMap(l=>i.merge(r(l),a(l))),b.takeUntil(o.$.destroy$)).subscribe(),{...o,loading:{$:{items$:c}}}};class kn extends x{getImageElement(){const e=this.documentContainer;if(e instanceof HTMLImageElement)return e}onCreateDocument(){const e=this.containerElement.ownerDocument.createElement("img");return i.from(this.resourcesHandler.getResource()).pipe(i.switchMap(t=>{if(this.setDocumentContainer(e),e.style.objectFit="contain",e.style.userSelect="none",t instanceof URL)return i.of(t.href);if(t instanceof Response)return i.from(t.blob()).pipe(i.map(o=>URL.createObjectURL(o)));throw new Error("Invalid resource")}),i.map(t=>{const o=this.getImageElement();return o&&(o.src=t),e}))}onLoadDocument(){const e=this.getImageElement();if(!e)throw new Error("invalid element");return this.attach(),i.fromEvent(e,"load")}onUnload(){const e=this.getImageElement();return e&&URL.revokeObjectURL(e.src),this.detach(),i.EMPTY}onLayout({spreadPosition:e}){const t=this.getImageElement(),{height:o,width:s}=this.viewport.value.pageSize;let r=o;const a=s;if(!t)return i.of(void 0);const c=t.naturalWidth||1,l=t.naturalHeight||1,u=c/l;return this.settings.values.computedPageTurnDirection==="vertical"&&this.settings.values.computedPageTurnMode==="scrollable"&&!this.settings.values.computedSpreadMode&&(r=Math.ceil(s/u)),t.style.height=`${r}px`,t.style.width=`${a}px`,t.style.objectPosition=e==="left"?"right":e==="right"?"left":"center",i.of({width:a,height:r})}onRenderHeadless(){return i.EMPTY}getDocumentFrame(){}}const Un=n=>e=>{const t=n({...e,getRenderer(a){const c=e.getRenderer?.(a),u=!!(a.mediaType??$.detectMimeTypeFromName(a.href))?.startsWith("image/");return!c&&u?p=>new kn(p):c}}),o=new IntersectionObserver(a=>{a.forEach(c=>{const l=c.target,u=Array.from(l.contentDocument?.body.getElementsByTagName("audio")||[]);c.isIntersecting?u.forEach(p=>{p.hasAttribute("autoplay")&&p.paused&&p.readyState>=2&&p.play().catch(console.error)}):u.forEach(p=>{p.pause(),p.currentTime=0})})},{threshold:.01}),s=new IntersectionObserver(a=>{a.forEach(c=>{if(c.target.tagName==="video"){const l=c.target;c.isIntersecting?l.hasAttribute("autoplay")&&l.paused&&l.readyState>=2&&l.play().catch(console.error):(l.pause(),l.currentTime=0)}})},{threshold:.5});return t.hookManager.register("item.onDocumentLoad",({destroy:a,itemId:c})=>{const l=t.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!l)return;o.observe(l);const u=l.contentDocument?.body.getElementsByTagName("video"),p=Array.from(u||[]).map(d=>(s.observe(d),()=>s.unobserve(d)));a(()=>{o.unobserve(l),p.forEach(d=>d())})}),{...t,destroy:()=>{o.disconnect(),s.disconnect(),t.destroy()}}},Wn=(n,e)=>n.links$.pipe(i.tap(t=>{if(!ke(t.target,"a")||t.type!=="click")return;const o=new URL(t.target.href),s=`${o.origin}${o.pathname}`;n.context.manifest?.spineItems.some(a=>a.href===s)&&e.goToUrl(o)})),U=L.namespace("navigation"),zn=({position:n,spineItem:e,pageHeight:t,pageWidth:o,spineItemLocator:s})=>{let r=new F({x:n.x-o,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y+t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},Qe=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:o,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||o.get(0),l=n;if(!c)return l;const u=s.getSpineItemPositionFromSpinePosition(n,c),p=zn({position:u,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(p,u)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:p,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new T({x:n.x-r.pageSize.width,y:0}):new T({y:n.y-r.pageSize.height,x:0}))},_n=({position:n,spineItem:e,context:t,navigationResolver:o,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=Qe({position:n,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===u.x)return o.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return o.getAdjustedPositionForSpread(o.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x+c.pageSize.width}:{...u,x:u.x-c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return o.getAdjustedPositionForSpread(u);const p=Qe({position:u,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return o.getAdjustedPositionForSpread(p)}return o.getAdjustedPositionForSpread(u)},Hn=({position:n,spineItem:e,pageHeight:t,pageWidth:o,spineItemLocator:s})=>{let r=new F({x:n.x+o,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y-t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},je=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:o,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||o.get(0),l=n;if(!c)return l;const u=s.getSpineItemPositionFromSpinePosition(n,c),p=Hn({position:u,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(p,u)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:p,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new T({x:n.x+r.pageSize.width,y:0}):new T({y:n.y+r.pageSize.height,x:0}))},Bn=({position:n,spineItem:e,context:t,navigationResolver:o,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=je({position:n,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===u.x)return o.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return o.getAdjustedPositionForSpread(o.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x-c.pageSize.width}:{...u,x:u.x+c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return o.getAdjustedPositionForSpread(u);const p=je({position:u,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return o.getAdjustedPositionForSpread(p)}return o.getAdjustedPositionForSpread(u)};class xn{constructor(e){this.reader=e,this.movingLastDelta={x:0,y:0},this.movingLastPosition=new T({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(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const o=Bn({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:t,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:o})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const o=_n({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:t,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:o})}goToCfi(e,t={animate:!0}){return this.reader.navigation.navigate({animation:t.animate?"turn":!1,cfi:e})}goToSpineItem({indexOrId:e,...t}){const o=this.reader.spineItemsManager.get(e);if(o===void 0){U.warn("goToSpineItem",`Ignore navigation to ${e} since the item does not exist`);return}this.reader.navigation.navigate({spineItem:o.index,...t})}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"){U.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"){U.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"){U.warn("You cannot call this navigation method on horizontal direction");return}return this.goToPreviousSpineItem()}goToBottomSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){U.warn("You cannot call this navigation method on horizontal direction");return}return this.goToNextSpineItem()}goToPageOfSpineItem({pageIndex:e,spineItemId:t,...o}){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:t});U.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:t,...o,position:s}),this.reader.navigation.navigate({position:s,...o})}goToAbsolutePageIndex({absolutePageIndex:e,...t}){const o=this.reader.spine.pages.fromAbsolutePageIndex(e);if(U.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...t,foundInfo:o}),o){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:o.pageIndex,spineItemId:o.itemIndex});return this.reader.navigation.navigate({position:s,...t})}}}class qn{constructor(e){this.reader=e,this.lastDelta={x:0,y:0},this.lastPosition=new T({x:0,y:0}),this.lastStartPosition=new T({x:0,y:0}),this.unlock=void 0}moveTo(e,{final:t,start:o}={}){if(this.reader.settings.values.computedPageTurnMode==="scrollable"){U.warn("pan control is not available on free page turn mode");return}const s=this.reader.settings.values.computedPageTurnDirection;o&&(this.unlock?.(),this.unlock=this.reader.navigation.lock(),this.lastDelta={x:0,y:0},this.lastStartPosition=this.reader.navigation.controlledNavigationController.viewportPosition,this.lastPosition=this.lastStartPosition);let r=this.reader.navigation.getNavigation().position;if(e){const a=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,c=Math.floor(e.x)-(this.lastDelta?.x||0),l=Math.floor(e.y)-(this.lastDelta?.y||0),u=Math.floor(s==="horizontal"?this.lastPosition.x-c/a:0),p=Math.floor(s==="horizontal"?0:this.lastPosition.y-l/a);r=new T({x:u,y:p}),this.lastDelta=e}else r=this.lastPosition;if(this.lastPosition=r,t){this.lastDelta={x:0,y:0},this.reader.navigation.navigate({position:r,animation:!1}),this.unlock?.();return}this.reader.navigation.navigate({position:r,animation:!1})}}const Xn=500;class Yn extends C{constructor(e,t){super(),this.scrollNavigationController=e,this.locker=t,this.navigationSubject=new i.Subject,this.navigation$=this.navigationSubject.asObservable();const o=this.scrollNavigationController.userScroll$.pipe(i.exhaustMap(s=>{const r=this.locker.lock();return i.merge(this.scrollNavigationController.userScroll$,i.of(s)).pipe(i.debounceTime(Xn,i.animationFrameScheduler),i.first(),i.tap(()=>{const a=this.scrollNavigationController.fromScrollPosition(this.scrollNavigationController.scrollPosition);this.navigationSubject.next({animation:!1,type:"scroll",position:a})}),i.finalize(()=>{r()}))}));i.merge(o).pipe(i.takeUntil(this.destroy$)).subscribe()}}const Gn=n=>n.pagination.state$.pipe(i.withLatestFrom(n.context.manifest$,n.settings.values$),i.map(([e,{spineItems:t,readingDirection:o},{computedPageTurnDirection:s}])=>{const r=t.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(r-1,0),l=e.endSpineItemIndex===Math.max(r-1,0),u=e.beginSpineItemIndex===0,p=e.beginPageIndexInSpineItem===0,d=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:s==="vertical"?!1:!p,canTurnRight:s==="vertical"?!1:!d,canGoTopSpineItem:s==="vertical"&&!a,canGoBottomSpineItem:s==="vertical"&&!c,canGoLeftSpineItem:s!=="vertical"&&(o==="ltr"&&!a||o==="rtl"&&!l),canGoRightSpineItem:s!=="vertical"&&(o==="ltr"&&!c||o==="rtl"&&!u)}}),i.distinctUntilChanged($.isShallowEqual)),Zn=({reader:n,duration:e})=>t=>{let o;const s=()=>{o?.(),o=void 0};return t.pipe(i.tap(()=>{o||(o=n?.navigation.lock())}),i.throttleTime(e,i.animationFrameScheduler,{trailing:!0,leading:!0}),i.tap(s),i.finalize(s))},Jn=n=>e=>{const t=n(e),o=Gn(t),s=new xn(t),r=new qn(t),a=new Yn(t.navigation.scrollNavigationController,t.navigation.locker),c=Wn(t,s),l=a.navigation$.pipe(i.tap(d=>{t.navigation.navigate(d)}));return i.merge(c,l).pipe(i.takeUntil(t.$.destroy$)).subscribe(),{...t,load:d=>{const{cfi:h,...m}=d;t.load(m),h&&s.goToCfi(h,{animate:!1})},destroy:()=>{a.destroy(),t.destroy()},navigation:{...t.navigation,state$:o,throttleLock:({duration:d,trigger:h})=>h.pipe(Zn({duration:d,reader:t})),moveTo:r.moveTo.bind(r),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)}}},et=(n,e,t)=>{const o=t.spineItems.findIndex(s=>s.href===n);return e.reduce((s,r)=>{const a=r.href.indexOf("#"),c=a>0?r.href.substr(0,a):r.href,l=c.substring(0,c.lastIndexOf("/")),u=n.substring(0,n.lastIndexOf("/")),p=n.endsWith(c),d=u!==""&&u.endsWith(l);if(p||d){const m=t.spineItems.findIndex(S=>S.href===r.href);if(o<m)return s;const f={title:r.title,path:r.path},y=et(n,r.contents,t);return y?{...f,subChapter:y}:f}return s},void 0)},Kn=(n,e)=>{const{href:t}=e;return et(t,n.nav?.toc??[],n)},Qn=n=>{const e=n.context.manifest,t=n.spineItemsManager.items;return e?t.reduce((o,{item:s})=>(o[s.id]=Kn(e,s),o),{}):{}},jn=n=>n.spineItemsManager.items$.pipe(i.startWith([]),i.map(()=>Qn(n))),ei=(n,e,t)=>n+e*t,ti=(n,e,t)=>{const{height:o,width:s}=t.layout.layoutInfo,{top:r,left:a}=n.spine.getSpineItemSpineLayoutInfo(t);return n.settings.values.computedPageTurnDirection==="vertical"?Math.max(0,Math.min(1,(e.y-r+n.viewport.absoluteViewport.height)/o)):Math.max(0,Math.min(1,(e.x-a+n.viewport.absoluteViewport.width)/s))},ni=(n,e,t,o,s)=>s.isReady$.pipe(i.first(),i.withLatestFrom(n.layoutInfo$),i.map(([r,a])=>{const c=n.context,l=c.manifest?.renditionLayout==="pre-paginated",u=c.manifest?.spineItems.length||0,p=c.manifest?.spineItems.slice(0,e).reduce((S,w)=>S+(w.progressionWeight??0),0)||0,d=n.spineItemsManager.getSpineItemIndex(s)??0,h=n.context.manifest?.spineItems.length??0,m=a.pages.filter(S=>S.itemIndex===d).length??0,g=c.manifest?.spineItems[e]?.progressionWeight??(d+1)/h;let f=(t+1)*(g/m);!l&&s.renditionLayout==="reflowable"&&!r&&(f=0);let y=p+f;return c.manifest?.renditionFlow==="scrolled-continuous"&&(r?f=ti(n,o,s):f=0,y=ei(p,g,f)),e===u-1&&t===m-1&&y>.99?1:y})),ii=n=>n.spine.layout$.pipe(i.debounceTime(10,i.animationFrameScheduler),i.withLatestFrom(n.pagination.state$),i.map(()=>({numberOfPagesPerItems:n.spineItemsManager.items.reduce((t,o)=>[...t,o.numberOfPages],[]),numberOfTotalPages:n.spine.pages.value.pages.length})),i.distinctUntilChanged($.isShallowEqual),i.startWith({numberOfPagesPerItems:[],numberOfTotalPages:0})),oi=(n,e,t,o)=>{const s=e.beginSpineItemIndex!==void 0?n.spineItemsManager.get(e.beginSpineItemIndex):void 0,r=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return i.of({...e,beginChapterInfo:s?t[s.item.id]:void 0,beginSpineItemReadingDirection:s?.readingDirection,endChapterInfo:r?t[r.item.id]:void 0,endSpineItemReadingDirection:r?.readingDirection,percentageEstimateOfBook:o,isUsingSpread:n.settings.values.computedSpreadMode??!1})},si=n=>i.combineLatest([n.pagination.state$,n.layout$]).pipe(i.switchMap(([e])=>{const t=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return t?ni(n,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n.navigation.getNavigation().position,t):i.of(0)})),ri=n=>{const e=jn(n),t=ii(n),o=new i.BehaviorSubject({...n.pagination.state,beginChapterInfo:void 0,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,endSpineItemReadingDirection:void 0,percentageEstimateOfBook:0}),s=i.combineLatest([n.pagination.state$,e,si(n)]).pipe(i.switchMap(([a,c,l])=>oi(n,a,c,l).pipe(i.map(u=>({...a,...u})))),i.distinctUntilChanged($.isShallowEqual));return{paginationInfo$:i.combineLatest([s,t]).pipe(i.map(([a,c])=>({...a,...c,beginAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.beginSpineItemIndex).reduce((l,u)=>l+u,a.beginPageIndexInSpineItem??0),endAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.endSpineItemIndex).reduce((l,u)=>l+u,a.endPageIndexInSpineItem??0)})),i.tap(a=>{o.next(a)}),i.shareReplay(1)),getPaginationInfo:()=>o.value}},H=n=>V.generate({spineIndex:n.index,spineId:n.id}),tt=({nodeOrRange:n,offset:e,item:t})=>{const o="ownerDocument"in n?n.ownerDocument:n.startContainer.ownerDocument;return!o||!o?.documentElement||n===o?H(t):Zt(n)?V.generate({start:{node:n.startContainer,offset:n.startOffset,spineIndex:t.index,spineId:t.id},end:{node:n.endContainer,offset:n.endOffset,spineIndex:t.index,spineId:t.id}}):V.generate({node:n,offset:e,spineIndex:t.index,spineId:t.id})},te=({pageIndex:n,spineItem:e,spine:t})=>{const s=t.pages.value.pages.find(a=>a.itemIndex===e.index&&a.pageIndex===n)?.firstVisibleNode,r=e.renderer.getDocumentFrame();return s&&r instanceof HTMLIFrameElement&&r.contentWindow?.document?tt({nodeOrRange:s.node,offset:s.offset,item:e.item}).trim():H(e.item)},nt=(n,e)=>tt({nodeOrRange:n,item:e}),ai=n=>n.index.toString(),it=n=>n[0]?.index===6&&n.length>1,ne=n=>{const e=V.parse(n);return V.isIndirectionOnly(e)},ci=n=>Array.isArray(n)?n[0]&&it(n[0])?n[0]:void 0:n.parent[0]&&it(n.parent[0])?n.parent[0]:void 0,ie=n=>{const e=V.parse(n),r=((ci(e)??[])[1]?.index??2)/2-1,a=V.isParsedCfiRange(e),c=a?e.end.at(-1)?.at(-1)?.offset:e.at(-1)?.at(-1)?.offset;return{isCfiRange:a,cleanedCfi:n,itemIndex:r,offset:c??0}},ye=({cfi:n,spineItemsManager:e})=>{const{itemIndex:t,...o}=ie(n),s=e.get(t);if(!s)return{...o,itemIndex:t,node:null};const r=s.renderer.getDocumentFrame();if(r instanceof HTMLIFrameElement){const a=r.contentWindow?.document;if(a)try{const c=V.resolve(n,a,{throwOnError:!0});return{...o,itemIndex:t,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:s}}catch(c){return L.warn(`Error resolving cfi: ${n}.`),L.warn(c),{...o,spineItem:s,itemIndex:t,node:null}}}return{...o,itemIndex:t,spineItem:s,node:null}},li=(n,e)=>{if("cfi"in e){const{itemIndex:r,...a}=n.cfi.parseCfi(e.cfi);return{...e,...a,itemIndex:r,node:null}}const t=n.spineItemsManager.get(e);if(!t)throw new Error("Spine item not found");const o=H(t.item);return{...n.cfi.parseCfi(o),cfi:H(t.item),itemIndex:t.index,node:null}},ot=(n,e)=>{let t=n?.itemPageIndex;const{itemIndex:o,...s}=e.cfi.parseCfi(n.cfi),r=e.spineItemsManager.get(o);return r?he().pipe(i.withLatestFrom(r.isReady$),i.map(([,a])=>{const{node:c=null,offset:l,range:u}=a?e.cfi.resolveCfi({cfi:n.cfi}):{};r.renditionLayout!=="pre-paginated"&&c&&(t=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,l??0,r)??t);let d=n?.absolutePageIndex;return t===void 0&&(t=0),d=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:t,spineItemOrId:r})??n?.absolutePageIndex,{...n,...s,range:u,itemIndex:o,node:c,startOffset:l,absolutePageIndex:d,itemPageIndex:t}})):i.of({...n,itemIndex:o,...s})};class st{constructor(e){this.reader=e,this.locatorsByKey=new Map,this.deregisterMemoizedStream=t=>{const o=this.locatorsByKey.get(t);o&&(o.observerCount--,o.observerCount===0&&this.locatorsByKey.delete(t))},this.locate=(t,o)=>{const s={resource:t,meta:li(this.reader,t)};return me(()=>{const r=this.reader.spineItemsManager.get(s.meta.itemIndex??0),a=r?.renditionLayout==="reflowable",c=o.mode==="shallow"||!a||!r?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([r.index]),l="cfi"in t?t.cfi:void 0,u=l?this.locatorsByKey.get(l):void 0,p=h=>h.pipe(i.finalize(()=>{l&&this.deregisterMemoizedStream(l),setTimeout(()=>{c()},1e3)}));if(l&&u)return u.observerCount++,p(u.consolidate$.pipe(i.map(({resource:h,meta:m})=>({resource:h,meta:m}))));const d=this.reader.spine.layout$.pipe(i.debounceTime(10),i.startWith(s),i.switchScan(h=>ot(h.meta,this.reader).pipe(i.map(m=>({...h,meta:m}))),s),i.shareReplay({refCount:!0,bufferSize:1}));return l&&this.locatorsByKey.set(l,{observerCount:1,consolidate$:d}),p(d)})}}locateResource(e,t){return Array.isArray(e)?me(()=>i.combineLatest(e.map(o=>this.locate(o,t??{}))).pipe(i.defaultIfEmpty([]))):this.locate(e,t??{})}}const rt=n=>e=>{const t=n(e),{paginationInfo$:o,getPaginationInfo:s}=ri(t);o.pipe(i.takeUntil(t.$.destroy$)).subscribe();const r=new st(t);return{...t,locateResource:r.locateResource.bind(r),pagination:{...t.pagination,get state(){return s()},get state$(){return o}}}},ui=n=>({put:(r,a)=>new Promise((c,l)=>{const u=n.transaction(["store"],"readwrite");u.onerror=h=>{l(h)},u.oncomplete=()=>{c()};const d=u.objectStore("store").put(a,r);d.onsuccess=()=>{c()},d.onerror=h=>{l(h)}}),keys:()=>new Promise((r,a)=>{const c=n.transaction(["store"],"readonly");c.onerror=d=>{a(d)};const u=c.objectStore("store").openKeyCursor(),p=[];u.onsuccess=()=>{const d=u.result;if(!d){r(p);return}p.push(d.key),d.continue()},u.onerror=()=>{a(u.error)}}),get:r=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),p=l.objectStore("store").get(r);p.onsuccess=()=>{let d=p.result;d===void 0&&(d=null),a(d)},l.onerror=()=>{c(p.error)}}),remove:r=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),p=l.objectStore("store").delete(r);l.onerror=()=>{c(p.error)},l.oncomplete=()=>{a()},l.onabort=()=>{const d=p.error?p.error:p.transaction?.error;c(d)}})}),be=async n=>new Promise((e,t)=>{const o=window.indexedDB.open(n);o.onerror=s=>{t(s)},o.onsuccess=()=>{e(ui(o.result))},o.onupgradeneeded=()=>{o.result.createObjectStore("store")}}),pi=n=>{let e=Date.now().toString();const t=new i.Subject,o=l=>{if(typeof l=="string"||typeof l=="object"){const u=typeof l=="object"?l.id:l;return n.manifest?.spineItems.find(p=>p.id===u)}return n.manifest?.spineItems[l]},s=async(l,u)=>{const p=o(l);if(!p)return new Response("Item not found",{status:404});const h=await(await be("prose-reader")).get(`${e}_${p.id}`);if(h)return new Response(h,{status:200});const m=u&&await u(p)||await fetch(p.href);return r(p,m.clone()),m},r=(l,u)=>{t.next({id:l,data:u})};t.asObservable().pipe(b.mergeMap(({id:l,data:u})=>{const p=o(l);return p?i.from(i.forkJoin([be("prose-reader"),i.from(u.blob())])).pipe(b.switchMap(([d,h])=>i.from(d.put(`${e}_${p.id}`,h))),b.catchError(d=>(L.error(d),i.EMPTY))):i.EMPTY}),b.takeUntil(n.destroy$)).subscribe();const a=n.manifest$.pipe(b.tap(()=>{e=Date.now().toString()}));return i.merge(a).pipe(b.switchMap(()=>(L.debug("Cleanup up old cache..."),i.from(be("prose-reader")).pipe(b.switchMap(l=>i.from(l.keys()).pipe(b.map(u=>u.filter(p=>!p.toString().startsWith(e))),b.switchMap(u=>{const p=u.map(d=>l.remove(d));return i.from(Promise.all(p))}))),b.catchError(l=>(L.error(l),i.EMPTY))))),b.takeUntil(n.destroy$)).subscribe(),{get:s,destroy:()=>{t.complete()}}},di=n=>e=>{const t=n(e),o=pi(t.context);return{...t,destroy:()=>{o.destroy(),t.destroy()}}},gi=(n,e)=>{const t=n.node.ownerDocument?.createRange(),o=n.node.compareDocumentPosition(e.node);if(t){try{if(o&Node.DOCUMENT_POSITION_PRECEDING)t.setStart(e.node,e.offset||0),t.setEnd(n.node,n.offset||0);else if(o&Node.DOCUMENT_POSITION_FOLLOWING)t.setStart(n.node,n.offset||0),t.setEnd(e.node,e.offset||0);else{const s=Math.min(n.offset||0,e.offset||0),r=Math.max(n.offset||0,e.offset||0);t.setStart(n.node,s),t.setEnd(n.node,r)}}catch(s){L.warn("Failed to create range from selection",s,{anchor:n,focus:e})}return t}},hi=({selection:n,spineItem:e})=>{const{anchorNode:t,anchorOffset:o,focusNode:s,focusOffset:r}=n;if(!(!t||!s))try{return gi({node:t,offset:o},{node:s,offset:r})}catch(a){L.warn("Failed to create range from selection",a,{selection:n,spineItem:e});return}};class mi extends C{constructor(e){super();const t=e.contentDocument||e.contentWindow?.document;if(!t)this.selectionChange$=i.NEVER,this.selectionOver$=i.NEVER;else{const o=fe(t.body,{childList:!0,subtree:!0}).pipe(i.filter(r=>!!r.find(a=>a.type==="childList"&&a.removedNodes.length))),s=e.parentElement?fe(e.parentElement,{childList:!0}).pipe(i.filter(r=>!!r.find(a=>Array.from(a.removedNodes).includes(e)))):i.of(null);this.selectionChange$=i.merge(i.fromEvent(t,"selectionchange"),o).pipe(i.map(()=>t.getSelection()),i.takeUntil(i.merge(s,this.destroy$)),i.endWith(null)),this.selectionOver$=i.fromEvent(t,"pointerdown").pipe(i.switchMap(()=>i.merge(i.fromEvent(t,"pointerup"),i.fromEvent(t,"pointercancel"),i.fromEvent(t,"contextmenu")).pipe(i.first(),i.delay(0),i.map(r=>{const a=t.getSelection();return a&&!a.isCollapsed?[r,a]:void 0}),i.filter(z))),i.takeUntil(i.merge(s,this.destroy$)))}}}const fi=n=>n.watch("isLoaded").pipe(i.switchMap(()=>{const e=n.renderer.getDocumentFrame(),t=e?.contentDocument||e?.contentWindow?.document;if(!e||!t)return i.NEVER;const o=new mi(e);return i.merge(o.selectionChange$.pipe(i.map(s=>{if(s?.toString())return{type:"change",selection:s}})),o.selectionOver$.pipe(i.map(([s,r])=>({type:"over",event:s,selection:r})))).pipe(i.takeUntil(n.unloaded$),i.endWith(void 0),i.finalize(()=>{o.destroy()}))}),i.distinctUntilChanged()),Si=n=>e=>{const t=n(e);let o;const s=t.spineItemsManager.items$.pipe(i.switchMap(p=>{const d=p.map(h=>{const m=t.spineItemsManager.getSpineItemIndex(h)??0;return fi(h).pipe(i.map(g=>{if(g)return{...g,itemIndex:m}}))});return i.merge(...d)}),i.startWith(void 0),i.distinctUntilChanged(),i.tap(p=>{o=p}),i.shareReplay({refCount:!0,bufferSize:1})),r=s,a=s.pipe(i.map(p=>!!p),i.distinctUntilChanged(),i.filter(p=>p),i.share()),c=a.pipe(i.switchMap(()=>r),i.distinctUntilChanged(),i.filter(p=>!p),i.share()),l=s.pipe(i.filter(p=>p?.type==="over"),i.share()),u=t.context.watch("rootElement").pipe(i.filter(ae.isDefined),i.switchMap(p=>i.fromEvent(p,"pointerdown")),i.withLatestFrom(r),i.map(([,p])=>p),i.startWith(void 0),i.shareReplay({refCount:!0,bufferSize:1}));return i.merge(r,u).pipe(i.takeUntil(t.$.destroy$)).subscribe(),{...t,selection:{selection$:r,selectionStart$:a,selectionEnd$:c,selectionOver$:l,lastSelectionOnPointerdown$:u,getSelection:()=>o,createOrderedRangeFromSelection:hi}}},at=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],yi=n=>e=>{const t=n(e),o=new i.BehaviorSubject(e.theme??"bright"),s=()=>{const c=at.find(l=>l.name===o.value);return`
|
|
247
|
+
`,n.appendChild(t),n.appendChild(o),n},kn=n=>e=>{const{loadingElementCreate:t=Vn}=e,o=n(e),s=l=>i.of(l.reduce((u,{item:p,element:d})=>{d.style.zIndex="0";const h=d.querySelector(`.${Ke}`);if(h instanceof HTMLElement)return u[p.id]=h,u;const m=t({container:On(d,o.viewport),item:p});return d.appendChild(m),u[p.id]=m,u},{})),r=l=>i.combineLatest([o.spine.layout$,o.theme.$.theme$]).pipe(b.map(([,u])=>({width:o.viewport.absoluteViewport.width,theme:u})),b.distinctUntilChanged($.isShallowEqual),b.tap(({width:u,theme:p})=>{Object.values(l).forEach(d=>{d.style.setProperty("max-width",`${u}px`),d.style.setProperty("color",p==="sepia"?"#939393":"rgb(202, 202, 202)")})})),a=l=>o.spineItemsObserver.itemIsReady$.pipe(b.tap(({item:u,isReady:p})=>{l[u.item.id]?.style.setProperty("visibility",p?"hidden":"visible"),l[u.item.id]?.style.setProperty("z-index",p?"0":"1")})),c=o.spineItemsManager.items$.pipe(b.switchMap(l=>s(l)),b.shareReplay(1),b.takeUntil(o.context.destroy$));return c.pipe(b.switchMap(l=>i.merge(r(l),a(l))),b.takeUntil(o.$.destroy$)).subscribe(),{...o,loading:{$:{items$:c}}}};class Un extends x{getImageElement(){const e=this.documentContainer;if(e instanceof HTMLImageElement)return e}onCreateDocument(){const e=this.containerElement.ownerDocument.createElement("img");return i.from(this.resourcesHandler.getResource()).pipe(i.switchMap(t=>{if(this.setDocumentContainer(e),e.style.objectFit="contain",e.style.userSelect="none",t instanceof URL)return i.of(t.href);if(t instanceof Response)return i.from(t.blob()).pipe(i.map(o=>URL.createObjectURL(o)));throw new Error("Invalid resource")}),i.map(t=>{const o=this.getImageElement();return o&&(o.src=t),e}))}onLoadDocument(){const e=this.getImageElement();if(!e)throw new Error("invalid element");return this.attach(),i.fromEvent(e,"load")}onUnload(){const e=this.getImageElement();return e&&URL.revokeObjectURL(e.src),this.detach(),i.EMPTY}onLayout({spreadPosition:e}){const t=this.getImageElement(),{height:o,width:s}=this.viewport.value.pageSize;let r=o;const a=s;if(!t)return i.of(void 0);const c=t.naturalWidth||1,l=t.naturalHeight||1,u=c/l;return this.settings.values.computedPageTurnDirection==="vertical"&&this.settings.values.computedPageTurnMode==="scrollable"&&!this.settings.values.computedSpreadMode&&(r=Math.ceil(s/u)),t.style.height=`${r}px`,t.style.width=`${a}px`,t.style.objectPosition=e==="left"?"right":e==="right"?"left":"center",i.of({width:a,height:r})}onRenderHeadless(){return i.EMPTY}getDocumentFrame(){}}const Wn=n=>e=>{const t=n({...e,getRenderer(a){const c=e.getRenderer?.(a),u=!!(a.mediaType??$.detectMimeTypeFromName(a.href))?.startsWith("image/");return!c&&u?p=>new Un(p):c}}),o=new IntersectionObserver(a=>{a.forEach(c=>{const l=c.target,u=Array.from(l.contentDocument?.body.getElementsByTagName("audio")||[]);c.isIntersecting?u.forEach(p=>{p.hasAttribute("autoplay")&&p.paused&&p.readyState>=2&&p.play().catch(console.error)}):u.forEach(p=>{p.pause(),p.currentTime=0})})},{threshold:.01}),s=new IntersectionObserver(a=>{a.forEach(c=>{if(c.target.tagName==="video"){const l=c.target;c.isIntersecting?l.hasAttribute("autoplay")&&l.paused&&l.readyState>=2&&l.play().catch(console.error):(l.pause(),l.currentTime=0)}})},{threshold:.5});return t.hookManager.register("item.onDocumentLoad",({destroy:a,itemId:c})=>{const l=t.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!l)return;o.observe(l);const u=l.contentDocument?.body.getElementsByTagName("video"),p=Array.from(u||[]).map(d=>(s.observe(d),()=>s.unobserve(d)));a(()=>{o.unobserve(l),p.forEach(d=>d())})}),{...t,destroy:()=>{o.disconnect(),s.disconnect(),t.destroy()}}},zn=(n,e)=>n.links$.pipe(i.tap(t=>{if(!ke(t.target,"a")||t.type!=="click")return;const o=new URL(t.target.href),s=`${o.origin}${o.pathname}`;n.context.manifest?.spineItems.some(a=>a.href===s)&&e.goToUrl(o)})),U=L.namespace("navigation"),_n=({position:n,spineItem:e,pageHeight:t,pageWidth:o,spineItemLocator:s})=>{let r=new F({x:n.x-o,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y+t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},Qe=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:o,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||o.get(0),l=n;if(!c)return l;const u=s.getSpineItemPositionFromSpinePosition(n,c),p=_n({position:u,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(p,u)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:p,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new T({x:n.x-r.pageSize.width,y:0}):new T({y:n.y-r.pageSize.height,x:0}))},Hn=({position:n,spineItem:e,context:t,navigationResolver:o,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=Qe({position:n,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===u.x)return o.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return o.getAdjustedPositionForSpread(o.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x+c.pageSize.width}:{...u,x:u.x-c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return o.getAdjustedPositionForSpread(u);const p=Qe({position:u,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return o.getAdjustedPositionForSpread(p)}return o.getAdjustedPositionForSpread(u)},Bn=({position:n,spineItem:e,pageHeight:t,pageWidth:o,spineItemLocator:s})=>{let r=new F({x:n.x+o,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y-t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},je=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:o,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||o.get(0),l=n;if(!c)return l;const u=s.getSpineItemPositionFromSpinePosition(n,c),p=Bn({position:u,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(p,u)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:p,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new T({x:n.x+r.pageSize.width,y:0}):new T({y:n.y+r.pageSize.height,x:0}))},xn=({position:n,spineItem:e,context:t,navigationResolver:o,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=je({position:n,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===u.x)return o.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return o.getAdjustedPositionForSpread(o.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x-c.pageSize.width}:{...u,x:u.x+c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return o.getAdjustedPositionForSpread(u);const p=je({position:u,viewport:c,navigationResolver:o,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return o.getAdjustedPositionForSpread(p)}return o.getAdjustedPositionForSpread(u)};class qn{constructor(e){this.reader=e,this.movingLastDelta={x:0,y:0},this.movingLastPosition=new T({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(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const o=xn({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:t,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:o})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const o=Hn({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:t,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position:o})}goToCfi(e,t={animate:!0}){return this.reader.navigation.navigate({animation:t.animate?"turn":!1,cfi:e})}goToSpineItem({indexOrId:e,...t}){const o=this.reader.spineItemsManager.get(e);if(o===void 0){U.warn("goToSpineItem",`Ignore navigation to ${e} since the item does not exist`);return}this.reader.navigation.navigate({spineItem:o.index,...t})}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"){U.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"){U.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"){U.warn("You cannot call this navigation method on horizontal direction");return}return this.goToPreviousSpineItem()}goToBottomSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){U.warn("You cannot call this navigation method on horizontal direction");return}return this.goToNextSpineItem()}goToPageOfSpineItem({pageIndex:e,spineItemId:t,...o}){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:t});U.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:t,...o,position:s}),this.reader.navigation.navigate({position:s,...o})}goToAbsolutePageIndex({absolutePageIndex:e,...t}){const o=this.reader.spine.pages.fromAbsolutePageIndex(e);if(U.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...t,foundInfo:o}),o){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:o.pageIndex,spineItemId:o.itemIndex});return this.reader.navigation.navigate({position:s,...t})}}}class Xn{constructor(e){this.reader=e,this.lastDelta={x:0,y:0},this.lastPosition=new T({x:0,y:0}),this.lastStartPosition=new T({x:0,y:0}),this.unlock=void 0}moveTo(e,{final:t,start:o}={}){if(this.reader.settings.values.computedPageTurnMode==="scrollable"){U.warn("pan control is not available on free page turn mode");return}const s=this.reader.settings.values.computedPageTurnDirection;o&&(this.unlock?.(),this.unlock=this.reader.navigation.lock(),this.lastDelta={x:0,y:0},this.lastStartPosition=this.reader.navigation.controlledNavigationController.viewportPosition,this.lastPosition=this.lastStartPosition);let r=this.reader.navigation.getNavigation().position;if(e){const a=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,c=Math.floor(e.x)-(this.lastDelta?.x||0),l=Math.floor(e.y)-(this.lastDelta?.y||0),u=Math.floor(s==="horizontal"?this.lastPosition.x-c/a:0),p=Math.floor(s==="horizontal"?0:this.lastPosition.y-l/a);r=new T({x:u,y:p}),this.lastDelta=e}else r=this.lastPosition;if(this.lastPosition=r,t){this.lastDelta={x:0,y:0},this.reader.navigation.navigate({position:r,animation:!1}),this.unlock?.();return}this.reader.navigation.navigate({position:r,animation:!1})}}const Yn=500;class Gn extends C{constructor(e,t){super(),this.scrollNavigationController=e,this.locker=t,this.navigationSubject=new i.Subject,this.navigation$=this.navigationSubject.asObservable();const o=this.scrollNavigationController.userScroll$.pipe(i.exhaustMap(s=>{const r=this.locker.lock();return i.merge(this.scrollNavigationController.userScroll$,i.of(s)).pipe(i.debounceTime(Yn,i.animationFrameScheduler),i.first(),i.tap(()=>{const a=this.scrollNavigationController.fromScrollPosition(this.scrollNavigationController.scrollPosition);this.navigationSubject.next({animation:!1,type:"scroll",position:a})}),i.finalize(()=>{r()}))}));i.merge(o).pipe(i.takeUntil(this.destroy$)).subscribe()}}const Zn=n=>n.pagination.state$.pipe(i.withLatestFrom(n.context.manifest$,n.settings.values$),i.map(([e,{spineItems:t,readingDirection:o},{computedPageTurnDirection:s}])=>{const r=t.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(r-1,0),l=e.endSpineItemIndex===Math.max(r-1,0),u=e.beginSpineItemIndex===0,p=e.beginPageIndexInSpineItem===0,d=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:s==="vertical"?!1:!p,canTurnRight:s==="vertical"?!1:!d,canGoTopSpineItem:s==="vertical"&&!a,canGoBottomSpineItem:s==="vertical"&&!c,canGoLeftSpineItem:s!=="vertical"&&(o==="ltr"&&!a||o==="rtl"&&!l),canGoRightSpineItem:s!=="vertical"&&(o==="ltr"&&!c||o==="rtl"&&!u)}}),i.distinctUntilChanged($.isShallowEqual)),Jn=({reader:n,duration:e})=>t=>{let o;const s=()=>{o?.(),o=void 0};return t.pipe(i.tap(()=>{o||(o=n?.navigation.lock())}),i.throttleTime(e,i.animationFrameScheduler,{trailing:!0,leading:!0}),i.tap(s),i.finalize(s))},Kn=n=>e=>{const t=n(e),o=Zn(t),s=new qn(t),r=new Xn(t),a=new Gn(t.navigation.scrollNavigationController,t.navigation.locker),c=zn(t,s),l=a.navigation$.pipe(i.tap(d=>{t.navigation.navigate(d)}));return i.merge(c,l).pipe(i.takeUntil(t.$.destroy$)).subscribe(),{...t,load:d=>{const{cfi:h,...m}=d;t.load(m),h&&s.goToCfi(h,{animate:!1})},destroy:()=>{a.destroy(),t.destroy()},navigation:{...t.navigation,state$:o,throttleLock:({duration:d,trigger:h})=>h.pipe(Jn({duration:d,reader:t})),moveTo:r.moveTo.bind(r),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)}}},et=(n,e,t)=>{const o=t.spineItems.findIndex(s=>s.href===n);return e.reduce((s,r)=>{const a=r.href.indexOf("#"),c=a>0?r.href.substr(0,a):r.href,l=c.substring(0,c.lastIndexOf("/")),u=n.substring(0,n.lastIndexOf("/")),p=n.endsWith(c),d=u!==""&&u.endsWith(l);if(p||d){const m=t.spineItems.findIndex(S=>S.href===r.href);if(o<m)return s;const f={title:r.title,path:r.path},y=et(n,r.contents,t);return y?{...f,subChapter:y}:f}return s},void 0)},Qn=(n,e)=>{const{href:t}=e;return et(t,n.nav?.toc??[],n)},jn=n=>{const e=n.context.manifest,t=n.spineItemsManager.items;return e?t.reduce((o,{item:s})=>(o[s.id]=Qn(e,s),o),{}):{}},ei=n=>n.spineItemsManager.items$.pipe(i.startWith([]),i.map(()=>jn(n))),ti=(n,e,t)=>n+e*t,ni=(n,e,t)=>{const{height:o,width:s}=t.layout.layoutInfo,{top:r,left:a}=n.spine.getSpineItemSpineLayoutInfo(t);return n.settings.values.computedPageTurnDirection==="vertical"?Math.max(0,Math.min(1,(e.y-r+n.viewport.absoluteViewport.height)/o)):Math.max(0,Math.min(1,(e.x-a+n.viewport.absoluteViewport.width)/s))},ii=(n,e,t,o,s)=>s.isReady$.pipe(i.first(),i.withLatestFrom(n.layoutInfo$),i.map(([r,a])=>{const c=n.context,l=c.manifest?.renditionLayout==="pre-paginated",u=c.manifest?.spineItems.length||0,p=c.manifest?.spineItems.slice(0,e).reduce((S,w)=>S+(w.progressionWeight??0),0)||0,d=n.spineItemsManager.getSpineItemIndex(s)??0,h=n.context.manifest?.spineItems.length??0,m=a.pages.filter(S=>S.itemIndex===d).length??0,g=c.manifest?.spineItems[e]?.progressionWeight??(d+1)/h;let f=(t+1)*(g/m);!l&&s.renditionLayout==="reflowable"&&!r&&(f=0);let y=p+f;return c.manifest?.renditionFlow==="scrolled-continuous"&&(r?f=ni(n,o,s):f=0,y=ti(p,g,f)),e===u-1&&t===m-1&&y>.99?1:y})),oi=n=>n.spine.layout$.pipe(i.debounceTime(10,i.animationFrameScheduler),i.withLatestFrom(n.pagination.state$),i.map(()=>({numberOfPagesPerItems:n.spineItemsManager.items.reduce((t,o)=>[...t,o.numberOfPages],[]),numberOfTotalPages:n.spine.pages.value.pages.length})),i.distinctUntilChanged($.isShallowEqual),i.startWith({numberOfPagesPerItems:[],numberOfTotalPages:0})),si=(n,e,t,o)=>{const s=e.beginSpineItemIndex!==void 0?n.spineItemsManager.get(e.beginSpineItemIndex):void 0,r=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return i.of({...e,beginChapterInfo:s?t[s.item.id]:void 0,beginSpineItemReadingDirection:s?.readingDirection,endChapterInfo:r?t[r.item.id]:void 0,endSpineItemReadingDirection:r?.readingDirection,percentageEstimateOfBook:o,isUsingSpread:n.settings.values.computedSpreadMode??!1})},ri=n=>i.combineLatest([n.pagination.state$,n.layout$]).pipe(i.switchMap(([e])=>{const t=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return t?ii(n,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n.navigation.getNavigation().position,t):i.of(0)})),ai=n=>{const e=ei(n),t=oi(n),o=new i.BehaviorSubject({...n.pagination.state,beginChapterInfo:void 0,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,endSpineItemReadingDirection:void 0,percentageEstimateOfBook:0}),s=i.combineLatest([n.pagination.state$,e,ri(n)]).pipe(i.switchMap(([a,c,l])=>si(n,a,c,l).pipe(i.map(u=>({...a,...u})))),i.distinctUntilChanged($.isShallowEqual));return{paginationInfo$:i.combineLatest([s,t]).pipe(i.map(([a,c])=>({...a,...c,beginAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.beginSpineItemIndex).reduce((l,u)=>l+u,a.beginPageIndexInSpineItem??0),endAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.endSpineItemIndex).reduce((l,u)=>l+u,a.endPageIndexInSpineItem??0)})),i.tap(a=>{o.next(a)}),i.shareReplay(1)),getPaginationInfo:()=>o.value}},H=n=>V.generate({spineIndex:n.index,spineId:n.id}),tt=({nodeOrRange:n,offset:e,item:t})=>{const o="ownerDocument"in n?n.ownerDocument:n.startContainer.ownerDocument;return!o||!o?.documentElement||n===o?H(t):Zt(n)?V.generate({start:{node:n.startContainer,offset:n.startOffset,spineIndex:t.index,spineId:t.id},end:{node:n.endContainer,offset:n.endOffset,spineIndex:t.index,spineId:t.id}}):V.generate({node:n,offset:e,spineIndex:t.index,spineId:t.id})},te=({pageIndex:n,spineItem:e,spine:t})=>{const s=t.pages.value.pages.find(a=>a.itemIndex===e.index&&a.pageIndex===n)?.firstVisibleNode,r=e.renderer.getDocumentFrame();return s&&r instanceof HTMLIFrameElement&&r.contentWindow?.document?tt({nodeOrRange:s.node,offset:s.offset,item:e.item}).trim():H(e.item)},nt=(n,e)=>tt({nodeOrRange:n,item:e}),ci=n=>n.index.toString(),it=n=>n[0]?.index===6&&n.length>1,ne=n=>{const e=V.parse(n);return V.isIndirectionOnly(e)},li=n=>Array.isArray(n)?n[0]&&it(n[0])?n[0]:void 0:n.parent[0]&&it(n.parent[0])?n.parent[0]:void 0,ie=n=>{const e=V.parse(n),r=((li(e)??[])[1]?.index??2)/2-1,a=V.isParsedCfiRange(e),c=a?e.end.at(-1)?.at(-1)?.offset:e.at(-1)?.at(-1)?.offset;return{isCfiRange:a,cleanedCfi:n,itemIndex:r,offset:c??0}},ye=({cfi:n,spineItemsManager:e})=>{const{itemIndex:t,...o}=ie(n),s=e.get(t);if(!s)return{...o,itemIndex:t,node:null};const r=s.renderer.getDocumentFrame();if(r instanceof HTMLIFrameElement){const a=r.contentWindow?.document;if(a)try{const c=V.resolve(n,a,{throwOnError:!0});return{...o,itemIndex:t,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:s}}catch(c){return L.warn(`Error resolving cfi: ${n}.`),L.warn(c),{...o,spineItem:s,itemIndex:t,node:null}}}return{...o,itemIndex:t,spineItem:s,node:null}},ui=(n,e)=>{if("cfi"in e){const{itemIndex:r,...a}=n.cfi.parseCfi(e.cfi);return{...e,...a,itemIndex:r,node:null}}const t=n.spineItemsManager.get(e);if(!t)throw new Error("Spine item not found");const o=H(t.item);return{...n.cfi.parseCfi(o),cfi:H(t.item),itemIndex:t.index,node:null}},ot=(n,e)=>{let t=n?.itemPageIndex;const{itemIndex:o,...s}=e.cfi.parseCfi(n.cfi),r=e.spineItemsManager.get(o);return r?he().pipe(i.withLatestFrom(r.isReady$),i.map(([,a])=>{const{node:c=null,offset:l,range:u}=a?e.cfi.resolveCfi({cfi:n.cfi}):{};r.renditionLayout!=="pre-paginated"&&c&&(t=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,l??0,r)??t);let d=n?.absolutePageIndex;return t===void 0&&(t=0),d=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:t,spineItemOrId:r})??n?.absolutePageIndex,{...n,...s,range:u,itemIndex:o,node:c,startOffset:l,absolutePageIndex:d,itemPageIndex:t}})):i.of({...n,itemIndex:o,...s})};class st{constructor(e){this.reader=e,this.locatorsByKey=new Map,this.deregisterMemoizedStream=t=>{const o=this.locatorsByKey.get(t);o&&(o.observerCount--,o.observerCount===0&&this.locatorsByKey.delete(t))},this.locate=(t,o)=>{const s={resource:t,meta:ui(this.reader,t)};return me(()=>{const r=this.reader.spineItemsManager.get(s.meta.itemIndex??0),a=r?.renditionLayout==="reflowable",c=o.mode==="shallow"||!a||!r?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([r.index]),l="cfi"in t?t.cfi:void 0,u=l?this.locatorsByKey.get(l):void 0,p=h=>h.pipe(i.finalize(()=>{l&&this.deregisterMemoizedStream(l),setTimeout(()=>{c()},1e3)}));if(l&&u)return u.observerCount++,p(u.consolidate$.pipe(i.map(({resource:h,meta:m})=>({resource:h,meta:m}))));const d=this.reader.spine.layout$.pipe(i.debounceTime(10),i.startWith(s),i.switchScan(h=>ot(h.meta,this.reader).pipe(i.map(m=>({...h,meta:m}))),s),i.shareReplay({refCount:!0,bufferSize:1}));return l&&this.locatorsByKey.set(l,{observerCount:1,consolidate$:d}),p(d)})}}locateResource(e,t){return Array.isArray(e)?me(()=>i.combineLatest(e.map(o=>this.locate(o,t??{}))).pipe(i.defaultIfEmpty([]))):this.locate(e,t??{})}}const rt=n=>e=>{const t=n(e),{paginationInfo$:o,getPaginationInfo:s}=ai(t);o.pipe(i.takeUntil(t.$.destroy$)).subscribe();const r=new st(t);return{...t,locateResource:r.locateResource.bind(r),pagination:{...t.pagination,get state(){return s()},get state$(){return o}}}},pi=n=>({put:(r,a)=>new Promise((c,l)=>{const u=n.transaction(["store"],"readwrite");u.onerror=h=>{l(h)},u.oncomplete=()=>{c()};const d=u.objectStore("store").put(a,r);d.onsuccess=()=>{c()},d.onerror=h=>{l(h)}}),keys:()=>new Promise((r,a)=>{const c=n.transaction(["store"],"readonly");c.onerror=d=>{a(d)};const u=c.objectStore("store").openKeyCursor(),p=[];u.onsuccess=()=>{const d=u.result;if(!d){r(p);return}p.push(d.key),d.continue()},u.onerror=()=>{a(u.error)}}),get:r=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),p=l.objectStore("store").get(r);p.onsuccess=()=>{let d=p.result;d===void 0&&(d=null),a(d)},l.onerror=()=>{c(p.error)}}),remove:r=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),p=l.objectStore("store").delete(r);l.onerror=()=>{c(p.error)},l.oncomplete=()=>{a()},l.onabort=()=>{const d=p.error?p.error:p.transaction?.error;c(d)}})}),be=async n=>new Promise((e,t)=>{const o=window.indexedDB.open(n);o.onerror=s=>{t(s)},o.onsuccess=()=>{e(pi(o.result))},o.onupgradeneeded=()=>{o.result.createObjectStore("store")}}),di=n=>{let e=Date.now().toString();const t=new i.Subject,o=l=>{if(typeof l=="string"||typeof l=="object"){const u=typeof l=="object"?l.id:l;return n.manifest?.spineItems.find(p=>p.id===u)}return n.manifest?.spineItems[l]},s=async(l,u)=>{const p=o(l);if(!p)return new Response("Item not found",{status:404});const h=await(await be("prose-reader")).get(`${e}_${p.id}`);if(h)return new Response(h,{status:200});const m=u&&await u(p)||await fetch(p.href);return r(p,m.clone()),m},r=(l,u)=>{t.next({id:l,data:u})};t.asObservable().pipe(b.mergeMap(({id:l,data:u})=>{const p=o(l);return p?i.from(i.forkJoin([be("prose-reader"),i.from(u.blob())])).pipe(b.switchMap(([d,h])=>i.from(d.put(`${e}_${p.id}`,h))),b.catchError(d=>(L.error(d),i.EMPTY))):i.EMPTY}),b.takeUntil(n.destroy$)).subscribe();const a=n.manifest$.pipe(b.tap(()=>{e=Date.now().toString()}));return i.merge(a).pipe(b.switchMap(()=>(L.debug("Cleanup up old cache..."),i.from(be("prose-reader")).pipe(b.switchMap(l=>i.from(l.keys()).pipe(b.map(u=>u.filter(p=>!p.toString().startsWith(e))),b.switchMap(u=>{const p=u.map(d=>l.remove(d));return i.from(Promise.all(p))}))),b.catchError(l=>(L.error(l),i.EMPTY))))),b.takeUntil(n.destroy$)).subscribe(),{get:s,destroy:()=>{t.complete()}}},gi=n=>e=>{const t=n(e),o=di(t.context);return{...t,destroy:()=>{o.destroy(),t.destroy()}}},hi=(n,e)=>{const t=n.node.ownerDocument?.createRange(),o=n.node.compareDocumentPosition(e.node);if(t){try{if(o&Node.DOCUMENT_POSITION_PRECEDING)t.setStart(e.node,e.offset||0),t.setEnd(n.node,n.offset||0);else if(o&Node.DOCUMENT_POSITION_FOLLOWING)t.setStart(n.node,n.offset||0),t.setEnd(e.node,e.offset||0);else{const s=Math.min(n.offset||0,e.offset||0),r=Math.max(n.offset||0,e.offset||0);t.setStart(n.node,s),t.setEnd(n.node,r)}}catch(s){L.warn("Failed to create range from selection",s,{anchor:n,focus:e})}return t}},mi=({selection:n,spineItem:e})=>{const{anchorNode:t,anchorOffset:o,focusNode:s,focusOffset:r}=n;if(!(!t||!s))try{return hi({node:t,offset:o},{node:s,offset:r})}catch(a){L.warn("Failed to create range from selection",a,{selection:n,spineItem:e});return}};class fi extends C{constructor(e){super();const t=e.contentDocument||e.contentWindow?.document;if(!t)this.selectionChange$=i.NEVER,this.selectionOver$=i.NEVER;else{const o=fe(t.body,{childList:!0,subtree:!0}).pipe(i.filter(r=>!!r.find(a=>a.type==="childList"&&a.removedNodes.length))),s=e.parentElement?fe(e.parentElement,{childList:!0}).pipe(i.filter(r=>!!r.find(a=>Array.from(a.removedNodes).includes(e)))):i.of(null);this.selectionChange$=i.merge(i.fromEvent(t,"selectionchange"),o).pipe(i.map(()=>t.getSelection()),i.takeUntil(i.merge(s,this.destroy$)),i.endWith(null)),this.selectionOver$=i.fromEvent(t,"pointerdown").pipe(i.switchMap(()=>i.merge(i.fromEvent(t,"pointerup"),i.fromEvent(t,"pointercancel"),i.fromEvent(t,"contextmenu")).pipe(i.first(),i.delay(0),i.map(r=>{const a=t.getSelection();return a&&!a.isCollapsed?[r,a]:void 0}),i.filter(z))),i.takeUntil(i.merge(s,this.destroy$)))}}}const Si=n=>n.watch("isLoaded").pipe(i.switchMap(()=>{const e=n.renderer.getDocumentFrame(),t=e?.contentDocument||e?.contentWindow?.document;if(!e||!t)return i.NEVER;const o=new fi(e);return i.merge(o.selectionChange$.pipe(i.map(s=>{if(s?.toString())return{type:"change",selection:s}})),o.selectionOver$.pipe(i.map(([s,r])=>({type:"over",event:s,selection:r})))).pipe(i.takeUntil(n.unloaded$),i.endWith(void 0),i.finalize(()=>{o.destroy()}))}),i.distinctUntilChanged()),yi=n=>e=>{const t=n(e);let o;const s=t.spineItemsManager.items$.pipe(i.switchMap(p=>{const d=p.map(h=>{const m=t.spineItemsManager.getSpineItemIndex(h)??0;return Si(h).pipe(i.map(g=>{if(g)return{...g,itemIndex:m}}))});return i.merge(...d)}),i.startWith(void 0),i.distinctUntilChanged(),i.tap(p=>{o=p}),i.shareReplay({refCount:!0,bufferSize:1})),r=s,a=s.pipe(i.map(p=>!!p),i.distinctUntilChanged(),i.filter(p=>p),i.share()),c=a.pipe(i.switchMap(()=>r),i.distinctUntilChanged(),i.filter(p=>!p),i.share()),l=s.pipe(i.filter(p=>p?.type==="over"),i.share()),u=t.context.watch("rootElement").pipe(i.filter(ae.isDefined),i.switchMap(p=>i.fromEvent(p,"pointerdown")),i.withLatestFrom(r),i.map(([,p])=>p),i.startWith(void 0),i.shareReplay({refCount:!0,bufferSize:1}));return i.merge(r,u).pipe(i.takeUntil(t.$.destroy$)).subscribe(),{...t,selection:{selection$:r,selectionStart$:a,selectionEnd$:c,selectionOver$:l,lastSelectionOnPointerdown$:u,getSelection:()=>o,createOrderedRangeFromSelection:mi}}},at=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],bi=n=>e=>{const t=n(e),o=new i.BehaviorSubject(e.theme??"bright"),s=()=>{const c=at.find(l=>l.name===o.value);return`
|
|
248
248
|
body {
|
|
249
249
|
${c!==void 0?`background-color: ${c.backgroundColor} !important;`:""}
|
|
250
250
|
}
|
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
color: ${c.foregroundColor};
|
|
255
255
|
}
|
|
256
256
|
`:""}
|
|
257
|
-
`},r=({container:c})=>{const l=at.find(u=>u.name===o.value);return l&&c.style.setProperty("background-color",l.backgroundColor),()=>{}},a=()=>{t.spineItemsManager.items.forEach(c=>{const l=c.renderer.getDocumentFrame();l&&D(l,"prose-reader-theme",s()),r({container:c.element})})};return t.hookManager.register("item.onDocumentLoad",({itemId:c})=>{const l=t.spineItemsManager.get(c);if(l?.renditionLayout!=="pre-paginated"){const u=l?.renderer.getDocumentFrame();u&&D(u,"prose-reader-theme",s())}}),t.spineItemsManager.items$.pipe(b.tap(c=>c.map(({element:l})=>r({container:l}))),b.takeUntil(t.$.destroy$)).subscribe(),o.pipe(b.tap(()=>{a()}),b.takeUntil(t.$.destroy$)).subscribe(),{...t,theme:{set:c=>{c!==o.value&&o.next(c)},get:()=>o.value,$:{theme$:o.asObservable()}}}},
|
|
257
|
+
`},r=({container:c})=>{const l=at.find(u=>u.name===o.value);return l&&c.style.setProperty("background-color",l.backgroundColor),()=>{}},a=()=>{t.spineItemsManager.items.forEach(c=>{const l=c.renderer.getDocumentFrame();l&&D(l,"prose-reader-theme",s()),r({container:c.element})})};return t.hookManager.register("item.onDocumentLoad",({itemId:c})=>{const l=t.spineItemsManager.get(c);if(l?.renditionLayout!=="pre-paginated"){const u=l?.renderer.getDocumentFrame();u&&D(u,"prose-reader-theme",s())}}),t.spineItemsManager.items$.pipe(b.tap(c=>c.map(({element:l})=>r({container:l}))),b.takeUntil(t.$.destroy$)).subscribe(),o.pipe(b.tap(()=>{a()}),b.takeUntil(t.$.destroy$)).subscribe(),{...t,theme:{set:c=>{c!==o.value&&o.next(c)},get:()=>o.value,$:{theme$:o.asObservable()}}}},Ii=n=>e=>({...n(e),utils:{isOrIsWithinValidLink:s=>!!(pe(s)&&(s.nodeName==="a"?s:s.closest("a"))?.getAttribute("href"))}});navigator.userAgent.indexOf("")>-1&&navigator.userAgent.indexOf("Chrome")<=-1;const wi=n=>e=>n(e);class N extends i.Observable{constructor(e){super(t=>this.stateSubject.pipe(i.takeUntil(this._destroy$)).subscribe(t)),this._destroy$=new i.Subject,this.destroy$=this._destroy$.asObservable(),this.stateSubject=new i.BehaviorSubject(e)}next(e){this.stateSubject.next(e)}mergeCompare(e){const t={...this.value,...e};$.isShallowEqual(this.value,t)||this.stateSubject.next(t)}watch(e){return Array.isArray(e)?this.stateSubject.pipe(G(e)):this.stateSubject.pipe(i.map(t=>t[e]),i.distinctUntilChanged($.isShallowEqual))}get value(){return this.stateSubject.value}destroy(){this.stateSubject.complete(),this._destroy$.complete()}}class ct extends N{constructor(e){super({element:void 0,isZooming:!1,currentScale:1,currentPosition:{x:0,y:0}}),this.reader=e}}const Ie=200;class vi extends ct{constructor(e){super(e),this.watch("isZooming").pipe(i.filter(t=>!t),i.switchMap(()=>i.timer(Ie).pipe(i.tap(()=>{this.reader.viewport.value.element.style.transition=""})))),this.watch("currentScale").pipe(i.switchMap(()=>i.timer(Ie).pipe(i.tap(()=>{this.reader.layout()}))),i.takeUntil(this.destroy$)).subscribe()}enter({element:e,scale:t=1,animate:o}={}){const s=this.reader.context.value.rootElement,r=this.reader.viewport.value.element;let a;if(s&&e){a=s.ownerDocument.createElement("div"),a.style.cssText=`
|
|
258
258
|
top: 0;
|
|
259
259
|
left: 0;
|
|
260
260
|
display: block;
|
|
@@ -264,20 +264,20 @@
|
|
|
264
264
|
width: 100%;
|
|
265
265
|
height: 100%;
|
|
266
266
|
user-select: none;
|
|
267
|
-
`;const c=e.cloneNode();c.src=e.src,c.style.setProperty("height","100%"),c.style.setProperty("width","100%"),c.style.setProperty("object-fit","contain"),c.style.setProperty("pointer-events","none"),a.appendChild(c),s.appendChild(a)}o&&!e&&(r.style.transition=`transform ${Ie}ms`),this.setScale(t),this.mergeCompare({element:a,isZooming:!0,currentScale:t,currentPosition:{x:0,y:0}})}exit(){const e=this.reader.viewport.value.element;this.value.element||(e.style.transformOrigin="",e.style.transform=""),this.value.element?.remove(),this.mergeCompare({element:void 0,isZooming:!1,currentScale:1,currentPosition:{x:0,y:0}})}moveAt(e){this.value.element?.querySelector("img")?.style.setProperty("transform",`translate3d(${e.x}px, ${e.y}px, 0px) scale3d(${this.value.currentScale}, ${this.value.currentScale}, 1)`),this.mergeCompare({currentPosition:e})}setElementScale(e,t){e.querySelector("img")?.style.setProperty("transform",`translate3d(${this.value.currentPosition.x}px, ${this.value.currentPosition.y}px, 0px) scale3d(${t}, ${t}, 1)`)}setViewportScale(e){const t=this.reader.viewport.value.element;t.style.transformOrigin="center",t.style.transform=`scale(${e})`}setScale(e){this.value.element?this.setElementScale(this.value.element,e):this.setViewportScale(e)}scaleAt(e){const t=e;this.setScale(t),this.mergeCompare({currentScale:t})}}const
|
|
267
|
+
`;const c=e.cloneNode();c.src=e.src,c.style.setProperty("height","100%"),c.style.setProperty("width","100%"),c.style.setProperty("object-fit","contain"),c.style.setProperty("pointer-events","none"),a.appendChild(c),s.appendChild(a)}o&&!e&&(r.style.transition=`transform ${Ie}ms`),this.setScale(t),this.mergeCompare({element:a,isZooming:!0,currentScale:t,currentPosition:{x:0,y:0}})}exit(){const e=this.reader.viewport.value.element;this.value.element||(e.style.transformOrigin="",e.style.transform=""),this.value.element?.remove(),this.mergeCompare({element:void 0,isZooming:!1,currentScale:1,currentPosition:{x:0,y:0}})}moveAt(e){this.value.element?.querySelector("img")?.style.setProperty("transform",`translate3d(${e.x}px, ${e.y}px, 0px) scale3d(${this.value.currentScale}, ${this.value.currentScale}, 1)`),this.mergeCompare({currentPosition:e})}setElementScale(e,t){e.querySelector("img")?.style.setProperty("transform",`translate3d(${this.value.currentPosition.x}px, ${this.value.currentPosition.y}px, 0px) scale3d(${t}, ${t}, 1)`)}setViewportScale(e){const t=this.reader.viewport.value.element;t.style.transformOrigin="center",t.style.transform=`scale(${e})`}setScale(e){this.value.element?this.setElementScale(this.value.element,e):this.setViewportScale(e)}scaleAt(e){const t=e;this.setScale(t),this.mergeCompare({currentScale:t})}}const Pi=(n,e,t,o,s)=>{const r=n.clientWidth,a=n.clientHeight,c=n.scrollLeft,l=n.scrollTop,u=c+r/2-o,p=l+a/2-s,d=t/e,h=u*d,m=p*d,g=h-r/2+o,f=m-a/2+s;return{newScrollLeft:g,newScrollTop:f}};class $i extends ct{enter({scale:e=1}={}){this.value.isZooming||(this.setScale(e),this.mergeCompare({currentPosition:{x:0,y:0},currentScale:e,isZooming:!0}))}exit(){this.setScale(1),this.mergeCompare({isZooming:!1,currentScale:1})}moveAt(){L.warn("moveAt should not be called on scroll mode")}setScale(e){const t=this.reader.viewport.value.element,o=this.reader.navigation.scrollNavigationController.value.element,s=this.reader.navigation.scrollNavigationController.value.element;if(!t||!s)return;const r=this.reader.viewport.scaleFactor,a=t.offsetLeft,c=t.offsetTop,{newScrollLeft:l,newScrollTop:u}=Pi(o??Yt(),r,e,a,c);e<1?(t.style.transformOrigin="top",s.style.overflowX="auto"):e>1&&(t.style.transformOrigin=`${a}px ${c}px`,s.style.overflowX="scroll"),t.style.transform=`scale(${e})`;const p=this.reader.navigation.scrollNavigationController.fromScrollPosition({x:l,y:u});this.reader.navigation.navigate({position:p})}scaleAt(e){const o=Math.ceil(e*100)/100;this.setScale(o),this.mergeCompare({currentScale:o})}}const Ti=n=>e=>{const t=n(e),o=new vi(t),s=new $i(t),r=new i.BehaviorSubject(s);return{...t,destroy:()=>{o.exit(),s.exit(),r.complete(),t.destroy()},zoom:{enter:l=>{const u=t.settings.values.computedPageTurnMode==="scrollable"?s:o;r.next(u),u.enter(l)},scaleAt:l=>r.getValue().scaleAt(l),moveAt:l=>r.getValue().moveAt(l),exit:()=>r.getValue().exit(),state$:r.pipe(i.switchMap(l=>l)),get state(){return r.getValue().value}}}},lt=n=>n?.renditionLayout==="pre-paginated"||n?.spineItems.every(e=>e.renditionLayout==="pre-paginated");class Mi{constructor(){this.navigationSubject=new i.ReplaySubject(1),this.viewportStateSubject=new i.BehaviorSubject("free"),this.paginationSubject=new i.ReplaySubject,this.navigationIsLockedSubject=new i.BehaviorSubject(!1),this.pagination$=this.paginationSubject.asObservable(),this.navigationUnlocked$=this.navigationIsLockedSubject.pipe(i.distinctUntilChanged(),i.filter(e=>!e)),this.viewportState$=this.viewportStateSubject.asObservable(),this.viewportFree$=this.viewportState$.pipe(i.filter(e=>e==="free")),this.viewportBusy$=this.viewportState$.pipe(i.filter(e=>e==="busy")),this.navigation$=this.navigationSubject.asObservable()}}class ut extends N{constructor(){super({assumedRenditionLayout:"reflowable"}),this.bridgeEvent=new Mi,this.manifest$=this.pipe(b.map(e=>e.manifest),b.filter(z),b.distinctUntilChanged()),this.isRTL=()=>this.value.manifest?.readingDirection==="rtl"}update(e){const t=this.value,o=e.manifest??t.manifest,s={...t,...e,...e.manifest&&{isFullyPrePaginated:lt(o),assumedRenditionLayout:o?.renditionLayout??"reflowable"}};this.mergeCompare(s)}get manifest(){return this.value.manifest}get readingDirection(){return this.manifest?.readingDirection}}class pt extends N{constructor(e,t){super({supportedPageTurnAnimation:["fade","none","slide"],supportedPageTurnMode:["controlled","scrollable"],supportedPageTurnDirection:["horizontal","vertical"],supportedComputedPageTurnDirection:["horizontal","vertical"]}),i.combineLatest([e.watch(["manifest","hasVerticalWriting"]),t.watch(["computedPageTurnMode"])]).pipe(i.map(([{manifest:o,hasVerticalWriting:s},{computedPageTurnMode:r}])=>({hasVerticalWriting:s,renditionFlow:o?.renditionFlow,renditionLayout:o?.renditionLayout,computedPageTurnMode:r})),i.distinctUntilChanged($.isShallowEqual),i.map(({hasVerticalWriting:o,renditionFlow:s,renditionLayout:r,computedPageTurnMode:a})=>({...this.value,supportedPageTurnMode:s==="scrolled-continuous"?["scrollable"]:["controlled","scrollable"],supportedPageTurnAnimation:s==="scrolled-continuous"||a==="scrollable"?["none"]:o?["fade","none"]:["fade","none","slide"],supportedPageTurnDirection:a==="scrollable"?["vertical"]:r==="reflowable"?["horizontal"]:["horizontal","vertical"]})),i.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}}class dt{constructor(){this._hooks=[],this._hookExecutions=[]}deregister(e){return this._hooks=this._hooks.filter(t=>t!==e),this.destroy(e.name,void 0,e)}register(e,t){const o={name:e,runFn:t};return this._hooks.push(o),()=>{this.deregister(o)}}execute(e,t,o){return this._hooks.filter(a=>e===a.name).map(a=>{let c=()=>i.of(void 0);const l=new i.Subject,u=h=>{c=h},p=()=>(l.next(),l.complete(),c()??i.of(void 0)),d=a.runFn({...o,destroy$:l.asObservable(),destroy:u});return this._hookExecutions.push({name:e,id:t,destroyFn:p,ref:a}),d})}destroy(e,t,o){const s=this._hookExecutions.filter(a=>o&&a.ref===o||e===a.name&&(!t||t&&t===a.id));this._hookExecutions=this._hookExecutions.filter(a=>!s.includes(a));const r=s.map(({destroyFn:a})=>a());return i.combineLatest(r)}}const Fi=n=>({x:-n.x,y:-n.y}),Li=n=>n instanceof DOMMatrix?new T({x:-n.e,y:-n.f}):new T({x:-n.x,y:-n.y}),gt=L.namespace("navigation/ViewportNavigator");class ht extends C{constructor(e,t,o,s,r){super(),this.settings=e,this.hookManager=t,this.context=o,this.spine=s,this.viewport=r,this.navigateSubject=new i.Subject,this.element$=new i.BehaviorSubject(document.createElement("div"));const a=this.spine.element$.pipe(i.filter(ae.isDefined),i.withLatestFrom(this.element$),i.tap(([p,d])=>{d.style.cssText=`
|
|
268
268
|
height: 100%;
|
|
269
269
|
width: 100%;
|
|
270
270
|
position: relative;
|
|
271
|
-
`,d.className=`${k}-controlled-navigator`,d.innerHTML="",d.appendChild(p),this.viewport.value.element.appendChild(d),this.element$.next(d)})),c=e.watch(["computedPageTurnDirection","computedPageTurnMode","numberOfAdjacentSpineItemToPreLoad"]),l=i.combineLatest([c,this.element$]).pipe(i.tap(([,p])=>{e.values.computedPageTurnMode==="scrollable"?p.style.display="contents":p.style.display="block"}));this.layout$=l.pipe(i.tap(()=>{gt.info("layout",e.values)}),i.share());const u=this.navigateSubject.pipe(i.tap(p=>{gt.info("Navigation requested",p)}));this.isNavigating$=u.pipe(i.map(({animation:p,position:d})=>({type:"manualAdjust",shouldAnimate:!(!p||p==="turn"&&e.values.computedPageTurnAnimation==="none"),animation:p,position:d})),i.switchMap(p=>{const d=this.element$.getValue();return d.style.setProperty("transition","none"),d.style.setProperty("opacity","1"),i.merge(i.of(!0),i.of(null).pipe(i.mergeMap(()=>{if(p?.type!=="manualAdjust")return i.of(!1);const h=p.animation==="snap"?e.values.snapAnimationDuration:e.values.computedPageTurnAnimationDuration,m=p.animation==="snap"?"slide":e.values.computedPageTurnAnimation;return i.of(p).pipe(p.shouldAnimate?i.delay(1,i.animationFrameScheduler):i.identity,i.tap(g=>{const f=this.element$.getValue();g.shouldAnimate?m==="fade"?(f.style.setProperty("transition",`opacity ${h/2}ms`),f.style.setProperty("opacity","0")):(p.animation==="snap"||m==="slide")&&(f.style.setProperty("transition",`transform ${h}ms`),f.style.setProperty("opacity","1")):(f.style.setProperty("transition","none"),f.style.setProperty("opacity","1"))}),i.tap(g=>{m!=="fade"&&this.setViewportPosition(g.position)}),p.shouldAnimate?i.delay(h/2,i.animationFrameScheduler):i.identity,i.tap(g=>{const f=this.element$.getValue();m==="fade"&&(this.setViewportPosition(g.position),f.style.setProperty("opacity","1"))}),p.shouldAnimate?i.delay(h/2,i.animationFrameScheduler):i.identity,i.tap(g=>{m==="fade"&&this.setViewportPosition(g.position)}))}),i.map(()=>!1)))}),i.startWith(!1),i.shareReplay(1)),i.merge(a,this.isNavigating$,this.layout$).pipe(i.takeUntil(this.destroy$)).subscribe()}setViewportPosition(e){const t=this.element$.getValue(),o=
|
|
271
|
+
`,d.className=`${k}-controlled-navigator`,d.innerHTML="",d.appendChild(p),this.viewport.value.element.appendChild(d),this.element$.next(d)})),c=e.watch(["computedPageTurnDirection","computedPageTurnMode","numberOfAdjacentSpineItemToPreLoad"]),l=i.combineLatest([c,this.element$]).pipe(i.tap(([,p])=>{e.values.computedPageTurnMode==="scrollable"?p.style.display="contents":p.style.display="block"}));this.layout$=l.pipe(i.tap(()=>{gt.info("layout",e.values)}),i.share());const u=this.navigateSubject.pipe(i.tap(p=>{gt.info("Navigation requested",p)}));this.isNavigating$=u.pipe(i.map(({animation:p,position:d})=>({type:"manualAdjust",shouldAnimate:!(!p||p==="turn"&&e.values.computedPageTurnAnimation==="none"),animation:p,position:d})),i.switchMap(p=>{const d=this.element$.getValue();return d.style.setProperty("transition","none"),d.style.setProperty("opacity","1"),i.merge(i.of(!0),i.of(null).pipe(i.mergeMap(()=>{if(p?.type!=="manualAdjust")return i.of(!1);const h=p.animation==="snap"?e.values.snapAnimationDuration:e.values.computedPageTurnAnimationDuration,m=p.animation==="snap"?"slide":e.values.computedPageTurnAnimation;return i.of(p).pipe(p.shouldAnimate?i.delay(1,i.animationFrameScheduler):i.identity,i.tap(g=>{const f=this.element$.getValue();g.shouldAnimate?m==="fade"?(f.style.setProperty("transition",`opacity ${h/2}ms`),f.style.setProperty("opacity","0")):(p.animation==="snap"||m==="slide")&&(f.style.setProperty("transition",`transform ${h}ms`),f.style.setProperty("opacity","1")):(f.style.setProperty("transition","none"),f.style.setProperty("opacity","1"))}),i.tap(g=>{m!=="fade"&&this.setViewportPosition(g.position)}),p.shouldAnimate?i.delay(h/2,i.animationFrameScheduler):i.identity,i.tap(g=>{const f=this.element$.getValue();m==="fade"&&(this.setViewportPosition(g.position),f.style.setProperty("opacity","1"))}),p.shouldAnimate?i.delay(h/2,i.animationFrameScheduler):i.identity,i.tap(g=>{m==="fade"&&this.setViewportPosition(g.position)}))}),i.map(()=>!1)))}),i.startWith(!1),i.shareReplay(1)),i.merge(a,this.isNavigating$,this.layout$).pipe(i.takeUntil(this.destroy$)).subscribe()}setViewportPosition(e){const t=this.element$.getValue(),o=Fi(e);t.style.transform=`translate(${o.x}px, ${o.y}px)`,this.hookManager.execute("onViewportOffsetAdjust",void 0,{})}navigate(e){this.navigateSubject.next(e)}get viewportPosition(){const e=this.element$.getValue(),t=window.getComputedStyle(e),o=t.transform||t.webkitTransform;if(!o||o==="none")return new T({x:0,y:0});const s=new DOMMatrix(o);return Li(s)}}class Ei{constructor(e){this.x=e.x,this.y=e.y}}class we extends Ei{}class mt extends N{constructor(e,t,o,s,r){super({element:void 0}),this.viewport=e,this.settings=t,this.hookManager=o,this.spine=s,this.context=r,this.navigateSubject=new i.Subject,this.scrollingSubject=new i.BehaviorSubject(!1),this.isScrolling$=this.scrollingSubject.asObservable(),this.setViewportPosition=({position:d})=>{const h=this.value.element;this.scrollingSubject.next(!0);const m=this.fromSpinePosition(d);h?.scrollTo({left:m.x,top:m.y,behavior:"instant"}),i.timer(1).pipe(i.tap(()=>{this.scrollingSubject.next(!1)}),i.takeUntil(i.merge(this.scrollingSubject.pipe(i.skip(1)),this.destroy$))).subscribe(),this.hookManager.execute("onViewportOffsetAdjust",void 0,{})};const a=this.context.pipe(G(["rootElement"]),i.tap(({rootElement:d})=>{if(!d)return;const h=document.createElement("div");h.style.cssText=`
|
|
272
272
|
height: 100%;
|
|
273
273
|
width: 100%;
|
|
274
274
|
position: relative;
|
|
275
275
|
overflow-y: scroll;
|
|
276
276
|
overflow-x: hidden;
|
|
277
|
-
`,h.className=`${k}-scroll-navigator`,h.appendChild(this.viewport.value.element),d.appendChild(h),this.update({element:h})})),c=i.combineLatest([t.watch(["computedPageTurnMode"]),this.watch("element")]).pipe(i.tap(([{computedPageTurnMode:d},h])=>{h&&(d==="scrollable"?h.style.display="block":h.style.display="contents")})),l=this.navigateSubject.pipe(i.tap(this.setViewportPosition));this.isNavigating$=this.navigateSubject.pipe(i.startWith(!1),i.switchMap(()=>i.merge(i.of(!0),i.of(!1))),i.shareReplay(1));const u=i.merge(s.element$.pipe(i.filter(z),i.switchMap(d=>Z(d))),s.element$.pipe(i.filter(z),i.switchMap(d=>i.fromEvent(d,"scroll"))),s.spineItemsObserver.itemResize$).pipe(i.switchMap(()=>i.timer(10).pipe(i.map(()=>!1),i.startWith(!0))),i.distinctUntilChanged(),i.startWith(!1)),p=i.combineLatest([u,this.isScrolling$]).pipe(i.map(([d,h])=>d||h),i.shareReplay(1));this.userScroll$=this.watch("element").pipe(i.filter(z),i.switchMap(d=>t.watch(["computedPageTurnMode"]).pipe(i.switchMap(({computedPageTurnMode:h})=>h==="controlled"?i.NEVER:i.fromEvent(d,"scroll").pipe(i.withLatestFrom(p),i.filter(([,m])=>!m),i.map(([m])=>m))))),i.share()),i.merge(a,c,l).pipe(i.takeUntil(this.destroy$)).subscribe()}update(e){this.mergeCompare(e)}navigate(e){this.navigateSubject.next(e)}fromScrollPosition(e){const t=this.viewport.scaleFactor;return new _({x:e.x/t,y:e.y/t})}fromSpinePosition(e){const t=this.viewport.scaleFactor;return new we({x:e.x*t,y:e.y*t})}get scrollPosition(){const e=this.value.element;return new we({x:e?.scrollLeft??0,y:e?.scrollTop??0})}}const Ei=()=>n=>n.pipe(i.map(({navigation:e,pagination:t,...o})=>({navigation:{...e,paginationBeginCfi:t.beginCfi},...o}))),Ci=(n,e,t)=>n.bridgeEvent.pagination$.pipe(i.withLatestFrom(e),i.filter(([o,s])=>o.navigationId===s.id),i.switchMap(([o,s])=>(t.spineItemsManager.get(s.spineItem)?.isReady$.pipe(i.first())??i.of(!1)).pipe(i.filter(a=>a),i.map(()=>({pagination:o,navigation:s})))),Ei(),i.distinctUntilChanged((o,s)=>o.navigation.paginationBeginCfi===s.navigation.paginationBeginCfi),i.map(({navigation:o})=>({...o,meta:{triggeredBy:"pagination"}}))),Ri=({navigationResolver:n})=>e=>e.pipe(i.map(([t,o])=>{const s={type:"api",meta:{triggeredBy:"user"},id:Symbol(),animation:"turn",...t,position:t.position?n.fromOutOfBoundsSpinePosition(t.position):void 0};return{previousNavigation:o,navigation:s}})),Ai=({navigationResolver:n})=>e=>e.pipe(i.map(t=>{if(t.navigation.cfi){const o=n.getNavigationForCfi(t.navigation.cfi);if(o)return{...t,navigation:{...t.navigation,position:o}}}return t})),Di=({navigation:n,previousNavigation:e,settings:t})=>n.directionFromLastNavigation?n.directionFromLastNavigation:n.url!==void 0||n.cfi!==void 0?"anchor":e.spineItem===void 0||n.spineItem||!n.position?"forward":t.values.computedPageTurnDirection==="vertical"?n.position.y>e.position.y||n.position.y===e.position.y&&e.directionFromLastNavigation!=="backward"?"forward":"backward":Math.abs(n.position.x)>Math.abs(e.position.x)||n.position.x===e.position.x&&e.directionFromLastNavigation!=="backward"?"forward":"backward",Ni=({context:n,settings:e})=>t=>t.pipe(i.map(({navigation:o,previousNavigation:s})=>{const r=Di({navigation:o,previousNavigation:s,settings:e}),a={...o,directionFromLastNavigation:r};return{previousNavigation:s,navigation:a,direction:r}})),Oi=({spineItemsManager:n,navigationResolver:e,settings:t})=>o=>o.pipe(i.map(({navigation:s,...r})=>{const a=n.get(s.spineItem);if(s.position)return t.values.computedPageTurnMode==="scrollable"?{navigation:{...s,position:s.position},...r}:{navigation:{...s,position:e.fromUnboundSpinePosition(s.position)},...r};if(!a)return{navigation:{...s,position:r.previousNavigation.position},...r};const c=e.getNavigationForSpineIndexOrId(a),l=t.values.computedPageTurnMode==="scrollable"?new _({x:c.x+r.previousNavigation.position.x,y:c.y}):e.fromUnboundSpinePosition(c);return{navigation:{...s,position:l},...r}})),ft=({settings:n,spineItemsManager:e,navigationResolver:t,spineLocator:o})=>s=>{const r=a=>{const{position:c,spineItem:l,cfi:u,directionFromLastNavigation:p}=a,{navigationSnapThreshold:d,computedPageTurnMode:h}=n.values;if(l!==void 0){const m=e.get(l);if(m)return m}if(typeof l=="number")return l>e.items.length-1?e.get(e.items.length-1):e.get(0);if(u){const m=e.getSpineItemFromCfi(u);if(m)return m}if(c&&h==="controlled"){const{beginIndex:m,endIndex:g}=o.getVisibleSpineItemsFromPosition({position:c,threshold:d,restrictToScreen:!1})??{},f=(p==="forward"||p==="anchor"?g:m)??m,y=e.get(f);if(!y)return;const{endPageIndex:S,beginPageIndex:w}=o.getVisiblePagesFromViewportPosition({position:c,spineItem:y,threshold:d,restrictToScreen:!1})??{},v=(p==="forward"||p==="anchor"?S:w)??0,M=t.getNavigationForSpineItemPage({pageIndex:v,spineItemId:y}),P=o.getVisibleSpineItemsFromPosition({position:M,threshold:d,restrictToScreen:!1}),E=p==="forward"||p==="anchor"?P?.beginIndex:P?.endIndex;return e.get(E)}return c&&h==="scrollable"?o.getSpineItemFromPosition(c):e.get(0)};return s.pipe(i.map(({navigation:a,...c})=>{const l=r(a);return{navigation:{...a,spineItem:e.getSpineItemIndex(l)},...c}}))},St=({spine:n})=>e=>e.pipe(i.switchMap(({navigation:t,...o})=>{const s=n.getSpineItemSpineLayoutInfo(t.spineItem),r=n.spineItemsManager.get(t.spineItem);return(r?.isReady$??i.of(!1)).pipe(i.first(),i.map(a=>({navigation:{...t,spineItemHeight:s?.height,spineItemWidth:s?.width,spineItemLeft:s.left,spineItemTop:s.top,spineItemIsUsingVerticalWriting:r?.isUsingVerticalWriting(),spineItemIsReady:a},...o})))})),ve=({settings:n,spineItemsManager:e,spineLocator:t,navigationResolver:o})=>s=>{const r=a=>{const{navigationSnapThreshold:c,computedPageTurnMode:l}=n.values,u=e.get(a.spineItem);if(!(!u||!a.position)){if(l==="controlled"){const{endPageIndex:p,beginPageIndex:d}=t.getVisiblePagesFromViewportPosition({position:a.position,spineItem:u,threshold:c,restrictToScreen:!1})??{},h=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?p:d)??0,m=o.getNavigationForSpineItemPage({pageIndex:h,spineItemId:u}),g=t.getVisiblePagesFromViewportPosition({position:m,spineItem:u,threshold:{type:"percentage",value:0},restrictToScreen:!0}),f=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?g?.beginPageIndex:g?.endPageIndex)??0;return t.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:f,spineItem:u})}return t.getSpineItemPositionFromSpinePosition(a.position,u)}};return s.pipe(i.map(({navigation:a,...c})=>({navigation:{...a,positionInSpineItem:r(a)},...c})))},Vi=({navigationResolver:n})=>e=>e.pipe(i.map(t=>{if(t.navigation.url){const o=n.getNavigationForUrl(t.navigation.url);if(o)return{...t,navigation:{...t.navigation,position:o.position,spineItem:o.spineItemId}}}return t}));class Pe{constructor(){this.isLockedSubject=new i.BehaviorSubject(0),this.isLocked$=this.isLockedSubject.pipe(i.map(e=>!!e),i.distinctUntilChanged())}lock(){let e=!1;return this.isLockedSubject.next(this.isLockedSubject.getValue()+1),()=>{e||(e=!0,this.isLockedSubject.next(this.isLockedSubject.getValue()-1))}}}const ki=({spineLocator:n,navigation:e,navigationResolver:t,spineItemsManager:o,spine:s})=>{const r=o.get(e.spineItem);return r?r.isReady$.pipe(i.first(),i.map(a=>{const c=s.getSpineItemSpineLayoutInfo(r),l=n.isPositionWithinSpineItem(e.position,r),u=c.width-(e.spineItemWidth??0),p=c.height-(e.spineItemHeight??0),d=u!==0||p!==0;if(e.url!==void 0&&(u||p||a&&!e.spineItemIsReady)){const m=t.getNavigationForUrl(e.url);if(m)return m.position}const h=e.cfi??e.paginationBeginCfi;if(h!==void 0&&!ne(h)&&(u||p||a&&!e.spineItemIsReady)){const m=t.getNavigationForCfi(h);if(m)return m}if(l&&d&&e.directionFromLastNavigation==="backward"){const m=new F({x:(e.positionInSpineItem?.x??0)+u,y:(e.positionInSpineItem?.y??0)+p});return t.getNavigationFromSpineItemPosition({spineItem:r,spineItemPosition:m})}if(e.positionInSpineItem&&e.spineItemHeight&&e.spineItemWidth){const m=n.spineItemLocator.getSpineItemPageIndexFromPosition({itemWidth:e.spineItemWidth,itemHeight:e.spineItemHeight,isUsingVerticalWriting:!!e.spineItemIsUsingVerticalWriting,position:e.positionInSpineItem});return t.getNavigationForSpineItemPage({pageIndex:m,spineItemId:r})}return l?t.getNavigationForPosition(e.position):t.getNavigationForSpineIndexOrId(r)})):i.of(new T({x:0,y:0}))},Ui=({navigation:n,spineLocator:e,spineItemsManager:t,settings:o,navigationResolver:s,spine:r})=>{const{spineItem:a}=n,c=t.get(a);if(!c)return new T({x:0,y:0});const{height:l,top:u}=r.getSpineItemSpineLayoutInfo(c),p=e.isPositionWithinSpineItem(n.position,c),d=n.positionInSpineItem??new F({y:0,x:0});if(o.values.computedPageTurnDirection==="vertical"){if(u===n.spineItemTop&&l===n.spineItemHeight&&p)return n.position;if(u===n.spineItemTop&&l===n.spineItemHeight&&!p)return s.getNavigationForSpineIndexOrId(c);if(u!==n.spineItemTop){const h=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(n.positionInSpineItem??new F({x:0,y:0}),c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:h,spineItem:c})}if(u===n.spineItemTop&&l!==n.spineItemHeight){const h=(n.spineItemHeight??d.y)-d.y,m=new F({y:n.directionFromLastNavigation==="backward"?l-h:d.y,x:n.position.x});if(p){const g=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(m,c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:g,spineItem:c})}if(!p){if(!(n.position.y<u)){const f=new F({y:l-h,x:n.position.x});return e.getSpinePositionFromSpineItemPosition({spineItemPosition:e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(f,c),spineItem:c})}return s.getNavigationForSpineIndexOrId(c)}}}return n.position},Wi=({navigation:n,spineItemsManager:e,settings:t,spineLocator:o,navigationResolver:s,spine:r})=>t.values.computedPageTurnMode==="scrollable"?i.of(Ui({navigation:n,spineLocator:o,navigationResolver:s,settings:t,spineItemsManager:e,spine:r})):ki({navigation:n,spineLocator:o,navigationResolver:s,spineItemsManager:e,spine:r}),yt=({settings:n,navigationResolver:e,context:t,spine:o})=>s=>s.pipe(i.switchMap(r=>Wi({spineLocator:o.locator,navigation:r.navigation,navigationResolver:e,settings:n,spineItemsManager:o.spineItemsManager,spineItemLocator:o.locator.spineItemLocator,spine:o}).pipe(i.map(a=>({...r,navigation:{...r.navigation,position:a}}))))),zi=L.namespace("navigation/InternalNavigator");class bt extends C{constructor(e,t,o,s,r,a,c,l){super(),this.settings=e,this.context=t,this.userNavigation$=o,this.controlledNavigationController=s,this.scrollNavigationController=r,this.navigationResolver=a,this.spine=c,this.isUserLocked$=l,this.navigationSubject=new i.BehaviorSubject({animation:!1,position:new T({x:0,y:0}),meta:{triggeredBy:"user"},spineItemIsReady:!1,type:"api",id:Symbol()}),this.navigated$=this.navigationSubject.pipe(i.skip(1)),this.navigation$=this.navigationSubject.pipe(i.map(({position:S,id:w})=>({position:S,id:w})),i.distinctUntilChanged(({position:S,...w},{position:v,...M})=>$.isShallowEqual(w,M)&&$.isShallowEqual(S,v)),i.shareReplay(1)),this.locker=new Pe;const u=o.pipe(i.withLatestFrom(this.navigationSubject),Ri({navigationResolver:a}),Vi({navigationResolver:a}),Ai({navigationResolver:a}),Ni({context:t,settings:e}),ft({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),ve({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),St({spine:c})).pipe(Oi({navigationResolver:a,spineItemsManager:c.spineItemsManager,settings:e}),i.withLatestFrom(l),i.switchMap(([S,w])=>{const v=S.navigation.cfi||S.navigation.url||e.values.computedPageTurnMode==="scrollable"||w;return i.of(S).pipe(v?i.identity:yt({navigationResolver:a,settings:e,spine:c,context:t}))}),ve({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),i.map(S=>S.navigation),i.share()),p=u.pipe(i.withLatestFrom(l),i.filter(([,S])=>S),i.switchMap(([S])=>{const w=this.locker.lock();return l.pipe(i.filter(v=>!v),i.first(),i.map(()=>({...S,animation:"snap"})),i.finalize(()=>{w()}),i.takeUntil(u))}),i.share()),d=i.merge(s.layout$,c.layout$).pipe(i.switchMap(()=>i.of(null).pipe(i.switchMap(()=>l.pipe(i.filter(S=>!S),i.first())),i.map(()=>({...this.navigationSubject.getValue(),animation:!1})),i.takeUntil(i.merge(p,u))))),h=i.merge(d,p).pipe(i.map(S=>({navigation:S})),yt({navigationResolver:a,settings:e,context:t,spine:c}),i.map(S=>{const w={...S.navigation,meta:{triggeredBy:"restoration"}};return{...S,navigation:w}}),ft({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),St({spine:c}),ve({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),i.map(({navigation:S})=>S),i.share()),m=Ci(t,this.navigationSubject,c),g=i.merge(h,u,m),f=S=>S.pipe(i.tap(([w,v])=>{zi.info(`navigation updated from ${w.meta.triggeredBy} of type ${w.type}`,{previousNavigation:v,currentNavigation:w}),this.navigationSubject.next(w)})),y=S=>S.pipe(i.tap(([w,v])=>{const M=w.type==="scroll",P=w.meta.triggeredBy==="pagination",E=w.meta.triggeredBy==="restoration",A=$.isShallowEqual(v.position,w.position);if(M&&!E||P||A)return;const R={position:w.position,animation:w.animation};e.values.computedPageTurnMode==="scrollable"?this.scrollNavigationController.navigate(R):this.controlledNavigationController.navigate({...R,position:T.from(R.position)})}));g.pipe(i.withLatestFrom(this.navigationSubject),y,f,i.takeUntil(this.destroy$)).subscribe()}get navigation(){return this.navigationSubject.getValue()}}const oe=(n,e,t)=>{const o=t-n,s=t*(e*n)/(t||1);return Math.max(0,Math.min(o,s))},$e=(n,e)=>(e||0)===0||(n||0)===0?1:Math.floor(Math.max(1,n/e)),Te=(n,e,t)=>{const o=$e(t,e),s=[...Array(o)].map((r,a)=>a*e);return n>=o*e?s[s.length-1]||0:s.find(r=>n<r+e)||0},It=(n,e,t)=>{const o=[...Array(t)].map((s,r)=>r*e);return n<=0||t===0?0:n>=t*e?t-1:o.findIndex(s=>n<s+e)??0},_i=({itemWidth:n,itemHeight:e,spineItemPosition:t})=>new F({x:Math.min(n,Math.max(0,t.x)),y:Math.min(e,Math.max(0,t.y))}),wt=({itemHeight:n,itemWidth:e,isUsingVerticalWriting:t,pageWidth:o,pageHeight:s,pageTurnDirection:r,pageTurnMode:a})=>r==="vertical"&&a==="scrollable"?1:t||r==="vertical"?$e(n,s):$e(e,o),vt=({itemWidth:n,itemHeight:e,position:t,isUsingVerticalWriting:o,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c,isRTL:l})=>{const p=_i({spineItemPosition:t,itemHeight:e,itemWidth:n}).x,d=wt({isUsingVerticalWriting:o,itemHeight:e,itemWidth:n,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c});if(o)return It(t.y,r,d);const h=It(p,s,d);return l?d-1-h:h},Hi=({pageIndex:n,itemLayout:e,context:t,isUsingVerticalWriting:o,viewport:s})=>{if(o){const a=oe(s.pageSize.height,n,e.height);return new F({x:0,y:a})}const r=oe(s.pageSize.width,n,e.width);return t.isRTL()?new F({x:e.width-r-s.pageSize.width,y:0}):new F({x:r,y:0})},Pt=({context:n,settings:e,viewport:t})=>{const o=(c,l,u)=>{let p;c?.nodeName==="img"||c?.textContent===""&&c.nodeType===Node.ELEMENT_NODE?p=c.getBoundingClientRect().x:c&&(p=(c?xt(c,l):void 0)?.getBoundingClientRect().x||p);const d=u.layout.layoutInfo?.width||0,h=t.pageSize.width;if(p!==void 0){const m=Te(p,h,d);return new F({x:m,y:0})}};return{getSpineItemPositionFromNode:o,getSpineItemPositionFromPageIndex:({pageIndex:c,spineItem:l})=>Hi({context:n,isUsingVerticalWriting:!!l.isUsingVerticalWriting(),itemLayout:l.layout.layoutInfo,pageIndex:c,viewport:t}),getSpineItemPageIndexFromPosition:c=>vt({...c,isRTL:n.isRTL(),pageWidth:t.pageSize.width,pageHeight:t.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}),getSpineItemPageIndexFromNode:(c,l,u)=>{const p=o(c,l,u),{height:d,width:h}=u.layout.layoutInfo;return p?vt({isUsingVerticalWriting:!!u.isUsingVerticalWriting(),position:p,itemHeight:d,itemWidth:h,isRTL:n.isRTL(),pageWidth:t.pageSize.width,pageHeight:t.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}):void 0},getSpineItemClosestPositionFromUnsafePosition:(c,l)=>{const{width:u,height:p}=l.layout.layoutInfo;return new F({x:Te(c.x,t.pageSize.width,u),y:Te(c.y,t.pageSize.height,p)})},getSpineItemPagePositionFromSpineItemPosition:(c,l,u)=>{const{width:p,height:d}=u.layout.layoutInfo,h=t.pageSize.width,m=t.pageSize.height;if(!!u.isUsingVerticalWriting()){const y=oe(m,l,d);return new j({x:c.x,y:c.y-y})}const f=oe(h,l,p);if(n.isRTL()){const y=p-(l+1)*h;return new j({x:c.x-Math.max(0,y),y:c.y})}return new j({x:c.x-f,y:c.y})}}},Bi=({context:n,settings:e,viewport:t})=>{const o=Pt({context:n,settings:e,viewport:t});return{getNavigationForLastPage:c=>{const l=c.numberOfPages;return o.getSpineItemPositionFromPageIndex({pageIndex:l-1,spineItem:c})},getNavigationForPosition:(c,l)=>o.getSpineItemClosestPositionFromUnsafePosition(l,c),getNavigationFromNode:(c,l,u)=>o.getSpineItemPositionFromNode(l,u,c)||new F({x:0,y:0})}};function $t({position:n,isRTL:e,spineItemsManager:t,spine:o,viewportWidth:s}){const r=t.get(t.items.length-1),a=o.getSpineItemSpineLayoutInfo(r||0),c=a.bottom,l=Math.max(0,n.y),u=Math.min(l,c);if(e){const m=Math.min(s,n.x),g=Math.max(m,a.left);return new T({x:g,y:u})}const p=a.right,d=Math.max(0,n.x),h=Math.min(d,p);return new T({x:h,y:u})}const Tt=({position:n,isRTL:e,pageSizeHeight:t,spineItemsManager:o,visibleAreaRectWidth:s,spine:r})=>{const a=$t({position:n,isRTL:e,spineItemsManager:o,spine:r,viewportWidth:s}),c=o.get(o.items.length-1),l=r.getSpineItemSpineLayoutInfo(c),u=l.bottom-t,p=Math.min(a.x,u);if(e){const h=Math.min(0,a.x);return new T({x:h,y:p})}const d=l.right-s;return new T({x:Math.min(a.x,d),y:p})},O=({position:{x:n,y:e},pageSizeWidth:t,visibleAreaRectWidth:o})=>{const r=n%o!==0?n-t:n;return new T({x:r,y:e})},Me=({viewportPosition:n,spineLocator:e,spineItemNavigationResolver:t,viewport:o})=>{const s=e.getSpineItemFromPosition(n);if(s){const r=e.getSpineItemPositionFromSpinePosition(n,s),a=t.getNavigationForPosition(s,r),c=e.getSpinePositionFromSpineItemPosition({spineItemPosition:a,spineItem:s});return O({position:c,pageSizeWidth:o.pageSize.width,visibleAreaRectWidth:o.absoluteViewport.width})}return new T({x:0,y:0})},xi=({pageIndex:n,spineItemsManager:e,spineItemId:t,spineLocator:o,spineItemNavigationResolver:s,viewport:r})=>{const a=e.get(t);if(!a){const u=n*r.pageSize.width;return Me({viewportPosition:new T({x:u,y:0}),spineItemNavigationResolver:s,spineLocator:o,viewport:r})}const c=o.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:n,spineItem:a}),l=o.getSpinePositionFromSpineItemPosition({spineItemPosition:c,spineItem:a});return O({position:l,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},qi=(n,e)=>{if(e&&e instanceof HTMLIFrameElement)return n.startsWith("#")?e.contentDocument?.getElementById(n.replace("#","")):e.contentDocument?.querySelector(n)},Xi=({anchor:n,spineItem:e,spine:t})=>{const o=qi(n,e.renderer.getDocumentFrame());return o?t.spineItemLocator.getSpineItemPositionFromNode(o,0,e)?.x??0:0},Yi=({anchor:n,spineItem:e,spineLocator:t,spine:o})=>{const s=Xi({anchor:n,spineItem:e,spine:o});return t.getSpinePositionFromSpineItemPosition({spineItemPosition:new F({x:s,y:0}),spineItem:e})},Gi=({anchor:n,spineItem:e,spineLocator:t,spine:o,pageSizeWidth:s,visibleAreaRectWidth:r})=>{const a=Yi({anchor:n,spineItem:e,spineLocator:t,spine:o});return O({position:a,pageSizeWidth:s,visibleAreaRectWidth:r})},Zi=({spine:n,spineItemsManager:e,spineLocator:t,url:o,context:s,pageSizeWidth:r,visibleAreaRectWidth:a})=>{try{const c=o instanceof URL?o:new URL(o),l=`${c.origin}${c.pathname}`,u=s.manifest?.spineItems.find(p=>p.href===l);if(u){const p=e.get(u.id);if(p){const d=Gi({anchor:c.hash,spineItem:p,spine:n,spineLocator:t,pageSizeWidth:r,visibleAreaRectWidth:a});return{position:O({position:d,pageSizeWidth:r,visibleAreaRectWidth:a}),spineItemId:u.id}}}return}catch(c){console.error(c);return}},Ji=({spineItem:n,spineItemPosition:e,spineLocator:t,spineItemLocator:o,viewport:s})=>{const r=o.getSpineItemClosestPositionFromUnsafePosition(e,n),a=t.getSpinePositionFromSpineItemPosition({spineItemPosition:r,spineItem:n});return O({position:a,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},Ki="spineNavigator",Qi=({context:n,spineItemsManager:e,locator:t,settings:o,spine:s,viewport:r})=>{const a=Bi({context:n,settings:o,viewport:r});return{getNavigationForUrl:m=>Zi({context:n,spineItemsManager:e,spineLocator:t,url:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width,spine:s}),getNavigationForSpineItemPage:m=>xi({...m,spineItemsManager:e,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getNavigationFromSpineItemPosition:m=>Ji({...m,spineItemLocator:t.spineItemLocator,spineLocator:t,viewport:r}),getNavigationForCfi:m=>{const g=e.getSpineItemFromCfi(m),{node:f,offset:y=0}=ye({cfi:m,spineItemsManager:e});if(!g){L.warn(Ki,`unable to detect item id from cfi ${m}`);return}const S=f?a.getNavigationFromNode(g,f,y):new F({x:0,y:0}),w=t.getSpinePositionFromSpineItemPosition({spineItemPosition:S,spineItem:g});return O({position:w,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},getNavigationForLastPage:m=>{const g=a.getNavigationForLastPage(m),f=t.getSpinePositionFromSpineItemPosition({spineItemPosition:g,spineItem:m});return O({position:f,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},getNavigationForSpineIndexOrId:m=>{const g=e.get(m);if(g){const f=t.getSpinePositionFromSpineItem(g);return O({position:f,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})}return new T({x:0,y:0})},getNavigationForPosition:m=>Me({viewportPosition:m,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getMostPredominantNavigationForPosition:m=>{const g=o.values.computedPageTurnDirection,f=.5,y=g==="horizontal"?m.x+r.absoluteViewport.width*f:0,S=g==="horizontal"?0:m.y+r.absoluteViewport.height*f,w=Tt({position:new T({x:y,y:S}),isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s});return Me({spineItemNavigationResolver:a,spineLocator:t,viewportPosition:w,viewport:r})},fromUnboundSpinePosition:m=>Tt({position:m,isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s}),fromOutOfBoundsSpinePosition:m=>$t({position:m,isRTL:n.isRTL(),spineItemsManager:e,spine:s,viewportWidth:r.absoluteViewport.width}),isNavigationGoingForwardFrom:(m,g)=>o.values.computedPageTurnDirection==="vertical"?m.y>g.y:m.x>g.x,arePositionsDifferent:(m,g)=>m.x!==g.x||m.y!==g.y,getAdjustedPositionForSpread:m=>O({position:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width}),spineItemNavigator:a}},ji=({spineItemsManager:n,context:e,hookManager:t,spine:o,settings:s,viewport:r})=>{const a=new i.Subject,c=a.asObservable(),l=new Pe,u=Qi({context:e,settings:s,spineItemsManager:n,locator:o.locator,spine:o,viewport:r}),p=new ht(s,t,e,o,r),d=new mt(r,s,t,o,e),h=new bt(s,e,c,p,d,u,o,l.isLocked$),m=i.combineLatest([p.isNavigating$,d.isNavigating$,l.isLocked$,h.locker.isLocked$]).pipe(b.map(y=>y.some(S=>S)?"busy":"free"),b.distinctUntilChanged(),b.shareReplay(1));return{destroy:()=>{p.destroy(),h.destroy()},getNavigation:()=>h.navigation,internalNavigator:h,scrollNavigationController:d,controlledNavigationController:p,locker:l,viewportState$:m,navigate:y=>{a.next(y)},lock(){return l.lock()},navigationResolver:u,navigation$:h.navigation$}};class Mt extends N{constructor(e,t){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=t}update(e){this.mergeCompare(e)}}class Ft extends C{constructor(e,t,o,s,r){super(),this.context=e,this.pagination=t,this.spineItemsManager=o,this.spine=s,this.spineItemLocator=r;const a=i.merge(this.context.bridgeEvent.navigation$,s.layout$).pipe(i.switchMap(()=>{const l=({spineItem:u,position:p})=>this.spine.locator.getVisiblePagesFromViewportPosition({spineItem:u,position:p,threshold:{type:"percentage",value:.5}});return this.context.bridgeEvent.navigationUnlocked$.pipe(i.take(1),i.withLatestFrom(this.context.bridgeEvent.navigation$),i.tap(([,u])=>{const{position:p}=u,d=this.pagination.value,{beginIndex:h,endIndex:m}=this.spine.locator.getVisibleSpineItemsFromPosition({position:p,threshold:{type:"percentage",value:.5}})??{},g=this.spineItemsManager.get(h),f=this.spineItemsManager.get(m);if(!g||!f)return;const y=d.beginCfi,S=d.endCfi,{beginPageIndex:w=0}=l({spineItem:g,position:p})??{},{endPageIndex:v=0}=l({spineItem:f,position:p})??{},M=y===void 0||ne(y)||d.beginSpineItemIndex!==h,P=d.endSpineItemIndex!==m||S===void 0||ne(S),E=M?H(g.item):y,A=P?H(f.item):S,R=g.numberOfPages,W=f.numberOfPages;this.pagination.update({beginCfi:E,beginNumberOfPagesInSpineItem:R,beginPageIndexInSpineItem:w,beginSpineItemIndex:h,endCfi:A,endNumberOfPagesInSpineItem:W,endPageIndexInSpineItem:v,endSpineItemIndex:m,navigationId:u.id})}))})),c=a.pipe(q(this.context.bridgeEvent.viewportFree$),i.tap(()=>{const{beginSpineItemIndex:l,endSpineItemIndex:u,beginPageIndexInSpineItem:p,endPageIndexInSpineItem:d}=this.pagination.value;if(p===void 0||d===void 0||l===void 0||u===void 0)return;const h=this.spineItemsManager.get(l),m=this.spineItemsManager.get(u);h===void 0||m===void 0||this.pagination.update({beginCfi:te({pageIndex:p,spineItem:h,spine:this.spine}),endCfi:te({pageIndex:d,spineItem:m,spine:this.spine})})}));i.merge(a,c).pipe(i.takeUntil(this.destroy$)).subscribe()}}const eo=({manifest:n,spreadMode:e})=>n?.renditionFlow==="scrolled-continuous"?!1:e;class Lt extends C{constructor(e){super();const t={...this.getDefaultSettings(),...e};this.inputSettings=t,this.outputSettingsUpdateSubject=new i.Subject,this._settings$=this.outputSettingsUpdateSubject.asObservable().pipe(i.shareReplay(1)),this._settings$.subscribe()}_prepareUpdate(e){const t=$.shallowMergeIfDefined(this.inputSettings,e),o=this.getOutputSettings(t),s=!$.isShallowEqual(this.outputSettings,o);return{hasChanged:s,state:o,commit:()=>(this.inputSettings=t,this.outputSettings=o,s&&this.outputSettingsUpdateSubject.next(o),o)}}update(e){const{commit:t}=this._prepareUpdate(e);t()}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(ge(e),i.distinctUntilChanged($.isShallowEqual))}destroy(){super.destroy(),this.outputSettingsUpdateSubject.complete()}}class to extends Lt{constructor(e,t){super(e),this.context=t,t.watch(["manifest","hasVerticalWriting"]).pipe(i.tap(()=>this.update(this.values)),i.takeUntil(this.destroy$)).subscribe()}getComputedSettings(e){const t=this.context.manifest,o=this.context.value.hasVerticalWriting??!1,s={computedPageTurnDirection:e.pageTurnDirection,computedPageTurnAnimation:e.pageTurnAnimation,computedPageTurnMode:e.pageTurnMode,computedPageTurnAnimationDuration:0,computedSpreadMode:eo({spreadMode:e.spreadMode,manifest:t})};return t?.renditionFlow==="scrolled-continuous"&&(s.computedPageTurnMode="scrollable"),s.computedPageTurnMode==="scrollable"&&(s.computedPageTurnDirection="vertical"),o&&s.computedPageTurnAnimation==="slide"&&(L.warn(`pageTurnAnimation ${s.computedPageTurnAnimation} incompatible with current book, switching back to default`),s.computedPageTurnAnimation="none"),s.computedPageTurnMode==="scrollable"?(s.computedPageTurnAnimationDuration=0,s.computedPageTurnAnimation="none"):s.computedPageTurnAnimationDuration=e.pageTurnAnimationDuration!==void 0?e.pageTurnAnimationDuration:300,s}getOutputSettings(e){const t=this.getComputedSettings(e);return{...this.outputSettings,...e,...t}}getDefaultSettings(){return{spreadMode:!1,pageTurnAnimation:"slide",pageTurnDirection:"horizontal",pageTurnAnimationDuration:void 0,pageTurnMode:"controlled",snapAnimationDuration:300,navigationSnapThreshold:{type:"pixels",value:40},numberOfAdjacentSpineItemToPreLoad:3}}}class no extends x{onUnload(){return i.EMPTY}onCreateDocument(){return i.of(document.createElement("div"))}onLoadDocument(){return i.EMPTY}onLayout(){return i.of(void 0)}onRenderHeadless(){return i.EMPTY}getDocumentFrame(){}}class io extends C{constructor(e,t,o,s,r,a,c){super(),this.item=e,this.containerElement=t,this.context=o,this.hookManager=s,this.renderer=r,this.settings=a,this.viewport=c,this.layoutTriggerSubject=new i.Subject,this.lastLayout=null,this.applyDimsAfterLayout=({blankPagePosition:l,minimumWidth:u})=>p=>p.pipe(i.map(d=>{const h=$.isShallowEqual(this.lastLayout?.pageSize,this.viewport.pageSize)?this.lastLayout:void 0,{width:m,height:g}=h??{},{width:f=m,height:y=g}=d??{},{width:S,height:w}=this.viewport.pageSize,v=this.validateDimension(f??S,S,u),M=this.settings.values.computedPageTurnMode==="scrollable"?y??w:this.validateDimension(y??w,w,w);return this.lastLayout={width:v,height:M,pageSize:this.viewport.pageSize},this.containerElement.style.width=`${v}px`,this.containerElement.style.height=`${M}px`,this.hookManager.execute("item.onAfterLayout",void 0,{blankPagePosition:l,item:this.item,minimumWidth:u}),{width:v,height:M}})),this.layout=l=>{const u=Ue(this.layout$.pipe(i.first()));return this.layoutTriggerSubject.next(l),u()},this.adjustPositionOfElement=({right:l,left:u,top:p})=>{l!==void 0?this.containerElement.style.right=`${l}px`:this.containerElement.style.removeProperty("right"),u!==void 0?this.containerElement.style.left=`${u}px`:this.containerElement.style.removeProperty("left"),p!==void 0?this.containerElement.style.top=`${p}px`:this.containerElement.style.removeProperty("top")},this.layoutProcess$=this.layoutTriggerSubject.pipe(i.switchMap(l=>{const{blankPagePosition:u,minimumWidth:p,spreadPosition:d}=l;this.hookManager.execute("item.onBeforeLayout",void 0,{blankPagePosition:u,item:this.item,minimumWidth:p});const h=this.renderer.layout({blankPagePosition:u,minPageSpread:p/this.viewport.pageSize.width,minimumWidth:p,spreadPosition:d});return i.merge(i.of({type:"start"}),h.pipe(this.applyDimsAfterLayout(l),i.map(m=>({type:"end",data:m}))))}),i.share()),this.layout$=this.layoutProcess$.pipe(i.filter(l=>l.type==="end"),i.map(l=>l.data),i.share())}validateDimension(e,t,o){if(e<=0)return o;const s=Math.max(e,o),a=Math.ceil(s/t)*t;return Math.max(a,t)}get layoutInfo(){const e=this.containerElement.style,t=e.width?parseFloat(e.width):0,o=e.height?parseFloat(e.height):0;return{width:t,height:o}}}class Fe extends N{constructor(e,t,o,s,r,a,c){super({isLoaded:!1,isReady:!1,iDirty:!1}),this.item=e,this.parentElement=t,this.context=o,this.settings=s,this.hookManager=r,this.index=a,this.viewport=c,this.load=()=>{this.renderer.load()},this.unload=()=>{this.renderer.unload()},this.markDirty=()=>{this.mergeCompare({iDirty:!0})},this.destroy=()=>{super.destroy(),this.containerElement.remove(),this.renderer.destroy()},this.isUsingVerticalWriting=()=>!!this.renderer.writingMode?.startsWith("vertical"),this.containerElement=oo(t,e,r),t.appendChild(this.containerElement);const l=this.settings.values.getRenderer?.(e);this.resourcesHandler=new J(e,this.settings);const u={context:o,settings:s,hookManager:r,item:e,containerElement:this.containerElement,resourcesHandler:this.resourcesHandler,viewport:this.viewport};this.renderer=l?l(u):new no(u),this.layout=new io(e,this.containerElement,o,r,this.renderer,this.settings,this.viewport);const p=this.renderer.state$.pipe(b.tap(h=>{this.mergeCompare({isLoaded:h==="loaded"})})),d=this.layout.layout$.pipe(b.tap(()=>{this.mergeCompare({iDirty:!1,isReady:this.renderer.state$.value==="loaded"})}));this.needsLayout$=i.merge(this.unloaded$,this.loaded$),i.merge(p,d,this.layout.layout$).pipe(b.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.state$.pipe(b.distinctUntilChanged(),b.filter(e=>e!=="idle"),b.switchMap(()=>this.renderer.state$.pipe(b.filter(e=>e==="idle"),b.first())))}get renditionLayout(){return this.renderer.renditionLayout}get numberOfPages(){return wt({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 oo=(n,e,t)=>{const o=n.ownerDocument.createElement("div");return o.classList.add("spineItem"),o.classList.add(`spineItem-${e.renditionLayout??"reflowable"}`),o.style.cssText=`
|
|
277
|
+
`,h.className=`${k}-scroll-navigator`,h.appendChild(this.viewport.value.element),d.appendChild(h),this.update({element:h})})),c=i.combineLatest([t.watch(["computedPageTurnMode"]),this.watch("element")]).pipe(i.tap(([{computedPageTurnMode:d},h])=>{h&&(d==="scrollable"?h.style.display="block":h.style.display="contents")})),l=this.navigateSubject.pipe(i.tap(this.setViewportPosition));this.isNavigating$=this.navigateSubject.pipe(i.startWith(!1),i.switchMap(()=>i.merge(i.of(!0),i.of(!1))),i.shareReplay(1));const u=i.merge(s.element$.pipe(i.filter(z),i.switchMap(d=>Z(d))),s.element$.pipe(i.filter(z),i.switchMap(d=>i.fromEvent(d,"scroll"))),s.spineItemsObserver.itemResize$).pipe(i.switchMap(()=>i.timer(10).pipe(i.map(()=>!1),i.startWith(!0))),i.distinctUntilChanged(),i.startWith(!1)),p=i.combineLatest([u,this.isScrolling$]).pipe(i.map(([d,h])=>d||h),i.shareReplay(1));this.userScroll$=this.watch("element").pipe(i.filter(z),i.switchMap(d=>t.watch(["computedPageTurnMode"]).pipe(i.switchMap(({computedPageTurnMode:h})=>h==="controlled"?i.NEVER:i.fromEvent(d,"scroll").pipe(i.withLatestFrom(p),i.filter(([,m])=>!m),i.map(([m])=>m))))),i.share()),i.merge(a,c,l).pipe(i.takeUntil(this.destroy$)).subscribe()}update(e){this.mergeCompare(e)}navigate(e){this.navigateSubject.next(e)}fromScrollPosition(e){const t=this.viewport.scaleFactor;return new _({x:e.x/t,y:e.y/t})}fromSpinePosition(e){const t=this.viewport.scaleFactor;return new we({x:e.x*t,y:e.y*t})}get scrollPosition(){const e=this.value.element;return new we({x:e?.scrollLeft??0,y:e?.scrollTop??0})}}const Ci=()=>n=>n.pipe(i.map(({navigation:e,pagination:t,...o})=>({navigation:{...e,paginationBeginCfi:t.beginCfi},...o}))),Ri=(n,e,t)=>n.bridgeEvent.pagination$.pipe(i.withLatestFrom(e),i.filter(([o,s])=>o.navigationId===s.id),i.switchMap(([o,s])=>(t.spineItemsManager.get(s.spineItem)?.isReady$.pipe(i.first())??i.of(!1)).pipe(i.filter(a=>a),i.map(()=>({pagination:o,navigation:s})))),Ci(),i.distinctUntilChanged((o,s)=>o.navigation.paginationBeginCfi===s.navigation.paginationBeginCfi),i.map(({navigation:o})=>({...o,meta:{triggeredBy:"pagination"}}))),Ai=({navigationResolver:n})=>e=>e.pipe(i.map(([t,o])=>{const s={type:"api",meta:{triggeredBy:"user"},id:Symbol(),animation:"turn",...t,position:t.position?n.fromOutOfBoundsSpinePosition(t.position):void 0};return{previousNavigation:o,navigation:s}})),Di=({navigationResolver:n})=>e=>e.pipe(i.map(t=>{if(t.navigation.cfi){const o=n.getNavigationForCfi(t.navigation.cfi);if(o)return{...t,navigation:{...t.navigation,position:o}}}return t})),Ni=({navigation:n,previousNavigation:e,settings:t})=>n.directionFromLastNavigation?n.directionFromLastNavigation:n.url!==void 0||n.cfi!==void 0?"anchor":e.spineItem===void 0||n.spineItem||!n.position?"forward":t.values.computedPageTurnDirection==="vertical"?n.position.y>e.position.y||n.position.y===e.position.y&&e.directionFromLastNavigation!=="backward"?"forward":"backward":Math.abs(n.position.x)>Math.abs(e.position.x)||n.position.x===e.position.x&&e.directionFromLastNavigation!=="backward"?"forward":"backward",Oi=({context:n,settings:e})=>t=>t.pipe(i.map(({navigation:o,previousNavigation:s})=>{const r=Ni({navigation:o,previousNavigation:s,settings:e}),a={...o,directionFromLastNavigation:r};return{previousNavigation:s,navigation:a,direction:r}})),Vi=({spineItemsManager:n,navigationResolver:e,settings:t})=>o=>o.pipe(i.map(({navigation:s,...r})=>{const a=n.get(s.spineItem);if(s.position)return t.values.computedPageTurnMode==="scrollable"?{navigation:{...s,position:s.position},...r}:{navigation:{...s,position:e.fromUnboundSpinePosition(s.position)},...r};if(!a)return{navigation:{...s,position:r.previousNavigation.position},...r};const c=e.getNavigationForSpineIndexOrId(a),l=t.values.computedPageTurnMode==="scrollable"?new _({x:c.x+r.previousNavigation.position.x,y:c.y}):e.fromUnboundSpinePosition(c);return{navigation:{...s,position:l},...r}})),ft=({settings:n,spineItemsManager:e,navigationResolver:t,spineLocator:o})=>s=>{const r=a=>{const{position:c,spineItem:l,cfi:u,directionFromLastNavigation:p}=a,{navigationSnapThreshold:d,computedPageTurnMode:h}=n.values;if(l!==void 0){const m=e.get(l);if(m)return m}if(typeof l=="number")return l>e.items.length-1?e.get(e.items.length-1):e.get(0);if(u){const m=e.getSpineItemFromCfi(u);if(m)return m}if(c&&h==="controlled"){const{beginIndex:m,endIndex:g}=o.getVisibleSpineItemsFromPosition({position:c,threshold:d,restrictToScreen:!1})??{},f=(p==="forward"||p==="anchor"?g:m)??m,y=e.get(f);if(!y)return;const{endPageIndex:S,beginPageIndex:w}=o.getVisiblePagesFromViewportPosition({position:c,spineItem:y,threshold:d,restrictToScreen:!1})??{},v=(p==="forward"||p==="anchor"?S:w)??0,M=t.getNavigationForSpineItemPage({pageIndex:v,spineItemId:y}),P=o.getVisibleSpineItemsFromPosition({position:M,threshold:d,restrictToScreen:!1}),E=p==="forward"||p==="anchor"?P?.beginIndex:P?.endIndex;return e.get(E)}return c&&h==="scrollable"?o.getSpineItemFromPosition(c):e.get(0)};return s.pipe(i.map(({navigation:a,...c})=>{const l=r(a);return{navigation:{...a,spineItem:e.getSpineItemIndex(l)},...c}}))},St=({spine:n})=>e=>e.pipe(i.switchMap(({navigation:t,...o})=>{const s=n.getSpineItemSpineLayoutInfo(t.spineItem),r=n.spineItemsManager.get(t.spineItem);return(r?.isReady$??i.of(!1)).pipe(i.first(),i.map(a=>({navigation:{...t,spineItemHeight:s?.height,spineItemWidth:s?.width,spineItemLeft:s.left,spineItemTop:s.top,spineItemIsUsingVerticalWriting:r?.isUsingVerticalWriting(),spineItemIsReady:a},...o})))})),ve=({settings:n,spineItemsManager:e,spineLocator:t,navigationResolver:o})=>s=>{const r=a=>{const{navigationSnapThreshold:c,computedPageTurnMode:l}=n.values,u=e.get(a.spineItem);if(!(!u||!a.position)){if(l==="controlled"){const{endPageIndex:p,beginPageIndex:d}=t.getVisiblePagesFromViewportPosition({position:a.position,spineItem:u,threshold:c,restrictToScreen:!1})??{},h=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?p:d)??0,m=o.getNavigationForSpineItemPage({pageIndex:h,spineItemId:u}),g=t.getVisiblePagesFromViewportPosition({position:m,spineItem:u,threshold:{type:"percentage",value:0},restrictToScreen:!0}),f=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?g?.beginPageIndex:g?.endPageIndex)??0;return t.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:f,spineItem:u})}return t.getSpineItemPositionFromSpinePosition(a.position,u)}};return s.pipe(i.map(({navigation:a,...c})=>({navigation:{...a,positionInSpineItem:r(a)},...c})))},ki=({navigationResolver:n})=>e=>e.pipe(i.map(t=>{if(t.navigation.url){const o=n.getNavigationForUrl(t.navigation.url);if(o)return{...t,navigation:{...t.navigation,position:o.position,spineItem:o.spineItemId}}}return t}));class Pe{constructor(){this.isLockedSubject=new i.BehaviorSubject(0),this.isLocked$=this.isLockedSubject.pipe(i.map(e=>!!e),i.distinctUntilChanged())}lock(){let e=!1;return this.isLockedSubject.next(this.isLockedSubject.getValue()+1),()=>{e||(e=!0,this.isLockedSubject.next(this.isLockedSubject.getValue()-1))}}}const Ui=({spineLocator:n,navigation:e,navigationResolver:t,spineItemsManager:o,spine:s})=>{const r=o.get(e.spineItem);return r?r.isReady$.pipe(i.first(),i.map(a=>{const c=s.getSpineItemSpineLayoutInfo(r),l=n.isPositionWithinSpineItem(e.position,r),u=c.width-(e.spineItemWidth??0),p=c.height-(e.spineItemHeight??0),d=u!==0||p!==0;if(e.url!==void 0&&(u||p||a&&!e.spineItemIsReady)){const m=t.getNavigationForUrl(e.url);if(m)return m.position}const h=e.cfi??e.paginationBeginCfi;if(h!==void 0&&!ne(h)&&(u||p||a&&!e.spineItemIsReady)){const m=t.getNavigationForCfi(h);if(m)return m}if(l&&d&&e.directionFromLastNavigation==="backward"){const m=new F({x:(e.positionInSpineItem?.x??0)+u,y:(e.positionInSpineItem?.y??0)+p});return t.getNavigationFromSpineItemPosition({spineItem:r,spineItemPosition:m})}if(e.positionInSpineItem&&e.spineItemHeight&&e.spineItemWidth){const m=n.spineItemLocator.getSpineItemPageIndexFromPosition({itemWidth:e.spineItemWidth,itemHeight:e.spineItemHeight,isUsingVerticalWriting:!!e.spineItemIsUsingVerticalWriting,position:e.positionInSpineItem});return t.getNavigationForSpineItemPage({pageIndex:m,spineItemId:r})}return l?t.getNavigationForPosition(e.position):t.getNavigationForSpineIndexOrId(r)})):i.of(new T({x:0,y:0}))},Wi=({navigation:n,spineLocator:e,spineItemsManager:t,settings:o,navigationResolver:s,spine:r})=>{const{spineItem:a}=n,c=t.get(a);if(!c)return new T({x:0,y:0});const{height:l,top:u}=r.getSpineItemSpineLayoutInfo(c),p=e.isPositionWithinSpineItem(n.position,c),d=n.positionInSpineItem??new F({y:0,x:0});if(o.values.computedPageTurnDirection==="vertical"){if(u===n.spineItemTop&&l===n.spineItemHeight&&p)return n.position;if(u===n.spineItemTop&&l===n.spineItemHeight&&!p)return s.getNavigationForSpineIndexOrId(c);if(u!==n.spineItemTop){const h=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(n.positionInSpineItem??new F({x:0,y:0}),c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:h,spineItem:c})}if(u===n.spineItemTop&&l!==n.spineItemHeight){const h=(n.spineItemHeight??d.y)-d.y,m=new F({y:n.directionFromLastNavigation==="backward"?l-h:d.y,x:n.position.x});if(p){const g=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(m,c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:g,spineItem:c})}if(!p){if(!(n.position.y<u)){const f=new F({y:l-h,x:n.position.x});return e.getSpinePositionFromSpineItemPosition({spineItemPosition:e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(f,c),spineItem:c})}return s.getNavigationForSpineIndexOrId(c)}}}return n.position},zi=({navigation:n,spineItemsManager:e,settings:t,spineLocator:o,navigationResolver:s,spine:r})=>t.values.computedPageTurnMode==="scrollable"?i.of(Wi({navigation:n,spineLocator:o,navigationResolver:s,settings:t,spineItemsManager:e,spine:r})):Ui({navigation:n,spineLocator:o,navigationResolver:s,spineItemsManager:e,spine:r}),yt=({settings:n,navigationResolver:e,context:t,spine:o})=>s=>s.pipe(i.switchMap(r=>zi({spineLocator:o.locator,navigation:r.navigation,navigationResolver:e,settings:n,spineItemsManager:o.spineItemsManager,spineItemLocator:o.locator.spineItemLocator,spine:o}).pipe(i.map(a=>({...r,navigation:{...r.navigation,position:a}}))))),_i=L.namespace("navigation/InternalNavigator");class bt extends C{constructor(e,t,o,s,r,a,c,l){super(),this.settings=e,this.context=t,this.userNavigation$=o,this.controlledNavigationController=s,this.scrollNavigationController=r,this.navigationResolver=a,this.spine=c,this.isUserLocked$=l,this.navigationSubject=new i.BehaviorSubject({animation:!1,position:new T({x:0,y:0}),meta:{triggeredBy:"user"},spineItemIsReady:!1,type:"api",id:Symbol()}),this.navigated$=this.navigationSubject.pipe(i.skip(1)),this.navigation$=this.navigationSubject.pipe(i.map(({position:S,id:w})=>({position:S,id:w})),i.distinctUntilChanged(({position:S,...w},{position:v,...M})=>$.isShallowEqual(w,M)&&$.isShallowEqual(S,v)),i.shareReplay(1)),this.locker=new Pe;const u=o.pipe(i.withLatestFrom(this.navigationSubject),Ai({navigationResolver:a}),ki({navigationResolver:a}),Di({navigationResolver:a}),Oi({context:t,settings:e}),ft({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),ve({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),St({spine:c})).pipe(Vi({navigationResolver:a,spineItemsManager:c.spineItemsManager,settings:e}),i.withLatestFrom(l),i.switchMap(([S,w])=>{const v=S.navigation.cfi||S.navigation.url||e.values.computedPageTurnMode==="scrollable"||w;return i.of(S).pipe(v?i.identity:yt({navigationResolver:a,settings:e,spine:c,context:t}))}),ve({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),i.map(S=>S.navigation),i.share()),p=u.pipe(i.withLatestFrom(l),i.filter(([,S])=>S),i.switchMap(([S])=>{const w=this.locker.lock();return l.pipe(i.filter(v=>!v),i.first(),i.map(()=>({...S,animation:"snap"})),i.finalize(()=>{w()}),i.takeUntil(u))}),i.share()),d=i.merge(s.layout$,c.layout$).pipe(i.switchMap(()=>i.of(null).pipe(i.switchMap(()=>l.pipe(i.filter(S=>!S),i.first())),i.map(()=>({...this.navigationSubject.getValue(),animation:!1})),i.takeUntil(i.merge(p,u))))),h=i.merge(d,p).pipe(i.map(S=>({navigation:S})),yt({navigationResolver:a,settings:e,context:t,spine:c}),i.map(S=>{const w={...S.navigation,meta:{triggeredBy:"restoration"}};return{...S,navigation:w}}),ft({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),St({spine:c}),ve({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),i.map(({navigation:S})=>S),i.share()),m=Ri(t,this.navigationSubject,c),g=i.merge(h,u,m),f=S=>S.pipe(i.tap(([w,v])=>{_i.info(`navigation updated from ${w.meta.triggeredBy} of type ${w.type}`,{previousNavigation:v,currentNavigation:w}),this.navigationSubject.next(w)})),y=S=>S.pipe(i.tap(([w,v])=>{const M=w.type==="scroll",P=w.meta.triggeredBy==="pagination",E=w.meta.triggeredBy==="restoration",A=$.isShallowEqual(v.position,w.position);if(M&&!E||P||A)return;const R={position:w.position,animation:w.animation};e.values.computedPageTurnMode==="scrollable"?this.scrollNavigationController.navigate(R):this.controlledNavigationController.navigate({...R,position:T.from(R.position)})}));g.pipe(i.withLatestFrom(this.navigationSubject),y,f,i.takeUntil(this.destroy$)).subscribe()}get navigation(){return this.navigationSubject.getValue()}}const oe=(n,e,t)=>{const o=t-n,s=t*(e*n)/(t||1);return Math.max(0,Math.min(o,s))},$e=(n,e)=>(e||0)===0||(n||0)===0?1:Math.floor(Math.max(1,n/e)),Te=(n,e,t)=>{const o=$e(t,e),s=[...Array(o)].map((r,a)=>a*e);return n>=o*e?s[s.length-1]||0:s.find(r=>n<r+e)||0},It=(n,e,t)=>{const o=[...Array(t)].map((s,r)=>r*e);return n<=0||t===0?0:n>=t*e?t-1:o.findIndex(s=>n<s+e)??0},Hi=({itemWidth:n,itemHeight:e,spineItemPosition:t})=>new F({x:Math.min(n,Math.max(0,t.x)),y:Math.min(e,Math.max(0,t.y))}),wt=({itemHeight:n,itemWidth:e,isUsingVerticalWriting:t,pageWidth:o,pageHeight:s,pageTurnDirection:r,pageTurnMode:a})=>r==="vertical"&&a==="scrollable"?1:t||r==="vertical"?$e(n,s):$e(e,o),vt=({itemWidth:n,itemHeight:e,position:t,isUsingVerticalWriting:o,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c,isRTL:l})=>{const p=Hi({spineItemPosition:t,itemHeight:e,itemWidth:n}).x,d=wt({isUsingVerticalWriting:o,itemHeight:e,itemWidth:n,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c});if(o)return It(t.y,r,d);const h=It(p,s,d);return l?d-1-h:h},Bi=({pageIndex:n,itemLayout:e,context:t,isUsingVerticalWriting:o,viewport:s})=>{if(o){const a=oe(s.pageSize.height,n,e.height);return new F({x:0,y:a})}const r=oe(s.pageSize.width,n,e.width);return t.isRTL()?new F({x:e.width-r-s.pageSize.width,y:0}):new F({x:r,y:0})},Pt=({context:n,settings:e,viewport:t})=>{const o=(c,l,u)=>{let p;c?.nodeName==="img"||c?.textContent===""&&c.nodeType===Node.ELEMENT_NODE?p=c.getBoundingClientRect().x:c&&(p=(c?xt(c,l):void 0)?.getBoundingClientRect().x||p);const d=u.layout.layoutInfo?.width||0,h=t.pageSize.width;if(p!==void 0){const m=Te(p,h,d);return new F({x:m,y:0})}};return{getSpineItemPositionFromNode:o,getSpineItemPositionFromPageIndex:({pageIndex:c,spineItem:l})=>Bi({context:n,isUsingVerticalWriting:!!l.isUsingVerticalWriting(),itemLayout:l.layout.layoutInfo,pageIndex:c,viewport:t}),getSpineItemPageIndexFromPosition:c=>vt({...c,isRTL:n.isRTL(),pageWidth:t.pageSize.width,pageHeight:t.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}),getSpineItemPageIndexFromNode:(c,l,u)=>{const p=o(c,l,u),{height:d,width:h}=u.layout.layoutInfo;return p?vt({isUsingVerticalWriting:!!u.isUsingVerticalWriting(),position:p,itemHeight:d,itemWidth:h,isRTL:n.isRTL(),pageWidth:t.pageSize.width,pageHeight:t.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}):void 0},getSpineItemClosestPositionFromUnsafePosition:(c,l)=>{const{width:u,height:p}=l.layout.layoutInfo;return new F({x:Te(c.x,t.pageSize.width,u),y:Te(c.y,t.pageSize.height,p)})},getSpineItemPagePositionFromSpineItemPosition:(c,l,u)=>{const{width:p,height:d}=u.layout.layoutInfo,h=t.pageSize.width,m=t.pageSize.height;if(!!u.isUsingVerticalWriting()){const y=oe(m,l,d);return new j({x:c.x,y:c.y-y})}const f=oe(h,l,p);if(n.isRTL()){const y=p-(l+1)*h;return new j({x:c.x-Math.max(0,y),y:c.y})}return new j({x:c.x-f,y:c.y})}}},xi=({context:n,settings:e,viewport:t})=>{const o=Pt({context:n,settings:e,viewport:t});return{getNavigationForLastPage:c=>{const l=c.numberOfPages;return o.getSpineItemPositionFromPageIndex({pageIndex:l-1,spineItem:c})},getNavigationForPosition:(c,l)=>o.getSpineItemClosestPositionFromUnsafePosition(l,c),getNavigationFromNode:(c,l,u)=>o.getSpineItemPositionFromNode(l,u,c)||new F({x:0,y:0})}};function $t({position:n,isRTL:e,spineItemsManager:t,spine:o,viewportWidth:s}){const r=t.get(t.items.length-1),a=o.getSpineItemSpineLayoutInfo(r||0),c=a.bottom,l=Math.max(0,n.y),u=Math.min(l,c);if(e){const m=Math.min(s,n.x),g=Math.max(m,a.left);return new T({x:g,y:u})}const p=a.right,d=Math.max(0,n.x),h=Math.min(d,p);return new T({x:h,y:u})}const Tt=({position:n,isRTL:e,pageSizeHeight:t,spineItemsManager:o,visibleAreaRectWidth:s,spine:r})=>{const a=$t({position:n,isRTL:e,spineItemsManager:o,spine:r,viewportWidth:s}),c=o.get(o.items.length-1),l=r.getSpineItemSpineLayoutInfo(c),u=l.bottom-t,p=Math.min(a.x,u);if(e){const h=Math.min(0,a.x);return new T({x:h,y:p})}const d=l.right-s;return new T({x:Math.min(a.x,d),y:p})},O=({position:{x:n,y:e},pageSizeWidth:t,visibleAreaRectWidth:o})=>{const r=n%o!==0?n-t:n;return new T({x:r,y:e})},Me=({viewportPosition:n,spineLocator:e,spineItemNavigationResolver:t,viewport:o})=>{const s=e.getSpineItemFromPosition(n);if(s){const r=e.getSpineItemPositionFromSpinePosition(n,s),a=t.getNavigationForPosition(s,r),c=e.getSpinePositionFromSpineItemPosition({spineItemPosition:a,spineItem:s});return O({position:c,pageSizeWidth:o.pageSize.width,visibleAreaRectWidth:o.absoluteViewport.width})}return new T({x:0,y:0})},qi=({pageIndex:n,spineItemsManager:e,spineItemId:t,spineLocator:o,spineItemNavigationResolver:s,viewport:r})=>{const a=e.get(t);if(!a){const u=n*r.pageSize.width;return Me({viewportPosition:new T({x:u,y:0}),spineItemNavigationResolver:s,spineLocator:o,viewport:r})}const c=o.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:n,spineItem:a}),l=o.getSpinePositionFromSpineItemPosition({spineItemPosition:c,spineItem:a});return O({position:l,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},Xi=(n,e)=>{if(e&&e instanceof HTMLIFrameElement)return n.startsWith("#")?e.contentDocument?.getElementById(n.replace("#","")):e.contentDocument?.querySelector(n)},Yi=({anchor:n,spineItem:e,spine:t})=>{const o=Xi(n,e.renderer.getDocumentFrame());return o?t.spineItemLocator.getSpineItemPositionFromNode(o,0,e)?.x??0:0},Gi=({anchor:n,spineItem:e,spineLocator:t,spine:o})=>{const s=Yi({anchor:n,spineItem:e,spine:o});return t.getSpinePositionFromSpineItemPosition({spineItemPosition:new F({x:s,y:0}),spineItem:e})},Zi=({anchor:n,spineItem:e,spineLocator:t,spine:o,pageSizeWidth:s,visibleAreaRectWidth:r})=>{const a=Gi({anchor:n,spineItem:e,spineLocator:t,spine:o});return O({position:a,pageSizeWidth:s,visibleAreaRectWidth:r})},Ji=({spine:n,spineItemsManager:e,spineLocator:t,url:o,context:s,pageSizeWidth:r,visibleAreaRectWidth:a})=>{try{const c=o instanceof URL?o:new URL(o),l=`${c.origin}${c.pathname}`,u=s.manifest?.spineItems.find(p=>p.href===l);if(u){const p=e.get(u.id);if(p){const d=Zi({anchor:c.hash,spineItem:p,spine:n,spineLocator:t,pageSizeWidth:r,visibleAreaRectWidth:a});return{position:O({position:d,pageSizeWidth:r,visibleAreaRectWidth:a}),spineItemId:u.id}}}return}catch(c){console.error(c);return}},Ki=({spineItem:n,spineItemPosition:e,spineLocator:t,spineItemLocator:o,viewport:s})=>{const r=o.getSpineItemClosestPositionFromUnsafePosition(e,n),a=t.getSpinePositionFromSpineItemPosition({spineItemPosition:r,spineItem:n});return O({position:a,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},Qi="spineNavigator",ji=({context:n,spineItemsManager:e,locator:t,settings:o,spine:s,viewport:r})=>{const a=xi({context:n,settings:o,viewport:r});return{getNavigationForUrl:m=>Ji({context:n,spineItemsManager:e,spineLocator:t,url:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width,spine:s}),getNavigationForSpineItemPage:m=>qi({...m,spineItemsManager:e,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getNavigationFromSpineItemPosition:m=>Ki({...m,spineItemLocator:t.spineItemLocator,spineLocator:t,viewport:r}),getNavigationForCfi:m=>{const g=e.getSpineItemFromCfi(m),{node:f,offset:y=0}=ye({cfi:m,spineItemsManager:e});if(!g){L.warn(Qi,`unable to detect item id from cfi ${m}`);return}const S=f?a.getNavigationFromNode(g,f,y):new F({x:0,y:0}),w=t.getSpinePositionFromSpineItemPosition({spineItemPosition:S,spineItem:g});return O({position:w,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},getNavigationForLastPage:m=>{const g=a.getNavigationForLastPage(m),f=t.getSpinePositionFromSpineItemPosition({spineItemPosition:g,spineItem:m});return O({position:f,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},getNavigationForSpineIndexOrId:m=>{const g=e.get(m);if(g){const f=t.getSpinePositionFromSpineItem(g);return O({position:f,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})}return new T({x:0,y:0})},getNavigationForPosition:m=>Me({viewportPosition:m,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getMostPredominantNavigationForPosition:m=>{const g=o.values.computedPageTurnDirection,f=.5,y=g==="horizontal"?m.x+r.absoluteViewport.width*f:0,S=g==="horizontal"?0:m.y+r.absoluteViewport.height*f,w=Tt({position:new T({x:y,y:S}),isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s});return Me({spineItemNavigationResolver:a,spineLocator:t,viewportPosition:w,viewport:r})},fromUnboundSpinePosition:m=>Tt({position:m,isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s}),fromOutOfBoundsSpinePosition:m=>$t({position:m,isRTL:n.isRTL(),spineItemsManager:e,spine:s,viewportWidth:r.absoluteViewport.width}),isNavigationGoingForwardFrom:(m,g)=>o.values.computedPageTurnDirection==="vertical"?m.y>g.y:m.x>g.x,arePositionsDifferent:(m,g)=>m.x!==g.x||m.y!==g.y,getAdjustedPositionForSpread:m=>O({position:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width}),spineItemNavigator:a}},eo=({spineItemsManager:n,context:e,hookManager:t,spine:o,settings:s,viewport:r})=>{const a=new i.Subject,c=a.asObservable(),l=new Pe,u=ji({context:e,settings:s,spineItemsManager:n,locator:o.locator,spine:o,viewport:r}),p=new ht(s,t,e,o,r),d=new mt(r,s,t,o,e),h=new bt(s,e,c,p,d,u,o,l.isLocked$),m=i.combineLatest([p.isNavigating$,d.isNavigating$,l.isLocked$,h.locker.isLocked$]).pipe(b.map(y=>y.some(S=>S)?"busy":"free"),b.distinctUntilChanged(),b.shareReplay(1));return{destroy:()=>{p.destroy(),h.destroy()},getNavigation:()=>h.navigation,internalNavigator:h,scrollNavigationController:d,controlledNavigationController:p,locker:l,viewportState$:m,navigate:y=>{a.next(y)},lock(){return l.lock()},navigationResolver:u,navigation$:h.navigation$}};class Mt extends N{constructor(e,t){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=t}update(e){this.mergeCompare(e)}}class Ft extends C{constructor(e,t,o,s,r){super(),this.context=e,this.pagination=t,this.spineItemsManager=o,this.spine=s,this.spineItemLocator=r;const a=i.merge(this.context.bridgeEvent.navigation$,s.layout$).pipe(i.switchMap(()=>{const l=({spineItem:u,position:p})=>this.spine.locator.getVisiblePagesFromViewportPosition({spineItem:u,position:p,threshold:{type:"percentage",value:.5}});return this.context.bridgeEvent.navigationUnlocked$.pipe(i.take(1),i.withLatestFrom(this.context.bridgeEvent.navigation$),i.tap(([,u])=>{const{position:p}=u,d=this.pagination.value,{beginIndex:h,endIndex:m}=this.spine.locator.getVisibleSpineItemsFromPosition({position:p,threshold:{type:"percentage",value:.5}})??{},g=this.spineItemsManager.get(h),f=this.spineItemsManager.get(m);if(!g||!f)return;const y=d.beginCfi,S=d.endCfi,{beginPageIndex:w=0}=l({spineItem:g,position:p})??{},{endPageIndex:v=0}=l({spineItem:f,position:p})??{},M=y===void 0||ne(y)||d.beginSpineItemIndex!==h,P=d.endSpineItemIndex!==m||S===void 0||ne(S),E=M?H(g.item):y,A=P?H(f.item):S,R=g.numberOfPages,W=f.numberOfPages;this.pagination.update({beginCfi:E,beginNumberOfPagesInSpineItem:R,beginPageIndexInSpineItem:w,beginSpineItemIndex:h,endCfi:A,endNumberOfPagesInSpineItem:W,endPageIndexInSpineItem:v,endSpineItemIndex:m,navigationId:u.id})}))})),c=a.pipe(q(this.context.bridgeEvent.viewportFree$),i.tap(()=>{const{beginSpineItemIndex:l,endSpineItemIndex:u,beginPageIndexInSpineItem:p,endPageIndexInSpineItem:d}=this.pagination.value;if(p===void 0||d===void 0||l===void 0||u===void 0)return;const h=this.spineItemsManager.get(l),m=this.spineItemsManager.get(u);h===void 0||m===void 0||this.pagination.update({beginCfi:te({pageIndex:p,spineItem:h,spine:this.spine}),endCfi:te({pageIndex:d,spineItem:m,spine:this.spine})})}));i.merge(a,c).pipe(i.takeUntil(this.destroy$)).subscribe()}}const to=({manifest:n,spreadMode:e})=>n?.renditionFlow==="scrolled-continuous"?!1:e;class Lt extends C{constructor(e){super();const t={...this.getDefaultSettings(),...e};this.inputSettings=t,this.outputSettingsUpdateSubject=new i.Subject,this._settings$=this.outputSettingsUpdateSubject.asObservable().pipe(i.shareReplay(1)),this._settings$.subscribe()}_prepareUpdate(e){const t=$.shallowMergeIfDefined(this.inputSettings,e),o=this.getOutputSettings(t),s=!$.isShallowEqual(this.outputSettings,o);return{hasChanged:s,state:o,commit:()=>(this.inputSettings=t,this.outputSettings=o,s&&this.outputSettingsUpdateSubject.next(o),o)}}update(e){const{commit:t}=this._prepareUpdate(e);t()}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(ge(e),i.distinctUntilChanged($.isShallowEqual))}destroy(){super.destroy(),this.outputSettingsUpdateSubject.complete()}}class no extends Lt{constructor(e,t){super(e),this.context=t,t.watch(["manifest","hasVerticalWriting"]).pipe(i.tap(()=>this.update(this.values)),i.takeUntil(this.destroy$)).subscribe()}getComputedSettings(e){const t=this.context.manifest,o=this.context.value.hasVerticalWriting??!1,s={computedPageTurnDirection:e.pageTurnDirection,computedPageTurnAnimation:e.pageTurnAnimation,computedPageTurnMode:e.pageTurnMode,computedPageTurnAnimationDuration:0,computedSpreadMode:to({spreadMode:e.spreadMode,manifest:t})};return t?.renditionFlow==="scrolled-continuous"&&(s.computedPageTurnMode="scrollable"),s.computedPageTurnMode==="scrollable"&&(s.computedPageTurnDirection="vertical"),o&&s.computedPageTurnAnimation==="slide"&&(L.warn(`pageTurnAnimation ${s.computedPageTurnAnimation} incompatible with current book, switching back to default`),s.computedPageTurnAnimation="none"),s.computedPageTurnMode==="scrollable"?(s.computedPageTurnAnimationDuration=0,s.computedPageTurnAnimation="none"):s.computedPageTurnAnimationDuration=e.pageTurnAnimationDuration!==void 0?e.pageTurnAnimationDuration:300,s}getOutputSettings(e){const t=this.getComputedSettings(e);return{...this.outputSettings,...e,...t}}getDefaultSettings(){return{spreadMode:!1,pageTurnAnimation:"slide",pageTurnDirection:"horizontal",pageTurnAnimationDuration:void 0,pageTurnMode:"controlled",snapAnimationDuration:300,navigationSnapThreshold:{type:"pixels",value:40},numberOfAdjacentSpineItemToPreLoad:3}}}class io extends x{onUnload(){return i.EMPTY}onCreateDocument(){return i.of(document.createElement("div"))}onLoadDocument(){return i.EMPTY}onLayout(){return i.of(void 0)}onRenderHeadless(){return i.EMPTY}getDocumentFrame(){}}class oo extends C{constructor(e,t,o,s,r,a,c){super(),this.item=e,this.containerElement=t,this.context=o,this.hookManager=s,this.renderer=r,this.settings=a,this.viewport=c,this.layoutTriggerSubject=new i.Subject,this.lastLayout=null,this.applyDimsAfterLayout=({blankPagePosition:l,minimumWidth:u})=>p=>p.pipe(i.map(d=>{const h=$.isShallowEqual(this.lastLayout?.pageSize,this.viewport.pageSize)?this.lastLayout:void 0,{width:m,height:g}=h??{},{width:f=m,height:y=g}=d??{},{width:S,height:w}=this.viewport.pageSize,v=this.validateDimension(f??S,S,u),M=this.settings.values.computedPageTurnMode==="scrollable"?y??w:this.validateDimension(y??w,w,w);return this.lastLayout={width:v,height:M,pageSize:this.viewport.pageSize},this.containerElement.style.width=`${v}px`,this.containerElement.style.height=`${M}px`,this.hookManager.execute("item.onAfterLayout",void 0,{blankPagePosition:l,item:this.item,minimumWidth:u}),{width:v,height:M}})),this.layout=l=>{const u=Ue(this.layout$.pipe(i.first()));return this.layoutTriggerSubject.next(l),u()},this.adjustPositionOfElement=({right:l,left:u,top:p})=>{l!==void 0?this.containerElement.style.right=`${l}px`:this.containerElement.style.removeProperty("right"),u!==void 0?this.containerElement.style.left=`${u}px`:this.containerElement.style.removeProperty("left"),p!==void 0?this.containerElement.style.top=`${p}px`:this.containerElement.style.removeProperty("top")},this.layoutProcess$=this.layoutTriggerSubject.pipe(i.switchMap(l=>{const{blankPagePosition:u,minimumWidth:p,spreadPosition:d}=l;this.hookManager.execute("item.onBeforeLayout",void 0,{blankPagePosition:u,item:this.item,minimumWidth:p});const h=this.renderer.layout({blankPagePosition:u,minPageSpread:p/this.viewport.pageSize.width,minimumWidth:p,spreadPosition:d});return i.merge(i.of({type:"start"}),h.pipe(this.applyDimsAfterLayout(l),i.map(m=>({type:"end",data:m}))))}),i.share()),this.layout$=this.layoutProcess$.pipe(i.filter(l=>l.type==="end"),i.map(l=>l.data),i.share())}validateDimension(e,t,o){if(e<=0)return o;const s=Math.max(e,o),a=Math.ceil(s/t)*t;return Math.max(a,t)}get layoutInfo(){const e=this.containerElement.style,t=e.width?parseFloat(e.width):0,o=e.height?parseFloat(e.height):0;return{width:t,height:o}}}class Fe extends N{constructor(e,t,o,s,r,a,c){super({isLoaded:!1,isReady:!1,iDirty:!1}),this.item=e,this.parentElement=t,this.context=o,this.settings=s,this.hookManager=r,this.index=a,this.viewport=c,this.load=()=>{this.renderer.load()},this.unload=()=>{this.renderer.unload()},this.markDirty=()=>{this.mergeCompare({iDirty:!0})},this.destroy=()=>{super.destroy(),this.containerElement.remove(),this.renderer.destroy()},this.isUsingVerticalWriting=()=>!!this.renderer.writingMode?.startsWith("vertical"),this.containerElement=so(t,e,r),t.appendChild(this.containerElement);const l=this.settings.values.getRenderer?.(e);this.resourcesHandler=new J(e,this.settings);const u={context:o,settings:s,hookManager:r,item:e,containerElement:this.containerElement,resourcesHandler:this.resourcesHandler,viewport:this.viewport};this.renderer=l?l(u):new io(u),this.layout=new oo(e,this.containerElement,o,r,this.renderer,this.settings,this.viewport);const p=this.renderer.state$.pipe(b.tap(h=>{this.mergeCompare({isLoaded:h==="loaded"})})),d=this.layout.layout$.pipe(b.tap(()=>{this.mergeCompare({iDirty:!1,isReady:this.renderer.state$.value==="loaded"})}));this.needsLayout$=i.merge(this.unloaded$,this.loaded$),i.merge(p,d,this.layout.layout$).pipe(b.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.state$.pipe(b.distinctUntilChanged(),b.filter(e=>e!=="idle"),b.switchMap(()=>this.renderer.state$.pipe(b.filter(e=>e==="idle"),b.first())))}get renditionLayout(){return this.renderer.renditionLayout}get numberOfPages(){return wt({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 so=(n,e,t)=>{const o=n.ownerDocument.createElement("div");return o.classList.add("spineItem"),o.classList.add(`spineItem-${e.renditionLayout??"reflowable"}`),o.style.cssText=`
|
|
278
278
|
position: absolute;
|
|
279
279
|
overflow: hidden;
|
|
280
|
-
`,o.dataset.isReady="false",t.execute("item.onBeforeContainerCreated",void 0,{element:o}),o};class so extends C{constructor(e,t,o,s,r){super(),this.context=e,this.spineItemsManager=t,this.spineLocator=o,this.settings=s,this.spineLayout=r,this.forcedOpenSubject=new i.BehaviorSubject([]);const a=this.forcedOpenSubject.pipe(i.map(u=>[...new Set(u.flat())].sort()),i.distinctUntilChanged($.arrayEqual),i.shareReplay({bufferSize:1,refCount:!0}));i.merge(this.context.bridgeEvent.navigation$,this.spineLayout.layout$,a,s.watch(["numberOfAdjacentSpineItemToPreLoad"])).pipe(i.debounceTime(100,i.animationFrameScheduler),q(this.context.bridgeEvent.viewportFree$),i.withLatestFrom(this.context.bridgeEvent.navigation$,a),i.map(([,u,p])=>{const{numberOfAdjacentSpineItemToPreLoad:d}=s.values,{beginIndex:h=0,endIndex:m=0}=o.getVisibleSpineItemsFromPosition({position:u.position,threshold:{type:"percentage",value:0},useAbsoluteViewport:!1})||{},g=d===1/0?0:h-d,f=d===1/0?t.items.length-1:m+d,y=Array.from({length:f-g+1},(w,v)=>g+v),S=[...p,...y];t.items.forEach((w,v)=>{S.includes(v)?w.load():w.unload()})})).pipe(i.takeUntil(this.destroy$)).subscribe()}forceOpen(e){const t=e.map(o=>typeof o=="number"?o:o.index);return this.forcedOpenSubject.next([...this.forcedOpenSubject.value,t]),()=>{this.isDestroyed||this.forcedOpenSubject.next(this.forcedOpenSubject.value.filter(o=>o!==t))}}destroy(){super.destroy(),this.forcedOpenSubject.complete()}}const Et=(n,e,t)=>{const o=(t.width-e.width)/2,s=(t.height-e.height)/2;return new _({x:n.x-o,y:n.y-s})};class X extends DOMRect{constructor(){super(...arguments),this.__symbol=Symbol("ViewportPosition")}static from(e,t){if(t){const s=e;return new X(s.x,s.y,t.width,t.height)}const o=e;return new X(o.x,o.y,o.width,o.height)}}class ro{constructor({width:e,height:t}){this.__symbol=Symbol("AbsoluteViewport"),this.width=e,this.height=t}}class ao{constructor({width:e,height:t}){this.__symbol=Symbol("RelativeViewport"),this.width=e,this.height=t}}const co=({pageIndex:n,spineItemOrId:e,spineItemsManager:t})=>{const o=t.items,s=t.get(e);if(!s)return;const{currentAbsolutePage:r}=o.reduce((a,c)=>{if(a.found)return a;const l=c.numberOfPages;return s===c&&n<=l-1?{currentAbsolutePage:a.currentAbsolutePage+n,found:!0}:{...a,currentAbsolutePage:a.currentAbsolutePage+l}},{currentAbsolutePage:0,found:!1});return r},lo=({itemHeight:n,itemWidth:e,visibleWidthOfItem:t,visibleHeightOfItem:o,threshold:s})=>{const r=t/e,a=o/n;return s.type==="percentage"?r>=s.value&&a>=s.value:t>=s.value&&o>=s.value},uo=({visibleWidthOfItem:n,visibleHeightOfItem:e,threshold:t,viewportPosition:o})=>{const s=n/o.width,r=e/o.height;return t.type==="percentage"?r>=t.value&&s>=t.value:e>=t.value&&n>=t.value},Ct=({itemPosition:{bottom:n,left:e,right:t,top:o,width:s,height:r},threshold:a,viewportPosition:c,restrictToScreen:l})=>{const u=c.x,p=c.x+(c.width-1),d=c.y,h=Math.max(c.y+(c.height-1),0),m=Math.max(0,Math.min(t,p)-Math.max(e,u)),g=Math.max(0,Math.min(n,h)-Math.max(o,d));if(m<=0||g<=0)return{visible:!1};const y=uo({threshold:a,visibleHeightOfItem:g,visibleWidthOfItem:m,viewportPosition:c});return l?{visible:y}:{visible:lo({itemHeight:r,itemWidth:s,threshold:a,visibleHeightOfItem:g,visibleWidthOfItem:m})||y}},Le=({position:n,spineItemsManager:e,spineLayout:t})=>{const o=e.items.find(s=>{const{left:r,right:a,bottom:c,top:l}=t.getSpineItemSpineLayoutInfo(s),u=n.x>=r&&n.x<a,p=n.y>=l&&n.y<c;return u&&p});return n.x===0&&!o?e.items[0]:o},Ee=({spineItemPosition:n,itemLayout:{left:e,top:t}})=>new T({x:e+n.x,y:t+n.y}),po=({position:n,threshold:e,restrictToScreen:t,spineItemsManager:o,spineLayout:s,useAbsoluteViewport:r=!0,viewport:a})=>{const c=Le({position:n,spineItemsManager:o,spineLayout:s})||o.get(0),l=o.items.reduce((m,g)=>{const f=s.getSpineItemSpineLayoutInfo(g),y=r?a.absoluteViewport:a.relativeViewport,S=Et(n,a.absoluteViewport,y),w=X.from(S,y),{visible:v}=Ct({itemPosition:f,threshold:e,viewportPosition:w,restrictToScreen:t});return v?[...m,g]:m},[]),u=l[0]??c,p=l[l.length-1]??u;if(!u||!p)return;const d=o.getSpineItemIndex(u),h=o.getSpineItemIndex(p);return{beginIndex:d??0,endIndex:h??0}},go=({spineItemsManager:n,context:e,spineItemLocator:t,settings:o,spineLayout:s,viewport:r})=>{const a=(g,f)=>{const{left:y,top:S}=s.getSpineItemSpineLayoutInfo(f);return new F({x:Math.max(g.x-y,0),y:Math.max(g.y-S,0)})},c=g=>Ee({spineItemPosition:new F({x:0,y:0}),itemLayout:s.getSpineItemSpineLayoutInfo(g)}),l=g=>n.items.find(f=>f.renderer.getDocumentFrame()===g),u=(g,f,y)=>{if(typeof y=="number"){const S=n.get(y);return S?t.getSpineItemPageIndexFromNode(g,f||0,S):void 0}return t.getSpineItemPageIndexFromNode(g,f||0,y)},p=({position:g,threshold:f,spineItem:y,restrictToScreen:S,useAbsoluteViewport:w=!0,viewport:v})=>{const M=y.numberOfPages,E=Array.from(Array(M)).map((W,re)=>{const Ce=t.getSpineItemPositionFromPageIndex({pageIndex:re,spineItem:y}),B=Ee({spineItemPosition:Ce,itemLayout:s.getSpineItemSpineLayoutInfo(y)});return{index:re,absolutePosition:{width:v.pageSize.width,height:v.pageSize.height,left:B.x,top:B.y,bottom:B.y+v.pageSize.height,right:B.x+v.pageSize.width}}}).reduce((W,{absolutePosition:re,index:Ce})=>{const B=w?v.absoluteViewport:v.relativeViewport,wo=Et(g,v.absoluteViewport,B),vo=X.from(wo,B),{visible:Po}=Ct({viewportPosition:vo,restrictToScreen:S,threshold:f,itemPosition:re});return Po?[...W,Ce]:W},[]),A=E[0],R=E[E.length-1]??A;if(!(A===void 0||R===void 0))return{beginPageIndex:A,endPageIndex:R}};return{getSpinePositionFromSpineItemPosition:({spineItem:g,spineItemPosition:f})=>{const y=s.getSpineItemSpineLayoutInfo(g);return Ee({itemLayout:y,spineItemPosition:f})},_getAbsolutePageIndexFromPageIndex:g=>co({...g,spineItemsManager:n}),getSpineItemPagePositionFromSpinePosition:g=>{const f=Le({position:g,spineItemsManager:n,spineLayout:s});if(!f)return;const y=a(g,f),S=t.getSpineItemPageIndexFromPosition({itemWidth:f.layout.layoutInfo.width,itemHeight:f.layout.layoutInfo.height,position:y,isUsingVerticalWriting:!!f.isUsingVerticalWriting()}),w=t.getSpineItemPagePositionFromSpineItemPosition(y,S,f);return{spineItem:f,spineItemPageIndex:S,spineItemPagePosition:w,pageSize:r.value.pageSize}},getSpinePositionFromSpineItem:c,getSpineItemPositionFromSpinePosition:a,getSpineItemFromPosition:g=>Le({position:g,spineItemsManager:n,spineLayout:s}),getSpineItemFromIframe:l,getSpineItemPageIndexFromNode:u,getVisibleSpineItemsFromPosition:g=>po({spineItemsManager:n,spineLayout:s,viewport:r,...g}),getVisiblePagesFromViewportPosition:g=>p({...g,viewport:r}),isPositionWithinSpineItem:(g,f)=>{const{bottom:y,left:S,right:w,top:v}=s.getSpineItemSpineLayoutInfo(f);return g.x>=S&&g.x<=w&&g.y<=y&&g.y>=v},spineItemLocator:t,getSafeSpineItemPositionFromUnsafeSpineItemPosition:(g,f)=>{const{height:y,width:S}=s.getSpineItemSpineLayoutInfo(f);return new F({x:Math.min(Math.max(0,g.x),S),y:Math.min(Math.max(0,g.y),y)})}}},ho=L.namespace("spine"),Rt=({position:n,pageSize:e})=>new Ze({...n,left:n.x,top:n.y,width:e.width,height:e.height,bottom:n.y+e.height,right:n.x+e.width});class At extends N{constructor(e,t,o,s,r,a){super({pages:[]}),this.spineLayout=e,this.spineItemsManager=t,this.spineItemLocator=o,this.context=s,this.locator=r,this.viewport=a,this.fromSpineItemPageIndex=(c,l)=>this.value.pages.find(u=>u.itemIndex===c.index&&u.pageIndex===l),this.fromAbsolutePageIndex=c=>this.value.pages.reduce((l,u)=>l||(u.absolutePageIndex===c?u:l),void 0),this.observeFromAbsolutePageIndex=c=>this.pipe(i.map(()=>this.fromAbsolutePageIndex(c))),this.layout$=e.layout$.pipe(i.withLatestFrom(a),i.switchMap(([,{pageSize:c}])=>{const l=t.items.reduce((p,d,h)=>{const g=new Array(d.numberOfPages).fill(void 0).map((f,y)=>{const S=o.getSpineItemPositionFromPageIndex({spineItem:d,pageIndex:y}),w=r.getSpinePositionFromSpineItemPosition({spineItem:d,spineItemPosition:S});return{absoluteLayout:Rt({pageSize:c,position:w}),layout:new Ge({left:S.x,right:S.x+c.width,top:S.y,bottom:S.y+c.height,width:c.width,height:c.height,x:S.x,y:S.y}),itemIndex:h,absolutePageIndex:p.length+y,spineItem:d,pageIndex:y}});return[...p,...g]},[]);return i.combineLatest(l.map(p=>{const{spineItem:d,...h}=p;return new i.Observable(m=>{const g=p.spineItem.renderer?.getDocumentFrame();let f;g&&g?.contentWindow?.document&&g.contentWindow.document.body!==null&&(f=Ht(g.contentWindow.document,p.layout)),m.next({...h,firstVisibleNode:f})})}))}),i.map(c=>(ho.info("Pages layout",c),{pages:c})),i.share()),this.layout$.pipe(i.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}}class Dt extends C{constructor(e,t){super(),this.spineItemsManager=e,this.spineLocator=t,this.itemIsReady$=this.spineItemsManager.items$.pipe(i.switchMap(o=>{const s=o.map(r=>r.isReady$.pipe(i.map(a=>({item:r,isReady:a}))));return i.merge(...s)}),i.share()),this.itemResize$=this.spineItemsManager.items$.pipe(i.switchMap(o=>{const s=o.map(r=>Z(r.element).pipe(i.map(a=>({entries:a,item:r}))));return i.merge(...s)}),i.share())}}const mo=({horizontalOffset:n,verticalOffset:e,context:t,spineItemsManager:o,isGloballyPrePaginated:s,settings:r,index:a,item:c,viewport:l})=>{let u=l.value.pageSize.width,p="none";const d=n%l.absoluteViewport.width===0,h=a===o.items.length-1;if(r.values.computedSpreadMode){!s&&c.renditionLayout==="reflowable"&&!h&&(u=l.value.pageSize.width*2),!s&&c.renditionLayout==="reflowable"&&h&&d&&(u=l.value.pageSize.width*2);const g=d&&h&&s;c.item.pageSpreadRight&&d&&!t.isRTL()||c.item.pageSpreadLeft&&d&&t.isRTL()?(p="before",u=l.value.pageSize.width*2):g&&(t.isRTL()?p="before":p="after",u=l.value.pageSize.width*2)}return c.layout.layout({minimumWidth:u,blankPagePosition:p,spreadPosition:r.values.computedSpreadMode?d?t.isRTL()?"right":"left":t.isRTL()?"left":"right":"none"}).pipe(i.map(({width:g,height:f})=>{if(r.values.computedPageTurnDirection==="vertical"){const w=d?e:e-l.absoluteViewport.height,v=d?0:n;t.isRTL()?c.layout.adjustPositionOfElement({top:w,left:v}):c.layout.adjustPositionOfElement({top:w,left:v});const M=g+v,P=f+w,E=new ee({left:v,right:M,top:w,bottom:P,height:f,width:g,x:v,y:w});return{horizontalOffset:M,verticalOffset:P,layoutPosition:E}}c.layout.adjustPositionOfElement(t.isRTL()?{right:n,top:0}:{left:n,top:0});const y=t.isRTL()?l.absoluteViewport.width-n-g:n,S=new ee({right:t.isRTL()?l.absoluteViewport.width-n:n+g,left:y,x:y,top:e,bottom:f,height:f,width:g,y:e});return{horizontalOffset:n+g,verticalOffset:0,layoutPosition:S}}))};class fo extends C{constructor(e,t,o,s){super(),this.spineItemsManager=e,this.context=t,this.settings=o,this.viewport=s,this.layoutSubject=new i.Subject,this.spineItemsRelativeLayouts=[],e.items$.pipe(i.tap(()=>{this.spineItemsRelativeLayouts=[]}),i.switchMap(a=>{const c=a.map(u=>u.needsLayout$.pipe(i.tap(()=>{this.layout()}))),l=a.map(u=>u.loaded$.pipe(i.tap(()=>{u.isUsingVerticalWriting()?this.context.update({hasVerticalWriting:!0}):this.context.update({hasVerticalWriting:!1})})));return i.merge(...c,...l)})).pipe(i.takeUntil(this.destroy$)).subscribe();const r=new i.BehaviorSubject(!1);this.layout$=this.layoutSubject.pipe(i.tap(()=>{this.spineItemsManager.items.forEach(a=>{a.markDirty()})}),i.debounceTime(50),i.exhaustMap(()=>r.pipe(i.filter(a=>!a),i.first())),i.exhaustMap(()=>{r.next(!0);const a=this.context.manifest,c=lt(a)??!1;return i.from(this.spineItemsManager.items).pipe(i.reduce((u,p,d)=>u.pipe(i.concatMap(({horizontalOffset:h,verticalOffset:m})=>mo({context:this.context,horizontalOffset:h,index:d,isGloballyPrePaginated:c,item:p,settings:this.settings,spineItemsManager:this.spineItemsManager,verticalOffset:m,viewport:s}).pipe(i.map(({horizontalOffset:g,verticalOffset:f,layoutPosition:y})=>(this.spineItemsRelativeLayouts[d]=y,{horizontalOffset:g,verticalOffset:f}))))),i.of({horizontalOffset:0,verticalOffset:0})),i.concatMap(u=>u),i.finalize(()=>{r.next(!1)}))}),i.share()),i.merge(this.layout$).pipe(i.takeUntil(this.destroy$)).subscribe()}layout(){this.layoutSubject.next(void 0)}getSpineItemSpineLayoutInfo(e){const t=this.spineItemsManager.getSpineItemIndex(e)??0;return this.spineItemsRelativeLayouts[t]||new ee({left:0,right:0,top:0,bottom:0,width:0,height:0,x:0,y:0})}get numberOfPages(){return this.spineItemsManager.items.reduce((e,t)=>e+t.numberOfPages,0)}destroy(){super.destroy(),this.layoutSubject.complete()}}class Nt extends C{constructor(e,t,o,s,r,a,c){super(),this.context=e,this.pagination=t,this.spineItemsManager=o,this.spineItemLocator=s,this.settings=r,this.hookManager=a,this.viewport=c,this.elementSubject=new i.BehaviorSubject(void 0),this.element$=this.elementSubject.asObservable(),this.spineLayout=new fo(o,e,r,c),this.locator=go({context:e,spineItemsManager:o,spineItemLocator:s,settings:r,spineLayout:this.spineLayout,viewport:c}),this.spineItemsLoader=new so(this.context,o,this.locator,r,this.spineLayout),this.spineItemsObserver=new Dt(o,this.locator),this.pages=new At(this.spineLayout,this.spineItemsManager,this.spineItemLocator,this.context,this.locator,this.viewport);const l=e.watch("rootElement").pipe(b.filter(ae.isDefined),b.tap(p=>{const d=p.ownerDocument.createElement("div");d.style.cssText=`
|
|
280
|
+
`,o.dataset.isReady="false",t.execute("item.onBeforeContainerCreated",void 0,{element:o}),o};class ro extends C{constructor(e,t,o,s,r){super(),this.context=e,this.spineItemsManager=t,this.spineLocator=o,this.settings=s,this.spineLayout=r,this.forcedOpenSubject=new i.BehaviorSubject([]);const a=this.forcedOpenSubject.pipe(i.map(u=>[...new Set(u.flat())].sort()),i.distinctUntilChanged($.arrayEqual),i.shareReplay({bufferSize:1,refCount:!0}));i.merge(this.context.bridgeEvent.navigation$,this.spineLayout.layout$,a,s.watch(["numberOfAdjacentSpineItemToPreLoad"])).pipe(i.debounceTime(100,i.animationFrameScheduler),q(this.context.bridgeEvent.viewportFree$),i.withLatestFrom(this.context.bridgeEvent.navigation$,a),i.map(([,u,p])=>{const{numberOfAdjacentSpineItemToPreLoad:d}=s.values,{beginIndex:h=0,endIndex:m=0}=o.getVisibleSpineItemsFromPosition({position:u.position,threshold:{type:"percentage",value:0},useAbsoluteViewport:!1})||{},g=d===1/0?0:h-d,f=d===1/0?t.items.length-1:m+d,y=Array.from({length:f-g+1},(w,v)=>g+v),S=[...p,...y];t.items.forEach((w,v)=>{S.includes(v)?w.load():w.unload()})})).pipe(i.takeUntil(this.destroy$)).subscribe()}forceOpen(e){const t=e.map(o=>typeof o=="number"?o:o.index);return this.forcedOpenSubject.next([...this.forcedOpenSubject.value,t]),()=>{this.isDestroyed||this.forcedOpenSubject.next(this.forcedOpenSubject.value.filter(o=>o!==t))}}destroy(){super.destroy(),this.forcedOpenSubject.complete()}}const Et=(n,e,t)=>{const o=(t.width-e.width)/2,s=(t.height-e.height)/2;return new _({x:n.x-o,y:n.y-s})};class X extends DOMRect{constructor(){super(...arguments),this.__symbol=Symbol("ViewportPosition")}static from(e,t){if(t){const s=e;return new X(s.x,s.y,t.width,t.height)}const o=e;return new X(o.x,o.y,o.width,o.height)}}class ao{constructor({width:e,height:t}){this.__symbol=Symbol("AbsoluteViewport"),this.width=e,this.height=t}}class co{constructor({width:e,height:t}){this.__symbol=Symbol("RelativeViewport"),this.width=e,this.height=t}}const lo=({pageIndex:n,spineItemOrId:e,spineItemsManager:t})=>{const o=t.items,s=t.get(e);if(!s)return;const{currentAbsolutePage:r}=o.reduce((a,c)=>{if(a.found)return a;const l=c.numberOfPages;return s===c&&n<=l-1?{currentAbsolutePage:a.currentAbsolutePage+n,found:!0}:{...a,currentAbsolutePage:a.currentAbsolutePage+l}},{currentAbsolutePage:0,found:!1});return r},uo=({itemHeight:n,itemWidth:e,visibleWidthOfItem:t,visibleHeightOfItem:o,threshold:s})=>{const r=t/e,a=o/n;return s.type==="percentage"?r>=s.value&&a>=s.value:t>=s.value&&o>=s.value},po=({visibleWidthOfItem:n,visibleHeightOfItem:e,threshold:t,viewportPosition:o})=>{const s=n/o.width,r=e/o.height;return t.type==="percentage"?r>=t.value&&s>=t.value:e>=t.value&&n>=t.value},Ct=({itemPosition:{bottom:n,left:e,right:t,top:o,width:s,height:r},threshold:a,viewportPosition:c,restrictToScreen:l})=>{const u=c.x,p=c.x+(c.width-1),d=c.y,h=Math.max(c.y+(c.height-1),0),m=Math.max(0,Math.min(t,p)-Math.max(e,u)),g=Math.max(0,Math.min(n,h)-Math.max(o,d));if(m<=0||g<=0)return{visible:!1};const y=po({threshold:a,visibleHeightOfItem:g,visibleWidthOfItem:m,viewportPosition:c});return l?{visible:y}:{visible:uo({itemHeight:r,itemWidth:s,threshold:a,visibleHeightOfItem:g,visibleWidthOfItem:m})||y}},Le=({position:n,spineItemsManager:e,spineLayout:t})=>{const o=e.items.find(s=>{const{left:r,right:a,bottom:c,top:l}=t.getSpineItemSpineLayoutInfo(s),u=n.x>=r&&n.x<a,p=n.y>=l&&n.y<c;return u&&p});return n.x===0&&!o?e.items[0]:o},Ee=({spineItemPosition:n,itemLayout:{left:e,top:t}})=>new T({x:e+n.x,y:t+n.y}),go=({position:n,threshold:e,restrictToScreen:t,spineItemsManager:o,spineLayout:s,useAbsoluteViewport:r=!0,viewport:a})=>{const c=Le({position:n,spineItemsManager:o,spineLayout:s})||o.get(0),l=o.items.reduce((m,g)=>{const f=s.getSpineItemSpineLayoutInfo(g),y=r?a.absoluteViewport:a.relativeViewport,S=Et(n,a.absoluteViewport,y),w=X.from(S,y),{visible:v}=Ct({itemPosition:f,threshold:e,viewportPosition:w,restrictToScreen:t});return v?[...m,g]:m},[]),u=l[0]??c,p=l[l.length-1]??u;if(!u||!p)return;const d=o.getSpineItemIndex(u),h=o.getSpineItemIndex(p);return{beginIndex:d??0,endIndex:h??0}},ho=({spineItemsManager:n,context:e,spineItemLocator:t,settings:o,spineLayout:s,viewport:r})=>{const a=(g,f)=>{const{left:y,top:S}=s.getSpineItemSpineLayoutInfo(f);return new F({x:Math.max(g.x-y,0),y:Math.max(g.y-S,0)})},c=g=>Ee({spineItemPosition:new F({x:0,y:0}),itemLayout:s.getSpineItemSpineLayoutInfo(g)}),l=g=>n.items.find(f=>f.renderer.getDocumentFrame()===g),u=(g,f,y)=>{if(typeof y=="number"){const S=n.get(y);return S?t.getSpineItemPageIndexFromNode(g,f||0,S):void 0}return t.getSpineItemPageIndexFromNode(g,f||0,y)},p=({position:g,threshold:f,spineItem:y,restrictToScreen:S,useAbsoluteViewport:w=!0,viewport:v})=>{const M=y.numberOfPages,E=Array.from(Array(M)).map((W,re)=>{const Ce=t.getSpineItemPositionFromPageIndex({pageIndex:re,spineItem:y}),B=Ee({spineItemPosition:Ce,itemLayout:s.getSpineItemSpineLayoutInfo(y)});return{index:re,absolutePosition:{width:v.pageSize.width,height:v.pageSize.height,left:B.x,top:B.y,bottom:B.y+v.pageSize.height,right:B.x+v.pageSize.width}}}).reduce((W,{absolutePosition:re,index:Ce})=>{const B=w?v.absoluteViewport:v.relativeViewport,vo=Et(g,v.absoluteViewport,B),Po=X.from(vo,B),{visible:$o}=Ct({viewportPosition:Po,restrictToScreen:S,threshold:f,itemPosition:re});return $o?[...W,Ce]:W},[]),A=E[0],R=E[E.length-1]??A;if(!(A===void 0||R===void 0))return{beginPageIndex:A,endPageIndex:R}};return{getSpinePositionFromSpineItemPosition:({spineItem:g,spineItemPosition:f})=>{const y=s.getSpineItemSpineLayoutInfo(g);return Ee({itemLayout:y,spineItemPosition:f})},_getAbsolutePageIndexFromPageIndex:g=>lo({...g,spineItemsManager:n}),getSpineItemPagePositionFromSpinePosition:g=>{const f=Le({position:g,spineItemsManager:n,spineLayout:s});if(!f)return;const y=a(g,f),S=t.getSpineItemPageIndexFromPosition({itemWidth:f.layout.layoutInfo.width,itemHeight:f.layout.layoutInfo.height,position:y,isUsingVerticalWriting:!!f.isUsingVerticalWriting()}),w=t.getSpineItemPagePositionFromSpineItemPosition(y,S,f);return{spineItem:f,spineItemPageIndex:S,spineItemPagePosition:w,pageSize:r.value.pageSize}},getSpinePositionFromSpineItem:c,getSpineItemPositionFromSpinePosition:a,getSpineItemFromPosition:g=>Le({position:g,spineItemsManager:n,spineLayout:s}),getSpineItemFromIframe:l,getSpineItemPageIndexFromNode:u,getVisibleSpineItemsFromPosition:g=>go({spineItemsManager:n,spineLayout:s,viewport:r,...g}),getVisiblePagesFromViewportPosition:g=>p({...g,viewport:r}),isPositionWithinSpineItem:(g,f)=>{const{bottom:y,left:S,right:w,top:v}=s.getSpineItemSpineLayoutInfo(f);return g.x>=S&&g.x<=w&&g.y<=y&&g.y>=v},spineItemLocator:t,getSafeSpineItemPositionFromUnsafeSpineItemPosition:(g,f)=>{const{height:y,width:S}=s.getSpineItemSpineLayoutInfo(f);return new F({x:Math.min(Math.max(0,g.x),S),y:Math.min(Math.max(0,g.y),y)})}}},mo=L.namespace("spine"),Rt=({position:n,pageSize:e})=>new Ze({...n,left:n.x,top:n.y,width:e.width,height:e.height,bottom:n.y+e.height,right:n.x+e.width});class At extends N{constructor(e,t,o,s,r,a){super({pages:[]}),this.spineLayout=e,this.spineItemsManager=t,this.spineItemLocator=o,this.context=s,this.locator=r,this.viewport=a,this.fromSpineItemPageIndex=(c,l)=>this.value.pages.find(u=>u.itemIndex===c.index&&u.pageIndex===l),this.fromAbsolutePageIndex=c=>this.value.pages.reduce((l,u)=>l||(u.absolutePageIndex===c?u:l),void 0),this.observeFromAbsolutePageIndex=c=>this.pipe(i.map(()=>this.fromAbsolutePageIndex(c))),this.layout$=e.layout$.pipe(i.withLatestFrom(a),i.switchMap(([,{pageSize:c}])=>{const l=t.items.reduce((p,d,h)=>{const g=new Array(d.numberOfPages).fill(void 0).map((f,y)=>{const S=o.getSpineItemPositionFromPageIndex({spineItem:d,pageIndex:y}),w=r.getSpinePositionFromSpineItemPosition({spineItem:d,spineItemPosition:S});return{absoluteLayout:Rt({pageSize:c,position:w}),layout:new Ge({left:S.x,right:S.x+c.width,top:S.y,bottom:S.y+c.height,width:c.width,height:c.height,x:S.x,y:S.y}),itemIndex:h,absolutePageIndex:p.length+y,spineItem:d,pageIndex:y}});return[...p,...g]},[]);return i.combineLatest(l.map(p=>{const{spineItem:d,...h}=p;return new i.Observable(m=>{const g=p.spineItem.renderer?.getDocumentFrame();let f;g&&g?.contentWindow?.document&&g.contentWindow.document.body!==null&&(f=Ht(g.contentWindow.document,p.layout)),m.next({...h,firstVisibleNode:f})})}))}),i.map(c=>(mo.info("Pages layout",c),{pages:c})),i.share()),this.layout$.pipe(i.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}}class Dt extends C{constructor(e,t){super(),this.spineItemsManager=e,this.spineLocator=t,this.itemIsReady$=this.spineItemsManager.items$.pipe(i.switchMap(o=>{const s=o.map(r=>r.isReady$.pipe(i.map(a=>({item:r,isReady:a}))));return i.merge(...s)}),i.share()),this.itemResize$=this.spineItemsManager.items$.pipe(i.switchMap(o=>{const s=o.map(r=>Z(r.element).pipe(i.map(a=>({entries:a,item:r}))));return i.merge(...s)}),i.share())}}const fo=({horizontalOffset:n,verticalOffset:e,context:t,spineItemsManager:o,isGloballyPrePaginated:s,settings:r,index:a,item:c,viewport:l})=>{let u=l.value.pageSize.width,p="none";const d=n%l.absoluteViewport.width===0,h=a===o.items.length-1;if(r.values.computedSpreadMode){!s&&c.renditionLayout==="reflowable"&&!h&&(u=l.value.pageSize.width*2),!s&&c.renditionLayout==="reflowable"&&h&&d&&(u=l.value.pageSize.width*2);const g=d&&h&&s;c.item.pageSpreadRight&&d&&!t.isRTL()||c.item.pageSpreadLeft&&d&&t.isRTL()?(p="before",u=l.value.pageSize.width*2):g&&(t.isRTL()?p="before":p="after",u=l.value.pageSize.width*2)}return c.layout.layout({minimumWidth:u,blankPagePosition:p,spreadPosition:r.values.computedSpreadMode?d?t.isRTL()?"right":"left":t.isRTL()?"left":"right":"none"}).pipe(i.map(({width:g,height:f})=>{if(r.values.computedPageTurnDirection==="vertical"){const w=d?e:e-l.absoluteViewport.height,v=d?0:n;t.isRTL()?c.layout.adjustPositionOfElement({top:w,left:v}):c.layout.adjustPositionOfElement({top:w,left:v});const M=g+v,P=f+w,E=new ee({left:v,right:M,top:w,bottom:P,height:f,width:g,x:v,y:w});return{horizontalOffset:M,verticalOffset:P,layoutPosition:E}}c.layout.adjustPositionOfElement(t.isRTL()?{right:n,top:0}:{left:n,top:0});const y=t.isRTL()?l.absoluteViewport.width-n-g:n,S=new ee({right:t.isRTL()?l.absoluteViewport.width-n:n+g,left:y,x:y,top:e,bottom:f,height:f,width:g,y:e});return{horizontalOffset:n+g,verticalOffset:0,layoutPosition:S}}))};class So extends C{constructor(e,t,o,s){super(),this.spineItemsManager=e,this.context=t,this.settings=o,this.viewport=s,this.layoutSubject=new i.Subject,this.spineItemsRelativeLayouts=[],e.items$.pipe(i.tap(()=>{this.spineItemsRelativeLayouts=[]}),i.switchMap(a=>{const c=a.map(u=>u.needsLayout$.pipe(i.tap(()=>{this.layout()}))),l=a.map(u=>u.loaded$.pipe(i.tap(()=>{u.isUsingVerticalWriting()?this.context.update({hasVerticalWriting:!0}):this.context.update({hasVerticalWriting:!1})})));return i.merge(...c,...l)})).pipe(i.takeUntil(this.destroy$)).subscribe();const r=new i.BehaviorSubject(!1);this.layout$=this.layoutSubject.pipe(i.tap(()=>{this.spineItemsManager.items.forEach(a=>{a.markDirty()})}),i.debounceTime(50),i.exhaustMap(()=>r.pipe(i.filter(a=>!a),i.first())),i.exhaustMap(()=>{r.next(!0);const a=this.context.manifest,c=lt(a)??!1;return i.from(this.spineItemsManager.items).pipe(i.reduce((u,p,d)=>u.pipe(i.concatMap(({horizontalOffset:h,verticalOffset:m})=>fo({context:this.context,horizontalOffset:h,index:d,isGloballyPrePaginated:c,item:p,settings:this.settings,spineItemsManager:this.spineItemsManager,verticalOffset:m,viewport:s}).pipe(i.map(({horizontalOffset:g,verticalOffset:f,layoutPosition:y})=>(this.spineItemsRelativeLayouts[d]=y,{horizontalOffset:g,verticalOffset:f}))))),i.of({horizontalOffset:0,verticalOffset:0})),i.concatMap(u=>u),i.finalize(()=>{r.next(!1)}))}),i.share()),i.merge(this.layout$).pipe(i.takeUntil(this.destroy$)).subscribe()}layout(){this.layoutSubject.next(void 0)}getSpineItemSpineLayoutInfo(e){const t=this.spineItemsManager.getSpineItemIndex(e)??0;return this.spineItemsRelativeLayouts[t]||new ee({left:0,right:0,top:0,bottom:0,width:0,height:0,x:0,y:0})}get numberOfPages(){return this.spineItemsManager.items.reduce((e,t)=>e+t.numberOfPages,0)}destroy(){super.destroy(),this.layoutSubject.complete()}}class Nt extends C{constructor(e,t,o,s,r,a,c){super(),this.context=e,this.pagination=t,this.spineItemsManager=o,this.spineItemLocator=s,this.settings=r,this.hookManager=a,this.viewport=c,this.elementSubject=new i.BehaviorSubject(void 0),this.element$=this.elementSubject.asObservable(),this.spineLayout=new So(o,e,r,c),this.locator=ho({context:e,spineItemsManager:o,spineItemLocator:s,settings:r,spineLayout:this.spineLayout,viewport:c}),this.spineItemsLoader=new ro(this.context,o,this.locator,r,this.spineLayout),this.spineItemsObserver=new Dt(o,this.locator),this.pages=new At(this.spineLayout,this.spineItemsManager,this.spineItemLocator,this.context,this.locator,this.viewport);const l=e.watch("rootElement").pipe(b.filter(ae.isDefined),b.tap(p=>{const d=p.ownerDocument.createElement("div");d.style.cssText=`
|
|
281
281
|
height: 100%;
|
|
282
282
|
position: relative;
|
|
283
283
|
`,d.className=`${k}-spine`,this.elementSubject.next(d)})),u=i.combineLatest([this.context.manifest$,this.element$]).pipe(b.tap(([p,d])=>{if(!d)return;this.spineItemsManager.destroyItems();const h=p.spineItems.map((m,g)=>new Fe(m,d,this.context,this.settings,this.hookManager,g,this.viewport));this.spineItemsManager.addMany(h)}));i.merge(u,l).pipe(b.takeUntil(this.destroy$)).subscribe()}get element(){return this.elementSubject.getValue()}layout(){this.spineLayout.layout()}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 Ot extends C{constructor(e,t){super(),this.context=e,this.settings=t,this.orderedSpineItemsSubject=new i.BehaviorSubject([]),this.items$=this.orderedSpineItemsSubject.asObservable()}get(e){return typeof e=="number"?this.orderedSpineItemsSubject.value[e]:typeof e=="string"?this.orderedSpineItemsSubject.value.find(({item:t})=>t.id===e):e}comparePositionOf(e,t){const o=this.getSpineItemIndex(e)??0,s=this.getSpineItemIndex(t)??0;return o>s?"after":o===s?"same":"before"}getSpineItemIndex(e){const t=e instanceof Fe?e:this.get(e);if(!t)return;const o=this.orderedSpineItemsSubject.value.indexOf(t);return o<0?void 0:o}addMany(e){this.orderedSpineItemsSubject.next([...this.orderedSpineItemsSubject.getValue(),...e])}getSpineItemFromCfi(e){const{itemIndex:t}=ie(e);if(t!==void 0)return this.get(t)}get items(){return this.orderedSpineItemsSubject.value}destroyItems(){this.orderedSpineItemsSubject.value.forEach(e=>e.destroy())}}class Vt extends N{constructor(e,t){const o=document.createElement("div");o.style.cssText=`
|
|
@@ -285,9 +285,9 @@
|
|
|
285
285
|
position: relative;
|
|
286
286
|
height: 100%;
|
|
287
287
|
width: 100%;
|
|
288
|
-
`,o.className=Be,super({element:o,pageSize:{width:1,height:1},width:1,height:1}),this.context=e,this.settingsManager=t;const s=this.settingsManager.watch(["computedSpreadMode"]).pipe(i.tap(()=>{this.mergeCompare({pageSize:this.calculatePageSize(this.value)})})),r=this.context.watch("rootElement").pipe(i.tap(()=>{this.layout()}));i.merge(s,r).pipe(i.takeUntil(this.destroy$)).subscribe()}calculatePageSize(e){const{computedSpreadMode:t}=this.settingsManager.values;return{width:t?e.width/2:e.width,height:e.height}}layout(){const e={width:this.value.element.clientWidth,height:this.value.element.clientHeight};this.mergeCompare({pageSize:this.calculatePageSize(e),...e})}get absoluteViewport(){return new
|
|
288
|
+
`,o.className=Be,super({element:o,pageSize:{width:1,height:1},width:1,height:1}),this.context=e,this.settingsManager=t;const s=this.settingsManager.watch(["computedSpreadMode"]).pipe(i.tap(()=>{this.mergeCompare({pageSize:this.calculatePageSize(this.value)})})),r=this.context.watch("rootElement").pipe(i.tap(()=>{this.layout()}));i.merge(s,r).pipe(i.takeUntil(this.destroy$)).subscribe()}calculatePageSize(e){const{computedSpreadMode:t}=this.settingsManager.values;return{width:t?e.width/2:e.width,height:e.height}}layout(){const e={width:this.value.element.clientWidth,height:this.value.element.clientHeight};this.mergeCompare({pageSize:this.calculatePageSize(e),...e})}get absoluteViewport(){return new ao({width:this.value.width,height:this.value.height})}get pageSize(){return this.value.pageSize}get scaleFactor(){const e=this.absoluteViewport;return(this.value.element.getBoundingClientRect()?.width??e.width)/e.width}get relativeViewport(){const e=this.absoluteViewport,t=this.scaleFactor;return new co({width:e.width/t,height:e.height/t})}}const yo=n=>{const e=crypto.randomUUID(),t=new i.Subject,o=new i.Subject,s=new dt,r=new ut,a=new no(n,r),c=new pt(r,a),l=new Ot(r,a),u=new Vt(r,a),p=Pt({context:r,settings:a,viewport:u}),d=new Mt(r,l),h=new Nt(r,d,l,p,a,s,u),m=eo({context:r,spineItemsManager:l,hookManager:s,spine:h,settings:a,viewport:u}),g=new Ft(r,d,l,h,p);m.viewportState$.subscribe(r.bridgeEvent.viewportStateSubject),m.navigation$.subscribe(r.bridgeEvent.navigationSubject),m.locker.isLocked$.subscribe(r.bridgeEvent.navigationIsLockedSubject),d.subscribe(r.bridgeEvent.paginationSubject);const f=()=>{t.next()},y=P=>{const{containerElement:E,manifest:A}=P;if(r.manifest){L.warn("loading a new book is not supported yet");return}L.log("load",{options:P});const R=bo(E,e);r.update({manifest:A,rootElement:R}),f()},S=a.watch(["computedSpreadMode"]).pipe(b.skip(1),b.tap(f)),w=t.pipe(b.tap(()=>{const P=r.value.rootElement;P&&(P.style.setProperty("overflow","hidden"),u.layout(),h.layout())}),b.takeUntil(o)),v=i.merge(w,S).subscribe(),M=()=>{v.unsubscribe(),l.destroy(),g.destroy(),a.destroy(),d.destroy(),r.destroy(),m.destroy(),h.destroy(),c.destroy(),o.next(),o.complete(),u.destroy()};return{id:e,context:r,spine:h,hookManager:s,cfi:{generateCfiFromRange:nt,parseCfi:ie,generateCfiForSpineItemPage:P=>te({...P,spine:h}),resolveCfi:P=>ye({...P,spineItemsManager:l})},navigation:m,spineItemsObserver:h.spineItemsObserver,spineItemsManager:l,layout:f,load:y,destroy:M,pagination:{get state(){return d.value},get state$(){return d}},settings:a,renderHeadless:P=>l.get(P)?.renderer.renderHeadless()??i.of(void 0),viewport:u,viewportState$:r.bridgeEvent.viewportState$,viewportFree$:r.bridgeEvent.viewportFree$,state$:r.manifest$.pipe(b.map(P=>P?"ready":"idle")),features:c,$:{destroy$:o}}},bo=(n,e)=>(n.style.cssText=`
|
|
289
289
|
${n.style.cssText}
|
|
290
290
|
background-color: white;
|
|
291
291
|
position: relative;
|
|
292
|
-
`,n.classList.add(`${k}-reader`),n.setAttribute(He,e),n),
|
|
292
|
+
`,n.classList.add(`${k}-reader`),n.setAttribute(He,e),n),Io=yi(on(kn(wi(nn(Ut(gi(Ii(Ti(Kn(Ye(Wn(Wt(bi(rt(Je(Qt(yo))))))))))))))))),wo=n=>e=>n(e);Object.defineProperty(I,"isShallowEqual",{enumerable:!0,get:()=>$.isShallowEqual}),I.AbstractSpinePosition=Se,I.Context=ut,I.ControlledNavigationController=ht,I.DestroyableClass=C,I.DocumentRenderer=x,I.Features=pt,I.HTML_ATTRIBUTE_DATA_READER_ID=He,I.HTML_ATTRIBUTE_VIEWPORT_CLASSNAME=Be,I.HTML_PREFIX=k,I.HookManager=dt,I.ITEM_EXTENSION_VALID_FOR_FRAME_SRC=_e,I.InternalNavigator=bt,I.LayoutEntry=Q,I.Locker=Pe,I.PAGINATION_UPDATE_AFTER_VIEWPORT_ADJUSTMENT_DEBOUNCE=gn,I.PROSE_READER_NAMESPACE=pn,I.Pages=At,I.Pagination=Mt,I.PaginationController=Ft,I.ReactiveEntity=N,I.ResourceHandler=J,I.ResourcesLocator=st,I.ScrollNavigationController=mt,I.ScrollPosition=we,I.SettingsManager=Lt,I.Spine=Nt,I.SpineItem=Fe,I.SpineItemPageLayout=Ge,I.SpineItemPageSpineLayout=Ze,I.SpineItemPosition=F,I.SpineItemSpineLayout=ee,I.SpineItemsManager=Ot,I.SpineItemsObserver=Dt,I.SpinePosition=T,I.UnboundSpineItemPagePosition=j,I.UnboundSpinePosition=_,I.VIEWPORT_ADJUSTMENT_THROTTLE=dn,I.Viewport=Vt,I.consolidate=ot,I.createReader=Io,I.deferIdle=me,I.deferNextResult=Ue,I.generateCfiForSpineItemPage=te,I.generateCfiFromRange=nt,I.generateRootCfi=H,I.getAttributeValueFromString=ce,I.getBase64FromBlob=en,I.getFrameViewportInfo=Y,I.getItemAnchor=ci,I.htmlEnhancer=Ye,I.idle=he,I.injectCSS=Re,I.isHtmlElement=pe,I.isHtmlTagElement=ke,I.isRootCfi=ne,I.layoutEnhancer=Je,I.mapKeysTo=ge,I.observeIntersection=jt,I.observeMutation=fe,I.observeResize=Z,I.paginationEnhancer=rt,I.parseCfi=ie,I.removeCSS=kt,I.resolveCfi=ye,I.rootEnhancer=wo,I.spinePositionToSpineItemSpineLayout=Rt,I.upsertCSSToFrame=D,I.waitForFrameLoad=Ae,I.waitForFrameReady=De,I.waitForSwitch=q,I.watchKeys=G,Object.defineProperty(I,Symbol.toStringTag,{value:"Module"})});
|
|
293
293
|
//# sourceMappingURL=index.umd.cjs.map
|