json-canvas-viewer 3.3.0 → 3.3.1
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 +5 -5
- 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-CnUlrkdp.cjs +2 -0
- package/dist/controller-CnUlrkdp.cjs.map +1 -0
- package/dist/controller-UN-hOZ_r.js +2 -0
- package/dist/controller-UN-hOZ_r.js.map +1 -0
- package/dist/dev.cjs +1 -1
- package/dist/dev.js +1 -1
- package/dist/{index-BSkMdAcV.cjs → index-RXeXyAu0.cjs} +2 -2
- package/dist/{index-BSkMdAcV.cjs.map → index-RXeXyAu0.cjs.map} +1 -1
- package/dist/{index-u8PUIMyl.js → index-ujiv9m9Y.js} +2 -2
- package/dist/{index-u8PUIMyl.js.map → index-ujiv9m9Y.js.map} +1 -1
- 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/renderer-Bzv3aLXp.cjs +2 -0
- package/dist/renderer-Bzv3aLXp.cjs.map +1 -0
- package/dist/renderer-NPxavnke.js +2 -0
- package/dist/renderer-NPxavnke.js.map +1 -0
- package/dist/types/bridges/reactComponent.d.ts +9 -0
- package/dist/types/bridges/vueComponent.vue.d.ts +1 -1
- package/dist/types/bridges.d.ts +1 -0
- package/dist/types/core/dataManager.d.ts +13 -1
- package/dist/types/core/declarations.d.ts +0 -10
- package/dist/types/core/renderer.d.ts +1 -2
- package/package.json +4 -2
- package/dist/controller--Q72jFEw.cjs +0 -2
- package/dist/controller--Q72jFEw.cjs.map +0 -1
- package/dist/controller-siZ5v-SD.js +0 -2
- package/dist/controller-siZ5v-SD.js.map +0 -1
- package/dist/renderer-CZ85ZN6O.js +0 -2
- package/dist/renderer-CZ85ZN6O.js.map +0 -1
- package/dist/renderer-D9iInH9_.cjs +0 -2
- package/dist/renderer-D9iInH9_.cjs.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-siZ5v-SD.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.nodeMap,i=e[t.fromNode],n=e[t.toNode];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}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};
|
|
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 nodeMap = this.DM.data.nodeMap;\n\t\tconst fromNode = nodeMap[edge.fromNode];\n\t\tconst toNode = nodeMap[edge.toNode];\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","nodeMap","fromNode","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';\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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const t=require("pointeract"),e=require("./controller-CnUlrkdp.cjs");class i extends e.BaseModule{_overlaysLayer=document.createElement("div");overlays={};selectedId=null;eventListeners={};DM;IH;parse;get overlaysLayer(){if(!this._overlaysLayer)throw e.destroyError;return this._overlaysLayer}hooks={onInteractionStart:e.utilities.makeHook(),onInteractionEnd:e.utilities.makeHook()};constructor(...t){super(...t),this.parse=this.options.markdownParser||(t=>t),this.DM=this.container.get(e.DataManager),this.IH=this.container.get(s,{lazy:!0});this.container.get(e.Controller).hooks.onRefresh.subscribe(this.updateOverlays),this._overlaysLayer=document.createElement("div"),this._overlaysLayer.className="overlays",this.DM.data.container.appendChild(this.overlaysLayer),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.IH().onClick.subscribe(this.select);const t=async t=>{switch(t.type){case"text":this.updateOverlay(t,t.text,"text");break;case"file":t.file.match(/\.md$/i)?this.loadMarkdownForNode(t):t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?this.updateOverlay(t,t.file,"image"):t.file.match(/\.(mp3|wav)$/i)&&this.updateOverlay(t,t.file,"audio");break;case"link":this.updateOverlay(t,t.url,"link")}};Object.values(this.DM.data.canvasMap).forEach(e=>{"node"===e.type&&t(e.ref)})};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;this.updateOverlay(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,e,"text")};updateOverlays=()=>{const t=this.DM.data;this.overlaysLayer.style.transform=`translate(${t.offsetX}px, ${t.offsetY}px) scale(${t.scale})`};async updateOverlay(t,e,i){let s=this.overlays[t.id];if(s){if("text"===i){s.getElementsByClassName("parsed-content-wrapper")[0].innerHTML=e}}else 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`}async constructOverlay(t,i,s){const a=e.utilities.getColor(t.color),o=document.createElement("div");switch(o.classList.add("overlay-container"),o.id=t.id,o.style.backgroundColor=a.background,o.style.setProperty("--active-color",a.active),s){case"text":{o.classList.add("markdown-content");const t=document.createElement("div");t.innerHTML=await this.parse(i||""),t.classList.add("parsed-content-wrapper"),o.appendChild(t);break}case"link":{const t=document.createElement("iframe");t.src=i,t.sandbox="allow-scripts allow-same-origin",t.className="link-iframe",t.loading="lazy",o.appendChild(t);break}case"audio":{const t=document.createElement("audio");t.className="audio",t.src=i,t.controls=!0,o.appendChild(t);break}case"image":{const t=document.createElement("img");t.src=i,t.loading="lazy",o.appendChild(t)}}switch(s){case"link":case"audio":{const t=document.createElement("div");t.className="click-layer",o.appendChild(t)}}const r=document.createElement("div");r.className="overlay-border",r.style.borderColor=a.border,o.appendChild(r);const n=()=>{t.id===this.selectedId&&this.hooks.onInteractionStart()},c=()=>{t.id===this.selectedId&&this.hooks.onInteractionEnd()};return o.addEventListener("pointerenter",n),o.addEventListener("pointerleave",c),o.addEventListener("touchstart",n),o.addEventListener("touchend",c),this.eventListeners[t.id]=[n,c],o}dispose=()=>{for(;this.overlaysLayer.firstElementChild;){const t=this.overlaysLayer.firstElementChild;if(this.eventListeners[t.id]){const i=this.eventListeners[t.id][0],s=this.eventListeners[t.id][1];if(!i||!s)throw e.destroyError;t.removeEventListener("pointerenter",i),t.removeEventListener("pointerleave",s),t.removeEventListener("touchstart",i),t.removeEventListener("touchend",s),this.eventListeners[t.id][0]=null,this.eventListeners[t.id][1]=null}t.remove()}this.overlaysLayer.remove(),this._overlaysLayer=null}}class s extends e.BaseModule{pointeract;DM;onClick=e.utilities.makeHook();stopInteraction;startInteraction;constructor(...s){super(...s),this.DM=this.container.get(e.DataManager);const a=Object.assign(this.options.pointeract||{},{coordinateOutput:"relative"});this.pointeract=new t.Pointeract(this.DM.data.container,[t.Click,t.Drag,t.WheelPanZoom,t.PreventDefault,t.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;if((i=t.detail.target)&&(i.closest(".controls")||i.closest("button")||i.closest("input")))return;var i;const s=this.DM.findNodeAt({x:e.x,y:e.y});this.onClick(s?s.id:null)};dispose=()=>{this.pointeract.off("pan",this.onPan),this.pointeract.off("zoom",this.onZoom),this.pointeract.off("trueClick",this.onTrueClick),this.pointeract.dispose()}}const a="#fff";class o extends e.BaseModule{_canvas;ctx;DM;zoomInOptimize={lastDrawnScale:0,lastDrawnViewport:{left:0,right:0,top:0,bottom:0},timeout:null,lastCallTime:0};get canvas(){if(null===this._canvas)throw e.destroyError;return this._canvas}constructor(...t){super(...t);const i=this.container.get(e.Controller);i.hooks.onRefresh.subscribe(this.redraw),i.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(e.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 t=this.DM.data.container;e.utilities.resizeCanvasForDPR(this.canvas,t.offsetWidth,t.offsetHeight)};redraw=()=>{this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null);const t=Date.now(),e=this.DM.data.offsetX,i=this.DM.data.offsetY,s=this.DM.data.scale,a=this.getCurrentViewport(e,i,s);if(this.isViewportInside(a,this.zoomInOptimize.lastDrawnViewport)&&s!==this.zoomInOptimize.lastDrawnScale){if(t-this.zoomInOptimize.lastCallTime<500)return this.zoomInOptimize.timeout=setTimeout(()=>{this.trueRedraw(e,i,s,a),this.zoomInOptimize.lastCallTime=t,this.zoomInOptimize.timeout=null},60),void this.fakeRedraw(a,s)}this.zoomInOptimize.lastCallTime=t,this.trueRedraw(e,i,s,a)};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.ctx.translate(t,e),this.ctx.scale(i,i),Object.values(this.DM.data.canvasMap).forEach(t=>{if("edge"===t.type)this.drawEdge(t);else{const e=t.ref;"file"===e.type?this.drawFile(t):"group"===e.type&&this.drawGroup(e,i)}}),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})`}isViewportInside=(t,e)=>t.left>e.left&&t.top>e.top&&t.right<e.right&&t.bottom<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,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=t=>{const i=e.utilities.getColor(t.color);this.ctx.globalAlpha=1,this.ctx.fillStyle=i.background,e.utilities.drawRoundRect(this.ctx,t.x+1,t.y+1,t.width-2,t.height-2,12),this.ctx.fill(),this.ctx.strokeStyle=i.border,this.ctx.lineWidth=2,e.utilities.drawRoundRect(this.ctx,t.x,t.y,t.width,t.height,12),this.ctx.stroke()};drawGroup=(t,i)=>{this.drawNodeBackground(t),t.label&&this.drawLabelBar(t.x,t.y,t.label,e.utilities.getColor(t.color).active,i)};drawFile=t=>{this.ctx.fillStyle=a;const e=t.ref;this.ctx.font="16px sans-serif",this.ctx.fillText(t.fileName||"",e.x+5,e.y-10)};drawEdge=t=>{const i=t.ref,s=this.DM.data.canvasMap[i.fromNode].ref,a=this.DM.data.canvasMap[i.toNode].ref,o=e.utilities.getAnchorCoord,[r,n]=o(s,i.fromSide),[c,l]=o(a,i.toSide),{active:h}=e.utilities.getColor(i.color);let[d,p,m,u]=[0,0,0,0];if(t.controlPoints?[d,p,m,u]=t.controlPoints:([d,p,m,u]=this.getControlPoints(r,n,c,l,i.fromSide,i.toSide),t.controlPoints=[d,p,m,u]),this.drawCurvedPath(r,n,c,l,d,p,m,u,h),this.drawArrowhead(c,l,m,u,h),i.label){const t=.5,s=(1-t)**3*r+3*(1-t)**2*t*d+3*(1-t)*t*t*m+t**3*c,a=(1-t)**3*n+3*(1-t)**2*t*p+3*(1-t)*t*t*u+t**3*l;this.ctx.font="18px sans-serif";const o=8,h=this.ctx.measureText(i.label).width+2*o,v=20;this.ctx.fillStyle="#222",this.ctx.beginPath(),e.utilities.drawRoundRect(this.ctx,s-h/2,a-v/2-2,h,v,4),this.ctx.fill(),this.ctx.fillStyle="#ccc",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]};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-7*l,d=e-12*l+7*c,p=t-12*c+7*l,m=e-12*l-7*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=o;
|
|
2
|
+
//# sourceMappingURL=renderer-Bzv3aLXp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-Bzv3aLXp.cjs","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 InteractionHandler from '$/interactionHandler';\nimport utilities, { destroyError } from '$/utilities';\nimport type { MarkdownParser } from './declarations';\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 IH: () => InteractionHandler;\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.IH = this.container.get(InteractionHandler, { lazy: true });\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tthis.updateOverlay(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)) 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\tthis.updateOverlay(node, node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i)) this.updateOverlay(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\tthis.updateOverlay(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.canvasMap).forEach(node => {\n\t\t\tif (node.type === 'node') createOverlay(node.ref);\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\tthis.updateOverlay(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, parsedContent, 'text');\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 updateOverlay(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} else if (type === 'text') {\n\t\t\tconst parsedContentContainer = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tparsedContentContainer.innerHTML = content;\n\t\t}\n\t}\n\n\tprivate async constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst color = utilities.getColor(node.color);\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\toverlay.style.backgroundColor = color.background;\n\t\toverlay.style.setProperty('--active-color', color.active);\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\toverlayBorder.style.borderColor = color.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 dispose = () => {\n\t\twhile (this.overlaysLayer.firstElementChild) {\n\t\t\tconst child = this.overlaysLayer.firstElementChild;\n\t\t\tif (this.eventListeners[child.id]) {\n\t\t\t\tconst onStart = this.eventListeners[child.id][0];\n\t\t\t\tconst onEnd = this.eventListeners[child.id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\tchild.removeEventListener('pointerenter', onStart);\n\t\t\t\tchild.removeEventListener('pointerleave', onEnd);\n\t\t\t\tchild.removeEventListener('touchstart', onStart);\n\t\t\t\tchild.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[child.id][0] = null;\n\t\t\t\tthis.eventListeners[child.id][1] = null;\n\t\t\t}\n\t\t\tchild.remove();\n\t\t}\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import {\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';\nimport { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport OverlayManager from '$/overlayManager';\nimport utilities from '$/utilities';\n\ntype Options = {\n\tpointeract?: PointeractOptions<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\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 detail = e.detail;\n\t\tfunction isUIControl(target: HTMLElement | null) {\n\t\t\tif (!target) return false;\n\t\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t\t}\n\t\tif (isUIControl(e.detail.target as HTMLElement | null)) return;\n\t\tconst node = this.DM.findNodeAt({ x: detail.x, y: detail.y });\n\t\tthis.onClick(node ? node.id : null);\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 MapEdgeItem, type MapNodeItem } from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 7;\nconst NODE_RADIUS = 12;\nconst FONT_COLOR = '#fff';\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\n\nexport default class Renderer extends BaseModule {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: viewport;\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\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\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\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 (\n\t\t\tthis.isViewportInside(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: viewport) {\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.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tObject.values(this.DM.data.canvasMap).forEach(item => {\n\t\t\tif (item.type === 'edge') this.drawEdge(item);\n\t\t\telse {\n\t\t\t\tconst node = item.ref;\n\t\t\t\tif (node.type === 'file') this.drawFile(item);\n\t\t\t\telse if (node.type === 'group') this.drawGroup(node, scale);\n\t\t\t}\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: viewport, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX = (this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY = (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 isViewportInside = (inner: viewport, outer: viewport) =>\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 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 = (x: number, y: number, label: string, color: string, scale: number) => {\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 = FONT_COLOR;\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 = utilities.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(this.ctx, node.x + 1, node.y + 1, node.width - 2, node.height - 2, radius);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = 2;\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\tthis.drawLabelBar(node.x, node.y, node.label, utilities.getColor(node.color).active, scale);\n\t};\n\n\tprivate drawFile = (item: MapNodeItem) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\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: MapEdgeItem) => {\n\t\tconst edge = item.ref;\n\t\tconst fromNode = this.DM.data.canvasMap[edge.fromNode].ref as JSONCanvasNode;\n\t\tconst toNode = this.DM.data.canvasMap[edge.toNode].ref as JSONCanvasNode;\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst [startX, startY] = gac(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = gac(toNode, edge.toSide);\n\t\tconst { active } = utilities.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\tactive,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY, 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 = '#222';\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 = '#ccc';\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 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 = (tipX: number, tipY: number, fromX: number, fromY: number, color: string) => {\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","IH","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","InteractionHandler","lazy","Controller","onRefresh","subscribe","updateOverlays","className","data","appendChild","onStart","start","onDispose","dispose","onClick","select","createOverlay","async","node","type","updateOverlay","text","file","match","loadMarkdownForNode","url","Object","values","canvasMap","forEach","ref","id","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","style","transform","offsetX","offsetY","scale","content","element","getElementsByClassName","innerHTML","constructOverlay","left","x","top","y","width","height","color","getColor","overlay","backgroundColor","background","setProperty","active","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","border","onEnd","addEventListener","firstElementChild","child","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","closest","findNodeAt","off","FONT_COLOR","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","item","drawEdge","drawFile","drawGroup","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","drawRoundRect","strokeStyle","lineWidth","stroke","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","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
|
+
import{Pointeract as t,Click as e,Drag as s,WheelPanZoom as i,PreventDefault as a,MultitouchPanZoom as o}from"pointeract";import{B as n,d as r,u as c,D as l,C as h}from"./controller-UN-hOZ_r.js";class d extends n{_overlaysLayer=document.createElement("div");overlays={};selectedId=null;eventListeners={};DM;IH;parse;get overlaysLayer(){if(!this._overlaysLayer)throw r;return this._overlaysLayer}hooks={onInteractionStart:c.makeHook(),onInteractionEnd:c.makeHook()};constructor(...t){super(...t),this.parse=this.options.markdownParser||(t=>t),this.DM=this.container.get(l),this.IH=this.container.get(p,{lazy:!0});this.container.get(h).hooks.onRefresh.subscribe(this.updateOverlays),this._overlaysLayer=document.createElement("div"),this._overlaysLayer.className="overlays",this.DM.data.container.appendChild(this.overlaysLayer),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.IH().onClick.subscribe(this.select);const t=async t=>{switch(t.type){case"text":this.updateOverlay(t,t.text,"text");break;case"file":t.file.match(/\.md$/i)?this.loadMarkdownForNode(t):t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?this.updateOverlay(t,t.file,"image"):t.file.match(/\.(mp3|wav)$/i)&&this.updateOverlay(t,t.file,"audio");break;case"link":this.updateOverlay(t,t.url,"link")}};Object.values(this.DM.data.canvasMap).forEach(e=>{"node"===e.type&&t(e.ref)})};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;this.updateOverlay(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,e,"text")};updateOverlays=()=>{const t=this.DM.data;this.overlaysLayer.style.transform=`translate(${t.offsetX}px, ${t.offsetY}px) scale(${t.scale})`};async updateOverlay(t,e,s){let i=this.overlays[t.id];if(i){if("text"===s){i.getElementsByClassName("parsed-content-wrapper")[0].innerHTML=e}}else 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`}async constructOverlay(t,e,s){const i=c.getColor(t.color),a=document.createElement("div");switch(a.classList.add("overlay-container"),a.id=t.id,a.style.backgroundColor=i.background,a.style.setProperty("--active-color",i.active),s){case"text":{a.classList.add("markdown-content");const t=document.createElement("div");t.innerHTML=await this.parse(e||""),t.classList.add("parsed-content-wrapper"),a.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",a.appendChild(t);break}case"audio":{const t=document.createElement("audio");t.className="audio",t.src=e,t.controls=!0,a.appendChild(t);break}case"image":{const t=document.createElement("img");t.src=e,t.loading="lazy",a.appendChild(t)}}switch(s){case"link":case"audio":{const t=document.createElement("div");t.className="click-layer",a.appendChild(t)}}const o=document.createElement("div");o.className="overlay-border",o.style.borderColor=i.border,a.appendChild(o);const n=()=>{t.id===this.selectedId&&this.hooks.onInteractionStart()},r=()=>{t.id===this.selectedId&&this.hooks.onInteractionEnd()};return a.addEventListener("pointerenter",n),a.addEventListener("pointerleave",r),a.addEventListener("touchstart",n),a.addEventListener("touchend",r),this.eventListeners[t.id]=[n,r],a}dispose=()=>{for(;this.overlaysLayer.firstElementChild;){const t=this.overlaysLayer.firstElementChild;if(this.eventListeners[t.id]){const e=this.eventListeners[t.id][0],s=this.eventListeners[t.id][1];if(!e||!s)throw r;t.removeEventListener("pointerenter",e),t.removeEventListener("pointerleave",s),t.removeEventListener("touchstart",e),t.removeEventListener("touchend",s),this.eventListeners[t.id][0]=null,this.eventListeners[t.id][1]=null}t.remove()}this.overlaysLayer.remove(),this._overlaysLayer=null}}class p extends n{pointeract;DM;onClick=c.makeHook();stopInteraction;startInteraction;constructor(...n){super(...n),this.DM=this.container.get(l);const r=Object.assign(this.options.pointeract||{},{coordinateOutput:"relative"});this.pointeract=new t(this.DM.data.container,[e,s,i,a,o],r),this.startInteraction=this.pointeract.start,this.stopInteraction=this.pointeract.stop;const c=this.container.get(d);c.hooks.onInteractionStart.subscribe(this.stopInteraction),c.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;if((s=t.detail.target)&&(s.closest(".controls")||s.closest("button")||s.closest("input")))return;var s;const i=this.DM.findNodeAt({x:e.x,y:e.y});this.onClick(i?i.id:null)};dispose=()=>{this.pointeract.off("pan",this.onPan),this.pointeract.off("zoom",this.onZoom),this.pointeract.off("trueClick",this.onTrueClick),this.pointeract.dispose()}}const m="#fff";class u extends n{_canvas;ctx;DM;zoomInOptimize={lastDrawnScale:0,lastDrawnViewport:{left:0,right:0,top:0,bottom:0},timeout:null,lastCallTime:0};get canvas(){if(null===this._canvas)throw r;return this._canvas}constructor(...t){super(...t);const e=this.container.get(h);e.hooks.onRefresh.subscribe(this.redraw),e.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(l),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;c.resizeCanvasForDPR(this.canvas,t.offsetWidth,t.offsetHeight)};redraw=()=>{this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null);const t=Date.now(),e=this.DM.data.offsetX,s=this.DM.data.offsetY,i=this.DM.data.scale,a=this.getCurrentViewport(e,s,i);if(this.isViewportInside(a,this.zoomInOptimize.lastDrawnViewport)&&i!==this.zoomInOptimize.lastDrawnScale){if(t-this.zoomInOptimize.lastCallTime<500)return this.zoomInOptimize.timeout=setTimeout(()=>{this.trueRedraw(e,s,i,a),this.zoomInOptimize.lastCallTime=t,this.zoomInOptimize.timeout=null},60),void this.fakeRedraw(a,i)}this.zoomInOptimize.lastCallTime=t,this.trueRedraw(e,s,i,a)};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.ctx.translate(t,e),this.ctx.scale(s,s),Object.values(this.DM.data.canvasMap).forEach(t=>{if("edge"===t.type)this.drawEdge(t);else{const e=t.ref;"file"===e.type?this.drawFile(t):"group"===e.type&&this.drawGroup(e,s)}}),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})`}isViewportInside=(t,e)=>t.left>e.left&&t.top>e.top&&t.right<e.right&&t.bottom<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)=>{const o=30*a,n=6*a,r=8*a,c=16*a,l=6*a;this.ctx.save(),this.ctx.translate(t,e),this.ctx.scale(1/a,1/a),this.ctx.font=`${c}px 'Inter', sans-serif`;const h=this.ctx.measureText(s).width+2*l;this.ctx.translate(0,-o-r),this.ctx.fillStyle=i,this.ctx.beginPath(),this.ctx.moveTo(n,0),this.ctx.lineTo(h-n,0),this.ctx.quadraticCurveTo(h,0,h,n),this.ctx.lineTo(h,o-n),this.ctx.quadraticCurveTo(h,o,h-n,o),this.ctx.lineTo(n,o),this.ctx.quadraticCurveTo(0,o,0,o-n),this.ctx.lineTo(0,n),this.ctx.quadraticCurveTo(0,0,n,0),this.ctx.closePath(),this.ctx.fill(),this.ctx.fillStyle=m,this.ctx.fillText(s,l,.65*o),this.ctx.restore()};drawNodeBackground=t=>{const e=c.getColor(t.color);this.ctx.globalAlpha=1,this.ctx.fillStyle=e.background,c.drawRoundRect(this.ctx,t.x+1,t.y+1,t.width-2,t.height-2,12),this.ctx.fill(),this.ctx.strokeStyle=e.border,this.ctx.lineWidth=2,c.drawRoundRect(this.ctx,t.x,t.y,t.width,t.height,12),this.ctx.stroke()};drawGroup=(t,e)=>{this.drawNodeBackground(t),t.label&&this.drawLabelBar(t.x,t.y,t.label,c.getColor(t.color).active,e)};drawFile=t=>{this.ctx.fillStyle=m;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,s=this.DM.data.canvasMap[e.fromNode].ref,i=this.DM.data.canvasMap[e.toNode].ref,a=c.getAnchorCoord,[o,n]=a(s,e.fromSide),[r,l]=a(i,e.toSide),{active:h}=c.getColor(e.color);let[d,p,m,u]=[0,0,0,0];if(t.controlPoints?[d,p,m,u]=t.controlPoints:([d,p,m,u]=this.getControlPoints(o,n,r,l,e.fromSide,e.toSide),t.controlPoints=[d,p,m,u]),this.drawCurvedPath(o,n,r,l,d,p,m,u,h),this.drawArrowhead(r,l,m,u,h),e.label){const t=.5,s=(1-t)**3*o+3*(1-t)**2*t*d+3*(1-t)*t*t*m+t**3*r,i=(1-t)**3*n+3*(1-t)**2*t*p+3*(1-t)*t*t*u+t**3*l;this.ctx.font="18px sans-serif";const a=8,h=this.ctx.measureText(e.label).width+2*a,v=20;this.ctx.fillStyle="#222",this.ctx.beginPath(),c.drawRoundRect(this.ctx,s-h/2,i-v/2-2,h,v,4),this.ctx.fill(),this.ctx.fillStyle="#ccc",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(e.label,s,i-2),this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic"}};getControlPoints=(t,e,s,i,a,o)=>{const n=s-t,r=i-e,c=Math.min(Math.abs(n),Math.abs(r))+.3*Math.max(Math.abs(n),Math.abs(r)),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=s,x=i;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=i-l;break;case"bottom":x=i+l;break;case"left":v=s-l;break;case"right":v=s+l}return[m,u,v,x]};drawCurvedPath=(t,e,s,i,a,o,n,r,c)=>{this.ctx.beginPath(),this.ctx.moveTo(t,e),this.ctx.bezierCurveTo(a,o,n,r,s,i),this.ctx.strokeStyle=c,this.ctx.lineWidth=2,this.ctx.stroke()};drawArrowhead=(t,e,s,i,a)=>{const o=t-s,n=e-i,r=Math.sqrt(o*o+n*n);if(0===r)return;const c=o/r,l=n/r,h=t-12*c-7*l,d=e-12*l+7*c,p=t-12*c+7*l,m=e-12*l-7*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}}export{p as I,d as O,u as R};
|
|
2
|
+
//# sourceMappingURL=renderer-NPxavnke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-NPxavnke.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 InteractionHandler from '$/interactionHandler';\nimport utilities, { destroyError } from '$/utilities';\nimport type { MarkdownParser } from './declarations';\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 IH: () => InteractionHandler;\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.IH = this.container.get(InteractionHandler, { lazy: true });\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tthis.updateOverlay(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)) 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\tthis.updateOverlay(node, node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i)) this.updateOverlay(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\tthis.updateOverlay(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.canvasMap).forEach(node => {\n\t\t\tif (node.type === 'node') createOverlay(node.ref);\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\tthis.updateOverlay(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, parsedContent, 'text');\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 updateOverlay(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} else if (type === 'text') {\n\t\t\tconst parsedContentContainer = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tparsedContentContainer.innerHTML = content;\n\t\t}\n\t}\n\n\tprivate async constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst color = utilities.getColor(node.color);\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\toverlay.style.backgroundColor = color.background;\n\t\toverlay.style.setProperty('--active-color', color.active);\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\toverlayBorder.style.borderColor = color.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 dispose = () => {\n\t\twhile (this.overlaysLayer.firstElementChild) {\n\t\t\tconst child = this.overlaysLayer.firstElementChild;\n\t\t\tif (this.eventListeners[child.id]) {\n\t\t\t\tconst onStart = this.eventListeners[child.id][0];\n\t\t\t\tconst onEnd = this.eventListeners[child.id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\tchild.removeEventListener('pointerenter', onStart);\n\t\t\t\tchild.removeEventListener('pointerleave', onEnd);\n\t\t\t\tchild.removeEventListener('touchstart', onStart);\n\t\t\t\tchild.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[child.id][0] = null;\n\t\t\t\tthis.eventListeners[child.id][1] = null;\n\t\t\t}\n\t\t\tchild.remove();\n\t\t}\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import {\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';\nimport { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport OverlayManager from '$/overlayManager';\nimport utilities from '$/utilities';\n\ntype Options = {\n\tpointeract?: PointeractOptions<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\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 detail = e.detail;\n\t\tfunction isUIControl(target: HTMLElement | null) {\n\t\t\tif (!target) return false;\n\t\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t\t}\n\t\tif (isUIControl(e.detail.target as HTMLElement | null)) return;\n\t\tconst node = this.DM.findNodeAt({ x: detail.x, y: detail.y });\n\t\tthis.onClick(node ? node.id : null);\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 MapEdgeItem, type MapNodeItem } from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 7;\nconst NODE_RADIUS = 12;\nconst FONT_COLOR = '#fff';\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\n\nexport default class Renderer extends BaseModule {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: viewport;\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\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\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\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 (\n\t\t\tthis.isViewportInside(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: viewport) {\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.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tObject.values(this.DM.data.canvasMap).forEach(item => {\n\t\t\tif (item.type === 'edge') this.drawEdge(item);\n\t\t\telse {\n\t\t\t\tconst node = item.ref;\n\t\t\t\tif (node.type === 'file') this.drawFile(item);\n\t\t\t\telse if (node.type === 'group') this.drawGroup(node, scale);\n\t\t\t}\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: viewport, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX = (this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY = (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 isViewportInside = (inner: viewport, outer: viewport) =>\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 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 = (x: number, y: number, label: string, color: string, scale: number) => {\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 = FONT_COLOR;\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 = utilities.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(this.ctx, node.x + 1, node.y + 1, node.width - 2, node.height - 2, radius);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = 2;\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\tthis.drawLabelBar(node.x, node.y, node.label, utilities.getColor(node.color).active, scale);\n\t};\n\n\tprivate drawFile = (item: MapNodeItem) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\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: MapEdgeItem) => {\n\t\tconst edge = item.ref;\n\t\tconst fromNode = this.DM.data.canvasMap[edge.fromNode].ref as JSONCanvasNode;\n\t\tconst toNode = this.DM.data.canvasMap[edge.toNode].ref as JSONCanvasNode;\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst [startX, startY] = gac(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = gac(toNode, edge.toSide);\n\t\tconst { active } = utilities.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\tactive,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY, 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 = '#222';\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 = '#ccc';\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 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 = (tipX: number, tipY: number, fromX: number, fromY: number, color: string) => {\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","IH","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","InteractionHandler","lazy","Controller","onRefresh","subscribe","updateOverlays","className","data","appendChild","onStart","start","onDispose","dispose","onClick","select","createOverlay","async","node","type","updateOverlay","text","file","match","loadMarkdownForNode","url","Object","values","canvasMap","forEach","ref","id","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","style","transform","offsetX","offsetY","scale","content","element","getElementsByClassName","innerHTML","constructOverlay","left","x","top","y","width","height","color","getColor","overlay","backgroundColor","background","setProperty","active","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","border","onEnd","addEventListener","firstElementChild","child","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","closest","findNodeAt","off","FONT_COLOR","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","item","drawEdge","drawFile","drawGroup","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","drawRoundRect","strokeStyle","lineWidth","stroke","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","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,9 @@
|
|
|
1
|
+
import type { ModuleInputCtor, UserOptions } from '../core/declarations';
|
|
2
|
+
export default function JSONCanvasViewerReact<T extends ModuleInputCtor>({ modules, options, prerenderedContent, className, style, id, }: {
|
|
3
|
+
modules: T;
|
|
4
|
+
options: Omit<UserOptions<T>, 'container'>;
|
|
5
|
+
prerenderedContent?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
id?: string;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -3,7 +3,7 @@ declare const __VLS_export: <T extends ModuleInputCtor>(__VLS_props: NonNullable
|
|
|
3
3
|
props: import("vue").PublicProps & __VLS_PrettifyLocal<{
|
|
4
4
|
modules?: T | undefined;
|
|
5
5
|
options: Omit<UserOptions<T>, "container">;
|
|
6
|
-
|
|
6
|
+
isPrerendering?: boolean;
|
|
7
7
|
}> & (typeof globalThis extends {
|
|
8
8
|
__VLS_PROPS_FALLBACK: infer P;
|
|
9
9
|
} ? P : {});
|
package/dist/types/bridges.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { default as JSONCanvasViewerReact } from './bridges/reactComponent';
|
|
1
2
|
export { default as renderToString } from './bridges/renderToString';
|
|
2
3
|
export { default as jsonCanvasVitePlugin } from './bridges/vitePlugin';
|
|
3
4
|
export { default as JSONCanvasViewerVue } from './bridges/vueComponent.vue';
|
|
@@ -6,6 +6,18 @@ type Options = {
|
|
|
6
6
|
attachmentDir?: string;
|
|
7
7
|
extraCSS?: string;
|
|
8
8
|
};
|
|
9
|
+
export interface MapNodeItem {
|
|
10
|
+
type: 'node';
|
|
11
|
+
ref: JSONCanvasNode;
|
|
12
|
+
fileName?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface MapEdgeItem {
|
|
15
|
+
type: 'edge';
|
|
16
|
+
ref: JSONCanvasEdge;
|
|
17
|
+
controlPoints?: Array<number>;
|
|
18
|
+
}
|
|
19
|
+
type MapItem = MapEdgeItem | MapNodeItem;
|
|
20
|
+
type CanvasMap = Record<string, MapItem>;
|
|
9
21
|
export default class DataManager extends BaseModule<Options> {
|
|
10
22
|
private spatialGrid;
|
|
11
23
|
onToggleFullscreen: {
|
|
@@ -16,7 +28,7 @@ export default class DataManager extends BaseModule<Options> {
|
|
|
16
28
|
};
|
|
17
29
|
data: {
|
|
18
30
|
canvasData: Required<JSONCanvas>;
|
|
19
|
-
|
|
31
|
+
canvasMap: CanvasMap;
|
|
20
32
|
canvasBaseDir: string;
|
|
21
33
|
nodeBounds: NodeBounds;
|
|
22
34
|
offsetX: number;
|
|
@@ -59,16 +59,6 @@ export type Coordinates = {
|
|
|
59
59
|
x: number;
|
|
60
60
|
y: number;
|
|
61
61
|
};
|
|
62
|
-
export type RuntimeData = {
|
|
63
|
-
offsetX: number;
|
|
64
|
-
offsetY: number;
|
|
65
|
-
scale: number;
|
|
66
|
-
canvasData: JSONCanvas;
|
|
67
|
-
nodeMap: Record<string, JSONCanvasNode>;
|
|
68
|
-
canvasBaseDir: string;
|
|
69
|
-
nodeBounds: NodeBounds;
|
|
70
|
-
container: HTMLDivElement;
|
|
71
|
-
};
|
|
72
62
|
export type NodeBounds = {
|
|
73
63
|
minX: number;
|
|
74
64
|
minY: number;
|