mind-elixir
Version:
Mind elixir is a free open source mind map core.
1,063 lines (1,062 loc) • 61.4 kB
JavaScript
const nt = {
name: "Latte",
type: "light",
palette: ["#dd7878", "#ea76cb", "#8839ef", "#e64553", "#fe640b", "#df8e1d", "#40a02b", "#209fb5", "#1e66f5", "#7287fd"],
cssVar: {
"--node-gap-x": "30px",
"--node-gap-y": "10px",
"--main-gap-x": "65px",
"--main-gap-y": "45px",
"--root-radius": "30px",
"--main-radius": "20px",
"--root-color": "#ffffff",
"--root-bgcolor": "#4c4f69",
"--root-border-color": "rgba(0, 0, 0, 0)",
"--main-color": "#444446",
"--main-bgcolor": "#ffffff",
"--topic-padding": "3px",
"--color": "#777777",
"--bgcolor": "#f6f6f6",
"--selected": "#4dc4ff",
"--accent-color": "#e64553",
"--panel-color": "#444446",
"--panel-bgcolor": "#ffffff",
"--panel-border-color": "#eaeaea",
"--map-padding": "50px"
}
}, ot = {
name: "Dark",
type: "dark",
palette: ["#848FA0", "#748BE9", "#D2F9FE", "#4145A5", "#789AFA", "#706CF4", "#EF987F", "#775DD5", "#FCEECF", "#DA7FBC"],
cssVar: {
"--node-gap-x": "30px",
"--node-gap-y": "10px",
"--main-gap-x": "65px",
"--main-gap-y": "45px",
"--root-radius": "30px",
"--main-radius": "20px",
"--root-color": "#ffffff",
"--root-bgcolor": "#2d3748",
"--root-border-color": "rgba(255, 255, 255, 0.1)",
"--main-color": "#ffffff",
"--main-bgcolor": "#4c4f69",
"--topic-padding": "3px",
"--color": "#cccccc",
"--bgcolor": "#252526",
"--selected": "#4dc4ff",
"--accent-color": "#789AFA",
"--panel-color": "#ffffff",
"--panel-bgcolor": "#2d3748",
"--panel-border-color": "#696969",
"--map-padding": "50px 80px"
}
};
function $t(t) {
return t.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """);
}
const _ = function(t, e) {
if (e.id === t)
return e;
if (e.children && e.children.length) {
for (let n = 0; n < e.children.length; n++) {
const o = _(t, e.children[n]);
if (o) return o;
}
return null;
} else
return null;
}, st = (t, e) => {
if (t.parent = e, t.children)
for (let n = 0; n < t.children.length; n++)
st(t.children[n], t);
}, mt = (t, e, n) => {
t.expanded = e, t.children && t.children.forEach((o) => {
mt(o, e);
});
};
function U(t, e, n, o) {
const s = o - e, i = t - n;
let r = Math.atan(Math.abs(s) / Math.abs(i)) / 3.14 * 180;
if (isNaN(r)) return;
i < 0 && s > 0 && (r = 180 - r), i < 0 && s < 0 && (r = 180 + r), i > 0 && s < 0 && (r = 360 - r);
const c = 12, a = 30, h = r + a, f = r - a;
return {
x1: n + Math.cos(Math.PI * h / 180) * c,
y1: o - Math.sin(Math.PI * h / 180) * c,
x2: n + Math.cos(Math.PI * f / 180) * c,
y2: o - Math.sin(Math.PI * f / 180) * c
};
}
function z() {
return ((/* @__PURE__ */ new Date()).getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16);
}
const Dt = function() {
const t = z();
return {
topic: this.newTopicName,
id: t
};
}, A = (t, e) => {
let n = 0, o = 0;
for (; e && e !== t; )
n += e.offsetLeft, o += e.offsetTop, e = e.offsetParent;
return { offsetLeft: n, offsetTop: o };
}, E = (t, e) => {
for (const n in e)
t.setAttribute(n, e[n]);
}, ht = (t) => t ? t.tagName === "ME-TPC" : !1, yt = (t) => {
const e = /translate\(([^,]+),\s*([^)]+)\)/, n = t.match(e);
return n ? { x: parseFloat(n[1]), y: parseFloat(n[2]) } : { x: 0, y: 0 };
}, wt = function(t) {
for (let e = 0; e < t.length; e++) {
const { dom: n, evt: o, func: s } = t[e];
n.addEventListener(o, s);
}
return function() {
for (let n = 0; n < t.length; n++) {
const { dom: o, evt: s, func: i } = t[n];
o.removeEventListener(s, i);
}
};
}, I = {
LHS: "lhs",
RHS: "rhs"
}, dt = function(t, e, n) {
const { scaleVal: o, scaleSensitivity: s } = t;
switch (e) {
case "in":
t.scale(o + s, n);
break;
case "out":
t.scale(o - s, n);
}
};
function At(t) {
const { dragMoveHelper: e } = t;
let n = 0;
t.spacePressed = !1;
const o = (l) => {
if (l.button !== 0) return;
if (t.helper1?.moved) {
t.helper1.clear();
return;
}
if (t.helper2?.moved) {
t.helper2.clear();
return;
}
if (e.moved) {
e.clear();
return;
}
const d = l.target;
if (d.tagName === "ME-EPD")
l.ctrlKey || l.metaKey ? t.expandNodeAll(d.previousSibling) : t.expandNode(d.previousSibling);
else if (d.tagName === "ME-TPC" && t.currentNodes.length > 1)
t.selectNode(d);
else if (!t.editable)
return;
const y = d.closest(".svg-label");
if (y) {
const b = y.dataset.svgId, S = y.dataset.type, x = document.getElementById(b);
if (x) {
if (S === "arrow") {
t.selectArrow(x);
return;
} else if (S === "summary") {
t.selectSummary(x);
return;
}
}
}
if (d.closest(".topiclinks")) {
const b = d.closest("g");
if (b) {
t.selectArrow(b);
return;
}
}
if (d.closest(".summary")) {
const b = d.closest("g");
if (b) {
t.selectSummary(b);
return;
}
}
}, s = (l) => {
if (!t.editable) return;
const d = l.target;
ht(d) && t.beginEdit(d);
const y = d.closest(".svg-label");
if (y) {
const b = y.dataset.svgId, S = y.dataset.type, x = document.getElementById(b);
if (x) {
if (S === "arrow") {
t.editArrowLabel(x);
return;
} else if (S === "summary") {
t.editSummary(x);
return;
}
}
}
if (d.closest(".topiclinks")) {
const b = d.closest("g");
if (b) {
t.editArrowLabel(b);
return;
}
}
if (d.closest(".summary")) {
const b = d.closest("g");
if (b) {
t.editSummary(b);
return;
}
}
}, i = (l) => {
if (l.pointerType === "mouse") return;
const d = (/* @__PURE__ */ new Date()).getTime(), y = d - n;
y < 300 && y > 0 && s(l), n = d;
}, r = (l) => {
l.code === "Space" && (t.spacePressed = !0, t.container.classList.add("space-pressed"));
}, c = (l) => {
l.code === "Space" && (t.spacePressed = !1, t.container.classList.remove("space-pressed"));
}, a = (l) => {
e.moved = !1;
const d = t.spacePressed && l.button === 0 && l.pointerType === "mouse", y = t.mouseSelectionButton === 0 ? 2 : 0, v = l.button === y && l.pointerType === "mouse" || l.pointerType === "touch";
if (!d && !v) return;
e.x = l.clientX, e.y = l.clientY;
const C = l.target;
(d || C.className !== "circle" && C.contentEditable !== "plaintext-only") && (e.mousedown = !0, C.setPointerCapture(l.pointerId));
}, h = (l) => {
if (l.target.contentEditable !== "plaintext-only" || t.spacePressed && e.mousedown) {
const d = l.clientX - e.x, y = l.clientY - e.y;
e.onMove(d, y);
}
e.x = l.clientX, e.y = l.clientY;
}, f = (l) => {
if (!e.mousedown) return;
const d = l.target;
d.hasPointerCapture && d.hasPointerCapture(l.pointerId) && d.releasePointerCapture(l.pointerId), e.clear();
}, p = () => {
e.mousedown && e.clear();
}, m = (l) => {
if (l.preventDefault(), l.button !== 2 || !t.editable) return;
const d = l.target;
ht(d) && !d.classList.contains("selected") && t.selectNode(d), setTimeout(() => {
t.dragMoveHelper.moved || t.bus.fire("showContextMenu", l);
}, 200);
}, w = (l) => {
l.stopPropagation(), l.preventDefault(), l.ctrlKey || l.metaKey ? l.deltaY < 0 ? dt(t, "in", t.dragMoveHelper) : t.scaleVal - t.scaleSensitivity > 0 && dt(t, "out", t.dragMoveHelper) : l.shiftKey ? t.move(-l.deltaY, 0) : t.move(-l.deltaX, -l.deltaY);
}, { container: g } = t;
return wt([
{ dom: g, evt: "pointerdown", func: a },
{ dom: g, evt: "pointermove", func: h },
{ dom: g, evt: "pointerup", func: f },
{ dom: g, evt: "pointerup", func: i },
{ dom: g, evt: "click", func: o },
{ dom: g, evt: "dblclick", func: s },
{ dom: g, evt: "contextmenu", func: m },
{ dom: g, evt: "wheel", func: typeof t.handleWheel == "function" ? t.handleWheel : w },
{ dom: g, evt: "blur", func: p },
{ dom: g, evt: "keydown", func: r },
{ dom: g, evt: "keyup", func: c }
]);
}
function Nt() {
return {
handlers: {},
addListener: function(t, e) {
this.handlers[t] === void 0 && (this.handlers[t] = []), this.handlers[t].push(e);
},
fire: function(t, ...e) {
if (this.handlers[t] instanceof Array) {
const n = this.handlers[t];
for (let o = 0; o < n.length; o++)
n[o](...e);
}
},
removeListener: function(t, e) {
if (!this.handlers[t]) return;
const n = this.handlers[t];
if (!e)
n.length = 0;
else if (n.length)
for (let o = 0; o < n.length; o++)
n[o] === e && this.handlers[t].splice(o, 1);
}
};
}
const K = document, Mt = function() {
this.nodes.innerHTML = "";
const t = this.createTopic(this.nodeData);
vt.call(this, t, this.nodeData), t.draggable = !1;
const e = K.createElement("me-root");
e.appendChild(t);
const n = this.nodeData.children || [];
if (this.direction === 2) {
let o = 0, s = 0;
n.map((i) => {
i.direction === 0 ? o += 1 : i.direction === 1 ? s += 1 : o <= s ? (i.direction = 0, o += 1) : (i.direction = 1, s += 1);
});
}
Pt(this, n, e);
}, Pt = function(t, e, n) {
const o = K.createElement("me-main");
o.className = I.LHS;
const s = K.createElement("me-main");
s.className = I.RHS;
for (let i = 0; i < e.length; i++) {
const r = e[i], { grp: c } = t.createWrapper(r);
t.direction === 2 ? r.direction === 0 ? o.appendChild(c) : s.appendChild(c) : t.direction === 0 ? o.appendChild(c) : s.appendChild(c);
}
t.nodes.appendChild(o), t.nodes.appendChild(n), t.nodes.appendChild(s), t.nodes.appendChild(t.lines), t.nodes.appendChild(t.labelContainer);
}, Ht = function(t, e) {
const n = K.createElement("me-children");
for (let o = 0; o < e.length; o++) {
const s = e[o], { grp: i } = t.createWrapper(s);
n.appendChild(i);
}
return n;
}, L = document, bt = function(t, e) {
const o = (this?.el ? this.el : e || document).querySelector(`[data-nodeid="me${t}"]`);
if (!o) throw new Error(`FindEle: Node ${t} not found, maybe it's collapsed.`);
return o;
}, vt = function(t, e) {
if (t.innerHTML = "", e.style) {
const n = e.style;
for (const o in n)
t.style[o] = n[o];
}
if (e.dangerouslySetInnerHTML) {
t.innerHTML = e.dangerouslySetInnerHTML;
return;
}
if (e.image) {
const n = e.image;
if (n.url && n.width && n.height) {
const o = L.createElement("img");
o.src = this.imageProxy ? this.imageProxy(n.url) : n.url, o.style.width = n.width + "px", o.style.height = n.height + "px", n.fit && (o.style.objectFit = n.fit), t.appendChild(o), t.image = o;
}
} else t.image && (t.image = void 0);
{
const n = L.createElement("span");
n.className = "text", this.markdown ? n.innerHTML = this.markdown(e.topic, e) : n.textContent = e.topic, t.appendChild(n), t.text = n;
}
if (e.hyperLink) {
const n = L.createElement("a");
n.className = "hyper-link", n.target = "_blank", n.innerText = "🔗", n.href = e.hyperLink, t.appendChild(n), t.link = n;
} else t.link && (t.link = void 0);
if (e.icons && e.icons.length) {
const n = L.createElement("span");
n.className = "icons", n.innerHTML = e.icons.map((o) => `<span>${$t(o)}</span>`).join(""), t.appendChild(n), t.icons = n;
} else t.icons && (t.icons = void 0);
if (e.tags && e.tags.length) {
const n = L.createElement("div");
n.className = "tags", e.tags.forEach((o) => {
const s = L.createElement("span");
typeof o == "string" ? s.textContent = o : (s.textContent = o.text, o.className && (s.className = o.className), o.style && Object.assign(s.style, o.style)), n.appendChild(s);
}), t.appendChild(n), t.tags = n;
} else t.tags && (t.tags = void 0);
}, Bt = function(t, e) {
const n = L.createElement("me-wrapper"), { p: o, tpc: s } = this.createParent(t);
if (n.appendChild(o), !e && t.children && t.children.length > 0) {
const i = Ft(t.expanded);
if (o.appendChild(i), t.expanded !== !1) {
const r = Ht(this, t.children);
n.appendChild(r);
}
}
return { grp: n, top: o, tpc: s };
}, It = function(t) {
const e = L.createElement("me-parent"), n = this.createTopic(t);
return vt.call(this, n, t), e.appendChild(n), { p: e, tpc: n };
}, Wt = function(t) {
const e = L.createElement("me-children");
return e.append(...t), e;
}, Ot = function(t) {
const e = L.createElement("me-tpc");
return e.nodeObj = t, e.dataset.nodeid = "me" + t.id, e.draggable = this.draggable, e;
};
function xt(t) {
const e = L.createRange();
e.selectNodeContents(t);
const n = window.getSelection();
n && (n.removeAllRanges(), n.addRange(e));
}
const Gt = function(t) {
if (!t) return;
const e = L.createElement("div"), n = t.nodeObj, o = n.topic, { offsetLeft: s, offsetTop: i } = A(this.nodes, t);
this.nodes.appendChild(e), e.id = "input-box", e.textContent = o, e.contentEditable = "plaintext-only", e.spellcheck = !1;
const r = getComputedStyle(t);
e.style.cssText = `
left: ${s}px;
top: ${i}px;
min-width:${t.offsetWidth - 8}px;
color:${r.color};
font-size:${r.fontSize};
padding:${r.padding};
margin:${r.margin};
background-color:${r.backgroundColor !== "rgba(0, 0, 0, 0)" && r.backgroundColor};
border: ${r.border};
border-radius:${r.borderRadius}; `, this.direction === 0 && (e.style.right = "0"), xt(e), this.bus.fire("operation", {
name: "beginEdit",
obj: t.nodeObj
}), e.addEventListener("keydown", (c) => {
c.stopPropagation();
const a = c.key;
if (a === "Enter" || a === "Tab") {
if (c.shiftKey) return;
c.preventDefault(), e.blur(), this.container.focus();
}
}), e.addEventListener("blur", () => {
if (!e) return;
e.remove();
const c = e.textContent?.trim() || "";
c === o || c === "" || (n.topic = c, this.markdown ? t.text.innerHTML = this.markdown(n.topic, n) : t.text.textContent = c, this.linkDiv(), this.bus.fire("operation", {
name: "finishEdit",
obj: n,
origin: o
}));
});
}, Ft = function(t) {
const e = L.createElement("me-epd");
return e.expanded = t !== !1, e.className = t !== !1 ? "minus" : "", e;
}, B = document, D = "http://www.w3.org/2000/svg", Q = function(t) {
const e = t.clientWidth, n = t.clientHeight, o = t.dataset, s = Number(o.x), i = Number(o.y), r = o.anchor;
let c = s;
r === "middle" ? c = s - e / 2 : r === "end" && (c = s - e), t.style.left = `${c}px`, t.style.top = `${i - n / 2}px`, t.style.visibility = "visible";
}, et = function(t, e, n, o) {
const { anchor: s = "middle", color: i, dataType: r, svgId: c } = o, a = document.createElement("div");
a.className = "svg-label", a.style.color = i || "#666";
const h = "label-" + c;
return a.id = h, a.innerHTML = t, a.dataset.type = r, a.dataset.svgId = c, a.dataset.x = e.toString(), a.dataset.y = n.toString(), a.dataset.anchor = s, a;
}, Ct = function(t, e, n) {
const o = B.createElementNS(D, "path");
return E(o, {
d: t,
stroke: e || "#666",
fill: "none",
"stroke-width": n
}), o;
}, V = function(t) {
const e = B.createElementNS(D, "svg");
return e.setAttribute("class", t), e.setAttribute("overflow", "visible"), e;
}, ft = function() {
const t = B.createElementNS(D, "line");
return t.setAttribute("stroke", "#4dc4ff"), t.setAttribute("fill", "none"), t.setAttribute("stroke-width", "2"), t.setAttribute("opacity", "0.45"), t;
}, Vt = function(t, e, n, o) {
const s = B.createElementNS(D, "g");
return [
{
name: "line",
d: t
},
{
name: "arrow1",
d: e
},
{
name: "arrow2",
d: n
}
].forEach((r, c) => {
const a = r.d, h = B.createElementNS(D, "path"), f = {
d: a,
stroke: o?.stroke || "rgb(227, 125, 116)",
fill: "none",
"stroke-linecap": o?.strokeLinecap || "cap",
"stroke-width": String(o?.strokeWidth || "2")
};
o?.opacity !== void 0 && (f.opacity = String(o.opacity)), E(h, f), c === 0 && h.setAttribute("stroke-dasharray", o?.strokeDasharray || "8,2");
const p = B.createElementNS(D, "path");
E(p, {
d: a,
stroke: "transparent",
fill: "none",
"stroke-width": "15"
}), s.appendChild(p), s.appendChild(h), s[r.name] = h;
}), s;
}, St = function(t, e, n) {
if (!e) return;
const o = n.label, s = e.cloneNode(!0);
t.nodes.appendChild(s), s.id = "input-box", s.textContent = o, s.contentEditable = "plaintext-only", s.spellcheck = !1, s.style.cssText = `
left:${e.style.left};
top:${e.style.top};
max-width: 200px;
`, xt(s), t.scrollIntoView(s), s.addEventListener("keydown", (i) => {
i.stopPropagation();
const r = i.key;
if (r === "Enter" || r === "Tab") {
if (i.shiftKey) return;
i.preventDefault(), s.blur(), t.container.focus();
}
}), s.addEventListener("blur", () => {
if (!s) return;
const i = s.textContent?.trim() || "";
i === "" ? n.label = o : n.label = i, s.remove(), i !== o && (t.markdown ? e.innerHTML = t.markdown(n.label, n) : e.textContent = n.label, Q(e), "parent" in n ? t.bus.fire("operation", {
name: "finishEditSummary",
obj: n
}) : t.bus.fire("operation", {
name: "finishEditArrowLabel",
obj: n
}));
});
}, zt = function(t) {
const e = this.map.querySelector("me-root"), n = e.offsetTop, o = e.offsetLeft, s = e.offsetWidth, i = e.offsetHeight, r = this.map.querySelectorAll("me-main > me-wrapper");
this.lines.innerHTML = "";
for (let c = 0; c < r.length; c++) {
const a = r[c], h = a.querySelector("me-tpc"), { offsetLeft: f, offsetTop: p } = A(this.nodes, h), m = h.offsetWidth, w = h.offsetHeight, g = a.parentNode.className, u = this.generateMainBranch({ pT: n, pL: o, pW: s, pH: i, cT: p, cL: f, cW: m, cH: w, direction: g, containerHeight: this.nodes.offsetHeight }), l = this.theme.palette, d = h.nodeObj.branchColor || l[c % l.length];
if (h.style.borderColor = d, this.lines.appendChild(Ct(u, d, "3")), t && t !== a)
continue;
const y = V("subLines"), v = a.lastChild;
v.tagName === "svg" && v.remove(), a.appendChild(y), Et(this, y, d, a, g, !0);
}
this.labelContainer.innerHTML = "", this.renderArrow(), this.renderSummary(), this.bus.fire("linkDiv");
}, Et = function(t, e, n, o, s, i) {
const r = o.firstChild, c = o.children[1].children;
if (c.length === 0) return;
const a = r.offsetTop, h = r.offsetLeft, f = r.offsetWidth, p = r.offsetHeight;
for (let m = 0; m < c.length; m++) {
const w = c[m], g = w.firstChild, u = g.offsetTop, l = g.offsetLeft, d = g.offsetWidth, y = g.offsetHeight, v = g.firstChild.nodeObj.branchColor || n, C = t.generateSubBranch({ pT: a, pL: h, pW: f, pH: p, cT: u, cL: l, cW: d, cH: y, direction: s, isFirst: i });
e.appendChild(Ct(C, v, "2"));
const b = g.children[1];
if (b) {
if (!b.expanded) continue;
} else
continue;
Et(t, e, v, w, s);
}
}, Rt = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169394918" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2021" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M851.91168 328.45312c-59.97056 0-108.6208 48.47104-108.91264 108.36992l-137.92768 38.4a109.14304 109.14304 0 0 0-63.46752-46.58688l1.39264-137.11872c47.29344-11.86816 82.31936-54.66624 82.31936-105.64096 0-60.15488-48.76288-108.91776-108.91776-108.91776s-108.91776 48.76288-108.91776 108.91776c0 49.18784 32.60928 90.75712 77.38368 104.27392l-1.41312 138.87488a109.19936 109.19936 0 0 0-63.50336 48.55808l-138.93632-39.48544 0.01024-0.72704c0-60.15488-48.76288-108.91776-108.91776-108.91776s-108.91776 48.75776-108.91776 108.91776c0 60.15488 48.76288 108.91264 108.91776 108.91264 39.3984 0 73.91232-20.92032 93.03552-52.2496l139.19232 39.552-0.00512 0.2304c0 25.8304 9.00096 49.5616 24.02816 68.23424l-90.14272 132.63872a108.7488 108.7488 0 0 0-34.2528-5.504c-60.15488 0-108.91776 48.768-108.91776 108.91776 0 60.16 48.76288 108.91776 108.91776 108.91776 60.16 0 108.92288-48.75776 108.92288-108.91776 0-27.14624-9.9328-51.968-26.36288-71.04l89.04704-131.03104a108.544 108.544 0 0 0 37.6832 6.70208 108.672 108.672 0 0 0 36.48512-6.272l93.13792 132.57216a108.48256 108.48256 0 0 0-24.69888 69.0688c0 60.16 48.768 108.92288 108.91776 108.92288 60.16 0 108.91776-48.76288 108.91776-108.92288 0-60.14976-48.75776-108.91776-108.91776-108.91776a108.80512 108.80512 0 0 0-36.69504 6.3488l-93.07136-132.48a108.48768 108.48768 0 0 0 24.79616-72.22784l136.09984-37.888c18.99008 31.93856 53.84192 53.3504 93.69088 53.3504 60.16 0 108.92288-48.75776 108.92288-108.91264-0.00512-60.15488-48.77312-108.92288-108.92288-108.92288z" p-id="2022"></path></svg>', Yt = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169375313" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1775" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M639 463.30000001L639 285.1c0-36.90000001-26.4-68.5-61.3-68.5l-150.2 0c-1.5 0-3 0.1-4.5 0.3-10.2-38.7-45.5-67.3-87.5-67.3-50 0-90.5 40.5-90.5 90.5s40.5 90.5 90.5 90.5c42 0 77.3-28.6 87.5-67.39999999 1.4 0.3 2.9 0.4 4.5 0.39999999L577.7 263.6c6.8 0 14.3 8.9 14.3 21.49999999l0 427.00000001c0 12.7-7.40000001 21.5-14.30000001 21.5l-150.19999999 0c-1.5 0-3 0.2-4.5 0.4-10.2-38.8-45.5-67.3-87.5-67.3-50 0-90.5 40.5-90.5 90.4 0 49.9 40.5 90.6 90.5 90.59999999 42 0 77.3-28.6 87.5-67.39999999 1.4 0.2 2.9 0.4 4.49999999 0.4L577.7 780.7c34.80000001 0 61.3-31.6 61.3-68.50000001L639 510.3l79.1 0c10.4 38.5 45.49999999 67 87.4 67 50 0 90.5-40.5 90.5-90.5s-40.5-90.5-90.5-90.5c-41.79999999 0-77.00000001 28.4-87.4 67L639 463.30000001z" fill="currentColor" p-id="1776"></path></svg>', jt = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169667709" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3037" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M385 560.69999999L385 738.9c0 36.90000001 26.4 68.5 61.3 68.5l150.2 0c1.5 0 3-0.1 4.5-0.3 10.2 38.7 45.5 67.3 87.5 67.3 50 0 90.5-40.5 90.5-90.5s-40.5-90.5-90.5-90.5c-42 0-77.3 28.6-87.5 67.39999999-1.4-0.3-2.9-0.4-4.5-0.39999999L446.3 760.4c-6.8 0-14.3-8.9-14.3-21.49999999l0-427.00000001c0-12.7 7.40000001-21.5 14.30000001-21.5l150.19999999 0c1.5 0 3-0.2 4.5-0.4 10.2 38.8 45.5 67.3 87.5 67.3 50 0 90.5-40.5 90.5-90.4 0-49.9-40.5-90.6-90.5-90.59999999-42 0-77.3 28.6-87.5 67.39999999-1.4-0.2-2.9-0.4-4.49999999-0.4L446.3 243.3c-34.80000001 0-61.3 31.6-61.3 68.50000001L385 513.7l-79.1 0c-10.4-38.5-45.49999999-67-87.4-67-50 0-90.5 40.5-90.5 90.5s40.5 90.5 90.5 90.5c41.79999999 0 77.00000001-28.4 87.4-67L385 560.69999999z" fill="currentColor" p-id="3038"></path></svg>', Xt = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169402629" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2170" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M639.328 416c8.032 0 16.096-3.008 22.304-9.056l202.624-197.184-0.8 143.808c-0.096 17.696 14.144 32.096 31.808 32.192 0.064 0 0.128 0 0.192 0 17.6 0 31.904-14.208 32-31.808l1.248-222.208c0-0.672-0.352-1.248-0.384-1.92 0.032-0.512 0.288-0.896 0.288-1.408 0.032-17.664-14.272-32-31.968-32.032L671.552 96l-0.032 0c-17.664 0-31.968 14.304-32 31.968C639.488 145.632 653.824 160 671.488 160l151.872 0.224-206.368 200.8c-12.672 12.32-12.928 32.608-0.64 45.248C622.656 412.736 630.976 416 639.328 416z" p-id="2171"></path><path d="M896.032 639.552 896.032 639.552c-17.696 0-32 14.304-32.032 31.968l-0.224 151.872-200.832-206.4c-12.32-12.64-32.576-12.96-45.248-0.64-12.672 12.352-12.928 32.608-0.64 45.248l197.184 202.624-143.808-0.8c-0.064 0-0.128 0-0.192 0-17.6 0-31.904 14.208-32 31.808-0.096 17.696 14.144 32.096 31.808 32.192l222.24 1.248c0.064 0 0.128 0 0.192 0 0.64 0 1.12-0.32 1.76-0.352 0.512 0.032 0.896 0.288 1.408 0.288l0.032 0c17.664 0 31.968-14.304 32-31.968L928 671.584C928.032 653.952 913.728 639.584 896.032 639.552z" p-id="2172"></path><path d="M209.76 159.744l143.808 0.8c0.064 0 0.128 0 0.192 0 17.6 0 31.904-14.208 32-31.808 0.096-17.696-14.144-32.096-31.808-32.192L131.68 95.328c-0.064 0-0.128 0-0.192 0-0.672 0-1.248 0.352-1.888 0.384-0.448 0-0.8-0.256-1.248-0.256 0 0-0.032 0-0.032 0-17.664 0-31.968 14.304-32 31.968L96 352.448c-0.032 17.664 14.272 32 31.968 32.032 0 0 0.032 0 0.032 0 17.664 0 31.968-14.304 32-31.968l0.224-151.936 200.832 206.4c6.272 6.464 14.624 9.696 22.944 9.696 8.032 0 16.096-3.008 22.304-9.056 12.672-12.32 12.96-32.608 0.64-45.248L209.76 159.744z" p-id="2173"></path><path d="M362.368 617.056l-202.624 197.184 0.8-143.808c0.096-17.696-14.144-32.096-31.808-32.192-0.064 0-0.128 0-0.192 0-17.6 0-31.904 14.208-32 31.808l-1.248 222.24c0 0.704 0.352 1.312 0.384 2.016 0 0.448-0.256 0.832-0.256 1.312-0.032 17.664 14.272 32 31.968 32.032L352.448 928c0 0 0.032 0 0.032 0 17.664 0 31.968-14.304 32-31.968s-14.272-32-31.968-32.032l-151.936-0.224 206.4-200.832c12.672-12.352 12.96-32.608 0.64-45.248S375.008 604.704 362.368 617.056z" p-id="2174"></path></svg>', qt = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169573443" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2883" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M514.133333 488.533333m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z" fill="currentColor" p-id="2884"></path><path d="M512 64C264.533333 64 64 264.533333 64 512c0 236.8 183.466667 428.8 416 445.866667v-134.4c-53.333333-59.733333-200.533333-230.4-200.533333-334.933334 0-130.133333 104.533333-234.666667 234.666666-234.666666s234.666667 104.533333 234.666667 234.666666c0 61.866667-49.066667 153.6-145.066667 270.933334l-59.733333 68.266666V960C776.533333 942.933333 960 748.8 960 512c0-247.466667-200.533333-448-448-448z" fill="currentColor" p-id="2885"></path></svg>', _t = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169419447" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2480" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M863.328 482.56l-317.344-1.12L545.984 162.816c0-17.664-14.336-32-32-32s-32 14.336-32 32l0 318.4L159.616 480.064c-0.032 0-0.064 0-0.096 0-17.632 0-31.936 14.24-32 31.904C127.424 529.632 141.728 544 159.392 544.064l322.592 1.152 0 319.168c0 17.696 14.336 32 32 32s32-14.304 32-32l0-318.944 317.088 1.12c0.064 0 0.096 0 0.128 0 17.632 0 31.936-14.24 32-31.904C895.264 496.992 880.96 482.624 863.328 482.56z" p-id="2481"></path></svg>', Ut = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750169426515" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2730" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M863.744 544 163.424 544c-17.664 0-32-14.336-32-32s14.336-32 32-32l700.32 0c17.696 0 32 14.336 32 32S881.44 544 863.744 544z" p-id="2731"></path></svg>', Kt = {
side: Rt,
left: Yt,
right: jt,
full: Xt,
living: qt,
zoomin: _t,
zoomout: Ut
}, M = (t, e) => {
const n = document.createElement("span");
return n.id = t, n.innerHTML = Kt[e], n;
};
function Jt(t) {
const e = document.createElement("div"), n = M("fullscreen", "full"), o = M("toCenter", "living"), s = M("zoomout", "zoomout"), i = M("zoomin", "zoomin"), r = document.createElement("span");
return r.innerText = "100%", e.appendChild(n), e.appendChild(o), e.appendChild(s), e.appendChild(i), e.className = "mind-elixir-toolbar rb", n.onclick = () => {
document.fullscreenElement === t.el ? document.exitFullscreen() : t.el.requestFullscreen();
}, o.onclick = () => {
t.toCenter();
}, s.onclick = () => {
t.scale(t.scaleVal - t.scaleSensitivity);
}, i.onclick = () => {
t.scale(t.scaleVal + t.scaleSensitivity);
}, e;
}
function Qt(t) {
const e = document.createElement("div"), n = M("tbltl", "left"), o = M("tbltr", "right"), s = M("tblts", "side");
return e.appendChild(n), e.appendChild(o), e.appendChild(s), e.className = "mind-elixir-toolbar lt", n.onclick = () => {
t.initLeft();
}, o.onclick = () => {
t.initRight();
}, s.onclick = () => {
t.initSide();
}, e;
}
function Zt(t) {
t.container.append(Jt(t)), t.container.append(Qt(t));
}
const te = function(t, e = !0) {
this.theme = t;
const o = {
...(t.type === "dark" ? ot : nt).cssVar,
...t.cssVar
}, s = Object.keys(o);
for (let i = 0; i < s.length; i++) {
const r = s[i];
this.container.style.setProperty(r, o[r]);
}
e && this.refresh();
}, ee = function(t) {
const n = t.parentElement.parentElement.lastElementChild;
n?.tagName === "svg" && n?.remove();
};
function ne(t) {
return {
nodeData: t.isFocusMode ? t.nodeDataBackup : t.nodeData,
arrows: t.arrows,
summaries: t.summaries,
direction: t.direction,
theme: t.theme
};
}
const oe = function(t) {
const e = this.container, n = t.getBoundingClientRect(), o = e.getBoundingClientRect();
if (n.top > o.bottom || n.bottom < o.top || n.left > o.right || n.right < o.left) {
const i = n.left + n.width / 2, r = n.top + n.height / 2, c = o.left + o.width / 2, a = o.top + o.height / 2, h = i - c, f = r - a;
this.move(-h, -f, !0);
}
}, se = function(t, e, n) {
this.clearSelection(), this.scrollIntoView(t), this.selection.select(t), e && this.bus.fire("selectNewNode", t.nodeObj);
}, ie = function(t) {
this.selection.select(t);
}, re = function(t) {
this.selection.deselect(t);
}, ce = function() {
this.unselectNodes(this.currentNodes), this.unselectSummary(), this.unselectArrow();
}, le = function() {
const t = ne(this);
return JSON.stringify(t, (e, n) => {
if (!(e === "parent" && typeof n != "string"))
return n;
});
}, ae = function() {
return JSON.parse(this.getDataString());
}, he = function() {
this.editable = !0;
}, de = function() {
this.editable = !1;
}, fe = function(t, e = { x: 0, y: 0 }) {
if (t < this.scaleMin || t > this.scaleMax) return;
const n = this.container.getBoundingClientRect(), o = e.x ? e.x - n.left - n.width / 2 : 0, s = e.y ? e.y - n.top - n.height / 2 : 0, { dx: i, dy: r } = kt(this), c = this.map.style.transform, { x: a, y: h } = yt(c), f = a - i, p = h - r, m = this.scaleVal, w = (-o + f) * (1 - t / m), g = (-s + p) * (1 - t / m);
this.map.style.transform = `translate(${a - w}px, ${h - g}px) scale(${t})`, this.scaleVal = t, this.bus.fire("scale", t);
}, pe = function() {
const t = this.nodes.offsetHeight / this.container.offsetHeight, e = this.nodes.offsetWidth / this.container.offsetWidth, n = 1 / Math.max(1, Math.max(t, e));
this.scaleVal = n, this.map.style.transform = "scale(" + n + ")", this.bus.fire("scale", n);
}, ue = function(t, e, n = !1) {
const { map: o, scaleVal: s, bus: i } = this, r = o.style.transform;
let { x: c, y: a } = yt(r);
c += t, a += e, n && (o.style.transition = "transform 0.3s", setTimeout(() => {
o.style.transition = "none";
}, 300)), o.style.transform = `translate(${c}px, ${a}px) scale(${s})`, i.fire("move", { dx: t, dy: e });
}, kt = (t) => {
const { container: e, map: n, nodes: o } = t, s = n.querySelector("me-root"), i = s.offsetTop, r = s.offsetLeft, c = s.offsetWidth, a = s.offsetHeight;
let h, f;
return t.alignment === "root" ? (h = e.offsetWidth / 2 - r - c / 2, f = e.offsetHeight / 2 - i - a / 2, n.style.transformOrigin = `${r + c / 2}px 50%`) : (h = (e.offsetWidth - o.offsetWidth) / 2, f = (e.offsetHeight - o.offsetHeight) / 2, n.style.transformOrigin = "50% 50%"), { dx: h, dy: f };
}, ge = function() {
const { map: t, container: e } = this, { dx: n, dy: o } = kt(this);
e.scrollTop = 0, e.scrollLeft = 0, t.style.transform = `translate(${n}px, ${o}px) scale(${this.scaleVal})`;
}, me = function(t) {
t(this);
}, ye = function(t) {
t.nodeObj.parent && (this.clearSelection(), this.tempDirection === null && (this.tempDirection = this.direction), this.isFocusMode || (this.nodeDataBackup = this.nodeData, this.isFocusMode = !0), this.nodeData = t.nodeObj, this.initRight(), this.toCenter());
}, we = function() {
this.isFocusMode = !1, this.tempDirection !== null && (this.nodeData = this.nodeDataBackup, this.direction = this.tempDirection, this.tempDirection = null, this.refresh(), this.toCenter());
}, be = function() {
this.direction = 0, this.refresh(), this.toCenter(), this.bus.fire("changeDirection", this.direction);
}, ve = function() {
this.direction = 1, this.refresh(), this.toCenter(), this.bus.fire("changeDirection", this.direction);
}, xe = function() {
this.direction = 2, this.refresh(), this.toCenter(), this.bus.fire("changeDirection", this.direction);
}, Ce = function(t) {
this.locale = t, this.refresh();
}, Se = function(t, e) {
const n = t.nodeObj;
typeof e == "boolean" ? n.expanded = e : n.expanded !== !1 ? n.expanded = !1 : n.expanded = !0;
const o = t.getBoundingClientRect(), s = {
x: o.left,
y: o.top
}, i = t.parentNode, r = i.children[1];
if (r.expanded = n.expanded, r.className = n.expanded ? "minus" : "", ee(t), n.expanded) {
const p = this.createChildren(
n.children.map((m) => this.createWrapper(m).grp)
);
i.parentNode.appendChild(p);
} else
i.parentNode.children[1].remove();
this.linkDiv(t.closest("me-main > me-wrapper"));
const c = t.getBoundingClientRect(), a = {
x: c.left,
y: c.top
}, h = s.x - a.x, f = s.y - a.y;
this.move(h, f), this.bus.fire("expandNode", n);
}, Ee = function(t, e) {
const n = t.nodeObj, o = t.getBoundingClientRect(), s = {
x: o.left,
y: o.top
};
mt(n, e ?? !n.expanded), this.refresh();
const i = this.findEle(n.id).getBoundingClientRect(), r = {
x: i.left,
y: i.top
}, c = s.x - r.x, a = s.y - r.y;
this.move(c, a);
}, ke = function(t) {
this.clearSelection(), t && (t = JSON.parse(JSON.stringify(t)), this.nodeData = t.nodeData, this.arrows = t.arrows || [], this.summaries = t.summaries || [], t.theme && this.changeTheme(t.theme)), st(this.nodeData), this.layout(), this.linkDiv();
}, Le = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
cancelFocus: we,
clearSelection: ce,
disableEdit: de,
enableEdit: he,
expandNode: Se,
expandNodeAll: Ee,
focusNode: ye,
getData: ae,
getDataString: le,
initLeft: be,
initRight: ve,
initSide: xe,
install: me,
move: ue,
refresh: ke,
scale: fe,
scaleFit: pe,
scrollIntoView: oe,
selectNode: se,
selectNodes: ie,
setLocale: Ce,
toCenter: ge,
unselectNodes: re
}, Symbol.toStringTag, { value: "Module" })), Te = function(t) {
return {
dom: t,
moved: !1,
// differentiate click and move
pointerdown: !1,
lastX: 0,
lastY: 0,
handlePointerMove(e) {
if (this.pointerdown) {
this.moved = !0;
const n = e.clientX - this.lastX, o = e.clientY - this.lastY;
this.lastX = e.clientX, this.lastY = e.clientY, this.cb && this.cb(n, o);
}
},
handlePointerDown(e) {
e.button === 0 && (this.pointerdown = !0, this.lastX = e.clientX, this.lastY = e.clientY, this.dom.setPointerCapture(e.pointerId));
},
handleClear(e) {
this.pointerdown = !1, e.pointerId !== void 0 && this.dom.releasePointerCapture(e.pointerId);
},
cb: null,
init(e, n) {
this.cb = n, this.handleClear = this.handleClear.bind(this), this.handlePointerMove = this.handlePointerMove.bind(this), this.handlePointerDown = this.handlePointerDown.bind(this), this.destroy = wt([
{ dom: e, evt: "pointermove", func: this.handlePointerMove },
{ dom: e, evt: "pointerleave", func: this.handleClear },
{ dom: e, evt: "pointerup", func: this.handleClear },
{ dom: this.dom, evt: "pointerdown", func: this.handlePointerDown }
]);
},
destroy: null,
clear() {
this.moved = !1, this.pointerdown = !1;
}
};
}, pt = {
create: Te
}, $e = "#4dc4ff";
function Lt(t, e, n, o, s, i, r, c) {
return {
x: t / 8 + n * 3 / 8 + s * 3 / 8 + r / 8,
y: e / 8 + o * 3 / 8 + i * 3 / 8 + c / 8
};
}
function De(t, e, n) {
t && (t.dataset.x = e.toString(), t.dataset.y = n.toString(), Q(t));
}
function j(t, e, n, o, s) {
E(t, {
x1: e + "",
y1: n + "",
x2: o + "",
y2: s + ""
});
}
function ut(t, e, n, o, s, i, r, c, a, h) {
const f = `M ${e} ${n} C ${o} ${s} ${i} ${r} ${c} ${a}`;
if (t.line.setAttribute("d", f), h.style) {
const u = h.style;
u.stroke && t.line.setAttribute("stroke", u.stroke), u.strokeWidth && t.line.setAttribute("stroke-width", String(u.strokeWidth)), u.strokeDasharray && t.line.setAttribute("stroke-dasharray", u.strokeDasharray), u.strokeLinecap && t.line.setAttribute("stroke-linecap", u.strokeLinecap), u.opacity !== void 0 && t.line.setAttribute("opacity", String(u.opacity));
}
const p = t.querySelectorAll('path[stroke="transparent"]');
p.length > 0 && p[0].setAttribute("d", f);
const m = U(i, r, c, a);
if (m) {
const u = `M ${m.x1} ${m.y1} L ${c} ${a} L ${m.x2} ${m.y2}`;
if (t.arrow1.setAttribute("d", u), p.length > 1 && p[1].setAttribute("d", u), h.style) {
const l = h.style;
l.stroke && t.arrow1.setAttribute("stroke", l.stroke), l.strokeWidth && t.arrow1.setAttribute("stroke-width", String(l.strokeWidth)), l.strokeLinecap && t.arrow1.setAttribute("stroke-linecap", l.strokeLinecap), l.opacity !== void 0 && t.arrow1.setAttribute("opacity", String(l.opacity));
}
}
if (h.bidirectional) {
const u = U(o, s, e, n);
if (u) {
const l = `M ${u.x1} ${u.y1} L ${e} ${n} L ${u.x2} ${u.y2}`;
if (t.arrow2.setAttribute("d", l), p.length > 2 && p[2].setAttribute("d", l), h.style) {
const d = h.style;
d.stroke && t.arrow2.setAttribute("stroke", d.stroke), d.strokeWidth && t.arrow2.setAttribute("stroke-width", String(d.strokeWidth)), d.strokeLinecap && t.arrow2.setAttribute("stroke-linecap", d.strokeLinecap), d.opacity !== void 0 && t.arrow2.setAttribute("opacity", String(d.opacity));
}
}
}
const { x: w, y: g } = Lt(e, n, o, s, i, r, c, a);
if (t.labelEl && De(t.labelEl, w, g), h.style?.labelColor) {
const u = t.labelEl;
u && (u.style.color = h.style.labelColor);
}
We(t);
}
function J(t, e, n) {
const { offsetLeft: o, offsetTop: s } = A(t.nodes, e), i = e.offsetWidth, r = e.offsetHeight, c = o + i / 2, a = s + r / 2, h = c + n.x, f = a + n.y;
return {
w: i,
h: r,
cx: c,
cy: a,
ctrlX: h,
ctrlY: f
};
}
function H(t) {
let e, n;
const o = (t.cy - t.ctrlY) / (t.ctrlX - t.cx);
return o > t.h / t.w || o < -t.h / t.w ? t.cy - t.ctrlY < 0 ? (e = t.cx - t.h / 2 / o, n = t.cy + t.h / 2) : (e = t.cx + t.h / 2 / o, n = t.cy - t.h / 2) : t.cx - t.ctrlX < 0 ? (e = t.cx + t.w / 2, n = t.cy - t.w * o / 2) : (e = t.cx - t.w / 2, n = t.cy + t.w * o / 2), {
x: e,
y: n
};
}
const it = function(t, e, n, o, s) {
if (!e || !n)
return;
const i = J(t, e, o.delta1), r = J(t, n, o.delta2), { x: c, y: a } = H(i), { ctrlX: h, ctrlY: f } = i, { ctrlX: p, ctrlY: m } = r, { x: w, y: g } = H(r), u = U(p, m, w, g);
if (!u) return;
const l = `M ${u.x1} ${u.y1} L ${w} ${g} L ${u.x2} ${u.y2}`;
let d = "";
if (o.bidirectional) {
const $ = U(h, f, c, a);
if (!$) return;
d = `M ${$.x1} ${$.y1} L ${c} ${a} L ${$.x2} ${$.y2}`;
}
const y = Vt(`M ${c} ${a} C ${h} ${f} ${p} ${m} ${w} ${g}`, l, d, o.style), { x: v, y: C } = Lt(c, a, h, f, p, m, w, g), b = o.style?.labelColor || "rgb(235, 95, 82)", S = "arrow-" + o.id;
y.id = S;
const x = t.markdown ? t.markdown(o.label, o) : o.label, k = et(x, v, C, {
anchor: "middle",
color: b,
dataType: "arrow",
svgId: S
});
y.labelEl = k, y.arrowObj = o, y.dataset.linkid = o.id, t.labelContainer.appendChild(k), t.linkSvgGroup.appendChild(y), Q(k), s || (t.arrows.push(o), t.currentArrow = y, Tt(t, o, i, r));
}, Ae = function(t, e, n = {}) {
const o = {
id: z(),
label: "Custom Link",
from: t.nodeObj.id,
to: e.nodeObj.id,
delta1: {
x: t.offsetWidth / 2 + 100,
y: 0
},
delta2: {
x: e.offsetWidth / 2 + 100,
y: 0
},
...n
};
it(this, t, e, o), this.bus.fire("operation", {
name: "createArrow",
obj: o
});
}, Ne = function(t) {
Z(this);
const e = { ...t, id: z() };
it(this, this.findEle(e.from), this.findEle(e.to), e), this.bus.fire("operation", {
name: "createArrow",
obj: e
});
}, Me = function(t) {
let e;
if (t ? e = t : e = this.currentArrow, !e) return;
Z(this);
const n = e.arrowObj.id;
this.arrows = this.arrows.filter((o) => o.id !== n), e.labelEl?.remove(), e.remove(), this.bus.fire("operation", {
name: "removeArrow",
obj: {
id: n
}
});
}, Pe = function(t) {
this.currentArrow = t;
const e = t.arrowObj, n = this.findEle(e.from), o = this.findEle(e.to), s = J(this, n, e.delta1), i = J(this, o, e.delta2);
Tt(this, e, s, i);
}, He = function() {
Z(this), this.currentArrow = null;
}, tt = function(t, e) {
const n = document.createElementNS(D, "path");
return E(n, {
d: t,
stroke: e,
fill: "none",
"stroke-width": "6",
"stroke-linecap": "round",
"stroke-linejoin": "round"
}), n;
}, Be = function(t, e) {
const n = document.createElementNS(D, "g");
n.setAttribute("class", "arrow-highlight"), n.setAttribute("opacity", "0.45");
const o = tt(t.line.getAttribute("d"), e);
n.appendChild(o);
const s = tt(t.arrow1.getAttribute("d"), e);
if (n.appendChild(s), t.arrow2.getAttribute("d")) {
const i = tt(t.arrow2.getAttribute("d"), e);
n.appendChild(i);
}
t.insertBefore(n, t.firstChild);
}, Ie = function(t) {
const e = t.querySelector(".arrow-highlight");
e && e.remove();
}, We = function(t) {
const e = t.querySelector(".arrow-highlight");
if (!e) return;
const n = e.querySelectorAll("path");
n.length >= 1 && n[0].setAttribute("d", t.line.getAttribute("d")), n.length >= 2 && n[1].setAttribute("d", t.arrow1.getAttribute("d")), n.length >= 3 && t.arrow2.getAttribute("d") && n[2].setAttribute("d", t.arrow2.getAttribute("d"));
}, Z = function(t) {
t.helper1?.destroy(), t.helper2?.destroy(), t.linkController.style.display = "none", t.P2.style.display = "none", t.P3.style.display = "none", t.currentArrow && Ie(t.currentArrow);
}, Tt = function(t, e, n, o) {
const { linkController: s, P2: i, P3: r, line1: c, line2: a, nodes: h, map: f, currentArrow: p, bus: m } = t;
if (!p) return;
s.style.display = "initial", i.style.display = "initial", r.style.display = "initial", h.appendChild(s), h.appendChild(i), h.appendChild(r), Be(p, $e);
let { x: w, y: g } = H(n), { ctrlX: u, ctrlY: l } = n, { ctrlX: d, ctrlY: y } = o, { x: v, y: C } = H(o);
i.style.cssText = `top:${l}px;left:${u}px;`, r.style.cssText = `top:${y}px;left:${d}px;`, j(c, w, g, u, l), j(a, d, y, v, C), t.helper1 = pt.create(i), t.helper2 = pt.create(r), t.helper1.init(f, (b, S) => {
u = u + b / t.scaleVal, l = l + S / t.scaleVal;
const x = H({ ...n, ctrlX: u, ctrlY: l });
w = x.x, g = x.y, i.style.top = l + "px", i.style.left = u + "px", ut(p, w, g, u, l, d, y, v, C, e), j(c, w, g, u, l), e.delta1.x = u - n.cx, e.delta1.y = l - n.cy, m.fire("updateArrowDelta", e);
}), t.helper2.init(f, (b, S) => {
d = d + b / t.scaleVal, y = y + S / t.scaleVal;
const x = H({ ...o, ctrlX: d, ctrlY: y });
v = x.x, C = x.y, r.style.top = y + "px", r.style.left = d + "px", ut(p, w, g, u, l, d, y, v, C, e), j(a, d, y, v, C), e.delta2.x = d - o.cx, e.delta2.y = y - o.cy, m.fire("updateArrowDelta", e);
});
};
function Oe() {
this.linkSvgGroup.innerHTML = "", this.labelContainer.querySelectorAll('.svg-label[data-type="arrow"]').forEach((e) => e.remove());
for (let e = 0; e < this.arrows.length; e++) {
const n = this.arrows[e];
try {
it(this, this.findEle(n.from), this.findEle(n.to), n, !0);
} catch {
}
}
this.nodes.appendChild(this.linkSvgGroup);
}
function Ge(t) {
Z(this), t && t.labelEl && St(this, t.labelEl, t.arrowObj);
}
function Fe() {
this.arrows = this.arrows.filter((t) => _(t.from, this.nodeData) && _(t.to, this.nodeData));
}
const Ve = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
createArrow: Ae,
createArrowFrom: Ne,
editArrowLabel: Ge,
removeArrow: Me,
renderArrow: Oe,
selectArrow: Pe,
tidyArrow: Fe,
unselectArrow: He
}, Symbol.toStringTag, { value: "Module" })), ze = function(t) {
if (t.length === 0) throw new Error("No selected node.");
if (t.length === 1) {
const a = t[0].nodeObj, h = t[0].nodeObj.parent;
if (!h) throw new Error("Can not select root node.");
const f = h.children.findIndex((p) => a === p);
return {
parent: h.id,
start: f,
end: f
};
}
let e = 0;
const n = t.map((a) => {
let h = a.nodeObj;
const f = [];
for (; h.parent; ) {
const p = h.parent, w = p.children?.indexOf(h);
h = p, f.unshift({ node: h, index: w });
}
return f.length > e && (e = f.length), f;
});
let o = 0;
t: for (; o < e; o++) {
const a = n[0][o]?.node;
for (let h = 1; h < n.length; h++)
if (n[h][o]?.node !== a)
break t;
}
if (!o) throw new Error("Can not select root node.");
const s = n.map((a) => a[o - 1].index).sort(), i = s[0] || 0, r = s[s.length - 1] || 0, c = n[0][o - 1].node;
if (!c.parent) throw new Error("Please select nodes in the same main topic.");
return {
parent: c.id,
start: i,
end: r
};
}, Re = function(t) {
const e = document.createElementNS(D, "g");
return e.setAttribute("id", t), e;
}, gt = function(t, e) {
const n = document.createElementNS(D, "path");
return E(n, {
d: t,
stroke: e || "#666",
fill: "none",
"stroke-linecap": "round",
"stroke-width": "2"
}), n;
}, Ye = (t) => t.parentElement.parentElement, je = function(t, { parent: e, start: n }) {
const o = t.findEle(e), s = o.nodeObj;
let i;
return s.parent ? i = o.closest("me-main").className : i = t.findEle(s.children[n].id).closest("me-main").className, i;
}, rt = function(t, e) {
const { id: n, label: o, parent: s, start: i, end: r, style: c } = e, { nodes: a, theme: h, summarySvg: f } = t, m = t.findEle(s).nodeObj, w = je(t, e);
let g = 1 / 0, u = 0, l = 0, d = 0;
for (let F = i; F <= r; F++) {
const ct = m.children?.[F];
if (!ct)
return t.removeSummary(n), null;
const R = Ye(t.findEle(ct.id)), { offsetLeft: Y, offsetTop: lt } = A(a, R), at = i === r ? 10 : 20;
F === i && (l = lt + at), F === r && (d = lt + R.offsetHeight - at), Y < g && (g = Y), R.offsetWidth + Y > u && (u = R.offsetWidth + Y);
}
let y, v;
const C = m.parent ? 10 : 0, b = l + C, S = d + C, x = (b + S) / 2, k = c?.stroke || h.cssVar["--color"], $ = c?.labelColor || h.cssVar["--color"], W = "s-" + n, O = t.markdown ? t.markdown(o, e) : o;
w === I.LHS ? (y = gt(`M ${g + 10} ${b} c -5 0 -10 5 -10 10 L ${g} ${S - 10} c 0 5 5 10 10 10 M ${g} ${x} h -10`, k), v = et(O, g - 20, x, { anchor: "end", color: $, dataType: "summary", svgId: W })) : (y = gt(`M ${u - 10} ${b} c 5 0 10 5 10 10 L ${u} ${S - 10} c 0 5 -5 10 -10 10 M ${u} ${x} h 10`, k), v = et(O, u + 20, x, { anchor: "start", color: $, dataType: "summary", svgId: W }));
const G = Re(W);
return G.appendChild(y), t.labelContainer.appendChild(v), Q(v), G.summaryObj = e, G.labelEl = v, f.appendChild(G), G;
}, Xe = function(t = {}) {
if (!this.currentNodes) return;
const { currentNodes: e, summaries: n, bus: o } = this, { parent: s, start: i, end: r } = ze(e), c = { id: z(), parent: s, start: i, end: r, label: "summary", style: t.style }, a = rt(this, c);
n.push(c), this.editSummary(a), o.fire("operation", {
name: "createSummary",
obj: c
});
}, qe = function(t) {
const e = z(), n = { ...t, id: e };
rt(this, n), this.summaries.push(n), this.bus.fire("operation", {
name: "createSummary",
obj: n
});
}, _e = function(t) {
const e = this.summaries.findIndex((n) => n.id === t);
e > -1 && (this.summaries.splice(e, 1), this.nodes.querySelector("#s-" + t)?.remove(), this.nodes.querySelector("#label-s-" + t)?.remove()), this.bus.fire("operation", {
name: "removeSummary",
obj: { id: t }
});
}, Ue = function(t) {
const e = t.labelEl;
e && e.classList.add("selected"), this.currentSummary = t;
}, Ke = function() {
this.currentSummary?.labelEl?.classList.remove("selected"), this.currentSummary = null;
}, Je = function() {
this.summarySvg.innerHTML = "", this.summaries.forEach((t) => {
try {
rt(this, t);
} catch {
}
}), this.nodes.insertAdjacentElement("beforeend", this.summarySvg);
}, Qe = function(t) {
t && t.labelEl && St(this, t.labelEl, t.summaryObj);
}, Ze = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
createSummary: Xe,
createSummaryFrom: qe,
editSummary: Qe,
removeSummary: _e,
renderSummary: Je,