@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.
Files changed (35) hide show
  1. package/dist/{AnimationUtilities-Bby2idBR.js → AnimationUtilities-CJw-tdb_.js} +74 -83
  2. package/dist/AnimationUtilities-CJw-tdb_.js.map +1 -0
  3. package/dist/BorderRadius-CqHYi9va.js +135 -0
  4. package/dist/BorderRadius-CqHYi9va.js.map +1 -0
  5. package/dist/CenteredUtilities-BTUT7_Ld.js +1316 -0
  6. package/dist/CenteredUtilities-BTUT7_Ld.js.map +1 -0
  7. package/dist/{SVGElement-BmvC_qu3.js → SVGElement-uTuGcjav.js} +101 -103
  8. package/dist/SVGElement-uTuGcjav.js.map +1 -0
  9. package/dist/SeriesRegistry-CXsAINSj.js +376 -0
  10. package/dist/SeriesRegistry-CXsAINSj.js.map +1 -0
  11. package/dist/{TextPath-DK4Jkzd7.js → TextPath-Coabnrz0.js} +32 -34
  12. package/dist/{TextPath-DK4Jkzd7.js.map → TextPath-Coabnrz0.js.map} +1 -1
  13. package/dist/{dependency-wheel.src-BHmwx9rW.js → dependency-wheel.src-ByNiAiZS.js} +26 -27
  14. package/dist/dependency-wheel.src-ByNiAiZS.js.map +1 -0
  15. package/dist/dpuse-tool-highcharts-visualiser.es.js +2437 -2415
  16. package/dist/dpuse-tool-highcharts-visualiser.es.js.map +1 -1
  17. package/dist/highchartsMoreCustom-Cm6MkFMu.js +1178 -0
  18. package/dist/highchartsMoreCustom-Cm6MkFMu.js.map +1 -0
  19. package/dist/{pattern-fill.src-BPmr3DQg.js → pattern-fill.src-CGZp553r.js} +30 -32
  20. package/dist/{pattern-fill.src-BPmr3DQg.js.map → pattern-fill.src-CGZp553r.js.map} +1 -1
  21. package/dist/{sankey.src-DocCurOx.js → sankey.src-Buj1zAlU.js} +115 -117
  22. package/dist/sankey.src-Buj1zAlU.js.map +1 -0
  23. package/dist/{streamgraph.src-Bn6PY8Fd.js → streamgraph.src-DjMW1U2g.js} +4 -6
  24. package/dist/{streamgraph.src-Bn6PY8Fd.js.map → streamgraph.src-DjMW1U2g.js.map} +1 -1
  25. package/package.json +12 -12
  26. package/dist/AnimationUtilities-Bby2idBR.js.map +0 -1
  27. package/dist/BorderRadius-2zMZW_aK.js +0 -1445
  28. package/dist/BorderRadius-2zMZW_aK.js.map +0 -1
  29. package/dist/SVGElement-BmvC_qu3.js.map +0 -1
  30. package/dist/SeriesRegistry-0cj0ZJqn.js +0 -374
  31. package/dist/SeriesRegistry-0cj0ZJqn.js.map +0 -1
  32. package/dist/dependency-wheel.src-BHmwx9rW.js.map +0 -1
  33. package/dist/highchartsMoreCustom-CcpfmVny.js +0 -1110
  34. package/dist/highchartsMoreCustom-CcpfmVny.js.map +0 -1
  35. package/dist/sankey.src-DocCurOx.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"BorderRadius-2zMZW_aK.js","names":["setLength","splice","A","D","F","H","SeriesRegistry","T","Series","defaultOptions","format","animObject","SeriesDefaults","T","SeriesRegistry","A","H","Series","noop","SeriesRegistry","H","D","H"],"sources":["../node_modules/highcharts/es-modules/Core/Foundation.js","../node_modules/highcharts/es-modules/Data/ColumnUtils.js","../node_modules/highcharts/es-modules/Data/DataTableCore.js","../node_modules/highcharts/es-modules/Core/Legend/LegendSymbol.js","../node_modules/highcharts/es-modules/Core/Series/SeriesDefaults.js","../node_modules/highcharts/es-modules/Core/Series/Series.js","../node_modules/highcharts/es-modules/Core/Axis/Stacking/StackItem.js","../node_modules/highcharts/es-modules/Series/Column/ColumnSeriesDefaults.js","../node_modules/highcharts/es-modules/Series/Column/ColumnSeries.js","../node_modules/highcharts/es-modules/Series/CenteredUtilities.js","../node_modules/highcharts/es-modules/Extensions/BorderRadius.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 { addEvent, isFunction, objectEach, removeEvent } from '../Shared/Utilities.js';\n/* *\n *\n * Class Namespace\n *\n * */\n/** @internal */\nvar Foundation;\n(function (Foundation) {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Register event options. If an event handler is set on the options, it\n * should be subject to Chart.update, Axis.update and Series.update. This is\n * contrary to general handlers that are set directly using addEvent either\n * on the class or on the instance. #6538, #6943, #10861.\n * @internal\n */\n function registerEventOptions(component, options) {\n // A lookup over those events that are added by _options_ (not\n // programmatically). These are updated through .update()\n component.eventOptions = component.eventOptions || {};\n // Register event listeners\n objectEach(options.events, function (event, eventType) {\n // If event does not exist, or is changed by the .update()\n // function\n if (component.eventOptions[eventType] !== event) {\n // Remove existing if set by option\n if (component.eventOptions[eventType]) {\n removeEvent(component, eventType, component.eventOptions[eventType]);\n delete component.eventOptions[eventType];\n }\n if (isFunction(event)) {\n component.eventOptions[eventType] = event;\n addEvent(component, eventType, event, {\n order: 0 // #14080 fire those events as firsts\n });\n }\n }\n });\n }\n Foundation.registerEventOptions = registerEventOptions;\n})(Foundation || (Foundation = {}));\n/* *\n *\n * Default Export\n *\n * */\n/** @internal */\nexport default Foundation;\n","/* *\n *\n * (c) 2020-2026 Highsoft AS\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 * Authors:\n * - Dawid Draguła\n *\n * */\n/* *\n*\n* Functions\n*\n* */\n/**\n * Sets the length of the column array.\n *\n * @param {DataTableColumn} column\n * Column to be modified.\n *\n * @param {number} length\n * New length of the column.\n *\n * @param {boolean} asSubarray\n * If column is a typed array, return a subarray instead of a new array. It\n * is faster `O(1)`, but the entire buffer will be kept in memory until all\n * views of it are destroyed. Default is `false`.\n *\n * @return {DataTableColumn}\n * Modified column.\n *\n * @private\n */\nexport function setLength(column, length, asSubarray) {\n if (Array.isArray(column)) {\n column.length = length;\n return column;\n }\n return column[asSubarray ? 'subarray' : 'slice'](0, length);\n}\n/**\n * Splices a column array.\n *\n * @param {DataTableColumn} column\n * Column to be modified.\n *\n * @param {number} start\n * Index at which to start changing the array.\n *\n * @param {number} deleteCount\n * An integer indicating the number of old array elements to remove.\n *\n * @param {boolean} removedAsSubarray\n * If column is a typed array, return a subarray instead of a new array. It\n * is faster `O(1)`, but the entire buffer will be kept in memory until all\n * views to it are destroyed. Default is `true`.\n *\n * @param {Array<number>|TypedArray} items\n * The elements to add to the array, beginning at the start index. If you\n * don't specify any elements, `splice()` will only remove elements from the\n * array.\n *\n * @return {SpliceResult}\n * Object containing removed elements and the modified column.\n *\n * @private\n */\nexport function splice(column, start, deleteCount, removedAsSubarray, items = []) {\n if (Array.isArray(column)) {\n if (!Array.isArray(items)) {\n items = Array.from(items);\n }\n return {\n removed: column.splice(start, deleteCount, ...items),\n array: column\n };\n }\n const Constructor = Object.getPrototypeOf(column)\n .constructor;\n const removed = column[removedAsSubarray ? 'subarray' : 'slice'](start, start + deleteCount);\n const newLength = column.length - deleteCount + items.length;\n const result = new Constructor(newLength);\n result.set(column.subarray(0, start), 0);\n result.set(items, start);\n result.set(column.subarray(start + deleteCount), start + items.length);\n return {\n removed: removed,\n array: result\n };\n}\n/**\n * Converts a cell value to a number.\n *\n * @param {DataTableCellType} value\n * Cell value to convert to a number.\n *\n * @param {boolean} useNaN\n * If `true`, returns `NaN` for non-numeric values; if `false`,\n * returns `null` instead.\n *\n * @return {number | null}\n * Number or `null` if the value is not a number.\n *\n * @private\n */\nexport function convertToNumber(value, useNaN) {\n switch (typeof value) {\n case 'boolean':\n return (value ? 1 : 0);\n case 'number':\n return (isNaN(value) && !useNaN ? null : value);\n default:\n value = parseFloat(`${value ?? ''}`);\n return (isNaN(value) && !useNaN ? null : value);\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nconst ColumnUtils = {\n convertToNumber,\n setLength,\n splice\n};\nexport default ColumnUtils;\n","/* *\n *\n * (c) 2009-2026 Highsoft AS\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 * Authors:\n * - Sophie Bremer\n * - Gøran Slettemark\n * - Torstein Hønsi\n *\n * */\n'use strict';\nimport ColumnUtils from './ColumnUtils.js';\nconst { setLength, splice } = ColumnUtils;\nimport { fireEvent, objectEach } from '../Shared/Utilities.js';\nimport { uniqueKey } from '../Core/Utilities.js';\n/* *\n *\n * Class\n *\n * */\n/**\n * Class to manage columns and rows in a table structure. It provides methods\n * to add, remove, and manipulate columns and rows, as well as to retrieve data\n * from specific cells.\n *\n * Highcharts allows passing a `DataTable` or a configuration object for a data\n * table in the `dataTable` property, either chart-level\n * [dataTable](https://api.highcharts.com/highcharts/dataTable) or as\n * [series.dataTable](https://api.highcharts.com/highcharts/series.dataTable).\n * The `DataTable` is then used as a source for the series data points, mapped\n * by the `series.dataMapping` option.\n *\n * After chart instantiation, the data table can be accessed from the series as\n * `series.dataTable`. CRUD operations on the data table will be reflected in\n * the chart.\n *\n * @example\n * const dataTable = new Highcharts.DataTable({\n * columns: {\n * year: [2020, 2021, 2022, 2023],\n * cost: [11, 13, 12, 14],\n * revenue: [12, 15, 14, 18]\n * }\n * });\n *\n * @class\n * @name Highcharts.DataTable\n *\n * @param {Highcharts.DataTableOptionsObject} [options]\n * Options to initialize the new DataTable instance.\n */\nclass DataTableCore {\n constructor(options = {}) {\n this.isDataTable = true;\n this.autoId = !options.id;\n this.columns = {};\n this.id = (options.id || uniqueKey());\n this.rowCount = 0;\n this.versionTag = uniqueKey();\n let rowCount = 0;\n objectEach(options.columns || {}, (column, columnId) => {\n this.columns[columnId] = column.slice();\n rowCount = Math.max(rowCount, column.length);\n });\n this.applyRowCount(rowCount);\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Applies a row count to the table by setting the `rowCount` property and\n * adjusting the length of all columns.\n *\n * @private\n * @param {number} rowCount The new row count.\n */\n applyRowCount(rowCount) {\n this.rowCount = rowCount;\n objectEach(this.columns, (column, columnId) => {\n if (column.length !== rowCount) {\n this.columns[columnId] = setLength(column, rowCount);\n }\n });\n }\n /**\n * Delete rows. Simplified version of the full\n * `DataTable.deleteRows` method.\n *\n * @sample highcharts/datatable/live-chart/\n * Add and delete rows in a live chart\n * @sample highcharts/datatable/shared-with-grid/\n * Chart with data table CRUD operations\n *\n * @function Highcharts.DataTable#deleteRows\n *\n * @param {number} rowIndex\n * The start row index\n *\n * @param {number} [rowCount=1]\n * The number of rows to delete\n *\n * @return {void}\n *\n * @emits #afterDeleteRows\n */\n deleteRows(rowIndex, rowCount = 1) {\n if (rowCount > 0 && rowIndex < this.rowCount) {\n let length = 0;\n objectEach(this.columns, (column, columnId) => {\n this.columns[columnId] =\n splice(column, rowIndex, rowCount).array;\n length = column.length;\n });\n this.rowCount = length;\n }\n fireEvent(this, 'afterDeleteRows', { rowIndex, rowCount });\n this.versionTag = uniqueKey();\n }\n /**\n * Fetches the given column by the canonical column ID. Simplified version\n * of the full `DataTable.getRow` method, always returning by reference.\n *\n * @function Highcharts.DataTable#setColumn\n *\n * @param {string} columnId\n * ID of the column to get.\n *\n * @return {Highcharts.DataTableColumn|undefined}\n * A copy of the column, or `undefined` if not found.\n */\n getColumn(columnId, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n asReference) {\n return this.columns[columnId];\n }\n /**\n * Retrieves all or the given columns. Simplified version of the full\n * `DataTable.getColumns` method, always returning by reference.\n *\n * @function Highcharts.DataTable#getColumns\n *\n * @param {Array<string>} [columnIds]\n * Column ids to retrieve.\n *\n * @return {Highcharts.DataTableColumnCollection}\n * Collection of columns. If a requested column was not found, it is\n * `undefined`.\n */\n getColumns(columnIds, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n asReference) {\n return (columnIds || Object.keys(this.columns)).reduce((columns, columnId) => {\n columns[columnId] = this.columns[columnId];\n return columns;\n }, {});\n }\n /**\n * Retrieves the row at a given index.\n *\n * @function Highcharts.DataTable#getRowObject\n *\n * @param {number} rowIndex\n * Row index to retrieve. First row has index 0.\n *\n * @param {Array<string>} [columnNames]\n * Column names to retrieve.\n *\n * @return {Record<string, number|string|undefined>|undefined}\n * Returns the row values, or `undefined` if not found.\n */\n getRowObject(rowIndex, columnNames) {\n const row = {}, columns = this.columns;\n columnNames ?? (columnNames = Object.keys(this.columns));\n for (const columnName of columnNames) {\n row[columnName] = columns[columnName]?.[rowIndex];\n }\n return row;\n }\n /**\n * Sets cell values for a column. Will insert a new column, if not found.\n *\n * @function Highcharts.DataTable#setColumn\n *\n * @param {string} columnId\n * Column name to set.\n *\n * @param {Highcharts.DataTableColumn} [column]\n * Values to set in the column.\n *\n * @param {number} [rowIndex]\n * Index of the first row to change. (Default: 0)\n *\n * @param {Record<string, (boolean|number|string|null|undefined)>} [eventDetail]\n * Custom information for pending events.\n *\n * @emits #setColumns\n * @emits #afterSetColumns\n */\n setColumn(columnId, column = [], rowIndex = 0, eventDetail) {\n this.setColumns({ [columnId]: column }, rowIndex, eventDetail);\n }\n /**\n * Sets cell values for multiple columns. Will insert new columns, if not\n * found. Simplified version of the full `DataTable.setColumns`, limited\n * to full replacement of the columns (undefined `rowIndex`).\n *\n * @sample highcharts/datatable/shared-with-grid/\n * Chart with data table CRUD operations\n *\n * @function Highcharts.DataTable#setColumns\n *\n * @param {Highcharts.DataTableColumnCollection} columns\n * Columns as a collection, where the keys are the column names.\n *\n * @param {number} [rowIndex]\n * Index of the first row to change. Ignored in the simplified `DataTable`,\n * as it always replaces the full column.\n *\n * @param {Record<string, (boolean|number|string|null|undefined)>} [eventDetail]\n * Custom information for pending events.\n *\n * @emits #setColumns\n * @emits #afterSetColumns\n */\n setColumns(columns, rowIndex, eventDetail) {\n let rowCount = this.rowCount;\n objectEach(columns, (column, columnId) => {\n this.columns[columnId] = column.slice();\n rowCount = column.length;\n });\n this.applyRowCount(rowCount);\n if (!eventDetail?.silent) {\n fireEvent(this, 'afterSetColumns');\n this.versionTag = uniqueKey();\n }\n }\n /**\n * Sets cell values of a row. Will insert a new row if no index was\n * provided, or if the index is higher than the total number of table rows.\n * A simplified version of the full `DateTable.setRow`, limited to objects.\n *\n * @sample highcharts/datatable/live-chart/\n * Add and delete rows in a live chart\n * @sample stock/datatable/live-candlestick/\n * Live candlestick\n * @sample highcharts/datatable/shared-with-grid/\n * Chart with data table CRUD operations\n *\n * @function Highcharts.DataTable#setRow\n *\n * @param {Record<string, number|string|undefined>} row\n * Cell values to set.\n *\n * @param {number} [rowIndex]\n * Index of the row to set. Leave `undefined` to add as a new row.\n *\n * @param {boolean} [insert]\n * Whether to insert the row at the given index, or to overwrite the row.\n *\n * @param {Record<string, (boolean|number|string|null|undefined)>} [eventDetail]\n * Custom information for pending events.\n *\n * @emits #afterSetRows\n */\n setRow(row, rowIndex = this.rowCount, insert, eventDetail) {\n var _a;\n const { columns } = this, indexRowCount = insert ? this.rowCount + 1 : rowIndex + 1, rowKeys = Object.keys(row);\n if (eventDetail?.addColumns !== false) {\n for (let i = 0, iEnd = rowKeys.length; i < iEnd; i++) {\n columns[_a = rowKeys[i]] || (columns[_a] = new Array(this.rowCount));\n }\n }\n objectEach(columns, (column, columnId) => {\n if (column) {\n if (insert) {\n column = splice(column, rowIndex, 0, true, [row[columnId]]).array;\n }\n else {\n column[rowIndex] =\n // Preserve explicit null and undefined but fall back\n // to existing value if the new row does not have the\n // key\n columnId in row ?\n row[columnId] :\n column[rowIndex];\n }\n columns[columnId] = column;\n }\n });\n this.applyRowCount(Math.max(indexRowCount, this.rowCount));\n if (!eventDetail?.silent) {\n fireEvent(this, 'afterSetRows', { rowIndex });\n this.versionTag = uniqueKey();\n }\n }\n /**\n * Returns the modified (clone) or the original data table if the modified\n * one does not exist.\n *\n * @return {Highcharts.DataTable}\n * The modified (clone) or the original data table.\n */\n getModified() {\n return this.modified || this;\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nexport default DataTableCore;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A collection of data table columns defined by a object where the key is the\n * column ID and the value is an array of the column values. Typed arrays are\n * supported.\n *\n * @type {Highcharts.DataTableColumnCollection|undefined}\n * @apioption dataTable.columns\n */\n/**\n * Custom ID to identify the new DataTable instance.\n *\n * @type {string|undefined}\n * @apioption dataTable.id\n */\n/**\n * A typed array.\n * @typedef {Int8Array|Uint8Array|Uint8ClampedArray|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array|Float64Array} Highcharts.TypedArray\n */ /**\n* A column of values in a data table.\n* @typedef {Array<boolean|null|number|string|undefined>|Highcharts.TypedArray} Highcharts.DataTableColumn\n*/ /**\n* A collection of data table columns defined by a object where the key is the\n* column ID and the value is an array of the column values. Typed arrays are\n* supported.\n* @typedef {Record<string, Highcharts.DataTableColumn>} Highcharts.DataTableColumnCollection\n*/\n/**\n * Options for the `DataTable` or `DataTableCore` classes.\n * @interface Highcharts.DataTableOptionsObject\n */ /**\n* The column options for the data table. The columns are defined by an object\n* where the key is the column ID and the value is an array of the column\n* values.\n*\n* @name Highcharts.DataTableOptionsObject.columns\n* @type {Highcharts.DataTableColumnCollection|undefined}\n*/ /**\n* Custom ID to identify the new DataTable instance.\n*\n* @name Highcharts.DataTableOptionsObject.id\n* @type {string|undefined}\n*/\n(''); // Keeps doclets above in JS file\n","/* *\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 { extend, merge, pick } from '../../Shared/Utilities.js';\n/* *\n *\n * Namespace\n *\n * */\nvar LegendSymbol;\n(function (LegendSymbol) {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Draw a line, a point marker and an area in the legend.\n *\n * @function Highcharts.LegendSymbolMixin.areaMarker\n *\n * @param {Highcharts.Legend} legend\n * The legend object.\n */\n function areaMarker(legend, item) {\n lineMarker.call(this, legend, item, true);\n }\n LegendSymbol.areaMarker = areaMarker;\n /**\n * Draw a line and a point marker in the legend.\n *\n * @function Highcharts.LegendSymbolMixin.lineMarker\n *\n * @param {Highcharts.Legend} legend\n * The legend object.\n */\n function lineMarker(legend, item, hasArea) {\n const legendItem = this.legendItem = this.legendItem || {}, { chart, options } = this, { baseline = 0, symbolWidth, symbolHeight } = legend, symbol = this.symbol || 'circle', generalRadius = symbolHeight / 2, renderer = chart.renderer, legendItemGroup = legendItem.group, verticalCenter = baseline - Math.round((legend.fontMetrics?.b || symbolHeight) *\n // Render line and marker slightly higher to make room for the\n // area\n (hasArea ? 0.4 : 0.3)), attr = {};\n let legendSymbol, markerOptions = options.marker, lineSizer = 0;\n // Draw the line\n if (!chart.styledMode) {\n attr['stroke-width'] = Math.min(options.lineWidth || 0, 24);\n if (options.dashStyle) {\n attr.dashstyle = options.dashStyle;\n }\n else if (options.linecap !== 'square') {\n attr['stroke-linecap'] = 'round';\n }\n }\n legendItem.line = renderer\n .path()\n .addClass('highcharts-graph')\n .attr(attr)\n .add(legendItemGroup);\n if (hasArea) {\n legendItem.area = renderer\n .path()\n .addClass('highcharts-area')\n .add(legendItemGroup);\n }\n if (attr['stroke-linecap']) {\n lineSizer = Math.min(legendItem.line.strokeWidth(), symbolWidth) / 2;\n }\n if (symbolWidth) {\n const d = [\n ['M', lineSizer, verticalCenter],\n ['L', symbolWidth - lineSizer, verticalCenter]\n ];\n legendItem.line.attr({ d });\n legendItem.area?.attr({\n d: [\n ...d,\n ['L', symbolWidth - lineSizer, baseline],\n ['L', lineSizer, baseline]\n ]\n });\n }\n // Draw the marker\n if (markerOptions && markerOptions.enabled !== false && symbolWidth) {\n // Do not allow the marker to be larger than the symbolHeight\n let radius = Math.min(pick(markerOptions.radius, generalRadius), generalRadius);\n // Restrict symbol markers size\n if (symbol.indexOf('url') === 0) {\n markerOptions = merge(markerOptions, {\n width: symbolHeight,\n height: symbolHeight\n });\n radius = 0;\n }\n legendItem.symbol = legendSymbol = renderer\n .symbol(symbol, (symbolWidth / 2) - radius, verticalCenter - radius, 2 * radius, 2 * radius, extend({ context: 'legend' }, markerOptions))\n .addClass('highcharts-point')\n .add(legendItemGroup);\n legendSymbol.isMarker = true;\n }\n }\n LegendSymbol.lineMarker = lineMarker;\n})(LegendSymbol || (LegendSymbol = {}));\n/* *\n *\n * Default Export\n *\n * */\nexport default LegendSymbol;\n","/* *\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';\n/* *\n *\n * API Options\n *\n * */\n/**\n * General options for all series types.\n *\n * @optionparent plotOptions.series\n */\nconst seriesDefaults = {\n // Base series options\n /**\n * Pixel width of the graph line.\n *\n * @see In styled mode, the line stroke-width can be set with the\n * `.highcharts-graph` class name.\n *\n * @sample {highcharts} highcharts/plotoptions/series-linewidth-general/\n * On all series\n * @sample {highcharts} highcharts/plotoptions/series-linewidth-specific/\n * On one single series\n *\n * @product highcharts highstock\n */\n lineWidth: 2,\n /**\n * For some series, there is a limit that shuts down animation\n * by default when the total number of points in the chart is too high.\n * For example, for a column chart and its derivatives, animation does\n * not run if there is more than 250 points totally. To disable this\n * cap, set `animationLimit` to `Infinity`. This option works if animation\n * is fired on individual points, not on a group of points like e.g. during\n * the initial animation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-animationlimit/\n * Animation limit on updating individual points\n *\n * @type {number}\n * @apioption plotOptions.series.animationLimit\n */\n /**\n * Allow this series' points to be selected by clicking on the graphic\n * (columns, point markers, pie slices, map areas etc).\n *\n * The selected points can be handled by point select and unselect\n * events, or collectively by the [getSelectedPoints\n * ](/class-reference/Highcharts.Chart#getSelectedPoints) function.\n *\n * And alternative way of selecting points is through dragging.\n *\n * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-line/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-pie/\n * Pie\n * @sample {highcharts} highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Map area\n * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n * Map bubble\n *\n * @since 1.2.0\n */\n allowPointSelect: false,\n /**\n * When true, each point or column edge is rounded to its nearest pixel\n * in order to render sharp on screen. In some cases, when there are a\n * lot of densely packed columns, this leads to visible difference\n * in column widths or distance between columns. In these cases,\n * setting `crisp` to `false` may look better, even though each column\n * is rendered blurry.\n *\n * @sample {highcharts} highcharts/plotoptions/column-crisp-false/\n * Crisp is false\n *\n * @since 5.0.10\n * @product highcharts highstock gantt\n */\n crisp: true,\n /**\n * If true, a checkbox is displayed next to the legend item to allow\n * selecting the series. The state of the checkbox is determined by\n * the `selected` option.\n *\n * @productdesc {highmaps}\n * Note that if a `colorAxis` is defined, the color axis is represented\n * in the legend, not the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-showcheckbox-true/\n * Show select box\n *\n * @since 1.2.0\n */\n showCheckbox: false,\n /**\n * Enable or disable the initial animation when a series is displayed.\n * The animation can also be set as a configuration object. Please\n * note that this option only applies to the initial animation of the\n * series itself. For other animations, see [chart.animation](\n * #chart.animation) and the animation parameter under the API methods.\n * The following properties are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * - `duration`: The duration of the animation in milliseconds. (Defaults to\n * `1000`)\n *\n * - `easing`: Can be a string reference to an easing function set on\n * the `Math` object or a function. See the _Custom easing function_\n * demo below. (Defaults to `easeInOutSine`)\n *\n * Due to poor performance, animation is disabled in old IE browsers\n * for several chart types.\n *\n * @sample {highcharts} highcharts/plotoptions/series-animation-disabled/\n * Animation disabled\n * @sample {highcharts} highcharts/plotoptions/series-animation-slower/\n * Slower animation\n * @sample {highcharts} highcharts/plotoptions/series-animation-easing/\n * Custom easing function\n * @sample {highstock} stock/plotoptions/animation-slower/\n * Slower animation\n * @sample {highstock} stock/plotoptions/animation-easing/\n * Custom easing function\n * @sample {highmaps} maps/plotoptions/series-animation-true/\n * Animation enabled on map series\n * @sample {highmaps} maps/plotoptions/mapbubble-animation-false/\n * Disabled on mapbubble series\n *\n * @type {boolean|Highcharts.AnimationOptionsObject}\n * @default {highcharts} true\n * @default {highstock} true\n * @default {highmaps} false\n */\n animation: {\n /** @ignore-option */\n duration: 1000\n },\n /**\n * An additional class name to apply to the series' graphical elements.\n * This option does not replace default class names of the graphical\n * element. Changes to the series' color will also be reflected in a\n * chart's legend and tooltip.\n *\n * @sample {highcharts} highcharts/css/point-series-classname\n * Series and point class name\n *\n * @basic\n * @type {string}\n * @since 5.0.0\n * @apioption plotOptions.series.className\n */\n /**\n * Disable this option to allow series rendering in the whole plotting\n * area.\n *\n * **Note:** Clipping should be always enabled when\n * [chart.zoomType](#chart.zoomType) is set\n *\n * @sample {highcharts} highcharts/plotoptions/series-clip/\n * Disabled clipping\n *\n * @default true\n * @type {boolean}\n * @since 3.0.0\n * @apioption plotOptions.series.clip\n */\n /**\n * The main color of the series. In line type series it applies to the\n * line and the point markers unless otherwise specified. In bar type\n * series it applies to the bars unless a color is specified per point.\n * The default value is pulled from the `options.colors` array.\n *\n * In styled mode, the color can be defined by the\n * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n * color can be set with the `.highcharts-series`,\n * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n * `.highcharts-series-{n}` class, or individual classes given by the\n * `className` option.\n *\n * @productdesc {highmaps}\n * In maps, the series color is rarely used, as most choropleth maps use\n * the color to denote the value of each point. The series color can\n * however be used in a map with multiple series holding categorized\n * data.\n *\n * @sample {highcharts} highcharts/plotoptions/series-color-general/\n * General plot option\n * @sample {highcharts} highcharts/plotoptions/series-color-specific/\n * One specific series\n * @sample {highcharts} highcharts/plotoptions/series-color-area/\n * Area color\n * @sample {highcharts} highcharts/series/infographic/\n * Pattern fill\n * @sample {highmaps} maps/demo/category-map/\n * Category map by multiple series\n *\n * @basic\n * @type {Highcharts.ColorType}\n * @apioption plotOptions.series.color\n */\n /**\n * Styled mode only. A specific color index to use for the series, so its\n * graphic representations are given the class name `highcharts-color-{n}`.\n *\n * Since v11, CSS variables on the form `--highcharts-color-{n}` make\n * changing the color scheme very convenient.\n *\n * @sample {highcharts} highcharts/css/colorindex/\n * Series and point color index\n *\n * @type {number}\n * @since 5.0.0\n * @apioption plotOptions.series.colorIndex\n */\n /**\n * Whether to connect a graph line across null points, or render a gap\n * between the two points on either side of the null.\n *\n * In stacked area chart, if `connectNulls` is set to true,\n * null points are interpreted as 0.\n *\n * @sample {highcharts} highcharts/plotoptions/series-connectnulls-false/\n * False by default\n * @sample {highcharts} highcharts/plotoptions/series-connectnulls-true/\n * True\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock\n * @apioption plotOptions.series.connectNulls\n */\n /**\n * You can set the cursor to \"pointer\" if you have click events attached\n * to the series, to signal to the user that the points and lines can\n * be clicked.\n *\n * In styled mode, the series cursor can be set with the same classes\n * as listed under [series.color](#plotOptions.series.color).\n *\n * @sample {highcharts} highcharts/plotoptions/series-cursor-line/\n * On line graph\n * @sample {highcharts} highcharts/plotoptions/series-cursor-column/\n * On columns\n * @sample {highcharts} highcharts/plotoptions/series-cursor-scatter/\n * On scatter markers\n * @sample {highstock} stock/plotoptions/cursor/\n * Pointer on a line graph\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Map area\n * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n * Map bubble\n *\n * @type {string|Highcharts.CursorValue}\n * @apioption plotOptions.series.cursor\n */\n /**\n * A reserved subspace to store options and values for customized\n * functionality. Here you can add additional data for your own event\n * callbacks and formatter callbacks.\n *\n * @sample {highcharts} highcharts/point/custom/\n * Point and series with custom data\n *\n * @type {Highcharts.Dictionary<*>}\n * @apioption plotOptions.series.custom\n */\n /**\n * Name of the dash style to use for the graph, or for some series types\n * the outline of each shape.\n *\n * In styled mode, the\n * [stroke dash-array](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/series-dashstyle/)\n * can be set with the same classes as listed under\n * [series.color](#plotOptions.series.color).\n *\n * @sample {highcharts} highcharts/plotoptions/series-dashstyle-all/\n * Possible values demonstrated\n * @sample {highcharts} highcharts/plotoptions/series-dashstyle/\n * Chart suitable for printing in black and white\n * @sample {highstock} highcharts/plotoptions/series-dashstyle-all/\n * Possible values demonstrated\n * @sample {highmaps} highcharts/plotoptions/series-dashstyle-all/\n * Possible values demonstrated\n * @sample {highmaps} maps/plotoptions/series-dashstyle/\n * Dotted borders on a map\n *\n * @type {Highcharts.DashStyleValue}\n * @default Solid\n * @since 2.1\n * @apioption plotOptions.series.dashStyle\n */\n /**\n * Deprecated. Use\n * [plotOptions.series.accessibility.description](#plotOptions.series.accessibility.description)\n * instead.\n *\n * A description of the series to add to the screen reader information\n * about the series.\n *\n * @deprecated 8.0.0\n * @type {string}\n * @since 5.0.0\n * @requires modules/accessibility\n * @apioption plotOptions.series.description\n */\n /**\n * The mapping between the data table and the series data points. This is\n * used in conjunction with the `dataTable` option (on [chart](#dataTable)\n * or [series](#plotOptions.series.dataTable) level) to map columns from the\n * data table to the properties of the data points. The keys of the\n * `dataMapping` object correspond to the properties of the data points\n * (e.g. `x`, `y`, `name`), and the values are objects that specify which\n * column from which data table to use for that property.\n *\n * The keys can also be nested paths, for example `dataLabel.format`, to map\n * to nested properties of the data points.\n *\n * The values can also be strings, in which case they are interpreted as\n * column id's from the first data table.\n *\n * A typical use case is that multiple series share a common column, like\n * `name` or `x`. In this case, to avoid repetition, the common column can\n * be applied in `plotOptions.series.dataMapping` and the individual series\n * can specify only the columns that are unique to them.\n *\n * The series name defaults to the column ID of the main data column in the\n * mapping. The main data column is typically the `y` data for cartesian\n * series, or `value` for map series. For example, if the mapping is\n * `{ y: 'Cost' }`, the series name will be `Cost`.\n *\n * ```js\n * // Shorthand mapping with string\n * dataMapping: {\n * y: 'Cost'\n * }\n *\n * // Full mapping with object\n * dataMapping: {\n * y: {\n * // Optional, defaults to the first data table. Can be either a data\n * // table index or id.\n * dataTable: 'dataTable1',\n * // Can be either a column index or id.\n * column: 'Cost'\n * }\n * }\n * ```\n *\n * If the columns of the DataTable have keys matching the series keys, the\n * data mapping is not necessary. For example, this DataTable will connect\n * directly to the series' `x` and `y` keys:\n *\n * ```js\n * const dataTable = new Highcharts.DataTable({\n * columns: {\n * x: ['2026-05-04', '2026-05-05', '2026-05-06'],\n * y: [1, 4, 2]\n * }\n * });\n * ```\n *\n * @type {Highcharts.DataMappingOptionsObject}\n * @sample {highcharts} highcharts/datatable/series-datatable-multiple\n * Series with two data tables\n * @sample {highcharts} highcharts/datatable/nested-keys\n * Nested keys\n * @sample {highcharts} highcharts/datatable/chart-datatable-multiple\n * Chart with two data tables\n *\n * @since 13.0.0\n * @apioption plotOptions.series.dataMapping\n */\n /**\n * Enable or disable the mouse tracking for a specific series. This\n * includes point tooltips and click events on graphs and points. For\n * large datasets it improves performance.\n *\n * @sample {highcharts} highcharts/plotoptions/series-enablemousetracking-false/\n * No mouse tracking\n * @sample {highmaps} maps/plotoptions/series-enablemousetracking-false/\n * No mouse tracking\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.enableMouseTracking\n */\n enableMouseTracking: true,\n /**\n * Whether to use the Y extremes of the total chart width or only the\n * zoomed area when zooming in on parts of the X axis. By default, the\n * Y axis adjusts to the min and max of the visible data. Cartesian\n * series only.\n *\n * @type {boolean}\n * @default false\n * @since 4.1.6\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.getExtremesFromAll\n */\n /**\n * Highlight only the hovered point and fade the remaining points.\n *\n * Scatter-type series require enabling the 'inactive' marker state and\n * adjusting opacity. Note that this approach could affect performance\n * with large datasets.\n *\n * @sample {highcharts} highcharts/plotoptions/series-inactiveotherpoints-enabled/\n * Chart with inactiveOtherPoints option enabled.\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.inactiveOtherPoints\n */\n /**\n * An array specifying which option maps to which key in the data point\n * array. This makes it convenient to work with unstructured data arrays\n * from different sources.\n *\n * @see [series.data](#series.line.data)\n *\n * @sample {highcharts|highstock} highcharts/series/data-keys/\n * An extended data array with keys\n * @sample {highcharts|highstock} highcharts/series/data-nested-keys/\n * Nested keys used to access object properties\n *\n * @type {Array<string>}\n * @since 4.1.6\n * @apioption plotOptions.series.keys\n */\n /**\n * The line cap used for line ends and line joins on the graph.\n *\n * @productdesc {highcharts|highstock}\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n * of a line graph. Round means that lines are rounded in the ends and\n * bends.\n *\n * @sample highcharts/series-line/linecap/\n * Line cap comparison\n *\n * @type {Highcharts.SeriesLinecapValue}\n * @default round\n * @since 3.0.7\n * @apioption plotOptions.series.linecap\n */\n /**\n * The [id](#series.id) of another series to link to. Additionally,\n * the value can be \":previous\" to link to the previous series. When\n * two series are linked, only the first one appears in the legend.\n * Toggling the visibility of this also toggles the linked series.\n *\n * If master series uses data sorting and linked series does not have\n * its own sorting definition, the linked series will be sorted in the\n * same order as the master one.\n *\n * If a `compare` value is not set on a linked series, it will be inherited\n * from the parent series.\n *\n * @sample {highcharts|highstock} highcharts/demo/arearange-line/\n * Linked series\n *\n * @type {string}\n * @since 3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.linkedTo\n */\n /**\n * Options for the corresponding navigator series if `showInNavigator`\n * is `true` for this series. Available options are the same as any\n * series, documented at [plotOptions](#plotOptions.series) and\n * [series](#series).\n *\n * These options are merged with options in [navigator.series](\n * #navigator.series), and will take precedence if the same option is\n * defined both places.\n *\n * @see [navigator.series](#navigator.series)\n *\n * @type {Highcharts.PlotSeriesOptions}\n * @since 5.0.0\n * @product highstock\n * @apioption plotOptions.series.navigatorOptions\n */\n /**\n * The color for the parts of the graph or points that are below the\n * [threshold](#plotOptions.series.threshold). Note that `zones` takes\n * precedence over the negative color. Using `negativeColor` is\n * equivalent to applying a zone with value of 0.\n *\n * @see In styled mode, a negative color is applied by setting this option\n * to `true` combined with the `.highcharts-negative` class name.\n *\n * @sample {highcharts} highcharts/plotoptions/series-negative-color/\n * Spline, area and column\n * @sample {highcharts} highcharts/plotoptions/arearange-negativecolor/\n * Arearange\n * @sample {highcharts} highcharts/css/series-negative-color/\n * Styled mode\n * @sample {highstock} highcharts/plotoptions/series-negative-color/\n * Spline, area and column\n * @sample {highstock} highcharts/plotoptions/arearange-negativecolor/\n * Arearange\n * @sample {highmaps} highcharts/plotoptions/series-negative-color/\n * Spline, area and column\n * @sample {highmaps} highcharts/plotoptions/arearange-negativecolor/\n * Arearange\n *\n * @type {Highcharts.ColorType}\n * @since 3.0\n * @apioption plotOptions.series.negativeColor\n */\n /**\n * Whether or not data-points with the value of `null` should be interactive.\n * When this is set to `true`, tooltips may highlight these points, and this\n * option also enables keyboard navigation for such points. Format options\n * for such points include [`nullFormat`](#tooltip.nullFormat) and\n * [`nullFormatter`](#tooltip.nullFormatter). Works for these series:\n * `line`, `spline`, `area`, `area-spline`, `column`, `bar`, and\n * `timeline`.\n *\n * @sample {highcharts} highcharts/series/null-interaction/\n * Chart with interactive `null` points\n *\n * @sample {highcharts} highcharts/series-timeline/null-interaction/\n * Timeline series with `null` points\n *\n * @type {boolean|undefined}\n * @product highcharts highstock\n * @apioption plotOptions.series.nullInteraction\n */\n /**\n * Deprecated. Use\n * [series.accessibility.point.descriptionFormat](#plotOptions.series.accessibility.point.descriptionFormat)\n * instead.\n *\n * Same as\n * [accessibility.point.descriptionFormat](#accessibility.point.descriptionFormat),\n * but for an individual series. Overrides the chart wide configuration.\n *\n * @type {Function}\n * @requires modules/accessibility\n * @since 11.1.0\n * @deprecated 12.6.0\n * @apioption plotOptions.series.pointDescriptionFormat\n */\n /**\n * Deprecated. Use\n * [series.accessibility.point.descriptionFormatter](#plotOptions.series.accessibility.point.descriptionFormatter)\n * instead.\n *\n * Same as\n * [accessibility.series.descriptionFormatter](#accessibility.series.descriptionFormatter),\n * but for an individual series. Overrides the chart wide configuration.\n *\n * @type {Function}\n * @requires modules/accessibility\n * @since 5.0.12\n * @deprecated 8.0.0\n * @apioption plotOptions.series.pointDescriptionFormatter\n */\n /**\n * If no x values are given for the points in a series, `pointInterval`\n * defines the interval of the x values. For example, if a series\n * contains one value every decade starting from year 0, set\n * `pointInterval` to `10`. In true `datetime` axes, the `pointInterval`\n * is set in milliseconds.\n *\n * It can be also be combined with `pointIntervalUnit` to draw irregular\n * time intervals.\n *\n * If combined with `relativeXValue`, an x value can be set on each\n * point, and the `pointInterval` is added x times to the `pointStart`\n * setting.\n *\n * Please note that this options applies to the _series data_, not the\n * interval of the axis ticks, which is independent.\n *\n * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n * Datetime X axis\n * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n * Relative x value\n * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n * Using pointStart and pointInterval\n * @sample {highstock} stock/plotoptions/relativexvalue/\n * Relative x value\n *\n * @type {number}\n * @default 1\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.pointInterval\n */\n /**\n * On datetime series, this allows for setting the\n * [pointInterval](#plotOptions.series.pointInterval) to irregular time\n * units, `day`, `month` and `year`. A day is usually the same as 24\n * hours, but `pointIntervalUnit` also takes the DST crossover into\n * consideration when dealing with local time. Combine this option with\n * `pointInterval` to draw weeks, quarters, 6 months, 10 years etc.\n *\n * Please note that this options applies to the _series data_, not the\n * interval of the axis ticks, which is independent.\n *\n * @sample {highcharts} highcharts/plotoptions/series-pointintervalunit/\n * One point a month\n * @sample {highstock} highcharts/plotoptions/series-pointintervalunit/\n * One point a month\n *\n * @type {string}\n * @since 4.1.0\n * @product highcharts highstock gantt\n * @validvalue [\"day\", \"month\", \"year\"]\n * @apioption plotOptions.series.pointIntervalUnit\n */\n /**\n * Possible values: `\"on\"`, `\"between\"`, `number`.\n *\n * In a column chart, when pointPlacement is `\"on\"`, the point will not\n * create any padding of the X axis. In a polar column chart this means\n * that the first column points directly north. If the pointPlacement is\n * `\"between\"`, the columns will be laid out between ticks. This is\n * useful for example for visualizing an amount between two points in\n * time or in a certain sector of a polar chart.\n *\n * Since Highcharts 3.0.2, the point placement can also be numeric,\n * where 0 is on the axis value, -0.5 is between this value and the\n * previous, and 0.5 is between this value and the next. Unlike the\n * textual options, numeric point placement options won't affect axis\n * padding.\n *\n * Note that pointPlacement needs a [pointRange](\n * #plotOptions.series.pointRange) to work. For column series this is\n * computed, but for line-type series it needs to be set.\n *\n * For the `xrange` series type and gantt charts, if the Y axis is a\n * category axis, the `pointPlacement` applies to the Y axis rather than\n * the (typically datetime) X axis.\n *\n * Defaults to `undefined` in cartesian charts, `\"between\"` in polar\n * charts.\n *\n * @see [xAxis.tickmarkPlacement](#xAxis.tickmarkPlacement)\n *\n * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-between/\n * Between in a column chart\n * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-numeric/\n * Numeric placement for custom layout\n * @sample {highcharts|highstock} maps/plotoptions/heatmap-pointplacement/\n * Placement in heatmap\n *\n * @type {string|number}\n * @since 2.3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.pointPlacement\n */\n /**\n * If no x values are given for the points in a series, `pointStart`\n * defines on what value to start. For example, if a series contains one\n * yearly value starting from 1945, set `pointStart` to 1945.\n *\n * The `pointStart` setting can be a number, or a datetime string that is\n * parsed according to the `time.timezone` setting.\n *\n * If combined with `relativeXValue`, an x value can be set on each\n * point. The x value from the point options is multiplied by\n * `pointInterval` and added to `pointStart` to produce a modified x\n * value.\n *\n * @sample {highcharts} highcharts/plotoptions/series-pointstart-linear/\n * Linear\n * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n * Datetime\n * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n * Relative x value\n * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n * Using pointStart and pointInterval\n * @sample {highstock} stock/plotoptions/relativexvalue/\n * Relative x value\n *\n * @type {number|string}\n * @default 0\n * @product highcharts highstock gantt\n * @apioption plotOptions.series.pointStart\n */\n /**\n * When true, X values in the data set are relative to the current\n * `pointStart`, `pointInterval` and `pointIntervalUnit` settings. This\n * allows compression of the data for datasets with irregular X values.\n *\n * The real X values are computed on the formula `f(x) = ax + b`, where\n * `a` is the `pointInterval` (optionally with a time unit given by\n * `pointIntervalUnit`), and `b` is the `pointStart`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n * Relative X value\n * @sample {highstock} stock/plotoptions/relativexvalue/\n * Relative X value\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock\n * @apioption plotOptions.series.relativeXValue\n */\n /**\n * Whether to select the series initially. If `showCheckbox` is true,\n * the checkbox next to the series name in the legend will be checked\n * for a selected series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-selected/\n * One out of two series selected\n *\n * @type {boolean}\n * @default false\n * @since 1.2.0\n * @apioption plotOptions.series.selected\n */\n /**\n * Whether to apply a drop shadow to the graph line. Since 2.3 the\n * shadow can be an object configuration containing `color`, `offsetX`,\n * `offsetY`, `opacity` and `width`.\n *\n * Note that in some cases, like stacked columns or other dense layouts, the\n * series may cast shadows on each other. In that case, the\n * `chart.seriesGroupShadow` allows applying a common drop shadow to the\n * whole series group.\n *\n * @sample {highcharts} highcharts/plotoptions/series-shadow/\n * Shadow enabled\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption plotOptions.series.shadow\n */\n /**\n * Whether to display this particular series or series type in the\n * legend. Standalone series are shown in legend by default, and linked\n * series are not. Since v7.2.0 it is possible to show series that use\n * colorAxis by setting this option to `true`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n * One series in the legend, one hidden\n *\n * @type {boolean}\n * @apioption plotOptions.series.showInLegend\n */\n /**\n * Whether or not to show the series in the navigator. Takes precedence\n * over [navigator.baseSeries](#navigator.baseSeries) if defined.\n *\n * @type {boolean}\n * @since 5.0.0\n * @product highstock\n * @apioption plotOptions.series.showInNavigator\n */\n /**\n * Deprecated. Use\n * [series.accessibility.keyboardNavigation](#plotOptions.series.accessibility.keyboardNavigation)\n * instead.\n *\n * If set to `true`, the accessibility module will skip past the points\n * in this series for keyboard navigation.\n *\n * @type {boolean}\n * @since 5.0.12\n * @deprecated 8.0.0\n * @apioption plotOptions.series.skipKeyboardNavigation\n */\n /**\n * This option allows grouping series in a stacked chart. The stack option\n * can be a string or anything else, as long as the grouped series' stack\n * options match each other after conversion into a string.\n *\n * @sample {highcharts} highcharts/series/stack/\n * Stacked and grouped columns\n * @sample {highcharts} highcharts/series/stack-centerincategory/\n * Stacked and grouped, centered in category\n *\n * @type {number|string}\n * @since 2.1\n * @product highcharts highstock\n * @apioption series.stack\n */\n /**\n * Whether to stack the values of each series on top of each other.\n * Possible values are null to disable, `\"normal\"` to stack by\n * value or `\"percent\"`.\n *\n * When stacking is enabled, data must be sorted\n * in ascending X order.\n *\n * Some stacking options are related to specific series types. In the\n * streamgraph series type, the stacking option is set to `\"stream\"`.\n * The second one is `\"overlap\"`, which only applies to waterfall\n * series.\n *\n * @see [yAxis.reversedStacks](#yAxis.reversedStacks)\n *\n * @sample {highcharts} highcharts/plotoptions/series-stacking-line/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-stacking-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-stacking-bar/\n * Bar\n * @sample {highcharts} highcharts/plotoptions/series-stacking-area/\n * Area\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-line/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-bar/\n * Bar\n * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-area/\n * Area\n * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-normal-stacking\n * Waterfall with normal stacking\n * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-overlap-stacking\n * Waterfall with overlap stacking\n * @sample {highstock} stock/plotoptions/stacking/\n * Area\n *\n * @type {string}\n * @default null\n * @product highcharts highstock\n * @validvalue [\"normal\", \"overlap\", \"percent\", \"stream\", null]\n * @apioption plotOptions.series.stacking\n */\n /**\n * Whether to apply steps to the line. Possible values are `left`,\n * `center` and `right`.\n *\n * @sample {highcharts} highcharts/plotoptions/line-step/\n * Different step line options\n * @sample {highcharts} highcharts/plotoptions/area-step/\n * Stepped, stacked area\n * @sample {highstock} stock/plotoptions/line-step/\n * Step line\n *\n * @type {string}\n * @since 1.2.5\n * @product highcharts highstock\n * @validvalue [\"left\", \"center\", \"right\"]\n * @apioption plotOptions.series.step\n */\n /**\n * The threshold, also called zero level or base level. For line type\n * series this is only used in conjunction with\n * [negativeColor](#plotOptions.series.negativeColor).\n *\n * @see [softThreshold](#plotOptions.series.softThreshold).\n *\n * @type {number|null}\n * @default 0\n * @since 3.0\n * @product highcharts highstock\n * @apioption plotOptions.series.threshold\n */\n /**\n * Set the initial visibility of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-visible/\n * Two series, one hidden and one visible\n * @sample {highstock} stock/plotoptions/series-visibility/\n * Hidden series\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.visible\n */\n /**\n * Defines the Axis on which the zones are applied.\n *\n * @see [zones](#plotOptions.series.zones)\n *\n * @sample {highcharts} highcharts/series/color-zones-zoneaxis-x/\n * Zones on the X-Axis\n * @sample {highstock} highcharts/series/color-zones-zoneaxis-x/\n * Zones on the X-Axis\n *\n * @type {string}\n * @default y\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zoneAxis\n */\n /**\n * General event handlers for the series items. These event hooks can\n * also be attached to the series at run time using the\n * `Highcharts.addEvent` function.\n *\n * @basic\n * @declare Highcharts.SeriesEventsOptionsObject\n */\n events: {},\n /**\n * Fires after the series has finished its initial animation, or in case\n * animation is disabled, immediately as the series is displayed.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-afteranimate/\n * Show label after animate\n * @sample {highstock} highcharts/plotoptions/series-events-afteranimate/\n * Show label after animate\n *\n * @type {Highcharts.SeriesAfterAnimateCallbackFunction}\n * @since 4.0\n * @product highcharts highstock gantt\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.afterAnimate\n */\n /**\n * Fires when the checkbox next to the series' name in the legend is\n * clicked. One parameter, `event`, is passed to the function. The state\n * of the checkbox is found by `event.checked`. The checked item is\n * found by `event.item`. Return `false` to prevent the default action\n * which is to toggle the select state of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n * Alert checkbox status\n *\n * @type {Highcharts.SeriesCheckboxClickCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.checkboxClick\n */\n /**\n * Fires when the series is clicked. One parameter, `event`, is passed\n * to the function, containing common event information. Additionally,\n * `event.point` holds a pointer to the nearest point on the graph.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-click/\n * Alert click info\n * @sample {highstock} stock/plotoptions/series-events-click/\n * Alert click info\n * @sample {highmaps} maps/plotoptions/series-events-click/\n * Display click info in subtitle\n *\n * @type {Highcharts.SeriesClickCallbackFunction}\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.click\n */\n /**\n * Fires when the series is hidden after chart generation time, either\n * by clicking the legend item or by calling `.hide()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-hide/\n * Alert when the series is hidden by clicking the legend item\n *\n * @type {Highcharts.SeriesHideCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.hide\n */\n /**\n * Fires when the legend item belonging to the series is clicked. One\n * parameter, `event`, is passed to the function. The default action\n * is to toggle the visibility of the series. This can be prevented\n * by returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * [legend.events.itemClick](#legend.events.itemClick).\n *\n * @type {Highcharts.SeriesLegendItemClickCallbackFunction}\n * @deprecated 11.4.4\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.legendItemClick\n */\n /**\n * Fires when the mouse leaves the graph. One parameter, `event`, is\n * passed to the function, containing common event information. If the\n * [stickyTracking](#plotOptions.series) option is true, `mouseOut`\n * doesn't happen before the mouse enters another graph or leaves the\n * plot area.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n * With sticky tracking by default\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n * Without sticky tracking\n *\n * @type {Highcharts.SeriesMouseOutCallbackFunction}\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.mouseOut\n */\n /**\n * Fires when the mouse enters the graph. One parameter, `event`, is\n * passed to the function, containing common event information.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n * With sticky tracking by default\n * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n * Without sticky tracking\n *\n * @type {Highcharts.SeriesMouseOverCallbackFunction}\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.mouseOver\n */\n /**\n * Fires when the series is shown after chart generation time, either\n * by clicking the legend item or by calling `.show()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-events-show/\n * Alert when the series is shown by clicking the legend item.\n *\n * @type {Highcharts.SeriesShowCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Series\n * @apioption plotOptions.series.events.show\n */\n /**\n * Options for the point markers of line and scatter-like series. Properties\n * like `fillColor`, `lineColor` and `lineWidth` define the visual\n * appearance of the markers. The `symbol` option defines the shape. Other\n * series types, like column series, don't have markers, but have visual\n * options on the series level instead.\n *\n * In styled mode, the markers can be styled with the `.highcharts-point`,\n * `.highcharts-point-hover` and `.highcharts-point-select` class names.\n *\n * @declare Highcharts.PointMarkerOptionsObject\n *\n * @sample {highmaps} maps/demo/mappoint-mapmarker\n * Using the mapmarker symbol for points\n */\n marker: {\n /**\n * Enable or disable the point marker. If `undefined`, the markers\n * are hidden when the data is dense, and shown for more widespread\n * data points.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-enabled/\n * Disabled markers\n * @sample {highcharts} highcharts/plotoptions/series-marker-enabled-false/\n * Disabled in normal state but enabled on hover\n * @sample {highstock} stock/plotoptions/series-marker/\n * Enabled markers\n *\n * @type {boolean}\n * @default {highcharts} undefined\n * @default {highstock} false\n * @apioption plotOptions.series.marker.enabled\n */\n /**\n * The threshold for how dense the point markers should be before\n * they are hidden, given that `enabled` is not defined. The number\n * indicates the horizontal distance between the two closest points\n * in the series, as multiples of the `marker.radius`. In other\n * words, the default value of 2 means points are hidden if\n * overlapping horizontally.\n *\n * @sample highcharts/plotoptions/series-marker-enabledthreshold\n * A higher threshold\n *\n * @since 6.0.5\n */\n enabledThreshold: 2,\n /**\n * The fill color of the point marker. When `undefined`, the series'\n * or point's color is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n * White fill\n *\n * @type {Highcharts.ColorType}\n * @apioption plotOptions.series.marker.fillColor\n */\n /**\n * Image markers only. Set the image width explicitly. When using\n * this option, a `width` must also be set.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n *\n * @type {number}\n * @since 4.0.4\n * @apioption plotOptions.series.marker.height\n */\n /**\n * The color of the point marker's outline. When `undefined`, the\n * series' or point's color is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n * Inherit from series color (undefined)\n *\n * @type {Highcharts.ColorType}\n */\n lineColor: 'var(--highcharts-background-color)',\n /**\n * The width of the point marker's outline.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n * 2px blue marker\n */\n lineWidth: 0,\n /**\n * The radius of the point marker.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-radius/\n * Bigger markers\n *\n * @default {highstock} 2\n * @default {highcharts} 4\n *\n */\n radius: 4,\n /**\n * A predefined shape or symbol for the marker. When undefined, the\n * symbol is pulled from options.symbols. Other possible values are\n * `'circle'`, `'square'`,`'diamond'`, `'triangle'` and\n * `'triangle-down'`.\n *\n * Additionally, the URL to a graphic can be given on this form:\n * `'url(graphic.png)'`. Note that for the image to be applied to\n * exported charts, its URL needs to be accessible by the export\n * server.\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n * used by its method name, as shown in the demo.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/\n * Predefined, graphic and custom markers\n * @sample {highstock} highcharts/plotoptions/series-marker-symbol/\n * Predefined, graphic and custom markers\n * @sample {highmaps} maps/demo/mappoint-mapmarker\n * Using the mapmarker symbol for points\n *\n * @type {string}\n * @apioption plotOptions.series.marker.symbol\n */\n /**\n * Image markers only. Set the image width explicitly. When using\n * this option, a `height` must also be set.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n * Fixed width and height\n *\n * @type {number}\n * @since 4.0.4\n * @apioption plotOptions.series.marker.width\n */\n /**\n * States for a single point marker.\n *\n * @declare Highcharts.PointStatesOptionsObject\n */\n states: {\n /**\n * The normal state of a single point marker. Currently only\n * used for setting animation when returning to normal state\n * from hover.\n *\n * @declare Highcharts.PointStatesNormalOptionsObject\n */\n normal: {\n /**\n * Animation when returning to normal state after hovering.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n */\n animation: true\n },\n /**\n * The hover state for a single point marker.\n *\n * @declare Highcharts.PointStatesHoverOptionsObject\n */\n hover: {\n /**\n * Animation when hovering over the marker.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n */\n animation: {\n duration: 150\n },\n /**\n * Enable or disable the point marker.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-enabled/\n * Disabled hover state\n */\n enabled: true,\n /**\n * The fill color of the marker in hover state. When\n * `undefined`, the series' or point's fillColor for normal\n * state is used.\n *\n * @type {Highcharts.ColorType}\n * @apioption plotOptions.series.marker.states.hover.fillColor\n */\n /**\n * The color of the point marker's outline. When\n * `undefined`, the series' or point's lineColor for normal\n * state is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linecolor/\n * White fill color, black line color\n *\n * @type {Highcharts.ColorType}\n * @apioption plotOptions.series.marker.states.hover.lineColor\n */\n /**\n * The width of the point marker's outline. When\n * `undefined`, the series' or point's lineWidth for normal\n * state is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linewidth/\n * 3px line width\n *\n * @type {number}\n * @apioption plotOptions.series.marker.states.hover.lineWidth\n */\n /**\n * The radius of the point marker. In hover state, it\n * defaults to the normal state's radius + 2 as per the\n * [radiusPlus](#plotOptions.series.marker.states.hover.radiusPlus)\n * option.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-radius/\n * 10px radius\n *\n * @type {number}\n * @apioption plotOptions.series.marker.states.hover.radius\n */\n /**\n * The number of pixels to increase the radius of the\n * hovered point.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels greater radius on hover\n * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels greater radius on hover\n *\n * @since 4.0.3\n */\n radiusPlus: 2,\n /**\n * The additional line width for a hovered point.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 2 pixels wider on hover\n * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 2 pixels wider on hover\n *\n * @since 4.0.3\n */\n lineWidthPlus: 1\n },\n /**\n * The appearance of the point marker when selected. In order to\n * allow a point to be selected, set the\n * `series.allowPointSelect` option to true.\n *\n * @declare Highcharts.PointStatesSelectOptionsObject\n */\n select: {\n /**\n * Enable or disable visible feedback for selection.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-enabled/\n * Disabled select state\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.marker.states.select.enabled\n */\n /**\n * The radius of the point marker. In hover state, it\n * defaults to the normal state's radius + 2.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-radius/\n * 10px radius for selected points\n *\n * @type {number}\n * @apioption plotOptions.series.marker.states.select.radius\n */\n /**\n * The fill color of the point marker.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-fillcolor/\n * Solid red discs for selected points\n *\n * @type {Highcharts.ColorType}\n */\n fillColor: 'var(--highcharts-neutral-color-20)',\n /**\n * The color of the point marker's outline. When\n * `undefined`, the series' or point's color is used.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linecolor/\n * Red line color for selected points\n *\n * @type {Highcharts.ColorType}\n */\n lineColor: 'var(--highcharts-neutral-color-100)',\n /**\n * The width of the point marker's outline.\n *\n * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linewidth/\n * 3px line width for selected points\n */\n lineWidth: 2\n }\n }\n },\n /**\n * Properties for each single point.\n *\n * @declare Highcharts.PlotSeriesPointOptions\n */\n point: {\n /**\n * Fires when a point is clicked. One parameter, `event`, is passed\n * to the function, containing common event information.\n *\n * If the `series.allowPointSelect` option is true, the default\n * action for the point's click event is to toggle the point's\n * select state. Returning `false` cancels this action.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-click/\n * Click marker to alert values\n * @sample {highcharts} highcharts/plotoptions/series-point-events-click-column/\n * Click column\n * @sample {highcharts} highcharts/plotoptions/series-point-events-click-url/\n * Go to URL\n * @sample {highmaps} maps/plotoptions/series-point-events-click/\n * Click marker to display values\n * @sample {highmaps} maps/plotoptions/series-point-events-click-url/\n * Go to URL\n *\n * @type {Highcharts.PointClickCallbackFunction}\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.click\n */\n /**\n * Fires when the mouse leaves the area close to the point. One\n * parameter, `event`, is passed to the function, containing common\n * event information.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n * Show values in the chart's corner on mouse over\n *\n * @type {Highcharts.PointMouseOutCallbackFunction}\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.mouseOut\n */\n /**\n * Fires when the mouse enters the area close to the point. One\n * parameter, `event`, is passed to the function, containing common\n * event information.\n *\n * Returning `false` cancels the default behavior, which is to show a\n * tooltip for the point.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n * Show values in the chart's corner on mouse over\n *\n * @type {Highcharts.PointMouseOverCallbackFunction}\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.mouseOver\n */\n /**\n * Fires when the point is removed using the `.remove()` method. One\n * parameter, `event`, is passed to the function. Returning `false`\n * cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-remove/\n * Remove point and confirm\n *\n * @type {Highcharts.PointRemoveCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.remove\n */\n /**\n * Fires when the point is selected either programmatically or\n * following a click on the point. One parameter, `event`, is passed\n * to the function. Returning `false` cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-select/\n * Report the last selected point\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Report select and unselect\n *\n * @type {Highcharts.PointSelectCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.select\n */\n /**\n * Fires when the point is unselected either programmatically or\n * following a click on the point. One parameter, `event`, is passed\n * to the function.\n * Returning `false` cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-unselect/\n * Report the last unselected point\n * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n * Report select and unselect\n *\n * @type {Highcharts.PointUnselectCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.unselect\n */\n /**\n * Fires when the point is updated programmatically through the\n * `.update()` method. One parameter, `event`, is passed to the\n * function. The new point options can be accessed through\n * `event.options`. Returning `false` cancels the operation.\n *\n * @sample {highcharts} highcharts/plotoptions/series-point-events-update/\n * Confirm point updating\n *\n * @type {Highcharts.PointUpdateCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Point\n * @apioption plotOptions.series.point.events.update\n */\n /**\n * Events for each single point.\n *\n * @declare Highcharts.PointEventsOptionsObject\n */\n events: {}\n },\n /**\n * Options for the series data labels, appearing next to each data point.\n *\n * Since v6.2.0, multiple data labels can be applied to each single\n * point by defining them as an array of configs.\n *\n * In styled mode, the data labels can be styled with the\n * `.highcharts-data-label-box` and `.highcharts-data-label` class names\n * ([see example](https://www.highcharts.com/samples/highcharts/css/series-datalabels)).\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled\n * Data labels enabled\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-multiple\n * Multiple data labels on a bar series\n * @sample {highcharts} highcharts/css/series-datalabels\n * Styled mode example\n * @sample {highmaps} maps/demo/color-axis\n * Choropleth map with data labels\n * @sample {highmaps} maps/demo/mappoint-datalabels-mapmarker\n * Using data labels as map markers\n *\n * @type {*|Array<*>}\n * @product highcharts highstock highmaps gantt\n */\n dataLabels: {\n /**\n * Enable or disable the initial animation when a series is displayed\n * for the `dataLabels`. The animation can also be set as a\n * configuration object. Please note that this option only applies to\n * the initial animation.\n *\n * For other animations, see [chart.animation](#chart.animation) and the\n * animation parameter under the API methods. The following properties\n * are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * @sample {highcharts} highcharts/plotoptions/animation-defer/\n * Animation defer settings\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n * @since 8.2.0\n * @apioption plotOptions.series.dataLabels.animation\n */\n animation: {},\n /**\n * The animation delay time in milliseconds. Set to `0` to render the\n * data labels immediately. As `undefined` inherits defer time from the\n * [series.animation.defer](#plotOptions.series.animation.defer).\n *\n * @type {number}\n * @since 8.2.0\n * @apioption plotOptions.series.dataLabels.animation.defer\n */\n /**\n * The alignment of the data label compared to the point. If `right`,\n * the right side of the label should be touching the point. For points\n * with an extent, like columns, the alignments also dictates how to\n * align it inside the box, as given with the\n * [inside](#plotOptions.column.dataLabels.inside) option. Can be one of\n * `left`, `center` or `right`.\n *\n * @sample {highcharts}\n * highcharts/plotoptions/series-datalabels-align-left/ Left\n * aligned\n * @sample {highcharts}\n * highcharts/plotoptions/bar-datalabels-align-inside-bar/ Data\n * labels inside the bar\n *\n * @type {Highcharts.AlignValue|null}\n */\n align: 'center',\n /**\n * Alignment method for data labels. If set to `plotEdges`, the labels\n * are aligned within the plot area in the direction of the y-axis. So\n * in a regular column chart, the labels are aligned vertically\n * according to the `verticalAlign` setting. In a bar chart, which is\n * inverted, the labels are aligned horizontally according to the\n * `align` setting. Applies to cartesian series only.\n *\n * @sample {highcharts} highcharts/series-bar/datalabels-alignto/\n * Align to plot edges\n *\n * @type {string}\n * @since 11.4.2\n * @apioption plotOptions.series.dataLabels.alignTo\n */\n /**\n * Whether to allow data labels to overlap. To make the labels less\n * sensitive for overlapping, the\n * [dataLabels.padding](#plotOptions.series.dataLabels.padding)\n * can be set to 0.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-allowoverlap-false/\n * Don't allow overlap\n *\n * @type {boolean}\n * @default false\n * @since 4.1.0\n * @apioption plotOptions.series.dataLabels.allowOverlap\n */\n /**\n * The background color or gradient for the data label. In addition to\n * regular colors, there are two special setting for this option:\n * - `auto` will set the background color the point's color.\n * - `contrast` will set it to a contrast against the text color, with\n * an opacity allowing to see the underlying content. The contrast is\n * great enough to ensure readability for the text according to\n * accessibility standards.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-background-contrast/\n * Contrast background color in stacked column\n * @sample {highcharts} highcharts/series-pie/datalabels-background-contrast/\n * Contrast background color in pie\n * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/demo/mappoint-datalabels-mapmarker\n * Data labels as map markers\n *\n * @type {Highcharts.ColorType}\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.backgroundColor\n */\n /**\n * The border color for the data label. Setting it to `auto` will use\n * the point's color. Defaults to `undefined`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {Highcharts.ColorType}\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.borderColor\n */\n /**\n * The border radius in pixels for the data label.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {number}\n * @default 3\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.borderRadius\n */\n /**\n * The border width in pixels for the data label.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {number}\n * @default 0\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.borderWidth\n */\n borderWidth: 0,\n /**\n * A class name for the data label. Particularly in styled mode,\n * this can be used to give each series' or point's data label\n * unique styling. In addition to this option, a default color class\n * name is added so that we can give the labels a contrast text\n * shadow.\n *\n * @sample {highcharts} highcharts/css/data-label-contrast/\n * Contrast text shadow\n * @sample {highcharts} highcharts/css/series-datalabels/\n * Styling by CSS\n *\n * @type {string}\n * @since 5.0.0\n * @apioption plotOptions.series.dataLabels.className\n */\n /**\n * This options is deprecated.\n * Use [style.color](#plotOptions.series.dataLabels.style) instead.\n *\n * The text color for the data labels. Defaults to `undefined`. For\n * certain series types, like column or map, the data labels can be\n * drawn inside the points. In this case the data label will be\n * drawn with maximum contrast by default. Additionally, it will be\n * given a `text-outline` style with the opposite color, to further\n * increase the contrast. This can be overridden by setting the\n * `text-outline` style to `none` in the `dataLabels.style` option.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-color/\n * Red data labels\n * @sample {highmaps} maps/demo/color-axis/\n * White data labels\n *\n * @see [style.color](#plotOptions.series.dataLabels.style)\n *\n * @type {Highcharts.ColorType}\n * @deprecated 10.3\n * @apioption plotOptions.series.dataLabels.color\n */\n /**\n * Whether to hide data labels that are outside the plot area. By\n * default, the data label is moved inside the plot area according\n * to the\n * [overflow](#plotOptions.series.dataLabels.overflow)\n * option.\n *\n * @type {boolean}\n * @default true\n * @since 2.3.3\n * @apioption plotOptions.series.dataLabels.crop\n */\n /**\n * Whether to defer displaying the data labels until the initial\n * series animation has finished. Setting to `false` renders the\n * data label immediately. If set to `true` inherits the defer\n * time set in [plotOptions.series.animation](#plotOptions.series.animation).\n *\n * @since 4.0.0\n * @type {boolean}\n * @product highcharts highstock gantt\n */\n defer: true,\n /**\n * The distance of the data label from the data point. Note that the\n * `padding` setting also affects the rendered distance, but is not\n * visible unless the data label has a border or background.\n *\n * @type {number}\n * @product highcharts highstock gantt\n */\n distance: 4,\n /**\n * Enable or disable the data labels.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled/\n * Data labels enabled\n * @sample {highmaps} maps/demo/color-axis/\n * Data labels enabled\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.dataLabels.enabled\n */\n /**\n * A declarative filter to control of which data labels to display.\n * The declarative filter is designed for use when callback\n * functions are not available, like when the chart options require\n * a pure JSON structure or for use with graphical editors. For\n * programmatic control, use the `formatter` instead, and return\n * `undefined` to disable a single data label.\n *\n * ```js\n * filter: {\n * property: 'percentage',\n * operator: '>',\n * value: 4\n * }\n * ```\n *\n * @sample {highcharts} highcharts/demo/pie-monochrome\n * Data labels filtered by percentage\n *\n * @declare Highcharts.DataLabelsFilterOptionsObject\n * @since 6.0.3\n * @apioption plotOptions.series.dataLabels.filter\n */\n /**\n * The operator to compare by. Can be one of `>`, `<`, `>=`, `<=`,\n * `==`, `===`, `!=` and `!==`.\n *\n * @type {string}\n * @validvalue [\">\", \"<\", \">=\", \"<=\", \"==\", \"===\", \"!=\", \"!==\"]\n * @apioption plotOptions.series.dataLabels.filter.operator\n */\n /**\n * The point property to filter by. Point options are passed\n * directly to properties, additionally there are `y` value,\n * `percentage` and others listed under {@link Highcharts.Point}\n * members.\n *\n * @type {string}\n * @apioption plotOptions.series.dataLabels.filter.property\n */\n /**\n * The value to compare against.\n *\n * @type {number}\n * @apioption plotOptions.series.dataLabels.filter.value\n */\n /**\n * A\n * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for the data label. Available variables are the same as for\n * `formatter`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n * Add a unit\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-format-subexpression/\n * Complex logic in the format string\n * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n * Formatted value in the data label\n *\n * @type {string}\n * @default y\n * @default point.value\n * @since 3.0\n * @apioption plotOptions.series.dataLabels.format\n */\n /**\n * Callback JavaScript function to format the data label. Note that if a\n * `format` is defined, the format takes precedence and the formatter is\n * ignored.\n *\n * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n * Formatted value\n *\n * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n */\n formatter: function () {\n const { numberFormatter } = this.series.chart;\n return typeof this.y !== 'number' ?\n '' : numberFormatter(this.y, -1);\n },\n /**\n * For points with an extent, like columns or map areas, whether to\n * align the data label inside the box or to the actual value point.\n * Defaults to `false` in most cases, `true` in stacked columns.\n *\n * @type {boolean}\n * @since 3.0\n * @apioption plotOptions.series.dataLabels.inside\n */\n /**\n * The rank for this point's data label in case of collision. If two\n * data labels are about to overlap, only the one with the highest\n * `labelrank` will be drawn.\n *\n * @type {number}\n * @apioption plotOptions.series.dataLabels.labelrank\n */\n /**\n * Format for points with the value of null. Works analogously to\n * [format](#plotOptions.series.dataLabels.format). `nullFormat` can\n * be applied only to series which support displaying null points.\n * `heatmap` and `tilemap` supports `nullFormat` by default while the\n * following series requires [#series.nullInteraction] set to `true`:\n * `line`, `spline`, `area`, `area-spline`, `column`, `bar`, and\n * `timeline`. Does not work with series that don't display null\n * points, like `pie`.\n *\n * @sample {highcharts} highcharts/series/null-interaction/\n * Line chart with null interaction\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-nullformat/\n * Heatmap with null interaction\n *\n * @type {boolean|string}\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.nullFormat\n */\n /**\n * Callback JavaScript function that defines formatting for points\n * with the value of null. Works analogously to\n * [formatter](#plotOptions.series.dataLabels.formatter).\n * `nullFormatter` can be applied only to series which support\n * displaying null points. `heatmap` and `tilemap` supports\n * `nullFormatter` by default while the following series requires\n * (series.nullInteraction)[#series.nullInteraction]\n * set to `true`: `line`, `spline`, `area`, `area-spline`, `column`,\n * `bar`, and `timeline`. Does not work with series that don't display\n * null points, like `pie`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-nullformat/\n * Format data label for null points in heat map\n *\n * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n * @since 7.1.0\n * @apioption plotOptions.series.dataLabels.nullFormatter\n */\n /**\n * How to handle data labels that flow outside the plot area. The\n * default is `\"justify\"`, which aligns them inside the plot area.\n * For columns and bars, this means it will be moved inside the bar.\n * To display data labels outside the plot area, set `crop` to\n * `false` and `overflow` to `\"allow\"`.\n *\n * @type {Highcharts.DataLabelsOverflowValue}\n * @default justify\n * @since 3.0.6\n * @apioption plotOptions.series.dataLabels.overflow\n */\n /**\n * When either the `borderWidth` or the `backgroundColor` is set,\n * this is the padding within the box.\n *\n * An array of numbers sets padding for the respective sides. An array\n * of two numbers repeats the values for the horizontal and vertical\n * sides.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @since 2.2.1\n */\n padding: [1, 3],\n /**\n * Aligns data labels relative to points. If `center` alignment is\n * not possible, it defaults to `right`.\n *\n * @type {Highcharts.AlignValue}\n * @default center\n * @apioption plotOptions.series.dataLabels.position\n */\n /**\n * Text rotation in degrees. Note that due to a more complex\n * structure, backgrounds, borders and padding will be lost on a\n * rotated data label.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n * Vertical labels\n *\n * @type {number}\n * @default 0\n * @apioption plotOptions.series.dataLabels.rotation\n */\n /**\n * The shadow of the box. Works best with `borderWidth` or\n * `backgroundColor`. Since 2.3 the shadow can be an object\n * configuration containing `color`, `offsetX`, `offsetY`, `opacity`\n * and `width`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n * Data labels box options\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @since 2.2.1\n * @apioption plotOptions.series.dataLabels.shadow\n */\n /**\n * The name of a symbol to use for the border around the label.\n * Symbols are predefined functions on the Renderer object.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-shape/\n * A callout for annotations\n *\n * @type {string}\n * @default square\n * @since 4.1.2\n * @apioption plotOptions.series.dataLabels.shape\n */\n /**\n * Styles for the label. The default `color` setting is\n * `\"contrast\"`, which is a pseudo color that Highcharts picks up\n * and applies the maximum contrast to the underlying point item,\n * for example the bar in a bar chart.\n *\n * The `textOutline` is a pseudo property that applies an outline of\n * the given width with the given color, which by default is the\n * maximum contrast to the text. So a bright text color will result\n * in a black text outline for maximum readability on a mixed\n * background. In some cases, especially with grayscale text, the\n * text outline doesn't work well, in which cases it can be disabled\n * by setting it to `\"none\"`. When `useHTML` is true, the\n * `textOutline` will not be picked up. In this, case, the same\n * effect can be achieved through the `text-shadow` CSS property. As a\n * complementary or alternative to the `textOutline`, a\n * `dataLabels.backgroundColor` can be used. It provides a more calm\n * impression and ensures readable text label, at the cost of a risk of\n * overshadowing the underlying chart elements.\n *\n * For some series types, where each point has an extent, like for\n * example tree maps, the data label may overflow the point. There\n * are two strategies for handling overflow. By default, the text\n * will wrap to multiple lines. The other strategy is to set\n * `style.textOverflow` to `ellipsis`, which will keep the text on\n * one line plus it will break inside long words.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-style/\n * Bold labels\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow/\n * Long labels truncated with an ellipsis in a pie\n * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap/\n * Long labels are wrapped in a pie\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-background-contrast/\n * Default text outline and contrast background color\n * @sample {highmaps} maps/demo/color-axis/\n * Bold labels\n *\n * @type {Highcharts.CSSObject}\n * @since 4.1.0\n * @default { fontSize: '0.7em', fontWeight: 'bold', color: 'contrast', textOutline: '1px contrast' }\n * @apioption plotOptions.series.dataLabels.style\n */\n style: {\n /** @internal */\n fontSize: '0.7em',\n /** @internal */\n fontWeight: 'bold',\n /** @internal */\n color: 'contrast',\n /** @internal */\n textOutline: '1px contrast'\n },\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type {boolean}\n * @default false\n * @apioption plotOptions.series.dataLabels.useHTML\n */\n /**\n * The vertical alignment of a data label. Can be one of `top`,\n * `middle` or `bottom`. The default value depends on the data, for\n * instance in a column chart, the label is above positive values\n * and below negative values.\n *\n * @type {Highcharts.VerticalAlignValue|null}\n * @since 2.3.3\n */\n verticalAlign: 'bottom',\n // Loose JSDoc doclet placed last are ignored, so placed unsorted here.\n /**\n * The z index of the data labels group. Does not apply below series\n * level options.\n *\n * Use a `zIndex` of 6 to display it above the series,\n * or use a `zIndex` of 2 to display it behind the series.\n *\n * @type {number}\n * @default 6\n * @since 2.3.5\n * @apioption plotOptions.series.dataLabels.zIndex\n */\n /**\n * The x position offset of the label relative to the point in\n * pixels.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n * Vertical and positioned\n * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n * Data labels inside the bar\n */\n x: 0,\n /**\n * The y position offset of the label relative to the point in\n * pixels.\n *\n * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n * Vertical and positioned\n */\n y: 0\n },\n /**\n * When the series contains less points than the crop threshold, all\n * points are drawn, even if the points fall outside the visible plot\n * area at the current zoom. The advantage of drawing all points\n * (including markers and columns), is that animation is performed on\n * updates. On the other hand, when the series contains more points than\n * the crop threshold, the series data is cropped to only contain points\n * that fall within the plot area. The advantage of cropping away\n * invisible points is to increase performance on large series.\n *\n * @since 2.2\n * @product highcharts highstock\n */\n cropThreshold: 300,\n /**\n * Opacity of a series parts: line, fill (e.g. area) and dataLabels.\n *\n * @see [states.inactive.opacity](#plotOptions.series.states.inactive.opacity)\n *\n * @since 7.1.0\n */\n opacity: 1,\n /**\n * The width of each point on the x axis. For example in a column chart\n * with one value each day, the pointRange would be 1 day (= 24 * 3600\n * * 1000 milliseconds). This is normally computed automatically, but\n * this option can be used to override the automatic value.\n *\n * @product highstock\n */\n pointRange: 0,\n /**\n * When this is true, the series will not cause the Y axis to cross\n * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n * unless the data actually crosses the plane.\n *\n * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n * 3 will make the Y axis show negative values according to the\n * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n * at 0.\n *\n * @since 4.1.9\n * @product highcharts highstock\n */\n softThreshold: true,\n /**\n * A collection of options for different series states.\n *\n * @declare Highcharts.SeriesStatesOptionsObject\n */\n states: {\n /**\n * The normal state of a series, or for point items in column, pie\n * and similar series. Currently only used for setting animation\n * when returning to normal state from hover.\n *\n * @declare Highcharts.SeriesStatesNormalOptionsObject\n */\n normal: {\n /**\n * Animation when returning to normal state after hovering.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n */\n animation: true\n },\n /**\n * Options for the hovered series. These settings override the\n * normal state options when a series is moused over or touched.\n *\n * @declare Highcharts.SeriesStatesHoverOptionsObject\n */\n hover: {\n /**\n * Enable separate styles for the hovered series to visualize\n * that the user hovers either the series itself or the legend.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled/\n * Line\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-column/\n * Column\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-pie/\n * Pie\n *\n * @type {boolean}\n * @default true\n * @since 1.2\n * @apioption plotOptions.series.states.hover.enabled\n */\n /**\n * Animation setting for hovering the graph in line-type series.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n * @since 5.0.8\n * @product highcharts highstock\n */\n animation: {\n /**\n * The duration of the hover animation in milliseconds. By\n * default the hover state animates quickly in, and slowly\n * back to normal.\n */\n duration: 150\n },\n /**\n * Pixel width of the graph line. By default this property is\n * undefined, and the `lineWidthPlus` property dictates how much\n * to increase the linewidth from normal state.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidth/\n * 5px line on hover\n *\n * @type {number}\n * @product highcharts highstock\n * @apioption plotOptions.series.states.hover.lineWidth\n */\n /**\n * The additional line width for the graph of a hovered series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels wider\n * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n * 5 pixels wider\n *\n * @since 4.0.3\n * @product highcharts highstock\n */\n lineWidthPlus: 1,\n /**\n * In Highcharts 1.0, the appearance of all markers belonging\n * to the hovered series. For settings on the hover state of the\n * individual point, see\n * [marker.states.hover](#plotOptions.series.marker.states.hover).\n *\n * @deprecated 2\n *\n * @extends plotOptions.series.marker\n * @excluding states, symbol\n * @product highcharts highstock\n */\n marker: {\n // `lineWidth: base + 1`,\n // `radius: base + 1`\n },\n /**\n * Options for the halo appearing around the hovered point in\n * line-type series as well as outside the hovered slice in pie\n * charts. By default the halo is filled by the current point or\n * series color with an opacity of 0.25\\. The halo can be\n * disabled by setting the `halo` option to `null`.\n *\n * In styled mode, the halo is styled with the\n * `.highcharts-halo` class, with colors inherited from\n * `.highcharts-color-{n}`.\n *\n * @sample {highcharts} highcharts/plotoptions/halo/\n * Halo options\n * @sample {highstock} highcharts/plotoptions/halo/\n * Halo options\n *\n * @declare Highcharts.SeriesStatesHoverHaloOptionsObject\n * @type {null|*}\n * @since 4.0\n * @product highcharts highstock\n */\n halo: {\n /**\n * A collection of SVG attributes to override the appearance\n * of the halo, for example `fill`, `stroke` and\n * `stroke-width`.\n *\n * @type {Highcharts.SVGAttributes}\n * @since 4.0\n * @product highcharts highstock\n * @apioption plotOptions.series.states.hover.halo.attributes\n */\n /**\n * The pixel size of the halo. For point markers this is the\n * radius of the halo. For pie slices it is the width of the\n * halo outside the slice. For bubbles it defaults to 5 and\n * is the width of the halo outside the bubble.\n *\n * @since 4.0\n * @product highcharts highstock\n */\n size: 10,\n /**\n * Opacity for the halo unless a specific fill is overridden\n * using the `attributes` setting.\n *\n * @since 4.0\n * @product highcharts highstock\n */\n opacity: 0.25\n }\n },\n /**\n * Specific options for point in selected states, after being\n * selected by\n * [allowPointSelect](#plotOptions.series.allowPointSelect)\n * or programmatically.\n *\n * @sample maps/plotoptions/series-allowpointselect/\n * Allow point select demo\n *\n * @declare Highcharts.SeriesStatesSelectOptionsObject\n * @extends plotOptions.series.states.hover\n * @excluding brightness\n */\n select: {\n animation: {\n duration: 0\n }\n },\n /**\n * The opposite state of a hover for series.\n *\n * @sample highcharts/plotoptions/series-states-inactive-disabled\n * Disabled inactive state\n *\n * @declare Highcharts.SeriesStatesInactiveOptionsObject\n */\n inactive: {\n /**\n * Enable or disable the inactive state for a series\n *\n * @sample highcharts/plotoptions/series-states-inactive-disabled\n * Disabled inactive state\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.series.states.inactive.enabled\n */\n /**\n * The animation for entering the inactive state.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n */\n animation: {\n duration: 150\n },\n /**\n * Opacity of series elements (dataLabels, line, area).\n *\n * @type {number}\n */\n opacity: 0.2\n }\n },\n /**\n * Sticky tracking of mouse events. When true, the `mouseOut` event on a\n * series isn't triggered until the mouse moves over another series, or\n * out of the plot area. When false, the `mouseOut` event on a series is\n * triggered when the mouse leaves the area around the series' graph or\n * markers. This also implies the tooltip when not shared. When\n * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n * will be hidden when moving the mouse between series. Defaults to true\n * for line and area type series, but to false for columns, pies etc.\n *\n * **Note:** The boost module will force this option because of\n * technical limitations.\n *\n * @sample {highcharts} highcharts/plotoptions/series-stickytracking-true/\n * True by default\n * @sample {highcharts} highcharts/plotoptions/series-stickytracking-false/\n * False\n *\n * @default {highcharts} true\n * @default {highstock} true\n * @default {highmaps} false\n * @since 2.0\n */\n stickyTracking: true,\n /**\n * A configuration object for the tooltip rendering of each single\n * series. Properties are inherited from [tooltip](#tooltip), but only\n * the following properties can be defined on a series level.\n *\n * @declare Highcharts.SeriesTooltipOptionsObject\n * @since 2.3\n * @extends tooltip\n * @excluding animation, backgroundColor, borderColor, borderRadius,\n * borderWidth, className, crosshairs, enabled, fixed, formatter,\n * headerShape, hideDelay, outside, padding, positioner,\n * shadow, shape, shared, snap, split, stickOnContact,\n * style, useHTML\n * @apioption plotOptions.series.tooltip\n */\n /**\n * When a series contains a `data` array that is longer than this, the\n * Series class looks for data configurations of plain numbers or arrays of\n * numbers. The first and last valid points are checked. If found, the rest\n * of the data is assumed to be the same. This saves expensive data checking\n * and indexing in long series, and makes data-heavy charts render faster.\n *\n * Set it to `0` disable.\n *\n * Note:\n * - In boost mode turbo threshold is forced. Only array of numbers or two\n * dimensional arrays are allowed.\n * - In version 11.4.3 and earlier, if object configurations were passed\n * beyond the turbo threshold, a warning was logged in the console and the\n * data series didn't render.\n *\n * @since 2.2\n * @product highcharts highstock gantt\n */\n turboThreshold: 1000,\n /**\n * An array defining zones within a series. Zones can be applied to the\n * X axis, Y axis or Z axis for bubbles, according to the `zoneAxis`\n * option. The zone definitions have to be in ascending order regarding\n * to the value.\n *\n * In styled mode, the color zones are styled with the\n * `.highcharts-zone-{n}` class, or custom classed from the `className`\n * option\n * ([view live demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/color-zones/)).\n *\n * @see [zoneAxis](#plotOptions.series.zoneAxis)\n *\n * @sample {highcharts} highcharts/series/color-zones-simple/\n * Color zones\n * @sample {highstock} highcharts/series/color-zones-simple/\n * Color zones\n *\n * @declare Highcharts.SeriesZonesOptionsObject\n * @type {Array<*>}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones\n */\n /**\n * Styled mode only. A custom class name for the zone.\n *\n * @sample highcharts/css/color-zones/\n * Zones styled by class name\n *\n * @type {string}\n * @since 5.0.0\n * @apioption plotOptions.series.zones.className\n */\n /**\n * Defines the color of the series.\n *\n * @see [series color](#plotOptions.series.color)\n *\n * @type {Highcharts.ColorType}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.color\n */\n /**\n * A name for the dash style to use for the graph.\n *\n * @see [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n *\n * @sample {highcharts|highstock} highcharts/series/color-zones-dashstyle-dot/\n * Dashed line indicates prognosis\n *\n * @type {Highcharts.DashStyleValue}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.dashStyle\n */\n /**\n * Defines the fill color for the series (in area type series)\n *\n * @see [fillColor](#plotOptions.area.fillColor)\n *\n * @type {Highcharts.ColorType}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.fillColor\n */\n /**\n * The value up to where the zone extends, if undefined the zones\n * stretches to the last value in the series.\n *\n * @type {number}\n * @since 4.1.0\n * @product highcharts highstock\n * @apioption plotOptions.series.zones.value\n */\n /**\n * When using dual or multiple color axes, this number defines which\n * colorAxis the particular series is connected to. It refers to\n * either the\n * {@link #colorAxis.id|axis id}\n * or the index of the axis in the colorAxis array, with 0 being the\n * first. Set this option to false to prevent a series from connecting\n * to the default color axis.\n *\n * Since v7.2.0 the option can also be an axis id or an axis index\n * instead of a boolean flag.\n *\n * @sample highcharts/coloraxis/coloraxis-with-pie/\n * Color axis with pie series\n * @sample highcharts/coloraxis/multiple-coloraxis/\n * Multiple color axis\n *\n * @type {number|string|boolean}\n * @default 0\n * @product highcharts highstock highmaps\n * @apioption plotOptions.series.colorAxis\n */\n /**\n * Determines what data value should be used to calculate point color\n * if `colorAxis` is used. Requires to set `min` and `max` if some\n * custom point property is used or if approximation for data grouping\n * is set to `'sum'`.\n *\n * @sample highcharts/coloraxis/custom-color-key/\n * Custom color key\n * @sample highcharts/coloraxis/color-key-with-stops/\n * Custom colorKey with color axis stops\n * @sample highcharts/coloraxis/changed-default-color-key/\n * Changed default color key\n *\n * @type {string}\n * @default y\n * @since 7.2.0\n * @product highcharts highstock highmaps\n * @apioption plotOptions.series.colorKey\n */\n /**\n * What type of legend symbol to render for this series. Can be one of\n * `areaMarker`, `lineMarker` or `rectangle`.\n *\n * @validvalue [\"areaMarker\", \"lineMarker\", \"rectangle\"]\n *\n * @sample {highcharts} highcharts/series/legend-symbol/\n * Change the legend symbol\n *\n * @type {string}\n * @default rectangle\n * @since 11.0.1\n * @apioption plotOptions.series.legendSymbol\n */\n /**\n * Defines the color of the legend symbol for this series. Defaults to\n * undefined, in which case the series color is used. Does not work with\n * styled mode.\n *\n * @sample {highcharts|highstock} highcharts/series/legend-symbol-color/\n * Change the legend symbol color\n *\n * @type {Highcharts.ColorType}\n * @default undefined\n * @since 12.0.0\n * @product highcharts highstock highmaps\n * @apioption plotOptions.series.legendSymbolColor\n */\n /**\n * Determines whether the series should look for the nearest point\n * in both dimensions or just the x-dimension when hovering the series.\n * Defaults to `'xy'` for scatter series and `'x'` for most other\n * series. If the data has duplicate x-values, it is recommended to\n * set this to `'xy'` to allow hovering over all points.\n *\n * Applies only to series types using nearest neighbor search (not\n * direct hover) for tooltip.\n *\n * @sample {highcharts} highcharts/series/findnearestpointby/\n * Different hover behaviors\n * @sample {highstock} highcharts/series/findnearestpointby/\n * Different hover behaviors\n * @sample {highmaps} highcharts/series/findnearestpointby/\n * Different hover behaviors\n *\n * @since 5.0.10\n * @validvalue [\"x\", \"xy\"]\n */\n findNearestPointBy: 'x'\n};\n/* *\n *\n * Default Export\n *\n * */\nexport default seriesDefaults;\n","/* *\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 { animObject, setAnimation } = A;\nimport DataTableCore from '../../Data/DataTableCore.js';\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport F from '../Foundation.js';\nconst { registerEventOptions } = F;\nimport H from '../Globals.js';\nconst { svg, win } = H;\nimport LegendSymbol from '../Legend/LegendSymbol.js';\nimport Point from './Point.js';\nimport SeriesDefaults from './SeriesDefaults.js';\nimport SeriesRegistry from './SeriesRegistry.js';\nconst { seriesTypes } = SeriesRegistry;\nimport SVGElement from '../Renderer/SVG/SVGElement.js';\nimport T from '../Templating.js';\nconst { format } = T;\nimport { addEvent, arrayMax, arrayMin, clamp, correctFloat, crisp, defined, destroyObjectProperties, diffObjects, erase, extend, fireEvent, getClosestDistance, internalClearTimeout, isArray, isNumber, isString, merge, objectEach, pick, pushUnique, removeEvent, syncTimeout } from '../../Shared/Utilities.js';\nimport { error, insertItem } from '../Utilities.js';\n/* *\n *\n * Class\n *\n * */\n/**\n * This is the base series prototype that all other series types inherit from.\n * A new series is initialized either through the\n * [series](https://api.highcharts.com/highcharts/series)\n * option structure, or after the chart is initialized, through\n * {@link Highcharts.Chart#addSeries}.\n *\n * The object can be accessed in a number of ways. All series and point event\n * handlers give a reference to the `series` object. The chart object has a\n * {@link Highcharts.Chart#series|series} property that is a collection of all\n * the chart's series. The point objects and axis objects also have the same\n * reference.\n *\n * Another way to reference the series programmatically is by `id`. Add an id\n * in the series configuration options, and get the series object by\n * {@link Highcharts.Chart#get}.\n *\n * Configuration options for the series are given in three levels. Options for\n * all series in a chart are given in the\n * [plotOptions.series](https://api.highcharts.com/highcharts/plotOptions.series)\n * object. Then options for all series of a specific type\n * are given in the plotOptions of that type, for example `plotOptions.line`.\n * Next, options for one single series are given in the series array, or as\n * arguments to `chart.addSeries`.\n *\n * The data in the series is stored in various arrays.\n *\n * - First, `series.options.data` contains all the original config options for\n * each point whether added by options or methods like `series.addPoint`.\n *\n * - The `series.dataTable` refers to an instance of [DataTableCore](https://api.highcharts.com/class-reference/Highcharts.Data)\n * or `DataTable` that contains the data in a tabular format. Individual\n * columns can be read from `series.getColumn()`.\n *\n * - Next, `series.data` contains those values converted to points, but in case\n * the series data length exceeds the `cropThreshold`, or if the data is\n * grouped, `series.data` doesn't contain all the points. It only contains the\n * points that have been created on demand.\n *\n * - Then there's `series.points` that contains all currently visible point\n * objects. In case of cropping, the cropped-away points are not part of this\n * array. The `series.points` array starts at `series.cropStart` compared to\n * `series.data` and `series.options.data`. If however the series data is\n * grouped, these can't be correlated one to one.\n *\n * @class\n * @name Highcharts.Series\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.SeriesOptionsType|object} options\n * The series options.\n */\nclass Series {\n constructor() {\n /* *\n *\n * Static Properties\n *\n * */\n /** @internal */\n this.zoneAxis = 'y';\n // eslint-enable valid-jsdoc\n }\n /* *\n *\n * API JSDoc doclet copies for uninitialized properties\n *\n * */\n /**\n * Read only. The chart that the series belongs to.\n *\n * @name Highcharts.Series#chart\n * @type {Highcharts.Chart}\n */\n /**\n * Series color as used by the legend and some series types.\n * @name Highcharts.Series#color\n * @type {Highcharts.ColorType|undefined}\n */\n /**\n * Read only. An array containing those values converted to points.\n * In case the series data length exceeds the `cropThreshold`, or if\n * the data is grouped, `series.data` doesn't contain all the\n * points. Also, in case a series is hidden, the `data` array may be\n * empty. In case of cropping, the `data` array may contain `undefined`\n * values, instead of points. To access raw values,\n * `series.options.data` will always be up to date. `Series.data` only\n * contains the points that have been created on demand. To modify the\n * data, use\n * {@link Highcharts.Series#setData} or\n * {@link Highcharts.Point#update}.\n *\n * @see Series.points\n *\n * @name Highcharts.Series#data\n * @type {Array<Highcharts.Point>}\n */\n /**\n * Contains the maximum value of the series' data point. Some series\n * types like `networkgraph` do not support this property as they\n * lack a `y`-value.\n * @name Highcharts.Series#dataMax\n * @type {number|undefined}\n * @readonly\n */\n /**\n * Contains the minimum value of the series' data point. Some series\n * types like `networkgraph` do not support this property as they\n * lack a `y`-value.\n * @name Highcharts.Series#dataMin\n * @type {number|undefined}\n * @readonly\n */\n /**\n * Contains the series' index in the `Chart.series` array.\n *\n * @name Highcharts.Series#index\n * @type {number}\n * @readonly\n */\n /**\n * The parent series of the current series, if the current\n * series has a [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n * setting.\n *\n * @name Highcharts.Series#linkedParent\n * @type {Highcharts.Series}\n * @readonly\n */\n /**\n * All child series that are linked to the current series through the\n * [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n * option.\n *\n * @name Highcharts.Series#linkedSeries\n * @type {Array<Highcharts.Series>}\n * @readonly\n */\n /**\n * The series name as given in the options. Defaults to\n * \"Series {n}\".\n *\n * @name Highcharts.Series#name\n * @type {string}\n */\n /**\n * Read only. The series' current options. To update, use\n * {@link Series#update}.\n *\n * @name Highcharts.Series#options\n * @type {Highcharts.SeriesOptionsType}\n */\n /**\n * An array containing all currently visible point objects. In case\n * of cropping, the cropped-away points are not part of this array.\n * The `series.points` array starts at `series.cropStart` compared\n * to `series.data` and `series.options.data`. If however the series\n * data is grouped, these can't be correlated one to one. To modify\n * the data, use {@link Highcharts.Series#setData} or\n * {@link Highcharts.Point#update}.\n *\n * @name Highcharts.Series#points\n * @type {Array<Highcharts.Point>}\n */\n /**\n * Read only. The series' selected state as set by {@link\n * Highcharts.Series#select}.\n *\n * @name Highcharts.Series#selected\n * @type {boolean}\n */\n /**\n * Read only. The series' type, like \"line\", \"area\", \"column\" etc.\n * The type in the series options anc can be altered using\n * {@link Series#update}.\n *\n * @name Highcharts.Series#type\n * @type {string}\n */\n /**\n * Read only. The series' visibility state as set by\n * {@link Series#show}, {@link Series#hide}, or in the initial\n * configuration. True by default.\n *\n * @name Highcharts.Series#visible\n * @type {boolean}\n * @default true\n */\n /**\n * Read only. The unique xAxis object associated\n * with the series.\n *\n * @name Highcharts.Series#xAxis\n * @type {Highcharts.Axis}\n */\n /**\n * Read only. The unique yAxis object associated\n * with the series.\n *\n * @name Highcharts.Series#yAxis\n * @type {Highcharts.Axis}\n */\n /**\n * Contains series options by the user without defaults.\n * @name Highcharts.Series#userOptions\n * @type {Highcharts.SeriesOptionsType}\n */\n /* *\n *\n * Functions\n *\n * */\n /** @internal */\n init(chart, userOptions) {\n fireEvent(this, 'init', { options: userOptions });\n const series = this, chartSeries = chart.series;\n // The 'eventsToUnbind' property moved from prototype into the\n // Series init to avoid reference to the same array between\n // the different series and charts. #12959, #13937\n this.eventsToUnbind = [];\n this.condemnedPoints || (this.condemnedPoints = []);\n /**\n * Read only. The chart that the series belongs to.\n *\n * @name Highcharts.Series#chart\n * @type {Highcharts.Chart}\n */\n series.chart = chart;\n /**\n * Read only. The series' type, like \"line\", \"area\", \"column\" etc.\n * The type in the series options anc can be altered using\n * {@link Series#update}.\n *\n * @name Highcharts.Series#type\n * @type {string}\n */\n /**\n * Read only. The series' current options. To update, use\n * {@link Series#update}.\n *\n * @name Highcharts.Series#options\n * @type {Highcharts.SeriesOptionsType}\n */\n series.options = series.setOptions(userOptions);\n const options = series.options, visible = options.visible !== false;\n // Create the data table\n this.dataTable ?? (this.dataTable = options.dataTable?.isDataTable ?\n options.dataTable :\n new DataTableCore(options.dataTable));\n /**\n * All child series that are linked to the current series through the\n * [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n * option.\n *\n * @name Highcharts.Series#linkedSeries\n * @type {Array<Highcharts.Series>}\n * @readonly\n */\n series.linkedSeries = [];\n // Bind the axes\n series.bindAxes();\n extend(series, {\n /**\n * The series name as given in the options. Defaults to\n * \"Series {n}\".\n *\n * @name Highcharts.Series#name\n * @type {string}\n */\n name: options.name,\n state: '',\n /**\n * Read only. The series' visibility state as set by {@link\n * Series#show}, {@link Series#hide}, or in the initial\n * configuration.\n *\n * @name Highcharts.Series#visible\n * @type {boolean}\n */\n visible, // True by default\n /**\n * Read only. The series' selected state as set by {@link\n * Highcharts.Series#select}.\n *\n * @name Highcharts.Series#selected\n * @type {boolean}\n */\n selected: options.selected === true // False by default\n });\n registerEventOptions(this, options);\n const events = options.events;\n if (events?.click ||\n options.point?.events?.click ||\n options.allowPointSelect) {\n chart.runTrackerClick = true;\n }\n series.getColor();\n series.getSymbol();\n // Mark cartesian\n if (series.isCartesian) {\n chart.hasCartesianSeries = true;\n }\n // Get the index and register the series in the chart. The index is\n // one more than the current latest series index (#5960).\n let lastSeries;\n if (chartSeries.length) {\n lastSeries = chartSeries[chartSeries.length - 1];\n }\n series._i = pick(lastSeries?._i, -1) + 1;\n series.opacity = series.options.opacity;\n // Insert the series and re-order all series above the insertion\n // point.\n chart.orderItems('series', insertItem(this, chartSeries));\n if (!series.points && !series.data) {\n series.setData(options.data, false);\n }\n fireEvent(this, 'afterInit');\n }\n /**\n * Check whether the series item is itself or inherits from a certain\n * series type.\n *\n * @function Highcharts.Series#is\n * @param {string} type The type of series to check for, can be either\n * featured or custom series types. For example `column`, `pie`,\n * `ohlc` etc.\n *\n * @return {boolean}\n * True if this item is or inherits from the given type.\n */\n // TODO: Runtime checks `instanceof`, so this also confirms inheritance.\n // The type guard currently narrows to the requested type only. Aligning\n // typing 1:1 with runtime should be easier after pending TS cleanups.\n is(type) {\n return seriesTypes[type] && this instanceof seriesTypes[type];\n }\n /**\n * Set the xAxis and yAxis properties of cartesian series, and register\n * the series in the `axis.series` array.\n *\n * @internal\n * @function Highcharts.Series#bindAxes\n */\n bindAxes() {\n const series = this, seriesOptions = series.options, chart = series.chart;\n let axisOptions;\n fireEvent(this, 'bindAxes', null, function () {\n // Repeat for xAxis and yAxis\n (series.axisTypes || []).forEach(function (coll) {\n // Loop through the chart's axis objects\n (chart[coll] || []).forEach(function (axis) {\n axisOptions = axis.options;\n // Apply if the series xAxis or yAxis option matches\n // the number of the axis, or if undefined, use the\n // first axis\n if (pick(seriesOptions[coll], 0) === axis.index ||\n (typeof seriesOptions[coll] !==\n 'undefined' &&\n seriesOptions[coll] === axisOptions.id)) {\n // Register this series in the axis.series lookup\n insertItem(series, axis.series);\n // Set this series.xAxis or series.yAxis reference\n series[coll] = axis;\n // Mark dirty for redraw\n axis.isDirty = true;\n }\n });\n // The series needs an X and an Y axis\n if (!series[coll] &&\n series.optionalAxis !== coll) {\n error(18, true, chart);\n }\n });\n });\n fireEvent(this, 'afterBindAxes');\n }\n /**\n * Define hasData functions for series. These return true if there\n * are data points on this series within the plot area.\n *\n * @internal\n * @function Highcharts.Series#hasData\n */\n hasData() {\n return ((this.visible &&\n typeof this.dataMax !== 'undefined' &&\n typeof this.dataMin !== 'undefined') || ( // #3703\n this.visible &&\n this.dataTable.rowCount > 0 // #9758\n ));\n }\n /**\n * Determine whether the marker in a series has changed.\n *\n * @internal\n * @function Highcharts.Series#hasMarkerChanged\n */\n hasMarkerChanged(options, oldOptions) {\n const marker = options.marker, oldMarker = oldOptions.marker || {};\n return marker && ((oldMarker.enabled && !marker.enabled) ||\n oldMarker.symbol !== marker.symbol || // #10870, #15946\n oldMarker.height !== marker.height || // #16274\n oldMarker.width !== marker.width // #16274\n );\n }\n /**\n * Return an auto incremented x value based on the pointStart and\n * pointInterval options. This is only used if an x value is not given\n * for the point that calls autoIncrement.\n *\n * @internal\n * @function Highcharts.Series#autoIncrement\n */\n autoIncrement(x) {\n const options = this.options, { pointIntervalUnit, relativeXValue } = this.options, time = this.chart.time, xIncrement = this.xIncrement ??\n time.parse(options.pointStart) ??\n 0;\n let pointInterval;\n this.pointInterval = pointInterval = pick(this.pointInterval, options.pointInterval, 1);\n if (relativeXValue && isNumber(x)) {\n pointInterval *= x;\n }\n // Added code for pointInterval strings\n if (pointIntervalUnit) {\n const d = time.toParts(xIncrement);\n if (pointIntervalUnit === 'day') {\n d[2] += pointInterval;\n }\n else if (pointIntervalUnit === 'month') {\n d[1] += pointInterval;\n }\n else if (pointIntervalUnit === 'year') {\n d[0] += pointInterval;\n }\n pointInterval = time.makeTime.apply(time, d) - xIncrement;\n }\n if (relativeXValue && isNumber(x)) {\n return xIncrement + pointInterval;\n }\n this.xIncrement = xIncrement + pointInterval;\n return xIncrement;\n }\n /**\n * Set the series options by merging from the options tree. Called\n * internally on initializing and updating series. This function will\n * not redraw the series. For API usage, use {@link Series#update}.\n *\n * @internal\n * @function Highcharts.Series#setOptions\n * @param {Highcharts.SeriesOptionsType} itemOptions\n * The series options.\n * @emits Highcharts.Series#event:afterSetOptions\n */\n setOptions(itemOptions) {\n const chart = this.chart, chartOptions = chart.options, plotOptions = chartOptions.plotOptions, userOptions = chart.userOptions || {}, seriesUserOptions = merge(itemOptions), styledMode = chart.styledMode, e = {\n plotOptions: plotOptions,\n userOptions: seriesUserOptions\n };\n let zone;\n fireEvent(this, 'setOptions', e);\n // These may be modified by the event\n const typeOptions = e.plotOptions[this.type], userPlotOptions = (userOptions.plotOptions || {}), userPlotOptionsSeries = userPlotOptions.series || {}, defaultPlotOptionsType = (defaultOptions.plotOptions[this.type] || {}), userPlotOptionsType = userPlotOptions[this.type] || {};\n // Merge in multiple data label options from the plot option. (#21928)\n typeOptions.dataLabels = this.mergeArrays(defaultPlotOptionsType.dataLabels, typeOptions.dataLabels);\n // Use copy to prevent undetected changes (#9762)\n this.userOptions = e.userOptions;\n const options = merge(typeOptions, plotOptions.series, \n // #3881, chart instance plotOptions[type] should trump\n // plotOptions.series\n userPlotOptionsType, seriesUserOptions), \n // Handle color zones\n { negativeColor, negativeFillColor, zoneAxis = 'y', zones } = options, \n // #20440, create deep copy of zones options\n zonesCopy = (zones || []).map((z) => ({ ...z }));\n // The tooltip options are merged between global and series specific\n // options. Importance in ascending order:\n // globals: (1)tooltip, (2)plotOptions.series,\n // (3)plotOptions[this.type]\n // init userOptions with possible later updates: 4-6 like 1-3 and\n // (7)this series options\n this.tooltipOptions = merge(defaultOptions.tooltip, // 1\n defaultOptions.plotOptions.series?.tooltip, // 2\n defaultPlotOptionsType?.tooltip, // 3\n chart.userOptions.tooltip, // 4\n userPlotOptions.series?.tooltip, // 5\n userPlotOptionsType.tooltip, // 6\n seriesUserOptions.tooltip // 7\n );\n // When shared tooltip, stickyTracking is true by default,\n // unless user says otherwise.\n this.stickyTracking = pick(seriesUserOptions.stickyTracking, userPlotOptionsType.stickyTracking, userPlotOptionsSeries.stickyTracking, (this.tooltipOptions.shared && !this.noSharedTooltip ?\n true :\n options.stickyTracking));\n // Delete marker object if not allowed (#1125)\n if (typeOptions.marker === null) {\n delete options.marker;\n }\n this.zones || (this.zones = zonesCopy);\n this.zoneAxis = zoneAxis;\n if ((negativeColor || negativeFillColor) &&\n !zones) {\n zone = {\n value: options[zoneAxis + 'Threshold'] ||\n options.threshold ||\n 0,\n className: 'highcharts-negative'\n };\n if (!styledMode) {\n // Styled mode allows boolean\n if (typeof negativeColor !== 'boolean') {\n zone.color = negativeColor;\n }\n zone.fillColor = negativeFillColor;\n }\n zonesCopy.push(zone);\n }\n // Push one extra zone for the rest\n if (zonesCopy.length &&\n defined(zonesCopy[zonesCopy.length - 1].value)) {\n zonesCopy.push(styledMode ? {} : {\n color: this.color,\n fillColor: this.fillColor\n });\n }\n fireEvent(this, 'afterSetOptions', { options });\n return options;\n }\n /**\n * Return the name for the series. Looks for a `name` in the options. If not\n * found, looks for a column name in the data mapping. If not found, returns\n * a default name based on the series type and index in `Series {n}`\"\n * format. This method can be simply overridden as series name format can\n * vary (e.g. technical indicators).\n *\n * @function Highcharts.Series#getName\n *\n * @return {string} The series name.\n */\n getName() {\n const { chart, options } = this, { dataMapping, name } = options, valueMapping = dataMapping?.y || dataMapping?.value, columnKey = isString(valueMapping) ?\n valueMapping : valueMapping?.column;\n // #4119\n return name ?? (isString(columnKey) ?\n columnKey :\n format(chart.options.lang.seriesName, this, chart));\n }\n /**\n * Set series-specific properties for color and symbol. Called internally\n * from Series.update().\n *\n * @internal\n * @function Highcharts.Series#getCyclic\n *\n * @param {'color'|'symbol'} prop\n * The property to set, either `color` or `symbol`.\n * @param {*} [value]\n * The value to set. If not given, the next available value is used.\n * @param {Highcharts.Dictionary<*>} [defaults]\n * The default values.\n */\n getCyclic(prop, value, defaults) {\n const chart = this.chart, indexName = `${prop}Index`, counterName = `${prop}Counter`, len = (\n // Symbol count\n defaults?.length ||\n // Color count\n chart.options.chart.colorCount);\n let i, setting;\n if (!value) {\n // Pick up either the colorIndex option, or the series.colorIndex\n // after Series.update()\n setting = pick(prop === 'color' ? this.options.colorIndex : void 0, this[indexName]);\n if (defined(setting)) { // After Series.update()\n i = setting;\n }\n else {\n // #6138\n if (!chart.series.length) {\n chart[counterName] = 0;\n }\n i = chart[counterName] % len;\n chart[counterName] += 1;\n }\n if (defaults) {\n value = defaults[i];\n }\n }\n // Set the colorIndex\n if (typeof i !== 'undefined') {\n this[indexName] = i;\n }\n this[prop] = value;\n }\n /**\n * Get the series' color based on either the options or pulled from\n * global options.\n *\n * @internal\n * @function Highcharts.Series#getColor\n */\n getColor() {\n const chart = this.chart;\n if (chart.styledMode) {\n this.getCyclic('color');\n }\n else if (this.options.colorByPoint) {\n this.color = 'var(--highcharts-neutral-color-20)';\n }\n else {\n this.getCyclic('color', this.options.color ||\n defaultOptions.plotOptions[this.type]?.color, chart.options.colors);\n }\n }\n /**\n * Get all points' instances created for this series.\n *\n * @internal\n * @function Highcharts.Series#getPointsCollection\n */\n getPointsCollection() {\n return (this.hasGroupedData ? this.points : this.data) || [];\n }\n /**\n * Get the series' symbol based on either the options or pulled from\n * global options.\n *\n * @internal\n * @function Highcharts.Series#getSymbol\n */\n getSymbol() {\n const seriesMarkerOption = this.options.marker;\n this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);\n }\n /**\n * Shorthand to get one of the series' data columns from `Series.dataTable`.\n *\n * @internal\n * @function Highcharts.Series#getColumn\n */\n getColumn(columnId, modified, matchLength) {\n const table = modified ? this.dataTable.getModified() : this.dataTable, rowCount = table.rowCount, usingModified = this.dataTable !== table, column = table.getColumn(columnId, true);\n // When there is no x column in the data set, generate an internal x\n // column for the series. The `xColumn` array is cached and reused, but\n // cleared on series update.\n if (columnId === 'x' && !usingModified) {\n // Return cached xColumn if it exists\n if (this.xColumn) {\n return this.xColumn;\n }\n const nameColumn = table.getColumn('name', true), options = this.options, \n // Check for empty or non-numeric x values. A for loop is faster\n // than Array.prototype.some, and covers empty slots. Cache the\n // result for faster subsequent checks.\n isNumbers = (arr) => {\n if (this.xColumnIsNumbers !== void 0) {\n return this.xColumnIsNumbers;\n }\n for (const x of arr) {\n if (typeof x !== 'number') {\n return (this.xColumnIsNumbers = false);\n }\n }\n return (this.xColumnIsNumbers = true);\n };\n // Reset the counter\n this.xIncrement = null;\n // Under these conditions, we need to generate the x data\n if (!column ||\n this.xAxis?.hasNames ||\n options.relativeXValue ||\n // X column exists in the data table, but has gaps or strings\n (column.length < (options.turboThreshold || Infinity) &&\n !this.boosted &&\n !isNumbers(column))) {\n const xColumn = [];\n for (let i = 0; i < rowCount; i++) {\n const xOption = column?.[i];\n if (!defined(xOption)) {\n // When x values are missing, make sure we\n // auto-increment from the last point, not from zero.\n // Otherwise date-axes would be extended from\n // 1970-01-01.\n this.xIncrement ?? (this.xIncrement = xColumn[xColumn.length - 1] ?? null);\n }\n xColumn.push(this.getX(xOption, nameColumn?.[i]));\n }\n return (this.xColumn = xColumn);\n }\n }\n return column || Array(matchLength ? rowCount : 0);\n }\n /**\n * Get the x value for a given point.\n *\n * @internal\n */\n getX(xOption, name) {\n if (this.xAxis?.hasNames &&\n this.dataTable.getColumn('name', true) &&\n defined(name)) {\n return this.xAxis.nameToX({ name, series: this }, xOption);\n }\n if (typeof xOption === 'undefined' ||\n (isNumber(xOption) && this.options.relativeXValue)) {\n return this.autoIncrement(xOption);\n }\n // If x is a string, try to parse it to a datetime\n if (typeof xOption === 'string') {\n xOption = this.chart.time.parse(xOption);\n if (isNumber(xOption)) {\n return xOption;\n }\n }\n return xOption;\n }\n /**\n * Internal function called from setData. If the point count is the same\n * as it was, or if there are overlapping X values, just run\n * Point.update which is cheaper, allows animation, and keeps references\n * to points. This also allows adding or removing points if the X-es\n * don't match.\n *\n * @internal\n * @function Highcharts.Series#matchPoints\n */\n matchPoints(oldXColumn, oldIdColumn, oldNameColumn, \n // Index matching is used by the data-sorting module\n oldIndexColumn) {\n const { dataTable, options, requireSorting } = this, dataSorting = options.dataSorting, oldData = this.data, rowsToAdd = [], rowsToUpdate = [], equalLength = dataTable.rowCount === oldData.length;\n let hasUpdatedByKey, i, point, lastIndex = 0, succeeded = true;\n this.xIncrement = null;\n delete this.xColumn;\n const newXColumn = dataTable.getColumn('x'), newIdColumn = dataTable.getColumn('id'), newNameColumn = dataSorting?.matchByName ?\n dataTable.getColumn('name') : void 0, newIndexColumn = dataTable.getColumn('index');\n // Iterate the new data\n for (i = 0; i < dataTable.rowCount; i++) {\n const x = newXColumn?.[i], id = newIdColumn?.[i], name = newNameColumn?.[i], index = newIndexColumn?.[i], [needle, haystack] = id && oldIdColumn ?\n [id, oldIdColumn] :\n name && oldNameColumn ?\n [name, oldNameColumn] :\n defined(index) && oldIndexColumn ?\n [index, oldIndexColumn] :\n defined(x) && oldXColumn ?\n [x, oldXColumn] :\n [];\n let pointIndex = -1;\n // We have a needle and a haystack to search for matching points\n if (haystack) {\n pointIndex = haystack.indexOf(needle, lastIndex);\n // Matching X not found or used already due to non-unique x\n // values (#8995), add point (but later)\n if (pointIndex === -1) {\n const optionsX = newXColumn?.[i];\n let newIndex = oldXColumn?.length ?? dataTable.rowCount;\n while (newIndex &&\n oldXColumn &&\n typeof optionsX === 'number' &&\n oldXColumn[newIndex - 1] > optionsX) {\n newIndex--;\n }\n rowsToAdd.push({ newIndex, oldIndex: i });\n // Matching X found, update\n }\n else if (oldData[pointIndex] /* &&\n pOptions === oldData[pointIndex]?.options*/) {\n rowsToUpdate.push({\n newIndex: pointIndex,\n oldIndex: i\n });\n // Mark it touched, below we will remove all points that\n // are not touched.\n oldData[pointIndex].touched = true;\n // Speed optimize by only searching after last known\n // index. Performs ~20% better on large data sets.\n if (requireSorting) {\n lastIndex = pointIndex + 1;\n }\n // Point exists, no changes, don't remove it\n } /*/ else if (oldData[pointIndex]) {\n oldData[pointIndex].touched = true;\n }*/\n // If the length is equal and some of the nodes had a\n // match in the same position, we don't want to remove\n // non-matches.\n if (!equalLength ||\n i !== pointIndex ||\n dataSorting?.enabled ||\n this.hasDerivedData) {\n hasUpdatedByKey = true;\n }\n }\n else {\n // Gather all points that are not matched\n rowsToAdd.push({ newIndex: i, oldIndex: i });\n }\n }\n // Remove points that don't exist in the updated data set\n if (hasUpdatedByKey) {\n // Update matching points\n rowsToUpdate.forEach((row) => {\n oldData[row.newIndex].applyOptions(dataTable.getRowObject(row.oldIndex));\n });\n // Add new points\n rowsToAdd.sort((a, b) => b.newIndex - a.newIndex);\n rowsToAdd.forEach((data) => {\n // Splice in an undefined item, `generatePoints` will pick it\n // up and create the point\n oldData.splice(data.newIndex, 0, void 0);\n });\n // Remove points not touched\n i = oldData.length;\n while (i--) {\n point = oldData[i];\n if (point && !point.touched) {\n point.destroy();\n oldData.splice(i, 1);\n }\n }\n this.isDirtyData = this.isDirty = true;\n // If we did not find keys (ids or x-values), and the length is the\n // same, update one-to-one\n }\n else if (equalLength && !dataSorting?.enabled) {\n for (i = 0; i < dataTable.rowCount; i++) {\n if (!oldData[i].destroyed && !oldData[i].condemned) {\n const pOptions = dataTable.getRowObject(i);\n if (pOptions) {\n Object.keys(pOptions).forEach((key) => {\n if (!defined(pOptions[key]) /* ||\n pOptions[key] === oldData[i].options[key]*/) {\n delete pOptions[key];\n }\n });\n if (Object.keys(pOptions).length) {\n oldData[i].update(pOptions, false, void 0, false);\n }\n }\n }\n }\n // Did not succeed in updating data\n }\n else {\n succeeded = false;\n }\n oldData.forEach((point) => {\n if (point) {\n point.touched = false;\n }\n });\n if (!succeeded) {\n return false;\n }\n const xData = this.getColumn('x');\n if (this.xIncrement === null &&\n xData.length) {\n this.xIncrement = arrayMax(xData);\n this.autoIncrement();\n }\n return true;\n }\n getDataColumnKeys() {\n return this.dataColumnKeys || ['x', ...(this.pointArrayMap || ['y'])];\n }\n /**\n * Apply a new set of data to the series and optionally redraw it. The new\n * data array is passed by reference (except in case of `updatePoints`), and\n * may later be mutated when updating the chart data.\n *\n * Note the difference in behavior when setting the same amount of points,\n * or a different amount of points, as handled by the `updatePoints`\n * parameter.\n *\n * @sample highcharts/members/series-setdata/\n * Set new data from a button\n * @sample highcharts/members/series-setdata-pie/\n * Set data in a pie\n * @sample stock/members/series-setdata/\n * Set new data in Highcharts Stock\n * @sample maps/members/series-setdata/\n * Set new data in Highmaps\n *\n * @function Highcharts.Series#setData\n *\n * @param {Array<Highcharts.PointOptionsType>|Highcharts.DataTableOptionsObject|Highcharts.DataTable|undefined} data\n * Takes an array of data in the same format as described under\n * `series.{type}.data` for the given series type, for example a line\n * series would take data in the form described under\n * [series.line.data](https://api.highcharts.com/highcharts/series.line.data).\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing\n * more operations on the chart, it is a good idea to set redraw to\n * false and call {@link Chart#redraw} after.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n * When the updated data is the same length as the existing data,\n * points will be updated by default, and animation visualizes how\n * the points are changed. Set false to disable animation, or a\n * configuration object to set duration or easing.\n *\n * @param {boolean} [updatePoints=true]\n * When this is true, points will be updated instead of replaced\n * whenever possible. This occurs a) when the updated data is the\n * same length as the existing data, b) when points are matched by\n * their id's, or c) when points can be matched by X values. This\n * allows updating with animation and performs better. In this case,\n * the original array is not passed by reference. Set `false` to\n * prevent.\n */\n setData(data, redraw = true, animation, updatePoints) {\n const series = this, table = this.dataTable, options = series.options, oldData = series.points, oldDataLength = oldData?.length || 0, oldXColumn = table.getColumn('x'), oldIdColumn = table.getColumn('id'), oldNameColumn = (\n // To get the bar race right. When data sorting is enabled, the\n // point order is not in sync with the table order. Could this\n // be done in a better way, maybe in the data sorting module?\n options.dataSorting?.matchByName &&\n oldData?.map((point) => point.name)) || table.getColumn('name'), oldIndexColumn = table.getColumn('index'), chart = series.chart, xAxis = series.xAxis;\n let updatedData, i, copiedData;\n if (!chart.options.chart.allowMutatingData) { // #4259\n // Remove old reference\n if (options.data) {\n delete series.options.data;\n }\n if (series.userOptions.data) {\n delete series.userOptions.data;\n }\n copiedData = merge(true, data);\n }\n data = copiedData || data;\n // Reset properties\n series.xIncrement = null;\n delete series.xColumn;\n delete series.xColumnIsNumbers;\n if (table !== options.dataTable) {\n delete table.columns.x;\n }\n series.colorCounter = 0; // For series with colorByPoint (#1547)\n // Array passed as option\n if (isArray(data)) {\n this.setDataFromArray(data);\n // Data table passed as option, either on series or chart\n }\n else {\n this.setDataFromTable(data);\n }\n if (updatePoints !== false &&\n oldDataLength &&\n !series.cropped &&\n !series.hasGroupedData &&\n series.visible &&\n // Soft updating has no benefit in boost, and causes JS error\n // (#8355)\n !series.boosted) {\n updatedData = this.matchPoints(oldXColumn, oldIdColumn, oldNameColumn, oldIndexColumn);\n }\n if (!updatedData) {\n // Forgetting to cast strings to numbers is a common caveat when\n // handling CSV or JSON\n if (isString(this.getColumn('y')[0])) {\n error(14, true, chart);\n }\n series.data = [];\n // Destroy old points\n i = oldDataLength;\n while (i--) {\n oldData[i]?.destroy();\n }\n // Reset minRange (#878)\n if (xAxis) {\n xAxis.minRange = xAxis.userMinRange;\n }\n // Redraw\n series.isDirty = chart.isDirtyBox = true;\n series.isDirtyData = !!oldData;\n animation = false;\n }\n if (isArray(data)) {\n series.options.data = series.userOptions.data = data;\n }\n // Typically for pie series, points need to be processed and generated\n // prior to rendering the legend\n if (options.legendType === 'point') {\n this.processData();\n this.generatePoints();\n }\n if (redraw) {\n chart.redraw(animation);\n }\n }\n /**\n * Internal function to set data from an array of point options - objects,\n * arrays or numbers. This corresponds to the `data` series option. Called\n * from the official `setData` method.\n *\n * @param {Array<Highcharts.PointOptionsType>} data\n * The data array\n * @internal\n */\n setDataFromArray(data) {\n const dataLength = data.length, { keys, turboThreshold } = this.options, { pointValKey = 'y', pointArrayMap = [] } = this, valueCount = pointArrayMap.length, table = this.dataTable, dataColumnKeys = this.getDataColumnKeys();\n // In turbo mode, look for one- or twodimensional arrays of numbers. The\n // first and the last valid value are tested, and we assume that all the\n // rest are defined the same way. Although the 'for' loops are similar,\n // they are repeated inside each if-else conditional for max\n // performance.\n let runTurbo = turboThreshold && dataLength > turboThreshold, indexOfX = 0, indexOfY = 1;\n if (runTurbo) {\n const firstPoint = this.getFirstValidPoint(data), lastPoint = this.getFirstValidPoint(data, dataLength - 1, -1), isShortArray = (a) => Boolean(isArray(a) && (keys || isNumber(a[0])));\n // Assume all points are numbers\n if (isNumber(firstPoint) && isNumber(lastPoint)) {\n table.setColumn(pointValKey, data);\n // Assume all points are arrays when first point is\n }\n else if (isShortArray(firstPoint) &&\n isShortArray(lastPoint)) {\n if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n // When autoX is 1, the x is skipped: [low, high]. When\n // autoX is 0, the x is included: [x, low, high]\n const autoX = firstPoint.length === valueCount, colArray = new Array(firstPoint.length)\n .fill(0).map(() => []);\n for (const pt of data) {\n for (let j = 0; j <= valueCount; j++) {\n colArray[j]?.push(pt[j]);\n }\n }\n table.setColumns((autoX ? pointArrayMap : dataColumnKeys).reduce((columns, columnId, i) => {\n columns[columnId] = colArray[i];\n return columns;\n }, {}));\n }\n else { // [x, y]\n if (keys) {\n indexOfX = keys.indexOf('x');\n indexOfY = keys.indexOf('y');\n indexOfX = indexOfX >= 0 ? indexOfX : 0;\n indexOfY = indexOfY >= 0 ? indexOfY : 1;\n }\n if (firstPoint.length === 1) {\n indexOfY = 0;\n }\n const xData = [], valueData = [];\n if (indexOfX === indexOfY) {\n for (const pt of data) {\n valueData.push(pt[indexOfY]);\n }\n table.setColumn(pointValKey, valueData);\n }\n else {\n for (const pt of data) {\n xData.push(pt[indexOfX]);\n valueData.push(pt[indexOfY]);\n }\n table.setColumns({\n x: xData,\n [pointValKey]: valueData\n });\n }\n }\n }\n else {\n // Highcharts expects configs to be numbers or arrays in turbo\n // mode\n runTurbo = false;\n }\n }\n if (!runTurbo) {\n const columns = {};\n for (let i = 0; i < dataLength; i++) {\n const ptOptions = this.pointClass.prototype\n .optionsToObject\n .call({ series: this }, data[i]);\n for (const key of Object.keys(ptOptions)) {\n columns[key] || (columns[key] = new Array(dataLength));\n columns[key][i] = ptOptions[key];\n }\n }\n // Empty data, clear table\n if (dataLength) {\n table.setColumns(columns);\n }\n else {\n table.deleteRows(0, table.rowCount);\n }\n }\n }\n /**\n * Internal function to set data from a data table, either an instance or\n * options object. This corresponds to the `data` series option. Called\n * from the official `setData` method.\n *\n * @param {Highcharts.DataTableOptionsObject|Highcharts.DataTable} data\n * The data array\n * @internal\n */\n setDataFromTable(data) {\n const { chart, options, dataTable: table } = this, seriesDataTable = chart.getDataTable(options), dataTables = data ? [data] : (\n // Use either dataTable from series options or from the chart\n seriesDataTable.length ?\n seriesDataTable :\n chart.dataTable), dataColumnKeys = this.getDataColumnKeys(), mapping = options.dataMapping, keys = dataColumnKeys.slice();\n // Extend the data column keys with the keys from the column assignment\n if (mapping) {\n Object.keys(mapping).forEach((key) => {\n pushUnique(keys, key);\n });\n this.dataColumnKeys = keys;\n }\n dataTables.forEach((dataTable, dtIndex) => {\n // Resolve the data mapping\n const columns = keys\n .reduce((targetColumns, key) => {\n const mappingItem = mapping?.[key], srcColumns = dataTable.columns || {}, dtId = dataTable.id, column = isString(mappingItem) ?\n // String definition points directly to a column id\n // on the first data table\n (dtIndex === 0 && srcColumns[mappingItem]) :\n // Object definition, check for matching data table\n // and column id/index\n ((mappingItem?.dataTable || 0) === dtIndex ||\n (dtId && mappingItem?.dataTable === dtId)) &&\n (isNumber(mappingItem?.column) ?\n Object.values(srcColumns)[mappingItem.column] :\n srcColumns[mappingItem?.column || key]);\n if (column) {\n targetColumns[key] = column;\n }\n return targetColumns;\n }, {});\n // If a DataTable is passed and no column assignment is set, use it\n // directly\n if (mapping || dataTable) {\n // Set the columns\n table.setColumns(columns);\n }\n // If a DataTable is passed directly by reference, bind events to\n // keep the series updated\n if (dataTable.isDataTable) {\n this.bindDataTableEvents(dataTable, columns);\n }\n });\n }\n /**\n * Bind data table events to keep the series updated when changes occur to\n * the data table.\n *\n * @internal\n */\n bindDataTableEvents(dataTable, columns) {\n if (this.hasBoundDataTableEvents) {\n return;\n }\n const { chart, eventsToUnbind } = this, queueRedraw = () => {\n clearTimeout(chart.redrawTimeout);\n chart.redrawTimeout = setTimeout(() => chart.renderer && chart.redraw(), 0);\n };\n eventsToUnbind.push(addEvent(dataTable, 'afterSetRows', (e) => {\n const rowIndex = e.rowIndex;\n if (isNumber(rowIndex)) {\n const row = DataTableCore.prototype.getRowObject.call({ columns }, rowIndex), point = this.data[rowIndex];\n if (row) {\n if (this.currentDataGrouping) {\n // Set data with immediate redraw because it\n // destroys points\n this.setData();\n }\n else {\n if (point) {\n point.update(row, false);\n }\n else {\n this.addPoint(row, false);\n }\n queueRedraw();\n }\n }\n }\n }));\n eventsToUnbind.push(addEvent(dataTable, 'afterDeleteRows', (e) => {\n const { rowCount, rowIndex } = e;\n if (isNumber(rowIndex)) {\n for (let i = rowIndex + rowCount - 1; i >= rowIndex; i--) {\n this.removePoint(i, false);\n }\n queueRedraw();\n }\n }));\n eventsToUnbind.push(addEvent(dataTable, 'afterSetColumns', (e) => {\n this.setData(e.target);\n }));\n this.hasBoundDataTableEvents = true;\n }\n /**\n * Internal function to process the data by cropping away unused data\n * points if the series is longer than the crop threshold. This saves\n * computing time for large series.\n *\n * @internal\n * @function Highcharts.Series#getProcessedData\n * @param {boolean} [forceExtremesFromAll]\n * Force getting extremes of a total series data range.\n */\n getProcessedData(forceExtremesFromAll) {\n const series = this, { dataTable: table, isCartesian, options, xAxis } = series, cropThreshold = options.cropThreshold, getExtremesFromAll = forceExtremesFromAll ||\n // X-range series etc, #21003\n series.getExtremesFromAll, logarithmic = xAxis?.logarithmic, dataLength = table.rowCount;\n let croppedData, cropped, cropStart = 0, xExtremes, min, max, xData = series.getColumn('x'), modified = table, updatingNames = false;\n if (xAxis) {\n // Corrected for log axis (#3053)\n xExtremes = xAxis.getExtremes();\n min = xExtremes.min;\n max = xExtremes.max;\n updatingNames = !!(xAxis.categories && !xAxis.names.length);\n // Optionally filter out points outside the plot area\n if (isCartesian &&\n series.sorted &&\n !getExtremesFromAll &&\n (!cropThreshold ||\n dataLength > cropThreshold ||\n series.forceCrop)) {\n // It's outside current extremes\n if (xData[dataLength - 1] < min ||\n xData[0] > max) {\n modified = new DataTableCore();\n // Only crop if it's actually spilling out\n }\n else if (\n // Don't understand why this condition is needed\n series.getColumn(series.pointValKey || 'y').length && (xData[0] < min ||\n xData[dataLength - 1] > max)) {\n croppedData = this.cropData(table, min, max);\n modified = croppedData.modified;\n cropStart = croppedData.start;\n cropped = true;\n }\n }\n }\n // Find the closest distance between processed points\n xData = this.getColumn('x', true);\n const closestPointRange = getClosestDistance([\n logarithmic ?\n xData.map(logarithmic.log2lin) :\n xData\n ], \n // Unsorted data is not supported by the line tooltip, as well as\n // data grouping and navigation in Stock charts (#725) and width\n // calculation of columns (#1900). Avoid warning during the\n // premature processing pass in updateNames (#16104).\n () => (series.requireSorting &&\n !updatingNames &&\n error(15, false, series.chart)));\n return {\n modified,\n cropped,\n cropStart,\n closestPointRange\n };\n }\n /**\n * Internal function to apply processed data.\n * In Highcharts Stock, this function is extended to provide data grouping.\n *\n * @internal\n * @function Highcharts.Series#processData\n * @param {boolean} [force]\n * Force data grouping.\n */\n processData(force) {\n const series = this, xAxis = series.xAxis, table = series.dataTable;\n // If the series data or axes haven't changed, don't go through\n // this. Return false to pass the message on to override methods\n // like in data grouping.\n if (series.isCartesian &&\n !series.isDirty &&\n !xAxis.isDirty &&\n !series.yAxis.isDirty &&\n !force) {\n return false;\n }\n const processedData = series.getProcessedData();\n // Record the properties\n table.modified = processedData.modified;\n series.cropped = processedData.cropped; // Undefined or true\n series.cropStart = processedData.cropStart;\n series.closestPointRange = (series.basePointRange = processedData.closestPointRange);\n fireEvent(series, 'afterProcessData');\n }\n /**\n * Iterate over xData and crop values between min and max. Returns\n * object containing crop start/end cropped xData with corresponding\n * part of yData, dataMin and dataMax within the cropped range.\n *\n * @internal\n * @function Highcharts.Series#cropData\n */\n cropData(table, min, max) {\n const xData = table === this.dataTable ?\n this.getColumn('x') :\n table.getColumn('x', true), dataLength = xData.length;\n let i, j, start = 0, end = dataLength;\n // Iterate up to find slice start\n for (i = 0; i < dataLength; i++) {\n if (xData[i] >= min) {\n start = Math.max(0, i - 1);\n break;\n }\n }\n // Proceed to find slice end\n for (j = i; j < dataLength; j++) {\n if (xData[j] > max) {\n end = j + 1;\n break;\n }\n }\n // Slice all the columns and return a copy\n const columns = Object.keys(table.columns)\n .reduce((columns, key) => {\n columns[key] = (table.getColumn(key, true) || []).slice(start, end);\n return columns;\n }, {});\n // Add cropped x data to modified table\n columns.x = xData.slice(start, end);\n return {\n modified: new DataTableCore({ columns }),\n start,\n end\n };\n }\n /**\n * Generate the data point after the data has been processed by cropping\n * away unused points and optionally grouped in Highcharts Stock.\n *\n * @internal\n * @function Highcharts.Series#generatePoints\n */\n generatePoints() {\n const series = this, options = series.options, dataOptions = series.hasProcessedDataTable ? void 0 : options.data, table = series.dataTable.getModified(), xData = series.getColumn('x', true), PointClass = series.pointClass, processedDataLength = table.rowCount, cropStart = series.cropStart || 0, hasGroupedData = series.hasGroupedData, keys = options.keys, points = [], groupCropStartIndex = (options.dataGrouping?.groupAll ?\n cropStart :\n 0), \n // Create a configuration object out of a data row\n dataColumnKeys = this.getDataColumnKeys();\n let dataLength, cursor, point, i, data = series.data, pOptions;\n if (!data && !hasGroupedData) {\n const arr = [];\n arr.length = dataOptions?.length || 0;\n data = series.data = arr;\n }\n if (keys && hasGroupedData) {\n // Grouped data has already applied keys (#6590)\n series.options.keys = false;\n }\n for (i = 0; i < processedDataLength; i++) {\n cursor = cropStart + i;\n if (!hasGroupedData) {\n point = data[cursor];\n pOptions = dataOptions ?\n // We could use table.getRowObject(i) here, but that would\n // be less performant\n dataOptions[cursor] :\n table.getRowObject(i);\n // #970\n if (!point && pOptions !== void 0) {\n data[cursor] = point = new PointClass(series, pOptions, xData[i]);\n }\n else if (point) {\n // Point properties for convenient access in tooltip and\n // data labels might need to be updated.\n point.category = series.xAxis?.categories?.[point.x] ??\n point.x;\n point.key = point.name ?? point.category;\n }\n }\n else {\n // Splat the y data in case of ohlc data array\n point = new PointClass(series, table.getRowObject(i, dataColumnKeys));\n point.dataGroup = series.groupMap?.[groupCropStartIndex + i];\n if (point.dataGroup?.options) {\n point.options = point.dataGroup.options;\n extend(point, point.dataGroup.options);\n // Collision of props and options (#9770)\n delete point.dataLabels;\n // Update key in case name changed\n point.key = point.name ?? point.category;\n }\n }\n if (point) { // #6279\n // For faster access in Point.update\n point.index = hasGroupedData ?\n (groupCropStartIndex + i) : cursor;\n points[i] = point;\n }\n }\n // Restore keys options (#6590)\n series.options.keys = keys;\n // Hide cropped-away points - this only runs when the number of\n // points is above cropThreshold, or when switching view from\n // non-grouped data to grouped data (#637)\n if (data &&\n (processedDataLength !== (dataLength = data.length) ||\n hasGroupedData)) {\n for (i = 0; i < dataLength; i++) {\n // When has grouped data, clear all points\n if (i === cropStart && !hasGroupedData) {\n i += processedDataLength;\n }\n if (data[i]) {\n data[i].destroyElements();\n data[i].plotX = void 0; // #1003\n }\n }\n }\n series.data = data;\n series.points = points;\n fireEvent(this, 'afterGeneratePoints');\n }\n /**\n * Get current X extremes for the visible data.\n *\n * @internal\n * @function Highcharts.Series#getXExtremes\n * @param {Array<number>} xData\n * The data to inspect. Defaults to the current data within the visible\n * range.\n */\n getXExtremes(xData) {\n return {\n min: arrayMin(xData),\n max: arrayMax(xData)\n };\n }\n /**\n * Calculate Y extremes for the visible data. The result is returned\n * as an object with `dataMin` and `dataMax` properties.\n *\n * @internal\n * @function Highcharts.Series#getExtremes\n * @param {Array<number>} [yData]\n * The data to inspect. Defaults to the current data within the visible\n * range.\n * @param {boolean} [forceExtremesFromAll]\n * Force getting extremes of a total series data range.\n */\n getExtremes(yData, forceExtremesFromAll) {\n const { xAxis, yAxis } = this, getExtremesFromAll = forceExtremesFromAll ||\n this.getExtremesFromAll ||\n this.options.getExtremesFromAll, // #4599, #21003\n table = getExtremesFromAll && this.cropped ?\n this.dataTable :\n this.dataTable.getModified(), rowCount = table.rowCount, customData = yData || this.stackedYData, yAxisData = customData ?\n [customData] :\n (this.keysAffectYAxis || this.pointArrayMap || ['y'])?.map((key) => table.getColumn(key, true) || []) || [], xData = this.getColumn('x', true), activeYData = [], \n // Handle X outside the viewed area. This does not work with\n // non-sorted data like scatter (#7639).\n shoulder = this.requireSorting && !this.is('column') ?\n 1 : 0, \n // #2117, need to compensate for log X axis\n positiveValuesOnly = yAxis ? yAxis.positiveValuesOnly : false, doAll = getExtremesFromAll ||\n this.cropped ||\n !xAxis; // For colorAxis support\n let xExtremes, x, i, xMin = 0, xMax = 0;\n if (xAxis) {\n xExtremes = xAxis.getExtremes();\n xMin = xExtremes.min;\n xMax = xExtremes.max;\n }\n for (i = 0; i < rowCount; i++) {\n x = xData[i];\n // Check if it is within the selected x axis range\n if (doAll ||\n ((xData[i + shoulder] || x) >= xMin &&\n (xData[i - shoulder] || x) <= xMax)) {\n for (const values of yAxisData) {\n const val = values[i];\n // For points within the visible range, including the\n // first point outside the visible range (#7061),\n // consider y extremes.\n if (isNumber(val) &&\n (val > 0 || !positiveValuesOnly)) {\n activeYData.push(val);\n }\n }\n }\n }\n const dataExtremes = {\n activeYData, // Needed for Stock Cumulative Sum\n dataMin: arrayMin(activeYData),\n dataMax: arrayMax(activeYData)\n };\n fireEvent(this, 'afterGetExtremes', { dataExtremes });\n return dataExtremes;\n }\n /**\n * Set the current data extremes as `dataMin` and `dataMax` on the\n * Series item. Use this only when the series properties should be\n * updated.\n *\n * @internal\n * @function Highcharts.Series#applyExtremes\n */\n applyExtremes() {\n const dataExtremes = this.getExtremes();\n this.dataMin = dataExtremes.dataMin;\n this.dataMax = dataExtremes.dataMax;\n return dataExtremes;\n }\n /**\n * Find and return the first non nullish point in the data\n *\n * @internal\n * @function Highcharts.Series.getFirstValidPoint\n * @param {Array<Highcharts.PointOptionsType>} data\n * Array of options for points\n * @param {number} [start=0]\n * Index to start searching from\n * @param {number} [increment=1]\n * Index increment, set -1 to search backwards\n */\n getFirstValidPoint(data, start = 0, increment = 1) {\n const dataLength = data.length;\n let i = start;\n while (i >= 0 && i < dataLength) {\n if (defined(data[i])) {\n return data[i];\n }\n i += increment;\n }\n }\n /**\n * Translate data points from raw data values to chart specific\n * positioning data needed later in the `drawPoints` and `drawGraph`\n * functions. This function can be overridden in plugins and custom\n * series type implementations.\n *\n * @function Highcharts.Series#translate\n *\n * @emits Highcharts.Series#events:translate\n */\n translate() {\n this.generatePoints();\n const series = this, { options, xAxis, yAxis } = series, { stacking, threshold } = options, { hasRendered, polar } = series.chart, points = series.points.concat(series.condemnedPoints), dataLength = points.length, pointPlacement = series.pointPlacementToXValue(), // #7860\n dynamicallyPlaced = Boolean(pointPlacement), stackThreshold = options.startFromThreshold ? threshold : 0, nullYSubstitute = (options?.nullInteraction &&\n yAxis.len);\n let i, plotX, lastPlotX, stackIndicator, closestPointRangePx = Number.MAX_VALUE;\n /**\n * Plotted coordinates need to be within a limited range. Drawing\n * too far outside the viewport causes various rendering issues\n * (#3201, #3923, #7555).\n * @internal\n */\n function limitedRange(val) {\n return clamp(val, -1e9, 1e9);\n }\n const getPlotX = (x, old) => {\n const plotX = xAxis.translate(x, false, false, old, true, pointPlacement);\n return isNumber(plotX) ? correctFloat(limitedRange(plotX)) : void 0;\n };\n const getPlotY = (yValue, point, old) => {\n // Set the plotY value, reset it for redraws #3201, #18422\n if (isNumber(yValue) && point.plotX !== void 0) {\n const plotY = yAxis.translate(yValue, false, true, old, true);\n return isNumber(plotY) ? limitedRange(plotY) : void 0;\n }\n if (!isNumber(yValue) && nullYSubstitute) {\n return nullYSubstitute;\n }\n };\n // Translate each point\n for (i = 0; i < dataLength; i++) {\n const point = points[i], xValue = point.x;\n let stackItem, stackValues, yValue = point.y, lowValue = point.low;\n const stacks = stacking && yAxis.stacking?.stacks[(series.negStacks &&\n yValue <\n (stackThreshold ? 0 : threshold) ?\n '-' :\n '') + series.stackKey];\n point.plotX = plotX = getPlotX(xValue);\n // Calculate the bottom y value for stacked series\n if (stacking &&\n series.visible &&\n stacks &&\n stacks[xValue]) {\n stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);\n if (!point.isNull && stackIndicator.key) {\n stackItem = stacks[xValue];\n stackValues = stackItem.points[stackIndicator.key];\n }\n if (stackItem && isArray(stackValues)) {\n lowValue = stackValues[0];\n yValue = stackValues[1];\n if (lowValue === stackThreshold &&\n stackIndicator.key === stacks[xValue].base) {\n lowValue = pick(isNumber(threshold) ? threshold : yAxis.min);\n }\n // #1200, #1232\n if (yAxis.positiveValuesOnly &&\n defined(lowValue) &&\n lowValue <= 0) {\n lowValue = void 0;\n }\n point.total = point.stackTotal = pick(stackItem.total);\n point.percentage = defined(point.y) && stackItem.total ?\n (point.y / stackItem.total * 100) : void 0;\n point.stackY = yValue;\n // In case of variwide series (where widths of points are\n // different in most cases), stack labels are positioned\n // wrongly, so the call of the setOffset is omitted here and\n // labels are correctly positioned later, at the end of the\n // variwide's translate function (#10962)\n if (!series.irregularWidths) {\n stackItem.setOffset(series.pointXOffset || 0, series.barW || 0, void 0, void 0, void 0, series.xAxis);\n }\n }\n }\n // Set translated yBottom or remove it\n point.yBottom = defined(lowValue) ?\n limitedRange(yAxis.translate(lowValue, false, true, false, true)) :\n void 0;\n // General hook, used for Highcharts Stock compare and cumulative\n if (series.dataModify) {\n yValue = series.dataModify.modifyValue(yValue, i);\n }\n point.plotY = getPlotY(yValue, point);\n // Set the starting point of point entrance animation\n point.origin = hasRendered && !point.graphic && !polar ? {\n x: getPlotX(xValue, true),\n y: getPlotY(yValue, point, true)\n } : void 0;\n point.isInside = this.isPointInside(point);\n // Set client related positions for mouse tracking\n point.clientX = dynamicallyPlaced ?\n correctFloat(xAxis.translate(xValue, false, false, false, true, pointPlacement)) :\n plotX; // #1514, #5383, #5518\n // Negative points #19028\n point.negative = (point.y || 0) < (threshold || 0);\n // Determine auto enabling of markers (#3635, #5099)\n if (!point.isNull && point.visible !== false && isNumber(plotX)) {\n if (isNumber(lastPlotX)) {\n closestPointRangePx = Math.min(closestPointRangePx, Math.abs((plotX) - lastPlotX));\n }\n lastPlotX = plotX;\n }\n // Find point zone\n point.zone = this.zones.length ? point.getZone() : void 0;\n }\n series.closestPointRangePx = closestPointRangePx;\n fireEvent(this, 'afterTranslate');\n }\n /**\n * Return the series points with null points filtered out.\n *\n * @function Highcharts.Series#getValidPoints\n *\n * @param {Array<Highcharts.Point>} [points]\n * The points to inspect, defaults to {@link Series.points}.\n *\n * @param {boolean} [insideOnly=false]\n * Whether to inspect only the points that are inside the visible view.\n *\n * @param {boolean} [allowNull=false]\n * Whether to allow null points to pass as valid points.\n *\n * @return {Array<Highcharts.Point>}\n * The valid points.\n */\n getValidPoints(points, insideOnly, allowNull) {\n const chart = this.chart;\n // #3916, #5029, #5085\n return (points || this.points || []).filter(function (point) {\n const { plotX, plotY } = point, \n // Undefined plotY is treated as null when negative values\n // in log axis (#18422)\n asNull = !allowNull && (point.isNull || !isNumber(plotY));\n if (asNull || (insideOnly && !chart.isInsidePlot(plotX, plotY, { inverted: chart.inverted }))) {\n return false;\n }\n return point.visible !== false;\n });\n }\n /**\n * Get the shared clip key, creating it if it doesn't exist.\n *\n * @internal\n * @function Highcharts.Series#getSharedClipKey\n */\n getSharedClipKey() {\n this.sharedClipKey = (this.options.xAxis || 0) + ',' +\n (this.options.yAxis || 0);\n return this.sharedClipKey;\n }\n /**\n * Set the clipping for the series. For animated series the clip is later\n * modified.\n *\n * @internal\n * @function Highcharts.Series#setClip\n */\n setClip() {\n const { chart, group, markerGroup, options, plotClipGroup } = this, sharedClips = chart.sharedClips, renderer = chart.renderer, clipBox = chart.getClipBox(this), clip = options.clip ?? true, sharedClipKey = this.getSharedClipKey(); // #4526\n let clipRect = sharedClips[sharedClipKey];\n // If a clipping rectangle for the same set of axes does not exist,\n // create it\n if (!clipRect) {\n sharedClips[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n // When setting chart size, or when the series is rendered again before\n // starting animating, in compliance to a responsive rule\n }\n else {\n clipRect.animate(clipBox);\n }\n // When clip is false, reset to no clip after animation\n group?.clip(clip ? clipRect : void 0);\n // Unclip temporary animation clip\n markerGroup?.clip();\n // Apply plotBorderRadius clipping\n plotClipGroup?.clip(\n // Navigator y-axis is not clippable\n clip && this.yAxis.clippable ?\n chart.plotClipInner :\n void 0);\n }\n /**\n * Animate in the series. Called internally twice. First with the `init`\n * parameter set to true, which sets up the initial state of the\n * animation. Then when ready, it is called with the `init` parameter\n * undefined, in order to perform the actual animation.\n *\n * @function Highcharts.Series#animate\n *\n * @param {boolean} [init]\n * Initialize the animation.\n */\n animate(init) {\n const { chart, group, markerGroup } = this, inverted = chart.inverted, animation = animObject(this.options.animation), \n // The key for temporary animation clips\n animationClipKey = [\n this.getSharedClipKey(),\n animation.duration,\n animation.easing,\n animation.defer\n ].join(',');\n let animationClipRect = chart.sharedClips[animationClipKey], markerAnimationClipRect = chart.sharedClips[animationClipKey + 'm'];\n // Initialize the animation. Set up the clipping rectangle.\n if (init && group) {\n const clipBox = chart.getClipBox(this);\n // Create temporary animation clips\n if (!animationClipRect) {\n clipBox.width = 0;\n if (inverted) {\n clipBox.x = chart.plotHeight;\n }\n animationClipRect = chart.renderer.clipRect(clipBox);\n chart.sharedClips[animationClipKey] = animationClipRect;\n // The marker clip box. The number 99 is a safe margin to avoid\n // markers being clipped during animation.\n const markerClipBox = {\n x: inverted ? -99 : -99,\n y: inverted ? -99 : -99,\n width: inverted ? chart.plotWidth + 199 : 99,\n height: inverted ? 99 : chart.plotHeight + 199\n };\n markerAnimationClipRect = chart.renderer.clipRect(markerClipBox);\n chart.sharedClips[animationClipKey + 'm'] = markerAnimationClipRect;\n }\n else {\n // When height changes during animation, typically due to\n // responsive settings\n animationClipRect.attr('height', clipBox.height);\n }\n group.clip(animationClipRect);\n markerGroup?.clip(markerAnimationClipRect);\n // Run the animation\n }\n else if (animationClipRect &&\n // Only first series in this pane\n !animationClipRect.hasClass('highcharts-animating')) {\n const finalBox = chart.getClipBox(this), step = animation.step;\n // Only do this when there are actually markers, or we have multiple\n // series (#20473)\n if (markerGroup?.element.childNodes.length ||\n chart.series.length > 1) {\n // To provide as smooth animation as possible, update the marker\n // group clipping in steps of the main group animation\n animation.step = function (val, fx) {\n if (step) {\n step.apply(fx, arguments);\n }\n if (fx.prop === 'width' &&\n markerAnimationClipRect?.element) {\n markerAnimationClipRect.attr(inverted ? 'height' : 'width', val + 99);\n }\n };\n }\n animationClipRect\n .addClass('highcharts-animating')\n .animate(finalBox, animation);\n }\n }\n /**\n * This runs after animation to land on the final plot clipping.\n *\n * @internal\n * @function Highcharts.Series#afterAnimate\n *\n * @emits Highcharts.Series#event:afterAnimate\n */\n afterAnimate() {\n this.setClip();\n // Destroy temporary clip rectangles that are no longer in use\n objectEach(this.chart.sharedClips, (clip, key, sharedClips) => {\n if (clip && !this.chart.container.querySelector(`[clip-path=\"url(#${clip.id})\"]`)) {\n clip.destroy();\n delete sharedClips[key];\n }\n });\n this.finishedAnimating = true;\n fireEvent(this, 'afterAnimate');\n }\n /**\n * Draw the markers for line-like series types, and columns or other\n * graphical representation for {@link Highcharts.Point} objects for other\n * series types. The resulting element is typically stored as\n * {@link Highcharts.Point#graphic}, and is created on the first call and\n * updated and moved on subsequent calls.\n *\n * @function Highcharts.Series#drawPoints\n */\n drawPoints(points) {\n points || (points = this.points.concat(this.condemnedPoints));\n const series = this, chart = series.chart, styledMode = chart.styledMode, { colorAxis, options } = series, seriesMarkerOptions = options.marker, nullInteraction = options.nullInteraction, markerGroup = series[series.specialGroup || 'markerGroup'], xAxis = series.xAxis, globallyEnabled = pick(seriesMarkerOptions.enabled, !xAxis || xAxis.isRadial ? true : null, \n // Use larger or equal as radius is null in bubbles (#6321)\n series.closestPointRangePx >= (seriesMarkerOptions.enabledThreshold *\n seriesMarkerOptions.radius));\n let i, point, graphic, verb, pointMarkerOptions, hasPointMarker, markerAttribs;\n if (seriesMarkerOptions.enabled !== false ||\n series._hasPointMarkers) {\n for (i = 0; i < points.length; i++) {\n point = points[i];\n graphic = point.graphic;\n verb = graphic ? 'animate' : 'attr';\n pointMarkerOptions = point.marker || {};\n hasPointMarker = !!point.marker;\n const isNull = point.isNull, shouldDrawMarker = ((globallyEnabled &&\n !defined(pointMarkerOptions.enabled)) || pointMarkerOptions.enabled) &&\n (!isNull || nullInteraction) &&\n point.visible !== false;\n // Only draw the point if y is defined\n if (shouldDrawMarker) {\n // Shortcuts\n const symbol = pick(pointMarkerOptions.symbol, series.symbol, 'rect');\n markerAttribs = series.markerAttribs(point, (point.selected && 'select'));\n const isInside = point.isInside !== false;\n if (!graphic &&\n isInside &&\n ((markerAttribs.width || 0) > 0 || point.hasImage)) {\n point.graphic = graphic = chart.renderer\n .symbol(symbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, hasPointMarker ?\n pointMarkerOptions :\n seriesMarkerOptions)\n .add(markerGroup);\n // New points fade in from old axis position\n if (point.origin) {\n const attr = point.getOrigin(point.origin, markerAttribs);\n if (!styledMode) {\n attr.opacity = 0;\n }\n graphic.attr(attr);\n verb = 'animate';\n }\n }\n if (graphic) {\n // Updating pre-existing point\n if (verb === 'animate') {\n graphic?.animate(markerAttribs);\n }\n // Presentational attributes\n const pointAttr = series.pointAttribs(point, ((styledMode || !point.selected) ?\n void 0 :\n 'select'));\n if (!styledMode) {\n graphic[verb](pointAttr);\n }\n else if (colorAxis) { // #14114\n graphic['css']({\n fill: pointAttr.fill\n });\n }\n graphic.addClass(point.getClassName(), true);\n }\n }\n else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n }\n }\n }\n /**\n * Get non-presentational attributes for a point. Used internally for\n * both styled mode and classic. Can be overridden for different series\n * types.\n *\n * @see Series#pointAttribs\n *\n * @function Highcharts.Series#markerAttribs\n *\n * @param {Highcharts.Point} point\n * The Point to inspect.\n *\n * @param {string} [state]\n * The state, can be either `hover`, `select` or undefined.\n *\n * @return {Highcharts.SVGAttributes}\n * A hash containing those attributes that are not settable from CSS.\n */\n markerAttribs(point, state) {\n const seriesOptions = this.options, seriesMarkerOptions = seriesOptions.marker, pointMarkerOptions = point.marker || {}, symbol = (pointMarkerOptions.symbol ||\n seriesMarkerOptions.symbol), attribs = {};\n let seriesStateOptions, pointStateOptions, radius = pick(pointMarkerOptions.radius, seriesMarkerOptions?.radius);\n // Handle hover and select states\n if (state) {\n seriesStateOptions = seriesMarkerOptions?.states?.[state];\n pointStateOptions = pointMarkerOptions.states?.[state];\n radius = pick(pointStateOptions?.radius, seriesStateOptions?.radius, radius && radius + (seriesStateOptions?.radiusPlus ||\n 0));\n }\n point.hasImage = symbol && symbol.indexOf('url') === 0;\n if (point.hasImage) {\n radius = 0; // And subsequently width and height is not set\n }\n const pos = point.pos();\n if (isNumber(radius) && pos) {\n if (seriesOptions.crisp) {\n pos[0] = crisp(pos[0], point.hasImage ?\n 0 :\n symbol === 'rect' ?\n // Rectangle symbols need crisp edges, others don't\n seriesMarkerOptions?.lineWidth || 0 :\n 1);\n }\n attribs.x = pos[0] - radius;\n attribs.y = pos[1] - radius;\n }\n if (radius) {\n attribs.width = attribs.height = 2 * radius;\n }\n return attribs;\n }\n /**\n * Internal function to get presentational attributes for each point.\n * Unlike {@link Series#markerAttribs}, this function should return\n * those attributes that can also be set in CSS. In styled mode,\n * `pointAttribs` won't be called.\n *\n * @internal\n * @function Highcharts.Series#pointAttribs\n *\n * @param {Highcharts.Point} [point]\n * The point instance to inspect.\n *\n * @param {string} [state]\n * The point state, can be either `hover`, `select` or 'normal'. If\n * undefined, normal state is assumed.\n *\n * @return {Highcharts.SVGAttributes}\n * The presentational attributes to be set on the point.\n */\n pointAttribs(point, state) {\n const options = this.options, seriesMarkerOptions = options.marker, pointOptions = point?.options, pointMarkerOptions = pointOptions?.marker || {}, pointColorOption = pointOptions?.color, pointColor = point?.color, zoneColor = point?.zone?.color;\n let seriesStateOptions, pointStateOptions, color = this.color, fill, stroke, strokeWidth = pick(pointMarkerOptions.lineWidth, seriesMarkerOptions.lineWidth), opacity = (point?.isNull && options.nullInteraction) ? 0 : 1;\n color = (pointColorOption ||\n zoneColor ||\n pointColor ||\n color);\n fill = (pointMarkerOptions.fillColor ||\n seriesMarkerOptions.fillColor ||\n color);\n stroke = (pointMarkerOptions.lineColor ||\n seriesMarkerOptions.lineColor ||\n color);\n // Handle hover and select states\n state = state || 'normal';\n if (state) {\n seriesStateOptions = (seriesMarkerOptions.states[state] || {});\n pointStateOptions = (pointMarkerOptions.states &&\n pointMarkerOptions.states[state]) || {};\n strokeWidth = pick(pointStateOptions.lineWidth, seriesStateOptions.lineWidth, strokeWidth + pick(pointStateOptions.lineWidthPlus, seriesStateOptions.lineWidthPlus, 0));\n fill = (pointStateOptions.fillColor ||\n seriesStateOptions.fillColor ||\n fill);\n stroke = (pointStateOptions.lineColor ||\n seriesStateOptions.lineColor ||\n stroke);\n opacity = pick(pointStateOptions.opacity, seriesStateOptions.opacity, opacity);\n }\n return {\n 'stroke': stroke,\n 'stroke-width': strokeWidth,\n 'fill': fill,\n 'opacity': point?.condemned || point?.isInside === false ?\n 0 : opacity\n };\n }\n /**\n * Clear DOM objects and free up memory.\n *\n * @internal\n * @function Highcharts.Series#destroy\n *\n * @emits Highcharts.Series#event:destroy\n */\n destroy(keepEventsForUpdate) {\n const series = this, chart = series.chart, issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent), data = series.data || [];\n let destroy, i, axis;\n // Add event hook\n fireEvent(series, 'destroy', { keepEventsForUpdate });\n // Remove events\n this.removeEvents(keepEventsForUpdate);\n // Erase from axes\n (series.axisTypes || []).forEach(function (AXIS) {\n axis = series[AXIS];\n if (axis?.series) {\n erase(axis.series, series);\n axis.isDirty = axis.forceRedraw = true;\n }\n });\n // Remove legend items\n if (series.legendItem) {\n series.chart.legend.destroyItem(series);\n }\n // Destroy all points with their elements\n i = data.length;\n while (i--) {\n data[i]?.destroy?.();\n }\n for (const zone of series.zones || []) {\n // Destroy SVGElement's but preserve primitive props (#20426)\n destroyObjectProperties(zone, void 0, true);\n }\n // Clear the animation timeout if we are destroying the series\n // during initial animation\n internalClearTimeout(series.animationTimeout);\n // Destroy all SVGElements associated to the series\n objectEach(series, function (val, prop) {\n // Survive provides a hook for not destroying\n if (val instanceof SVGElement && !val.survive) {\n // Issue 134 workaround\n destroy = issue134 && prop === 'group' ?\n 'hide' :\n 'destroy';\n val[destroy]();\n }\n });\n // Remove from hoverSeries\n if (chart.hoverSeries === series) {\n chart.hoverSeries = void 0;\n }\n erase(chart.series, series);\n chart.orderItems('series');\n // Clear all members\n objectEach(series, function (val, prop) {\n if (!keepEventsForUpdate || prop !== 'hcEvents') {\n delete series[prop];\n }\n });\n }\n /**\n * Clip the graphs into zones for colors and styling.\n *\n * @internal\n * @function Highcharts.Series#applyZones\n */\n applyZones() {\n const series = this, { area, chart, graph, zones, points, xAxis, yAxis, zoneAxis } = series, { inverted, renderer } = chart, axis = this[`${zoneAxis}Axis`], { isXAxis, len = 0, minPointOffset = 0 } = axis || {}, halfWidth = (graph?.strokeWidth() || 0) / 2 + 1, \n // Avoid points that are so close to the threshold that the graph\n // line would be split\n avoidClose = (zone, plotX = 0, plotY = 0) => {\n if (inverted) {\n plotY = len - plotY;\n }\n const { translated = 0, lineClip, value } = zone, distance = plotY - translated;\n lineClip?.push([\n 'L',\n plotX,\n Math.abs(distance) < halfWidth ?\n plotY - halfWidth * (distance < 0 ||\n (distance === 0 && defined(value)) ?\n -1 :\n 1) :\n translated\n ]);\n };\n if (zones.length &&\n (graph || area) &&\n axis &&\n isNumber(axis.min)) {\n const axisMax = axis.getExtremes().max + minPointOffset, \n // Invert the x and y coordinates of inverted charts\n invertPath = (path) => {\n path.forEach((segment, i) => {\n if (segment[0] === 'M' || segment[0] === 'L') {\n path[i] = [\n segment[0],\n isXAxis ? len - segment[1] : segment[1],\n isXAxis ? segment[2] : len - segment[2]\n ];\n }\n });\n };\n // Reset\n zones.forEach((zone) => {\n zone.lineClip = [];\n zone.translated = clamp(axis.toPixels(pick(zone.value, axisMax), true) || 0, 0, len);\n });\n // The use of the Color Threshold assumes there are no gaps so it is\n // safe to hide the original graph and area unless it is not\n // waterfall series, then use showLine property to set lines between\n // columns to be visible (#7862)\n if (graph && !this.showLine) {\n graph.hide();\n }\n if (area) {\n area.hide();\n }\n // Prepare for adaptive clips, avoiding segments close to the\n // threshold (#19709)\n if (zoneAxis === 'y' &&\n // Overheat protection\n points.length < xAxis.len) {\n for (const point of points) {\n const { plotX, plotY, zone } = point, zoneBelow = zone && zones[zones.indexOf(zone) - 1];\n // Close to upper boundary\n if (zone) {\n avoidClose(zone, plotX, plotY);\n }\n // Close to lower boundary\n if (zoneBelow) {\n avoidClose(zoneBelow, plotX, plotY);\n }\n }\n }\n // Compute and apply the clips\n let lastLineClip = [], \n // Starting point of the first zone. Offset for category axis\n // (#22188).\n lastTranslated = axis.toPixels(axis.getExtremes().min - minPointOffset, true);\n zones.forEach((zone) => {\n const lineClip = zone.lineClip || [], translated = Math.round(zone.translated || 0);\n if (xAxis.reversed) {\n lineClip.reverse();\n }\n let { clip, simpleClip } = zone, x1 = 0, y1 = 0, x2 = xAxis.len, y2 = yAxis.len;\n if (isXAxis) {\n x1 = translated;\n x2 = lastTranslated;\n }\n else {\n y1 = translated;\n y2 = lastTranslated;\n }\n // Adaptive clips\n const simplePath = [\n ['M', x1, y1],\n ['L', x2, y1],\n ['L', x2, y2],\n ['L', x1, y2],\n ['Z']\n ], adaptivePath = [\n simplePath[0],\n ...lineClip,\n simplePath[1],\n simplePath[2],\n ...lastLineClip,\n simplePath[3],\n simplePath[4]\n ];\n lastLineClip = lineClip.reverse();\n lastTranslated = translated;\n if (inverted) {\n invertPath(adaptivePath);\n if (area) {\n invertPath(simplePath);\n }\n }\n /* Debug clip paths\n zone.path?.destroy();\n zone.path = chart.renderer.path(adaptivePath)\n .attr({\n stroke: zone.color || this.color || 'gray',\n 'stroke-width': 1,\n 'dashstyle': 'Dash'\n })\n .add(series.group);\n // */\n if (clip) {\n clip.animate({ d: adaptivePath });\n simpleClip?.animate({ d: simplePath });\n }\n else {\n clip = zone.clip = renderer.path(adaptivePath);\n if (area) {\n simpleClip = zone.simpleClip = renderer.path(simplePath);\n }\n }\n // When no data, graph zone is not applied and after setData\n // clip was ignored. As a result, it should be applied each\n // time.\n if (graph) {\n zone.graph?.clip(clip);\n }\n if (area) {\n zone.area?.clip(simpleClip);\n }\n });\n }\n else if (series.visible) {\n // If zones were removed, restore graph and area\n if (graph) {\n graph.show();\n }\n if (area) {\n area.show();\n }\n }\n }\n /**\n * General abstraction for creating plot groups like series.group,\n * series.dataLabelsGroup and series.markerGroup. On subsequent calls,\n * the group will only be adjusted to the updated plot size.\n *\n * @internal\n * @function Highcharts.Series#plotGroup\n */\n plotGroup(prop, name, visibility, zIndex, parent) {\n let group = this[prop];\n const isNew = !group, attrs = {\n visibility,\n zIndex: zIndex || 0.1 // Pointer logic uses this\n };\n // Avoid setting undefined opacity, or in styled mode\n if (defined(this.opacity) &&\n !this.chart.styledMode && this.state !== 'inactive' // #13719\n ) {\n attrs.opacity = this.opacity;\n }\n // Generate it on first call\n if (!group) {\n this[prop] = group = this.chart.renderer\n .g()\n .add(parent);\n }\n // Add the class names, and replace existing ones as response to\n // Series.update (#6660)\n group.addClass(('highcharts-' + name +\n ' highcharts-series-' + this.index +\n ' highcharts-' + this.type + '-series ' +\n (defined(this.colorIndex) ?\n 'highcharts-color-' + this.colorIndex + ' ' :\n '') +\n (this.options.className || '') +\n (group.hasClass('highcharts-tracker') ?\n ' highcharts-tracker' :\n '')), true);\n // Place it on first and subsequent (redraw) calls\n group.attr(attrs)[isNew ? 'attr' : 'animate'](this.getPlotBox(name));\n return group;\n }\n /**\n * Get the translation and scale for the plot area of this series.\n *\n * @function Highcharts.Series#getPlotBox\n */\n getPlotBox(name) {\n let horAxis = this.xAxis, vertAxis = this.yAxis;\n const chart = this.chart, inverted = (chart.inverted &&\n !chart.polar &&\n horAxis &&\n this.invertible &&\n name === 'series');\n // Swap axes for inverted (#2339)\n if (chart.inverted) {\n horAxis = vertAxis;\n vertAxis = this.xAxis;\n }\n const params = {\n scale: 1,\n translateX: horAxis ? horAxis.left : chart.plotLeft,\n translateY: vertAxis ? vertAxis.top : chart.plotTop,\n name\n };\n fireEvent(this, 'getPlotBox', params);\n const { scale, translateX, translateY } = params;\n return {\n translateX,\n translateY,\n rotation: inverted ? 90 : 0,\n rotationOriginX: inverted ?\n scale * (horAxis.len - vertAxis.len) / 2 :\n 0,\n rotationOriginY: inverted ?\n scale * (horAxis.len + vertAxis.len) / 2 :\n 0,\n scaleX: inverted ? -scale : scale, // #1623\n scaleY: scale\n };\n }\n /**\n * Removes the event handlers attached previously with addEvents.\n * @internal\n * @function Highcharts.Series#removeEvents\n */\n removeEvents(keepEventsForUpdate) {\n const { eventsToUnbind } = this;\n if (!keepEventsForUpdate) {\n // Remove all events\n removeEvent(this);\n }\n if (eventsToUnbind.length) {\n // Remove only internal events for proper update. #12355 solves\n // problem with multiple destroy events\n eventsToUnbind.forEach((unbind) => {\n unbind();\n });\n eventsToUnbind.length = 0;\n }\n }\n /**\n * Render the graph and markers. Called internally when first rendering\n * and later when redrawing the chart. This function can be extended in\n * plugins, but normally shouldn't be called directly.\n *\n * @function Highcharts.Series#render\n *\n * @emits Highcharts.Series#event:afterRender\n */\n render() {\n const series = this, { chart, options, hasRendered } = series, animOptions = animObject(options.animation), visibility = series.visible ?\n 'inherit' : 'hidden', // #2597\n zIndex = options.zIndex, chartSeriesGroup = chart.seriesGroup;\n let animDuration = series.finishedAnimating ?\n 0 : animOptions.duration;\n fireEvent(this, 'render');\n // If we have a plot border radius, create a separate parent group where\n // the clip is later applied. This is necessary to handle multi-pane\n // layouts and entrance animation.\n if (chart.plotClipInner) {\n series.plotClipGroup || (series.plotClipGroup = chart.renderer.g().add(chartSeriesGroup));\n }\n // The group\n series.plotGroup('group', 'series', visibility, zIndex, series.plotClipGroup || chartSeriesGroup);\n series.markerGroup = series.plotGroup('markerGroup', 'markers', visibility, zIndex, chartSeriesGroup);\n // Initial clipping, applies to columns etc. (#3839).\n if (options.clip !== false) {\n series.setClip();\n }\n // Initialize the animation\n if (animDuration) {\n series.animate?.(true);\n }\n // Draw the graph if any\n if (series.drawGraph) {\n series.drawGraph();\n series.applyZones();\n }\n // Draw the points\n if (series.visible) {\n series.drawPoints();\n }\n // Draw the data labels\n series.drawDataLabels?.();\n // In pie charts, slices are added to the DOM, but actual rendering\n // is postponed until labels reserved their space\n series.redrawPoints?.();\n // Draw the mouse tracking area\n if (options.enableMouseTracking) {\n series.drawTracker?.();\n }\n // Run the animation\n if (animDuration) {\n series.animate?.();\n }\n // Call the afterAnimate function on animation complete (but don't\n // overwrite the animation.complete option which should be available\n // to the user).\n if (!hasRendered) {\n // Additional time if defer is defined before afterAnimate\n // will be triggered\n if (animDuration && animOptions.defer) {\n animDuration += animOptions.defer;\n }\n series.animationTimeout = syncTimeout(() => {\n series.afterAnimate();\n }, animDuration || 0);\n }\n // Means data is in accordance with what you see\n series.isDirty = false;\n // (See #322) series.isDirty = series.isDirtyData = false; // means\n // data is in accordance with what you see\n series.hasRendered = true;\n fireEvent(series, 'afterRender');\n }\n /**\n * Redraw the series. This function is called internally from\n * `chart.redraw` and normally shouldn't be called directly.\n *\n * @internal\n * @function Highcharts.Series#redraw\n */\n redraw() {\n // Cache it here as it is set to false in render, but used after\n const wasDirty = this.isDirty || this.isDirtyData;\n this.translate();\n this.render();\n if (wasDirty) { // #3868, #3945\n delete this.kdTree;\n }\n this.condemnedPoints.length = 0;\n }\n /**\n * Whether to reserve space for the series, either because it is visible or\n * because the `chart.ignoreHiddenSeries` option is false.\n *\n * @internal\n */\n reserveSpace() {\n return this.visible || !this.chart.options.chart.ignoreHiddenSeries;\n }\n /**\n * Find the nearest point from a pointer event. This applies to series that\n * use k-d-trees to get the nearest point. Native pointer events must be\n * normalized using `Pointer.normalize`, that adds `chartX` and `chartY`\n * properties.\n *\n * @sample highcharts/demo/synchronized-charts\n * Synchronized charts with tooltips\n *\n * @function Highcharts.Series#searchPoint\n *\n * @param {Highcharts.PointerEvent} e\n * The normalized pointer event\n * @param {boolean} [compareX=false]\n * Search only by the X value, not Y\n *\n * @return {Point|undefined}\n * The closest point to the pointer event\n */\n searchPoint(e, compareX) {\n const { xAxis, yAxis } = this, inverted = this.chart.inverted;\n return this.searchKDTree({\n clientX: inverted ?\n xAxis.len - e.chartY + xAxis.pos :\n e.chartX - xAxis.pos,\n plotY: inverted ?\n yAxis.len - e.chartX + yAxis.pos :\n e.chartY - yAxis.pos\n }, compareX, e);\n }\n /**\n * Build the k-d-tree that is used by mouse and touch interaction to get\n * the closest point. Line-like series typically have a one-dimensional\n * tree where points are searched along the X axis, while scatter-like\n * series typically search in two dimensions, X and Y.\n *\n * @internal\n * @function Highcharts.Series#buildKDTree\n */\n buildKDTree(e) {\n // Prevent multiple k-d-trees from being built simultaneously\n // (#6235)\n this.buildingKdTree = true;\n const series = this, seriesOptions = series.options, dimensions = seriesOptions.findNearestPointBy\n .indexOf('y') > -1 ? 2 : 1;\n /**\n * Internal function\n * @internal\n */\n function kdtree(points, depth, dimensions) {\n const length = points?.length;\n let axis, median;\n if (length) {\n // Alternate between the axis\n axis = series.kdAxisArray[depth % dimensions];\n // Sort point array\n points.sort((a, b) => (a[axis] || 0) - (b[axis] || 0));\n median = Math.floor(length / 2);\n // Build and return node\n return {\n point: points[median],\n left: kdtree(points.slice(0, median), depth + 1, dimensions),\n right: kdtree(points.slice(median + 1), depth + 1, dimensions)\n };\n }\n }\n /**\n * Start the recursive build process with a clone of the points\n * array and null points filtered out. (#3873)\n * @internal\n */\n function startRecursive() {\n series.kdTree = kdtree(series.getValidPoints(void 0, \n // For line-type series restrict to plot area, but\n // column-type series not (#3916, #4511)\n !series.directTouch, seriesOptions?.nullInteraction), dimensions, dimensions);\n series.buildingKdTree = false;\n }\n delete series.kdTree;\n // For testing tooltips, don't build async. Also if touchstart, we may\n // be dealing with click events on mobile, so don't delay (#6817).\n syncTimeout(startRecursive, seriesOptions.kdNow || e?.type === 'touchstart' ? 0 : 1);\n }\n /**\n * Search the k-d-tree for the point closest to the given point.\n *\n * @internal\n * @function Highcharts.Series#searchKDTree\n *\n * @param {Highcharts.KDPointSearchObject} point\n * The point to search for.\n * @param {boolean} [compareX=false]\n * Search only by the X value, not Y.\n * @param {Highcharts.PointerEvent} [e]\n * The normalized pointer event.\n * @param {Function} [suppliedPointEvaluator]\n * A custom point evaluator function.\n * @param {Function} [suppliedBSideCheckEvaluator]\n * A custom b-side check evaluator function.\n *\n * @return {Highcharts.Point|undefined}\n * The closest point found.\n */\n searchKDTree(point, compareX, e, suppliedPointEvaluator, suppliedBSideCheckEvaluator) {\n const series = this, [kdX, kdY] = this.kdAxisArray, kdComparer = compareX ? 'distX' : 'dist', kdDimensions = (series.options.findNearestPointBy || '')\n .indexOf('y') > -1 ? 2 : 1, useRadius = !!series.isBubble, pointEvaluator = suppliedPointEvaluator || ((p1, p2, comparisonProp) => {\n const p1Val = p1[comparisonProp] || 0, p2Val = p2[comparisonProp] || 0;\n return [\n ((p1Val === p2Val && p1.index > p2.index) ||\n p1Val < p2Val) ?\n p1 :\n p2,\n false\n ];\n }), bSideCheckEvaluator = suppliedBSideCheckEvaluator || ((a, b) => a < b);\n /**\n * Set the one and two dimensional distance on the point object.\n * @internal\n */\n function setDistance(p1, p2) {\n const p1kdX = p1[kdX], p2kdX = p2[kdX], x = (defined(p1kdX) && defined(p2kdX)) ? p1kdX - p2kdX : null, p1kdY = p1[kdY], p2kdY = p2[kdY], y = (defined(p1kdY) && defined(p2kdY)) ? p1kdY - p2kdY : 0, radius = useRadius ? (p2.marker?.radius || 0) : 0;\n p2.dist = Math.sqrt(((x && x * x) || 0) + y * y) - radius;\n p2.distX = defined(x) ? (Math.abs(x) - radius) : Number.MAX_VALUE;\n }\n /**\n * Search the kd-tree.\n *\n * @internal\n * @function doSearch\n *\n * @param {Highcharts.KDPointSearchObject} search\n * The point to search for.\n * @param {Highcharts.KDNode} tree\n * The kd-tree structure to search.\n * @param {number} depth\n * The depth in the tree.\n * @param {number} dimensions\n * The dimensions in the tree.\n *\n * @return {Highcharts.Point}\n * The closest point found.\n */\n function doSearch(search, tree, depth, dimensions) {\n const point = tree.point, axis = series.kdAxisArray[depth % dimensions];\n let ret = point, flip = false;\n setDistance(search, point);\n // Pick side based on distance to splitting point\n const tdist = (search[axis] || 0) - (point[axis] || 0) +\n (useRadius ? (point.marker?.radius || 0) : 0), sideA = tdist < 0 ? 'left' : 'right', sideB = tdist < 0 ? 'right' : 'left';\n // End of tree\n if (tree[sideA]) {\n [ret, flip] = pointEvaluator(point, doSearch(search, tree[sideA], depth + 1, dimensions), kdComparer);\n }\n if (tree[sideB]) {\n const sqrtTDist = Math.sqrt(tdist * tdist), retDist = ret[kdComparer];\n // Compare distance to current best to splitting point to decide\n // whether to check side B or no\n if (bSideCheckEvaluator(sqrtTDist, retDist, flip)) {\n ret = pointEvaluator(ret, doSearch(search, tree[sideB], depth + 1, dimensions), kdComparer)[0];\n }\n }\n return ret;\n }\n if (!this.kdTree && !this.buildingKdTree) {\n this.buildKDTree(e);\n }\n if (this.kdTree) {\n return doSearch(point, this.kdTree, kdDimensions, kdDimensions);\n }\n }\n /**\n * Return the value of pointPlacement relative to the point's x value.\n *\n * @internal\n * @function Highcharts.Series#pointPlacementToXValue\n */\n pointPlacementToXValue() {\n const { options, xAxis } = this;\n let factor = options.pointPlacement;\n // Point placement is relative to each series pointRange (#5889)\n if (factor === 'between') {\n factor = xAxis.reversed ? -0.5 : 0.5; // #11955\n }\n return isNumber(factor) ?\n factor * (options.pointRange || xAxis.pointRange) :\n 0;\n }\n /**\n * Check whether a point is inside the plot area.\n *\n * @internal\n * @function Highcharts.Series#isPointInside\n *\n * @param {Highcharts.Dictionary<number>|Highcharts.Point} point\n * A point-like object with `plotX` and `plotY` properties.\n *\n * @return {boolean}\n * True if the point is inside the plot area.\n */\n isPointInside(point) {\n const { chart, xAxis, yAxis } = this, { plotX = -1, plotY = -1 } = point, isInside = (plotY >= 0 &&\n plotY <= (yAxis ? yAxis.len : chart.plotHeight) &&\n plotX >= 0 &&\n plotX <= (xAxis ? xAxis.len : chart.plotWidth));\n return isInside;\n }\n /**\n * Draw the tracker object that sits above all data labels and markers to\n * track mouse events on the graph or points. For the line type charts\n * the tracker uses the same graphPath, but with a greater stroke width\n * for better control.\n * @internal\n */\n drawTracker() {\n const series = this, options = series.options, trackByArea = options.trackByArea, trackerPath = [].concat((trackByArea ? series.areaPath : series.graphPath) || []), chart = series.chart, pointer = chart.pointer, renderer = chart.renderer, snap = chart.options.tooltip?.snap || 0, onMouseOver = () => {\n if (options.enableMouseTracking &&\n chart.hoverSeries !== series) {\n series.onMouseOver();\n }\n }, \n /*\n * Empirical lowest possible opacities for TRACKER_FILL for an\n * element to stay invisible but clickable\n * IE9: 0.00000000001 (unlimited)\n * IE10: 0.0001 (exporting only)\n * FF: 0.00000000001 (unlimited)\n * Chrome: 0.000001\n * Safari: 0.000001\n * Opera: 0.00000000001 (unlimited)\n */\n TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n let tracker = series.tracker;\n // Draw the tracker\n if (tracker) {\n tracker.attr({ d: trackerPath });\n }\n else if (series.graph) { // Create\n series.tracker = tracker = renderer.path(trackerPath)\n .attr({\n visibility: series.visible ? 'inherit' : 'hidden',\n zIndex: 2\n })\n .addClass(trackByArea ?\n 'highcharts-tracker-area' :\n 'highcharts-tracker-line')\n .add(series.group);\n if (!chart.styledMode) {\n tracker.attr({\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round', // #1225\n stroke: TRACKER_FILL,\n fill: trackByArea ? TRACKER_FILL : 'none',\n 'stroke-width': series.graph.strokeWidth() +\n (trackByArea ? 0 : 2 * snap)\n });\n }\n // The tracker is added to the series group, which is clipped, but\n // is covered by the marker group. So the marker group also needs to\n // capture events.\n [\n series.tracker,\n series.markerGroup,\n ...(series.dataLabelsGroups || [])\n ].forEach((tracker) => {\n if (tracker) {\n tracker.addClass('highcharts-tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', (e) => {\n pointer?.onTrackerMouseOut(e);\n });\n if (options.cursor && !chart.styledMode) {\n tracker.css({ cursor: options.cursor });\n }\n tracker.on('touchstart', onMouseOver);\n }\n });\n }\n fireEvent(this, 'afterDrawTracker');\n }\n /**\n * Add a point to the series after render time. The point can be added at\n * the end, or by giving it an X value, to the start or in the middle of the\n * series.\n *\n * Alternatively, when the chart is using data table for the data, a point\n * can be added by running `dataTable.setRow`.\n *\n * @sample highcharts/members/series-addpoint-append/\n * Append point\n * @sample highcharts/members/series-addpoint-append-and-shift/\n * Append and shift\n * @sample highcharts/members/series-addpoint-shift-column/\n * Append and shift columns\n * @sample highcharts/datatable/live-chart/\n * Append and shift with data table\n * @sample highcharts/members/series-addpoint-x-and-y/\n * Both X and Y values given\n * @sample highcharts/members/series-addpoint-pie/\n * Append pie slice\n * @sample stock/members/series-addpoint/\n * Append 100 points in Highcharts Stock\n * @sample stock/members/series-addpoint-shift/\n * Append and shift in Highcharts Stock\n * @sample maps/members/series-addpoint/\n * Add a point in Highmaps\n *\n * @function Highcharts.Series#addPoint\n *\n * @param {Highcharts.PointOptionsType} options\n * The point options. If options is a single number, a point with\n * that y value is appended to the series. If it is an array, it will\n * be interpreted as x and y values respectively. If it is an\n * object, advanced options as outlined under `series.data` are\n * applied.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the point is added. When adding\n * more than one point, it is highly recommended that the redraw\n * option be set to false, and instead {@link Chart#redraw} is\n * explicitly called after the adding of points is finished.\n * Otherwise, the chart will redraw after adding each point.\n *\n * @param {boolean} [shift=false]\n * If true, a point is shifted off the start of the series as one is\n * appended to the end.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @param {boolean} [withEvent=true]\n * Used internally, whether to fire the series `addPoint` event.\n *\n * @emits Highcharts.Series#event:addPoint\n */\n addPoint(options, redraw, shift, animation, withEvent) {\n const series = this, seriesOptions = series.options, { chart, data, dataTable: table, xAxis } = series, names = xAxis?.hasNames && xAxis.names, dataOptions = seriesOptions.data, xData = series.getColumn('x');\n let isInTheMiddle, i;\n // Optional redraw, defaults to true\n redraw = pick(redraw, true);\n // Get options and push the point to xData, yData and series.options. In\n // series.generatePoints the Point instance will be created on demand\n // and pushed to the series.data array.\n const { applyOptions, optionsToObject } = series.pointClass.prototype, point = { series }, pointOptions = optionsToObject.call(point, options);\n applyOptions.call(point, pointOptions, void 0, false);\n const x = point.x;\n // Get the insertion point\n i = xData.length;\n if (series.requireSorting && x < xData[i - 1]) {\n isInTheMiddle = true;\n while (i && xData[i - 1] > x) {\n i--;\n }\n }\n // Insert the row at the given index\n table.setRow(pointOptions, i, true);\n this.xColumn?.splice(i, 0, this.getX(x));\n if (names && point.name) {\n names[x] = point.name;\n }\n dataOptions?.splice(i, 0, options);\n if (isInTheMiddle ||\n // When hasProcessedData is true we need to splice an empty slot\n // into series.data, otherwise generatePoints won't pick it up.\n series.hasProcessedDataTable) {\n series.data.splice(i, 0, null);\n series.processData();\n }\n // Generate points to be added to the legend (#1329)\n if (seriesOptions.legendType === 'point') {\n series.generatePoints();\n }\n // Shift the first point off the parallel arrays\n if (shift) {\n if (data[0] && !!data[0].remove) {\n data[0].remove(false);\n }\n else {\n [\n data,\n dataOptions,\n this.xColumn\n ].filter(defined).forEach((coll) => {\n coll.shift();\n });\n table.deleteRows(0);\n }\n }\n // Fire event\n if (withEvent !== false) {\n fireEvent(series, 'addPoint', { point: point });\n }\n // Redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n chart.redraw(animation); // Animation is set anyway on redraw, #5665\n }\n }\n /**\n * Remove a point from the series. Unlike the\n * {@link Highcharts.Point#remove} method, this can also be done on a point\n * that is not instantiated because it is outside the view or subject to\n * Highcharts Stock data grouping.\n *\n * @sample highcharts/members/series-removepoint/\n * Remove cropped point\n *\n * @function Highcharts.Series#removePoint\n *\n * @param {number} i\n * The index of the point in the {@link Highcharts.Series.data|data}\n * array.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the point is added. When\n * removing more than one point, it is highly recommended that the\n * `redraw` option be set to `false`, and instead {@link\n * Highcharts.Chart#redraw} is explicitly called after the adding of\n * points is finished.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n * Whether and optionally how the series should be animated.\n *\n * @emits Highcharts.Point#event:remove\n */\n removePoint(i, redraw, animation) {\n const series = this, { chart, data, points, dataTable: table } = series, point = data[i], remove = function () {\n // Splice out the point's data from all parallel arrays\n [\n // #4935\n points?.length === data.length ? points : void 0,\n data,\n series.options.data,\n series.xColumn\n ].filter(defined).forEach((coll) => {\n coll.splice(i, 1);\n });\n table.deleteRows(i);\n // Reset modified data (shouldn't this happen automagically?)\n table.modified = table;\n point?.destroy();\n // Redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n chart.redraw();\n }\n };\n setAnimation(animation, chart);\n redraw = pick(redraw, true);\n // Fire the event with a default handler of removing the point\n if (point) {\n point.firePointEvent('remove', null, remove);\n }\n else {\n remove();\n }\n }\n /**\n * Remove a series and optionally redraw the chart.\n *\n * @sample highcharts/members/series-remove/\n * Remove first series from a button\n *\n * @function Highcharts.Series#remove\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call to\n * {@link Highcharts.Chart#redraw}.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @param {boolean} [withEvent=true]\n * Used internally, whether to fire the series `remove` event.\n *\n * @emits Highcharts.Series#event:remove\n */\n remove(redraw, animation, withEvent, keepEvents) {\n const series = this, chart = series.chart;\n /**\n * Remove the series.\n *\n * @internal\n */\n function remove() {\n // Destroy elements\n series.destroy(keepEvents);\n // Redraw\n chart.isDirtyLegend = chart.isDirtyBox = true;\n chart.linkSeries(keepEvents);\n if (pick(redraw, true)) {\n chart.redraw(animation);\n }\n }\n // Fire the event with a default handler of removing the point\n if (withEvent !== false) {\n fireEvent(series, 'remove', null, remove);\n }\n else {\n remove();\n }\n }\n /**\n * Update the series with a new set of options. For a clean and precise\n * handling of new options, all methods and elements from the series are\n * removed, and it is initialized from scratch. Therefore, this method is\n * more performance expensive than some other utility methods like {@link\n * Series#setData} or {@link Series#setVisible}.\n *\n * Note that `Series.update` may mutate the passed `data` options.\n *\n * @sample highcharts/members/series-update/\n * Updating series options\n * @sample maps/members/series-update/\n * Update series options in Highmaps\n *\n * @function Highcharts.Series#update\n *\n * @param {Highcharts.SeriesOptionsType} options\n * New options that will be merged with the series' existing options.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing\n * more operations on the chart, it is a good idea to set redraw to\n * false and call {@link Chart#redraw} after.\n *\n * @emits Highcharts.Series#event:update\n * @emits Highcharts.Series#event:afterUpdate\n */\n update(options, redraw) {\n options = diffObjects(options, this.userOptions);\n fireEvent(this, 'update', { options: options });\n const series = this, chart = series.chart, \n // Must use user options when changing type because series.options\n // is merged in with type specific plotOptions\n oldOptions = series.userOptions, initialType = series.initialType || series.type, plotOptions = chart.options.plotOptions, initialSeriesProto = seriesTypes[initialType].prototype, groups = [\n 'dataLabelsGroup',\n 'dataLabelsGroups',\n 'dataLabelsParentGroups',\n 'group',\n 'markerGroup',\n 'plotClipGroup',\n 'transformGroup'\n ], optionsToCheck = [\n 'dataGrouping',\n 'pointStart',\n 'pointInterval',\n 'pointIntervalUnit',\n 'keys'\n ], \n // Animation must be enabled when calling update before the initial\n // animation has first run. This happens when calling update\n // directly after chart initialization, or when applying responsive\n // rules (#6912).\n animation = series.finishedAnimating && { animation: false }, kinds = {}, dataOptions = options.data || options.dataTable;\n let seriesOptions, n, keepProps = Series.keepProps.slice(), newType = (options.type ||\n oldOptions.type ||\n chart.options.chart.type);\n const keepPoints = !(\n // Indicators etc recalculate the data. It should be\n // possible to omit this.\n this.hasDerivedData ||\n // New type requires new point classes\n (newType && newType !== this.type) ||\n // New options affecting how the data points are built\n typeof options.keys !== 'undefined' ||\n typeof options.pointStart !== 'undefined' ||\n typeof options.pointInterval !== 'undefined' ||\n typeof options.relativeXValue !== 'undefined' ||\n options.joinBy ||\n options.mapData || // #11636\n // Changes to data grouping requires new points in new group\n optionsToCheck.some((option) => series.hasOptionChanged(option)));\n newType = newType || initialType;\n if (keepPoints) {\n keepProps.push.apply(keepProps, Series.keepPropsForPoints);\n if (options.visible !== false) {\n keepProps.push('area', 'graph');\n if (!('zones' in options)) {\n keepProps.push('zones');\n }\n }\n series.parallelArrays.forEach(function (key) {\n keepProps.push(key + 'Data');\n });\n if (dataOptions) {\n // `setData` uses `dataSorting` options so we need to update\n // them earlier\n if (options.dataSorting) {\n extend(series.options.dataSorting, options.dataSorting);\n }\n this.setData(dataOptions, false);\n }\n }\n else {\n this.dataTable.modified = this.dataTable;\n }\n // Merge in multiple data label options (#23560)\n if (options.dataLabels && oldOptions.dataLabels) {\n options.dataLabels = this.mergeArrays(oldOptions.dataLabels, options.dataLabels);\n }\n // Do the merge, with some forced options\n options = merge(oldOptions, {\n // When oldOptions.index is null it should't be cleared.\n // Otherwise navigator series will have wrong indexes (#10193).\n index: oldOptions.index === void 0 ?\n series.index : oldOptions.index,\n pointStart: \n // When updating from blank (#7933)\n plotOptions?.series?.pointStart ??\n oldOptions.pointStart\n }, !keepPoints && { data: series.options.data }, options, animation);\n // Merge does not merge arrays, but replaces them. Since points were\n // updated, `series.options.data` has correct merged options, use it:\n if (keepPoints && options.data) {\n options.data = series.options.data;\n }\n // Make sure preserved properties are not destroyed (#3094)\n keepProps = groups.concat(keepProps);\n keepProps.forEach(function (prop) {\n keepProps[prop] = series[prop];\n delete series[prop];\n });\n let casting = false;\n if (seriesTypes[newType]) {\n casting = newType !== series.type;\n // Destroy the series and delete all properties, it will be\n // reinserted within the `init` call below\n series.remove(false, false, false, true);\n if (casting) {\n // #20264: Re-detect a certain chart properties from new series\n chart.propFromSeries();\n // Modern browsers including IE11\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(series, seriesTypes[newType].prototype);\n // Legacy (IE < 11)\n }\n else {\n const ownEvents = Object.hasOwnProperty.call(series, 'hcEvents') && series.hcEvents;\n for (n in initialSeriesProto) { // eslint-disable-line guard-for-in\n series[n] = void 0;\n }\n // Reinsert all methods and properties from the new type\n // prototype (#2270, #3719).\n extend(series, seriesTypes[newType].prototype);\n // The events are tied to the prototype chain, don't copy if\n // they're not the series' own\n if (ownEvents) {\n series.hcEvents = ownEvents;\n }\n else {\n delete series.hcEvents;\n }\n }\n }\n }\n else {\n error(17, true, chart, { missingModuleFor: newType });\n }\n // Re-register groups (#3094) and other preserved properties\n keepProps.forEach(function (prop) {\n series[prop] = keepProps[prop];\n });\n series.init(chart, options);\n // Remove particular elements of the points. Check `series.options`\n // because we need to consider the options being set on plotOptions as\n // well.\n if (keepPoints && this.points) {\n seriesOptions = series.options;\n // What kind of elements to destroy\n if (seriesOptions.visible === false) {\n kinds.graphic = 1;\n kinds.dataLabel = 1;\n }\n else {\n // If the marker got disabled or changed its symbol, width or\n // height - destroy\n if (this.hasMarkerChanged(seriesOptions, oldOptions)) {\n kinds.graphic = 1;\n }\n if (!series.hasDataLabels?.()) {\n kinds.dataLabel = 1;\n }\n }\n for (const point of this.points) {\n if (point?.series) {\n point.resolveColor();\n // Destroy elements in order to recreate based on updated\n // series options.\n if (Object.keys(kinds).length) {\n point.destroyElements(kinds);\n }\n if (seriesOptions.showInLegend === false &&\n point.legendItem) {\n chart.legend.destroyItem(point);\n }\n }\n }\n }\n series.initialType = initialType;\n chart.linkSeries(); // Links are lost in series.remove (#3028)\n // #15383: Fire updatedData if the type has changed to keep linked\n // series such as indicators updated\n if (casting && series.linkedSeries.length) {\n series.isDirtyData = true;\n }\n fireEvent(this, 'afterUpdate');\n if (pick(redraw, true)) {\n chart.redraw(keepPoints ? void 0 : false);\n }\n }\n /**\n * Used from within series.update\n * @internal\n */\n setName(name) {\n this.name = this.options.name = this.userOptions.name = name;\n this.chart.isDirtyLegend = true;\n }\n /**\n * Check if the option has changed.\n * @internal\n */\n hasOptionChanged(optionName) {\n const chart = this.chart, option = this.options[optionName], plotOptions = chart.options.plotOptions, oldOption = this.userOptions[optionName], plotOptionsOption = pick(plotOptions?.[this.type]?.[optionName], plotOptions?.series?.[optionName]);\n // Check if `plotOptions` are defined already, #19203\n if (oldOption && !defined(plotOptionsOption)) {\n return option !== oldOption;\n }\n return option !== pick(plotOptionsOption, option);\n }\n /**\n * Runs on mouse over the series graphical items.\n *\n * @function Highcharts.Series#onMouseOver\n * @emits Highcharts.Series#event:mouseOver\n */\n onMouseOver() {\n const series = this, chart = series.chart, hoverSeries = chart.hoverSeries, pointer = chart.pointer;\n pointer?.setHoverChartIndex();\n // Set normal state to previous series\n if (hoverSeries && hoverSeries !== series) {\n hoverSeries.onMouseOut();\n }\n // Trigger the event\n fireEvent(series, 'mouseOver');\n // Hover this\n series.setState('hover');\n /**\n * Contains the original hovered series.\n *\n * @name Highcharts.Chart#hoverSeries\n * @type {Highcharts.Series|null}\n */\n chart.hoverSeries = series;\n }\n /**\n * Runs on mouse out of the series graphical items.\n *\n * @function Highcharts.Series#onMouseOut\n *\n * @emits Highcharts.Series#event:mouseOut\n */\n onMouseOut() {\n // Trigger the event only if listeners exist\n const series = this, chart = series.chart, tooltip = chart.tooltip, hoverPoint = chart.hoverPoint;\n // #182, set to null before the mouseOut event fires\n chart.hoverSeries = null;\n // Trigger mouse out on the point, which must be in this series\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n // Fire the mouse out event\n fireEvent(series, 'mouseOut');\n // Hide the tooltip\n if (tooltip &&\n !series.stickyTracking &&\n (!tooltip.shared || series.noSharedTooltip)) {\n tooltip.hide();\n }\n // Reset all inactive states\n chart.series.forEach(function (s) {\n s.setState('', true);\n });\n }\n /**\n * Set the state of the series. Called internally on mouse interaction\n * operations, but it can also be called directly to visually\n * highlight a series.\n *\n * @function Highcharts.Series#setState\n *\n * @param {Highcharts.SeriesStateValue|\"\"} [state]\n * The new state, can be either `'hover'`, `'inactive'`, `'select'`,\n * or `''` (an empty string), `'normal'` or `undefined` to set to\n * normal state.\n * @param {boolean} [inherit]\n * Determines if state should be inherited by points too.\n */\n setState(state, inherit) {\n const series = this, { graph, options } = series, { inactiveOtherPoints, states: stateOptions } = options, \n // By default a quick animation to hover/inactive,\n // slower to un-hover\n stateAnimation = pick(stateOptions?.[state || 'normal']?.animation, series.chart.options.chart.animation);\n let { lineWidth, opacity } = options;\n state = state || '';\n if (series.state !== state) {\n // Toggle class names\n [\n series.group,\n series.markerGroup,\n ...(series.dataLabelsGroups || [])\n ].forEach(function (group) {\n if (group) {\n // Old state\n if (series.state) {\n group.removeClass('highcharts-series-' + series.state);\n }\n // New state\n if (state) {\n group.addClass('highcharts-series-' + state);\n }\n }\n });\n series.state = state;\n if (!series.chart.styledMode) {\n if (stateOptions[state]?.enabled === false) {\n return;\n }\n if (state) {\n lineWidth = (stateOptions[state].lineWidth ||\n lineWidth + (stateOptions[state].lineWidthPlus || 0)); // #4035\n opacity = pick(stateOptions[state].opacity, opacity);\n }\n if (graph && !graph.dashstyle && isNumber(lineWidth)) {\n // Animate the graph stroke-width\n for (const graphElement of [\n graph,\n ...this.zones.map((zone) => zone.graph)\n ]) {\n graphElement?.animate({\n 'stroke-width': lineWidth\n }, stateAnimation);\n }\n }\n // For some types (pie, networkgraph, sankey) opacity is\n // resolved on a point level\n if (!inactiveOtherPoints) {\n [\n series.group,\n series.markerGroup,\n ...(series.dataLabelsGroups || []),\n series.labelBySeries\n ].forEach(function (group) {\n group?.animate({ opacity }, stateAnimation);\n });\n }\n }\n }\n // Don't loop over points on a series that doesn't apply inactive state\n // to siblings markers (e.g. line, column)\n if (inherit && inactiveOtherPoints && series.points) {\n series.setAllPointsToState(state || void 0);\n }\n }\n /**\n * Set the state for all points in the series.\n *\n * @function Highcharts.Series#setAllPointsToState\n *\n * @internal\n *\n * @param {string} [state]\n * Can be either `hover` or undefined to set to normal state.\n */\n setAllPointsToState(state) {\n this.points.forEach(function (point) {\n if (point.setState) {\n point.setState(state);\n }\n });\n }\n /**\n * Show or hide the series.\n *\n * @function Highcharts.Series#setVisible\n *\n * @param {boolean} [visible]\n * True to show the series, false to hide. If undefined, the visibility is\n * toggled.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing more\n * operations on the chart, it is a good idea to set redraw to false and\n * call {@link Chart#redraw|chart.redraw()} after.\n *\n * @emits Highcharts.Series#event:hide\n * @emits Highcharts.Series#event:show\n */\n setVisible(visible, redraw) {\n const series = this, chart = series.chart, ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries, oldVisibility = series.visible;\n // If called without an argument, toggle visibility\n series.visible =\n visible =\n series.options.visible =\n series.userOptions.visible =\n typeof visible === 'undefined' ? !oldVisibility : visible; // #5618\n const showOrHide = visible ? 'show' : 'hide';\n [\n 'group',\n 'markerGroup',\n 'tracker',\n 'tt'\n ].forEach((key) => {\n series[key]?.[showOrHide]();\n });\n series.dataLabelsGroups?.forEach((g) => {\n g?.[showOrHide]();\n });\n // Hide tooltip (#1361)\n if (chart.hoverSeries === series ||\n chart.hoverPoint?.series === series) {\n series.onMouseOut();\n }\n if (series.legendItem) {\n chart.legend.colorizeItem(series, visible);\n }\n // Rescale or adapt to resized chart\n series.isDirty = true;\n // In a stack, all other series are affected\n if (series.options.stacking) {\n chart.series.forEach((otherSeries) => {\n if (otherSeries.options.stacking && otherSeries.visible) {\n otherSeries.isDirty = true;\n }\n });\n }\n // Show or hide linked series\n series.linkedSeries.forEach((otherSeries) => {\n otherSeries.setVisible(visible, false);\n });\n if (ignoreHiddenSeries) {\n chart.isDirtyBox = true;\n }\n fireEvent(series, showOrHide);\n if (redraw !== false) {\n chart.redraw();\n }\n }\n /**\n * Show the series if hidden.\n *\n * @sample highcharts/members/series-hide/\n * Toggle visibility from a button\n *\n * @function Highcharts.Series#show\n * @emits Highcharts.Series#event:show\n */\n show() {\n this.setVisible(true);\n }\n /**\n * Hide the series if visible. If the\n * [chart.ignoreHiddenSeries](https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries)\n * option is true, the chart is redrawn without this series.\n *\n * @sample highcharts/members/series-hide/\n * Toggle visibility from a button\n *\n * @function Highcharts.Series#hide\n * @emits Highcharts.Series#event:hide\n */\n hide() {\n this.setVisible(false);\n }\n /**\n * Select or unselect the series. This means its\n * {@link Highcharts.Series.selected|selected}\n * property is set, the checkbox in the legend is toggled and when selected,\n * the series is returned by the {@link Highcharts.Chart#getSelectedSeries}\n * function.\n *\n * @sample highcharts/members/series-select/\n * Select a series from a button\n *\n * @function Highcharts.Series#select\n *\n * @param {boolean} [selected]\n * True to select the series, false to unselect. If undefined, the selection\n * state is toggled.\n *\n * @emits Highcharts.Series#event:select\n * @emits Highcharts.Series#event:unselect\n */\n select(selected) {\n const series = this;\n series.selected =\n selected =\n this.options.selected = (typeof selected === 'undefined' ?\n !series.selected :\n selected);\n if (series.checkbox) {\n series.checkbox.checked = selected;\n }\n fireEvent(series, selected ? 'select' : 'unselect');\n }\n /**\n * Checks if a tooltip should be shown for a given point.\n *\n * @internal\n */\n shouldShowTooltip(plotX, plotY, options = {}) {\n options.series = this;\n options.visiblePlotOnly = true;\n return this.chart.isInsidePlot(plotX, plotY, options);\n }\n /**\n * Draws the legend symbol based on the legendSymbol user option.\n *\n * @internal\n */\n drawLegendSymbol(legend, item) {\n const renderer = this.chart.renderer, legendSymbol = this.options.legendSymbol || 'rectangle', legendItem = item.legendItem || {}, { options, symbolHeight, symbolWidth } = legend, squareSymbol = options.squareSymbol, adjustedSymbolWidth = squareSymbol ? symbolHeight : symbolWidth, x = squareSymbol ? (symbolWidth - symbolHeight) / 2 : 0, y = (legend.baseline || 0) - symbolHeight + 1, w = adjustedSymbolWidth, h = symbolHeight, r = options.symbolRadius ?? symbolHeight;\n const symbol = legendSymbol === 'rectangle' ?\n // For the rectangle, use a true `rect` element because it renders\n // sharper than a symbol with `path` and arcs\n renderer.rect(x, y, w, h, r) :\n (renderer.symbols[legendSymbol] &&\n renderer.symbol(legendSymbol, x, y, w, h, { r }));\n // Rectangle or SVGRenderer symbol\n if (symbol) {\n legendItem.symbol = symbol\n .addClass('highcharts-point')\n .attr({\n zIndex: 3\n })\n .add(legendItem.group);\n // Symbol function defined in LegendSymbol\n }\n else {\n LegendSymbol[legendSymbol]\n ?.call(this, legend, item);\n }\n }\n}\n/** @internal */\nSeries.defaultOptions = SeriesDefaults;\n/**\n * Registry of all available series types.\n *\n * @name Highcharts.Series.types\n * @type {Highcharts.Dictionary<typeof_Highcharts.Series>}\n */\nSeries.types = SeriesRegistry.seriesTypes;\n/* *\n *\n * Static Functions\n *\n * */\n/**\n * Registers a series class to be accessible via `Series.types`.\n *\n * @function Highcharts.Series.registerType\n *\n * @param {string} seriesType\n * The series type as an identifier string in lower case.\n *\n * @param {Function} SeriesClass\n * The series class as a class pattern or a constructor function with\n * prototype.\n */\nSeries.registerType = SeriesRegistry.registerSeriesType;\n/**\n * Properties to keep after update.\n *\n * @internal\n */\nSeries.keepProps = [\n 'colorIndex',\n 'eventOptions',\n 'navigatorSeries',\n 'symbolIndex',\n 'baseSeries'\n];\n/**\n * Properties to keep after update if the point instances should be\n * preserved.\n *\n * @internal\n */\nSeries.keepPropsForPoints = [\n 'data',\n 'isDirtyData',\n // GeoHeatMap interpolation\n 'isDirtyCanvas',\n 'points',\n 'condemnedPoints',\n 'dataTable',\n 'hasProcessedDataTable', // #17057\n 'xIncrement',\n 'cropped',\n '_hasPointMarkers',\n 'hasDataLabels',\n // Networkgraph (#14397)\n 'nodes',\n 'layout',\n // Treemap\n 'level',\n // Map specific, consider moving it to series-specific preserve-\n // properties (#10617)\n 'mapMap',\n 'mapData',\n 'minY',\n 'maxY',\n 'minX',\n 'maxX',\n 'transformGroups' // #18857\n];\nextend(Series.prototype, {\n axisTypes: ['xAxis', 'yAxis'],\n coll: 'series',\n colorCounter: 0,\n directTouch: false,\n invertible: true,\n isCartesian: true,\n kdAxisArray: ['clientX', 'plotY'],\n // Each point's x and y values are stored in this.xData and this.yData:\n parallelArrays: ['x', 'y'],\n pointClass: Point,\n requireSorting: true,\n // Requires the data to be sorted:\n sorted: true\n});\n/* *\n *\n * Registry\n *\n * */\nSeriesRegistry.series = Series;\n/* *\n *\n * Default Export\n *\n * */\nexport default Series;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * This is a placeholder type of the possible series options for\n * [Highcharts](../highcharts/series), [Highcharts Stock](../highstock/series),\n * [Highmaps](../highmaps/series), and [Gantt](../gantt/series).\n *\n * In TypeScript is this dynamically generated to reference all possible types\n * of series options.\n *\n * @ignore-declaration\n * @typedef {Highcharts.SeriesOptions|Highcharts.Dictionary<*>} Highcharts.SeriesOptionsType\n */\n/**\n * Options for `dataMapping`. The data mapping options allow you to define\n * how data from a data table should be mapped to series points. The object\n * keys refer to the point property that should be mapped, and the values refer\n * to the `dataTable` and `column` that should be used for the mapping.\n *\n * Values can be either a string pointing directly to a column in the first\n * data table, or an object with `dataTable` and `column` properties to specify\n * the mapping in more detail.\n *\n * @example\n * Highcharts.chart('container', {\n * dataTable: {\n * columns: {\n * Year: [2020, 2021, 2022, 2023],\n * Cost: [11, 13, 12, 14],\n * Revenue: [12, 15, 14, 18]\n * }\n * },\n * plotOptions: {\n * series: {\n * // Mapping to a shared column goes in plotOptions\n * dataMapping: {\n * x: 'Year'\n * }\n * }\n * },\n * series: [{\n * dataMapping: {\n * y: 'Cost'\n * }\n * }, {\n * dataMapping: {\n * y: 'Revenue'\n * }\n * }]\n * });\n *\n * @interface Highcharts.DataMappingOptionsObject\n * @since 13.0.0\n */\n/**\n * Function callback when a series has been animated.\n *\n * @callback Highcharts.SeriesAfterAnimateCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesAfterAnimateEventObject} event\n * Event arguments.\n *\n * @param {Highcharts.Series} [ctx]\n * Since v12.6.0, the series context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Event information regarding completed animation of a series.\n *\n * @interface Highcharts.SeriesAfterAnimateEventObject\n */ /**\n* Animated series.\n* @name Highcharts.SeriesAfterAnimateEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesAfterAnimateEventObject#type\n* @type {\"afterAnimate\"}\n*/\n/**\n * Function callback when the checkbox next to the series' name in the legend is\n * clicked.\n *\n * @callback Highcharts.SeriesCheckboxClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesCheckboxClickEventObject} event\n * Event arguments.\n */\n/**\n * Event information regarding check of a series box.\n *\n * @interface Highcharts.SeriesCheckboxClickEventObject\n */ /**\n* Whether the box has been checked.\n* @name Highcharts.SeriesCheckboxClickEventObject#checked\n* @type {boolean}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#item\n* @type {Highcharts.Series}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesCheckboxClickEventObject#type\n* @type {\"checkboxClick\"}\n*/\n/**\n * Function callback when a series is clicked. Return false to cancel toggle\n * actions.\n *\n * @callback Highcharts.SeriesClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {Highcharts.SeriesClickEventObject} event\n * Event arguments.\n *\n * @param {Highcharts.Series} [ctx]\n * Since v12.6.0, the series context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Common information for a click event on a series.\n *\n * @interface Highcharts.SeriesClickEventObject\n * @extends global.Event\n */ /**\n* Nearest point on the graph.\n* @name Highcharts.SeriesClickEventObject#point\n* @type {Highcharts.Point}\n*/\n/**\n * Gets fired when the series is hidden after chart generation time, either by\n * clicking the legend item or by calling `.hide()`.\n *\n * @callback Highcharts.SeriesHideCallbackFunction\n *\n * @param {Highcharts.Series} this\n * The series where the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n *\n * @param {Highcharts.Series} [ctx]\n * Since v12.6.0, the series context passed as an extra argument for\n * arrow functions.\n */\n/**\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin` of a line\n * graph.\n *\n * @typedef {\"butt\"|\"round\"|\"square\"|string} Highcharts.SeriesLinecapValue\n */\n/**\n * Gets fired when the mouse leaves the graph.\n *\n * @callback Highcharts.SeriesMouseOutCallbackFunction\n *\n * @param {Highcharts.Series} this\n * Series where the event occurred.\n *\n * @param {global.PointerEvent} event\n * Event that occurred.\n *\n * @param {Highcharts.Series} [ctx]\n * Since v12.6.0, the series context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Gets fired when the mouse enters the graph.\n *\n * @callback Highcharts.SeriesMouseOverCallbackFunction\n *\n * @param {Highcharts.Series} this\n * Series where the event occurred.\n *\n * @param {global.PointerEvent} event\n * Event that occurred.\n *\n * @param {Highcharts.Series} [ctx]\n * Since v12.6.0, the series context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Translation and scale for the plot area of a series.\n *\n * @interface Highcharts.SeriesPlotBoxObject\n */ /**\n* @name Highcharts.SeriesPlotBoxObject#scaleX\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#scaleY\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#translateX\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#translateY\n* @type {number}\n*/\n/**\n * Gets fired when the series is shown after chart generation time, either by\n * clicking the legend item or by calling `.show()`.\n *\n * @callback Highcharts.SeriesShowCallbackFunction\n *\n * @param {Highcharts.Series} this\n * Series where the event occurred.\n *\n * @param {global.Event} event\n * Event that occurred.\n *\n * @param {Highcharts.Series} [ctx]\n * Since v12.6.0, the series context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Possible key values for the series state options.\n *\n * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.SeriesStateValue\n */\n''; // Detach doclets above\n/* *\n *\n * API Options\n *\n * */\n/**\n * Series options for specific data and the data itself. In TypeScript you\n * have to cast the series options to specific series types, to get all\n * possible options for a series.\n *\n * ```ts\n * // TypeScript example\n * Highcharts.chart('container', {\n * series: [{\n * color: '#06C',\n * data: [[0, 1], [2, 3]]\n * } as Highcharts.SeriesLineOptions ]\n * });\n * ```\n *\n * @type {Array<*>}\n * @apioption series\n */\n/**\n * An id for the series. This can be used after render time to get a pointer\n * to the series object through `chart.get()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-id/\n * Get series by id\n *\n * @basic\n * @type {string}\n * @since 1.2.0\n * @apioption series.id\n */\n/**\n * The index of the series in the chart, affecting the internal index in the\n * `chart.series` array, the visible Z index as well as the order in the\n * legend.\n *\n * @basic\n * @type {number}\n * @since 2.3.0\n * @apioption series.index\n */\n/**\n * The sequential index of the series in the legend.\n *\n * @see [legend.reversed](#legend.reversed),\n * [yAxis.reversedStacks](#yAxis.reversedStacks)\n *\n * @sample {highcharts|highstock} highcharts/series/legendindex/\n * Legend in opposite order\n *\n * @type {number}\n * @apioption series.legendIndex\n */\n/**\n * The name of the series as shown in the legend, tooltip etc. If a `dataTable`\n * and `dataMapping` are used, the name defaults to the id of the primary data\n * table column. Otherwise, it defaults to \"Series {n}\", where n is the index of\n * the series, starting at 1.\n *\n * @sample {highcharts} highcharts/series/name/\n * Series name\n * @sample {highmaps} maps/demo/category-map/\n * Series name\n *\n * @basic\n * @type {string}\n * @apioption series.name\n */\n/**\n * The type of series, for example `line` or `column`. By default, the\n * series type is inherited from [chart.type](#chart.type), so unless the\n * chart is a combination of series types, there is no need to set it on the\n * series level.\n *\n * @sample {highcharts} highcharts/series/type/\n * Line and column in the same chart\n * @sample highcharts/series/type-dynamic/\n * Dynamic types with button selector\n * @sample {highmaps} maps/demo/mapline-mappoint/\n * Multiple types in the same map\n *\n * @basic\n * @type {string}\n * @apioption series.type\n */\n/**\n * When using dual or multiple x axes, this number defines which xAxis the\n * particular series is connected to. It refers to either the\n * {@link #xAxis.id|axis id}\n * or the index of the axis in the xAxis array, with 0 being the first.\n *\n * @type {number|string}\n * @default 0\n * @product highcharts highstock\n * @apioption series.xAxis\n */\n/**\n * When using dual or multiple y axes, this number defines which yAxis the\n * particular series is connected to. It refers to either the\n * {@link #yAxis.id|axis id}\n * or the index of the axis in the yAxis array, with 0 being the first.\n *\n * @sample {highcharts} highcharts/series/yaxis/\n * Apply the column series to the secondary Y axis\n *\n * @type {number|string}\n * @default 0\n * @product highcharts highstock\n * @apioption series.yAxis\n */\n/**\n * Define the visual z index of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-zindex-default/\n * With no z index, the series defined last are on top\n * @sample {highcharts} highcharts/plotoptions/series-zindex/\n * With a z index, the series with the highest z index is on top\n * @sample {highstock} highcharts/plotoptions/series-zindex-default/\n * With no z index, the series defined last are on top\n * @sample {highstock} highcharts/plotoptions/series-zindex/\n * With a z index, the series with the highest z index is on top\n *\n * @type {number}\n * @product highcharts highstock\n * @apioption series.zIndex\n */\n/**\n * Contains the point's index in the `Series.points` array.\n *\n * @name Highcharts.Point#index\n * @type {number}\n * @readonly\n */\n/**\n * The translated X value for the point in terms of pixels. Relative\n * to the X axis position if the series has one, otherwise relative\n * to the plot area. Depending on the series type this value might\n * not be defined.\n *\n * In an inverted chart the x-axis is going from the bottom to the\n * top so the `plotX` value is the number of pixels from the bottom\n * of the axis.\n *\n * @see Highcharts.Point#pos\n * @name Highcharts.Point#plotX\n * @type {number|undefined}\n */\n/**\n * The translated Y value for the point in terms of pixels. Relative\n * to the Y axis position if the series has one, otherwise relative\n * to the plot area. Depending on the series type this value might\n * not be defined.\n *\n * In an inverted chart the y-axis is going from right to left\n * so the `plotY` value is the number of pixels from the right\n * of the `yAxis`.\n *\n * @see Highcharts.Point#pos\n * @name Highcharts.Point#plotY\n * @type {number|undefined}\n */\n''; // Include precedent doclets in transpiled\n","/* *\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 T from '../../Templating.js';\nconst { format } = T;\nimport SeriesRegistry from '../../Series/SeriesRegistry.js';\nconst { series: Series } = SeriesRegistry;\nimport { destroyObjectProperties, fireEvent, getAlignFactor, isNumber, pick } from '../../../Shared/Utilities.js';\n/* *\n *\n * Class\n *\n * */\n/**\n * The class for stacks. Each stack, on a specific X value and either negative\n * or positive, has its own stack item.\n */\nclass StackItem {\n /* *\n *\n * Constructor\n *\n * */\n /** @internal */\n constructor(axis, options, negativeValue, x, stackOption) {\n const inverted = axis.chart.inverted, reversed = axis.reversed;\n this.axis = axis;\n // The stack goes to the left either if the stack has negative value\n // or when axis is reversed. XOR operator.\n const isNegative = (this.isNegative = !!negativeValue !== !!reversed);\n // Save the options to be able to style the label\n this.options = options = options || {};\n // Save the x value to be able to position the label later\n this.x = x;\n // Initialize total value\n this.total = null;\n this.cumulative = null;\n // This will keep each points' extremes stored by series.index and point\n // index\n this.points = {};\n this.hasValidPoints = false;\n // Save the stack option on the series configuration object,\n // and whether to treat it as percent\n this.stack = stackOption;\n this.leftCliff = 0;\n this.rightCliff = 0;\n // The align options and text align varies on whether the stack is\n // negative and if the chart is inverted or not.\n // First test the user supplied value, then use the dynamic.\n this.alignOptions = {\n align: options.align ||\n (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n verticalAlign: options.verticalAlign ||\n (inverted ? 'middle' : isNegative ? 'bottom' : 'top'),\n y: options.y,\n x: options.x\n };\n this.textAlign =\n options.textAlign ||\n (inverted ? (!isNegative ? 'left' : 'right') : 'center');\n }\n /* *\n *\n * Functions\n *\n * */\n /** @internal */\n destroy() {\n destroyObjectProperties(this, this.axis);\n }\n /**\n * Renders the stack total label and adds it to the stack label group.\n * @internal\n */\n render(group) {\n const chart = this.axis.chart, options = this.options, formatOption = options.format, \n // Format the text in the label.\n str = (formatOption ?\n format(formatOption, this, chart) :\n options.formatter?.call(this, this)) || '';\n // Change the text to reflect the new total and set visibility to hidden\n // in case the series is hidden\n if (this.label) {\n this.label.attr({ text: str, visibility: 'hidden' });\n }\n else {\n // Create new label\n this.label = chart.renderer.label(str, null, void 0, options.shape, void 0, void 0, options.useHTML, false, 'stack-labels');\n const attr = {\n r: options.borderRadius || 0,\n text: str,\n // Set default padding to 5 as it is in dataLabels #12308\n padding: pick(options.padding, 5),\n visibility: 'hidden' // Hidden until setOffset is called\n };\n if (!chart.styledMode) {\n attr.fill = options.backgroundColor;\n attr.stroke = options.borderColor;\n attr['stroke-width'] = options.borderWidth;\n this.label.css(options.style || {});\n }\n this.label.attr(attr);\n if (!this.label.added) {\n this.label.add(group); // Add to the labels-group\n }\n }\n // Rank it higher than data labels (#8742)\n this.label.labelrank = chart.plotSizeY;\n fireEvent(this, 'afterRender');\n }\n /**\n * Sets the offset that the stack has from the x value and repositions the\n * label.\n * @internal\n */\n setOffset(xOffset, width, boxBottom, boxTop, defaultX, xAxis) {\n const { alignOptions, axis, label, options, textAlign } = this, chart = axis.chart, stackBox = this.getStackBox({\n xOffset,\n width,\n boxBottom,\n boxTop,\n defaultX,\n xAxis\n }), { verticalAlign } = alignOptions;\n if (label && stackBox) {\n const labelBox = label.getBBox(void 0, 0), padding = label.padding;\n let isJustify = pick(options.overflow, 'justify') === 'justify', visible;\n // Reset alignOptions property after justify #12337\n alignOptions.x = options.x || 0;\n alignOptions.y = options.y || 0;\n // Calculate the adjusted Stack position, to take into consideration\n // The size if the labelBox and vertical alignment as\n // well as the text alignment. It's need to be done to work with\n // default SVGLabel.align/justify methods.\n const { x, y } = this.adjustStackPosition({\n labelBox,\n verticalAlign,\n textAlign\n });\n stackBox.x -= x;\n stackBox.y -= y;\n // Align the label to the adjusted box.\n label.align(alignOptions, false, stackBox);\n // Check if label is inside the plotArea #12294\n visible = chart.isInsidePlot(label.alignAttr.x + alignOptions.x + x, label.alignAttr.y + alignOptions.y + y);\n if (!visible) {\n isJustify = false;\n }\n if (isJustify) {\n // Justify stackLabel into the alignBox\n Series.prototype.justifyDataLabel.call(axis, label, alignOptions, label.alignAttr, labelBox, stackBox);\n }\n // Add attr to avoid the default animation of justifyDataLabel.\n // Also add correct rotation with its rotation origin. #15129\n label.attr({\n x: label.alignAttr.x,\n y: label.alignAttr.y,\n rotation: options.rotation,\n rotationOriginX: labelBox.width *\n getAlignFactor(options.textAlign || 'center'),\n rotationOriginY: labelBox.height / 2\n });\n // Check if the dataLabel should be visible.\n if (pick(!isJustify && options.crop, true)) {\n visible =\n isNumber(label.x) &&\n isNumber(label.y) &&\n chart.isInsidePlot(label.x - padding + (label.width || 0), label.y) &&\n chart.isInsidePlot(label.x + padding, label.y);\n }\n label[visible ? 'show' : 'hide']();\n }\n fireEvent(this, 'afterSetOffset', { xOffset, width });\n }\n /**\n * Adjust the stack BBox position, to take into consideration the alignment\n * of the dataLabel. This is necessary to make the stackDataLabel work with\n * core methods like `SVGLabel.adjust` and `Series.justifyDataLabel`.\n * @internal\n */\n adjustStackPosition({ labelBox, verticalAlign, textAlign }) {\n return {\n x: labelBox.width / 2 +\n (labelBox.width / 2) * (2 * getAlignFactor(textAlign) - 1),\n y: (labelBox.height / 2) * 2 * (1 - getAlignFactor(verticalAlign))\n };\n }\n /**\n * Get the bbox of the stack.\n * @internal\n * @function Highcharts.StackItem#getStackBox\n * @return {BBoxObject}\n * The x, y, height, width of the stack.\n */\n getStackBox(stackBoxProps) {\n const stackItem = this, axis = this.axis, chart = axis.chart, { boxTop, defaultX, xOffset, width, boxBottom } = stackBoxProps, totalStackValue = axis.stacking.usePercentage ?\n 100 :\n pick(boxTop, this.total, 0), y = axis.toPixels(totalStackValue), xAxis = stackBoxProps.xAxis || chart.xAxis[0], x = pick(defaultX, xAxis.translate(this.x)) + xOffset, yZero = axis.toPixels(boxBottom ||\n (isNumber(axis.min) &&\n axis.logarithmic &&\n axis.logarithmic.lin2log(axis.min)) ||\n 0), height = Math.abs(y - yZero), inverted = chart.inverted, neg = stackItem.isNegative;\n return inverted ?\n {\n x: (neg ? y : y - height) - chart.plotLeft,\n y: xAxis.height - x - width + xAxis.top - chart.plotTop,\n width: height,\n height: width\n } : {\n x: x + xAxis.transB - chart.plotLeft,\n y: (neg ? y - height : y) - chart.plotTop,\n width: width,\n height: height\n };\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nexport default StackItem;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Stack of data points\n *\n * @product highcharts\n *\n * @interface Highcharts.StackItemObject\n */ /**\n* Alignment settings\n* @name Highcharts.StackItemObject#alignOptions\n* @type {Highcharts.AlignObject}\n*/ /**\n* Related axis\n* @name Highcharts.StackItemObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Cumulative value of the stacked data points\n* @name Highcharts.StackItemObject#cumulative\n* @type {number}\n*/ /**\n* True if on the negative side\n* @name Highcharts.StackItemObject#isNegative\n* @type {boolean}\n*/ /**\n* Related SVG element\n* @name Highcharts.StackItemObject#label\n* @type {Highcharts.SVGElement}\n*/ /**\n* Related stack options\n* @name Highcharts.StackItemObject#options\n* @type {Highcharts.YAxisStackLabelsOptions}\n*/ /**\n* Total value of the stacked data points\n* @name Highcharts.StackItemObject#total\n* @type {number}\n*/ /**\n* Shared x value of the stack\n* @name Highcharts.StackItemObject#x\n* @type {number}\n*/\n''; // Keeps doclets above in JS file\n","/* *\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';\n/* *\n *\n * API Options\n *\n * */\n/**\n * Column series display one column per value along an X axis.\n *\n * @sample {highcharts} highcharts/demo/column-basic/\n * Column chart\n * @sample {highstock} stock/demo/column/\n * Column chart\n *\n * @extends plotOptions.line\n * @excluding connectEnds, connectNulls, gapSize, gapUnit, linecap,\n * lineWidth, marker, step, useOhlcData\n * @product highcharts highstock\n * @optionparent plotOptions.column\n */\nconst ColumnSeriesDefaults = {\n /**\n * The corner radius of the border surrounding each column or bar. A number\n * signifies pixels. A percentage string, like for example `50%`, signifies\n * a relative size. For columns this is relative to the column width, for\n * pies it is relative to the radius and the inner radius.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderradius/\n * Rounded columns\n * @sample highcharts/plotoptions/series-border-radius\n * Column and pie with rounded border\n *\n * @type {number|string|Highcharts.BorderRadiusOptionsObject}\n * @product highcharts highstock gantt\n */\n borderRadius: 3,\n /**\n * When using automatic point colors pulled from the global\n * [colors](colors) or series-specific\n * [plotOptions.column.colors](series.colors) collections, this option\n * determines whether the chart should receive one color per series or\n * one color per point.\n *\n * In styled mode, the `colors` or `series.colors` arrays are not\n * supported, and instead this option gives the points individual color\n * class names on the form `highcharts-color-{n}`.\n *\n * @see [series colors](#plotOptions.column.colors)\n *\n * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-false/\n * False by default\n * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-true/\n * True\n *\n * @type {boolean}\n * @default false\n * @since 2.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.colorByPoint\n */\n /**\n * A series specific or series type specific color set to apply instead\n * of the global [colors](#colors) when [colorByPoint](\n * #plotOptions.column.colorByPoint) is true.\n *\n * @type {Array<Highcharts.ColorType>}\n * @since 3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.colors\n */\n /**\n * When `true`, the columns will center in the category, ignoring null\n * or missing points. When `false`, space will be reserved for null or\n * missing points.\n *\n * @sample {highcharts} highcharts/series-column/centerincategory/\n * Center in category\n * @sample {highcharts} highcharts/series/stack-centerincategory/\n * Center in category, stacked and grouped\n *\n * @since 8.0.1\n * @product highcharts highstock gantt\n */\n centerInCategory: false,\n /**\n * Padding between each value groups, in x axis units.\n *\n * @sample {highcharts} highcharts/plotoptions/column-grouppadding-default/\n * 0.2 by default\n * @sample {highcharts} highcharts/plotoptions/column-grouppadding-none/\n * No group padding - all columns are evenly spaced\n *\n * @product highcharts highstock gantt\n */\n groupPadding: 0.2,\n /**\n * Whether to group non-stacked columns or to let them render\n * independent of each other. Non-grouped columns will be laid out\n * individually and overlap each other.\n *\n * @sample {highcharts} highcharts/plotoptions/column-grouping-false/\n * Grouping disabled\n * @sample {highstock} highcharts/plotoptions/column-grouping-false/\n * Grouping disabled\n *\n * @type {boolean}\n * @default true\n * @since 2.3.0\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.grouping\n */\n /** @ignore-option */\n marker: null, // Point options are specified in the base options\n /**\n * The maximum allowed pixel width for a column, translated to the\n * height of a bar in a bar chart. This prevents the columns from\n * becoming too wide when there is a small number of points in the\n * chart.\n *\n * @see [pointWidth](#plotOptions.column.pointWidth)\n *\n * @sample {highcharts} highcharts/plotoptions/column-maxpointwidth-20/\n * Limited to 50\n * @sample {highstock} highcharts/plotoptions/column-maxpointwidth-20/\n * Limited to 50\n *\n * @type {number}\n * @since 4.1.8\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.maxPointWidth\n */\n /**\n * Padding between each column or bar, in x axis units.\n *\n * @sample {highcharts} highcharts/plotoptions/column-pointpadding-default/\n * 0.1 by default\n * @sample {highcharts} highcharts/plotoptions/column-pointpadding-025/\n * 0.25\n * @sample {highcharts} highcharts/plotoptions/column-pointpadding-none/\n * 0 for tightly packed columns\n *\n * @product highcharts highstock gantt\n */\n pointPadding: 0.1,\n /**\n * A pixel value specifying a fixed width for each column or bar point.\n * When set to `undefined`, the width is calculated from the\n * `pointPadding` and `groupPadding`. The width effects the dimension\n * that is not based on the point value. For column series it is the\n * horizontal length and for bar series it is the vertical length.\n *\n * @see [maxPointWidth](#plotOptions.column.maxPointWidth)\n *\n * @sample {highcharts} highcharts/plotoptions/column-pointwidth-20/\n * 20px wide columns regardless of chart width or the amount of\n * data points\n *\n * @type {number}\n * @since 1.2.5\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.pointWidth\n */\n /**\n * A pixel value specifying a fixed width for the column or bar.\n * Overrides pointWidth on the series.\n *\n * @see [series.pointWidth](#plotOptions.column.pointWidth)\n *\n * @type {number}\n * @default undefined\n * @since 7.0.0\n * @product highcharts highstock gantt\n * @apioption series.column.data.pointWidth\n */\n /**\n * The minimal height for a column or width for a bar. By default,\n * 0 values are not shown. To visualize a 0 (or close to zero) point,\n * set the minimal point length to a pixel value like 3\\. In stacked\n * column charts, minPointLength might not be respected for tightly\n * packed values.\n *\n * @sample {highcharts} highcharts/plotoptions/column-minpointlength/\n * Zero base value\n * @sample {highcharts} highcharts/plotoptions/column-minpointlength-pos-and-neg/\n * Positive and negative close to zero values\n *\n * @product highcharts highstock gantt\n */\n minPointLength: 0,\n /**\n * When the series contains less points than the crop threshold, all\n * points are drawn, even if the points fall outside the visible plot\n * area at the current zoom. The advantage of drawing all points\n * (including markers and columns), is that animation is performed on\n * updates. On the other hand, when the series contains more points than\n * the crop threshold, the series data is cropped to only contain points\n * that fall within the plot area. The advantage of cropping away\n * invisible points is to increase performance on large series.\n *\n * @product highcharts highstock gantt\n */\n cropThreshold: 50,\n /**\n * The X axis range that each point is valid for. This determines the\n * width of the column. On a categorized axis, the range will be 1\n * by default (one category unit). On linear and datetime axes, the\n * range will be computed as the distance between the two closest data\n * points.\n *\n * The default `null` means it is computed automatically, but this\n * option can be used to override the automatic value.\n *\n * This option is set by default to 1 if data sorting is enabled.\n *\n * @sample {highcharts} highcharts/plotoptions/column-pointrange/\n * Set the point range to one day on a data set with one week\n * between the points\n *\n * @type {number|null}\n * @since 2.3\n * @product highcharts highstock gantt\n */\n pointRange: null,\n states: {\n /**\n * Options for the hovered point. These settings override the normal\n * state options when a point is moused over or touched.\n *\n * @extends plotOptions.series.states.hover\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock gantt\n */\n hover: {\n /** @ignore-option */\n halo: false,\n /**\n * A specific border color for the hovered point. Defaults to\n * inherit the normal state border color.\n *\n * @type {Highcharts.ColorType}\n * @product highcharts gantt\n * @apioption plotOptions.column.states.hover.borderColor\n */\n /**\n * A specific color for the hovered point.\n *\n * @type {Highcharts.ColorType}\n * @product highcharts gantt\n * @apioption plotOptions.column.states.hover.color\n */\n /**\n * How much to brighten the point on interaction.\n *\n * In styled mode, the hover brightening is by default replaced\n * with a fill-opacity set in the `.highcharts-point:hover`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-states-hover-brightness/\n * Brighten by 0.5\n *\n * @product highcharts highstock gantt\n */\n brightness: 0.2\n },\n /**\n * Options for the selected point. These settings override the\n * normal state options when a point is selected.\n *\n * @extends plotOptions.series.states.select\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock gantt\n */\n select: {\n /**\n * A specific color for the selected point.\n *\n * @type {Highcharts.ColorType}\n * @default #cccccc\n * @product highcharts highstock gantt\n */\n color: 'var(--highcharts-neutral-color-20)',\n /**\n * A specific border color for the selected point.\n *\n * @type {Highcharts.ColorType}\n * @default #000000\n * @product highcharts highstock gantt\n */\n borderColor: 'var(--highcharts-neutral-color-100)'\n }\n },\n dataLabels: {\n align: void 0,\n verticalAlign: void 0,\n /**\n * The y position offset of the label relative to the point in\n * pixels.\n *\n * @type {number}\n */\n y: void 0\n },\n // False doesn't work well: https://jsfiddle.net/highcharts/hz8fopan/14/\n /** @ignore-option */\n startFromThreshold: true,\n stickyTracking: false,\n tooltip: {\n distance: 6\n },\n /**\n * The Y axis value to serve as the base for the columns, for\n * distinguishing between values above and below a threshold. If `null`,\n * the columns extend from the padding Y axis minimum.\n *\n * @type {number|null}\n * @since 2.0\n * @product highcharts\n */\n threshold: 0,\n /**\n * The width of the border surrounding each column or bar. Defaults to\n * `1` when there is room for a border, but to `0` when the columns are\n * so dense that a border would cover the next column.\n *\n * In styled mode, the stroke width can be set with the\n * `.highcharts-point` rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n * 2px black border\n *\n * @type {number}\n * @default undefined\n * @product highcharts highstock gantt\n * @apioption plotOptions.column.borderWidth\n */\n /**\n * The color of the border surrounding each column or bar.\n *\n * In styled mode, the border stroke can be set with the\n * `.highcharts-point` rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n * Dark gray border\n *\n * @type {Highcharts.ColorType}\n * @default #ffffff\n * @product highcharts highstock gantt\n */\n borderColor: 'var(--highcharts-background-color)'\n};\n/**\n * A `column` series. If the [type](#series.column.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.column\n * @excluding connectNulls, dataParser, dataURL, gapSize, gapUnit, linecap,\n * lineWidth, marker, connectEnds, step\n * @product highcharts highstock\n * @apioption series.column\n */\n/**\n * An array of data points for the series. For the `column` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n * interpreted as `y` options. The `x` values will be automatically\n * calculated, either starting at 0 and incremented by 1, or from\n * `pointStart` and `pointInterval` given in the series options. If the axis\n * has categories, these will be used. Example:\n * ```js\n * data: [0, 5, 3, 5]\n * ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n * `x,y`. If the first value is a string, it is applied as the name of the\n * point, and the `x` value is inferred.\n * ```js\n * data: [\n * [0, 6],\n * [1, 2],\n * [2, 6]\n * ]\n * ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of\n * data points exceeds the series'\n * [turboThreshold](#series.column.turboThreshold), this option is not\n * available.\n * ```js\n * data: [{\n * x: 1,\n * y: 9,\n * name: \"Point2\",\n * color: \"#00FF00\"\n * }, {\n * x: 1,\n * y: 6,\n * name: \"Point1\",\n * color: \"#FF00FF\"\n * }]\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n * Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n * Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n * Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @basic\n * @type {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends series.line.data\n * @excluding marker\n * @product highcharts highstock\n * @apioption series.column.data\n */\n/**\n * The color of the border surrounding the column or bar.\n *\n * In styled mode, the border stroke can be set with the `.highcharts-point`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n * Dark gray border\n *\n * @type {Highcharts.ColorType}\n * @product highcharts highstock\n * @apioption series.column.data.borderColor\n */\n/**\n * The width of the border surrounding the column or bar.\n *\n * In styled mode, the stroke width can be set with the `.highcharts-point`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n * 2px black border\n *\n * @type {number}\n * @product highcharts highstock\n * @apioption series.column.data.borderWidth\n */\n/**\n * A name for the dash style to use for the column or bar. Overrides\n * dashStyle on the series.\n *\n * In styled mode, the stroke dash-array can be set with the same classes as\n * listed under [data.color](#series.column.data.color).\n *\n * @see [series.pointWidth](#plotOptions.column.dashStyle)\n *\n * @type {Highcharts.DashStyleValue}\n * @apioption series.column.data.dashStyle\n */\n/**\n * A pixel value specifying a fixed width for the column or bar. Overrides\n * pointWidth on the series. The width effects the dimension that is not based\n * on the point value.\n *\n * @see [series.pointWidth](#plotOptions.column.pointWidth)\n *\n * @type {number}\n * @apioption series.column.data.pointWidth\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock\n * @apioption series.column.states.hover\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product highcharts highstock\n * @apioption series.column.states.select\n */\n/**\n * @extends series.column.states\n * @product highcharts highstock\n * @apioption series.column.data.states\n */\n''; // Keeps doclets above in JS file\n/* *\n *\n * Default Export\n *\n * */\nexport default ColumnSeriesDefaults;\n","/* *\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 '../../Core/Animation/AnimationUtilities.js';\nconst { animObject } = A;\nimport Color from '../../Core/Color/Color.js';\nconst { parse: color } = Color;\nimport ColumnSeriesDefaults from './ColumnSeriesDefaults.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport Series from '../../Core/Series/Series.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport { clamp, crisp, defined, extend, fireEvent, isArray, isNumber, merge, objectEach, pick } from '../../Shared/Utilities.js';\n/* *\n *\n * Class\n *\n * */\n/**\n * The column series type.\n *\n * @internal\n * @class\n * @name Highcharts.seriesTypes.column\n *\n * @augments Highcharts.Series\n */\nclass ColumnSeries extends Series {\n /* *\n *\n * Functions\n *\n * */\n /**\n * Animate the column heights one by one from zero.\n *\n * @internal\n * @function Highcharts.seriesTypes.column#animate\n *\n * @param {boolean} init\n * Whether to initialize the animation or run it\n */\n animate(init) {\n const series = this, yAxis = this.yAxis, yAxisPos = yAxis.pos, reversed = yAxis.reversed, options = series.options, { clipOffset, inverted } = this.chart, attr = {}, translateProp = inverted ?\n 'translateX' :\n 'translateY';\n let translateStart, translatedThreshold;\n if (init && clipOffset) {\n attr.scaleY = 0.001;\n translatedThreshold = clamp(yAxis.toPixels(options.threshold || 0), yAxisPos, yAxisPos + yAxis.len);\n if (inverted) {\n // Make sure the columns don't cover the axis line during\n // entrance animation\n translatedThreshold += reversed ?\n -Math.floor(clipOffset[inverted ? 1 : 0]) :\n Math.ceil(clipOffset[inverted ? 3 : 2]);\n attr.translateX = translatedThreshold - yAxis.len;\n }\n else {\n // Make sure the columns don't cover the axis line during\n // entrance animation\n translatedThreshold += reversed ?\n Math.ceil(clipOffset[inverted ? 1 : 0]) :\n -Math.floor(clipOffset[inverted ? 3 : 2]);\n attr.translateY = translatedThreshold;\n }\n // Apply final clipping (used in Highcharts Stock) (#7083)\n // animation is done by scaleY, so clipping is for panes\n if (series.clipBox) {\n series.setClip();\n }\n series.group.attr(attr);\n }\n else { // Run the animation\n translateStart = Number(series.group.attr(translateProp));\n series.group.animate({ scaleY: 1 }, extend(animObject(series.options.animation), {\n // Do the scale synchronously to ensure smooth\n // updating (#5030, #7228)\n step: function (val, fx) {\n if (series.group) {\n attr[translateProp] = translateStart +\n fx.pos * (yAxisPos - translateStart);\n series.group.attr(attr);\n }\n }\n }));\n }\n }\n /**\n * Initialize the series. Extends the basic Series.init method by\n * marking other series of the same type as dirty.\n *\n * @internal\n * @function Highcharts.seriesTypes.column#init\n */\n init(chart, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options) {\n super.init.apply(this, arguments);\n const series = this;\n chart = series.chart;\n // If the series is added dynamically, force redraw of other\n // series affected by a new column\n if (chart.hasRendered) {\n chart.series.forEach(function (otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n }\n /**\n * Return the width and x offset of the columns adjusted for grouping,\n * groupPadding, pointPadding, pointWidth etc.\n *\n * @internal\n * @function Highcharts.seriesTypes.column#getColumnMetrics\n */\n getColumnMetrics() {\n const series = this, options = series.options, xAxis = series.xAxis, yAxis = series.yAxis, reversedStacks = xAxis.options.reversedStacks, \n // Keep backward compatibility: reversed xAxis had reversed\n // stacks\n reverseStacks = (xAxis.reversed && !reversedStacks) ||\n (!xAxis.reversed && reversedStacks), stackGroups = {};\n let stackKey, columnCount = 0;\n // Get the total number of column type series. This is called on\n // every series. Consider moving this logic to a chart.orderStacks()\n // function and call it on init, addSeries and removeSeries\n if (options.grouping === false) {\n columnCount = 1;\n }\n else {\n series.chart.series.forEach(function (otherSeries) {\n const otherYAxis = otherSeries.yAxis, otherOptions = otherSeries.options;\n let columnIndex;\n if (otherSeries.type === series.type &&\n otherSeries.reserveSpace() &&\n yAxis.len === otherYAxis.len &&\n yAxis.pos === otherYAxis.pos) { // #642, #2086\n if (otherOptions.stacking &&\n otherOptions.stacking !== 'group') {\n stackKey = otherSeries.stackKey;\n if (typeof stackGroups[stackKey] ===\n 'undefined') {\n stackGroups[stackKey] = columnCount++;\n }\n columnIndex = stackGroups[stackKey];\n }\n else if (otherOptions.grouping !== false) { // #1162\n columnIndex = columnCount++;\n }\n otherSeries.columnIndex = columnIndex;\n }\n });\n }\n const categoryWidth = Math.min(Math.abs(xAxis.transA) * ((!xAxis.brokenAxis?.hasBreaks && xAxis.ordinal?.slope) ||\n options.pointRange ||\n xAxis.closestPointRange ||\n xAxis.tickInterval ||\n 1), // #2610\n xAxis.len // #1535\n ), groupPadding = categoryWidth * options.groupPadding, groupWidth = categoryWidth - 2 * groupPadding, pointOffsetWidth = groupWidth / (columnCount || 1), pointWidth = Math.min(options.maxPointWidth || xAxis.len, pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))), pointPadding = (pointOffsetWidth - pointWidth) / 2, \n // #1251, #3737\n colIndex = (series.columnIndex || 0) + (reverseStacks ? 1 : 0), pointXOffset = pointPadding +\n (groupPadding +\n colIndex * pointOffsetWidth -\n (categoryWidth / 2)) * (reverseStacks ? -1 : 1);\n // Save it for reading in linked series (Error bars particularly)\n series.columnMetrics = {\n width: pointWidth,\n offset: pointXOffset,\n paddedWidth: pointOffsetWidth,\n columnCount\n };\n return series.columnMetrics;\n }\n /**\n * Make the columns crisp. The edges are rounded to the nearest full\n * pixel.\n *\n * @internal\n * @function Highcharts.seriesTypes.column#crispCol\n */\n crispCol(x, y, width, height) {\n const borderWidth = this.borderWidth, inverted = this.chart.inverted, bottom = crisp(y + height, borderWidth, inverted);\n // Vertical\n y = crisp(y, borderWidth, inverted);\n height = bottom - y;\n // Horizontal. We need to first compute the exact right edge, then\n // round it and compute the width from there.\n if (this.options.crisp) {\n const right = crisp(x + width, borderWidth);\n x = crisp(x, borderWidth);\n width = right - x;\n }\n return { x, y, width, height };\n }\n /**\n * Adjust for missing columns, according to the `centerInCategory`\n * option. Missing columns are either single points or stacks where the\n * point or points are either missing or null.\n *\n * @internal\n * @function Highcharts.seriesTypes.column#adjustForMissingColumns\n * @param {number} x\n * The x coordinate of the column, left side\n *\n * @param {number} pointWidth\n * The pointWidth, already computed upstream\n *\n * @param {Highcharts.ColumnPoint} point\n * The point instance\n *\n * @param {Highcharts.ColumnMetricsObject} metrics\n * The series-wide column metrics\n *\n * @return {number}\n * The adjusted x position, or the original if not adjusted\n */\n adjustForMissingColumns(x, pointWidth, point, metrics) {\n if (!point.isNull && metrics.columnCount > 1) {\n const visibleSeries = this.xAxis.series\n .filter((s) => s.visible)\n .map((s) => s.index);\n let indexInCategory = 0, totalInCategory = 0;\n // Loop over all the stacks on the Y axis. When stacking is enabled,\n // these are real point stacks. When stacking is not enabled, but\n // `centerInCategory` is true, there is one stack handling the\n // grouping of points in each category. This is done in the\n // `setGroupedPoints` function.\n objectEach(this.xAxis.stacking?.stacks, (stack) => {\n const points = typeof point.x === 'number' ?\n stack[point.x.toString()]?.points :\n void 0, pointValues = points?.[this.index], yStackMap = {};\n // Look for the index\n if (points && isArray(pointValues)) {\n let baseIndex = this.index;\n // If there are multiple points with the same X then\n // gather all series in category, and assign index\n const seriesIndexes = Object\n .keys(points)\n .filter((pointKey) => \n // Filter out duplicate X's\n !pointKey.match(',') &&\n // Filter out null points\n points[pointKey] &&\n points[pointKey].length > 1)\n .map(parseFloat)\n .filter((index) => visibleSeries.indexOf(index) !== -1)\n // When the series `stack` option is defined, assign\n // all subsequent column of the same stack to the\n // same index as the base column of the stack, then\n // filter out the original series index so that\n // `seriesIndexes` is shortened to the amount of\n // stacks, not the amount of series (#20550).\n .filter((index) => {\n const otherOptions = this.chart.series[index]\n .options, yStack = otherOptions.stacking &&\n otherOptions.stack;\n if (defined(yStack)) {\n if (isNumber(yStackMap[yStack])) {\n if (baseIndex === index) {\n baseIndex = yStackMap[yStack];\n }\n return false;\n }\n yStackMap[yStack] = index;\n }\n return true;\n })\n .sort((a, b) => b - a);\n indexInCategory = seriesIndexes.indexOf(baseIndex);\n totalInCategory = seriesIndexes.length;\n }\n });\n indexInCategory = this.xAxis.reversed ?\n totalInCategory - 1 - indexInCategory : indexInCategory;\n // Compute the adjusted x position\n const boxWidth = (totalInCategory - 1) * metrics.paddedWidth +\n pointWidth;\n x = (point.plotX || 0) + boxWidth / 2 - pointWidth -\n indexInCategory * metrics.paddedWidth;\n }\n return x;\n }\n /**\n * Translate each point to the plot area coordinate system and find\n * shape positions\n *\n * @internal\n * @function Highcharts.seriesTypes.column#translate\n */\n translate() {\n const series = this, chart = series.chart, options = series.options, \n // For points without graphics (null points) this value is used\n // to reserve space around the point such that:\n // - normal/null points are spaced similarly,\n // - focus borders of null points are like those of \"0\" points\n // This ensures consistent dimensions between null/normal points.\n dense = series.dense =\n series.closestPointRange * series.xAxis.transA < 2, borderWidth = series.borderWidth =\n options.borderWidth ?? (dense ? 0 : 1), // #3635\n xAxis = series.xAxis, yAxis = series.yAxis, threshold = options.threshold, minPointLength = options.minPointLength ?? 5, metrics = series.getColumnMetrics(), seriesPointWidth = metrics.width, seriesXOffset = series.pointXOffset = metrics.offset, dataMin = series.dataMin, dataMax = series.dataMax, translatedThreshold = series.translatedThreshold =\n yAxis.getThreshold(threshold);\n // Postprocessed for border width\n let seriesBarW = series.barW =\n Math.max(seriesPointWidth, 1 + 2 * borderWidth);\n // When the pointPadding is 0, we want the columns to be packed\n // tightly, so we allow individual columns to have individual sizes.\n // When pointPadding is greater, we strive for equal-width columns\n // (#2694).\n if (options.pointPadding && options.crisp) {\n seriesBarW = Math.ceil(seriesBarW);\n }\n Series.prototype.translate.apply(series);\n // Record the new values\n series.points.concat(series.condemnedPoints).forEach(function (point) {\n const yBottom = point.yBottom ?? translatedThreshold, safeDistance = 999 + Math.abs(yBottom), plotX = point.plotX || 0, \n // Don't draw too far outside plot area (#1303, #2241,\n // #4264)\n plotY = clamp(point.plotY, -safeDistance, yAxis.len + safeDistance);\n let up, barY = Math.min(plotY, yBottom), barH = Math.max(plotY, yBottom) - barY, pointWidth = seriesPointWidth, barX = plotX + seriesXOffset, barW = seriesBarW;\n // Handle options.minPointLength\n if (minPointLength && Math.abs(barH) < minPointLength) {\n barH = minPointLength;\n up = (!yAxis.reversed && !point.negative) ||\n (yAxis.reversed && point.negative);\n // Reverse zeros if there's no positive value in the series\n // in visible range (#7046)\n if (isNumber(threshold) &&\n isNumber(dataMax) &&\n point.y === threshold &&\n dataMax <= threshold &&\n // And if there's room for it (#7311)\n (yAxis.min || 0) < threshold &&\n // If all points are the same value (i.e zero) not draw\n // as negative points (#10646), but only if there's room\n // for it (#14876)\n (dataMin !== dataMax || (yAxis.max || 0) <= threshold)) {\n up = !up;\n point.negative = !point.negative;\n }\n // If stacked...\n barY = (Math.abs(barY - translatedThreshold) > minPointLength ?\n // ...keep position\n yBottom - (up ? minPointLength : 0) :\n // #1485, #4051\n translatedThreshold -\n (up ? minPointLength : 0));\n }\n // Handle point.options.pointWidth\n // @todo Handle grouping/stacking too. Calculate offset properly\n if (defined(point.options.pointWidth)) {\n pointWidth = barW =\n Math.ceil(point.options.pointWidth);\n barX -= Math.round((pointWidth - seriesPointWidth) / 2);\n }\n // Adjust for null or missing points\n if (options.centerInCategory) {\n barX = series.adjustForMissingColumns(barX, pointWidth, point, metrics);\n }\n // Cache for access in polar\n point.barX = barX;\n point.pointWidth = pointWidth;\n // Fix the tooltip on center of grouped columns (#1216, #424,\n // #3648)\n point.tooltipPos = chart.inverted ?\n [\n clamp(yAxis.len + yAxis.pos - chart.plotLeft - plotY, yAxis.pos - chart.plotLeft, yAxis.len + yAxis.pos - chart.plotLeft),\n xAxis.len + xAxis.pos - chart.plotTop - barX - barW / 2,\n barH\n ] :\n [\n xAxis.left - chart.plotLeft + barX + barW / 2,\n clamp(plotY + yAxis.pos -\n chart.plotTop, yAxis.pos - chart.plotTop, yAxis.len + yAxis.pos - chart.plotTop),\n barH\n ];\n // Register shape type and arguments to be used in drawPoints. Allow\n // `shapeType` defined on `pointClass` level.\n point.shapeType = series.pointClass.prototype.shapeType ||\n 'roundedRect';\n point.shapeArgs = series.crispCol(barX, \n // #3169, drilldown from null must have a position to work from.\n // #6585, dataLabel should be placed on xAxis, not floating in\n // the middle of the chart.\n barY, barW, point.isNull ? 0 : barH);\n });\n // Fire a specific event after column translate. We could instead apply\n // all the column logic in an `afterTranslate` event handler, but there\n // are so many other series types that use the column translation, that\n // it is more convenient to have a specific event for it.\n fireEvent(this, 'afterColumnTranslate');\n }\n /**\n * Columns have no graph\n *\n * @internal\n * @function Highcharts.seriesTypes.column#drawGraph\n */\n drawGraph() {\n this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n }\n /**\n * Get presentational attributes\n *\n * @internal\n * @function Highcharts.seriesTypes.column#pointAttribs\n */\n pointAttribs(point, state) {\n const options = this.options, p2o = this.pointAttrToOptions || {}, strokeOption = p2o.stroke || 'borderColor', strokeWidthOption = p2o['stroke-width'] || 'borderWidth';\n let stateOptions, zone, brightness, fill = (point && point.color) || this.color, \n // Set to fill when borderColor null:\n stroke = ((point && point[strokeOption]) ||\n options[strokeOption] ||\n fill), dashstyle = (point && point.options.dashStyle) || options.dashStyle, strokeWidth = (point?.[strokeWidthOption]) ??\n options[strokeWidthOption] ??\n this[strokeWidthOption] ?? 1, opacity = (point?.isNull && options.nullInteraction) ?\n 0 :\n (point?.opacity ?? options.opacity ?? 1);\n // Handle zone colors\n if (point && this.zones.length) {\n zone = point.getZone();\n // When zones are present, don't use point.color (#4267).\n // Changed order (#6527), added support for colorAxis (#10670)\n fill = (point.options.color ||\n (zone && (zone.color || point.nonZonedColor)) ||\n this.color);\n if (zone) {\n stroke = zone.borderColor || stroke;\n dashstyle = zone.dashStyle || dashstyle;\n strokeWidth = zone.borderWidth || strokeWidth;\n }\n }\n // Select or hover states\n if (state && point) {\n stateOptions = merge(options.states[state], \n // #6401\n point.options.states?.[state] || {});\n brightness = stateOptions.brightness;\n fill =\n stateOptions.color || (typeof brightness !== 'undefined' &&\n color(fill)\n .brighten(stateOptions.brightness)\n .get()) || fill;\n stroke = stateOptions[strokeOption] || stroke;\n strokeWidth =\n stateOptions[strokeWidthOption] || strokeWidth;\n dashstyle = stateOptions.dashStyle || dashstyle;\n opacity = pick(stateOptions.opacity, opacity);\n }\n const ret = {\n fill: fill,\n stroke: stroke,\n 'stroke-width': strokeWidth,\n opacity: point?.condemned ? 0 : opacity\n };\n if (dashstyle) {\n ret.dashstyle = dashstyle;\n }\n return ret;\n }\n /**\n * Draw the columns. For bars, the series.group is rotated, so the same\n * coordinates apply for columns and bars. This method is inherited by\n * scatter series.\n *\n * @internal\n * @function Highcharts.seriesTypes.column#drawPoints\n */\n drawPoints(points) {\n points || (points = this.points.concat(this.condemnedPoints));\n const series = this, chart = this.chart, options = series.options, nullInteraction = options.nullInteraction, { styledMode, renderer } = chart, animationLimit = options.animationLimit || 250;\n let shapeArgs;\n // Draw the columns\n points.forEach(function (point) {\n const plotY = point.plotY;\n let graphic = point.graphic, shouldUpdate = !!graphic, verb = graphic && chart.pointCount < animationLimit ?\n 'animate' : 'attr';\n if (isNumber(plotY) && (point.y !== null || nullInteraction)) {\n shapeArgs = point.shapeArgs;\n // When updating a series between 2d and 3d or cartesian and\n // polar, the shape type changes.\n if (graphic && point.hasNewShapeType()) {\n graphic = graphic.destroy();\n }\n if (!graphic) {\n let initialAttr = shapeArgs;\n // New points fade in from old axis position\n if (point.origin &&\n chart.pointCount < animationLimit) {\n initialAttr = merge(shapeArgs, point.getOrigin(point.origin, shapeArgs));\n if (!styledMode) {\n initialAttr.opacity = 0;\n }\n shouldUpdate = true;\n verb = 'animate';\n }\n // Create new graphic\n point.graphic = graphic =\n renderer[point.shapeType](initialAttr).add(point.group || series.group);\n }\n // Update existing graphic, either because it pre-existed, or\n // because we created it in a temporary position\n if (shouldUpdate) {\n graphic[verb](merge(shapeArgs));\n }\n // Presentational\n if (!styledMode) {\n graphic[verb](series.pointAttribs(point, (point.selected && 'select')))\n .shadow(point.allowShadow !== false && options.shadow);\n }\n graphic\n .addClass(point.getClassName(), true)\n .attr({\n visibility: point.visible ? 'inherit' : 'hidden'\n });\n }\n else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n });\n }\n /**\n * Draw the tracker for a point.\n * @internal\n */\n drawTracker(points = this.points) {\n const series = this, chart = series.chart, pointer = chart.pointer, onMouseOver = function (e) {\n pointer?.normalize(e);\n const point = pointer?.getPointFromEvent(e);\n // Undefined on graph in scatter chart\n if (pointer &&\n point &&\n series.options.enableMouseTracking &&\n (\n // Run point events only for points inside plot area, #21136\n chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop, {\n visiblePlotOnly: true\n }) ||\n // Allow specific series types to extend interaction\n // outside the plot area, #24096\n (series.allowOutsidePlotInteraction &&\n pointer?.inClass(e.target, 'highcharts-point')) ||\n pointer?.inClass(e.target, 'highcharts-data-label'))) {\n pointer.isDirectTouch = true;\n point.onMouseOver(e);\n }\n };\n let dataLabels;\n // Add reference to the point\n points.forEach(function (point) {\n dataLabels = (isArray(point.dataLabels) ?\n point.dataLabels :\n (point.dataLabel ? [point.dataLabel] : []));\n if (point.graphic) {\n point.graphic.element.point = point;\n }\n dataLabels.forEach(function (dataLabel) {\n (dataLabel.div || dataLabel.element).point = point;\n });\n });\n // Add the event listeners, we need to do this only once\n if (!series._hasTracking) {\n series.trackerGroups?.reduce((acc, key) => {\n if (key === 'dataLabelsGroup') {\n acc.push(...(series.dataLabelsGroups || []));\n }\n else {\n acc.push(series[key]);\n }\n return acc;\n }, []).forEach((group) => {\n if (!group) {\n // Skip undefined\n return;\n }\n group.addClass('highcharts-tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', function (e) {\n pointer?.onTrackerMouseOut(e);\n })\n .on('touchstart', onMouseOver);\n if (!chart.styledMode && series.options.cursor) {\n group.css({ cursor: series.options.cursor });\n }\n });\n series._hasTracking = true;\n }\n fireEvent(this, 'afterDrawTracker');\n }\n /**\n * Remove this series from the chart\n *\n * @internal\n * @function Highcharts.seriesTypes.column#remove\n */\n remove() {\n const series = this, chart = series.chart;\n // Column and bar series affects other series of the same type\n // as they are either stacked or grouped\n if (chart.hasRendered) {\n chart.series.forEach(function (otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n Series.prototype.remove.apply(series, arguments);\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nColumnSeries.defaultOptions = merge(Series.defaultOptions, ColumnSeriesDefaults);\nextend(ColumnSeries.prototype, {\n // When tooltip is not shared, this series (and derivatives) requires\n // direct touch/hover. KD-tree does not apply.\n directTouch: true,\n getSymbol: noop,\n // Use separate negative stacks, unlike area stacks where a negative\n // point is subtracted from previous (#1910)\n negStacks: true,\n trackerGroups: ['group', 'dataLabelsGroup']\n});\nSeriesRegistry.registerSeriesType('column', ColumnSeries);\n/* *\n *\n * Default Export\n *\n * */\nexport default ColumnSeries;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Adjusted width and x offset of the columns for grouping.\n *\n * @internal\n * @interface Highcharts.ColumnMetricsObject\n */ /**\n* Width of the columns.\n* @name Highcharts.ColumnMetricsObject#width\n* @type {number}\n*/ /**\n* Offset of the columns.\n* @name Highcharts.ColumnMetricsObject#offset\n* @type {number}\n*/\n''; // Detach doclets above\n","/* *\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 H from '../Core/Globals.js';\nconst { deg2rad } = H;\nimport { fireEvent, isNumber, pick, relativeLength } from '../Shared/Utilities.js';\n/**\n * @private\n */\nvar CenteredUtilities;\n(function (CenteredUtilities) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Get the center of the pie based on the size and center options relative\n * to the plot area. Borrowed by the polar and gauge series types.\n *\n * @private\n * @function Highcharts.CenteredSeriesMixin.getCenter\n */\n function getCenter() {\n const options = this.options, chart = this.chart, slicingRoom = 2 * (options.slicedOffset || 0), plotWidth = chart.plotWidth - 2 * slicingRoom, plotHeight = chart.plotHeight - 2 * slicingRoom, centerOption = options.center, smallestSize = Math.min(plotWidth, plotHeight), thickness = options.thickness;\n let handleSlicingRoom, size = options.size, innerSize = options.innerSize || 0, i, value;\n if (typeof size === 'string') {\n size = parseFloat(size);\n }\n if (typeof innerSize === 'string') {\n innerSize = parseFloat(innerSize);\n }\n const positions = [\n pick(centerOption?.[0], '50%'),\n pick(centerOption?.[1], '50%'),\n // Prevent from negative values\n pick(size && size < 0 ? void 0 : options.size, '100%'),\n pick(innerSize && innerSize < 0 ? void 0 : options.innerSize || 0, '0%')\n ];\n for (i = 0; i < 4; ++i) {\n value = positions[i];\n handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n // I == 0: centerX, relative to width\n // i == 1: centerY, relative to height\n // i == 2: size, relative to smallestSize\n // i == 3: innerSize, relative to size\n positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) + (handleSlicingRoom ? slicingRoom : 0);\n }\n // Inner size cannot be larger than size (#3632)\n if (positions[3] > positions[2]) {\n positions[3] = positions[2];\n }\n // Thickness overrides innerSize, need to be less than pie size (#6647)\n if (isNumber(thickness) &&\n thickness * 2 < positions[2] && thickness > 0) {\n positions[3] = positions[2] - thickness * 2;\n }\n fireEvent(this, 'afterGetCenter', { positions });\n return positions;\n }\n CenteredUtilities.getCenter = getCenter;\n /**\n * GetStartAndEndRadians - Calculates start and end angles in radians.\n * Used in series types such as pie and sunburst.\n *\n * @private\n * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians\n *\n * @param {number} [start]\n * Start angle in degrees.\n *\n * @param {number} [end]\n * Start angle in degrees.\n *\n * @return {Highcharts.RadianAngles}\n * Returns an object containing start and end angles as radians.\n */\n function getStartAndEndRadians(start, end) {\n const startAngle = isNumber(start) ? start : 0, // Must be a number\n endAngle = ((isNumber(end) && // Must be a number\n end > startAngle && // Must be larger than the start angle\n // difference must be less than 360 degrees\n (end - startAngle) < 360) ?\n end :\n startAngle + 360), correction = -90;\n return {\n start: deg2rad * (startAngle + correction),\n end: deg2rad * (endAngle + correction)\n };\n }\n CenteredUtilities.getStartAndEndRadians = getStartAndEndRadians;\n})(CenteredUtilities || (CenteredUtilities = {}));\n/* *\n *\n * Default Export\n *\n * */\nexport default CenteredUtilities;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @private\n * @interface Highcharts.RadianAngles\n */ /**\n* @name Highcharts.RadianAngles#end\n* @type {number}\n*/ /**\n* @name Highcharts.RadianAngles#start\n* @type {number}\n*/\n''; // Keeps doclets above in JS file\n","/* *\n *\n * Highcharts Border Radius module\n *\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 D from '../Core/Defaults.js';\nconst { defaultOptions } = D;\nimport H from '../Core/Globals.js';\nconst { noop } = H;\nimport { addEvent, extend, isObject, merge, relativeLength } from '../Shared/Utilities.js';\n/* *\n *\n * Constants\n *\n * */\nconst defaultBorderRadiusOptions = {\n radius: 0,\n scope: 'stack',\n where: void 0\n};\n/* *\n *\n * Variables\n *\n * */\nlet oldArc = noop;\nlet oldRoundedRect = noop;\n/* *\n *\n * Functions\n *\n * */\n/** @internal */\nfunction applyBorderRadius(path, i, r) {\n const a = path[i];\n let b = path[i + 1];\n if (b[0] === 'Z') {\n b = path[0];\n }\n let line, arc, fromLineToArc;\n // From straight line to arc\n if ((a[0] === 'M' || a[0] === 'L') && b[0] === 'A') {\n line = a;\n arc = b;\n fromLineToArc = true;\n // From arc to straight line\n }\n else if (a[0] === 'A' && (b[0] === 'M' || b[0] === 'L')) {\n line = b;\n arc = a;\n }\n if (line && arc && arc.params) {\n const bigR = arc[1], \n // In our use cases, outer pie slice arcs are clockwise and inner\n // arcs (donut/sunburst etc) are anti-clockwise\n clockwise = arc[5], params = arc.params, { start, end, cx, cy } = params;\n // Some geometric constants\n const relativeR = clockwise ? (bigR - r) : (bigR + r), \n // The angle, on the big arc, that the border radius arc takes up\n angleOfBorderRadius = relativeR ? Math.asin(r / relativeR) : 0, angleOffset = clockwise ?\n angleOfBorderRadius :\n -angleOfBorderRadius, \n // The distance along the radius of the big arc to the starting\n // point of the small border radius arc\n distanceBigCenterToStartArc = (Math.cos(angleOfBorderRadius) *\n relativeR);\n // From line to arc\n if (fromLineToArc) {\n // Update the cache\n params.start = start + angleOffset;\n // First move to the start position at the radial line. We want to\n // start one borderRadius closer to the center.\n line[1] = cx + distanceBigCenterToStartArc * Math.cos(start);\n line[2] = cy + distanceBigCenterToStartArc * Math.sin(start);\n // Now draw an arc towards the point where the small circle touches\n // the great circle.\n path.splice(i + 1, 0, [\n 'A',\n r,\n r,\n 0, // Slanting,\n 0, // Long arc\n 1, // Clockwise\n cx + bigR * Math.cos(params.start),\n cy + bigR * Math.sin(params.start)\n ]);\n // From arc to line\n }\n else {\n // Update the cache\n params.end = end - angleOffset;\n // End the big arc a bit earlier\n arc[6] = cx + bigR * Math.cos(params.end);\n arc[7] = cy + bigR * Math.sin(params.end);\n // Draw a small arc towards a point on the end angle, but one\n // borderRadius closer to the center relative to the perimeter.\n path.splice(i + 1, 0, [\n 'A',\n r,\n r,\n 0,\n 0,\n 1,\n cx + distanceBigCenterToStartArc * Math.cos(end),\n cy + distanceBigCenterToStartArc * Math.sin(end)\n ]);\n }\n // Long or short arc must be reconsidered because we have modified the\n // start and end points\n arc[4] = Math.abs(params.end - params.start) < Math.PI ? 0 : 1;\n }\n}\n/**\n * Extend arc with borderRadius.\n * @internal\n */\nfunction arc(x, y, w, h, options = {}) {\n const path = oldArc(x, y, w, h, options), { brStart = true, brEnd = true, innerR = 0, r = w, start = 0, end = 0 } = options;\n if (options.open || !options.borderRadius) {\n return path;\n }\n const alpha = end - start, sinHalfAlpha = Math.sin(alpha / 2), borderRadius = Math.max(Math.min(relativeLength(options.borderRadius || 0, r - innerR), \n // Cap to half the sector radius\n (r - innerR) / 2, \n // For smaller pie slices, cap to the largest small circle that\n // can be fitted within the sector\n (r * sinHalfAlpha) / (1 + sinHalfAlpha)), 0), \n // For the inner radius, we need an extra cap because the inner arc\n // is shorter than the outer arc\n innerBorderRadius = Math.min(borderRadius, 2 * (alpha / Math.PI) * innerR);\n // Apply turn-by-turn border radius. Start at the end since we're\n // splicing in arc segments.\n let i = path.length - 1;\n while (i--) {\n if ((!brStart && (i === 0 || i === 3)) ||\n (!brEnd && (i === 1 || i === 2))) {\n continue;\n }\n applyBorderRadius(path, i, i > 1 ? innerBorderRadius : borderRadius);\n }\n return path;\n}\n/** @internal */\nfunction seriesOnAfterColumnTranslate() {\n if (this.options.borderRadius &&\n !(this.chart.is3d && this.chart.is3d())) {\n const { options, yAxis } = this, percent = options.stacking === 'percent', seriesDefault = defaultOptions.plotOptions?.[this.type]\n ?.borderRadius, borderRadius = optionsToObject(options.borderRadius, isObject(seriesDefault) ? seriesDefault : {}), reversed = yAxis.options.reversed;\n for (const point of this.points) {\n const { shapeArgs } = point;\n if (point.shapeType === 'roundedRect' && shapeArgs) {\n const { width = 0, height = 0, y = 0 } = shapeArgs;\n let brBoxY = y, brBoxHeight = height;\n // It would be nice to refactor StackItem.getStackBox/\n // setOffset so that we could get a reliable box out of\n // it. Currently it is close if we remove the label\n // offset, but we still need to run crispCol and also\n // flip it if inverted, so atm it is simpler to do it\n // like the below.\n if (borderRadius.scope === 'stack' &&\n point.stackTotal) {\n const stackEnd = yAxis.translate(percent ? 100 : point.stackTotal, false, true, false, true), stackThreshold = yAxis.translate(options.threshold || 0, false, true, false, true), box = this.crispCol(0, Math.min(stackEnd, stackThreshold), 0, Math.abs(stackEnd - stackThreshold));\n brBoxY = box.y;\n brBoxHeight = box.height;\n }\n const flip = (point.negative ? -1 : 1) *\n (reversed ? -1 : 1) === -1;\n // Handle the where option\n let where = borderRadius.where;\n // Waterfall, hanging columns should have rounding on\n // all sides\n if (!where &&\n this.is('waterfall') &&\n Math.abs((point.yBottom || 0) -\n (this.translatedThreshold || 0)) > this.borderWidth) {\n where = 'all';\n }\n if (!where) {\n where = 'end';\n }\n // Get the radius\n const r = Math.min(relativeLength(borderRadius.radius, width), width / 2, \n // Cap to the height, but not if where is `end`\n where === 'all' ? brBoxHeight / 2 : Infinity) || 0;\n // If the `where` option is 'end', cut off the\n // rectangles by making the border-radius box one r\n // greater, so that the imaginary radius falls outside\n // the rectangle.\n if (where === 'end') {\n if (flip) {\n brBoxY -= r;\n brBoxHeight += r;\n }\n else {\n brBoxHeight += r;\n }\n }\n extend(shapeArgs, { brBoxHeight, brBoxY, r });\n }\n }\n }\n}\n/** @internal */\nexport function composeBorderRadius(SeriesClass, SVGElementClass, SVGRendererClass) {\n const PieSeriesClass = SeriesClass.types.pie;\n if (!SVGElementClass.symbolCustomAttribs.includes('borderRadius')) {\n const symbols = SVGRendererClass.prototype.symbols;\n addEvent(SeriesClass, 'afterColumnTranslate', seriesOnAfterColumnTranslate, {\n // After columnrange and polar column modifications\n order: 9\n });\n addEvent(PieSeriesClass, 'afterTranslate', pieSeriesOnAfterTranslate);\n SVGElementClass.symbolCustomAttribs.push('borderRadius', 'brBoxHeight', 'brBoxY', 'brEnd', 'brStart');\n oldArc = symbols.arc;\n oldRoundedRect = symbols.roundedRect;\n symbols.arc = arc;\n symbols.roundedRect = roundedRect;\n }\n}\n/** @internal */\nexport function optionsToObject(options, seriesBROptions) {\n if (!isObject(options)) {\n options = { radius: options || 0 };\n }\n return merge(defaultBorderRadiusOptions, seriesBROptions, options);\n}\n/** @internal */\nfunction pieSeriesOnAfterTranslate() {\n const borderRadius = optionsToObject(this.options.borderRadius);\n for (const point of this.points) {\n const shapeArgs = point.shapeArgs;\n if (shapeArgs) {\n shapeArgs.borderRadius = relativeLength(borderRadius.radius, (shapeArgs.r || 0) - ((shapeArgs.innerR) || 0));\n }\n }\n}\n/**\n * Extend roundedRect with individual cutting through rOffset.\n * @internal\n */\nfunction roundedRect(x, y, width, height, options = {}) {\n const path = oldRoundedRect(x, y, width, height, options), { r = 0, brBoxHeight = height, brBoxY = y } = options, brOffsetTop = y - brBoxY, brOffsetBtm = (brBoxY + brBoxHeight) - (y + height), \n // When the distance to the border-radius box is greater than the r\n // itself, it means no border radius. The -0.1 accounts for float\n // rounding errors.\n rTop = (brOffsetTop - r) > -0.1 ? 0 : r, rBtm = (brOffsetBtm - r) > -0.1 ? 0 : r, cutTop = Math.max(rTop && brOffsetTop, 0), cutBtm = Math.max(rBtm && brOffsetBtm, 0);\n /*\n\n The naming of control points:\n\n / a -------- b \\\n / \\\n h c\n | |\n | |\n | |\n g d\n \\ /\n \\ f -------- e /\n\n */\n const a = [x + rTop, y], b = [x + width - rTop, y], c = [x + width, y + rTop], d = [\n x + width, y + height - rBtm\n ], e = [\n x + width - rBtm,\n y + height\n ], f = [x + rBtm, y + height], g = [x, y + height - rBtm], h = [x, y + rTop];\n const applyPythagoras = (r, altitude) => Math.sqrt(Math.pow(r, 2) - Math.pow(altitude, 2));\n // Inside stacks, cut off part of the top\n if (cutTop) {\n const base = applyPythagoras(rTop, rTop - cutTop);\n a[0] -= base;\n b[0] += base;\n c[1] = h[1] = y + rTop - cutTop;\n }\n // Column is lower than the radius. Cut off bottom inside the top\n // radius.\n if (height < rTop - cutTop) {\n const base = applyPythagoras(rTop, rTop - cutTop - height);\n c[0] = d[0] = x + width - rTop + base;\n e[0] = Math.min(c[0], e[0]);\n f[0] = Math.max(d[0], f[0]);\n g[0] = h[0] = x + rTop - base;\n c[1] = h[1] = y + height;\n }\n // Inside stacks, cut off part of the bottom\n if (cutBtm) {\n const base = applyPythagoras(rBtm, rBtm - cutBtm);\n e[0] += base;\n f[0] -= base;\n d[1] = g[1] = y + height - rBtm + cutBtm;\n }\n // Cut off top inside the bottom radius\n if (height < rBtm - cutBtm) {\n const base = applyPythagoras(rBtm, rBtm - cutBtm - height);\n c[0] = d[0] = x + width - rBtm + base;\n b[0] = Math.min(c[0], b[0]);\n a[0] = Math.max(d[0], a[0]);\n g[0] = h[0] = x + rBtm - base;\n d[1] = g[1] = y;\n }\n // Preserve the box for data labels\n path.length = 0;\n path.push(['M', ...a], \n // Top side\n ['L', ...b], \n // Top right corner\n ['A', rTop, rTop, 0, 0, 1, ...c], \n // Right side\n ['L', ...d], \n // Bottom right corner\n ['A', rBtm, rBtm, 0, 0, 1, ...e], \n // Bottom side\n ['L', ...f], \n // Bottom left corner\n ['A', rBtm, rBtm, 0, 0, 1, ...g], \n // Left side\n ['L', ...h], \n // Top left corner\n ['A', rTop, rTop, 0, 0, 1, ...a], ['Z']);\n return path;\n}\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Detailed options for border radius.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderradius/\n * Rounded columns\n * @sample highcharts/plotoptions/series-border-radius\n * Column and pie with rounded border\n *\n * @interface Highcharts.BorderRadiusOptionsObject\n */ /**\n* The border radius. A number signifies pixels. A percentage string, like for\n* example `50%`, signifies a relative size. For columns this is relative to the\n* column width, for pies it is relative to the radius and the inner radius.\n*\n* @sample {highcharts} highcharts/plotoptions/column-borderradius/\n* Rounded columns\n* @sample highcharts/plotoptions/series-border-radius\n* Column and pie with rounded border\n*\n* @name Highcharts.BorderRadiusOptionsObject#radius\n* @type {string|number}\n*/ /**\n* The scope of the rounding for column charts or plot bands. In a stacked\n* column chart, the value `point` means each single point will get rounded\n* corners. The value `stack` means the rounding will apply to the full\n* stack, so that only points close to the top or bottom will receive\n* rounding.\n*\n* Similarly, for plot bands, the `individual` value means each plot band\n* will get rounded corners.\n*\n* @sample {highcharts} highcharts/plotoptions/column-borderradius/\n* Rounded columns\n*\n* @name Highcharts.BorderRadiusOptionsObject#scope\n* @validvalue [\"individual\", \"point\", \"stack\"]\n* @type {string}\n*/ /**\n* For column charts, where in the point or stack to apply rounding. The `end`\n* value means only those corners at the point value will be rounded, leaving\n* the corners at the base or threshold unrounded. This is the most intuitive\n* behavior. The `all` value means also the base will be rounded.\n*\n* @sample {highcharts} highcharts/plotoptions/column-borderradius-where-all\n* Rounding on all corners\n*\n* @name Highcharts.BorderRadiusOptionsObject#where\n* @validvalue [\"all\", \"end\"]\n* @type {string}\n* @default end\n*/\n(''); // Keeps doclets above in JS file\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10],"mappings":"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"}