class t{constructor(t={}){this.container=t.container,this.data=t.data||{id:"root",text:"Root",children:[]},this.nodeWidth=t.nodeWidth||120,this.nodeHeight=t.nodeHeight||40,this.hGap=t.hGap||60,this.vGap=t.vGap||20,this.nodes=[],this.links=[],this.init()}init(){this.container&&(this.container.style.position="relative",this.container.style.overflow="hidden",this.container.style.backgroundColor="#f5f5f5",this.viewport=document.createElement("div"),this.viewport.style.position="absolute",this.viewport.style.width="10000px",this.viewport.style.height="10000px",this.viewport.style.transformOrigin="0 0",this.container.appendChild(this.viewport),this.scale=1,this.offsetX=this.container.clientWidth/2-100,this.offsetY=this.container.clientHeight/2-50,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0",this.svg.style.left="0",this.svg.style.width="100%",this.svg.style.height="100%",this.svg.style.pointerEvents="none",this.viewport.appendChild(this.svg),this.initEvents(),this.updateViewport(),this.render())}initEvents(){let t,e,i=!1;this.container.onmousedown=s=>{s.target.classList.contains("mindmap-node")||(i=!0,t=s.clientX,e=s.clientY)},window.onmousemove=s=>{i&&(this.offsetX+=s.clientX-t,this.offsetY+=s.clientY-e,t=s.clientX,e=s.clientY,this.updateViewport())},window.onmouseup=()=>{i=!1},this.container.onwheel=t=>{t.preventDefault();const e=t.deltaY>0?.9:1.1,i=this.scale*e;if(i<.1||i>5)return;const s=this.container.getBoundingClientRect(),n=t.clientX-s.left,o=t.clientY-s.top;this.offsetX=n-(n-this.offsetX)*e,this.offsetY=o-(o-this.offsetY)*e,this.scale=i,this.updateViewport()}}updateViewport(){this.viewport.style.transform=`translate(${this.offsetX}px, ${this.offsetY}px) scale(${this.scale})`}layout(){this.nodes=[],this.links=[];const t=(e,i,s)=>{const n=e._collapsed,o=s+(e.children&&e.children.length>0&&!n?e.children.reduce((t,e)=>t+this.getTotalHeight(e),0):this.nodeHeight)/2-this.nodeHeight/2,h={x:i,y:o,text:e.text,id:e.id||Math.random().toString(36).substr(2,9),raw:e};if(this.nodes.push(h),e.children&&!n){let n=s;e.children.forEach(e=>{const s=t(e,i+this.nodeWidth+this.hGap,n);this.links.push({x1:i+this.nodeWidth,y1:o+this.nodeHeight/2,x2:s.x,y2:s.y+this.nodeHeight/2}),n+=this.getTotalHeight(e)})}return h};t(this.data,0,0)}getTotalHeight(t){return!t.children||0===t.children.length||t._collapsed?this.nodeHeight+this.vGap:t.children.reduce((t,e)=>t+this.getTotalHeight(e),0)}render(){this.layout(),this.svg.innerHTML="";this.viewport.querySelectorAll(".mindmap-node").forEach(t=>t.remove()),this.links.forEach(t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","path"),i=`M ${t.x1} ${t.y1} C ${t.x1+this.hGap/2} ${t.y1}, ${t.x2-this.hGap/2} ${t.y2}, ${t.x2} ${t.y2}`;e.setAttribute("d",i),e.setAttribute("stroke","#4A90E2"),e.setAttribute("fill","none"),e.setAttribute("stroke-width","2"),this.svg.appendChild(e)}),this.nodes.forEach(t=>{const e=document.createElement("div");e.className="mindmap-node",t.raw._collapsed&&e.classList.add("collapsed"),e.style.position="absolute",e.style.left=`${t.x}px`,e.style.top=`${t.y}px`,e.style.width=`${this.nodeWidth}px`,e.style.height=`${this.nodeHeight}px`,e.style.border="2px solid #4A90E2",e.style.borderRadius="8px",e.style.backgroundColor="#fff",e.style.display="flex",e.style.alignItems="center",e.style.justifyContent="center",e.style.fontSize="14px",e.style.fontWeight="bold",e.style.color="#333",e.style.boxShadow="0 4px 6px rgba(0,0,0,0.1)",e.style.cursor="pointer",e.style.userSelect="none",e.style.transition="transform 0.2s",e.innerText=t.text,t.raw._collapsed&&(e.style.backgroundColor="#f0f0f0",e.style.borderStyle="dashed"),e.onmouseenter=()=>e.style.transform="scale(1.05)",e.onmouseleave=()=>e.style.transform="scale(1)",e.onclick=e=>{e.stopPropagation(),t.raw._collapsed=!t.raw._collapsed,this.render()},this.viewport.appendChild(e)})}addNode(t,e){const i=s=>{if(s.id===t||s.text===t)return s.children||(s.children=[]),s.children.push({text:e,id:Math.random().toString(36).substr(2,9)}),!0;if(s.children)for(const t of s.children)if(i(t))return!0;return!1};i(this.data),this.render()}removeNode(t){const e=i=>{if(!i.children)return!1;const s=i.children.findIndex(e=>e.id===t||e.text===t);if(-1!==s)return i.children.splice(s,1),!0;for(const t of i.children)if(e(t))return!0;return!1};this.data.id!==t&&this.data.text!==t?(e(this.data),this.render()):console.warn("Cannot remove root node")}}export{t as Mindmap};