@alekstar79/context-menu 2.1.0 → 2.1.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/lib/context-menu.js +41 -29
- package/lib/context-menu.js.map +1 -1
- package/lib/menu/builder.d.ts +2 -1
- package/lib/menu/manager.d.ts +1 -0
- package/package.json +1 -1
package/lib/context-menu.js
CHANGED
|
@@ -179,7 +179,7 @@ function P(o, t, e, s, i = b.linear, n) {
|
|
|
179
179
|
if (a) return;
|
|
180
180
|
const p = h - r, u = Math.min(p / s, 1), d = i(u);
|
|
181
181
|
if (Array.isArray(o) && Array.isArray(t)) {
|
|
182
|
-
const m = o.map((
|
|
182
|
+
const m = o.map((y, w) => y + (t[w] - y) * d);
|
|
183
183
|
e(m);
|
|
184
184
|
} else {
|
|
185
185
|
const m = o + (t - o) * d;
|
|
@@ -406,7 +406,7 @@ function X(o) {
|
|
|
406
406
|
i.appendChild(s.firstChild);
|
|
407
407
|
return new j(i);
|
|
408
408
|
}
|
|
409
|
-
const Q = (o, t, e) => o > e ? e : o < t ? t : o,
|
|
409
|
+
const Q = (o, t, e) => o > e ? e : o < t ? t : o, I = /* @__PURE__ */ new WeakMap(), E = /* @__PURE__ */ new WeakMap();
|
|
410
410
|
function M(o, t, e, s) {
|
|
411
411
|
return s = (s - 90) * Math.PI / 180, {
|
|
412
412
|
x: o + e * Math.cos(s),
|
|
@@ -417,7 +417,7 @@ function S(o, t, e, s, i, n, r) {
|
|
|
417
417
|
const a = M(o, t, e, s %= 360), c = M(o, t, e, i %= 360);
|
|
418
418
|
return `${n ? "L" : "M"}${a.x} ${a.y} A${e} ${e}, 0, ${i - s >= 180 ? 1 : 0}, ${r ? 0 : 1}, ${c.x} ${c.y}`;
|
|
419
419
|
}
|
|
420
|
-
function
|
|
420
|
+
function L(o, t, e, s, i, n) {
|
|
421
421
|
return `${S(o, t, e, i, n, !1, !1)} ${S(o, t, s, n, i, !0, !0)}Z`;
|
|
422
422
|
}
|
|
423
423
|
class Z {
|
|
@@ -455,14 +455,23 @@ class Z {
|
|
|
455
455
|
async init() {
|
|
456
456
|
await this.loadIcons(), this.updateButtons();
|
|
457
457
|
}
|
|
458
|
-
async loadIcons() {
|
|
459
|
-
if (!this.icons)
|
|
458
|
+
async loadIcons(t) {
|
|
459
|
+
if (!this.icons) {
|
|
460
|
+
t ||= this.config.sprite;
|
|
460
461
|
try {
|
|
461
|
-
const
|
|
462
|
-
|
|
463
|
-
} catch (
|
|
464
|
-
console.error("Failed to load icons:",
|
|
462
|
+
const e = await fetch(t);
|
|
463
|
+
e.ok && this.setIcons(await e.text());
|
|
464
|
+
} catch (e) {
|
|
465
|
+
console.error("Failed to load icons:", e);
|
|
465
466
|
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
setIcons(t) {
|
|
470
|
+
try {
|
|
471
|
+
this.icons = X(t);
|
|
472
|
+
} catch (e) {
|
|
473
|
+
console.error("Failed to parse icons:", e);
|
|
474
|
+
}
|
|
466
475
|
}
|
|
467
476
|
updateButtons() {
|
|
468
477
|
if (!(!this.icons || !this.container) && (this.container.clear(), this.config.sectors.forEach((t) => {
|
|
@@ -478,7 +487,7 @@ class Z {
|
|
|
478
487
|
}
|
|
479
488
|
createSector() {
|
|
480
489
|
const t = this.config.color ?? "#1976D2";
|
|
481
|
-
return this.area.path(
|
|
490
|
+
return this.area.path(L(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle)).attr({ fill: t, stroke: t, opacity: this.config.opacity }).addClass("radial-sector");
|
|
482
491
|
}
|
|
483
492
|
createButton(t, e, s, i) {
|
|
484
493
|
const n = this.area.g(e, s, i);
|
|
@@ -518,9 +527,9 @@ class Z {
|
|
|
518
527
|
const v = i.height * 0.75;
|
|
519
528
|
c = this.config.outerRadius + v;
|
|
520
529
|
}
|
|
521
|
-
const p = r / c * 180 / Math.PI, u = this.angle / 2, d = u - p / 2, m = u + p / 2,
|
|
530
|
+
const p = r / c * 180 / Math.PI, u = this.angle / 2, d = u - p / 2, m = u + p / 2, y = S(this.c, this.c, c, d, m, !1, !1);
|
|
522
531
|
if (s !== void 0) {
|
|
523
|
-
const v = this.config.color ?? "#1976D2", g = this.area.path(
|
|
532
|
+
const v = this.config.color ?? "#1976D2", g = this.area.path(y).attr({
|
|
524
533
|
stroke: v,
|
|
525
534
|
"stroke-width": `${l}`,
|
|
526
535
|
"stroke-linecap": "round",
|
|
@@ -529,11 +538,11 @@ class Z {
|
|
|
529
538
|
}).addClass("radial-hint-bg");
|
|
530
539
|
g.node.style.opacity = "0", e.add(g);
|
|
531
540
|
}
|
|
532
|
-
const
|
|
541
|
+
const w = this.area.text(0, 0, n).addClass("radial-hint").attr({
|
|
533
542
|
fill: this.theme === "light" ? "#333333" : "#7a7a7a",
|
|
534
|
-
textpath:
|
|
535
|
-
}), f =
|
|
536
|
-
return f && (f.attr("dominant-baseline", "central"), f.attr("startOffset", "50%")), e.add(
|
|
543
|
+
textpath: y
|
|
544
|
+
}), f = w.select("textPath");
|
|
545
|
+
return f && (f.attr("dominant-baseline", "central"), f.attr("startOffset", "50%")), e.add(w), I.set(e, {
|
|
537
546
|
sectorMidAngle: u,
|
|
538
547
|
baseRadius: c,
|
|
539
548
|
textLength: r
|
|
@@ -603,13 +612,13 @@ class Z {
|
|
|
603
612
|
}).addClass("radial-hint-bg");
|
|
604
613
|
g.node.style.opacity = "0", s.add(g);
|
|
605
614
|
}
|
|
606
|
-
const
|
|
615
|
+
const y = this.area.text(0, 0, r).addClass("radial-hint central-hint").attr({
|
|
607
616
|
fill: this.theme === "light" ? "#333333" : "#7a7a7a",
|
|
608
617
|
textpath: m
|
|
609
|
-
}),
|
|
610
|
-
|
|
611
|
-
const f =
|
|
612
|
-
return f.dataset.hintOffset = a.toString(), f.dataset.startAngle = p.toString(), f.dataset.endAngle = u.toString(), f.dataset.alter = d ? "true" : "false", f.dataset.centerX = this.c.toString(), f.dataset.centerY = this.c.toString(), s.add(
|
|
618
|
+
}), w = y.select("textPath");
|
|
619
|
+
w && (w.attr("dominant-baseline", "central"), w.attr("startOffset", "50%"));
|
|
620
|
+
const f = y.node;
|
|
621
|
+
return f.dataset.hintOffset = a.toString(), f.dataset.startAngle = p.toString(), f.dataset.endAngle = u.toString(), f.dataset.alter = d ? "true" : "false", f.dataset.centerX = this.c.toString(), f.dataset.centerY = this.c.toString(), s.add(y), s;
|
|
613
622
|
}
|
|
614
623
|
show(t) {
|
|
615
624
|
this.element.classList.remove("hidden");
|
|
@@ -639,17 +648,17 @@ class Z {
|
|
|
639
648
|
});
|
|
640
649
|
}
|
|
641
650
|
animateButtonHover(t, e, s, i, n, r) {
|
|
642
|
-
const a = t.select(".radial-icon"), c = a ? E.get(a) : void 0, l = t.select(".hint-group"), h = l ?
|
|
651
|
+
const a = t.select(".radial-icon"), c = a ? E.get(a) : void 0, l = t.select(".hint-group"), h = l ? I.get(l) : void 0;
|
|
643
652
|
this.animate(t, 1, e, s, i, n, (p) => {
|
|
644
653
|
const u = p * 10;
|
|
645
654
|
if (t.select(".radial-sector")?.attr({
|
|
646
|
-
d:
|
|
655
|
+
d: L(this.c, this.c, this.config.outerRadius - u, this.config.innerRadius, 0, this.angle)
|
|
647
656
|
}), a && c) {
|
|
648
|
-
const d = c.midRadius - u, m = c.scale * (1 - p * 0.1),
|
|
649
|
-
f.translate(
|
|
657
|
+
const d = c.midRadius - u, m = c.scale * (1 - p * 0.1), y = this.angle / 2, w = M(this.c, this.c, d, y), f = new C();
|
|
658
|
+
f.translate(w.x, w.y), f.scale(m), f.rotate(c.rotation, 0, 0), f.translate(-c.bbox.cx, -c.bbox.cy), a.transform(f);
|
|
650
659
|
}
|
|
651
660
|
if (h && l) {
|
|
652
|
-
const d = h.baseRadius - u, m = h.textLength / d * 180 / Math.PI,
|
|
661
|
+
const d = h.baseRadius - u, m = h.textLength / d * 180 / Math.PI, y = h.sectorMidAngle - m / 2, w = h.sectorMidAngle + m / 2, f = S(this.c, this.c, d, y, w, !1, !1), v = l.select(".radial-hint");
|
|
653
662
|
v && v.attr("textpath", f);
|
|
654
663
|
const g = l.select(".radial-hint-bg");
|
|
655
664
|
g && g.attr("d", f);
|
|
@@ -660,14 +669,14 @@ class Z {
|
|
|
660
669
|
const s = t.select(".central-sector"), i = t.select(".central-icon"), n = t.select(".central-hint"), r = t.select(".radial-hint-bg");
|
|
661
670
|
if (!s || !i) return;
|
|
662
671
|
const a = parseFloat(s.node.dataset.initialRadius || "30"), c = parseFloat(s.attr("r")), l = e ? a - 8 : a, h = i ? E.get(i) : void 0;
|
|
663
|
-
let p = 12, u = 0, d = 0, m = this.c,
|
|
664
|
-
n && (p = parseFloat(n.node.dataset.hintOffset || "12"), u = parseFloat(n.node.dataset.startAngle || "0"), d = parseFloat(n.node.dataset.endAngle || "0"), m = parseFloat(n.node.dataset.centerX || this.c.toString()),
|
|
672
|
+
let p = 12, u = 0, d = 0, m = this.c, y = this.c, w = !1;
|
|
673
|
+
n && (p = parseFloat(n.node.dataset.hintOffset || "12"), u = parseFloat(n.node.dataset.startAngle || "0"), d = parseFloat(n.node.dataset.endAngle || "0"), m = parseFloat(n.node.dataset.centerX || this.c.toString()), y = parseFloat(n.node.dataset.centerY || this.c.toString()), w = n.node.dataset.alter === "true"), P(c, l, (f) => {
|
|
665
674
|
if (s.attr("r", f), i && h) {
|
|
666
675
|
const v = h.scale * (f / a), g = new C();
|
|
667
676
|
g.translate(this.c, this.c), g.scale(v), g.translate(-h.bbox.cx, -h.bbox.cy), i.transform(g);
|
|
668
677
|
}
|
|
669
678
|
if (n) {
|
|
670
|
-
const v = f + p, g = S(m,
|
|
679
|
+
const v = f + p, g = S(m, y, v, u, d, !1, w);
|
|
671
680
|
n.attr({ textpath: g }), r && r.attr({ d: g });
|
|
672
681
|
}
|
|
673
682
|
}, 200, b.easeinout);
|
|
@@ -693,6 +702,9 @@ class U {
|
|
|
693
702
|
constructor(t, e) {
|
|
694
703
|
this.menu = new Z(e), q(t) ? t.then((s) => s.appendChild(this.menu.element)) : t.appendChild(this.menu.element), e.autoBindContextMenu !== !1 && this.bindEvents();
|
|
695
704
|
}
|
|
705
|
+
setIcons(t) {
|
|
706
|
+
this.menu.setIcons(t);
|
|
707
|
+
}
|
|
696
708
|
bindEvents(t = window) {
|
|
697
709
|
t.addEventListener("contextmenu", (e) => {
|
|
698
710
|
e.preventDefault(), this.toggle(e);
|
package/lib/context-menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/index.ts","../src/core/transform.ts","../src/core/matrix.ts","../src/core/easing.ts","../src/core/animate.ts","../src/core/svg.ts","../src/core/parse.ts","../src/menu/builder.ts","../src/menu/manager.ts"],"sourcesContent":["export interface ICentralButton {\n icon: string;\n hint?: string;\n onclick?: () => void;\n iconRadius?: number;\n iconScale?: number;\n hintPosition?: 'top' | 'bottom';\n hintSpan?: number;\n hintDistance?: number;\n hintOffset?: number;\n hintStartAngle?: number;\n hintEndAngle?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface ISector {\n icon: string;\n hint: string;\n onclick?: () => void;\n rotate?: number;\n iconScale?: number;\n iconRadius?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface IConfig {\n sectors: ISector[];\n sprite: string;\n innerRadius: number;\n outerRadius: number;\n opacity: number;\n iconScale?: number;\n iconRadius?: number;\n color?: string;\n hintPadding?: number;\n centralButton?: ICentralButton;\n autoBindContextMenu?: boolean;\n zIndex?: number;\n}\n\nconst defaultConfig: IConfig = {\n sectors: [],\n sprite: '../icons.svg',\n innerRadius: 50,\n outerRadius: 150,\n opacity: 0.7,\n}\n\nexport function defineConfig(options: Partial<IConfig>): IConfig\n{\n return { ...defaultConfig, ...options }\n}\n","interface FontMetrics {\n ascent: number\n descent: number\n height: number\n}\n\nconst cache = new Map<string, FontMetrics>()\n\n/**\n * Gets font metrics via Canvas.\n * @param font - font string in CSS format (e.g. 'bold 12px sans-serif')\n */\nfunction getFontMetrics(font: string): FontMetrics {\n if (cache.has(font)) {\n return cache.get(font)!\n }\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n const fallback = { ascent: 9, descent: 3, height: 12 }\n cache.set(font, fallback)\n return fallback\n }\n\n ctx.font = font\n const metrics = ctx.measureText('A')\n const ascent = metrics.actualBoundingBoxAscent ?? 9\n const descent = metrics.actualBoundingBoxDescent ?? 3\n const height = ascent + descent\n\n const result = { ascent, descent, height }\n cache.set(font, result)\n\n return result\n}\n\nlet hintFontMetrics: FontMetrics | null = null\n\n/**\n * Returns the metrics of the font used for hints (class .radial-hint).\n * Measures once and caches the result.\n */\nexport function getHintFontMetrics(): FontMetrics {\n if (hintFontMetrics) return hintFontMetrics\n\n // Creating a temporary element to get real CSS styles\n const div = document.createElement('div')\n\n div.className = 'radial-hint'\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.pointerEvents = 'none'\n div.textContent = 'A'\n\n document.body.appendChild(div)\n\n const styles = window.getComputedStyle(div)\n const font = `${styles.fontWeight} ${styles.fontSize} ${styles.fontFamily}`\n\n document.body.removeChild(div)\n\n const metrics = getFontMetrics(font)\n hintFontMetrics = metrics\n\n return metrics\n}\n\n/**\n * Measures the length of text rendered on a straight line.\n * Useful for estimating arc length without creating a curved path.\n * @param {string} text - text content\n */\nexport function measureTextLengthOnLine(text: string): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n document.body.appendChild(tempSvg)\n\n const tempText = document.createElementNS(svgNS, 'text')\n tempText.textContent = text\n tempSvg.appendChild(tempText)\n\n const length = (tempText as SVGTextElement).getComputedTextLength()\n document.body.removeChild(tempSvg)\n\n return length\n}\n\n/**\n * @template T\n * @param {PromiseLike<T> | HTMLElement} value\n * @returns boolean\n */\nexport function isPromiseLike<T extends any>(value: any): value is PromiseLike<T> {\n return value && (value as PromiseLike<T>).then !== undefined\n}\n","import { Matrix } from './matrix'\n\nexport const rad = (deg: number): number => (deg % 360) * Math.PI / 180\n\nconst p2s = /,?([a-z]),?/gi\n\nfunction pathToString(this: any[]): string {\n return this.join(',').replace(p2s, '$1')\n}\n\nexport const parseTransformString = (TString: string): any[] | null => {\n if (!TString) return null\n let data: any[] = []\n\n if (Array.isArray(TString) && Array.isArray(TString[0])) {\n data = TString.map(arr => [...arr])\n }\n if (!data.length) {\n String(TString).replace(/([rstm])\\s*,?\\s*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?\\s*,?\\s*)+)/ig, (_a: string, b: string, c: string) => {\n const params: number[] = []\n\n c.replace(/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)\\s*,?\\s*/ig, (_: string, b: string) => {\n b && params.push(+b)\n return ''\n })\n\n data.push([b, ...params] as any[])\n return ''\n })\n }\n\n data.toString = pathToString\n\n return data;\n}\n\n// noinspection JSUnusedGlobalSymbols\nexport const svgTransform2string = (tstr: string): any[] => {\n const res: any[] = []\n\n tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, (all: string, name: string, params: string) => {\n let paramList = params.split(/\\s*,\\s*|\\s+/)\n\n if (name === 'rotate' && paramList.length === 1) paramList.push('0', '0')\n if (name === 'scale' && paramList.length === 1) paramList.push(paramList[0]);\n if (name === 'skewX') {\n res.push(['m', 1, 0, Math.tan(rad(parseFloat(paramList[0]))), 1, 0, 0] as any[])\n } else if (name === 'skewY') {\n res.push(['m', 1, Math.tan(rad(parseFloat(paramList[0]))), 0, 1, 0, 0] as any[])\n } else {\n res.push([name.charAt(0), ...paramList.map(Number)] as any[])\n }\n\n return all\n })\n\n return res\n}\n\nexport const transform2matrix = (tstr: string): Matrix => {\n const tdata = parseTransformString(tstr)\n const m = new Matrix()\n\n if (tdata) {\n for (let i = 0, ii = tdata.length; i < ii; i++) {\n const t = tdata[i]\n\n switch (t[0].toLowerCase()) {\n case 't':\n m.translate(t[1], t[2] || 0)\n break\n case 'r':\n m.rotate(t[1], t[2] || 0, t[3] || 0)\n break\n case 's':\n m.scale(t[1] || 1, t[2] || t[1] || 1, t[3] || 0, t[4] || 0)\n break\n case 'm':\n m.add(t[1] || 1, t[2] || 0, t[3] || 0, t[4] || 1, t[5] || 0, t[6] || 0)\n break\n }\n }\n }\n\n return m\n}\n","// noinspection JSUnusedGlobalSymbols,JSSuspiciousNameCombination\n\nimport { rad } from './transform'\n\ntype MatrixLike = { a: number; b: number; c: number; d: number; e: number; f: number }\n\nconst defaultMatrix: MatrixLike = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n\n/**\n * Represents a 2D transformation matrix (a, b, c, d, e, f) as used in SVG.\n */\nexport class Matrix {\n a!: number\n b!: number\n c!: number\n d!: number\n e!: number\n f!: number\n\n /**\n * Creates a new matrix.\n * If no arguments are given, creates an identity matrix.\n * If an object with a,b,c,d,e,f properties is provided (e.g., SVGMatrix), copies its values.\n */\n constructor(a?: number | MatrixLike, b?: number, c?: number, d?: number, e?: number, f?: number) {\n if (a instanceof SVGMatrix) {\n Object.assign(this, a)\n return\n }\n\n if (a != null) {\n Object.assign(this, { a: +a, b: +b!, c: +c!, d: +d!, e: +e!, f: +f! })\n } else {\n Object.assign(this, defaultMatrix)\n }\n }\n\n /**\n * Multiplies current matrix by another matrix.\n */\n add(a: number | Matrix, b?: number, c?: number, d?: number, e?: number, f?: number): this {\n if (a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f)\n }\n\n const aNew = (a as number) * this.a + (b as number) * this.c\n const bNew = (a as number) * this.b + (b as number) * this.d\n\n this.e += (e as number) * this.a + (f as number) * this.c\n this.f += (e as number) * this.b + (f as number) * this.d\n this.c = (c as number) * this.a + (d as number) * this.c\n this.d = (c as number) * this.b + (d as number) * this.d\n\n this.a = aNew\n this.b = bNew\n\n return this\n }\n\n /**\n * Returns inverse matrix.\n */\n invert(): Matrix {\n const det = this.a * this.d - this.b * this.c\n return new Matrix(\n this.d / det,\n -this.b / det,\n -this.c / det,\n this.a / det,\n (this.c * this.f - this.d * this.e) / det,\n (this.b * this.e - this.a * this.f) / det\n )\n }\n\n /**\n * Returns a copy of the matrix.\n */\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f)\n }\n\n /**\n * Translates the matrix by x and y.\n */\n translate(x: number, y = 0): this {\n return this.add(1, 0, 0, 1, x, y)\n }\n\n /**\n * Scales the matrix by x and y, optionally about point (cx, cy).\n */\n scale(x: number, y: number = x, cx?: number, cy?: number): this {\n if (cx != null || cy != null) {\n this.translate(cx!, cy!)\n }\n\n this.a *= x\n this.b *= x\n this.c *= y\n this.d *= y\n\n if (cx != null || cy != null) {\n this.translate(-cx!, -cy!)\n }\n\n return this\n }\n\n /**\n * Rotates the matrix by angle (degrees) about point (x, y).\n */\n rotate(angle: number, x = 0, y = 0): this {\n angle = rad(angle)\n\n const cos = +Math.cos(angle).toFixed(9)\n const sin = +Math.sin(angle).toFixed(9)\n\n this.add(cos, sin, -sin, cos, x, y)\n\n return this.add(1, 0, 0, 1, -x, -y)\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting x.\n */\n x(x: number, y: number): number {\n return x * this.a + y * this.c + this.e\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting y.\n */\n y(x: number, y: number): number {\n return x * this.b + y * this.d + this.f\n }\n\n /**\n * Returns matrix as an SVG matrix string.\n */\n toString(): string {\n return `matrix(${this.a},${this.b},${this.c},${this.d},${this.e},${this.f})`\n }\n}\n","export const mina = {\n linear: (n: number): number => n,\n\n easeinout: (n: number): number => {\n if (n === 1) return 1;\n if (n === 0) return 0;\n const q = 0.48 - n / 1.04;\n const Q = Math.sqrt(0.1734 + q * q);\n const x = Q - q;\n const X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1);\n const y = -Q - q;\n const Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1);\n const t = X + Y + 0.5;\n return (1 - t) * 3 * t * t + t * t * t;\n },\n\n elastic: (n: number): number => {\n if (n === 0 || n === 1) return n;\n return Math.pow(2, -10 * n) * Math.sin((n - 0.075) * (2 * Math.PI) / 0.3) + 1;\n }\n};\n","import { mina } from './easing'\n\nexport interface AnimationHandle {\n stop(): void;\n}\n\nexport function animate(\n from: number | number[],\n to: number | number[],\n setter: (val: any) => void,\n duration: number,\n easing: (n: number) => number = mina.linear,\n callback?: () => void\n): AnimationHandle {\n const start = performance.now()\n let cancelled = false\n let frame = 0\n\n const step = (now: number) => {\n if (cancelled) return\n\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easing(progress)\n\n if (Array.isArray(from) && Array.isArray(to)) {\n const val = from.map((f, i) => f + (to[i] - f) * eased)\n setter(val)\n } else {\n const val = (from as number) + ((to as number) - (from as number)) * eased\n setter(val)\n }\n\n if (progress < 1) {\n frame = requestAnimationFrame(step)\n } else {\n callback?.()\n }\n }\n\n frame = requestAnimationFrame(step)\n\n return {\n stop: () => {\n cancelled = true\n cancelAnimationFrame(frame)\n }\n }\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { transform2matrix } from './transform'\nimport { Matrix } from './matrix'\n\nlet idCounter = 0\nconst elementCache = new WeakMap<SVGElement, Element>()\n\nfunction getElement(node: SVGElement, paper?: Paper): Element {\n if (elementCache.has(node)) {\n const el = elementCache.get(node)!\n\n if (paper && !el.paper) {\n el.paper = paper\n }\n\n return el\n }\n\n const el = new Element(node, paper)\n elementCache.set(node, el)\n\n return el\n}\n\nexport class Element {\n node: SVGElement\n paper?: Paper\n _id: string\n\n constructor(node: SVGElement, paper?: Paper) {\n this.node = node\n this.paper = paper\n this._id = 'e' + (idCounter++).toString(36)\n }\n\n get type(): string {\n return this.node.tagName\n }\n\n get id(): string {\n return this.node.id || this._id\n }\n\n parent(): Element | null {\n return this.node.parentNode ? getElement(this.node.parentNode as SVGElement, this.paper) : null\n }\n\n children(): Element[] {\n return Array.from(this.node.children).map(child => {\n return getElement(child as SVGElement, this.paper)\n })\n }\n\n clear(): this {\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild)\n }\n\n return this\n }\n\n attr(): any;\n attr(name: string): string | null\n attr(name: string, value: any): this\n attr(attrs: Record<string, any>): this\n attr(nameOrAttrs?: string | Record<string, any>, value?: any): any {\n if (typeof nameOrAttrs === 'string') {\n if (value === undefined) {\n return this.node.getAttribute(nameOrAttrs)\n }\n\n this._setAttr(nameOrAttrs, value)\n\n return this\n }\n if (typeof nameOrAttrs === 'object') {\n for (const key in nameOrAttrs) {\n this._setAttr(key, nameOrAttrs[key])\n }\n\n return this\n }\n\n return this\n }\n\n private _setAttr(name: string, value: any) {\n if (name === 'textpath') {\n this._setTextPath(value)\n } else if (name === 'text') {\n this._setText(value)\n } else {\n this.node.setAttribute(name, String(value))\n }\n }\n\n private _setText(content: string) {\n const textPath = this.node.querySelector('textPath')\n\n if (textPath) {\n textPath.textContent = content\n } else {\n this.node.textContent = content\n }\n }\n\n private _setTextPath(pathDescriptor: string) {\n if (this.node.tagName !== 'text') return\n\n const textEl = this.node as SVGTextElement\n\n let textPath = textEl.querySelector('textPath')\n let existingText = ''\n\n if (!textPath) {\n for (let i = 0; i < textEl.childNodes.length; i++) {\n const node = textEl.childNodes[i]\n if (node.nodeType === 3) existingText += node.textContent\n }\n\n while (textEl.firstChild) {\n textEl.removeChild(textEl.firstChild)\n }\n\n textPath = document.createElementNS('http://www.w3.org/2000/svg', 'textPath')\n textEl.appendChild(textPath)\n textEl.removeAttribute('x')\n textEl.removeAttribute('y')\n } else {\n existingText = textPath.textContent || ''\n }\n\n let href: string\n if (pathDescriptor.startsWith('#')) {\n href = pathDescriptor\n } else {\n if (!this.paper) {\n throw new Error('No paper reference for creating defs');\n }\n\n const defs = this.paper.defs\n const pathId = 'p' + Date.now() + Math.random().toString(36).slice(2)\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n path.setAttribute('d', pathDescriptor)\n path.id = pathId\n defs.node.appendChild(path)\n href = '#' + pathId\n }\n\n textPath.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href)\n if (existingText) {\n textPath.textContent = existingText\n }\n }\n\n addClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.add(cls)\n }\n\n return this\n }\n\n removeClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.remove(cls)\n }\n\n return this\n }\n\n transform(t?: string | Matrix): this {\n if (t === undefined) return this\n if (t instanceof Matrix) {\n this.node.setAttribute('transform', t.toString())\n } else {\n const m = transform2matrix(t);\n this.node.setAttribute('transform', m.toString())\n }\n\n return this\n }\n\n getBBox(): { x: number; y: number; width: number; height: number; cx: number; cy: number; x2: number; y2: number } {\n if (this.node.isConnected) {\n const rect = (this.node as SVGGraphicsElement).getBBox()\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n tempSvg.style.pointerEvents = 'none'\n\n document.body.appendChild(tempSvg)\n\n tempSvg.appendChild(this.node)\n const rect = (this.node as SVGGraphicsElement).getBBox()\n tempSvg.removeChild(this.node)\n\n document.body.removeChild(tempSvg)\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n select(selector: string): Element | null {\n const found = this.node.querySelector(selector)\n return found ? getElement(found as SVGElement, this.paper) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.node.querySelectorAll(selector)\n\n return Array.from(nodes).map(node => {\n return getElement(node as SVGElement, this.paper)\n })\n }\n\n clone(): Element {\n return getElement(this.node.cloneNode(true) as SVGElement, this.paper)\n }\n\n add(child: Element): this {\n this.node.appendChild(child.node)\n return this\n }\n\n hover(fIn: (e: MouseEvent) => void, fOut: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseover', fIn)\n this.node.addEventListener('mouseout', fOut)\n return this\n }\n\n mouseup(fn: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseup', fn)\n return this\n }\n}\n\nexport class Paper extends Element {\n defs: Element\n\n constructor(node: SVGSVGElement) {\n super(node, null as any)\n this.paper = this\n\n elementCache.set(node, this)\n\n let defsNode = node.querySelector('defs')\n if (!defsNode) {\n defsNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n node.appendChild(defsNode)\n }\n\n this.defs = getElement(defsNode as SVGElement, this)\n }\n\n g(...args: any[]): Paper {\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n this.node.appendChild(group)\n const groupEl = getElement(group, this)\n\n if (args.length === 1 && args[0] && !args[0].node) {\n groupEl.attr(args[0])\n } else if (args.length) {\n args.forEach(arg => {\n if (arg instanceof Element) groupEl.add(arg)\n })\n }\n\n return groupEl as unknown as Paper\n }\n\n path(d?: string | object): Element {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n this.node.appendChild(path)\n\n const pathEl = getElement(path, this)\n if (d) {\n if (typeof d === 'string') {\n pathEl.attr('d', d)\n }\n\n else pathEl.attr(d)\n }\n\n return pathEl\n }\n\n circle(cx: any, cy?: number, r?: number): Element {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n this.node.appendChild(circle)\n\n const circleEl = getElement(circle, this)\n if (typeof cx === 'object') {\n circleEl.attr(cx)\n } else if (cx != null) {\n circleEl.attr({ cx, cy: cy ?? cx, r: r ?? 0 })\n }\n\n return circleEl\n }\n\n text(x: any, y?: number, text?: string): Element {\n const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n this.node.appendChild(textEl)\n\n const textElWrap = getElement(textEl, this)\n if (typeof x === 'object') {\n textElWrap.attr(x)\n } else if (x != null) {\n textElWrap.attr({ x, y: y ?? x, text: text ?? '' })\n }\n\n return textElWrap\n }\n}\n\nexport class Fragment {\n private frag: DocumentFragment\n\n constructor(frag: DocumentFragment) {\n this.frag = frag\n }\n\n select(selector: string): Element | null {\n const found = this.frag.querySelector(selector)\n return found ? getElement(found as SVGElement) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.frag.querySelectorAll(selector)\n return Array.from(nodes).map(node => getElement(node as SVGElement))\n }\n}\n\nexport function Svg(el: SVGSVGElement): Paper\nexport function Svg(query: string): Paper | null\nexport function Svg(arg: any): any {\n if (typeof arg === 'string') {\n const el = document.querySelector(arg)\n return el ? new Paper(el as SVGSVGElement) : null\n }\n if (arg instanceof SVGSVGElement) {\n return new Paper(arg)\n }\n\n return null\n}\n","import { Fragment } from './svg';\n\nexport function parse(svgString: string): Fragment {\n const div = document.createElement('div');\n let svg = svgString.trim();\n if (!svg.match(/^\\s*<\\s*svg/i)) {\n svg = '<svg>' + svg + '</svg>';\n }\n div.innerHTML = svg;\n const svgElem = div.querySelector('svg');\n const frag = document.createDocumentFragment();\n if (svgElem) {\n while (svgElem.firstChild) {\n frag.appendChild(svgElem.firstChild);\n }\n }\n return new Fragment(frag);\n}\n","import type { ICentralButton, IConfig, ISector } from './config'\n\nimport { getHintFontMetrics, measureTextLengthOnLine } from '@/utils'\nimport { animate, Matrix, mina, parse, Svg } from '@/core'\n\ninterface HintData {\n baseRadius: number;\n textLength: number;\n sectorMidAngle: number;\n}\n\nconst clamp = (v: number, l: number, h: number) => (v > h ? h : v < l ? l : v)\n\nconst hintDataMap = new WeakMap<Svg.Element, HintData>()\nconst iconInitialData = new WeakMap<Svg.Element, {\n midRadius: number;\n scale: number;\n rotation: number;\n bbox: Svg.BBox;\n}>()\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number): { x: number, y: number }\n{\n angle = ((angle - 90) * Math.PI) / 180\n\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n }\n}\n\nfunction describeArc(x: number, y: number, r: number, startAngle: number, endAngle: number, lineMove: boolean, alter: boolean): string\n{\n const start = polarToCartesian(x, y, r, (startAngle %= 360))\n const end = polarToCartesian(x, y, r, (endAngle %= 360))\n\n return `${lineMove ? 'L' : 'M'}${start.x} ${start.y} A${r} ${r}, 0, ${endAngle - startAngle >= 180 ? 1 : 0}, ${alter ? 0 : 1}, ${end.x} ${end.y}`\n}\n\nfunction describeSector(x: number, y: number, r: number, r2: number, startAngle: number, endAngle: number): string\n{\n return `${describeArc(x, y, r, startAngle, endAngle, false, false)} ${describeArc(x, y, r2, endAngle, startAngle, true, true)}Z`\n}\n\nexport class Builder\n{\n public config: IConfig\n public element: HTMLElement\n\n private readonly events: { [key: string]: Function[] } = {}\n\n private readonly container: Svg.Paper\n private readonly snap: Svg.Paper\n\n private readonly angle: number\n private readonly size: number = 500\n private readonly c = this.size / 2\n\n private duration = 300\n\n private area: Svg.Paper\n private icons: Svg.Fragment | null = null\n private theme = 'light'\n\n constructor(config: IConfig)\n {\n this.config = config\n this.size = 2 * config.outerRadius\n this.c = this.size / 2\n this.angle = 360 / (this.config.sectors.length || 6)\n\n this.element = this.createMenuElement()\n this.snap = Svg(this.element.querySelector('svg')!)\n this.area = this.snap\n this.container = this.area.g().transform('s0')\n\n this.init().catch(console.error)\n }\n\n private createMenuElement(): HTMLElement\n {\n const div = document.createElement('div')\n div.className = 'context hidden'\n div.style.position = 'fixed'\n div.style.top = '0'\n div.style.left = '0'\n div.style.width = '100vw'\n div.style.height = '100vh'\n div.style.overflow = 'visible'\n div.style.pointerEvents = 'auto'\n\n if (this.config.zIndex && !isNaN(this.config.zIndex)) {\n div.style.zIndex = `${this.config.zIndex}`\n }\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', this.size.toString())\n svg.setAttribute('height', this.size.toString())\n svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`)\n svg.style.position = 'absolute'\n svg.style.display = 'block'\n svg.style.overflow = 'visible'\n svg.style.pointerEvents = 'auto'\n svg.classList.add('radial-menu-svg')\n\n svg.addEventListener('wheel', (e) => {\n e.preventDefault()\n this.transformOpacity(e)\n })\n\n svg.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n svg.addEventListener('click', (e) => {\n e.stopPropagation()\n this.hide()\n })\n\n div.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n div.addEventListener('click', (e) => {\n if (e.target === div) {\n this.hide()\n }\n })\n\n div.appendChild(svg)\n\n return div\n }\n\n private async init(): Promise<void>\n {\n await this.loadIcons()\n this.updateButtons()\n }\n\n private async loadIcons(): Promise<void>\n {\n if (this.icons) return\n\n try {\n const response = await fetch(this.config.sprite)\n if (response.ok) {\n this.icons = parse(await response.text())\n }\n } catch (e) {\n console.error('Failed to load icons:', e)\n }\n }\n\n public updateButtons(): void\n {\n if (!this.icons || !this.container) return\n\n this.container.clear()\n this.config.sectors.forEach(btn => {\n const icon = this.createIcon(btn)\n\n if (icon) {\n const buttonGroup = this.createButton(btn, this.createSector(), icon, this.createHint(btn))\n this.container.add(buttonGroup)\n }\n })\n\n if (this.config.centralButton) {\n const centralBtn = this.createCentralButton(this.config.centralButton)\n if (centralBtn) {\n this.container.add(centralBtn)\n }\n }\n }\n\n private createSector(): Svg.Element\n {\n const color = this.config.color ?? '#1976D2'\n\n return this.area.path(describeSector(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle))\n .attr({ fill: color, stroke: color, opacity: this.config.opacity })\n .addClass('radial-sector')\n }\n\n private createButton(btn: ISector, sector: Svg.Element, icon: Svg.Element, hint: Svg.Element): Svg.Paper\n {\n const buttonGroup = this.area.g(sector, icon, hint)\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.radial-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateButtonHover(buttonGroup, 0, 1, 200, mina.easeinout)\n },\n () => {\n buttonGroup.select('.radial-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateButtonHover(buttonGroup, 1, 0, 2000, mina.elastic)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n this.emit('click', { icon: btn.icon, hint: btn.hint })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createIcon(btn: ISector): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultRadius = (this.config.innerRadius + this.config.outerRadius) / 2\n const sectorHeight = this.config.outerRadius - this.config.innerRadius\n const defaultScale = (sectorHeight * 0.5) / bbox.height\n\n const midRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const targetAngle = this.angle / 2\n const rotation = targetAngle + (btn.rotate || 0)\n\n iconInitialData.set(icon, { midRadius, scale, rotation, bbox })\n\n const pos = polarToCartesian(this.c, this.c, midRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(scale)\n t.rotate(rotation, 0, 0)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t)\n\n return icon.addClass('radial-icon')\n }\n\n private createHint(btn: ISector): Svg.Element\n {\n const group = this.area.g()\n group.addClass('hint-group')\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint || btn.icon\n\n const textLength = measureTextLengthOnLine(text)\n const gap = 2\n\n let baseRadius: number\n let bgHeight = 0\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseRadius = this.config.outerRadius + bgHeight / 2 + gap\n } else {\n const textOffset = metrics.height * 0.75\n baseRadius = this.config.outerRadius + textOffset\n }\n\n const textAngleRad = textLength / baseRadius\n const textAngleDeg = textAngleRad * 180 / Math.PI\n const sectorMidAngle = this.angle / 2\n const startAngle = sectorMidAngle - textAngleDeg / 2\n const endAngle = sectorMidAngle + textAngleDeg / 2\n\n const arcPath = describeArc(this.c, this.c, baseRadius, startAngle, endAngle, false, false)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint').attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n group.add(hint)\n\n hintDataMap.set(group, {\n sectorMidAngle,\n baseRadius,\n textLength\n })\n\n return group\n }\n\n private createCentralButton(btn: ICentralButton): Svg.Element | null\n {\n const defaultRadius = this.config.innerRadius * 0.6\n const buttonRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const color = this.config.color ?? '#1976D2'\n\n const circle = this.area.circle({\n cx: this.c, cy: this.c, r: buttonRadius,\n fill: color, stroke: color,\n opacity: this.config.opacity\n })\n .addClass('radial-sector central-sector')\n\n circle.node.dataset.initialRadius = `${buttonRadius}`\n\n let icon: Svg.Element | null = null\n let hint: Svg.Element | null = null\n\n if (btn.icon) {\n icon = this.createCentralIcon(btn, buttonRadius)\n }\n if (btn.hint) {\n hint = this.createCentralHint(btn, buttonRadius)\n }\n\n const elements = [circle, icon, hint].filter(el => el !== null) as Svg.Element[]\n const buttonGroup = this.area.g(...elements).addClass('central-button')\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.central-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateCentralHover(buttonGroup, true)\n },\n () => {\n buttonGroup.select('.central-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateCentralHover(buttonGroup, false)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n\n this.emit('click', { icon: btn.icon, hint: btn.hint || '' })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createCentralIcon(btn: ICentralButton, buttonRadius: number): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultScale = (buttonRadius * 0.8) / Math.max(bbox.width, bbox.height)\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const t = new Matrix()\n\n t.translate(this.c, this.c)\n t.scale(scale)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t).addClass('radial-icon central-icon')\n\n iconInitialData.set(icon, {\n midRadius: 0,\n rotation: 0,\n scale,\n bbox\n })\n\n return icon\n }\n\n private createCentralHint(btn: ICentralButton, buttonRadius: number): Svg.Element\n {\n const group = this.area.g()\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint ?? ''\n // const textLength = measureTextLengthOnLine(text)\n\n let baseOffset: number\n let bgHeight = 0\n const gap = 2\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseOffset = btn.hintOffset ?? (bgHeight / 2 + gap)\n } else {\n if (btn.hintOffset != null) {\n baseOffset = btn.hintOffset\n } else {\n baseOffset = btn.hintDistance ?? 8\n }\n }\n\n const textRadius = buttonRadius + baseOffset\n\n let startAngle: number, endAngle: number, alter: boolean\n if (btn.hintStartAngle != null && btn.hintEndAngle != null) {\n startAngle = btn.hintStartAngle\n endAngle = btn.hintEndAngle\n alter = startAngle > endAngle\n } else {\n const span = btn.hintSpan ?? 120\n const half = span / 2\n const position = btn.hintPosition ?? 'top'\n\n if (position === 'bottom') {\n startAngle = 180 + half\n endAngle = 180 - half\n alter = true\n } else {\n startAngle = 360 - half\n endAngle = half\n alter = false\n }\n }\n\n const arcPath = describeArc(this.c, this.c, textRadius, startAngle, endAngle, false, alter)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint central-hint')\n .attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n const hintNode = hint.node\n hintNode.dataset.hintOffset = baseOffset.toString()\n hintNode.dataset.startAngle = startAngle.toString()\n hintNode.dataset.endAngle = endAngle.toString()\n hintNode.dataset.alter = alter ? 'true' : 'false'\n hintNode.dataset.centerX = this.c.toString()\n hintNode.dataset.centerY = this.c.toString()\n\n group.add(hint)\n\n return group\n }\n\n public show(e: MouseEvent): void\n {\n this.element.classList.remove('hidden')\n\n const svg = this.element.querySelector('svg') as SVGSVGElement\n\n svg.style.left = (e.clientX - this.c) + 'px'\n svg.style.top = (e.clientY - this.c) + 'px'\n\n this.animateContainer(0, 1, this.duration * 8, mina.elastic)\n this.animateButtons(0, 1, this.duration, this.duration * 8, mina.elastic)\n }\n\n public hide(): void\n {\n this.animateContainer(1, 0, this.duration, mina.easeinout, () => {\n this.element.classList.add('hidden')\n })\n\n this.animateButtons(1, 0, this.duration, this.duration, mina.easeinout)\n }\n\n private animate(obj: any, index: number, start: number, end: number, duration: number, easing: (n: number) => number, fn: (val: number) => void, cb?: () => void): void\n {\n obj.animation ||= []\n obj.animation[index]?.stop()\n obj.animation[index] = animate(start, end, fn, duration, easing, cb)\n }\n\n private animateContainer(start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n this.animate(this, 0, start, end, duration, easing, (val) => {\n this.container.transform(`r${90 - 90 * val},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }, cb)\n }\n\n private animateButtons(start: number, end: number, min: number, max: number, easing: (n: number) => number): void\n {\n const r = (min: number, max: number) => Math.random() * (max - min) + min\n\n this.container.children().forEach((el: Svg.Element, i: number) => {\n const isCentral = el.node.classList.contains('central-button')\n\n this.animate(el, 0, start, end, r(min, max), easing, (val) => {\n if (isCentral) {\n el.transform(`s${val},${val},${this.c},${this.c}`)\n } else {\n el.transform(`r${this.angle * i},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }\n })\n })\n }\n\n private animateButtonHover(buttonGroup: Svg.Paper, start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n const icon = buttonGroup.select('.radial-icon')\n const initialIcon = icon ? iconInitialData.get(icon) : undefined\n const hintGroup = buttonGroup.select('.hint-group')\n const hintData = hintGroup ? hintDataMap.get(hintGroup) : undefined\n\n this.animate(buttonGroup, 1, start, end, duration, easing, (val) => {\n const outward = val * 10\n\n buttonGroup.select('.radial-sector')?.attr({\n d: describeSector(this.c, this.c, this.config.outerRadius - outward, this.config.innerRadius, 0, this.angle)\n })\n\n if (icon && initialIcon) {\n const newRadius = initialIcon.midRadius - outward\n const newScale = initialIcon.scale * (1 - (val * 0.1))\n const targetAngle = this.angle / 2\n const pos = polarToCartesian(this.c, this.c, newRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(newScale)\n t.rotate(initialIcon.rotation, 0, 0)\n t.translate(-initialIcon.bbox.cx, -initialIcon.bbox.cy)\n\n icon.transform(t)\n }\n\n if (hintData && hintGroup) {\n const newRadius = hintData.baseRadius - outward\n const newAngleDeg = (hintData.textLength / newRadius) * 180 / Math.PI\n const newStart = hintData.sectorMidAngle - newAngleDeg / 2\n const newEnd = hintData.sectorMidAngle + newAngleDeg / 2\n const newPath = describeArc(this.c, this.c, newRadius, newStart, newEnd, false, false)\n\n const hint = hintGroup.select('.radial-hint')\n if (hint) {\n hint.attr('textpath', newPath)\n }\n\n const bg = hintGroup.select('.radial-hint-bg')\n if (bg) {\n bg.attr('d', newPath)\n }\n }\n }, cb)\n }\n\n private animateCentralHover(group: Svg.Element, active: boolean): void\n {\n const circle = group.select('.central-sector') as Svg.Element\n const icon = group.select('.central-icon') as Svg.Element\n const hint = group.select('.central-hint') as Svg.Element\n const bg = group.select('.radial-hint-bg') as Svg.Element\n\n if (!circle || !icon) return\n\n const initialRadius = parseFloat(circle.node.dataset.initialRadius || '30')\n const currentRadius = parseFloat(circle.attr('r') as string)\n const targetRadius = active ? initialRadius - 8 : initialRadius\n\n const initialIconData = icon ? iconInitialData.get(icon) : undefined\n\n let hintOffset = 12, startAngle = 0, endAngle = 0, centerX = this.c, centerY = this.c, alter = false\n if (hint) {\n hintOffset = parseFloat(hint.node.dataset.hintOffset || '12')\n startAngle = parseFloat(hint.node.dataset.startAngle || '0')\n endAngle = parseFloat(hint.node.dataset.endAngle || '0')\n centerX = parseFloat(hint.node.dataset.centerX || this.c.toString())\n centerY = parseFloat(hint.node.dataset.centerY || this.c.toString())\n alter = hint.node.dataset.alter === 'true'\n }\n\n animate(currentRadius, targetRadius, (val) => {\n circle.attr('r', val)\n\n if (icon && initialIconData) {\n const newScale = initialIconData.scale * (val / initialRadius)\n const t = new Matrix()\n t.translate(this.c, this.c)\n t.scale(newScale)\n t.translate(-initialIconData.bbox.cx, -initialIconData.bbox.cy)\n icon.transform(t)\n }\n\n if (hint) {\n const newRadius = val + hintOffset\n const newArc = describeArc(centerX, centerY, newRadius, startAngle, endAngle, false, alter)\n hint.attr({ textpath: newArc })\n if (bg) {\n bg.attr({ d: newArc })\n }\n }\n }, 200, mina.easeinout)\n }\n\n private transformOpacity(e: WheelEvent): void\n {\n const dy = e.deltaY > 0 ? 0.03 : -0.03\n this.config.opacity = clamp(this.config.opacity + dy, 0.4, 1)\n\n this.area.selectAll('.radial-sector').forEach((el: Svg.Element) => {\n el.attr({ opacity: this.config.opacity })\n })\n\n this.area.selectAll('.radial-hint-bg.active').forEach((el: Svg.Element) => {\n el.node.style.opacity = String(this.config.opacity)\n })\n }\n\n public on(event: string, callback: Function): void\n {\n (this.events[event] ??= []).push(callback)\n }\n\n private emit(event: string, data: any): void\n {\n if (this.events[event]) {\n this.events[event].forEach(callback => callback(data))\n }\n }\n}\n","import { isPromiseLike } from '@/utils'\nimport { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n public menu: Builder\n\n public shown: boolean = false\n\n constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig)\n {\n this.menu = new Builder(config)\n\n isPromiseLike(container)\n ? container.then((c) => c.appendChild(this.menu.element))\n : container.appendChild(this.menu.element)\n\n if (config.autoBindContextMenu !== false) {\n this.bindEvents()\n }\n }\n\n public bindEvents(el: HTMLElement | Window = window)\n {\n el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.toggle(e as PointerEvent)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public toggle(event: PointerEvent)\n {\n this.shown ? this.menu.hide() : this.menu.show(event)\n }\n\n public show(event: PointerEvent)\n {\n this.shown = true\n\n this.menu.show(event)\n }\n\n public hide()\n {\n this.shown = false\n\n this.menu.hide()\n }\n}\n"],"names":["defaultConfig","defineConfig","options","cache","getFontMetrics","font","ctx","fallback","metrics","ascent","descent","height","result","hintFontMetrics","getHintFontMetrics","div","styles","measureTextLengthOnLine","text","svgNS","tempSvg","tempText","length","isPromiseLike","value","rad","deg","p2s","pathToString","parseTransformString","TString","data","arr","_a","b","c","params","_","transform2matrix","tstr","tdata","m","Matrix","i","ii","t","defaultMatrix","a","d","e","f","aNew","bNew","det","x","y","cx","cy","angle","cos","sin","mina","n","q","Q","X","Y","animate","from","to","setter","duration","easing","callback","start","cancelled","frame","step","now","elapsed","progress","eased","val","idCounter","elementCache","getElement","node","paper","el","Element","child","nameOrAttrs","key","name","content","textPath","pathDescriptor","textEl","existingText","href","defs","pathId","path","className","classes","cls","rect","selector","found","nodes","fIn","fOut","fn","Paper","defsNode","args","group","groupEl","arg","pathEl","r","circle","circleEl","textElWrap","Fragment","frag","Svg","parse","svgString","svg","svgElem","clamp","v","l","h","hintDataMap","iconInitialData","polarToCartesian","describeArc","startAngle","endAngle","lineMove","alter","end","describeSector","r2","Builder","config","response","btn","icon","buttonGroup","centralBtn","color","sector","hint","bg","iconTemplate","bbox","defaultRadius","defaultScale","midRadius","scale","targetAngle","rotation","pos","hintPadding","textLength","gap","baseRadius","bgHeight","textOffset","textAngleDeg","sectorMidAngle","arcPath","bgColor","textPathEl","buttonRadius","elements","baseOffset","textRadius","half","hintNode","obj","index","cb","min","max","isCentral","initialIcon","hintGroup","hintData","outward","newRadius","newScale","newAngleDeg","newStart","newEnd","newPath","active","initialRadius","currentRadius","targetRadius","initialIconData","hintOffset","centerX","centerY","newArc","dy","event","Manager","container"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/index.ts","../src/core/transform.ts","../src/core/matrix.ts","../src/core/easing.ts","../src/core/animate.ts","../src/core/svg.ts","../src/core/parse.ts","../src/menu/builder.ts","../src/menu/manager.ts"],"sourcesContent":["export interface ICentralButton {\n icon: string;\n hint?: string;\n onclick?: () => void;\n iconRadius?: number;\n iconScale?: number;\n hintPosition?: 'top' | 'bottom';\n hintSpan?: number;\n hintDistance?: number;\n hintOffset?: number;\n hintStartAngle?: number;\n hintEndAngle?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface ISector {\n icon: string;\n hint: string;\n onclick?: () => void;\n rotate?: number;\n iconScale?: number;\n iconRadius?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface IConfig {\n sectors: ISector[];\n sprite: string;\n innerRadius: number;\n outerRadius: number;\n opacity: number;\n iconScale?: number;\n iconRadius?: number;\n color?: string;\n hintPadding?: number;\n centralButton?: ICentralButton;\n autoBindContextMenu?: boolean;\n zIndex?: number;\n}\n\nconst defaultConfig: IConfig = {\n sectors: [],\n sprite: '../icons.svg',\n innerRadius: 50,\n outerRadius: 150,\n opacity: 0.7,\n}\n\nexport function defineConfig(options: Partial<IConfig>): IConfig\n{\n return { ...defaultConfig, ...options }\n}\n","interface FontMetrics {\n ascent: number\n descent: number\n height: number\n}\n\nconst cache = new Map<string, FontMetrics>()\n\n/**\n * Gets font metrics via Canvas.\n * @param font - font string in CSS format (e.g. 'bold 12px sans-serif')\n */\nfunction getFontMetrics(font: string): FontMetrics {\n if (cache.has(font)) {\n return cache.get(font)!\n }\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n const fallback = { ascent: 9, descent: 3, height: 12 }\n cache.set(font, fallback)\n return fallback\n }\n\n ctx.font = font\n const metrics = ctx.measureText('A')\n const ascent = metrics.actualBoundingBoxAscent ?? 9\n const descent = metrics.actualBoundingBoxDescent ?? 3\n const height = ascent + descent\n\n const result = { ascent, descent, height }\n cache.set(font, result)\n\n return result\n}\n\nlet hintFontMetrics: FontMetrics | null = null\n\n/**\n * Returns the metrics of the font used for hints (class .radial-hint).\n * Measures once and caches the result.\n */\nexport function getHintFontMetrics(): FontMetrics {\n if (hintFontMetrics) return hintFontMetrics\n\n // Creating a temporary element to get real CSS styles\n const div = document.createElement('div')\n\n div.className = 'radial-hint'\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.pointerEvents = 'none'\n div.textContent = 'A'\n\n document.body.appendChild(div)\n\n const styles = window.getComputedStyle(div)\n const font = `${styles.fontWeight} ${styles.fontSize} ${styles.fontFamily}`\n\n document.body.removeChild(div)\n\n const metrics = getFontMetrics(font)\n hintFontMetrics = metrics\n\n return metrics\n}\n\n/**\n * Measures the length of text rendered on a straight line.\n * Useful for estimating arc length without creating a curved path.\n * @param {string} text - text content\n */\nexport function measureTextLengthOnLine(text: string): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n document.body.appendChild(tempSvg)\n\n const tempText = document.createElementNS(svgNS, 'text')\n tempText.textContent = text\n tempSvg.appendChild(tempText)\n\n const length = (tempText as SVGTextElement).getComputedTextLength()\n document.body.removeChild(tempSvg)\n\n return length\n}\n\n/**\n * @template T\n * @param {PromiseLike<T> | HTMLElement} value\n * @returns boolean\n */\nexport function isPromiseLike<T extends any>(value: any): value is PromiseLike<T> {\n return value && (value as PromiseLike<T>).then !== undefined\n}\n","import { Matrix } from './matrix'\n\nexport const rad = (deg: number): number => (deg % 360) * Math.PI / 180\n\nconst p2s = /,?([a-z]),?/gi\n\nfunction pathToString(this: any[]): string {\n return this.join(',').replace(p2s, '$1')\n}\n\nexport const parseTransformString = (TString: string): any[] | null => {\n if (!TString) return null\n let data: any[] = []\n\n if (Array.isArray(TString) && Array.isArray(TString[0])) {\n data = TString.map(arr => [...arr])\n }\n if (!data.length) {\n String(TString).replace(/([rstm])\\s*,?\\s*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?\\s*,?\\s*)+)/ig, (_a: string, b: string, c: string) => {\n const params: number[] = []\n\n c.replace(/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)\\s*,?\\s*/ig, (_: string, b: string) => {\n b && params.push(+b)\n return ''\n })\n\n data.push([b, ...params] as any[])\n return ''\n })\n }\n\n data.toString = pathToString\n\n return data;\n}\n\n// noinspection JSUnusedGlobalSymbols\nexport const svgTransform2string = (tstr: string): any[] => {\n const res: any[] = []\n\n tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, (all: string, name: string, params: string) => {\n let paramList = params.split(/\\s*,\\s*|\\s+/)\n\n if (name === 'rotate' && paramList.length === 1) paramList.push('0', '0')\n if (name === 'scale' && paramList.length === 1) paramList.push(paramList[0]);\n if (name === 'skewX') {\n res.push(['m', 1, 0, Math.tan(rad(parseFloat(paramList[0]))), 1, 0, 0] as any[])\n } else if (name === 'skewY') {\n res.push(['m', 1, Math.tan(rad(parseFloat(paramList[0]))), 0, 1, 0, 0] as any[])\n } else {\n res.push([name.charAt(0), ...paramList.map(Number)] as any[])\n }\n\n return all\n })\n\n return res\n}\n\nexport const transform2matrix = (tstr: string): Matrix => {\n const tdata = parseTransformString(tstr)\n const m = new Matrix()\n\n if (tdata) {\n for (let i = 0, ii = tdata.length; i < ii; i++) {\n const t = tdata[i]\n\n switch (t[0].toLowerCase()) {\n case 't':\n m.translate(t[1], t[2] || 0)\n break\n case 'r':\n m.rotate(t[1], t[2] || 0, t[3] || 0)\n break\n case 's':\n m.scale(t[1] || 1, t[2] || t[1] || 1, t[3] || 0, t[4] || 0)\n break\n case 'm':\n m.add(t[1] || 1, t[2] || 0, t[3] || 0, t[4] || 1, t[5] || 0, t[6] || 0)\n break\n }\n }\n }\n\n return m\n}\n","// noinspection JSUnusedGlobalSymbols,JSSuspiciousNameCombination\n\nimport { rad } from './transform'\n\ntype MatrixLike = { a: number; b: number; c: number; d: number; e: number; f: number }\n\nconst defaultMatrix: MatrixLike = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n\n/**\n * Represents a 2D transformation matrix (a, b, c, d, e, f) as used in SVG.\n */\nexport class Matrix {\n a!: number\n b!: number\n c!: number\n d!: number\n e!: number\n f!: number\n\n /**\n * Creates a new matrix.\n * If no arguments are given, creates an identity matrix.\n * If an object with a,b,c,d,e,f properties is provided (e.g., SVGMatrix), copies its values.\n */\n constructor(a?: number | MatrixLike, b?: number, c?: number, d?: number, e?: number, f?: number) {\n if (a instanceof SVGMatrix) {\n Object.assign(this, a)\n return\n }\n\n if (a != null) {\n Object.assign(this, { a: +a, b: +b!, c: +c!, d: +d!, e: +e!, f: +f! })\n } else {\n Object.assign(this, defaultMatrix)\n }\n }\n\n /**\n * Multiplies current matrix by another matrix.\n */\n add(a: number | Matrix, b?: number, c?: number, d?: number, e?: number, f?: number): this {\n if (a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f)\n }\n\n const aNew = (a as number) * this.a + (b as number) * this.c\n const bNew = (a as number) * this.b + (b as number) * this.d\n\n this.e += (e as number) * this.a + (f as number) * this.c\n this.f += (e as number) * this.b + (f as number) * this.d\n this.c = (c as number) * this.a + (d as number) * this.c\n this.d = (c as number) * this.b + (d as number) * this.d\n\n this.a = aNew\n this.b = bNew\n\n return this\n }\n\n /**\n * Returns inverse matrix.\n */\n invert(): Matrix {\n const det = this.a * this.d - this.b * this.c\n return new Matrix(\n this.d / det,\n -this.b / det,\n -this.c / det,\n this.a / det,\n (this.c * this.f - this.d * this.e) / det,\n (this.b * this.e - this.a * this.f) / det\n )\n }\n\n /**\n * Returns a copy of the matrix.\n */\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f)\n }\n\n /**\n * Translates the matrix by x and y.\n */\n translate(x: number, y = 0): this {\n return this.add(1, 0, 0, 1, x, y)\n }\n\n /**\n * Scales the matrix by x and y, optionally about point (cx, cy).\n */\n scale(x: number, y: number = x, cx?: number, cy?: number): this {\n if (cx != null || cy != null) {\n this.translate(cx!, cy!)\n }\n\n this.a *= x\n this.b *= x\n this.c *= y\n this.d *= y\n\n if (cx != null || cy != null) {\n this.translate(-cx!, -cy!)\n }\n\n return this\n }\n\n /**\n * Rotates the matrix by angle (degrees) about point (x, y).\n */\n rotate(angle: number, x = 0, y = 0): this {\n angle = rad(angle)\n\n const cos = +Math.cos(angle).toFixed(9)\n const sin = +Math.sin(angle).toFixed(9)\n\n this.add(cos, sin, -sin, cos, x, y)\n\n return this.add(1, 0, 0, 1, -x, -y)\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting x.\n */\n x(x: number, y: number): number {\n return x * this.a + y * this.c + this.e\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting y.\n */\n y(x: number, y: number): number {\n return x * this.b + y * this.d + this.f\n }\n\n /**\n * Returns matrix as an SVG matrix string.\n */\n toString(): string {\n return `matrix(${this.a},${this.b},${this.c},${this.d},${this.e},${this.f})`\n }\n}\n","export const mina = {\n linear: (n: number): number => n,\n\n easeinout: (n: number): number => {\n if (n === 1) return 1;\n if (n === 0) return 0;\n const q = 0.48 - n / 1.04;\n const Q = Math.sqrt(0.1734 + q * q);\n const x = Q - q;\n const X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1);\n const y = -Q - q;\n const Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1);\n const t = X + Y + 0.5;\n return (1 - t) * 3 * t * t + t * t * t;\n },\n\n elastic: (n: number): number => {\n if (n === 0 || n === 1) return n;\n return Math.pow(2, -10 * n) * Math.sin((n - 0.075) * (2 * Math.PI) / 0.3) + 1;\n }\n};\n","import { mina } from './easing'\n\nexport interface AnimationHandle {\n stop(): void;\n}\n\nexport function animate(\n from: number | number[],\n to: number | number[],\n setter: (val: any) => void,\n duration: number,\n easing: (n: number) => number = mina.linear,\n callback?: () => void\n): AnimationHandle {\n const start = performance.now()\n let cancelled = false\n let frame = 0\n\n const step = (now: number) => {\n if (cancelled) return\n\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easing(progress)\n\n if (Array.isArray(from) && Array.isArray(to)) {\n const val = from.map((f, i) => f + (to[i] - f) * eased)\n setter(val)\n } else {\n const val = (from as number) + ((to as number) - (from as number)) * eased\n setter(val)\n }\n\n if (progress < 1) {\n frame = requestAnimationFrame(step)\n } else {\n callback?.()\n }\n }\n\n frame = requestAnimationFrame(step)\n\n return {\n stop: () => {\n cancelled = true\n cancelAnimationFrame(frame)\n }\n }\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { transform2matrix } from './transform'\nimport { Matrix } from './matrix'\n\nlet idCounter = 0\nconst elementCache = new WeakMap<SVGElement, Element>()\n\nfunction getElement(node: SVGElement, paper?: Paper): Element {\n if (elementCache.has(node)) {\n const el = elementCache.get(node)!\n\n if (paper && !el.paper) {\n el.paper = paper\n }\n\n return el\n }\n\n const el = new Element(node, paper)\n elementCache.set(node, el)\n\n return el\n}\n\nexport class Element {\n node: SVGElement\n paper?: Paper\n _id: string\n\n constructor(node: SVGElement, paper?: Paper) {\n this.node = node\n this.paper = paper\n this._id = 'e' + (idCounter++).toString(36)\n }\n\n get type(): string {\n return this.node.tagName\n }\n\n get id(): string {\n return this.node.id || this._id\n }\n\n parent(): Element | null {\n return this.node.parentNode ? getElement(this.node.parentNode as SVGElement, this.paper) : null\n }\n\n children(): Element[] {\n return Array.from(this.node.children).map(child => {\n return getElement(child as SVGElement, this.paper)\n })\n }\n\n clear(): this {\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild)\n }\n\n return this\n }\n\n attr(): any;\n attr(name: string): string | null\n attr(name: string, value: any): this\n attr(attrs: Record<string, any>): this\n attr(nameOrAttrs?: string | Record<string, any>, value?: any): any {\n if (typeof nameOrAttrs === 'string') {\n if (value === undefined) {\n return this.node.getAttribute(nameOrAttrs)\n }\n\n this._setAttr(nameOrAttrs, value)\n\n return this\n }\n if (typeof nameOrAttrs === 'object') {\n for (const key in nameOrAttrs) {\n this._setAttr(key, nameOrAttrs[key])\n }\n\n return this\n }\n\n return this\n }\n\n private _setAttr(name: string, value: any) {\n if (name === 'textpath') {\n this._setTextPath(value)\n } else if (name === 'text') {\n this._setText(value)\n } else {\n this.node.setAttribute(name, String(value))\n }\n }\n\n private _setText(content: string) {\n const textPath = this.node.querySelector('textPath')\n\n if (textPath) {\n textPath.textContent = content\n } else {\n this.node.textContent = content\n }\n }\n\n private _setTextPath(pathDescriptor: string) {\n if (this.node.tagName !== 'text') return\n\n const textEl = this.node as SVGTextElement\n\n let textPath = textEl.querySelector('textPath')\n let existingText = ''\n\n if (!textPath) {\n for (let i = 0; i < textEl.childNodes.length; i++) {\n const node = textEl.childNodes[i]\n if (node.nodeType === 3) existingText += node.textContent\n }\n\n while (textEl.firstChild) {\n textEl.removeChild(textEl.firstChild)\n }\n\n textPath = document.createElementNS('http://www.w3.org/2000/svg', 'textPath')\n textEl.appendChild(textPath)\n textEl.removeAttribute('x')\n textEl.removeAttribute('y')\n } else {\n existingText = textPath.textContent || ''\n }\n\n let href: string\n if (pathDescriptor.startsWith('#')) {\n href = pathDescriptor\n } else {\n if (!this.paper) {\n throw new Error('No paper reference for creating defs');\n }\n\n const defs = this.paper.defs\n const pathId = 'p' + Date.now() + Math.random().toString(36).slice(2)\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n path.setAttribute('d', pathDescriptor)\n path.id = pathId\n defs.node.appendChild(path)\n href = '#' + pathId\n }\n\n textPath.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href)\n if (existingText) {\n textPath.textContent = existingText\n }\n }\n\n addClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.add(cls)\n }\n\n return this\n }\n\n removeClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.remove(cls)\n }\n\n return this\n }\n\n transform(t?: string | Matrix): this {\n if (t === undefined) return this\n if (t instanceof Matrix) {\n this.node.setAttribute('transform', t.toString())\n } else {\n const m = transform2matrix(t);\n this.node.setAttribute('transform', m.toString())\n }\n\n return this\n }\n\n getBBox(): { x: number; y: number; width: number; height: number; cx: number; cy: number; x2: number; y2: number } {\n if (this.node.isConnected) {\n const rect = (this.node as SVGGraphicsElement).getBBox()\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n tempSvg.style.pointerEvents = 'none'\n\n document.body.appendChild(tempSvg)\n\n tempSvg.appendChild(this.node)\n const rect = (this.node as SVGGraphicsElement).getBBox()\n tempSvg.removeChild(this.node)\n\n document.body.removeChild(tempSvg)\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n select(selector: string): Element | null {\n const found = this.node.querySelector(selector)\n return found ? getElement(found as SVGElement, this.paper) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.node.querySelectorAll(selector)\n\n return Array.from(nodes).map(node => {\n return getElement(node as SVGElement, this.paper)\n })\n }\n\n clone(): Element {\n return getElement(this.node.cloneNode(true) as SVGElement, this.paper)\n }\n\n add(child: Element): this {\n this.node.appendChild(child.node)\n return this\n }\n\n hover(fIn: (e: MouseEvent) => void, fOut: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseover', fIn)\n this.node.addEventListener('mouseout', fOut)\n return this\n }\n\n mouseup(fn: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseup', fn)\n return this\n }\n}\n\nexport class Paper extends Element {\n defs: Element\n\n constructor(node: SVGSVGElement) {\n super(node, null as any)\n this.paper = this\n\n elementCache.set(node, this)\n\n let defsNode = node.querySelector('defs')\n if (!defsNode) {\n defsNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n node.appendChild(defsNode)\n }\n\n this.defs = getElement(defsNode as SVGElement, this)\n }\n\n g(...args: any[]): Paper {\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n this.node.appendChild(group)\n const groupEl = getElement(group, this)\n\n if (args.length === 1 && args[0] && !args[0].node) {\n groupEl.attr(args[0])\n } else if (args.length) {\n args.forEach(arg => {\n if (arg instanceof Element) groupEl.add(arg)\n })\n }\n\n return groupEl as unknown as Paper\n }\n\n path(d?: string | object): Element {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n this.node.appendChild(path)\n\n const pathEl = getElement(path, this)\n if (d) {\n if (typeof d === 'string') {\n pathEl.attr('d', d)\n }\n\n else pathEl.attr(d)\n }\n\n return pathEl\n }\n\n circle(cx: any, cy?: number, r?: number): Element {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n this.node.appendChild(circle)\n\n const circleEl = getElement(circle, this)\n if (typeof cx === 'object') {\n circleEl.attr(cx)\n } else if (cx != null) {\n circleEl.attr({ cx, cy: cy ?? cx, r: r ?? 0 })\n }\n\n return circleEl\n }\n\n text(x: any, y?: number, text?: string): Element {\n const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n this.node.appendChild(textEl)\n\n const textElWrap = getElement(textEl, this)\n if (typeof x === 'object') {\n textElWrap.attr(x)\n } else if (x != null) {\n textElWrap.attr({ x, y: y ?? x, text: text ?? '' })\n }\n\n return textElWrap\n }\n}\n\nexport class Fragment {\n private frag: DocumentFragment\n\n constructor(frag: DocumentFragment) {\n this.frag = frag\n }\n\n select(selector: string): Element | null {\n const found = this.frag.querySelector(selector)\n return found ? getElement(found as SVGElement) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.frag.querySelectorAll(selector)\n return Array.from(nodes).map(node => getElement(node as SVGElement))\n }\n}\n\nexport function Svg(el: SVGSVGElement): Paper\nexport function Svg(query: string): Paper | null\nexport function Svg(arg: any): any {\n if (typeof arg === 'string') {\n const el = document.querySelector(arg)\n return el ? new Paper(el as SVGSVGElement) : null\n }\n if (arg instanceof SVGSVGElement) {\n return new Paper(arg)\n }\n\n return null\n}\n","import { Fragment } from './svg'\n\nexport function parse(svgString: string): Fragment\n{\n const div = document.createElement('div')\n let svg = svgString.trim()\n\n if (!svg.match(/^\\s*<\\s*svg/i)) {\n svg = '<svg>' + svg + '</svg>'\n }\n\n div.innerHTML = svg\n\n const svgElem = div.querySelector('svg')\n const frag = document.createDocumentFragment()\n\n if (svgElem) {\n while (svgElem.firstChild) {\n frag.appendChild(svgElem.firstChild)\n }\n }\n\n return new Fragment(frag)\n}\n","import type { ICentralButton, IConfig, ISector } from './config'\n\nimport { getHintFontMetrics, measureTextLengthOnLine } from '@/utils'\nimport { animate, Matrix, mina, parse, Svg } from '@/core'\n\ninterface HintData {\n baseRadius: number;\n textLength: number;\n sectorMidAngle: number;\n}\n\nconst clamp = (v: number, l: number, h: number) => (v > h ? h : v < l ? l : v)\n\nconst hintDataMap = new WeakMap<Svg.Element, HintData>()\nconst iconInitialData = new WeakMap<Svg.Element, {\n midRadius: number;\n scale: number;\n rotation: number;\n bbox: Svg.BBox;\n}>()\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number): { x: number, y: number }\n{\n angle = ((angle - 90) * Math.PI) / 180\n\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n }\n}\n\nfunction describeArc(x: number, y: number, r: number, startAngle: number, endAngle: number, lineMove: boolean, alter: boolean): string\n{\n const start = polarToCartesian(x, y, r, (startAngle %= 360))\n const end = polarToCartesian(x, y, r, (endAngle %= 360))\n\n return `${lineMove ? 'L' : 'M'}${start.x} ${start.y} A${r} ${r}, 0, ${endAngle - startAngle >= 180 ? 1 : 0}, ${alter ? 0 : 1}, ${end.x} ${end.y}`\n}\n\nfunction describeSector(x: number, y: number, r: number, r2: number, startAngle: number, endAngle: number): string\n{\n return `${describeArc(x, y, r, startAngle, endAngle, false, false)} ${describeArc(x, y, r2, endAngle, startAngle, true, true)}Z`\n}\n\nexport class Builder\n{\n public config: IConfig\n public element: HTMLElement\n\n private readonly events: { [key: string]: Function[] } = {}\n\n private readonly container: Svg.Paper\n private readonly snap: Svg.Paper\n\n private readonly angle: number\n private readonly size: number = 500\n private readonly c = this.size / 2\n\n private duration = 300\n\n private area: Svg.Paper\n private icons: Svg.Fragment | null = null\n private theme = 'light'\n\n constructor(config: IConfig)\n {\n this.config = config\n this.size = 2 * config.outerRadius\n this.c = this.size / 2\n this.angle = 360 / (this.config.sectors.length || 6)\n\n this.element = this.createMenuElement()\n this.snap = Svg(this.element.querySelector('svg')!)\n this.area = this.snap\n this.container = this.area.g().transform('s0')\n\n this.init().catch(console.error)\n }\n\n private createMenuElement(): HTMLElement\n {\n const div = document.createElement('div')\n div.className = 'context hidden'\n div.style.position = 'fixed'\n div.style.top = '0'\n div.style.left = '0'\n div.style.width = '100vw'\n div.style.height = '100vh'\n div.style.overflow = 'visible'\n div.style.pointerEvents = 'auto'\n\n if (this.config.zIndex && !isNaN(this.config.zIndex)) {\n div.style.zIndex = `${this.config.zIndex}`\n }\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', this.size.toString())\n svg.setAttribute('height', this.size.toString())\n svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`)\n svg.style.position = 'absolute'\n svg.style.display = 'block'\n svg.style.overflow = 'visible'\n svg.style.pointerEvents = 'auto'\n svg.classList.add('radial-menu-svg')\n\n svg.addEventListener('wheel', (e) => {\n e.preventDefault()\n this.transformOpacity(e)\n })\n\n svg.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n svg.addEventListener('click', (e) => {\n e.stopPropagation()\n this.hide()\n })\n\n div.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n div.addEventListener('click', (e) => {\n if (e.target === div) {\n this.hide()\n }\n })\n\n div.appendChild(svg)\n\n return div\n }\n\n private async init(): Promise<void>\n {\n await this.loadIcons()\n\n this.updateButtons()\n }\n\n public async loadIcons(sprite?: string): Promise<void>\n {\n if (this.icons) return\n\n sprite ||= this.config.sprite\n\n try {\n const response = await fetch(sprite)\n if (response.ok) {\n this.setIcons(await response.text())\n }\n } catch (e) {\n console.error('Failed to load icons:', e)\n }\n }\n\n public setIcons(sprite: string)\n {\n try {\n this.icons = parse(sprite)\n } catch (e) {\n console.error('Failed to parse icons:', e)\n }\n }\n\n public updateButtons(): void\n {\n if (!this.icons || !this.container) return\n\n this.container.clear()\n this.config.sectors.forEach(btn => {\n const icon = this.createIcon(btn)\n\n if (icon) {\n const buttonGroup = this.createButton(btn, this.createSector(), icon, this.createHint(btn))\n this.container.add(buttonGroup)\n }\n })\n\n if (this.config.centralButton) {\n const centralBtn = this.createCentralButton(this.config.centralButton)\n if (centralBtn) {\n this.container.add(centralBtn)\n }\n }\n }\n\n private createSector(): Svg.Element\n {\n const color = this.config.color ?? '#1976D2'\n\n return this.area.path(describeSector(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle))\n .attr({ fill: color, stroke: color, opacity: this.config.opacity })\n .addClass('radial-sector')\n }\n\n private createButton(btn: ISector, sector: Svg.Element, icon: Svg.Element, hint: Svg.Element): Svg.Paper\n {\n const buttonGroup = this.area.g(sector, icon, hint)\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.radial-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateButtonHover(buttonGroup, 0, 1, 200, mina.easeinout)\n },\n () => {\n buttonGroup.select('.radial-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateButtonHover(buttonGroup, 1, 0, 2000, mina.elastic)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n this.emit('click', { icon: btn.icon, hint: btn.hint })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createIcon(btn: ISector): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultRadius = (this.config.innerRadius + this.config.outerRadius) / 2\n const sectorHeight = this.config.outerRadius - this.config.innerRadius\n const defaultScale = (sectorHeight * 0.5) / bbox.height\n\n const midRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const targetAngle = this.angle / 2\n const rotation = targetAngle + (btn.rotate || 0)\n\n iconInitialData.set(icon, { midRadius, scale, rotation, bbox })\n\n const pos = polarToCartesian(this.c, this.c, midRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(scale)\n t.rotate(rotation, 0, 0)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t)\n\n return icon.addClass('radial-icon')\n }\n\n private createHint(btn: ISector): Svg.Element\n {\n const group = this.area.g()\n group.addClass('hint-group')\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint || btn.icon\n\n const textLength = measureTextLengthOnLine(text)\n const gap = 2\n\n let baseRadius: number\n let bgHeight = 0\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseRadius = this.config.outerRadius + bgHeight / 2 + gap\n } else {\n const textOffset = metrics.height * 0.75\n baseRadius = this.config.outerRadius + textOffset\n }\n\n const textAngleRad = textLength / baseRadius\n const textAngleDeg = textAngleRad * 180 / Math.PI\n const sectorMidAngle = this.angle / 2\n const startAngle = sectorMidAngle - textAngleDeg / 2\n const endAngle = sectorMidAngle + textAngleDeg / 2\n\n const arcPath = describeArc(this.c, this.c, baseRadius, startAngle, endAngle, false, false)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint').attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n group.add(hint)\n\n hintDataMap.set(group, {\n sectorMidAngle,\n baseRadius,\n textLength\n })\n\n return group\n }\n\n private createCentralButton(btn: ICentralButton): Svg.Element | null\n {\n const defaultRadius = this.config.innerRadius * 0.6\n const buttonRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const color = this.config.color ?? '#1976D2'\n\n const circle = this.area.circle({\n cx: this.c, cy: this.c, r: buttonRadius,\n fill: color, stroke: color,\n opacity: this.config.opacity\n })\n .addClass('radial-sector central-sector')\n\n circle.node.dataset.initialRadius = `${buttonRadius}`\n\n let icon: Svg.Element | null = null\n let hint: Svg.Element | null = null\n\n if (btn.icon) {\n icon = this.createCentralIcon(btn, buttonRadius)\n }\n if (btn.hint) {\n hint = this.createCentralHint(btn, buttonRadius)\n }\n\n const elements = [circle, icon, hint].filter(el => el !== null) as Svg.Element[]\n const buttonGroup = this.area.g(...elements).addClass('central-button')\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.central-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateCentralHover(buttonGroup, true)\n },\n () => {\n buttonGroup.select('.central-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateCentralHover(buttonGroup, false)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n\n this.emit('click', { icon: btn.icon, hint: btn.hint || '' })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createCentralIcon(btn: ICentralButton, buttonRadius: number): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultScale = (buttonRadius * 0.8) / Math.max(bbox.width, bbox.height)\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const t = new Matrix()\n\n t.translate(this.c, this.c)\n t.scale(scale)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t).addClass('radial-icon central-icon')\n\n iconInitialData.set(icon, {\n midRadius: 0,\n rotation: 0,\n scale,\n bbox\n })\n\n return icon\n }\n\n private createCentralHint(btn: ICentralButton, buttonRadius: number): Svg.Element\n {\n const group = this.area.g()\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint ?? ''\n // const textLength = measureTextLengthOnLine(text)\n\n let baseOffset: number\n let bgHeight = 0\n const gap = 2\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseOffset = btn.hintOffset ?? (bgHeight / 2 + gap)\n } else {\n if (btn.hintOffset != null) {\n baseOffset = btn.hintOffset\n } else {\n baseOffset = btn.hintDistance ?? 8\n }\n }\n\n const textRadius = buttonRadius + baseOffset\n\n let startAngle: number, endAngle: number, alter: boolean\n if (btn.hintStartAngle != null && btn.hintEndAngle != null) {\n startAngle = btn.hintStartAngle\n endAngle = btn.hintEndAngle\n alter = startAngle > endAngle\n } else {\n const span = btn.hintSpan ?? 120\n const half = span / 2\n const position = btn.hintPosition ?? 'top'\n\n if (position === 'bottom') {\n startAngle = 180 + half\n endAngle = 180 - half\n alter = true\n } else {\n startAngle = 360 - half\n endAngle = half\n alter = false\n }\n }\n\n const arcPath = describeArc(this.c, this.c, textRadius, startAngle, endAngle, false, alter)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint central-hint')\n .attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n const hintNode = hint.node\n hintNode.dataset.hintOffset = baseOffset.toString()\n hintNode.dataset.startAngle = startAngle.toString()\n hintNode.dataset.endAngle = endAngle.toString()\n hintNode.dataset.alter = alter ? 'true' : 'false'\n hintNode.dataset.centerX = this.c.toString()\n hintNode.dataset.centerY = this.c.toString()\n\n group.add(hint)\n\n return group\n }\n\n public show(e: MouseEvent): void\n {\n this.element.classList.remove('hidden')\n\n const svg = this.element.querySelector('svg') as SVGSVGElement\n\n svg.style.left = (e.clientX - this.c) + 'px'\n svg.style.top = (e.clientY - this.c) + 'px'\n\n this.animateContainer(0, 1, this.duration * 8, mina.elastic)\n this.animateButtons(0, 1, this.duration, this.duration * 8, mina.elastic)\n }\n\n public hide(): void\n {\n this.animateContainer(1, 0, this.duration, mina.easeinout, () => {\n this.element.classList.add('hidden')\n })\n\n this.animateButtons(1, 0, this.duration, this.duration, mina.easeinout)\n }\n\n private animate(obj: any, index: number, start: number, end: number, duration: number, easing: (n: number) => number, fn: (val: number) => void, cb?: () => void): void\n {\n obj.animation ||= []\n obj.animation[index]?.stop()\n obj.animation[index] = animate(start, end, fn, duration, easing, cb)\n }\n\n private animateContainer(start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n this.animate(this, 0, start, end, duration, easing, (val) => {\n this.container.transform(`r${90 - 90 * val},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }, cb)\n }\n\n private animateButtons(start: number, end: number, min: number, max: number, easing: (n: number) => number): void\n {\n const r = (min: number, max: number) => Math.random() * (max - min) + min\n\n this.container.children().forEach((el: Svg.Element, i: number) => {\n const isCentral = el.node.classList.contains('central-button')\n\n this.animate(el, 0, start, end, r(min, max), easing, (val) => {\n if (isCentral) {\n el.transform(`s${val},${val},${this.c},${this.c}`)\n } else {\n el.transform(`r${this.angle * i},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }\n })\n })\n }\n\n private animateButtonHover(buttonGroup: Svg.Paper, start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n const icon = buttonGroup.select('.radial-icon')\n const initialIcon = icon ? iconInitialData.get(icon) : undefined\n const hintGroup = buttonGroup.select('.hint-group')\n const hintData = hintGroup ? hintDataMap.get(hintGroup) : undefined\n\n this.animate(buttonGroup, 1, start, end, duration, easing, (val) => {\n const outward = val * 10\n\n buttonGroup.select('.radial-sector')?.attr({\n d: describeSector(this.c, this.c, this.config.outerRadius - outward, this.config.innerRadius, 0, this.angle)\n })\n\n if (icon && initialIcon) {\n const newRadius = initialIcon.midRadius - outward\n const newScale = initialIcon.scale * (1 - (val * 0.1))\n const targetAngle = this.angle / 2\n const pos = polarToCartesian(this.c, this.c, newRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(newScale)\n t.rotate(initialIcon.rotation, 0, 0)\n t.translate(-initialIcon.bbox.cx, -initialIcon.bbox.cy)\n\n icon.transform(t)\n }\n\n if (hintData && hintGroup) {\n const newRadius = hintData.baseRadius - outward\n const newAngleDeg = (hintData.textLength / newRadius) * 180 / Math.PI\n const newStart = hintData.sectorMidAngle - newAngleDeg / 2\n const newEnd = hintData.sectorMidAngle + newAngleDeg / 2\n const newPath = describeArc(this.c, this.c, newRadius, newStart, newEnd, false, false)\n\n const hint = hintGroup.select('.radial-hint')\n if (hint) {\n hint.attr('textpath', newPath)\n }\n\n const bg = hintGroup.select('.radial-hint-bg')\n if (bg) {\n bg.attr('d', newPath)\n }\n }\n }, cb)\n }\n\n private animateCentralHover(group: Svg.Element, active: boolean): void\n {\n const circle = group.select('.central-sector') as Svg.Element\n const icon = group.select('.central-icon') as Svg.Element\n const hint = group.select('.central-hint') as Svg.Element\n const bg = group.select('.radial-hint-bg') as Svg.Element\n\n if (!circle || !icon) return\n\n const initialRadius = parseFloat(circle.node.dataset.initialRadius || '30')\n const currentRadius = parseFloat(circle.attr('r') as string)\n const targetRadius = active ? initialRadius - 8 : initialRadius\n\n const initialIconData = icon ? iconInitialData.get(icon) : undefined\n\n let hintOffset = 12, startAngle = 0, endAngle = 0, centerX = this.c, centerY = this.c, alter = false\n if (hint) {\n hintOffset = parseFloat(hint.node.dataset.hintOffset || '12')\n startAngle = parseFloat(hint.node.dataset.startAngle || '0')\n endAngle = parseFloat(hint.node.dataset.endAngle || '0')\n centerX = parseFloat(hint.node.dataset.centerX || this.c.toString())\n centerY = parseFloat(hint.node.dataset.centerY || this.c.toString())\n alter = hint.node.dataset.alter === 'true'\n }\n\n animate(currentRadius, targetRadius, (val) => {\n circle.attr('r', val)\n\n if (icon && initialIconData) {\n const newScale = initialIconData.scale * (val / initialRadius)\n const t = new Matrix()\n t.translate(this.c, this.c)\n t.scale(newScale)\n t.translate(-initialIconData.bbox.cx, -initialIconData.bbox.cy)\n icon.transform(t)\n }\n\n if (hint) {\n const newRadius = val + hintOffset\n const newArc = describeArc(centerX, centerY, newRadius, startAngle, endAngle, false, alter)\n hint.attr({ textpath: newArc })\n if (bg) {\n bg.attr({ d: newArc })\n }\n }\n }, 200, mina.easeinout)\n }\n\n private transformOpacity(e: WheelEvent): void\n {\n const dy = e.deltaY > 0 ? 0.03 : -0.03\n this.config.opacity = clamp(this.config.opacity + dy, 0.4, 1)\n\n this.area.selectAll('.radial-sector').forEach((el: Svg.Element) => {\n el.attr({ opacity: this.config.opacity })\n })\n\n this.area.selectAll('.radial-hint-bg.active').forEach((el: Svg.Element) => {\n el.node.style.opacity = String(this.config.opacity)\n })\n }\n\n public on(event: string, callback: Function): void\n {\n (this.events[event] ??= []).push(callback)\n }\n\n private emit(event: string, data: any): void\n {\n if (this.events[event]) {\n this.events[event].forEach(callback => callback(data))\n }\n }\n}\n","import { isPromiseLike } from '@/utils'\nimport { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n public menu: Builder\n\n public shown: boolean = false\n\n constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig)\n {\n this.menu = new Builder(config)\n\n isPromiseLike(container)\n ? container.then((c) => c.appendChild(this.menu.element))\n : container.appendChild(this.menu.element)\n\n if (config.autoBindContextMenu !== false) {\n this.bindEvents()\n }\n }\n\n public setIcons(sprite: string)\n {\n this.menu.setIcons(sprite)\n }\n\n public bindEvents(el: HTMLElement | Window = window)\n {\n el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.toggle(e as PointerEvent)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public toggle(event: PointerEvent)\n {\n this.shown ? this.menu.hide() : this.menu.show(event)\n }\n\n public show(event: PointerEvent)\n {\n this.shown = true\n\n this.menu.show(event)\n }\n\n public hide()\n {\n this.shown = false\n\n this.menu.hide()\n }\n}\n"],"names":["defaultConfig","defineConfig","options","cache","getFontMetrics","font","ctx","fallback","metrics","ascent","descent","height","result","hintFontMetrics","getHintFontMetrics","div","styles","measureTextLengthOnLine","text","svgNS","tempSvg","tempText","length","isPromiseLike","value","rad","deg","p2s","pathToString","parseTransformString","TString","data","arr","_a","b","c","params","_","transform2matrix","tstr","tdata","m","Matrix","i","ii","t","defaultMatrix","a","d","e","f","aNew","bNew","det","x","y","cx","cy","angle","cos","sin","mina","n","q","Q","X","Y","animate","from","to","setter","duration","easing","callback","start","cancelled","frame","step","now","elapsed","progress","eased","val","idCounter","elementCache","getElement","node","paper","el","Element","child","nameOrAttrs","key","name","content","textPath","pathDescriptor","textEl","existingText","href","defs","pathId","path","className","classes","cls","rect","selector","found","nodes","fIn","fOut","fn","Paper","defsNode","args","group","groupEl","arg","pathEl","r","circle","circleEl","textElWrap","Fragment","frag","Svg","parse","svgString","svg","svgElem","clamp","v","l","h","hintDataMap","iconInitialData","polarToCartesian","describeArc","startAngle","endAngle","lineMove","alter","end","describeSector","r2","Builder","config","sprite","response","btn","icon","buttonGroup","centralBtn","color","sector","hint","bg","iconTemplate","bbox","defaultRadius","defaultScale","midRadius","scale","targetAngle","rotation","pos","hintPadding","textLength","gap","baseRadius","bgHeight","textOffset","textAngleDeg","sectorMidAngle","arcPath","bgColor","textPathEl","buttonRadius","elements","baseOffset","textRadius","half","hintNode","obj","index","cb","min","max","isCentral","initialIcon","hintGroup","hintData","outward","newRadius","newScale","newAngleDeg","newStart","newEnd","newPath","active","initialRadius","currentRadius","targetRadius","initialIconData","hintOffset","centerX","centerY","newArc","dy","event","Manager","container"],"mappings":"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"}
|
package/lib/menu/builder.d.ts
CHANGED
|
@@ -15,7 +15,8 @@ export declare class Builder {
|
|
|
15
15
|
constructor(config: IConfig);
|
|
16
16
|
private createMenuElement;
|
|
17
17
|
private init;
|
|
18
|
-
|
|
18
|
+
loadIcons(sprite?: string): Promise<void>;
|
|
19
|
+
setIcons(sprite: string): void;
|
|
19
20
|
updateButtons(): void;
|
|
20
21
|
private createSector;
|
|
21
22
|
private createButton;
|
package/lib/menu/manager.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare class Manager {
|
|
|
4
4
|
menu: Builder;
|
|
5
5
|
shown: boolean;
|
|
6
6
|
constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig);
|
|
7
|
+
setIcons(sprite: string): void;
|
|
7
8
|
bindEvents(el?: HTMLElement | Window): void;
|
|
8
9
|
on(event: string, callback: Function): void;
|
|
9
10
|
toggle(event: PointerEvent): void;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alekstar79/context-menu",
|
|
3
3
|
"description": "Context Menu TS is a customizable radial context menu for web applications, written in TypeScript.",
|
|
4
|
-
"version": "2.1.
|
|
4
|
+
"version": "2.1.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Aleksey Tarasenko <alekstar79@yandex.ru>",
|