@prose-reader/core 1.274.0 → 1.275.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.
@@ -200,7 +200,7 @@
200
200
  td {
201
201
  max-width: ${F}px;
202
202
  }
203
- `)}}),zn(a),kn(a),a.hookManager.register("item.onDocumentCreated",({documentContainer:f})=>{f.style.opacity="0",c.values.layoutLayerTransition&&(f.style.transition="opacity 300ms")}),a.hookManager.register("item.onBeforeLayout",({item:f})=>{const S=a.spineItemsManager.get(f.id)?.renderer.documentContainer;a.settings.values.computedPageTurnMode!=="scrollable"&&S?.setAttribute("tab-index","0")});const l=a.spineItemsObserver.states$.pipe(I.filter(({isReady:f})=>f),I.tap(({item:f})=>{const y=f.renderer.documentContainer;y&&(y.style.opacity="1")})),u=c.values$.pipe(I.filter(({layoutAutoResize:f})=>f==="container"),I.switchMap(()=>a.context.watch("rootElement")),I.filter(O),I.switchMap(f=>Q(f)),I.debounceTime(100),I.filter(O),I.tap(()=>{a?.layout()})),d=On(a);c.watch(["pageHorizontalMargin","pageVerticalMargin"]).pipe(I.skip(1),I.tap(()=>{a.layout()}),I.takeUntil(a.$.destroy$)).subscribe();const p=a.spine.pages.pipe(I.shareReplay({refCount:!0,bufferSize:1})),m=Wn(a),g=Hn(a),h=Un(a);return o.merge(l,d,u,p,m,g,h).pipe(I.takeUntil(a.$.destroy$)).subscribe(),{...a,destroy:()=>{c.destroy(),a.destroy()},settings:c,layout$:a.spine.layout$,layoutInfo$:p,coordinates:Nn(a)}};class Bn extends Y{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:r}=this.viewport.value.pageSize;let s=i;const a=r;if(!t)return o.of(void 0);const c=t.naturalWidth||1,l=t.naturalHeight||1,u=c/l;return this.settings.values.computedPageTurnDirection==="vertical"&&this.settings.values.computedPageTurnMode==="scrollable"&&!this.settings.values.computedSpreadMode&&(s=Math.ceil(r/u)),t.style.height=`${s}px`,t.style.width=`${a}px`,t.style.objectPosition=e==="left"?"right":e==="right"?"left":"center",o.of({width:a,height:s})}onRenderHeadless(){return o.EMPTY}getDocumentFrame(){}}const xn=n=>e=>{const t=n({...e,getRenderer(a){const c=e.getRenderer?.(a),u=!!(a.mediaType??$.detectMimeTypeFromName(a.href))?.startsWith("image/");return!c&&u?d=>new Bn(d):c}}),i=new IntersectionObserver(a=>{a.forEach(c=>{const l=c.target,u=Array.from(l.contentDocument?.body.getElementsByTagName("audio")||[]);c.isIntersecting?u.forEach(d=>{d.hasAttribute("autoplay")&&d.paused&&d.readyState>=2&&d.play().catch(console.error)}):u.forEach(d=>{d.pause(),d.currentTime=0})})},{threshold:.01}),r=new IntersectionObserver(a=>{a.forEach(c=>{if(c.target.tagName==="video"){const l=c.target;c.isIntersecting?l.hasAttribute("autoplay")&&l.paused&&l.readyState>=2&&l.play().catch(console.error):(l.pause(),l.currentTime=0)}})},{threshold:.5});return t.hookManager.register("item.onDocumentLoad",({destroy:a,itemId:c})=>{const l=t.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!l)return;i.observe(l);const u=l.contentDocument?.body.getElementsByTagName("video"),d=Array.from(u||[]).map(p=>(r.observe(p),()=>r.unobserve(p)));a(()=>{i.unobserve(l),d.forEach(p=>{p()})})}),{...t,destroy:()=>{i.disconnect(),r.disconnect(),t.destroy()}}},Yn=(n,e)=>n.links$.pipe(o.tap(t=>{if(!Ve(t.target,"a")||t.type!=="click")return;const i=new URL(t.target.href),r=`${i.origin}${i.pathname}`;n.context.manifest?.spineItems.some(a=>a.href===r)&&e.goToUrl(i)})),k=E.namespace("navigation"),qn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:r})=>{let s=new L({x:n.x-i,y:n.y});return e.isUsingVerticalWriting()&&(s=new L({x:n.x,y:n.y+t})),r.getSpineItemClosestPositionFromUnsafePosition(s,e)},tt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:r,viewport:s})=>{const a=t,c=r.getSpineItemFromPosition(n)||i.get(0),l=n;if(!c)return l;const u=r.getSpineItemPositionFromSpinePosition(n,c),d=qn({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:r.spineItemLocator});return e.arePositionsDifferent(d,u)?r.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new M({x:n.x-s.pageSize.width,y:0}):new M({y:n.y-s.pageSize.height,x:0}))},Xn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:r,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=tt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});if(e?.isUsingVerticalWriting()&&n.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x+c.pageSize.width}:{...u,x:u.x-c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=tt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)},Gn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:r})=>{let s=new L({x:n.x+i,y:n.y});return e.isUsingVerticalWriting()&&(s=new L({x:n.x,y:n.y-t})),r.getSpineItemClosestPositionFromUnsafePosition(s,e)},nt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:r,viewport:s})=>{const a=t,c=r.getSpineItemFromPosition(n)||i.get(0),l=n;if(!c)return l;const u=r.getSpineItemPositionFromSpinePosition(n,c),d=Gn({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:r.spineItemLocator});return e.arePositionsDifferent(d,u)?r.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new U({x:n.x+s.pageSize.width,y:0}):new U({y:n.y+s.pageSize.height,x:0}))},Zn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:r,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=nt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});if(e?.isUsingVerticalWriting()&&n.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x-c.pageSize.width}:{...u,x:u.x+c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=nt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)};class Jn{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=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})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const i=Xn({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:t,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position: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 r=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:t});k.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:t,...i,position:r}),this.reader.navigation.navigate({position:r,...i})}goToAbsolutePageIndex({absolutePageIndex:e,...t}){const i=this.reader.spine.pages.fromAbsolutePageIndex(e);if(k.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...t,foundInfo:i}),i){const r=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:i.pageIndex,spineItemId:i.itemIndex});return this.reader.navigation.navigate({position:r,...t})}}}class Kn extends N{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 r=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,s=Math.floor(e.x)-(this.value.lastDelta?.x||0),a=Math.floor(e.y)-(this.value.lastDelta?.y||0),c=Math.floor(t==="horizontal"?this.value.lastPosition.x-s/r:0),l=Math.floor(t==="horizontal"?0:this.value.lastPosition.y-a/r);i=new M({x:c,y:l}),this.mergeCompare({lastDelta:e})}else i=this.value.lastPosition;this.mergeCompare({lastPosition:i}),this.reader.navigation.navigate({position:i,animation:!1})}}class R{constructor(){this.isDestroyed=!1,this.destroySubject=new o.Subject,this.destroy$=this.destroySubject.asObservable()}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.destroySubject.next(),this.destroySubject.complete())}}const Qn=500;class jn 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(r=>{const s=this.locker.lock();return o.merge(this.scrollNavigationController.userScroll$,o.of(r)).pipe(o.debounceTime(Qn,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(()=>{s()}))}));o.merge(i).pipe(o.takeUntil(this.destroy$)).subscribe()}}const ei=n=>n.pagination.state$.pipe(o.withLatestFrom(n.context.manifest$,n.settings.values$),o.map(([e,{spineItems:t,readingDirection:i},{computedPageTurnDirection:r}])=>{const s=t.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(s-1,0),l=e.endSpineItemIndex===Math.max(s-1,0),u=e.beginSpineItemIndex===0,d=e.beginPageIndexInSpineItem===0,p=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:r==="vertical"?!1:!d,canTurnRight:r==="vertical"?!1:!p,canGoTopSpineItem:r==="vertical"&&!a,canGoBottomSpineItem:r==="vertical"&&!c,canGoLeftSpineItem:r!=="vertical"&&(i==="ltr"&&!a||i==="rtl"&&!l),canGoRightSpineItem:r!=="vertical"&&(i==="ltr"&&!c||i==="rtl"&&!u)}}),o.distinctUntilChanged($.isShallowEqual)),ti=({reader:n,duration:e})=>t=>{let i;const r=()=>{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(r),o.finalize(r))},ni=n=>e=>{const t=n(e),i=ei(t),r=new Jn(t),s=new Kn(t),a=new jn(t.navigation.scrollNavigationController,t.navigation.locker),c=Yn(t,r),l=a.navigation$.pipe(o.tap(p=>{t.navigation.navigate(p)}));return o.merge(c,l).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,load:p=>{const{cfi:m,...g}=p;t.load(g),m&&r.goToCfi(m,{animate:!1})},destroy:()=>{a.destroy(),t.destroy()},navigation:{...t.navigation,state$:i,throttleLock:({duration:p,trigger:m})=>m.pipe(ti({duration:p,reader:t})),panNavigator:s,turnBottom:r.turnBottom.bind(r),turnTop:r.turnTop.bind(r),turnLeftOrTop:r.turnLeftOrTop.bind(r),turnRightOrBottom:r.turnRightOrBottom.bind(r),turnLeft:r.turnLeft.bind(r),turnRight:r.turnRight.bind(r),goToCfi:r.goToCfi.bind(r),goToUrl:r.goToUrl.bind(r),goToSpineItem:r.goToSpineItem.bind(r),goToNextSpineItem:r.goToNextSpineItem.bind(r),goToPreviousSpineItem:r.goToPreviousSpineItem.bind(r),goToLeftOrTopSpineItem:r.goToLeftOrTopSpineItem.bind(r),goToRightOrBottomSpineItem:r.goToRightOrBottomSpineItem.bind(r),goToTopSpineItem:r.goToTopSpineItem.bind(r),goToBottomSpineItem:r.goToBottomSpineItem.bind(r),goToLeftSpineItem:r.goToLeftSpineItem.bind(r),goToRightSpineItem:r.goToRightSpineItem.bind(r),goToPageOfSpineItem:r.goToPageOfSpineItem.bind(r),goToAbsolutePageIndex:r.goToAbsolutePageIndex.bind(r)}}},it=(n,e,t)=>{const i=t.spineItems.findIndex(r=>r.href===n);return e.reduce((r,s)=>{const a=s.href.indexOf("#"),c=a>0?s.href.substr(0,a):s.href,l=c.substring(0,c.lastIndexOf("/")),u=n.substring(0,n.lastIndexOf("/")),d=n.endsWith(c),p=u!==""&&u.endsWith(l);if(d||p){const g=t.spineItems.findIndex(S=>S.href===s.href);if(i<g)return r;const f={title:s.title,path:s.path},y=it(n,s.contents,t);return y?{...f,subChapter:y}:f}return r},void 0)},ii=(n,e)=>{const{href:t}=e;return it(t,n.nav?.toc??[],n)},oi=n=>{const e=n.context.manifest,t=n.spineItemsManager.items;return e?t.reduce((i,{item:r})=>(i[r.id]=ii(e,r),i),{}):{}},ri=n=>n.spineItemsManager.items$.pipe(o.startWith([]),o.map(()=>oi(n))),si=(n,e,t)=>n+e*t,ai=(n,e,t)=>{const{height:i,width:r}=t.layoutInfo,{top:s,left:a}=n.spine.getSpineItemSpineLayoutInfo(t);return n.settings.values.computedPageTurnDirection==="vertical"?Math.max(0,Math.min(1,(e.y-s+n.viewport.absoluteViewport.height)/i)):Math.max(0,Math.min(1,(e.x-a+n.viewport.absoluteViewport.width)/r))},ci=(n,e,t,i,r)=>r.isReady$.pipe(o.first(),o.withLatestFrom(n.layoutInfo$),o.map(([s,a])=>{const c=n.context,l=c.manifest?.renditionLayout==="pre-paginated",u=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(r)??0,m=n.context.manifest?.spineItems.length??0,g=a.pages.filter(S=>S.itemIndex===p).length??0,h=c.manifest?.spineItems[e]?.progressionWeight??(p+1)/m;let f=(t+1)*(h/g);!l&&r.renditionLayout==="reflowable"&&!s&&(f=0);let y=d+f;return c.manifest?.renditionFlow==="scrolled-continuous"&&(s?f=ai(n,i,r):f=0,y=si(d,h,f)),e===u-1&&t===g-1&&y>.99?1:y})),li=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})),ui=(n,e,t,i)=>{const r=e.beginSpineItemIndex!==void 0?n.spineItemsManager.get(e.beginSpineItemIndex):void 0,s=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return o.of({...e,beginChapterInfo:r?t[r.item.id]:void 0,beginSpineItemReadingDirection:r?.readingDirection,endChapterInfo:s?t[s.item.id]:void 0,endSpineItemReadingDirection:s?.readingDirection,percentageEstimateOfBook:i,isUsingSpread:n.settings.values.computedSpreadMode??!1})},di=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?ci(n,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n.navigation.getNavigation().position,t):o.of(0)})),pi=n=>{const e=ri(n),t=li(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}),r=o.combineLatest([n.pagination.state$,e,di(n)]).pipe(o.switchMap(([a,c,l])=>ui(n,a,c,l).pipe(o.map(u=>({...a,...u})))),o.distinctUntilChanged($.isShallowEqual));return{paginationInfo$:o.combineLatest([r,t]).pipe(o.map(([a,c])=>({...a,...c,beginAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.beginSpineItemIndex).reduce((l,u)=>l+u,a.beginPageIndexInSpineItem??0),endAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.endSpineItemIndex).reduce((l,u)=>l+u,a.endPageIndexInSpineItem??0)})),o.tap(a=>{i.next(a)}),o.shareReplay(1)),getPaginationInfo:()=>i.value}},_=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?_(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})},re=({spineItem:n,pageNode:e})=>ot({nodeOrRange:e.node,offset:e.offset,item:n}).trim(),rt=(n,e)=>ot({nodeOrRange:n,item:e}),gi=n=>n.index.toString(),st=n=>n[0]?.index===6&&n.length>1,se=n=>{const e=W.parse(n);return W.isIndirectionOnly(e)},mi=n=>Array.isArray(n)?n[0]&&st(n[0])?n[0]:void 0:n.parent[0]&&st(n.parent[0])?n.parent[0]:void 0,ae=n=>{const e=W.parse(n),s=((mi(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:s,offset:c??0}},we=({cfi:n,spineItemsManager:e})=>{const{itemIndex:t,...i}=ae(n),r=e.get(t);if(!r)return{...i,itemIndex:t,node:null};const s=r.renderer.getDocumentFrame();if(s instanceof HTMLIFrameElement){const a=s.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:r}}catch(c){return E.warn(`Error resolving cfi: ${n}.`),E.warn(c),{...i,spineItem:r,itemIndex:t,node:null}}}return{...i,itemIndex:t,spineItem:r,node:null}},hi=(n,e)=>{if("cfi"in e){const{itemIndex:s,...a}=n.cfi.parseCfi(e.cfi);return{...e,...a,itemIndex:s,node:null}}const t=n.spineItemsManager.get(e);if(!t)throw new Error("Spine item not found");const i=_(t.item);return{...n.cfi.parseCfi(i),cfi:_(t.item),itemIndex:t.index,node:null}},at=(n,e)=>{let t=n?.itemPageIndex;const{itemIndex:i,...r}=e.cfi.parseCfi(n.cfi),s=e.spineItemsManager.get(i);return s?j().pipe(o.withLatestFrom(s.isReady$),o.map(([,a])=>{const{node:c=null,offset:l,range:u}=a?e.cfi.resolveCfi({cfi:n.cfi}):{};s.renditionLayout!=="pre-paginated"&&c&&(t=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,l??0,s)??t);let p=n?.absolutePageIndex;return t===void 0&&(t=0),p=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:t,spineItemOrId:s})??n?.absolutePageIndex,{...n,...r,range:u,itemIndex:i,node:c,startOffset:l,absolutePageIndex:p,itemPageIndex:t}})):o.of({...n,itemIndex:i,...r})};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 r={resource:t,meta:hi(this.reader,t)};return Se(()=>{const s=this.reader.spineItemsManager.get(r.meta.itemIndex??0),a=s?.renditionLayout==="reflowable",c=i.mode==="shallow"||!a||!s?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([s.index]),l="cfi"in t?t.cfi:void 0,u=l?this.locatorsByKey.get(l):void 0,d=m=>m.pipe(o.finalize(()=>{l&&this.deregisterMemoizedStream(l),setTimeout(()=>{c()},1e3)}));if(l&&u)return u.observerCount++,d(u.consolidate$.pipe(o.map(({resource:m,meta:g})=>({resource:m,meta:g}))));const p=this.reader.spine.layout$.pipe(o.debounceTime(10),o.startWith(r),o.switchScan(m=>at(m.meta,this.reader).pipe(o.map(g=>({...m,meta:g}))),r),o.shareReplay({refCount:!0,bufferSize:1}));return l&&this.locatorsByKey.set(l,{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 lt=n=>e=>{const t=n(e),{paginationInfo$:i,getPaginationInfo:r}=pi(t);i.pipe(o.takeUntil(t.$.destroy$)).subscribe();const s=new ct(t);return{...t,locateResource:s.locateResource.bind(s),pagination:{...t.pagination,get state(){return r()},get state$(){return i}}}},fi=n=>({put:(s,a)=>new Promise((c,l)=>{const u=n.transaction(["store"],"readwrite");u.onerror=m=>{l(m)},u.oncomplete=()=>{c()};const p=u.objectStore("store").put(a,s);p.onsuccess=()=>{c()},p.onerror=m=>{l(m)}}),keys:()=>new Promise((s,a)=>{const c=n.transaction(["store"],"readonly");c.onerror=p=>{a(p)};const u=c.objectStore("store").openKeyCursor(),d=[];u.onsuccess=()=>{const p=u.result;if(!p){s(d);return}d.push(p.key),p.continue()},u.onerror=()=>{a(u.error)}}),get:s=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),d=l.objectStore("store").get(s);d.onsuccess=()=>{let p=d.result;p===void 0&&(p=null),a(p)},l.onerror=()=>{c(d.error)}}),remove:s=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),d=l.objectStore("store").delete(s);l.onerror=()=>{c(d.error)},l.oncomplete=()=>{a()},l.onabort=()=>{const p=d.error?d.error:d.transaction?.error;c(p)}})}),ve=async n=>new Promise((e,t)=>{const i=window.indexedDB.open(n);i.onerror=r=>{t(r)},i.onsuccess=()=>{e(fi(i.result))},i.onupgradeneeded=()=>{i.result.createObjectStore("store")}}),Si=n=>{let e=Date.now().toString();const t=new o.Subject,i=l=>{if(typeof l=="string"||typeof l=="object"){const u=typeof l=="object"?l.id:l;return n.manifest?.spineItems.find(d=>d.id===u)}return n.manifest?.spineItems[l]},r=async(l,u)=>{const d=i(l);if(!d)return new Response("Item not found",{status:404});const m=await(await ve("prose-reader")).get(`${e}_${d.id}`);if(m)return new Response(m,{status:200});const g=u&&await u(d)||await fetch(d.href);return s(d,g.clone()),g},s=(l,u)=>{t.next({id:l,data:u})};t.asObservable().pipe(I.mergeMap(({id:l,data:u})=>{const d=i(l);return d?o.from(o.forkJoin([ve("prose-reader"),o.from(u.blob())])).pipe(I.switchMap(([p,m])=>o.from(p.put(`${e}_${d.id}`,m))),I.catchError(p=>(E.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(()=>(E.debug("Cleanup up old cache..."),o.from(ve("prose-reader")).pipe(I.switchMap(l=>o.from(l.keys()).pipe(I.map(u=>u.filter(d=>!d.toString().startsWith(e))),I.switchMap(u=>{const d=u.map(p=>l.remove(p));return o.from(Promise.all(d))}))),I.catchError(l=>(E.error(l),o.EMPTY))))),I.takeUntil(n.destroy$)).subscribe(),{get:r,destroy:()=>{t.complete()}}},yi=n=>e=>{const t=n(e),i=Si(t.context);return{...t,destroy:()=>{i.destroy(),t.destroy()}}},bi=(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 r=Math.min(n.offset||0,e.offset||0),s=Math.max(n.offset||0,e.offset||0);t.setStart(n.node,r),t.setEnd(n.node,s)}}catch(r){E.warn("Failed to create range from selection",r,{anchor:n,focus:e})}return t}},Ii=({selection:n,spineItem:e})=>{const{anchorNode:t,anchorOffset:i,focusNode:r,focusOffset:s}=n;if(!(!t||!r))try{return bi({node:t,offset:i},{node:r,offset:s})}catch(a){E.warn("Failed to create range from selection",a,{selection:n,spineItem:e});return}};class wi 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(s=>!!s.find(a=>a.type==="childList"&&a.removedNodes.length))),r=e.parentElement?ye(e.parentElement,{childList:!0}).pipe(o.filter(s=>!!s.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(r,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(s=>{const a=t.getSelection();return a&&!a.isCollapsed?[s,a]:void 0}),o.filter(O))),o.takeUntil(o.merge(r,this.destroy$)))}}}const vi=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 wi(e);return o.merge(i.selectionChange$.pipe(o.map(r=>{if(r?.toString())return{type:"change",selection:r}})),i.selectionOver$.pipe(o.map(([r,s])=>({type:"over",event:r,selection:s})))).pipe(o.takeUntil(n.unloaded$),o.endWith(void 0),o.finalize(()=>{i.destroy()}))}),o.distinctUntilChanged()),Pi=n=>e=>{const t=n(e);let i;const r=t.spineItemsManager.items$.pipe(o.switchMap(d=>{const p=d.map(m=>{const g=t.spineItemsManager.getSpineItemIndex(m)??0;return vi(m).pipe(o.map(h=>{if(h)return{...h,itemIndex:g}}))});return o.merge(...p)}),o.startWith(void 0),o.distinctUntilChanged(),o.tap(d=>{i=d}),o.shareReplay({refCount:!0,bufferSize:1})),s=r,a=r.pipe(o.map(d=>!!d),o.distinctUntilChanged(),o.filter(d=>d),o.share()),c=a.pipe(o.switchMap(()=>s),o.distinctUntilChanged(),o.filter(d=>!d),o.share()),l=r.pipe(o.filter(d=>d?.type==="over"),o.share()),u=t.context.watch("rootElement").pipe(o.filter(O),o.switchMap(d=>o.fromEvent(d,"pointerdown")),o.withLatestFrom(s),o.map(([,d])=>d),o.startWith(void 0),o.shareReplay({refCount:!0,bufferSize:1}));return o.merge(s,u).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,selection:{selection$:s,selectionStart$:a,selectionEnd$:c,selectionOver$:l,lastSelectionOnPointerdown$:u,getSelection:()=>i,createOrderedRangeFromSelection:Ii}}},ut=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],$i=n=>e=>{const t=n(e),i=new o.BehaviorSubject(e.theme??"bright"),r=()=>{const c=ut.find(l=>l.name===i.value);return`
203
+ `)}}),zn(a),kn(a),a.hookManager.register("item.onDocumentCreated",({documentContainer:f})=>{f.style.opacity="0",c.values.layoutLayerTransition&&(f.style.transition="opacity 300ms")}),a.hookManager.register("item.onBeforeLayout",({item:f})=>{const S=a.spineItemsManager.get(f.id)?.renderer.documentContainer;a.settings.values.computedPageTurnMode!=="scrollable"&&S?.setAttribute("tab-index","0")});const l=a.spineItemsObserver.states$.pipe(I.filter(({isReady:f})=>f),I.tap(({item:f})=>{const y=f.renderer.documentContainer;y&&(y.style.opacity="1")})),u=c.values$.pipe(I.filter(({layoutAutoResize:f})=>f==="container"),I.switchMap(()=>a.context.watch("rootElement")),I.filter(O),I.switchMap(f=>Q(f)),I.debounceTime(100),I.filter(O),I.tap(()=>{a?.layout()})),d=On(a);c.watch(["pageHorizontalMargin","pageVerticalMargin"]).pipe(I.skip(1),I.tap(()=>{a.layout()}),I.takeUntil(a.$.destroy$)).subscribe();const p=a.spine.pages.pipe(I.shareReplay({refCount:!0,bufferSize:1})),m=Wn(a),g=Hn(a),h=Un(a);return o.merge(l,d,u,p,m,g,h).pipe(I.takeUntil(a.$.destroy$)).subscribe(),{...a,destroy:()=>{c.destroy(),a.destroy()},settings:c,layout$:a.spine.layout$,layoutInfo$:p,coordinates:Nn(a)}};class Bn extends Y{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:r}=this.viewport.value.pageSize;let s=i;const a=r;if(!t)return o.of(void 0);const c=t.naturalWidth||1,l=t.naturalHeight||1,u=c/l;return this.settings.values.computedPageTurnDirection==="vertical"&&this.settings.values.computedPageTurnMode==="scrollable"&&!this.settings.values.computedSpreadMode&&(s=Math.ceil(r/u)),t.style.height=`${s}px`,t.style.width=`${a}px`,t.style.objectPosition=e==="left"?"right":e==="right"?"left":"center",o.of({width:a,height:s})}onRenderHeadless(){return o.EMPTY}getDocumentFrame(){}}const xn=n=>e=>{const t=n({...e,getRenderer(a){const c=e.getRenderer?.(a),u=!!(a.mediaType??$.detectMimeTypeFromName(a.href))?.startsWith("image/");return!c&&u?d=>new Bn(d):c}}),i=new IntersectionObserver(a=>{a.forEach(c=>{const l=c.target,u=Array.from(l.contentDocument?.body.getElementsByTagName("audio")||[]);c.isIntersecting?u.forEach(d=>{d.hasAttribute("autoplay")&&d.paused&&d.readyState>=2&&d.play().catch(console.error)}):u.forEach(d=>{d.pause(),d.currentTime=0})})},{threshold:.01}),r=new IntersectionObserver(a=>{a.forEach(c=>{if(c.target.tagName==="video"){const l=c.target;c.isIntersecting?l.hasAttribute("autoplay")&&l.paused&&l.readyState>=2&&l.play().catch(console.error):(l.pause(),l.currentTime=0)}})},{threshold:.5});return t.hookManager.register("item.onDocumentLoad",({destroy:a,itemId:c})=>{const l=t.spineItemsManager.get(c)?.renderer.getDocumentFrame();if(!l)return;i.observe(l);const u=l.contentDocument?.body.getElementsByTagName("video"),d=Array.from(u||[]).map(p=>(r.observe(p),()=>r.unobserve(p)));a(()=>{i.unobserve(l),d.forEach(p=>{p()})})}),{...t,destroy:()=>{i.disconnect(),r.disconnect(),t.destroy()}}},Yn=(n,e)=>n.links$.pipe(o.tap(t=>{if(!Ve(t.target,"a")||t.type!=="click")return;const i=new URL(t.target.href),r=`${i.origin}${i.pathname}`;n.context.manifest?.spineItems.some(a=>a.href===r)&&e.goToUrl(i)})),k=E.namespace("navigation"),qn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:r})=>{let s=new L({x:n.x-i,y:n.y});return e.isUsingVerticalWriting()&&(s=new L({x:n.x,y:n.y+t})),r.getSpineItemClosestPositionFromUnsafePosition(s,e)},tt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:r,viewport:s})=>{const a=t,c=r.getSpineItemFromPosition(n)||i.get(0),l=n;if(!c)return l;const u=r.getSpineItemPositionFromSpinePosition(n,c),d=qn({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:r.spineItemLocator});return e.arePositionsDifferent(d,u)?r.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new M({x:n.x-s.pageSize.width,y:0}):new M({y:n.y-s.pageSize.height,x:0}))},Xn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:r,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=tt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});if(e?.isUsingVerticalWriting()&&n.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x+c.pageSize.width}:{...u,x:u.x-c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=tt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)},Gn=({position:n,spineItem:e,pageHeight:t,pageWidth:i,spineItemLocator:r})=>{let s=new L({x:n.x+i,y:n.y});return e.isUsingVerticalWriting()&&(s=new L({x:n.x,y:n.y-t})),r.getSpineItemClosestPositionFromUnsafePosition(s,e)},nt=({position:n,navigationResolver:e,computedPageTurnDirection:t,spineItemsManager:i,spineLocator:r,viewport:s})=>{const a=t,c=r.getSpineItemFromPosition(n)||i.get(0),l=n;if(!c)return l;const u=r.getSpineItemPositionFromSpinePosition(n,c),d=Gn({position:u,spineItem:c,pageHeight:s.pageSize.height,pageWidth:s.pageSize.width,spineItemLocator:r.spineItemLocator});return e.arePositionsDifferent(d,u)?r.getSpinePositionFromSpineItemPosition({spineItemPosition:d,spineItem:c}):e.fromUnboundSpinePosition(a==="horizontal"?new U({x:n.x+s.pageSize.width,y:0}):new U({y:n.y+s.pageSize.height,x:0}))},Zn=({position:n,spineItem:e,context:t,navigationResolver:i,spineItemsManager:r,spineLocator:s,computedPageTurnDirection:a,viewport:c,settings:l})=>{const u=nt({position:n,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});if(e?.isUsingVerticalWriting()&&n.x===u.x)return i.getAdjustedPositionForSpread(u);if(l.values.computedSpreadMode){if(e?.isUsingVerticalWriting()&&n.x!==u.x)return i.getAdjustedPositionForSpread(i.fromUnboundSpinePosition(t.isRTL()?{...u,x:u.x-c.pageSize.width}:{...u,x:u.x+c.pageSize.width}));if(a==="vertical"&&n.y!==u.y)return i.getAdjustedPositionForSpread(u);const d=nt({position:u,viewport:c,navigationResolver:i,computedPageTurnDirection:a,spineItemsManager:r,spineLocator:s});return i.getAdjustedPositionForSpread(d)}return i.getAdjustedPositionForSpread(u)};class Jn{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=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})}turnLeftOrTop(){const e=this.reader.navigation.getNavigation(),t=this.reader.spineItemsManager.get(e.spineItem);if(!t)return;const i=Xn({context:this.reader.context,navigationResolver:this.reader.navigation.navigationResolver,position:e.position,computedPageTurnDirection:this.reader.settings.values.computedPageTurnDirection,spineItem:t,spineItemsManager:this.reader.spineItemsManager,spineLocator:this.reader.spine.locator,viewport:this.reader.viewport,settings:this.reader.settings});return this.reader.navigation.navigate({position: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 r=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:e,spineItemId:t});k.debug(".goToPageOfSpineItem()",{pageIndex:e,spineItemId:t,...i,position:r}),this.reader.navigation.navigate({position:r,...i})}goToAbsolutePageIndex({absolutePageIndex:e,...t}){const i=this.reader.spine.pages.fromAbsolutePageIndex(e);if(k.debug(".goToAbsolutePageIndex()",{absolutePageIndex:e,...t,foundInfo:i}),i){const r=this.reader.navigation.navigationResolver.getNavigationForSpineItemPage({pageIndex:i.pageIndex,spineItemId:i.itemIndex});return this.reader.navigation.navigate({position:r,...t})}}}class Kn extends N{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 r=this.reader.viewport.absoluteViewport.width/this.reader.viewport.relativeViewport.width,s=Math.floor(e.x)-(this.value.lastDelta?.x||0),a=Math.floor(e.y)-(this.value.lastDelta?.y||0),c=Math.floor(t==="horizontal"?this.value.lastPosition.x-s/r:0),l=Math.floor(t==="horizontal"?0:this.value.lastPosition.y-a/r);i=new M({x:c,y:l}),this.mergeCompare({lastDelta:e})}else i=this.value.lastPosition;this.mergeCompare({lastPosition:i}),this.reader.navigation.navigate({position:i,animation:!1})}}class R{constructor(){this.isDestroyed=!1,this.destroySubject=new o.Subject,this.destroy$=this.destroySubject.asObservable()}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.destroySubject.next(),this.destroySubject.complete())}}const Qn=500;class jn 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(r=>{const s=this.locker.lock();return o.merge(this.scrollNavigationController.userScroll$,o.of(r)).pipe(o.debounceTime(Qn,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(()=>{s()}))}));o.merge(i).pipe(o.takeUntil(this.destroy$)).subscribe()}}const ei=n=>n.pagination.state$.pipe(o.withLatestFrom(n.context.manifest$,n.settings.values$),o.map(([e,{spineItems:t,readingDirection:i},{computedPageTurnDirection:r}])=>{const s=t.length??0,a=e.beginSpineItemIndex===0,c=e.endSpineItemIndex===Math.max(s-1,0),l=e.endSpineItemIndex===Math.max(s-1,0),u=e.beginSpineItemIndex===0,d=e.beginPageIndexInSpineItem===0,p=e.endPageIndexInSpineItem===e.endNumberOfPagesInSpineItem-1;return{canTurnLeft:r==="vertical"?!1:!d,canTurnRight:r==="vertical"?!1:!p,canGoTopSpineItem:r==="vertical"&&!a,canGoBottomSpineItem:r==="vertical"&&!c,canGoLeftSpineItem:r!=="vertical"&&(i==="ltr"&&!a||i==="rtl"&&!l),canGoRightSpineItem:r!=="vertical"&&(i==="ltr"&&!c||i==="rtl"&&!u)}}),o.distinctUntilChanged($.isShallowEqual)),ti=({reader:n,duration:e})=>t=>{let i;const r=()=>{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(r),o.finalize(r))},ni=n=>e=>{const t=n(e),i=ei(t),r=new Jn(t),s=new Kn(t),a=new jn(t.navigation.scrollNavigationController,t.navigation.locker),c=Yn(t,r),l=a.navigation$.pipe(o.tap(p=>{t.navigation.navigate(p)}));return o.merge(c,l).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,load:p=>{const{cfi:m,...g}=p;t.load(g),m&&r.goToCfi(m,{animate:!1})},destroy:()=>{a.destroy(),t.destroy()},navigation:{...t.navigation,state$:i,throttleLock:({duration:p,trigger:m})=>m.pipe(ti({duration:p,reader:t})),panNavigator:s,turnBottom:r.turnBottom.bind(r),turnTop:r.turnTop.bind(r),turnLeftOrTop:r.turnLeftOrTop.bind(r),turnRightOrBottom:r.turnRightOrBottom.bind(r),turnLeft:r.turnLeft.bind(r),turnRight:r.turnRight.bind(r),goToCfi:r.goToCfi.bind(r),goToUrl:r.goToUrl.bind(r),goToSpineItem:r.goToSpineItem.bind(r),goToNextSpineItem:r.goToNextSpineItem.bind(r),goToPreviousSpineItem:r.goToPreviousSpineItem.bind(r),goToLeftOrTopSpineItem:r.goToLeftOrTopSpineItem.bind(r),goToRightOrBottomSpineItem:r.goToRightOrBottomSpineItem.bind(r),goToTopSpineItem:r.goToTopSpineItem.bind(r),goToBottomSpineItem:r.goToBottomSpineItem.bind(r),goToLeftSpineItem:r.goToLeftSpineItem.bind(r),goToRightSpineItem:r.goToRightSpineItem.bind(r),goToPageOfSpineItem:r.goToPageOfSpineItem.bind(r),goToAbsolutePageIndex:r.goToAbsolutePageIndex.bind(r)}}},it=(n,e,t)=>{const i=t.spineItems.findIndex(r=>r.href===n);return e.reduce((r,s)=>{const a=s.href.indexOf("#"),c=a>0?s.href.substr(0,a):s.href,l=c.substring(0,c.lastIndexOf("/")),u=n.substring(0,n.lastIndexOf("/")),d=n.endsWith(c),p=u!==""&&u.endsWith(l);if(d||p){const g=t.spineItems.findIndex(S=>S.href===c);if(i<g)return r;const f={title:s.title,path:s.path},y=it(n,s.contents,t);return y?{...f,subChapter:y}:f}return r},void 0)},ii=(n,e)=>{const{href:t}=e;return it(t,n.nav?.toc??[],n)},oi=n=>{const e=n.context.manifest,t=n.spineItemsManager.items;return e?t.reduce((r,{item:s})=>(r[s.id]=ii(e,s),r),{}):{}},ri=n=>n.spineItemsManager.items$.pipe(o.startWith([]),o.map(()=>oi(n))),si=(n,e,t)=>n+e*t,ai=(n,e,t)=>{const{height:i,width:r}=t.layoutInfo,{top:s,left:a}=n.spine.getSpineItemSpineLayoutInfo(t);return n.settings.values.computedPageTurnDirection==="vertical"?Math.max(0,Math.min(1,(e.y-s+n.viewport.absoluteViewport.height)/i)):Math.max(0,Math.min(1,(e.x-a+n.viewport.absoluteViewport.width)/r))},ci=(n,e,t,i,r)=>r.isReady$.pipe(o.first(),o.withLatestFrom(n.layoutInfo$),o.map(([s,a])=>{const c=n.context,l=c.manifest?.renditionLayout==="pre-paginated",u=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(r)??0,m=n.context.manifest?.spineItems.length??0,g=a.pages.filter(S=>S.itemIndex===p).length??0,h=c.manifest?.spineItems[e]?.progressionWeight??(p+1)/m;let f=(t+1)*(h/g);!l&&r.renditionLayout==="reflowable"&&!s&&(f=0);let y=d+f;return c.manifest?.renditionFlow==="scrolled-continuous"&&(s?f=ai(n,i,r):f=0,y=si(d,h,f)),e===u-1&&t===g-1&&y>.99?1:y})),li=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})),ui=(n,e,t,i)=>{const r=e.beginSpineItemIndex!==void 0?n.spineItemsManager.get(e.beginSpineItemIndex):void 0,s=e.endSpineItemIndex!==void 0?n.spineItemsManager.get(e.endSpineItemIndex):void 0;return o.of({...e,beginChapterInfo:r?t[r.item.id]:void 0,beginSpineItemReadingDirection:r?.readingDirection,endChapterInfo:s?t[s.item.id]:void 0,endSpineItemReadingDirection:s?.readingDirection,percentageEstimateOfBook:i,isUsingSpread:n.settings.values.computedSpreadMode??!1})},di=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?ci(n,e.endSpineItemIndex??0,e.endPageIndexInSpineItem||0,n.navigation.getNavigation().position,t):o.of(0)})),pi=n=>{const e=ri(n),t=li(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}),r=o.combineLatest([n.pagination.state$,e,di(n)]).pipe(o.switchMap(([a,c,l])=>ui(n,a,c,l).pipe(o.map(u=>({...a,...u})))),o.distinctUntilChanged($.isShallowEqual));return{paginationInfo$:o.combineLatest([r,t]).pipe(o.map(([a,c])=>({...a,...c,beginAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.beginSpineItemIndex).reduce((l,u)=>l+u,a.beginPageIndexInSpineItem??0),endAbsolutePageIndex:c.numberOfPagesPerItems.slice(0,a.endSpineItemIndex).reduce((l,u)=>l+u,a.endPageIndexInSpineItem??0)})),o.tap(a=>{i.next(a)}),o.shareReplay(1)),getPaginationInfo:()=>i.value}},_=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?_(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})},re=({spineItem:n,pageNode:e})=>ot({nodeOrRange:e.node,offset:e.offset,item:n}).trim(),rt=(n,e)=>ot({nodeOrRange:n,item:e}),gi=n=>n.index.toString(),st=n=>n[0]?.index===6&&n.length>1,se=n=>{const e=W.parse(n);return W.isIndirectionOnly(e)},mi=n=>Array.isArray(n)?n[0]&&st(n[0])?n[0]:void 0:n.parent[0]&&st(n.parent[0])?n.parent[0]:void 0,ae=n=>{const e=W.parse(n),s=((mi(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:s,offset:c??0}},we=({cfi:n,spineItemsManager:e})=>{const{itemIndex:t,...i}=ae(n),r=e.get(t);if(!r)return{...i,itemIndex:t,node:null};const s=r.renderer.getDocumentFrame();if(s instanceof HTMLIFrameElement){const a=s.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:r}}catch(c){return E.warn(`Error resolving cfi: ${n}.`),E.warn(c),{...i,spineItem:r,itemIndex:t,node:null}}}return{...i,itemIndex:t,spineItem:r,node:null}},hi=(n,e)=>{if("cfi"in e){const{itemIndex:s,...a}=n.cfi.parseCfi(e.cfi);return{...e,...a,itemIndex:s,node:null}}const t=n.spineItemsManager.get(e);if(!t)throw new Error("Spine item not found");const i=_(t.item);return{...n.cfi.parseCfi(i),cfi:_(t.item),itemIndex:t.index,node:null}},at=(n,e)=>{let t=n?.itemPageIndex;const{itemIndex:i,...r}=e.cfi.parseCfi(n.cfi),s=e.spineItemsManager.get(i);return s?j().pipe(o.withLatestFrom(s.isReady$),o.map(([,a])=>{const{node:c=null,offset:l,range:u}=a?e.cfi.resolveCfi({cfi:n.cfi}):{};s.renditionLayout!=="pre-paginated"&&c&&(t=e.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(c,l??0,s)??t);let p=n?.absolutePageIndex;return t===void 0&&(t=0),p=e.spine.locator._getAbsolutePageIndexFromPageIndex({pageIndex:t,spineItemOrId:s})??n?.absolutePageIndex,{...n,...r,range:u,itemIndex:i,node:c,startOffset:l,absolutePageIndex:p,itemPageIndex:t}})):o.of({...n,itemIndex:i,...r})};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 r={resource:t,meta:hi(this.reader,t)};return Se(()=>{const s=this.reader.spineItemsManager.get(r.meta.itemIndex??0),a=s?.renditionLayout==="reflowable",c=i.mode==="shallow"||!a||!s?()=>{}:this.reader.spine.spineItemsLoader.forceOpen([s.index]),l="cfi"in t?t.cfi:void 0,u=l?this.locatorsByKey.get(l):void 0,d=m=>m.pipe(o.finalize(()=>{l&&this.deregisterMemoizedStream(l),setTimeout(()=>{c()},1e3)}));if(l&&u)return u.observerCount++,d(u.consolidate$.pipe(o.map(({resource:m,meta:g})=>({resource:m,meta:g}))));const p=this.reader.spine.layout$.pipe(o.debounceTime(10),o.startWith(r),o.switchScan(m=>at(m.meta,this.reader).pipe(o.map(g=>({...m,meta:g}))),r),o.shareReplay({refCount:!0,bufferSize:1}));return l&&this.locatorsByKey.set(l,{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 lt=n=>e=>{const t=n(e),{paginationInfo$:i,getPaginationInfo:r}=pi(t);i.pipe(o.takeUntil(t.$.destroy$)).subscribe();const s=new ct(t);return{...t,locateResource:s.locateResource.bind(s),pagination:{...t.pagination,get state(){return r()},get state$(){return i}}}},fi=n=>({put:(s,a)=>new Promise((c,l)=>{const u=n.transaction(["store"],"readwrite");u.onerror=m=>{l(m)},u.oncomplete=()=>{c()};const p=u.objectStore("store").put(a,s);p.onsuccess=()=>{c()},p.onerror=m=>{l(m)}}),keys:()=>new Promise((s,a)=>{const c=n.transaction(["store"],"readonly");c.onerror=p=>{a(p)};const u=c.objectStore("store").openKeyCursor(),d=[];u.onsuccess=()=>{const p=u.result;if(!p){s(d);return}d.push(p.key),p.continue()},u.onerror=()=>{a(u.error)}}),get:s=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),d=l.objectStore("store").get(s);d.onsuccess=()=>{let p=d.result;p===void 0&&(p=null),a(p)},l.onerror=()=>{c(d.error)}}),remove:s=>new Promise((a,c)=>{const l=n.transaction(["store"],"readwrite"),d=l.objectStore("store").delete(s);l.onerror=()=>{c(d.error)},l.oncomplete=()=>{a()},l.onabort=()=>{const p=d.error?d.error:d.transaction?.error;c(p)}})}),ve=async n=>new Promise((e,t)=>{const i=window.indexedDB.open(n);i.onerror=r=>{t(r)},i.onsuccess=()=>{e(fi(i.result))},i.onupgradeneeded=()=>{i.result.createObjectStore("store")}}),Si=n=>{let e=Date.now().toString();const t=new o.Subject,i=l=>{if(typeof l=="string"||typeof l=="object"){const u=typeof l=="object"?l.id:l;return n.manifest?.spineItems.find(d=>d.id===u)}return n.manifest?.spineItems[l]},r=async(l,u)=>{const d=i(l);if(!d)return new Response("Item not found",{status:404});const m=await(await ve("prose-reader")).get(`${e}_${d.id}`);if(m)return new Response(m,{status:200});const g=u&&await u(d)||await fetch(d.href);return s(d,g.clone()),g},s=(l,u)=>{t.next({id:l,data:u})};t.asObservable().pipe(I.mergeMap(({id:l,data:u})=>{const d=i(l);return d?o.from(o.forkJoin([ve("prose-reader"),o.from(u.blob())])).pipe(I.switchMap(([p,m])=>o.from(p.put(`${e}_${d.id}`,m))),I.catchError(p=>(E.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(()=>(E.debug("Cleanup up old cache..."),o.from(ve("prose-reader")).pipe(I.switchMap(l=>o.from(l.keys()).pipe(I.map(u=>u.filter(d=>!d.toString().startsWith(e))),I.switchMap(u=>{const d=u.map(p=>l.remove(p));return o.from(Promise.all(d))}))),I.catchError(l=>(E.error(l),o.EMPTY))))),I.takeUntil(n.destroy$)).subscribe(),{get:r,destroy:()=>{t.complete()}}},yi=n=>e=>{const t=n(e),i=Si(t.context);return{...t,destroy:()=>{i.destroy(),t.destroy()}}},bi=(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 r=Math.min(n.offset||0,e.offset||0),s=Math.max(n.offset||0,e.offset||0);t.setStart(n.node,r),t.setEnd(n.node,s)}}catch(r){E.warn("Failed to create range from selection",r,{anchor:n,focus:e})}return t}},Ii=({selection:n,spineItem:e})=>{const{anchorNode:t,anchorOffset:i,focusNode:r,focusOffset:s}=n;if(!(!t||!r))try{return bi({node:t,offset:i},{node:r,offset:s})}catch(a){E.warn("Failed to create range from selection",a,{selection:n,spineItem:e});return}};class wi 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(s=>!!s.find(a=>a.type==="childList"&&a.removedNodes.length))),r=e.parentElement?ye(e.parentElement,{childList:!0}).pipe(o.filter(s=>!!s.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(r,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(s=>{const a=t.getSelection();return a&&!a.isCollapsed?[s,a]:void 0}),o.filter(O))),o.takeUntil(o.merge(r,this.destroy$)))}}}const vi=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 wi(e);return o.merge(i.selectionChange$.pipe(o.map(r=>{if(r?.toString())return{type:"change",selection:r}})),i.selectionOver$.pipe(o.map(([r,s])=>({type:"over",event:r,selection:s})))).pipe(o.takeUntil(n.unloaded$),o.endWith(void 0),o.finalize(()=>{i.destroy()}))}),o.distinctUntilChanged()),Pi=n=>e=>{const t=n(e);let i;const r=t.spineItemsManager.items$.pipe(o.switchMap(d=>{const p=d.map(m=>{const g=t.spineItemsManager.getSpineItemIndex(m)??0;return vi(m).pipe(o.map(h=>{if(h)return{...h,itemIndex:g}}))});return o.merge(...p)}),o.startWith(void 0),o.distinctUntilChanged(),o.tap(d=>{i=d}),o.shareReplay({refCount:!0,bufferSize:1})),s=r,a=r.pipe(o.map(d=>!!d),o.distinctUntilChanged(),o.filter(d=>d),o.share()),c=a.pipe(o.switchMap(()=>s),o.distinctUntilChanged(),o.filter(d=>!d),o.share()),l=r.pipe(o.filter(d=>d?.type==="over"),o.share()),u=t.context.watch("rootElement").pipe(o.filter(O),o.switchMap(d=>o.fromEvent(d,"pointerdown")),o.withLatestFrom(s),o.map(([,d])=>d),o.startWith(void 0),o.shareReplay({refCount:!0,bufferSize:1}));return o.merge(s,u).pipe(o.takeUntil(t.$.destroy$)).subscribe(),{...t,selection:{selection$:s,selectionStart$:a,selectionEnd$:c,selectionOver$:l,lastSelectionOnPointerdown$:u,getSelection:()=>i,createOrderedRangeFromSelection:Ii}}},ut=[{name:"bright",backgroundColor:"white"},{name:"sepia",backgroundColor:"#eaddc7",foregroundColor:"black"},{name:"night",backgroundColor:"#191717",foregroundColor:"#f1ebeb"}],$i=n=>e=>{const t=n(e),i=new o.BehaviorSubject(e.theme??"bright"),r=()=>{const c=ut.find(l=>l.name===i.value);return`
204
204
  body {
205
205
  ${c!==void 0?`background-color: ${c.backgroundColor} !important;`:""}
206
206
  }