@alekstar79/context-menu 2.1.0 → 2.1.1

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