@prose-reader/core 1.263.0 → 1.265.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/cfi/parse.d.ts +4 -3
- package/dist/createReaderWithEnhancer.d.ts +3 -9
- package/dist/enhancers/pagination/ResourcesLocator.d.ts +2 -3
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/dist/reader.d.ts +3 -8
- package/package.json +4 -4
package/dist/index.umd.cjs
CHANGED
|
@@ -244,7 +244,7 @@
|
|
|
244
244
|
overflow: hidden;
|
|
245
245
|
max-width: 300px;
|
|
246
246
|
width: 80%;
|
|
247
|
-
`,n.appendChild(t),n.appendChild(i),n},xn=n=>e=>{const{loadingElementCreate:t=Bn}=e,i=n(e),s=u=>o.of(u.reduce((l,{item:d,element:p})=>{p.style.zIndex="0";const h=p.querySelector(`.${et}`);if(h instanceof HTMLElement)return l[d.id]=h,l;const m=t({container:Hn(p,i.viewport),item:d});return p.appendChild(m),l[d.id]=m,l},{})),r=u=>o.combineLatest([i.spine.layout$,i.theme.$.theme$]).pipe(I.map(([,l])=>({width:i.viewport.absoluteViewport.width,theme:l})),I.distinctUntilChanged($.isShallowEqual),I.tap(({width:l,theme:d})=>{Object.values(u).forEach(p=>{p.style.setProperty("max-width",`${l}px`),p.style.setProperty("color",d==="sepia"?"#939393":"rgb(202, 202, 202)")})})),a=u=>i.spineItemsObserver.itemIsReady$.pipe(I.tap(({item:l,isReady:d})=>{u[l.item.id]?.style.setProperty("visibility",d?"hidden":"visible"),u[l.item.id]?.style.setProperty("z-index",d?"0":"1")})),c=i.spineItemsManager.items$.pipe(I.switchMap(u=>s(u)),I.shareReplay(1),I.takeUntil(i.context.destroy$));return c.pipe(I.switchMap(u=>o.merge(r(u),a(u))),I.takeUntil(i.$.destroy$)).subscribe(),{...i,loading:{$:{items$:c}}}};class Yn extends x{getImageElement(){const e=this.documentContainer;if(e instanceof HTMLImageElement)return e}onCreateDocument(){const e=this.containerElement.ownerDocument.createElement("img");return o.from(this.resourcesHandler.getResource()).pipe(o.switchMap(t=>{if(this.setDocumentContainer(e),e.style.objectFit="contain",e.style.userSelect="none",t instanceof URL)return o.of(t.href);if(t instanceof Response)return o.from(t.blob()).pipe(o.map(i=>URL.createObjectURL(i)));throw new Error("Invalid resource")}),o.map(t=>{const i=this.getImageElement();return i&&(i.src=t),e}))}onLoadDocument(){const e=this.getImageElement();if(!e)throw new Error("invalid element");return this.attach(),o.fromEvent(e,"load")}onUnload(){const e=this.getImageElement();return e&&URL.revokeObjectURL(e.src),this.detach(),o.EMPTY}onLayout({spreadPosition:e}){const t=this.getImageElement(),{height:i,width:s}=this.viewport.value.pageSize;let r=i;const a=s;if(!t)return o.of(void 0);const c=t.naturalWidth||1,u=t.naturalHeight||1,l=c/u;return this.settings.values.computedPageTurnDirection==="vertical"&&this.settings.values.computedPageTurnMode==="scrollable"&&!this.settings.values.computedSpreadMode&&(r=Math.ceil(s/l)),t.style.height=`${r}px`,t.style.width=`${a}px`,t.style.objectPosition=e==="left"?"right":e==="right"?"left":"center",o.of({width:a,height:r})}onRenderHeadless(){return o.EMPTY}getDocumentFrame(){}}const Xn=n=>e=>{const t=n({...e,getRenderer(a){const c=e.getRenderer?.(a),l=!!(a.mediaType??$.detectMimeTypeFromName(a.href))?.startsWith("image/");return!c&&l?d=>new Yn(d):c}}),i=new IntersectionObserver(a=>{a.forEach(c=>{const u=c.target,l=Array.from(u.contentDocument?.body.getElementsByTagName("audio")||[]);c.isIntersecting?l.forEach(d=>{d.hasAttribute("autoplay")&&d.paused&&d.readyState>=2&&d.play().catch(console.error)}):l.forEach(d=>{d.pause(),d.currentTime=0})})},{threshold:.01}),s=new IntersectionObserver(a=>{a.forEach(c=>{if(c.target.tagName==="video"){const u=c.target;c.isIntersecting?u.hasAttribute("autoplay")&&u.paused&&u.readyState>=2&&u.play().catch(console.error):(u.pause(),u.currentTime=0)}})},{threshold:.5});return t.hookManager.register("item.onDocumentLoad",({destroy:a,itemId:c})=>{const u=t.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!u)return;i.observe(u);const l=u.contentDocument?.body.getElementsByTagName("video"),d=Array.from(l||[]).map(p=>(s.observe(p),()=>s.unobserve(p)));a(()=>{i.unobserve(u),d.forEach(p=>{p()})})}),{...t,destroy:()=>{i.disconnect(),s.disconnect(),t.destroy()}}},qn=(n,e)=>n.links$.pipe(o.tap(t=>{if(!Ve(t.target,"a")||t.type!=="click")return;const i=new URL(t.target.href),s=`${i.origin}${i.pathname}`;n.context.manifest?.spineItems.some(a=>a.href===s)&&e.goToUrl(i)})),k=L.namespace("navigation"),Gn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:s})=>{let r=new F({x:n.x-i,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y+t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},tt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||i.get(0),u=n;if(!c)return u;const l=s.getSpineItemPositionFromSpinePosition(n,c),d=Gn({position:l,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(d,l)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new M({x:n.x-r.pageSize.width,y:0}):new M({y:n.y-r.pageSize.height,x:0}))},Zn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:u})=>{const l=tt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===l.x)return i.getAdjustedPositionForSpread(l);if(u.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==l.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...l,x:l.x+c.pageSize.width}:{...l,x:l.x-c.pageSize.width}));if(a==="vertical"&&n.y!==l.y)return i.getAdjustedPositionForSpread(l);const d=tt({position:l,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(l)},Jn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:s})=>{let r=new F({x:n.x+i,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y-t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},nt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||i.get(0),u=n;if(!c)return u;const l=s.getSpineItemPositionFromSpinePosition(n,c),d=Jn({position:l,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(d,l)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new U({x:n.x+r.pageSize.width,y:0}):new U({y:n.y+r.pageSize.height,x:0}))},Kn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:u})=>{const l=nt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===l.x)return i.getAdjustedPositionForSpread(l);if(u.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==l.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...l,x:l.x-c.pageSize.width}:{...l,x:l.x+c.pageSize.width}));if(a==="vertical"&&n.y!==l.y)return i.getAdjustedPositionForSpread(l);const d=nt({position:l,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(l)};class Qn{constructor(e){this.reader=e,this.movingLastDelta={x:0,y:0},this.movingLastPosition=new M({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 i=Kn({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:i})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const i=Zn({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:i})}goToCfi(e,t={animate:!0}){return this.reader.navigation.navigate({animation:t.animate?"turn":!1,cfi:e})}goToSpineItem({indexOrId:e,...t}){const i=this.reader.spineItemsManager.get(e);if(i===void 0){k.warn("goToSpineItem",`Ignore navigation to ${e} since the item does not exist`);return}this.reader.navigation.navigate({spineItem:i.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"){k.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"){k.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"){k.warn("You cannot call this navigation method on horizontal direction");return}return this.goToPreviousSpineItem()}goToBottomSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){k.warn("You cannot call this navigation method on horizontal direction");return}return this.goToNextSpineItem()}goToPageOfSpineItem({pageIndex:e,spineItemId:t,...i}){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:t});k.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:t,...i,position:s}),this.reader.navigation.navigate({position:s,...i})}goToAbsolutePageIndex({absolutePageIndex:e,...t}){const i=this.reader.spine.pages.fromAbsolutePageIndex(e);if(k.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...t,foundInfo:i}),i){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:i.pageIndex,spineItemId:i.itemIndex});return this.reader.navigation.navigate({position:s,...t})}}}class V extends o.Observable{constructor(e){super(t=>this.stateSubject.pipe(o.takeUntil(this._destroy$)).subscribe(t)),this._destroy$=new o.Subject,this.destroy$=this._destroy$.asObservable(),this.stateSubject=new o.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(J(e)):this.stateSubject.pipe(o.map(t=>t[e]),o.distinctUntilChanged($.isShallowEqual))}get value(){return this.stateSubject.value}destroy(){this.stateSubject.complete(),this._destroy$.complete()}}class jn extends V{constructor(e){super({lastDelta:{x:0,y:0},lastPosition:new M({x:0,y:0}),lastStartPosition:new M({x:0,y:0}),isStarted:!1}),this.reader=e,this.unlock=void 0}start(e){this.unlock?.(),this.unlock=this.reader.navigation.lock(),this.mergeCompare({isStarted:!0,lastDelta:e,lastStartPosition:this.reader.navigation.controlledNavigationController.viewportPosition,lastPosition:this.reader.navigation.controlledNavigationController.viewportPosition})}stop(e){this.panMoveTo(e),this.mergeCompare({isStarted:!1}),this.unlock?.()}panMoveTo(e){if(this.reader.settings.values.computedPageTurnMode==="scrollable"){k.warn("pan control is not available on free page turn mode");return}if(!this.value.isStarted){k.error("Pan navigator is not started");return}const t=this.reader.settings.values.computedPageTurnDirection;let i=this.reader.navigation.getNavigation().position;if(e){const s=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,r=Math.floor(e.x)-(this.value.lastDelta?.x||0),a=Math.floor(e.y)-(this.value.lastDelta?.y||0),c=Math.floor(t==="horizontal"?this.value.lastPosition.x-r/s:0),u=Math.floor(t==="horizontal"?0:this.value.lastPosition.y-a/s);i=new M({x:c,y:u}),this.mergeCompare({lastDelta:e})}else i=this.value.lastPosition;this.mergeCompare({lastPosition:i}),this.reader.navigation.navigate({position:i,animation:!1})}}const ei=500;class ti extends R{constructor(e,t){super(),this.scrollNavigationController=e,this.locker=t,this.navigationSubject=new o.Subject,this.navigation$=this.navigationSubject.asObservable();const i=this.scrollNavigationController.userScroll$.pipe(o.exhaustMap(s=>{const r=this.locker.lock();return o.merge(this.scrollNavigationController.userScroll$,o.of(s)).pipe(o.debounceTime(ei,o.animationFrameScheduler),o.first(),o.tap(()=>{const a=this.scrollNavigationController.fromScrollPosition(this.scrollNavigationController.scrollPosition);this.navigationSubject.next({animation:!1,type:"scroll",position:a})}),o.finalize(()=>{r()}))}));o.merge(i).pipe(o.takeUntil(this.destroy$)).subscribe()}}const ni=n=>n.pagination.state$.pipe(o.withLatestFrom(n.context.manifest$,n.settings.values$),o.map(([e,{spineItems:t,readingDirection:i},{computedPageTurnDirection:s}])=>{const r=t.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(r-1,0),u=e.endSpineItemIndex===Math.max(r-1,0),l=e.beginSpineItemIndex===0,d=e.beginPageIndexInSpineItem===0,p=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:s==="vertical"?!1:!d,canTurnRight:s==="vertical"?!1:!p,canGoTopSpineItem:s==="vertical"&&!a,canGoBottomSpineItem:s==="vertical"&&!c,canGoLeftSpineItem:s!=="vertical"&&(i==="ltr"&&!a||i==="rtl"&&!u),canGoRightSpineItem:s!=="vertical"&&(i==="ltr"&&!c||i==="rtl"&&!l)}}),o.distinctUntilChanged($.isShallowEqual)),ii=({reader:n,duration:e})=>t=>{let i;const s=()=>{i?.(),i=void 0};return t.pipe(o.tap(()=>{i||(i=n?.navigation.lock())}),o.throttleTime(e,o.animationFrameScheduler,{trailing:!0,leading:!0}),o.tap(s),o.finalize(s))},oi=n=>e=>{const t=n(e),i=ni(t),s=new Qn(t),r=new jn(t),a=new ti(t.navigation.scrollNavigationController,t.navigation.locker),c=qn(t,s),u=a.navigation$.pipe(o.tap(p=>{t.navigation.navigate(p)}));return o.merge(c,u).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,load:p=>{const{cfi:h,...m}=p;t.load(m),h&&s.goToCfi(h,{animate:!1})},destroy:()=>{a.destroy(),t.destroy()},navigation:{...t.navigation,state$:i,throttleLock:({duration:p,trigger:h})=>h.pipe(ii({duration:p,reader:t})),panNavigator: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)}}},it=(n,e,t)=>{const i=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,u=c.substring(0,c.lastIndexOf("/")),l=n.substring(0,n.lastIndexOf("/")),d=n.endsWith(c),p=l!==""&&l.endsWith(u);if(d||p){const m=t.spineItems.findIndex(S=>S.href===r.href);if(i<m)return s;const f={title:r.title,path:r.path},y=it(n,r.contents,t);return y?{...f,subChapter:y}:f}return s},void 0)},si=(n,e)=>{const{href:t}=e;return it(t,n.nav?.toc??[],n)},ri=n=>{const e=n.context.manifest,t=n.spineItemsManager.items;return e?t.reduce((i,{item:s})=>(i[s.id]=si(e,s),i),{}):{}},ai=n=>n.spineItemsManager.items$.pipe(o.startWith([]),o.map(()=>ri(n))),ci=(n,e,t)=>n+e*t,ui=(n,e,t)=>{const{height:i,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)/i)):Math.max(0,Math.min(1,(e.x-a+n.viewport.absoluteViewport.width)/s))},li=(n,e,t,i,s)=>s.isReady$.pipe(o.first(),o.withLatestFrom(n.layoutInfo$),o.map(([r,a])=>{const c=n.context,u=c.manifest?.renditionLayout==="pre-paginated",l=c.manifest?.spineItems.length||0,d=c.manifest?.spineItems.slice(0,e).reduce((S,w)=>S+(w.progressionWeight??0),0)||0,p=n.spineItemsManager.getSpineItemIndex(s)??0,h=n.context.manifest?.spineItems.length??0,m=a.pages.filter(S=>S.itemIndex===p).length??0,g=c.manifest?.spineItems[e]?.progressionWeight??(p+1)/h;let f=(t+1)*(g/m);!u&&s.renditionLayout==="reflowable"&&!r&&(f=0);let y=d+f;return c.manifest?.renditionFlow==="scrolled-continuous"&&(r?f=ui(n,i,s):f=0,y=ci(d,g,f)),e===l-1&&t===m-1&&y>.99?1:y})),di=n=>n.spine.layout$.pipe(o.debounceTime(10,o.animationFrameScheduler),o.withLatestFrom(n.pagination.state$),o.map(()=>({numberOfPagesPerItems:n.spineItemsManager.items.reduce((t,i)=>[...t,i.numberOfPages],[]),numberOfTotalPages:n.spine.pages.value.pages.length})),o.distinctUntilChanged($.isShallowEqual),o.startWith({numberOfPagesPerItems:[],numberOfTotalPages:0})),pi=(n,e,t,i)=>{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 o.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:i,isUsingSpread:n.settings.values.computedSpreadMode??!1})},gi=n=>o.combineLatest([n.pagination.state$,n.layout$]).pipe(o.switchMap(([e])=>{const t=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return t?li(n,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n.navigation.getNavigation().position,t):o.of(0)})),hi=n=>{const e=ai(n),t=di(n),i=new o.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=o.combineLatest([n.pagination.state$,e,gi(n)]).pipe(o.switchMap(([a,c,u])=>pi(n,a,c,u).pipe(o.map(l=>({...a,...l})))),o.distinctUntilChanged($.isShallowEqual));return{paginationInfo$:o.combineLatest([s,t]).pipe(o.map(([a,c])=>({...a,...c,beginAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.beginSpineItemIndex).reduce((u,l)=>u+l,a.beginPageIndexInSpineItem??0),endAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.endSpineItemIndex).reduce((u,l)=>u+l,a.endPageIndexInSpineItem??0)})),o.tap(a=>{i.next(a)}),o.shareReplay(1)),getPaginationInfo:()=>i.value}},H=n=>W.generate({spineIndex:n.index,spineId:n.id}),ot=({nodeOrRange:n,offset:e,item:t})=>{const i="ownerDocument"in n?n.ownerDocument:n.startContainer.ownerDocument;return!i||!i?.documentElement||n===i?H(t):jt(n)?W.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}}):W.generate({node:n,offset:e,spineIndex:t.index,spineId:t.id})},ie=({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?ot({nodeOrRange:s.node,offset:s.offset,item:e.item}).trim():H(e.item)},st=(n,e)=>ot({nodeOrRange:n,item:e}),mi=n=>n.index.toString(),rt=n=>n[0]?.index===6&&n.length>1,oe=n=>{const e=W.parse(n);return W.isIndirectionOnly(e)},fi=n=>Array.isArray(n)?n[0]&&rt(n[0])?n[0]:void 0:n.parent[0]&&rt(n.parent[0])?n.parent[0]:void 0,se=n=>{const e=W.parse(n),r=((fi(e)??[])[1]?.index??2)/2-1,a=W.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}},we=({cfi:n,spineItemsManager:e})=>{const{itemIndex:t,...i}=se(n),s=e.get(t);if(!s)return{...i,itemIndex:t,node:null};const r=s.renderer.getDocumentFrame();if(r instanceof HTMLIFrameElement){const a=r.contentWindow?.document;if(a)try{const c=W.resolve(n,a,{throwOnError:!0});return{...i,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),{...i,spineItem:s,itemIndex:t,node:null}}}return{...i,itemIndex:t,spineItem:s,node:null}},Si=(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 i=H(t.item);return{...n.cfi.parseCfi(i),cfi:H(t.item),itemIndex:t.index,node:null}},at=(n,e)=>{let t=n?.itemPageIndex;const{itemIndex:i,...s}=e.cfi.parseCfi(n.cfi),r=e.spineItemsManager.get(i);return r?fe().pipe(o.withLatestFrom(r.isReady$),o.map(([,a])=>{const{node:c=null,offset:u,range:l}=a?e.cfi.resolveCfi({cfi:n.cfi}):{};r.renditionLayout!=="pre-paginated"&&c&&(t=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,u??0,r)??t);let p=n?.absolutePageIndex;return t===void 0&&(t=0),p=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:t,spineItemOrId:r})??n?.absolutePageIndex,{...n,...s,range:l,itemIndex:i,node:c,startOffset:u,absolutePageIndex:p,itemPageIndex:t}})):o.of({...n,itemIndex:i,...s})};class ct{constructor(e){this.reader=e,this.locatorsByKey=new Map,this.deregisterMemoizedStream=t=>{const i=this.locatorsByKey.get(t);i&&(i.observerCount--,i.observerCount===0&&this.locatorsByKey.delete(t))},this.locate=(t,i)=>{const s={resource:t,meta:Si(this.reader,t)};return Se(()=>{const r=this.reader.spineItemsManager.get(s.meta.itemIndex??0),a=r?.renditionLayout==="reflowable",c=i.mode==="shallow"||!a||!r?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([r.index]),u="cfi"in t?t.cfi:void 0,l=u?this.locatorsByKey.get(u):void 0,d=h=>h.pipe(o.finalize(()=>{u&&this.deregisterMemoizedStream(u),setTimeout(()=>{c()},1e3)}));if(u&&l)return l.observerCount++,d(l.consolidate$.pipe(o.map(({resource:h,meta:m})=>({resource:h,meta:m}))));const p=this.reader.spine.layout$.pipe(o.debounceTime(10),o.startWith(s),o.switchScan(h=>at(h.meta,this.reader).pipe(o.map(m=>({...h,meta:m}))),s),o.shareReplay({refCount:!0,bufferSize:1}));return u&&this.locatorsByKey.set(u,{observerCount:1,consolidate$:p}),d(p)})}}locateResource(e,t){return Array.isArray(e)?Se(()=>o.combineLatest(e.map(i=>this.locate(i,t??{}))).pipe(o.defaultIfEmpty([]))):this.locate(e,t??{})}}const ut=n=>e=>{const t=n(e),{paginationInfo$:i,getPaginationInfo:s}=hi(t);i.pipe(o.takeUntil(t.$.destroy$)).subscribe();const r=new ct(t);return{...t,locateResource:r.locateResource.bind(r),pagination:{...t.pagination,get state(){return s()},get state$(){return i}}}},yi=n=>({put:(r,a)=>new Promise((c,u)=>{const l=n.transaction(["store"],"readwrite");l.onerror=h=>{u(h)},l.oncomplete=()=>{c()};const p=l.objectStore("store").put(a,r);p.onsuccess=()=>{c()},p.onerror=h=>{u(h)}}),keys:()=>new Promise((r,a)=>{const c=n.transaction(["store"],"readonly");c.onerror=p=>{a(p)};const l=c.objectStore("store").openKeyCursor(),d=[];l.onsuccess=()=>{const p=l.result;if(!p){r(d);return}d.push(p.key),p.continue()},l.onerror=()=>{a(l.error)}}),get:r=>new Promise((a,c)=>{const u=n.transaction(["store"],"readwrite"),d=u.objectStore("store").get(r);d.onsuccess=()=>{let p=d.result;p===void 0&&(p=null),a(p)},u.onerror=()=>{c(d.error)}}),remove:r=>new Promise((a,c)=>{const u=n.transaction(["store"],"readwrite"),d=u.objectStore("store").delete(r);u.onerror=()=>{c(d.error)},u.oncomplete=()=>{a()},u.onabort=()=>{const p=d.error?d.error:d.transaction?.error;c(p)}})}),ve=async n=>new Promise((e,t)=>{const i=window.indexedDB.open(n);i.onerror=s=>{t(s)},i.onsuccess=()=>{e(yi(i.result))},i.onupgradeneeded=()=>{i.result.createObjectStore("store")}}),bi=n=>{let e=Date.now().toString();const t=new o.Subject,i=u=>{if(typeof u=="string"||typeof u=="object"){const l=typeof u=="object"?u.id:u;return n.manifest?.spineItems.find(d=>d.id===l)}return n.manifest?.spineItems[u]},s=async(u,l)=>{const d=i(u);if(!d)return new Response("Item not found",{status:404});const h=await(await ve("prose-reader")).get(`${e}_${d.id}`);if(h)return new Response(h,{status:200});const m=l&&await l(d)||await fetch(d.href);return r(d,m.clone()),m},r=(u,l)=>{t.next({id:u,data:l})};t.asObservable().pipe(I.mergeMap(({id:u,data:l})=>{const d=i(u);return d?o.from(o.forkJoin([ve("prose-reader"),o.from(l.blob())])).pipe(I.switchMap(([p,h])=>o.from(p.put(`${e}_${d.id}`,h))),I.catchError(p=>(L.error(p),o.EMPTY))):o.EMPTY}),I.takeUntil(n.destroy$)).subscribe();const a=n.manifest$.pipe(I.tap(()=>{e=Date.now().toString()}));return o.merge(a).pipe(I.switchMap(()=>(L.debug("Cleanup up old cache..."),o.from(ve("prose-reader")).pipe(I.switchMap(u=>o.from(u.keys()).pipe(I.map(l=>l.filter(d=>!d.toString().startsWith(e))),I.switchMap(l=>{const d=l.map(p=>u.remove(p));return o.from(Promise.all(d))}))),I.catchError(u=>(L.error(u),o.EMPTY))))),I.takeUntil(n.destroy$)).subscribe(),{get:s,destroy:()=>{t.complete()}}},Ii=n=>e=>{const t=n(e),i=bi(t.context);return{...t,destroy:()=>{i.destroy(),t.destroy()}}},wi=(n,e)=>{const t=n.node.ownerDocument?.createRange(),i=n.node.compareDocumentPosition(e.node);if(t){try{if(i&Node.DOCUMENT_POSITION_PRECEDING)t.setStart(e.node,e.offset||0),t.setEnd(n.node,n.offset||0);else if(i&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}},vi=({selection:n,spineItem:e})=>{const{anchorNode:t,anchorOffset:i,focusNode:s,focusOffset:r}=n;if(!(!t||!s))try{return wi({node:t,offset:i},{node:s,offset:r})}catch(a){L.warn("Failed to create range from selection",a,{selection:n,spineItem:e});return}};class Pi extends R{constructor(e){super();const t=e.contentDocument||e.contentWindow?.document;if(!t)this.selectionChange$=o.NEVER,this.selectionOver$=o.NEVER;else{const i=ye(t.body,{childList:!0,subtree:!0}).pipe(o.filter(r=>!!r.find(a=>a.type==="childList"&&a.removedNodes.length))),s=e.parentElement?ye(e.parentElement,{childList:!0}).pipe(o.filter(r=>!!r.find(a=>Array.from(a.removedNodes).includes(e)))):o.of(null);this.selectionChange$=o.merge(o.fromEvent(t,"selectionchange"),i).pipe(o.map(()=>t.getSelection()),o.takeUntil(o.merge(s,this.destroy$)),o.endWith(null)),this.selectionOver$=o.fromEvent(t,"pointerdown").pipe(o.switchMap(()=>o.merge(o.fromEvent(t,"pointerup"),o.fromEvent(t,"pointercancel"),o.fromEvent(t,"contextmenu")).pipe(o.first(),o.delay(0),o.map(r=>{const a=t.getSelection();return a&&!a.isCollapsed?[r,a]:void 0}),o.filter(O))),o.takeUntil(o.merge(s,this.destroy$)))}}}const $i=n=>n.watch("isLoaded").pipe(o.switchMap(()=>{const e=n.renderer.getDocumentFrame(),t=e?.contentDocument||e?.contentWindow?.document;if(!e||!t)return o.NEVER;const i=new Pi(e);return o.merge(i.selectionChange$.pipe(o.map(s=>{if(s?.toString())return{type:"change",selection:s}})),i.selectionOver$.pipe(o.map(([s,r])=>({type:"over",event:s,selection:r})))).pipe(o.takeUntil(n.unloaded$),o.endWith(void 0),o.finalize(()=>{i.destroy()}))}),o.distinctUntilChanged()),Ti=n=>e=>{const t=n(e);let i;const s=t.spineItemsManager.items$.pipe(o.switchMap(d=>{const p=d.map(h=>{const m=t.spineItemsManager.getSpineItemIndex(h)??0;return $i(h).pipe(o.map(g=>{if(g)return{...g,itemIndex:m}}))});return o.merge(...p)}),o.startWith(void 0),o.distinctUntilChanged(),o.tap(d=>{i=d}),o.shareReplay({refCount:!0,bufferSize:1})),r=s,a=s.pipe(o.map(d=>!!d),o.distinctUntilChanged(),o.filter(d=>d),o.share()),c=a.pipe(o.switchMap(()=>r),o.distinctUntilChanged(),o.filter(d=>!d),o.share()),u=s.pipe(o.filter(d=>d?.type==="over"),o.share()),l=t.context.watch("rootElement").pipe(o.filter(O),o.switchMap(d=>o.fromEvent(d,"pointerdown")),o.withLatestFrom(r),o.map(([,d])=>d),o.startWith(void 0),o.shareReplay({refCount:!0,bufferSize:1}));return o.merge(r,l).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,selection:{selection$:r,selectionStart$:a,selectionEnd$:c,selectionOver$:u,lastSelectionOnPointerdown$:l,getSelection:()=>i,createOrderedRangeFromSelection:vi}}},lt=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],Mi=n=>e=>{const t=n(e),i=new o.BehaviorSubject(e.theme??"bright"),s=()=>{const c=lt.find(u=>u.name===i.value);return`
|
|
247
|
+
`,n.appendChild(t),n.appendChild(i),n},xn=n=>e=>{const{loadingElementCreate:t=Bn}=e,i=n(e),s=u=>o.of(u.reduce((l,{item:d,element:p})=>{p.style.zIndex="0";const h=p.querySelector(`.${et}`);if(h instanceof HTMLElement)return l[d.id]=h,l;const m=t({container:Hn(p,i.viewport),item:d});return p.appendChild(m),l[d.id]=m,l},{})),r=u=>o.combineLatest([i.spine.layout$,i.theme.$.theme$]).pipe(I.map(([,l])=>({width:i.viewport.absoluteViewport.width,theme:l})),I.distinctUntilChanged($.isShallowEqual),I.tap(({width:l,theme:d})=>{Object.values(u).forEach(p=>{p.style.setProperty("max-width",`${l}px`),p.style.setProperty("color",d==="sepia"?"#939393":"rgb(202, 202, 202)")})})),a=u=>i.spineItemsObserver.itemIsReady$.pipe(I.tap(({item:l,isReady:d})=>{u[l.item.id]?.style.setProperty("visibility",d?"hidden":"visible"),u[l.item.id]?.style.setProperty("z-index",d?"0":"1")})),c=i.spineItemsManager.items$.pipe(I.switchMap(u=>s(u)),I.shareReplay(1),I.takeUntil(i.context.destroy$));return c.pipe(I.switchMap(u=>o.merge(r(u),a(u))),I.takeUntil(i.$.destroy$)).subscribe(),{...i,loading:{$:{items$:c}}}};class Yn extends x{getImageElement(){const e=this.documentContainer;if(e instanceof HTMLImageElement)return e}onCreateDocument(){const e=this.containerElement.ownerDocument.createElement("img");return o.from(this.resourcesHandler.getResource()).pipe(o.switchMap(t=>{if(this.setDocumentContainer(e),e.style.objectFit="contain",e.style.userSelect="none",t instanceof URL)return o.of(t.href);if(t instanceof Response)return o.from(t.blob()).pipe(o.map(i=>URL.createObjectURL(i)));throw new Error("Invalid resource")}),o.map(t=>{const i=this.getImageElement();return i&&(i.src=t),e}))}onLoadDocument(){const e=this.getImageElement();if(!e)throw new Error("invalid element");return this.attach(),o.fromEvent(e,"load")}onUnload(){const e=this.getImageElement();return e&&URL.revokeObjectURL(e.src),this.detach(),o.EMPTY}onLayout({spreadPosition:e}){const t=this.getImageElement(),{height:i,width:s}=this.viewport.value.pageSize;let r=i;const a=s;if(!t)return o.of(void 0);const c=t.naturalWidth||1,u=t.naturalHeight||1,l=c/u;return this.settings.values.computedPageTurnDirection==="vertical"&&this.settings.values.computedPageTurnMode==="scrollable"&&!this.settings.values.computedSpreadMode&&(r=Math.ceil(s/l)),t.style.height=`${r}px`,t.style.width=`${a}px`,t.style.objectPosition=e==="left"?"right":e==="right"?"left":"center",o.of({width:a,height:r})}onRenderHeadless(){return o.EMPTY}getDocumentFrame(){}}const Xn=n=>e=>{const t=n({...e,getRenderer(a){const c=e.getRenderer?.(a),l=!!(a.mediaType??$.detectMimeTypeFromName(a.href))?.startsWith("image/");return!c&&l?d=>new Yn(d):c}}),i=new IntersectionObserver(a=>{a.forEach(c=>{const u=c.target,l=Array.from(u.contentDocument?.body.getElementsByTagName("audio")||[]);c.isIntersecting?l.forEach(d=>{d.hasAttribute("autoplay")&&d.paused&&d.readyState>=2&&d.play().catch(console.error)}):l.forEach(d=>{d.pause(),d.currentTime=0})})},{threshold:.01}),s=new IntersectionObserver(a=>{a.forEach(c=>{if(c.target.tagName==="video"){const u=c.target;c.isIntersecting?u.hasAttribute("autoplay")&&u.paused&&u.readyState>=2&&u.play().catch(console.error):(u.pause(),u.currentTime=0)}})},{threshold:.5});return t.hookManager.register("item.onDocumentLoad",({destroy:a,itemId:c})=>{const u=t.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!u)return;i.observe(u);const l=u.contentDocument?.body.getElementsByTagName("video"),d=Array.from(l||[]).map(p=>(s.observe(p),()=>s.unobserve(p)));a(()=>{i.unobserve(u),d.forEach(p=>{p()})})}),{...t,destroy:()=>{i.disconnect(),s.disconnect(),t.destroy()}}},qn=(n,e)=>n.links$.pipe(o.tap(t=>{if(!Ve(t.target,"a")||t.type!=="click")return;const i=new URL(t.target.href),s=`${i.origin}${i.pathname}`;n.context.manifest?.spineItems.some(a=>a.href===s)&&e.goToUrl(i)})),k=L.namespace("navigation"),Gn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:s})=>{let r=new F({x:n.x-i,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y+t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},tt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||i.get(0),u=n;if(!c)return u;const l=s.getSpineItemPositionFromSpinePosition(n,c),d=Gn({position:l,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(d,l)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new M({x:n.x-r.pageSize.width,y:0}):new M({y:n.y-r.pageSize.height,x:0}))},Zn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:u})=>{const l=tt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===l.x)return i.getAdjustedPositionForSpread(l);if(u.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==l.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...l,x:l.x+c.pageSize.width}:{...l,x:l.x-c.pageSize.width}));if(a==="vertical"&&n.y!==l.y)return i.getAdjustedPositionForSpread(l);const d=tt({position:l,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(l)},Jn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:s})=>{let r=new F({x:n.x+i,y:n.y});return e.isUsingVerticalWriting()&&(r=new F({x:n.x,y:n.y-t})),s.getSpineItemClosestPositionFromUnsafePosition(r,e)},nt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:s,viewport:r})=>{const a=t,c=s.getSpineItemFromPosition(n)||i.get(0),u=n;if(!c)return u;const l=s.getSpineItemPositionFromSpinePosition(n,c),d=Jn({position:l,spineItem:c,pageHeight:r.pageSize.height,pageWidth:r.pageSize.width,spineItemLocator:s.spineItemLocator});return e.arePositionsDifferent(d,l)?s.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new U({x:n.x+r.pageSize.width,y:0}):new U({y:n.y+r.pageSize.height,x:0}))},Kn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:s,spineLocator:r,computedPageTurnDirection:a,viewport:c,settings:u})=>{const l=nt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});if(e?.isUsingVerticalWriting()&&n.x===l.x)return i.getAdjustedPositionForSpread(l);if(u.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==l.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...l,x:l.x-c.pageSize.width}:{...l,x:l.x+c.pageSize.width}));if(a==="vertical"&&n.y!==l.y)return i.getAdjustedPositionForSpread(l);const d=nt({position:l,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:s,spineLocator:r});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(l)};class Qn{constructor(e){this.reader=e,this.movingLastDelta={x:0,y:0},this.movingLastPosition=new M({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 i=Kn({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:i})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const i=Zn({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:i})}goToCfi(e,t={animate:!0}){return this.reader.navigation.navigate({animation:t.animate?"turn":!1,cfi:e})}goToSpineItem({indexOrId:e,...t}){const i=this.reader.spineItemsManager.get(e);if(i===void 0){k.warn("goToSpineItem",`Ignore navigation to ${e} since the item does not exist`);return}this.reader.navigation.navigate({spineItem:i.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"){k.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"){k.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"){k.warn("You cannot call this navigation method on horizontal direction");return}return this.goToPreviousSpineItem()}goToBottomSpineItem(){if(this.reader.settings.values.computedPageTurnDirection==="horizontal"){k.warn("You cannot call this navigation method on horizontal direction");return}return this.goToNextSpineItem()}goToPageOfSpineItem({pageIndex:e,spineItemId:t,...i}){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:t});k.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:t,...i,position:s}),this.reader.navigation.navigate({position:s,...i})}goToAbsolutePageIndex({absolutePageIndex:e,...t}){const i=this.reader.spine.pages.fromAbsolutePageIndex(e);if(k.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...t,foundInfo:i}),i){const s=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:i.pageIndex,spineItemId:i.itemIndex});return this.reader.navigation.navigate({position:s,...t})}}}class V extends o.Observable{constructor(e){super(t=>this.stateSubject.pipe(o.takeUntil(this._destroy$)).subscribe(t)),this._destroy$=new o.Subject,this.destroy$=this._destroy$.asObservable(),this.stateSubject=new o.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(J(e)):this.stateSubject.pipe(o.map(t=>t[e]),o.distinctUntilChanged($.isShallowEqual))}get value(){return this.stateSubject.value}destroy(){this.stateSubject.complete(),this._destroy$.complete()}}class jn extends V{constructor(e){super({lastDelta:{x:0,y:0},lastPosition:new M({x:0,y:0}),lastStartPosition:new M({x:0,y:0}),isStarted:!1}),this.reader=e,this.unlock=void 0}start(e){this.unlock?.(),this.unlock=this.reader.navigation.lock(),this.mergeCompare({isStarted:!0,lastDelta:e,lastStartPosition:this.reader.navigation.controlledNavigationController.viewportPosition,lastPosition:this.reader.navigation.controlledNavigationController.viewportPosition})}stop(e){this.panMoveTo(e),this.mergeCompare({isStarted:!1}),this.unlock?.()}panMoveTo(e){if(this.reader.settings.values.computedPageTurnMode==="scrollable"){k.warn("pan control is not available on free page turn mode");return}if(!this.value.isStarted){k.error("Pan navigator is not started");return}const t=this.reader.settings.values.computedPageTurnDirection;let i=this.reader.navigation.getNavigation().position;if(e){const s=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,r=Math.floor(e.x)-(this.value.lastDelta?.x||0),a=Math.floor(e.y)-(this.value.lastDelta?.y||0),c=Math.floor(t==="horizontal"?this.value.lastPosition.x-r/s:0),u=Math.floor(t==="horizontal"?0:this.value.lastPosition.y-a/s);i=new M({x:c,y:u}),this.mergeCompare({lastDelta:e})}else i=this.value.lastPosition;this.mergeCompare({lastPosition:i}),this.reader.navigation.navigate({position:i,animation:!1})}}const ei=500;class ti extends R{constructor(e,t){super(),this.scrollNavigationController=e,this.locker=t,this.navigationSubject=new o.Subject,this.navigation$=this.navigationSubject.asObservable();const i=this.scrollNavigationController.userScroll$.pipe(o.exhaustMap(s=>{const r=this.locker.lock();return o.merge(this.scrollNavigationController.userScroll$,o.of(s)).pipe(o.debounceTime(ei,o.animationFrameScheduler),o.first(),o.tap(()=>{const a=this.scrollNavigationController.fromScrollPosition(this.scrollNavigationController.scrollPosition);this.navigationSubject.next({animation:!1,type:"scroll",position:a})}),o.finalize(()=>{r()}))}));o.merge(i).pipe(o.takeUntil(this.destroy$)).subscribe()}}const ni=n=>n.pagination.state$.pipe(o.withLatestFrom(n.context.manifest$,n.settings.values$),o.map(([e,{spineItems:t,readingDirection:i},{computedPageTurnDirection:s}])=>{const r=t.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(r-1,0),u=e.endSpineItemIndex===Math.max(r-1,0),l=e.beginSpineItemIndex===0,d=e.beginPageIndexInSpineItem===0,p=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:s==="vertical"?!1:!d,canTurnRight:s==="vertical"?!1:!p,canGoTopSpineItem:s==="vertical"&&!a,canGoBottomSpineItem:s==="vertical"&&!c,canGoLeftSpineItem:s!=="vertical"&&(i==="ltr"&&!a||i==="rtl"&&!u),canGoRightSpineItem:s!=="vertical"&&(i==="ltr"&&!c||i==="rtl"&&!l)}}),o.distinctUntilChanged($.isShallowEqual)),ii=({reader:n,duration:e})=>t=>{let i;const s=()=>{i?.(),i=void 0};return t.pipe(o.tap(()=>{i||(i=n?.navigation.lock())}),o.throttleTime(e,o.animationFrameScheduler,{trailing:!0,leading:!0}),o.tap(s),o.finalize(s))},oi=n=>e=>{const t=n(e),i=ni(t),s=new Qn(t),r=new jn(t),a=new ti(t.navigation.scrollNavigationController,t.navigation.locker),c=qn(t,s),u=a.navigation$.pipe(o.tap(p=>{t.navigation.navigate(p)}));return o.merge(c,u).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,load:p=>{const{cfi:h,...m}=p;t.load(m),h&&s.goToCfi(h,{animate:!1})},destroy:()=>{a.destroy(),t.destroy()},navigation:{...t.navigation,state$:i,throttleLock:({duration:p,trigger:h})=>h.pipe(ii({duration:p,reader:t})),panNavigator: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)}}},it=(n,e,t)=>{const i=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,u=c.substring(0,c.lastIndexOf("/")),l=n.substring(0,n.lastIndexOf("/")),d=n.endsWith(c),p=l!==""&&l.endsWith(u);if(d||p){const m=t.spineItems.findIndex(S=>S.href===r.href);if(i<m)return s;const f={title:r.title,path:r.path},y=it(n,r.contents,t);return y?{...f,subChapter:y}:f}return s},void 0)},si=(n,e)=>{const{href:t}=e;return it(t,n.nav?.toc??[],n)},ri=n=>{const e=n.context.manifest,t=n.spineItemsManager.items;return e?t.reduce((i,{item:s})=>(i[s.id]=si(e,s),i),{}):{}},ai=n=>n.spineItemsManager.items$.pipe(o.startWith([]),o.map(()=>ri(n))),ci=(n,e,t)=>n+e*t,ui=(n,e,t)=>{const{height:i,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)/i)):Math.max(0,Math.min(1,(e.x-a+n.viewport.absoluteViewport.width)/s))},li=(n,e,t,i,s)=>s.isReady$.pipe(o.first(),o.withLatestFrom(n.layoutInfo$),o.map(([r,a])=>{const c=n.context,u=c.manifest?.renditionLayout==="pre-paginated",l=c.manifest?.spineItems.length||0,d=c.manifest?.spineItems.slice(0,e).reduce((S,w)=>S+(w.progressionWeight??0),0)||0,p=n.spineItemsManager.getSpineItemIndex(s)??0,h=n.context.manifest?.spineItems.length??0,m=a.pages.filter(S=>S.itemIndex===p).length??0,g=c.manifest?.spineItems[e]?.progressionWeight??(p+1)/h;let f=(t+1)*(g/m);!u&&s.renditionLayout==="reflowable"&&!r&&(f=0);let y=d+f;return c.manifest?.renditionFlow==="scrolled-continuous"&&(r?f=ui(n,i,s):f=0,y=ci(d,g,f)),e===l-1&&t===m-1&&y>.99?1:y})),di=n=>n.spine.layout$.pipe(o.debounceTime(10,o.animationFrameScheduler),o.withLatestFrom(n.pagination.state$),o.map(()=>({numberOfPagesPerItems:n.spineItemsManager.items.reduce((t,i)=>[...t,i.numberOfPages],[]),numberOfTotalPages:n.spine.pages.value.pages.length})),o.distinctUntilChanged($.isShallowEqual),o.startWith({numberOfPagesPerItems:[],numberOfTotalPages:0})),pi=(n,e,t,i)=>{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 o.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:i,isUsingSpread:n.settings.values.computedSpreadMode??!1})},gi=n=>o.combineLatest([n.pagination.state$,n.layout$]).pipe(o.switchMap(([e])=>{const t=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return t?li(n,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n.navigation.getNavigation().position,t):o.of(0)})),hi=n=>{const e=ai(n),t=di(n),i=new o.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=o.combineLatest([n.pagination.state$,e,gi(n)]).pipe(o.switchMap(([a,c,u])=>pi(n,a,c,u).pipe(o.map(l=>({...a,...l})))),o.distinctUntilChanged($.isShallowEqual));return{paginationInfo$:o.combineLatest([s,t]).pipe(o.map(([a,c])=>({...a,...c,beginAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.beginSpineItemIndex).reduce((u,l)=>u+l,a.beginPageIndexInSpineItem??0),endAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.endSpineItemIndex).reduce((u,l)=>u+l,a.endPageIndexInSpineItem??0)})),o.tap(a=>{i.next(a)}),o.shareReplay(1)),getPaginationInfo:()=>i.value}},H=n=>W.generate({spineIndex:n.index,spineId:n.id}),ot=({nodeOrRange:n,offset:e,item:t})=>{const i="ownerDocument"in n?n.ownerDocument:n.startContainer.ownerDocument;return!i||!i?.documentElement||n===i?H(t):jt(n)?W.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}}):W.generate({node:n,offset:e,spineIndex:t.index,spineId:t.id})},ie=({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?ot({nodeOrRange:s.node,offset:s.offset,item:e.item}).trim():H(e.item)},st=(n,e)=>ot({nodeOrRange:n,item:e}),mi=n=>n.index.toString(),rt=n=>n[0]?.index===6&&n.length>1,oe=n=>{const e=W.parse(n);return W.isIndirectionOnly(e)},fi=n=>Array.isArray(n)?n[0]&&rt(n[0])?n[0]:void 0:n.parent[0]&&rt(n.parent[0])?n.parent[0]:void 0,se=n=>{const e=W.parse(n),r=((fi(e)??[])[1]?.index??2)/2-1,a=W.isParsedCfiRange(e),c=a?e.end.at(-1)?.at(-1)?.offset:e.at(-1)?.at(-1)?.offset;return{isCfiRange:a,itemIndex:r,offset:c??0}},we=({cfi:n,spineItemsManager:e})=>{const{itemIndex:t,...i}=se(n),s=e.get(t);if(!s)return{...i,itemIndex:t,node:null};const r=s.renderer.getDocumentFrame();if(r instanceof HTMLIFrameElement){const a=r.contentWindow?.document;if(a)try{const c=W.resolve(n,a,{throwOnError:!0});return{...i,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),{...i,spineItem:s,itemIndex:t,node:null}}}return{...i,itemIndex:t,spineItem:s,node:null}},Si=(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 i=H(t.item);return{...n.cfi.parseCfi(i),cfi:H(t.item),itemIndex:t.index,node:null}},at=(n,e)=>{let t=n?.itemPageIndex;const{itemIndex:i,...s}=e.cfi.parseCfi(n.cfi),r=e.spineItemsManager.get(i);return r?fe().pipe(o.withLatestFrom(r.isReady$),o.map(([,a])=>{const{node:c=null,offset:u,range:l}=a?e.cfi.resolveCfi({cfi:n.cfi}):{};r.renditionLayout!=="pre-paginated"&&c&&(t=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,u??0,r)??t);let p=n?.absolutePageIndex;return t===void 0&&(t=0),p=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:t,spineItemOrId:r})??n?.absolutePageIndex,{...n,...s,range:l,itemIndex:i,node:c,startOffset:u,absolutePageIndex:p,itemPageIndex:t}})):o.of({...n,itemIndex:i,...s})};class ct{constructor(e){this.reader=e,this.locatorsByKey=new Map,this.deregisterMemoizedStream=t=>{const i=this.locatorsByKey.get(t);i&&(i.observerCount--,i.observerCount===0&&this.locatorsByKey.delete(t))},this.locate=(t,i)=>{const s={resource:t,meta:Si(this.reader,t)};return Se(()=>{const r=this.reader.spineItemsManager.get(s.meta.itemIndex??0),a=r?.renditionLayout==="reflowable",c=i.mode==="shallow"||!a||!r?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([r.index]),u="cfi"in t?t.cfi:void 0,l=u?this.locatorsByKey.get(u):void 0,d=h=>h.pipe(o.finalize(()=>{u&&this.deregisterMemoizedStream(u),setTimeout(()=>{c()},1e3)}));if(u&&l)return l.observerCount++,d(l.consolidate$.pipe(o.map(({resource:h,meta:m})=>({resource:h,meta:m}))));const p=this.reader.spine.layout$.pipe(o.debounceTime(10),o.startWith(s),o.switchScan(h=>at(h.meta,this.reader).pipe(o.map(m=>({...h,meta:m}))),s),o.shareReplay({refCount:!0,bufferSize:1}));return u&&this.locatorsByKey.set(u,{observerCount:1,consolidate$:p}),d(p)})}}locateResource(e,t){return Array.isArray(e)?Se(()=>o.combineLatest(e.map(i=>this.locate(i,t??{}))).pipe(o.defaultIfEmpty([]))):this.locate(e,t??{})}}const ut=n=>e=>{const t=n(e),{paginationInfo$:i,getPaginationInfo:s}=hi(t);i.pipe(o.takeUntil(t.$.destroy$)).subscribe();const r=new ct(t);return{...t,locateResource:r.locateResource.bind(r),pagination:{...t.pagination,get state(){return s()},get state$(){return i}}}},yi=n=>({put:(r,a)=>new Promise((c,u)=>{const l=n.transaction(["store"],"readwrite");l.onerror=h=>{u(h)},l.oncomplete=()=>{c()};const p=l.objectStore("store").put(a,r);p.onsuccess=()=>{c()},p.onerror=h=>{u(h)}}),keys:()=>new Promise((r,a)=>{const c=n.transaction(["store"],"readonly");c.onerror=p=>{a(p)};const l=c.objectStore("store").openKeyCursor(),d=[];l.onsuccess=()=>{const p=l.result;if(!p){r(d);return}d.push(p.key),p.continue()},l.onerror=()=>{a(l.error)}}),get:r=>new Promise((a,c)=>{const u=n.transaction(["store"],"readwrite"),d=u.objectStore("store").get(r);d.onsuccess=()=>{let p=d.result;p===void 0&&(p=null),a(p)},u.onerror=()=>{c(d.error)}}),remove:r=>new Promise((a,c)=>{const u=n.transaction(["store"],"readwrite"),d=u.objectStore("store").delete(r);u.onerror=()=>{c(d.error)},u.oncomplete=()=>{a()},u.onabort=()=>{const p=d.error?d.error:d.transaction?.error;c(p)}})}),ve=async n=>new Promise((e,t)=>{const i=window.indexedDB.open(n);i.onerror=s=>{t(s)},i.onsuccess=()=>{e(yi(i.result))},i.onupgradeneeded=()=>{i.result.createObjectStore("store")}}),bi=n=>{let e=Date.now().toString();const t=new o.Subject,i=u=>{if(typeof u=="string"||typeof u=="object"){const l=typeof u=="object"?u.id:u;return n.manifest?.spineItems.find(d=>d.id===l)}return n.manifest?.spineItems[u]},s=async(u,l)=>{const d=i(u);if(!d)return new Response("Item not found",{status:404});const h=await(await ve("prose-reader")).get(`${e}_${d.id}`);if(h)return new Response(h,{status:200});const m=l&&await l(d)||await fetch(d.href);return r(d,m.clone()),m},r=(u,l)=>{t.next({id:u,data:l})};t.asObservable().pipe(I.mergeMap(({id:u,data:l})=>{const d=i(u);return d?o.from(o.forkJoin([ve("prose-reader"),o.from(l.blob())])).pipe(I.switchMap(([p,h])=>o.from(p.put(`${e}_${d.id}`,h))),I.catchError(p=>(L.error(p),o.EMPTY))):o.EMPTY}),I.takeUntil(n.destroy$)).subscribe();const a=n.manifest$.pipe(I.tap(()=>{e=Date.now().toString()}));return o.merge(a).pipe(I.switchMap(()=>(L.debug("Cleanup up old cache..."),o.from(ve("prose-reader")).pipe(I.switchMap(u=>o.from(u.keys()).pipe(I.map(l=>l.filter(d=>!d.toString().startsWith(e))),I.switchMap(l=>{const d=l.map(p=>u.remove(p));return o.from(Promise.all(d))}))),I.catchError(u=>(L.error(u),o.EMPTY))))),I.takeUntil(n.destroy$)).subscribe(),{get:s,destroy:()=>{t.complete()}}},Ii=n=>e=>{const t=n(e),i=bi(t.context);return{...t,destroy:()=>{i.destroy(),t.destroy()}}},wi=(n,e)=>{const t=n.node.ownerDocument?.createRange(),i=n.node.compareDocumentPosition(e.node);if(t){try{if(i&Node.DOCUMENT_POSITION_PRECEDING)t.setStart(e.node,e.offset||0),t.setEnd(n.node,n.offset||0);else if(i&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}},vi=({selection:n,spineItem:e})=>{const{anchorNode:t,anchorOffset:i,focusNode:s,focusOffset:r}=n;if(!(!t||!s))try{return wi({node:t,offset:i},{node:s,offset:r})}catch(a){L.warn("Failed to create range from selection",a,{selection:n,spineItem:e});return}};class Pi extends R{constructor(e){super();const t=e.contentDocument||e.contentWindow?.document;if(!t)this.selectionChange$=o.NEVER,this.selectionOver$=o.NEVER;else{const i=ye(t.body,{childList:!0,subtree:!0}).pipe(o.filter(r=>!!r.find(a=>a.type==="childList"&&a.removedNodes.length))),s=e.parentElement?ye(e.parentElement,{childList:!0}).pipe(o.filter(r=>!!r.find(a=>Array.from(a.removedNodes).includes(e)))):o.of(null);this.selectionChange$=o.merge(o.fromEvent(t,"selectionchange"),i).pipe(o.map(()=>t.getSelection()),o.takeUntil(o.merge(s,this.destroy$)),o.endWith(null)),this.selectionOver$=o.fromEvent(t,"pointerdown").pipe(o.switchMap(()=>o.merge(o.fromEvent(t,"pointerup"),o.fromEvent(t,"pointercancel"),o.fromEvent(t,"contextmenu")).pipe(o.first(),o.delay(0),o.map(r=>{const a=t.getSelection();return a&&!a.isCollapsed?[r,a]:void 0}),o.filter(O))),o.takeUntil(o.merge(s,this.destroy$)))}}}const $i=n=>n.watch("isLoaded").pipe(o.switchMap(()=>{const e=n.renderer.getDocumentFrame(),t=e?.contentDocument||e?.contentWindow?.document;if(!e||!t)return o.NEVER;const i=new Pi(e);return o.merge(i.selectionChange$.pipe(o.map(s=>{if(s?.toString())return{type:"change",selection:s}})),i.selectionOver$.pipe(o.map(([s,r])=>({type:"over",event:s,selection:r})))).pipe(o.takeUntil(n.unloaded$),o.endWith(void 0),o.finalize(()=>{i.destroy()}))}),o.distinctUntilChanged()),Ti=n=>e=>{const t=n(e);let i;const s=t.spineItemsManager.items$.pipe(o.switchMap(d=>{const p=d.map(h=>{const m=t.spineItemsManager.getSpineItemIndex(h)??0;return $i(h).pipe(o.map(g=>{if(g)return{...g,itemIndex:m}}))});return o.merge(...p)}),o.startWith(void 0),o.distinctUntilChanged(),o.tap(d=>{i=d}),o.shareReplay({refCount:!0,bufferSize:1})),r=s,a=s.pipe(o.map(d=>!!d),o.distinctUntilChanged(),o.filter(d=>d),o.share()),c=a.pipe(o.switchMap(()=>r),o.distinctUntilChanged(),o.filter(d=>!d),o.share()),u=s.pipe(o.filter(d=>d?.type==="over"),o.share()),l=t.context.watch("rootElement").pipe(o.filter(O),o.switchMap(d=>o.fromEvent(d,"pointerdown")),o.withLatestFrom(r),o.map(([,d])=>d),o.startWith(void 0),o.shareReplay({refCount:!0,bufferSize:1}));return o.merge(r,l).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,selection:{selection$:r,selectionStart$:a,selectionEnd$:c,selectionOver$:u,lastSelectionOnPointerdown$:l,getSelection:()=>i,createOrderedRangeFromSelection:vi}}},lt=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],Mi=n=>e=>{const t=n(e),i=new o.BehaviorSubject(e.theme??"bright"),s=()=>{const c=lt.find(u=>u.name===i.value);return`
|
|
248
248
|
body {
|
|
249
249
|
${c!==void 0?`background-color: ${c.backgroundColor} !important;`:""}
|
|
250
250
|
}
|