@netless/app-slide 0.2.89 → 0.2.90

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/main.iife.js CHANGED
@@ -8025,6 +8025,6 @@ self.onmessage = function(e) {
8025
8025
  border-radius: 4px;
8026
8026
  box-shadow: 1px 0 2px rgba(0, 0, 0, 0.2);
8027
8027
  cursor: grab;
8028
- `,this.addThumbDragListener(F,"vertical",D,P),I.appendChild(F),this.container.appendChild(I),this.verticalScrollBar=I}addThumbDragListener(w,v,I,E){let P=0,D=0;const F=(_t,xt)=>{v==="horizontal"?this.isDraggingHorizontal=!0:this.isDraggingVertical=!0,P=v==="horizontal"?_t:xt,D=v==="horizontal"?parseFloat(w.style.left)||0:parseFloat(w.style.top)||0,w.style.cursor="grabbing"},V=(_t,xt)=>{var $,G;if(!(v==="horizontal"?this.isDraggingHorizontal:this.isDraggingVertical))return;const B=(v==="horizontal"?_t:xt)-P;let W=D+B;W=Math.max(1,Math.min(E-I-1,W)),v==="horizontal"?w.style.left=`${W}px`:w.style.top=`${W}px`;const O=E-I-2;let j=0;O>0&&(j=(W-1)/O,j=Math.max(0,Math.min(1,j))),v==="horizontal"?this.resizableContainer.handleNormalizeTranslate(j,($=this.resizableContainer.translateY)!=null?$:.5,{triggerScrollBar:!1,triggerSync:!0}):this.resizableContainer.handleNormalizeTranslate((G=this.resizableContainer.translateX)!=null?G:.5,j,{triggerScrollBar:!1,triggerSync:!0})},X=()=>{v==="horizontal"?this.isDraggingHorizontal=!1:this.isDraggingVertical=!1,w.style.cursor="grab"},Z=_t=>{F(_t.clientX,_t.clientY),_t.preventDefault()},et=_t=>{V(_t.clientX,_t.clientY)},ut=()=>{X()};this.addTrackedListener(w,"mousedown",Z),this.addTrackedListener(document,"mousemove",et),this.addTrackedListener(document,"mouseup",ut)}destroy(){this.clearScrollBars()}}class M_{constructor(w,v,I){this.onScaleChanged=null,this.whiteboardContainer=null,this.slide=null,this.scale=1,this.resizeObserver=null,this.slideWidth=1,this.slideHeight=1,this.scrollBar=null,this.translateX=.5,this.translateY=.5,this.lastTriggerTime=0,this.updateSlideSize=()=>{if(this.slide){let E=!1;(this.slideWidth!==this.slide.width||this.slideHeight!==this.slide.height)&&(this.slideWidth=this.slide.width,this.slideHeight=this.slide.height,E=!0),E&&this.updateResizableContainer()}},this.enableResize=I,this.parent=w,this.context=v,this.root=document.createElement("div"),this.root.style.width="100%",this.root.style.height="100%",this.root.style.overflow="hidden",this.parent.appendChild(this.root),this.scrollContainer=document.createElement("div"),this.scrollContainer.setAttribute("data-resizable-scroll","true"),this.scrollContainer.style.width="100%",this.scrollContainer.style.height="100%",this.scrollContainer.style.position="relative",this.scrollContainer.style.overflow="hidden",this.container=document.createElement("div"),this.container.style.position="relative",this.container.setAttribute("data-resizable-container","true"),this.scrollContainer.appendChild(this.container),this.root.appendChild(this.scrollContainer),this.enableResize&&(this.scrollBar=new A_(this.root,this)),this.resizeObserver=new ResizeObserver(()=>{this.updateResizableContainer()}),this.resizeObserver.observe(this.scrollContainer)}getTranslate(){return{x:this.translateX,y:this.translateY}}getScale(){return this.scale}renderScrollBar(w,v,I,E){this.scrollBar&&this.scrollBar.render(w,I,v,E)}setSlideObject(w){this.slide=w,this.slide.on("renderEnd",this.updateSlideSize)}updateResizableContainer(){if(Date.now()-this.lastTriggerTime<50)return;this.lastTriggerTime=Date.now();const w=this.scrollContainer.getBoundingClientRect();if(this.container.style.width=`${w.width*this.scale}px`,this.container.style.height=`${w.height*this.scale}px`,this.whiteboardContainer&&this.enableResize){const v=this.whiteboardContainer.getBoundingClientRect();if(v.width/v.height>this.slideWidth/this.slideHeight){const I=v.height*this.slideWidth/this.slideHeight,E=(v.width-I)/2;this.whiteboardContainer.style.clipPath=`inset(0px ${E}px 0px ${E}px)`}else if(v.width/v.height<this.slideWidth/this.slideHeight){const I=v.width*this.slideHeight/this.slideWidth,E=(v.height-I)/2;this.whiteboardContainer.style.clipPath=`inset(${E}px 0px ${E}px 0px)`}}this.translateX=.5,this.translateY=.5,this.renderScrollBar(w.width,w.width*this.scale,w.height,w.height*this.scale),this.handleNormalizeTranslate(this.translateX,this.translateY,{triggerScrollBar:!0,triggerSync:!0})}handleNormalizeTranslate(w,v,I){var V;if(Math.abs(w-this.translateX)<.001&&Math.abs(v-this.translateY)<.001&&!I.triggerSync)return;const E=this.scrollContainer.getBoundingClientRect(),P=this.container.getBoundingClientRect(),D=-w*(P.width-E.width),F=-v*(P.height-E.height);this.translateX=w,this.translateY=v,this.container.style.transform=`translate(${D}px, ${F}px)`,I.triggerScrollBar&&((V=this.scrollBar)==null||V.handleNormalizeTranslate(w,v)),I.triggerSync&&this.context.storage.setState({translateX:this.translateX,translateY:this.translateY})}scaleContainer(w){Math.abs(this.scale-w)<.001||!this.enableResize||(w>1?(this.scrollContainer.style.width="calc(100% - 6px)",this.scrollContainer.style.height="calc(100% - 6px)"):(this.scrollContainer.style.width="100%",this.scrollContainer.style.height="100%"),w=this.enableResize?w:1,this.onScaleChanged&&this.enableResize&&this.onScaleChanged(w),this.scale=w,setTimeout(()=>{this.updateResizableContainer()}))}addSlideContainer(w){this.container.appendChild(w)}addWhiteboardContainer(w){this.container.appendChild(w),this.whiteboardContainer=w}getCurrentScale(){return this.scale}destroy(){var w,v;(w=this.resizeObserver)==null||w.disconnect(),(v=this.scrollBar)==null||v.destroy()}}const C_=new Set(["clicker"]),R_=function(){};class Hd{constructor({context:w,box:v,view:I,mountSlideController:E,mountWhiteboard:P,baseScenePath:D,appId:F,urlInterrupter:V,enableScale:X,onPagesReady:Z,onNavigate:et}){this.slideController=null,this.isViewMounted=!1,this.justSildeReadonly=!1,this.onError=({error:ut,index:_t})=>{var xt,N;this.viewer.setPaused(),(xt=this.slideController)!=null&&xt.showRenderError&&(this.$overlay.textContent=`Error on slide[page=${this.slideController.page}]: ${ut.message}`,this.$overlay.style.opacity="1"),(N=this.slideController)!=null&&N.onRenderError&&this.slideController.onRenderError(ut,_t),Ar.warn("[Slide] render error",ut)},this.onRenderStart=()=>{this.$whiteboardView.classList.add(this.wrapClassName("wb-view-hidden")),this.viewer.setPlaying()},this.onRenderEnd=()=>{},this.onPageChanged=()=>{clearTimeout(this._onPageChangedTimer),this._onPageChangedTimer=setTimeout(this._onPageChanged,200)},this._onPageChangedTimer=0,this._onPageChanged=()=>{this.$overlay.style.opacity="",this.$whiteboardView.classList.remove(this.wrapClassName("wb-view-hidden"))},this.refreshPages=()=>{this.slideController&&(this.viewer.pages=od(this.slideController.slide,this.slideController.previewList),this.viewer.setPageIndex(this.getPageIndex(this.slideController.page)),this.scaleDocsToFit())},this.scaleDocsToFit=()=>{if(this.slideController){const{width:ut,height:_t}=this.slideController.slide;ut&&_t&&(this.whiteboardView.moveCameraToContain({originX:-ut/2,originY:-_t/2,width:ut,height:_t,animationMode:"immediately"}),this.whiteboardView.setCameraBound({damping:1,maxContentMode:()=>this.whiteboardView.camera.scale,minContentMode:()=>this.whiteboardView.camera.scale,centerX:0,centerY:0,width:ut,height:_t}),this.isViewMounted||(this.isViewMounted=!0,console.log("[Slide] mount whiteboard view"),this.mountWhiteboard(this.$whiteboardView)))}},this.onPlay=()=>{this.slideController&&this.slideController.slide.nextStep()},this.onNewPageIndex=(ut,_t)=>{this.slideController&&this.slideController.jumpToPage(ut+1,_t)},this.sideEffect=new bs,this.namespace="netless-app-slide",this.toPdf=async()=>{if(!this.slideController){this.reportProgress(100,null);return}const{slide:ut}=this.slideController,_t=1920,xt=document.createElement("canvas"),N=xt.getContext("2d"),{slideCount:R,width:B,height:W}=ut;let O=Math.floor(B),j=Math.floor(W);O>_t&&(O=_t,j=Math.floor(W*O/B)),j>_t&&(j=_t,O=Math.floor(B*j/W)),xt.width=O,xt.height=j;const $=document.createElement("canvas");$.width=O,$.height=j;const G=$.getContext("2d");if(!G||!this.getWhiteSnapshot||!N)return this.reportProgress(100,null),null;const Lt=O>j?"l":"p",{jsPDF:Vt}=await import("jspdf"),st=new Vt({format:[O,j],orientation:Lt,compress:!0});for(let pt=1;pt<=R;pt++){let tt=null;try{tt=await this.slideController.slide.snapshotWithTimingEnd(pt)}catch{}if(tt){const J=document.createElement("img");J.src=tt,await new Promise(ct=>J.onload=ct),N.drawImage(J,0,0,O,j)}G.clearRect(0,0,O,j),await this.getWhiteSnapshot(pt,$,G,B,W);try{const J=$.toDataURL("image/png"),ct=document.createElement("img");ct.src=J,await new Promise(it=>ct.onload=it),N.drawImage(ct,0,0,O,j)}catch{}const vt=xt.toDataURL("image/jpeg",.6);pt>1&&st.addPage(),st.addImage(vt,"JPEG",0,0,O,j,"","FAST"),N.clearRect(0,0,O,j),Math.ceil(pt/R*100)<100&&this.reportProgress(Math.ceil(pt/R*100),null)}const z=st.output("arraybuffer"),U=this.box.title;this.reportProgress(100,{pdf:z,title:U})},this.context=w,this.box=v,this.whiteboardView=I,this.mountSlideController=E,this.mountWhiteboard=P,this.onNavigate=et||R_,this.baseScenePath=D,this.enableScale=X!=null?X:!1,this.appId=F,this.viewer=new Jh({readonly:v.readonly,onNewPageIndex:this.onNewPageIndex,onPlay:this.onPlay,urlInterrupter:V,onPagesReady:Z}),this.sideEffect.add(()=>{const ut=_t=>{this.setReadonly(_t)};return v.events.on("readonly",ut),()=>v.events.off("readonly",ut)}),this.sideEffect.add(()=>{const ut=_t=>{_t.data.type==="@netless/_request_save_pdf_"&&_t.data.appId===this.appId&&this.toPdf().catch(()=>this.reportProgress(100,null))};return window.addEventListener("message",ut),()=>{window.removeEventListener("message",ut)}}),this.render(),this.sideEffect.add(()=>{const ut=xt=>{this.resizableContainer&&this.resizableContainer.scaleContainer(xt)};console.log("[SlideDocsViewer] Initial storage state:",this.context.storage.state),console.log("[SlideDocsViewer] Initial slideScale:",this.context.storage.state.slideScale),this.context.storage.state.slideScale!==void 0?(console.log("[SlideDocsViewer] Applying initial slideScale:",this.context.storage.state.slideScale),ut(this.context.storage.state.slideScale)):console.log("[SlideDocsViewer] No initial slideScale found");const _t=xt=>{var N,R;if(xt.slideScale!==void 0){const B=xt.slideScale.newValue;ut(B!=null?B:1)}if(xt.translateX!==void 0||xt.translateY!==void 0){const B=this.resizableContainer.getTranslate(),W=xt.translateX?(N=xt.translateX.newValue)!=null?N:.5:B.x,O=xt.translateY?(R=xt.translateY.newValue)!=null?R:.5:B.y;this.resizableContainer&&this.resizableContainer.handleNormalizeTranslate(W,O,{triggerScrollBar:!0,triggerSync:!1})}};return console.log("[SlideDocsViewer] Adding storage state listener"),this.context.storage.onStateChanged.addListener(_t),()=>{console.log("[SlideDocsViewer] Removing storage state listener"),this.context.storage.onStateChanged.removeListener(_t)}})}setJustSildeReadonly(w){var v;this.justSildeReadonly=w,(v=this.slideController)==null||v.slide.setInteractive(!this.justSildeReadonly)}render(){this.resizableContainer||(this.resizableContainer=new M_(this.viewer.$content,this.context,this.enableScale)),this.renderSlideContainer(),this.renderWhiteboardView(),this.renderOverlay(),this.resizableContainer.addSlideContainer(this.$slide),this.resizableContainer.addWhiteboardContainer(this.$whiteboardView),this.viewer.$content.appendChild(this.$overlay),this.sideEffect.addEventListener(window,"keydown",w=>{if(!this.justSildeReadonly&&this.box.focus&&this.slideController&&!rv(w.target))switch(w.key){case"ArrowUp":case"ArrowLeft":{this.slideController.slide.prevStep(),this.onNavigate(this.slideController.page,"keydown");break}case"ArrowRight":case"ArrowDown":{this.slideController.slide.nextStep(),this.onNavigate(this.slideController.page,"keydown");break}}})}renderOverlay(){if(!this.$overlay){const w=document.createElement("div");w.className=this.wrapClassName("overlay"),this.$overlay=w}return this.$overlay}renderSlideContainer(){if(!this.$slide){const w=document.createElement("div");w.className=this.wrapClassName("slide"),w.dataset.appKind="Slide",this.$slide=w}return this.$slide}renderWhiteboardView(){return this.$whiteboardView||(this.$whiteboardView=document.createElement("div"),this.$whiteboardView.className=this.wrapClassName("wb-view")),this.$whiteboardView}mount(){return this.box.mountContent(this.viewer.$content),this.box.mountFooter(this.viewer.$footer),this.slideController=this.mountSlideController({anchor:this.$slide,onRenderStart:this.onRenderStart,onRenderEnd:this.onRenderEnd,onTransitionStart:this.viewer.setPlaying,onTransitionEnd:this.viewer.setPaused,onReady:this.refreshPages,onNavigate:this.onNavigate,onError:this.onError}),this.resizableContainer.setSlideObject(this.slideController.slide),this.scaleDocsToFit(),this.sideEffect.add(()=>(this.whiteboardView.callbacks.on("onSizeUpdated",this.scaleDocsToFit),()=>this.whiteboardView.callbacks.off("onSizeUpdated",this.scaleDocsToFit))),this}getPageIndex(w){return(w>0?w:1)-1}unmount(){return this.slideController&&(this.slideController.destroy(),this.slideController=null),this.viewer.unmount(),this.resizableContainer.destroy(),this}setReadonly(w){this.viewer.setReadonly(w)}destroy(){this.sideEffect.flushAll(),this.unmount(),this.viewer.destroy()}toggleClickThrough(w){this.$whiteboardView.style.pointerEvents=!w||C_.has(w)?"none":"auto"}wrapClassName(w){return`${this.namespace}-${w}`}async getWhiteSnapshot(w,v,I,E,P){const D={centerX:0,centerY:0,scale:Math.min(v.width/E,v.height/P)},F=`${this.baseScenePath}/${w}`,V=this.context.manager.windowManger;V._appliancePlugin?await V._appliancePlugin.screenshotToCanvasAsync(I,F,v.width,v.height,D):this.whiteboardView.screenshotToCanvas(I,F,v.width,v.height,D)}reportProgress(w,v){window.postMessage({type:"@netless/_result_save_pdf_",appId:this.appId,progress:w,result:v})}}Xn.useFreezer=!1,Xn.FreezerLength=2;function I_(){return Xn.FreezerLength}function P_(b){Xn.FreezerLength=b<1?1/0:b}const da=b=>"["+b+"]",cl={map:new Map,boxes:new Map,queue:[],validateQueue(){for(this.queue.sort((b,w)=>{var E,P,D,F;const v=(P=(E=this.boxes.get(b))==null?void 0:E.zIndex)!=null?P:0,I=(F=(D=this.boxes.get(w))==null?void 0:D.zIndex)!=null?F:0;return-(v-I)}),Si("[Slide] freezer: validate",da(this.queue));this.queue.length>Xn.FreezerLength;){const b=this.queue.pop(),w=this.map.get(b);w&&(Si("[Slide] freezer: validate-freeze",b,da(this.queue)),w.freeze())}},set(b,w,v){Si("[Slide] freezer: add",b,da(this.queue)),this.map.set(b,w),this.boxes.set(b,v),this.queue.includes(b)||this.queue.unshift(b),this.validateQueue()},delete(b){this.map.delete(b),this.boxes.delete(b),this.queue=this.queue.filter(w=>w!==b),Si("[Slide] freezer: delete",b,da(this.queue))},focus(b){const w=this.map.get(b),v=this.queue.indexOf(b);v>-1&&this.queue.splice(v,1),this.queue.unshift(b),this.validateQueue(),Si("[Slide] freezer: focus",b,da(this.queue)),w&&w.unfreeze()}},Zh=new Set;function O_(b){return Zh.add(b),()=>Zh.delete(b)}const Kh=new Set;function L_(b){return Kh.add(b),()=>Kh.delete(b)}const N_=b=>{Xn.useFreezer=!0,b.on("focus",({appId:w})=>{cl.focus(w)}),b.on("created",({appId:w})=>{Zh.forEach(v=>v(w))}),b.on("destroy",({appId:w})=>{Kh.forEach(v=>v(w))})};var jd=`.netless-app-slide-content{position:relative;height:100%;overflow:hidden}.netless-app-slide-preview-mask{display:none;position:absolute;z-index:200;top:0;left:0;width:100%;height:100%}.netless-app-slide-preview{display:flex;flex-direction:column;align-items:center;position:absolute;z-index:300;top:0;left:0;width:33%;max-width:200px;height:100%;padding-top:10px;transform:translate(-100%);background:rgba(237,237,240,.9);box-shadow:inset -1px 0 #0000001c;transition:transform .4s}.netless-app-slide-preview-active .netless-app-slide-preview-mask{display:block}.netless-app-slide-preview-active .netless-app-slide-preview{transform:translate(0)}.netless-app-slide-preview-page{position:relative;display:block;width:55%;margin-bottom:10px;font-size:0;color:transparent;outline:none;border:7px solid transparent;border-radius:4px;transition:border-color .3s;user-select:none}.netless-app-slide-preview-page:hover,.netless-app-slide-preview-page.netless-app-slide-preview-page-active{border-color:#444e601a}.netless-app-slide-preview-page>img{width:100%;height:auto;box-sizing:border-box;border:1px solid rgba(0,0,0,.5);border-radius:1px;background-color:#fff;box-shadow:0 2px 8px #0000004d}.netless-app-slide-preview-page-name{position:absolute;top:1px;left:-10px;transform:translate(-100%);text-align:right;font-size:12px;color:#5f5f5f;user-select:none}.netless-app-slide-footer{box-sizing:border-box;height:26px;display:flex;align-items:center;padding:0 16px;border-top:1px solid #eeeef7;color:#191919}.netless-app-slide-float-footer{width:100%;min-height:26px;position:absolute;left:0;bottom:0;z-index:2000;background:rgba(249,249,252,.9);transition:opacity .4s}.netless-app-slide-footer-btn{box-sizing:border-box;width:26px;height:26px;font-size:0;margin:0;padding:3px;border:none;border-radius:1px;outline:none;color:currentColor;background:transparent;transition:background .4s;cursor:pointer;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.netless-app-slide-footer-btn:hover{background:rgba(237,237,240,.9)}@media (hover: none){.netless-app-slide-footer-btn:hover{background:transparent!important}}.netless-app-slide-footer-btn>svg{width:100%;height:100%}.netless-app-slide-footer-btn>svg:nth-of-type(2){display:none}.netless-app-slide-footer-btn.netless-app-slide-footer-btn-playing>svg:nth-of-type(1){display:none}.netless-app-slide-footer-btn.netless-app-slide-footer-btn-playing>svg:nth-of-type(2){display:initial}.netless-app-slide-footer-btn~.netless-app-slide-footer-btn{margin-left:15px}.netless-app-slide-page-jumps{flex:1;display:flex;justify-content:center;align-items:center}.netless-app-slide-page-number{margin-left:auto;font-size:13px;user-select:none;white-space:nowrap;word-break:keep-all}.netless-app-slide-page-number-input{border:none;outline:none;width:3em;margin:0;padding:0 2px;text-align:right;font-size:13px;line-height:1;font-weight:400;font-family:inherit;border-radius:2px;color:currentColor;background:transparent;transition:background .4s;user-select:text;-webkit-tap-highlight-color:rgba(0,0,0,0)}.netless-app-slide-page-number-input:hover,.netless-app-slide-page-number-input:focus,.netless-app-slide-page-number-input:active{background:#fff;box-shadow:#63636333 0 2px 8px}.netless-app-slide-readonly.netless-app-slide-footer{display:none}.telebox-color-scheme-dark .netless-app-slide-page-number-input{color:#a6a6a8}.telebox-color-scheme-dark .netless-app-slide-page-number-input:active,.telebox-color-scheme-dark .netless-app-slide-page-number-input:focus,.telebox-color-scheme-dark .netless-app-slide-page-number-input:hover{color:#222}.telebox-color-scheme-dark .netless-app-slide-footer{color:#a6a6a8;background:#2d2d33;border-top:none}.telebox-color-scheme-dark .netless-app-slide-footer-btn:hover{background:#212126}.telebox-color-scheme-dark .netless-app-slide-preview{background:rgba(50,50,50,.9)}.netless-app-slide-wb-view{position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;overflow:hidden;transition:opacity .2s}.netless-app-slide-wb-view-hidden{opacity:0}.netless-app-slide-overlay{display:flex;align-items:center;justify-content:center;position:absolute;z-index:200;top:0;left:0;width:100%;height:100%;padding:8px;background:rgba(255,0,0,.25);transition:opacity .3s;opacity:0;pointer-events:none}.netless-app-slide-slide{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.netless-app-slide-slide canvas{transform:scale(var(--netless-app-slide-scale, 1))}
8029
- `;function D_({container:b,taskId:w,resourceList:v=[],url:I=Dh,debug:E=!1}){if(!w)throw new Error("[Slide] taskId is required");b.style.cssText+="display:flex;flex-direction:column";const P=new zd({target:b});return P.debug=!!E,P.mount(w,I,v),P}class zd{constructor(w){this.slide=null,this.debug=!1,this.previewList=[],this.sideEffect=new bs,this.ready=!1,this.readyPromise=new Promise(v=>{this.resolveReady=()=>{this.ready=!0,v()}}),this.hotkeyListener=v=>{if(this.slide)switch(v.key){case"ArrowUp":case"ArrowLeft":{this.slide.prevStep();break}case"ArrowRight":case"ArrowDown":{this.slide.nextStep();break}}},this.onPageChanged=v=>{this.viewer.setPageIndex(v-1)},this.onTransitionStart=()=>{this.viewer.setPlaying()},this.onTransitionEnd=()=>{this.viewer.setPaused()},this.onError=({error:v})=>{this.viewer.setPaused(),console.warn("[Slide] render error",v)},this.destroyed=!1,this.refreshPages=()=>{this.slide&&(this.viewer.pages=od(this.slide,this.previewList),this.viewer.setPageIndex(this.getPageIndex(this.slide.slideState.currentSlideIndex)))},this.onPlay=()=>{this.slide&&this.slide.nextStep()},this.onNewPageIndex=v=>{this.slide&&this.slide.slideCount>0&&this.slide.renderSlide(Kc(v+1,1,this.slide.slideCount))},this.namespace="netless-app-slide",this.target=w.target,this.bgColor=rd(this.target),this.viewer=new Jh({readonly:!1,onNewPageIndex:this.onNewPageIndex,onPlay:this.onPlay}),this.render()}render(){this.viewer.$content.appendChild(this.renderSlideContainer()),this.registerHotKeys(window)}registerHotKeys(w){this.sideEffect.addEventListener(w,"keydown",this.hotkeyListener,void 0,"hotkey")}mount(w,v,I,E=[]){this.target.appendChild(this.renderStyle()),this.target.appendChild(this.viewer.$content),this.target.appendChild(this.viewer.$footer),this.slide=new ai.Slide({anchor:this.$slide,interactive:!0,mode:"local",controller:this.debug,enableGlobalClick:!0,renderOptions:{minFPS:25,maxFPS:30,autoFPS:!0,autoResolution:!0,transactionBgColor:this.bgColor}}),this.registerEventListeners(),I.length>0?this.slide.setResourceList(w,I):this.slide.setResource(w,v),this.slide.renderSlide(1),this.previewList=E}renderStyle(){const w=document.createElement("style");return w.appendChild(document.createTextNode(jd)),w}registerEventListeners(){if(!this.slide)return;const{slide:w}=this;w.on(ai.SLIDE_EVENTS.slideChange,this.onPageChanged),w.on(ai.SLIDE_EVENTS.renderStart,this.onTransitionStart),w.on(ai.SLIDE_EVENTS.renderEnd,this.onTransitionEnd),w.on(ai.SLIDE_EVENTS.mainSeqStepStart,this.onTransitionStart),w.on(ai.SLIDE_EVENTS.mainSeqStepEnd,this.onTransitionEnd),w.on(ai.SLIDE_EVENTS.renderError,this.onError),w.on(ai.SLIDE_EVENTS.renderEnd,this.resolveReady),this.readyPromise.then(this.refreshPages)}destroy(){this.sideEffect.flushAll(),this.slide&&!this.destroyed&&(this.slide.destroy(),this.destroyed=!0),this.viewer.destroy()}getPageIndex(w){return(w>0?w:1)-1}renderSlideContainer(){if(!this.$slide){const w=document.createElement("div");w.className=this.wrapClassName("slide"),w.dataset.appKind="Slide",this.$slide=w}return this.$slide}wrapClassName(w){return`${this.namespace}-${w}`}}const F_=ai.Slide.usePlugin.bind(ai.Slide),Qh="0.2.89",B_={kind:"Slide",setup(b){var X,Z,et,ut;if(console.log("[Slide] setup @ "+Qh),b.getIsWritable()&&b.storage.ensureState(Fh),!b.storage.state.taskId)throw new Error("[Slide] no taskId");const w=b.getView();if(!w)throw new Error("[Slide] no view, please set scenePath on addApp()");w.disableCameraTransform=!0;const v=b.getBox();v.mountStyles(jd);try{v.$content.dataset.appSlideVersion=Qh}catch{}const I=b.getInitScenePath();let E=null;const P=_t=>{const xt=b.getRoom();if(E&&E.slideController){let N=!1;xt&&b.getIsWritable()&&(Nh(xt,b,E.slideController.slide,I),N=!0),Si("[Slide] page to",_t,N?"(synced)":""),E.viewer.setPageIndex(_t-1),E.viewer.setPaused(),E.onPageChanged();const R=E.viewer.pages.length;R>0&&b.dispatchAppEvent("pageStateChange",{index:_t-1,length:R})}},D=_t=>{const xt=b.getAppOptions()||{},N=new ad({context:b,..._t,onPageChanged:P,onNavigate:_t.onNavigate,onRenderError:xt.onRenderError,showRenderError:xt.showRenderError,invisibleBehavior:xt.invisibleBehavior});return Xn.useFreezer&&cl.set(b.appId,N,v),Ar.setAppController(b.appId,N),N.readyPromise.then(_t.onReady).then(()=>{const R=b.getRoom();let B=!1;R&&b.getIsWritable()&&(Nh(R,b,N.slide,I),B=!0);const W=N.slide.slideState.currentSlideIndex;Si("[Slide] page to",W,B?"(synced)":"","(on ready)"),N.slide.on("renderEnd",_t.onRenderEnd)}),N};E=new Hd({context:b,box:v,view:w,mountSlideController:D,mountWhiteboard:b.mountView.bind(b),baseScenePath:I,appId:b.appId,urlInterrupter:(X=b.getAppOptions())==null?void 0:X.urlInterrupter,enableScale:(et=(Z=b.getAppOptions())==null?void 0:Z.enableScale)!=null?et:!1,onPagesReady:({length:_t})=>{const xt=(E==null?void 0:E.viewer.pageIndex)||0;b.dispatchAppEvent("pageStateChange",{index:xt,length:_t})},onNavigate:(_t,xt)=>{Si("[Slide] user navigate to",_t,xt?`(${xt})`:"")}}),(ut=b.getAppOptions())!=null&&ut.justSildeReadonly&&(E==null||E.setJustSildeReadonly(!0));const F=b.getRoom(),V=new bs;return V.add(()=>{var _t;return Ar.setAppContext(b.appId,b),Ar.enable=((_t=b.getAppOptions())==null?void 0:_t.debug)||!1,Ar.level="debug",()=>Ar.deleteApp(b.appId)}),F&&(E.toggleClickThrough(F.state.memberState.currentApplianceName),V.add(()=>{const _t=xt=>{xt.memberState&&E&&E.toggleClickThrough(xt.memberState.currentApplianceName)};return F.callbacks.on("onRoomStateChanged",_t),()=>F.callbacks.off("onRoomStateChanged",_t)})),b.emitter.on("destroy",()=>{Si("[Slide] destroy",b.appId),Xn.useFreezer&&cl.delete(b.appId),V.flushAll(),E&&(E.destroy(),E=null)}),E.mount(),{onScaleChanged:_t=>{!E||(E.resizableContainer.onScaleChanged=_t)},scaleView:_t=>{let xt=Number(_t);Number.isNaN(xt)&&(xt=1),xt<1&&(xt=1),xt>4&&(xt=4),b.storage.setState({slideScale:xt}),b.storage.setState({translateX:.5,translateY:.5}),E==null||E.resizableContainer.scaleContainer(xt)},getViewScale:()=>E==null?void 0:E.resizableContainer.getScale(),translateView:(_t,xt)=>{var N,R;if(E!=null&&E.resizableContainer){const B=E.resizableContainer,W=b.getBox().$content.getBoundingClientRect(),O=B.container.getBoundingClientRect(),j=O.width-W.width,$=O.height-W.height;if(j>0||$>0){const G=(N=B.translateX)!=null?N:.5,Lt=(R=B.translateY)!=null?R:.5,Vt=j>0?_t/j:0,st=$>0?xt/$:0,z=Math.max(0,Math.min(1,G+Vt)),U=Math.max(0,Math.min(1,Lt+st));b.storage.setState({translateX:z,translateY:U}),B.handleNormalizeTranslate(z,U,{triggerScrollBar:!0,triggerSync:!1})}}},setSildeReadonly:_t=>{E==null||E.setJustSildeReadonly(_t)},viewer:()=>E,controller:()=>E==null?void 0:E.slideController,slide:()=>{var _t;return(_t=E==null?void 0:E.slideController)==null?void 0:_t.slide},nextStep:()=>{var _t;return E&&E.slideController?((_t=E==null?void 0:E.slideController)==null||_t.slide.nextStep(),!0):!1},prevStep:()=>{var _t;return E&&E.slideController?((_t=E==null?void 0:E.slideController)==null||_t.slide.prevStep(),!0):!1},position:()=>{const _t=E==null?void 0:E.slideController;if(_t)return[_t.page,_t.pageCount]},nextPage:()=>{const _t=E==null?void 0:E.slideController;if(_t){const{page:xt,pageCount:N}=_t;if(N>0&&xt<N)return _t.jumpToPage(xt+1),!0}return!1},prevPage:()=>{const _t=E==null?void 0:E.slideController;if(_t){const{page:xt,pageCount:N}=_t;if(N>0&&xt>1)return _t.jumpToPage(xt-1),!0}return!1},jumpToPage:_t=>{const xt=E==null?void 0:E.slideController;if(xt){const{page:N,pageCount:R}=xt;if(R>0&&N>0&&N<=R)return xt.jumpToPage(_t),!0}return!1}}}};return Xn.DefaultUrl=Dh,Xn.DocsViewer=Jh,Xn.SideEffectManager=bs,Xn.Slide=ai.Slide,Xn.SlideController=ad,Xn.SlideControllerBase=sd,Xn.SlideDocsViewer=Hd,Xn.SlidePreviewer=zd,Xn.addHooks=N_,Xn.apps=cl,Xn.default=B_,Xn.getFreezerLength=I_,Xn.log=Si,Xn.logger=Ar,Xn.onCreated=O_,Xn.onDestroyed=L_,Xn.previewSlide=D_,Xn.setFreezerLength=P_,Xn.syncSceneWithSlide=Nh,Xn.usePlugin=F_,Xn.version=Qh,Object.defineProperties(Xn,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Xn}({});
8028
+ `,this.addThumbDragListener(F,"vertical",D,P),I.appendChild(F),this.container.appendChild(I),this.verticalScrollBar=I}addThumbDragListener(w,v,I,E){let P=0,D=0;const F=(_t,xt)=>{v==="horizontal"?this.isDraggingHorizontal=!0:this.isDraggingVertical=!0,P=v==="horizontal"?_t:xt,D=v==="horizontal"?parseFloat(w.style.left)||0:parseFloat(w.style.top)||0,w.style.cursor="grabbing"},V=(_t,xt)=>{var $,G;if(!(v==="horizontal"?this.isDraggingHorizontal:this.isDraggingVertical))return;const B=(v==="horizontal"?_t:xt)-P;let W=D+B;W=Math.max(1,Math.min(E-I-1,W)),v==="horizontal"?w.style.left=`${W}px`:w.style.top=`${W}px`;const O=E-I-2;let j=0;O>0&&(j=(W-1)/O,j=Math.max(0,Math.min(1,j))),v==="horizontal"?this.resizableContainer.handleNormalizeTranslate(j,($=this.resizableContainer.translateY)!=null?$:.5,{triggerScrollBar:!1,triggerSync:!0}):this.resizableContainer.handleNormalizeTranslate((G=this.resizableContainer.translateX)!=null?G:.5,j,{triggerScrollBar:!1,triggerSync:!0})},X=()=>{v==="horizontal"?this.isDraggingHorizontal=!1:this.isDraggingVertical=!1,w.style.cursor="grab"},Z=_t=>{F(_t.clientX,_t.clientY),_t.preventDefault()},et=_t=>{V(_t.clientX,_t.clientY)},ut=()=>{X()};this.addTrackedListener(w,"mousedown",Z),this.addTrackedListener(document,"mousemove",et),this.addTrackedListener(document,"mouseup",ut)}destroy(){this.clearScrollBars()}}class M_{constructor(w,v,I){this.onScaleChanged=null,this.whiteboardContainer=null,this.slide=null,this.scale=1,this.resizeObserver=null,this.slideWidth=1,this.slideHeight=1,this.scrollBar=null,this.translateX=.5,this.translateY=.5,this.updateSlideSize=()=>{if(this.slide){let E=!1;(this.slideWidth!==this.slide.width||this.slideHeight!==this.slide.height)&&(this.slideWidth=this.slide.width,this.slideHeight=this.slide.height,E=!0),E&&this.updateResizableContainer()}},this.enableResize=I,this.parent=w,this.context=v,this.root=document.createElement("div"),this.root.style.width="100%",this.root.style.height="100%",this.root.style.overflow="hidden",this.parent.appendChild(this.root),this.scrollContainer=document.createElement("div"),this.scrollContainer.setAttribute("data-resizable-scroll","true"),this.scrollContainer.style.width="100%",this.scrollContainer.style.height="100%",this.scrollContainer.style.position="relative",this.scrollContainer.style.overflow="hidden",this.container=document.createElement("div"),this.container.style.position="relative",this.container.setAttribute("data-resizable-container","true"),this.scrollContainer.appendChild(this.container),this.root.appendChild(this.scrollContainer),this.enableResize&&(this.scrollBar=new A_(this.root,this)),this.resizeObserver=new ResizeObserver(()=>{this.updateResizableContainer()}),this.resizeObserver.observe(this.scrollContainer)}getTranslate(){return{x:this.translateX,y:this.translateY}}getScale(){return this.scale}renderScrollBar(w,v,I,E){this.scrollBar&&this.scrollBar.render(w,I,v,E)}setSlideObject(w){this.slide=w,this.slide.on("renderEnd",this.updateSlideSize)}updateResizableContainer(){const w=this.scrollContainer.getBoundingClientRect();if(this.container.style.width=`${w.width*this.scale}px`,this.container.style.height=`${w.height*this.scale}px`,this.whiteboardContainer&&this.enableResize){const v=this.whiteboardContainer.getBoundingClientRect();if(v.width/v.height>this.slideWidth/this.slideHeight){const I=v.height*this.slideWidth/this.slideHeight,E=(v.width-I)/2;this.whiteboardContainer.style.clipPath=`inset(0px ${E}px 0px ${E}px)`}else if(v.width/v.height<this.slideWidth/this.slideHeight){const I=v.width*this.slideHeight/this.slideWidth,E=(v.height-I)/2;this.whiteboardContainer.style.clipPath=`inset(${E}px 0px ${E}px 0px)`}}this.translateX=.5,this.translateY=.5,this.renderScrollBar(w.width,w.width*this.scale,w.height,w.height*this.scale),this.handleNormalizeTranslate(this.translateX,this.translateY,{triggerScrollBar:!0,triggerSync:!0})}handleNormalizeTranslate(w,v,I){var V;if(Math.abs(w-this.translateX)<.001&&Math.abs(v-this.translateY)<.001&&!I.triggerSync)return;const E=this.scrollContainer.getBoundingClientRect(),P=this.container.getBoundingClientRect(),D=-w*(P.width-E.width),F=-v*(P.height-E.height);this.translateX=w,this.translateY=v,this.container.style.transform=`translate(${D}px, ${F}px)`,I.triggerScrollBar&&((V=this.scrollBar)==null||V.handleNormalizeTranslate(w,v)),I.triggerSync&&this.context.storage.setState({translateX:this.translateX,translateY:this.translateY})}scaleContainer(w){Math.abs(this.scale-w)<.001||!this.enableResize||(w>1?(this.scrollContainer.style.width="calc(100% - 6px)",this.scrollContainer.style.height="calc(100% - 6px)"):(this.scrollContainer.style.width="100%",this.scrollContainer.style.height="100%"),w=this.enableResize?w:1,this.onScaleChanged&&this.enableResize&&this.onScaleChanged(w),this.scale=w,setTimeout(()=>{this.updateResizableContainer()}))}addSlideContainer(w){this.container.appendChild(w)}addWhiteboardContainer(w){this.container.appendChild(w),this.whiteboardContainer=w}getCurrentScale(){return this.scale}destroy(){var w,v;(w=this.resizeObserver)==null||w.disconnect(),(v=this.scrollBar)==null||v.destroy()}}const C_=new Set(["clicker"]),R_=function(){};class Hd{constructor({context:w,box:v,view:I,mountSlideController:E,mountWhiteboard:P,baseScenePath:D,appId:F,urlInterrupter:V,enableScale:X,onPagesReady:Z,onNavigate:et}){this.slideController=null,this.isViewMounted=!1,this.justSildeReadonly=!1,this.onError=({error:ut,index:_t})=>{var xt,N;this.viewer.setPaused(),(xt=this.slideController)!=null&&xt.showRenderError&&(this.$overlay.textContent=`Error on slide[page=${this.slideController.page}]: ${ut.message}`,this.$overlay.style.opacity="1"),(N=this.slideController)!=null&&N.onRenderError&&this.slideController.onRenderError(ut,_t),Ar.warn("[Slide] render error",ut)},this.onRenderStart=()=>{this.$whiteboardView.classList.add(this.wrapClassName("wb-view-hidden")),this.viewer.setPlaying()},this.onRenderEnd=()=>{},this.onPageChanged=()=>{clearTimeout(this._onPageChangedTimer),this._onPageChangedTimer=setTimeout(this._onPageChanged,200)},this._onPageChangedTimer=0,this._onPageChanged=()=>{this.$overlay.style.opacity="",this.$whiteboardView.classList.remove(this.wrapClassName("wb-view-hidden"))},this.refreshPages=()=>{this.slideController&&(this.viewer.pages=od(this.slideController.slide,this.slideController.previewList),this.viewer.setPageIndex(this.getPageIndex(this.slideController.page)),this.scaleDocsToFit())},this.scaleDocsToFit=()=>{if(this.slideController){const{width:ut,height:_t}=this.slideController.slide;ut&&_t&&(this.whiteboardView.moveCameraToContain({originX:-ut/2,originY:-_t/2,width:ut,height:_t,animationMode:"immediately"}),this.whiteboardView.setCameraBound({damping:1,maxContentMode:()=>this.whiteboardView.camera.scale,minContentMode:()=>this.whiteboardView.camera.scale,centerX:0,centerY:0,width:ut,height:_t}),this.isViewMounted||(this.isViewMounted=!0,console.log("[Slide] mount whiteboard view"),this.mountWhiteboard(this.$whiteboardView)))}},this.onPlay=()=>{this.slideController&&this.slideController.slide.nextStep()},this.onNewPageIndex=(ut,_t)=>{this.slideController&&this.slideController.jumpToPage(ut+1,_t)},this.sideEffect=new bs,this.namespace="netless-app-slide",this.toPdf=async()=>{if(!this.slideController){this.reportProgress(100,null);return}const{slide:ut}=this.slideController,_t=1920,xt=document.createElement("canvas"),N=xt.getContext("2d"),{slideCount:R,width:B,height:W}=ut;let O=Math.floor(B),j=Math.floor(W);O>_t&&(O=_t,j=Math.floor(W*O/B)),j>_t&&(j=_t,O=Math.floor(B*j/W)),xt.width=O,xt.height=j;const $=document.createElement("canvas");$.width=O,$.height=j;const G=$.getContext("2d");if(!G||!this.getWhiteSnapshot||!N)return this.reportProgress(100,null),null;const Lt=O>j?"l":"p",{jsPDF:Vt}=await import("jspdf"),st=new Vt({format:[O,j],orientation:Lt,compress:!0});for(let pt=1;pt<=R;pt++){let tt=null;try{tt=await this.slideController.slide.snapshotWithTimingEnd(pt)}catch{}if(tt){const J=document.createElement("img");J.src=tt,await new Promise(ct=>J.onload=ct),N.drawImage(J,0,0,O,j)}G.clearRect(0,0,O,j),await this.getWhiteSnapshot(pt,$,G,B,W);try{const J=$.toDataURL("image/png"),ct=document.createElement("img");ct.src=J,await new Promise(it=>ct.onload=it),N.drawImage(ct,0,0,O,j)}catch{}const vt=xt.toDataURL("image/jpeg",.6);pt>1&&st.addPage(),st.addImage(vt,"JPEG",0,0,O,j,"","FAST"),N.clearRect(0,0,O,j),Math.ceil(pt/R*100)<100&&this.reportProgress(Math.ceil(pt/R*100),null)}const z=st.output("arraybuffer"),U=this.box.title;this.reportProgress(100,{pdf:z,title:U})},this.context=w,this.box=v,this.whiteboardView=I,this.mountSlideController=E,this.mountWhiteboard=P,this.onNavigate=et||R_,this.baseScenePath=D,this.enableScale=X!=null?X:!1,this.appId=F,this.viewer=new Jh({readonly:v.readonly,onNewPageIndex:this.onNewPageIndex,onPlay:this.onPlay,urlInterrupter:V,onPagesReady:Z}),this.sideEffect.add(()=>{const ut=_t=>{this.setReadonly(_t)};return v.events.on("readonly",ut),()=>v.events.off("readonly",ut)}),this.sideEffect.add(()=>{const ut=_t=>{_t.data.type==="@netless/_request_save_pdf_"&&_t.data.appId===this.appId&&this.toPdf().catch(()=>this.reportProgress(100,null))};return window.addEventListener("message",ut),()=>{window.removeEventListener("message",ut)}}),this.render(),this.sideEffect.add(()=>{const ut=xt=>{this.resizableContainer&&this.resizableContainer.scaleContainer(xt)};console.log("[SlideDocsViewer] Initial storage state:",this.context.storage.state),console.log("[SlideDocsViewer] Initial slideScale:",this.context.storage.state.slideScale),this.context.storage.state.slideScale!==void 0?(console.log("[SlideDocsViewer] Applying initial slideScale:",this.context.storage.state.slideScale),ut(this.context.storage.state.slideScale)):console.log("[SlideDocsViewer] No initial slideScale found");const _t=xt=>{var N,R;if(xt.slideScale!==void 0){const B=xt.slideScale.newValue;ut(B!=null?B:1)}if(xt.translateX!==void 0||xt.translateY!==void 0){const B=this.resizableContainer.getTranslate(),W=xt.translateX?(N=xt.translateX.newValue)!=null?N:.5:B.x,O=xt.translateY?(R=xt.translateY.newValue)!=null?R:.5:B.y;this.resizableContainer&&this.resizableContainer.handleNormalizeTranslate(W,O,{triggerScrollBar:!0,triggerSync:!1})}};return console.log("[SlideDocsViewer] Adding storage state listener"),this.context.storage.onStateChanged.addListener(_t),()=>{console.log("[SlideDocsViewer] Removing storage state listener"),this.context.storage.onStateChanged.removeListener(_t)}})}setJustSildeReadonly(w){var v;this.justSildeReadonly=w,(v=this.slideController)==null||v.slide.setInteractive(!this.justSildeReadonly)}render(){this.resizableContainer||(this.resizableContainer=new M_(this.viewer.$content,this.context,this.enableScale)),this.renderSlideContainer(),this.renderWhiteboardView(),this.renderOverlay(),this.resizableContainer.addSlideContainer(this.$slide),this.resizableContainer.addWhiteboardContainer(this.$whiteboardView),this.viewer.$content.appendChild(this.$overlay),this.sideEffect.addEventListener(window,"keydown",w=>{if(!this.justSildeReadonly&&this.box.focus&&this.slideController&&!rv(w.target))switch(w.key){case"ArrowUp":case"ArrowLeft":{this.slideController.slide.prevStep(),this.onNavigate(this.slideController.page,"keydown");break}case"ArrowRight":case"ArrowDown":{this.slideController.slide.nextStep(),this.onNavigate(this.slideController.page,"keydown");break}}})}renderOverlay(){if(!this.$overlay){const w=document.createElement("div");w.className=this.wrapClassName("overlay"),this.$overlay=w}return this.$overlay}renderSlideContainer(){if(!this.$slide){const w=document.createElement("div");w.className=this.wrapClassName("slide"),w.dataset.appKind="Slide",this.$slide=w}return this.$slide}renderWhiteboardView(){return this.$whiteboardView||(this.$whiteboardView=document.createElement("div"),this.$whiteboardView.className=this.wrapClassName("wb-view")),this.$whiteboardView}mount(){return this.box.mountContent(this.viewer.$content),this.box.mountFooter(this.viewer.$footer),this.slideController=this.mountSlideController({anchor:this.$slide,onRenderStart:this.onRenderStart,onRenderEnd:this.onRenderEnd,onTransitionStart:this.viewer.setPlaying,onTransitionEnd:this.viewer.setPaused,onReady:this.refreshPages,onNavigate:this.onNavigate,onError:this.onError}),this.resizableContainer.setSlideObject(this.slideController.slide),this.scaleDocsToFit(),this.sideEffect.add(()=>(this.whiteboardView.callbacks.on("onSizeUpdated",this.scaleDocsToFit),()=>this.whiteboardView.callbacks.off("onSizeUpdated",this.scaleDocsToFit))),this}getPageIndex(w){return(w>0?w:1)-1}unmount(){return this.slideController&&(this.slideController.destroy(),this.slideController=null),this.viewer.unmount(),this.resizableContainer.destroy(),this}setReadonly(w){this.viewer.setReadonly(w)}destroy(){this.sideEffect.flushAll(),this.unmount(),this.viewer.destroy()}toggleClickThrough(w){this.$whiteboardView.style.pointerEvents=!w||C_.has(w)?"none":"auto"}wrapClassName(w){return`${this.namespace}-${w}`}async getWhiteSnapshot(w,v,I,E,P){const D={centerX:0,centerY:0,scale:Math.min(v.width/E,v.height/P)},F=`${this.baseScenePath}/${w}`,V=this.context.manager.windowManger;V._appliancePlugin?await V._appliancePlugin.screenshotToCanvasAsync(I,F,v.width,v.height,D):this.whiteboardView.screenshotToCanvas(I,F,v.width,v.height,D)}reportProgress(w,v){window.postMessage({type:"@netless/_result_save_pdf_",appId:this.appId,progress:w,result:v})}}Xn.useFreezer=!1,Xn.FreezerLength=2;function I_(){return Xn.FreezerLength}function P_(b){Xn.FreezerLength=b<1?1/0:b}const da=b=>"["+b+"]",cl={map:new Map,boxes:new Map,queue:[],validateQueue(){for(this.queue.sort((b,w)=>{var E,P,D,F;const v=(P=(E=this.boxes.get(b))==null?void 0:E.zIndex)!=null?P:0,I=(F=(D=this.boxes.get(w))==null?void 0:D.zIndex)!=null?F:0;return-(v-I)}),Si("[Slide] freezer: validate",da(this.queue));this.queue.length>Xn.FreezerLength;){const b=this.queue.pop(),w=this.map.get(b);w&&(Si("[Slide] freezer: validate-freeze",b,da(this.queue)),w.freeze())}},set(b,w,v){Si("[Slide] freezer: add",b,da(this.queue)),this.map.set(b,w),this.boxes.set(b,v),this.queue.includes(b)||this.queue.unshift(b),this.validateQueue()},delete(b){this.map.delete(b),this.boxes.delete(b),this.queue=this.queue.filter(w=>w!==b),Si("[Slide] freezer: delete",b,da(this.queue))},focus(b){const w=this.map.get(b),v=this.queue.indexOf(b);v>-1&&this.queue.splice(v,1),this.queue.unshift(b),this.validateQueue(),Si("[Slide] freezer: focus",b,da(this.queue)),w&&w.unfreeze()}},Zh=new Set;function O_(b){return Zh.add(b),()=>Zh.delete(b)}const Kh=new Set;function L_(b){return Kh.add(b),()=>Kh.delete(b)}const N_=b=>{Xn.useFreezer=!0,b.on("focus",({appId:w})=>{cl.focus(w)}),b.on("created",({appId:w})=>{Zh.forEach(v=>v(w))}),b.on("destroy",({appId:w})=>{Kh.forEach(v=>v(w))})};var jd=`.netless-app-slide-content{position:relative;height:100%;overflow:hidden}.netless-app-slide-preview-mask{display:none;position:absolute;z-index:200;top:0;left:0;width:100%;height:100%}.netless-app-slide-preview{display:flex;flex-direction:column;align-items:center;position:absolute;z-index:300;top:0;left:0;width:33%;max-width:200px;height:100%;padding-top:10px;transform:translate(-100%);background:rgba(237,237,240,.9);box-shadow:inset -1px 0 #0000001c;transition:transform .4s}.netless-app-slide-preview-active .netless-app-slide-preview-mask{display:block}.netless-app-slide-preview-active .netless-app-slide-preview{transform:translate(0)}.netless-app-slide-preview-page{position:relative;display:block;width:55%;margin-bottom:10px;font-size:0;color:transparent;outline:none;border:7px solid transparent;border-radius:4px;transition:border-color .3s;user-select:none}.netless-app-slide-preview-page:hover,.netless-app-slide-preview-page.netless-app-slide-preview-page-active{border-color:#444e601a}.netless-app-slide-preview-page>img{width:100%;height:auto;box-sizing:border-box;border:1px solid rgba(0,0,0,.5);border-radius:1px;background-color:#fff;box-shadow:0 2px 8px #0000004d}.netless-app-slide-preview-page-name{position:absolute;top:1px;left:-10px;transform:translate(-100%);text-align:right;font-size:12px;color:#5f5f5f;user-select:none}.netless-app-slide-footer{box-sizing:border-box;height:26px;display:flex;align-items:center;padding:0 16px;border-top:1px solid #eeeef7;-webkit-user-select:none;-webkit-touch-callout:none;-user-select:none;color:#191919}.netless-app-slide-float-footer{width:100%;min-height:26px;position:absolute;left:0;bottom:0;z-index:2000;background:rgba(249,249,252,.9);transition:opacity .4s}.netless-app-slide-footer-btn{box-sizing:border-box;width:26px;height:26px;font-size:0;margin:0;padding:3px;border:none;border-radius:1px;outline:none;color:currentColor;background:transparent;transition:background .4s;cursor:pointer;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.netless-app-slide-footer-btn:hover{background:rgba(237,237,240,.9)}@media (hover: none){.netless-app-slide-footer-btn:hover{background:transparent!important}}.netless-app-slide-footer-btn>svg{width:100%;height:100%}.netless-app-slide-footer-btn>svg:nth-of-type(2){display:none}.netless-app-slide-footer-btn.netless-app-slide-footer-btn-playing>svg:nth-of-type(1){display:none}.netless-app-slide-footer-btn.netless-app-slide-footer-btn-playing>svg:nth-of-type(2){display:initial}.netless-app-slide-footer-btn~.netless-app-slide-footer-btn{margin-left:15px}.netless-app-slide-page-jumps{flex:1;display:flex;justify-content:center;align-items:center}.netless-app-slide-page-number{margin-left:auto;font-size:13px;user-select:none;white-space:nowrap;word-break:keep-all}.netless-app-slide-page-number-input{border:none;outline:none;width:3em;margin:0;padding:0 2px;text-align:right;font-size:13px;line-height:1;font-weight:400;font-family:inherit;border-radius:2px;color:currentColor;background:transparent;transition:background .4s;user-select:text;-webkit-tap-highlight-color:rgba(0,0,0,0)}.netless-app-slide-page-number-input:hover,.netless-app-slide-page-number-input:focus,.netless-app-slide-page-number-input:active{background:#fff;box-shadow:#63636333 0 2px 8px}.netless-app-slide-readonly.netless-app-slide-footer{display:none}.telebox-color-scheme-dark .netless-app-slide-page-number-input{color:#a6a6a8}.telebox-color-scheme-dark .netless-app-slide-page-number-input:active,.telebox-color-scheme-dark .netless-app-slide-page-number-input:focus,.telebox-color-scheme-dark .netless-app-slide-page-number-input:hover{color:#222}.telebox-color-scheme-dark .netless-app-slide-footer{color:#a6a6a8;background:#2d2d33;border-top:none}.telebox-color-scheme-dark .netless-app-slide-footer-btn:hover{background:#212126}.telebox-color-scheme-dark .netless-app-slide-preview{background:rgba(50,50,50,.9)}.netless-app-slide-wb-view{position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;overflow:hidden;transition:opacity .2s}.netless-app-slide-wb-view-hidden{opacity:0}.netless-app-slide-overlay{display:flex;align-items:center;justify-content:center;position:absolute;z-index:200;top:0;left:0;width:100%;height:100%;padding:8px;background:rgba(255,0,0,.25);transition:opacity .3s;opacity:0;pointer-events:none}.netless-app-slide-slide{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.netless-app-slide-slide canvas{transform:scale(var(--netless-app-slide-scale, 1))}
8029
+ `;function D_({container:b,taskId:w,resourceList:v=[],url:I=Dh,debug:E=!1}){if(!w)throw new Error("[Slide] taskId is required");b.style.cssText+="display:flex;flex-direction:column";const P=new zd({target:b});return P.debug=!!E,P.mount(w,I,v),P}class zd{constructor(w){this.slide=null,this.debug=!1,this.previewList=[],this.sideEffect=new bs,this.ready=!1,this.readyPromise=new Promise(v=>{this.resolveReady=()=>{this.ready=!0,v()}}),this.hotkeyListener=v=>{if(this.slide)switch(v.key){case"ArrowUp":case"ArrowLeft":{this.slide.prevStep();break}case"ArrowRight":case"ArrowDown":{this.slide.nextStep();break}}},this.onPageChanged=v=>{this.viewer.setPageIndex(v-1)},this.onTransitionStart=()=>{this.viewer.setPlaying()},this.onTransitionEnd=()=>{this.viewer.setPaused()},this.onError=({error:v})=>{this.viewer.setPaused(),console.warn("[Slide] render error",v)},this.destroyed=!1,this.refreshPages=()=>{this.slide&&(this.viewer.pages=od(this.slide,this.previewList),this.viewer.setPageIndex(this.getPageIndex(this.slide.slideState.currentSlideIndex)))},this.onPlay=()=>{this.slide&&this.slide.nextStep()},this.onNewPageIndex=v=>{this.slide&&this.slide.slideCount>0&&this.slide.renderSlide(Kc(v+1,1,this.slide.slideCount))},this.namespace="netless-app-slide",this.target=w.target,this.bgColor=rd(this.target),this.viewer=new Jh({readonly:!1,onNewPageIndex:this.onNewPageIndex,onPlay:this.onPlay}),this.render()}render(){this.viewer.$content.appendChild(this.renderSlideContainer()),this.registerHotKeys(window)}registerHotKeys(w){this.sideEffect.addEventListener(w,"keydown",this.hotkeyListener,void 0,"hotkey")}mount(w,v,I,E=[]){this.target.appendChild(this.renderStyle()),this.target.appendChild(this.viewer.$content),this.target.appendChild(this.viewer.$footer),this.slide=new ai.Slide({anchor:this.$slide,interactive:!0,mode:"local",controller:this.debug,enableGlobalClick:!0,renderOptions:{minFPS:25,maxFPS:30,autoFPS:!0,autoResolution:!0,transactionBgColor:this.bgColor}}),this.registerEventListeners(),I.length>0?this.slide.setResourceList(w,I):this.slide.setResource(w,v),this.slide.renderSlide(1),this.previewList=E}renderStyle(){const w=document.createElement("style");return w.appendChild(document.createTextNode(jd)),w}registerEventListeners(){if(!this.slide)return;const{slide:w}=this;w.on(ai.SLIDE_EVENTS.slideChange,this.onPageChanged),w.on(ai.SLIDE_EVENTS.renderStart,this.onTransitionStart),w.on(ai.SLIDE_EVENTS.renderEnd,this.onTransitionEnd),w.on(ai.SLIDE_EVENTS.mainSeqStepStart,this.onTransitionStart),w.on(ai.SLIDE_EVENTS.mainSeqStepEnd,this.onTransitionEnd),w.on(ai.SLIDE_EVENTS.renderError,this.onError),w.on(ai.SLIDE_EVENTS.renderEnd,this.resolveReady),this.readyPromise.then(this.refreshPages)}destroy(){this.sideEffect.flushAll(),this.slide&&!this.destroyed&&(this.slide.destroy(),this.destroyed=!0),this.viewer.destroy()}getPageIndex(w){return(w>0?w:1)-1}renderSlideContainer(){if(!this.$slide){const w=document.createElement("div");w.className=this.wrapClassName("slide"),w.dataset.appKind="Slide",this.$slide=w}return this.$slide}wrapClassName(w){return`${this.namespace}-${w}`}}const F_=ai.Slide.usePlugin.bind(ai.Slide),Qh="0.2.90",B_={kind:"Slide",setup(b){var X,Z,et,ut;if(console.log("[Slide] setup @ "+Qh),b.getIsWritable()&&b.storage.ensureState(Fh),!b.storage.state.taskId)throw new Error("[Slide] no taskId");const w=b.getView();if(!w)throw new Error("[Slide] no view, please set scenePath on addApp()");w.disableCameraTransform=!0;const v=b.getBox();v.mountStyles(jd);try{v.$content.dataset.appSlideVersion=Qh}catch{}const I=b.getInitScenePath();let E=null;const P=_t=>{const xt=b.getRoom();if(E&&E.slideController){let N=!1;xt&&b.getIsWritable()&&(Nh(xt,b,E.slideController.slide,I),N=!0),Si("[Slide] page to",_t,N?"(synced)":""),E.viewer.setPageIndex(_t-1),E.viewer.setPaused(),E.onPageChanged();const R=E.viewer.pages.length;R>0&&b.dispatchAppEvent("pageStateChange",{index:_t-1,length:R})}},D=_t=>{const xt=b.getAppOptions()||{},N=new ad({context:b,..._t,onPageChanged:P,onNavigate:_t.onNavigate,onRenderError:xt.onRenderError,showRenderError:xt.showRenderError,invisibleBehavior:xt.invisibleBehavior});return Xn.useFreezer&&cl.set(b.appId,N,v),Ar.setAppController(b.appId,N),N.readyPromise.then(_t.onReady).then(()=>{const R=b.getRoom();let B=!1;R&&b.getIsWritable()&&(Nh(R,b,N.slide,I),B=!0);const W=N.slide.slideState.currentSlideIndex;Si("[Slide] page to",W,B?"(synced)":"","(on ready)"),N.slide.on("renderEnd",_t.onRenderEnd)}),N};E=new Hd({context:b,box:v,view:w,mountSlideController:D,mountWhiteboard:b.mountView.bind(b),baseScenePath:I,appId:b.appId,urlInterrupter:(X=b.getAppOptions())==null?void 0:X.urlInterrupter,enableScale:(et=(Z=b.getAppOptions())==null?void 0:Z.enableScale)!=null?et:!1,onPagesReady:({length:_t})=>{const xt=(E==null?void 0:E.viewer.pageIndex)||0;b.dispatchAppEvent("pageStateChange",{index:xt,length:_t})},onNavigate:(_t,xt)=>{Si("[Slide] user navigate to",_t,xt?`(${xt})`:"")}}),(ut=b.getAppOptions())!=null&&ut.justSildeReadonly&&(E==null||E.setJustSildeReadonly(!0));const F=b.getRoom(),V=new bs;return V.add(()=>{var _t;return Ar.setAppContext(b.appId,b),Ar.enable=((_t=b.getAppOptions())==null?void 0:_t.debug)||!1,Ar.level="debug",()=>Ar.deleteApp(b.appId)}),F&&(E.toggleClickThrough(F.state.memberState.currentApplianceName),V.add(()=>{const _t=xt=>{xt.memberState&&E&&E.toggleClickThrough(xt.memberState.currentApplianceName)};return F.callbacks.on("onRoomStateChanged",_t),()=>F.callbacks.off("onRoomStateChanged",_t)})),b.emitter.on("destroy",()=>{Si("[Slide] destroy",b.appId),Xn.useFreezer&&cl.delete(b.appId),V.flushAll(),E&&(E.destroy(),E=null)}),E.mount(),{onScaleChanged:_t=>{!E||(E.resizableContainer.onScaleChanged=_t)},scaleView:_t=>{let xt=Number(_t);Number.isNaN(xt)&&(xt=1),xt<1&&(xt=1),xt>4&&(xt=4),b.storage.setState({slideScale:xt}),b.storage.setState({translateX:.5,translateY:.5}),E==null||E.resizableContainer.scaleContainer(xt)},getViewScale:()=>E==null?void 0:E.resizableContainer.getScale(),translateView:(_t,xt)=>{var N,R;if(E!=null&&E.resizableContainer){const B=E.resizableContainer,W=b.getBox().$content.getBoundingClientRect(),O=B.container.getBoundingClientRect(),j=O.width-W.width,$=O.height-W.height;if(j>0||$>0){const G=(N=B.translateX)!=null?N:.5,Lt=(R=B.translateY)!=null?R:.5,Vt=j>0?_t/j:0,st=$>0?xt/$:0,z=Math.max(0,Math.min(1,G+Vt)),U=Math.max(0,Math.min(1,Lt+st));b.storage.setState({translateX:z,translateY:U}),B.handleNormalizeTranslate(z,U,{triggerScrollBar:!0,triggerSync:!1})}}},setSildeReadonly:_t=>{E==null||E.setJustSildeReadonly(_t)},viewer:()=>E,controller:()=>E==null?void 0:E.slideController,slide:()=>{var _t;return(_t=E==null?void 0:E.slideController)==null?void 0:_t.slide},nextStep:()=>{var _t;return E&&E.slideController?((_t=E==null?void 0:E.slideController)==null||_t.slide.nextStep(),!0):!1},prevStep:()=>{var _t;return E&&E.slideController?((_t=E==null?void 0:E.slideController)==null||_t.slide.prevStep(),!0):!1},position:()=>{const _t=E==null?void 0:E.slideController;if(_t)return[_t.page,_t.pageCount]},nextPage:()=>{const _t=E==null?void 0:E.slideController;if(_t){const{page:xt,pageCount:N}=_t;if(N>0&&xt<N)return _t.jumpToPage(xt+1),!0}return!1},prevPage:()=>{const _t=E==null?void 0:E.slideController;if(_t){const{page:xt,pageCount:N}=_t;if(N>0&&xt>1)return _t.jumpToPage(xt-1),!0}return!1},jumpToPage:_t=>{const xt=E==null?void 0:E.slideController;if(xt){const{page:N,pageCount:R}=xt;if(R>0&&N>0&&N<=R)return xt.jumpToPage(_t),!0}return!1}}}};return Xn.DefaultUrl=Dh,Xn.DocsViewer=Jh,Xn.SideEffectManager=bs,Xn.Slide=ai.Slide,Xn.SlideController=ad,Xn.SlideControllerBase=sd,Xn.SlideDocsViewer=Hd,Xn.SlidePreviewer=zd,Xn.addHooks=N_,Xn.apps=cl,Xn.default=B_,Xn.getFreezerLength=I_,Xn.log=Si,Xn.logger=Ar,Xn.onCreated=O_,Xn.onDestroyed=L_,Xn.previewSlide=D_,Xn.setFreezerLength=P_,Xn.syncSceneWithSlide=Nh,Xn.usePlugin=F_,Xn.version=Qh,Object.defineProperties(Xn,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Xn}({});
8030
8030
  //# sourceMappingURL=main.iife.js.map