@dpuse/dpuse-tool-highcharts-visualiser 0.0.80 → 0.0.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AnimationUtilities-Bby2idBR.js → AnimationUtilities-CJw-tdb_.js} +74 -83
- package/dist/AnimationUtilities-CJw-tdb_.js.map +1 -0
- package/dist/BorderRadius-CqHYi9va.js +135 -0
- package/dist/BorderRadius-CqHYi9va.js.map +1 -0
- package/dist/CenteredUtilities-BTUT7_Ld.js +1316 -0
- package/dist/CenteredUtilities-BTUT7_Ld.js.map +1 -0
- package/dist/{SVGElement-BmvC_qu3.js → SVGElement-uTuGcjav.js} +101 -103
- package/dist/SVGElement-uTuGcjav.js.map +1 -0
- package/dist/SeriesRegistry-CXsAINSj.js +376 -0
- package/dist/SeriesRegistry-CXsAINSj.js.map +1 -0
- package/dist/{TextPath-DK4Jkzd7.js → TextPath-Coabnrz0.js} +32 -34
- package/dist/{TextPath-DK4Jkzd7.js.map → TextPath-Coabnrz0.js.map} +1 -1
- package/dist/{dependency-wheel.src-BHmwx9rW.js → dependency-wheel.src-ByNiAiZS.js} +26 -27
- package/dist/dependency-wheel.src-ByNiAiZS.js.map +1 -0
- package/dist/dpuse-tool-highcharts-visualiser.es.js +2437 -2415
- package/dist/dpuse-tool-highcharts-visualiser.es.js.map +1 -1
- package/dist/highchartsMoreCustom-Cm6MkFMu.js +1178 -0
- package/dist/highchartsMoreCustom-Cm6MkFMu.js.map +1 -0
- package/dist/{pattern-fill.src-BPmr3DQg.js → pattern-fill.src-CGZp553r.js} +30 -32
- package/dist/{pattern-fill.src-BPmr3DQg.js.map → pattern-fill.src-CGZp553r.js.map} +1 -1
- package/dist/{sankey.src-DocCurOx.js → sankey.src-Buj1zAlU.js} +115 -117
- package/dist/sankey.src-Buj1zAlU.js.map +1 -0
- package/dist/{streamgraph.src-Bn6PY8Fd.js → streamgraph.src-DjMW1U2g.js} +4 -6
- package/dist/{streamgraph.src-Bn6PY8Fd.js.map → streamgraph.src-DjMW1U2g.js.map} +1 -1
- package/package.json +12 -12
- package/dist/AnimationUtilities-Bby2idBR.js.map +0 -1
- package/dist/BorderRadius-2zMZW_aK.js +0 -1445
- package/dist/BorderRadius-2zMZW_aK.js.map +0 -1
- package/dist/SVGElement-BmvC_qu3.js.map +0 -1
- package/dist/SeriesRegistry-0cj0ZJqn.js +0 -374
- package/dist/SeriesRegistry-0cj0ZJqn.js.map +0 -1
- package/dist/dependency-wheel.src-BHmwx9rW.js.map +0 -1
- package/dist/highchartsMoreCustom-CcpfmVny.js +0 -1110
- package/dist/highchartsMoreCustom-CcpfmVny.js.map +0 -1
- package/dist/sankey.src-DocCurOx.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SVGElement-BmvC_qu3.js","names":["A","H"],"sources":["../node_modules/highcharts/es-modules/Core/Renderer/SVG/SVGElement.js"],"sourcesContent":["/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport A from '../../Animation/AnimationUtilities.js';\nconst { animate, animObject, stop } = A;\nimport Color from '../../Color/Color.js';\nimport H from '../../Globals.js';\nconst { deg2rad, doc, svg, SVG_NS, win, isFirefox } = H;\nimport { addEvent, attr, createElement, crisp, css, defined, erase, extend, fireEvent, getAlignFactor, isArray, isFunction, isNumber, isObject, isString, merge, objectEach, pInt, pick, pushUnique, replaceNested, syncTimeout } from '../../../Shared/Utilities.js';\nimport { uniqueKey } from '../../Utilities.js';\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n * rendering layer of Highcharts. Combined with the\n * {@link Highcharts.SVGRenderer}\n * object, these prototypes allow freeform annotation in the charts or even in\n * HTML pages without instantiating a chart. The SVGElement can also wrap HTML\n * labels, when `text` or `label` elements are created with the `useHTML`\n * parameter.\n *\n * The SVGElement instances are created through factory functions on the\n * {@link Highcharts.SVGRenderer}\n * object, like\n * {@link Highcharts.SVGRenderer#rect|rect},\n * {@link Highcharts.SVGRenderer#path|path},\n * {@link Highcharts.SVGRenderer#text|text},\n * {@link Highcharts.SVGRenderer#label|label},\n * {@link Highcharts.SVGRenderer#g|g}\n * and more.\n *\n * See [How to use the SVG Renderer](\n * https://www.highcharts.com/docs/advanced-chart-features/renderer) for a\n * comprehensive tutorial on how to draw SVG elements on a chart.\n *\n * @class\n * @name Highcharts.SVGElement\n */\nclass SVGElement {\n // @todo public zIndex?: number;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Get the current value of an attribute or pseudo attribute,\n * used mainly for animation. Called internally from\n * the {@link Highcharts.SVGRenderer#attr} function.\n *\n * @internal\n * @function Highcharts.SVGElement#_defaultGetter\n *\n * @param {string} key\n * Property key.\n *\n * @return {number|string}\n * Property value.\n */\n _defaultGetter(key) {\n let ret = pick(this[key + 'Value'], // Align getter\n this[key], this.element ? this.element.getAttribute(key) : null, 0);\n if (/^-?[\\d\\.]+$/.test(ret)) { // Is numerical\n ret = parseFloat(ret);\n }\n return ret;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#_defaultSetter\n * @param {string} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n _defaultSetter(value, key, element) {\n element.setAttribute(key, value);\n }\n /**\n * Add the element to the DOM. All elements must be added this way.\n *\n * @sample highcharts/members/renderer-g\n * Elements added to a group\n *\n * @function Highcharts.SVGElement#add\n *\n * @param {Highcharts.SVGElement} [parent]\n * The parent item to add it to. If undefined, the element is added to the\n * {@link Highcharts.SVGRenderer.box}.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n add(parent) {\n const renderer = this.renderer, element = this.element;\n let inserted;\n if (parent) {\n this.parentGroup = parent;\n }\n // Build formatted text\n if (typeof this.textStr !== 'undefined' &&\n this.element.nodeName === 'text' // Not for SVGLabel instances\n ) {\n renderer.buildText(this);\n }\n // Mark as added\n this.added = true;\n // If we're adding to renderer root, or other elements in the group\n // have a z index, we need to handle it\n if (!parent || parent.handleZ || this.zIndex) {\n inserted = this.zIndexSetter();\n }\n // If zIndex is not handled, append at the end\n if (!inserted) {\n (parent ?\n parent.element :\n renderer.box).appendChild(element);\n }\n // Fire an event for internal hooks\n if (this.onAdd) {\n this.onAdd();\n }\n return this;\n }\n /**\n * Add a class name to an element.\n *\n * @function Highcharts.SVGElement#addClass\n *\n * @param {string} className\n * The new class name to add.\n *\n * @param {boolean} [replace=false]\n * When true, the existing class name(s) will be overwritten with the new\n * one. When false, the new one is added.\n *\n * @return {Highcharts.SVGElement}\n * Return the SVG element for chainability.\n */\n addClass(className, replace) {\n const currentClassName = replace ? '' : (this.attr('class') || '');\n // Trim the string and remove duplicates\n className = (className || '')\n .split(/ /g)\n .reduce(function (newClassName, name) {\n if (currentClassName.indexOf(name) === -1) {\n newClassName.push(name);\n }\n return newClassName;\n }, (currentClassName ?\n [currentClassName] :\n []))\n .join(' ');\n if (className !== currentClassName) {\n this.attr('class', className);\n }\n return this;\n }\n /**\n * This method is executed in the end of `attr()`, after setting all\n * attributes in the hash. In can be used to efficiently consolidate\n * multiple attributes in one SVG property -- e.g., translate, rotate and\n * scale are merged in one \"transform\" attribute in the SVG node.\n *\n * @internal\n * @function Highcharts.SVGElement#afterSetters\n */\n afterSetters() {\n // Update transform. Do this outside the loop to prevent redundant\n // updating for batch setting of attributes.\n if (this.doTransform) {\n this.updateTransform();\n this.doTransform = false;\n }\n }\n /**\n * Align the element relative to the chart or another box.\n *\n * @function Highcharts.SVGElement#align\n *\n * @param {Highcharts.AlignObject} [alignOptions]\n * The alignment options. The function can be called without this parameter\n * in order to re-align an element after the box has been updated.\n *\n * @param {boolean} [alignByTranslate]\n * Align element by translation.\n *\n * @param {string|Highcharts.BBoxObject} [alignTo]\n * The box to align to, needs a width and height. When the box is a string,\n * it refers to an object in the Renderer. For example, when box is\n * `spacingBox`, it refers to `Renderer.spacingBox` which holds `width`,\n * `height`, `x` and `y` properties.\n *\n * @param {boolean} [redraw]\n * Decide if SVGElement should be redrawn with new alignment or just change\n * its attributes.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n align(alignOptions, alignByTranslate, alignTo, redraw = true) {\n const renderer = this.renderer, alignedObjects = renderer.alignedObjects, initialAlignment = Boolean(alignOptions);\n // First call on instantiate\n if (alignOptions) {\n this.alignOptions = alignOptions;\n this.alignByTranslate = alignByTranslate;\n this.alignTo = alignTo;\n // When called on resize, no arguments are supplied\n }\n else {\n alignOptions = this.alignOptions || {};\n alignByTranslate = this.alignByTranslate;\n alignTo = this.alignTo;\n }\n const alignToKey = !alignTo || isString(alignTo) ?\n alignTo || 'renderer' :\n void 0;\n // When aligned to a key, automatically re-align on redraws\n if (alignToKey) {\n // Prevent duplicates, like legendGroup after resize\n if (initialAlignment) {\n pushUnique(alignedObjects, this);\n }\n alignTo = void 0; // Do not use the box\n }\n const alignToBox = pick(alignTo, renderer[alignToKey], renderer), \n // Default: left align\n x = (alignToBox.x || 0) + (alignOptions.x || 0) +\n ((alignToBox.width || 0) - (alignOptions.width || 0)) *\n getAlignFactor(alignOptions.align), \n // Default: top align\n y = (alignToBox.y || 0) + (alignOptions.y || 0) +\n ((alignToBox.height || 0) - (alignOptions.height || 0)) *\n getAlignFactor(alignOptions.verticalAlign), attribs = {};\n // Add text-align attribute only if option is defined, #22698\n if (alignOptions.align) {\n attribs['text-align'] = alignOptions.align;\n }\n attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n // Animate only if already placed\n if (redraw) {\n this[this.placed ? 'animate' : 'attr'](attribs);\n this.placed = true;\n }\n this.alignAttr = attribs;\n return this;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#alignSetter\n * @param {\"left\"|\"center\"|\"right\"} value\n */\n alignSetter(value) {\n const convert = {\n left: 'start',\n center: 'middle',\n right: 'end'\n };\n if (convert[value]) {\n this.alignValue = value;\n this.element.setAttribute('text-anchor', convert[value]);\n }\n }\n /**\n * Animate to given attributes or CSS properties.\n *\n * @sample highcharts/members/element-on/\n * Setting some attributes by animation\n *\n * @function Highcharts.SVGElement#animate\n *\n * @param {Highcharts.SVGAttributes} params\n * SVG attributes or CSS to animate.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [options]\n * Animation options.\n *\n * @param {Function} [complete]\n * Function to perform at the end of animation.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n animate(params, options, complete) {\n const animOptions = animObject(pick(options, this.renderer.globalAnimation, true)), deferTime = animOptions.defer;\n // When the page is hidden save resources in the background by not\n // running animation at all (#9749).\n if (doc.hidden) {\n animOptions.duration = 0;\n }\n if (animOptions.duration !== 0) {\n // Allows using a callback with the global animation without\n // overwriting it\n if (complete) {\n animOptions.complete = complete;\n }\n // If defer option is defined delay the animation #12901\n syncTimeout(() => {\n if (this.element) {\n animate(this, params, animOptions);\n }\n }, deferTime);\n }\n else {\n this.attr(params, void 0, complete || animOptions.complete);\n // Call the end step synchronously\n objectEach(params, function (val, prop) {\n if (animOptions.step) {\n animOptions.step.call(this, val, { prop: prop, pos: 1, elem: this });\n }\n }, this);\n }\n return this;\n }\n /**\n * Apply a text outline through a custom CSS property, by copying the text\n * element and apply stroke to the copy. Used internally. Contrast checks at\n * [example](https://jsfiddle.net/highcharts/43soe9m1/2/).\n *\n * @example\n * // Specific color\n * text.css({\n * textOutline: '1px black'\n * });\n * // Automatic contrast\n * text.css({\n * color: '#000000', // black text\n * textOutline: '1px contrast' // => white outline\n * });\n *\n * @internal\n * @function Highcharts.SVGElement#applyTextOutline\n *\n * @param {string} textOutline\n * A custom CSS `text-outline` setting, defined by `width color`.\n */\n applyTextOutline(textOutline) {\n const elem = this.element, hasContrast = textOutline.indexOf('contrast') !== -1, styles = {};\n // When the text shadow is set to contrast, use dark stroke for light\n // text and vice versa.\n if (hasContrast) {\n styles.textOutline = textOutline = textOutline.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n }\n // Extract the stroke width and color\n const spacePos = textOutline.indexOf(' '), color = textOutline.substring(spacePos + 1);\n let strokeWidth = textOutline.substring(0, spacePos);\n if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n this.fakeTS = true; // Fake text shadow\n // Since the stroke is applied on center of the actual outline, we\n // need to double it to get the correct stroke-width outside the\n // glyphs.\n strokeWidth = strokeWidth.replace(/(^[\\d\\.]+)(.*?)$/g, function (match, digit, unit) {\n return (2 * Number(digit)) + unit;\n });\n // Remove shadows from previous runs.\n this.removeTextOutline();\n const outline = doc.createElementNS(SVG_NS, 'tspan');\n attr(outline, {\n 'class': 'highcharts-text-outline',\n fill: color,\n stroke: color,\n 'stroke-width': strokeWidth,\n 'stroke-linejoin': 'round'\n });\n // For each of the tspans and text nodes, create a copy in the\n // outline.\n const parentElem = elem.querySelector('textPath') || elem;\n [].forEach.call(parentElem.childNodes, (childNode) => {\n const clone = childNode.cloneNode(true);\n if (clone.removeAttribute) {\n ['fill', 'stroke', 'stroke-width', 'stroke'].forEach((prop) => clone\n .removeAttribute(prop));\n }\n outline.appendChild(clone);\n });\n // Collect the sum of dy from all children, included nested ones\n let totalHeight = 0;\n [].forEach.call(parentElem.querySelectorAll('text tspan'), (element) => {\n totalHeight += Number(element.getAttribute('dy'));\n });\n // Insert an absolutely positioned break before the original text\n // to keep it in place\n const br = doc.createElementNS(SVG_NS, 'tspan');\n br.textContent = '\\u200B';\n // Reset the position for the following text\n attr(br, {\n x: Number(elem.getAttribute('x')),\n dy: -totalHeight\n });\n // Insert the outline\n outline.appendChild(br);\n parentElem.insertBefore(outline, parentElem.firstChild);\n }\n }\n /**\n * @function Highcharts.SVGElement#attr\n * @param {string} key\n * @return {number|string}\n */ /**\n * Apply native and custom attributes to the SVG elements.\n *\n * In order to set the rotation center for rotation, set x and y to 0 and\n * use `translateX` and `translateY` attributes to position the element\n * instead.\n *\n * Attributes frequently used in Highcharts are `fill`, `stroke`,\n * `stroke-width`.\n *\n * @sample highcharts/members/renderer-rect/\n * Setting some attributes\n *\n * @example\n * // Set multiple attributes\n * element.attr({\n * stroke: 'red',\n * fill: 'blue',\n * x: 10,\n * y: 10\n * });\n *\n * // Set a single attribute\n * element.attr('stroke', 'red');\n *\n * // Get an attribute\n * element.attr('stroke'); // => 'red'\n *\n * @function Highcharts.SVGElement#attr\n *\n * @param {string|Highcharts.SVGAttributes} [hash]\n * The native and custom SVG attributes.\n *\n * @param {number|string|Highcharts.SVGPathArray} [val]\n * If the type of the first argument is `string`, the second can be a value,\n * which will serve as a single attribute setter. If the first argument is a\n * string and the second is undefined, the function serves as a getter and\n * the current value of the property is returned.\n *\n * @param {Function} [complete]\n * A callback function to execute after setting the attributes. This makes\n * the function compliant and interchangeable with the\n * {@link SVGElement#animate} function.\n *\n * @param {boolean} [continueAnimation=true]\n * Used internally when `.attr` is called as part of an animation step.\n * Otherwise, calling `.attr` for an attribute will stop animation for that\n * attribute.\n *\n * @return {Highcharts.SVGElement}\n * If used as a setter, it returns the current {@link Highcharts.SVGElement}\n * so the calls can be chained. If used as a getter, the current value of\n * the attribute is returned.\n */\n attr(hash, val, complete, continueAnimation) {\n const { element } = this, symbolCustomAttribs = SVGElement.symbolCustomAttribs;\n let key, hasSetSymbolSize, ret = this, skipAttr, setter;\n // Single key-value pair\n if (typeof hash === 'string' && typeof val !== 'undefined') {\n key = hash;\n hash = {};\n hash[key] = val;\n }\n // Used as a getter: first argument is a string, second is undefined\n if (typeof hash === 'string') {\n ret = (this[hash + 'Getter'] ||\n this._defaultGetter).call(this, hash, element);\n // Setter\n }\n else {\n objectEach(hash, function eachAttribute(val, key) {\n skipAttr = false;\n // Unless .attr is from the animator update, stop current\n // running animation of this property\n if (!continueAnimation) {\n stop(this, key);\n }\n // Special handling of symbol attributes\n if (this.symbolName &&\n symbolCustomAttribs.indexOf(key) !== -1) {\n if (!hasSetSymbolSize) {\n this.symbolAttr(hash);\n hasSetSymbolSize = true;\n }\n skipAttr = true;\n }\n if (this.rotation && (key === 'x' || key === 'y')) {\n this.doTransform = true;\n }\n if (!skipAttr) {\n setter = (this[key + 'Setter'] ||\n this._defaultSetter);\n setter.call(this, val, key, element);\n }\n }, this);\n this.afterSetters();\n }\n // In accordance with animate, run a complete callback\n if (complete) {\n complete.call(this);\n }\n return ret;\n }\n /**\n * Apply a clipping shape to this element.\n *\n * @function Highcharts.SVGElement#clip\n *\n * @param {SVGElement} [clipElem]\n * The clipping shape. If skipped, the current clip is removed.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVG element to allow chaining.\n */\n clip(clipElem) {\n if (clipElem && !clipElem.clipPath) {\n // Add a hyphen at the end to avoid confusion in testing indexes\n // -1 and -10, -11 etc (#6550)\n const id = uniqueKey() + '-', clipPath = this.renderer.createElement('clipPath')\n .attr({ id })\n .add(this.renderer.defs);\n extend(clipElem, { clipPath, id, count: 0 });\n clipElem.add(clipPath);\n }\n return this.attr('clip-path', clipElem ?\n `url(${this.renderer.url}#${clipElem.id})` :\n 'none');\n }\n /**\n * Calculate the coordinates needed for drawing a rectangle crisply and\n * return the calculated attributes.\n *\n * @function Highcharts.SVGElement#crisp\n *\n * @param {Highcharts.RectangleObject} rect\n * Rectangle to crisp.\n *\n * @param {number} [strokeWidth]\n * The stroke width to consider when computing crisp positioning. It can\n * also be set directly on the rect parameter.\n *\n * @return {Highcharts.RectangleObject}\n * The modified rectangle arguments.\n */\n crisp(rect, strokeWidth) {\n // Math.round because strokeWidth can sometimes have roundoff errors\n strokeWidth = Math.round(strokeWidth || rect.strokeWidth || 0);\n const x1 = rect.x || this.x || 0, y1 = rect.y || this.y || 0, x2 = (rect.width || this.width || 0) + x1, y2 = (rect.height || this.height || 0) + y1, \n // Find all the rounded coordinates for corners\n x = crisp(x1, strokeWidth), y = crisp(y1, strokeWidth), x2Crisp = crisp(x2, strokeWidth), y2Crisp = crisp(y2, strokeWidth);\n extend(rect, {\n x,\n y,\n width: x2Crisp - x,\n height: y2Crisp - y\n });\n if (defined(rect.strokeWidth)) {\n rect.strokeWidth = strokeWidth;\n }\n return rect;\n }\n /**\n * Build and apply an SVG gradient out of a common JavaScript configuration\n * object. This function is called from the attribute setters. An event\n * hook is added for supporting other complex color types.\n *\n * @internal\n * @function Highcharts.SVGElement#complexColor\n * @param {Highcharts.GradientColorObject|Highcharts.PatternObject} colorOptions\n * The gradient or pattern options structure.\n * @param {string} prop\n * The property to apply, can either be `fill` or `stroke`.\n * @param {Highcharts.SVGDOMElement} elem\n * SVG element to apply the gradient on.\n */\n complexColor(colorOptions, prop, elem) {\n const renderer = this.renderer;\n let colorObject, gradName, gradAttr, radAttr, gradients, stops, stopOpacity, radialReference, id, key = [], value;\n fireEvent(this.renderer, 'complexColor', {\n args: arguments\n }, () => {\n // Apply linear or radial gradients\n if (colorOptions.radialGradient) {\n gradName = 'radialGradient';\n }\n else if (colorOptions.linearGradient) {\n gradName = 'linearGradient';\n }\n if (gradName) {\n gradAttr = colorOptions[gradName];\n gradients = renderer.gradients;\n stops = colorOptions.stops;\n radialReference = elem.radialReference;\n // Keep < 2.2 compatibility\n if (isArray(gradAttr)) {\n colorOptions[gradName] = gradAttr = {\n x1: gradAttr[0],\n y1: gradAttr[1],\n x2: gradAttr[2],\n y2: gradAttr[3],\n gradientUnits: 'userSpaceOnUse'\n };\n }\n // Correct the radial gradient for the radial reference system\n if (gradName === 'radialGradient' &&\n radialReference &&\n !defined(gradAttr.gradientUnits)) {\n // Save the radial attributes for updating\n radAttr = gradAttr;\n gradAttr = merge(gradAttr, renderer.getRadialAttr(radialReference, radAttr), { gradientUnits: 'userSpaceOnUse' });\n }\n // Build the unique key to detect whether we need to create a\n // new element (#1282)\n objectEach(gradAttr, function (value, n) {\n if (n !== 'id') {\n key.push(n, value);\n }\n });\n objectEach(stops, function (val) {\n key.push(val);\n });\n key = key.join(',');\n // Check if a gradient object with the same config object is\n // created within this renderer\n if (gradients[key]) {\n id = gradients[key].attr('id');\n }\n else {\n // Set the id and create the element\n gradAttr.id = id = uniqueKey();\n const gradientObject = gradients[key] =\n renderer.createElement(gradName)\n .attr(gradAttr)\n .add(renderer.defs);\n gradientObject.radAttr = radAttr;\n // The gradient needs to keep a list of stops to be able to\n // destroy them\n gradientObject.stops = [];\n stops.forEach(([offset, stopColor]) => {\n if (stopColor.indexOf('rgba') === 0) {\n colorObject = Color.parse(stopColor);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n }\n else {\n stopOpacity = 1;\n }\n const stopObject = renderer.createElement('stop').attr({\n offset,\n 'stop-color': stopColor,\n 'stop-opacity': stopOpacity\n }).add(gradientObject);\n // Add the stop element to the gradient\n gradientObject.stops.push(stopObject);\n });\n }\n // Set the reference to the gradient object\n value = 'url(' + renderer.url + '#' + id + ')';\n elem.setAttribute(prop, value);\n elem.gradient = key;\n // Allow the color to be concatenated into tooltips formatters\n // etc. (#2995)\n colorOptions.toString = function () {\n return value;\n };\n }\n });\n }\n /**\n * Set styles for the element. In addition to CSS styles supported by\n * native SVG and HTML elements, there are also some custom made for\n * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n * elements.\n *\n * @sample highcharts/members/renderer-text-on-chart/\n * Styled text\n *\n * @function Highcharts.SVGElement#css\n *\n * @param {Highcharts.CSSObject} styles\n * The new CSS styles.\n *\n * @return {Highcharts.SVGElement}\n * Return the SVG element for chaining.\n */\n css(styles) {\n const oldStyles = this.styles, newStyles = {}, elem = this.element, renderer = this.renderer;\n let textWidth, hasNew = !oldStyles;\n // Filter out existing styles to increase performance (#2640)\n if (oldStyles) {\n objectEach(styles, function (value, n) {\n if (oldStyles && oldStyles[n] !== value) {\n newStyles[n] = value;\n hasNew = true;\n }\n });\n }\n if (hasNew) {\n // Merge the new styles with the old ones\n if (oldStyles) {\n styles = extend(oldStyles, newStyles);\n }\n // Get the text width from style\n // Previously set, unset it (#8234)\n if (styles.width === null || styles.width === 'auto') {\n delete this.textWidth;\n // Apply new\n }\n else if (elem.nodeName.toLowerCase() === 'text' &&\n styles.width) {\n textWidth = this.textWidth = pInt(styles.width);\n }\n // Store object\n extend(this.styles, styles);\n if (textWidth && (!svg && renderer.forExport)) {\n delete styles.width;\n }\n const fontSize = isFirefox && styles.fontSize || null;\n // Necessary in firefox to be able to set font-size, #22124\n if (fontSize && (isNumber(fontSize) ||\n /^\\d+$/.test(fontSize))) {\n styles.fontSize += 'px';\n }\n const stylesToApply = merge(styles);\n if (elem.namespaceURI === this.SVG_NS) {\n // These CSS properties are interpreted internally by the SVG\n // renderer, but are not supported by SVG and should not be\n // added to the DOM. In styled mode, no CSS should find its way\n // to the DOM whatsoever (#6173, #6474).\n ['textOutline', 'textOverflow', 'whiteSpace', 'width'].forEach((key) => (stylesToApply &&\n delete stylesToApply[key]));\n // SVG requires fill for text\n if (stylesToApply.color) {\n stylesToApply.fill = stylesToApply.color;\n delete stylesToApply.color;\n }\n }\n css(elem, stylesToApply);\n }\n if (this.added) {\n // Rebuild text after added. Cache mechanisms in the buildText will\n // prevent building if there are no significant changes.\n if (this.element.nodeName === 'text') {\n renderer.buildText(this);\n }\n // Apply text outline after added\n if (styles.textOutline) {\n this.applyTextOutline(styles.textOutline);\n }\n }\n return this;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#dashstyleSetter\n * @param {string} value\n */\n dashstyleSetter(value) {\n let i, strokeWidth = this['stroke-width'];\n // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new\n // strokeWidth function, we should be able to use that instead.\n if (strokeWidth === 'inherit') {\n strokeWidth = 1;\n }\n if (value) {\n value = value.toLowerCase();\n const v = value\n .replace('shortdashdotdot', '3,1,1,1,1,1,')\n .replace('shortdashdot', '3,1,1,1')\n .replace('shortdot', '1,1,')\n .replace('shortdash', '3,1,')\n .replace('longdash', '8,3,')\n .replace(/dot/g, '1,3,')\n .replace('dash', '4,3,')\n .replace(/,$/, '')\n .split(','); // Ending comma\n i = v.length;\n while (i--) {\n v[i] = '' + (pInt(v[i]) * pick(strokeWidth, NaN));\n }\n value = v.join(',').replace(/NaN/g, 'none'); // #3226\n this.element.setAttribute('stroke-dasharray', value);\n }\n }\n /**\n * Destroy the element and element wrapper and clear up the DOM and event\n * hooks.\n *\n * @function Highcharts.SVGElement#destroy\n */\n destroy() {\n const wrapper = this, { element = {}, renderer, stops } = wrapper, ownerSVGElement = element.ownerSVGElement;\n // Remove events\n element.onclick = element.onmouseout = element.onmouseover =\n element.onmousemove = element.point = null;\n stop(wrapper); // Stop running animations\n if (wrapper.clipPath && ownerSVGElement) {\n const clipPath = wrapper.clipPath;\n // Look for existing references to this clipPath and remove them\n // before destroying the element (#6196).\n // The upper case version is for Edge\n [].forEach.call(ownerSVGElement.querySelectorAll('[clip-path],[CLIP-PATH]'), function (el) {\n if (el.getAttribute('clip-path').indexOf(clipPath.element.id) > -1) {\n el.removeAttribute('clip-path');\n }\n });\n wrapper.clipPath = clipPath.destroy();\n }\n // Destroy stops in case this is a gradient object @todo old code?\n if (stops) {\n for (const stop of stops) {\n stop.destroy();\n }\n stops.length = 0;\n }\n // Remove element\n wrapper.safeRemoveChild(element);\n // Remove from alignObjects\n if (wrapper.alignOptions) {\n erase(renderer.alignedObjects, wrapper);\n }\n objectEach(wrapper, (val, key) => {\n if (\n // Destroy child elements of a group\n wrapper[key]?.parentGroup === wrapper ||\n // Destroy own elements\n ['connector', 'foreignObject'].indexOf(key) !== -1) {\n wrapper[key]?.destroy?.();\n }\n // Delete all properties\n delete wrapper[key];\n });\n return;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#dSetter\n * @param {number|string|Highcharts.SVGPathArray} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n dSetter(value, key, element) {\n if (isArray(value)) {\n // Backwards compatibility, convert one-dimensional array into an\n // array of segments\n if (typeof value[0] === 'string') {\n value = this.renderer.pathToSegments(value);\n }\n this.pathArray = value;\n value = value.reduce((acc, seg, i) => {\n if (!seg?.join) {\n return (seg || '').toString();\n }\n return (i ? acc + ' ' : '') + seg.join(' ');\n }, '');\n }\n if (/(NaN| {2}|^$)/.test(value)) {\n value = 'M 0 0';\n }\n // Check for cache before resetting. Resetting causes disturbance in the\n // DOM, causing flickering in some cases in Edge/IE (#6747). Also\n // possible performance gain.\n if (this[key] !== value) {\n element.setAttribute(key, value);\n this[key] = value;\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#fillSetter\n * @param {Highcharts.ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n fillSetter(value, key, element) {\n if (typeof value === 'string') {\n element.setAttribute(key, value);\n }\n else if (value) {\n this.complexColor(value, key, element);\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#hrefSetter\n * @param {Highcharts.ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n hrefSetter(value, key, element) {\n // Namespace is needed for offline export, #19106\n element.setAttributeNS('http://www.w3.org/1999/xlink', key, value);\n }\n /**\n * Get the bounding box (width, height, x and y) for the element. Generally\n * used to get rendered text size. Since this is called a lot in charts,\n * the results are cached based on text properties, in order to save DOM\n * traffic. The returned bounding box includes the rotation, so for example\n * a single text line of rotation 90 will report a greater height, and a\n * width corresponding to the line-height.\n *\n * @sample highcharts/members/renderer-on-chart/\n * Draw a rectangle based on a text's bounding box\n *\n * @function Highcharts.SVGElement#getBBox\n *\n * @param {boolean} [reload]\n * Skip the cache and get the updated DOM bounding box.\n *\n * @param {number} [rot]\n * Override the element's rotation. This is internally used on axis\n * labels with a value of 0 to find out what the bounding box would\n * be have been if it were not rotated.\n *\n * @return {Highcharts.BBoxObject}\n * The bounding box with `x`, `y`, `width` and `height` properties.\n */\n getBBox(reload, rot) {\n const wrapper = this, { element, renderer, styles, textStr } = wrapper, { cache, cacheKeys } = renderer, isSVG = element.namespaceURI === wrapper.SVG_NS, rotation = pick(rot, wrapper.rotation, 0), fontSize = renderer.styledMode ? (element &&\n SVGElement.prototype.getStyle.call(element, 'font-size')) : (styles.fontSize), cacheKey = this.getBBoxCacheKey([\n renderer.rootFontSize,\n this.textWidth, // #7874, also useHTML\n this.alignValue,\n styles.fontWeight, // #12163\n styles.lineClamp,\n styles.textOverflow, // #5968\n fontSize,\n rotation\n ]);\n let bBox, height, toggleTextShadowShim;\n if (cacheKey && !reload) {\n bBox = cache[cacheKey];\n }\n // No cache found\n if (!bBox || bBox.polygon) {\n // SVG elements\n if (isSVG || renderer.forExport) {\n try { // Fails in Firefox if the container has display: none.\n // When the text shadow shim is used, we need to hide the\n // fake shadows to get the correct bounding box (#3872)\n toggleTextShadowShim = this.fakeTS && function (display) {\n const outline = element.querySelector('.highcharts-text-outline');\n if (outline) {\n css(outline, { display });\n }\n };\n // Workaround for #3842, Firefox reporting wrong bounding\n // box for shadows\n if (isFunction(toggleTextShadowShim)) {\n toggleTextShadowShim('none');\n }\n bBox = element.getBBox ?\n // SVG: use extend because IE9 is not allowed to change\n // width and height in case of rotation (below)\n extend({}, element.getBBox()) : {\n // HTML elements with `exporting.allowHTML` and\n // legacy IE in export mode\n width: element.offsetWidth,\n height: element.offsetHeight,\n x: 0,\n y: 0\n };\n // #3842\n if (isFunction(toggleTextShadowShim)) {\n toggleTextShadowShim('');\n }\n }\n catch {\n // Ignore error\n }\n // If the bBox is not set, the try-catch block above failed. The\n // other condition is for Opera that returns a width of\n // -Infinity on hidden elements.\n if (!bBox || bBox.width < 0) {\n bBox = { x: 0, y: 0, width: 0, height: 0 };\n }\n // Use HTML within SVG\n }\n else {\n bBox = wrapper.htmlGetBBox();\n }\n // True SVG elements as well as HTML elements in modern browsers\n // using the .useHTML option need to compensated for rotation\n height = bBox.height;\n // Workaround for wrong bounding box in IE, Edge and Chrome on\n // Windows. With Highcharts' default font, IE and Edge report\n // a box height of 16.899 and Chrome rounds it to 17. If this\n // stands uncorrected, it results in more padding added below\n // the text than above when adding a label border or background.\n // Also vertical positioning is affected.\n // https://jsfiddle.net/highcharts/em37nvuj/\n // (#1101, #1505, #1669, #2568, #6213).\n if (isSVG) {\n bBox.height = height = ({\n '11px,17': 14,\n '13px,20': 16\n }[`${fontSize || ''},${Math.round(height)}`] ||\n height);\n }\n // Adjust for rotated text\n if (rotation) {\n bBox = this.getRotatedBox(bBox, rotation);\n }\n // Create a reference to catch changes to bBox\n const e = { bBox };\n fireEvent(this, 'afterGetBBox', e);\n // Pick up any changes after the fired event\n bBox = e.bBox;\n }\n // Cache it. When loading a chart in a hidden iframe in Firefox and\n // IE/Edge, the bounding box height is 0, so don't cache it (#5620).\n if (cacheKey && (textStr === '' || bBox.height > 0)) {\n // Rotate (#4681)\n while (cacheKeys.length > 250) {\n delete cache[cacheKeys.shift()];\n }\n if (!cache[cacheKey]) {\n cacheKeys.push(cacheKey);\n }\n cache[cacheKey] = bBox;\n }\n return bBox;\n }\n /**\n * Overridable method to get a cache key for the bounding box of this\n * element.\n *\n * @example\n * // Plugin to let the getBBox function respond to font family changes\n * (({ SVGElement }) => {\n * const getBBoxCacheKey = SVGElement.prototype.getBBoxCacheKey;\n * SVGElement.prototype.getBBoxCacheKey = function (keys) {\n * const key = getBBoxCacheKey.call(this, keys);\n * const fontFamily = this.styles.fontFamily;\n * return key + (fontFamily ? `,${fontFamily}` : '');\n * };\n * })(Highcharts);\n *\n * @function Highcharts.SVGElement#getBBoxCacheKey\n *\n * @return {string|void} The cache key based on the text properties.\n */\n getBBoxCacheKey(keys) {\n // Avoid undefined and null (#7316)\n if (defined(this.textStr)) {\n let textStr = '' + this.textStr;\n // Since numerical labels appear a lot in a chart, we approximate\n // that a label of n characters has the same bounding box as others\n // of the same length. Unless there is inner HTML in the label. In\n // that case, leave the numbers as is (#5899).\n if (textStr.indexOf('<') === -1) {\n textStr = textStr.replace(/\\d/g, '0');\n }\n // Properties that affect bounding box\n return [\n textStr,\n ...keys\n ].join(',');\n }\n }\n /**\n * Get the rotated box.\n * @internal\n */\n getRotatedBox(box, rotation) {\n const { x: boxX, y: boxY, width, height } = box, { alignValue, translateY, rotationOriginX = 0, rotationOriginY = 0 } = this, alignFactor = getAlignFactor(alignValue), baseline = Number(this.element.getAttribute('y') || 0) -\n (translateY ? 0 : boxY), rad = rotation * deg2rad, rad90 = (rotation - 90) * deg2rad, cosRad = Math.cos(rad), sinRad = Math.sin(rad), wCosRad = width * cosRad, wSinRad = width * sinRad, cosRad90 = Math.cos(rad90), sinRad90 = Math.sin(rad90), [[xOriginCosRad, xOriginSinRad], [yOriginCosRad, yOriginSinRad]] = [\n rotationOriginX,\n rotationOriginY\n ].map((rotOrigin) => [\n rotOrigin - (rotOrigin * cosRad),\n rotOrigin * sinRad\n ]), \n // Find the starting point on the left side baseline of\n // the text\n pX = ((boxX + alignFactor * (width - wCosRad)) +\n xOriginCosRad + yOriginSinRad), pY = ((boxY + baseline - alignFactor * wSinRad) -\n xOriginSinRad + yOriginCosRad), \n // Find all corners\n aX = pX + baseline * cosRad90, bX = aX + wCosRad, cX = bX - height * cosRad90, dX = cX - wCosRad, aY = pY + baseline * sinRad90, bY = aY + wSinRad, cY = bY - height * sinRad90, dY = cY - wSinRad;\n // Deduct the bounding box from the corners\n const x = Math.min(aX, bX, cX, dX), y = Math.min(aY, bY, cY, dY), boxWidth = Math.max(aX, bX, cX, dX) - x, boxHeight = Math.max(aY, bY, cY, dY) - y;\n /* Uncomment to visualize boxes\n this.bBoxViz ??= this.renderer.path()\n .attr({\n stroke: 'red',\n 'stroke-width': 1,\n zIndex: 20\n })\n .add();\n this.bBoxViz.attr('d', [\n ['M', aX, aY],\n ['L', bX, bY],\n ['L', cX, cY],\n ['L', dX, dY],\n ['Z']\n ]);\n // */\n return {\n x,\n y,\n width: boxWidth,\n height: boxHeight,\n polygon: [\n [aX, aY],\n [bX, bY],\n [cX, cY],\n [dX, dY]\n ]\n };\n }\n /**\n * Get the computed style. Only in styled mode.\n *\n * @example\n * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n *\n * @function Highcharts.SVGElement#getStyle\n *\n * @param {string} prop\n * The property name to check for.\n *\n * @return {string}\n * The current computed value.\n */\n getStyle(prop) {\n return win\n .getComputedStyle(this.element || this, '')\n .getPropertyValue(prop);\n }\n /**\n * Check if an element has the given class name.\n *\n * @function Highcharts.SVGElement#hasClass\n *\n * @param {string} className\n * The class name to check for.\n *\n * @return {boolean}\n * Whether the class name is found.\n */\n hasClass(className) {\n return ('' + this.attr('class'))\n .split(' ')\n .indexOf(className) !== -1;\n }\n /**\n * Hide the element, similar to setting the `visibility` attribute to\n * `hidden`.\n *\n * @function Highcharts.SVGElement#hide\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n hide() {\n return this.attr({ visibility: 'hidden' });\n }\n /** @internal */\n htmlGetBBox() {\n return { height: 0, width: 0, x: 0, y: 0 };\n }\n /**\n * Initialize the SVG element. This function only exists to make the\n * initialization process overridable. It should not be called directly.\n *\n * @function Highcharts.SVGElement#init\n *\n * @param {Highcharts.SVGRenderer} renderer\n * The SVGRenderer instance to initialize to.\n *\n * @param {string} nodeName\n * The SVG node name.\n */\n constructor(renderer, nodeName) {\n /** @internal */\n this.onEvents = {};\n /** @internal */\n this.opacity = 1; // Default base for animation\n /** @internal */\n this.SVG_NS = SVG_NS;\n /**\n * The primary DOM node. Each `SVGElement` instance wraps a main DOM\n * node, but may also represent more nodes.\n *\n * @name Highcharts.SVGElement#element\n * @type {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n */\n this.element = nodeName === 'div' || nodeName === 'body' ?\n createElement(nodeName) :\n doc.createElementNS(this.SVG_NS, nodeName);\n /**\n * The renderer that the SVGElement belongs to.\n *\n * @name Highcharts.SVGElement#renderer\n * @type {Highcharts.SVGRenderer}\n */\n this.renderer = renderer;\n this.styles = {};\n fireEvent(this, 'afterInit');\n }\n /**\n * Add an event listener. This is a simple setter that replaces the\n * previous event of the same type added by this function, as opposed to\n * the {@link Highcharts#addEvent} function.\n *\n * @sample highcharts/members/element-on/\n * A clickable rectangle\n *\n * @function Highcharts.SVGElement#on\n *\n * @param {string} eventType\n * The event type.\n *\n * @param {Function} handler\n * The handler callback.\n *\n * @return {Highcharts.SVGElement}\n * The SVGElement for chaining.\n */\n on(eventType, handler) {\n const { onEvents } = this;\n if (onEvents[eventType]) {\n // Unbind existing event\n onEvents[eventType]();\n }\n onEvents[eventType] = addEvent(this.element, eventType, handler);\n return this;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#opacitySetter\n * @param {string} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n opacitySetter(value, key, element) {\n // Round off to avoid float errors, like tests where opacity lands on\n // 9.86957e-06 instead of 0\n const opacity = Number(Number(value).toFixed(3));\n this.opacity = opacity;\n element.setAttribute(key, opacity);\n }\n /**\n * Re-align an aligned text or label after setting the text.\n *\n * @internal\n * @function Highcharts.SVGElement#reAlign\n *\n */\n reAlign() {\n if (this.alignOptions?.width && this.alignOptions.align !== 'left') {\n this.alignOptions.width = this.getBBox().width;\n this.placed = false; // Block animation\n this.align();\n }\n }\n /**\n * Remove a class name from the element.\n *\n * @function Highcharts.SVGElement#removeClass\n *\n * @param {string|RegExp} className\n * The class name to remove.\n *\n * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n */\n removeClass(className) {\n return this.attr('class', ('' + this.attr('class'))\n .replace(isString(className) ?\n new RegExp(`(^| )${className}( |$)`) : // #12064, #13590\n className, ' ')\n .replace(/ +/g, ' ')\n .trim());\n }\n /**\n *\n * @internal\n */\n removeTextOutline() {\n const outline = this.element\n .querySelector('tspan.highcharts-text-outline');\n if (outline) {\n this.safeRemoveChild(outline);\n }\n }\n /**\n * Removes an element from the DOM.\n *\n * @internal\n * @function Highcharts.SVGElement#safeRemoveChild\n *\n * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n * The DOM node to remove.\n */\n safeRemoveChild(element) {\n const parentNode = element.parentNode;\n if (parentNode) {\n parentNode.removeChild(element);\n }\n }\n /**\n * Set the coordinates needed to draw a consistent radial gradient across\n * a shape regardless of positioning inside the chart. Used on pie slices\n * to make all the slices have the same radial reference point.\n *\n * @function Highcharts.SVGElement#setRadialReference\n *\n * @param {Array<number>} coordinates\n * The center reference. The format is `[centerX, centerY, diameter]` in\n * pixels.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n setRadialReference(coordinates) {\n const existingGradient = (this.element.gradient &&\n this.renderer.gradients[this.element.gradient]) || void 0;\n this.element.radialReference = coordinates;\n // On redrawing objects with an existing gradient, the gradient needs\n // to be repositioned (#3801)\n if (existingGradient?.radAttr) {\n existingGradient.animate(this.renderer.getRadialAttr(coordinates, existingGradient.radAttr));\n }\n return this;\n }\n /**\n * Add a shadow to the element. In styled mode, this method is not used,\n * instead use `defs` and filters.\n *\n * @example\n * renderer.rect(10, 100, 100, 100)\n * .attr({ fill: 'red' })\n * .shadow(true);\n *\n * @function Highcharts.SVGElement#shadow\n *\n * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions] The\n * shadow options. If `true`, the default options are applied. If\n * `false`, the current shadow will be removed.\n *\n * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n shadow(shadowOptions) {\n const { renderer } = this, options = merge(this.parentGroup?.rotation === 90 ? {\n offsetX: -1,\n offsetY: -1\n } : {}, isObject(shadowOptions) ? shadowOptions : {}), id = renderer.shadowDefinition(options);\n return this.attr({\n filter: shadowOptions ?\n `url(${renderer.url}#${id})` :\n 'none'\n });\n }\n /**\n * Show the element after it has been hidden.\n *\n * @function Highcharts.SVGElement#show\n *\n * @param {boolean} [inherit=true]\n * Set the visibility attribute to `inherit` rather than `visible`.\n * The difference is that an element with `visibility=\"visible\"`\n * will be visible even if the parent is hidden.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n show(inherit = true) {\n return this.attr({ visibility: inherit ? 'inherit' : 'visible' });\n }\n /**\n * Set the stroke-width and record it on the SVGElement\n *\n * @internal\n * @function Highcharts.SVGElement#strokeSetter\n * @param {number|string|ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n 'stroke-widthSetter'(value, key, element) {\n // Record it for quick access in getter\n this[key] = value;\n element.setAttribute(key, value);\n }\n /**\n * Get the computed stroke width in pixel values. This is used extensively\n * when drawing shapes to ensure the shapes are rendered crisp and\n * positioned correctly relative to each other. Using\n * `shape-rendering: crispEdges` leaves us less control over positioning,\n * for example when we want to stack columns next to each other, or position\n * things pixel-perfectly within the plot box.\n *\n * The common pattern when placing a shape is:\n * - Create the SVGElement and add it to the DOM. In styled mode, it will\n * now receive a stroke width from the style sheet. In classic mode we\n * will add the `stroke-width` attribute.\n * - Read the computed `elem.strokeWidth()`.\n * - Place it based on the stroke width.\n *\n * @function Highcharts.SVGElement#strokeWidth\n *\n * @return {number}\n * The stroke width in pixels. Even if the given stroke width (in CSS or by\n * attributes) is based on `em` or other units, the pixel size is returned.\n */\n strokeWidth() {\n // In non-styled mode, read the stroke width as set by .attr\n if (!this.renderer.styledMode) {\n return this['stroke-width'] || 0;\n }\n // In styled mode, read computed stroke width\n const val = this.getStyle('stroke-width');\n let ret = 0, tempElement;\n // Read pixel values directly\n if (/px$/.test(val)) {\n ret = pInt(val);\n // Other values like em, pt etc need to be measured\n }\n else if (val !== '') {\n tempElement = doc.createElementNS(SVG_NS, 'rect');\n attr(tempElement, {\n width: val,\n 'stroke-width': 0\n });\n this.element.parentNode.appendChild(tempElement);\n ret = tempElement.getBBox().width;\n tempElement.parentNode.removeChild(tempElement);\n }\n return ret;\n }\n /**\n * If one of the symbol size affecting parameters are changed,\n * check all the others only once for each call to an element's\n * .attr() method\n *\n * @internal\n * @function Highcharts.SVGElement#symbolAttr\n *\n * @param {Highcharts.SVGAttributes} hash\n * The attributes to set.\n */\n symbolAttr(hash) {\n const wrapper = this;\n SVGElement.symbolCustomAttribs.forEach(function (key) {\n wrapper[key] = pick(hash[key], wrapper[key]);\n });\n wrapper.attr({\n d: wrapper.renderer.symbols[wrapper.symbolName](wrapper.x, wrapper.y, wrapper.width, wrapper.height, wrapper)\n });\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#textSetter\n * @param {string} value\n */\n textSetter(value) {\n if (value !== this.textStr) {\n // Delete size caches when the text changes\n delete this.textPxLength;\n this.textStr = value;\n if (this.added) {\n this.renderer.buildText(this);\n }\n this.reAlign();\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#titleSetter\n * @param {string} value\n */\n titleSetter(value) {\n const el = this.element;\n const titleNode = el.getElementsByTagName('title')[0] ||\n doc.createElementNS(this.SVG_NS, 'title');\n // Move to first child\n if (el.insertBefore) {\n el.insertBefore(titleNode, el.firstChild);\n }\n else {\n el.appendChild(titleNode);\n }\n // Replace text content and escape markup\n titleNode.textContent = replaceNested(// Scan #[73]\n pick(value, ''), // #3276, #3895\n [/<[^>]*>/g, '']).replace(/</g, '<').replace(/>/g, '>');\n }\n /**\n * Bring the element to the front. Alternatively, a new zIndex can be set.\n *\n * @sample highcharts/members/element-tofront/\n * Click an element to bring it to front\n *\n * @function Highcharts.SVGElement#toFront\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n toFront() {\n const element = this.element;\n element.parentNode.appendChild(element);\n return this;\n }\n /**\n * Move an object and its children by x and y values.\n *\n * @function Highcharts.SVGElement#translate\n *\n * @param {number} x\n * The x value.\n *\n * @param {number} y\n * The y value.\n *\n * @return {Highcharts.SVGElement}\n * Translated element.\n */\n translate(x, y) {\n return this.attr({\n translateX: x,\n translateY: y\n });\n }\n /**\n * Update the transform attribute based on internal properties. Deals with\n * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n * attributes and updates the SVG `transform` attribute.\n *\n * @internal\n * @function Highcharts.SVGElement#updateTransform\n */\n updateTransform(attrib = 'transform') {\n const { element, foreignObject, matrix, rotation = 0, rotationOriginX, rotationOriginY, scaleX, scaleY, text, translateX = 0, translateY = 0 } = this;\n // Apply translate. Nearly all transformed elements have translation,\n // so instead of checking for translate = 0, do it always (#1767,\n // #1846).\n const transform = [`translate(${translateX},${translateY})`];\n // Apply matrix\n if (defined(matrix)) {\n transform.push('matrix(' + matrix.join(',') + ')');\n }\n // Apply rotation\n if (rotation) {\n transform.push('rotate(' + rotation + ' ' +\n (rotationOriginX ?? element.getAttribute('x') ?? this.x ?? 0) +\n ' ' +\n (rotationOriginY ?? element.getAttribute('y') ?? this.y ?? 0) +\n ')');\n }\n // Apply scale\n if (defined(scaleX) || defined(scaleY)) {\n transform.push(`scale(${scaleX ?? 1} ${scaleY ?? 1})`);\n }\n if (transform.length && !(text || this).textPath) {\n (foreignObject?.element || element)\n .setAttribute(attrib, transform.join(' '));\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#visibilitySetter\n *\n * @param {string} value\n *\n * @param {string} key\n *\n * @param {Highcharts.SVGDOMElement} element\n *\n */\n visibilitySetter(value, key, element) {\n // IE9-11 doesn't handle visibility:inherit well, so we remove the\n // attribute instead (#2881, #3909)\n if (value === 'inherit') {\n element.removeAttribute(key);\n }\n else if (this[key] !== value) { // #6747\n element.setAttribute(key, value);\n }\n this[key] = value;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#xGetter\n */\n xGetter(key) {\n if (this.element.nodeName === 'circle') {\n if (key === 'x') {\n key = 'cx';\n }\n else if (key === 'y') {\n key = 'cy';\n }\n }\n return this._defaultGetter(key);\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#zIndexSetter\n */\n zIndexSetter(value, key) {\n const { element, parentGroup, renderer } = this, parentNode = parentGroup?.element || renderer.box, svgParent = parentNode === renderer.box;\n let childNodes, otherElement, otherZIndex, inserted = false, undefinedOtherZIndex, run = this.added, i;\n if (defined(value)) {\n // So we can read it for other elements in the group\n element.setAttribute('data-z-index', value);\n value = +value;\n if (this[key] === value) {\n // Only update when needed (#3865)\n run = false;\n }\n }\n else if (defined(this[key])) {\n element.removeAttribute('data-z-index');\n }\n this[key] = value;\n // Insert according to this and other elements' zIndex. Before .add() is\n // called, nothing is done. Then on add, or by later calls to\n // zIndexSetter, the node is placed on the right place in the DOM.\n if (run) {\n value = this.zIndex;\n if (value && parentGroup) {\n parentGroup.handleZ = true;\n }\n childNodes = parentNode.childNodes;\n for (i = childNodes.length - 1; i >= 0 && !inserted; i--) {\n otherElement = childNodes[i];\n otherZIndex = otherElement.getAttribute('data-z-index');\n undefinedOtherZIndex = !defined(otherZIndex);\n if (otherElement !== element) {\n if (\n // Negative zIndex versus no zIndex:\n // On all levels except the highest. If the parent is\n // <svg>, then we don't want to put items before <desc>\n // or <defs>\n defined(value) && value < 0 &&\n undefinedOtherZIndex &&\n !svgParent &&\n !i) {\n parentNode.insertBefore(element, childNodes[i]);\n inserted = true;\n }\n else if (\n // Insert after the first element with a lower zIndex\n (defined(value) &&\n parseFloat(otherZIndex || '') <= value) ||\n // If negative zIndex, add this before first undefined\n // zIndex element\n (undefinedOtherZIndex &&\n (!defined(value) || value >= 0))) {\n parentNode.insertBefore(element, childNodes[i + 1]);\n inserted = true;\n }\n }\n }\n if (!inserted) {\n parentNode.insertBefore(element, childNodes[svgParent ? 3 : 0]);\n inserted = true;\n }\n }\n return inserted;\n }\n}\n/* *\n *\n * Properties\n *\n * */\n/**\n * Custom attributes used for symbols, these should be filtered out when\n * setting SVGElement attributes (#9375).\n * @internal\n */\nSVGElement.symbolCustomAttribs = [\n 'anchorX',\n 'anchorY',\n 'clockwise',\n 'end',\n 'height',\n 'innerR',\n 'r',\n 'start',\n 'width',\n 'x',\n 'y'\n];\n// Some shared setters and getters\nSVGElement.prototype.strokeSetter = SVGElement.prototype.fillSetter;\nSVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\nSVGElement.prototype.matrixSetter =\n SVGElement.prototype.rotationOriginXSetter =\n SVGElement.prototype.rotationOriginYSetter =\n SVGElement.prototype.rotationSetter =\n SVGElement.prototype.scaleXSetter =\n SVGElement.prototype.scaleYSetter =\n SVGElement.prototype.translateXSetter =\n SVGElement.prototype.translateYSetter =\n SVGElement.prototype.verticalAlignSetter = function (value, key) {\n this[key] = value;\n this.doTransform = true;\n };\n/* *\n *\n * Default Export\n *\n * */\nexport default SVGElement;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Reference to the global SVGElement class as a workaround for a name conflict\n * in the Highcharts namespace.\n *\n * @global\n * @typedef {global.SVGElement} GlobalSVGElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The horizontal alignment of an element.\n *\n * @typedef {\"center\"|\"left\"|\"right\"} Highcharts.AlignValue\n */\n/**\n * Options to align the element relative to the chart or another box.\n *\n * @interface Highcharts.AlignObject\n */ /**\n* Horizontal alignment. Can be one of `left`, `center` and `right`.\n*\n* @name Highcharts.AlignObject#align\n* @type {Highcharts.AlignValue|undefined}\n*\n* @default left\n*/ /**\n* Vertical alignment. Can be one of `top`, `middle` and `bottom`.\n*\n* @name Highcharts.AlignObject#verticalAlign\n* @type {Highcharts.VerticalAlignValue|undefined}\n*\n* @default top\n*/ /**\n* Horizontal pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#x\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Vertical pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#y\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Use the `transform` attribute with translateX and translateY custom\n* attributes to align this elements rather than `x` and `y` attributes.\n*\n* @name Highcharts.AlignObject#alignByTranslate\n* @type {boolean|undefined}\n*\n* @default false\n*/\n/**\n * Bounding box of an element.\n *\n * @interface Highcharts.BBoxObject\n * @extends Highcharts.PositionObject\n */ /**\n* Height of the bounding box.\n*\n* @name Highcharts.BBoxObject#height\n* @type {number}\n*/ /**\n* Width of the bounding box.\n*\n* @name Highcharts.BBoxObject#width\n* @type {number}\n*/ /**\n* Horizontal position of the bounding box.\n*\n* @name Highcharts.BBoxObject#x\n* @type {number}\n*/ /**\n* Vertical position of the bounding box.\n*\n* @name Highcharts.BBoxObject#y\n* @type {number}\n*/\n/**\n * An object of key-value pairs for SVG attributes. Attributes in Highcharts\n * elements for the most parts correspond to SVG, but some are specific to\n * Highcharts, like `zIndex`, `rotation`, `rotationOriginX`,\n * `rotationOriginY`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n * attributes containing a hyphen are _not_ camel-cased, they should be\n * quoted to preserve the hyphen.\n *\n * @example\n * {\n * 'stroke': '#ff0000', // basic\n * 'stroke-width': 2, // hyphenated\n * 'rotation': 45 // custom\n * 'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n * }\n *\n * @interface Highcharts.SVGAttributes\n */ /**\n* @name Highcharts.SVGAttributes#[key:string]\n* @type {*}\n*/ /**\n* @name Highcharts.SVGAttributes#d\n* @type {string|Highcharts.SVGPathArray|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dx\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dy\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#fill\n* @type {Highcharts.ColorType|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#inverted\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#matrix\n* @type {Array<number>|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotation\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#stroke\n* @type {Highcharts.ColorType|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#style\n* @type {string|Highcharts.CSSObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#zIndex\n* @type {number|undefined}\n*/\n/**\n * An SVG DOM element. The type is a reference to the regular SVGElement in the\n * global scope.\n *\n * @typedef {globals.GlobalSVGElement} Highcharts.SVGDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The vertical alignment of an element.\n *\n * @typedef {\"bottom\"|\"middle\"|\"top\"} Highcharts.VerticalAlignValue\n */\n''; // Keeps doclets above in JS file\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
import { B as e, D as t, E as n, G as r, H as i, I as a, N as o, Q as s, T as c, U as l, V as u, Y as d, _ as f, a as p, b as m, et as h, f as g, h as _, k as v, n as y, ot as b, rt as x, s as S, u as C, v as w, y as T, z as E } from "./AnimationUtilities-Bby2idBR.js";
|
|
2
|
-
//#region node_modules/highcharts/es-modules/Core/Renderer/HTML/AST.js
|
|
3
|
-
var { SVG_NS: D, win: O } = b, { trustedTypes: k } = O, A = k && E(k.createPolicy) && k.createPolicy("highcharts", { createHTML: (e) => e }), j = A ? A.createHTML("") : "", M = class e {
|
|
4
|
-
static filterUserAttributes(t) {
|
|
5
|
-
return r(t, (n, r) => {
|
|
6
|
-
let a = !0;
|
|
7
|
-
e.allowedAttributes.indexOf(r) === -1 && (a = !1), [
|
|
8
|
-
"background",
|
|
9
|
-
"dynsrc",
|
|
10
|
-
"href",
|
|
11
|
-
"lowsrc",
|
|
12
|
-
"src"
|
|
13
|
-
].indexOf(r) !== -1 && (a = i(n) && e.allowedReferences.some((e) => n.indexOf(e) === 0)), a || (S(33, !1, void 0, { "Invalid attribute in config": `${r}` }), delete t[r]), i(n) && t[r] && (t[r] = n.replace(/</g, "<"));
|
|
14
|
-
}), t;
|
|
15
|
-
}
|
|
16
|
-
static parseStyle(e) {
|
|
17
|
-
return e.split(";").reduce((e, t) => {
|
|
18
|
-
let n = t.split(":").map((e) => e.trim()), r = n.shift();
|
|
19
|
-
return r && n.length && (e[r.replace(/-([a-z])/g, (e) => e[1].toUpperCase())] = n.join(":")), e;
|
|
20
|
-
}, {});
|
|
21
|
-
}
|
|
22
|
-
static setElementHTML(t, n) {
|
|
23
|
-
t.innerHTML = e.emptyHTML, n && new e(n).addToDOM(t);
|
|
24
|
-
}
|
|
25
|
-
constructor(e) {
|
|
26
|
-
this.nodes = typeof e == "string" ? this.parseMarkup(e) : e;
|
|
27
|
-
}
|
|
28
|
-
addToDOM(t) {
|
|
29
|
-
function n(t, i) {
|
|
30
|
-
let a;
|
|
31
|
-
return h(t).forEach(function(t) {
|
|
32
|
-
let o = t.tagName, s = t.textContent ? b.doc.createTextNode(t.textContent) : void 0, c = e.bypassHTMLFiltering, l;
|
|
33
|
-
if (o) if (o === "#text") l = s;
|
|
34
|
-
else if (e.allowedTags.indexOf(o) !== -1 || c) {
|
|
35
|
-
let a = o === "svg" ? D : i.namespaceURI || D, u = b.doc.createElementNS(a, o), d = t.attributes || {};
|
|
36
|
-
r(t, function(e, t) {
|
|
37
|
-
t !== "tagName" && t !== "attributes" && t !== "children" && t !== "style" && t !== "textContent" && (d[t] = e);
|
|
38
|
-
}), _(u, c ? d : e.filterUserAttributes(d)), t.style && m(u, t.style), s && u.appendChild(s), n(t.children || [], u), l = u;
|
|
39
|
-
} else S(33, !1, void 0, { "Invalid tagName in config": o });
|
|
40
|
-
l && i.appendChild(l), a = l;
|
|
41
|
-
}), a;
|
|
42
|
-
}
|
|
43
|
-
return n(this.nodes, t);
|
|
44
|
-
}
|
|
45
|
-
parseMarkup(t) {
|
|
46
|
-
let n = [];
|
|
47
|
-
t = t.trim().replace(/ style=(["'])/g, " data-style=$1");
|
|
48
|
-
let r;
|
|
49
|
-
try {
|
|
50
|
-
r = new DOMParser().parseFromString(A ? A.createHTML(t) : t, "text/html");
|
|
51
|
-
} catch {}
|
|
52
|
-
if (!r) {
|
|
53
|
-
let e = w("div");
|
|
54
|
-
e.innerHTML = t, r = { body: e };
|
|
55
|
-
}
|
|
56
|
-
let i = (t, n) => {
|
|
57
|
-
let r = t.nodeName.toLowerCase(), a = { tagName: r };
|
|
58
|
-
r === "#text" && (a.textContent = t.textContent || "");
|
|
59
|
-
let o = t.attributes;
|
|
60
|
-
if (o) {
|
|
61
|
-
let t = {};
|
|
62
|
-
[].forEach.call(o, (n) => {
|
|
63
|
-
n.name === "data-style" ? a.style = e.parseStyle(n.value) : t[n.name] = n.value;
|
|
64
|
-
}), a.attributes = t;
|
|
65
|
-
}
|
|
66
|
-
if (t.childNodes.length) {
|
|
67
|
-
let e = [];
|
|
68
|
-
[].forEach.call(t.childNodes, (t) => {
|
|
69
|
-
i(t, e);
|
|
70
|
-
}), e.length && (a.children = e);
|
|
71
|
-
}
|
|
72
|
-
n.push(a);
|
|
73
|
-
};
|
|
74
|
-
return [].forEach.call(r.body.childNodes, (e) => i(e, n)), n;
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
M.allowedAttributes = /* @__PURE__ */ "alt.aria-controls.aria-describedby.aria-expanded.aria-haspopup.aria-hidden.aria-label.aria-labelledby.aria-live.aria-pressed.aria-readonly.aria-roledescription.aria-selected.aria-sort.class.clip-path.color.colspan.cx.cy.d.disabled.dx.dy.fill.filterUnits.flood-color.flood-opacity.height.href.id.in.in2.markerHeight.markerWidth.offset.opacity.operator.orient.padding.paddingLeft.paddingRight.patternUnits.r.radius.refX.refY.result.role.rowspan.scope.slope.src.startOffset.stdDeviation.stroke-linecap.stroke-width.stroke.style.summary.tabindex.tableValues.target.text-align.text-anchor.textAnchor.textLength.title.type.valign.width.x.x1.x2.xlink:href.y.y1.y2.zIndex".split("."), M.allowedReferences = [
|
|
78
|
-
"https://",
|
|
79
|
-
"http://",
|
|
80
|
-
"mailto:",
|
|
81
|
-
"/",
|
|
82
|
-
"../",
|
|
83
|
-
"./",
|
|
84
|
-
"#"
|
|
85
|
-
], M.allowedTags = /* @__PURE__ */ "#text.a.abbr.b.br.button.caption.circle.clipPath.code.dd.defs.div.dl.dt.em.feComponentTransfer.feComposite.feDropShadow.feFlood.feFuncA.feFuncB.feFuncG.feFuncR.feGaussianBlur.feMerge.feMergeNode.feMorphology.feOffset.filter.h1.h2.h3.h4.h5.h6.hr.i.img.li.linearGradient.marker.ol.p.path.pattern.pre.rect.small.span.stop.strong.style.sub.sup.svg.table.tbody.td.text.textPath.th.thead.title.tr.tspan.u.ul".split("."), M.emptyHTML = j, M.bypassHTMLFiltering = !1;
|
|
86
|
-
//#endregion
|
|
87
|
-
//#region node_modules/highcharts/es-modules/Core/Templating.js
|
|
88
|
-
var { defaultOptions: N, defaultTime: P } = p, { pageLang: F } = b, I = {
|
|
89
|
-
add: (e, t) => e + t,
|
|
90
|
-
divide: (e, t) => t === 0 ? "" : f(e / t),
|
|
91
|
-
eq: (e, t) => e == t,
|
|
92
|
-
each: function(e) {
|
|
93
|
-
let t = arguments[arguments.length - 1];
|
|
94
|
-
return a(e) ? e.map((r, i) => B(t.body, n(u(r) ? r : { "@this": r }, {
|
|
95
|
-
"@index": i,
|
|
96
|
-
"@first": i === 0,
|
|
97
|
-
"@last": i === e.length - 1
|
|
98
|
-
}))).join("") : !1;
|
|
99
|
-
},
|
|
100
|
-
ge: (e, t) => e >= t,
|
|
101
|
-
gt: (e, t) => e > t,
|
|
102
|
-
if: (e) => !!e,
|
|
103
|
-
le: (e, t) => e <= t,
|
|
104
|
-
lt: (e, t) => e < t,
|
|
105
|
-
multiply: (e, t) => f(e * t, 15),
|
|
106
|
-
ne: (e, t) => e != t,
|
|
107
|
-
subtract: (e, t) => e - t,
|
|
108
|
-
ucfirst: x,
|
|
109
|
-
unless: (e) => !e
|
|
110
|
-
}, L = {}, R = (e) => /^["'].+["']$/.test(e);
|
|
111
|
-
function z(e, t, n) {
|
|
112
|
-
return P.dateFormat(e, t, n);
|
|
113
|
-
}
|
|
114
|
-
function B(e = "", t, n) {
|
|
115
|
-
let r = /\{([^{}]+)\}/g, a = /\(([^()]+)\)/g, s = [], c = /f$/, l = /\.(\d)/, u = n?.options?.lang || N.lang, f = n?.time || P, p = n?.numberFormatter || V.bind(n), m = (e = "") => {
|
|
116
|
-
let n;
|
|
117
|
-
return e === "true" ? !0 : e === "false" ? !1 : (n = Number(e)).toString() === e ? n : R(e) ? e.slice(1, -1) : o(e, t);
|
|
118
|
-
}, h, g, _ = 0, v;
|
|
119
|
-
for (; (h = r.exec(e)) !== null;) {
|
|
120
|
-
let n = h, r = a.exec(h[1]);
|
|
121
|
-
r && (h = r, v = !0), g?.isBlock || (g = {
|
|
122
|
-
ctx: t,
|
|
123
|
-
expression: h[1],
|
|
124
|
-
find: h[0],
|
|
125
|
-
isBlock: h[1].charAt(0) === "#",
|
|
126
|
-
start: h.index,
|
|
127
|
-
startInner: h.index + h[0].length,
|
|
128
|
-
length: h[0].length
|
|
129
|
-
});
|
|
130
|
-
let i = (g.isBlock ? n : h)[1].split(" ")[0].replace("#", "");
|
|
131
|
-
I[i] && (g.isBlock && i === g.fn && _++, g.fn || (g.fn = i));
|
|
132
|
-
let o = h[1] === "else";
|
|
133
|
-
if (g.isBlock && g.fn && (h[1] === `/${g.fn}` || o)) if (_) o || _--;
|
|
134
|
-
else {
|
|
135
|
-
let t = g.startInner, n = e.substr(t, h.index - t);
|
|
136
|
-
g.body === void 0 ? (g.body = n, g.startInner = h.index + h[0].length) : g.elseBody = n, g.find += n + h[0], o || (s.push(g), g = void 0);
|
|
137
|
-
}
|
|
138
|
-
else g.isBlock || s.push(g);
|
|
139
|
-
if (r && !g?.isBlock) break;
|
|
140
|
-
}
|
|
141
|
-
return s.forEach((r) => {
|
|
142
|
-
let { body: o, elseBody: s, expression: h, fn: g } = r, _, v;
|
|
143
|
-
if (g) {
|
|
144
|
-
let e = [r], i = [], a = h.length, c = 0, l;
|
|
145
|
-
for (v = 0; v <= a; v++) {
|
|
146
|
-
let e = h.charAt(v);
|
|
147
|
-
!l && (e === "\"" || e === "'") ? l = e : l === e && (l = ""), !l && (e === " " || v === a) && (i.push(h.substr(c, v - c)), c = v + 1);
|
|
148
|
-
}
|
|
149
|
-
for (v = I[g].length; v--;) e.unshift(m(i[v + 1]));
|
|
150
|
-
_ = I[g].apply(t, e), r.isBlock && typeof _ == "boolean" && (_ = B(_ ? o : s, t, n));
|
|
151
|
-
} else {
|
|
152
|
-
let e = R(h) ? [h] : h.split(":");
|
|
153
|
-
if (_ = m(e.shift() || ""), e.length && typeof _ == "number") {
|
|
154
|
-
let t = e.join(":");
|
|
155
|
-
if (c.test(t)) {
|
|
156
|
-
let e = parseInt((t.match(l) || ["", "-1"])[1], 10);
|
|
157
|
-
_ !== null && (_ = p(_, e, u.decimalPoint, t.indexOf(",") > -1 ? u.thousandsSep : ""));
|
|
158
|
-
} else _ = f.dateFormat(t, _);
|
|
159
|
-
}
|
|
160
|
-
a.lastIndex = 0, a.test(r.find) && i(_) && (_ = `"${_}"`);
|
|
161
|
-
}
|
|
162
|
-
e = e.replace(r.find, d(_, ""));
|
|
163
|
-
}), v ? B(e, t, n) : e;
|
|
164
|
-
}
|
|
165
|
-
function V(t, n, r, i) {
|
|
166
|
-
t = +t || 0, n = +n;
|
|
167
|
-
let a, o, [s, c] = t.toString().split("e").map(Number), l = this?.options?.lang || N.lang, u = (t.toString().split(".")[1] || "").split("e")[0].length, d = n, f = {};
|
|
168
|
-
r ??= l.decimalPoint, i ??= l.thousandsSep, n === -1 ? n = Math.min(u, 20) : e(n) ? n && c < 0 && (o = n + c, o >= 0 ? (s = +s.toExponential(o).split("e")[0], n = o) : (s = Math.floor(s), t = n < 20 ? +(s * 10 ** c).toFixed(n) : 0, c = 0)) : n = 2, c && (n ??= 2, t = s), e(n) && n >= 0 && (f.minimumFractionDigits = n, f.maximumFractionDigits = n), i === "" && (f.useGrouping = !1);
|
|
169
|
-
let p = i || r, m = p ? "en" : this?.locale || l.locale || F, h = JSON.stringify(f) + m;
|
|
170
|
-
return a = (L[h] ?? (L[h] = new Intl.NumberFormat(m, f))).format(t), p && (a = a.replace(/([,\.])/g, "_$1").replace(/_\,/g, i ?? ",").replace("_.", r ?? ".")), (!n && +a == 0 || c < 0 && !d) && (a = "0"), c && +a != 0 && (a += "e" + (c < 0 ? "" : "+") + c), a;
|
|
171
|
-
}
|
|
172
|
-
var H = {
|
|
173
|
-
dateFormat: z,
|
|
174
|
-
format: B,
|
|
175
|
-
helpers: I,
|
|
176
|
-
numberFormat: V
|
|
177
|
-
}, { animObject: U } = y, { defaultOptions: W } = p, { format: G } = H, K = class t {
|
|
178
|
-
constructor(e, t, n) {
|
|
179
|
-
this.formatPrefix = "point", this.visible = !0, this.point = this, this.series = e, this.applyOptions(t, n), this.id ??= C(), this.resolveColor(), this.dataLabelOnNull ??= e.options.nullInteraction, e.chart.pointCount++, this.category = e.xAxis?.categories?.[this.x] ?? this.x, this.key = this.name ?? this.category, v(this, "afterInit");
|
|
180
|
-
}
|
|
181
|
-
applyOptions(r, i, a) {
|
|
182
|
-
let o = this, s = o.series, c = s.options.pointValKey || s.pointValKey;
|
|
183
|
-
return r = t.prototype.optionsToObject.call(this, r), n(o, r), o.options = o.options ? s.chart.options.chart.allowMutatingData ? n(o.options, r) : l(o.options, r) : r, c && (o.y = t.prototype.getNestedProperty.call(o, c)), e(i) && (o.x = i), a || (o.selected && (o.state = "select"), r.group && delete o.group, r.dataLabels && delete o.dataLabels, o.isNull = o.isValid && !o.isValid(), o.formatPrefix = o.isNull ? "null" : "point"), o;
|
|
184
|
-
}
|
|
185
|
-
getOrigin({ x: e = 0, y: t = 0 }, n = {}) {
|
|
186
|
-
let { graphic: r, series: i } = this;
|
|
187
|
-
if (i.chart.inverted && r?.parentGroup && !r?.parentGroup?.rotation) {
|
|
188
|
-
let n = this.pos(!1, e, t);
|
|
189
|
-
n && (e = n[0], t = n[1]);
|
|
190
|
-
}
|
|
191
|
-
e -= (n.width || 0) / 2, t -= (n.height || 0) / 2;
|
|
192
|
-
let a = { x: e };
|
|
193
|
-
return !i.is("column") && !this.plotHigh && (a.y = t), a;
|
|
194
|
-
}
|
|
195
|
-
destroy() {
|
|
196
|
-
if (!this.condemned) {
|
|
197
|
-
let e = this, t = e.series, n = t.chart, r = n.hoverPoints, i = e.series.chart.renderer.globalAnimation, { duration: a } = U(i), o = () => {
|
|
198
|
-
(e.graphic || e.graphics || e.dataLabel || e.dataLabels) && (s(e), e.destroyElements());
|
|
199
|
-
for (let t in e) delete e[t];
|
|
200
|
-
};
|
|
201
|
-
e.legendItem && n.legend.destroyItem(e), r && (e.setState(), c(r, e), r.length || (n.hoverPoints = void 0)), e === n.hoverPoint && e.onMouseOut(), a && t.condemnedPoints ? (t.condemnedPoints.push(this), this.graphic?.addClass("highcharts-point-condemned"), setTimeout(o, a)) : o(), n.pointCount--;
|
|
202
|
-
}
|
|
203
|
-
this.condemned = !0;
|
|
204
|
-
}
|
|
205
|
-
destroyElements(e = {
|
|
206
|
-
graphic: 1,
|
|
207
|
-
dataLabel: 1
|
|
208
|
-
}) {
|
|
209
|
-
let t = this, n = [], r, i;
|
|
210
|
-
for (e.graphic && n.push("graphic", "connector"), e.dataLabel && n.push("dataLabel", "dataLabelPath", "dataLabelUpper"), i = n.length; i--;) r = n[i], t[r] && (t[r] = t[r].destroy());
|
|
211
|
-
["graphic", "dataLabel"].forEach((n) => {
|
|
212
|
-
let r = `${n}s`;
|
|
213
|
-
e[n] && t[r] && (t[r].forEach((e) => {
|
|
214
|
-
e?.element && e.destroy();
|
|
215
|
-
}), delete t[r]);
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
firePointEvent(e, t, n) {
|
|
219
|
-
let r = this, i = this.series.options;
|
|
220
|
-
r.manageEvent(e), e === "click" && i.allowPointSelect && (n = function(e) {
|
|
221
|
-
!r.condemned && r.select && r.select(null, e.ctrlKey || e.metaKey || e.shiftKey);
|
|
222
|
-
}), v(r, e, t, n);
|
|
223
|
-
}
|
|
224
|
-
getClassName() {
|
|
225
|
-
let e = this;
|
|
226
|
-
return "highcharts-point" + (e.selected ? " highcharts-point-select" : "") + (e.negative && e.series.options.negativeColor !== !1 ? " highcharts-negative" : "") + (e.isNull ? " highcharts-null-point" : "") + (e.colorIndex === void 0 ? "" : " highcharts-color-" + e.colorIndex) + (e.options.className ? " " + e.options.className : "") + (e.zone?.className ? " " + e.zone.className.replace("highcharts-negative", "") : "");
|
|
227
|
-
}
|
|
228
|
-
getNestedProperty(e) {
|
|
229
|
-
if (e) return e.indexOf("custom.") === 0 ? o(e, this.options) : this[e];
|
|
230
|
-
}
|
|
231
|
-
getZone() {
|
|
232
|
-
let e = this.series, t = e.zones, n = e.zoneAxis || "y", r, i = 0;
|
|
233
|
-
for (r = t[i]; this[n] >= r.value;) r = t[++i];
|
|
234
|
-
return this.nonZonedColor ||= this.color, this.color = r?.color && !this.options.color ? r.color : this.nonZonedColor, r;
|
|
235
|
-
}
|
|
236
|
-
hasNewShapeType() {
|
|
237
|
-
let e = this;
|
|
238
|
-
return (e.graphic && (e.graphic.symbolName || e.graphic.element.nodeName)) !== this.shapeType;
|
|
239
|
-
}
|
|
240
|
-
isValid() {
|
|
241
|
-
return (e(this.x) || this.x instanceof Date) && e(this.y);
|
|
242
|
-
}
|
|
243
|
-
optionsToObject(n) {
|
|
244
|
-
let r = this.series, i = r.options.keys, o = i || r.pointArrayMap || ["y"], s = o.length, c = {}, l, u = 0, d = 0;
|
|
245
|
-
if (e(n) || n === null) c[o[0]] = n;
|
|
246
|
-
else if (a(n)) for (!i && n.length > s && (l = typeof n[0], l === "string" ? r.xAxis?.dateTime ? c.x = r.chart.time.parse(n[0]) : c[r.tupleKey || "name"] = n[0] : l === "number" && (c.x = n[0]), u++); d < s;) (!i || n[u] !== void 0) && (c[o[d]] = n[u]), u++, d++;
|
|
247
|
-
else typeof n == "object" && (c = n, n.dataLabels && (r.hasDataLabels = () => !0), n.marker && (r._hasPointMarkers = !0));
|
|
248
|
-
return (i || !r.options.data) && Object.keys(c).forEach((e) => {
|
|
249
|
-
e.indexOf(".") > 0 && (t.prototype.setNestedProperty(c, c[e], e), delete c[e]);
|
|
250
|
-
}), c;
|
|
251
|
-
}
|
|
252
|
-
pos(t, n = this.plotX, r = this.plotY) {
|
|
253
|
-
let { series: i } = this, { chart: a, xAxis: o, yAxis: s } = i || {}, c = 0, l = 0;
|
|
254
|
-
if (a && e(n) && e(r)) return t && (c = o ? o.pos : a.plotLeft, l = s ? s.pos : a.plotTop), a.inverted && o && s ? [s.len - r + l, o.len - n + c] : [n + c, r + l];
|
|
255
|
-
}
|
|
256
|
-
resolveColor() {
|
|
257
|
-
let { options: e, series: t } = this, n = t.chart, r = n.options.chart, i = n.styledMode, a, o = r.colorCount, s;
|
|
258
|
-
if (delete this.nonZonedColor, t.options.colorByPoint) {
|
|
259
|
-
if (!i) {
|
|
260
|
-
let e = t.options.colors || n.options.colors;
|
|
261
|
-
a = e?.[t.colorCounter], o = e?.length;
|
|
262
|
-
}
|
|
263
|
-
s = t.colorCounter, t.colorCounter++, t.colorCounter === o && (t.colorCounter = 0);
|
|
264
|
-
} else i || (a = t.color), s = t.colorIndex;
|
|
265
|
-
this.colorIndex = e.colorIndex ?? s, this.color = e.color ?? a;
|
|
266
|
-
}
|
|
267
|
-
setNestedProperty(e, t, n) {
|
|
268
|
-
return n.split(".").reduce(function(e, n, r, i) {
|
|
269
|
-
return e[n] = i.length - 1 === r ? t : u(e[n], !0) ? e[n] : {}, e[n];
|
|
270
|
-
}, e), e;
|
|
271
|
-
}
|
|
272
|
-
shouldDraw() {
|
|
273
|
-
return !this.isNull;
|
|
274
|
-
}
|
|
275
|
-
tooltipFormatter(e) {
|
|
276
|
-
let { chart: t, pointArrayMap: n = ["y"], tooltipOptions: r } = this.series, { valueDecimals: i = "", valuePrefix: a = "", valueSuffix: o = "" } = r;
|
|
277
|
-
return t.styledMode && (e = t.tooltip?.styledModeFormat(e) || e), n.forEach((t) => {
|
|
278
|
-
t = "{point." + t, (a || o) && (e = e.replace(RegExp(t + "}", "g"), a + t + "}" + o)), e = e.replace(RegExp(t + "}", "g"), t + ":,." + i + "f}");
|
|
279
|
-
}), G(e, this, t);
|
|
280
|
-
}
|
|
281
|
-
update(e, t = !0, n, r) {
|
|
282
|
-
let a = this, o = a.series, s = a.graphic, c = o.chart, l = o.options, d = l.data;
|
|
283
|
-
function f() {
|
|
284
|
-
a.applyOptions(e);
|
|
285
|
-
let r = s && a.hasMockGraphic, f = a.index, p = a.y === null ? !r : r;
|
|
286
|
-
s && p && (a.graphic = s.destroy(), delete a.hasMockGraphic), u(e, !0) && (s?.element && e?.marker && e.marker.symbol !== void 0 && (a.graphic = s.destroy()), e?.dataLabels && a.dataLabel && (a.dataLabel = a.dataLabel.destroy()));
|
|
287
|
-
let m = a.optionsToObject(e);
|
|
288
|
-
o.hasProcessedDataTable || (o.dataTable.setRow(m, f), d && (d[f] = u(d[f], !0) || u(e, !0) ? a.options : e ?? d[f])), o.isDirty = o.isDirtyData = !0, "x" in m && (i(m.x) && (o.xColumnIsNumbers = void 0), a.x = o.getX(m.x), a.isNull = a.isValid && !a.isValid(), o.xColumn && (o.xColumn[f] = a.x)), !o.fixedBox && o.hasCartesianSeries && (c.isDirtyBox = !0), l.legendType === "point" && (c.isDirtyLegend = !0), t && c.redraw(n);
|
|
289
|
-
}
|
|
290
|
-
r === !1 ? f() : a.firePointEvent("update", { options: e }, f);
|
|
291
|
-
}
|
|
292
|
-
remove(e, t) {
|
|
293
|
-
this.series.removePoint(this.series.data.indexOf(this), e, t);
|
|
294
|
-
}
|
|
295
|
-
select(e, t) {
|
|
296
|
-
let n = this, r = n.series, i = r.chart;
|
|
297
|
-
e = d(e, !n.selected), this.selectedStaging = e, n.firePointEvent(e ? "select" : "unselect", { accumulate: t }, function() {
|
|
298
|
-
n.selected = n.options.selected = e, r.options.data && (r.options.data[r.data.indexOf(n)] = n.options), n.setState(e && "select"), t || i.getSelectedPoints().forEach(function(e) {
|
|
299
|
-
let t = e.series, r = t.options;
|
|
300
|
-
e.selected && e !== n && (e.selected = e.options.selected = !1, r.data && (r.data[t.data.indexOf(e)] = e.options), e.setState(i.hoverPoints && r.inactiveOtherPoints ? "inactive" : ""), e.firePointEvent("unselect"));
|
|
301
|
-
});
|
|
302
|
-
}), delete this.selectedStaging;
|
|
303
|
-
}
|
|
304
|
-
onMouseOver(e) {
|
|
305
|
-
let t = this, { inverted: n, pointer: r } = t.series.chart;
|
|
306
|
-
r && (e = e ? r.normalize(e) : r.getChartCoordinatesFromPoint(t, n), r.runPointActions(e, t));
|
|
307
|
-
}
|
|
308
|
-
onMouseOut() {
|
|
309
|
-
let e = this;
|
|
310
|
-
if (!e.series) return;
|
|
311
|
-
let t = e.series.chart;
|
|
312
|
-
e.firePointEvent("mouseOut"), e.series.options.inactiveOtherPoints || (t.hoverPoints || []).forEach(function(e) {
|
|
313
|
-
e.setState();
|
|
314
|
-
}), t.hoverPoints = t.hoverPoint = null;
|
|
315
|
-
}
|
|
316
|
-
manageEvent(e) {
|
|
317
|
-
let t = this, n = l(t.series.options.point, t.options).events?.[e];
|
|
318
|
-
E(n) && (!t.hcEvents?.[e] || t.hcEvents?.[e]?.map((e) => e.fn).indexOf(n) === -1) ? (t.importedUserEvent?.(), t.importedUserEvent = g(t, e, n), t.hcEvents && (t.hcEvents[e].userEvent = !0)) : t.importedUserEvent && !n && t.hcEvents?.[e] && t.hcEvents?.[e].userEvent && (s(t, e), delete t.hcEvents[e], Object.keys(t.hcEvents) || delete t.importedUserEvent);
|
|
319
|
-
}
|
|
320
|
-
setState(t, r) {
|
|
321
|
-
let i = this, a = i.series, o = i.state, s = a.options.states[t || "normal"] || {}, c = W.plotOptions[a.type].marker && a.options.marker, u = c && c.enabled === !1, f = c?.states?.[t || "normal"] || {}, p = f.enabled === !1, m = i.marker || {}, h = a.chart, g = c && a.markerAttribs, _ = a.halo, y, b, x, S = a.stateMarkerGraphic, C;
|
|
322
|
-
if (t ||= "", t === i.state && !r || i.selected && t !== "select" || s.enabled === !1 || t && (p || u && f.enabled === !1) || t && m.states && m.states[t] && m.states[t].enabled === !1) return;
|
|
323
|
-
if (i.state = t, g && (y = a.markerAttribs(i, t)), i.graphic && !i.hasMockGraphic) {
|
|
324
|
-
if (o && i.graphic.removeClass("highcharts-point-" + o), t && i.graphic.addClass("highcharts-point-" + t), !h.styledMode) {
|
|
325
|
-
b = a.pointAttribs(i, t), x = d(h.options.chart.animation, s.animation);
|
|
326
|
-
let n = b.opacity;
|
|
327
|
-
a.options.inactiveOtherPoints && e(n) && (i.dataLabels || []).forEach(function(e) {
|
|
328
|
-
e && !e.hasClass("highcharts-data-label-hidden") && (e.animate({ opacity: n }, x), e.connector && e.connector.animate({ opacity: n }, x));
|
|
329
|
-
}), i.graphic.animate(b, x);
|
|
330
|
-
}
|
|
331
|
-
y && i.graphic.animate(y, d(h.options.chart.animation, f.animation, c.animation)), S && S.hide();
|
|
332
|
-
} else t && f && (C = m.symbol || a.symbol, S && S.currentSymbol !== C && (S = S.destroy()), y && (S ? S[r ? "animate" : "attr"]({
|
|
333
|
-
x: y.x,
|
|
334
|
-
y: y.y
|
|
335
|
-
}) : C && (a.stateMarkerGraphic = S = h.renderer.symbol(C, y.x, y.y, y.width, y.height, l(c, f)).add(a.markerGroup), S.currentSymbol = C)), !h.styledMode && S && i.state !== "inactive" && S.attr(a.pointAttribs(i, t))), S && (S[t && i.isInside ? "show" : "hide"](), S.element.point = i, S.addClass(i.getClassName(), !0));
|
|
336
|
-
let w = s.halo, T = i.graphic || S, E = T?.visibility || "inherit";
|
|
337
|
-
w?.size && T && E !== "hidden" && !i.isCluster ? (_ || (a.halo = _ = h.renderer.path().add(T.parentGroup)), _.show()[r ? "animate" : "attr"]({ d: i.haloPath(w.size) }), _.attr({
|
|
338
|
-
class: "highcharts-halo highcharts-color-" + d(i.colorIndex, a.colorIndex) + (i.className ? " " + i.className : ""),
|
|
339
|
-
visibility: E,
|
|
340
|
-
zIndex: -1
|
|
341
|
-
}), _.point = i, h.styledMode || _.attr(n({
|
|
342
|
-
fill: i.color || a.color,
|
|
343
|
-
"fill-opacity": w.opacity
|
|
344
|
-
}, M.filterUserAttributes(w.attributes || {})))) : _?.point?.haloPath && !_.point.destroyed && _.animate({ d: _.point.haloPath(0) }, null, _.hide), v(i, "afterSetState", { state: t });
|
|
345
|
-
}
|
|
346
|
-
haloPath(e) {
|
|
347
|
-
let t = this.pos();
|
|
348
|
-
return t ? this.series.chart.renderer.symbols.circle(T(t[0], 1) - e, t[1] - e, e * 2, e * 2) : [];
|
|
349
|
-
}
|
|
350
|
-
}, { defaultOptions: q } = p, J;
|
|
351
|
-
(function(e) {
|
|
352
|
-
e.seriesTypes = b.seriesTypes;
|
|
353
|
-
function r(t, n) {
|
|
354
|
-
let r = q.plotOptions || {}, i = n.defaultOptions, a = n.prototype;
|
|
355
|
-
return a.type = t, a.pointClass ||= K, !e.seriesTypes[t] && (i && (r[t] = i), e.seriesTypes[t] = n, !0);
|
|
356
|
-
}
|
|
357
|
-
e.registerSeriesType = r;
|
|
358
|
-
function i(i, a, o, s, c) {
|
|
359
|
-
let u = q.plotOptions || {};
|
|
360
|
-
a ||= "", u[i] = l(u[a], o), delete e.seriesTypes[i];
|
|
361
|
-
let d = e.seriesTypes[a] || b.Series;
|
|
362
|
-
if (r(i, t(d, s)), e.seriesTypes[i].prototype.type = i, c) {
|
|
363
|
-
class t extends K {}
|
|
364
|
-
n(t.prototype, c), e.seriesTypes[i].prototype.pointClass = t;
|
|
365
|
-
}
|
|
366
|
-
return e.seriesTypes[i];
|
|
367
|
-
}
|
|
368
|
-
e.seriesType = i;
|
|
369
|
-
})(J ||= {});
|
|
370
|
-
var Y = J;
|
|
371
|
-
//#endregion
|
|
372
|
-
export { M as i, K as n, H as r, Y as t };
|
|
373
|
-
|
|
374
|
-
//# sourceMappingURL=SeriesRegistry-0cj0ZJqn.js.map
|