@prose-reader/core 1.252.0 → 1.254.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +4 -4
package/dist/index.umd.cjs
CHANGED
|
@@ -258,7 +258,7 @@
|
|
|
258
258
|
height: 100%;
|
|
259
259
|
width: 100%;
|
|
260
260
|
position: relative;
|
|
261
|
-
`,d.className=`${C}-controlled-navigator`,d.innerHTML="",d.appendChild(p),this.viewport.value.element.appendChild(d),this.element$.next(d)})),c=e.watch(["computedPageTurnDirection","computedPageTurnMode","numberOfAdjacentSpineItemToPreLoad"]),u=o.combineLatest([c,this.element$]).pipe(o.tap(([,p])=>{e.values.computedPageTurnMode==="scrollable"?p.style.display="contents":p.style.display="block"}));this.layout$=u.pipe(o.tap(()=>{St.info("layout",e.values)}),o.share());const l=this.navigateSubject.pipe(o.tap(p=>{St.info("Navigation requested",p)}));this.isNavigating$=l.pipe(o.map(({animation:p,position:d})=>({type:"manualAdjust",shouldAnimate:!(!p||p==="turn"&&e.values.computedPageTurnAnimation==="none"),animation:p,position:d})),o.switchMap(p=>{const d=this.element$.getValue();return d.style.setProperty("transition","none"),d.style.setProperty("opacity","1"),o.merge(o.of(!0),o.of(null).pipe(o.mergeMap(()=>{if(p?.type!=="manualAdjust")return o.of(!1);const h=p.animation==="snap"?e.values.snapAnimationDuration:e.values.computedPageTurnAnimationDuration,m=p.animation==="snap"?"slide":e.values.computedPageTurnAnimation;return o.of(p).pipe(p.shouldAnimate?o.delay(1,o.animationFrameScheduler):o.identity,o.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"))}),o.tap(g=>{m!=="fade"&&this.setViewportPosition(g.position)}),p.shouldAnimate?o.delay(h/2,o.animationFrameScheduler):o.identity,o.tap(g=>{const f=this.element$.getValue();m==="fade"&&(this.setViewportPosition(g.position),f.style.setProperty("opacity","1"))}),p.shouldAnimate?o.delay(h/2,o.animationFrameScheduler):o.identity,o.tap(g=>{m==="fade"&&this.setViewportPosition(g.position)}))}),o.map(()=>!1)))}),o.startWith(!1),o.shareReplay(1)),o.merge(a,this.isNavigating$,this.layout$).pipe(o.takeUntil(this.destroy$)).subscribe()}setViewportPosition(e){const t=this.element$.getValue(),i=Vi(e);t.style.transform=`translate(${i.x}px, ${i.y}px)`,this.hookManager.execute("onViewportOffsetAdjust",void 0,{})}navigate(e){this.navigateSubject.next(e)}get viewportPosition(){const e=this.element$.getValue(),t=window.getComputedStyle(e),i=t.transform||t.webkitTransform;if(!i||i==="none")return new M({x:0,y:0});const s=new DOMMatrix(i);return ki(s)}}class Ui{constructor(e){this.x=e.x,this.y=e.y}}class $e extends Ui{}class bt extends V{constructor(e,t,i,s,r){super({element:void 0}),this.viewport=e,this.settings=t,this.hookManager=i,this.spine=s,this.context=r,this.navigateSubject=new o.Subject,this.scrollingSubject=new o.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"}),o.timer(1).pipe(o.tap(()=>{this.scrollingSubject.next(!1)}),o.takeUntil(o.merge(this.scrollingSubject.pipe(o.skip(1)),this.destroy$))).subscribe(),this.hookManager.execute("onViewportOffsetAdjust",void 0,{})};const a=this.context.pipe(G(["rootElement"]),o.tap(({rootElement:d})=>{if(!d)return;const h=document.createElement("div");h.setAttribute(`data-${qe}`,""),h.appendChild(this.viewport.value.element),d.appendChild(h),this.update({element:h})})),c=o.combineLatest([t.watch(["computedPageTurnMode"]),this.watch("element")]).pipe(o.tap(([{computedPageTurnMode:d},h])=>{h&&(d==="scrollable"?h.style.display="block":h.style.display="contents")})),u=this.navigateSubject.pipe(o.tap(this.setViewportPosition));this.isNavigating$=this.navigateSubject.pipe(o.startWith(!1),o.switchMap(()=>o.merge(o.of(!0),o.of(!1))),o.shareReplay(1));const l=o.merge(s.element$.pipe(o.filter(_),o.switchMap(d=>Z(d))),s.element$.pipe(o.filter(_),o.switchMap(d=>o.fromEvent(d,"scroll"))),s.spineItemsObserver.itemResize$).pipe(o.switchMap(()=>o.timer(10).pipe(o.map(()=>!1),o.startWith(!0))),o.distinctUntilChanged(),o.startWith(!1)),p=o.combineLatest([l,this.isScrolling$]).pipe(o.map(([d,h])=>d||h),o.shareReplay(1));this.userScroll$=this.watch("element").pipe(o.filter(_),o.switchMap(d=>t.watch(["computedPageTurnMode"]).pipe(o.switchMap(({computedPageTurnMode:h})=>h==="controlled"?o.NEVER:o.fromEvent(d,"scroll").pipe(o.withLatestFrom(p),o.filter(([,m])=>!m),o.map(([m])=>m))))),o.share()),o.merge(a,c,u).pipe(o.takeUntil(this.destroy$)).subscribe()}update(e){this.mergeCompare(e)}navigate(e){this.navigateSubject.next(e)}fromScrollPosition(e){const t=this.viewport.scaleFactor;return new N({x:e.x/t,y:e.y/t})}fromSpinePosition(e){const t=this.viewport.scaleFactor;return new $e({x:e.x*t,y:e.y*t})}get scrollPosition(){const e=this.value.element;return new $e({x:e?.scrollLeft??0,y:e?.scrollTop??0})}}const zi=()=>n=>n.pipe(o.map(({navigation:e,pagination:t,...i})=>({navigation:{...e,paginationBeginCfi:t.beginCfi},...i}))),Wi=(n,e,t)=>n.bridgeEvent.pagination$.pipe(o.withLatestFrom(e),o.filter(([i,s])=>i.navigationId===s.id),o.switchMap(([i,s])=>(t.spineItemsManager.get(s.spineItem)?.isReady$.pipe(o.first())??o.of(!1)).pipe(o.filter(a=>a),o.map(()=>({pagination:i,navigation:s})))),zi(),o.distinctUntilChanged((i,s)=>i.navigation.paginationBeginCfi===s.navigation.paginationBeginCfi),o.map(({navigation:i})=>({...i,meta:{triggeredBy:"pagination"}}))),_i=({navigationResolver:n})=>e=>e.pipe(o.map(([t,i])=>{const s={type:"api",meta:{triggeredBy:"user"},id:Symbol(),animation:"turn",...t,position:t.position?n.fromOutOfBoundsSpinePosition(t.position):void 0};return{previousNavigation:i,navigation:s}})),Hi=({navigationResolver:n})=>e=>e.pipe(o.map(t=>{if(t.navigation.cfi){const i=n.getNavigationForCfi(t.navigation.cfi);if(i)return{...t,navigation:{...t.navigation,position:i}}}return t})),Bi=({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",xi=({context:n,settings:e})=>t=>t.pipe(o.map(({navigation:i,previousNavigation:s})=>{const r=Bi({navigation:i,previousNavigation:s,settings:e}),a={...i,directionFromLastNavigation:r};return{previousNavigation:s,navigation:a,direction:r}})),Yi=({spineItemsManager:n,navigationResolver:e,settings:t})=>i=>i.pipe(o.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),u=t.values.computedPageTurnMode==="scrollable"?new N({x:c.x+r.previousNavigation.position.x,y:c.y}):e.fromUnboundSpinePosition(c);return{navigation:{...s,position:u},...r}})),It=({settings:n,spineItemsManager:e,navigationResolver:t,spineLocator:i})=>s=>{const r=a=>{const{position:c,spineItem:u,cfi:l,directionFromLastNavigation:p}=a,{navigationSnapThreshold:d,computedPageTurnMode:h}=n.values;if(u!==void 0){const m=e.get(u);if(m)return m}if(typeof u=="number")return u>e.items.length-1?e.get(e.items.length-1):e.get(0);if(l){const m=e.getSpineItemFromCfi(l);if(m)return m}if(c&&h==="controlled"){const{beginIndex:m,endIndex:g}=i.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}=i.getVisiblePagesFromViewportPosition({position:c,spineItem:y,threshold:d,restrictToScreen:!1})??{},v=(p==="forward"||p==="anchor"?S:w)??0,T=t.getNavigationForSpineItemPage({pageIndex:v,spineItemId:y}),P=i.getVisibleSpineItemsFromPosition({position:T,threshold:d,restrictToScreen:!1}),E=p==="forward"||p==="anchor"?P?.beginIndex:P?.endIndex;return e.get(E)}return c&&h==="scrollable"?i.getSpineItemFromPosition(c):e.get(0)};return s.pipe(o.map(({navigation:a,...c})=>{const u=r(a);return{navigation:{...a,spineItem:e.getSpineItemIndex(u)},...c}}))},wt=({spine:n})=>e=>e.pipe(o.switchMap(({navigation:t,...i})=>{const s=n.getSpineItemSpineLayoutInfo(t.spineItem),r=n.spineItemsManager.get(t.spineItem);return(r?.isReady$??o.of(!1)).pipe(o.first(),o.map(a=>({navigation:{...t,spineItemHeight:s?.height,spineItemWidth:s?.width,spineItemLeft:s.left,spineItemTop:s.top,spineItemIsUsingVerticalWriting:r?.isUsingVerticalWriting(),spineItemIsReady:a},...i})))})),Te=({settings:n,spineItemsManager:e,spineLocator:t,navigationResolver:i})=>s=>{const r=a=>{const{navigationSnapThreshold:c,computedPageTurnMode:u}=n.values,l=e.get(a.spineItem);if(!(!l||!a.position)){if(u==="controlled"){const{endPageIndex:p,beginPageIndex:d}=t.getVisiblePagesFromViewportPosition({position:a.position,spineItem:l,threshold:c,restrictToScreen:!1})??{},h=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?p:d)??0,m=i.getNavigationForSpineItemPage({pageIndex:h,spineItemId:l}),g=t.getVisiblePagesFromViewportPosition({position:m,spineItem:l,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:l})}return t.getSpineItemPositionFromSpinePosition(a.position,l)}};return s.pipe(o.map(({navigation:a,...c})=>({navigation:{...a,positionInSpineItem:r(a)},...c})))},Xi=({navigationResolver:n})=>e=>e.pipe(o.map(t=>{if(t.navigation.url){const i=n.getNavigationForUrl(t.navigation.url);if(i)return{...t,navigation:{...t.navigation,position:i.position,spineItem:i.spineItemId}}}return t}));class Me{constructor(){this.isLockedSubject=new o.BehaviorSubject(0),this.isLocked$=this.isLockedSubject.pipe(o.map(e=>!!e),o.distinctUntilChanged())}lock(){let e=!1;return this.isLockedSubject.next(this.isLockedSubject.getValue()+1),()=>{e||(e=!0,this.isLockedSubject.next(this.isLockedSubject.getValue()-1))}}}const qi=({spineLocator:n,navigation:e,navigationResolver:t,spineItemsManager:i,spine:s})=>{const r=i.get(e.spineItem);return r?r.isReady$.pipe(o.first(),o.map(a=>{const c=s.getSpineItemSpineLayoutInfo(r),u=n.isPositionWithinSpineItem(e.position,r),l=c.width-(e.spineItemWidth??0),p=c.height-(e.spineItemHeight??0),d=l!==0||p!==0;if(e.url!==void 0&&(l||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)&&(l||p||a&&!e.spineItemIsReady)){const m=t.getNavigationForCfi(h);if(m)return m}if(u&&d&&e.directionFromLastNavigation==="backward"){const m=new F({x:(e.positionInSpineItem?.x??0)+l,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 u?t.getNavigationForPosition(e.position):t.getNavigationForSpineIndexOrId(r)})):o.of(new M({x:0,y:0}))},Gi=({navigation:n,spineLocator:e,spineItemsManager:t,settings:i,navigationResolver:s,spine:r})=>{const{spineItem:a}=n,c=t.get(a);if(!c)return new M({x:0,y:0});const{height:u,top:l}=r.getSpineItemSpineLayoutInfo(c),p=e.isPositionWithinSpineItem(n.position,c),d=n.positionInSpineItem??new F({y:0,x:0});if(i.values.computedPageTurnDirection==="vertical"){if(l===n.spineItemTop&&u===n.spineItemHeight&&p)return n.position;if(l===n.spineItemTop&&u===n.spineItemHeight&&!p)return s.getNavigationForSpineIndexOrId(c);if(l!==n.spineItemTop){const h=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(n.positionInSpineItem??new F({x:0,y:0}),c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:h,spineItem:c})}if(l===n.spineItemTop&&u!==n.spineItemHeight){const h=(n.spineItemHeight??d.y)-d.y,m=new F({y:n.directionFromLastNavigation==="backward"?u-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<l)){const f=new F({y:u-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:i,navigationResolver:s,spine:r})=>t.values.computedPageTurnMode==="scrollable"?o.of(Gi({navigation:n,spineLocator:i,navigationResolver:s,settings:t,spineItemsManager:e,spine:r})):qi({navigation:n,spineLocator:i,navigationResolver:s,spineItemsManager:e,spine:r}),vt=({settings:n,navigationResolver:e,context:t,spine:i})=>s=>s.pipe(o.switchMap(r=>Zi({spineLocator:i.locator,navigation:r.navigation,navigationResolver:e,settings:n,spineItemsManager:i.spineItemsManager,spineItemLocator:i.locator.spineItemLocator,spine:i}).pipe(o.map(a=>({...r,navigation:{...r.navigation,position:a}}))))),Ji=L.namespace("navigation/InternalNavigator");class Pt extends R{constructor(e,t,i,s,r,a,c,u){super(),this.settings=e,this.context=t,this.userNavigation$=i,this.controlledNavigationController=s,this.scrollNavigationController=r,this.navigationResolver=a,this.spine=c,this.isUserLocked$=u,this.navigationSubject=new o.BehaviorSubject({animation:!1,position:new M({x:0,y:0}),meta:{triggeredBy:"user"},spineItemIsReady:!1,type:"api",id:Symbol()}),this.navigated$=this.navigationSubject.pipe(o.skip(1)),this.navigation$=this.navigationSubject.pipe(o.map(({position:S,id:w})=>({position:S,id:w})),o.distinctUntilChanged(({position:S,...w},{position:v,...T})=>$.isShallowEqual(w,T)&&$.isShallowEqual(S,v)),o.shareReplay(1)),this.locker=new Me;const l=i.pipe(o.withLatestFrom(this.navigationSubject),_i({navigationResolver:a}),Xi({navigationResolver:a}),Hi({navigationResolver:a}),xi({context:t,settings:e}),It({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),Te({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),wt({spine:c})).pipe(Yi({navigationResolver:a,spineItemsManager:c.spineItemsManager,settings:e}),o.withLatestFrom(u),o.switchMap(([S,w])=>{const v=S.navigation.cfi||S.navigation.url||e.values.computedPageTurnMode==="scrollable"||w;return o.of(S).pipe(v?o.identity:vt({navigationResolver:a,settings:e,spine:c,context:t}))}),Te({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),o.map(S=>S.navigation),o.share()),p=l.pipe(o.withLatestFrom(u),o.filter(([,S])=>S),o.switchMap(([S])=>{const w=this.locker.lock();return u.pipe(o.filter(v=>!v),o.first(),o.map(()=>({...S,animation:"snap"})),o.finalize(()=>{w()}),o.takeUntil(l))}),o.share()),d=o.merge(s.layout$,c.layout$).pipe(o.switchMap(()=>o.of(null).pipe(o.switchMap(()=>u.pipe(o.filter(S=>!S),o.first())),o.map(()=>({...this.navigationSubject.getValue(),animation:!1})),o.takeUntil(o.merge(p,l))))),h=o.merge(d,p).pipe(o.map(S=>({navigation:S})),vt({navigationResolver:a,settings:e,context:t,spine:c}),o.map(S=>{const w={...S.navigation,meta:{triggeredBy:"restoration"}};return{...S,navigation:w}}),It({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),wt({spine:c}),Te({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),o.map(({navigation:S})=>S),o.share()),m=Wi(t,this.navigationSubject,c),g=o.merge(h,l,m),f=S=>S.pipe(o.tap(([w,v])=>{Ji.info(`navigation updated from ${w.meta.triggeredBy} of type ${w.type}`,{previousNavigation:v,currentNavigation:w}),this.navigationSubject.next(w)})),y=S=>S.pipe(o.tap(([w,v])=>{const T=w.type==="scroll",P=w.meta.triggeredBy==="pagination",E=w.meta.triggeredBy==="restoration",A=$.isShallowEqual(v.position,w.position);if(T&&!E||P||A)return;const D={position:w.position,animation:w.animation};e.values.computedPageTurnMode==="scrollable"?this.scrollNavigationController.navigate(D):this.controlledNavigationController.navigate({...D,position:M.from(D.position)})}));g.pipe(o.withLatestFrom(this.navigationSubject),y,f,o.takeUntil(this.destroy$)).subscribe()}get navigation(){return this.navigationSubject.getValue()}}const se=(n,e,t)=>{const i=t-n,s=t*(e*n)/(t||1);return Math.max(0,Math.min(i,s))},Fe=(n,e)=>(e||0)===0||(n||0)===0?1:Math.floor(Math.max(1,n/e)),Le=(n,e,t)=>{const i=Fe(t,e),s=[...Array(i)].map((r,a)=>a*e);return n>=i*e?s[s.length-1]||0:s.find(r=>n<r+e)||0},$t=(n,e,t)=>{const i=[...Array(t)].map((s,r)=>r*e);return n<=0||t===0?0:n>=t*e?t-1:i.findIndex(s=>n<s+e)??0},Ki=({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))}),Tt=({itemHeight:n,itemWidth:e,isUsingVerticalWriting:t,pageWidth:i,pageHeight:s,pageTurnDirection:r,pageTurnMode:a})=>r==="vertical"&&a==="scrollable"?1:t||r==="vertical"?Fe(n,s):Fe(e,i),Mt=({itemWidth:n,itemHeight:e,position:t,isUsingVerticalWriting:i,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c,isRTL:u})=>{const p=Ki({spineItemPosition:t,itemHeight:e,itemWidth:n}).x,d=Tt({isUsingVerticalWriting:i,itemHeight:e,itemWidth:n,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c});if(i)return $t(t.y,r,d);const h=$t(p,s,d);return u?d-1-h:h},Qi=({pageIndex:n,itemLayout:e,context:t,isUsingVerticalWriting:i,viewport:s})=>{if(i){const a=se(s.pageSize.height,n,e.height);return new F({x:0,y:a})}const r=se(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})},Ft=({context:n,settings:e,viewport:t})=>{const i=(c,u,l)=>{let p;c?.nodeName==="img"||c?.textContent===""&&c.nodeType===Node.ELEMENT_NODE?p=c.getBoundingClientRect().x:c&&(p=(c?Xt(c,u):void 0)?.getBoundingClientRect().x||p);const d=l.layout.layoutInfo?.width||0,h=t.pageSize.width;if(p!==void 0){const m=Le(p,h,d);return new F({x:m,y:0})}};return{getSpineItemPositionFromNode:i,getSpineItemPositionFromPageIndex:({pageIndex:c,spineItem:u})=>Qi({context:n,isUsingVerticalWriting:!!u.isUsingVerticalWriting(),itemLayout:u.layout.layoutInfo,pageIndex:c,viewport:t}),getSpineItemPageIndexFromPosition:c=>Mt({...c,isRTL:n.isRTL(),pageWidth:t.pageSize.width,pageHeight:t.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}),getSpineItemPageIndexFromNode:(c,u,l)=>{const p=i(c,u,l),{height:d,width:h}=l.layout.layoutInfo;return p?Mt({isUsingVerticalWriting:!!l.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,u)=>{const{width:l,height:p}=u.layout.layoutInfo;return new F({x:Le(c.x,t.pageSize.width,l),y:Le(c.y,t.pageSize.height,p)})},getSpineItemPagePositionFromSpineItemPosition:(c,u,l)=>{const{width:p,height:d}=l.layout.layoutInfo,h=t.pageSize.width,m=t.pageSize.height;if(!!l.isUsingVerticalWriting()){const y=se(m,u,d);return new j({x:c.x,y:c.y-y})}const f=se(h,u,p);if(n.isRTL()){const y=p-(u+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})}}},ji=({context:n,settings:e,viewport:t})=>{const i=Ft({context:n,settings:e,viewport:t});return{getNavigationForLastPage:c=>{const u=c.numberOfPages;return i.getSpineItemPositionFromPageIndex({pageIndex:u-1,spineItem:c})},getNavigationForPosition:(c,u)=>i.getSpineItemClosestPositionFromUnsafePosition(u,c),getNavigationFromNode:(c,u,l)=>i.getSpineItemPositionFromNode(u,l,c)||new F({x:0,y:0})}};function Lt({position:n,isRTL:e,spineItemsManager:t,spine:i,viewportWidth:s}){const r=t.get(t.items.length-1),a=i.getSpineItemSpineLayoutInfo(r||0),c=a.bottom,u=Math.max(0,n.y),l=Math.min(u,c);if(e){const m=Math.min(s,n.x),g=Math.max(m,a.left);return new M({x:g,y:l})}const p=a.right,d=Math.max(0,n.x),h=Math.min(d,p);return new M({x:h,y:l})}const Et=({position:n,isRTL:e,pageSizeHeight:t,spineItemsManager:i,visibleAreaRectWidth:s,spine:r})=>{const a=Lt({position:n,isRTL:e,spineItemsManager:i,spine:r,viewportWidth:s}),c=i.get(i.items.length-1),u=r.getSpineItemSpineLayoutInfo(c),l=u.bottom-t,p=Math.min(a.y,l);if(e){const h=Math.min(0,a.x);return new M({x:h,y:p})}const d=u.right-s;return new M({x:Math.min(a.x,d),y:p})},k=({position:{x:n,y:e},pageSizeWidth:t,visibleAreaRectWidth:i})=>{const r=n%i!==0?n-t:n;return new M({x:r,y:e})},Ee=({viewportPosition:n,spineLocator:e,spineItemNavigationResolver:t,viewport:i})=>{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 k({position:c,pageSizeWidth:i.pageSize.width,visibleAreaRectWidth:i.absoluteViewport.width})}return new M({x:0,y:0})},eo=({pageIndex:n,spineItemsManager:e,spineItemId:t,spineLocator:i,spineItemNavigationResolver:s,viewport:r})=>{const a=e.get(t);if(!a){const l=n*r.pageSize.width;return Ee({viewportPosition:new M({x:l,y:0}),spineItemNavigationResolver:s,spineLocator:i,viewport:r})}const c=i.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:n,spineItem:a}),u=i.getSpinePositionFromSpineItemPosition({spineItemPosition:c,spineItem:a});return k({position:u,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},to=(n,e)=>{if(e&&e instanceof HTMLIFrameElement)return n.startsWith("#")?e.contentDocument?.getElementById(n.replace("#","")):e.contentDocument?.querySelector(n)},no=({anchor:n,spineItem:e,spine:t})=>{const i=to(n,e.renderer.getDocumentFrame());return i?t.spineItemLocator.getSpineItemPositionFromNode(i,0,e)?.x??0:0},io=({anchor:n,spineItem:e,spineLocator:t,spine:i})=>{const s=no({anchor:n,spineItem:e,spine:i});return t.getSpinePositionFromSpineItemPosition({spineItemPosition:new F({x:s,y:0}),spineItem:e})},oo=({anchor:n,spineItem:e,spineLocator:t,spine:i,pageSizeWidth:s,visibleAreaRectWidth:r})=>{const a=io({anchor:n,spineItem:e,spineLocator:t,spine:i});return k({position:a,pageSizeWidth:s,visibleAreaRectWidth:r})},so=({spine:n,spineItemsManager:e,spineLocator:t,url:i,context:s,pageSizeWidth:r,visibleAreaRectWidth:a})=>{try{const c=i instanceof URL?i:new URL(i),u=`${c.origin}${c.pathname}`,l=s.manifest?.spineItems.find(p=>p.href===u);if(l){const p=e.get(l.id);if(p){const d=oo({anchor:c.hash,spineItem:p,spine:n,spineLocator:t,pageSizeWidth:r,visibleAreaRectWidth:a});return{position:k({position:d,pageSizeWidth:r,visibleAreaRectWidth:a}),spineItemId:l.id}}}return}catch(c){console.error(c);return}},ro=({spineItem:n,spineItemPosition:e,spineLocator:t,spineItemLocator:i,viewport:s})=>{const r=i.getSpineItemClosestPositionFromUnsafePosition(e,n),a=t.getSpinePositionFromSpineItemPosition({spineItemPosition:r,spineItem:n});return k({position:a,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},ao="spineNavigator",co=({context:n,spineItemsManager:e,locator:t,settings:i,spine:s,viewport:r})=>{const a=ji({context:n,settings:i,viewport:r});return{getNavigationForUrl:m=>so({context:n,spineItemsManager:e,spineLocator:t,url:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width,spine:s}),getNavigationForSpineItemPage:m=>eo({...m,spineItemsManager:e,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getNavigationFromSpineItemPosition:m=>ro({...m,spineItemLocator:t.spineItemLocator,spineLocator:t,viewport:r}),getNavigationForCfi:m=>{const g=e.getSpineItemFromCfi(m),{node:f,offset:y=0}=ve({cfi:m,spineItemsManager:e});if(!g){L.warn(ao,`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 k({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 k({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 k({position:f,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})}return new M({x:0,y:0})},getNavigationForPosition:m=>Ee({viewportPosition:m,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getMostPredominantNavigationForPosition:m=>{const g=i.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=Et({position:new M({x:y,y:S}),isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s});return Ee({spineItemNavigationResolver:a,spineLocator:t,viewportPosition:w,viewport:r})},fromUnboundSpinePosition:m=>Et({position:m,isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s}),fromOutOfBoundsSpinePosition:m=>Lt({position:m,isRTL:n.isRTL(),spineItemsManager:e,spine:s,viewportWidth:r.absoluteViewport.width}),isNavigationGoingForwardFrom:(m,g)=>i.values.computedPageTurnDirection==="vertical"?m.y>g.y:m.x>g.x,arePositionsDifferent:(m,g)=>m.x!==g.x||m.y!==g.y,getAdjustedPositionForSpread:m=>k({position:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width}),spineItemNavigator:a}},uo=({spineItemsManager:n,context:e,hookManager:t,spine:i,settings:s,viewport:r})=>{const a=new o.Subject,c=a.asObservable(),u=new Me,l=co({context:e,settings:s,spineItemsManager:n,locator:i.locator,spine:i,viewport:r}),p=new yt(s,t,e,i,r),d=new bt(r,s,t,i,e),h=new Pt(s,e,c,p,d,l,i,u.isLocked$),m=o.combineLatest([p.isNavigating$,d.isNavigating$,u.isLocked$,h.locker.isLocked$]).pipe(I.map(y=>y.some(S=>S)?"busy":"free"),I.distinctUntilChanged(),I.shareReplay(1));return{destroy:()=>{p.destroy(),h.destroy()},getNavigation:()=>h.navigation,internalNavigator:h,scrollNavigationController:d,controlledNavigationController:p,locker:u,viewportState$:m,navigate:y=>{a.next(y)},lock(){return u.lock()},navigationResolver:l,navigation$:h.navigation$}};class Ct extends V{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 Rt extends R{constructor(e,t,i,s,r){super(),this.context=e,this.pagination=t,this.spineItemsManager=i,this.spine=s,this.spineItemLocator=r;const a=o.merge(this.context.bridgeEvent.navigation$,s.layout$).pipe(o.switchMap(()=>{const u=({spineItem:l,position:p})=>this.spine.locator.getVisiblePagesFromViewportPosition({spineItem:l,position:p,threshold:{type:"percentage",value:.5}});return this.context.bridgeEvent.navigationUnlocked$.pipe(o.take(1),o.withLatestFrom(this.context.bridgeEvent.navigation$),o.tap(([,l])=>{const{position:p}=l,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}=u({spineItem:g,position:p})??{},{endPageIndex:v=0}=u({spineItem:f,position:p})??{},T=y===void 0||ne(y)||d.beginSpineItemIndex!==h,P=d.endSpineItemIndex!==m||S===void 0||ne(S),E=T?H(g.item):y,A=P?H(f.item):S,D=g.numberOfPages,W=f.numberOfPages;this.pagination.update({beginCfi:E,beginNumberOfPagesInSpineItem:D,beginPageIndexInSpineItem:w,beginSpineItemIndex:h,endCfi:A,endNumberOfPagesInSpineItem:W,endPageIndexInSpineItem:v,endSpineItemIndex:m,navigationId:l.id})}))})),c=a.pipe(Y(this.context.bridgeEvent.viewportFree$),o.tap(()=>{const{beginSpineItemIndex:u,endSpineItemIndex:l,beginPageIndexInSpineItem:p,endPageIndexInSpineItem:d}=this.pagination.value;if(p===void 0||d===void 0||u===void 0||l===void 0)return;const h=this.spineItemsManager.get(u),m=this.spineItemsManager.get(l);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})})}));o.merge(a,c).pipe(o.takeUntil(this.destroy$)).subscribe()}}const lo=({manifest:n,spreadMode:e})=>n?.renditionFlow==="scrolled-continuous"?!1:e;class Dt extends R{constructor(e){super();const t={...this.getDefaultSettings(),...e};this.inputSettings=t,this.outputSettingsUpdateSubject=new o.Subject,this._settings$=this.outputSettingsUpdateSubject.asObservable().pipe(o.shareReplay(1)),this._settings$.subscribe()}_prepareUpdate(e){const t=$.shallowMergeIfDefined(this.inputSettings,e),i=this.getOutputSettings(t),s=!$.isShallowEqual(this.outputSettings,i);return{hasChanged:s,state:i,commit:()=>(this.inputSettings=t,this.outputSettings=i,s&&this.outputSettingsUpdateSubject.next(i),i)}}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(fe(e),o.distinctUntilChanged($.isShallowEqual))}destroy(){super.destroy(),this.outputSettingsUpdateSubject.complete()}}class po extends Dt{constructor(e,t){super(e),this.context=t,t.watch(["manifest","hasVerticalWriting"]).pipe(o.tap(()=>this.update(this.values)),o.takeUntil(this.destroy$)).subscribe()}getComputedSettings(e){const t=this.context.manifest,i=this.context.value.hasVerticalWriting??!1,s={computedPageTurnDirection:e.pageTurnDirection,computedPageTurnAnimation:e.pageTurnAnimation,computedPageTurnMode:e.pageTurnMode,computedPageTurnAnimationDuration:0,computedSpreadMode:lo({spreadMode:e.spreadMode,manifest:t})};return t?.renditionFlow==="scrolled-continuous"&&(s.computedPageTurnMode="scrollable"),s.computedPageTurnMode==="scrollable"&&(s.computedPageTurnDirection="vertical"),i&&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 go extends x{onUnload(){return o.EMPTY}onCreateDocument(){return o.of(document.createElement("div"))}onLoadDocument(){return o.EMPTY}onLayout(){return o.of(void 0)}onRenderHeadless(){return o.EMPTY}getDocumentFrame(){}}class ho extends R{constructor(e,t,i,s,r,a,c){super(),this.item=e,this.containerElement=t,this.context=i,this.hookManager=s,this.renderer=r,this.settings=a,this.viewport=c,this.layoutTriggerSubject=new o.Subject,this.lastLayout=null,this.applyDimsAfterLayout=({blankPagePosition:u,minimumWidth:l})=>p=>p.pipe(o.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,l),T=this.settings.values.computedPageTurnMode==="scrollable"?y??w:this.validateDimension(y??w,w,w);return this.lastLayout={width:v,height:T,pageSize:this.viewport.pageSize},this.containerElement.style.width=`${v}px`,this.containerElement.style.height=`${T}px`,this.hookManager.execute("item.onAfterLayout",void 0,{blankPagePosition:u,item:this.item,minimumWidth:l}),{width:v,height:T}})),this.layout=u=>{const l=_e(this.layout$.pipe(o.first()));return this.layoutTriggerSubject.next(u),l()},this.adjustPositionOfElement=({right:u,left:l,top:p})=>{u!==void 0?this.containerElement.style.right=`${u}px`:this.containerElement.style.removeProperty("right"),l!==void 0?this.containerElement.style.left=`${l}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(o.switchMap(u=>{const{blankPagePosition:l,minimumWidth:p,spreadPosition:d}=u;this.hookManager.execute("item.onBeforeLayout",void 0,{blankPagePosition:l,item:this.item,minimumWidth:p});const h=this.renderer.layout({blankPagePosition:l,minPageSpread:p/this.viewport.pageSize.width,minimumWidth:p,spreadPosition:d});return o.merge(o.of({type:"start"}),h.pipe(this.applyDimsAfterLayout(u),o.map(m=>({type:"end",data:m}))))}),o.share()),this.layout$=this.layoutProcess$.pipe(o.filter(u=>u.type==="end"),o.map(u=>u.data),o.share())}validateDimension(e,t,i){if(e<=0)return i;const s=Math.max(e,i),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,i=e.height?parseFloat(e.height):0;return{width:t,height:i}}}class Ce extends V{constructor(e,t,i,s,r,a,c){super({isLoaded:!1,isReady:!1,iDirty:!1}),this.item=e,this.parentElement=t,this.context=i,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=mo(t,e,r),t.appendChild(this.containerElement);const u=this.settings.values.getRenderer?.(e);this.resourcesHandler=new J(e,this.settings);const l={context:i,settings:s,hookManager:r,item:e,containerElement:this.containerElement,resourcesHandler:this.resourcesHandler,viewport:this.viewport};this.renderer=u?u(l):new go(l),this.layout=new ho(e,this.containerElement,i,r,this.renderer,this.settings,this.viewport);const p=this.renderer.state$.pipe(I.tap(h=>{this.mergeCompare({isLoaded:h==="loaded"})})),d=this.layout.layout$.pipe(I.tap(()=>{this.mergeCompare({iDirty:!1,isReady:this.renderer.state$.value==="loaded"})}));this.needsLayout$=o.merge(this.unloaded$,this.loaded$),o.merge(p,d,this.layout.layout$).pipe(I.takeUntil(this.destroy$)).subscribe()}get isReady$(){return this.watch("isReady")}get element(){return this.containerElement}get readingDirection(){return this.renderer.readingDirection}get loaded$(){return this.renderer.loaded$}get unloaded$(){return this.renderer.state$.pipe(I.distinctUntilChanged(),I.filter(e=>e!=="idle"),I.switchMap(()=>this.renderer.state$.pipe(I.filter(e=>e==="idle"),I.first())))}get renditionLayout(){return this.renderer.renditionLayout}get numberOfPages(){return Tt({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 mo=(n,e,t)=>{const i=n.ownerDocument.createElement("div");return i.classList.add("spineItem"),i.classList.add(`spineItem-${e.renditionLayout??"reflowable"}`),i.style.cssText=`
|
|
261
|
+
`,d.className=`${C}-controlled-navigator`,d.innerHTML="",d.appendChild(p),this.viewport.value.element.appendChild(d),this.element$.next(d)})),c=e.watch(["computedPageTurnDirection","computedPageTurnMode","numberOfAdjacentSpineItemToPreLoad"]),u=o.combineLatest([c,this.element$]).pipe(o.tap(([,p])=>{e.values.computedPageTurnMode==="scrollable"?p.style.display="contents":p.style.display="block"}));this.layout$=u.pipe(o.tap(()=>{St.info("layout",e.values)}),o.share());const l=this.navigateSubject.pipe(o.tap(p=>{St.info("Navigation requested",p)}));this.isNavigating$=l.pipe(o.map(({animation:p,position:d})=>({type:"manualAdjust",shouldAnimate:!(!p||p==="turn"&&e.values.computedPageTurnAnimation==="none"),animation:p,position:d})),o.switchMap(p=>{const d=this.element$.getValue();return d.style.setProperty("transition","none"),d.style.setProperty("opacity","1"),o.merge(o.of(!0),o.of(null).pipe(o.mergeMap(()=>{if(p?.type!=="manualAdjust")return o.of(!1);const h=p.animation==="snap"?e.values.snapAnimationDuration:e.values.computedPageTurnAnimationDuration,m=p.animation==="snap"?"slide":e.values.computedPageTurnAnimation;return o.of(p).pipe(p.shouldAnimate?o.delay(1,o.animationFrameScheduler):o.identity,o.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"))}),o.tap(g=>{m!=="fade"&&this.setViewportPosition(g.position)}),p.shouldAnimate?o.delay(h/2,o.animationFrameScheduler):o.identity,o.tap(g=>{const f=this.element$.getValue();m==="fade"&&(this.setViewportPosition(g.position),f.style.setProperty("opacity","1"))}),p.shouldAnimate?o.delay(h/2,o.animationFrameScheduler):o.identity,o.tap(g=>{m==="fade"&&this.setViewportPosition(g.position)}))}),o.map(()=>!1)))}),o.startWith(!1),o.shareReplay(1)),o.merge(a,this.isNavigating$,this.layout$).pipe(o.takeUntil(this.destroy$)).subscribe()}setViewportPosition(e){const t=this.element$.getValue(),i=Vi(e);t.style.transform=`translate(${i.x}px, ${i.y}px)`,this.hookManager.execute("onViewportOffsetAdjust",void 0,{})}navigate(e){this.navigateSubject.next(e)}get viewportPosition(){const e=this.element$.getValue(),t=window.getComputedStyle(e),i=t.transform||t.webkitTransform;if(!i||i==="none")return new M({x:0,y:0});const s=new DOMMatrix(i);return ki(s)}}class Ui{constructor(e){this.x=e.x,this.y=e.y}}class $e extends Ui{}class bt extends V{constructor(e,t,i,s,r){super({element:void 0}),this.viewport=e,this.settings=t,this.hookManager=i,this.spine=s,this.context=r,this.navigateSubject=new o.Subject,this.scrollingSubject=new o.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"}),o.timer(1).pipe(o.tap(()=>{this.scrollingSubject.next(!1)}),o.takeUntil(o.merge(this.scrollingSubject.pipe(o.skip(1)),this.destroy$))).subscribe(),this.hookManager.execute("onViewportOffsetAdjust",void 0,{})};const a=this.context.pipe(G(["rootElement"]),o.tap(({rootElement:d})=>{if(!d)return;const h=document.createElement("div");h.setAttribute(`data-${qe}`,""),h.appendChild(this.viewport.value.element),d.appendChild(h),this.update({element:h})})),c=o.combineLatest([t.watch(["computedPageTurnMode"]),this.watch("element")]).pipe(o.tap(([{computedPageTurnMode:d},h])=>{h&&(d==="scrollable"?h.style.display="block":h.style.display="contents")})),u=this.navigateSubject.pipe(o.tap(this.setViewportPosition));this.isNavigating$=this.navigateSubject.pipe(o.startWith(!1),o.switchMap(()=>o.merge(o.of(!0),o.of(!1))),o.shareReplay(1));const l=o.merge(s.element$.pipe(o.filter(_),o.switchMap(d=>Z(d))),s.element$.pipe(o.filter(_),o.switchMap(d=>o.fromEvent(d,"scroll"))),s.spineItemsObserver.itemResize$).pipe(o.switchMap(()=>o.timer(10).pipe(o.map(()=>!1),o.startWith(!0))),o.distinctUntilChanged(),o.startWith(!1)),p=o.combineLatest([l,this.isScrolling$]).pipe(o.map(([d,h])=>d||h),o.shareReplay(1));this.userScroll$=this.watch("element").pipe(o.filter(_),o.switchMap(d=>t.watch(["computedPageTurnMode"]).pipe(o.switchMap(({computedPageTurnMode:h})=>h==="controlled"?o.NEVER:o.fromEvent(d,"scroll").pipe(o.withLatestFrom(p),o.filter(([,m])=>!m),o.map(([m])=>m))))),o.share()),o.merge(a,c,u).pipe(o.takeUntil(this.destroy$)).subscribe()}update(e){this.mergeCompare(e)}navigate(e){this.navigateSubject.next(e)}fromScrollPosition(e){const t=this.viewport.scaleFactor;return new N({x:e.x/t,y:e.y/t})}fromSpinePosition(e){const t=this.viewport.scaleFactor;return new $e({x:e.x*t,y:e.y*t})}get scrollPosition(){const e=this.value.element;return new $e({x:e?.scrollLeft??0,y:e?.scrollTop??0})}}const zi=()=>n=>n.pipe(o.map(({navigation:e,pagination:t,...i})=>({navigation:{...e,paginationBeginCfi:t.beginCfi},...i}))),Wi=(n,e,t)=>n.bridgeEvent.pagination$.pipe(o.withLatestFrom(e),o.filter(([i,s])=>i.navigationId===s.id),o.switchMap(([i,s])=>(t.spineItemsManager.get(s.spineItem)?.isReady$.pipe(o.first())??o.of(!1)).pipe(o.filter(a=>a),o.map(()=>({pagination:i,navigation:s})))),zi(),o.distinctUntilChanged((i,s)=>i.navigation.paginationBeginCfi===s.navigation.paginationBeginCfi),o.map(({navigation:i})=>({...i,meta:{triggeredBy:"pagination"}}))),_i=({navigationResolver:n})=>e=>e.pipe(o.map(([t,i])=>{const s={type:"api",meta:{triggeredBy:"user"},id:Symbol(),animation:"turn",...t,position:t.position?n.fromOutOfBoundsSpinePosition(t.position):void 0};return{previousNavigation:i,navigation:s}})),Hi=({navigationResolver:n})=>e=>e.pipe(o.map(t=>{if(t.navigation.cfi){const i=n.getNavigationForCfi(t.navigation.cfi);if(i)return{...t,navigation:{...t.navigation,position:i}}}return t})),Bi=({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",xi=({context:n,settings:e})=>t=>t.pipe(o.map(({navigation:i,previousNavigation:s})=>{const r=Bi({navigation:i,previousNavigation:s,settings:e}),a={...i,directionFromLastNavigation:r};return{previousNavigation:s,navigation:a,direction:r}})),Yi=({spineItemsManager:n,navigationResolver:e,settings:t})=>i=>i.pipe(o.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),u=t.values.computedPageTurnMode==="scrollable"?new N({x:c.x+r.previousNavigation.position.x,y:c.y}):e.fromUnboundSpinePosition(c);return{navigation:{...s,position:u},...r}})),It=({settings:n,spineItemsManager:e,navigationResolver:t,spineLocator:i})=>s=>{const r=a=>{const{position:c,spineItem:u,cfi:l,directionFromLastNavigation:p}=a,{navigationSnapThreshold:d,computedPageTurnMode:h}=n.values;if(u!==void 0){const m=e.get(u);if(m)return m}if(typeof u=="number")return u>e.items.length-1?e.get(e.items.length-1):e.get(0);if(l){const m=e.getSpineItemFromCfi(l);if(m)return m}if(c&&h==="controlled"){const{beginIndex:m,endIndex:g}=i.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}=i.getVisiblePagesFromViewportPosition({position:c,spineItem:y,threshold:d,restrictToScreen:!1})??{},v=(p==="forward"||p==="anchor"?S:w)??0,T=t.getNavigationForSpineItemPage({pageIndex:v,spineItemId:y}),P=i.getVisibleSpineItemsFromPosition({position:T,threshold:d,restrictToScreen:!1}),E=p==="forward"||p==="anchor"?P?.beginIndex:P?.endIndex;return e.get(E)}return c&&h==="scrollable"?i.getSpineItemFromPosition(c):e.get(0)};return s.pipe(o.map(({navigation:a,...c})=>{const u=r(a);return{navigation:{...a,spineItem:e.getSpineItemIndex(u)},...c}}))},wt=({spine:n})=>e=>e.pipe(o.switchMap(({navigation:t,...i})=>{const s=n.getSpineItemSpineLayoutInfo(t.spineItem),r=n.spineItemsManager.get(t.spineItem);return(r?.isReady$??o.of(!1)).pipe(o.first(),o.map(a=>({navigation:{...t,spineItemHeight:s?.height,spineItemWidth:s?.width,spineItemLeft:s.left,spineItemTop:s.top,spineItemIsUsingVerticalWriting:r?.isUsingVerticalWriting(),spineItemIsReady:a},...i})))})),Te=({settings:n,spineItemsManager:e,spineLocator:t,navigationResolver:i})=>s=>{const r=a=>{const{navigationSnapThreshold:c,computedPageTurnMode:u}=n.values,l=e.get(a.spineItem);if(!(!l||!a.position)){if(u==="controlled"){const{endPageIndex:p,beginPageIndex:d}=t.getVisiblePagesFromViewportPosition({position:a.position,spineItem:l,threshold:c,restrictToScreen:!1})??{},h=(a.directionFromLastNavigation==="forward"||a.directionFromLastNavigation==="anchor"?p:d)??0,m=i.getNavigationForSpineItemPage({pageIndex:h,spineItemId:l}),g=t.getVisiblePagesFromViewportPosition({position:m,spineItem:l,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:l})}return t.getSpineItemPositionFromSpinePosition(a.position,l)}};return s.pipe(o.map(({navigation:a,...c})=>({navigation:{...a,positionInSpineItem:r(a)},...c})))},Xi=({navigationResolver:n})=>e=>e.pipe(o.map(t=>{if(t.navigation.url){const i=n.getNavigationForUrl(t.navigation.url);if(i)return{...t,navigation:{...t.navigation,position:i.position,spineItem:i.spineItemId}}}return t}));class Me{constructor(){this.isLockedSubject=new o.BehaviorSubject(0),this.isLocked$=this.isLockedSubject.pipe(o.map(e=>!!e),o.distinctUntilChanged())}lock(){let e=!1;return this.isLockedSubject.next(this.isLockedSubject.getValue()+1),()=>{e||(e=!0,this.isLockedSubject.next(this.isLockedSubject.getValue()-1))}}}const qi=({spineLocator:n,navigation:e,navigationResolver:t,spineItemsManager:i,spine:s})=>{const r=i.get(e.spineItem);return r?r.isReady$.pipe(o.first(),o.map(a=>{const c=s.getSpineItemSpineLayoutInfo(r),u=n.isPositionWithinSpineItem(e.position,r),l=c.width-(e.spineItemWidth??0),p=c.height-(e.spineItemHeight??0),d=l!==0||p!==0;if(e.url!==void 0&&(l||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)&&(l||p||a&&!e.spineItemIsReady)){const m=t.getNavigationForCfi(h);if(m)return m}if(u&&d&&e.directionFromLastNavigation==="backward"){const m=new F({x:(e.positionInSpineItem?.x??0)+l,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 u?t.getNavigationForPosition(e.position):t.getNavigationForSpineIndexOrId(r)})):o.of(new M({x:0,y:0}))},Gi=({navigation:n,spineLocator:e,spineItemsManager:t,settings:i,navigationResolver:s,spine:r})=>{const{spineItem:a}=n,c=t.get(a);if(!c)return new M({x:0,y:0});const{height:u,top:l}=r.getSpineItemSpineLayoutInfo(c),p=e.isPositionWithinSpineItem(n.position,c),d=n.positionInSpineItem??new F({y:0,x:0});if(i.values.computedPageTurnDirection==="vertical"){if(l===n.spineItemTop&&u===n.spineItemHeight&&p)return n.position;if(l===n.spineItemTop&&u===n.spineItemHeight&&!p)return s.getNavigationForSpineIndexOrId(c);if(l!==n.spineItemTop){const h=e.getSafeSpineItemPositionFromUnsafeSpineItemPosition(n.positionInSpineItem??new F({x:0,y:0}),c);return e.getSpinePositionFromSpineItemPosition({spineItemPosition:h,spineItem:c})}if(l===n.spineItemTop&&u!==n.spineItemHeight){const h=(n.spineItemHeight??d.y)-d.y,m=new F({y:n.directionFromLastNavigation==="backward"?u-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<l)){const f=new F({y:u-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:i,navigationResolver:s,spine:r})=>t.values.computedPageTurnMode==="scrollable"?o.of(Gi({navigation:n,spineLocator:i,navigationResolver:s,settings:t,spineItemsManager:e,spine:r})):qi({navigation:n,spineLocator:i,navigationResolver:s,spineItemsManager:e,spine:r}),vt=({settings:n,navigationResolver:e,context:t,spine:i})=>s=>s.pipe(o.switchMap(r=>Zi({spineLocator:i.locator,navigation:r.navigation,navigationResolver:e,settings:n,spineItemsManager:i.spineItemsManager,spineItemLocator:i.locator.spineItemLocator,spine:i}).pipe(o.map(a=>({...r,navigation:{...r.navigation,position:a}}))))),Ji=L.namespace("navigation/InternalNavigator");class Pt extends R{constructor(e,t,i,s,r,a,c,u){super(),this.settings=e,this.context=t,this.userNavigation$=i,this.controlledNavigationController=s,this.scrollNavigationController=r,this.navigationResolver=a,this.spine=c,this.isUserLocked$=u,this.navigationSubject=new o.BehaviorSubject({animation:!1,position:new M({x:0,y:0}),meta:{triggeredBy:"user"},spineItemIsReady:!1,type:"api",id:Symbol()}),this.navigated$=this.navigationSubject.pipe(o.skip(1)),this.navigation$=this.navigationSubject.pipe(o.map(({position:S,id:w})=>({position:S,id:w})),o.distinctUntilChanged(({position:S,...w},{position:v,...T})=>$.isShallowEqual(w,T)&&$.isShallowEqual(S,v)),o.shareReplay(1)),this.locker=new Me;const l=i.pipe(o.withLatestFrom(this.navigationSubject),_i({navigationResolver:a}),Xi({navigationResolver:a}),Hi({navigationResolver:a}),xi({context:t,settings:e}),It({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),Te({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),wt({spine:c})).pipe(Yi({navigationResolver:a,spineItemsManager:c.spineItemsManager,settings:e}),o.withLatestFrom(u),o.switchMap(([S,w])=>{const v=S.navigation.cfi||S.navigation.url||e.values.computedPageTurnMode==="scrollable"||w;return o.of(S).pipe(v?o.identity:vt({navigationResolver:a,settings:e,spine:c,context:t}))}),Te({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),o.map(S=>S.navigation),o.share()),p=l.pipe(o.withLatestFrom(u),o.filter(([,S])=>S),o.switchMap(([S])=>{const w=this.locker.lock();return u.pipe(o.filter(v=>!v),o.first(),o.map(()=>({...S,animation:"snap"})),o.finalize(()=>{w()}),o.takeUntil(l))}),o.share()),d=o.merge(s.layout$,c.layout$).pipe(o.switchMap(()=>o.of(null).pipe(o.switchMap(()=>u.pipe(o.filter(S=>!S),o.first())),o.map(()=>({...this.navigationSubject.getValue(),animation:!1})),o.takeUntil(o.merge(p,l))))),h=o.merge(d,p).pipe(o.map(S=>({navigation:S})),vt({navigationResolver:a,settings:e,context:t,spine:c}),o.map(S=>{const w={...S.navigation,meta:{triggeredBy:"restoration"}};return{...S,navigation:w}}),It({navigationResolver:a,settings:e,spineItemsManager:c.spineItemsManager,spineLocator:c.locator}),wt({spine:c}),Te({spineItemsManager:c.spineItemsManager,spineLocator:c.locator,settings:e,navigationResolver:a}),o.map(({navigation:S})=>S),o.share()),m=Wi(t,this.navigationSubject,c),g=o.merge(h,l,m),f=S=>S.pipe(o.tap(([w,v])=>{Ji.info(`navigation updated from ${w.meta.triggeredBy} of type ${w.type}`,{previousNavigation:v,currentNavigation:w}),this.navigationSubject.next(w)})),y=S=>S.pipe(o.tap(([w,v])=>{const T=w.type==="scroll",P=w.meta.triggeredBy==="pagination",E=w.meta.triggeredBy==="restoration",A=$.isShallowEqual(v.position,w.position);if(T&&!E||P||A)return;const D={position:w.position,animation:w.animation};e.values.computedPageTurnMode==="scrollable"?this.scrollNavigationController.navigate(D):this.controlledNavigationController.navigate({...D,position:M.from(D.position)})}));g.pipe(o.withLatestFrom(this.navigationSubject),y,f,o.takeUntil(this.destroy$)).subscribe()}get navigation(){return this.navigationSubject.getValue()}}const se=(n,e,t)=>{const i=t-n,s=t*(e*n)/(t||1);return Math.max(0,Math.min(i,s))},Fe=(n,e)=>(e||0)===0||(n||0)===0?1:Math.floor(Math.max(1,n/e)),Le=(n,e,t)=>{const i=Fe(t,e),s=[...Array(i)].map((r,a)=>a*e);return n>=i*e?s[s.length-1]||0:s.find(r=>n<r+e)||0},$t=(n,e,t)=>{const i=[...Array(t)].map((s,r)=>r*e);return n<=0||t===0?0:n>=t*e?t-1:i.findIndex(s=>n<s+e)??0},Ki=({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))}),Tt=({itemHeight:n,itemWidth:e,isUsingVerticalWriting:t,pageWidth:i,pageHeight:s,pageTurnDirection:r,pageTurnMode:a})=>r==="vertical"&&a==="scrollable"?1:t||r==="vertical"?Fe(n,s):Fe(e,i),Mt=({itemWidth:n,itemHeight:e,position:t,isUsingVerticalWriting:i,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c,isRTL:u})=>{const p=Ki({spineItemPosition:t,itemHeight:e,itemWidth:n}).x,d=Tt({isUsingVerticalWriting:i,itemHeight:e,itemWidth:n,pageWidth:s,pageHeight:r,pageTurnDirection:a,pageTurnMode:c});if(i)return $t(t.y,r,d);const h=$t(p,s,d);return u?d-1-h:h},Qi=({pageIndex:n,itemLayout:e,context:t,isUsingVerticalWriting:i,viewport:s})=>{if(i){const a=se(s.pageSize.height,n,e.height);return new F({x:0,y:a})}const r=se(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})},Ft=({context:n,settings:e,viewport:t})=>{const i=(c,u,l)=>{let p;c?.nodeName==="img"||c?.textContent===""&&c.nodeType===Node.ELEMENT_NODE?p=c.getBoundingClientRect().x:c&&(p=(c?Xt(c,u):void 0)?.getBoundingClientRect().x||p);const d=l.layout.layoutInfo?.width||0,h=t.pageSize.width;if(p!==void 0){const m=Le(p,h,d);return new F({x:m,y:0})}};return{getSpineItemPositionFromNode:i,getSpineItemPositionFromPageIndex:({pageIndex:c,spineItem:u})=>Qi({context:n,isUsingVerticalWriting:!!u.isUsingVerticalWriting(),itemLayout:u.layout.layoutInfo,pageIndex:c,viewport:t}),getSpineItemPageIndexFromPosition:c=>Mt({...c,isRTL:n.isRTL(),pageWidth:t.pageSize.width,pageHeight:t.pageSize.height,pageTurnDirection:e.values.computedPageTurnDirection,pageTurnMode:e.values.pageTurnMode}),getSpineItemPageIndexFromNode:(c,u,l)=>{const p=i(c,u,l),{height:d,width:h}=l.layout.layoutInfo;return p?Mt({isUsingVerticalWriting:!!l.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,u)=>{const{width:l,height:p}=u.layout.layoutInfo;return new F({x:Le(c.x,t.pageSize.width,l),y:Le(c.y,t.pageSize.height,p)})},getSpineItemPagePositionFromSpineItemPosition:(c,u,l)=>{const{width:p,height:d}=l.layout.layoutInfo,h=t.pageSize.width,m=t.pageSize.height;if(!!l.isUsingVerticalWriting()){const y=se(m,u,d);return new j({x:c.x,y:c.y-y})}const f=se(h,u,p);if(n.isRTL()){const y=p-(u+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})}}},ji=({context:n,settings:e,viewport:t})=>{const i=Ft({context:n,settings:e,viewport:t});return{getNavigationForLastPage:c=>{const u=c.numberOfPages;return i.getSpineItemPositionFromPageIndex({pageIndex:u-1,spineItem:c})},getNavigationForPosition:(c,u)=>i.getSpineItemClosestPositionFromUnsafePosition(u,c),getNavigationFromNode:(c,u,l)=>i.getSpineItemPositionFromNode(u,l,c)||new F({x:0,y:0})}};function Lt({position:n,isRTL:e,spineItemsManager:t,spine:i,viewportWidth:s}){const r=t.get(t.items.length-1),a=i.getSpineItemSpineLayoutInfo(r||0),c=a.bottom-1,u=Math.max(0,n.y),l=Math.min(u,c);if(e){const m=Math.min(s,n.x),g=Math.max(m,a.left);return new M({x:g,y:l})}const p=a.right-1,d=Math.max(0,n.x),h=Math.min(d,p);return new M({x:h,y:l})}const Et=({position:n,isRTL:e,pageSizeHeight:t,spineItemsManager:i,visibleAreaRectWidth:s,spine:r})=>{const a=Lt({position:n,isRTL:e,spineItemsManager:i,spine:r,viewportWidth:s}),c=i.get(i.items.length-1),u=r.getSpineItemSpineLayoutInfo(c),l=u.bottom-t,p=Math.min(a.y,l);if(e){const h=Math.min(0,a.x);return new M({x:h,y:p})}const d=u.right-s;return new M({x:Math.min(a.x,d),y:p})},k=({position:{x:n,y:e},pageSizeWidth:t,visibleAreaRectWidth:i})=>{const r=n%i!==0?n-t:n;return new M({x:r,y:e})},Ee=({viewportPosition:n,spineLocator:e,spineItemNavigationResolver:t,viewport:i})=>{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 k({position:c,pageSizeWidth:i.pageSize.width,visibleAreaRectWidth:i.absoluteViewport.width})}return new M({x:0,y:0})},eo=({pageIndex:n,spineItemsManager:e,spineItemId:t,spineLocator:i,spineItemNavigationResolver:s,viewport:r})=>{const a=e.get(t);if(!a){const l=n*r.pageSize.width;return Ee({viewportPosition:new M({x:l,y:0}),spineItemNavigationResolver:s,spineLocator:i,viewport:r})}const c=i.spineItemLocator.getSpineItemPositionFromPageIndex({pageIndex:n,spineItem:a}),u=i.getSpinePositionFromSpineItemPosition({spineItemPosition:c,spineItem:a});return k({position:u,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})},to=(n,e)=>{if(e&&e instanceof HTMLIFrameElement)return n.startsWith("#")?e.contentDocument?.getElementById(n.replace("#","")):e.contentDocument?.querySelector(n)},no=({anchor:n,spineItem:e,spine:t})=>{const i=to(n,e.renderer.getDocumentFrame());return i?t.spineItemLocator.getSpineItemPositionFromNode(i,0,e)?.x??0:0},io=({anchor:n,spineItem:e,spineLocator:t,spine:i})=>{const s=no({anchor:n,spineItem:e,spine:i});return t.getSpinePositionFromSpineItemPosition({spineItemPosition:new F({x:s,y:0}),spineItem:e})},oo=({anchor:n,spineItem:e,spineLocator:t,spine:i,pageSizeWidth:s,visibleAreaRectWidth:r})=>{const a=io({anchor:n,spineItem:e,spineLocator:t,spine:i});return k({position:a,pageSizeWidth:s,visibleAreaRectWidth:r})},so=({spine:n,spineItemsManager:e,spineLocator:t,url:i,context:s,pageSizeWidth:r,visibleAreaRectWidth:a})=>{try{const c=i instanceof URL?i:new URL(i),u=`${c.origin}${c.pathname}`,l=s.manifest?.spineItems.find(p=>p.href===u);if(l){const p=e.get(l.id);if(p){const d=oo({anchor:c.hash,spineItem:p,spine:n,spineLocator:t,pageSizeWidth:r,visibleAreaRectWidth:a});return{position:k({position:d,pageSizeWidth:r,visibleAreaRectWidth:a}),spineItemId:l.id}}}return}catch(c){console.error(c);return}},ro=({spineItem:n,spineItemPosition:e,spineLocator:t,spineItemLocator:i,viewport:s})=>{const r=i.getSpineItemClosestPositionFromUnsafePosition(e,n),a=t.getSpinePositionFromSpineItemPosition({spineItemPosition:r,spineItem:n});return k({position:a,pageSizeWidth:s.pageSize.width,visibleAreaRectWidth:s.absoluteViewport.width})},ao="spineNavigator",co=({context:n,spineItemsManager:e,locator:t,settings:i,spine:s,viewport:r})=>{const a=ji({context:n,settings:i,viewport:r});return{getNavigationForUrl:m=>so({context:n,spineItemsManager:e,spineLocator:t,url:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width,spine:s}),getNavigationForSpineItemPage:m=>eo({...m,spineItemsManager:e,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getNavigationFromSpineItemPosition:m=>ro({...m,spineItemLocator:t.spineItemLocator,spineLocator:t,viewport:r}),getNavigationForCfi:m=>{const g=e.getSpineItemFromCfi(m),{node:f,offset:y=0}=ve({cfi:m,spineItemsManager:e});if(!g){L.warn(ao,`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 k({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 k({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 k({position:f,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width})}return new M({x:0,y:0})},getNavigationForPosition:m=>Ee({viewportPosition:m,spineItemNavigationResolver:a,spineLocator:t,viewport:r}),getMostPredominantNavigationForPosition:m=>{const g=i.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=Et({position:new M({x:y,y:S}),isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s});return Ee({spineItemNavigationResolver:a,spineLocator:t,viewportPosition:w,viewport:r})},fromUnboundSpinePosition:m=>Et({position:m,isRTL:n.isRTL(),pageSizeHeight:r.pageSize.height,visibleAreaRectWidth:r.absoluteViewport.width,spineItemsManager:e,spine:s}),fromOutOfBoundsSpinePosition:m=>Lt({position:m,isRTL:n.isRTL(),spineItemsManager:e,spine:s,viewportWidth:r.absoluteViewport.width}),isNavigationGoingForwardFrom:(m,g)=>i.values.computedPageTurnDirection==="vertical"?m.y>g.y:m.x>g.x,arePositionsDifferent:(m,g)=>m.x!==g.x||m.y!==g.y,getAdjustedPositionForSpread:m=>k({position:m,pageSizeWidth:r.pageSize.width,visibleAreaRectWidth:r.absoluteViewport.width}),spineItemNavigator:a}},uo=({spineItemsManager:n,context:e,hookManager:t,spine:i,settings:s,viewport:r})=>{const a=new o.Subject,c=a.asObservable(),u=new Me,l=co({context:e,settings:s,spineItemsManager:n,locator:i.locator,spine:i,viewport:r}),p=new yt(s,t,e,i,r),d=new bt(r,s,t,i,e),h=new Pt(s,e,c,p,d,l,i,u.isLocked$),m=o.combineLatest([p.isNavigating$,d.isNavigating$,u.isLocked$,h.locker.isLocked$]).pipe(I.map(y=>y.some(S=>S)?"busy":"free"),I.distinctUntilChanged(),I.shareReplay(1));return{destroy:()=>{p.destroy(),h.destroy()},getNavigation:()=>h.navigation,internalNavigator:h,scrollNavigationController:d,controlledNavigationController:p,locker:u,viewportState$:m,navigate:y=>{a.next(y)},lock(){return u.lock()},navigationResolver:l,navigation$:h.navigation$}};class Ct extends V{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 Rt extends R{constructor(e,t,i,s,r){super(),this.context=e,this.pagination=t,this.spineItemsManager=i,this.spine=s,this.spineItemLocator=r;const a=o.merge(this.context.bridgeEvent.navigation$,s.layout$).pipe(o.switchMap(()=>{const u=({spineItem:l,position:p})=>this.spine.locator.getVisiblePagesFromViewportPosition({spineItem:l,position:p,threshold:{type:"percentage",value:.5}});return this.context.bridgeEvent.navigationUnlocked$.pipe(o.take(1),o.withLatestFrom(this.context.bridgeEvent.navigation$),o.tap(([,l])=>{const{position:p}=l,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}=u({spineItem:g,position:p})??{},{endPageIndex:v=0}=u({spineItem:f,position:p})??{},T=y===void 0||ne(y)||d.beginSpineItemIndex!==h,P=d.endSpineItemIndex!==m||S===void 0||ne(S),E=T?H(g.item):y,A=P?H(f.item):S,D=g.numberOfPages,W=f.numberOfPages;this.pagination.update({beginCfi:E,beginNumberOfPagesInSpineItem:D,beginPageIndexInSpineItem:w,beginSpineItemIndex:h,endCfi:A,endNumberOfPagesInSpineItem:W,endPageIndexInSpineItem:v,endSpineItemIndex:m,navigationId:l.id})}))})),c=a.pipe(Y(this.context.bridgeEvent.viewportFree$),o.tap(()=>{const{beginSpineItemIndex:u,endSpineItemIndex:l,beginPageIndexInSpineItem:p,endPageIndexInSpineItem:d}=this.pagination.value;if(p===void 0||d===void 0||u===void 0||l===void 0)return;const h=this.spineItemsManager.get(u),m=this.spineItemsManager.get(l);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})})}));o.merge(a,c).pipe(o.takeUntil(this.destroy$)).subscribe()}}const lo=({manifest:n,spreadMode:e})=>n?.renditionFlow==="scrolled-continuous"?!1:e;class Dt extends R{constructor(e){super();const t={...this.getDefaultSettings(),...e};this.inputSettings=t,this.outputSettingsUpdateSubject=new o.Subject,this._settings$=this.outputSettingsUpdateSubject.asObservable().pipe(o.shareReplay(1)),this._settings$.subscribe()}_prepareUpdate(e){const t=$.shallowMergeIfDefined(this.inputSettings,e),i=this.getOutputSettings(t),s=!$.isShallowEqual(this.outputSettings,i);return{hasChanged:s,state:i,commit:()=>(this.inputSettings=t,this.outputSettings=i,s&&this.outputSettingsUpdateSubject.next(i),i)}}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(fe(e),o.distinctUntilChanged($.isShallowEqual))}destroy(){super.destroy(),this.outputSettingsUpdateSubject.complete()}}class po extends Dt{constructor(e,t){super(e),this.context=t,t.watch(["manifest","hasVerticalWriting"]).pipe(o.tap(()=>this.update(this.values)),o.takeUntil(this.destroy$)).subscribe()}getComputedSettings(e){const t=this.context.manifest,i=this.context.value.hasVerticalWriting??!1,s={computedPageTurnDirection:e.pageTurnDirection,computedPageTurnAnimation:e.pageTurnAnimation,computedPageTurnMode:e.pageTurnMode,computedPageTurnAnimationDuration:0,computedSpreadMode:lo({spreadMode:e.spreadMode,manifest:t})};return t?.renditionFlow==="scrolled-continuous"&&(s.computedPageTurnMode="scrollable"),s.computedPageTurnMode==="scrollable"&&(s.computedPageTurnDirection="vertical"),i&&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 go extends x{onUnload(){return o.EMPTY}onCreateDocument(){return o.of(document.createElement("div"))}onLoadDocument(){return o.EMPTY}onLayout(){return o.of(void 0)}onRenderHeadless(){return o.EMPTY}getDocumentFrame(){}}class ho extends R{constructor(e,t,i,s,r,a,c){super(),this.item=e,this.containerElement=t,this.context=i,this.hookManager=s,this.renderer=r,this.settings=a,this.viewport=c,this.layoutTriggerSubject=new o.Subject,this.lastLayout=null,this.applyDimsAfterLayout=({blankPagePosition:u,minimumWidth:l})=>p=>p.pipe(o.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,l),T=this.settings.values.computedPageTurnMode==="scrollable"?y??w:this.validateDimension(y??w,w,w);return this.lastLayout={width:v,height:T,pageSize:this.viewport.pageSize},this.containerElement.style.width=`${v}px`,this.containerElement.style.height=`${T}px`,this.hookManager.execute("item.onAfterLayout",void 0,{blankPagePosition:u,item:this.item,minimumWidth:l}),{width:v,height:T}})),this.layout=u=>{const l=_e(this.layout$.pipe(o.first()));return this.layoutTriggerSubject.next(u),l()},this.adjustPositionOfElement=({right:u,left:l,top:p})=>{u!==void 0?this.containerElement.style.right=`${u}px`:this.containerElement.style.removeProperty("right"),l!==void 0?this.containerElement.style.left=`${l}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(o.switchMap(u=>{const{blankPagePosition:l,minimumWidth:p,spreadPosition:d}=u;this.hookManager.execute("item.onBeforeLayout",void 0,{blankPagePosition:l,item:this.item,minimumWidth:p});const h=this.renderer.layout({blankPagePosition:l,minPageSpread:p/this.viewport.pageSize.width,minimumWidth:p,spreadPosition:d});return o.merge(o.of({type:"start"}),h.pipe(this.applyDimsAfterLayout(u),o.map(m=>({type:"end",data:m}))))}),o.share()),this.layout$=this.layoutProcess$.pipe(o.filter(u=>u.type==="end"),o.map(u=>u.data),o.share())}validateDimension(e,t,i){if(e<=0)return i;const s=Math.max(e,i),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,i=e.height?parseFloat(e.height):0;return{width:t,height:i}}}class Ce extends V{constructor(e,t,i,s,r,a,c){super({isLoaded:!1,isReady:!1,iDirty:!1}),this.item=e,this.parentElement=t,this.context=i,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=mo(t,e,r),t.appendChild(this.containerElement);const u=this.settings.values.getRenderer?.(e);this.resourcesHandler=new J(e,this.settings);const l={context:i,settings:s,hookManager:r,item:e,containerElement:this.containerElement,resourcesHandler:this.resourcesHandler,viewport:this.viewport};this.renderer=u?u(l):new go(l),this.layout=new ho(e,this.containerElement,i,r,this.renderer,this.settings,this.viewport);const p=this.renderer.state$.pipe(I.tap(h=>{this.mergeCompare({isLoaded:h==="loaded"})})),d=this.layout.layout$.pipe(I.tap(()=>{this.mergeCompare({iDirty:!1,isReady:this.renderer.state$.value==="loaded"})}));this.needsLayout$=o.merge(this.unloaded$,this.loaded$),o.merge(p,d,this.layout.layout$).pipe(I.takeUntil(this.destroy$)).subscribe()}get isReady$(){return this.watch("isReady")}get element(){return this.containerElement}get readingDirection(){return this.renderer.readingDirection}get loaded$(){return this.renderer.loaded$}get unloaded$(){return this.renderer.state$.pipe(I.distinctUntilChanged(),I.filter(e=>e!=="idle"),I.switchMap(()=>this.renderer.state$.pipe(I.filter(e=>e==="idle"),I.first())))}get renditionLayout(){return this.renderer.renditionLayout}get numberOfPages(){return Tt({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 mo=(n,e,t)=>{const i=n.ownerDocument.createElement("div");return i.classList.add("spineItem"),i.classList.add(`spineItem-${e.renditionLayout??"reflowable"}`),i.style.cssText=`
|
|
262
262
|
position: absolute;
|
|
263
263
|
overflow: hidden;
|
|
264
264
|
`,i.dataset.isReady="false",t.execute("item.onBeforeContainerCreated",void 0,{element:i}),i};class fo extends R{constructor(e,t,i,s,r){super(),this.context=e,this.spineItemsManager=t,this.spineLocator=i,this.settings=s,this.spineLayout=r,this.forcedOpenSubject=new o.BehaviorSubject([]);const a=this.forcedOpenSubject.pipe(o.map(l=>[...new Set(l.flat())].sort()),o.distinctUntilChanged($.arrayEqual),o.shareReplay({bufferSize:1,refCount:!0}));o.merge(this.context.bridgeEvent.navigation$,this.spineLayout.layout$,a,s.watch(["numberOfAdjacentSpineItemToPreLoad"])).pipe(o.debounceTime(100,o.animationFrameScheduler),Y(this.context.bridgeEvent.viewportFree$),o.withLatestFrom(this.context.bridgeEvent.navigation$,a),o.map(([,l,p])=>{const{numberOfAdjacentSpineItemToPreLoad:d}=s.values,{beginIndex:h=0,endIndex:m=0}=i.getVisibleSpineItemsFromPosition({position:l.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(o.takeUntil(this.destroy$)).subscribe()}forceOpen(e){const t=e.map(i=>typeof i=="number"?i:i.index);return this.forcedOpenSubject.next([...this.forcedOpenSubject.value,t]),()=>{this.isDestroyed||this.forcedOpenSubject.next(this.forcedOpenSubject.value.filter(i=>i!==t))}}destroy(){super.destroy(),this.forcedOpenSubject.complete()}}const At=(n,e,t)=>{const i=(t.width-e.width)/2,s=(t.height-e.height)/2;return new N({x:n.x-i,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 i=e;return new X(i.x,i.y,i.width,i.height)}}class So{constructor({width:e,height:t}){this.__symbol=Symbol("AbsoluteViewport"),this.width=e,this.height=t}}class yo{constructor({width:e,height:t}){this.__symbol=Symbol("RelativeViewport"),this.width=e,this.height=t}}const bo=({pageIndex:n,spineItemOrId:e,spineItemsManager:t})=>{const i=t.items,s=t.get(e);if(!s)return;const{currentAbsolutePage:r}=i.reduce((a,c)=>{if(a.found)return a;const u=c.numberOfPages;return s===c&&n<=u-1?{currentAbsolutePage:a.currentAbsolutePage+n,found:!0}:{...a,currentAbsolutePage:a.currentAbsolutePage+u}},{currentAbsolutePage:0,found:!1});return r},Io=({itemHeight:n,itemWidth:e,visibleWidthOfItem:t,visibleHeightOfItem:i,threshold:s})=>{const r=t/e,a=i/n;return s.type==="percentage"?r>=s.value&&a>=s.value:t>=s.value&&i>=s.value},wo=({visibleWidthOfItem:n,visibleHeightOfItem:e,threshold:t,viewportPosition:i})=>{const s=n/i.width,r=e/i.height;return t.type==="percentage"?r>=t.value&&s>=t.value:e>=t.value&&n>=t.value},Ot=({itemPosition:{bottom:n,left:e,right:t,top:i,width:s,height:r},threshold:a,viewportPosition:c,restrictToScreen:u})=>{const l=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,l)),g=Math.max(0,Math.min(n,h)-Math.max(i,d));if(m<=0||g<=0)return{visible:!1};const y=wo({threshold:a,visibleHeightOfItem:g,visibleWidthOfItem:m,viewportPosition:c});return u?{visible:y}:{visible:Io({itemHeight:r,itemWidth:s,threshold:a,visibleHeightOfItem:g,visibleWidthOfItem:m})||y}},Re=({position:n,spineItemsManager:e,spineLayout:t})=>{const i=e.items.find(s=>{const{left:r,right:a,bottom:c,top:u}=t.getSpineItemSpineLayoutInfo(s),l=n.x>=r&&n.x<a,p=n.y>=u&&n.y<c;return l&&p});return n.x===0&&!i?e.items[0]:i},De=({spineItemPosition:n,itemLayout:{left:e,top:t}})=>new M({x:e+n.x,y:t+n.y}),vo=({position:n,threshold:e,restrictToScreen:t,spineItemsManager:i,spineLayout:s,useAbsoluteViewport:r=!0,viewport:a})=>{const c=Re({position:n,spineItemsManager:i,spineLayout:s})||i.get(0),u=i.items.reduce((m,g)=>{const f=s.getSpineItemSpineLayoutInfo(g),y=r?a.absoluteViewport:a.relativeViewport,S=At(n,a.absoluteViewport,y),w=X.from(S,y),{visible:v}=Ot({itemPosition:f,threshold:e,viewportPosition:w,restrictToScreen:t});return v?[...m,g]:m},[]),l=u[0]??c,p=u[u.length-1]??l;if(!l||!p)return;const d=i.getSpineItemIndex(l),h=i.getSpineItemIndex(p);return{beginIndex:d??0,endIndex:h??0}},Po=({spineItemsManager:n,context:e,spineItemLocator:t,settings:i,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=>De({spineItemPosition:new F({x:0,y:0}),itemLayout:s.getSpineItemSpineLayoutInfo(g)}),u=g=>n.items.find(f=>f.renderer.getDocumentFrame()===g),l=(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 T=y.numberOfPages,E=Array.from(Array(T)).map((W,ae)=>{const Ae=t.getSpineItemPositionFromPageIndex({pageIndex:ae,spineItem:y}),B=De({spineItemPosition:Ae,itemLayout:s.getSpineItemSpineLayoutInfo(y)});return{index:ae,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:ae,index:Ae})=>{const B=w?v.absoluteViewport:v.relativeViewport,Ro=At(g,v.absoluteViewport,B),Do=X.from(Ro,B),{visible:Ao}=Ot({viewportPosition:Do,restrictToScreen:S,threshold:f,itemPosition:ae});return Ao?[...W,Ae]:W},[]),A=E[0],D=E[E.length-1]??A;if(!(A===void 0||D===void 0))return{beginPageIndex:A,endPageIndex:D}};return{getSpinePositionFromSpineItemPosition:({spineItem:g,spineItemPosition:f})=>{const y=s.getSpineItemSpineLayoutInfo(g);return De({itemLayout:y,spineItemPosition:f})},_getAbsolutePageIndexFromPageIndex:g=>bo({...g,spineItemsManager:n}),getSpineItemPagePositionFromSpinePosition:g=>{const f=Re({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=>Re({position:g,spineItemsManager:n,spineLayout:s}),getSpineItemFromIframe:u,getSpineItemPageIndexFromNode:l,getVisibleSpineItemsFromPosition:g=>vo({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)})}}},$o=L.namespace("spine"),Nt=({position:n,pageSize:e})=>new je({...n,left:n.x,top:n.y,width:e.width,height:e.height,bottom:n.y+e.height,right:n.x+e.width});class Vt extends V{constructor(e,t,i,s,r,a){super({pages:[]}),this.spineLayout=e,this.spineItemsManager=t,this.spineItemLocator=i,this.context=s,this.locator=r,this.viewport=a,this.fromSpineItemPageIndex=(c,u)=>this.value.pages.find(l=>l.itemIndex===c.index&&l.pageIndex===u),this.fromAbsolutePageIndex=c=>this.value.pages.reduce((u,l)=>u||(l.absolutePageIndex===c?l:u),void 0),this.observeFromAbsolutePageIndex=c=>this.pipe(o.map(()=>this.fromAbsolutePageIndex(c))),this.layout$=e.layout$.pipe(o.withLatestFrom(a),o.switchMap(([,{pageSize:c}])=>{const u=t.items.reduce((p,d,h)=>{const g=new Array(d.numberOfPages).fill(void 0).map((f,y)=>{const S=i.getSpineItemPositionFromPageIndex({spineItem:d,pageIndex:y}),w=r.getSpinePositionFromSpineItemPosition({spineItem:d,spineItemPosition:S});return{absoluteLayout:Nt({pageSize:c,position:w}),layout:new Qe({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 o.combineLatest(u.map(p=>{const{spineItem:d,...h}=p;return new o.Observable(m=>{const g=p.spineItem.renderer?.getDocumentFrame();let f;g&&g?.contentWindow?.document&&g.contentWindow.document.body!==null&&(f=xt(g.contentWindow.document,p.layout)),m.next({...h,firstVisibleNode:f})})}))}),o.map(c=>($o.info("Pages layout",c),{pages:c})),o.share()),this.layout$.pipe(o.takeUntil(this.destroy$)).subscribe(this.next.bind(this))}}class kt extends R{constructor(e,t){super(),this.spineItemsManager=e,this.spineLocator=t,this.itemIsReady$=this.spineItemsManager.items$.pipe(o.switchMap(i=>{const s=i.map(r=>r.isReady$.pipe(o.map(a=>({item:r,isReady:a}))));return o.merge(...s)}),o.share()),this.itemResize$=this.spineItemsManager.items$.pipe(o.switchMap(i=>{const s=i.map(r=>Z(r.element).pipe(o.map(a=>({entries:a,item:r}))));return o.merge(...s)}),o.share())}}const To=({horizontalOffset:n,verticalOffset:e,context:t,spineItemsManager:i,isGloballyPrePaginated:s,settings:r,index:a,item:c,viewport:u})=>{let l=u.value.pageSize.width,p="none";const d=n%u.absoluteViewport.width===0,h=a===i.items.length-1;if(r.values.computedSpreadMode){!s&&c.renditionLayout==="reflowable"&&!h&&(l=u.value.pageSize.width*2),!s&&c.renditionLayout==="reflowable"&&h&&d&&(l=u.value.pageSize.width*2);const g=d&&h&&s;c.item.pageSpreadRight&&d&&!t.isRTL()||c.item.pageSpreadLeft&&d&&t.isRTL()?(p="before",l=u.value.pageSize.width*2):g&&(t.isRTL()?p="before":p="after",l=u.value.pageSize.width*2)}return c.layout.layout({minimumWidth:l,blankPagePosition:p,spreadPosition:r.values.computedSpreadMode?d?t.isRTL()?"right":"left":t.isRTL()?"left":"right":"none"}).pipe(o.map(({width:g,height:f})=>{if(r.values.computedPageTurnDirection==="vertical"){const w=d?e:e-u.absoluteViewport.height,v=d?0:n;t.isRTL()?c.layout.adjustPositionOfElement({top:w,left:v}):c.layout.adjustPositionOfElement({top:w,left:v});const T=g+v,P=f+w,E=new ee({left:v,right:T,top:w,bottom:P,height:f,width:g,x:v,y:w});return{horizontalOffset:T,verticalOffset:P,layoutPosition:E}}c.layout.adjustPositionOfElement(t.isRTL()?{right:n,top:0}:{left:n,top:0});const y=t.isRTL()?u.absoluteViewport.width-n-g:n,S=new ee({right:t.isRTL()?u.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 Mo extends R{constructor(e,t,i,s){super(),this.spineItemsManager=e,this.context=t,this.settings=i,this.viewport=s,this.layoutSubject=new o.Subject,this.spineItemsRelativeLayouts=[],e.items$.pipe(o.tap(()=>{this.spineItemsRelativeLayouts=[]}),o.switchMap(a=>{const c=a.map(l=>l.needsLayout$.pipe(o.tap(()=>{this.layout()}))),u=a.map(l=>l.loaded$.pipe(o.tap(()=>{l.isUsingVerticalWriting()?this.context.update({hasVerticalWriting:!0}):this.context.update({hasVerticalWriting:!1})})));return o.merge(...c,...u)})).pipe(o.takeUntil(this.destroy$)).subscribe();const r=new o.BehaviorSubject(!1);this.layout$=this.layoutSubject.pipe(o.tap(()=>{this.spineItemsManager.items.forEach(a=>{a.markDirty()})}),o.debounceTime(50),o.exhaustMap(()=>r.pipe(o.filter(a=>!a),o.first())),o.exhaustMap(()=>{r.next(!0);const a=this.context.manifest,c=gt(a)??!1;return o.from(this.spineItemsManager.items).pipe(o.reduce((l,p,d)=>l.pipe(o.concatMap(({horizontalOffset:h,verticalOffset:m})=>To({context:this.context,horizontalOffset:h,index:d,isGloballyPrePaginated:c,item:p,settings:this.settings,spineItemsManager:this.spineItemsManager,verticalOffset:m,viewport:s}).pipe(o.map(({horizontalOffset:g,verticalOffset:f,layoutPosition:y})=>(this.spineItemsRelativeLayouts[d]=y,{horizontalOffset:g,verticalOffset:f}))))),o.of({horizontalOffset:0,verticalOffset:0})),o.concatMap(l=>l),o.finalize(()=>{r.next(!1)}))}),o.share()),o.merge(this.layout$).pipe(o.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 Ut extends R{constructor(e,t,i,s,r,a,c){super(),this.context=e,this.pagination=t,this.spineItemsManager=i,this.spineItemLocator=s,this.settings=r,this.hookManager=a,this.viewport=c,this.elementSubject=new o.BehaviorSubject(void 0),this.element$=this.elementSubject.asObservable(),this.spineLayout=new Mo(i,e,r,c),this.locator=Po({context:e,spineItemsManager:i,spineItemLocator:s,settings:r,spineLayout:this.spineLayout,viewport:c}),this.spineItemsLoader=new fo(this.context,i,this.locator,r,this.spineLayout),this.spineItemsObserver=new kt(i,this.locator),this.pages=new Vt(this.spineLayout,this.spineItemsManager,this.spineItemLocator,this.context,this.locator,this.viewport);const u=e.watch("rootElement").pipe(I.filter(ce.isDefined),I.tap(p=>{const d=p.ownerDocument.createElement("div");d.style.cssText=`
|