json-canvas-viewer 3.3.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -156
- package/dist/bridges.cjs +1 -1
- package/dist/bridges.cjs.map +1 -1
- package/dist/bridges.js +1 -1
- package/dist/bridges.js.map +1 -1
- package/dist/chimp.cjs +1 -1
- package/dist/chimp.js +1 -1
- package/dist/controller-BRBUPg_j.js +2 -0
- package/dist/controller-BRBUPg_j.js.map +1 -0
- package/dist/controller-Bc-S4ZVK.cjs +2 -0
- package/dist/controller-Bc-S4ZVK.cjs.map +1 -0
- package/dist/dev.cjs +1 -1
- package/dist/dev.js +1 -1
- package/dist/index-DJQyGIFX.js +2 -0
- package/dist/index-DJQyGIFX.js.map +1 -0
- package/dist/index-DwvIUSbr.cjs +2 -0
- package/dist/index-DwvIUSbr.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/modules.cjs +1 -1
- package/dist/modules.cjs.map +1 -1
- package/dist/modules.js +1 -1
- package/dist/modules.js.map +1 -1
- package/dist/react.cjs +2 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.js +2 -0
- package/dist/react.js.map +1 -0
- package/dist/renderToString-ChykAKof.js +2 -0
- package/dist/renderToString-ChykAKof.js.map +1 -0
- package/dist/renderToString-Cxh5DtRo.cjs +2 -0
- package/dist/renderToString-Cxh5DtRo.cjs.map +1 -0
- package/dist/renderer-0RqgAOLH.js +2 -0
- package/dist/renderer-0RqgAOLH.js.map +1 -0
- package/dist/renderer-BEKV7hr3.cjs +2 -0
- package/dist/renderer-BEKV7hr3.cjs.map +1 -0
- package/dist/types/bridges/reactComponent.d.ts +6 -3
- package/dist/types/bridges/vueComponent.vue.d.ts +7 -2
- package/dist/types/bridges/webpackPlugin.d.ts +7 -0
- package/dist/types/bridges.d.ts +1 -2
- package/dist/types/core/baseModule.d.ts +13 -9
- package/dist/types/core/controller.d.ts +6 -1
- package/dist/types/core/dataManager.d.ts +23 -16
- package/dist/types/core/declarations.d.ts +20 -4
- package/dist/types/core/index.d.ts +16 -5
- package/dist/types/core/interactionHandler.d.ts +3 -1
- package/dist/types/core/overlayManager.d.ts +7 -1
- package/dist/types/core/renderer.d.ts +9 -2
- package/dist/types/core/styleManager.d.ts +48 -0
- package/dist/types/core/utilities.d.ts +3 -6
- package/dist/types/dev.d.ts +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/modules/controls/index.d.ts +4 -1
- package/dist/types/modules/minimap/index.d.ts +5 -1
- package/dist/types/modules/mistouchPreventer/index.d.ts +7 -5
- package/dist/vue.cjs +2 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.js +2 -0
- package/dist/vue.js.map +1 -0
- package/dist/webpackLoader.js +33 -0
- package/package.json +56 -41
- package/dist/controller-CnUlrkdp.cjs +0 -2
- package/dist/controller-CnUlrkdp.cjs.map +0 -1
- package/dist/controller-UN-hOZ_r.js +0 -2
- package/dist/controller-UN-hOZ_r.js.map +0 -1
- package/dist/index-RXeXyAu0.cjs +0 -2
- package/dist/index-RXeXyAu0.cjs.map +0 -1
- package/dist/index-ujiv9m9Y.js +0 -2
- package/dist/index-ujiv9m9Y.js.map +0 -1
- package/dist/renderer-Bzv3aLXp.cjs +0 -2
- package/dist/renderer-Bzv3aLXp.cjs.map +0 -1
- package/dist/renderer-NPxavnke.js +0 -2
- package/dist/renderer-NPxavnke.js.map +0 -1
package/dist/modules.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{B as t,d as e,D as i,C as n,u as o}from"./controller-UN-hOZ_r.js";const s='<svg viewBox="-5.28 -5.28 34.56 34.56" fill="none"><path d="M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15" stroke-width="2.4" stroke-linecap="round"/></svg>';class a extends t{_controlsPanel=null;_toggleCollapseBtn=null;_toggleFullscreenBtn=null;_zoomOutBtn=null;_zoomSlider=null;_zoomInBtn=null;_resetViewBtn=null;DM;collapsed;get controlsPanel(){if(null===this._controlsPanel)throw e;return this._controlsPanel}get toggleCollapseBtn(){if(null===this._toggleCollapseBtn)throw e;return this._toggleCollapseBtn}get toggleFullscreenBtn(){if(null===this._toggleFullscreenBtn)throw e;return this._toggleFullscreenBtn}get zoomOutBtn(){if(null===this._zoomOutBtn)throw e;return this._zoomOutBtn}get zoomSlider(){if(null===this._zoomSlider)throw e;return this._zoomSlider}get zoomInBtn(){if(null===this._zoomInBtn)throw e;return this._zoomInBtn}get resetViewBtn(){if(null===this._resetViewBtn)throw e;return this._resetViewBtn}constructor(...t){super(...t),this.collapsed=this.options.controlsCollapsed||!1,this.DM=this.container.get(i),this.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn),this.container.get(n).hooks.onRefresh.subscribe(this.updateSlider),this._controlsPanel=document.createElement("div"),this._controlsPanel.className="controls",this._controlsPanel.classList.toggle("collapsed",this.collapsed),o.applyStyles(this._controlsPanel,".collapse-button{border-radius:8px;transition:transform .2s}.collapse-button:hover{background:#444c}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;background-color:#444;width:32px;padding:5px 0}button svg{width:100%;height:100%}.controls{position:absolute;top:10px;right:10px;display:flex;align-items:center;transition:transform .2s;border-radius:8px;gap:10px}.controls.collapsed{transform:translate(calc(100% - 32px))}.controls.collapsed .collapse-button{transform:rotate(180deg)}.controls .controls-content{display:flex;gap:1px;align-items:center;border-radius:8px;overflow:hidden;background:#333c}.controls button:hover{background:#555}.zoom-slider{width:100px;margin:0 10px}"),this._toggleCollapseBtn=document.createElement("button"),this._toggleCollapseBtn.className="collapse-button",this._toggleCollapseBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._controlsPanel.appendChild(this._toggleCollapseBtn);const e=document.createElement("div");e.className="controls-content",this._toggleFullscreenBtn=document.createElement("button"),this._toggleFullscreenBtn.innerHTML=s,e.appendChild(this._toggleFullscreenBtn),this._zoomOutBtn=document.createElement("button"),this._zoomOutBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomOutBtn),this._zoomSlider=document.createElement("input"),this._zoomSlider.type="range",this._zoomSlider.className="zoom-slider",this._zoomSlider.min="-30",this._zoomSlider.max="30",this._zoomSlider.value="0",e.appendChild(this._zoomSlider),this._zoomInBtn=document.createElement("button"),this._zoomInBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12m-6-6v12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomInBtn),this._resetViewBtn=document.createElement("button"),this._resetViewBtn.innerHTML='<svg viewBox="-6 -6 30 30" stroke-width=".08"><path d="m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z" /></svg>',e.appendChild(this._resetViewBtn),this._controlsPanel.appendChild(e),this.DM.data.container.appendChild(this._controlsPanel),this._toggleCollapseBtn.addEventListener("click",this.toggleCollapse),this._zoomInBtn.addEventListener("click",this.zoomIn),this._zoomOutBtn.addEventListener("click",this.zoomOut),this._zoomSlider.addEventListener("input",this.slide),this._resetViewBtn.addEventListener("click",this.DM.resetView),this._toggleFullscreenBtn.addEventListener("click",this.toggleFullscreen),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.controlsPanel.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateSlider()};zoomIn=()=>this.DM.zoom(1.1,this.DM.middleViewer());zoomOut=()=>this.DM.zoom(1/1.1,this.DM.middleViewer());slide=()=>this.DM.zoomToScale(1.1**Number(this.zoomSlider.value),this.DM.middleViewer());updateFullscreenBtn=t=>{this.toggleFullscreenBtn.innerHTML=t?'<svg viewBox="-40.32 -40.32 176.64 176.64"><path d="M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z"/></svg>':s};toggleFullscreen=()=>this.DM.shiftFullscreen("toggle");updateSlider=()=>{this.collapsed||(this.zoomSlider.value=String(this.scaleToSlider(this.DM.data.scale)))};scaleToSlider=t=>Math.log(t)/Math.log(1.1);dispose=()=>{this.toggleCollapseBtn.removeEventListener("click",this.toggleCollapse),this.zoomInBtn.removeEventListener("click",this.zoomIn),this.zoomOutBtn.removeEventListener("click",this.zoomOut),this.zoomSlider.removeEventListener("input",this.slide),this.resetViewBtn.removeEventListener("click",this.DM.resetView),this.toggleFullscreenBtn.removeEventListener("click",this.toggleFullscreen),this.controlsPanel.remove(),this._controlsPanel=null,this._toggleCollapseBtn=null,this._zoomInBtn=null,this._zoomOutBtn=null,this._zoomSlider=null,this._resetViewBtn=null,this._toggleFullscreenBtn=null}}class l extends t{_debugPanel=null;DM;get debugPanel(){if(!this._debugPanel)throw e;return this._debugPanel}constructor(...t){super(...t),this.DM=this.container.get(i),this.container.get(n).hooks.onRefresh.subscribe(this.update),this._debugPanel=document.createElement("div"),this._debugPanel.className="debug-panel";const e=this.DM.data.container;o.applyStyles(e,".debug-panel{position:absolute;bottom:12px;left:12px;background:#0006;border-radius:12px;padding:12px;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);color:#fff;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);pointer-events:none}"),e.appendChild(this._debugPanel),this.onDispose(this.dispose)}update=()=>{const t=o.round,e=this.DM.data;this.debugPanel.innerHTML=`<p>Scale: ${t(e.scale,3)}</p><p>Offset: ${t(e.offsetX,1)}, ${t(e.offsetY,1)}</p>`};dispose=()=>{this.debugPanel.remove(),this._debugPanel=null}}class r extends t{_minimapCtx=null;_viewportRectangle=null;_minimap=null;_minimapContainer=null;_toggleMinimapBtn=null;minimapCache={scale:1,centerX:0,centerY:0};DM;collapsed;get minimap(){if(null===this._minimap)throw e;return this._minimap}get minimapCtx(){if(null===this._minimapCtx)throw e;return this._minimapCtx}get viewportRectangle(){if(null===this._viewportRectangle)throw e;return this._viewportRectangle}get minimapContainer(){if(null===this._minimapContainer)throw e;return this._minimapContainer}get toggleMinimapBtn(){if(null===this._toggleMinimapBtn)throw e;return this._toggleMinimapBtn}constructor(...t){super(...t),this.collapsed=this.options.minimapCollapsed||!1,this.container.get(n).hooks.onRefresh.subscribe(this.updateViewportRectangle),this.DM=this.container.get(i),this._minimapContainer=document.createElement("div"),this._minimapContainer.className="minimap-container",o.applyStyles(this._minimapContainer,".collapse-button{border-radius:8px;transition:transform .2s}.collapse-button:hover{background:#444c}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;background-color:#444;width:32px;padding:5px 0}button svg{width:100%;height:100%}.minimap-container{position:absolute;bottom:10px;right:10px;display:flex;pointer-events:none;transition:transform .2s}.minimap-container.collapsed{transform:translate(calc(100% - 32px))}.toggle-minimap{margin:auto 10px 0 0;pointer-events:auto}.collapsed .toggle-minimap{transform:rotate(180deg)}.minimap{position:relative;width:200px;height:150px;overflow:hidden;border-radius:12px;background:#202020;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);transform-origin:0 0}.minimap .minimap-canvas{width:100%;height:100%}.minimap .viewport-rectangle{position:absolute;top:0;left:0;pointer-events:none;border:2px solid #fff;border-radius:6px;box-sizing:border-box;background:transparent}@container (max-width: 768px){.container .minimap{transform:scale(.6)}.container .toggle-minimap{transform:translateY(-60px)}.collapsed .container .toggle-minimap{transform:translateY(-60px) rotate(180deg)}.container .minimap-container{transform:translateY(60px) translate(80px)}.container .minimap-container.collapsed{transform:translateY(60px) translate(calc(100% - 32px))}}"),this._toggleMinimapBtn=document.createElement("button"),this._toggleMinimapBtn.className="toggle-minimap collapse-button",this._toggleMinimapBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._minimapContainer.appendChild(this._toggleMinimapBtn),this._minimap=document.createElement("div"),this._minimap.className="minimap";const e=document.createElement("canvas");e.className="minimap-canvas",e.width=200,e.height=150,this._minimap.appendChild(e),this._minimapCtx=e.getContext("2d"),this._viewportRectangle=document.createElement("div"),this._viewportRectangle.className="viewport-rectangle",this._minimap.appendChild(this._viewportRectangle),this._minimapContainer.appendChild(this._minimap),this.DM.data.container.appendChild(this._minimapContainer),this._minimapContainer.classList.toggle("collapsed",this.collapsed),this._toggleMinimapBtn.addEventListener("click",this.toggleCollapse),o.resizeCanvasForDPR(e,e.width,e.height),this.onStart(this.start),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.minimapContainer.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateViewportRectangle()};start=()=>{const t=this.DM.data.nodeBounds;if(!t)return;const e=this.minimap.clientWidth,i=this.minimap.clientHeight,n=e/t.width,o=i/t.height;this.minimapCache.scale=.9*Math.min(n,o),this.minimapCache.centerX=e/2,this.minimapCache.centerY=i/2,this.minimapCtx.clearRect(0,0,e,i),this.minimapCtx.save(),this.minimapCtx.translate(this.minimapCache.centerX,this.minimapCache.centerY),this.minimapCtx.scale(this.minimapCache.scale,this.minimapCache.scale),this.minimapCtx.translate(-t.centerX,-t.centerY);const s=this.DM.data.canvasData;for(const a of s.edges)this.drawMinimapEdge(a);for(const a of s.nodes)this.drawMinimapNode(a);this.minimapCtx.restore()};drawMinimapNode=t=>{const e=o.getColor(t.color);this.minimapCtx.fillStyle=e.border,this.minimapCtx.globalAlpha=.3,o.drawRoundRect(this.minimapCtx,t.x,t.y,t.width,t.height,25),this.minimapCtx.fill(),this.minimapCtx.globalAlpha=1};drawMinimapEdge=t=>{const e=this.DM.data.canvasMap,i=e[t.fromNode].ref,n=e[t.toNode].ref;if(!i||!n)return;const[s,a]=o.getAnchorCoord(i,t.fromSide),[l,r]=o.getAnchorCoord(n,t.toSide);this.minimapCtx.beginPath(),this.minimapCtx.moveTo(s,a),this.minimapCtx.lineTo(l,r),this.minimapCtx.strokeStyle="#555",this.minimapCtx.lineWidth=10,this.minimapCtx.stroke()};updateViewportRectangle=()=>{if(this.collapsed)return;const t=this.DM.data.nodeBounds,e=this.DM.data.container,i=this.DM.data.scale;if(!t)return;const n=e.clientWidth/i,o=e.clientHeight/i,s=-this.DM.data.offsetX/i+e.clientWidth/(2*i),a=-this.DM.data.offsetY/i+e.clientHeight/(2*i),l=this.minimapCache.centerX+(s-n/2-t.centerX)*this.minimapCache.scale,r=this.minimapCache.centerY+(a-o/2-t.centerY)*this.minimapCache.scale,h=n*this.minimapCache.scale,p=o*this.minimapCache.scale;this.viewportRectangle.style.left=`${l}px`,this.viewportRectangle.style.top=`${r}px`,this.viewportRectangle.style.width=`${h}px`,this.viewportRectangle.style.height=`${p}px`};dispose=()=>{this.toggleMinimapBtn.removeEventListener("click",this.toggleCollapse),this.minimapCtx.clearRect(0,0,this.minimap.clientWidth,this.minimap.clientHeight),this.minimapContainer.remove(),this._minimapContainer=null,this._toggleMinimapBtn=null,this._viewportRectangle=null,this._minimap=null}}class h extends t{_preventionContainer=null;preventMt=!1;DM;preventMistouch={record:!1,lastX:0,lastY:0,initialX:0,initialY:0};get preventionContainer(){if(null===this._preventionContainer)throw e;return this._preventionContainer}constructor(...t){super(...t);const e=Object.assign({preventAtStart:!0,labelText:"Click on to unlock."},this.options.mistouchPreventer||{}),n=document.createElement("div");n.className="prevention-banner",n.textContent=e.labelText,this.DM=this.container.get(i),this._preventionContainer=document.createElement("div"),this._preventionContainer.className="prevention-container hidden",o.applyStyles(this._preventionContainer,".full,.prevention-container{top:0;left:0;width:100%;height:100%;position:absolute}.flex-center,.prevention-container{display:flex;justify-content:center;align-items:center}.prevention-container{overflow:visible;transition:background .2s,opacity .2s,box-shadow .2s,border .2s,filter .2s,backdrop-filter .2s}.prevention-container.hidden{pointer-events:none;opacity:0}.prevention-container .prevention-banner{background:#0006;border-radius:12px;padding:12px;margin:12px;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);color:#fff;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);text-align:center}"),this._preventionContainer.appendChild(n),this.DM.data.container.appendChild(this._preventionContainer),e.preventAtStart&&this.startPrevention(),window.addEventListener("pointerdown",this.onPointerDown),window.addEventListener("pointermove",this.onPointerMove),window.addEventListener("pointerup",this.onPointerUp),this.onDispose(this.dispose)}onPointerDown=t=>{const e=this.DM.data.container.getBoundingClientRect();t.clientX<e.left||t.clientX>e.right||t.clientY<e.top||t.clientY>e.bottom?this.preventMt||this.startPrevention():this.preventMt&&(this.preventMistouch.initialX=t.clientX,this.preventMistouch.initialY=t.clientY,this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY,this.preventMistouch.record=!0)};onPointerMove=t=>{this.preventMistouch.record&&(this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY)};onPointerUp=()=>{this.preventMistouch.record&&(this.preventMistouch.record=!1,Math.abs(this.preventMistouch.lastX-this.preventMistouch.initialX)+Math.abs(this.preventMistouch.lastY-this.preventMistouch.initialY)<5&&this.endPrevention())};startPrevention=()=>{this.preventionContainer.classList.remove("hidden"),this.DM.data.container.classList.add("numb"),this.preventMt=!0};endPrevention=()=>{this.preventMt=!1,this.preventionContainer.classList.add("hidden"),setTimeout(()=>this.DM.data.container.classList.remove("numb"),50)};dispose=()=>{window.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),this.preventionContainer.remove(),this._preventionContainer=null}}export{a as Controls,l as DebugPanel,r as Minimap,h as MistouchPreventer};
|
|
1
|
+
import{B as t,d as e,D as i,C as n,u as o,S as s}from"./controller-BRBUPg_j.js";const a='<svg viewBox="-5.28 -5.28 34.56 34.56" fill="none"><path d="M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15" stroke-width="2.4" stroke-linecap="round"/></svg>';class l extends t{_controlsPanel=null;_toggleCollapseBtn=null;_toggleFullscreenBtn=null;_zoomOutBtn=null;_zoomSlider=null;_zoomInBtn=null;_resetViewBtn=null;DM;collapsed;get controlsPanel(){if(null===this._controlsPanel)throw e;return this._controlsPanel}get toggleCollapseBtn(){if(null===this._toggleCollapseBtn)throw e;return this._toggleCollapseBtn}get toggleFullscreenBtn(){if(null===this._toggleFullscreenBtn)throw e;return this._toggleFullscreenBtn}get zoomOutBtn(){if(null===this._zoomOutBtn)throw e;return this._zoomOutBtn}get zoomSlider(){if(null===this._zoomSlider)throw e;return this._zoomSlider}get zoomInBtn(){if(null===this._zoomInBtn)throw e;return this._zoomInBtn}get resetViewBtn(){if(null===this._resetViewBtn)throw e;return this._resetViewBtn}constructor(...t){super(...t),this.collapsed=this.options.controlsCollapsed||!1,this.DM=this.container.get(i),this.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn),this.container.get(n).hooks.onRefresh.subscribe(this.updateSlider),this._controlsPanel=document.createElement("div"),this._controlsPanel.className="controls",this._controlsPanel.classList.toggle("collapsed",this.collapsed),o.applyStyles(this._controlsPanel,".controls{position:absolute;top:10px;right:10px;display:flex;align-items:center;transition:transform .2s;border-radius:8px;gap:10px}.controls.collapsed{transform:translate(calc(100% - 32px))}.controls.collapsed .collapse-button{transform:rotate(180deg)}.controls .controls-content{display:flex;gap:1px;align-items:center;border-radius:8px;overflow:hidden;background:var(--border);box-shadow:var(--shadow);outline:1px solid var(--border)}.controls button{background-color:var(--background-secondary)}.controls button:hover{background:var(--border)}.zoom-slider{width:100px;margin:0 10px}"),this._toggleCollapseBtn=document.createElement("button"),this._toggleCollapseBtn.className="collapse-button border-shadow-bg",this._toggleCollapseBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._controlsPanel.appendChild(this._toggleCollapseBtn);const e=document.createElement("div");e.className="controls-content",this._toggleFullscreenBtn=document.createElement("button"),this._toggleFullscreenBtn.innerHTML=a,e.appendChild(this._toggleFullscreenBtn),this._zoomOutBtn=document.createElement("button"),this._zoomOutBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomOutBtn),this._zoomSlider=document.createElement("input"),this._zoomSlider.type="range",this._zoomSlider.className="zoom-slider",this._zoomSlider.min="-30",this._zoomSlider.max="30",this._zoomSlider.value="0",e.appendChild(this._zoomSlider),this._zoomInBtn=document.createElement("button"),this._zoomInBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12m-6-6v12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomInBtn),this._resetViewBtn=document.createElement("button"),this._resetViewBtn.innerHTML='<svg viewBox="-6 -6 30 30" stroke-width=".08"><path d="m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z" /></svg>',e.appendChild(this._resetViewBtn),this._controlsPanel.appendChild(e),this.DM.data.container.appendChild(this._controlsPanel),this._toggleCollapseBtn.addEventListener("click",this.toggleCollapse),this._zoomInBtn.addEventListener("click",this.zoomIn),this._zoomOutBtn.addEventListener("click",this.zoomOut),this._zoomSlider.addEventListener("input",this.slide),this._resetViewBtn.addEventListener("click",this.DM.resetView),this._toggleFullscreenBtn.addEventListener("click",this.toggleFullscreen),this.augment({toggleControlsCollapse:this.toggleCollapse}),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.controlsPanel.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateSlider()};zoomIn=()=>this.DM.zoom(1.1,this.DM.middleViewer());zoomOut=()=>this.DM.zoom(1/1.1,this.DM.middleViewer());slide=()=>this.DM.zoomToScale(1.1**Number(this.zoomSlider.value),this.DM.middleViewer());updateFullscreenBtn=t=>{this.toggleFullscreenBtn.innerHTML=t?'<svg viewBox="-40.32 -40.32 176.64 176.64"><path d="M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z"/></svg>':a};toggleFullscreen=()=>this.DM.shiftFullscreen();updateSlider=()=>{this.collapsed||(this.zoomSlider.value=String(this.scaleToSlider(this.DM.data.scale)))};scaleToSlider=t=>Math.log(t)/Math.log(1.1);dispose=()=>{this.toggleCollapseBtn.removeEventListener("click",this.toggleCollapse),this.zoomInBtn.removeEventListener("click",this.zoomIn),this.zoomOutBtn.removeEventListener("click",this.zoomOut),this.zoomSlider.removeEventListener("input",this.slide),this.resetViewBtn.removeEventListener("click",this.DM.resetView),this.toggleFullscreenBtn.removeEventListener("click",this.toggleFullscreen),this.controlsPanel.remove(),this._controlsPanel=null,this._toggleCollapseBtn=null,this._zoomInBtn=null,this._zoomOutBtn=null,this._zoomSlider=null,this._resetViewBtn=null,this._toggleFullscreenBtn=null}}class r extends t{_debugPanel=null;DM;get debugPanel(){if(!this._debugPanel)throw e;return this._debugPanel}constructor(...t){super(...t),this.DM=this.container.get(i),this.container.get(n).hooks.onRefresh.subscribe(this.update),this._debugPanel=document.createElement("div"),this._debugPanel.className="debug-panel border-shadow-bg";const e=this.DM.data.container;o.applyStyles(e,".debug-panel{position:absolute;bottom:12px;left:12px;border-radius:12px;padding:12px;color:var(--text);font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);pointer-events:none}"),e.appendChild(this._debugPanel),this.onDispose(this.dispose)}update=()=>{const t=o.round,e=this.DM.data;this.debugPanel.innerHTML=`<p>Scale: ${t(e.scale,3)}</p><p>Offset: ${t(e.offsetX,1)}, ${t(e.offsetY,1)}</p>`};dispose=()=>{this.debugPanel.remove(),this._debugPanel=null}}class h extends t{_minimapCtx=null;_viewportRectangle=null;_minimap=null;_minimapContainer=null;_toggleMinimapBtn=null;minimapCache={scale:1,centerX:0,centerY:0};DM;SM;collapsed;get minimap(){if(null===this._minimap)throw e;return this._minimap}get minimapCtx(){if(null===this._minimapCtx)throw e;return this._minimapCtx}get viewportRectangle(){if(null===this._viewportRectangle)throw e;return this._viewportRectangle}get minimapContainer(){if(null===this._minimapContainer)throw e;return this._minimapContainer}get toggleMinimapBtn(){if(null===this._toggleMinimapBtn)throw e;return this._toggleMinimapBtn}constructor(...t){super(...t),this.collapsed=this.options.minimapCollapsed||!1,this.container.get(n).hooks.onRefresh.subscribe(this.updateViewportRectangle),this.DM=this.container.get(i),this.SM=this.container.get(s),this._minimapContainer=document.createElement("div"),this._minimapContainer.className="minimap-container",o.applyStyles(this._minimapContainer,".minimap-container{position:absolute;bottom:10px;right:10px;display:flex;pointer-events:none;transition:transform .2s}.minimap-container.collapsed{transform:translate(calc(100% - 32px))}.toggle-minimap{margin:auto 10px 0 0;pointer-events:auto}.collapsed .toggle-minimap{transform:rotate(180deg)}.minimap{position:relative;pointer-events:none;width:200px;height:150px;overflow:hidden;border-radius:12px;transform-origin:0 0}.minimap .minimap-canvas{width:100%;height:100%}.minimap .viewport-rectangle{position:absolute;top:0;left:0;pointer-events:none;border-radius:6px;box-sizing:border-box;border:2px dashed var(--text)}@container (max-width: 768px){.container .minimap{transform:scale(.6)}.container .toggle-minimap{transform:translateY(-60px)}.collapsed .container .toggle-minimap{transform:translateY(-60px) rotate(180deg)}.container .minimap-container{transform:translateY(60px) translate(80px)}.container .minimap-container.collapsed{transform:translateY(60px) translate(calc(100% - 32px))}}"),this._toggleMinimapBtn=document.createElement("button"),this._toggleMinimapBtn.className="toggle-minimap collapse-button border-shadow-bg",this._toggleMinimapBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._minimapContainer.appendChild(this._toggleMinimapBtn),this._minimap=document.createElement("div"),this._minimap.className="minimap border-shadow-bg";const e=document.createElement("canvas");e.className="minimap-canvas",e.width=200,e.height=150,this._minimap.appendChild(e),this._minimapCtx=e.getContext("2d"),this._viewportRectangle=document.createElement("div"),this._viewportRectangle.className="viewport-rectangle",this._minimap.appendChild(this._viewportRectangle),this._minimapContainer.appendChild(this._minimap),this.DM.data.container.appendChild(this._minimapContainer),this._minimapContainer.classList.toggle("collapsed",this.collapsed),this._toggleMinimapBtn.addEventListener("click",this.toggleCollapse),o.resizeCanvasForDPR(e,e.width,e.height),this.augment({toggleMinimapCollapse:this.toggleCollapse}),this.onStart(this.start),this.onRestart(this.start),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.minimapContainer.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateViewportRectangle()};start=()=>{const t=this.DM.data.nodeBounds;if(!t)return;const e=this.minimap.clientWidth,i=this.minimap.clientHeight,n=e/t.width,o=i/t.height;this.minimapCache.scale=.9*Math.min(n,o),this.minimapCache.centerX=e/2,this.minimapCache.centerY=i/2,this.minimapCtx.clearRect(0,0,e,i),this.minimapCtx.save(),this.minimapCtx.translate(this.minimapCache.centerX,this.minimapCache.centerY),this.minimapCtx.scale(this.minimapCache.scale,this.minimapCache.scale),this.minimapCtx.translate(-t.centerX,-t.centerY);const s=this.DM.data.canvasData;for(const a of s.edges)this.drawMinimapEdge(a);for(const a of s.nodes)this.drawMinimapNode(a);this.minimapCtx.restore()};drawMinimapNode=t=>{const e=this.SM.getColor(t.color);this.minimapCtx.fillStyle=e.border,o.drawRoundRect(this.minimapCtx,t.x,t.y,t.width,t.height,25),this.minimapCtx.fill()};drawMinimapEdge=t=>{const e=this.DM.data.nodeMap,i=e[t.fromNode].ref,n=e[t.toNode].ref;if(!i||!n)return;const{x:s,y:a}=o.getAnchorCoord(i,t.fromSide),{x:l,y:r}=o.getAnchorCoord(n,t.toSide);this.minimapCtx.beginPath(),this.minimapCtx.moveTo(s,a),this.minimapCtx.lineTo(l,r),this.minimapCtx.strokeStyle=this.SM.getColor(t.color).active,this.minimapCtx.lineWidth=10,this.minimapCtx.stroke()};updateViewportRectangle=()=>{if(this.collapsed)return;const t=this.DM.data.nodeBounds,e=this.DM.data.container,i=this.DM.data.scale;if(!t)return;const n=e.clientWidth/i,o=e.clientHeight/i,s=-this.DM.data.offsetX/i+e.clientWidth/(2*i),a=-this.DM.data.offsetY/i+e.clientHeight/(2*i),l=this.minimapCache.centerX+(s-n/2-t.centerX)*this.minimapCache.scale,r=this.minimapCache.centerY+(a-o/2-t.centerY)*this.minimapCache.scale,h=n*this.minimapCache.scale,p=o*this.minimapCache.scale;this.viewportRectangle.style.left=`${l}px`,this.viewportRectangle.style.top=`${r}px`,this.viewportRectangle.style.width=`${h}px`,this.viewportRectangle.style.height=`${p}px`};dispose=()=>{this.toggleMinimapBtn.removeEventListener("click",this.toggleCollapse),this.minimapCtx.clearRect(0,0,this.minimap.clientWidth,this.minimap.clientHeight),this.minimapContainer.remove(),this._minimapContainer=null,this._toggleMinimapBtn=null,this._viewportRectangle=null,this._minimap=null}}class p extends t{_preventionContainer=null;preventMt=!1;DM;preventMistouch={record:!1,lastX:0,lastY:0,initialX:0,initialY:0};get preventionContainer(){if(null===this._preventionContainer)throw e;return this._preventionContainer}constructor(...t){super(...t);const e=document.createElement("div");e.className="prevention-banner border-shadow-bg",e.textContent=this.options.mistouchPreventerBannerText||"Click on to unlock.",this.DM=this.container.get(i),this._preventionContainer=document.createElement("div"),this._preventionContainer.className="prevention-container hidden",o.applyStyles(this._preventionContainer,".full,.prevention-container{top:0;left:0;width:100%;height:100%;position:absolute}.flex-center,.prevention-container{display:flex;justify-content:center;align-items:center}.prevention-container{overflow:visible;transition:background .2s,opacity .2s,box-shadow .2s,border .2s,filter .2s,backdrop-filter .2s}.prevention-container.hidden{pointer-events:none;opacity:0}.prevention-container .prevention-banner{border-radius:12px;padding:12px;margin:12px;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);text-align:center}"),this._preventionContainer.appendChild(e),this.DM.data.container.appendChild(this._preventionContainer),this.options.preventMistouchAtStart&&this.startPrevention(),window.addEventListener("pointerdown",this.onPointerDown),window.addEventListener("pointermove",this.onPointerMove),window.addEventListener("pointerup",this.onPointerUp),this.augment({startMistouchPrevention:this.startPrevention,endMistouchPrevention:this.endPrevention}),this.onDispose(this.dispose)}onPointerDown=t=>{const e=this.DM.data.container.getBoundingClientRect();t.clientX<e.left||t.clientX>e.right||t.clientY<e.top||t.clientY>e.bottom?this.preventMt||this.startPrevention():this.preventMt&&(this.preventMistouch.initialX=t.clientX,this.preventMistouch.initialY=t.clientY,this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY,this.preventMistouch.record=!0)};onPointerMove=t=>{this.preventMistouch.record&&(this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY)};onPointerUp=()=>{this.preventMistouch.record&&(this.preventMistouch.record=!1,Math.abs(this.preventMistouch.lastX-this.preventMistouch.initialX)+Math.abs(this.preventMistouch.lastY-this.preventMistouch.initialY)<5&&this.endPrevention())};startPrevention=()=>{this.preventionContainer.classList.remove("hidden"),this.DM.data.container.classList.add("numb"),this.preventMt=!0};endPrevention=()=>{this.preventMt=!1,this.preventionContainer.classList.add("hidden"),setTimeout(()=>this.DM.data.container.classList.remove("numb"),50)};dispose=()=>{window.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),this.preventionContainer.remove(),this._preventionContainer=null}}export{l as Controls,r as DebugPanel,h as Minimap,p as MistouchPreventer};
|
|
2
2
|
//# sourceMappingURL=modules.js.map
|
package/dist/modules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules.js","sources":["../src/modules/controls/index.ts","../src/modules/debugPanel/index.ts","../src/modules/minimap/index.ts","../src/modules/mistouchPreventer/index.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\nconst resetIcon =\n\t'<svg viewBox=\"-6 -6 30 30\" stroke-width=\".08\"><path d=\"m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z\" /></svg>';\nconst enterFullscreenIcon =\n\t'<svg viewBox=\"-5.28 -5.28 34.56 34.56\" fill=\"none\"><path d=\"M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\nconst exitFullscreenIcon =\n\t'<svg viewBox=\"-40.32 -40.32 176.64 176.64\"><path d=\"M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z\"/></svg>';\nconst zoomInIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst zoomOutIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Controls extends BaseModule<Options> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button';\n\t\tthis._toggleCollapseBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._controlsPanel.appendChild(this._toggleCollapseBtn);\n\n\t\tconst controlsContent = document.createElement('div');\n\t\tcontrolsContent.className = 'controls-content';\n\n\t\tthis._toggleFullscreenBtn = document.createElement('button');\n\t\tthis._toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML = zoomOutIcon;\n\t\tcontrolsContent.appendChild(this._zoomOutBtn);\n\n\t\tthis._zoomSlider = document.createElement('input');\n\t\tthis._zoomSlider.type = 'range';\n\t\tthis._zoomSlider.className = 'zoom-slider';\n\t\tthis._zoomSlider.min = '-30';\n\t\tthis._zoomSlider.max = '30';\n\t\tthis._zoomSlider.value = '0';\n\t\tcontrolsContent.appendChild(this._zoomSlider);\n\n\t\tthis._zoomInBtn = document.createElement('button');\n\t\tthis._zoomInBtn.innerHTML = zoomInIcon;\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML = resetIcon;\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\n\t\tthis.onDispose(this.dispose);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () => this.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter) this.toggleFullscreenBtn.innerHTML = exitFullscreenIcon;\n\t\telse this.toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen('toggle');\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tprivate dispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Minimap extends BaseModule<Options> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button';\n\t\tthis._toggleMinimapBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate start = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tthis.minimapCtx.globalAlpha = 0.3;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t\tthis.minimapCtx.globalAlpha = 1.0;\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst canvasMap = this.DM.data.canvasMap;\n\t\tconst fromNode = canvasMap[edge.fromNode].ref as JSONCanvasNode;\n\t\tconst toNode = canvasMap[edge.toNode].ref as JSONCanvasNode;\n\t\tif (!fromNode || !toNode) return;\n\t\tconst [startX, startY] = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = '#555';\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY = -this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tmistouchPreventer?: {\n\t\tpreventAtStart?: boolean;\n\t\tlabelText?: string;\n\t};\n};\n\nexport default class MistouchPreventer extends BaseModule<Options> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst options = Object.assign(\n\t\t\t{\n\t\t\t\tpreventAtStart: true,\n\t\t\t\tlabelText: 'Click on to unlock.',\n\t\t\t},\n\t\t\tthis.options.mistouchPreventer || {},\n\t\t);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner';\n\t\tpreventionBanner.textContent = options.labelText;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (options.preventAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tprivate dispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n"],"names":["enterFullscreenIcon","Controls","BaseModule","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","DM","collapsed","controlsPanel","this","destroyError","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","constructor","args","super","options","controlsCollapsed","container","get","DataManager","onToggleFullscreen","subscribe","updateFullscreenBtn","Controller","hooks","onRefresh","updateSlider","document","createElement","className","classList","toggle","utilities","applyStyles","innerHTML","appendChild","controlsContent","type","min","max","value","data","addEventListener","toggleCollapse","zoomIn","zoomOut","slide","resetView","toggleFullscreen","onDispose","dispose","zoom","middleViewer","zoomToScale","Number","enter","shiftFullscreen","String","scaleToSlider","scale","Math","log","removeEventListener","remove","DebugPanel","_debugPanel","debugPanel","update","HTMLContainer","round","offsetX","offsetY","Minimap","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","centerX","centerY","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","minimapCanvas","width","height","getContext","resizeCanvasForDPR","onStart","start","bounds","nodeBounds","displayWidth","clientWidth","displayHeight","clientHeight","scaleX","scaleY","clearRect","save","translate","canvasData","edge","edges","drawMinimapEdge","node","nodes","drawMinimapNode","restore","colors","getColor","color","fillStyle","border","globalAlpha","drawRoundRect","x","y","fill","canvasMap","fromNode","ref","toNode","startX","startY","getAnchorCoord","fromSide","endX","endY","toSide","beginPath","moveTo","lineTo","strokeStyle","lineWidth","stroke","viewWidth","viewHeight","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","style","left","top","MistouchPreventer","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","Object","assign","preventAtStart","labelText","mistouchPreventer","preventionBanner","textContent","startPrevention","window","onPointerDown","onPointerMove","onPointerUp","e","getBoundingClientRect","clientX","right","clientY","bottom","abs","endPrevention","add","setTimeout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modules.js","sources":["../src/modules/controls/index.ts","../src/modules/debugPanel/index.ts","../src/modules/minimap/index.ts","../src/modules/mistouchPreventer/index.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\ntype Augmentation = {\n\ttoggleControlsCollapse: Controls['toggleCollapse'];\n};\n\nconst resetIcon =\n\t'<svg viewBox=\"-6 -6 30 30\" stroke-width=\".08\"><path d=\"m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z\" /></svg>';\nconst enterFullscreenIcon =\n\t'<svg viewBox=\"-5.28 -5.28 34.56 34.56\" fill=\"none\"><path d=\"M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\nconst exitFullscreenIcon =\n\t'<svg viewBox=\"-40.32 -40.32 176.64 176.64\"><path d=\"M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z\"/></svg>';\nconst zoomInIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst zoomOutIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Controls extends BaseModule<Options, Augmentation> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button border-shadow-bg';\n\t\tthis._toggleCollapseBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._controlsPanel.appendChild(this._toggleCollapseBtn);\n\n\t\tconst controlsContent = document.createElement('div');\n\t\tcontrolsContent.className = 'controls-content';\n\n\t\tthis._toggleFullscreenBtn = document.createElement('button');\n\t\tthis._toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML = zoomOutIcon;\n\t\tcontrolsContent.appendChild(this._zoomOutBtn);\n\n\t\tthis._zoomSlider = document.createElement('input');\n\t\tthis._zoomSlider.type = 'range';\n\t\tthis._zoomSlider.className = 'zoom-slider';\n\t\tthis._zoomSlider.min = '-30';\n\t\tthis._zoomSlider.max = '30';\n\t\tthis._zoomSlider.value = '0';\n\t\tcontrolsContent.appendChild(this._zoomSlider);\n\n\t\tthis._zoomInBtn = document.createElement('button');\n\t\tthis._zoomInBtn.innerHTML = zoomInIcon;\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML = resetIcon;\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\n\t\tthis.augment({ toggleControlsCollapse: this.toggleCollapse });\n\t\tthis.onDispose(this.dispose);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () =>\n\t\tthis.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter) this.toggleFullscreenBtn.innerHTML = exitFullscreenIcon;\n\t\telse this.toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen();\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tprivate dispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel border-shadow-bg';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\nimport StyleManager from '@/core/styleManager';\n\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\ntype Augmentation = {\n\ttoggleMinimapCollapse: Minimap['toggleCollapse'];\n};\n\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Minimap extends BaseModule<Options, Augmentation> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate SM: StyleManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.SM = this.container.get(StyleManager);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button border-shadow-bg';\n\t\tthis._toggleMinimapBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap border-shadow-bg';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\n\t\tthis.augment({ toggleMinimapCollapse: this.toggleCollapse });\n\t\tthis.onStart(this.start);\n\t\tthis.onRestart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate start = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = this.SM.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst canvasMap = this.DM.data.nodeMap;\n\t\tconst fromNode = canvasMap[edge.fromNode].ref;\n\t\tconst toNode = canvasMap[edge.toNode].ref;\n\t\tif (!fromNode || !toNode) return;\n\t\tconst { x: startX, y: startY } = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst { x: endX, y: endY } = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = this.SM.getColor(edge.color).active;\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY =\n\t\t\t-this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tpreventMistouchAtStart?: boolean;\n\tmistouchPreventerBannerText?: string;\n};\n\ntype Augmentation = {\n\tstartMistouchPrevention: MistouchPreventer['startPrevention'];\n\tendMistouchPrevention: MistouchPreventer['endPrevention'];\n};\n\nexport default class MistouchPreventer extends BaseModule<Options, Augmentation> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner border-shadow-bg';\n\t\tpreventionBanner.textContent =\n\t\t\tthis.options.mistouchPreventerBannerText || 'Click on to unlock.';\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (this.options.preventMistouchAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\n\t\tthis.augment({\n\t\t\tstartMistouchPrevention: this.startPrevention,\n\t\t\tendMistouchPrevention: this.endPrevention,\n\t\t});\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tprivate dispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n"],"names":["enterFullscreenIcon","Controls","BaseModule","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","DM","collapsed","controlsPanel","this","destroyError","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","constructor","args","super","options","controlsCollapsed","container","get","DataManager","onToggleFullscreen","subscribe","updateFullscreenBtn","Controller","hooks","onRefresh","updateSlider","document","createElement","className","classList","toggle","utilities","applyStyles","innerHTML","appendChild","controlsContent","type","min","max","value","data","addEventListener","toggleCollapse","zoomIn","zoomOut","slide","resetView","toggleFullscreen","augment","toggleControlsCollapse","onDispose","dispose","zoom","middleViewer","zoomToScale","Number","enter","shiftFullscreen","String","scaleToSlider","scale","Math","log","removeEventListener","remove","DebugPanel","_debugPanel","debugPanel","update","HTMLContainer","round","offsetX","offsetY","Minimap","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","centerX","centerY","SM","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","StyleManager","minimapCanvas","width","height","getContext","resizeCanvasForDPR","toggleMinimapCollapse","onStart","start","onRestart","bounds","nodeBounds","displayWidth","clientWidth","displayHeight","clientHeight","scaleX","scaleY","clearRect","save","translate","canvasData","edge","edges","drawMinimapEdge","node","nodes","drawMinimapNode","restore","colors","getColor","color","fillStyle","border","drawRoundRect","x","y","fill","canvasMap","nodeMap","fromNode","ref","toNode","startX","startY","getAnchorCoord","fromSide","endX","endY","toSide","beginPath","moveTo","lineTo","strokeStyle","active","lineWidth","stroke","viewWidth","viewHeight","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","style","left","top","MistouchPreventer","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","preventionBanner","textContent","mistouchPreventerBannerText","preventMistouchAtStart","startPrevention","window","onPointerDown","onPointerMove","onPointerUp","startMistouchPrevention","endMistouchPrevention","endPrevention","e","getBoundingClientRect","clientX","right","clientY","bottom","abs","add","setTimeout"],"mappings":"sFAiBMA,EACL,+ZAUD,MAAqBC,UAAiBC,EAC7BC,eAAwC,KACxCC,mBAA+C,KAC/CC,qBAAiD,KACjDC,YAAwC,KACxCC,YAAuC,KACvCC,WAAuC,KACvCC,cAA0C,KAC1CC,GACAC,UAER,iBAAYC,GACX,GAA4B,OAAxBC,KAAKV,eAAyB,MAAMW,EACxC,OAAOD,KAAKV,cACb,CACA,qBAAYY,GACX,GAAgC,OAA5BF,KAAKT,mBAA6B,MAAMU,EAC5C,OAAOD,KAAKT,kBACb,CACA,uBAAYY,GACX,GAAkC,OAA9BH,KAAKR,qBAA+B,MAAMS,EAC9C,OAAOD,KAAKR,oBACb,CACA,cAAYY,GACX,GAAyB,OAArBJ,KAAKP,YAAsB,MAAMQ,EACrC,OAAOD,KAAKP,WACb,CACA,cAAYY,GACX,GAAyB,OAArBL,KAAKN,YAAsB,MAAMO,EACrC,OAAOD,KAAKN,WACb,CACA,aAAYY,GACX,GAAwB,OAApBN,KAAKL,WAAqB,MAAMM,EACpC,OAAOD,KAAKL,UACb,CACA,gBAAYY,GACX,GAA2B,OAAvBP,KAAKJ,cAAwB,MAAMK,EACvC,OAAOD,KAAKJ,aACb,CAEA,WAAAY,IAAeC,GACdC,SAASD,GACTT,KAAKF,UAAYE,KAAKW,QAAQC,oBAAqB,EACnDZ,KAAKH,GAAKG,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKH,GAAGmB,mBAAmBC,UAAUjB,KAAKkB,qBAC1ClB,KAAKa,UAAUC,IAAIK,GAAYC,MAAMC,UAAUJ,UAAUjB,KAAKsB,cAE9DtB,KAAKV,eAAiBiC,SAASC,cAAc,OAC7CxB,KAAKV,eAAemC,UAAY,WAChCzB,KAAKV,eAAeoC,UAAUC,OAAO,YAAa3B,KAAKF,WAEvD8B,EAAUC,YAAY7B,KAAKV,6lBAE3BU,KAAKT,mBAAqBgC,SAASC,cAAc,UACjDxB,KAAKT,mBAAmBkC,UAAY,mCACpCzB,KAAKT,mBAAmBuC,UAzDzB,mMA0DC9B,KAAKV,eAAeyC,YAAY/B,KAAKT,oBAErC,MAAMyC,EAAkBT,SAASC,cAAc,OAC/CQ,EAAgBP,UAAY,mBAE5BzB,KAAKR,qBAAuB+B,SAASC,cAAc,UACnDxB,KAAKR,qBAAqBsC,UAAY3C,EACtC6C,EAAgBD,YAAY/B,KAAKR,sBAEjCQ,KAAKP,YAAc8B,SAASC,cAAc,UAC1CxB,KAAKP,YAAYqC,UAtElB,yGAuECE,EAAgBD,YAAY/B,KAAKP,aAEjCO,KAAKN,YAAc6B,SAASC,cAAc,SAC1CxB,KAAKN,YAAYuC,KAAO,QACxBjC,KAAKN,YAAY+B,UAAY,cAC7BzB,KAAKN,YAAYwC,IAAM,MACvBlC,KAAKN,YAAYyC,IAAM,KACvBnC,KAAKN,YAAY0C,MAAQ,IACzBJ,EAAgBD,YAAY/B,KAAKN,aAEjCM,KAAKL,WAAa4B,SAASC,cAAc,UACzCxB,KAAKL,WAAWmC,UApFjB,iHAqFCE,EAAgBD,YAAY/B,KAAKL,YAEjCK,KAAKJ,cAAgB2B,SAASC,cAAc,UAC5CxB,KAAKJ,cAAckC,UA9FpB,6cA+FCE,EAAgBD,YAAY/B,KAAKJ,eAEjCI,KAAKV,eAAeyC,YAAYC,GAEhChC,KAAKH,GAAGwC,KAAKxB,UAAUkB,YAAY/B,KAAKV,gBAExCU,KAAKT,mBAAmB+C,iBAAiB,QAAStC,KAAKuC,gBACvDvC,KAAKL,WAAW2C,iBAAiB,QAAStC,KAAKwC,QAC/CxC,KAAKP,YAAY6C,iBAAiB,QAAStC,KAAKyC,SAChDzC,KAAKN,YAAY4C,iBAAiB,QAAStC,KAAK0C,OAChD1C,KAAKJ,cAAc0C,iBAAiB,QAAStC,KAAKH,GAAG8C,WACrD3C,KAAKR,qBAAqB8C,iBAAiB,QAAStC,KAAK4C,kBAEzD5C,KAAK6C,QAAQ,CAAEC,uBAAwB9C,KAAKuC,iBAC5CvC,KAAK+C,UAAU/C,KAAKgD,QACrB,CACAT,eAAiB,KAChBvC,KAAKF,WAAaE,KAAKF,UACvBE,KAAKD,cAAc2B,UAAUC,OAAO,YAAa3B,KAAKF,WACjDE,KAAKF,WAAWE,KAAKsB,gBAEnBkB,OAAS,IAAMxC,KAAKH,GAAGoD,KAAK,IAAKjD,KAAKH,GAAGqD,gBACzCT,QAAU,IAAMzC,KAAKH,GAAGoD,KAAK,EAAI,IAAKjD,KAAKH,GAAGqD,gBAC9CR,MAAQ,IACf1C,KAAKH,GAAGsD,YAAY,KAAOC,OAAOpD,KAAKK,WAAW+B,OAAQpC,KAAKH,GAAGqD,gBAE3DhC,oBAAuBmC,IACnBrD,KAAKG,oBAAoB2B,UAAhCuB,EAtHL,mXAuH2ClE,GAEnCyD,iBAAmB,IAAM5C,KAAKH,GAAGyD,kBAEjChC,aAAe,KAClBtB,KAAKF,YACTE,KAAKK,WAAW+B,MAAQmB,OAAOvD,KAAKwD,cAAcxD,KAAKH,GAAGwC,KAAKoB,UAExDD,cAAiBC,GAAkBC,KAAKC,IAAIF,GAASC,KAAKC,IAAI,KAE9DX,QAAU,KACjBhD,KAAKE,kBAAkB0D,oBAAoB,QAAS5D,KAAKuC,gBACzDvC,KAAKM,UAAUsD,oBAAoB,QAAS5D,KAAKwC,QACjDxC,KAAKI,WAAWwD,oBAAoB,QAAS5D,KAAKyC,SAClDzC,KAAKK,WAAWuD,oBAAoB,QAAS5D,KAAK0C,OAClD1C,KAAKO,aAAaqD,oBAAoB,QAAS5D,KAAKH,GAAG8C,WACvD3C,KAAKG,oBAAoByD,oBAAoB,QAAS5D,KAAK4C,kBAC3D5C,KAAKD,cAAc8D,SACnB7D,KAAKV,eAAiB,KACtBU,KAAKT,mBAAqB,KAC1BS,KAAKL,WAAa,KAClBK,KAAKP,YAAc,KACnBO,KAAKN,YAAc,KACnBM,KAAKJ,cAAgB,KACrBI,KAAKR,qBAAuB,MC5J9B,MAAqBsE,UAAmBzE,EAC/B0E,YAAqC,KACrClE,GAER,cAAYmE,GACX,IAAKhE,KAAK+D,YAAa,MAAM9D,EAC7B,OAAOD,KAAK+D,WACb,CAEA,WAAAvD,IAAeC,GACdC,SAASD,GACTT,KAAKH,GAAKG,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKa,UAAUC,IAAIK,GAAYC,MAAMC,UAAUJ,UAAUjB,KAAKiE,QAC9DjE,KAAK+D,YAAcxC,SAASC,cAAc,OAC1CxB,KAAK+D,YAAYtC,UAAY,+BAC7B,MAAMyC,EAAgBlE,KAAKH,GAAGwC,KAAKxB,UACnCe,EAAUC,YAAYqC,2LACtBA,EAAcnC,YAAY/B,KAAK+D,aAC/B/D,KAAK+C,UAAU/C,KAAKgD,QACrB,CAEQiB,OAAS,KAChB,MAAME,EAAQvC,EAAUuC,MAClB9B,EAAOrC,KAAKH,GAAGwC,KACrBrC,KAAKgE,WAAWlC,UAAY,aAAaqC,EAAM9B,EAAKoB,MAAO,oBAAoBU,EAAM9B,EAAK+B,QAAS,OAAOD,EAAM9B,EAAKgC,QAAS,UAGvHrB,QAAU,KACjBhD,KAAKgE,WAAWH,SAChB7D,KAAK+D,YAAc,MChBrB,MAAqBO,UAAgBjF,EAC5BkF,YAA+C,KAC/CC,mBAA4C,KAC5CC,SAAkC,KAClCC,kBAA2C,KAC3CC,kBAA8C,KAC9CC,aAAoE,CAC3EnB,MAAO,EACPoB,QAAS,EACTC,QAAS,GAEFjF,GACAkF,GACAjF,UAER,WAAYkF,GACX,GAAsB,OAAlBhF,KAAKyE,SAAmB,MAAMxE,EAClC,OAAOD,KAAKyE,QACb,CACA,cAAYQ,GACX,GAAyB,OAArBjF,KAAKuE,YAAsB,MAAMtE,EACrC,OAAOD,KAAKuE,WACb,CACA,qBAAYW,GACX,GAAgC,OAA5BlF,KAAKwE,mBAA6B,MAAMvE,EAC5C,OAAOD,KAAKwE,kBACb,CACA,oBAAYW,GACX,GAA+B,OAA3BnF,KAAK0E,kBAA4B,MAAMzE,EAC3C,OAAOD,KAAK0E,iBACb,CACA,oBAAYU,GACX,GAA+B,OAA3BpF,KAAK2E,kBAA4B,MAAM1E,EAC3C,OAAOD,KAAK2E,iBACb,CAEA,WAAAnE,IAAeC,GACdC,SAASD,GACTT,KAAKF,UAAYE,KAAKW,QAAQ0E,mBAAoB,EAClDrF,KAAKa,UAAUC,IAAIK,GAAYC,MAAMC,UAAUJ,UAAUjB,KAAKsF,yBAC9DtF,KAAKH,GAAKG,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAK+E,GAAK/E,KAAKa,UAAUC,IAAIyE,GAE7BvF,KAAK0E,kBAAoBnD,SAASC,cAAc,OAChDxB,KAAK0E,kBAAkBjD,UAAY,oBAEnCG,EAAUC,YAAY7B,KAAK0E,2/BAE3B1E,KAAK2E,kBAAoBpD,SAASC,cAAc,UAChDxB,KAAK2E,kBAAkBlD,UAAY,kDACnCzB,KAAK2E,kBAAkB7C,UApDxB,mMAqDC9B,KAAK0E,kBAAkB3C,YAAY/B,KAAK2E,mBAExC3E,KAAKyE,SAAWlD,SAASC,cAAc,OACvCxB,KAAKyE,SAAShD,UAAY,2BAC1B,MAAM+D,EAAgBjE,SAASC,cAAc,UAC7CgE,EAAc/D,UAAY,iBAC1B+D,EAAcC,MAAQ,IACtBD,EAAcE,OAAS,IAEvB1F,KAAKyE,SAAS1C,YAAYyD,GAC1BxF,KAAKuE,YAAciB,EAAcG,WAAW,MAC5C3F,KAAKwE,mBAAqBjD,SAASC,cAAc,OACjDxB,KAAKwE,mBAAmB/C,UAAY,qBACpCzB,KAAKyE,SAAS1C,YAAY/B,KAAKwE,oBAC/BxE,KAAK0E,kBAAkB3C,YAAY/B,KAAKyE,UAExCzE,KAAKH,GAAGwC,KAAKxB,UAAUkB,YAAY/B,KAAK0E,mBAExC1E,KAAK0E,kBAAkBhD,UAAUC,OAAO,YAAa3B,KAAKF,WAE1DE,KAAK2E,kBAAkBrC,iBAAiB,QAAStC,KAAKuC,gBACtDX,EAAUgE,mBAAmBJ,EAAeA,EAAcC,MAAOD,EAAcE,QAE/E1F,KAAK6C,QAAQ,CAAEgD,sBAAuB7F,KAAKuC,iBAC3CvC,KAAK8F,QAAQ9F,KAAK+F,OAClB/F,KAAKgG,UAAUhG,KAAK+F,OACpB/F,KAAK+C,UAAU/C,KAAKgD,QACrB,CAEAT,eAAiB,KAChBvC,KAAKF,WAAaE,KAAKF,UACvBE,KAAKmF,iBAAiBzD,UAAUC,OAAO,YAAa3B,KAAKF,WACpDE,KAAKF,WAAWE,KAAKsF,2BAGnBS,MAAQ,KACf,MAAME,EAASjG,KAAKH,GAAGwC,KAAK6D,WAC5B,IAAKD,EAAQ,OACb,MAAME,EAAenG,KAAKgF,QAAQoB,YAC5BC,EAAgBrG,KAAKgF,QAAQsB,aAC7BC,EAASJ,EAAeF,EAAOR,MAC/Be,EAASH,EAAgBJ,EAAOP,OACtC1F,KAAK4E,aAAanB,MAAmC,GAA3BC,KAAKxB,IAAIqE,EAAQC,GAC3CxG,KAAK4E,aAAaC,QAAUsB,EAAe,EAC3CnG,KAAK4E,aAAaE,QAAUuB,EAAgB,EAC5CrG,KAAKiF,WAAWwB,UAAU,EAAG,EAAGN,EAAcE,GAC9CrG,KAAKiF,WAAWyB,OAChB1G,KAAKiF,WAAW0B,UAAU3G,KAAK4E,aAAaC,QAAS7E,KAAK4E,aAAaE,SACvE9E,KAAKiF,WAAWxB,MAAMzD,KAAK4E,aAAanB,MAAOzD,KAAK4E,aAAanB,OACjEzD,KAAKiF,WAAW0B,WAAWV,EAAOpB,SAAUoB,EAAOnB,SACnD,MAAM8B,EAAa5G,KAAKH,GAAGwC,KAAKuE,WAChC,IAAA,MAAWC,KAAQD,EAAWE,MAAO9G,KAAK+G,gBAAgBF,GAC1D,IAAA,MAAWG,KAAQJ,EAAWK,MAAOjH,KAAKkH,gBAAgBF,GAC1DhH,KAAKiF,WAAWkC,WAGTD,gBAAmBF,IAC1B,MAAMI,EAASpH,KAAK+E,GAAGsC,SAASL,EAAKM,OAErCtH,KAAKiF,WAAWsC,UAAYH,EAAOI,OACnC5F,EAAU6F,cAAczH,KAAKiF,WAAY+B,EAAKU,EAAGV,EAAKW,EAAGX,EAAKvB,MAAOuB,EAAKtB,OAF3D,IAGf1F,KAAKiF,WAAW2C,QAGTb,gBAAmBF,IAC1B,MAAMgB,EAAY7H,KAAKH,GAAGwC,KAAKyF,QACzBC,EAAWF,EAAUhB,EAAKkB,UAAUC,IACpCC,EAASJ,EAAUhB,EAAKoB,QAAQD,IACtC,IAAKD,IAAaE,EAAQ,OAC1B,MAAQP,EAAGQ,EAAQP,EAAGQ,GAAWvG,EAAUwG,eAAeL,EAAUlB,EAAKwB,WACjEX,EAAGY,EAAMX,EAAGY,GAAS3G,EAAUwG,eAAeH,EAAQpB,EAAK2B,QACnExI,KAAKiF,WAAWwD,YAChBzI,KAAKiF,WAAWyD,OAAOR,EAAQC,GAC/BnI,KAAKiF,WAAW0D,OAAOL,EAAMC,GAC7BvI,KAAKiF,WAAW2D,YAAc5I,KAAK+E,GAAGsC,SAASR,EAAKS,OAAOuB,OAC3D7I,KAAKiF,WAAW6D,UAAY,GAC5B9I,KAAKiF,WAAW8D,UAGTzD,wBAA0B,KACjC,GAAItF,KAAKF,UAAW,OACpB,MAAMmG,EAASjG,KAAKH,GAAGwC,KAAK6D,WACtBrF,EAAYb,KAAKH,GAAGwC,KAAKxB,UACzB4C,EAAQzD,KAAKH,GAAGwC,KAAKoB,MAC3B,IAAKwC,EAAQ,OACb,MAAM+C,EAAYnI,EAAUuF,YAAc3C,EACpCwF,EAAapI,EAAUyF,aAAe7C,EACtCyF,GAAmBlJ,KAAKH,GAAGwC,KAAK+B,QAAUX,EAAQ5C,EAAUuF,aAAe,EAAI3C,GAC/E0F,GACJnJ,KAAKH,GAAGwC,KAAKgC,QAAUZ,EAAQ5C,EAAUyF,cAAgB,EAAI7C,GACzD2F,EACLpJ,KAAK4E,aAAaC,SACjBqE,EAAkBF,EAAY,EAAI/C,EAAOpB,SAAW7E,KAAK4E,aAAanB,MAClE4F,EACLrJ,KAAK4E,aAAaE,SACjBqE,EAAkBF,EAAa,EAAIhD,EAAOnB,SAAW9E,KAAK4E,aAAanB,MACnE6F,EAAgBN,EAAYhJ,KAAK4E,aAAanB,MAC9C8F,EAAiBN,EAAajJ,KAAK4E,aAAanB,MACtDzD,KAAKkF,kBAAkBsE,MAAMC,KAAO,GAAGL,MACvCpJ,KAAKkF,kBAAkBsE,MAAME,IAAM,GAAGL,MACtCrJ,KAAKkF,kBAAkBsE,MAAM/D,MAAQ,GAAG6D,MACxCtJ,KAAKkF,kBAAkBsE,MAAM9D,OAAS,GAAG6D,OAGlCvG,QAAU,KACjBhD,KAAKoF,iBAAiBxB,oBAAoB,QAAS5D,KAAKuC,gBACxDvC,KAAKiF,WAAWwB,UAAU,EAAG,EAAGzG,KAAKgF,QAAQoB,YAAapG,KAAKgF,QAAQsB,cACvEtG,KAAKmF,iBAAiBtB,SACtB7D,KAAK0E,kBAAoB,KACzB1E,KAAK2E,kBAAoB,KACzB3E,KAAKwE,mBAAqB,KAC1BxE,KAAKyE,SAAW,MCtKlB,MAAqBkF,UAA0BtK,EACtCuK,qBAA8C,KAC9CC,WAAqB,EACrBhK,GACAiK,gBAMJ,CACHC,QAAQ,EACRC,MAAO,EACPC,MAAO,EACPC,SAAU,EACVC,SAAU,GAGX,uBAAYC,GACX,GAAkC,OAA9BpK,KAAK4J,qBAA+B,MAAM3J,EAC9C,OAAOD,KAAK4J,oBACb,CAEA,WAAApJ,IAAeC,GACdC,SAASD,GAET,MAAM4J,EAAmB9I,SAASC,cAAc,OAChD6I,EAAiB5I,UAAY,qCAC7B4I,EAAiBC,YAChBtK,KAAKW,QAAQ4J,6BAA+B,sBAC7CvK,KAAKH,GAAKG,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAK4J,qBAAuBrI,SAASC,cAAc,OACnDxB,KAAK4J,qBAAqBnI,UAAY,8BAEtCG,EAAUC,YAAY7B,KAAK4J,uiBAC3B5J,KAAK4J,qBAAqB7H,YAAYsI,GACtCrK,KAAKH,GAAGwC,KAAKxB,UAAUkB,YAAY/B,KAAK4J,sBAEpC5J,KAAKW,QAAQ6J,wBAAwBxK,KAAKyK,kBAE9CC,OAAOpI,iBAAiB,cAAetC,KAAK2K,eAC5CD,OAAOpI,iBAAiB,cAAetC,KAAK4K,eAC5CF,OAAOpI,iBAAiB,YAAatC,KAAK6K,aAE1C7K,KAAK6C,QAAQ,CACZiI,wBAAyB9K,KAAKyK,gBAC9BM,sBAAuB/K,KAAKgL,gBAE7BhL,KAAK+C,UAAU/C,KAAKgD,QACrB,CAEQ2H,cAAiBM,IACxB,MAAMhF,EAASjG,KAAKH,GAAGwC,KAAKxB,UAAUqK,wBAErCD,EAAEE,QAAUlF,EAAOwD,MACnBwB,EAAEE,QAAUlF,EAAOmF,OACnBH,EAAEI,QAAUpF,EAAOyD,KACnBuB,EAAEI,QAAUpF,EAAOqF,OAEdtL,KAAK6J,WAAW7J,KAAKyK,kBAChBzK,KAAK6J,YACf7J,KAAK8J,gBAAgBI,SAAWe,EAAEE,QAClCnL,KAAK8J,gBAAgBK,SAAWc,EAAEI,QAClCrL,KAAK8J,gBAAgBE,MAAQiB,EAAEE,QAC/BnL,KAAK8J,gBAAgBG,MAAQgB,EAAEI,QAC/BrL,KAAK8J,gBAAgBC,QAAS,IAIxBa,cAAiBK,IACpBjL,KAAK8J,gBAAgBC,SACxB/J,KAAK8J,gBAAgBE,MAAQiB,EAAEE,QAC/BnL,KAAK8J,gBAAgBG,MAAQgB,EAAEI,UAIzBR,YAAc,KACjB7K,KAAK8J,gBAAgBC,SACxB/J,KAAK8J,gBAAgBC,QAAS,EAE7BrG,KAAK6H,IAAIvL,KAAK8J,gBAAgBE,MAAQhK,KAAK8J,gBAAgBI,UAC1DxG,KAAK6H,IAAIvL,KAAK8J,gBAAgBG,MAAQjK,KAAK8J,gBAAgBK,UAC5D,GAEAnK,KAAKgL,kBAIRP,gBAAkB,KACjBzK,KAAKoK,oBAAoB1I,UAAUmC,OAAO,UAC1C7D,KAAKH,GAAGwC,KAAKxB,UAAUa,UAAU8J,IAAI,QACrCxL,KAAK6J,WAAY,GAGlBmB,cAAgB,KACfhL,KAAK6J,WAAY,EACjB7J,KAAKoK,oBAAoB1I,UAAU8J,IAAI,UACvCC,WAAW,IAAMzL,KAAKH,GAAGwC,KAAKxB,UAAUa,UAAUmC,OAAO,QAAS,KAG3Db,QAAU,KACjB0H,OAAO9G,oBAAoB,cAAe5D,KAAK2K,eAC/CD,OAAO9G,oBAAoB,cAAe5D,KAAK4K,eAC/CF,OAAO9G,oBAAoB,YAAa5D,KAAK6K,aAC7C7K,KAAKoK,oBAAoBvG,SACzB7D,KAAK4J,qBAAuB"}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("./index-DwvIUSbr.cjs"),t=require("react");module.exports=function({modules:n,options:r,prerenderedContent:c="",className:s,style:a,id:u,theme:i,canvas:o,attachmentDir:l}){const m=t.useRef(null),d=t.useRef(null);return t.useEffect(()=>{if(!m.current)return;const t=new e.JSONCanvasViewer(Object.assign(r||{},{container:m.current,canvas:o,attachmentDir:l,theme:i}),n);return d.current=t,t.dispose},[r,n]),t.useEffect(()=>{d.current&&d.current.changeTheme(i)}),t.useEffect(()=>{d.current&&d.current.load({canvas:o,attachmentDir:l})}),React.createElement("section",{ref:m,dangerouslySetInnerHTML:{__html:c},style:{maxWidth:"100vw",maxHeight:"100vh",...a},className:s,id:u})};
|
|
2
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.cjs","sources":["../src/bridges/reactComponent.tsx"],"sourcesContent":["import JSONCanvasViewer, { type JSONCanvasViewerInterface } from '$';\nimport type { ModuleInputCtor, UserOptions } from '$/declarations';\nimport { useEffect, useRef } from 'react';\n\nexport default function JSONCanvasViewerReact<T extends ModuleInputCtor>({\n\tmodules,\n\toptions,\n\tprerenderedContent = '',\n\tclassName,\n\tstyle,\n\tid,\n\ttheme,\n\tcanvas,\n\tattachmentDir,\n}: {\n\tmodules?: T;\n\toptions?: Omit<UserOptions<T>, 'container' | 'theme' | 'canvas' | 'attachmentDir'>;\n\tprerenderedContent?: string;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\tid?: string;\n\ttheme?: 'dark' | 'light';\n\tcanvas?: JSONCanvas;\n\tattachmentDir?: string;\n}) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst instanceRef = useRef<null | JSONCanvasViewerInterface>(null);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst instance = new JSONCanvasViewer(\n\t\t\tObject.assign(options || {}, {\n\t\t\t\tcontainer: containerRef.current,\n\t\t\t\tcanvas,\n\t\t\t\tattachmentDir,\n\t\t\t\ttheme,\n\t\t\t}) as UserOptions<T>,\n\t\t\tmodules,\n\t\t);\n\t\tinstanceRef.current = instance;\n\t\treturn instance.dispose;\n\t\t// oxlint-disable-next-line eslint-plugin-react-hooks/exhaustive-deps\n\t}, [options, modules]);\n\n\tuseEffect(() => {\n\t\tif (!instanceRef.current) return;\n\t\tinstanceRef.current.changeTheme(theme);\n\t});\n\n\tuseEffect(() => {\n\t\tif (!instanceRef.current) return;\n\t\tinstanceRef.current.load({ canvas, attachmentDir });\n\t});\n\n\treturn (\n\t\t<section\n\t\t\tref={containerRef}\n\t\t\tdangerouslySetInnerHTML={{ __html: prerenderedContent }}\n\t\t\tstyle={{ maxWidth: '100vw', maxHeight: '100vh', ...style }}\n\t\t\tclassName={className}\n\t\t\tid={id}\n\t\t/>\n\t);\n}\n"],"names":["modules","options","prerenderedContent","className","style","id","theme","canvas","attachmentDir","containerRef","useRef","instanceRef","useEffect","current","instance","JSONCanvasViewer","Object","assign","container","dispose","changeTheme","load","React","createElement","ref","dangerouslySetInnerHTML","__html","maxWidth","maxHeight"],"mappings":"uFAIA,UAAyEA,QACxEA,EAAAC,QACAA,EAAAC,mBACAA,EAAqB,GAAAC,UACrBA,EAAAC,MACAA,EAAAC,GACAA,EAAAC,MACAA,EAAAC,OACAA,EAAAC,cACAA,IAYA,MAAMC,EAAeC,EAAAA,OAAuB,MACtCC,EAAcD,EAAAA,OAAyC,MA4B7D,OA1BAE,EAAAA,UAAU,KACT,IAAKH,EAAaI,QAAS,OAC3B,MAAMC,EAAW,IAAIC,EAAAA,iBACpBC,OAAOC,OAAOhB,GAAW,GAAI,CAC5BiB,UAAWT,EAAaI,QACxBN,SACAC,gBACAF,UAEDN,GAGD,OADAW,EAAYE,QAAUC,EACfA,EAASK,SAEd,CAAClB,EAASD,IAEbY,EAAAA,UAAU,KACJD,EAAYE,SACjBF,EAAYE,QAAQO,YAAYd,KAGjCM,EAAAA,UAAU,KACJD,EAAYE,SACjBF,EAAYE,QAAQQ,KAAK,CAAEd,SAAQC,oBAInCc,MAAAC,cAAC,UAAA,CACAC,IAAKf,EACLgB,wBAAyB,CAAEC,OAAQxB,GACnCE,MAAO,CAAEuB,SAAU,QAASC,UAAW,WAAYxB,GACnDD,YACAE,MAGH"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{J as e}from"./index-DJQyGIFX.js";import{useRef as t,useEffect as n}from"react";function r({modules:r,options:a,prerenderedContent:c="",className:s,style:i,id:m,theme:o,canvas:u,attachmentDir:l}){const d=t(null),h=t(null);return n(()=>{if(!d.current)return;const t=new e(Object.assign(a||{},{container:d.current,canvas:u,attachmentDir:l,theme:o}),r);return h.current=t,t.dispose},[a,r]),n(()=>{h.current&&h.current.changeTheme(o)}),n(()=>{h.current&&h.current.load({canvas:u,attachmentDir:l})}),/* @__PURE__ */React.createElement("section",{ref:d,dangerouslySetInnerHTML:{__html:c},style:{maxWidth:"100vw",maxHeight:"100vh",...i},className:s,id:m})}export{r as default};
|
|
2
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../src/bridges/reactComponent.tsx"],"sourcesContent":["import JSONCanvasViewer, { type JSONCanvasViewerInterface } from '$';\nimport type { ModuleInputCtor, UserOptions } from '$/declarations';\nimport { useEffect, useRef } from 'react';\n\nexport default function JSONCanvasViewerReact<T extends ModuleInputCtor>({\n\tmodules,\n\toptions,\n\tprerenderedContent = '',\n\tclassName,\n\tstyle,\n\tid,\n\ttheme,\n\tcanvas,\n\tattachmentDir,\n}: {\n\tmodules?: T;\n\toptions?: Omit<UserOptions<T>, 'container' | 'theme' | 'canvas' | 'attachmentDir'>;\n\tprerenderedContent?: string;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\tid?: string;\n\ttheme?: 'dark' | 'light';\n\tcanvas?: JSONCanvas;\n\tattachmentDir?: string;\n}) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst instanceRef = useRef<null | JSONCanvasViewerInterface>(null);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst instance = new JSONCanvasViewer(\n\t\t\tObject.assign(options || {}, {\n\t\t\t\tcontainer: containerRef.current,\n\t\t\t\tcanvas,\n\t\t\t\tattachmentDir,\n\t\t\t\ttheme,\n\t\t\t}) as UserOptions<T>,\n\t\t\tmodules,\n\t\t);\n\t\tinstanceRef.current = instance;\n\t\treturn instance.dispose;\n\t\t// oxlint-disable-next-line eslint-plugin-react-hooks/exhaustive-deps\n\t}, [options, modules]);\n\n\tuseEffect(() => {\n\t\tif (!instanceRef.current) return;\n\t\tinstanceRef.current.changeTheme(theme);\n\t});\n\n\tuseEffect(() => {\n\t\tif (!instanceRef.current) return;\n\t\tinstanceRef.current.load({ canvas, attachmentDir });\n\t});\n\n\treturn (\n\t\t<section\n\t\t\tref={containerRef}\n\t\t\tdangerouslySetInnerHTML={{ __html: prerenderedContent }}\n\t\t\tstyle={{ maxWidth: '100vw', maxHeight: '100vh', ...style }}\n\t\t\tclassName={className}\n\t\t\tid={id}\n\t\t/>\n\t);\n}\n"],"names":["JSONCanvasViewerReact","modules","options","prerenderedContent","className","style","id","theme","canvas","attachmentDir","containerRef","useRef","instanceRef","useEffect","current","instance","JSONCanvasViewer","Object","assign","container","dispose","changeTheme","load","React","createElement","ref","dangerouslySetInnerHTML","__html","maxWidth","maxHeight"],"mappings":"sFAIA,SAAwBA,GAAiDC,QACxEA,EAAAC,QACAA,EAAAC,mBACAA,EAAqB,GAAAC,UACrBA,EAAAC,MACAA,EAAAC,GACAA,EAAAC,MACAA,EAAAC,OACAA,EAAAC,cACAA,IAYA,MAAMC,EAAeC,EAAuB,MACtCC,EAAcD,EAAyC,MA4B7D,OA1BAE,EAAU,KACT,IAAKH,EAAaI,QAAS,OAC3B,MAAMC,EAAW,IAAIC,EACpBC,OAAOC,OAAOhB,GAAW,GAAI,CAC5BiB,UAAWT,EAAaI,QACxBN,SACAC,gBACAF,UAEDN,GAGD,OADAW,EAAYE,QAAUC,EACfA,EAASK,SAEd,CAAClB,EAASD,IAEbY,EAAU,KACJD,EAAYE,SACjBF,EAAYE,QAAQO,YAAYd,KAGjCM,EAAU,KACJD,EAAYE,SACjBF,EAAYE,QAAQQ,KAAK,CAAEd,SAAQC,mCAInCc,MAAAC,cAAC,UAAA,CACAC,IAAKf,EACLgB,wBAAyB,CAAEC,OAAQxB,GACnCE,MAAO,CAAEuB,SAAU,QAASC,UAAW,WAAYxB,GACnDD,YACAE,MAGH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
async function t(t){const a=async a=>await async function(t,a){switch(t.type){case"text":return await a(t.text);case"file":return await async function(t,a){if(t.file.match(/\.md$/i))return await async function(t,a){let e;try{const i=await fetch(t),n=await i.text(),r=n.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);e=r?await a(r[2]):await a(n)}catch{e="Failed to load content."}return e}(t.file,a);if(t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i))return`<img src="${t.file}" alt="${t.file.split("/").pop()}">`;if(t.file.match(/\.(mp3|wav)$/i))return`<audio src="${t.file}" controls></audio>`;return""}(t,a);case"link":return`<a href="${t.url}" target="_blank" rel="nofollow">${t.url}</a>`;default:return""}}(a,t.markdownParser||(t=>t)),e=t.canvas.nodes||[],i=t.attachmentDir||"./";e.forEach(t=>{if("file"===t.type&&!t.file.includes("http")){const a=t.file.split("/");t.file=i+a.pop()}});let n="";return e.forEach(async t=>{n+=await a(t)}),n}export{t as r};
|
|
2
|
+
//# sourceMappingURL=renderToString-ChykAKof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderToString-ChykAKof.js","sources":["../src/bridges/renderToString.ts"],"sourcesContent":["import type { MarkdownParser } from '$/declarations';\n\nexport default async function (options: {\n\tcanvas: JSONCanvas;\n\tattachmentDir?: string;\n\tmarkdownParser?: MarkdownParser;\n}) {\n\tconst render = async (node: JSONCanvasNode) =>\n\t\tawait renderer(node, options.markdownParser || ((markdown: string) => markdown));\n\tconst nodes = options.canvas.nodes || [];\n\tconst basePath = options.attachmentDir || './';\n\tnodes.forEach((node) => {\n\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\tconst file = node.file.split('/');\n\t\t\tnode.file = basePath + file.pop();\n\t\t}\n\t});\n\tlet result = '';\n\tnodes.forEach(async (node) => {\n\t\tresult += await render(node);\n\t});\n\treturn result;\n}\n\nasync function renderer(node: JSONCanvasNode, parse: MarkdownParser) {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn await parse(node.text);\n\t\tcase 'file':\n\t\t\treturn await fileProcessor(node, parse);\n\t\tcase 'link':\n\t\t\treturn `<a href=\"${node.url}\" target=\"_blank\" rel=\"nofollow\">${node.url}</a>`;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nasync function fileProcessor(node: JSONCanvasFileNode, parse: MarkdownParser) {\n\tif (node.file.match(/\\.md$/i)) return await loadMarkdown(node.file, parse);\n\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\treturn `<img src=\"${node.file}\" alt=\"${node.file.split('/').pop()}\">`;\n\telse if (node.file.match(/\\.(mp3|wav)$/i)) return `<audio src=\"${node.file}\" controls></audio>`;\n\treturn '';\n}\n\nasync function loadMarkdown(path: string, parse: MarkdownParser) {\n\tlet parsedContent: string;\n\ttry {\n\t\tconst response = await fetch(path);\n\t\tconst result = await response.text();\n\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tif (frontmatterMatch) parsedContent = await parse(frontmatterMatch[2]);\n\t\telse parsedContent = await parse(result);\n\t} catch {\n\t\tparsedContent = 'Failed to load content.';\n\t}\n\treturn parsedContent;\n}\n"],"names":["async","renderToString","options","render","node","parse","type","text","file","match","path","parsedContent","response","fetch","result","frontmatterMatch","loadMarkdown","split","pop","fileProcessor","url","renderer","markdownParser","markdown","nodes","canvas","basePath","attachmentDir","forEach","includes"],"mappings":"AAEAA,eAAAC,EAA+BC,GAK9B,MAAMC,EAASH,MAAOI,SAiBvBJ,eAAwBI,EAAsBC,GAC7C,OAAQD,EAAKE,MACZ,IAAK,OACJ,aAAaD,EAAMD,EAAKG,MACzB,IAAK,OACJ,aAQHP,eAA6BI,EAA0BC,GACtD,GAAID,EAAKI,KAAKC,MAAM,uBAOrBT,eAA4BU,EAAcL,GACzC,IAAIM,EACJ,IACC,MAAMC,QAAiBC,MAAMH,GACvBI,QAAeF,EAASL,OACxBQ,EAAmBD,EAAOL,MAAM,qCAChBE,EAAlBI,QAAwCV,EAAMU,EAAiB,UACxCV,EAAMS,EAClC,CAAA,MACCH,EAAgB,yBACjB,CACA,OAAOA,CACR,CAnB6CK,CAAaZ,EAAKI,KAAMH,GAAK,GAChED,EAAKI,KAAKC,MAAM,mCACxB,MAAO,aAAaL,EAAKI,cAAcJ,EAAKI,KAAKS,MAAM,KAAKC,UAAK,GACzDd,EAAKI,KAAKC,MAAM,iBAAkB,MAAO,eAAeL,EAAKI,0BACtE,MAAO,EACR,CAdgBW,CAAcf,EAAMC,GAClC,IAAK,OACJ,MAAO,YAAYD,EAAKgB,uCAAuChB,EAAKgB,UACrE,QACC,MAAO,GAEV,CA3BQC,CAASjB,EAAMF,EAAQoB,gBAAA,CAAoBC,GAAqBA,IACjEC,EAAQtB,EAAQuB,OAAOD,OAAS,GAChCE,EAAWxB,EAAQyB,eAAiB,KAC1CH,EAAMI,QAASxB,IACd,GAAkB,SAAdA,EAAKE,OAAoBF,EAAKI,KAAKqB,SAAS,QAAS,CACxD,MAAMrB,EAAOJ,EAAKI,KAAKS,MAAM,KAC7Bb,EAAKI,KAAOkB,EAAWlB,EAAKU,KAC7B,IAED,IAAIJ,EAAS,GAIb,OAHAU,EAAMI,QAAQ5B,MAAOI,IACpBU,SAAgBX,EAAOC,KAEjBU,CACR"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";exports.renderToString=async function(t){const a=async a=>await async function(t,a){switch(t.type){case"text":return await a(t.text);case"file":return await async function(t,a){if(t.file.match(/\.md$/i))return await async function(t,a){let e;try{const i=await fetch(t),n=await i.text(),r=n.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);e=r?await a(r[2]):await a(n)}catch{e="Failed to load content."}return e}(t.file,a);if(t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i))return`<img src="${t.file}" alt="${t.file.split("/").pop()}">`;if(t.file.match(/\.(mp3|wav)$/i))return`<audio src="${t.file}" controls></audio>`;return""}(t,a);case"link":return`<a href="${t.url}" target="_blank" rel="nofollow">${t.url}</a>`;default:return""}}(a,t.markdownParser||(t=>t)),e=t.canvas.nodes||[],i=t.attachmentDir||"./";e.forEach(t=>{if("file"===t.type&&!t.file.includes("http")){const a=t.file.split("/");t.file=i+a.pop()}});let n="";return e.forEach(async t=>{n+=await a(t)}),n};
|
|
2
|
+
//# sourceMappingURL=renderToString-Cxh5DtRo.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderToString-Cxh5DtRo.cjs","sources":["../src/bridges/renderToString.ts"],"sourcesContent":["import type { MarkdownParser } from '$/declarations';\n\nexport default async function (options: {\n\tcanvas: JSONCanvas;\n\tattachmentDir?: string;\n\tmarkdownParser?: MarkdownParser;\n}) {\n\tconst render = async (node: JSONCanvasNode) =>\n\t\tawait renderer(node, options.markdownParser || ((markdown: string) => markdown));\n\tconst nodes = options.canvas.nodes || [];\n\tconst basePath = options.attachmentDir || './';\n\tnodes.forEach((node) => {\n\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\tconst file = node.file.split('/');\n\t\t\tnode.file = basePath + file.pop();\n\t\t}\n\t});\n\tlet result = '';\n\tnodes.forEach(async (node) => {\n\t\tresult += await render(node);\n\t});\n\treturn result;\n}\n\nasync function renderer(node: JSONCanvasNode, parse: MarkdownParser) {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn await parse(node.text);\n\t\tcase 'file':\n\t\t\treturn await fileProcessor(node, parse);\n\t\tcase 'link':\n\t\t\treturn `<a href=\"${node.url}\" target=\"_blank\" rel=\"nofollow\">${node.url}</a>`;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nasync function fileProcessor(node: JSONCanvasFileNode, parse: MarkdownParser) {\n\tif (node.file.match(/\\.md$/i)) return await loadMarkdown(node.file, parse);\n\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\treturn `<img src=\"${node.file}\" alt=\"${node.file.split('/').pop()}\">`;\n\telse if (node.file.match(/\\.(mp3|wav)$/i)) return `<audio src=\"${node.file}\" controls></audio>`;\n\treturn '';\n}\n\nasync function loadMarkdown(path: string, parse: MarkdownParser) {\n\tlet parsedContent: string;\n\ttry {\n\t\tconst response = await fetch(path);\n\t\tconst result = await response.text();\n\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tif (frontmatterMatch) parsedContent = await parse(frontmatterMatch[2]);\n\t\telse parsedContent = await parse(result);\n\t} catch {\n\t\tparsedContent = 'Failed to load content.';\n\t}\n\treturn parsedContent;\n}\n"],"names":["async","options","render","node","parse","type","text","file","match","path","parsedContent","response","fetch","result","frontmatterMatch","loadMarkdown","split","pop","fileProcessor","url","renderer","markdownParser","markdown","nodes","canvas","basePath","attachmentDir","forEach","includes"],"mappings":"oCAEAA,eAA+BC,GAK9B,MAAMC,EAASF,MAAOG,SAiBvBH,eAAwBG,EAAsBC,GAC7C,OAAQD,EAAKE,MACZ,IAAK,OACJ,aAAaD,EAAMD,EAAKG,MACzB,IAAK,OACJ,aAQHN,eAA6BG,EAA0BC,GACtD,GAAID,EAAKI,KAAKC,MAAM,uBAOrBR,eAA4BS,EAAcL,GACzC,IAAIM,EACJ,IACC,MAAMC,QAAiBC,MAAMH,GACvBI,QAAeF,EAASL,OACxBQ,EAAmBD,EAAOL,MAAM,qCAChBE,EAAlBI,QAAwCV,EAAMU,EAAiB,UACxCV,EAAMS,EAClC,CAAA,MACCH,EAAgB,yBACjB,CACA,OAAOA,CACR,CAnB6CK,CAAaZ,EAAKI,KAAMH,GAAK,GAChED,EAAKI,KAAKC,MAAM,mCACxB,MAAO,aAAaL,EAAKI,cAAcJ,EAAKI,KAAKS,MAAM,KAAKC,UAAK,GACzDd,EAAKI,KAAKC,MAAM,iBAAkB,MAAO,eAAeL,EAAKI,0BACtE,MAAO,EACR,CAdgBW,CAAcf,EAAMC,GAClC,IAAK,OACJ,MAAO,YAAYD,EAAKgB,uCAAuChB,EAAKgB,UACrE,QACC,MAAO,GAEV,CA3BQC,CAASjB,EAAMF,EAAQoB,gBAAA,CAAoBC,GAAqBA,IACjEC,EAAQtB,EAAQuB,OAAOD,OAAS,GAChCE,EAAWxB,EAAQyB,eAAiB,KAC1CH,EAAMI,QAASxB,IACd,GAAkB,SAAdA,EAAKE,OAAoBF,EAAKI,KAAKqB,SAAS,QAAS,CACxD,MAAMrB,EAAOJ,EAAKI,KAAKS,MAAM,KAC7Bb,EAAKI,KAAOkB,EAAWlB,EAAKU,KAC7B,IAED,IAAIJ,EAAS,GAIb,OAHAU,EAAMI,QAAQ3B,MAAOG,IACpBU,SAAgBX,EAAOC,KAEjBU,CACR"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as t,d as e,u as s,D as i,S as a,C as o}from"./controller-BRBUPg_j.js";import{Pointeract as r,Click as n,Drag as c,WheelPanZoom as h,PreventDefault as l,MultitouchPanZoom as d}from"pointeract";class m extends t{_overlaysLayer=document.createElement("div");overlays={};selectedId=null;eventListeners={};DM;SM;parse;get overlaysLayer(){if(!this._overlaysLayer)throw e;return this._overlaysLayer}hooks={onInteractionStart:s.makeHook(),onInteractionEnd:s.makeHook()};constructor(...t){super(...t),this.parse=this.options.markdownParser||(t=>t),this.DM=this.container.get(i),this.SM=this.container.get(a);this.container.get(o).hooks.onRefresh.subscribe(this.updateOverlays),this.SM.onChangeTheme.subscribe(this.themeChanged),this._overlaysLayer=document.createElement("div"),this._overlaysLayer.className="overlays",this._overlaysLayer.id="overlays",this.DM.data.container.appendChild(this.overlaysLayer),this.onStart(this.start),this.onRestart(this.restart),this.onDispose(this.dispose)}start=()=>{this.container.get(p).onClick.subscribe(this.select),this.renderOverlays()};restart=()=>{this.clearOverlays(),this.renderOverlays()};renderOverlays=()=>{const t=async t=>{switch(t.type){case"text":await this.createOverlay(t,t.text,"text");break;case"file":t.file.match(/\.md$/i)?await this.loadMarkdownForNode(t):t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?await this.createOverlay(t,t.file,"image"):t.file.match(/\.(mp3|wav)$/i)&&await this.createOverlay(t,t.file,"audio");break;case"link":await this.createOverlay(t,t.url,"link")}};Object.values(this.DM.data.nodeMap).forEach(async e=>{await t(e.ref)})};themeChanged=()=>{Object.values(this.overlays).forEach(t=>{const e=this.DM.data.nodeMap[t.id].ref,s=this.SM.getColor(e.color);this.setOverlayColor(t,s)})};select=t=>{const e=this.selectedId?this.overlays[this.selectedId]:null,s=t?this.overlays[t]:null;e&&e.classList.remove("active"),s?(s.classList.add("active"),this.hooks.onInteractionStart()):this.hooks.onInteractionEnd(),this.selectedId=t};loadMarkdownForNode=async t=>{let e;await this.createOverlay(t,"Loading...","text");try{const s=await fetch(t.file),i=await s.text(),a=i.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);e=a?await this.parse(a[2]):await this.parse(i)}catch(s){console.error("[JSONCanvasViewer] Failed to load markdown:",s),e="Failed to load content."}this.updateOverlay(t,{content:e})};updateOverlays=()=>{const t=this.DM.data;this.overlaysLayer.style.transform=`translate(${t.offsetX}px, ${t.offsetY}px) scale(${t.scale})`};async createOverlay(t,e,s){let i=this.overlays[t.id];i||(i=await this.constructOverlay(t,e,s),this.overlaysLayer.appendChild(i),this.overlays[t.id]=i,i.style.left=`${t.x}px`,i.style.top=`${t.y}px`,i.style.width=`${t.width}px`,i.style.height=`${t.height}px`)}updateOverlay(t,e){const s=this.overlays[t.id];if(e.content){const t=s.getElementsByClassName("parsed-content-wrapper")[0];t&&(t.innerHTML=e.content)}e.color&&this.setOverlayColor(s,e.color)}async constructOverlay(t,e,s){const i=document.createElement("div");switch(i.classList.add("overlay-container"),i.id=t.id,this.setOverlayColor(i,this.SM.getColor(t.color)),s){case"text":{i.classList.add("markdown-content");const t=document.createElement("div");t.innerHTML=await this.parse(e||""),t.classList.add("parsed-content-wrapper"),i.appendChild(t);break}case"link":{const t=document.createElement("iframe");t.src=e,t.sandbox="allow-scripts allow-same-origin",t.className="link-iframe",t.loading="lazy",i.appendChild(t);break}case"audio":{const t=document.createElement("audio");t.className="audio",t.src=e,t.controls=!0,i.appendChild(t);break}case"image":{const t=document.createElement("img");t.src=e,t.loading="lazy",i.appendChild(t)}}switch(s){case"link":case"audio":{const t=document.createElement("div");t.className="click-layer",i.appendChild(t)}}const a=document.createElement("div");a.className="overlay-border",i.appendChild(a);const o=()=>{t.id===this.selectedId&&this.hooks.onInteractionStart()},r=()=>{t.id===this.selectedId&&this.hooks.onInteractionEnd()};return i.addEventListener("pointerenter",o),i.addEventListener("pointerleave",r),i.addEventListener("touchstart",o),i.addEventListener("touchend",r),this.eventListeners[t.id]=[o,r],i}setOverlayColor=(t,e)=>{Object.entries(e).forEach(([e,s])=>{t.style.setProperty(`--overlay-${e}`,s)})};clearOverlays=()=>{Object.entries(this.overlays).forEach(([t,s])=>{if(this.eventListeners[t]){const i=this.eventListeners[t][0],a=this.eventListeners[t][1];if(!i||!a)throw e;s.removeEventListener("pointerenter",i),s.removeEventListener("pointerleave",a),s.removeEventListener("touchstart",i),s.removeEventListener("touchend",a),this.eventListeners[t][0]=null,this.eventListeners[t][1]=null}s.remove(),delete this.overlays[t]})};dispose=()=>{this.clearOverlays(),this.overlaysLayer.remove(),this._overlaysLayer=null}}class p extends t{pointeract;DM;onClick=s.makeHook();stopInteraction;startInteraction;constructor(...t){super(...t),this.DM=this.container.get(i);const e=Object.assign(this.options.pointeract||{},{coordinateOutput:"relative"});this.pointeract=new r(this.DM.data.container,[n,c,h,l,d],e),this.startInteraction=this.pointeract.start,this.stopInteraction=this.pointeract.stop;const s=this.container.get(m);s.hooks.onInteractionStart.subscribe(this.stopInteraction),s.hooks.onInteractionEnd.subscribe(this.startInteraction),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.pointeract.on("pan",this.onPan),this.pointeract.on("drag",this.onPan),this.pointeract.on("zoom",this.onZoom),this.pointeract.on("trueClick",this.onTrueClick),this.pointeract.start()};onPan=t=>{this.DM.pan(t.detail)};onZoom=t=>{const e=t.detail;this.DM.zoom(e.factor,{x:e.x,y:e.y})};onTrueClick=t=>{const e=t.detail.target;if(this.isUIControl(e))return;const s=this.findNodeId(e);this.onClick(s)};isUIControl=t=>!!t&&(t.closest(".controls")||t.closest("button")||t.closest("input"));findNodeId=t=>{if(!t)return null;let e=t;for(;(!e.id||""===e.id)&&e.parentElement;)e=e.parentElement;return"overlays"!==e.id&&e.id&&""!==e.id?e.id:null};dispose=()=>{this.pointeract.off("pan",this.onPan),this.pointeract.off("zoom",this.onZoom),this.pointeract.off("trueClick",this.onTrueClick),this.pointeract.dispose()}}class v extends t{_canvas;ctx;DM;SM;zoomInOptimize={lastDrawnScale:0,lastDrawnViewport:{left:0,right:0,top:0,bottom:0},timeout:null,lastCallTime:0};get canvas(){if(null===this._canvas)throw e;return this._canvas}constructor(...t){super(...t);const e=this.container.get(o);this.SM=this.container.get(a),e.hooks.onRefresh.subscribe(this.redraw),e.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(i),this._canvas=document.createElement("canvas"),this._canvas.className="main-canvas",this.ctx=this._canvas.getContext("2d"),this.DM.data.container.appendChild(this._canvas),this.onDispose(this.dispose)}optimizeDPR=()=>{const t=this.DM.data.container;s.resizeCanvasForDPR(this.canvas,t.offsetWidth,t.offsetHeight)};redraw=()=>{const t=this.DM.data.offsetX,e=this.DM.data.offsetY,s=this.DM.data.scale,i=this.getCurrentViewport(t,e,s);if(!this.options.zoomInOptimization)return void this.trueRedraw(t,e,s,i);this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null);const a=Date.now();if(this.isInside(i,this.zoomInOptimize.lastDrawnViewport)&&s!==this.zoomInOptimize.lastDrawnScale){if(a-this.zoomInOptimize.lastCallTime<500)return this.zoomInOptimize.timeout=setTimeout(()=>{this.trueRedraw(t,e,s,i),this.zoomInOptimize.lastCallTime=a,this.zoomInOptimize.timeout=null},60),void this.fakeRedraw(i,s)}this.zoomInOptimize.lastCallTime=a,this.trueRedraw(t,e,s,i)};trueRedraw(t,e,s,i){this.zoomInOptimize.lastDrawnViewport=i,this.zoomInOptimize.lastDrawnScale=s,this.canvas.style.transform="",this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.drawGridDots(s,t,e),this.ctx.translate(t,e),this.ctx.scale(s,s),Object.values(this.DM.data.nodeMap).forEach(t=>{if(this.isOutside(t.box,i))return;const e=t.ref;"file"===e.type?this.drawFile(t):"group"===e.type&&this.drawGroup(e,s)}),Object.values(this.DM.data.edgeMap).forEach(t=>{this.isOutside(t.box,i)||this.drawEdge(t)}),this.ctx.restore()}fakeRedraw(t,e){const s=e/this.zoomInOptimize.lastDrawnScale,i=(this.zoomInOptimize.lastDrawnViewport.left-t.left)*e,a=(this.zoomInOptimize.lastDrawnViewport.top-t.top)*e;this.canvas.style.transform=`translate(${i}px, ${a}px) scale(${s})`}isInside=(t,e)=>t.left>e.left&&t.top>e.top&&t.right<e.right&&t.bottom<e.bottom;isOutside=(t,e)=>t.right<e.left||t.bottom<e.top||t.left>e.right||t.top>e.bottom;getCurrentViewport=(t,e,s)=>{const i=-t/s,a=-e/s,o=this.DM.data.container;return{left:i,top:a,right:i+o.clientWidth/s,bottom:a+o.clientHeight/s}};drawLabelBar=(t,e,s,i,a,o)=>{const r=30*o,n=6*o,c=8*o,h=16*o,l=6*o;this.ctx.save(),this.ctx.translate(t,e),this.ctx.scale(1/o,1/o),this.ctx.font=`${h}px 'Inter', sans-serif`;const d=this.ctx.measureText(s).width+2*l;this.ctx.translate(0,-r-c),this.ctx.fillStyle=i,this.ctx.beginPath(),this.ctx.moveTo(n,0),this.ctx.lineTo(d-n,0),this.ctx.quadraticCurveTo(d,0,d,n),this.ctx.lineTo(d,r-n),this.ctx.quadraticCurveTo(d,r,d-n,r),this.ctx.lineTo(n,r),this.ctx.quadraticCurveTo(0,r,0,r-n),this.ctx.lineTo(0,n),this.ctx.quadraticCurveTo(0,0,n,0),this.ctx.closePath(),this.ctx.fill(),this.ctx.fillStyle=a,this.ctx.fillText(s,l,.65*r),this.ctx.restore()};drawNodeBackground=t=>{const e=this.SM.getColor(t.color);this.ctx.globalAlpha=1,this.ctx.fillStyle=e.background,s.drawRoundRect(this.ctx,t.x+.5,t.y+.5,t.width-1,t.height-1,12),this.ctx.fill(),this.ctx.strokeStyle=e.border,this.ctx.lineWidth=1,s.drawRoundRect(this.ctx,t.x,t.y,t.width,t.height,12),this.ctx.stroke()};drawGroup=(t,e)=>{if(this.drawNodeBackground(t),t.label){const s=this.SM.getColor(t.color);this.drawLabelBar(t.x,t.y,t.label,s.active,s.text,e)}};drawFile=t=>{this.ctx.fillStyle=this.SM.getColor().text;const e=t.ref;this.ctx.font="16px sans-serif",this.ctx.fillText(t.fileName||"",e.x+5,e.y-10)};drawEdge=t=>{const e=t.ref,i=this.DM.data.nodeMap[e.fromNode].ref,a=this.DM.data.nodeMap[e.toNode].ref,o=s.getAnchorCoord,{x:r,y:n}=o(i,e.fromSide),{x:c,y:h}=o(a,e.toSide),l=this.SM.getColor(e.color);let[d,m,p,v]=[0,0,0,0];if(t.controlPoints?[d,m,p,v]=t.controlPoints:([d,m,p,v]=this.getControlPoints(r,n,c,h,e.fromSide,e.toSide),t.controlPoints=[d,m,p,v]),this.drawCurvedPath(r,n,c,h,d,m,p,v,l.active),this.drawArrowhead(c,h,p,v,l.active),e.label){const t=.5,i=(1-t)**3*r+3*(1-t)**2*t*d+3*(1-t)*t*t*p+t**3*c,a=(1-t)**3*n+3*(1-t)**2*t*m+3*(1-t)*t*t*v+t**3*h;this.ctx.font="18px sans-serif";const o=8,u=this.ctx.measureText(e.label).width+2*o,x=20;this.ctx.fillStyle=l.active,this.ctx.beginPath(),s.drawRoundRect(this.ctx,i-u/2,a-x/2-2,u,x,4),this.ctx.fill(),this.ctx.fillStyle=l.text,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(e.label,i,a-2),this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic"}};getControlPoints=(t,e,s,i,a,o)=>{const r=s-t,n=i-e,c=Math.min(Math.abs(r),Math.abs(n))+.3*Math.max(Math.abs(r),Math.abs(n)),h=(l=.5*c,d=60,m=300,Math.max(d,Math.min(m,l)));var l,d,m;let p=t,v=e,u=s,x=i;switch(a){case"top":v=e-h;break;case"bottom":v=e+h;break;case"left":p=t-h;break;case"right":p=t+h}switch(o){case"top":x=i-h;break;case"bottom":x=i+h;break;case"left":u=s-h;break;case"right":u=s+h}return[p,v,u,x]};drawGridDots=(t,e,s)=>{const i=10*2**-Math.floor(Math.log2(t))*t,a=this.canvas.width,o=this.canvas.height,r=e%i,n=s%i;this.ctx.fillStyle=this.SM.getNamedColor("dots");for(let c=r;c<=a;c+=i)for(let t=n;t<=o;t+=i)this.ctx.beginPath(),this.ctx.arc(c,t,1,0,2*Math.PI),this.ctx.fill()};drawCurvedPath=(t,e,s,i,a,o,r,n,c)=>{this.ctx.beginPath(),this.ctx.moveTo(t,e),this.ctx.bezierCurveTo(a,o,r,n,s,i),this.ctx.strokeStyle=c,this.ctx.lineWidth=2,this.ctx.stroke()};drawArrowhead=(t,e,s,i,a)=>{const o=t-s,r=e-i,n=Math.sqrt(o*o+r*r);if(0===n)return;const c=o/n,h=r/n,l=t-12*c-4*h,d=e-12*h+4*c,m=t-12*c+4*h,p=e-12*h-4*c;this.ctx.beginPath(),this.ctx.fillStyle=a,this.ctx.moveTo(t,e),this.ctx.lineTo(l,d),this.ctx.lineTo(m,p),this.ctx.closePath(),this.ctx.fill()};dispose=()=>{this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null),this.canvas.remove(),this._canvas=null}}export{p as I,m as O,v as R};
|
|
2
|
+
//# sourceMappingURL=renderer-0RqgAOLH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-0RqgAOLH.js","sources":["../src/core/overlayManager.ts","../src/core/interactionHandler.ts","../src/core/renderer.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport type { MarkdownParser } from '$/declarations';\nimport InteractionHandler from '$/interactionHandler';\nimport StyleManager, { type Color } from '$/styleManager';\nimport utilities, { destroyError } from '$/utilities';\n\ntype Options = {\n\tmarkdownParser?: MarkdownParser;\n};\n\nexport default class OverlayManager extends BaseModule<Options> {\n\tprivate _overlaysLayer: HTMLDivElement | null = document.createElement('div');\n\tprivate overlays: Record<string, HTMLDivElement> = {}; // { id: node } the overlays in viewport\n\tprivate selectedId: string | null = null;\n\tprivate eventListeners: Record<string, Array<EventListener | null>> = {};\n\tprivate DM: DataManager;\n\tprivate SM: StyleManager;\n\tprivate parse: MarkdownParser;\n\n\tprivate get overlaysLayer() {\n\t\tif (!this._overlaysLayer) throw destroyError;\n\t\treturn this._overlaysLayer;\n\t}\n\n\thooks = {\n\t\tonInteractionStart: utilities.makeHook(),\n\t\tonInteractionEnd: utilities.makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.parse = this.options.markdownParser || ((markdown: string) => markdown);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.SM = this.container.get(StyleManager);\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\t\tthis.SM.onChangeTheme.subscribe(this.themeChanged);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis._overlaysLayer.id = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onRestart(this.restart);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.container.get(InteractionHandler).onClick.subscribe(this.select);\n\t\tthis.renderOverlays();\n\t};\n\n\tprivate restart = () => {\n\t\tthis.clearOverlays();\n\t\tthis.renderOverlays();\n\t};\n\n\tprivate renderOverlays = () => {\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tawait this.createOverlay(node, node.text, 'text');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'file': {\n\t\t\t\t\tif (node.file.match(/\\.md$/i)) await this.loadMarkdownForNode(node);\n\t\t\t\t\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\t\t\t\t\tawait this.createOverlay(node, node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i))\n\t\t\t\t\t\tawait this.createOverlay(node, node.file, 'audio');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'link': {\n\t\t\t\t\tawait this.createOverlay(node, node.url, 'link');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tObject.values(this.DM.data.nodeMap).forEach(async (node) => {\n\t\t\tawait createOverlay(node.ref);\n\t\t});\n\t};\n\n\tprivate themeChanged = () => {\n\t\tObject.values(this.overlays).forEach((overlay) => {\n\t\t\tconst node = this.DM.data.nodeMap[overlay.id].ref;\n\t\t\tconst color = this.SM.getColor(node.color);\n\t\t\tthis.setOverlayColor(overlay, color);\n\t\t});\n\t};\n\n\tprivate select = (id: string | null) => {\n\t\tconst previous = !this.selectedId ? null : this.overlays[this.selectedId];\n\t\tconst current = !id ? null : this.overlays[id];\n\t\tif (previous) previous.classList.remove('active');\n\t\tif (current) {\n\t\t\tcurrent.classList.add('active');\n\t\t\tthis.hooks.onInteractionStart();\n\t\t} else this.hooks.onInteractionEnd();\n\t\tthis.selectedId = id;\n\t};\n\n\tprivate loadMarkdownForNode = async (node: JSONCanvasFileNode) => {\n\t\tawait this.createOverlay(node, 'Loading...', 'text');\n\t\tlet parsedContent: string;\n\t\ttry {\n\t\t\tconst response = await fetch(node.file);\n\t\t\tconst result = await response.text();\n\t\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\t\tif (frontmatterMatch) parsedContent = await this.parse(frontmatterMatch[2]);\n\t\t\telse parsedContent = await this.parse(result);\n\t\t} catch (err) {\n\t\t\tconsole.error('[JSONCanvasViewer] Failed to load markdown:', err);\n\t\t\tparsedContent = 'Failed to load content.';\n\t\t}\n\t\tthis.updateOverlay(node, { content: parsedContent });\n\t};\n\n\tprivate updateOverlays = () => {\n\t\tconst data = this.DM.data;\n\t\tthis.overlaysLayer.style.transform = `translate(${data.offsetX}px, ${data.offsetY}px) scale(${data.scale})`;\n\t};\n\n\tprivate async createOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tlet element = this.overlays[node.id];\n\t\tif (!element) {\n\t\t\telement = await this.constructOverlay(node, content, type);\n\t\t\tthis.overlaysLayer.appendChild(element);\n\t\t\tthis.overlays[node.id] = element;\n\t\t\telement.style.left = `${node.x}px`;\n\t\t\telement.style.top = `${node.y}px`;\n\t\t\telement.style.width = `${node.width}px`;\n\t\t\telement.style.height = `${node.height}px`;\n\t\t}\n\t}\n\n\tprivate updateOverlay(\n\t\tnode: JSONCanvasNode,\n\t\ttoUpdate: {\n\t\t\tcontent?: string;\n\t\t\tcolor?: Color;\n\t\t},\n\t) {\n\t\tconst element = this.overlays[node.id];\n\t\tif (toUpdate.content) {\n\t\t\tconst content = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tif (content) content.innerHTML = toUpdate.content;\n\t\t}\n\t\tif (toUpdate.color) {\n\t\t\tthis.setOverlayColor(element, toUpdate.color);\n\t\t}\n\t}\n\n\tprivate async constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\tthis.setOverlayColor(overlay, this.SM.getColor(node.color));\n\t\tswitch (type) {\n\t\t\tcase 'text': {\n\t\t\t\toverlay.classList.add('markdown-content');\n\t\t\t\tconst parsedContentWrapper = document.createElement('div');\n\t\t\t\tparsedContentWrapper.innerHTML = await this.parse(content || '');\n\t\t\t\tparsedContentWrapper.classList.add('parsed-content-wrapper');\n\t\t\t\toverlay.appendChild(parsedContentWrapper);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'link': {\n\t\t\t\tconst iframe = document.createElement('iframe');\n\t\t\t\tiframe.src = content;\n\t\t\t\tiframe.sandbox = 'allow-scripts allow-same-origin';\n\t\t\t\tiframe.className = 'link-iframe';\n\t\t\t\tiframe.loading = 'lazy';\n\t\t\t\toverlay.appendChild(iframe);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'audio': {\n\t\t\t\tconst audio = document.createElement('audio');\n\t\t\t\taudio.className = 'audio';\n\t\t\t\taudio.src = content;\n\t\t\t\taudio.controls = true;\n\t\t\t\toverlay.appendChild(audio);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'image': {\n\t\t\t\tconst img = document.createElement('img');\n\t\t\t\timg.src = content;\n\t\t\t\timg.loading = 'lazy';\n\t\t\t\toverlay.appendChild(img);\n\t\t\t}\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'link':\n\t\t\tcase 'audio': {\n\t\t\t\tconst clickLayer = document.createElement('div');\n\t\t\t\tclickLayer.className = 'click-layer';\n\t\t\t\toverlay.appendChild(clickLayer);\n\t\t\t}\n\t\t}\n\t\tconst overlayBorder = document.createElement('div');\n\t\toverlayBorder.className = 'overlay-border';\n\t\toverlay.appendChild(overlayBorder);\n\t\tconst onStart = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionStart();\n\t\t};\n\t\tconst onEnd = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionEnd();\n\t\t};\n\t\toverlay.addEventListener('pointerenter', onStart);\n\t\toverlay.addEventListener('pointerleave', onEnd);\n\t\toverlay.addEventListener('touchstart', onStart);\n\t\toverlay.addEventListener('touchend', onEnd);\n\t\tthis.eventListeners[node.id] = [onStart, onEnd];\n\t\treturn overlay;\n\t}\n\n\tprivate setOverlayColor = (overlay: HTMLDivElement, color: Color) => {\n\t\tObject.entries(color).forEach(([key, value]) => {\n\t\t\toverlay.style.setProperty(`--overlay-${key}`, value);\n\t\t});\n\t};\n\n\tprivate clearOverlays = () => {\n\t\tObject.entries(this.overlays).forEach(([id, overlay]) => {\n\t\t\tif (this.eventListeners[id]) {\n\t\t\t\tconst onStart = this.eventListeners[id][0];\n\t\t\t\tconst onEnd = this.eventListeners[id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\toverlay.removeEventListener('pointerenter', onStart);\n\t\t\t\toverlay.removeEventListener('pointerleave', onEnd);\n\t\t\t\toverlay.removeEventListener('touchstart', onStart);\n\t\t\t\toverlay.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[id][0] = null;\n\t\t\t\tthis.eventListeners[id][1] = null;\n\t\t\t}\n\t\t\toverlay.remove();\n\t\t\tdelete this.overlays[id];\n\t\t});\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.clearOverlays();\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport OverlayManager from '$/overlayManager';\nimport utilities from '$/utilities';\nimport {\n\tClick,\n\ttype Ctors,\n\tDrag,\n\tMultitouchPanZoom,\n\tPointeract,\n\ttype Options as PointeractOptions,\n\tPreventDefault,\n\ttype StdEvents,\n\tWheelPanZoom,\n} from 'pointeract';\n\ntype Options = {\n\tpointeract?: PointeractOptions<\n\t\tCtors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>\n\t>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<\n\t\tCtors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>\n\t>;\n\tprivate DM: DataManager;\n\tonClick = utilities.makeHook<[string | null]>();\n\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tconst options = Object.assign(this.options.pointeract || {}, {\n\t\t\tcoordinateOutput: 'relative',\n\t\t});\n\t\tthis.pointeract = new Pointeract(\n\t\t\tthis.DM.data.container,\n\t\t\t[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom],\n\t\t\toptions,\n\t\t);\n\t\tthis.startInteraction = this.pointeract.start;\n\t\tthis.stopInteraction = this.pointeract.stop;\n\t\tconst OM = this.container.get(OverlayManager);\n\t\tOM.hooks.onInteractionStart.subscribe(this.stopInteraction);\n\t\tOM.hooks.onInteractionEnd.subscribe(this.startInteraction);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.pointeract.on('pan', this.onPan);\n\t\tthis.pointeract.on('drag', this.onPan);\n\t\tthis.pointeract.on('zoom', this.onZoom);\n\t\tthis.pointeract.on('trueClick', this.onTrueClick);\n\t\tthis.pointeract.start();\n\t};\n\n\tprivate onPan = (event: StdEvents['pan']) => {\n\t\tthis.DM.pan(event.detail);\n\t};\n\tprivate onZoom = (event: StdEvents['zoom']) => {\n\t\tconst detail = event.detail;\n\t\tthis.DM.zoom(detail.factor, { x: detail.x, y: detail.y });\n\t};\n\n\tprivate onTrueClick = (e: StdEvents['trueClick']) => {\n\t\tconst element = e.detail.target as HTMLElement | null;\n\t\tif (this.isUIControl(element)) return;\n\t\tconst node = this.findNodeId(element);\n\t\tthis.onClick(node);\n\t};\n\n\tprivate isUIControl = (target: HTMLElement | null) => {\n\t\tif (!target) return false;\n\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t};\n\n\tprivate findNodeId = (element: HTMLElement | null) => {\n\t\tif (!element) return null;\n\t\tlet ele = element;\n\t\twhile (!ele.id || ele.id === '') {\n\t\t\tif (!ele.parentElement) break;\n\t\t\tele = ele.parentElement;\n\t\t}\n\t\tif (ele.id === 'overlays' || !ele.id || ele.id === '') return null;\n\t\treturn ele.id;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.pointeract.off('pan', this.onPan);\n\t\tthis.pointeract.off('zoom', this.onZoom);\n\t\tthis.pointeract.off('trueClick', this.onTrueClick);\n\t\tthis.pointeract.dispose();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager, { type EdgeItem, type NodeItem } from '$/dataManager';\nimport type { Box } from '$/declarations';\nimport StyleManager from '$/styleManager';\nimport utilities, { destroyError } from '$/utilities';\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 4;\nconst NODE_RADIUS = 12;\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\nconst NODE_BORDER_WIDTH = 1;\nconst DOT_RADIUS = 1; // Dot radius in CSS pixels\nconst DOT_BASE_GAP = 10; // Base gap between dots in CSS pixels\n\nconst NODE_BORDER_HALF_WIDTH = NODE_BORDER_WIDTH / 2;\n\ntype Options = {\n\tzoomInOptimization?: boolean;\n};\n\nexport default class Renderer extends BaseModule<Options> {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate SM: StyleManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: Box;\n\t\ttimeout: NodeJS.Timeout | null;\n\t\tlastCallTime: number;\n\t} = {\n\t\tlastDrawnScale: 0,\n\t\tlastDrawnViewport: {\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t},\n\t\ttimeout: null,\n\t\tlastCallTime: 0,\n\t};\n\n\tprivate get canvas() {\n\t\tif (this._canvas === null) throw destroyError;\n\t\treturn this._canvas;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst controller = this.container.get(Controller);\n\t\tthis.SM = this.container.get(StyleManager);\n\t\tcontroller.hooks.onRefresh.subscribe(this.redraw);\n\t\tcontroller.hooks.onResize.subscribe(this.optimizeDPR);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._canvas.className = 'main-canvas';\n\t\tthis.ctx = this._canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis.DM.data.container.appendChild(this._canvas);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate optimizeDPR = () => {\n\t\tconst container = this.DM.data.container;\n\t\tutilities.resizeCanvasForDPR(this.canvas, container.offsetWidth, container.offsetHeight);\n\t};\n\n\tprivate redraw = () => {\n\t\tconst offsetX = this.DM.data.offsetX;\n\t\tconst offsetY = this.DM.data.offsetY;\n\t\tconst scale = this.DM.data.scale;\n\t\tconst currentViewport = this.getCurrentViewport(offsetX, offsetY, scale);\n\t\tif (!this.options.zoomInOptimization) {\n\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\treturn;\n\t\t}\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tconst now = Date.now();\n\t\tif (\n\t\t\tthis.isInside(currentViewport, this.zoomInOptimize.lastDrawnViewport) &&\n\t\t\tscale !== this.zoomInOptimize.lastDrawnScale\n\t\t) {\n\t\t\tconst timeSinceLast = now - this.zoomInOptimize.lastCallTime;\n\t\t\tif (timeSinceLast < CSS_ZOOM_REDRAW_INTERVAL) {\n\t\t\t\tthis.zoomInOptimize.timeout = setTimeout(() => {\n\t\t\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\t\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\t\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t\t\t}, 60);\n\t\t\t\tthis.fakeRedraw(currentViewport, scale);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t};\n\n\tprivate trueRedraw(offsetX: number, offsetY: number, scale: number, currentViewport: Box) {\n\t\tthis.zoomInOptimize.lastDrawnViewport = currentViewport;\n\t\tthis.zoomInOptimize.lastDrawnScale = scale;\n\t\tthis.canvas.style.transform = '';\n\t\tthis.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\t\tthis.ctx.save();\n\t\tthis.drawGridDots(scale, offsetX, offsetY);\n\t\tthis.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tObject.values(this.DM.data.nodeMap).forEach((item) => {\n\t\t\tif (this.isOutside(item.box, currentViewport)) return;\n\t\t\tconst node = item.ref;\n\t\t\tif (node.type === 'file') this.drawFile(item);\n\t\t\telse if (node.type === 'group') this.drawGroup(node, scale);\n\t\t});\n\t\tObject.values(this.DM.data.edgeMap).forEach((item) => {\n\t\t\tif (this.isOutside(item.box, currentViewport)) return;\n\t\t\tthis.drawEdge(item);\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: Box, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX =\n\t\t\t(this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY =\n\t\t\t(this.zoomInOptimize.lastDrawnViewport.top - currentViewport.top) * scale;\n\t\tthis.canvas.style.transform = `translate(${currentOffsetX}px, ${currentOffsetY}px) scale(${cssScale})`;\n\t}\n\n\tprivate isInside = (inner: Box, outer: Box) =>\n\t\tinner.left > outer.left &&\n\t\tinner.top > outer.top &&\n\t\tinner.right < outer.right &&\n\t\tinner.bottom < outer.bottom;\n\n\tprivate isOutside = (inner: Box, outer: Box) =>\n\t\tinner.right < outer.left ||\n\t\tinner.bottom < outer.top ||\n\t\tinner.left > outer.right ||\n\t\tinner.top > outer.bottom;\n\n\tprivate getCurrentViewport = (offsetX: number, offsetY: number, scale: number) => {\n\t\tconst left = -offsetX / scale;\n\t\tconst top = -offsetY / scale;\n\t\tconst container = this.DM.data.container;\n\t\tconst right = left + container.clientWidth / scale;\n\t\tconst bottom = top + container.clientHeight / scale;\n\t\treturn { left, top, right, bottom };\n\t};\n\n\tprivate drawLabelBar = (\n\t\tx: number,\n\t\ty: number,\n\t\tlabel: string,\n\t\tcolor: string,\n\t\ttextColor: string,\n\t\tscale: number,\n\t) => {\n\t\tconst barHeight = 30 * scale;\n\t\tconst radius = 6 * scale;\n\t\tconst yOffset = 8 * scale;\n\t\tconst fontSize = 16 * scale;\n\t\tconst xPadding = 6 * scale;\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(x, y);\n\t\tthis.ctx.scale(1 / scale, 1 / scale);\n\t\tthis.ctx.font = `${fontSize}px 'Inter', sans-serif`;\n\t\tconst barWidth = this.ctx.measureText(label).width + 2 * xPadding;\n\t\tthis.ctx.translate(0, -barHeight - yOffset);\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(radius, 0);\n\t\tthis.ctx.lineTo(barWidth - radius, 0);\n\t\tthis.ctx.quadraticCurveTo(barWidth, 0, barWidth, radius);\n\t\tthis.ctx.lineTo(barWidth, barHeight - radius);\n\t\tthis.ctx.quadraticCurveTo(barWidth, barHeight, barWidth - radius, barHeight);\n\t\tthis.ctx.lineTo(radius, barHeight);\n\t\tthis.ctx.quadraticCurveTo(0, barHeight, 0, barHeight - radius);\n\t\tthis.ctx.lineTo(0, radius);\n\t\tthis.ctx.quadraticCurveTo(0, 0, radius, 0);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t\tthis.ctx.fillStyle = textColor;\n\t\tthis.ctx.fillText(label, xPadding, barHeight * 0.65);\n\t\tthis.ctx.restore();\n\t};\n\n\tprivate drawNodeBackground = (node: JSONCanvasNode) => {\n\t\tconst colors = this.SM.getColor(node.color);\n\t\tconst radius = NODE_RADIUS;\n\t\tthis.ctx.globalAlpha = 1.0;\n\t\tthis.ctx.fillStyle = colors.background;\n\t\tutilities.drawRoundRect(\n\t\t\tthis.ctx,\n\t\t\tnode.x + NODE_BORDER_HALF_WIDTH,\n\t\t\tnode.y + NODE_BORDER_HALF_WIDTH,\n\t\t\tnode.width - NODE_BORDER_WIDTH,\n\t\t\tnode.height - NODE_BORDER_WIDTH,\n\t\t\tradius,\n\t\t);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = NODE_BORDER_WIDTH;\n\t\tutilities.drawRoundRect(this.ctx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawGroup = (node: JSONCanvasGroupNode, scale: number) => {\n\t\tthis.drawNodeBackground(node);\n\t\tif (node.label) {\n\t\t\tconst color = this.SM.getColor(node.color);\n\t\t\tthis.drawLabelBar(node.x, node.y, node.label, color.active, color.text, scale);\n\t\t}\n\t};\n\n\tprivate drawFile = (item: NodeItem) => {\n\t\tthis.ctx.fillStyle = this.SM.getColor().text;\n\t\tconst node = item.ref;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(item.fileName || '', node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (item: EdgeItem) => {\n\t\tconst edge = item.ref;\n\t\tconst fromNode = this.DM.data.nodeMap[edge.fromNode].ref;\n\t\tconst toNode = this.DM.data.nodeMap[edge.toNode].ref;\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst { x: startX, y: startY } = gac(fromNode, edge.fromSide);\n\t\tconst { x: endX, y: endY } = gac(toNode, edge.toSide);\n\t\tconst color = this.SM.getColor(edge.color);\n\t\tlet [startControlX, startControlY, endControlX, endControlY] = [0, 0, 0, 0];\n\t\tif (!item.controlPoints) {\n\t\t\t[startControlX, startControlY, endControlX, endControlY] = this.getControlPoints(\n\t\t\t\tstartX,\n\t\t\t\tstartY,\n\t\t\t\tendX,\n\t\t\t\tendY,\n\t\t\t\tedge.fromSide,\n\t\t\t\tedge.toSide,\n\t\t\t);\n\t\t\titem.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = item.controlPoints;\n\t\tthis.drawCurvedPath(\n\t\t\tstartX,\n\t\t\tstartY,\n\t\t\tendX,\n\t\t\tendY,\n\t\t\tstartControlX,\n\t\t\tstartControlY,\n\t\t\tendControlX,\n\t\t\tendControlY,\n\t\t\tcolor.active,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY, color.active);\n\t\tif (edge.label) {\n\t\t\tconst t = 0.5;\n\t\t\tconst x =\n\t\t\t\t(1 - t) ** 3 * startX +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlX +\n\t\t\t\t3 * (1 - t) * t * t * endControlX +\n\t\t\t\tt ** 3 * endX;\n\t\t\tconst y =\n\t\t\t\t(1 - t) ** 3 * startY +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlY +\n\t\t\t\t3 * (1 - t) * t * t * endControlY +\n\t\t\t\tt ** 3 * endY;\n\t\t\tthis.ctx.font = '18px sans-serif';\n\t\t\tconst metrics = this.ctx.measureText(edge.label);\n\t\t\tconst padding = 8;\n\t\t\tconst labelWidth = metrics.width + padding * 2;\n\t\t\tconst labelHeight = 20;\n\t\t\tthis.ctx.fillStyle = color.active;\n\t\t\tthis.ctx.beginPath();\n\t\t\tutilities.drawRoundRect(\n\t\t\t\tthis.ctx,\n\t\t\t\tx - labelWidth / 2,\n\t\t\t\ty - labelHeight / 2 - 2,\n\t\t\t\tlabelWidth,\n\t\t\t\tlabelHeight,\n\t\t\t\t4,\n\t\t\t);\n\t\t\tthis.ctx.fill();\n\t\t\tthis.ctx.fillStyle = color.text;\n\t\t\tthis.ctx.textAlign = 'center';\n\t\t\tthis.ctx.textBaseline = 'middle';\n\t\t\tthis.ctx.fillText(edge.label, x, y - 2);\n\t\t\tthis.ctx.textAlign = 'left';\n\t\t\tthis.ctx.textBaseline = 'alphabetic';\n\t\t}\n\t};\n\n\tprivate getControlPoints = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tfromSide: string,\n\t\ttoSide: string,\n\t) => {\n\t\tconst distanceX = endX - startX;\n\t\tconst distanceY = endY - startY;\n\t\tconst realDistance =\n\t\t\tMath.min(Math.abs(distanceX), Math.abs(distanceY)) +\n\t\t\t0.3 * Math.max(Math.abs(distanceX), Math.abs(distanceY));\n\t\tconst clamp = (val: number, min: number, max: number) => Math.max(min, Math.min(max, val));\n\t\tconst PADDING = clamp(realDistance * 0.5, 60, 300);\n\t\tlet startControlX = startX;\n\t\tlet startControlY = startY;\n\t\tlet endControlX = endX;\n\t\tlet endControlY = endY;\n\t\tswitch (fromSide) {\n\t\t\tcase 'top':\n\t\t\t\tstartControlY = startY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tstartControlY = startY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tstartControlX = startX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstartControlX = startX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\tswitch (toSide) {\n\t\t\tcase 'top':\n\t\t\t\tendControlY = endY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tendControlY = endY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tendControlX = endX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tendControlX = endX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn [startControlX, startControlY, endControlX, endControlY];\n\t};\n\n\tprivate drawGridDots = (scale: number, offsetX: number, offsetY: number) => {\n\t\tconst scaleLevel = -Math.floor(Math.log2(scale));\n\t\tconst actualGap = DOT_BASE_GAP * 2 ** scaleLevel * scale;\n\t\tconst width = this.canvas.width;\n\t\tconst height = this.canvas.height;\n\t\tconst startX = offsetX % actualGap;\n\t\tconst startY = offsetY % actualGap;\n\t\tthis.ctx.fillStyle = this.SM.getNamedColor('dots');\n\t\tfor (let x = startX; x <= width; x += actualGap) {\n\t\t\tfor (let y = startY; y <= height; y += actualGap) {\n\t\t\t\tthis.ctx.beginPath();\n\t\t\t\tthis.ctx.arc(x, y, DOT_RADIUS, 0, 2 * Math.PI);\n\t\t\t\tthis.ctx.fill();\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate drawCurvedPath = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tc1x: number,\n\t\tc1y: number,\n\t\tc2x: number,\n\t\tc2y: number,\n\t\tcolor: string,\n\t) => {\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(startX, startY);\n\t\tthis.ctx.bezierCurveTo(c1x, c1y, c2x, c2y, endX, endY);\n\t\tthis.ctx.strokeStyle = color;\n\t\tthis.ctx.lineWidth = 2;\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawArrowhead = (\n\t\ttipX: number,\n\t\ttipY: number,\n\t\tfromX: number,\n\t\tfromY: number,\n\t\tcolor: string,\n\t) => {\n\t\tconst dx = tipX - fromX;\n\t\tconst dy = tipY - fromY;\n\t\tconst length = Math.sqrt(dx * dx + dy * dy);\n\t\tif (length === 0) return;\n\t\tconst unitX = dx / length;\n\t\tconst unitY = dy / length;\n\t\tconst leftX = tipX - unitX * ARROW_LENGTH - unitY * ARROW_WIDTH;\n\t\tconst leftY = tipY - unitY * ARROW_LENGTH + unitX * ARROW_WIDTH;\n\t\tconst rightX = tipX - unitX * ARROW_LENGTH + unitY * ARROW_WIDTH;\n\t\tconst rightY = tipY - unitY * ARROW_LENGTH - unitX * ARROW_WIDTH;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.moveTo(tipX, tipY);\n\t\tthis.ctx.lineTo(leftX, leftY);\n\t\tthis.ctx.lineTo(rightX, rightY);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t};\n\n\tprivate dispose = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tthis.canvas.remove();\n\t\tthis._canvas = null;\n\t};\n}\n"],"names":["OverlayManager","BaseModule","_overlaysLayer","document","createElement","overlays","selectedId","eventListeners","DM","SM","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","StyleManager","Controller","onRefresh","subscribe","updateOverlays","onChangeTheme","themeChanged","className","id","data","appendChild","onStart","start","onRestart","restart","onDispose","dispose","InteractionHandler","onClick","select","renderOverlays","clearOverlays","createOverlay","async","node","type","text","file","match","loadMarkdownForNode","url","Object","values","nodeMap","forEach","ref","overlay","color","getColor","setOverlayColor","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","updateOverlay","content","style","transform","offsetX","offsetY","scale","element","constructOverlay","left","x","top","y","width","height","toUpdate","getElementsByClassName","innerHTML","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","onEnd","addEventListener","entries","key","value","setProperty","removeEventListener","pointeract","stopInteraction","startInteraction","assign","coordinateOutput","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","stop","OM","on","onPan","onZoom","onTrueClick","event","pan","detail","zoom","factor","e","target","isUIControl","findNodeId","closest","ele","parentElement","off","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","currentViewport","getCurrentViewport","zoomInOptimization","trueRedraw","clearTimeout","now","Date","isInside","setTimeout","fakeRedraw","clearRect","save","drawGridDots","translate","item","isOutside","box","drawFile","drawGroup","edgeMap","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","textColor","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","background","drawRoundRect","NODE_BORDER_WIDTH","strokeStyle","border","lineWidth","stroke","active","fileName","edge","fromNode","toNode","gac","getAnchorCoord","startX","startY","fromSide","endX","endY","toSide","startControlX","startControlY","endControlX","endControlY","controlPoints","getControlPoints","drawCurvedPath","drawArrowhead","t","padding","labelWidth","labelHeight","textAlign","textBaseline","distanceX","distanceY","realDistance","Math","min","abs","max","PADDING","val","actualGap","floor","log2","getNamedColor","arc","PI","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","length","sqrt","unitX","unitY","leftX","leftY","rightX","rightY"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const t=require("./controller-Bc-S4ZVK.cjs"),e=require("pointeract");class i extends t.BaseModule{_overlaysLayer=document.createElement("div");overlays={};selectedId=null;eventListeners={};DM;SM;parse;get overlaysLayer(){if(!this._overlaysLayer)throw t.destroyError;return this._overlaysLayer}hooks={onInteractionStart:t.utilities.makeHook(),onInteractionEnd:t.utilities.makeHook()};constructor(...e){super(...e),this.parse=this.options.markdownParser||(t=>t),this.DM=this.container.get(t.DataManager),this.SM=this.container.get(t.StyleManager);this.container.get(t.Controller).hooks.onRefresh.subscribe(this.updateOverlays),this.SM.onChangeTheme.subscribe(this.themeChanged),this._overlaysLayer=document.createElement("div"),this._overlaysLayer.className="overlays",this._overlaysLayer.id="overlays",this.DM.data.container.appendChild(this.overlaysLayer),this.onStart(this.start),this.onRestart(this.restart),this.onDispose(this.dispose)}start=()=>{this.container.get(s).onClick.subscribe(this.select),this.renderOverlays()};restart=()=>{this.clearOverlays(),this.renderOverlays()};renderOverlays=()=>{const t=async t=>{switch(t.type){case"text":await this.createOverlay(t,t.text,"text");break;case"file":t.file.match(/\.md$/i)?await this.loadMarkdownForNode(t):t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?await this.createOverlay(t,t.file,"image"):t.file.match(/\.(mp3|wav)$/i)&&await this.createOverlay(t,t.file,"audio");break;case"link":await this.createOverlay(t,t.url,"link")}};Object.values(this.DM.data.nodeMap).forEach(async e=>{await t(e.ref)})};themeChanged=()=>{Object.values(this.overlays).forEach(t=>{const e=this.DM.data.nodeMap[t.id].ref,i=this.SM.getColor(e.color);this.setOverlayColor(t,i)})};select=t=>{const e=this.selectedId?this.overlays[this.selectedId]:null,i=t?this.overlays[t]:null;e&&e.classList.remove("active"),i?(i.classList.add("active"),this.hooks.onInteractionStart()):this.hooks.onInteractionEnd(),this.selectedId=t};loadMarkdownForNode=async t=>{let e;await this.createOverlay(t,"Loading...","text");try{const i=await fetch(t.file),s=await i.text(),a=s.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);e=a?await this.parse(a[2]):await this.parse(s)}catch(i){console.error("[JSONCanvasViewer] Failed to load markdown:",i),e="Failed to load content."}this.updateOverlay(t,{content:e})};updateOverlays=()=>{const t=this.DM.data;this.overlaysLayer.style.transform=`translate(${t.offsetX}px, ${t.offsetY}px) scale(${t.scale})`};async createOverlay(t,e,i){let s=this.overlays[t.id];s||(s=await this.constructOverlay(t,e,i),this.overlaysLayer.appendChild(s),this.overlays[t.id]=s,s.style.left=`${t.x}px`,s.style.top=`${t.y}px`,s.style.width=`${t.width}px`,s.style.height=`${t.height}px`)}updateOverlay(t,e){const i=this.overlays[t.id];if(e.content){const t=i.getElementsByClassName("parsed-content-wrapper")[0];t&&(t.innerHTML=e.content)}e.color&&this.setOverlayColor(i,e.color)}async constructOverlay(t,e,i){const s=document.createElement("div");switch(s.classList.add("overlay-container"),s.id=t.id,this.setOverlayColor(s,this.SM.getColor(t.color)),i){case"text":{s.classList.add("markdown-content");const t=document.createElement("div");t.innerHTML=await this.parse(e||""),t.classList.add("parsed-content-wrapper"),s.appendChild(t);break}case"link":{const t=document.createElement("iframe");t.src=e,t.sandbox="allow-scripts allow-same-origin",t.className="link-iframe",t.loading="lazy",s.appendChild(t);break}case"audio":{const t=document.createElement("audio");t.className="audio",t.src=e,t.controls=!0,s.appendChild(t);break}case"image":{const t=document.createElement("img");t.src=e,t.loading="lazy",s.appendChild(t)}}switch(i){case"link":case"audio":{const t=document.createElement("div");t.className="click-layer",s.appendChild(t)}}const a=document.createElement("div");a.className="overlay-border",s.appendChild(a);const o=()=>{t.id===this.selectedId&&this.hooks.onInteractionStart()},r=()=>{t.id===this.selectedId&&this.hooks.onInteractionEnd()};return s.addEventListener("pointerenter",o),s.addEventListener("pointerleave",r),s.addEventListener("touchstart",o),s.addEventListener("touchend",r),this.eventListeners[t.id]=[o,r],s}setOverlayColor=(t,e)=>{Object.entries(e).forEach(([e,i])=>{t.style.setProperty(`--overlay-${e}`,i)})};clearOverlays=()=>{Object.entries(this.overlays).forEach(([e,i])=>{if(this.eventListeners[e]){const s=this.eventListeners[e][0],a=this.eventListeners[e][1];if(!s||!a)throw t.destroyError;i.removeEventListener("pointerenter",s),i.removeEventListener("pointerleave",a),i.removeEventListener("touchstart",s),i.removeEventListener("touchend",a),this.eventListeners[e][0]=null,this.eventListeners[e][1]=null}i.remove(),delete this.overlays[e]})};dispose=()=>{this.clearOverlays(),this.overlaysLayer.remove(),this._overlaysLayer=null}}class s extends t.BaseModule{pointeract;DM;onClick=t.utilities.makeHook();stopInteraction;startInteraction;constructor(...s){super(...s),this.DM=this.container.get(t.DataManager);const a=Object.assign(this.options.pointeract||{},{coordinateOutput:"relative"});this.pointeract=new e.Pointeract(this.DM.data.container,[e.Click,e.Drag,e.WheelPanZoom,e.PreventDefault,e.MultitouchPanZoom],a),this.startInteraction=this.pointeract.start,this.stopInteraction=this.pointeract.stop;const o=this.container.get(i);o.hooks.onInteractionStart.subscribe(this.stopInteraction),o.hooks.onInteractionEnd.subscribe(this.startInteraction),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.pointeract.on("pan",this.onPan),this.pointeract.on("drag",this.onPan),this.pointeract.on("zoom",this.onZoom),this.pointeract.on("trueClick",this.onTrueClick),this.pointeract.start()};onPan=t=>{this.DM.pan(t.detail)};onZoom=t=>{const e=t.detail;this.DM.zoom(e.factor,{x:e.x,y:e.y})};onTrueClick=t=>{const e=t.detail.target;if(this.isUIControl(e))return;const i=this.findNodeId(e);this.onClick(i)};isUIControl=t=>!!t&&(t.closest(".controls")||t.closest("button")||t.closest("input"));findNodeId=t=>{if(!t)return null;let e=t;for(;(!e.id||""===e.id)&&e.parentElement;)e=e.parentElement;return"overlays"!==e.id&&e.id&&""!==e.id?e.id:null};dispose=()=>{this.pointeract.off("pan",this.onPan),this.pointeract.off("zoom",this.onZoom),this.pointeract.off("trueClick",this.onTrueClick),this.pointeract.dispose()}}class a extends t.BaseModule{_canvas;ctx;DM;SM;zoomInOptimize={lastDrawnScale:0,lastDrawnViewport:{left:0,right:0,top:0,bottom:0},timeout:null,lastCallTime:0};get canvas(){if(null===this._canvas)throw t.destroyError;return this._canvas}constructor(...e){super(...e);const i=this.container.get(t.Controller);this.SM=this.container.get(t.StyleManager),i.hooks.onRefresh.subscribe(this.redraw),i.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(t.DataManager),this._canvas=document.createElement("canvas"),this._canvas.className="main-canvas",this.ctx=this._canvas.getContext("2d"),this.DM.data.container.appendChild(this._canvas),this.onDispose(this.dispose)}optimizeDPR=()=>{const e=this.DM.data.container;t.utilities.resizeCanvasForDPR(this.canvas,e.offsetWidth,e.offsetHeight)};redraw=()=>{const t=this.DM.data.offsetX,e=this.DM.data.offsetY,i=this.DM.data.scale,s=this.getCurrentViewport(t,e,i);if(!this.options.zoomInOptimization)return void this.trueRedraw(t,e,i,s);this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null);const a=Date.now();if(this.isInside(s,this.zoomInOptimize.lastDrawnViewport)&&i!==this.zoomInOptimize.lastDrawnScale){if(a-this.zoomInOptimize.lastCallTime<500)return this.zoomInOptimize.timeout=setTimeout(()=>{this.trueRedraw(t,e,i,s),this.zoomInOptimize.lastCallTime=a,this.zoomInOptimize.timeout=null},60),void this.fakeRedraw(s,i)}this.zoomInOptimize.lastCallTime=a,this.trueRedraw(t,e,i,s)};trueRedraw(t,e,i,s){this.zoomInOptimize.lastDrawnViewport=s,this.zoomInOptimize.lastDrawnScale=i,this.canvas.style.transform="",this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.drawGridDots(i,t,e),this.ctx.translate(t,e),this.ctx.scale(i,i),Object.values(this.DM.data.nodeMap).forEach(t=>{if(this.isOutside(t.box,s))return;const e=t.ref;"file"===e.type?this.drawFile(t):"group"===e.type&&this.drawGroup(e,i)}),Object.values(this.DM.data.edgeMap).forEach(t=>{this.isOutside(t.box,s)||this.drawEdge(t)}),this.ctx.restore()}fakeRedraw(t,e){const i=e/this.zoomInOptimize.lastDrawnScale,s=(this.zoomInOptimize.lastDrawnViewport.left-t.left)*e,a=(this.zoomInOptimize.lastDrawnViewport.top-t.top)*e;this.canvas.style.transform=`translate(${s}px, ${a}px) scale(${i})`}isInside=(t,e)=>t.left>e.left&&t.top>e.top&&t.right<e.right&&t.bottom<e.bottom;isOutside=(t,e)=>t.right<e.left||t.bottom<e.top||t.left>e.right||t.top>e.bottom;getCurrentViewport=(t,e,i)=>{const s=-t/i,a=-e/i,o=this.DM.data.container;return{left:s,top:a,right:s+o.clientWidth/i,bottom:a+o.clientHeight/i}};drawLabelBar=(t,e,i,s,a,o)=>{const r=30*o,n=6*o,c=8*o,l=16*o,h=6*o;this.ctx.save(),this.ctx.translate(t,e),this.ctx.scale(1/o,1/o),this.ctx.font=`${l}px 'Inter', sans-serif`;const d=this.ctx.measureText(i).width+2*h;this.ctx.translate(0,-r-c),this.ctx.fillStyle=s,this.ctx.beginPath(),this.ctx.moveTo(n,0),this.ctx.lineTo(d-n,0),this.ctx.quadraticCurveTo(d,0,d,n),this.ctx.lineTo(d,r-n),this.ctx.quadraticCurveTo(d,r,d-n,r),this.ctx.lineTo(n,r),this.ctx.quadraticCurveTo(0,r,0,r-n),this.ctx.lineTo(0,n),this.ctx.quadraticCurveTo(0,0,n,0),this.ctx.closePath(),this.ctx.fill(),this.ctx.fillStyle=a,this.ctx.fillText(i,h,.65*r),this.ctx.restore()};drawNodeBackground=e=>{const i=this.SM.getColor(e.color);this.ctx.globalAlpha=1,this.ctx.fillStyle=i.background,t.utilities.drawRoundRect(this.ctx,e.x+.5,e.y+.5,e.width-1,e.height-1,12),this.ctx.fill(),this.ctx.strokeStyle=i.border,this.ctx.lineWidth=1,t.utilities.drawRoundRect(this.ctx,e.x,e.y,e.width,e.height,12),this.ctx.stroke()};drawGroup=(t,e)=>{if(this.drawNodeBackground(t),t.label){const i=this.SM.getColor(t.color);this.drawLabelBar(t.x,t.y,t.label,i.active,i.text,e)}};drawFile=t=>{this.ctx.fillStyle=this.SM.getColor().text;const e=t.ref;this.ctx.font="16px sans-serif",this.ctx.fillText(t.fileName||"",e.x+5,e.y-10)};drawEdge=e=>{const i=e.ref,s=this.DM.data.nodeMap[i.fromNode].ref,a=this.DM.data.nodeMap[i.toNode].ref,o=t.utilities.getAnchorCoord,{x:r,y:n}=o(s,i.fromSide),{x:c,y:l}=o(a,i.toSide),h=this.SM.getColor(i.color);let[d,p,m,u]=[0,0,0,0];if(e.controlPoints?[d,p,m,u]=e.controlPoints:([d,p,m,u]=this.getControlPoints(r,n,c,l,i.fromSide,i.toSide),e.controlPoints=[d,p,m,u]),this.drawCurvedPath(r,n,c,l,d,p,m,u,h.active),this.drawArrowhead(c,l,m,u,h.active),i.label){const e=.5,s=(1-e)**3*r+3*(1-e)**2*e*d+3*(1-e)*e*e*m+e**3*c,a=(1-e)**3*n+3*(1-e)**2*e*p+3*(1-e)*e*e*u+e**3*l;this.ctx.font="18px sans-serif";const o=8,v=this.ctx.measureText(i.label).width+2*o,x=20;this.ctx.fillStyle=h.active,this.ctx.beginPath(),t.utilities.drawRoundRect(this.ctx,s-v/2,a-x/2-2,v,x,4),this.ctx.fill(),this.ctx.fillStyle=h.text,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(i.label,s,a-2),this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic"}};getControlPoints=(t,e,i,s,a,o)=>{const r=i-t,n=s-e,c=Math.min(Math.abs(r),Math.abs(n))+.3*Math.max(Math.abs(r),Math.abs(n)),l=(h=.5*c,d=60,p=300,Math.max(d,Math.min(p,h)));var h,d,p;let m=t,u=e,v=i,x=s;switch(a){case"top":u=e-l;break;case"bottom":u=e+l;break;case"left":m=t-l;break;case"right":m=t+l}switch(o){case"top":x=s-l;break;case"bottom":x=s+l;break;case"left":v=i-l;break;case"right":v=i+l}return[m,u,v,x]};drawGridDots=(t,e,i)=>{const s=10*2**-Math.floor(Math.log2(t))*t,a=this.canvas.width,o=this.canvas.height,r=e%s,n=i%s;this.ctx.fillStyle=this.SM.getNamedColor("dots");for(let c=r;c<=a;c+=s)for(let t=n;t<=o;t+=s)this.ctx.beginPath(),this.ctx.arc(c,t,1,0,2*Math.PI),this.ctx.fill()};drawCurvedPath=(t,e,i,s,a,o,r,n,c)=>{this.ctx.beginPath(),this.ctx.moveTo(t,e),this.ctx.bezierCurveTo(a,o,r,n,i,s),this.ctx.strokeStyle=c,this.ctx.lineWidth=2,this.ctx.stroke()};drawArrowhead=(t,e,i,s,a)=>{const o=t-i,r=e-s,n=Math.sqrt(o*o+r*r);if(0===n)return;const c=o/n,l=r/n,h=t-12*c-4*l,d=e-12*l+4*c,p=t-12*c+4*l,m=e-12*l-4*c;this.ctx.beginPath(),this.ctx.fillStyle=a,this.ctx.moveTo(t,e),this.ctx.lineTo(h,d),this.ctx.lineTo(p,m),this.ctx.closePath(),this.ctx.fill()};dispose=()=>{this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null),this.canvas.remove(),this._canvas=null}}exports.InteractionHandler=s,exports.OverlayManager=i,exports.Renderer=a;
|
|
2
|
+
//# sourceMappingURL=renderer-BEKV7hr3.cjs.map
|