@alekstar79/context-menu 2.0.4 → 2.0.5

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.
@@ -5,7 +5,7 @@ const I = {
5
5
  outerRadius: 150,
6
6
  opacity: 0.7
7
7
  };
8
- function J(o) {
8
+ function K(o) {
9
9
  return { ...I, ...o };
10
10
  }
11
11
  const A = /* @__PURE__ */ new Map();
@@ -22,7 +22,7 @@ function H(o) {
22
22
  return A.set(o, a), a;
23
23
  }
24
24
  let R = null;
25
- function N() {
25
+ function P() {
26
26
  if (R) return R;
27
27
  const o = document.createElement("div");
28
28
  o.className = "radial-hint", o.style.position = "absolute", o.style.visibility = "hidden", o.style.pointerEvents = "none", o.textContent = "A", document.body.appendChild(o);
@@ -39,19 +39,22 @@ function q(o) {
39
39
  const i = s.getComputedTextLength();
40
40
  return document.body.removeChild(e), i;
41
41
  }
42
- const D = (o) => o % 360 * Math.PI / 180, T = /,?([a-z]),?/gi;
43
- function O() {
44
- return this.join(",").replace(T, "$1");
42
+ function D(o) {
43
+ return o && o.then !== void 0;
45
44
  }
46
- const z = (o) => {
45
+ const T = (o) => o % 360 * Math.PI / 180, O = /,?([a-z]),?/gi;
46
+ function z() {
47
+ return this.join(",").replace(O, "$1");
48
+ }
49
+ const _ = (o) => {
47
50
  if (!o) return null;
48
51
  let t = [];
49
52
  return Array.isArray(o) && Array.isArray(o[0]) && (t = o.map((e) => [...e])), t.length || String(o).replace(/([rstm])\s*,?\s*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig, (e, s, i) => {
50
53
  const n = [];
51
54
  return i.replace(/(-?\d*\.?\d*(?:e[\-+]?\d+)?)\s*,?\s*/ig, (r, a) => (a && n.push(+a), "")), t.push([s, ...n]), "";
52
- }), t.toString = O, t;
53
- }, _ = (o) => {
54
- const t = z(o), e = new C();
55
+ }), t.toString = z, t;
56
+ }, G = (o) => {
57
+ const t = _(o), e = new C();
55
58
  if (t)
56
59
  for (let s = 0, i = t.length; s < i; s++) {
57
60
  const n = t[s];
@@ -71,7 +74,7 @@ const z = (o) => {
71
74
  }
72
75
  }
73
76
  return e;
74
- }, G = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };
77
+ }, W = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };
75
78
  class C {
76
79
  a;
77
80
  b;
@@ -89,7 +92,7 @@ class C {
89
92
  Object.assign(this, t);
90
93
  return;
91
94
  }
92
- t != null ? Object.assign(this, { a: +t, b: +e, c: +s, d: +i, e: +n, f: +r }) : Object.assign(this, G);
95
+ t != null ? Object.assign(this, { a: +t, b: +e, c: +s, d: +i, e: +n, f: +r }) : Object.assign(this, W);
93
96
  }
94
97
  /**
95
98
  * Multiplies current matrix by another matrix.
@@ -136,7 +139,7 @@ class C {
136
139
  * Rotates the matrix by angle (degrees) about point (x, y).
137
140
  */
138
141
  rotate(t, e = 0, s = 0) {
139
- t = D(t);
142
+ t = T(t);
140
143
  const i = +Math.cos(t).toFixed(9), n = +Math.sin(t).toFixed(9);
141
144
  return this.add(i, n, -n, i, e, s), this.add(1, 0, 0, 1, -e, -s);
142
145
  }
@@ -169,7 +172,7 @@ const b = {
169
172
  },
170
173
  elastic: (o) => o === 0 || o === 1 ? o : Math.pow(2, -10 * o) * Math.sin((o - 0.075) * (2 * Math.PI) / 0.3) + 1
171
174
  };
172
- function P(o, t, e, s, i = b.linear, n) {
175
+ function k(o, t, e, s, i = b.linear, n) {
173
176
  const r = performance.now();
174
177
  let a = !1, c = 0;
175
178
  const l = (h) => {
@@ -190,7 +193,7 @@ function P(o, t, e, s, i = b.linear, n) {
190
193
  }
191
194
  };
192
195
  }
193
- let W = 0;
196
+ let Y = 0;
194
197
  const $ = /* @__PURE__ */ new WeakMap();
195
198
  function x(o, t) {
196
199
  if ($.has(o)) {
@@ -205,7 +208,7 @@ class B {
205
208
  paper;
206
209
  _id;
207
210
  constructor(t, e) {
208
- this.node = t, this.paper = e, this._id = "e" + (W++).toString(36);
211
+ this.node = t, this.paper = e, this._id = "e" + (Y++).toString(36);
209
212
  }
210
213
  get type() {
211
214
  return this.node.tagName;
@@ -284,7 +287,7 @@ class B {
284
287
  if (t instanceof C)
285
288
  this.node.setAttribute("transform", t.toString());
286
289
  else {
287
- const e = _(t);
290
+ const e = G(t);
288
291
  this.node.setAttribute("transform", e.toString());
289
292
  }
290
293
  return this;
@@ -338,7 +341,7 @@ class B {
338
341
  return this.node.addEventListener("mouseup", t), this;
339
342
  }
340
343
  }
341
- class k extends B {
344
+ class N extends B {
342
345
  defs;
343
346
  constructor(t) {
344
347
  super(t, null), this.paper = this, $.set(t, this);
@@ -372,7 +375,7 @@ class k extends B {
372
375
  return typeof t == "object" ? n.attr(t) : t != null && n.attr({ x: t, y: e ?? t, text: s ?? "" }), n;
373
376
  }
374
377
  }
375
- class Y {
378
+ class j {
376
379
  frag;
377
380
  constructor(t) {
378
381
  this.frag = t;
@@ -386,14 +389,14 @@ class Y {
386
389
  return Array.from(e).map((s) => x(s));
387
390
  }
388
391
  }
389
- function j(o) {
392
+ function V(o) {
390
393
  if (typeof o == "string") {
391
394
  const t = document.querySelector(o);
392
- return t ? new k(t) : null;
395
+ return t ? new N(t) : null;
393
396
  }
394
- return o instanceof SVGSVGElement ? new k(o) : null;
397
+ return o instanceof SVGSVGElement ? new N(o) : null;
395
398
  }
396
- function V(o) {
399
+ function X(o) {
397
400
  const t = document.createElement("div");
398
401
  let e = o.trim();
399
402
  e.match(/^\s*<\s*svg/i) || (e = "<svg>" + e + "</svg>"), t.innerHTML = e;
@@ -401,9 +404,9 @@ function V(o) {
401
404
  if (s)
402
405
  for (; s.firstChild; )
403
406
  i.appendChild(s.firstChild);
404
- return new Y(i);
407
+ return new j(i);
405
408
  }
406
- const X = (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, L = /* @__PURE__ */ new WeakMap(), E = /* @__PURE__ */ new WeakMap();
407
410
  function M(o, t, e, s) {
408
411
  return s = (s - 90) * Math.PI / 180, {
409
412
  x: o + e * Math.cos(s),
@@ -417,7 +420,7 @@ function S(o, t, e, s, i, n, r) {
417
420
  function F(o, t, e, s, i, n) {
418
421
  return `${S(o, t, e, i, n, !1, !1)} ${S(o, t, s, n, i, !0, !0)}Z`;
419
422
  }
420
- class Q {
423
+ class Z {
421
424
  config;
422
425
  events = {};
423
426
  container;
@@ -431,7 +434,7 @@ class Q {
431
434
  icons = null;
432
435
  theme = "light";
433
436
  constructor(t) {
434
- this.config = t, this.size = 2 * t.outerRadius, this.c = this.size / 2, this.angle = 360 / (this.config.sectors.length || 6), this.element = this.createMenuElement(), this.snap = j(this.element.querySelector("svg")), this.area = this.snap, this.container = this.area.g().transform("s0"), this.init().catch(console.error);
437
+ this.config = t, this.size = 2 * t.outerRadius, this.c = this.size / 2, this.angle = 360 / (this.config.sectors.length || 6), this.element = this.createMenuElement(), this.snap = V(this.element.querySelector("svg")), this.area = this.snap, this.container = this.area.g().transform("s0"), this.init().catch(console.error);
435
438
  }
436
439
  createMenuElement() {
437
440
  const t = document.createElement("div");
@@ -454,7 +457,7 @@ class Q {
454
457
  if (!this.icons)
455
458
  try {
456
459
  const t = await fetch(this.config.sprite);
457
- t.ok && (this.icons = V(await t.text()));
460
+ t.ok && (this.icons = X(await t.text()));
458
461
  } catch (t) {
459
462
  console.error("Failed to load icons:", t);
460
463
  }
@@ -505,7 +508,7 @@ class Q {
505
508
  createHint(t) {
506
509
  const e = this.area.g();
507
510
  e.addClass("hint-group");
508
- const s = t.hintPadding ?? this.config.hintPadding, i = N(), n = t.hint || t.icon, r = q(n), a = 2;
511
+ const s = t.hintPadding ?? this.config.hintPadding, i = P(), n = t.hint || t.icon, r = q(n), a = 2;
509
512
  let c, l = 0;
510
513
  if (s !== void 0)
511
514
  l = i.height + 2 * s, c = this.config.outerRadius + l / 2 + a;
@@ -576,7 +579,7 @@ class Q {
576
579
  }), i;
577
580
  }
578
581
  createCentralHint(t, e) {
579
- const s = this.area.g(), i = t.hintPadding ?? this.config.hintPadding, n = N(), r = t.hint ?? "";
582
+ const s = this.area.g(), i = t.hintPadding ?? this.config.hintPadding, n = P(), r = t.hint ?? "";
580
583
  let a, c = 0;
581
584
  i !== void 0 ? (c = n.height + 2 * i, a = t.hintOffset ?? c / 2 + 2) : t.hintOffset != null ? a = t.hintOffset : a = t.hintDistance ?? 8;
582
585
  const h = e + a;
@@ -617,7 +620,7 @@ class Q {
617
620
  }), this.animateButtons(1, 0, this.duration, this.duration, b.easeinout);
618
621
  }
619
622
  animate(t, e, s, i, n, r, a, c) {
620
- t.animation ||= [], t.animation[e]?.stop(), t.animation[e] = P(s, i, a, n, r, c);
623
+ t.animation ||= [], t.animation[e]?.stop(), t.animation[e] = k(s, i, a, n, r, c);
621
624
  }
622
625
  animateContainer(t, e, s, i, n) {
623
626
  this.animate(this, 0, t, e, s, i, (r) => {
@@ -656,7 +659,7 @@ class Q {
656
659
  if (!s || !i) return;
657
660
  const a = parseFloat(s.node.dataset.initialRadius || "30"), c = parseFloat(s.attr("r")), l = e ? a - 8 : a, h = i ? E.get(i) : void 0;
658
661
  let p = 12, u = 0, d = 0, m = this.c, y = this.c, w = !1;
659
- n && (p = parseFloat(n.node.dataset.hintOffset || "12"), u = parseFloat(n.node.dataset.startAngle || "0"), d = parseFloat(n.node.dataset.endAngle || "0"), m = parseFloat(n.node.dataset.centerX || this.c.toString()), y = parseFloat(n.node.dataset.centerY || this.c.toString()), w = n.node.dataset.alter === "true"), P(c, l, (f) => {
662
+ 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"), k(c, l, (f) => {
660
663
  if (s.attr("r", f), i && h) {
661
664
  const v = h.scale * (f / a), g = new C();
662
665
  g.translate(this.c, this.c), g.scale(v), g.translate(-h.bbox.cx, -h.bbox.cy), i.transform(g);
@@ -669,7 +672,7 @@ class Q {
669
672
  }
670
673
  transformOpacity(t) {
671
674
  const e = t.deltaY > 0 ? 0.03 : -0.03;
672
- this.config.opacity = X(this.config.opacity + e, 0.4, 1), this.area.selectAll(".radial-sector").forEach((s) => {
675
+ this.config.opacity = Q(this.config.opacity + e, 0.4, 1), this.area.selectAll(".radial-sector").forEach((s) => {
673
676
  s.attr({ opacity: this.config.opacity });
674
677
  }), this.area.selectAll(".radial-hint-bg.active").forEach((s) => {
675
678
  s.node.style.opacity = String(this.config.opacity);
@@ -682,14 +685,14 @@ class Q {
682
685
  this.events[t] && this.events[t].forEach((s) => s(e));
683
686
  }
684
687
  }
685
- class K {
688
+ class U {
686
689
  menu;
687
690
  constructor(t, e) {
688
- this.menu = new Q(e), t.appendChild(this.menu.element), e.autoBindContextMenu !== !1 && this.bindEvents();
691
+ this.menu = new Z(e), D(t) ? t.then((s) => s.appendChild(this.menu.element)) : t.appendChild(this.menu.element), e.autoBindContextMenu !== !1 && this.bindEvents();
689
692
  }
690
- bindEvents() {
691
- window.addEventListener("contextmenu", (t) => {
692
- t.preventDefault(), this.menu.show(t);
693
+ bindEvents(t = window) {
694
+ t.addEventListener("contextmenu", (e) => {
695
+ e.preventDefault(), this.menu.show(e);
693
696
  });
694
697
  }
695
698
  on(t, e) {
@@ -703,7 +706,7 @@ class K {
703
706
  }
704
707
  }
705
708
  export {
706
- K as Manager,
707
- J as defineConfig
709
+ U as Manager,
710
+ K as defineConfig
708
711
  };
709
712
  //# sourceMappingURL=context-menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/text-metrics.ts","../src/core/transform.ts","../src/core/matrix.ts","../src/core/easing.ts","../src/core/animate.ts","../src/core/svg.ts","../src/core/parse.ts","../src/menu/builder.ts","../src/menu/manager.ts"],"sourcesContent":["export interface IConfig {\n sectors: ISector[];\n sprite: string;\n innerRadius: number;\n outerRadius: number;\n opacity: number;\n iconScale?: number;\n iconRadius?: number;\n color?: string;\n hintPadding?: number;\n centralButton?: ICentralButton;\n autoBindContextMenu?: boolean;\n}\n\nexport interface ICentralButton {\n icon: string;\n hint?: string;\n onclick?: () => void;\n iconRadius?: number;\n iconScale?: number;\n hintPosition?: 'top' | 'bottom';\n hintSpan?: number;\n hintDistance?: number;\n hintOffset?: number;\n hintStartAngle?: number;\n hintEndAngle?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface ISector {\n icon: string;\n hint: string;\n onclick?: () => void;\n rotate?: number;\n iconScale?: number;\n iconRadius?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nconst defaultConfig: IConfig = {\n sectors: [],\n sprite: '../icons.svg',\n innerRadius: 50,\n outerRadius: 150,\n opacity: 0.7,\n}\n\nexport function defineConfig(options: Partial<IConfig>): IConfig\n{\n return { ...defaultConfig, ...options }\n}\n","interface FontMetrics {\n ascent: number\n descent: number\n height: number\n}\n\nconst cache = new Map<string, FontMetrics>()\n\n/**\n * Gets font metrics via Canvas.\n * @param font - font string in CSS format (e.g. 'bold 12px sans-serif')\n */\nfunction getFontMetrics(font: string): FontMetrics {\n if (cache.has(font)) {\n return cache.get(font)!\n }\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n const fallback = { ascent: 9, descent: 3, height: 12 }\n cache.set(font, fallback)\n return fallback\n }\n\n ctx.font = font\n const metrics = ctx.measureText('A')\n const ascent = metrics.actualBoundingBoxAscent ?? 9\n const descent = metrics.actualBoundingBoxDescent ?? 3\n const height = ascent + descent\n\n const result = { ascent, descent, height }\n cache.set(font, result)\n\n return result\n}\n\nlet hintFontMetrics: FontMetrics | null = null\n\n/**\n * Returns the metrics of the font used for hints (class .radial-hint).\n * Measures once and caches the result.\n */\nexport function getHintFontMetrics(): FontMetrics {\n if (hintFontMetrics) return hintFontMetrics\n\n // Creating a temporary element to get real CSS styles\n const div = document.createElement('div')\n\n div.className = 'radial-hint'\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.pointerEvents = 'none'\n div.textContent = 'A'\n\n document.body.appendChild(div)\n\n const styles = window.getComputedStyle(div)\n const font = `${styles.fontWeight} ${styles.fontSize} ${styles.fontFamily}`\n\n document.body.removeChild(div)\n\n const metrics = getFontMetrics(font)\n hintFontMetrics = metrics\n\n return metrics\n}\n\n/**\n * Measures the length of text rendered on a straight line.\n * Useful for estimating arc length without creating a curved path.\n * @param {string} text - text content\n */\nexport function measureTextLengthOnLine(text: string): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n document.body.appendChild(tempSvg)\n\n const tempText = document.createElementNS(svgNS, 'text')\n tempText.textContent = text\n tempSvg.appendChild(tempText)\n\n const length = (tempText as SVGTextElement).getComputedTextLength()\n document.body.removeChild(tempSvg)\n\n return length\n}\n","import { Matrix } from './matrix'\n\nexport const rad = (deg: number): number => (deg % 360) * Math.PI / 180\n\nconst p2s = /,?([a-z]),?/gi\n\nfunction pathToString(this: any[]): string {\n return this.join(',').replace(p2s, '$1')\n}\n\nexport const parseTransformString = (TString: string): any[] | null => {\n if (!TString) return null\n let data: any[] = []\n\n if (Array.isArray(TString) && Array.isArray(TString[0])) {\n data = TString.map(arr => [...arr])\n }\n if (!data.length) {\n String(TString).replace(/([rstm])\\s*,?\\s*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?\\s*,?\\s*)+)/ig, (_a: string, b: string, c: string) => {\n const params: number[] = []\n\n c.replace(/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)\\s*,?\\s*/ig, (_: string, b: string) => {\n b && params.push(+b)\n return ''\n })\n\n data.push([b, ...params] as any[])\n return ''\n })\n }\n\n data.toString = pathToString\n\n return data;\n}\n\n// noinspection JSUnusedGlobalSymbols\nexport const svgTransform2string = (tstr: string): any[] => {\n const res: any[] = []\n\n tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, (all: string, name: string, params: string) => {\n let paramList = params.split(/\\s*,\\s*|\\s+/)\n\n if (name === 'rotate' && paramList.length === 1) paramList.push('0', '0')\n if (name === 'scale' && paramList.length === 1) paramList.push(paramList[0]);\n if (name === 'skewX') {\n res.push(['m', 1, 0, Math.tan(rad(parseFloat(paramList[0]))), 1, 0, 0] as any[])\n } else if (name === 'skewY') {\n res.push(['m', 1, Math.tan(rad(parseFloat(paramList[0]))), 0, 1, 0, 0] as any[])\n } else {\n res.push([name.charAt(0), ...paramList.map(Number)] as any[])\n }\n\n return all\n })\n\n return res\n}\n\nexport const transform2matrix = (tstr: string): Matrix => {\n const tdata = parseTransformString(tstr)\n const m = new Matrix()\n\n if (tdata) {\n for (let i = 0, ii = tdata.length; i < ii; i++) {\n const t = tdata[i]\n\n switch (t[0].toLowerCase()) {\n case 't':\n m.translate(t[1], t[2] || 0)\n break\n case 'r':\n m.rotate(t[1], t[2] || 0, t[3] || 0)\n break\n case 's':\n m.scale(t[1] || 1, t[2] || t[1] || 1, t[3] || 0, t[4] || 0)\n break\n case 'm':\n m.add(t[1] || 1, t[2] || 0, t[3] || 0, t[4] || 1, t[5] || 0, t[6] || 0)\n break\n }\n }\n }\n\n return m\n}\n","// noinspection JSUnusedGlobalSymbols,JSSuspiciousNameCombination\n\nimport { rad } from './transform'\n\ntype MatrixLike = { a: number; b: number; c: number; d: number; e: number; f: number }\n\nconst defaultMatrix: MatrixLike = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n\n/**\n * Represents a 2D transformation matrix (a, b, c, d, e, f) as used in SVG.\n */\nexport class Matrix {\n a!: number\n b!: number\n c!: number\n d!: number\n e!: number\n f!: number\n\n /**\n * Creates a new matrix.\n * If no arguments are given, creates an identity matrix.\n * If an object with a,b,c,d,e,f properties is provided (e.g., SVGMatrix), copies its values.\n */\n constructor(a?: number | MatrixLike, b?: number, c?: number, d?: number, e?: number, f?: number) {\n if (a instanceof SVGMatrix) {\n Object.assign(this, a)\n return\n }\n\n if (a != null) {\n Object.assign(this, { a: +a, b: +b!, c: +c!, d: +d!, e: +e!, f: +f! })\n } else {\n Object.assign(this, defaultMatrix)\n }\n }\n\n /**\n * Multiplies current matrix by another matrix.\n */\n add(a: number | Matrix, b?: number, c?: number, d?: number, e?: number, f?: number): this {\n if (a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f)\n }\n\n const aNew = (a as number) * this.a + (b as number) * this.c\n const bNew = (a as number) * this.b + (b as number) * this.d\n\n this.e += (e as number) * this.a + (f as number) * this.c\n this.f += (e as number) * this.b + (f as number) * this.d\n this.c = (c as number) * this.a + (d as number) * this.c\n this.d = (c as number) * this.b + (d as number) * this.d\n\n this.a = aNew\n this.b = bNew\n\n return this\n }\n\n /**\n * Returns inverse matrix.\n */\n invert(): Matrix {\n const det = this.a * this.d - this.b * this.c\n return new Matrix(\n this.d / det,\n -this.b / det,\n -this.c / det,\n this.a / det,\n (this.c * this.f - this.d * this.e) / det,\n (this.b * this.e - this.a * this.f) / det\n )\n }\n\n /**\n * Returns a copy of the matrix.\n */\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f)\n }\n\n /**\n * Translates the matrix by x and y.\n */\n translate(x: number, y = 0): this {\n return this.add(1, 0, 0, 1, x, y)\n }\n\n /**\n * Scales the matrix by x and y, optionally about point (cx, cy).\n */\n scale(x: number, y: number = x, cx?: number, cy?: number): this {\n if (cx != null || cy != null) {\n this.translate(cx!, cy!)\n }\n\n this.a *= x\n this.b *= x\n this.c *= y\n this.d *= y\n\n if (cx != null || cy != null) {\n this.translate(-cx!, -cy!)\n }\n\n return this\n }\n\n /**\n * Rotates the matrix by angle (degrees) about point (x, y).\n */\n rotate(angle: number, x = 0, y = 0): this {\n angle = rad(angle)\n\n const cos = +Math.cos(angle).toFixed(9)\n const sin = +Math.sin(angle).toFixed(9)\n\n this.add(cos, sin, -sin, cos, x, y)\n\n return this.add(1, 0, 0, 1, -x, -y)\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting x.\n */\n x(x: number, y: number): number {\n return x * this.a + y * this.c + this.e\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting y.\n */\n y(x: number, y: number): number {\n return x * this.b + y * this.d + this.f\n }\n\n /**\n * Returns matrix as an SVG matrix string.\n */\n toString(): string {\n return `matrix(${this.a},${this.b},${this.c},${this.d},${this.e},${this.f})`\n }\n}\n","export const mina = {\n linear: (n: number): number => n,\n\n easeinout: (n: number): number => {\n if (n === 1) return 1;\n if (n === 0) return 0;\n const q = 0.48 - n / 1.04;\n const Q = Math.sqrt(0.1734 + q * q);\n const x = Q - q;\n const X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1);\n const y = -Q - q;\n const Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1);\n const t = X + Y + 0.5;\n return (1 - t) * 3 * t * t + t * t * t;\n },\n\n elastic: (n: number): number => {\n if (n === 0 || n === 1) return n;\n return Math.pow(2, -10 * n) * Math.sin((n - 0.075) * (2 * Math.PI) / 0.3) + 1;\n }\n};\n","import { mina } from './easing'\n\nexport interface AnimationHandle {\n stop(): void;\n}\n\nexport function animate(\n from: number | number[],\n to: number | number[],\n setter: (val: any) => void,\n duration: number,\n easing: (n: number) => number = mina.linear,\n callback?: () => void\n): AnimationHandle {\n const start = performance.now()\n let cancelled = false\n let frame = 0\n\n const step = (now: number) => {\n if (cancelled) return\n\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easing(progress)\n\n if (Array.isArray(from) && Array.isArray(to)) {\n const val = from.map((f, i) => f + (to[i] - f) * eased)\n setter(val)\n } else {\n const val = (from as number) + ((to as number) - (from as number)) * eased\n setter(val)\n }\n\n if (progress < 1) {\n frame = requestAnimationFrame(step)\n } else {\n callback?.()\n }\n }\n\n frame = requestAnimationFrame(step)\n\n return {\n stop: () => {\n cancelled = true\n cancelAnimationFrame(frame)\n }\n }\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { transform2matrix } from './transform'\nimport { Matrix } from './matrix'\n\nlet idCounter = 0\nconst elementCache = new WeakMap<SVGElement, Element>()\n\nfunction getElement(node: SVGElement, paper?: Paper): Element {\n if (elementCache.has(node)) {\n const el = elementCache.get(node)!\n\n if (paper && !el.paper) {\n el.paper = paper\n }\n\n return el\n }\n\n const el = new Element(node, paper)\n elementCache.set(node, el)\n\n return el\n}\n\nexport class Element {\n node: SVGElement\n paper?: Paper\n _id: string\n\n constructor(node: SVGElement, paper?: Paper) {\n this.node = node\n this.paper = paper\n this._id = 'e' + (idCounter++).toString(36)\n }\n\n get type(): string {\n return this.node.tagName\n }\n\n get id(): string {\n return this.node.id || this._id\n }\n\n parent(): Element | null {\n return this.node.parentNode ? getElement(this.node.parentNode as SVGElement, this.paper) : null\n }\n\n children(): Element[] {\n return Array.from(this.node.children).map(child => {\n return getElement(child as SVGElement, this.paper)\n })\n }\n\n clear(): this {\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild)\n }\n\n return this\n }\n\n attr(): any;\n attr(name: string): string | null\n attr(name: string, value: any): this\n attr(attrs: Record<string, any>): this\n attr(nameOrAttrs?: string | Record<string, any>, value?: any): any {\n if (typeof nameOrAttrs === 'string') {\n if (value === undefined) {\n return this.node.getAttribute(nameOrAttrs)\n }\n\n this._setAttr(nameOrAttrs, value)\n\n return this\n }\n if (typeof nameOrAttrs === 'object') {\n for (const key in nameOrAttrs) {\n this._setAttr(key, nameOrAttrs[key])\n }\n\n return this\n }\n\n return this\n }\n\n private _setAttr(name: string, value: any) {\n if (name === 'textpath') {\n this._setTextPath(value)\n } else if (name === 'text') {\n this._setText(value)\n } else {\n this.node.setAttribute(name, String(value))\n }\n }\n\n private _setText(content: string) {\n const textPath = this.node.querySelector('textPath')\n\n if (textPath) {\n textPath.textContent = content\n } else {\n this.node.textContent = content\n }\n }\n\n private _setTextPath(pathDescriptor: string) {\n if (this.node.tagName !== 'text') return\n\n const textEl = this.node as SVGTextElement\n\n let textPath = textEl.querySelector('textPath')\n let existingText = ''\n\n if (!textPath) {\n for (let i = 0; i < textEl.childNodes.length; i++) {\n const node = textEl.childNodes[i]\n if (node.nodeType === 3) existingText += node.textContent\n }\n\n while (textEl.firstChild) {\n textEl.removeChild(textEl.firstChild)\n }\n\n textPath = document.createElementNS('http://www.w3.org/2000/svg', 'textPath')\n textEl.appendChild(textPath)\n textEl.removeAttribute('x')\n textEl.removeAttribute('y')\n } else {\n existingText = textPath.textContent || ''\n }\n\n let href: string\n if (pathDescriptor.startsWith('#')) {\n href = pathDescriptor\n } else {\n if (!this.paper) {\n throw new Error('No paper reference for creating defs');\n }\n\n const defs = this.paper.defs\n const pathId = 'p' + Date.now() + Math.random().toString(36).slice(2)\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n path.setAttribute('d', pathDescriptor)\n path.id = pathId\n defs.node.appendChild(path)\n href = '#' + pathId\n }\n\n textPath.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href)\n if (existingText) {\n textPath.textContent = existingText\n }\n }\n\n addClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.add(cls)\n }\n\n return this\n }\n\n removeClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.remove(cls)\n }\n\n return this\n }\n\n transform(t?: string | Matrix): this {\n if (t === undefined) return this\n if (t instanceof Matrix) {\n this.node.setAttribute('transform', t.toString())\n } else {\n const m = transform2matrix(t);\n this.node.setAttribute('transform', m.toString())\n }\n\n return this\n }\n\n getBBox(): { x: number; y: number; width: number; height: number; cx: number; cy: number; x2: number; y2: number } {\n if (this.node.isConnected) {\n const rect = (this.node as SVGGraphicsElement).getBBox()\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n tempSvg.style.pointerEvents = 'none'\n\n document.body.appendChild(tempSvg)\n\n tempSvg.appendChild(this.node)\n const rect = (this.node as SVGGraphicsElement).getBBox()\n tempSvg.removeChild(this.node)\n\n document.body.removeChild(tempSvg)\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n select(selector: string): Element | null {\n const found = this.node.querySelector(selector)\n return found ? getElement(found as SVGElement, this.paper) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.node.querySelectorAll(selector)\n\n return Array.from(nodes).map(node => {\n return getElement(node as SVGElement, this.paper)\n })\n }\n\n clone(): Element {\n return getElement(this.node.cloneNode(true) as SVGElement, this.paper)\n }\n\n add(child: Element): this {\n this.node.appendChild(child.node)\n return this\n }\n\n hover(fIn: (e: MouseEvent) => void, fOut: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseover', fIn)\n this.node.addEventListener('mouseout', fOut)\n return this\n }\n\n mouseup(fn: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseup', fn)\n return this\n }\n}\n\nexport class Paper extends Element {\n defs: Element\n\n constructor(node: SVGSVGElement) {\n super(node, null as any)\n this.paper = this\n\n elementCache.set(node, this)\n\n let defsNode = node.querySelector('defs')\n if (!defsNode) {\n defsNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n node.appendChild(defsNode)\n }\n\n this.defs = getElement(defsNode as SVGElement, this)\n }\n\n g(...args: any[]): Paper {\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n this.node.appendChild(group)\n const groupEl = getElement(group, this)\n\n if (args.length === 1 && args[0] && !args[0].node) {\n groupEl.attr(args[0])\n } else if (args.length) {\n args.forEach(arg => {\n if (arg instanceof Element) groupEl.add(arg)\n })\n }\n\n return groupEl as unknown as Paper\n }\n\n path(d?: string | object): Element {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n this.node.appendChild(path)\n\n const pathEl = getElement(path, this)\n if (d) {\n if (typeof d === 'string') {\n pathEl.attr('d', d)\n }\n\n else pathEl.attr(d)\n }\n\n return pathEl\n }\n\n circle(cx: any, cy?: number, r?: number): Element {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n this.node.appendChild(circle)\n\n const circleEl = getElement(circle, this)\n if (typeof cx === 'object') {\n circleEl.attr(cx)\n } else if (cx != null) {\n circleEl.attr({ cx, cy: cy ?? cx, r: r ?? 0 })\n }\n\n return circleEl\n }\n\n text(x: any, y?: number, text?: string): Element {\n const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n this.node.appendChild(textEl)\n\n const textElWrap = getElement(textEl, this)\n if (typeof x === 'object') {\n textElWrap.attr(x)\n } else if (x != null) {\n textElWrap.attr({ x, y: y ?? x, text: text ?? '' })\n }\n\n return textElWrap\n }\n}\n\nexport class Fragment {\n private frag: DocumentFragment\n\n constructor(frag: DocumentFragment) {\n this.frag = frag\n }\n\n select(selector: string): Element | null {\n const found = this.frag.querySelector(selector)\n return found ? getElement(found as SVGElement) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.frag.querySelectorAll(selector)\n return Array.from(nodes).map(node => getElement(node as SVGElement))\n }\n}\n\nexport function Svg(el: SVGSVGElement): Paper\nexport function Svg(query: string): Paper | null\nexport function Svg(arg: any): any {\n if (typeof arg === 'string') {\n const el = document.querySelector(arg)\n return el ? new Paper(el as SVGSVGElement) : null\n }\n if (arg instanceof SVGSVGElement) {\n return new Paper(arg)\n }\n\n return null\n}\n","import { Fragment } from './svg';\n\nexport function parse(svgString: string): Fragment {\n const div = document.createElement('div');\n let svg = svgString.trim();\n if (!svg.match(/^\\s*<\\s*svg/i)) {\n svg = '<svg>' + svg + '</svg>';\n }\n div.innerHTML = svg;\n const svgElem = div.querySelector('svg');\n const frag = document.createDocumentFragment();\n if (svgElem) {\n while (svgElem.firstChild) {\n frag.appendChild(svgElem.firstChild);\n }\n }\n return new Fragment(frag);\n}\n","import type { ICentralButton, IConfig, ISector } from './config'\n\nimport { getHintFontMetrics, measureTextLengthOnLine } from '@/utils/text-metrics'\nimport { animate, Matrix, mina, parse, Svg } from '@/core'\n\ninterface HintData {\n baseRadius: number;\n textLength: number;\n sectorMidAngle: number;\n}\n\nconst clamp = (v: number, l: number, h: number) => (v > h ? h : v < l ? l : v)\n\nconst hintDataMap = new WeakMap<Svg.Element, HintData>()\nconst iconInitialData = new WeakMap<Svg.Element, {\n midRadius: number;\n scale: number;\n rotation: number;\n bbox: Svg.BBox;\n}>()\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number): { x: number, y: number }\n{\n angle = ((angle - 90) * Math.PI) / 180\n\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n }\n}\n\nfunction describeArc(x: number, y: number, r: number, startAngle: number, endAngle: number, lineMove: boolean, alter: boolean): string\n{\n const start = polarToCartesian(x, y, r, (startAngle %= 360))\n const end = polarToCartesian(x, y, r, (endAngle %= 360))\n\n return `${lineMove ? 'L' : 'M'}${start.x} ${start.y} A${r} ${r}, 0, ${endAngle - startAngle >= 180 ? 1 : 0}, ${alter ? 0 : 1}, ${end.x} ${end.y}`\n}\n\nfunction describeSector(x: number, y: number, r: number, r2: number, startAngle: number, endAngle: number): string\n{\n return `${describeArc(x, y, r, startAngle, endAngle, false, false)} ${describeArc(x, y, r2, endAngle, startAngle, true, true)}Z`\n}\n\nexport class Builder\n{\n private readonly config: IConfig\n private readonly events: { [key: string]: Function[] } = {}\n\n private readonly container: Svg.Paper\n private readonly snap: Svg.Paper\n\n private readonly angle: number\n private readonly size: number = 500\n private readonly c = this.size / 2\n\n public element: HTMLElement\n private area: Svg.Paper\n\n private duration = 300\n\n private icons: Svg.Fragment | null = null\n private theme = 'light'\n\n constructor(config: IConfig)\n {\n this.config = config\n this.size = 2 * config.outerRadius\n this.c = this.size / 2\n this.angle = 360 / (this.config.sectors.length || 6)\n\n this.element = this.createMenuElement()\n this.snap = Svg(this.element.querySelector('svg')!)\n this.area = this.snap\n this.container = this.area.g().transform('s0')\n\n this.init().catch(console.error)\n }\n\n private createMenuElement(): HTMLElement\n {\n const div = document.createElement('div')\n div.className = 'context theme--light hidden'\n div.style.position = 'fixed'\n div.style.top = '0'\n div.style.left = '0'\n div.style.width = '100vw'\n div.style.height = '100vh'\n div.style.overflow = 'visible'\n div.style.pointerEvents = 'auto'\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', this.size.toString())\n svg.setAttribute('height', this.size.toString())\n svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`)\n svg.style.position = 'absolute'\n svg.style.display = 'block'\n svg.style.overflow = 'visible'\n svg.style.pointerEvents = 'auto'\n svg.classList.add('radial-menu-svg')\n\n svg.addEventListener('wheel', (e) => {\n e.preventDefault()\n this.transformOpacity(e)\n })\n\n svg.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n svg.addEventListener('click', (e) => {\n e.stopPropagation()\n this.hide()\n })\n\n div.addEventListener('click', (e) => {\n if (e.target === div) {\n this.hide()\n }\n })\n\n div.appendChild(svg)\n\n return div\n }\n\n private async init(): Promise<void>\n {\n await this.loadIcons()\n this.updateButtons()\n }\n\n private async loadIcons(): Promise<void>\n {\n if (this.icons) return\n\n try {\n const response = await fetch(this.config.sprite)\n if (response.ok) {\n this.icons = parse(await response.text())\n }\n } catch (e) {\n console.error('Failed to load icons:', e)\n }\n }\n\n private updateButtons(): void\n {\n if (!this.icons || !this.container) return\n\n this.container.clear()\n this.config.sectors.forEach(btn => {\n const icon = this.createIcon(btn)\n\n if (icon) {\n const buttonGroup = this.createButton(btn, this.createSector(), icon, this.createHint(btn))\n this.container.add(buttonGroup)\n }\n })\n\n if (this.config.centralButton) {\n const centralBtn = this.createCentralButton(this.config.centralButton)\n if (centralBtn) {\n this.container.add(centralBtn)\n }\n }\n }\n\n private createSector(): Svg.Element\n {\n const color = this.config.color ?? '#1976D2'\n\n return this.area.path(describeSector(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle))\n .attr({ fill: color, stroke: color, opacity: this.config.opacity })\n .addClass('radial-sector')\n }\n\n private createButton(btn: ISector, sector: Svg.Element, icon: Svg.Element, hint: Svg.Element): Svg.Paper\n {\n const buttonGroup = this.area.g(sector, icon, hint)\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.radial-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateButtonHover(buttonGroup, 0, 1, 200, mina.easeinout)\n },\n () => {\n buttonGroup.select('.radial-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateButtonHover(buttonGroup, 1, 0, 2000, mina.elastic)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n this.emit('click', { icon: btn.icon, hint: btn.hint })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createIcon(btn: ISector): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultRadius = (this.config.innerRadius + this.config.outerRadius) / 2\n const sectorHeight = this.config.outerRadius - this.config.innerRadius\n const defaultScale = (sectorHeight * 0.5) / bbox.height\n\n const midRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const targetAngle = this.angle / 2\n const rotation = targetAngle + (btn.rotate || 0)\n\n iconInitialData.set(icon, { midRadius, scale, rotation, bbox })\n\n const pos = polarToCartesian(this.c, this.c, midRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(scale)\n t.rotate(rotation, 0, 0)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t)\n\n return icon.addClass('radial-icon')\n }\n\n private createHint(btn: ISector): Svg.Element\n {\n const group = this.area.g()\n group.addClass('hint-group')\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint || btn.icon\n\n const textLength = measureTextLengthOnLine(text)\n const gap = 2\n\n let baseRadius: number\n let bgHeight = 0\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseRadius = this.config.outerRadius + bgHeight / 2 + gap\n } else {\n const textOffset = metrics.height * 0.75\n baseRadius = this.config.outerRadius + textOffset\n }\n\n const textAngleRad = textLength / baseRadius\n const textAngleDeg = textAngleRad * 180 / Math.PI\n const sectorMidAngle = this.angle / 2\n const startAngle = sectorMidAngle - textAngleDeg / 2\n const endAngle = sectorMidAngle + textAngleDeg / 2\n\n const arcPath = describeArc(this.c, this.c, baseRadius, startAngle, endAngle, false, false)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint').attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n group.add(hint)\n\n hintDataMap.set(group, {\n sectorMidAngle,\n baseRadius,\n textLength\n })\n\n return group\n }\n\n private createCentralButton(btn: ICentralButton): Svg.Element | null\n {\n const defaultRadius = this.config.innerRadius * 0.6\n const buttonRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const color = this.config.color ?? '#1976D2'\n\n const circle = this.area.circle({\n cx: this.c, cy: this.c, r: buttonRadius,\n fill: color, stroke: color,\n opacity: this.config.opacity\n })\n .addClass('radial-sector central-sector')\n\n circle.node.dataset.initialRadius = `${buttonRadius}`\n\n let icon: Svg.Element | null = null\n let hint: Svg.Element | null = null\n\n if (btn.icon) {\n icon = this.createCentralIcon(btn, buttonRadius)\n }\n if (btn.hint) {\n hint = this.createCentralHint(btn, buttonRadius)\n }\n\n const elements = [circle, icon, hint].filter(el => el !== null) as Svg.Element[]\n const buttonGroup = this.area.g(...elements).addClass('central-button')\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.central-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateCentralHover(buttonGroup, true)\n },\n () => {\n buttonGroup.select('.central-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateCentralHover(buttonGroup, false)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n\n this.emit('click', { icon: btn.icon, hint: btn.hint || '' })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createCentralIcon(btn: ICentralButton, buttonRadius: number): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultScale = (buttonRadius * 0.8) / Math.max(bbox.width, bbox.height)\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const t = new Matrix()\n\n t.translate(this.c, this.c)\n t.scale(scale)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t).addClass('radial-icon central-icon')\n\n iconInitialData.set(icon, {\n midRadius: 0,\n rotation: 0,\n scale,\n bbox\n })\n\n return icon\n }\n\n private createCentralHint(btn: ICentralButton, buttonRadius: number): Svg.Element\n {\n const group = this.area.g()\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint ?? ''\n // const textLength = measureTextLengthOnLine(text)\n\n let baseOffset: number\n let bgHeight = 0\n const gap = 2\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseOffset = btn.hintOffset ?? (bgHeight / 2 + gap)\n } else {\n if (btn.hintOffset != null) {\n baseOffset = btn.hintOffset\n } else {\n baseOffset = btn.hintDistance ?? 8\n }\n }\n\n const textRadius = buttonRadius + baseOffset\n\n let startAngle: number, endAngle: number, alter: boolean\n if (btn.hintStartAngle != null && btn.hintEndAngle != null) {\n startAngle = btn.hintStartAngle\n endAngle = btn.hintEndAngle\n alter = startAngle > endAngle\n } else {\n const span = btn.hintSpan ?? 120\n const half = span / 2\n const position = btn.hintPosition ?? 'top'\n\n if (position === 'bottom') {\n startAngle = 180 + half\n endAngle = 180 - half\n alter = true\n } else {\n startAngle = 360 - half\n endAngle = half\n alter = false\n }\n }\n\n const arcPath = describeArc(this.c, this.c, textRadius, startAngle, endAngle, false, alter)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint central-hint')\n .attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n const hintNode = hint.node\n hintNode.dataset.hintOffset = baseOffset.toString()\n hintNode.dataset.startAngle = startAngle.toString()\n hintNode.dataset.endAngle = endAngle.toString()\n hintNode.dataset.alter = alter ? 'true' : 'false'\n hintNode.dataset.centerX = this.c.toString()\n hintNode.dataset.centerY = this.c.toString()\n\n group.add(hint)\n\n return group\n }\n\n public show(e: MouseEvent): void\n {\n this.element.classList.remove('hidden')\n\n const svg = this.element.querySelector('svg') as SVGSVGElement\n\n svg.style.left = (e.clientX - this.c) + 'px'\n svg.style.top = (e.clientY - this.c) + 'px'\n\n this.animateContainer(0, 1, this.duration * 8, mina.elastic)\n this.animateButtons(0, 1, this.duration, this.duration * 8, mina.elastic)\n }\n\n public hide(): void\n {\n this.animateContainer(1, 0, this.duration, mina.easeinout, () => {\n this.element.classList.add('hidden')\n })\n\n this.animateButtons(1, 0, this.duration, this.duration, mina.easeinout)\n }\n\n private animate(obj: any, index: number, start: number, end: number, duration: number, easing: (n: number) => number, fn: (val: number) => void, cb?: () => void): void\n {\n obj.animation ||= []\n obj.animation[index]?.stop()\n obj.animation[index] = animate(start, end, fn, duration, easing, cb)\n }\n\n private animateContainer(start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n this.animate(this, 0, start, end, duration, easing, (val) => {\n this.container.transform(`r${90 - 90 * val},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }, cb)\n }\n\n private animateButtons(start: number, end: number, min: number, max: number, easing: (n: number) => number): void\n {\n const r = (min: number, max: number) => Math.random() * (max - min) + min\n\n this.container.children().forEach((el: Svg.Element, i: number) => {\n const isCentral = el.node.classList.contains('central-button')\n\n this.animate(el, 0, start, end, r(min, max), easing, (val) => {\n if (isCentral) {\n el.transform(`s${val},${val},${this.c},${this.c}`)\n } else {\n el.transform(`r${this.angle * i},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }\n })\n })\n }\n\n private animateButtonHover(buttonGroup: Svg.Paper, start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n const icon = buttonGroup.select('.radial-icon')\n const initialIcon = icon ? iconInitialData.get(icon) : undefined\n const hintGroup = buttonGroup.select('.hint-group')\n const hintData = hintGroup ? hintDataMap.get(hintGroup) : undefined\n\n this.animate(buttonGroup, 1, start, end, duration, easing, (val) => {\n const outward = val * 10\n\n buttonGroup.select('.radial-sector')?.attr({\n d: describeSector(this.c, this.c, this.config.outerRadius - outward, this.config.innerRadius, 0, this.angle)\n })\n\n if (icon && initialIcon) {\n const newRadius = initialIcon.midRadius - outward\n const newScale = initialIcon.scale * (1 - (val * 0.1))\n const targetAngle = this.angle / 2\n const pos = polarToCartesian(this.c, this.c, newRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(newScale)\n t.rotate(initialIcon.rotation, 0, 0)\n t.translate(-initialIcon.bbox.cx, -initialIcon.bbox.cy)\n\n icon.transform(t)\n }\n\n if (hintData && hintGroup) {\n const newRadius = hintData.baseRadius - outward\n const newAngleDeg = (hintData.textLength / newRadius) * 180 / Math.PI\n const newStart = hintData.sectorMidAngle - newAngleDeg / 2\n const newEnd = hintData.sectorMidAngle + newAngleDeg / 2\n const newPath = describeArc(this.c, this.c, newRadius, newStart, newEnd, false, false)\n\n const hint = hintGroup.select('.radial-hint')\n if (hint) {\n hint.attr('textpath', newPath)\n }\n\n const bg = hintGroup.select('.radial-hint-bg')\n if (bg) {\n bg.attr('d', newPath)\n }\n }\n }, cb)\n }\n\n private animateCentralHover(group: Svg.Element, active: boolean): void\n {\n const circle = group.select('.central-sector') as Svg.Element\n const icon = group.select('.central-icon') as Svg.Element\n const hint = group.select('.central-hint') as Svg.Element\n const bg = group.select('.radial-hint-bg') as Svg.Element\n\n if (!circle || !icon) return\n\n const initialRadius = parseFloat(circle.node.dataset.initialRadius || '30')\n const currentRadius = parseFloat(circle.attr('r') as string)\n const targetRadius = active ? initialRadius - 8 : initialRadius\n\n const initialIconData = icon ? iconInitialData.get(icon) : undefined\n\n let hintOffset = 12, startAngle = 0, endAngle = 0, centerX = this.c, centerY = this.c, alter = false\n if (hint) {\n hintOffset = parseFloat(hint.node.dataset.hintOffset || '12')\n startAngle = parseFloat(hint.node.dataset.startAngle || '0')\n endAngle = parseFloat(hint.node.dataset.endAngle || '0')\n centerX = parseFloat(hint.node.dataset.centerX || this.c.toString())\n centerY = parseFloat(hint.node.dataset.centerY || this.c.toString())\n alter = hint.node.dataset.alter === 'true'\n }\n\n animate(currentRadius, targetRadius, (val) => {\n circle.attr('r', val)\n\n if (icon && initialIconData) {\n const newScale = initialIconData.scale * (val / initialRadius)\n const t = new Matrix()\n t.translate(this.c, this.c)\n t.scale(newScale)\n t.translate(-initialIconData.bbox.cx, -initialIconData.bbox.cy)\n icon.transform(t)\n }\n\n if (hint) {\n const newRadius = val + hintOffset\n const newArc = describeArc(centerX, centerY, newRadius, startAngle, endAngle, false, alter)\n hint.attr({ textpath: newArc })\n if (bg) {\n bg.attr({ d: newArc })\n }\n }\n }, 200, mina.easeinout)\n }\n\n private transformOpacity(e: WheelEvent): void\n {\n const dy = e.deltaY > 0 ? 0.03 : -0.03\n this.config.opacity = clamp(this.config.opacity + dy, 0.4, 1)\n\n this.area.selectAll('.radial-sector').forEach((el: Svg.Element) => {\n el.attr({ opacity: this.config.opacity })\n })\n\n this.area.selectAll('.radial-hint-bg.active').forEach((el: Svg.Element) => {\n el.node.style.opacity = String(this.config.opacity)\n })\n }\n\n public on(event: string, callback: Function): void\n {\n (this.events[event] ??= []).push(callback)\n }\n\n private emit(event: string, data: any): void\n {\n if (this.events[event]) {\n this.events[event].forEach(callback => callback(data))\n }\n }\n}\n","import { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n private menu: Builder\n\n constructor(container: HTMLElement, config: IConfig)\n {\n this.menu = new Builder(config)\n container.appendChild(this.menu.element)\n\n if (config.autoBindContextMenu !== false) {\n this.bindEvents()\n }\n }\n\n private bindEvents()\n {\n window.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.menu.show(e)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public show(event: PointerEvent)\n {\n this.menu.show(event)\n }\n\n public hide()\n {\n this.menu.hide()\n }\n}\n"],"names":["defaultConfig","defineConfig","options","cache","getFontMetrics","font","ctx","fallback","metrics","ascent","descent","height","result","hintFontMetrics","getHintFontMetrics","div","styles","measureTextLengthOnLine","text","svgNS","tempSvg","tempText","length","rad","deg","p2s","pathToString","parseTransformString","TString","data","arr","_a","b","c","params","_","transform2matrix","tstr","tdata","m","Matrix","i","ii","t","defaultMatrix","a","d","e","f","aNew","bNew","det","x","y","cx","cy","angle","cos","sin","mina","n","q","Q","X","Y","animate","from","to","setter","duration","easing","callback","start","cancelled","frame","step","now","elapsed","progress","eased","val","idCounter","elementCache","getElement","node","paper","el","Element","child","nameOrAttrs","value","key","name","content","textPath","pathDescriptor","textEl","existingText","href","defs","pathId","path","className","classes","cls","rect","selector","found","nodes","fIn","fOut","fn","Paper","defsNode","args","group","groupEl","arg","pathEl","r","circle","circleEl","textElWrap","Fragment","frag","Svg","parse","svgString","svg","svgElem","clamp","v","l","h","hintDataMap","iconInitialData","polarToCartesian","describeArc","startAngle","endAngle","lineMove","alter","end","describeSector","r2","Builder","config","response","btn","icon","buttonGroup","centralBtn","color","sector","hint","bg","iconTemplate","bbox","defaultRadius","defaultScale","midRadius","scale","targetAngle","rotation","pos","hintPadding","textLength","gap","baseRadius","bgHeight","textOffset","textAngleDeg","sectorMidAngle","arcPath","bgColor","textPathEl","buttonRadius","elements","baseOffset","textRadius","half","hintNode","obj","index","cb","min","max","isCentral","initialIcon","hintGroup","hintData","outward","newRadius","newScale","newAngleDeg","newStart","newEnd","newPath","active","initialRadius","currentRadius","targetRadius","initialIconData","hintOffset","centerX","centerY","newArc","dy","event","Manager","container"],"mappings":"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"}
1
+ {"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/index.ts","../src/core/transform.ts","../src/core/matrix.ts","../src/core/easing.ts","../src/core/animate.ts","../src/core/svg.ts","../src/core/parse.ts","../src/menu/builder.ts","../src/menu/manager.ts"],"sourcesContent":["export interface IConfig {\n sectors: ISector[];\n sprite: string;\n innerRadius: number;\n outerRadius: number;\n opacity: number;\n iconScale?: number;\n iconRadius?: number;\n color?: string;\n hintPadding?: number;\n centralButton?: ICentralButton;\n autoBindContextMenu?: boolean;\n}\n\nexport interface ICentralButton {\n icon: string;\n hint?: string;\n onclick?: () => void;\n iconRadius?: number;\n iconScale?: number;\n hintPosition?: 'top' | 'bottom';\n hintSpan?: number;\n hintDistance?: number;\n hintOffset?: number;\n hintStartAngle?: number;\n hintEndAngle?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface ISector {\n icon: string;\n hint: string;\n onclick?: () => void;\n rotate?: number;\n iconScale?: number;\n iconRadius?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nconst defaultConfig: IConfig = {\n sectors: [],\n sprite: '../icons.svg',\n innerRadius: 50,\n outerRadius: 150,\n opacity: 0.7,\n}\n\nexport function defineConfig(options: Partial<IConfig>): IConfig\n{\n return { ...defaultConfig, ...options }\n}\n","interface FontMetrics {\n ascent: number\n descent: number\n height: number\n}\n\nconst cache = new Map<string, FontMetrics>()\n\n/**\n * Gets font metrics via Canvas.\n * @param font - font string in CSS format (e.g. 'bold 12px sans-serif')\n */\nfunction getFontMetrics(font: string): FontMetrics {\n if (cache.has(font)) {\n return cache.get(font)!\n }\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n const fallback = { ascent: 9, descent: 3, height: 12 }\n cache.set(font, fallback)\n return fallback\n }\n\n ctx.font = font\n const metrics = ctx.measureText('A')\n const ascent = metrics.actualBoundingBoxAscent ?? 9\n const descent = metrics.actualBoundingBoxDescent ?? 3\n const height = ascent + descent\n\n const result = { ascent, descent, height }\n cache.set(font, result)\n\n return result\n}\n\nlet hintFontMetrics: FontMetrics | null = null\n\n/**\n * Returns the metrics of the font used for hints (class .radial-hint).\n * Measures once and caches the result.\n */\nexport function getHintFontMetrics(): FontMetrics {\n if (hintFontMetrics) return hintFontMetrics\n\n // Creating a temporary element to get real CSS styles\n const div = document.createElement('div')\n\n div.className = 'radial-hint'\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.pointerEvents = 'none'\n div.textContent = 'A'\n\n document.body.appendChild(div)\n\n const styles = window.getComputedStyle(div)\n const font = `${styles.fontWeight} ${styles.fontSize} ${styles.fontFamily}`\n\n document.body.removeChild(div)\n\n const metrics = getFontMetrics(font)\n hintFontMetrics = metrics\n\n return metrics\n}\n\n/**\n * Measures the length of text rendered on a straight line.\n * Useful for estimating arc length without creating a curved path.\n * @param {string} text - text content\n */\nexport function measureTextLengthOnLine(text: string): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n document.body.appendChild(tempSvg)\n\n const tempText = document.createElementNS(svgNS, 'text')\n tempText.textContent = text\n tempSvg.appendChild(tempText)\n\n const length = (tempText as SVGTextElement).getComputedTextLength()\n document.body.removeChild(tempSvg)\n\n return length\n}\n\n/**\n * @template T\n * @param {PromiseLike<T> | HTMLElement} value\n * @returns boolean\n */\nexport function isPromiseLike<T extends any>(value: any): value is PromiseLike<T> {\n return value && (value as PromiseLike<T>).then !== undefined\n}\n","import { Matrix } from './matrix'\n\nexport const rad = (deg: number): number => (deg % 360) * Math.PI / 180\n\nconst p2s = /,?([a-z]),?/gi\n\nfunction pathToString(this: any[]): string {\n return this.join(',').replace(p2s, '$1')\n}\n\nexport const parseTransformString = (TString: string): any[] | null => {\n if (!TString) return null\n let data: any[] = []\n\n if (Array.isArray(TString) && Array.isArray(TString[0])) {\n data = TString.map(arr => [...arr])\n }\n if (!data.length) {\n String(TString).replace(/([rstm])\\s*,?\\s*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?\\s*,?\\s*)+)/ig, (_a: string, b: string, c: string) => {\n const params: number[] = []\n\n c.replace(/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)\\s*,?\\s*/ig, (_: string, b: string) => {\n b && params.push(+b)\n return ''\n })\n\n data.push([b, ...params] as any[])\n return ''\n })\n }\n\n data.toString = pathToString\n\n return data;\n}\n\n// noinspection JSUnusedGlobalSymbols\nexport const svgTransform2string = (tstr: string): any[] => {\n const res: any[] = []\n\n tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, (all: string, name: string, params: string) => {\n let paramList = params.split(/\\s*,\\s*|\\s+/)\n\n if (name === 'rotate' && paramList.length === 1) paramList.push('0', '0')\n if (name === 'scale' && paramList.length === 1) paramList.push(paramList[0]);\n if (name === 'skewX') {\n res.push(['m', 1, 0, Math.tan(rad(parseFloat(paramList[0]))), 1, 0, 0] as any[])\n } else if (name === 'skewY') {\n res.push(['m', 1, Math.tan(rad(parseFloat(paramList[0]))), 0, 1, 0, 0] as any[])\n } else {\n res.push([name.charAt(0), ...paramList.map(Number)] as any[])\n }\n\n return all\n })\n\n return res\n}\n\nexport const transform2matrix = (tstr: string): Matrix => {\n const tdata = parseTransformString(tstr)\n const m = new Matrix()\n\n if (tdata) {\n for (let i = 0, ii = tdata.length; i < ii; i++) {\n const t = tdata[i]\n\n switch (t[0].toLowerCase()) {\n case 't':\n m.translate(t[1], t[2] || 0)\n break\n case 'r':\n m.rotate(t[1], t[2] || 0, t[3] || 0)\n break\n case 's':\n m.scale(t[1] || 1, t[2] || t[1] || 1, t[3] || 0, t[4] || 0)\n break\n case 'm':\n m.add(t[1] || 1, t[2] || 0, t[3] || 0, t[4] || 1, t[5] || 0, t[6] || 0)\n break\n }\n }\n }\n\n return m\n}\n","// noinspection JSUnusedGlobalSymbols,JSSuspiciousNameCombination\n\nimport { rad } from './transform'\n\ntype MatrixLike = { a: number; b: number; c: number; d: number; e: number; f: number }\n\nconst defaultMatrix: MatrixLike = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n\n/**\n * Represents a 2D transformation matrix (a, b, c, d, e, f) as used in SVG.\n */\nexport class Matrix {\n a!: number\n b!: number\n c!: number\n d!: number\n e!: number\n f!: number\n\n /**\n * Creates a new matrix.\n * If no arguments are given, creates an identity matrix.\n * If an object with a,b,c,d,e,f properties is provided (e.g., SVGMatrix), copies its values.\n */\n constructor(a?: number | MatrixLike, b?: number, c?: number, d?: number, e?: number, f?: number) {\n if (a instanceof SVGMatrix) {\n Object.assign(this, a)\n return\n }\n\n if (a != null) {\n Object.assign(this, { a: +a, b: +b!, c: +c!, d: +d!, e: +e!, f: +f! })\n } else {\n Object.assign(this, defaultMatrix)\n }\n }\n\n /**\n * Multiplies current matrix by another matrix.\n */\n add(a: number | Matrix, b?: number, c?: number, d?: number, e?: number, f?: number): this {\n if (a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f)\n }\n\n const aNew = (a as number) * this.a + (b as number) * this.c\n const bNew = (a as number) * this.b + (b as number) * this.d\n\n this.e += (e as number) * this.a + (f as number) * this.c\n this.f += (e as number) * this.b + (f as number) * this.d\n this.c = (c as number) * this.a + (d as number) * this.c\n this.d = (c as number) * this.b + (d as number) * this.d\n\n this.a = aNew\n this.b = bNew\n\n return this\n }\n\n /**\n * Returns inverse matrix.\n */\n invert(): Matrix {\n const det = this.a * this.d - this.b * this.c\n return new Matrix(\n this.d / det,\n -this.b / det,\n -this.c / det,\n this.a / det,\n (this.c * this.f - this.d * this.e) / det,\n (this.b * this.e - this.a * this.f) / det\n )\n }\n\n /**\n * Returns a copy of the matrix.\n */\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f)\n }\n\n /**\n * Translates the matrix by x and y.\n */\n translate(x: number, y = 0): this {\n return this.add(1, 0, 0, 1, x, y)\n }\n\n /**\n * Scales the matrix by x and y, optionally about point (cx, cy).\n */\n scale(x: number, y: number = x, cx?: number, cy?: number): this {\n if (cx != null || cy != null) {\n this.translate(cx!, cy!)\n }\n\n this.a *= x\n this.b *= x\n this.c *= y\n this.d *= y\n\n if (cx != null || cy != null) {\n this.translate(-cx!, -cy!)\n }\n\n return this\n }\n\n /**\n * Rotates the matrix by angle (degrees) about point (x, y).\n */\n rotate(angle: number, x = 0, y = 0): this {\n angle = rad(angle)\n\n const cos = +Math.cos(angle).toFixed(9)\n const sin = +Math.sin(angle).toFixed(9)\n\n this.add(cos, sin, -sin, cos, x, y)\n\n return this.add(1, 0, 0, 1, -x, -y)\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting x.\n */\n x(x: number, y: number): number {\n return x * this.a + y * this.c + this.e\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting y.\n */\n y(x: number, y: number): number {\n return x * this.b + y * this.d + this.f\n }\n\n /**\n * Returns matrix as an SVG matrix string.\n */\n toString(): string {\n return `matrix(${this.a},${this.b},${this.c},${this.d},${this.e},${this.f})`\n }\n}\n","export const mina = {\n linear: (n: number): number => n,\n\n easeinout: (n: number): number => {\n if (n === 1) return 1;\n if (n === 0) return 0;\n const q = 0.48 - n / 1.04;\n const Q = Math.sqrt(0.1734 + q * q);\n const x = Q - q;\n const X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1);\n const y = -Q - q;\n const Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1);\n const t = X + Y + 0.5;\n return (1 - t) * 3 * t * t + t * t * t;\n },\n\n elastic: (n: number): number => {\n if (n === 0 || n === 1) return n;\n return Math.pow(2, -10 * n) * Math.sin((n - 0.075) * (2 * Math.PI) / 0.3) + 1;\n }\n};\n","import { mina } from './easing'\n\nexport interface AnimationHandle {\n stop(): void;\n}\n\nexport function animate(\n from: number | number[],\n to: number | number[],\n setter: (val: any) => void,\n duration: number,\n easing: (n: number) => number = mina.linear,\n callback?: () => void\n): AnimationHandle {\n const start = performance.now()\n let cancelled = false\n let frame = 0\n\n const step = (now: number) => {\n if (cancelled) return\n\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easing(progress)\n\n if (Array.isArray(from) && Array.isArray(to)) {\n const val = from.map((f, i) => f + (to[i] - f) * eased)\n setter(val)\n } else {\n const val = (from as number) + ((to as number) - (from as number)) * eased\n setter(val)\n }\n\n if (progress < 1) {\n frame = requestAnimationFrame(step)\n } else {\n callback?.()\n }\n }\n\n frame = requestAnimationFrame(step)\n\n return {\n stop: () => {\n cancelled = true\n cancelAnimationFrame(frame)\n }\n }\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { transform2matrix } from './transform'\nimport { Matrix } from './matrix'\n\nlet idCounter = 0\nconst elementCache = new WeakMap<SVGElement, Element>()\n\nfunction getElement(node: SVGElement, paper?: Paper): Element {\n if (elementCache.has(node)) {\n const el = elementCache.get(node)!\n\n if (paper && !el.paper) {\n el.paper = paper\n }\n\n return el\n }\n\n const el = new Element(node, paper)\n elementCache.set(node, el)\n\n return el\n}\n\nexport class Element {\n node: SVGElement\n paper?: Paper\n _id: string\n\n constructor(node: SVGElement, paper?: Paper) {\n this.node = node\n this.paper = paper\n this._id = 'e' + (idCounter++).toString(36)\n }\n\n get type(): string {\n return this.node.tagName\n }\n\n get id(): string {\n return this.node.id || this._id\n }\n\n parent(): Element | null {\n return this.node.parentNode ? getElement(this.node.parentNode as SVGElement, this.paper) : null\n }\n\n children(): Element[] {\n return Array.from(this.node.children).map(child => {\n return getElement(child as SVGElement, this.paper)\n })\n }\n\n clear(): this {\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild)\n }\n\n return this\n }\n\n attr(): any;\n attr(name: string): string | null\n attr(name: string, value: any): this\n attr(attrs: Record<string, any>): this\n attr(nameOrAttrs?: string | Record<string, any>, value?: any): any {\n if (typeof nameOrAttrs === 'string') {\n if (value === undefined) {\n return this.node.getAttribute(nameOrAttrs)\n }\n\n this._setAttr(nameOrAttrs, value)\n\n return this\n }\n if (typeof nameOrAttrs === 'object') {\n for (const key in nameOrAttrs) {\n this._setAttr(key, nameOrAttrs[key])\n }\n\n return this\n }\n\n return this\n }\n\n private _setAttr(name: string, value: any) {\n if (name === 'textpath') {\n this._setTextPath(value)\n } else if (name === 'text') {\n this._setText(value)\n } else {\n this.node.setAttribute(name, String(value))\n }\n }\n\n private _setText(content: string) {\n const textPath = this.node.querySelector('textPath')\n\n if (textPath) {\n textPath.textContent = content\n } else {\n this.node.textContent = content\n }\n }\n\n private _setTextPath(pathDescriptor: string) {\n if (this.node.tagName !== 'text') return\n\n const textEl = this.node as SVGTextElement\n\n let textPath = textEl.querySelector('textPath')\n let existingText = ''\n\n if (!textPath) {\n for (let i = 0; i < textEl.childNodes.length; i++) {\n const node = textEl.childNodes[i]\n if (node.nodeType === 3) existingText += node.textContent\n }\n\n while (textEl.firstChild) {\n textEl.removeChild(textEl.firstChild)\n }\n\n textPath = document.createElementNS('http://www.w3.org/2000/svg', 'textPath')\n textEl.appendChild(textPath)\n textEl.removeAttribute('x')\n textEl.removeAttribute('y')\n } else {\n existingText = textPath.textContent || ''\n }\n\n let href: string\n if (pathDescriptor.startsWith('#')) {\n href = pathDescriptor\n } else {\n if (!this.paper) {\n throw new Error('No paper reference for creating defs');\n }\n\n const defs = this.paper.defs\n const pathId = 'p' + Date.now() + Math.random().toString(36).slice(2)\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n path.setAttribute('d', pathDescriptor)\n path.id = pathId\n defs.node.appendChild(path)\n href = '#' + pathId\n }\n\n textPath.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href)\n if (existingText) {\n textPath.textContent = existingText\n }\n }\n\n addClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.add(cls)\n }\n\n return this\n }\n\n removeClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.remove(cls)\n }\n\n return this\n }\n\n transform(t?: string | Matrix): this {\n if (t === undefined) return this\n if (t instanceof Matrix) {\n this.node.setAttribute('transform', t.toString())\n } else {\n const m = transform2matrix(t);\n this.node.setAttribute('transform', m.toString())\n }\n\n return this\n }\n\n getBBox(): { x: number; y: number; width: number; height: number; cx: number; cy: number; x2: number; y2: number } {\n if (this.node.isConnected) {\n const rect = (this.node as SVGGraphicsElement).getBBox()\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n tempSvg.style.pointerEvents = 'none'\n\n document.body.appendChild(tempSvg)\n\n tempSvg.appendChild(this.node)\n const rect = (this.node as SVGGraphicsElement).getBBox()\n tempSvg.removeChild(this.node)\n\n document.body.removeChild(tempSvg)\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n select(selector: string): Element | null {\n const found = this.node.querySelector(selector)\n return found ? getElement(found as SVGElement, this.paper) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.node.querySelectorAll(selector)\n\n return Array.from(nodes).map(node => {\n return getElement(node as SVGElement, this.paper)\n })\n }\n\n clone(): Element {\n return getElement(this.node.cloneNode(true) as SVGElement, this.paper)\n }\n\n add(child: Element): this {\n this.node.appendChild(child.node)\n return this\n }\n\n hover(fIn: (e: MouseEvent) => void, fOut: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseover', fIn)\n this.node.addEventListener('mouseout', fOut)\n return this\n }\n\n mouseup(fn: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseup', fn)\n return this\n }\n}\n\nexport class Paper extends Element {\n defs: Element\n\n constructor(node: SVGSVGElement) {\n super(node, null as any)\n this.paper = this\n\n elementCache.set(node, this)\n\n let defsNode = node.querySelector('defs')\n if (!defsNode) {\n defsNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n node.appendChild(defsNode)\n }\n\n this.defs = getElement(defsNode as SVGElement, this)\n }\n\n g(...args: any[]): Paper {\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n this.node.appendChild(group)\n const groupEl = getElement(group, this)\n\n if (args.length === 1 && args[0] && !args[0].node) {\n groupEl.attr(args[0])\n } else if (args.length) {\n args.forEach(arg => {\n if (arg instanceof Element) groupEl.add(arg)\n })\n }\n\n return groupEl as unknown as Paper\n }\n\n path(d?: string | object): Element {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n this.node.appendChild(path)\n\n const pathEl = getElement(path, this)\n if (d) {\n if (typeof d === 'string') {\n pathEl.attr('d', d)\n }\n\n else pathEl.attr(d)\n }\n\n return pathEl\n }\n\n circle(cx: any, cy?: number, r?: number): Element {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n this.node.appendChild(circle)\n\n const circleEl = getElement(circle, this)\n if (typeof cx === 'object') {\n circleEl.attr(cx)\n } else if (cx != null) {\n circleEl.attr({ cx, cy: cy ?? cx, r: r ?? 0 })\n }\n\n return circleEl\n }\n\n text(x: any, y?: number, text?: string): Element {\n const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n this.node.appendChild(textEl)\n\n const textElWrap = getElement(textEl, this)\n if (typeof x === 'object') {\n textElWrap.attr(x)\n } else if (x != null) {\n textElWrap.attr({ x, y: y ?? x, text: text ?? '' })\n }\n\n return textElWrap\n }\n}\n\nexport class Fragment {\n private frag: DocumentFragment\n\n constructor(frag: DocumentFragment) {\n this.frag = frag\n }\n\n select(selector: string): Element | null {\n const found = this.frag.querySelector(selector)\n return found ? getElement(found as SVGElement) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.frag.querySelectorAll(selector)\n return Array.from(nodes).map(node => getElement(node as SVGElement))\n }\n}\n\nexport function Svg(el: SVGSVGElement): Paper\nexport function Svg(query: string): Paper | null\nexport function Svg(arg: any): any {\n if (typeof arg === 'string') {\n const el = document.querySelector(arg)\n return el ? new Paper(el as SVGSVGElement) : null\n }\n if (arg instanceof SVGSVGElement) {\n return new Paper(arg)\n }\n\n return null\n}\n","import { Fragment } from './svg';\n\nexport function parse(svgString: string): Fragment {\n const div = document.createElement('div');\n let svg = svgString.trim();\n if (!svg.match(/^\\s*<\\s*svg/i)) {\n svg = '<svg>' + svg + '</svg>';\n }\n div.innerHTML = svg;\n const svgElem = div.querySelector('svg');\n const frag = document.createDocumentFragment();\n if (svgElem) {\n while (svgElem.firstChild) {\n frag.appendChild(svgElem.firstChild);\n }\n }\n return new Fragment(frag);\n}\n","import type { ICentralButton, IConfig, ISector } from './config'\n\nimport { getHintFontMetrics, measureTextLengthOnLine } from '@/utils'\nimport { animate, Matrix, mina, parse, Svg } from '@/core'\n\ninterface HintData {\n baseRadius: number;\n textLength: number;\n sectorMidAngle: number;\n}\n\nconst clamp = (v: number, l: number, h: number) => (v > h ? h : v < l ? l : v)\n\nconst hintDataMap = new WeakMap<Svg.Element, HintData>()\nconst iconInitialData = new WeakMap<Svg.Element, {\n midRadius: number;\n scale: number;\n rotation: number;\n bbox: Svg.BBox;\n}>()\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number): { x: number, y: number }\n{\n angle = ((angle - 90) * Math.PI) / 180\n\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n }\n}\n\nfunction describeArc(x: number, y: number, r: number, startAngle: number, endAngle: number, lineMove: boolean, alter: boolean): string\n{\n const start = polarToCartesian(x, y, r, (startAngle %= 360))\n const end = polarToCartesian(x, y, r, (endAngle %= 360))\n\n return `${lineMove ? 'L' : 'M'}${start.x} ${start.y} A${r} ${r}, 0, ${endAngle - startAngle >= 180 ? 1 : 0}, ${alter ? 0 : 1}, ${end.x} ${end.y}`\n}\n\nfunction describeSector(x: number, y: number, r: number, r2: number, startAngle: number, endAngle: number): string\n{\n return `${describeArc(x, y, r, startAngle, endAngle, false, false)} ${describeArc(x, y, r2, endAngle, startAngle, true, true)}Z`\n}\n\nexport class Builder\n{\n private readonly config: IConfig\n private readonly events: { [key: string]: Function[] } = {}\n\n private readonly container: Svg.Paper\n private readonly snap: Svg.Paper\n\n private readonly angle: number\n private readonly size: number = 500\n private readonly c = this.size / 2\n\n public element: HTMLElement\n private area: Svg.Paper\n\n private duration = 300\n\n private icons: Svg.Fragment | null = null\n private theme = 'light'\n\n constructor(config: IConfig)\n {\n this.config = config\n this.size = 2 * config.outerRadius\n this.c = this.size / 2\n this.angle = 360 / (this.config.sectors.length || 6)\n\n this.element = this.createMenuElement()\n this.snap = Svg(this.element.querySelector('svg')!)\n this.area = this.snap\n this.container = this.area.g().transform('s0')\n\n this.init().catch(console.error)\n }\n\n private createMenuElement(): HTMLElement\n {\n const div = document.createElement('div')\n div.className = 'context theme--light hidden'\n div.style.position = 'fixed'\n div.style.top = '0'\n div.style.left = '0'\n div.style.width = '100vw'\n div.style.height = '100vh'\n div.style.overflow = 'visible'\n div.style.pointerEvents = 'auto'\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', this.size.toString())\n svg.setAttribute('height', this.size.toString())\n svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`)\n svg.style.position = 'absolute'\n svg.style.display = 'block'\n svg.style.overflow = 'visible'\n svg.style.pointerEvents = 'auto'\n svg.classList.add('radial-menu-svg')\n\n svg.addEventListener('wheel', (e) => {\n e.preventDefault()\n this.transformOpacity(e)\n })\n\n svg.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n svg.addEventListener('click', (e) => {\n e.stopPropagation()\n this.hide()\n })\n\n div.addEventListener('click', (e) => {\n if (e.target === div) {\n this.hide()\n }\n })\n\n div.appendChild(svg)\n\n return div\n }\n\n private async init(): Promise<void>\n {\n await this.loadIcons()\n this.updateButtons()\n }\n\n private async loadIcons(): Promise<void>\n {\n if (this.icons) return\n\n try {\n const response = await fetch(this.config.sprite)\n if (response.ok) {\n this.icons = parse(await response.text())\n }\n } catch (e) {\n console.error('Failed to load icons:', e)\n }\n }\n\n private updateButtons(): void\n {\n if (!this.icons || !this.container) return\n\n this.container.clear()\n this.config.sectors.forEach(btn => {\n const icon = this.createIcon(btn)\n\n if (icon) {\n const buttonGroup = this.createButton(btn, this.createSector(), icon, this.createHint(btn))\n this.container.add(buttonGroup)\n }\n })\n\n if (this.config.centralButton) {\n const centralBtn = this.createCentralButton(this.config.centralButton)\n if (centralBtn) {\n this.container.add(centralBtn)\n }\n }\n }\n\n private createSector(): Svg.Element\n {\n const color = this.config.color ?? '#1976D2'\n\n return this.area.path(describeSector(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle))\n .attr({ fill: color, stroke: color, opacity: this.config.opacity })\n .addClass('radial-sector')\n }\n\n private createButton(btn: ISector, sector: Svg.Element, icon: Svg.Element, hint: Svg.Element): Svg.Paper\n {\n const buttonGroup = this.area.g(sector, icon, hint)\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.radial-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateButtonHover(buttonGroup, 0, 1, 200, mina.easeinout)\n },\n () => {\n buttonGroup.select('.radial-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateButtonHover(buttonGroup, 1, 0, 2000, mina.elastic)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n this.emit('click', { icon: btn.icon, hint: btn.hint })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createIcon(btn: ISector): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultRadius = (this.config.innerRadius + this.config.outerRadius) / 2\n const sectorHeight = this.config.outerRadius - this.config.innerRadius\n const defaultScale = (sectorHeight * 0.5) / bbox.height\n\n const midRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const targetAngle = this.angle / 2\n const rotation = targetAngle + (btn.rotate || 0)\n\n iconInitialData.set(icon, { midRadius, scale, rotation, bbox })\n\n const pos = polarToCartesian(this.c, this.c, midRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(scale)\n t.rotate(rotation, 0, 0)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t)\n\n return icon.addClass('radial-icon')\n }\n\n private createHint(btn: ISector): Svg.Element\n {\n const group = this.area.g()\n group.addClass('hint-group')\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint || btn.icon\n\n const textLength = measureTextLengthOnLine(text)\n const gap = 2\n\n let baseRadius: number\n let bgHeight = 0\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseRadius = this.config.outerRadius + bgHeight / 2 + gap\n } else {\n const textOffset = metrics.height * 0.75\n baseRadius = this.config.outerRadius + textOffset\n }\n\n const textAngleRad = textLength / baseRadius\n const textAngleDeg = textAngleRad * 180 / Math.PI\n const sectorMidAngle = this.angle / 2\n const startAngle = sectorMidAngle - textAngleDeg / 2\n const endAngle = sectorMidAngle + textAngleDeg / 2\n\n const arcPath = describeArc(this.c, this.c, baseRadius, startAngle, endAngle, false, false)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint').attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n group.add(hint)\n\n hintDataMap.set(group, {\n sectorMidAngle,\n baseRadius,\n textLength\n })\n\n return group\n }\n\n private createCentralButton(btn: ICentralButton): Svg.Element | null\n {\n const defaultRadius = this.config.innerRadius * 0.6\n const buttonRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const color = this.config.color ?? '#1976D2'\n\n const circle = this.area.circle({\n cx: this.c, cy: this.c, r: buttonRadius,\n fill: color, stroke: color,\n opacity: this.config.opacity\n })\n .addClass('radial-sector central-sector')\n\n circle.node.dataset.initialRadius = `${buttonRadius}`\n\n let icon: Svg.Element | null = null\n let hint: Svg.Element | null = null\n\n if (btn.icon) {\n icon = this.createCentralIcon(btn, buttonRadius)\n }\n if (btn.hint) {\n hint = this.createCentralHint(btn, buttonRadius)\n }\n\n const elements = [circle, icon, hint].filter(el => el !== null) as Svg.Element[]\n const buttonGroup = this.area.g(...elements).addClass('central-button')\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.central-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateCentralHover(buttonGroup, true)\n },\n () => {\n buttonGroup.select('.central-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateCentralHover(buttonGroup, false)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n\n this.emit('click', { icon: btn.icon, hint: btn.hint || '' })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createCentralIcon(btn: ICentralButton, buttonRadius: number): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultScale = (buttonRadius * 0.8) / Math.max(bbox.width, bbox.height)\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const t = new Matrix()\n\n t.translate(this.c, this.c)\n t.scale(scale)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t).addClass('radial-icon central-icon')\n\n iconInitialData.set(icon, {\n midRadius: 0,\n rotation: 0,\n scale,\n bbox\n })\n\n return icon\n }\n\n private createCentralHint(btn: ICentralButton, buttonRadius: number): Svg.Element\n {\n const group = this.area.g()\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint ?? ''\n // const textLength = measureTextLengthOnLine(text)\n\n let baseOffset: number\n let bgHeight = 0\n const gap = 2\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseOffset = btn.hintOffset ?? (bgHeight / 2 + gap)\n } else {\n if (btn.hintOffset != null) {\n baseOffset = btn.hintOffset\n } else {\n baseOffset = btn.hintDistance ?? 8\n }\n }\n\n const textRadius = buttonRadius + baseOffset\n\n let startAngle: number, endAngle: number, alter: boolean\n if (btn.hintStartAngle != null && btn.hintEndAngle != null) {\n startAngle = btn.hintStartAngle\n endAngle = btn.hintEndAngle\n alter = startAngle > endAngle\n } else {\n const span = btn.hintSpan ?? 120\n const half = span / 2\n const position = btn.hintPosition ?? 'top'\n\n if (position === 'bottom') {\n startAngle = 180 + half\n endAngle = 180 - half\n alter = true\n } else {\n startAngle = 360 - half\n endAngle = half\n alter = false\n }\n }\n\n const arcPath = describeArc(this.c, this.c, textRadius, startAngle, endAngle, false, alter)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint central-hint')\n .attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n const hintNode = hint.node\n hintNode.dataset.hintOffset = baseOffset.toString()\n hintNode.dataset.startAngle = startAngle.toString()\n hintNode.dataset.endAngle = endAngle.toString()\n hintNode.dataset.alter = alter ? 'true' : 'false'\n hintNode.dataset.centerX = this.c.toString()\n hintNode.dataset.centerY = this.c.toString()\n\n group.add(hint)\n\n return group\n }\n\n public show(e: MouseEvent): void\n {\n this.element.classList.remove('hidden')\n\n const svg = this.element.querySelector('svg') as SVGSVGElement\n\n svg.style.left = (e.clientX - this.c) + 'px'\n svg.style.top = (e.clientY - this.c) + 'px'\n\n this.animateContainer(0, 1, this.duration * 8, mina.elastic)\n this.animateButtons(0, 1, this.duration, this.duration * 8, mina.elastic)\n }\n\n public hide(): void\n {\n this.animateContainer(1, 0, this.duration, mina.easeinout, () => {\n this.element.classList.add('hidden')\n })\n\n this.animateButtons(1, 0, this.duration, this.duration, mina.easeinout)\n }\n\n private animate(obj: any, index: number, start: number, end: number, duration: number, easing: (n: number) => number, fn: (val: number) => void, cb?: () => void): void\n {\n obj.animation ||= []\n obj.animation[index]?.stop()\n obj.animation[index] = animate(start, end, fn, duration, easing, cb)\n }\n\n private animateContainer(start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n this.animate(this, 0, start, end, duration, easing, (val) => {\n this.container.transform(`r${90 - 90 * val},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }, cb)\n }\n\n private animateButtons(start: number, end: number, min: number, max: number, easing: (n: number) => number): void\n {\n const r = (min: number, max: number) => Math.random() * (max - min) + min\n\n this.container.children().forEach((el: Svg.Element, i: number) => {\n const isCentral = el.node.classList.contains('central-button')\n\n this.animate(el, 0, start, end, r(min, max), easing, (val) => {\n if (isCentral) {\n el.transform(`s${val},${val},${this.c},${this.c}`)\n } else {\n el.transform(`r${this.angle * i},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }\n })\n })\n }\n\n private animateButtonHover(buttonGroup: Svg.Paper, start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n const icon = buttonGroup.select('.radial-icon')\n const initialIcon = icon ? iconInitialData.get(icon) : undefined\n const hintGroup = buttonGroup.select('.hint-group')\n const hintData = hintGroup ? hintDataMap.get(hintGroup) : undefined\n\n this.animate(buttonGroup, 1, start, end, duration, easing, (val) => {\n const outward = val * 10\n\n buttonGroup.select('.radial-sector')?.attr({\n d: describeSector(this.c, this.c, this.config.outerRadius - outward, this.config.innerRadius, 0, this.angle)\n })\n\n if (icon && initialIcon) {\n const newRadius = initialIcon.midRadius - outward\n const newScale = initialIcon.scale * (1 - (val * 0.1))\n const targetAngle = this.angle / 2\n const pos = polarToCartesian(this.c, this.c, newRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(newScale)\n t.rotate(initialIcon.rotation, 0, 0)\n t.translate(-initialIcon.bbox.cx, -initialIcon.bbox.cy)\n\n icon.transform(t)\n }\n\n if (hintData && hintGroup) {\n const newRadius = hintData.baseRadius - outward\n const newAngleDeg = (hintData.textLength / newRadius) * 180 / Math.PI\n const newStart = hintData.sectorMidAngle - newAngleDeg / 2\n const newEnd = hintData.sectorMidAngle + newAngleDeg / 2\n const newPath = describeArc(this.c, this.c, newRadius, newStart, newEnd, false, false)\n\n const hint = hintGroup.select('.radial-hint')\n if (hint) {\n hint.attr('textpath', newPath)\n }\n\n const bg = hintGroup.select('.radial-hint-bg')\n if (bg) {\n bg.attr('d', newPath)\n }\n }\n }, cb)\n }\n\n private animateCentralHover(group: Svg.Element, active: boolean): void\n {\n const circle = group.select('.central-sector') as Svg.Element\n const icon = group.select('.central-icon') as Svg.Element\n const hint = group.select('.central-hint') as Svg.Element\n const bg = group.select('.radial-hint-bg') as Svg.Element\n\n if (!circle || !icon) return\n\n const initialRadius = parseFloat(circle.node.dataset.initialRadius || '30')\n const currentRadius = parseFloat(circle.attr('r') as string)\n const targetRadius = active ? initialRadius - 8 : initialRadius\n\n const initialIconData = icon ? iconInitialData.get(icon) : undefined\n\n let hintOffset = 12, startAngle = 0, endAngle = 0, centerX = this.c, centerY = this.c, alter = false\n if (hint) {\n hintOffset = parseFloat(hint.node.dataset.hintOffset || '12')\n startAngle = parseFloat(hint.node.dataset.startAngle || '0')\n endAngle = parseFloat(hint.node.dataset.endAngle || '0')\n centerX = parseFloat(hint.node.dataset.centerX || this.c.toString())\n centerY = parseFloat(hint.node.dataset.centerY || this.c.toString())\n alter = hint.node.dataset.alter === 'true'\n }\n\n animate(currentRadius, targetRadius, (val) => {\n circle.attr('r', val)\n\n if (icon && initialIconData) {\n const newScale = initialIconData.scale * (val / initialRadius)\n const t = new Matrix()\n t.translate(this.c, this.c)\n t.scale(newScale)\n t.translate(-initialIconData.bbox.cx, -initialIconData.bbox.cy)\n icon.transform(t)\n }\n\n if (hint) {\n const newRadius = val + hintOffset\n const newArc = describeArc(centerX, centerY, newRadius, startAngle, endAngle, false, alter)\n hint.attr({ textpath: newArc })\n if (bg) {\n bg.attr({ d: newArc })\n }\n }\n }, 200, mina.easeinout)\n }\n\n private transformOpacity(e: WheelEvent): void\n {\n const dy = e.deltaY > 0 ? 0.03 : -0.03\n this.config.opacity = clamp(this.config.opacity + dy, 0.4, 1)\n\n this.area.selectAll('.radial-sector').forEach((el: Svg.Element) => {\n el.attr({ opacity: this.config.opacity })\n })\n\n this.area.selectAll('.radial-hint-bg.active').forEach((el: Svg.Element) => {\n el.node.style.opacity = String(this.config.opacity)\n })\n }\n\n public on(event: string, callback: Function): void\n {\n (this.events[event] ??= []).push(callback)\n }\n\n private emit(event: string, data: any): void\n {\n if (this.events[event]) {\n this.events[event].forEach(callback => callback(data))\n }\n }\n}\n","import { isPromiseLike } from '@/utils'\nimport { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n private menu: Builder\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.menu.show(e as MouseEvent)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public show(event: PointerEvent)\n {\n this.menu.show(event)\n }\n\n public hide()\n {\n this.menu.hide()\n }\n}\n"],"names":["defaultConfig","defineConfig","options","cache","getFontMetrics","font","ctx","fallback","metrics","ascent","descent","height","result","hintFontMetrics","getHintFontMetrics","div","styles","measureTextLengthOnLine","text","svgNS","tempSvg","tempText","length","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,8 +1,8 @@
1
1
  import { IConfig } from './config';
2
2
  export declare class Manager {
3
3
  private menu;
4
- constructor(container: HTMLElement, config: IConfig);
5
- private bindEvents;
4
+ constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig);
5
+ bindEvents(el?: HTMLElement | Window): void;
6
6
  on(event: string, callback: Function): void;
7
7
  show(event: PointerEvent): void;
8
8
  hide(): void;
@@ -14,4 +14,10 @@ export declare function getHintFontMetrics(): FontMetrics;
14
14
  * @param {string} text - text content
15
15
  */
16
16
  export declare function measureTextLengthOnLine(text: string): number;
17
+ /**
18
+ * @template T
19
+ * @param {PromiseLike<T> | HTMLElement} value
20
+ * @returns boolean
21
+ */
22
+ export declare function isPromiseLike<T extends any>(value: any): value is PromiseLike<T>;
17
23
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@alekstar79/context-menu",
3
3
  "description": "Context Menu TS is a customizable radial context menu for web applications, written in TypeScript.",
4
- "version": "2.0.4",
4
+ "version": "2.0.5",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Aleksey Tarasenko <alekstar79@yandex.ru>",