@alekstar79/context-menu 2.0.8 → 2.1.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/index.ts","../src/core/transform.ts","../src/core/matrix.ts","../src/core/easing.ts","../src/core/animate.ts","../src/core/svg.ts","../src/core/parse.ts","../src/menu/builder.ts","../src/menu/manager.ts"],"sourcesContent":["export interface IConfig {\n sectors: ISector[];\n sprite: string;\n innerRadius: number;\n outerRadius: number;\n opacity: number;\n iconScale?: number;\n iconRadius?: number;\n color?: string;\n hintPadding?: number;\n centralButton?: ICentralButton;\n autoBindContextMenu?: boolean;\n zIndex?: number;\n}\n\nexport interface ICentralButton {\n icon: string;\n hint?: string;\n onclick?: () => void;\n iconRadius?: number;\n iconScale?: number;\n hintPosition?: 'top' | 'bottom';\n hintSpan?: number;\n hintDistance?: number;\n hintOffset?: number;\n hintStartAngle?: number;\n hintEndAngle?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface ISector {\n icon: string;\n hint: string;\n onclick?: () => void;\n rotate?: number;\n iconScale?: number;\n iconRadius?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nconst defaultConfig: IConfig = {\n sectors: [],\n sprite: '../icons.svg',\n innerRadius: 50,\n outerRadius: 150,\n opacity: 0.7,\n}\n\nexport function defineConfig(options: Partial<IConfig>): IConfig\n{\n return { ...defaultConfig, ...options }\n}\n","interface FontMetrics {\n ascent: number\n descent: number\n height: number\n}\n\nconst cache = new Map<string, FontMetrics>()\n\n/**\n * Gets font metrics via Canvas.\n * @param font - font string in CSS format (e.g. 'bold 12px sans-serif')\n */\nfunction getFontMetrics(font: string): FontMetrics {\n if (cache.has(font)) {\n return cache.get(font)!\n }\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n const fallback = { ascent: 9, descent: 3, height: 12 }\n cache.set(font, fallback)\n return fallback\n }\n\n ctx.font = font\n const metrics = ctx.measureText('A')\n const ascent = metrics.actualBoundingBoxAscent ?? 9\n const descent = metrics.actualBoundingBoxDescent ?? 3\n const height = ascent + descent\n\n const result = { ascent, descent, height }\n cache.set(font, result)\n\n return result\n}\n\nlet hintFontMetrics: FontMetrics | null = null\n\n/**\n * Returns the metrics of the font used for hints (class .radial-hint).\n * Measures once and caches the result.\n */\nexport function getHintFontMetrics(): FontMetrics {\n if (hintFontMetrics) return hintFontMetrics\n\n // Creating a temporary element to get real CSS styles\n const div = document.createElement('div')\n\n div.className = 'radial-hint'\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.pointerEvents = 'none'\n div.textContent = 'A'\n\n document.body.appendChild(div)\n\n const styles = window.getComputedStyle(div)\n const font = `${styles.fontWeight} ${styles.fontSize} ${styles.fontFamily}`\n\n document.body.removeChild(div)\n\n const metrics = getFontMetrics(font)\n hintFontMetrics = metrics\n\n return metrics\n}\n\n/**\n * Measures the length of text rendered on a straight line.\n * Useful for estimating arc length without creating a curved path.\n * @param {string} text - text content\n */\nexport function measureTextLengthOnLine(text: string): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n document.body.appendChild(tempSvg)\n\n const tempText = document.createElementNS(svgNS, 'text')\n tempText.textContent = text\n tempSvg.appendChild(tempText)\n\n const length = (tempText as SVGTextElement).getComputedTextLength()\n document.body.removeChild(tempSvg)\n\n return length\n}\n\n/**\n * @template T\n * @param {PromiseLike<T> | HTMLElement} value\n * @returns boolean\n */\nexport function isPromiseLike<T extends any>(value: any): value is PromiseLike<T> {\n return value && (value as PromiseLike<T>).then !== undefined\n}\n","import { Matrix } from './matrix'\n\nexport const rad = (deg: number): number => (deg % 360) * Math.PI / 180\n\nconst p2s = /,?([a-z]),?/gi\n\nfunction pathToString(this: any[]): string {\n return this.join(',').replace(p2s, '$1')\n}\n\nexport const parseTransformString = (TString: string): any[] | null => {\n if (!TString) return null\n let data: any[] = []\n\n if (Array.isArray(TString) && Array.isArray(TString[0])) {\n data = TString.map(arr => [...arr])\n }\n if (!data.length) {\n String(TString).replace(/([rstm])\\s*,?\\s*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?\\s*,?\\s*)+)/ig, (_a: string, b: string, c: string) => {\n const params: number[] = []\n\n c.replace(/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)\\s*,?\\s*/ig, (_: string, b: string) => {\n b && params.push(+b)\n return ''\n })\n\n data.push([b, ...params] as any[])\n return ''\n })\n }\n\n data.toString = pathToString\n\n return data;\n}\n\n// noinspection JSUnusedGlobalSymbols\nexport const svgTransform2string = (tstr: string): any[] => {\n const res: any[] = []\n\n tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, (all: string, name: string, params: string) => {\n let paramList = params.split(/\\s*,\\s*|\\s+/)\n\n if (name === 'rotate' && paramList.length === 1) paramList.push('0', '0')\n if (name === 'scale' && paramList.length === 1) paramList.push(paramList[0]);\n if (name === 'skewX') {\n res.push(['m', 1, 0, Math.tan(rad(parseFloat(paramList[0]))), 1, 0, 0] as any[])\n } else if (name === 'skewY') {\n res.push(['m', 1, Math.tan(rad(parseFloat(paramList[0]))), 0, 1, 0, 0] as any[])\n } else {\n res.push([name.charAt(0), ...paramList.map(Number)] as any[])\n }\n\n return all\n })\n\n return res\n}\n\nexport const transform2matrix = (tstr: string): Matrix => {\n const tdata = parseTransformString(tstr)\n const m = new Matrix()\n\n if (tdata) {\n for (let i = 0, ii = tdata.length; i < ii; i++) {\n const t = tdata[i]\n\n switch (t[0].toLowerCase()) {\n case 't':\n m.translate(t[1], t[2] || 0)\n break\n case 'r':\n m.rotate(t[1], t[2] || 0, t[3] || 0)\n break\n case 's':\n m.scale(t[1] || 1, t[2] || t[1] || 1, t[3] || 0, t[4] || 0)\n break\n case 'm':\n m.add(t[1] || 1, t[2] || 0, t[3] || 0, t[4] || 1, t[5] || 0, t[6] || 0)\n break\n }\n }\n }\n\n return m\n}\n","// noinspection JSUnusedGlobalSymbols,JSSuspiciousNameCombination\n\nimport { rad } from './transform'\n\ntype MatrixLike = { a: number; b: number; c: number; d: number; e: number; f: number }\n\nconst defaultMatrix: MatrixLike = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n\n/**\n * Represents a 2D transformation matrix (a, b, c, d, e, f) as used in SVG.\n */\nexport class Matrix {\n a!: number\n b!: number\n c!: number\n d!: number\n e!: number\n f!: number\n\n /**\n * Creates a new matrix.\n * If no arguments are given, creates an identity matrix.\n * If an object with a,b,c,d,e,f properties is provided (e.g., SVGMatrix), copies its values.\n */\n constructor(a?: number | MatrixLike, b?: number, c?: number, d?: number, e?: number, f?: number) {\n if (a instanceof SVGMatrix) {\n Object.assign(this, a)\n return\n }\n\n if (a != null) {\n Object.assign(this, { a: +a, b: +b!, c: +c!, d: +d!, e: +e!, f: +f! })\n } else {\n Object.assign(this, defaultMatrix)\n }\n }\n\n /**\n * Multiplies current matrix by another matrix.\n */\n add(a: number | Matrix, b?: number, c?: number, d?: number, e?: number, f?: number): this {\n if (a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f)\n }\n\n const aNew = (a as number) * this.a + (b as number) * this.c\n const bNew = (a as number) * this.b + (b as number) * this.d\n\n this.e += (e as number) * this.a + (f as number) * this.c\n this.f += (e as number) * this.b + (f as number) * this.d\n this.c = (c as number) * this.a + (d as number) * this.c\n this.d = (c as number) * this.b + (d as number) * this.d\n\n this.a = aNew\n this.b = bNew\n\n return this\n }\n\n /**\n * Returns inverse matrix.\n */\n invert(): Matrix {\n const det = this.a * this.d - this.b * this.c\n return new Matrix(\n this.d / det,\n -this.b / det,\n -this.c / det,\n this.a / det,\n (this.c * this.f - this.d * this.e) / det,\n (this.b * this.e - this.a * this.f) / det\n )\n }\n\n /**\n * Returns a copy of the matrix.\n */\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f)\n }\n\n /**\n * Translates the matrix by x and y.\n */\n translate(x: number, y = 0): this {\n return this.add(1, 0, 0, 1, x, y)\n }\n\n /**\n * Scales the matrix by x and y, optionally about point (cx, cy).\n */\n scale(x: number, y: number = x, cx?: number, cy?: number): this {\n if (cx != null || cy != null) {\n this.translate(cx!, cy!)\n }\n\n this.a *= x\n this.b *= x\n this.c *= y\n this.d *= y\n\n if (cx != null || cy != null) {\n this.translate(-cx!, -cy!)\n }\n\n return this\n }\n\n /**\n * Rotates the matrix by angle (degrees) about point (x, y).\n */\n rotate(angle: number, x = 0, y = 0): this {\n angle = rad(angle)\n\n const cos = +Math.cos(angle).toFixed(9)\n const sin = +Math.sin(angle).toFixed(9)\n\n this.add(cos, sin, -sin, cos, x, y)\n\n return this.add(1, 0, 0, 1, -x, -y)\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting x.\n */\n x(x: number, y: number): number {\n return x * this.a + y * this.c + this.e\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting y.\n */\n y(x: number, y: number): number {\n return x * this.b + y * this.d + this.f\n }\n\n /**\n * Returns matrix as an SVG matrix string.\n */\n toString(): string {\n return `matrix(${this.a},${this.b},${this.c},${this.d},${this.e},${this.f})`\n }\n}\n","export const mina = {\n linear: (n: number): number => n,\n\n easeinout: (n: number): number => {\n if (n === 1) return 1;\n if (n === 0) return 0;\n const q = 0.48 - n / 1.04;\n const Q = Math.sqrt(0.1734 + q * q);\n const x = Q - q;\n const X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1);\n const y = -Q - q;\n const Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1);\n const t = X + Y + 0.5;\n return (1 - t) * 3 * t * t + t * t * t;\n },\n\n elastic: (n: number): number => {\n if (n === 0 || n === 1) return n;\n return Math.pow(2, -10 * n) * Math.sin((n - 0.075) * (2 * Math.PI) / 0.3) + 1;\n }\n};\n","import { mina } from './easing'\n\nexport interface AnimationHandle {\n stop(): void;\n}\n\nexport function animate(\n from: number | number[],\n to: number | number[],\n setter: (val: any) => void,\n duration: number,\n easing: (n: number) => number = mina.linear,\n callback?: () => void\n): AnimationHandle {\n const start = performance.now()\n let cancelled = false\n let frame = 0\n\n const step = (now: number) => {\n if (cancelled) return\n\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easing(progress)\n\n if (Array.isArray(from) && Array.isArray(to)) {\n const val = from.map((f, i) => f + (to[i] - f) * eased)\n setter(val)\n } else {\n const val = (from as number) + ((to as number) - (from as number)) * eased\n setter(val)\n }\n\n if (progress < 1) {\n frame = requestAnimationFrame(step)\n } else {\n callback?.()\n }\n }\n\n frame = requestAnimationFrame(step)\n\n return {\n stop: () => {\n cancelled = true\n cancelAnimationFrame(frame)\n }\n }\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { transform2matrix } from './transform'\nimport { Matrix } from './matrix'\n\nlet idCounter = 0\nconst elementCache = new WeakMap<SVGElement, Element>()\n\nfunction getElement(node: SVGElement, paper?: Paper): Element {\n if (elementCache.has(node)) {\n const el = elementCache.get(node)!\n\n if (paper && !el.paper) {\n el.paper = paper\n }\n\n return el\n }\n\n const el = new Element(node, paper)\n elementCache.set(node, el)\n\n return el\n}\n\nexport class Element {\n node: SVGElement\n paper?: Paper\n _id: string\n\n constructor(node: SVGElement, paper?: Paper) {\n this.node = node\n this.paper = paper\n this._id = 'e' + (idCounter++).toString(36)\n }\n\n get type(): string {\n return this.node.tagName\n }\n\n get id(): string {\n return this.node.id || this._id\n }\n\n parent(): Element | null {\n return this.node.parentNode ? getElement(this.node.parentNode as SVGElement, this.paper) : null\n }\n\n children(): Element[] {\n return Array.from(this.node.children).map(child => {\n return getElement(child as SVGElement, this.paper)\n })\n }\n\n clear(): this {\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild)\n }\n\n return this\n }\n\n attr(): any;\n attr(name: string): string | null\n attr(name: string, value: any): this\n attr(attrs: Record<string, any>): this\n attr(nameOrAttrs?: string | Record<string, any>, value?: any): any {\n if (typeof nameOrAttrs === 'string') {\n if (value === undefined) {\n return this.node.getAttribute(nameOrAttrs)\n }\n\n this._setAttr(nameOrAttrs, value)\n\n return this\n }\n if (typeof nameOrAttrs === 'object') {\n for (const key in nameOrAttrs) {\n this._setAttr(key, nameOrAttrs[key])\n }\n\n return this\n }\n\n return this\n }\n\n private _setAttr(name: string, value: any) {\n if (name === 'textpath') {\n this._setTextPath(value)\n } else if (name === 'text') {\n this._setText(value)\n } else {\n this.node.setAttribute(name, String(value))\n }\n }\n\n private _setText(content: string) {\n const textPath = this.node.querySelector('textPath')\n\n if (textPath) {\n textPath.textContent = content\n } else {\n this.node.textContent = content\n }\n }\n\n private _setTextPath(pathDescriptor: string) {\n if (this.node.tagName !== 'text') return\n\n const textEl = this.node as SVGTextElement\n\n let textPath = textEl.querySelector('textPath')\n let existingText = ''\n\n if (!textPath) {\n for (let i = 0; i < textEl.childNodes.length; i++) {\n const node = textEl.childNodes[i]\n if (node.nodeType === 3) existingText += node.textContent\n }\n\n while (textEl.firstChild) {\n textEl.removeChild(textEl.firstChild)\n }\n\n textPath = document.createElementNS('http://www.w3.org/2000/svg', 'textPath')\n textEl.appendChild(textPath)\n textEl.removeAttribute('x')\n textEl.removeAttribute('y')\n } else {\n existingText = textPath.textContent || ''\n }\n\n let href: string\n if (pathDescriptor.startsWith('#')) {\n href = pathDescriptor\n } else {\n if (!this.paper) {\n throw new Error('No paper reference for creating defs');\n }\n\n const defs = this.paper.defs\n const pathId = 'p' + Date.now() + Math.random().toString(36).slice(2)\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n path.setAttribute('d', pathDescriptor)\n path.id = pathId\n defs.node.appendChild(path)\n href = '#' + pathId\n }\n\n textPath.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href)\n if (existingText) {\n textPath.textContent = existingText\n }\n }\n\n addClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.add(cls)\n }\n\n return this\n }\n\n removeClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.remove(cls)\n }\n\n return this\n }\n\n transform(t?: string | Matrix): this {\n if (t === undefined) return this\n if (t instanceof Matrix) {\n this.node.setAttribute('transform', t.toString())\n } else {\n const m = transform2matrix(t);\n this.node.setAttribute('transform', m.toString())\n }\n\n return this\n }\n\n getBBox(): { x: number; y: number; width: number; height: number; cx: number; cy: number; x2: number; y2: number } {\n if (this.node.isConnected) {\n const rect = (this.node as SVGGraphicsElement).getBBox()\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n tempSvg.style.pointerEvents = 'none'\n\n document.body.appendChild(tempSvg)\n\n tempSvg.appendChild(this.node)\n const rect = (this.node as SVGGraphicsElement).getBBox()\n tempSvg.removeChild(this.node)\n\n document.body.removeChild(tempSvg)\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n select(selector: string): Element | null {\n const found = this.node.querySelector(selector)\n return found ? getElement(found as SVGElement, this.paper) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.node.querySelectorAll(selector)\n\n return Array.from(nodes).map(node => {\n return getElement(node as SVGElement, this.paper)\n })\n }\n\n clone(): Element {\n return getElement(this.node.cloneNode(true) as SVGElement, this.paper)\n }\n\n add(child: Element): this {\n this.node.appendChild(child.node)\n return this\n }\n\n hover(fIn: (e: MouseEvent) => void, fOut: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseover', fIn)\n this.node.addEventListener('mouseout', fOut)\n return this\n }\n\n mouseup(fn: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseup', fn)\n return this\n }\n}\n\nexport class Paper extends Element {\n defs: Element\n\n constructor(node: SVGSVGElement) {\n super(node, null as any)\n this.paper = this\n\n elementCache.set(node, this)\n\n let defsNode = node.querySelector('defs')\n if (!defsNode) {\n defsNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n node.appendChild(defsNode)\n }\n\n this.defs = getElement(defsNode as SVGElement, this)\n }\n\n g(...args: any[]): Paper {\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n this.node.appendChild(group)\n const groupEl = getElement(group, this)\n\n if (args.length === 1 && args[0] && !args[0].node) {\n groupEl.attr(args[0])\n } else if (args.length) {\n args.forEach(arg => {\n if (arg instanceof Element) groupEl.add(arg)\n })\n }\n\n return groupEl as unknown as Paper\n }\n\n path(d?: string | object): Element {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n this.node.appendChild(path)\n\n const pathEl = getElement(path, this)\n if (d) {\n if (typeof d === 'string') {\n pathEl.attr('d', d)\n }\n\n else pathEl.attr(d)\n }\n\n return pathEl\n }\n\n circle(cx: any, cy?: number, r?: number): Element {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n this.node.appendChild(circle)\n\n const circleEl = getElement(circle, this)\n if (typeof cx === 'object') {\n circleEl.attr(cx)\n } else if (cx != null) {\n circleEl.attr({ cx, cy: cy ?? cx, r: r ?? 0 })\n }\n\n return circleEl\n }\n\n text(x: any, y?: number, text?: string): Element {\n const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n this.node.appendChild(textEl)\n\n const textElWrap = getElement(textEl, this)\n if (typeof x === 'object') {\n textElWrap.attr(x)\n } else if (x != null) {\n textElWrap.attr({ x, y: y ?? x, text: text ?? '' })\n }\n\n return textElWrap\n }\n}\n\nexport class Fragment {\n private frag: DocumentFragment\n\n constructor(frag: DocumentFragment) {\n this.frag = frag\n }\n\n select(selector: string): Element | null {\n const found = this.frag.querySelector(selector)\n return found ? getElement(found as SVGElement) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.frag.querySelectorAll(selector)\n return Array.from(nodes).map(node => getElement(node as SVGElement))\n }\n}\n\nexport function Svg(el: SVGSVGElement): Paper\nexport function Svg(query: string): Paper | null\nexport function Svg(arg: any): any {\n if (typeof arg === 'string') {\n const el = document.querySelector(arg)\n return el ? new Paper(el as SVGSVGElement) : null\n }\n if (arg instanceof SVGSVGElement) {\n return new Paper(arg)\n }\n\n return null\n}\n","import { Fragment } from './svg';\n\nexport function parse(svgString: string): Fragment {\n const div = document.createElement('div');\n let svg = svgString.trim();\n if (!svg.match(/^\\s*<\\s*svg/i)) {\n svg = '<svg>' + svg + '</svg>';\n }\n div.innerHTML = svg;\n const svgElem = div.querySelector('svg');\n const frag = document.createDocumentFragment();\n if (svgElem) {\n while (svgElem.firstChild) {\n frag.appendChild(svgElem.firstChild);\n }\n }\n return new Fragment(frag);\n}\n","import type { ICentralButton, IConfig, ISector } from './config'\n\nimport { getHintFontMetrics, measureTextLengthOnLine } from '@/utils'\nimport { animate, Matrix, mina, parse, Svg } from '@/core'\n\ninterface HintData {\n baseRadius: number;\n textLength: number;\n sectorMidAngle: number;\n}\n\nconst clamp = (v: number, l: number, h: number) => (v > h ? h : v < l ? l : v)\n\nconst hintDataMap = new WeakMap<Svg.Element, HintData>()\nconst iconInitialData = new WeakMap<Svg.Element, {\n midRadius: number;\n scale: number;\n rotation: number;\n bbox: Svg.BBox;\n}>()\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number): { x: number, y: number }\n{\n angle = ((angle - 90) * Math.PI) / 180\n\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n }\n}\n\nfunction describeArc(x: number, y: number, r: number, startAngle: number, endAngle: number, lineMove: boolean, alter: boolean): string\n{\n const start = polarToCartesian(x, y, r, (startAngle %= 360))\n const end = polarToCartesian(x, y, r, (endAngle %= 360))\n\n return `${lineMove ? 'L' : 'M'}${start.x} ${start.y} A${r} ${r}, 0, ${endAngle - startAngle >= 180 ? 1 : 0}, ${alter ? 0 : 1}, ${end.x} ${end.y}`\n}\n\nfunction describeSector(x: number, y: number, r: number, r2: number, startAngle: number, endAngle: number): string\n{\n return `${describeArc(x, y, r, startAngle, endAngle, false, false)} ${describeArc(x, y, r2, endAngle, startAngle, true, true)}Z`\n}\n\nexport class Builder\n{\n public config: IConfig\n public element: HTMLElement\n\n private readonly events: { [key: string]: Function[] } = {}\n\n private readonly container: Svg.Paper\n private readonly snap: Svg.Paper\n\n private readonly angle: number\n private readonly size: number = 500\n private readonly c = this.size / 2\n\n private duration = 300\n\n private area: Svg.Paper\n private icons: Svg.Fragment | null = null\n private theme = 'light'\n\n constructor(config: IConfig)\n {\n this.config = config\n this.size = 2 * config.outerRadius\n this.c = this.size / 2\n this.angle = 360 / (this.config.sectors.length || 6)\n\n this.element = this.createMenuElement()\n this.snap = Svg(this.element.querySelector('svg')!)\n this.area = this.snap\n this.container = this.area.g().transform('s0')\n\n this.init().catch(console.error)\n }\n\n private createMenuElement(): HTMLElement\n {\n const div = document.createElement('div')\n div.className = 'context hidden'\n div.style.position = 'fixed'\n div.style.top = '0'\n div.style.left = '0'\n div.style.width = '100vw'\n div.style.height = '100vh'\n div.style.overflow = 'visible'\n div.style.pointerEvents = 'auto'\n\n if (this.config.zIndex && !isNaN(this.config.zIndex)) {\n div.style.zIndex = `${this.config.zIndex}`\n }\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', this.size.toString())\n svg.setAttribute('height', this.size.toString())\n svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`)\n svg.style.position = 'absolute'\n svg.style.display = 'block'\n svg.style.overflow = 'visible'\n svg.style.pointerEvents = 'auto'\n svg.classList.add('radial-menu-svg')\n\n svg.addEventListener('wheel', (e) => {\n e.preventDefault()\n this.transformOpacity(e)\n })\n\n svg.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n svg.addEventListener('click', (e) => {\n e.stopPropagation()\n this.hide()\n })\n\n div.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n div.addEventListener('click', (e) => {\n if (e.target === div) {\n this.hide()\n }\n })\n\n div.appendChild(svg)\n\n return div\n }\n\n private async init(): Promise<void>\n {\n await this.loadIcons()\n this.updateButtons()\n }\n\n private async loadIcons(): Promise<void>\n {\n if (this.icons) return\n\n try {\n const response = await fetch(this.config.sprite)\n if (response.ok) {\n this.icons = parse(await response.text())\n }\n } catch (e) {\n console.error('Failed to load icons:', e)\n }\n }\n\n public updateButtons(): void\n {\n if (!this.icons || !this.container) return\n\n this.container.clear()\n this.config.sectors.forEach(btn => {\n const icon = this.createIcon(btn)\n\n if (icon) {\n const buttonGroup = this.createButton(btn, this.createSector(), icon, this.createHint(btn))\n this.container.add(buttonGroup)\n }\n })\n\n if (this.config.centralButton) {\n const centralBtn = this.createCentralButton(this.config.centralButton)\n if (centralBtn) {\n this.container.add(centralBtn)\n }\n }\n }\n\n private createSector(): Svg.Element\n {\n const color = this.config.color ?? '#1976D2'\n\n return this.area.path(describeSector(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle))\n .attr({ fill: color, stroke: color, opacity: this.config.opacity })\n .addClass('radial-sector')\n }\n\n private createButton(btn: ISector, sector: Svg.Element, icon: Svg.Element, hint: Svg.Element): Svg.Paper\n {\n const buttonGroup = this.area.g(sector, icon, hint)\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.radial-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateButtonHover(buttonGroup, 0, 1, 200, mina.easeinout)\n },\n () => {\n buttonGroup.select('.radial-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateButtonHover(buttonGroup, 1, 0, 2000, mina.elastic)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n this.emit('click', { icon: btn.icon, hint: btn.hint })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createIcon(btn: ISector): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultRadius = (this.config.innerRadius + this.config.outerRadius) / 2\n const sectorHeight = this.config.outerRadius - this.config.innerRadius\n const defaultScale = (sectorHeight * 0.5) / bbox.height\n\n const midRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const targetAngle = this.angle / 2\n const rotation = targetAngle + (btn.rotate || 0)\n\n iconInitialData.set(icon, { midRadius, scale, rotation, bbox })\n\n const pos = polarToCartesian(this.c, this.c, midRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(scale)\n t.rotate(rotation, 0, 0)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t)\n\n return icon.addClass('radial-icon')\n }\n\n private createHint(btn: ISector): Svg.Element\n {\n const group = this.area.g()\n group.addClass('hint-group')\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint || btn.icon\n\n const textLength = measureTextLengthOnLine(text)\n const gap = 2\n\n let baseRadius: number\n let bgHeight = 0\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseRadius = this.config.outerRadius + bgHeight / 2 + gap\n } else {\n const textOffset = metrics.height * 0.75\n baseRadius = this.config.outerRadius + textOffset\n }\n\n const textAngleRad = textLength / baseRadius\n const textAngleDeg = textAngleRad * 180 / Math.PI\n const sectorMidAngle = this.angle / 2\n const startAngle = sectorMidAngle - textAngleDeg / 2\n const endAngle = sectorMidAngle + textAngleDeg / 2\n\n const arcPath = describeArc(this.c, this.c, baseRadius, startAngle, endAngle, false, false)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint').attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n group.add(hint)\n\n hintDataMap.set(group, {\n sectorMidAngle,\n baseRadius,\n textLength\n })\n\n return group\n }\n\n private createCentralButton(btn: ICentralButton): Svg.Element | null\n {\n const defaultRadius = this.config.innerRadius * 0.6\n const buttonRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const color = this.config.color ?? '#1976D2'\n\n const circle = this.area.circle({\n cx: this.c, cy: this.c, r: buttonRadius,\n fill: color, stroke: color,\n opacity: this.config.opacity\n })\n .addClass('radial-sector central-sector')\n\n circle.node.dataset.initialRadius = `${buttonRadius}`\n\n let icon: Svg.Element | null = null\n let hint: Svg.Element | null = null\n\n if (btn.icon) {\n icon = this.createCentralIcon(btn, buttonRadius)\n }\n if (btn.hint) {\n hint = this.createCentralHint(btn, buttonRadius)\n }\n\n const elements = [circle, icon, hint].filter(el => el !== null) as Svg.Element[]\n const buttonGroup = this.area.g(...elements).addClass('central-button')\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.central-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateCentralHover(buttonGroup, true)\n },\n () => {\n buttonGroup.select('.central-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateCentralHover(buttonGroup, false)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n\n this.emit('click', { icon: btn.icon, hint: btn.hint || '' })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createCentralIcon(btn: ICentralButton, buttonRadius: number): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultScale = (buttonRadius * 0.8) / Math.max(bbox.width, bbox.height)\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const t = new Matrix()\n\n t.translate(this.c, this.c)\n t.scale(scale)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t).addClass('radial-icon central-icon')\n\n iconInitialData.set(icon, {\n midRadius: 0,\n rotation: 0,\n scale,\n bbox\n })\n\n return icon\n }\n\n private createCentralHint(btn: ICentralButton, buttonRadius: number): Svg.Element\n {\n const group = this.area.g()\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint ?? ''\n // const textLength = measureTextLengthOnLine(text)\n\n let baseOffset: number\n let bgHeight = 0\n const gap = 2\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseOffset = btn.hintOffset ?? (bgHeight / 2 + gap)\n } else {\n if (btn.hintOffset != null) {\n baseOffset = btn.hintOffset\n } else {\n baseOffset = btn.hintDistance ?? 8\n }\n }\n\n const textRadius = buttonRadius + baseOffset\n\n let startAngle: number, endAngle: number, alter: boolean\n if (btn.hintStartAngle != null && btn.hintEndAngle != null) {\n startAngle = btn.hintStartAngle\n endAngle = btn.hintEndAngle\n alter = startAngle > endAngle\n } else {\n const span = btn.hintSpan ?? 120\n const half = span / 2\n const position = btn.hintPosition ?? 'top'\n\n if (position === 'bottom') {\n startAngle = 180 + half\n endAngle = 180 - half\n alter = true\n } else {\n startAngle = 360 - half\n endAngle = half\n alter = false\n }\n }\n\n const arcPath = describeArc(this.c, this.c, textRadius, startAngle, endAngle, false, alter)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint central-hint')\n .attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n const hintNode = hint.node\n hintNode.dataset.hintOffset = baseOffset.toString()\n hintNode.dataset.startAngle = startAngle.toString()\n hintNode.dataset.endAngle = endAngle.toString()\n hintNode.dataset.alter = alter ? 'true' : 'false'\n hintNode.dataset.centerX = this.c.toString()\n hintNode.dataset.centerY = this.c.toString()\n\n group.add(hint)\n\n return group\n }\n\n public show(e: MouseEvent): void\n {\n this.element.classList.remove('hidden')\n\n const svg = this.element.querySelector('svg') as SVGSVGElement\n\n svg.style.left = (e.clientX - this.c) + 'px'\n svg.style.top = (e.clientY - this.c) + 'px'\n\n this.animateContainer(0, 1, this.duration * 8, mina.elastic)\n this.animateButtons(0, 1, this.duration, this.duration * 8, mina.elastic)\n }\n\n public hide(): void\n {\n this.animateContainer(1, 0, this.duration, mina.easeinout, () => {\n this.element.classList.add('hidden')\n })\n\n this.animateButtons(1, 0, this.duration, this.duration, mina.easeinout)\n }\n\n private animate(obj: any, index: number, start: number, end: number, duration: number, easing: (n: number) => number, fn: (val: number) => void, cb?: () => void): void\n {\n obj.animation ||= []\n obj.animation[index]?.stop()\n obj.animation[index] = animate(start, end, fn, duration, easing, cb)\n }\n\n private animateContainer(start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n this.animate(this, 0, start, end, duration, easing, (val) => {\n this.container.transform(`r${90 - 90 * val},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }, cb)\n }\n\n private animateButtons(start: number, end: number, min: number, max: number, easing: (n: number) => number): void\n {\n const r = (min: number, max: number) => Math.random() * (max - min) + min\n\n this.container.children().forEach((el: Svg.Element, i: number) => {\n const isCentral = el.node.classList.contains('central-button')\n\n this.animate(el, 0, start, end, r(min, max), easing, (val) => {\n if (isCentral) {\n el.transform(`s${val},${val},${this.c},${this.c}`)\n } else {\n el.transform(`r${this.angle * i},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }\n })\n })\n }\n\n private animateButtonHover(buttonGroup: Svg.Paper, start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n const icon = buttonGroup.select('.radial-icon')\n const initialIcon = icon ? iconInitialData.get(icon) : undefined\n const hintGroup = buttonGroup.select('.hint-group')\n const hintData = hintGroup ? hintDataMap.get(hintGroup) : undefined\n\n this.animate(buttonGroup, 1, start, end, duration, easing, (val) => {\n const outward = val * 10\n\n buttonGroup.select('.radial-sector')?.attr({\n d: describeSector(this.c, this.c, this.config.outerRadius - outward, this.config.innerRadius, 0, this.angle)\n })\n\n if (icon && initialIcon) {\n const newRadius = initialIcon.midRadius - outward\n const newScale = initialIcon.scale * (1 - (val * 0.1))\n const targetAngle = this.angle / 2\n const pos = polarToCartesian(this.c, this.c, newRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(newScale)\n t.rotate(initialIcon.rotation, 0, 0)\n t.translate(-initialIcon.bbox.cx, -initialIcon.bbox.cy)\n\n icon.transform(t)\n }\n\n if (hintData && hintGroup) {\n const newRadius = hintData.baseRadius - outward\n const newAngleDeg = (hintData.textLength / newRadius) * 180 / Math.PI\n const newStart = hintData.sectorMidAngle - newAngleDeg / 2\n const newEnd = hintData.sectorMidAngle + newAngleDeg / 2\n const newPath = describeArc(this.c, this.c, newRadius, newStart, newEnd, false, false)\n\n const hint = hintGroup.select('.radial-hint')\n if (hint) {\n hint.attr('textpath', newPath)\n }\n\n const bg = hintGroup.select('.radial-hint-bg')\n if (bg) {\n bg.attr('d', newPath)\n }\n }\n }, cb)\n }\n\n private animateCentralHover(group: Svg.Element, active: boolean): void\n {\n const circle = group.select('.central-sector') as Svg.Element\n const icon = group.select('.central-icon') as Svg.Element\n const hint = group.select('.central-hint') as Svg.Element\n const bg = group.select('.radial-hint-bg') as Svg.Element\n\n if (!circle || !icon) return\n\n const initialRadius = parseFloat(circle.node.dataset.initialRadius || '30')\n const currentRadius = parseFloat(circle.attr('r') as string)\n const targetRadius = active ? initialRadius - 8 : initialRadius\n\n const initialIconData = icon ? iconInitialData.get(icon) : undefined\n\n let hintOffset = 12, startAngle = 0, endAngle = 0, centerX = this.c, centerY = this.c, alter = false\n if (hint) {\n hintOffset = parseFloat(hint.node.dataset.hintOffset || '12')\n startAngle = parseFloat(hint.node.dataset.startAngle || '0')\n endAngle = parseFloat(hint.node.dataset.endAngle || '0')\n centerX = parseFloat(hint.node.dataset.centerX || this.c.toString())\n centerY = parseFloat(hint.node.dataset.centerY || this.c.toString())\n alter = hint.node.dataset.alter === 'true'\n }\n\n animate(currentRadius, targetRadius, (val) => {\n circle.attr('r', val)\n\n if (icon && initialIconData) {\n const newScale = initialIconData.scale * (val / initialRadius)\n const t = new Matrix()\n t.translate(this.c, this.c)\n t.scale(newScale)\n t.translate(-initialIconData.bbox.cx, -initialIconData.bbox.cy)\n icon.transform(t)\n }\n\n if (hint) {\n const newRadius = val + hintOffset\n const newArc = describeArc(centerX, centerY, newRadius, startAngle, endAngle, false, alter)\n hint.attr({ textpath: newArc })\n if (bg) {\n bg.attr({ d: newArc })\n }\n }\n }, 200, mina.easeinout)\n }\n\n private transformOpacity(e: WheelEvent): void\n {\n const dy = e.deltaY > 0 ? 0.03 : -0.03\n this.config.opacity = clamp(this.config.opacity + dy, 0.4, 1)\n\n this.area.selectAll('.radial-sector').forEach((el: Svg.Element) => {\n el.attr({ opacity: this.config.opacity })\n })\n\n this.area.selectAll('.radial-hint-bg.active').forEach((el: Svg.Element) => {\n el.node.style.opacity = String(this.config.opacity)\n })\n }\n\n public on(event: string, callback: Function): void\n {\n (this.events[event] ??= []).push(callback)\n }\n\n private emit(event: string, data: any): void\n {\n if (this.events[event]) {\n this.events[event].forEach(callback => callback(data))\n }\n }\n}\n","import { isPromiseLike } from '@/utils'\nimport { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n public menu: Builder\n\n public shown: boolean = false\n\n constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig)\n {\n this.menu = new Builder(config)\n\n isPromiseLike(container)\n ? container.then((c) => c.appendChild(this.menu.element))\n : container.appendChild(this.menu.element)\n\n if (config.autoBindContextMenu !== false) {\n this.bindEvents()\n }\n }\n\n public bindEvents(el: HTMLElement | Window = window)\n {\n el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.toggle(e as PointerEvent)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public toggle(event: PointerEvent)\n {\n this.shown ? this.menu.hide() : this.menu.show(event)\n }\n\n public show(event: PointerEvent)\n {\n this.shown = true\n\n this.menu.show(event)\n }\n\n public hide()\n {\n this.shown = false\n\n this.menu.hide()\n }\n}\n"],"names":["defaultConfig","defineConfig","options","cache","getFontMetrics","font","ctx","fallback","metrics","ascent","descent","height","result","hintFontMetrics","getHintFontMetrics","div","styles","measureTextLengthOnLine","text","svgNS","tempSvg","tempText","length","isPromiseLike","value","rad","deg","p2s","pathToString","parseTransformString","TString","data","arr","_a","b","c","params","_","transform2matrix","tstr","tdata","m","Matrix","i","ii","t","defaultMatrix","a","d","e","f","aNew","bNew","det","x","y","cx","cy","angle","cos","sin","mina","n","q","Q","X","Y","animate","from","to","setter","duration","easing","callback","start","cancelled","frame","step","now","elapsed","progress","eased","val","idCounter","elementCache","getElement","node","paper","el","Element","child","nameOrAttrs","key","name","content","textPath","pathDescriptor","textEl","existingText","href","defs","pathId","path","className","classes","cls","rect","selector","found","nodes","fIn","fOut","fn","Paper","defsNode","args","group","groupEl","arg","pathEl","r","circle","circleEl","textElWrap","Fragment","frag","Svg","parse","svgString","svg","svgElem","clamp","v","l","h","hintDataMap","iconInitialData","polarToCartesian","describeArc","startAngle","endAngle","lineMove","alter","end","describeSector","r2","Builder","config","response","btn","icon","buttonGroup","centralBtn","color","sector","hint","bg","iconTemplate","bbox","defaultRadius","defaultScale","midRadius","scale","targetAngle","rotation","pos","hintPadding","textLength","gap","baseRadius","bgHeight","textOffset","textAngleDeg","sectorMidAngle","arcPath","bgColor","textPathEl","buttonRadius","elements","baseOffset","textRadius","half","hintNode","obj","index","cb","min","max","isCentral","initialIcon","hintGroup","hintData","outward","newRadius","newScale","newAngleDeg","newStart","newEnd","newPath","active","initialRadius","currentRadius","targetRadius","initialIconData","hintOffset","centerX","centerY","newArc","dy","event","Manager","container"],"mappings":"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"}
1
+ {"version":3,"file":"context-menu.js","sources":["../src/menu/config.ts","../src/utils/index.ts","../src/core/transform.ts","../src/core/matrix.ts","../src/core/easing.ts","../src/core/animate.ts","../src/core/svg.ts","../src/core/parse.ts","../src/menu/builder.ts","../src/menu/manager.ts"],"sourcesContent":["export interface ICentralButton {\n icon: string;\n hint?: string;\n onclick?: () => void;\n iconRadius?: number;\n iconScale?: number;\n hintPosition?: 'top' | 'bottom';\n hintSpan?: number;\n hintDistance?: number;\n hintOffset?: number;\n hintStartAngle?: number;\n hintEndAngle?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface ISector {\n icon: string;\n hint: string;\n onclick?: () => void;\n rotate?: number;\n iconScale?: number;\n iconRadius?: number;\n hintPadding?: number;\n hintVerticalOffset?: number;\n}\n\nexport interface IConfig {\n sectors: ISector[];\n sprite: string;\n innerRadius: number;\n outerRadius: number;\n opacity: number;\n iconScale?: number;\n iconRadius?: number;\n color?: string;\n hintPadding?: number;\n centralButton?: ICentralButton;\n autoBindContextMenu?: boolean;\n zIndex?: number;\n}\n\nconst defaultConfig: IConfig = {\n sectors: [],\n sprite: '../icons.svg',\n innerRadius: 50,\n outerRadius: 150,\n opacity: 0.7,\n}\n\nexport function defineConfig(options: Partial<IConfig>): IConfig\n{\n return { ...defaultConfig, ...options }\n}\n","interface FontMetrics {\n ascent: number\n descent: number\n height: number\n}\n\nconst cache = new Map<string, FontMetrics>()\n\n/**\n * Gets font metrics via Canvas.\n * @param font - font string in CSS format (e.g. 'bold 12px sans-serif')\n */\nfunction getFontMetrics(font: string): FontMetrics {\n if (cache.has(font)) {\n return cache.get(font)!\n }\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n const fallback = { ascent: 9, descent: 3, height: 12 }\n cache.set(font, fallback)\n return fallback\n }\n\n ctx.font = font\n const metrics = ctx.measureText('A')\n const ascent = metrics.actualBoundingBoxAscent ?? 9\n const descent = metrics.actualBoundingBoxDescent ?? 3\n const height = ascent + descent\n\n const result = { ascent, descent, height }\n cache.set(font, result)\n\n return result\n}\n\nlet hintFontMetrics: FontMetrics | null = null\n\n/**\n * Returns the metrics of the font used for hints (class .radial-hint).\n * Measures once and caches the result.\n */\nexport function getHintFontMetrics(): FontMetrics {\n if (hintFontMetrics) return hintFontMetrics\n\n // Creating a temporary element to get real CSS styles\n const div = document.createElement('div')\n\n div.className = 'radial-hint'\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.pointerEvents = 'none'\n div.textContent = 'A'\n\n document.body.appendChild(div)\n\n const styles = window.getComputedStyle(div)\n const font = `${styles.fontWeight} ${styles.fontSize} ${styles.fontFamily}`\n\n document.body.removeChild(div)\n\n const metrics = getFontMetrics(font)\n hintFontMetrics = metrics\n\n return metrics\n}\n\n/**\n * Measures the length of text rendered on a straight line.\n * Useful for estimating arc length without creating a curved path.\n * @param {string} text - text content\n */\nexport function measureTextLengthOnLine(text: string): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n document.body.appendChild(tempSvg)\n\n const tempText = document.createElementNS(svgNS, 'text')\n tempText.textContent = text\n tempSvg.appendChild(tempText)\n\n const length = (tempText as SVGTextElement).getComputedTextLength()\n document.body.removeChild(tempSvg)\n\n return length\n}\n\n/**\n * @template T\n * @param {PromiseLike<T> | HTMLElement} value\n * @returns boolean\n */\nexport function isPromiseLike<T extends any>(value: any): value is PromiseLike<T> {\n return value && (value as PromiseLike<T>).then !== undefined\n}\n","import { Matrix } from './matrix'\n\nexport const rad = (deg: number): number => (deg % 360) * Math.PI / 180\n\nconst p2s = /,?([a-z]),?/gi\n\nfunction pathToString(this: any[]): string {\n return this.join(',').replace(p2s, '$1')\n}\n\nexport const parseTransformString = (TString: string): any[] | null => {\n if (!TString) return null\n let data: any[] = []\n\n if (Array.isArray(TString) && Array.isArray(TString[0])) {\n data = TString.map(arr => [...arr])\n }\n if (!data.length) {\n String(TString).replace(/([rstm])\\s*,?\\s*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?\\s*,?\\s*)+)/ig, (_a: string, b: string, c: string) => {\n const params: number[] = []\n\n c.replace(/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)\\s*,?\\s*/ig, (_: string, b: string) => {\n b && params.push(+b)\n return ''\n })\n\n data.push([b, ...params] as any[])\n return ''\n })\n }\n\n data.toString = pathToString\n\n return data;\n}\n\n// noinspection JSUnusedGlobalSymbols\nexport const svgTransform2string = (tstr: string): any[] => {\n const res: any[] = []\n\n tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, (all: string, name: string, params: string) => {\n let paramList = params.split(/\\s*,\\s*|\\s+/)\n\n if (name === 'rotate' && paramList.length === 1) paramList.push('0', '0')\n if (name === 'scale' && paramList.length === 1) paramList.push(paramList[0]);\n if (name === 'skewX') {\n res.push(['m', 1, 0, Math.tan(rad(parseFloat(paramList[0]))), 1, 0, 0] as any[])\n } else if (name === 'skewY') {\n res.push(['m', 1, Math.tan(rad(parseFloat(paramList[0]))), 0, 1, 0, 0] as any[])\n } else {\n res.push([name.charAt(0), ...paramList.map(Number)] as any[])\n }\n\n return all\n })\n\n return res\n}\n\nexport const transform2matrix = (tstr: string): Matrix => {\n const tdata = parseTransformString(tstr)\n const m = new Matrix()\n\n if (tdata) {\n for (let i = 0, ii = tdata.length; i < ii; i++) {\n const t = tdata[i]\n\n switch (t[0].toLowerCase()) {\n case 't':\n m.translate(t[1], t[2] || 0)\n break\n case 'r':\n m.rotate(t[1], t[2] || 0, t[3] || 0)\n break\n case 's':\n m.scale(t[1] || 1, t[2] || t[1] || 1, t[3] || 0, t[4] || 0)\n break\n case 'm':\n m.add(t[1] || 1, t[2] || 0, t[3] || 0, t[4] || 1, t[5] || 0, t[6] || 0)\n break\n }\n }\n }\n\n return m\n}\n","// noinspection JSUnusedGlobalSymbols,JSSuspiciousNameCombination\n\nimport { rad } from './transform'\n\ntype MatrixLike = { a: number; b: number; c: number; d: number; e: number; f: number }\n\nconst defaultMatrix: MatrixLike = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n\n/**\n * Represents a 2D transformation matrix (a, b, c, d, e, f) as used in SVG.\n */\nexport class Matrix {\n a!: number\n b!: number\n c!: number\n d!: number\n e!: number\n f!: number\n\n /**\n * Creates a new matrix.\n * If no arguments are given, creates an identity matrix.\n * If an object with a,b,c,d,e,f properties is provided (e.g., SVGMatrix), copies its values.\n */\n constructor(a?: number | MatrixLike, b?: number, c?: number, d?: number, e?: number, f?: number) {\n if (a instanceof SVGMatrix) {\n Object.assign(this, a)\n return\n }\n\n if (a != null) {\n Object.assign(this, { a: +a, b: +b!, c: +c!, d: +d!, e: +e!, f: +f! })\n } else {\n Object.assign(this, defaultMatrix)\n }\n }\n\n /**\n * Multiplies current matrix by another matrix.\n */\n add(a: number | Matrix, b?: number, c?: number, d?: number, e?: number, f?: number): this {\n if (a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f)\n }\n\n const aNew = (a as number) * this.a + (b as number) * this.c\n const bNew = (a as number) * this.b + (b as number) * this.d\n\n this.e += (e as number) * this.a + (f as number) * this.c\n this.f += (e as number) * this.b + (f as number) * this.d\n this.c = (c as number) * this.a + (d as number) * this.c\n this.d = (c as number) * this.b + (d as number) * this.d\n\n this.a = aNew\n this.b = bNew\n\n return this\n }\n\n /**\n * Returns inverse matrix.\n */\n invert(): Matrix {\n const det = this.a * this.d - this.b * this.c\n return new Matrix(\n this.d / det,\n -this.b / det,\n -this.c / det,\n this.a / det,\n (this.c * this.f - this.d * this.e) / det,\n (this.b * this.e - this.a * this.f) / det\n )\n }\n\n /**\n * Returns a copy of the matrix.\n */\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f)\n }\n\n /**\n * Translates the matrix by x and y.\n */\n translate(x: number, y = 0): this {\n return this.add(1, 0, 0, 1, x, y)\n }\n\n /**\n * Scales the matrix by x and y, optionally about point (cx, cy).\n */\n scale(x: number, y: number = x, cx?: number, cy?: number): this {\n if (cx != null || cy != null) {\n this.translate(cx!, cy!)\n }\n\n this.a *= x\n this.b *= x\n this.c *= y\n this.d *= y\n\n if (cx != null || cy != null) {\n this.translate(-cx!, -cy!)\n }\n\n return this\n }\n\n /**\n * Rotates the matrix by angle (degrees) about point (x, y).\n */\n rotate(angle: number, x = 0, y = 0): this {\n angle = rad(angle)\n\n const cos = +Math.cos(angle).toFixed(9)\n const sin = +Math.sin(angle).toFixed(9)\n\n this.add(cos, sin, -sin, cos, x, y)\n\n return this.add(1, 0, 0, 1, -x, -y)\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting x.\n */\n x(x: number, y: number): number {\n return x * this.a + y * this.c + this.e\n }\n\n /**\n * Applies matrix to point (x, y) and returns resulting y.\n */\n y(x: number, y: number): number {\n return x * this.b + y * this.d + this.f\n }\n\n /**\n * Returns matrix as an SVG matrix string.\n */\n toString(): string {\n return `matrix(${this.a},${this.b},${this.c},${this.d},${this.e},${this.f})`\n }\n}\n","export const mina = {\n linear: (n: number): number => n,\n\n easeinout: (n: number): number => {\n if (n === 1) return 1;\n if (n === 0) return 0;\n const q = 0.48 - n / 1.04;\n const Q = Math.sqrt(0.1734 + q * q);\n const x = Q - q;\n const X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1);\n const y = -Q - q;\n const Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1);\n const t = X + Y + 0.5;\n return (1 - t) * 3 * t * t + t * t * t;\n },\n\n elastic: (n: number): number => {\n if (n === 0 || n === 1) return n;\n return Math.pow(2, -10 * n) * Math.sin((n - 0.075) * (2 * Math.PI) / 0.3) + 1;\n }\n};\n","import { mina } from './easing'\n\nexport interface AnimationHandle {\n stop(): void;\n}\n\nexport function animate(\n from: number | number[],\n to: number | number[],\n setter: (val: any) => void,\n duration: number,\n easing: (n: number) => number = mina.linear,\n callback?: () => void\n): AnimationHandle {\n const start = performance.now()\n let cancelled = false\n let frame = 0\n\n const step = (now: number) => {\n if (cancelled) return\n\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easing(progress)\n\n if (Array.isArray(from) && Array.isArray(to)) {\n const val = from.map((f, i) => f + (to[i] - f) * eased)\n setter(val)\n } else {\n const val = (from as number) + ((to as number) - (from as number)) * eased\n setter(val)\n }\n\n if (progress < 1) {\n frame = requestAnimationFrame(step)\n } else {\n callback?.()\n }\n }\n\n frame = requestAnimationFrame(step)\n\n return {\n stop: () => {\n cancelled = true\n cancelAnimationFrame(frame)\n }\n }\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { transform2matrix } from './transform'\nimport { Matrix } from './matrix'\n\nlet idCounter = 0\nconst elementCache = new WeakMap<SVGElement, Element>()\n\nfunction getElement(node: SVGElement, paper?: Paper): Element {\n if (elementCache.has(node)) {\n const el = elementCache.get(node)!\n\n if (paper && !el.paper) {\n el.paper = paper\n }\n\n return el\n }\n\n const el = new Element(node, paper)\n elementCache.set(node, el)\n\n return el\n}\n\nexport class Element {\n node: SVGElement\n paper?: Paper\n _id: string\n\n constructor(node: SVGElement, paper?: Paper) {\n this.node = node\n this.paper = paper\n this._id = 'e' + (idCounter++).toString(36)\n }\n\n get type(): string {\n return this.node.tagName\n }\n\n get id(): string {\n return this.node.id || this._id\n }\n\n parent(): Element | null {\n return this.node.parentNode ? getElement(this.node.parentNode as SVGElement, this.paper) : null\n }\n\n children(): Element[] {\n return Array.from(this.node.children).map(child => {\n return getElement(child as SVGElement, this.paper)\n })\n }\n\n clear(): this {\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild)\n }\n\n return this\n }\n\n attr(): any;\n attr(name: string): string | null\n attr(name: string, value: any): this\n attr(attrs: Record<string, any>): this\n attr(nameOrAttrs?: string | Record<string, any>, value?: any): any {\n if (typeof nameOrAttrs === 'string') {\n if (value === undefined) {\n return this.node.getAttribute(nameOrAttrs)\n }\n\n this._setAttr(nameOrAttrs, value)\n\n return this\n }\n if (typeof nameOrAttrs === 'object') {\n for (const key in nameOrAttrs) {\n this._setAttr(key, nameOrAttrs[key])\n }\n\n return this\n }\n\n return this\n }\n\n private _setAttr(name: string, value: any) {\n if (name === 'textpath') {\n this._setTextPath(value)\n } else if (name === 'text') {\n this._setText(value)\n } else {\n this.node.setAttribute(name, String(value))\n }\n }\n\n private _setText(content: string) {\n const textPath = this.node.querySelector('textPath')\n\n if (textPath) {\n textPath.textContent = content\n } else {\n this.node.textContent = content\n }\n }\n\n private _setTextPath(pathDescriptor: string) {\n if (this.node.tagName !== 'text') return\n\n const textEl = this.node as SVGTextElement\n\n let textPath = textEl.querySelector('textPath')\n let existingText = ''\n\n if (!textPath) {\n for (let i = 0; i < textEl.childNodes.length; i++) {\n const node = textEl.childNodes[i]\n if (node.nodeType === 3) existingText += node.textContent\n }\n\n while (textEl.firstChild) {\n textEl.removeChild(textEl.firstChild)\n }\n\n textPath = document.createElementNS('http://www.w3.org/2000/svg', 'textPath')\n textEl.appendChild(textPath)\n textEl.removeAttribute('x')\n textEl.removeAttribute('y')\n } else {\n existingText = textPath.textContent || ''\n }\n\n let href: string\n if (pathDescriptor.startsWith('#')) {\n href = pathDescriptor\n } else {\n if (!this.paper) {\n throw new Error('No paper reference for creating defs');\n }\n\n const defs = this.paper.defs\n const pathId = 'p' + Date.now() + Math.random().toString(36).slice(2)\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n path.setAttribute('d', pathDescriptor)\n path.id = pathId\n defs.node.appendChild(path)\n href = '#' + pathId\n }\n\n textPath.setAttributeNS('http://www.w3.org/1999/xlink', 'href', href)\n if (existingText) {\n textPath.textContent = existingText\n }\n }\n\n addClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.add(cls)\n }\n\n return this\n }\n\n removeClass(className: string): this {\n const classes = className.trim().split(/\\s+/)\n\n for (const cls of classes) {\n if (cls) this.node.classList.remove(cls)\n }\n\n return this\n }\n\n transform(t?: string | Matrix): this {\n if (t === undefined) return this\n if (t instanceof Matrix) {\n this.node.setAttribute('transform', t.toString())\n } else {\n const m = transform2matrix(t);\n this.node.setAttribute('transform', m.toString())\n }\n\n return this\n }\n\n getBBox(): { x: number; y: number; width: number; height: number; cx: number; cy: number; x2: number; y2: number } {\n if (this.node.isConnected) {\n const rect = (this.node as SVGGraphicsElement).getBBox()\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n const svgNS = 'http://www.w3.org/2000/svg'\n const tempSvg = document.createElementNS(svgNS, 'svg')\n\n tempSvg.style.position = 'absolute'\n tempSvg.style.visibility = 'hidden'\n tempSvg.style.pointerEvents = 'none'\n\n document.body.appendChild(tempSvg)\n\n tempSvg.appendChild(this.node)\n const rect = (this.node as SVGGraphicsElement).getBBox()\n tempSvg.removeChild(this.node)\n\n document.body.removeChild(tempSvg)\n\n return {\n x: rect.x, y: rect.y, width: rect.width, height: rect.height,\n cx: rect.x + rect.width / 2, cy: rect.y + rect.height / 2,\n x2: rect.x + rect.width, y2: rect.y + rect.height\n }\n }\n\n select(selector: string): Element | null {\n const found = this.node.querySelector(selector)\n return found ? getElement(found as SVGElement, this.paper) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.node.querySelectorAll(selector)\n\n return Array.from(nodes).map(node => {\n return getElement(node as SVGElement, this.paper)\n })\n }\n\n clone(): Element {\n return getElement(this.node.cloneNode(true) as SVGElement, this.paper)\n }\n\n add(child: Element): this {\n this.node.appendChild(child.node)\n return this\n }\n\n hover(fIn: (e: MouseEvent) => void, fOut: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseover', fIn)\n this.node.addEventListener('mouseout', fOut)\n return this\n }\n\n mouseup(fn: (e: MouseEvent) => void): this {\n this.node.addEventListener('mouseup', fn)\n return this\n }\n}\n\nexport class Paper extends Element {\n defs: Element\n\n constructor(node: SVGSVGElement) {\n super(node, null as any)\n this.paper = this\n\n elementCache.set(node, this)\n\n let defsNode = node.querySelector('defs')\n if (!defsNode) {\n defsNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n node.appendChild(defsNode)\n }\n\n this.defs = getElement(defsNode as SVGElement, this)\n }\n\n g(...args: any[]): Paper {\n const group = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n this.node.appendChild(group)\n const groupEl = getElement(group, this)\n\n if (args.length === 1 && args[0] && !args[0].node) {\n groupEl.attr(args[0])\n } else if (args.length) {\n args.forEach(arg => {\n if (arg instanceof Element) groupEl.add(arg)\n })\n }\n\n return groupEl as unknown as Paper\n }\n\n path(d?: string | object): Element {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n this.node.appendChild(path)\n\n const pathEl = getElement(path, this)\n if (d) {\n if (typeof d === 'string') {\n pathEl.attr('d', d)\n }\n\n else pathEl.attr(d)\n }\n\n return pathEl\n }\n\n circle(cx: any, cy?: number, r?: number): Element {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n this.node.appendChild(circle)\n\n const circleEl = getElement(circle, this)\n if (typeof cx === 'object') {\n circleEl.attr(cx)\n } else if (cx != null) {\n circleEl.attr({ cx, cy: cy ?? cx, r: r ?? 0 })\n }\n\n return circleEl\n }\n\n text(x: any, y?: number, text?: string): Element {\n const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n this.node.appendChild(textEl)\n\n const textElWrap = getElement(textEl, this)\n if (typeof x === 'object') {\n textElWrap.attr(x)\n } else if (x != null) {\n textElWrap.attr({ x, y: y ?? x, text: text ?? '' })\n }\n\n return textElWrap\n }\n}\n\nexport class Fragment {\n private frag: DocumentFragment\n\n constructor(frag: DocumentFragment) {\n this.frag = frag\n }\n\n select(selector: string): Element | null {\n const found = this.frag.querySelector(selector)\n return found ? getElement(found as SVGElement) : null\n }\n\n selectAll(selector: string): Element[] {\n const nodes = this.frag.querySelectorAll(selector)\n return Array.from(nodes).map(node => getElement(node as SVGElement))\n }\n}\n\nexport function Svg(el: SVGSVGElement): Paper\nexport function Svg(query: string): Paper | null\nexport function Svg(arg: any): any {\n if (typeof arg === 'string') {\n const el = document.querySelector(arg)\n return el ? new Paper(el as SVGSVGElement) : null\n }\n if (arg instanceof SVGSVGElement) {\n return new Paper(arg)\n }\n\n return null\n}\n","import { Fragment } from './svg';\n\nexport function parse(svgString: string): Fragment {\n const div = document.createElement('div');\n let svg = svgString.trim();\n if (!svg.match(/^\\s*<\\s*svg/i)) {\n svg = '<svg>' + svg + '</svg>';\n }\n div.innerHTML = svg;\n const svgElem = div.querySelector('svg');\n const frag = document.createDocumentFragment();\n if (svgElem) {\n while (svgElem.firstChild) {\n frag.appendChild(svgElem.firstChild);\n }\n }\n return new Fragment(frag);\n}\n","import type { ICentralButton, IConfig, ISector } from './config'\n\nimport { getHintFontMetrics, measureTextLengthOnLine } from '@/utils'\nimport { animate, Matrix, mina, parse, Svg } from '@/core'\n\ninterface HintData {\n baseRadius: number;\n textLength: number;\n sectorMidAngle: number;\n}\n\nconst clamp = (v: number, l: number, h: number) => (v > h ? h : v < l ? l : v)\n\nconst hintDataMap = new WeakMap<Svg.Element, HintData>()\nconst iconInitialData = new WeakMap<Svg.Element, {\n midRadius: number;\n scale: number;\n rotation: number;\n bbox: Svg.BBox;\n}>()\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number): { x: number, y: number }\n{\n angle = ((angle - 90) * Math.PI) / 180\n\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n }\n}\n\nfunction describeArc(x: number, y: number, r: number, startAngle: number, endAngle: number, lineMove: boolean, alter: boolean): string\n{\n const start = polarToCartesian(x, y, r, (startAngle %= 360))\n const end = polarToCartesian(x, y, r, (endAngle %= 360))\n\n return `${lineMove ? 'L' : 'M'}${start.x} ${start.y} A${r} ${r}, 0, ${endAngle - startAngle >= 180 ? 1 : 0}, ${alter ? 0 : 1}, ${end.x} ${end.y}`\n}\n\nfunction describeSector(x: number, y: number, r: number, r2: number, startAngle: number, endAngle: number): string\n{\n return `${describeArc(x, y, r, startAngle, endAngle, false, false)} ${describeArc(x, y, r2, endAngle, startAngle, true, true)}Z`\n}\n\nexport class Builder\n{\n public config: IConfig\n public element: HTMLElement\n\n private readonly events: { [key: string]: Function[] } = {}\n\n private readonly container: Svg.Paper\n private readonly snap: Svg.Paper\n\n private readonly angle: number\n private readonly size: number = 500\n private readonly c = this.size / 2\n\n private duration = 300\n\n private area: Svg.Paper\n private icons: Svg.Fragment | null = null\n private theme = 'light'\n\n constructor(config: IConfig)\n {\n this.config = config\n this.size = 2 * config.outerRadius\n this.c = this.size / 2\n this.angle = 360 / (this.config.sectors.length || 6)\n\n this.element = this.createMenuElement()\n this.snap = Svg(this.element.querySelector('svg')!)\n this.area = this.snap\n this.container = this.area.g().transform('s0')\n\n this.init().catch(console.error)\n }\n\n private createMenuElement(): HTMLElement\n {\n const div = document.createElement('div')\n div.className = 'context hidden'\n div.style.position = 'fixed'\n div.style.top = '0'\n div.style.left = '0'\n div.style.width = '100vw'\n div.style.height = '100vh'\n div.style.overflow = 'visible'\n div.style.pointerEvents = 'auto'\n\n if (this.config.zIndex && !isNaN(this.config.zIndex)) {\n div.style.zIndex = `${this.config.zIndex}`\n }\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', this.size.toString())\n svg.setAttribute('height', this.size.toString())\n svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`)\n svg.style.position = 'absolute'\n svg.style.display = 'block'\n svg.style.overflow = 'visible'\n svg.style.pointerEvents = 'auto'\n svg.classList.add('radial-menu-svg')\n\n svg.addEventListener('wheel', (e) => {\n e.preventDefault()\n this.transformOpacity(e)\n })\n\n svg.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n svg.addEventListener('click', (e) => {\n e.stopPropagation()\n this.hide()\n })\n\n div.addEventListener('contextmenu', (e) => {\n e.stopPropagation()\n e.preventDefault()\n this.hide()\n })\n\n div.addEventListener('click', (e) => {\n if (e.target === div) {\n this.hide()\n }\n })\n\n div.appendChild(svg)\n\n return div\n }\n\n private async init(): Promise<void>\n {\n await this.loadIcons()\n this.updateButtons()\n }\n\n private async loadIcons(): Promise<void>\n {\n if (this.icons) return\n\n try {\n const response = await fetch(this.config.sprite)\n if (response.ok) {\n this.icons = parse(await response.text())\n }\n } catch (e) {\n console.error('Failed to load icons:', e)\n }\n }\n\n public updateButtons(): void\n {\n if (!this.icons || !this.container) return\n\n this.container.clear()\n this.config.sectors.forEach(btn => {\n const icon = this.createIcon(btn)\n\n if (icon) {\n const buttonGroup = this.createButton(btn, this.createSector(), icon, this.createHint(btn))\n this.container.add(buttonGroup)\n }\n })\n\n if (this.config.centralButton) {\n const centralBtn = this.createCentralButton(this.config.centralButton)\n if (centralBtn) {\n this.container.add(centralBtn)\n }\n }\n }\n\n private createSector(): Svg.Element\n {\n const color = this.config.color ?? '#1976D2'\n\n return this.area.path(describeSector(this.c, this.c, this.config.outerRadius, this.config.innerRadius, 0, this.angle))\n .attr({ fill: color, stroke: color, opacity: this.config.opacity })\n .addClass('radial-sector')\n }\n\n private createButton(btn: ISector, sector: Svg.Element, icon: Svg.Element, hint: Svg.Element): Svg.Paper\n {\n const buttonGroup = this.area.g(sector, icon, hint)\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.radial-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateButtonHover(buttonGroup, 0, 1, 200, mina.easeinout)\n },\n () => {\n buttonGroup.select('.radial-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateButtonHover(buttonGroup, 1, 0, 2000, mina.elastic)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n this.emit('click', { icon: btn.icon, hint: btn.hint })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createIcon(btn: ISector): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultRadius = (this.config.innerRadius + this.config.outerRadius) / 2\n const sectorHeight = this.config.outerRadius - this.config.innerRadius\n const defaultScale = (sectorHeight * 0.5) / bbox.height\n\n const midRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const targetAngle = this.angle / 2\n const rotation = targetAngle + (btn.rotate || 0)\n\n iconInitialData.set(icon, { midRadius, scale, rotation, bbox })\n\n const pos = polarToCartesian(this.c, this.c, midRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(scale)\n t.rotate(rotation, 0, 0)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t)\n\n return icon.addClass('radial-icon')\n }\n\n private createHint(btn: ISector): Svg.Element\n {\n const group = this.area.g()\n group.addClass('hint-group')\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint || btn.icon\n\n const textLength = measureTextLengthOnLine(text)\n const gap = 2\n\n let baseRadius: number\n let bgHeight = 0\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseRadius = this.config.outerRadius + bgHeight / 2 + gap\n } else {\n const textOffset = metrics.height * 0.75\n baseRadius = this.config.outerRadius + textOffset\n }\n\n const textAngleRad = textLength / baseRadius\n const textAngleDeg = textAngleRad * 180 / Math.PI\n const sectorMidAngle = this.angle / 2\n const startAngle = sectorMidAngle - textAngleDeg / 2\n const endAngle = sectorMidAngle + textAngleDeg / 2\n\n const arcPath = describeArc(this.c, this.c, baseRadius, startAngle, endAngle, false, false)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint').attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n group.add(hint)\n\n hintDataMap.set(group, {\n sectorMidAngle,\n baseRadius,\n textLength\n })\n\n return group\n }\n\n private createCentralButton(btn: ICentralButton): Svg.Element | null\n {\n const defaultRadius = this.config.innerRadius * 0.6\n const buttonRadius = btn.iconRadius ?? this.config.iconRadius ?? defaultRadius\n const color = this.config.color ?? '#1976D2'\n\n const circle = this.area.circle({\n cx: this.c, cy: this.c, r: buttonRadius,\n fill: color, stroke: color,\n opacity: this.config.opacity\n })\n .addClass('radial-sector central-sector')\n\n circle.node.dataset.initialRadius = `${buttonRadius}`\n\n let icon: Svg.Element | null = null\n let hint: Svg.Element | null = null\n\n if (btn.icon) {\n icon = this.createCentralIcon(btn, buttonRadius)\n }\n if (btn.hint) {\n hint = this.createCentralHint(btn, buttonRadius)\n }\n\n const elements = [circle, icon, hint].filter(el => el !== null) as Svg.Element[]\n const buttonGroup = this.area.g(...elements).addClass('central-button')\n\n buttonGroup.hover(\n () => {\n buttonGroup.select('.central-hint')?.addClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.addClass('active')\n bg.node.style.opacity = String(this.config.opacity)\n }\n this.animateCentralHover(buttonGroup, true)\n },\n () => {\n buttonGroup.select('.central-hint')?.removeClass('active')\n const bg = buttonGroup.select('.radial-hint-bg')\n if (bg) {\n bg.removeClass('active')\n bg.node.style.opacity = '0'\n }\n this.animateCentralHover(buttonGroup, false)\n }\n )\n\n buttonGroup.mouseup((e) => {\n if (e.button !== 0) return\n\n this.emit('click', { icon: btn.icon, hint: btn.hint || '' })\n btn.onclick?.()\n })\n\n return buttonGroup\n }\n\n private createCentralIcon(btn: ICentralButton, buttonRadius: number): Svg.Element | null\n {\n if (!this.icons) return null\n\n const iconTemplate = this.icons.select(`#${btn.icon}`)\n if (!iconTemplate) {\n console.error(`Icon #${btn.icon} not found in SVG`)\n return null\n }\n\n const icon = iconTemplate.clone()\n const bbox = icon.getBBox()\n\n const defaultScale = (buttonRadius * 0.8) / Math.max(bbox.width, bbox.height)\n const scale = btn.iconScale ?? this.config.iconScale ?? defaultScale\n const t = new Matrix()\n\n t.translate(this.c, this.c)\n t.scale(scale)\n t.translate(-bbox.cx, -bbox.cy)\n\n icon.transform(t).addClass('radial-icon central-icon')\n\n iconInitialData.set(icon, {\n midRadius: 0,\n rotation: 0,\n scale,\n bbox\n })\n\n return icon\n }\n\n private createCentralHint(btn: ICentralButton, buttonRadius: number): Svg.Element\n {\n const group = this.area.g()\n const hintPadding = btn.hintPadding ?? this.config.hintPadding\n const metrics = getHintFontMetrics()\n const text = btn.hint ?? ''\n // const textLength = measureTextLengthOnLine(text)\n\n let baseOffset: number\n let bgHeight = 0\n const gap = 2\n\n if (hintPadding !== undefined) {\n bgHeight = metrics.height + 2 * hintPadding\n baseOffset = btn.hintOffset ?? (bgHeight / 2 + gap)\n } else {\n if (btn.hintOffset != null) {\n baseOffset = btn.hintOffset\n } else {\n baseOffset = btn.hintDistance ?? 8\n }\n }\n\n const textRadius = buttonRadius + baseOffset\n\n let startAngle: number, endAngle: number, alter: boolean\n if (btn.hintStartAngle != null && btn.hintEndAngle != null) {\n startAngle = btn.hintStartAngle\n endAngle = btn.hintEndAngle\n alter = startAngle > endAngle\n } else {\n const span = btn.hintSpan ?? 120\n const half = span / 2\n const position = btn.hintPosition ?? 'top'\n\n if (position === 'bottom') {\n startAngle = 180 + half\n endAngle = 180 - half\n alter = true\n } else {\n startAngle = 360 - half\n endAngle = half\n alter = false\n }\n }\n\n const arcPath = describeArc(this.c, this.c, textRadius, startAngle, endAngle, false, alter)\n\n if (hintPadding !== undefined) {\n const bgColor = this.config.color ?? '#1976D2'\n const bg = this.area.path(arcPath).attr({\n 'stroke': bgColor,\n 'stroke-width': `${bgHeight}`,\n 'stroke-linecap': 'round',\n 'fill': 'none',\n 'vector-effect': 'non-scaling-stroke'\n })\n .addClass('radial-hint-bg')\n\n bg.node.style.opacity = '0'\n group.add(bg)\n }\n\n const hint = this.area.text(0, 0, text)\n .addClass('radial-hint central-hint')\n .attr({\n fill: this.theme === 'light' ? '#333333' : '#7a7a7a',\n textpath: arcPath\n })\n\n const textPathEl = hint.select('textPath')\n if (textPathEl) {\n textPathEl.attr('dominant-baseline', 'central')\n textPathEl.attr('startOffset', '50%')\n }\n\n const hintNode = hint.node\n hintNode.dataset.hintOffset = baseOffset.toString()\n hintNode.dataset.startAngle = startAngle.toString()\n hintNode.dataset.endAngle = endAngle.toString()\n hintNode.dataset.alter = alter ? 'true' : 'false'\n hintNode.dataset.centerX = this.c.toString()\n hintNode.dataset.centerY = this.c.toString()\n\n group.add(hint)\n\n return group\n }\n\n public show(e: MouseEvent): void\n {\n this.element.classList.remove('hidden')\n\n const svg = this.element.querySelector('svg') as SVGSVGElement\n\n svg.style.left = (e.clientX - this.c) + 'px'\n svg.style.top = (e.clientY - this.c) + 'px'\n\n this.animateContainer(0, 1, this.duration * 8, mina.elastic)\n this.animateButtons(0, 1, this.duration, this.duration * 8, mina.elastic)\n }\n\n public hide(): void\n {\n this.animateContainer(1, 0, this.duration, mina.easeinout, () => {\n this.element.classList.add('hidden')\n })\n\n this.animateButtons(1, 0, this.duration, this.duration, mina.easeinout)\n }\n\n private animate(obj: any, index: number, start: number, end: number, duration: number, easing: (n: number) => number, fn: (val: number) => void, cb?: () => void): void\n {\n obj.animation ||= []\n obj.animation[index]?.stop()\n obj.animation[index] = animate(start, end, fn, duration, easing, cb)\n }\n\n private animateContainer(start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n this.animate(this, 0, start, end, duration, easing, (val) => {\n this.container.transform(`r${90 - 90 * val},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }, cb)\n }\n\n private animateButtons(start: number, end: number, min: number, max: number, easing: (n: number) => number): void\n {\n const r = (min: number, max: number) => Math.random() * (max - min) + min\n\n this.container.children().forEach((el: Svg.Element, i: number) => {\n const isCentral = el.node.classList.contains('central-button')\n\n this.animate(el, 0, start, end, r(min, max), easing, (val) => {\n if (isCentral) {\n el.transform(`s${val},${val},${this.c},${this.c}`)\n } else {\n el.transform(`r${this.angle * i},${this.c},${this.c}s${val},${val},${this.c},${this.c}`)\n }\n })\n })\n }\n\n private animateButtonHover(buttonGroup: Svg.Paper, start: number, end: number, duration: number, easing: (n: number) => number, cb?: () => void): void\n {\n const icon = buttonGroup.select('.radial-icon')\n const initialIcon = icon ? iconInitialData.get(icon) : undefined\n const hintGroup = buttonGroup.select('.hint-group')\n const hintData = hintGroup ? hintDataMap.get(hintGroup) : undefined\n\n this.animate(buttonGroup, 1, start, end, duration, easing, (val) => {\n const outward = val * 10\n\n buttonGroup.select('.radial-sector')?.attr({\n d: describeSector(this.c, this.c, this.config.outerRadius - outward, this.config.innerRadius, 0, this.angle)\n })\n\n if (icon && initialIcon) {\n const newRadius = initialIcon.midRadius - outward\n const newScale = initialIcon.scale * (1 - (val * 0.1))\n const targetAngle = this.angle / 2\n const pos = polarToCartesian(this.c, this.c, newRadius, targetAngle)\n const t = new Matrix()\n\n t.translate(pos.x, pos.y)\n t.scale(newScale)\n t.rotate(initialIcon.rotation, 0, 0)\n t.translate(-initialIcon.bbox.cx, -initialIcon.bbox.cy)\n\n icon.transform(t)\n }\n\n if (hintData && hintGroup) {\n const newRadius = hintData.baseRadius - outward\n const newAngleDeg = (hintData.textLength / newRadius) * 180 / Math.PI\n const newStart = hintData.sectorMidAngle - newAngleDeg / 2\n const newEnd = hintData.sectorMidAngle + newAngleDeg / 2\n const newPath = describeArc(this.c, this.c, newRadius, newStart, newEnd, false, false)\n\n const hint = hintGroup.select('.radial-hint')\n if (hint) {\n hint.attr('textpath', newPath)\n }\n\n const bg = hintGroup.select('.radial-hint-bg')\n if (bg) {\n bg.attr('d', newPath)\n }\n }\n }, cb)\n }\n\n private animateCentralHover(group: Svg.Element, active: boolean): void\n {\n const circle = group.select('.central-sector') as Svg.Element\n const icon = group.select('.central-icon') as Svg.Element\n const hint = group.select('.central-hint') as Svg.Element\n const bg = group.select('.radial-hint-bg') as Svg.Element\n\n if (!circle || !icon) return\n\n const initialRadius = parseFloat(circle.node.dataset.initialRadius || '30')\n const currentRadius = parseFloat(circle.attr('r') as string)\n const targetRadius = active ? initialRadius - 8 : initialRadius\n\n const initialIconData = icon ? iconInitialData.get(icon) : undefined\n\n let hintOffset = 12, startAngle = 0, endAngle = 0, centerX = this.c, centerY = this.c, alter = false\n if (hint) {\n hintOffset = parseFloat(hint.node.dataset.hintOffset || '12')\n startAngle = parseFloat(hint.node.dataset.startAngle || '0')\n endAngle = parseFloat(hint.node.dataset.endAngle || '0')\n centerX = parseFloat(hint.node.dataset.centerX || this.c.toString())\n centerY = parseFloat(hint.node.dataset.centerY || this.c.toString())\n alter = hint.node.dataset.alter === 'true'\n }\n\n animate(currentRadius, targetRadius, (val) => {\n circle.attr('r', val)\n\n if (icon && initialIconData) {\n const newScale = initialIconData.scale * (val / initialRadius)\n const t = new Matrix()\n t.translate(this.c, this.c)\n t.scale(newScale)\n t.translate(-initialIconData.bbox.cx, -initialIconData.bbox.cy)\n icon.transform(t)\n }\n\n if (hint) {\n const newRadius = val + hintOffset\n const newArc = describeArc(centerX, centerY, newRadius, startAngle, endAngle, false, alter)\n hint.attr({ textpath: newArc })\n if (bg) {\n bg.attr({ d: newArc })\n }\n }\n }, 200, mina.easeinout)\n }\n\n private transformOpacity(e: WheelEvent): void\n {\n const dy = e.deltaY > 0 ? 0.03 : -0.03\n this.config.opacity = clamp(this.config.opacity + dy, 0.4, 1)\n\n this.area.selectAll('.radial-sector').forEach((el: Svg.Element) => {\n el.attr({ opacity: this.config.opacity })\n })\n\n this.area.selectAll('.radial-hint-bg.active').forEach((el: Svg.Element) => {\n el.node.style.opacity = String(this.config.opacity)\n })\n }\n\n public on(event: string, callback: Function): void\n {\n (this.events[event] ??= []).push(callback)\n }\n\n private emit(event: string, data: any): void\n {\n if (this.events[event]) {\n this.events[event].forEach(callback => callback(data))\n }\n }\n}\n","import { isPromiseLike } from '@/utils'\nimport { Builder } from './builder'\nimport { IConfig } from './config'\n\nexport class Manager\n{\n public menu: Builder\n\n public shown: boolean = false\n\n constructor(container: HTMLElement | PromiseLike<HTMLElement>, config: IConfig)\n {\n this.menu = new Builder(config)\n\n isPromiseLike(container)\n ? container.then((c) => c.appendChild(this.menu.element))\n : container.appendChild(this.menu.element)\n\n if (config.autoBindContextMenu !== false) {\n this.bindEvents()\n }\n }\n\n public bindEvents(el: HTMLElement | Window = window)\n {\n el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.toggle(e as PointerEvent)\n })\n }\n\n public on(event: string, callback: Function)\n {\n this.menu.on(event, callback)\n }\n\n public toggle(event: PointerEvent)\n {\n this.shown ? this.menu.hide() : this.menu.show(event)\n }\n\n public show(event: PointerEvent)\n {\n this.shown = true\n\n this.menu.show(event)\n }\n\n public hide()\n {\n this.shown = false\n\n this.menu.hide()\n }\n}\n"],"names":["defaultConfig","defineConfig","options","cache","getFontMetrics","font","ctx","fallback","metrics","ascent","descent","height","result","hintFontMetrics","getHintFontMetrics","div","styles","measureTextLengthOnLine","text","svgNS","tempSvg","tempText","length","isPromiseLike","value","rad","deg","p2s","pathToString","parseTransformString","TString","data","arr","_a","b","c","params","_","transform2matrix","tstr","tdata","m","Matrix","i","ii","t","defaultMatrix","a","d","e","f","aNew","bNew","det","x","y","cx","cy","angle","cos","sin","mina","n","q","Q","X","Y","animate","from","to","setter","duration","easing","callback","start","cancelled","frame","step","now","elapsed","progress","eased","val","idCounter","elementCache","getElement","node","paper","el","Element","child","nameOrAttrs","key","name","content","textPath","pathDescriptor","textEl","existingText","href","defs","pathId","path","className","classes","cls","rect","selector","found","nodes","fIn","fOut","fn","Paper","defsNode","args","group","groupEl","arg","pathEl","r","circle","circleEl","textElWrap","Fragment","frag","Svg","parse","svgString","svg","svgElem","clamp","v","l","h","hintDataMap","iconInitialData","polarToCartesian","describeArc","startAngle","endAngle","lineMove","alter","end","describeSector","r2","Builder","config","response","btn","icon","buttonGroup","centralBtn","color","sector","hint","bg","iconTemplate","bbox","defaultRadius","defaultScale","midRadius","scale","targetAngle","rotation","pos","hintPadding","textLength","gap","baseRadius","bgHeight","textOffset","textAngleDeg","sectorMidAngle","arcPath","bgColor","textPathEl","buttonRadius","elements","baseOffset","textRadius","half","hintNode","obj","index","cb","min","max","isCentral","initialIcon","hintGroup","hintData","outward","newRadius","newScale","newAngleDeg","newStart","newEnd","newPath","active","initialRadius","currentRadius","targetRadius","initialIconData","hintOffset","centerX","centerY","newArc","dy","event","Manager","container"],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export { defineConfig, type ISector, type IConfig, type ICentralButton } from './menu/config';
1
+ export type { ISector, ICentralButton, IConfig } from './menu/config';
2
+ export { defineConfig } from './menu/config';
2
3
  export { Manager } from './menu/manager';
@@ -1,17 +1,3 @@
1
- export interface IConfig {
2
- sectors: ISector[];
3
- sprite: string;
4
- innerRadius: number;
5
- outerRadius: number;
6
- opacity: number;
7
- iconScale?: number;
8
- iconRadius?: number;
9
- color?: string;
10
- hintPadding?: number;
11
- centralButton?: ICentralButton;
12
- autoBindContextMenu?: boolean;
13
- zIndex?: number;
14
- }
15
1
  export interface ICentralButton {
16
2
  icon: string;
17
3
  hint?: string;
@@ -37,4 +23,18 @@ export interface ISector {
37
23
  hintPadding?: number;
38
24
  hintVerticalOffset?: number;
39
25
  }
26
+ export interface IConfig {
27
+ sectors: ISector[];
28
+ sprite: string;
29
+ innerRadius: number;
30
+ outerRadius: number;
31
+ opacity: number;
32
+ iconScale?: number;
33
+ iconRadius?: number;
34
+ color?: string;
35
+ hintPadding?: number;
36
+ centralButton?: ICentralButton;
37
+ autoBindContextMenu?: boolean;
38
+ zIndex?: number;
39
+ }
40
40
  export declare function defineConfig(options: Partial<IConfig>): IConfig;
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.8",
4
+ "version": "2.1.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Aleksey Tarasenko <alekstar79@yandex.ru>",