@alekstar79/context-menu 2.0.4 → 2.0.6
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
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
const
|
|
1
|
+
const F = {
|
|
2
2
|
sectors: [],
|
|
3
3
|
sprite: "../icons.svg",
|
|
4
4
|
innerRadius: 50,
|
|
5
5
|
outerRadius: 150,
|
|
6
6
|
opacity: 0.7
|
|
7
7
|
};
|
|
8
|
-
function
|
|
9
|
-
return { ...
|
|
8
|
+
function K(o) {
|
|
9
|
+
return { ...F, ...o };
|
|
10
10
|
}
|
|
11
11
|
const A = /* @__PURE__ */ new Map();
|
|
12
|
-
function
|
|
12
|
+
function D(o) {
|
|
13
13
|
if (A.has(o))
|
|
14
14
|
return A.get(o);
|
|
15
15
|
const e = document.createElement("canvas").getContext("2d");
|
|
@@ -28,10 +28,10 @@ function N() {
|
|
|
28
28
|
o.className = "radial-hint", o.style.position = "absolute", o.style.visibility = "hidden", o.style.pointerEvents = "none", o.textContent = "A", document.body.appendChild(o);
|
|
29
29
|
const t = window.getComputedStyle(o), e = `${t.fontWeight} ${t.fontSize} ${t.fontFamily}`;
|
|
30
30
|
document.body.removeChild(o);
|
|
31
|
-
const s =
|
|
31
|
+
const s = D(e);
|
|
32
32
|
return R = s, s;
|
|
33
33
|
}
|
|
34
|
-
function
|
|
34
|
+
function H(o) {
|
|
35
35
|
const t = "http://www.w3.org/2000/svg", e = document.createElementNS(t, "svg");
|
|
36
36
|
e.style.position = "absolute", e.style.visibility = "hidden", document.body.appendChild(e);
|
|
37
37
|
const s = document.createElementNS(t, "text");
|
|
@@ -39,19 +39,22 @@ function q(o) {
|
|
|
39
39
|
const i = s.getComputedTextLength();
|
|
40
40
|
return document.body.removeChild(e), i;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
function q(o) {
|
|
43
|
+
return o && o.then !== void 0;
|
|
44
|
+
}
|
|
45
|
+
const z = (o) => o % 360 * Math.PI / 180, T = /,?([a-z]),?/gi;
|
|
43
46
|
function O() {
|
|
44
47
|
return this.join(",").replace(T, "$1");
|
|
45
48
|
}
|
|
46
|
-
const
|
|
49
|
+
const _ = (o) => {
|
|
47
50
|
if (!o) return null;
|
|
48
51
|
let t = [];
|
|
49
52
|
return Array.isArray(o) && Array.isArray(o[0]) && (t = o.map((e) => [...e])), t.length || String(o).replace(/([rstm])\s*,?\s*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig, (e, s, i) => {
|
|
50
53
|
const n = [];
|
|
51
54
|
return i.replace(/(-?\d*\.?\d*(?:e[\-+]?\d+)?)\s*,?\s*/ig, (r, a) => (a && n.push(+a), "")), t.push([s, ...n]), "";
|
|
52
55
|
}), t.toString = O, t;
|
|
53
|
-
},
|
|
54
|
-
const t =
|
|
56
|
+
}, G = (o) => {
|
|
57
|
+
const t = _(o), e = new C();
|
|
55
58
|
if (t)
|
|
56
59
|
for (let s = 0, i = t.length; s < i; s++) {
|
|
57
60
|
const n = t[s];
|
|
@@ -71,7 +74,7 @@ const z = (o) => {
|
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
76
|
return e;
|
|
74
|
-
},
|
|
77
|
+
}, W = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };
|
|
75
78
|
class C {
|
|
76
79
|
a;
|
|
77
80
|
b;
|
|
@@ -89,7 +92,7 @@ class C {
|
|
|
89
92
|
Object.assign(this, t);
|
|
90
93
|
return;
|
|
91
94
|
}
|
|
92
|
-
t != null ? Object.assign(this, { a: +t, b: +e, c: +s, d: +i, e: +n, f: +r }) : Object.assign(this,
|
|
95
|
+
t != null ? Object.assign(this, { a: +t, b: +e, c: +s, d: +i, e: +n, f: +r }) : Object.assign(this, W);
|
|
93
96
|
}
|
|
94
97
|
/**
|
|
95
98
|
* Multiplies current matrix by another matrix.
|
|
@@ -136,7 +139,7 @@ class C {
|
|
|
136
139
|
* Rotates the matrix by angle (degrees) about point (x, y).
|
|
137
140
|
*/
|
|
138
141
|
rotate(t, e = 0, s = 0) {
|
|
139
|
-
t =
|
|
142
|
+
t = z(t);
|
|
140
143
|
const i = +Math.cos(t).toFixed(9), n = +Math.sin(t).toFixed(9);
|
|
141
144
|
return this.add(i, n, -n, i, e, s), this.add(1, 0, 0, 1, -e, -s);
|
|
142
145
|
}
|
|
@@ -176,7 +179,7 @@ function P(o, t, e, s, i = b.linear, n) {
|
|
|
176
179
|
if (a) return;
|
|
177
180
|
const p = h - r, u = Math.min(p / s, 1), d = i(u);
|
|
178
181
|
if (Array.isArray(o) && Array.isArray(t)) {
|
|
179
|
-
const m = o.map((
|
|
182
|
+
const m = o.map((w, y) => w + (t[y] - w) * d);
|
|
180
183
|
e(m);
|
|
181
184
|
} else {
|
|
182
185
|
const m = o + (t - o) * d;
|
|
@@ -190,7 +193,7 @@ function P(o, t, e, s, i = b.linear, n) {
|
|
|
190
193
|
}
|
|
191
194
|
};
|
|
192
195
|
}
|
|
193
|
-
let
|
|
196
|
+
let Y = 0;
|
|
194
197
|
const $ = /* @__PURE__ */ new WeakMap();
|
|
195
198
|
function x(o, t) {
|
|
196
199
|
if ($.has(o)) {
|
|
@@ -205,7 +208,7 @@ class B {
|
|
|
205
208
|
paper;
|
|
206
209
|
_id;
|
|
207
210
|
constructor(t, e) {
|
|
208
|
-
this.node = t, this.paper = e, this._id = "e" + (
|
|
211
|
+
this.node = t, this.paper = e, this._id = "e" + (Y++).toString(36);
|
|
209
212
|
}
|
|
210
213
|
get type() {
|
|
211
214
|
return this.node.tagName;
|
|
@@ -284,7 +287,7 @@ class B {
|
|
|
284
287
|
if (t instanceof C)
|
|
285
288
|
this.node.setAttribute("transform", t.toString());
|
|
286
289
|
else {
|
|
287
|
-
const e =
|
|
290
|
+
const e = G(t);
|
|
288
291
|
this.node.setAttribute("transform", e.toString());
|
|
289
292
|
}
|
|
290
293
|
return this;
|
|
@@ -372,7 +375,7 @@ class k extends B {
|
|
|
372
375
|
return typeof t == "object" ? n.attr(t) : t != null && n.attr({ x: t, y: e ?? t, text: s ?? "" }), n;
|
|
373
376
|
}
|
|
374
377
|
}
|
|
375
|
-
class
|
|
378
|
+
class j {
|
|
376
379
|
frag;
|
|
377
380
|
constructor(t) {
|
|
378
381
|
this.frag = t;
|
|
@@ -386,14 +389,14 @@ class Y {
|
|
|
386
389
|
return Array.from(e).map((s) => x(s));
|
|
387
390
|
}
|
|
388
391
|
}
|
|
389
|
-
function
|
|
392
|
+
function V(o) {
|
|
390
393
|
if (typeof o == "string") {
|
|
391
394
|
const t = document.querySelector(o);
|
|
392
395
|
return t ? new k(t) : null;
|
|
393
396
|
}
|
|
394
397
|
return o instanceof SVGSVGElement ? new k(o) : null;
|
|
395
398
|
}
|
|
396
|
-
function
|
|
399
|
+
function X(o) {
|
|
397
400
|
const t = document.createElement("div");
|
|
398
401
|
let e = o.trim();
|
|
399
402
|
e.match(/^\s*<\s*svg/i) || (e = "<svg>" + e + "</svg>"), t.innerHTML = e;
|
|
@@ -401,9 +404,9 @@ function V(o) {
|
|
|
401
404
|
if (s)
|
|
402
405
|
for (; s.firstChild; )
|
|
403
406
|
i.appendChild(s.firstChild);
|
|
404
|
-
return new
|
|
407
|
+
return new j(i);
|
|
405
408
|
}
|
|
406
|
-
const
|
|
409
|
+
const Q = (o, t, e) => o > e ? e : o < t ? t : o, L = /* @__PURE__ */ new WeakMap(), E = /* @__PURE__ */ new WeakMap();
|
|
407
410
|
function M(o, t, e, s) {
|
|
408
411
|
return s = (s - 90) * Math.PI / 180, {
|
|
409
412
|
x: o + e * Math.cos(s),
|
|
@@ -414,10 +417,10 @@ function S(o, t, e, s, i, n, r) {
|
|
|
414
417
|
const a = M(o, t, e, s %= 360), c = M(o, t, e, i %= 360);
|
|
415
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}`;
|
|
416
419
|
}
|
|
417
|
-
function
|
|
420
|
+
function I(o, t, e, s, i, n) {
|
|
418
421
|
return `${S(o, t, e, i, n, !1, !1)} ${S(o, t, s, n, i, !0, !0)}Z`;
|
|
419
422
|
}
|
|
420
|
-
class
|
|
423
|
+
class Z {
|
|
421
424
|
config;
|
|
422
425
|
events = {};
|
|
423
426
|
container;
|
|
@@ -431,11 +434,11 @@ class Q {
|
|
|
431
434
|
icons = null;
|
|
432
435
|
theme = "light";
|
|
433
436
|
constructor(t) {
|
|
434
|
-
this.config = t, this.size = 2 * t.outerRadius, this.c = this.size / 2, this.angle = 360 / (this.config.sectors.length || 6), this.element = this.createMenuElement(), this.snap =
|
|
437
|
+
this.config = t, this.size = 2 * t.outerRadius, this.c = this.size / 2, this.angle = 360 / (this.config.sectors.length || 6), this.element = this.createMenuElement(), this.snap = V(this.element.querySelector("svg")), this.area = this.snap, this.container = this.area.g().transform("s0"), this.init().catch(console.error);
|
|
435
438
|
}
|
|
436
439
|
createMenuElement() {
|
|
437
440
|
const t = document.createElement("div");
|
|
438
|
-
t.className = "context
|
|
441
|
+
t.className = "context hidden", t.style.position = "fixed", t.style.top = "0", t.style.left = "0", t.style.width = "100vw", t.style.height = "100vh", t.style.overflow = "visible", t.style.pointerEvents = "auto", this.config.zIndex && !isNaN(this.config.zIndex) && (t.style.zIndex = `${this.config.zIndex}`);
|
|
439
442
|
const e = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
440
443
|
return e.setAttribute("width", this.size.toString()), e.setAttribute("height", this.size.toString()), e.setAttribute("viewBox", `0 0 ${this.size} ${this.size}`), e.style.position = "absolute", e.style.display = "block", e.style.overflow = "visible", e.style.pointerEvents = "auto", e.classList.add("radial-menu-svg"), e.addEventListener("wheel", (s) => {
|
|
441
444
|
s.preventDefault(), this.transformOpacity(s);
|
|
@@ -443,6 +446,8 @@ class Q {
|
|
|
443
446
|
s.stopPropagation(), s.preventDefault(), this.hide();
|
|
444
447
|
}), e.addEventListener("click", (s) => {
|
|
445
448
|
s.stopPropagation(), this.hide();
|
|
449
|
+
}), t.addEventListener("contextmenu", (s) => {
|
|
450
|
+
s.stopPropagation(), s.preventDefault(), this.hide();
|
|
446
451
|
}), t.addEventListener("click", (s) => {
|
|
447
452
|
s.target === t && this.hide();
|
|
448
453
|
}), t.appendChild(e), t;
|
|
@@ -454,7 +459,7 @@ class Q {
|
|
|
454
459
|
if (!this.icons)
|
|
455
460
|
try {
|
|
456
461
|
const t = await fetch(this.config.sprite);
|
|
457
|
-
t.ok && (this.icons =
|
|
462
|
+
t.ok && (this.icons = X(await t.text()));
|
|
458
463
|
} catch (t) {
|
|
459
464
|
console.error("Failed to load icons:", t);
|
|
460
465
|
}
|
|
@@ -473,7 +478,7 @@ class Q {
|
|
|
473
478
|
}
|
|
474
479
|
createSector() {
|
|
475
480
|
const t = this.config.color ?? "#1976D2";
|
|
476
|
-
return this.area.path(
|
|
481
|
+
return this.area.path(I(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");
|
|
477
482
|
}
|
|
478
483
|
createButton(t, e, s, i) {
|
|
479
484
|
const n = this.area.g(e, s, i);
|
|
@@ -505,7 +510,7 @@ class Q {
|
|
|
505
510
|
createHint(t) {
|
|
506
511
|
const e = this.area.g();
|
|
507
512
|
e.addClass("hint-group");
|
|
508
|
-
const s = t.hintPadding ?? this.config.hintPadding, i = N(), n = t.hint || t.icon, r =
|
|
513
|
+
const s = t.hintPadding ?? this.config.hintPadding, i = N(), n = t.hint || t.icon, r = H(n), a = 2;
|
|
509
514
|
let c, l = 0;
|
|
510
515
|
if (s !== void 0)
|
|
511
516
|
l = i.height + 2 * s, c = this.config.outerRadius + l / 2 + a;
|
|
@@ -513,9 +518,9 @@ class Q {
|
|
|
513
518
|
const v = i.height * 0.75;
|
|
514
519
|
c = this.config.outerRadius + v;
|
|
515
520
|
}
|
|
516
|
-
const p = r / c * 180 / Math.PI, u = this.angle / 2, d = u - p / 2, m = u + p / 2,
|
|
521
|
+
const p = r / c * 180 / Math.PI, u = this.angle / 2, d = u - p / 2, m = u + p / 2, w = S(this.c, this.c, c, d, m, !1, !1);
|
|
517
522
|
if (s !== void 0) {
|
|
518
|
-
const v = this.config.color ?? "#1976D2", g = this.area.path(
|
|
523
|
+
const v = this.config.color ?? "#1976D2", g = this.area.path(w).attr({
|
|
519
524
|
stroke: v,
|
|
520
525
|
"stroke-width": `${l}`,
|
|
521
526
|
"stroke-linecap": "round",
|
|
@@ -524,11 +529,11 @@ class Q {
|
|
|
524
529
|
}).addClass("radial-hint-bg");
|
|
525
530
|
g.node.style.opacity = "0", e.add(g);
|
|
526
531
|
}
|
|
527
|
-
const
|
|
532
|
+
const y = this.area.text(0, 0, n).addClass("radial-hint").attr({
|
|
528
533
|
fill: this.theme === "light" ? "#333333" : "#7a7a7a",
|
|
529
|
-
textpath:
|
|
530
|
-
}), f =
|
|
531
|
-
return f && (f.attr("dominant-baseline", "central"), f.attr("startOffset", "50%")), e.add(
|
|
534
|
+
textpath: w
|
|
535
|
+
}), f = y.select("textPath");
|
|
536
|
+
return f && (f.attr("dominant-baseline", "central"), f.attr("startOffset", "50%")), e.add(y), L.set(e, {
|
|
532
537
|
sectorMidAngle: u,
|
|
533
538
|
baseRadius: c,
|
|
534
539
|
textLength: r
|
|
@@ -598,13 +603,13 @@ class Q {
|
|
|
598
603
|
}).addClass("radial-hint-bg");
|
|
599
604
|
g.node.style.opacity = "0", s.add(g);
|
|
600
605
|
}
|
|
601
|
-
const
|
|
606
|
+
const w = this.area.text(0, 0, r).addClass("radial-hint central-hint").attr({
|
|
602
607
|
fill: this.theme === "light" ? "#333333" : "#7a7a7a",
|
|
603
608
|
textpath: m
|
|
604
|
-
}),
|
|
605
|
-
|
|
606
|
-
const f =
|
|
607
|
-
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(
|
|
609
|
+
}), y = w.select("textPath");
|
|
610
|
+
y && (y.attr("dominant-baseline", "central"), y.attr("startOffset", "50%"));
|
|
611
|
+
const f = w.node;
|
|
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(w), s;
|
|
608
613
|
}
|
|
609
614
|
show(t) {
|
|
610
615
|
this.element.classList.remove("hidden");
|
|
@@ -638,13 +643,13 @@ class Q {
|
|
|
638
643
|
this.animate(t, 1, e, s, i, n, (p) => {
|
|
639
644
|
const u = p * 10;
|
|
640
645
|
if (t.select(".radial-sector")?.attr({
|
|
641
|
-
d:
|
|
646
|
+
d: I(this.c, this.c, this.config.outerRadius - u, this.config.innerRadius, 0, this.angle)
|
|
642
647
|
}), a && c) {
|
|
643
|
-
const d = c.midRadius - u, m = c.scale * (1 - p * 0.1),
|
|
644
|
-
f.translate(
|
|
648
|
+
const d = c.midRadius - u, m = c.scale * (1 - p * 0.1), w = this.angle / 2, y = M(this.c, this.c, d, w), f = new C();
|
|
649
|
+
f.translate(y.x, y.y), f.scale(m), f.rotate(c.rotation, 0, 0), f.translate(-c.bbox.cx, -c.bbox.cy), a.transform(f);
|
|
645
650
|
}
|
|
646
651
|
if (h && l) {
|
|
647
|
-
const d = h.baseRadius - u, m = h.textLength / d * 180 / Math.PI,
|
|
652
|
+
const d = h.baseRadius - u, m = h.textLength / d * 180 / Math.PI, w = h.sectorMidAngle - m / 2, y = h.sectorMidAngle + m / 2, f = S(this.c, this.c, d, w, y, !1, !1), v = l.select(".radial-hint");
|
|
648
653
|
v && v.attr("textpath", f);
|
|
649
654
|
const g = l.select(".radial-hint-bg");
|
|
650
655
|
g && g.attr("d", f);
|
|
@@ -655,21 +660,21 @@ class Q {
|
|
|
655
660
|
const s = t.select(".central-sector"), i = t.select(".central-icon"), n = t.select(".central-hint"), r = t.select(".radial-hint-bg");
|
|
656
661
|
if (!s || !i) return;
|
|
657
662
|
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;
|
|
658
|
-
let p = 12, u = 0, d = 0, m = this.c,
|
|
659
|
-
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()),
|
|
663
|
+
let p = 12, u = 0, d = 0, m = this.c, w = this.c, y = !1;
|
|
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()), w = parseFloat(n.node.dataset.centerY || this.c.toString()), y = n.node.dataset.alter === "true"), P(c, l, (f) => {
|
|
660
665
|
if (s.attr("r", f), i && h) {
|
|
661
666
|
const v = h.scale * (f / a), g = new C();
|
|
662
667
|
g.translate(this.c, this.c), g.scale(v), g.translate(-h.bbox.cx, -h.bbox.cy), i.transform(g);
|
|
663
668
|
}
|
|
664
669
|
if (n) {
|
|
665
|
-
const v = f + p, g = S(m,
|
|
670
|
+
const v = f + p, g = S(m, w, v, u, d, !1, y);
|
|
666
671
|
n.attr({ textpath: g }), r && r.attr({ d: g });
|
|
667
672
|
}
|
|
668
673
|
}, 200, b.easeinout);
|
|
669
674
|
}
|
|
670
675
|
transformOpacity(t) {
|
|
671
676
|
const e = t.deltaY > 0 ? 0.03 : -0.03;
|
|
672
|
-
this.config.opacity =
|
|
677
|
+
this.config.opacity = Q(this.config.opacity + e, 0.4, 1), this.area.selectAll(".radial-sector").forEach((s) => {
|
|
673
678
|
s.attr({ opacity: this.config.opacity });
|
|
674
679
|
}), this.area.selectAll(".radial-hint-bg.active").forEach((s) => {
|
|
675
680
|
s.node.style.opacity = String(this.config.opacity);
|
|
@@ -682,28 +687,32 @@ class Q {
|
|
|
682
687
|
this.events[t] && this.events[t].forEach((s) => s(e));
|
|
683
688
|
}
|
|
684
689
|
}
|
|
685
|
-
class
|
|
690
|
+
class U {
|
|
686
691
|
menu;
|
|
692
|
+
shown = !1;
|
|
687
693
|
constructor(t, e) {
|
|
688
|
-
this.menu = new
|
|
694
|
+
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();
|
|
689
695
|
}
|
|
690
|
-
bindEvents() {
|
|
691
|
-
|
|
692
|
-
|
|
696
|
+
bindEvents(t = window) {
|
|
697
|
+
t.addEventListener("contextmenu", (e) => {
|
|
698
|
+
e.preventDefault(), this.toggle(e);
|
|
693
699
|
});
|
|
694
700
|
}
|
|
695
701
|
on(t, e) {
|
|
696
702
|
this.menu.on(t, e);
|
|
697
703
|
}
|
|
704
|
+
toggle(t) {
|
|
705
|
+
this.shown ? this.menu.hide() : this.menu.show(t);
|
|
706
|
+
}
|
|
698
707
|
show(t) {
|
|
699
|
-
this.menu.show(t);
|
|
708
|
+
this.shown = !0, this.menu.show(t);
|
|
700
709
|
}
|
|
701
710
|
hide() {
|
|
702
|
-
this.menu.hide();
|
|
711
|
+
this.shown = !1, this.menu.hide();
|
|
703
712
|
}
|
|
704
713
|
}
|
|
705
714
|
export {
|
|
706
|
-
|
|
707
|
-
|
|
715
|
+
U as Manager,
|
|
716
|
+
K as defineConfig
|
|
708
717
|
};
|
|
709
718
|
//# sourceMappingURL=context-menu.js.map
|
package/lib/context-menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/text-metrics.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 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}\n\nexport 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\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","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/text-metrics'\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 private readonly config: IConfig\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 public element: HTMLElement\n private area: Svg.Paper\n\n private duration = 300\n\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 theme--light 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 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('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 private 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 { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n private menu: Builder\n\n constructor(container: HTMLElement, config: IConfig)\n {\n this.menu = new Builder(config)\n container.appendChild(this.menu.element)\n\n if (config.autoBindContextMenu !== false) {\n this.bindEvents()\n }\n }\n\n private bindEvents()\n {\n window.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.menu.show(e)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public show(event: PointerEvent)\n {\n this.menu.show(event)\n }\n\n public hide()\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","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","value","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 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\nexport 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\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 private readonly config: IConfig\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 public element: HTMLElement\n private area: Svg.Paper\n\n private duration = 300\n\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 private 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 private 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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"}
|
package/lib/menu/config.d.ts
CHANGED
package/lib/menu/manager.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { IConfig } from './config';
|
|
2
2
|
export declare class Manager {
|
|
3
3
|
private menu;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
shown: boolean;
|
|
5
|
+
constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig);
|
|
6
|
+
bindEvents(el?: HTMLElement | Window): void;
|
|
6
7
|
on(event: string, callback: Function): void;
|
|
8
|
+
toggle(event: PointerEvent): void;
|
|
7
9
|
show(event: PointerEvent): void;
|
|
8
10
|
hide(): void;
|
|
9
11
|
}
|
|
@@ -14,4 +14,10 @@ export declare function getHintFontMetrics(): FontMetrics;
|
|
|
14
14
|
* @param {string} text - text content
|
|
15
15
|
*/
|
|
16
16
|
export declare function measureTextLengthOnLine(text: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* @template T
|
|
19
|
+
* @param {PromiseLike<T> | HTMLElement} value
|
|
20
|
+
* @returns boolean
|
|
21
|
+
*/
|
|
22
|
+
export declare function isPromiseLike<T extends any>(value: any): value is PromiseLike<T>;
|
|
17
23
|
export {};
|
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.0.
|
|
4
|
+
"version": "2.0.6",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Aleksey Tarasenko <alekstar79@yandex.ru>",
|