@dpuse/dpuse-tool-highcharts-visualiser 0.0.80 → 0.0.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AnimationUtilities-Bby2idBR.js → AnimationUtilities-CJw-tdb_.js} +74 -83
- package/dist/AnimationUtilities-CJw-tdb_.js.map +1 -0
- package/dist/BorderRadius-CqHYi9va.js +135 -0
- package/dist/BorderRadius-CqHYi9va.js.map +1 -0
- package/dist/CenteredUtilities-BTUT7_Ld.js +1316 -0
- package/dist/CenteredUtilities-BTUT7_Ld.js.map +1 -0
- package/dist/{SVGElement-BmvC_qu3.js → SVGElement-uTuGcjav.js} +101 -103
- package/dist/SVGElement-uTuGcjav.js.map +1 -0
- package/dist/SeriesRegistry-CXsAINSj.js +376 -0
- package/dist/SeriesRegistry-CXsAINSj.js.map +1 -0
- package/dist/{TextPath-DK4Jkzd7.js → TextPath-Coabnrz0.js} +32 -34
- package/dist/{TextPath-DK4Jkzd7.js.map → TextPath-Coabnrz0.js.map} +1 -1
- package/dist/{dependency-wheel.src-BHmwx9rW.js → dependency-wheel.src-ByNiAiZS.js} +26 -27
- package/dist/dependency-wheel.src-ByNiAiZS.js.map +1 -0
- package/dist/dpuse-tool-highcharts-visualiser.es.js +2437 -2415
- package/dist/dpuse-tool-highcharts-visualiser.es.js.map +1 -1
- package/dist/highchartsMoreCustom-Cm6MkFMu.js +1178 -0
- package/dist/highchartsMoreCustom-Cm6MkFMu.js.map +1 -0
- package/dist/{pattern-fill.src-BPmr3DQg.js → pattern-fill.src-CGZp553r.js} +30 -32
- package/dist/{pattern-fill.src-BPmr3DQg.js.map → pattern-fill.src-CGZp553r.js.map} +1 -1
- package/dist/{sankey.src-DocCurOx.js → sankey.src-Buj1zAlU.js} +115 -117
- package/dist/sankey.src-Buj1zAlU.js.map +1 -0
- package/dist/{streamgraph.src-Bn6PY8Fd.js → streamgraph.src-DjMW1U2g.js} +4 -6
- package/dist/{streamgraph.src-Bn6PY8Fd.js.map → streamgraph.src-DjMW1U2g.js.map} +1 -1
- package/package.json +12 -12
- package/dist/AnimationUtilities-Bby2idBR.js.map +0 -1
- package/dist/BorderRadius-2zMZW_aK.js +0 -1445
- package/dist/BorderRadius-2zMZW_aK.js.map +0 -1
- package/dist/SVGElement-BmvC_qu3.js.map +0 -1
- package/dist/SeriesRegistry-0cj0ZJqn.js +0 -374
- package/dist/SeriesRegistry-0cj0ZJqn.js.map +0 -1
- package/dist/dependency-wheel.src-BHmwx9rW.js.map +0 -1
- package/dist/highchartsMoreCustom-CcpfmVny.js +0 -1110
- package/dist/highchartsMoreCustom-CcpfmVny.js.map +0 -1
- package/dist/sankey.src-DocCurOx.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationUtilities-CJw-tdb_.js","names":["H","win","H","win","H","win","H","PaletteDefaults","H","win","H"],"sources":["../node_modules/highcharts/es-modules/Core/Globals.js","../node_modules/highcharts/es-modules/Core/Chart/ChartDefaults.js","../node_modules/highcharts/es-modules/Core/Color/PaletteDefaults.js","../node_modules/highcharts/es-modules/Shared/Utilities.js","../node_modules/highcharts/es-modules/Core/Utilities.js","../node_modules/highcharts/es-modules/Shared/TimeBase.js","../node_modules/highcharts/es-modules/Core/Time.js","../node_modules/highcharts/es-modules/Core/Defaults.js","../node_modules/highcharts/es-modules/Core/Color/Color.js","../node_modules/highcharts/es-modules/Core/Animation/Fx.js","../node_modules/highcharts/es-modules/Core/Animation/AnimationUtilities.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';\n/* *\n *\n * Namespace\n *\n * */\n/**\n * Shared Highcharts properties.\n * @internal\n */\nvar Globals;\n(function (Globals) {\n /* *\n *\n * Constants\n *\n * */\n Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '13.0.1', Globals.win = (typeof window !== 'undefined' ?\n window :\n {}), // eslint-disable-line node/no-unsupported-features/es-builtins\n Globals.doc = Globals.win.document, Globals.svg = !!Globals.doc?.createElementNS?.(Globals.SVG_NS, 'svg')?.createSVGRect, Globals.pageLang = Globals.doc?.documentElement?.closest('[lang]')?.lang, Globals.userAgent = Globals.win.navigator?.userAgent || '', Globals.isChrome = Globals.win.chrome, Globals.isFirefox = Globals.userAgent.indexOf('Firefox') !== -1, Globals.isMS = /(edge|msie|trident)/i.test(Globals.userAgent) && !Globals.win.opera, Globals.isSafari = !Globals.isChrome && Globals.userAgent.indexOf('Safari') !== -1, Globals.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(Globals.userAgent), Globals.isWebKit = Globals.userAgent.indexOf('AppleWebKit') !== -1, Globals.deg2rad = Math.PI * 2 / 360, Globals.marginNames = [\n 'plotTop',\n 'marginRight',\n 'marginBottom',\n 'plotLeft'\n ], Globals.noop = function () { }, Globals.supportsPassiveEvents = (function () {\n // Checks whether the browser supports passive events, (#11353).\n let supportsPassive = false;\n // Object.defineProperty doesn't work on IE as well as passive\n // events - instead of using polyfill, we can exclude IE totally.\n if (!Globals.isMS) {\n const opts = Object.defineProperty({}, 'passive', {\n get: function () {\n supportsPassive = true;\n }\n });\n if (Globals.win.addEventListener && Globals.win.removeEventListener) {\n Globals.win.addEventListener('testPassive', Globals.noop, opts);\n Globals.win.removeEventListener('testPassive', Globals.noop, opts);\n }\n }\n return supportsPassive;\n }());\n /**\n * An array containing the current chart objects in the page. A chart's\n * position in the array is preserved throughout the page's lifetime. When\n * a chart is destroyed, the array item becomes `undefined`.\n *\n * @name Highcharts.charts\n * @type {Array<Highcharts.Chart|undefined>}\n */\n Globals.charts = [];\n /**\n * A shared registry between all bundles to keep track of applied\n * compositions.\n * @internal\n */\n Globals.composed = [];\n /**\n * A hook for defining additional date format specifiers. New\n * specifiers are defined as key-value pairs by using the\n * specifier as key, and a function which takes the timestamp as\n * value. This function returns the formatted portion of the\n * date.\n *\n * Using `dateFormats` is also a convenient way to define new keys for\n * complex locale-aware date formats compatible with the\n * [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat)\n * browser API, whenever the built-in formats are not sufficient.\n *\n * @sample highcharts/global/dateformats/\n * Adding support for week number\n * @sample highcharts/global/dateformats-object/\n * A locale-aware date format using `Intl.DateTimeFormat`\n *\n * @name Highcharts.dateFormats\n * @type {Record<string, Highcharts.TimeFormatCallbackFunction>}\n */\n Globals.dateFormats = {};\n /**\n * @internal\n * @deprecated\n * @todo Use only `Core/Series/SeriesRegistry.seriesTypes`\n */\n Globals.seriesTypes = {};\n /** @internal */\n Globals.symbolSizes = {};\n /* *\n *\n * Properties\n *\n * */\n // eslint-disable-next-line prefer-const\n Globals.chartCount = 0;\n})(Globals || (Globals = {}));\n/* *\n *\n * Default Export\n *\n * */\nexport default Globals;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Theme options that should get applied to the chart. In module mode it\n * might not be possible to change this property because of read-only\n * restrictions, instead use {@link Highcharts.setOptions}.\n *\n * @deprecated 9.1.2\n * @name Highcharts.theme\n * @type {Highcharts.Options}\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 * General options for the chart.\n *\n * @optionparent chart\n */\nconst ChartDefaults = {\n /**\n * Default `mapData` for all series, in terms of a GeoJSON or TopoJSON\n * object. If set to a string, it functions as an index into the\n * `Highcharts.maps` array.\n *\n * For picking out individual shapes and geometries to use for each series\n * of the map, see [series.mapData](#series.map.mapData).\n *\n * @sample maps/demo/geojson\n * Loading GeoJSON data\n * @sample maps/chart/topojson\n * Loading TopoJSON data\n *\n * @type {string|Array<*>|Highcharts.GeoJSON|Highcharts.TopoJSON}\n * @since 5.0.0\n * @product highmaps\n * @apioption chart.map\n */\n /**\n * Set lat/lon transformation definitions for the chart. If not defined,\n * these are extracted from the map data.\n *\n * @type {*}\n * @since 5.0.0\n * @product highmaps\n * @apioption chart.mapTransforms\n */\n /**\n * When using multiple axes, the ticks of two or more opposite axes\n * will automatically be aligned by adding ticks to the axis or axes\n * with the least ticks, as if `tickAmount` were specified.\n *\n * This can be prevented by setting `alignTicks` to false. If the grid\n * lines look messy, it's a good idea to hide them for the secondary\n * axis by setting `gridLineWidth` to 0.\n *\n * If `startOnTick` or `endOnTick` in the axis options are set to false,\n * then the `alignTicks ` will be disabled for the axis.\n *\n * Disabled for logarithmic axes.\n *\n * @sample {highcharts} highcharts/chart/alignticks-true/\n * True by default\n * @sample {highcharts} highcharts/chart/alignticks-false/\n * False\n * @sample {highstock} stock/chart/alignticks-true/\n * True by default\n * @sample {highstock} stock/chart/alignticks-false/\n * False\n *\n * @type {boolean}\n * @default true\n * @product highcharts highstock gantt\n * @apioption chart.alignTicks\n */\n /**\n * When using multiple axes, align the thresholds. When this is true, other\n * ticks will also be aligned.\n *\n * Note that for line series and some other series types, the `threshold`\n * option is set to `null` by default. This will in turn cause their y-axis\n * to not have a threshold. In order to avoid that, set the series\n * `threshold` to 0 or another number.\n *\n * If `startOnTick` or `endOnTick` in the axis options are set to false, or\n * if the axis is logarithmic, the threshold will not be aligned.\n *\n * @sample {highcharts} highcharts/chart/alignthresholds/ Set to true\n *\n * @since 10.0.0\n * @product highcharts highstock gantt\n * @apioption chart.alignThresholds\n */\n alignThresholds: false,\n /**\n * Set the overall animation for all chart updating. Animation can be\n * disabled throughout the chart by setting it to false here. It can\n * be overridden for each individual API method as a function parameter.\n * The only animation not affected by this option is the initial series\n * animation, see [plotOptions.series.animation](\n * #plotOptions.series.animation).\n *\n * The animation can either be set as a boolean or a configuration\n * object. If `true`, it will use the 'swing' jQuery easing and a\n * duration of 500 ms. If used as a configuration object, the following\n * properties are supported:\n *\n * - `defer`: The animation delay time in milliseconds.\n *\n * - `duration`: The duration of the animation in milliseconds.\n *\n * - `easing`: A string reference to an easing function set on the\n * `Math` object. See\n * [the easing demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-animation-easing/).\n *\n * When zooming on a series with less than 100 points, the chart redraw\n * will be done with animation, but in case of more data points, it is\n * necessary to set this option to ensure animation on zoom.\n *\n * @sample {highcharts} highcharts/chart/animation-none/\n * Updating with no animation\n * @sample {highcharts} highcharts/chart/animation-duration/\n * With a longer duration\n * @sample {highcharts} highcharts/chart/animation-easing/\n * With a jQuery UI easing\n * @sample {highmaps} maps/chart/animation-none/\n * Updating with no animation\n * @sample {highmaps} maps/chart/animation-duration/\n * With a longer duration\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n * @default true\n * @apioption chart.animation\n */\n /**\n * A CSS class name to apply to the charts container `div`, allowing\n * unique CSS styling for each chart.\n *\n * @type {string}\n * @apioption chart.className\n */\n /**\n * Event listeners for the chart.\n *\n * @apioption chart.events\n */\n /**\n * Fires when a series is added to the chart after load time, using the\n * `addSeries` method. One parameter, `event`, is passed to the\n * function, containing common event information. Through\n * `event.options` you can access the series options that were passed to\n * the `addSeries` method. Returning false prevents the series from\n * being added.\n *\n * @sample {highcharts} highcharts/chart/events-addseries/\n * Alert on add series\n * @sample {highstock} stock/chart/events-addseries/\n * Alert on add series\n *\n * @type {Highcharts.ChartAddSeriesCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Chart\n * @apioption chart.events.addSeries\n */\n /**\n * Fires when clicking on the plot background. One parameter, `event`,\n * is passed to the function, containing common event information.\n *\n * Information on the clicked spot can be found through `event.xAxis`\n * and `event.yAxis`, which are arrays containing the axes of each\n * dimension and each axis' value at the clicked spot. The primary axes\n * are `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n * datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * ```js\n * click: function(e) {\n * console.log(\n * Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', e.xAxis[0].value),\n * e.yAxis[0].value\n * )\n * }\n * ```\n *\n * @sample {highcharts} highcharts/chart/events-click/\n * Alert coordinates on click\n * @sample {highcharts} highcharts/chart/events-container/\n * Alternatively, attach event to container\n * @sample {highstock} stock/chart/events-click/\n * Alert coordinates on click\n * @sample {highstock} highcharts/chart/events-container/\n * Alternatively, attach event to container\n * @sample {highmaps} maps/chart/events-click/\n * Record coordinates on click\n * @sample {highmaps} highcharts/chart/events-container/\n * Alternatively, attach event to container\n *\n * @type {Highcharts.ChartClickCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Chart\n * @apioption chart.events.click\n */\n /**\n * Fires when the chart is finished loading. Since v4.2.2, it also waits\n * for images to be loaded, for example from point markers. One\n * parameter, `event`, is passed to the function, containing common\n * event information.\n *\n * There is also a second parameter to the chart constructor where a\n * callback function can be passed to be executed on chart.load.\n *\n * @sample {highcharts} highcharts/chart/events-load/\n * Alert on chart load\n * @sample {highcharts} highcharts/chart/events-render/\n * Load vs Redraw vs Render\n * @sample {highstock} stock/chart/events-load/\n * Alert on chart load\n * @sample {highmaps} maps/chart/events-load/\n * Add series on chart load\n *\n * @type {Highcharts.ChartLoadCallbackFunction}\n * @context Highcharts.Chart\n * @apioption chart.events.load\n */\n /**\n * Fires when the chart is redrawn, either after a call to\n * `chart.redraw()` or after an axis, series or point is modified with\n * the `redraw` option set to `true`. One parameter, `event`, is passed\n * to the function, containing common event information.\n *\n * @sample {highcharts} highcharts/chart/events-redraw/\n * Alert on chart redraw\n * @sample {highcharts} highcharts/chart/events-render/\n * Load vs Redraw vs Render\n * @sample {highstock} stock/chart/events-redraw/\n * Alert on chart redraw when adding a series or moving the\n * zoomed range\n * @sample {highmaps} maps/chart/events-redraw/\n * Set subtitle on chart redraw\n *\n * @type {Highcharts.ChartRedrawCallbackFunction}\n * @since 1.2.0\n * @context Highcharts.Chart\n * @apioption chart.events.redraw\n */\n /**\n * Fires after initial load of the chart (directly after the `load`\n * event), and after each redraw (directly after the `redraw` event).\n *\n * @sample {highcharts} highcharts/chart/events-render/\n * Load vs Redraw vs Render\n *\n * @type {Highcharts.ChartRenderCallbackFunction}\n * @since 5.0.7\n * @context Highcharts.Chart\n * @apioption chart.events.render\n */\n /**\n * Fires when an area of the chart has been selected. Selection is\n * enabled by setting the chart's zoomType. One parameter, `event`, is\n * passed to the function, containing common event information. The\n * default action for the selection event is to zoom the chart to the\n * selected area. It can be prevented by calling\n * `event.preventDefault()` or return false.\n *\n * Information on the selected area can be found through `event.xAxis`\n * and `event.yAxis`, which are arrays containing the axes of each\n * dimension and each axis' min and max values. The primary axes are\n * `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n * datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * ```js\n * selection: function(event) {\n * // log the min and max of the primary, datetime x-axis\n * console.log(\n * Highcharts.dateFormat(\n * '%Y-%m-%d %H:%M:%S',\n * event.xAxis[0].min\n * ),\n * Highcharts.dateFormat(\n * '%Y-%m-%d %H:%M:%S',\n * event.xAxis[0].max\n * )\n * );\n * // log the min and max of the y axis\n * console.log(event.yAxis[0].min, event.yAxis[0].max);\n * }\n * ```\n *\n * @sample {highcharts} highcharts/chart/events-selection/\n * Report on selection and reset\n * @sample {highcharts} highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * @sample {highstock} stock/chart/events-selection/\n * Report on selection and reset\n * @sample {highstock} highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * (Highcharts)\n *\n * @type {Highcharts.ChartSelectionCallbackFunction}\n * @apioption chart.events.selection\n */\n /**\n * The margin between the outer edge of the chart and the plot area.\n * The numbers in the array designate top, right, bottom and left\n * respectively. Use the options `marginTop`, `marginRight`,\n * `marginBottom` and `marginLeft` for shorthand setting of one option.\n *\n * By default there is no margin. The actual space is dynamically\n * calculated from the offset of axis labels, axis title, title,\n * subtitle and legend in addition to the `spacingTop`, `spacingRight`,\n * `spacingBottom` and `spacingLeft` options.\n *\n * @sample {highcharts} highcharts/chart/margins-zero/\n * Zero margins\n * @sample {highstock} stock/chart/margin-zero/\n * Zero margins\n *\n * @type {number|Array<number>}\n * @apioption chart.margin\n */\n /**\n * The margin between the bottom outer edge of the chart and the plot\n * area. Use this to set a fixed pixel value for the margin as opposed\n * to the default dynamic margin. See also `spacingBottom`.\n *\n * @sample {highcharts} highcharts/chart/marginbottom/\n * 100px bottom margin\n * @sample {highstock} stock/chart/marginbottom/\n * 100px bottom margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginBottom\n */\n /**\n * The margin between the left outer edge of the chart and the plot\n * area. Use this to set a fixed pixel value for the margin as opposed\n * to the default dynamic margin. See also `spacingLeft`.\n *\n * @sample {highcharts} highcharts/chart/marginleft/\n * 150px left margin\n * @sample {highstock} stock/chart/marginleft/\n * 150px left margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginLeft\n */\n /**\n * The margin between the right outer edge of the chart and the plot\n * area. Use this to set a fixed pixel value for the margin as opposed\n * to the default dynamic margin. See also `spacingRight`.\n *\n * @sample {highcharts} highcharts/chart/marginright/\n * 100px right margin\n * @sample {highstock} stock/chart/marginright/\n * 100px right margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginRight\n */\n /**\n * The margin between the top outer edge of the chart and the plot area.\n * Use this to set a fixed pixel value for the margin as opposed to\n * the default dynamic margin. See also `spacingTop`.\n *\n * @sample {highcharts} highcharts/chart/margintop/ 100px top margin\n * @sample {highstock} stock/chart/margintop/\n * 100px top margin\n * @sample {highmaps} maps/chart/margin/\n * 100px margins\n *\n * @type {number}\n * @since 2.0\n * @apioption chart.marginTop\n */\n /**\n * Callback function to override the default function that formats all\n * the numbers in the chart. Returns a string with the formatted number.\n * Since v12.6.0, the callback also receives `ctx` as the last argument,\n * so that arrow functions can access the same context as regular\n * functions using `this`.\n *\n * @sample highcharts/members/highcharts-numberformat\n * Arabic digits in Highcharts\n * @type {Highcharts.NumberFormatterCallbackFunction}\n * @since 8.0.0\n * @apioption chart.numberFormatter\n */\n /**\n * When a chart with an x and a y-axis is rendered, we first pre-render the\n * labels of both in order to measure them. Then, if either of the axis\n * labels take up so much space that it significantly affects the length of\n * the other axis, we repeat the process.\n *\n * By default we stop at two axis layout runs, but it may be that the second\n * run also alter the space required by either axis, for example if it\n * causes the labels to rotate. In this situation, a subsequent redraw of\n * the chart may cause the tick and label placement to change for apparently\n * no reason.\n *\n * Use the `axisLayoutRuns` option to set the maximum allowed number of\n * repetitions. But keep in mind that the default value of 2 is set because\n * every run costs performance time.\n *\n * **Note:** Changing that option to higher than the default might decrease\n * performance significantly, especially with bigger sets of data.\n *\n * @type {number}\n * @default 2\n * @since 11.3.0\n * @apioption chart.axisLayoutRuns\n */\n /**\n * Allows setting a key to switch between zooming and panning. Can be\n * one of `alt`, `ctrl`, `meta` (the command key on Mac and Windows\n * key on Windows) or `shift`. The keys are mapped directly to the key\n * properties of the click event argument (`event.altKey`,\n * `event.ctrlKey`, `event.metaKey` and `event.shiftKey`).\n *\n * @type {\"alt\" | \"ctrl\" | \"meta\" | \"shift\"}\n * @since 4.0.3\n * @product highcharts gantt\n * @apioption chart.panKey\n */\n /**\n * Allow panning in a chart. Best used with [panKey](#chart.panKey)\n * to combine zooming and panning.\n *\n * On touch devices, when the [tooltip.followTouchMove](\n * #tooltip.followTouchMove) option is `true` (default), panning\n * requires two fingers. To allow panning with one finger, set\n * `followTouchMove` to `false`.\n *\n * **Note:** If both zooming and panning are enabled without keys, zooming\n * will take precedence by default. To prioritize panning, either set\n * [chart.zooming.key](#chart.zooming.key) or panKey.\n *\n * @sample {highcharts} highcharts/chart/pankey/ Zooming and panning\n * @sample {highstock} stock/chart/panning/ Zooming and xy panning\n */\n panning: {\n /**\n * Enable or disable chart panning.\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock|highmaps} true\n */\n enabled: false,\n /**\n * Decides in what dimensions the user can pan the chart. Can be\n * one of `x`, `y`, or `xy`.\n *\n * During panning, all axes will behave as if\n * [`startOnTick`](#yAxis.startOnTick) and\n * [`endOnTick`](#yAxis.endOnTick) were set to `false`. After the\n * panning action is finished, the axes will adjust to their actual\n * settings.\n *\n * **Note:** For non-cartesian series, the only supported panning type\n * is `xy`, as zooming in a single direction is not applicable due to\n * the radial nature of the coordinate system.\n *\n * @sample {highcharts} highcharts/chart/panning-type\n * Zooming and xy panning\n *\n * @declare Highcharts.OptionsChartPanningTypeValue\n * @type {string}\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @product highcharts highstock gantt\n */\n type: 'x'\n },\n /**\n * Deprecated. Use\n * [chart.zooming.pinchType](#chart.zooming.pinchType)\n * instead.\n *\n * Equivalent to [zoomType](#chart.zoomType), but for multitouch\n * gestures only. By default, the `pinchType` is the same as the\n * `zoomType` setting. However, pinching can be enabled separately in\n * some cases, for example in stock charts where a mouse drag pans the\n * chart, while pinching is enabled. When [tooltip.followTouchMove](\n * #tooltip.followTouchMove) is true, pinchType only applies to\n * two-finger touches.\n *\n * @type {string}\n * @default {highcharts} undefined\n * @default {highstock} undefined\n * @since 3.0\n * @product highcharts highstock gantt\n * @deprecated 10.2.1\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @apioption chart.pinchType\n */\n /**\n * Whether to apply styled mode. When in styled mode, no presentational\n * attributes or CSS are applied to the chart SVG. Instead, CSS rules\n * are required to style the chart. The default style sheet is\n * available from `https://code.highcharts.com/css/highcharts.css`.\n *\n * [Read more in the docs](https://www.highcharts.com/docs/chart-design-and-style/style-by-css)\n * on what classes and variables are available.\n *\n * @sample highcharts/css/colors\n * Color theming with CSS\n * @sample highcharts/css/prefers-color-scheme\n * Dynamic theme based on system settings\n *\n * @type {boolean}\n * @default false\n * @since 7.0\n * @apioption chart.styledMode\n */\n styledMode: false,\n /**\n * The corner radius of the outer chart border.\n *\n * @sample {highcharts} highcharts/chart/borderradius/\n * 20px radius\n * @sample {highstock} stock/chart/border/\n * 10px radius\n * @sample {highmaps} maps/chart/border/\n * Border options\n *\n */\n borderRadius: 0,\n /**\n * In styled mode, this sets how many colors the class names\n * should rotate between. With ten colors, series (or points) are\n * given class names like `highcharts-color-0`, `highcharts-color-1`\n * [...] `highcharts-color-9`. The equivalent in non-styled mode\n * is to set colors using the [colors](#colors) setting.\n *\n * @since 5.0.0\n */\n colorCount: 10,\n /**\n * By default, (because of memory and performance reasons) the chart does\n * not copy the data but keeps it as a reference. In some cases, this might\n * result in mutating the original data source. In order to prevent that,\n * set that property to false. Please note that changing that might decrease\n * performance, especially with bigger sets of data.\n *\n * @type {boolean}\n * @since 10.1.0\n */\n allowMutatingData: true,\n /**\n * If true, the axes will scale to the remaining visible series once\n * one series is hidden. If false, hiding and showing a series will\n * not affect the axes or the other series. For stacks, once one series\n * within the stack is hidden, the rest of the stack will close in\n * around it even if the axis is not affected.\n *\n * @sample {highcharts} highcharts/chart/ignorehiddenseries-true/\n * True by default\n * @sample {highcharts} highcharts/chart/ignorehiddenseries-false/\n * False\n * @sample {highcharts} highcharts/chart/ignorehiddenseries-true-stacked/\n * True with stack\n * @sample {highstock} stock/chart/ignorehiddenseries-true/\n * True by default\n * @sample {highstock} stock/chart/ignorehiddenseries-false/\n * False\n *\n * @since 1.2.0\n * @product highcharts highstock gantt\n */\n ignoreHiddenSeries: true,\n /**\n * Whether to invert the axes so that the x axis is vertical and y axis\n * is horizontal. When `true`, the x axis is [reversed](#xAxis.reversed)\n * by default.\n *\n * @productdesc {highcharts}\n * If a bar series is present in the chart, it will be inverted\n * automatically. Inverting the chart doesn't have an effect if there\n * are no cartesian series in the chart.\n *\n * @sample {highcharts} highcharts/chart/inverted/\n * Inverted line\n * @sample {highstock} stock/navigator/inverted/\n * Inverted stock chart\n *\n * @type {boolean}\n * @default false\n * @product highcharts highstock gantt\n * @apioption chart.inverted\n */\n /**\n * The distance between the outer edge of the chart and the content,\n * like title or legend, or axis title and labels if present. The\n * numbers in the array designate top, right, bottom and left\n * respectively. Use the options spacingTop, spacingRight, spacingBottom\n * and spacingLeft options for shorthand setting of one option.\n *\n * @see [chart.margin](#chart.margin)\n * @type {Array<number>}\n * @default [10, 10, 15, 10]\n * @since 3.0.6\n */\n spacing: [10, 10, 15, 10],\n /**\n * Deprecated. Use\n * [chart.zooming.resetButton](#chart.zooming.resetButton)\n * instead.\n *\n * The button that appears after a selection zoom, allowing the user\n * to reset zoom. This option is deprecated in favor of\n * [zooming](#chart.zooming).\n *\n * @since 2.2\n * @deprecated 10.2.1\n */\n resetZoomButton: {\n /**\n * What frame the button placement should be related to. Can be\n * either `plotBox` or `spacingBox`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n *\n * @type {Highcharts.ButtonRelativeToValue}\n * @apioption chart.resetZoomButton.relativeTo\n */\n /**\n * A collection of attributes for the button. The object takes SVG\n * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n * border radius. The theme also supports `style`, a collection of\n * CSS properties for the text. Equivalent attributes for the hover\n * state are given in `theme.states.hover`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n *\n * @type {Highcharts.SVGAttributes}\n */\n theme: {\n /**\n * The z-index of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.theme.zIndex\n */\n },\n /**\n * The position of the button.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highstock} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n *\n * @type {Highcharts.AlignObject}\n */\n position: {\n /**\n * The horizontal alignment of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.position.align\n */\n /**\n * The horizontal offset of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.position.x\n */\n /**\n * The vertical alignment of the button.\n *\n * @type {Highcharts.VerticalAlignValue}\n * @apioption chart.resetZoomButton.position.verticalAlign\n */\n /**\n * The vertical offset of the button.\n *\n * @type {number}\n * @apioption chart.resetZoomButton.position.y\n */\n }\n },\n /**\n * The corner radius of the plot area border in pixels. Also applies clip\n * to the plot area background and data inside, like columns in a column\n * series or fill in an area series.\n *\n * @sample highcharts/chart/plotborderradius/\n * Plot border radius\n * @sample {highmaps} maps/chart/plotborder/\n * Map with plot border options\n *\n * @type {number}\n * @default 0\n * @since 13.0.0\n * @apioption chart.plotBorderRadius\n */\n /**\n * The pixel width of the plot area border.\n *\n * @sample {highcharts} highcharts/chart/plotborderwidth/\n * 1px border\n * @sample {highstock} stock/chart/plotborder/\n * 2px border\n * @sample {highmaps} maps/chart/plotborder/\n * Plot border options\n *\n * @type {number}\n * @default 0\n * @apioption chart.plotBorderWidth\n */\n /**\n * Whether to apply a drop shadow to the plot area. Requires that\n * plotBackgroundColor be set. The shadow can be an object configuration\n * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n *\n * @sample {highcharts} highcharts/chart/plotshadow/\n * Plot shadow\n * @sample {highstock} stock/chart/plotshadow/\n * Plot shadow\n * @sample {highmaps} maps/chart/plotborder/\n * Plot border options\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption chart.plotShadow\n */\n /**\n * When true, cartesian charts like line, spline, area and column are\n * transformed into the polar coordinate system. This produces _polar\n * charts_, also known as _radar charts_.\n *\n * @sample {highcharts} highcharts/demo/polar/\n * Polar chart\n * @sample {highcharts} highcharts/demo/polar-wind-rose/\n * Wind rose, stacked polar column chart\n * @sample {highcharts} highcharts/demo/polar-spider/\n * Spider web chart\n * @sample {highcharts} highcharts/parallel-coordinates/polar/\n * Star plot, multivariate data in a polar chart\n *\n * @type {boolean}\n * @default false\n * @since 2.3.0\n * @product highcharts\n * @requires highcharts-more\n * @apioption chart.polar\n */\n /**\n * Whether to reflow the chart to fit the width of the container div\n * on resizing the window.\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * True by default\n * @sample {highcharts} highcharts/chart/reflow-false/\n * False\n * @sample {highstock} stock/chart/reflow-true/\n * True by default\n * @sample {highstock} stock/chart/reflow-false/\n * False\n * @sample {highmaps} maps/chart/reflow-true/\n * True by default\n * @sample {highmaps} maps/chart/reflow-false/\n * False\n *\n * @since 2.1\n */\n reflow: true,\n /**\n * The HTML element where the chart will be rendered. If it is a string,\n * the element by that id is used. The HTML element can also be passed\n * by direct reference, or as the first argument of the chart\n * constructor, in which case the option is not needed.\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n * String\n * @sample {highcharts} highcharts/chart/renderto-object/\n * Object reference\n * @sample {highstock} stock/chart/renderto-string/\n * String\n * @sample {highstock} stock/chart/renderto-object/\n * Object reference\n *\n * @type {string|Highcharts.HTMLDOMElement}\n * @apioption chart.renderTo\n */\n /**\n * The background color of the marker square when selecting (zooming\n * in on) an area of the chart.\n *\n * @see In styled mode, the selection marker fill is set with the\n * `.highcharts-selection-marker` class.\n *\n * @type {Highcharts.ColorType}\n * @since 2.1.7\n */\n selectionMarkerFill: 'color-mix(in srgb, var(--highcharts-highlight-color-80) 25%, transparent)', // eslint-disable-line max-len\n /**\n * Whether to apply a drop shadow to the global series group. This causes\n * all the series to have the same shadow. Contrary to the `series.shadow`\n * option, this prevents items from casting shadows on each other, like for\n * others series in a stack. The shadow can be an object configuration\n * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n *\n * @sample highcharts/chart/seriesgroupshadow/\n * Shadow\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption chart.seriesGroupShadow\n */\n /**\n * Whether to apply a drop shadow to the outer chart area. Requires\n * that backgroundColor be set. The shadow can be an object\n * configuration containing `color`, `offsetX`, `offsetY`, `opacity` and\n * `width`.\n *\n * @sample {highcharts} highcharts/chart/shadow/\n * Shadow\n * @sample {highstock} stock/chart/shadow/\n * Shadow\n * @sample {highmaps} maps/chart/border/\n * Chart border and shadow\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default false\n * @apioption chart.shadow\n */\n /**\n * Whether to show the axes initially. This only applies to empty charts\n * where series are added dynamically, as axes are automatically added\n * to cartesian series.\n *\n * @sample {highcharts} highcharts/chart/showaxes-false/\n * False by default\n * @sample {highcharts} highcharts/chart/showaxes-true/\n * True\n *\n * @type {boolean}\n * @since 1.2.5\n * @product highcharts gantt\n * @apioption chart.showAxes\n */\n /**\n * The space between the bottom edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingbottom/\n * Spacing bottom set to 100\n * @sample {highstock} stock/chart/spacingbottom/\n * Spacing bottom set to 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 15\n * @since 2.1\n * @apioption chart.spacingBottom\n */\n /**\n * The space between the left edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingleft/\n * Spacing left set to 100\n * @sample {highstock} stock/chart/spacingleft/\n * Spacing left set to 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 10\n * @since 2.1\n * @apioption chart.spacingLeft\n */\n /**\n * The space between the right edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingright-100/\n * Spacing set to 100\n * @sample {highcharts} highcharts/chart/spacingright-legend/\n * Legend in right position with default spacing\n * @sample {highstock} stock/chart/spacingright/\n * Spacing set to 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 10\n * @since 2.1\n * @apioption chart.spacingRight\n */\n /**\n * The space between the top edge of the chart and the content (plot\n * area, axis title and labels, title, subtitle or legend in top\n * position).\n *\n * @sample {highcharts} highcharts/chart/spacingtop-100/\n * A top spacing of 100\n * @sample {highcharts} highcharts/chart/spacingtop-10/\n * Floating chart title makes the plot area align to the default\n * spacingTop of 10.\n * @sample {highstock} stock/chart/spacingtop/\n * A top spacing of 100\n * @sample {highmaps} maps/chart/spacing/\n * Spacing 100 all around\n *\n * @type {number}\n * @default 10\n * @since 2.1\n * @apioption chart.spacingTop\n */\n /**\n * Additional CSS styles to apply inline to the container `div` and the root\n * SVG.\n *\n * According to the CSS syntax documentation, it is recommended to quote\n * font family names that contain white space, digits, or punctuation\n * characters other than hyphens. In such cases, wrap the fontFamily\n * name as follows: `fontFamily: '\"Font name\"'`.\n *\n * Since v11, the root font size is 1rem by default, and all child element\n * are given a relative `em` font size by default. This allows implementers\n * to control all the chart's font sizes by only setting the root level.\n *\n * @see In styled mode, general chart styles can be set with the\n * `.highcharts-root` class.\n * @sample {highcharts} highcharts/chart/style-serif-font/\n * Using a serif type font\n * @sample {highcharts} highcharts/chart/style-special-font/\n * Using a font with special character in name\n * @sample {highcharts} highcharts/members/relative-font-size/\n * Relative font sizes\n * @sample {highcharts} highcharts/css/em/\n * Styled mode with relative font sizes\n * @sample {highstock} stock/chart/style/\n * Using a serif type font\n * @sample {highmaps} maps/chart/style-serif-font/\n * Using a serif type font\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontFamily\": \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif\", \"fontSize\":\"1rem\"}\n * @apioption chart.style\n */\n /**\n * The default series type for the chart. Can be any of the chart types\n * listed under [plotOptions](#plotOptions) and [series](#series) or can\n * be a series provided by an additional module.\n *\n * In TypeScript this option has no effect in sense of typing and\n * instead the `type` option must always be set in the series.\n *\n * @sample {highcharts} highcharts/chart/type-bar/\n * Bar\n * @sample {highstock} stock/chart/type/\n * Areaspline\n * @sample {highmaps} maps/chart/type-mapline/\n * Mapline\n *\n * @type {string}\n * @default {highcharts} line\n * @default {highstock} line\n * @default {highmaps} map\n * @since 2.1.0\n * @apioption chart.type\n */\n type: 'line',\n /**\n * Deprecated. Use\n * [chart.zooming.type](#chart.zooming.type)\n * instead.\n *\n * Decides in what dimensions the user can zoom by dragging the mouse.\n * Can be one of `x`, `y` or `xy`.\n *\n * @see [panKey](#chart.panKey)\n *\n * @sample {highcharts} highcharts/chart/zoomtype-none/\n * None by default\n * @sample {highcharts} highcharts/chart/zoomtype-x/\n * X\n * @sample {highcharts} highcharts/chart/zoomtype-y/\n * Y\n * @sample {highcharts} highcharts/chart/zoomtype-xy/\n * Xy\n * @sample {highcharts} highcharts/chart/zoomtype-polar/\n * Zoom on polar chart\n * @sample {highstock} stock/demo/basic-line/\n * None by default\n * @sample {highstock} stock/chart/zoomtype-x/\n * X\n * @sample {highstock} stock/chart/zoomtype-y/\n * Y\n * @sample {highstock} stock/chart/zoomtype-xy/\n * Xy\n * @sample {highmaps} maps/chart/zoomtype-xy/\n * Map with selection zoom\n *\n * @type {string}\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @deprecated 10.2.1\n * @apioption chart.zoomType\n */\n /**\n * Deprecated. Use\n * [chart.zooming.singleTouch](#chart.zooming.singleTouch)\n * instead.\n *\n * Enables zooming by a single touch, in combination with\n * [chart.zoomType](#chart.zoomType). When enabled, two-finger pinch\n * will still work as set up by [chart.pinchType](#chart.pinchType).\n * However, `zoomBySingleTouch` will interfere with touch-dragging the\n * chart to read the tooltip. And especially when vertical zooming is\n * enabled, it will make it hard to scroll vertically on the page.\n *\n * @sample highcharts/chart/zoombysingletouch\n * Zoom by single touch enabled, with buttons to toggle\n *\n * @product highcharts highstock gantt\n * @since 9.0.0\n * @type {boolean}\n * @default false\n * @deprecated 10.2.1\n * @apioption chart.zoomBySingleTouch\n */\n /**\n * Chart zooming options.\n *\n * @sample highcharts/plotoptions/sankey-node-color\n * Zooming in sankey series\n * @sample highcharts/series-treegraph/link-types\n * Zooming in treegraph series\n *\n * @since 10.2.1\n */\n zooming: {\n /**\n * Equivalent to [type](#chart.zooming.type), but for multitouch\n * gestures only. By default, the `pinchType` is the same as the\n * `type` setting. However, pinching can be enabled separately in\n * some cases, for example in stock charts where a mouse drag pans the\n * chart, while pinching is enabled. When [tooltip.followTouchMove](\n * #tooltip.followTouchMove) is true, pinchType only applies to\n * two-finger touches.\n *\n * @type {string}\n * @default {highcharts} undefined\n * @default {highstock} x\n * @product highcharts highstock gantt\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @apioption chart.zooming.pinchType\n */\n /**\n * Decides in what dimensions the user can zoom by dragging the mouse.\n * Can be one of `x`, `y` or `xy`.\n *\n * **Note:** For non-cartesian series, the only supported zooming type\n * is `xy`, as zooming in a single direction is not applicable due to\n * the radial nature of the coordinate system.\n *\n * @declare Highcharts.OptionsChartZoomingTypeValue\n * @type {string}\n * @default {highcharts} undefined\n * @product highcharts highstock gantt\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @apioption chart.zooming.type\n */\n /**\n * Enables zooming by a single touch, in combination with\n * [chart.zooming.type](#chart.zooming.type). When enabled, two-finger\n * pinch will still work as set up by [chart.zooming.pinchType]\n * (#chart.zooming.pinchType). However, `singleTouch` will interfere\n * with touch-dragging the chart to read the tooltip. And especially\n * when vertical zooming is enabled, it will make it hard to scroll\n * vertically on the page.\n *\n * @sample highcharts/chart/zoombysingletouch\n * Zoom by single touch enabled, with buttons to toggle\n *\n * @product highcharts highstock gantt\n */\n singleTouch: false,\n /**\n * The button that appears after a selection zoom, allowing the user\n * to reset zoom.\n */\n resetButton: {\n /**\n * What frame the button placement should be related to. Can be\n * either `plotBox` or `spacingBox`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n * Relative to the chart\n *\n * @type {Highcharts.ButtonRelativeToValue}\n * @default plotBox\n * @apioption chart.zooming.resetButton.relativeTo\n */\n /**\n * A collection of attributes for the button. The object takes SVG\n * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n * border radius. The theme also supports `style`, a collection of\n * CSS properties for the text. Equivalent attributes for the hover\n * state are given in `theme.states.hover`.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n * Theming the button\n *\n * @default { zIndex: 6 }\n * @type {Highcharts.SVGAttributes}\n * @since 10.2.1\n */\n theme: {\n /** @internal */\n zIndex: 6\n },\n /**\n * The position of the button.\n *\n * Note: Adjusting position values might cause overlap with chart\n * elements. Ensure coordinates do not obstruct other components or\n * data visibility.\n *\n * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highstock} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n * Above the plot area\n *\n * @type {Highcharts.AlignObject}\n * @since 10.2.1\n */\n position: {\n align: 'right',\n /**\n * The vertical alignment of the button.\n *\n * @type {Highcharts.VerticalAlignValue}\n * @default top\n * @apioption chart.zooming.resetButton.position.verticalAlign\n */\n x: -10,\n y: 10\n }\n }\n },\n /**\n * An explicit width for the chart. By default (when `null`) the width\n * is calculated from the offset width of the containing element.\n *\n * @sample {highcharts} highcharts/chart/width/\n * 800px wide\n * @sample {highstock} stock/chart/width/\n * 800px wide\n * @sample {highmaps} maps/chart/size/\n * Chart with explicit size\n *\n * @type {null|number|string}\n */\n width: null,\n /**\n * An explicit height for the chart. If a _number_, the height is\n * given in pixels. If given a _percentage string_ (for example\n * `'56%'`), the height is given as the percentage of the actual chart\n * width. This allows for preserving the aspect ratio across responsive\n * sizes.\n *\n * By default (when `null`) the height is calculated from the offset\n * height of the containing element, or 400 pixels if the containing\n * element's height is 0.\n *\n * @sample {highcharts} highcharts/chart/height/\n * Forced 200px height\n * @sample {highstock} stock/chart/height/\n * 300px height\n * @sample {highmaps} maps/chart/size/\n * Chart with explicit size\n * @sample highcharts/chart/height-percent/\n * Highcharts with percentage height\n * @sample highcharts/chart/height-inherited/\n * Chart with inherited height\n *\n * @type {null|number|string}\n */\n height: null,\n /**\n * The color of the outer chart border.\n *\n * @see In styled mode, the stroke is set with the\n * `.highcharts-background` class.\n *\n * @sample {highcharts} highcharts/chart/bordercolor/\n * Brown border\n * @sample {highstock} stock/chart/border/\n * Brown border\n * @sample {highmaps} maps/chart/border/\n * Border options\n *\n * @type {Highcharts.ColorType}\n */\n borderColor: 'var(--highcharts-highlight-color-80)',\n /**\n * The pixel width of the outer chart border.\n *\n * @see In styled mode, the stroke is set with the\n * `.highcharts-background` class.\n *\n * @sample {highcharts} highcharts/chart/borderwidth/\n * 5px border\n * @sample {highstock} stock/chart/border/\n * 2px border\n * @sample {highmaps} maps/chart/border/\n * Border options\n *\n * @type {number}\n * @default 0\n * @apioption chart.borderWidth\n */\n /**\n * The background color of the outer chart area.\n *\n * @see In styled mode, the background is set with the\n * `.highcharts-background` class.\n *\n * @sample {highcharts} highcharts/chart/backgroundcolor-color/\n * Color\n * @sample {highcharts} highcharts/chart/backgroundcolor-gradient/\n * Gradient\n * @sample {highstock} stock/chart/backgroundcolor-color/\n * Color\n * @sample {highstock} stock/chart/backgroundcolor-gradient/\n * Gradient\n * @sample {highmaps} maps/chart/backgroundcolor-color/\n * Color\n * @sample {highmaps} maps/chart/backgroundcolor-gradient/\n * Gradient\n *\n * @type {Highcharts.ColorType}\n */\n backgroundColor: 'var(--highcharts-background-color)',\n /**\n * The background color or gradient for the plot area. If not set, the\n * plot area will have the background color set to `'none'`.\n *\n * @see In styled mode, the plot background is set with the\n * `.highcharts-plot-background` class.\n *\n * @sample {highcharts} highcharts/chart/plotbackgroundcolor-color/\n * Color\n * @sample {highcharts} highcharts/chart/plotbackgroundcolor-gradient/\n * Gradient\n * @sample {highstock} stock/chart/plotbackgroundcolor-color/\n * Color\n * @sample {highstock} stock/chart/plotbackgroundcolor-gradient/\n * Gradient\n * @sample {highmaps} maps/chart/plotbackgroundcolor-color/\n * Color\n * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n * Gradient\n *\n * @type {Highcharts.ColorType}\n * @apioption chart.plotBackgroundColor\n */\n /**\n * The URL for an image to use as the plot background. To set an image\n * as the background for the entire chart, set a CSS background image\n * to the container element. Note that for the image to be applied to\n * exported charts, its URL needs to be accessible by the export server.\n *\n * @see In styled mode, a plot background image can be set with the\n * `.highcharts-plot-background` class and a [custom pattern](\n * https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n *\n * @sample {highcharts} highcharts/chart/plotbackgroundimage/\n * Skies\n * @sample {highstock} stock/chart/plotbackgroundimage/\n * Skies\n *\n * @type {string}\n * @apioption chart.plotBackgroundImage\n */\n /**\n * The color of the inner chart or plot area border.\n *\n * @see In styled mode, a plot border stroke can be set with the\n * `.highcharts-plot-border` class.\n *\n * @sample {highcharts} highcharts/chart/plotbordercolor/\n * Blue border\n * @sample {highstock} stock/chart/plotborder/\n * Blue border\n * @sample {highmaps} maps/chart/plotborder/\n * Plot border options\n *\n * @type {Highcharts.ColorType}\n */\n plotBorderColor: 'var(--highcharts-neutral-color-20)'\n};\n/* *\n *\n * Default Export\n *\n * */\nexport default ChartDefaults;\n","/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Honsi\n *\n * A commercial license may be required depending on use.\n * See www.highcharts.com/license\n *\n *\n * */\n'use strict';\n/**\n * The palette object specifies colors for the charts and how to apply them.\n *\n * Each color scheme (`light` and `dark`) has three primary colors:\n * `backgroundColor`, `neutralColor`, and `highlightColor`. For the neutral and\n * highlight colors, a series of interpolated color variants are generated, and\n * accessed as CSS variables in the chart settings in their prefixed and\n * hyphenated form. For example,\n *\n * * `var(--highcharts-neutral-color-80)` is a blend of the `neutralColor` and\n * the `backgroundColor`, with a weight of 80% `neutralColor` and 20%\n * `backgroundColor`. It is the default for the main title\n * (`title.style.color`), axis labels and more.\n * * `var(--highcharts-highlight-color-80)` is a blend of the `highlightColor`\n * and the `backgroundColor`, with a weight of 80% `highlightColor` and 20%\n * `backgroundColor`. It is used for the zoom selection marker (with opacity),\n * Stock Range Selector date input boxes and more.\n *\n * The `colors` array is used for data series and points, and is not blended\n * with the `backgroundColor`. It is also accessible as CSS variables, and this\n * is the recommended way to hard-code colors to match series and data.\n * For example, `var(--highcharts-color-0)` is the first color in the `colors`\n * array, `var(--highcharts-color-1)` is the second color, and so on.\n *\n * The palette only accepts plain color strings in the options. Gradients and\n * patterns are only supported in other color settings, such as `series.color`\n * or `point.color`, but they can use CSS variables from the palette.\n *\n * @sample highcharts/palette/general\n * General palette options\n * @sample highcharts/palette/branding\n * Branded chart\n * @sample highcharts/demo/pie-gradient\n * Using palette colors in gradients\n * @type {*}\n * @since 13.0.0\n * @optionparent palette\n */\nconst palette = {\n /**\n * Colors for data series and points. This setting is generic for both\n * light and dark mode, and can be overridden for each mode in\n * `light.colors` and `dark.colors`.\n *\n * @sample highcharts/palette/data-colors-points\n * Colors for points\n * @sample highcharts/palette/data-colors-series\n * Colors for series\n * @type {Array<Highcharts.ColorString>}\n * @default [\n * '#2caffe',\n * '#544fc5',\n * '#00e272',\n * '#fe6a35',\n * '#6b8abc',\n * '#d568fb',\n * '#2ee0ca',\n * '#fa4b42',\n * '#feb56a',\n * '#91e8e1'\n * ]\n * @since 13.0.0\n * @apioption palette.colors\n */\n /**\n * Color scheme to use. When `light dark` is set, the chart will\n * automatically switch between light and dark mode based on the user's\n * system preferences, or whether the `.highcharts-light` or\n * `.highcharts-dark` class is applied to a parent of the container.\n *\n * When `inherit` is set, the chart will inherit the color scheme from the\n * closest parent element with a defined color scheme, or default to `light`\n * if none is found.\n *\n * @sample highcharts/palette/colorscheme\n * Dark color scheme\n * @sample highcharts/palette/exporting-light\n * Dark chart with light export\n *\n * @type {'light dark'|'light'|'dark'|'inherit'}\n * @default light dark\n * @since 13.0.0\n * @apioption palette.colorScheme\n */\n /**\n * Whether to inject the CSS for the dark and light mode. If not injected,\n * you need to include the CSS manually in your page or application, with\n * the appropriate CSS variables. A file with the default CSS variables is\n * available at\n * [css/highcharts-palette.css](https://code.highcharts.com/css/highcharts-palette.css).\n *\n * @sample highcharts/palette/injectcss-false\n * Not injecting CSS variables, import file instead\n *\n * @type {boolean}\n * @default true\n * @since 13.0.0\n * @apioption palette.injectCSS\n */\n /**\n * Palette options for dark mode.\n *\n * @extends palette.light\n */\n dark: {\n /**\n * Colors for data series and points. This array extends the colors\n * defined for the general `palette.colors` array, item by item. If an\n * item is `null` or `undefined`, the general color will be used.\n *\n * @type {Array<Highcharts.ColorString|null|undefined>}\n * @apioption palette.dark.colors\n */\n /**\n * @type {Highcharts.ColorString}\n */\n backgroundColor: '#141414',\n /**\n * @type {Highcharts.ColorString}\n */\n neutralColor: '#ffffff',\n /**\n * @type {Highcharts.ColorString}\n */\n highlightColor: '#2caffe'\n },\n /**\n * Palette options for light mode.\n */\n light: {\n /**\n * Colors for data series and points. This array extends the colors\n * defined for the general `palette.colors` array, item by item. If an\n * item is `null` or `undefined`, the general color will be used.\n *\n * @type {Array<Highcharts.ColorString|null|undefined>}\n * @apioption palette.light.colors\n */\n /**\n * Chart background, point stroke for markers and columns etc. The\n * background is also used as base for interpolated neutral and\n * highlight colors.\n * @type {Highcharts.ColorString}\n */\n backgroundColor: '#ffffff',\n /**\n * Neutral color to be used as base for interpolated colors. For\n * example, `var(--highcharts-neutral-color-60)` is a blend of the\n * `neutralColor` and the `backgroundColor`, with a weight of 60%\n * `neutralColor` and 40% `backgroundColor`.\n *\n * Neutral colors are by default used for basic text, lines, borders,\n * basically most elements except the data itself, and highlighted\n * elements.\n * @type {Highcharts.ColorString}\n */\n neutralColor: '#000000',\n /**\n * Highlight color to be used as base for interpolated colors. For\n * example, `var(--highcharts-highlight-color-60)` is a blend of the\n * `highlightColor` and the `backgroundColor`, with a weight of 60%\n * `highlightColor` and 40% `backgroundColor`.\n *\n * Highlight colors are by default used for highlighted or active\n * elements, like the zoom selection marker, clickable Stock Range\n * Selector date input boxes, clickable drilldown labels and more.\n * @type {Highcharts.ColorString}\n */\n highlightColor: '#0022ff',\n /**\n * Positive color used in stock charts, such as for technical\n * indicators, annotations or hollow candlestick series.\n * @type {Highcharts.ColorString}\n */\n positiveColor: '#06b535',\n /**\n * Negative color used in stock charts, such as for technical\n * indicators, annotations or hollow candlestick series.\n * @type {Highcharts.ColorString}\n */\n negativeColor: '#f21313'\n }\n};\nexport default palette;\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 * */\nimport H from '../Core/Globals.js';\nconst { doc, win } = H;\n/**\n * Add an event listener.\n *\n * @function Highcharts.addEvent<T>\n *\n * @param {Highcharts.Class<T>|T} el\n * The element or object to add a listener to. It can be a\n * {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n *\n * @param {string} type\n * The event type.\n *\n * @param {Highcharts.EventCallbackFunction<T>|Function} fn\n * The function callback to execute when the event is fired.\n *\n * @param {Highcharts.EventOptionsObject} [options]\n * Options for adding the event.\n *\n * @sample highcharts/members/addevent\n * Use a general `render` event to draw shapes on a chart\n *\n * @return {Function}\n * A callback function to remove the added event.\n */\nexport function addEvent(el, type, fn, options = {}) {\n // Add hcEvents to either the prototype (in case we're running addEvent on a\n // class) or the instance. If hasOwnProperty('hcEvents') is false, it is\n // inherited down the prototype chain, in which case we need to set the\n // property on this instance (which may itself be a prototype).\n const owner = typeof el === 'function' && el.prototype || el;\n if (!Object.hasOwnProperty.call(owner, 'hcEvents')) {\n owner.hcEvents = {};\n }\n const events = owner.hcEvents;\n // Allow click events added to points, otherwise they will be prevented by\n // the TouchPointer.pinch function after a pinch zoom operation (#7091).\n if (H.Point && // Without H a dependency loop occurs\n el instanceof H.Point &&\n el.series &&\n el.series.chart) {\n el.series.chart.runTrackerClick = true;\n }\n // Handle DOM events\n // If the browser supports passive events, add it to improve performance\n // on touch events (#11353).\n const addEventListener = el.addEventListener;\n if (addEventListener) {\n addEventListener.call(el, type, fn, H.supportsPassiveEvents ? {\n passive: options.passive === void 0 ?\n type.indexOf('touch') !== -1 : options.passive,\n capture: false\n } : false);\n }\n if (!events[type]) {\n events[type] = [];\n }\n const eventObject = {\n fn,\n order: typeof options.order === 'number' ? options.order : Infinity\n };\n events[type].push(eventObject);\n // Order the calls\n events[type].sort((a, b) => a.order - b.order);\n // Return a function that can be called to remove this event.\n return function () {\n removeEvent(el, type, fn);\n };\n}\n/**\n * Non-recursive method to find the lowest member of an array. `Math.min` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function Highcharts.arrayMin\n *\n * @param {Array<*>} data\n * An array of numbers.\n *\n * @return {number}\n * The lowest number.\n */\nexport function arrayMin(data) {\n let i = data.length, min = data[0];\n while (i--) {\n if (data[i] < min) {\n min = data[i];\n }\n }\n return min;\n}\n/**\n * Non-recursive method to find the lowest member of an array. `Math.max` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function Highcharts.arrayMax\n *\n * @param {Array<*>} data\n * An array of numbers.\n *\n * @return {number}\n * The highest number.\n */\nexport function arrayMax(data) {\n let i = data.length, max = data[0];\n while (i--) {\n if (data[i] > max) {\n max = data[i];\n }\n }\n return max;\n}\n/**\n * Set or get an attribute or an object of attributes.\n *\n * To use as a setter, pass a key and a value, or let the second argument be a\n * collection of keys and values. When using a collection, passing a value of\n * `null` or `undefined` will remove the attribute.\n *\n * To use as a getter, pass only a string as the second argument.\n *\n * @function Highcharts.attr\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} elem\n * The DOM element to receive the attribute(s).\n *\n * @param {string|Highcharts.HTMLAttributes|Highcharts.SVGAttributes} [keyOrAttribs]\n * The property or an object of key-value pairs.\n *\n * @param {number|string} [value]\n * The value if a single property is set.\n *\n * @return {string|null|undefined}\n * When used as a getter, return the value.\n */\nexport function attr(elem, keyOrAttribs, value) {\n const isGetter = isString(keyOrAttribs) && !defined(value);\n let ret;\n const attrSingle = (value, key) => {\n // Set the value\n if (defined(value)) {\n elem.setAttribute(key, value);\n // Get the value\n }\n else if (isGetter) {\n ret = elem.getAttribute(key);\n // IE7 and below cannot get class through getAttribute (#7850)\n if (!ret && key === 'class') {\n ret = elem.getAttribute(key + 'Name');\n }\n // Remove the value\n }\n else {\n elem.removeAttribute(key);\n }\n };\n // If keyOrAttribs is a string\n if (isString(keyOrAttribs)) {\n attrSingle(value, keyOrAttribs);\n // Else if keyOrAttribs is defined, it is a hash of key/value pairs\n }\n else {\n objectEach(keyOrAttribs, attrSingle);\n }\n return ret;\n}\n/**\n * Constrain a value to within a lower and upper threshold.\n *\n * @internal\n * @param {number} value The initial value\n * @param {number} min The lower threshold\n * @param {number} max The upper threshold\n * @return {number} Returns a number value within min and max.\n */\nexport function clamp(value, min, max) {\n return value > min ? value < max ? value : max : min;\n}\n/**\n * Fix JS round off float errors.\n *\n * @function Highcharts.correctFloat\n *\n * @param {number} num\n * A float number to fix.\n *\n * @param {number} [prec=14]\n * The precision.\n *\n * @return {number}\n * The corrected float number.\n */\nexport function correctFloat(num, prec) {\n // When the number is higher than 1e14 use the number (#16275)\n return num > 1e14 ? num : parseFloat(num.toPrecision(prec || 14));\n}\n/**\n * Utility function to create an HTML element with attributes and styles.\n *\n * @function Highcharts.createElement\n *\n * @param {string} tag\n * The HTML tag.\n *\n * @param {Highcharts.HTMLAttributes} [attribs]\n * Attributes as an object of key-value pairs.\n *\n * @param {Highcharts.CSSObject} [styles]\n * Styles as an object of key-value pairs.\n *\n * @param {Highcharts.HTMLDOMElement} [parent]\n * The parent HTML object.\n *\n * @param {boolean} [nopad=false]\n * If true, remove all padding, border and margin.\n *\n * @return {Highcharts.HTMLDOMElement}\n * The created DOM element.\n */\nexport function createElement(tag, attribs, styles, parent, nopad) {\n const el = doc.createElement(tag);\n if (attribs) {\n extend(el, attribs);\n }\n if (nopad) {\n css(el, { padding: '0', border: 'none', margin: '0' });\n }\n if (styles) {\n css(el, styles);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n}\n/**\n * Utility for crisping a line position to the nearest full pixel depending on\n * the line width.\n *\n * @internal\n * @param {number} value The raw pixel position\n * @param {number} lineWidth The line width\n * @param {boolean} [inverted] Whether the containing group is inverted.\n * Crisping round numbers on the y-scale need to go\n * to the other side because the coordinate system\n * is flipped (scaleY is -1)\n * @return {number} The pixel position to use for a crisp display\n */\nexport function crisp(value, lineWidth = 0, inverted) {\n const mod = lineWidth % 2 / 2, inverter = inverted ? -1 : 1;\n return (Math.round(value * inverter - mod) + mod) * inverter;\n}\n/**\n * Set CSS on a given element.\n *\n * @function Highcharts.css\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} el\n * An HTML DOM element.\n *\n * @param {Highcharts.CSSObject} styles\n * Style object with camel case property names.\n *\n * @return {void}\n */\nexport function css(el, styles) {\n extend(el.style, styles);\n}\n/**\n * Check if an object is null or undefined.\n *\n * @function Highcharts.defined\n *\n * @param {*} obj\n * The object to check.\n *\n * @return {boolean}\n * False if the object is null or undefined, otherwise true.\n */\nexport function defined(obj) {\n return typeof obj !== 'undefined' && obj !== null;\n}\n/**\n * Utility method that destroys any SVGElement instances that are properties on\n * the given object. It loops all properties and invokes destroy if there is a\n * destroy method. The property is then delete.\n *\n * @function Highcharts.destroyObjectProperties\n *\n * @param {*} obj\n * The object to destroy properties on.\n *\n * @param {*} [except]\n * Exception, do not destroy this property, only delete it.\n */\nexport function destroyObjectProperties(obj, except, destructablesOnly) {\n objectEach(obj, function (val, n) {\n // If the object is non-null and destroy is defined\n if (val !== except && val?.destroy) {\n // Invoke the destroy\n val.destroy();\n }\n // Delete the property from the object\n if (val?.destroy || !destructablesOnly) {\n delete obj[n];\n }\n });\n}\n/**\n * Discard a HTML element\n *\n * @function Highcharts.discardElement\n *\n * @param {Highcharts.HTMLDOMElement} element\n * The HTML node to discard.\n */\nexport function discardElement(element) {\n element?.parentElement?.removeChild(element);\n}\n// eslint-disable-next-line valid-jsdoc\n/**\n * Return the deep difference between two objects. It can either return the new\n * properties, or optionally return the old values of new properties.\n * @internal\n */\nexport function diffObjects(newer, older, keepOlder, collectionsWithUpdate) {\n const ret = {};\n /**\n * Recurse over a set of options and its current values, and store the\n * current values in the ret object.\n */\n function diff(newer, older, ret, depth) {\n const keeper = keepOlder ? older : newer;\n objectEach(newer, function (newerVal, key) {\n if (!depth &&\n collectionsWithUpdate &&\n collectionsWithUpdate.indexOf(key) > -1 &&\n older[key]) {\n newerVal = splat(newerVal);\n ret[key] = [];\n // Iterate over collections like series, xAxis or yAxis and map\n // the items by index.\n for (let i = 0; i < Math.max(newerVal.length, older[key].length); i++) {\n // Item exists in current data (#6347)\n if (older[key][i]) {\n // If the item is missing from the new data, we need to\n // save the whole config structure. Like when\n // responsively updating from a dual axis layout to a\n // single axis and back (#13544).\n if (newerVal[i] === void 0) {\n ret[key][i] = older[key][i];\n // Otherwise, proceed\n }\n else {\n ret[key][i] = {};\n diff(newerVal[i], older[key][i], ret[key][i], depth + 1);\n }\n }\n }\n }\n else if (isObject(newerVal, true) &&\n !newerVal.nodeType // #10044\n ) {\n ret[key] = isArray(newerVal) ? [] : {};\n diff(newerVal, older[key] || {}, ret[key], depth + 1);\n // Delete empty nested objects\n if (Object.keys(ret[key]).length === 0 &&\n // Except colorAxis which is a special case where the empty\n // object means it is enabled. Which is unfortunate and we\n // should try to find a better way.\n !(key === 'colorAxis' && depth === 0)) {\n delete ret[key];\n }\n }\n else if (newer[key] !== older[key] ||\n // If the newer key is explicitly undefined, keep it (#10525)\n (key in newer && !(key in older))) {\n if (key !== '__proto__' && key !== 'constructor') {\n ret[key] = keeper[key];\n }\n }\n });\n }\n diff(newer, older, ret, 0);\n return ret;\n}\n/**\n * Remove the last occurrence of an item from an array.\n *\n * @function Highcharts.erase\n *\n * @param {Array<*>} arr\n * The array.\n *\n * @param {*} item\n * The item to remove.\n *\n * @return {void}\n */\nexport function erase(arr, item) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === item) {\n arr.splice(i, 1);\n break;\n }\n }\n}\n/**\n * Utility function to extend an object with the members of another.\n *\n * @function Highcharts.extend<T>\n *\n * @param {T|undefined} a\n * The object to be extended.\n *\n * @param {Partial<T>} b\n * The object to add to the first one.\n *\n * @return {T}\n * Object a, the original object.\n */\nexport function extend(a, b) {\n let n;\n if (!a) {\n a = {};\n }\n for (n in b) { // eslint-disable-line guard-for-in\n a[n] = b[n];\n }\n return a;\n}\n// eslint-disable-next-line valid-jsdoc\n/**\n * Extend a prototyped class by new members.\n *\n * @deprecated 11.0.0\n * @function Highcharts.extendClass<T>\n *\n * @param {Highcharts.Class<T>} parent\n * The parent prototype to inherit.\n *\n * @param {Highcharts.Dictionary<*>} members\n * A collection of prototype members to add or override compared to the\n * parent prototype.\n *\n * @return {Highcharts.Class<T>}\n * A new prototype.\n */\nexport function extendClass(parent, members) {\n const obj = (function () { });\n obj.prototype = new parent(); // eslint-disable-line new-cap\n extend(obj.prototype, members);\n return obj;\n}\n/**\n * Fire an event that was registered with {@link Highcharts#addEvent}.\n *\n * @function Highcharts.fireEvent<T>\n *\n * @param {T} el\n * The object to fire the event on. It can be a {@link HTMLDOMElement},\n * an {@link SVGElement} or any other object.\n *\n * @param {string} type\n * The type of event.\n *\n * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n * Custom event arguments that are passed on as an argument to the event\n * handler.\n *\n * @param {Highcharts.EventCallbackFunction<T>|Function} [defaultFunction]\n * The default function to execute if the other listeners haven't\n * returned false.\n *\n * @return {void}\n */\nexport function fireEvent(el, type, eventArguments, defaultFunction) {\n eventArguments = eventArguments || {};\n if (doc?.createEvent &&\n (el.dispatchEvent ||\n (el.fireEvent &&\n // Enable firing events on Highcharts instance.\n el !== H))) {\n const e = doc.createEvent('Events');\n e.initEvent(type, true, true);\n eventArguments = extend(e, eventArguments);\n if (el.dispatchEvent) {\n el.dispatchEvent(eventArguments);\n }\n else {\n el.fireEvent(type, eventArguments);\n }\n }\n else if (el.hcEvents) {\n if (!eventArguments.target) {\n // We're running a custom event\n extend(eventArguments, {\n // Attach a simple preventDefault function to skip\n // default handler if called. The built-in\n // defaultPrevented property is not overwritable (#5112)\n preventDefault: function () {\n eventArguments.defaultPrevented = true;\n },\n // Setting target to native events fails with clicking\n // the zoom-out button in Chrome.\n target: el,\n // If the type is not set, we're running a custom event\n // (#2297). If it is set, we're running a browser event.\n type: type\n });\n }\n const events = [];\n let object = el;\n let multilevel = false;\n // Recurse up the inheritance chain and collect hcEvents set as own\n // objects on the prototypes.\n while (object.hcEvents) {\n if (Object.hasOwnProperty.call(object, 'hcEvents') &&\n object.hcEvents[type]) {\n if (events.length) {\n multilevel = true;\n }\n events.unshift.apply(events, object.hcEvents[type]);\n }\n object = Object.getPrototypeOf(object);\n }\n // For performance reasons, only sort the event handlers in case we are\n // dealing with multiple levels in the prototype chain. Otherwise, the\n // events are already sorted in the addEvent function.\n if (multilevel) {\n // Order the calls\n events.sort((a, b) => a.order - b.order);\n }\n // Call the collected event handlers\n events.forEach((obj) => {\n // If the event handler returns false, prevent the default handler\n // from executing\n if (obj.fn.call(el, eventArguments, el) === false) {\n eventArguments.preventDefault();\n }\n });\n }\n // Run the default if not prevented\n if (defaultFunction && !eventArguments.defaultPrevented) {\n defaultFunction.call(el, eventArguments);\n }\n}\n/**\n * Convenience function to get the align factor, used several places for\n * computing positions\n * @internal\n */\nexport const getAlignFactor = (align = '') => ({\n center: 0.5,\n right: 1,\n middle: 0.5,\n bottom: 1\n}[align] || 0);\n/**\n * Find the closest distance between two values of a two-dimensional array\n * @internal\n * @function Highcharts.getClosestDistance\n *\n * @param {Array<Array<number>>} arrays\n * An array of arrays of numbers\n *\n * @return {number | undefined}\n * The closest distance between values\n */\nexport function getClosestDistance(arrays, onError) {\n const allowNegative = !onError;\n let closest, loopLength, distance, i;\n arrays.forEach((xData) => {\n if (xData.length > 1) {\n loopLength = xData.length - 1;\n for (i = loopLength; i > 0; i--) {\n distance = xData[i] - xData[i - 1];\n if (distance < 0 && !allowNegative) {\n onError?.();\n // Only one call\n onError = void 0;\n }\n else if (distance && (typeof closest === 'undefined' || distance < closest)) {\n closest = distance;\n }\n }\n }\n });\n return closest;\n}\n/**\n * Get the magnitude of a number.\n *\n * @function Highcharts.getMagnitude\n *\n * @param {number} num\n * The number.\n *\n * @return {number}\n * The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2 etc.\n */\nexport function getMagnitude(num) {\n return Math.pow(10, Math.floor(Math.log(num) / Math.LN10));\n}\n/**\n * Returns the value of a property path on a given object.\n *\n * @internal\n * @function getNestedProperty\n *\n * @param {string} path\n * Path to the property, for example `custom.myValue`.\n *\n * @param {unknown} parent\n * Instance containing the property on the specific path.\n *\n * @return {unknown}\n * The unknown property value.\n */\nexport function getNestedProperty(path, parent) {\n const pathElements = path.split('.');\n while (pathElements.length && defined(parent)) {\n const pathElement = pathElements.shift();\n // Filter on the key\n if (typeof pathElement === 'undefined' ||\n pathElement === '__proto__') {\n return; // Undefined\n }\n if (pathElement === 'this') {\n let thisProp;\n if (isObject(parent)) {\n thisProp = parent['@this'];\n }\n return thisProp ?? parent;\n }\n const child = parent[pathElement.replace(/[\\\\'\"]/g, '')];\n // Filter on the child\n if (!defined(child) ||\n typeof child === 'function' ||\n typeof child.nodeType === 'number' ||\n child === win) {\n return; // Undefined\n }\n // Else, proceed\n parent = child;\n }\n return parent;\n}\n/**\n * Get the computed CSS value for given element and property, only for numerical\n * properties. For width and height, the dimension of the inner box (excluding\n * padding) is returned. Used for fitting the chart within the container.\n *\n * @function Highcharts.getStyle\n *\n * @param {Highcharts.HTMLDOMElement} el\n * An HTML element.\n *\n * @param {string} prop\n * The property name.\n *\n * @param {boolean} [toInt=true]\n * Parse to integer.\n *\n * @return {number|string|undefined}\n * The style value.\n */\nexport function getStyle(el, prop, toInt) {\n let style;\n // For width and height, return the actual inner pixel size (#4913)\n if (prop === 'width') {\n let offsetWidth = Math.min(el.offsetWidth, el.scrollWidth);\n // In flex boxes, we need to use getBoundingClientRect and floor it,\n // because scrollWidth doesn't support subpixel precision (#6427) ...\n const boundingClientRectWidth = el.getBoundingClientRect?.().width;\n // ...unless if the containing div or its parents are transform-scaled\n // down, in which case the boundingClientRect can't be used as it is\n // also scaled down (#9871, #10498).\n if (boundingClientRectWidth < offsetWidth &&\n boundingClientRectWidth >= offsetWidth - 1) {\n offsetWidth = Math.floor(boundingClientRectWidth);\n }\n return Math.max(0, // #8377\n (offsetWidth -\n (getStyle(el, 'padding-left', true) || 0) -\n (getStyle(el, 'padding-right', true) || 0)));\n }\n if (prop === 'height') {\n return Math.max(0, // #8377\n (Math.min(el.offsetHeight, el.scrollHeight) -\n (getStyle(el, 'padding-top', true) || 0) -\n (getStyle(el, 'padding-bottom', true) || 0)));\n }\n // Otherwise, get the computed style\n const css = win.getComputedStyle(el, void 0); // eslint-disable-line no-undefined\n if (css) {\n style = css.getPropertyValue(prop);\n if (pick(toInt, prop !== 'opacity')) {\n style = pInt(style);\n }\n }\n return style;\n}\n/**\n * Return the value of the first element in the array that satisfies the\n * provided testing function.\n *\n * @function Highcharts.find<T>\n *\n * @param {Array<T>} arr\n * The array to test.\n *\n * @param {Function} callback\n * The callback function. The function receives the item as the first\n * argument. Return `true` if this item satisfies the condition.\n *\n * @return {T|undefined}\n * The value of the element.\n */\nexport const find = Array.prototype.find ?\n function (arr, callback) {\n return arr.find(callback);\n } :\n // Legacy implementation. PhantomJS, IE <= 11 etc. #7223.\n function (arr, callback) {\n let i;\n const length = arr.length;\n for (i = 0; i < length; i++) {\n if (callback(arr[i], i)) { // eslint-disable-line node/callback-return\n return arr[i];\n }\n }\n };\n/**\n * Internal clear timeout. The function checks that the `id` was not removed\n * (e.g. by `chart.destroy()`). For the details see\n * [issue #7901](https://github.com/highcharts/highcharts/issues/7901).\n *\n * @internal\n *\n * @function Highcharts.clearTimeout\n *\n * @param {number|undefined} id\n * Id of a timeout.\n */\nexport function internalClearTimeout(id) {\n if (defined(id)) {\n clearTimeout(id);\n }\n}\n/**\n * Utility function to check if an Object is a HTML Element.\n *\n * @function Highcharts.isDOMElement\n *\n * @param {*} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a HTML Element.\n */\nexport function isDOMElement(obj) {\n return isObject(obj) && typeof obj.nodeType === 'number';\n}\n/**\n * Utility function to check if an Object is a class.\n *\n * @function Highcharts.isClass\n *\n * @param {object|undefined} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a class.\n */\nexport function isClass(obj) {\n const c = obj?.constructor;\n return !!(isObject(obj, true) &&\n !isDOMElement(obj) &&\n (c?.name && c.name !== 'Object'));\n}\n/**\n * Utility function to check if an item is a number and it is finite (not NaN,\n * Infinity or -Infinity).\n *\n * @function Highcharts.isNumber\n *\n * @param {*} n\n * The item to check.\n *\n * @return {boolean}\n * True if the item is a finite number\n */\nexport function isNumber(n) {\n return typeof n === 'number' && !isNaN(n) && n < Infinity && n > -Infinity;\n}\n/**\n * Utility function to check for string type.\n *\n * @function Highcharts.isString\n *\n * @param {*} s\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a string.\n */\nexport function isString(s) {\n return typeof s === 'string';\n}\n/**\n * Utility function to check if an item is an array.\n *\n * @function Highcharts.isArray\n *\n * @param {*} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is an array.\n */\nexport function isArray(obj) {\n const str = Object.prototype.toString.call(obj);\n return str === '[object Array]' || str === '[object Array Iterator]';\n}\n/**\n * Utility function to check if object is a function.\n *\n * @function Highcharts.isFunction\n *\n * @param {*} obj\n * The item to check.\n *\n * @return {boolean}\n * True if the argument is a function.\n */\nexport function isFunction(obj) {\n return typeof obj === 'function';\n}\n/**\n * Utility function to check if an item is of type object.\n *\n * @function Highcharts.isObject\n *\n * @param {*} obj\n * The item to check.\n *\n * @param {boolean} [strict=false]\n * Also checks that the object is not an array.\n *\n * @return {boolean}\n * True if the argument is an object.\n */\nexport function isObject(obj, strict) {\n return (!!obj &&\n typeof obj === 'object' &&\n (!strict || !isArray(obj))); // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n/**\n * Utility function to deep merge two or more objects and return a third object.\n * If the first argument is true, the contents of the second object is copied\n * into the first object. The merge function can also be used with a single\n * object argument to create a deep copy of an object.\n *\n * @function Highcharts.merge<T>\n *\n * @param {true | T} extendOrSource\n * Whether to extend the left-side object,\n * or the first object to merge as a deep copy.\n *\n * @param {...Array<object|undefined>} [sources]\n * Object(s) to merge into the previous one.\n *\n * @return {T}\n * The merged object. If the first argument is true, the return is the\n * same as the second argument.\n */\nexport function merge(extendOrSource, ...sources) {\n let i, args = [extendOrSource, ...sources], ret = {};\n const doCopy = function (copy, original) {\n // An object is replacing a primitive\n if (typeof copy !== 'object') {\n copy = {};\n }\n objectEach(original, function (value, key) {\n // Prototype pollution (#14883)\n if (key === '__proto__' || key === 'constructor') {\n return;\n }\n // Copy the contents of objects, but not arrays or DOM nodes\n if (isObject(value, true) &&\n !isClass(value) &&\n !isDOMElement(value)) {\n copy[key] = doCopy(copy[key] || {}, value);\n // Primitives and arrays are copied over directly\n }\n else {\n copy[key] = original[key];\n }\n });\n return copy;\n };\n // If first argument is true, copy into the existing object. Used in\n // setOptions.\n if (extendOrSource === true) {\n ret = args[1];\n args = Array.prototype.slice.call(args, 2);\n }\n // For each argument, extend the return\n const len = args.length;\n for (i = 0; i < len; i++) {\n ret = doCopy(ret, args[i]);\n }\n return ret;\n}\n/**\n * Take an interval and normalize it to multiples of round numbers.\n *\n * @deprecated 5.0.3\n * @function Highcharts.normalizeTickInterval\n *\n * @param {number} interval\n * The raw, un-rounded interval.\n *\n * @param {Array<*>} [multiples]\n * Allowed multiples.\n *\n * @param {number} [magnitude]\n * The magnitude of the number.\n *\n * @param {boolean} [allowDecimals]\n * Whether to allow decimals.\n *\n * @param {boolean} [hasTickAmount]\n * If it has tickAmount, avoid landing on tick intervals lower than\n * original.\n *\n * @return {number}\n * The normalized interval.\n *\n * @todo\n * Move this function to the Axis prototype. It is here only for historical\n * reasons.\n */\nexport function normalizeTickInterval(interval, multiples, magnitude, allowDecimals, hasTickAmount) {\n let i, retInterval = interval;\n // Round to a tenfold of 1, 2, 2.5 or 5\n magnitude = pick(magnitude, getMagnitude(interval));\n const normalized = interval / magnitude;\n // Multiples for a linear scale\n if (!multiples) {\n multiples = hasTickAmount ?\n // Finer grained ticks when the tick amount is hard set, including\n // when alignTicks is true on multiple axes (#4580).\n [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n // Else, let ticks fall on rounder numbers\n [1, 2, 2.5, 5, 10];\n // The allowDecimals option\n if (allowDecimals === false) {\n if (magnitude === 1) {\n multiples = multiples.filter(function (num) {\n return num % 1 === 0;\n });\n }\n else if (magnitude <= 0.1) {\n multiples = [1 / magnitude];\n }\n }\n }\n // Normalize the interval to the nearest multiple\n for (i = 0; i < multiples.length; i++) {\n retInterval = multiples[i];\n // Only allow tick amounts smaller than natural\n if ((hasTickAmount &&\n retInterval * magnitude >= interval) ||\n (!hasTickAmount &&\n (normalized <=\n (multiples[i] +\n (multiples[i + 1] || multiples[i])) / 2))) {\n break;\n }\n }\n // Multiply back to the correct magnitude. Correct floats to appropriate\n // precision (#6085).\n retInterval = correctFloat(retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10));\n return retInterval;\n}\n/**\n * Iterate over object key pairs in an object.\n *\n * @function Highcharts.objectEach<T>\n *\n * @param {*} obj\n * The object to iterate over.\n *\n * @param {Highcharts.ObjectEachCallbackFunction<T>} fn\n * The iterator callback. It passes three arguments:\n * * value - The property value.\n * * key - The property key.\n * * obj - The object that objectEach is being applied to.\n *\n * @param {T} [ctx]\n * The context.\n */\nexport function objectEach(obj, fn, ctx) {\n for (const key in obj) {\n if (Object.hasOwnProperty.call(obj, key)) {\n fn.call(ctx || obj[key], obj[key], key, obj);\n }\n }\n}\n/**\n * Get the element's offset position, corrected for `overflow: auto`.\n *\n * @function Highcharts.offset\n *\n * @param {global.Element} el\n * The DOM element.\n *\n * @return {Highcharts.OffsetObject}\n * An object containing `left` and `top` properties for the position in\n * the page.\n */\nexport function offset(el) {\n const docElem = doc.documentElement, box = (el.parentElement || el.parentNode) ?\n el.getBoundingClientRect() :\n { top: 0, left: 0, width: 0, height: 0 };\n return {\n top: box.top + (win.pageYOffset || docElem.scrollTop) -\n (docElem.clientTop || 0),\n left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n (docElem.clientLeft || 0),\n width: box.width,\n height: box.height\n };\n}\n/**\n * Left-pad a string to a given length by adding a character repetitively.\n *\n * @function Highcharts.pad\n *\n * @param {number} number\n * The input string or number.\n *\n * @param {number} [length]\n * The desired string length.\n *\n * @param {string} [padder=0]\n * The character to pad with.\n *\n * @return {string}\n * The padded string.\n */\nexport function pad(number, length, padder) {\n return new Array((length || 2) +\n 1 -\n String(number)\n .replace('-', '')\n .length).join(padder || '0') + number;\n}\n/* eslint-disable jsdoc/check-param-names */\n/**\n * Return the first value that is not null or undefined.\n *\n * @function Highcharts.pick<T>\n *\n * @param {...Array<T|null|undefined>} items\n * Variable number of arguments to inspect.\n *\n * @return {T}\n * The value of the first argument that is not null or undefined.\n */\nexport function pick() {\n const args = arguments;\n const length = args.length;\n for (let i = 0; i < length; i++) {\n const arg = args[i];\n if (typeof arg !== 'undefined' && arg !== null) {\n return arg;\n }\n }\n}\n/* eslint-enable jsdoc/check-param-names */\n/**\n * Shortcut for parseInt\n *\n * @internal\n * @function Highcharts.pInt\n *\n * @param {*} s\n * any\n *\n * @param {number} [mag]\n * Magnitude\n *\n * @return {number}\n * number\n */\nexport function pInt(s, mag) {\n return parseInt(s, mag || 10);\n}\n/**\n * Adds an item to an array, if it is not present in the array.\n *\n * @internal\n *\n * @function Highcharts.pushUnique\n *\n * @param {Array<unknown>} array\n * The array to add the item to.\n *\n * @param {unknown} item\n * The item to add.\n *\n * @return {boolean}\n * Returns true, if the item was not present and has been added.\n */\nexport function pushUnique(array, item) {\n return array.indexOf(item) < 0 && !!array.push(item);\n}\n/**\n * Return a length based on either the integer value, or a percentage of a base.\n *\n * @function Highcharts.relativeLength\n *\n * @param {Highcharts.RelativeSize} value\n * A percentage string or a number.\n *\n * @param {number} base\n * The full length that represents 100%.\n *\n * @param {number} [offset=0]\n * A pixel offset to apply for percentage values. Used internally in\n * axis positioning.\n *\n * @return {number}\n * The computed length.\n */\nexport function relativeLength(value, base, offset) {\n return (/%$/).test(value) ?\n (base * parseFloat(value) / 100) + (offset || 0) :\n parseFloat(value);\n}\n/**\n * Replaces text in a string with a given replacement in a loop to catch nested\n * matches after previous replacements.\n *\n * @internal\n *\n * @function Highcharts.replaceNested\n *\n * @param {string} text\n * Text to search and modify.\n *\n * @param {...Array<(RegExp|string)>} replacements\n * One or multiple tuples with search pattern (`[0]: (string|RegExp)`) and\n * replacement (`[1]: string`) for matching text.\n *\n * @return {string}\n * Text with replacements.\n */\nexport function replaceNested(text, ...replacements) {\n let previous, replacement;\n do {\n previous = text;\n for (replacement of replacements) {\n text = text.replace(replacement[0], replacement[1]);\n }\n } while (text !== previous);\n return text;\n}\n/**\n * Remove an event that was added with {@link Highcharts#addEvent}.\n *\n * @function Highcharts.removeEvent<T>\n *\n * @param {Highcharts.Class<T>|T} el\n * The element to remove events on.\n *\n * @param {string} [type]\n * The type of events to remove. If undefined, all events are removed\n * from the element.\n *\n * @param {Highcharts.EventCallbackFunction<T>} [fn]\n * The specific callback to remove. If undefined, all events that match\n * the element and optionally the type are removed.\n *\n * @return {void}\n */\nexport function removeEvent(el, type, fn) {\n /** @internal */\n function removeOneEvent(type, fn) {\n const removeEventListener = el.removeEventListener;\n if (removeEventListener) {\n removeEventListener.call(el, type, fn, false);\n }\n }\n /** @internal */\n function removeAllEvents(eventCollection) {\n let types, len;\n if (!el.nodeName) {\n return; // Break on non-DOM events\n }\n if (type) {\n types = {};\n types[type] = true;\n }\n else {\n types = eventCollection;\n }\n objectEach(types, function (_val, n) {\n if (eventCollection[n]) {\n len = eventCollection[n].length;\n while (len--) {\n removeOneEvent(n, eventCollection[n][len].fn);\n }\n }\n });\n }\n const owner = typeof el === 'function' && el.prototype || el;\n if (Object.hasOwnProperty.call(owner, 'hcEvents')) {\n const events = owner.hcEvents;\n if (type) {\n const typeEvents = (events[type] || []);\n if (fn) {\n events[type] = typeEvents.filter(function (obj) {\n return fn !== obj.fn;\n });\n removeOneEvent(type, fn);\n }\n else {\n removeAllEvents(events);\n events[type] = [];\n }\n }\n else {\n removeAllEvents(events);\n delete owner.hcEvents;\n }\n }\n}\n/**\n * Check if an element is an array, and if not, make it into an array.\n *\n * @function Highcharts.splat\n *\n * @param {*} obj\n * The object to splat.\n *\n * @return {Array}\n * The produced or original array.\n */\nexport function splat(obj) {\n return isArray(obj) ? obj : [obj];\n}\n/**\n * Sort an object array and keep the order of equal items. The ECMAScript\n * standard does not specify the behavior when items are equal.\n *\n * @function Highcharts.stableSort\n *\n * @param {Array<*>} arr\n * The array to sort.\n *\n * @param {Function} sortFunction\n * The function to sort it with, like with regular Array.prototype.sort.\n */\nexport function stableSort(arr, sortFunction) {\n // @todo It seems like Chrome since v70 sorts in a stable way internally,\n // plus all other browsers do it, so over time we may be able to remove this\n // function\n const length = arr.length;\n let sortValue, i;\n // Add index to each item\n for (i = 0; i < length; i++) {\n arr[i].safeI = i; // Stable sort index\n }\n arr.sort(function (a, b) {\n sortValue = sortFunction(a, b);\n return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n });\n // Remove index from items\n for (i = 0; i < length; i++) {\n delete arr[i].safeI; // Stable sort index\n }\n}\n/**\n * Set a timeout if the delay is given, otherwise perform the function\n * synchronously.\n *\n * @function Highcharts.syncTimeout\n *\n * @param {Function} fn\n * The function callback.\n *\n * @param {number} delay\n * Delay in milliseconds.\n *\n * @param {*} [context]\n * An optional context to send to the function callback.\n *\n * @return {number}\n * An identifier for the timeout that can later be cleared with\n * Highcharts.clearTimeout. Returns -1 if there is no timeout.\n */\nexport function syncTimeout(fn, delay, context) {\n if (delay > 0) {\n return setTimeout(fn, delay, context);\n }\n fn.call(0, context);\n return -1;\n}\n/**\n * @internal\n */\nexport function ucfirst(s) {\n return ((isString(s) ?\n s.substring(0, 1).toUpperCase() + s.substring(1) :\n String(s)));\n}\n/**\n * Wrap a method with extended functionality, preserving the original function.\n *\n * @function Highcharts.wrap\n *\n * @param {*} obj\n * The context object that the method belongs to. In real cases, this is\n * often a prototype.\n *\n * @param {string} method\n * The name of the method to extend.\n *\n * @param {Highcharts.WrapProceedFunction} func\n * A wrapper function callback. This function is called with the same\n * arguments as the original function, except that the original function\n * is unshifted and passed as the first argument.\n */\nexport function wrap(obj, method, func) {\n const proceed = obj[method];\n obj[method] = function () {\n const outerArgs = arguments, scope = this;\n return func.apply(this, [\n function () {\n return proceed.apply(scope, arguments.length ? arguments : outerArgs);\n }\n ].concat([].slice.call(arguments)));\n };\n}\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 { attr, fireEvent, isNumber, isString, objectEach, pick } from '../Shared/Utilities.js';\nimport H from './Globals.js';\nconst { charts, win } = H;\n/* *\n *\n * Functions\n *\n * */\n/**\n * Provide error messages for debugging, with links to online explanation. This\n * function can be overridden to provide custom error handling.\n *\n * @sample highcharts/chart/highcharts-error/\n * Custom error handler\n *\n * @function Highcharts.error\n *\n * @param {number|string} code\n * The error code. See\n * [errors.xml](https://github.com/highcharts/highcharts/blob/master/errors/errors.xml)\n * for available codes. If it is a string, the error message is printed\n * directly in the console.\n *\n * @param {boolean} [stop=false]\n * Whether to throw an error or just log a warning in the console.\n *\n * @param {Highcharts.Chart} [chart]\n * Reference to the chart that causes the error. Used in 'debugger'\n * module to display errors directly on the chart.\n * Important note: This argument is undefined for errors that lack\n * access to the Chart instance. In such case, the error will be\n * displayed on the last created chart.\n *\n * @param {Highcharts.Dictionary<string>} [params]\n * Additional parameters for the generated message.\n *\n * @return {void}\n */\nexport function error(code, stop, chart, params) {\n const severity = stop ? 'Highcharts error' : 'Highcharts warning';\n if (code === 32) {\n code = `${severity}: Deprecated member`;\n }\n const isCode = isNumber(code);\n let message = isCode ?\n `${severity} #${code}: www.highcharts.com/errors/${code}/` :\n code.toString();\n const defaultHandler = function () {\n if (stop) {\n throw new Error(message);\n }\n // Else ...\n if (win.console &&\n error.messages.indexOf(message) === -1 // Prevent console floating\n ) {\n console.warn(message); // eslint-disable-line no-console\n }\n };\n if (typeof params !== 'undefined') {\n let additionalMessages = '';\n if (isCode) {\n message += '?';\n }\n objectEach(params, function (value, key) {\n additionalMessages += `\\n - ${key}: ${value}`;\n if (isCode) {\n message += encodeURI(key) + '=' + encodeURI(value);\n }\n });\n message += additionalMessages;\n }\n fireEvent(H, 'displayError', { chart, code, message, params }, defaultHandler);\n error.messages.push(message);\n}\n(function (error) {\n error.messages = [];\n})(error || (error = {}));\n/**\n * Insert a series or an axis in a collection with other items, either the\n * chart series or yAxis series or axis collections, in the correct order\n * according to the index option and whether it is internal. Used internally\n * when adding series and axes.\n *\n * @internal\n * @function Highcharts.Chart#insertItem\n * @param {Highcharts.Series|Highcharts.Axis} item\n * The item to insert\n * @param {Array<Highcharts.Series>|Array<Highcharts.Axis>} collection\n * A collection of items, like `chart.series` or `xAxis.series`.\n * @return {number} The index of the series in the collection.\n */\nexport function insertItem(item, collection) {\n const indexOption = item.options.index, length = collection.length;\n let i;\n for (\n // Internal item (navigator) should always be pushed to the end\n i = item.options.isInternal ? length : 0; i < length + 1; i++) {\n if (\n // No index option, reached the end of the collection,\n // equivalent to pushing\n !collection[i] ||\n // Handle index option, the element to insert has lower index\n (isNumber(indexOption) &&\n indexOption < pick(collection[i].options.index, collection[i]._i)) ||\n // Insert the new item before other internal items\n // (navigator)\n collection[i].options.isInternal) {\n collection.splice(i, 0, item);\n break;\n }\n }\n return i;\n}\n/**\n * The time unit lookup\n *\n * @ignore\n */\nexport const timeUnits = {\n millisecond: 1,\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 24 * 3600000,\n week: 7 * 24 * 3600000,\n month: 28 * 24 * 3600000,\n year: 364 * 24 * 3600000\n};\n/**\n * Easing definition\n *\n * @internal\n * @function Math.easeInOutSine\n *\n * @param {number} pos\n * Current position, ranging from 0 to 1.\n *\n * @return {number}\n * Ease result\n */\nMath.easeInOutSine = function (pos) {\n return -0.5 * (Math.cos(Math.PI * pos) - 1);\n};\nlet serialMode;\n/**\n * Get a unique key for using in internal element id's and pointers. The key is\n * composed of a random hash specific to this Highcharts instance, and a\n * counter.\n *\n * @example\n * let id = uniqueKey(); // => 'highcharts-x45f6hp-0'\n *\n * @function Highcharts.uniqueKey\n *\n * @return {string}\n * A unique key.\n */\nexport const uniqueKey = (function () {\n const hash = Math.random().toString(36).substring(2, 9) + '-';\n let id = 0;\n return function () {\n return 'highcharts-' + (serialMode ? '' : hash) + id++;\n };\n}());\n/**\n * Activates a serial mode for element IDs provided by\n * {@link Highcharts.uniqueKey}. This mode can be used in automated tests, where\n * a simple comparison of two rendered SVG graphics is needed.\n *\n * **Note:** This is only for testing purposes and will break functionality in\n * webpages with multiple charts.\n *\n * @example\n * if (\n * process &&\n * process.env.NODE_ENV === 'development'\n * ) {\n * Highcharts.useSerialIds(true);\n * }\n *\n * @function Highcharts.useSerialIds\n *\n * @param {boolean} [mode]\n * Changes the state of serial mode.\n *\n * @return {boolean|undefined}\n * State of the serial mode.\n */\nexport function useSerialIds(mode) {\n return (serialMode = pick(mode, serialMode));\n}\n/* *\n *\n * External\n *\n * */\n// Register Highcharts as a plugin in jQuery\nif (win.jQuery) {\n /**\n * Highcharts-extended JQuery.\n *\n * @external JQuery\n */\n /* eslint-disable jsdoc/check-param-names */\n /**\n * Helper function to return the chart of the current JQuery selector\n * element.\n *\n * @function external:JQuery#highcharts\n *\n * @return {Highcharts.Chart}\n * The chart that is linked to the JQuery selector element.\n */ /**\n * Factory function to create a chart in the current JQuery selector\n * element.\n *\n * @function external:JQuery#highcharts\n *\n * @param {'Chart'|'Map'|'StockChart'|string} [className]\n * Name of the factory class in the Highcharts namespace.\n *\n * @param {Highcharts.Options} [options]\n * The chart options structure.\n *\n * @param {Highcharts.ChartCallbackFunction|true} [callback]\n * Function to run when the chart has loaded and all external\n * images are loaded. Defining a\n * [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n * handler is equivalent. Set to `true` to return a promise that\n * resolves when the chart is ready.\n *\n * @return {JQuery}\n * The current JQuery selector.\n */\n win.jQuery.fn.highcharts = function () {\n const args = [].slice.call(arguments);\n if (this[0]) { // `this[0]` is the renderTo div\n // Create the chart\n if (args[0]) {\n new H[ // eslint-disable-line computed-property-spacing, no-new\n // Constructor defaults to Chart\n isString(args[0]) ? args.shift() : 'Chart'](this[0], args[0], args[1]);\n return this;\n }\n // When called without parameters or with the return argument,\n // return an existing chart\n return charts[attr(this[0], 'data-highcharts-chart')];\n }\n };\n /* eslint-enable jsdoc/check-param-names */\n}\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Creates a frame for the animated SVG element.\n *\n * @callback Highcharts.AnimationStepCallbackFunction\n *\n * @param {Highcharts.SVGElement} this\n * The SVG element to animate.\n *\n * @return {void}\n */\n/**\n * Interface description for a class.\n *\n * @interface Highcharts.Class<T>\n * @extends Function\n */ /**\n* Class constructor.\n* @function Highcharts.Class<T>#new\n* @param {...Array<*>} args\n* Constructor arguments.\n* @return {T}\n* Class instance.\n*/\n/**\n * A style object with camel case property names to define visual appearance of\n * a SVG element or HTML element. The properties can be whatever styles are\n * supported on the given SVG or HTML element.\n *\n * @example\n * {\n * fontFamily: 'monospace',\n * fontSize: '1.2em'\n * }\n *\n * @interface Highcharts.CSSObject\n */ /**\n* @name Highcharts.CSSObject#[key:string]\n* @type {boolean|number|string|undefined}\n*/ /**\n* Background style for the element.\n* @name Highcharts.CSSObject#background\n* @type {string|undefined}\n*/ /**\n* Background color of the element.\n* @name Highcharts.CSSObject#backgroundColor\n* @type {Highcharts.ColorString|undefined}\n*/ /**\n* Border style for the element.\n* @name Highcharts.CSSObject#border\n* @type {string|undefined}\n*/ /**\n* Radius of the element border.\n* @name Highcharts.CSSObject#borderRadius\n* @type {string|undefined}\n*/ /**\n* Color used in the element. The 'contrast' option is a Highcharts custom\n* property that results in black or white, depending on the background of the\n* element.\n* @name Highcharts.CSSObject#color\n* @type {'contrast'|Highcharts.ColorString|undefined}\n*/ /**\n* Style of the mouse cursor when resting over the element.\n* @name Highcharts.CSSObject#cursor\n* @type {Highcharts.CursorValue|undefined}\n*/ /**\n* Font family of the element text. Multiple values have to be in decreasing\n* preference order and separated by comma.\n* @name Highcharts.CSSObject#fontFamily\n* @type {string|undefined}\n*/ /**\n* Font size of the element text.\n* @name Highcharts.CSSObject#fontSize\n* @type {number|string|undefined}\n*/ /**\n* Font weight of the element text.\n* @name Highcharts.CSSObject#fontWeight\n* @type {string|undefined}\n*/ /**\n* Height of the element.\n* @name Highcharts.CSSObject#height\n* @type {number|undefined}\n*/ /**\n* The maximum number of lines. If lines are cropped away, an ellipsis will be\n* added.\n* @name Highcharts.CSSObject#lineClamp\n* @type {number|undefined}\n*/ /**\n* Width of the element border.\n* @name Highcharts.CSSObject#lineWidth\n* @type {number|undefined}\n*/ /**\n* Opacity of the element.\n* @name Highcharts.CSSObject#opacity\n* @type {number|undefined}\n*/ /**\n* Space around the element content.\n* @name Highcharts.CSSObject#padding\n* @type {string|undefined}\n*/ /**\n* Behavior of the element when the mouse cursor rests over it.\n* @name Highcharts.CSSObject#pointerEvents\n* @type {string|undefined}\n*/ /**\n* Positioning of the element.\n* @name Highcharts.CSSObject#position\n* @type {string|undefined}\n*/ /**\n* Alignment of the element text.\n* @name Highcharts.CSSObject#textAlign\n* @type {string|undefined}\n*/ /**\n* Additional decoration of the element text.\n* @name Highcharts.CSSObject#textDecoration\n* @type {string|undefined}\n*/ /**\n* Outline style of the element text.\n* @name Highcharts.CSSObject#textOutline\n* @type {string|undefined}\n*/ /**\n* Line break style of the element text. Highcharts SVG elements support\n* `ellipsis` when a `width` is set.\n* @name Highcharts.CSSObject#textOverflow\n* @type {string|undefined}\n*/ /**\n* Top spacing of the element relative to the parent element.\n* @name Highcharts.CSSObject#top\n* @type {string|undefined}\n*/ /**\n* Animated transition of selected element properties.\n* @name Highcharts.CSSObject#transition\n* @type {string|undefined}\n*/ /**\n* Line break style of the element text.\n* @name Highcharts.CSSObject#whiteSpace\n* @type {string|undefined}\n*/ /**\n* Width of the element.\n* @name Highcharts.CSSObject#width\n* @type {number|undefined}\n*/\n/**\n * All possible cursor styles.\n *\n * @typedef {'alias'|'all-scroll'|'auto'|'cell'|'col-resize'|'context-menu'|'copy'|'crosshair'|'default'|'e-resize'|'ew-resize'|'grab'|'grabbing'|'help'|'move'|'n-resize'|'ne-resize'|'nesw-resize'|'no-drop'|'none'|'not-allowed'|'ns-resize'|'nw-resize'|'nwse-resize'|'pointer'|'progress'|'row-resize'|'s-resize'|'se-resize'|'sw-resize'|'text'|'vertical-text'|'w-resize'|'wait'|'zoom-in'|'zoom-out'} Highcharts.CursorValue\n */\n/**\n * All possible dash styles.\n *\n * @typedef {'Dash'|'DashDot'|'Dot'|'LongDash'|'LongDashDot'|'LongDashDotDot'|'ShortDash'|'ShortDashDot'|'ShortDashDotDot'|'ShortDot'|'Solid'} Highcharts.DashStyleValue\n */\n/**\n * Generic dictionary in TypeScript notation.\n * Use the native `AnyRecord` instead.\n *\n * @deprecated 8.1.2\n * @interface Highcharts.Dictionary<T>\n */ /**\n* @name Highcharts.Dictionary<T>#[key:string]\n* @type {T}\n*/\n/**\n * @typedef {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} Highcharts.DOMElementType\n */\n/**\n * The function callback to execute when the event is fired. The `this` context\n * contains the instance, that fired the event.\n *\n * @callback Highcharts.EventCallbackFunction<T>\n *\n * @param {T} this\n *\n * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n * Event arguments.\n *\n * @param {T} [ctx]\n * Since v12.6.0, the callback context is passed as the last argument,\n * so arrow functions can access the same context as regular functions\n * using `this`.\n *\n * @return {boolean|void}\n */\n/**\n * The event options for adding function callback.\n *\n * @interface Highcharts.EventOptionsObject\n */ /**\n* The order the event handler should be called. This opens for having one\n* handler be called before another, independent of in which order they were\n* added.\n* @name Highcharts.EventOptionsObject#order\n* @type {number}\n*/ /**\n* Whether an event should be passive or not.\n* When set to `true`, the function specified by listener will never call\n* `preventDefault()`.\n* @name Highcharts.EventOptionsObject#passive\n* @type boolean\n*/\n/**\n * Formats data as a string. Usually the data is accessible through the `this`\n * keyword.\n *\n * @callback Highcharts.FormatterCallbackFunction<T>\n *\n * @param {T} this\n * Context to format\n *\n * @param {T} [ctx]\n * Since v12.6.0, the callback context is passed as an extra argument,\n * so arrow functions can access the same context as regular functions\n * using `this`.\n *\n * @return {string}\n * Formatted text\n */\n/**\n * An object of key-value pairs for HTML attributes.\n *\n * @typedef {Highcharts.Dictionary<boolean|number|string|Function>} Highcharts.HTMLAttributes\n */\n/**\n * An HTML DOM element. The type is a reference to the regular HTMLElement in\n * the global scope.\n *\n * @typedef {global.HTMLElement} Highcharts.HTMLDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement\n */\n/**\n * The iterator callback.\n *\n * @callback Highcharts.ObjectEachCallbackFunction<T>\n *\n * @param {T} this\n * The context.\n *\n * @param {*} value\n * The property value.\n *\n * @param {string} key\n * The property key.\n *\n * @param {*} obj\n * The object that objectEach is being applied to.\n */\n/**\n * An object containing `left` and `top` properties for the position in the\n * page.\n *\n * @interface Highcharts.OffsetObject\n */ /**\n* Left distance to the page border.\n* @name Highcharts.OffsetObject#left\n* @type {number}\n*/ /**\n* Top distance to the page border.\n* @name Highcharts.OffsetObject#top\n* @type {number}\n*/\n/**\n * Describes a range.\n *\n * @interface Highcharts.RangeObject\n */ /**\n* Maximum number of the range.\n* @name Highcharts.RangeObject#max\n* @type {number}\n*/ /**\n* Minimum number of the range.\n* @name Highcharts.RangeObject#min\n* @type {number}\n*/\n/**\n * If a number is given, it defines the pixel length. If a percentage string is\n * given, like for example `'50%'`, the setting defines a length relative to a\n * base size, for example the size of a container.\n *\n * @typedef {number|string} Highcharts.RelativeSize\n */\n/**\n * Proceed function to call original (wrapped) function.\n *\n * @callback Highcharts.WrapProceedFunction\n *\n * @param {*} [arg1]\n * Optional argument. Without any arguments defaults to first argument of\n * the wrapping function.\n *\n * @param {*} [arg2]\n * Optional argument. Without any arguments defaults to second argument\n * of the wrapping function.\n *\n * @param {*} [arg3]\n * Optional argument. Without any arguments defaults to third argument of\n * the wrapping function.\n *\n * @return {*}\n * Return value of the original function.\n */\n/**\n * The Highcharts object is the placeholder for all other members, and various\n * utility functions. The most important member of the namespace would be the\n * chart constructor.\n *\n * @example\n * let chart = Highcharts.chart('container', { ... });\n *\n * @namespace Highcharts\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 { pageLang, win } = H;\nimport { defined, extend, isObject, isNumber, isString, merge, objectEach, pad, splat, ucfirst } from './Utilities.js';\nimport { error, timeUnits } from '../Core/Utilities.js';\n/* *\n *\n * Constants\n *\n * */\n// To do: Remove this when we no longer need support for Safari < v14.1\nconst hasOldSafariBug = H.isSafari &&\n win.Intl &&\n !win.Intl.DateTimeFormat.prototype.formatRange;\nconst isDateTimeFormatOptions = (obj) => obj.main === void 0;\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Time class. Time settings are applied in general for each page using\n * `Highcharts.setOptions`, or individually for each Chart item through the\n * [time](https://api.highcharts.com/highcharts/time) options set.\n *\n * The Time object is available from {@link Highcharts.Chart#time}, which refers\n * to `Highcharts.time` unless individual time settings are applied for each\n * chart.\n *\n * When configuring time settings for individual chart instances, be aware that\n * using `Highcharts.dateFormat` or `Highcharts.time.dateFormat` within\n * formatter callbacks relies on the global time object, which applies the\n * global language and time zone settings. To ensure charts with local time\n * settings function correctly, use `chart.time.dateFormat? instead. However,\n * the recommended best practice is to use `setOptions` to define global time\n * settings unless specific configurations are needed for each chart.\n *\n * @example\n * // Apply time settings globally\n * Highcharts.setOptions({\n * time: {\n * timezone: 'Europe/London'\n * }\n * });\n *\n * // Apply time settings by instance\n * const chart = Highcharts.chart('container', {\n * time: {\n * timezone: 'America/New_York'\n * },\n * series: [{\n * data: [1, 4, 3, 5]\n * }]\n * });\n *\n * // Use the Time object of a chart instance\n * console.log(\n * 'Current time in New York',\n * chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n * );\n *\n * // Standalone use\n * const time = new Highcharts.Time({\n * timezone: 'America/New_York'\n * });\n * const s = time.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2020, 0, 1));\n * console.log(s); // => 2019-12-31 19:00:00\n *\n * @since 6.0.5\n *\n * @class\n * @name Highcharts.Time\n *\n * @param {Highcharts.TimeOptions} [options] Time options as defined in\n * [chart.options.time](/highcharts/time).\n */\nclass TimeBase {\n /* *\n *\n * Constructors\n *\n * */\n constructor(options, lang) {\n /* *\n *\n * Properties\n *\n * */\n this.options = {\n timezone: 'UTC'\n };\n this.variableTimezone = false;\n this.Date = win.Date;\n this.update(options);\n this.lang = lang;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Update the Time object with current options. It is called internally on\n * initializing Highcharts, after running `Highcharts.setOptions` and on\n * `Chart.update`.\n *\n * @internal\n * @function Highcharts.Time#update\n *\n * @param {Highcharts.TimeOptions} [options]\n *\n */\n update(options = {}) {\n this.dTLCache = {};\n this.options = options = merge(true, this.options, options);\n const { timezoneOffset, useUTC, locale } = options;\n // Allow using a different Date class\n this.Date = options.Date || win.Date || Date;\n // Assign the time zone. Handle the legacy, deprecated `useUTC` option.\n let timezone = options.timezone;\n if (defined(useUTC)) {\n timezone = useUTC ? 'UTC' : void 0;\n }\n // The Etc/GMT time zones do not support offsets with half-hour\n // resolutions\n if (timezoneOffset && timezoneOffset % 60 === 0) {\n timezone = 'Etc/GMT' + ((timezoneOffset > 0 ? '+' : '')) + timezoneOffset / 60;\n }\n /*\n * The time object has options allowing for variable time zones, meaning\n * the axis ticks or series data needs to consider this.\n */\n this.variableTimezone = timezone !== 'UTC' &&\n timezone?.indexOf('Etc/GMT') !== 0;\n this.timezone = timezone;\n // Update locale.\n if (this.lang && locale) {\n this.lang.locale = locale;\n }\n // Assign default time formats from locale strings\n ['months', 'shortMonths', 'weekdays', 'shortWeekdays'].forEach((name) => {\n const isMonth = /months/i.test(name), isShort = /short/.test(name), options = {\n timeZone: 'UTC'\n };\n options[isMonth ? 'month' : 'weekday'] = isShort ? 'short' : 'long';\n this[name] = (isMonth ?\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] :\n [3, 4, 5, 6, 7, 8, 9]).map((position) => this.dateFormat(options, (isMonth ? 31 : 1) * 24 * 36e5 * position));\n });\n }\n /**\n * Get a date in terms of numbers (year, month, day etc) for further\n * processing. Takes the current `timezone` setting into account. Inverse of\n * `makeTime` and the native `Date` constructor and `Date.UTC`.\n *\n * The date is returned in array format with the following indices:\n *\n * 0: year,\n * 1: month (zero based),\n * 2: day,\n * 3: hours,\n * 4: minutes,\n * 5: seconds,\n * 6: milliseconds,\n * 7: weekday (Sunday as 0)\n *\n * @function Highcharts.Time#toParts\n *\n * @param {number|Date} [timestamp]\n * The timestamp in milliseconds since January 1st 1970.\n * A Date object is also accepted.\n *\n * @return {Array<number>} The date parts in array format.\n */\n toParts(timestamp) {\n const [weekday, dayOfMonth, month, year, hours, minutes, seconds] = this.dateTimeFormat({\n weekday: 'narrow',\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric'\n }, timestamp, 'es')\n // The ', ' splitter is for all modern browsers:\n // L, 6/3/2023, 14:30:00\n // The ' ' splitter is for legacy Safari with no comma between date\n // and time (#22445):\n // L, 6/3/2023 14:30:00\n .split(/(?:, | |\\/|:)/g);\n return [\n +year,\n +month - 1,\n +dayOfMonth,\n +hours,\n +minutes,\n +seconds,\n // Milliseconds\n Math.floor(Number(timestamp) || 0) % 1000,\n // Spanish weekday index\n 'DLMXJVS'.indexOf(weekday)\n ];\n }\n /**\n * Shorthand to get a cached `Intl.DateTimeFormat` instance.\n */\n dateTimeFormat(options, timestamp, locale = this.options.locale || pageLang) {\n const cacheKey = JSON.stringify(options) + locale;\n if (isString(options)) {\n options = this.str2dtf(options);\n }\n let dTL = this.dTLCache[cacheKey];\n if (!dTL) {\n options.timeZone ?? (options.timeZone = this.timezone);\n try {\n dTL = new Intl.DateTimeFormat(locale, options);\n }\n catch (e) {\n if (/Invalid time zone/i.test(e.message)) {\n error(34);\n options.timeZone = 'UTC';\n dTL = new Intl.DateTimeFormat(locale, options);\n }\n else {\n error(e.message, false);\n }\n }\n }\n this.dTLCache[cacheKey] = dTL;\n return dTL?.format(timestamp) || '';\n }\n /**\n * Take a locale-aware string format and return a full DateTimeFormat in\n * object form.\n */\n str2dtf(s, dtf = {}) {\n const mapping = {\n L: { fractionalSecondDigits: 3 },\n S: { second: '2-digit' },\n M: { minute: 'numeric' },\n H: { hour: '2-digit' },\n k: { hour: 'numeric' },\n E: { weekday: 'narrow' },\n a: { weekday: 'short' },\n A: { weekday: 'long' },\n d: { day: '2-digit' },\n e: { day: 'numeric' },\n b: { month: 'short' },\n B: { month: 'long' },\n m: { month: '2-digit' },\n o: { month: 'numeric' },\n y: { year: '2-digit' },\n Y: { year: 'numeric' }\n };\n Object.keys(mapping).forEach((key) => {\n if (s.indexOf(key) !== -1) {\n extend(dtf, mapping[key]);\n }\n });\n return dtf;\n }\n /**\n * Make a time and returns milliseconds. Similar to `Date.UTC`, but takes\n * the current `timezone` setting into account.\n *\n * @function Highcharts.Time#makeTime\n *\n * @param {number} year\n * The year\n *\n * @param {number} month\n * The month. Zero-based, so January is 0.\n *\n * @param {number} [date=1]\n * The day of the month\n *\n * @param {number} [hours=0]\n * The hour of the day, 0-23.\n *\n * @param {number} [minutes=0]\n * The minutes\n *\n * @param {number} [seconds=0]\n * The seconds\n *\n * @return {number}\n * The time in milliseconds since January 1st 1970.\n */\n makeTime(year, month, date = 1, hours = 0, minutes, seconds, milliseconds) {\n // eslint-disable-next-line new-cap\n let d = this.Date.UTC(year, month, date, hours, minutes || 0, seconds || 0, milliseconds || 0);\n if (this.timezone !== 'UTC') {\n const offset = this.getTimezoneOffset(d), localHours = (hours - offset / timeUnits.hour + 24) % 24;\n d += offset;\n if (\n // Limit the number of calls to `getTimezoneOffset` to months\n // where DST changes may occur. According to\n // https://en.wikipedia.org/wiki/Daylight_saving_time_by_country,\n // DST change may only occur in these months.\n [2, 3, 8, 9, 10, 11].indexOf(month) !== -1 &&\n // DST changes only occur at night (#24420)\n (localHours < 5 || localHours > 20)) {\n const newOffset = this.getTimezoneOffset(d);\n if (offset !== newOffset) {\n d += newOffset - offset;\n // A special case for transitioning from summer time to winter\n // time. When the clock is set back, the same time is repeated\n // twice, i.e. 02:30 am is repeated since the clock is set back\n // from 3 am to 2 am. We need to make the same time as local\n // Date does.\n }\n else if (offset - 36e5 === this.getTimezoneOffset(d - 36e5) &&\n !hasOldSafariBug) {\n d -= 36e5;\n }\n }\n }\n return d;\n }\n /**\n * Parse a datetime string. Unless the string contains time zone\n * information, apply the current `timezone` from options. If the argument\n * is a number, return it.\n *\n * @function Highcharts.Time#parse\n * @param {string|number|undefined} s The datetime string to parse\n * @return {number|undefined} Parsed JavaScript timestamp\n */\n parse(s) {\n if (!isString(s)) {\n return s ?? void 0;\n }\n s = s\n // Firefox fails on YYYY/MM/DD\n .replace(/\\//g, '-')\n // Replace some non-standard notations\n .replace(/(GMT|UTC)/, '');\n // Extend shorthand hour timezone offset like +02\n // .replace(/([+-][0-9]{2})$/, '$1:00');\n // Check if the string has time zone information\n const hasTimezone = s.indexOf('Z') > -1 ||\n /([+-][0-9]{2}):?[0-9]{2}$/.test(s), \n // YYYY-MM-DD and YYYY-MM are always UTC\n isYYYYMMDD = /^[0-9]{4}-[0-9]{2}(-[0-9]{2}|)$/.test(s);\n if (!hasTimezone && !isYYYYMMDD) {\n s += 'Z';\n }\n const ts = Date.parse(s);\n if (isNumber(ts)) {\n // Unless the string contains time zone information, convert from\n // the local time result of `Date.parse` via UTC into the current\n // timezone of the time object.\n return ts + ((!hasTimezone || isYYYYMMDD) ?\n this.getTimezoneOffset(ts) :\n 0);\n }\n }\n /**\n * Get the time zone offset based on the current timezone information as\n * set in the global options.\n *\n * @function Highcharts.Time#getTimezoneOffset\n *\n * @param {number} timestamp\n * The JavaScript timestamp to inspect.\n *\n * @return {number}\n * The timezone offset in minutes compared to UTC.\n */\n getTimezoneOffset(timestamp) {\n if (this.timezone !== 'UTC') {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [date, gmt, hours, colon, minutes = 0] = this.dateTimeFormat({ timeZoneName: 'shortOffset' }, timestamp, 'en')\n .split(/(GMT|:)/)\n .map(Number), offset = -(hours + minutes / 60) * 60 * 60000;\n // Possible future NaNs stop here\n if (isNumber(offset)) {\n return offset;\n }\n }\n return 0;\n }\n /**\n * Formats a JavaScript date timestamp (milliseconds since January 1 1970)\n * into a human readable date string.\n *\n * The `format` parameter accepts two types of values:\n * - An object containing settings that are passed directly on to\n * [Intl.DateTimeFormat.prototype.format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/format).\n * - A format string containing either individual or locale-aware format\n * keys. **Individual keys**, for example `%Y-%m-%d`, are listed below.\n * **Locale-aware keys** are grouped by square brackets, for example\n * `%[Ymd]`. The order of keys within the square bracket doesn't affect\n * the output, which is determined by the locale. See example below.\n * Internally, the locale-aware format keys are just a shorthand for the\n * full object formats, but are particularly practical in\n * [templating](https://www.highcharts.com/docs/chart-concepts/templating)\n * where full object definitions are not an option.\n *\n * The available string format keys are listed below. Additional formats can\n * be given in the {@link Highcharts.dateFormats} hook.\n *\n * Supported format keys:\n * | Key | Description | Notes on locale-aware format |\n * -------|----------------------------------------------|-------|\n * | `%A` | Long weekday, like 'Monday' | |\n * | `%a` | Short weekday, like 'Mon' | |\n * | `%E` | Narrow weekday, single character | |\n * | `%d` | Two digit day of the month, 01 to 31 | |\n * | `%e` | Day of the month, 1 through 31 | |\n * | `%w` | Day of the week, 0 through 6 | N/A |\n * | `%v` | The prefix \"week from\", read from `lang.weekFrom` | N/A |\n * | `%b` | Short month, like 'Jan' | |\n * | `%B` | Long month, like 'January' | |\n * | `%m` | Two digit month number, 01 through 12 | |\n * | `%o` | Month number, 1 through 12 | |\n * | `%y` | Two digits year, like 24 for 2024 | |\n * | `%Y` | Four digits year, like 2024 | |\n * | `%H` | Two digits hours in 24h format, 00 through 23 | Depending on the locale, 12h format may be inserted. |\n * | `%k` | Hours in 24h format, 0 through 23 | Depending on the locale, 12h format may be inserted. |\n * | `%I` | Two digits hours in 12h format, 00 through 11 | N/A. The locale determines the hour format. |\n * | `%l` | Hours in 12h format, 1 through 12 | N/A. The locale determines the hour format. |\n * | `%M` | Two digits minutes, 00 through 59 | |\n * | `%p` | Upper case AM or PM | N/A. The locale determines whether to add AM and PM. |\n * | `%P` | Lower case AM or PM | N/A. The locale determines whether to add AM and PM. |\n * | `%S` | Two digits seconds, 00 through 59 | |\n * | `%L` | Milliseconds (naming from Ruby) | |\n *\n * @example\n * // Object format, US English\n * const time1 = new Highcharts.Time({ locale: 'en-US' });\n * console.log(\n * time1.dateFormat({\n * day: 'numeric',\n * month: 'short',\n * year: 'numeric',\n * hour: 'numeric',\n * minute: 'numeric'\n * }, Date.UTC(2024, 11, 31))\n * ); // => Dec 31, 2024, 12:00 AM\n *\n * // Object format, British English\n * const time2 = new Highcharts.Time({ locale: 'en-GB' });\n * console.log(\n * time2.dateFormat({\n * day: 'numeric',\n * month: 'short',\n * year: 'numeric',\n * hour: 'numeric',\n * minute: 'numeric'\n * }, Date.UTC(2024, 11, 31))\n * ); // => 31 Dec 2024, 00:00\n *\n * // Individual key string replacement\n * const time3 = new Highcharts.Time();\n * console.log(\n * time3.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2024, 11, 31))\n * ); // => 2024-12-31 00:00:00\n *\n * // Locale-aware keys, US English\n * const time4 = new Highcharts.Time({ locale: 'en-US' });\n * console.log(\n * time4.dateFormat('%[YebHM]', Date.UTC(2024, 11, 31))\n * ); // => Dec 31, 2024, 12:00 AM\n *\n * // Locale-aware keys, British English\n * const time5 = new Highcharts.Time({ locale: 'en-GB' });\n * console.log(\n * time5.dateFormat('%[YebHM]', Date.UTC(2024, 11, 31))\n * ); // => 31 Dec 2024, 00:00\n *\n * // Mixed locale-aware and individual keys\n * console.log(\n * time5.dateFormat('%[Yeb], %H:%M', Date.UTC(2024, 11, 31))\n * ); // => 31 Dec 2024, 00:00\n *\n * @function Highcharts.Time#dateFormat\n *\n * @param {string|Highcharts.DateTimeFormatOptions} format\n * The desired string format where various time representations are\n * prefixed with %, or an object representing the locale-aware format\n * options.\n *\n * @param {number} [timestamp]\n * The JavaScript timestamp.\n *\n * @param {boolean} [upperCaseFirst=false]\n * Upper case first letter in the return.\n *\n * @return {string}\n * The formatted date.\n */\n dateFormat(format, timestamp, upperCaseFirst) {\n const lang = this.lang;\n if (!defined(timestamp) || isNaN(timestamp)) {\n return lang?.invalidDate || '';\n }\n format = format ?? '%Y-%m-%d %H:%M:%S';\n // First, identify and replace locale-aware formats like %[Ymd]\n if (isString(format)) {\n const localeAwareRegex = /%\\[([a-zA-Z]+)\\]/g;\n let match;\n while ((match = localeAwareRegex.exec(format))) {\n format = format.replace(match[0], this.dateTimeFormat(match[1], timestamp, lang?.locale));\n }\n }\n // Then, replace static formats like %Y, %m, %d etc.\n if (isString(format) && format.indexOf('%') !== -1) {\n const time = this, [fullYear, month, dayOfMonth, hours, minutes, seconds, milliseconds, weekday] = this.toParts(timestamp), langWeekdays = lang?.weekdays || this.weekdays, shortWeekdays = lang?.shortWeekdays || this.shortWeekdays, months = lang?.months || this.months, shortMonths = lang?.shortMonths || this.shortMonths, \n // List all format keys. Custom formats can be added from the\n // outside.\n replacements = extend({\n // Day\n // Short weekday, like 'Mon'\n a: shortWeekdays ?\n shortWeekdays[weekday] :\n langWeekdays[weekday].substr(0, 3),\n // Long weekday, like 'Monday'\n A: langWeekdays[weekday],\n // Two digit day of the month, 01 to 31\n d: pad(dayOfMonth),\n // Day of the month, 1 through 31\n e: pad(dayOfMonth, 2, ' '),\n // Day of the week, 0 through 6\n w: weekday,\n // Week (none implemented)\n // 'W': weekNumber(),\n v: lang?.weekFrom ?? '',\n // Month\n // Short month, like 'Jan'\n b: shortMonths[month],\n // Long month, like 'January'\n B: months[month],\n // Two digit month number, 01 through 12\n m: pad(month + 1),\n // Month number, 1 through 12 (#8150)\n o: month + 1,\n // Year\n // Two digits year, like 09 for 2009\n y: fullYear.toString().substr(2, 2),\n // Four digits year, like 2009\n Y: fullYear,\n // Time\n // Two digits hours in 24h format, 00 through 23\n H: pad(hours),\n // Hours in 24h format, 0 through 23\n k: hours,\n // Two digits hours in 12h format, 00 through 11\n I: pad((hours % 12) || 12),\n // Hours in 12h format, 1 through 12\n l: (hours % 12) || 12,\n // Two digits minutes, 00 through 59\n M: pad(minutes),\n // Upper case AM or PM\n p: hours < 12 ? 'AM' : 'PM',\n // Lower case AM or PM\n P: hours < 12 ? 'am' : 'pm',\n // Two digits seconds, 00 through 59\n S: pad(seconds),\n // Milliseconds (naming from Ruby)\n L: pad(milliseconds, 3)\n }, H.dateFormats);\n // Do the replaces\n objectEach(replacements, function (val, key) {\n if (isString(format)) {\n // Regex would do it in one line, but this is faster\n while (format.indexOf('%' + key) !== -1) {\n format = format.replace('%' + key, typeof val === 'function' ?\n val.call(time, timestamp, time) :\n val);\n }\n }\n });\n }\n else if (isObject(format)) {\n const tzHours = (this.getTimezoneOffset(timestamp) || 0) /\n (60000 * 60), timeZone = this.timezone || ('Etc/GMT' + (tzHours >= 0 ? '+' : '') + tzHours), { prefix = '', suffix = '' } = format;\n format = prefix + this.dateTimeFormat(extend({ timeZone }, format), timestamp) + suffix;\n }\n // Optionally sentence-case the string and return\n return upperCaseFirst ? ucfirst(format) : format;\n }\n /**\n * Resolve legacy formats of dateTimeLabelFormats (strings and arrays) into\n * an object.\n * @internal\n * @param {string|Array<T>|Highcharts.Dictionary<T>} f\n * General format description\n * @return {Highcharts.Dictionary<T>}\n * The object definition\n */\n resolveDTLFormat(f) {\n if (!isObject(f, true)) { // Check for string or array\n f = splat(f);\n return {\n main: f[0],\n from: f[1],\n to: f[2]\n };\n }\n // Type-check DateTimeFormatOptions against DateTimeLabelFormatObject\n if (isObject(f, true) && isDateTimeFormatOptions(f)) {\n return { main: f };\n }\n return f;\n }\n /**\n * Get the optimal date format for a point, based on a range.\n *\n * @internal\n * @function Highcharts.Time#getDateFormat\n *\n * @param {number} range\n * The time range\n *\n * @param {number} timestamp\n * The timestamp of the date\n *\n * @param {number} startOfWeek\n * An integer representing the first day of the week, where 0 is\n * Sunday.\n *\n * @param {Highcharts.Dictionary<string>} dateTimeLabelFormats\n * A map of time units to formats.\n *\n * @return {string}\n * The optimal date format for a point.\n */\n getDateFormat(range, timestamp, startOfWeek, dateTimeLabelFormats) {\n const dateStr = this.dateFormat('%m-%d %H:%M:%S.%L', timestamp), blank = '01-01 00:00:00.000', strpos = {\n millisecond: 15,\n second: 12,\n minute: 9,\n hour: 6,\n day: 3\n };\n let n = 'millisecond', \n // For sub-millisecond data, #4223\n lastN = n;\n for (n in timeUnits) { // eslint-disable-line guard-for-in\n // If the range is exactly one week and we're looking at a\n // Sunday/Monday, go for the week format\n if (range &&\n range === timeUnits.week &&\n +this.dateFormat('%w', timestamp) === startOfWeek &&\n dateStr.substr(6) === blank.substr(6)) {\n n = 'week';\n break;\n }\n // The first format that is too great for the range\n if (range && timeUnits[n] > range) {\n n = lastN;\n break;\n }\n // If the point is placed every day at 23:59, we need to show\n // the minutes as well. #2637.\n if (strpos[n] &&\n dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n break;\n }\n // Weeks are outside the hierarchy, only apply them on\n // Mondays/Sundays like in the first condition\n if (n !== 'week') {\n lastN = n;\n }\n }\n return this.resolveDTLFormat(dateTimeLabelFormats[n]).main;\n }\n}\n/* *\n *\n * Default export\n *\n * */\nexport default TimeBase;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Normalized interval.\n *\n * @interface Highcharts.TimeNormalizedObject\n */ /**\n* The count.\n*\n* @name Highcharts.TimeNormalizedObject#count\n* @type {number|undefined}\n*/ /**\n* The interval in axis values (ms).\n*\n* @name Highcharts.TimeNormalizedObject#unitRange\n* @type {number}\n*/\n/**\n * Function of an additional date format specifier.\n *\n * @callback Highcharts.TimeFormatCallbackFunction\n *\n * @param {number} timestamp\n * The time to format.\n *\n * @return {string}\n * The formatted portion of the date.\n */\n/**\n * Time ticks.\n *\n * @interface Highcharts.AxisTickPositionsArray\n * @extends global.Array<number>\n */ /**\n* @name Highcharts.AxisTickPositionsArray#info\n* @type {Highcharts.TimeTicksInfoObject|undefined}\n*/\n/**\n * A callback to return the time zone offset for a given datetime. It\n * takes the timestamp in terms of milliseconds since January 1 1970,\n * and returns the timezone offset in minutes. This provides a hook\n * for drawing time based charts in specific time zones using their\n * local DST crossover dates, with the help of external libraries.\n *\n * @callback Highcharts.TimezoneOffsetCallbackFunction\n *\n * @param {number} timestamp\n * Timestamp in terms of milliseconds since January 1 1970.\n *\n * @return {number}\n * Timezone offset in minutes.\n */\n/**\n * Options for formatting dates and times using the [Intl.DateTimeFormat](\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat\n * ) API, and extended with some custom options for Highcharts.\n *\n * @interface Highcharts.DateTimeFormatOptions\n */ /**\n* The locale matching algorithm to use.\n*\n* @name Highcharts.DateTimeFormatOptions#localeMatcher\n* @type {string|undefined}\n*/ /**\n* The time zone to use. The default is the browser's default time zone.\n*\n* @name Highcharts.DateTimeFormatOptions#timeZone\n* @type {string|undefined}\n*/ /**\n* Whether to use 12-hour time (as opposed to 24-hour time).\n*\n* @name Highcharts.DateTimeFormatOptions#hour12\n* @type {'auto'|'always'|'never'|undefined}\n*/ /**\n* The format matching algorithm to use.\n*\n* @name Highcharts.DateTimeFormatOptions#formatMatcher\n* @type {string|undefined}\n*/ /**\n* The representation of the weekday.\n*\n* @name Highcharts.DateTimeFormatOptions#weekday\n* @type {'narrow'|'short'|'long'|undefined}\n*/ /**\n* The representation of the era.\n*\n* @name Highcharts.DateTimeFormatOptions#era\n* @type {'narrow'|'short'|'long'|undefined}\n*/ /**\n* The representation of the year.\n*\n* @name Highcharts.DateTimeFormatOptions#year\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the month.\n* \"narrow\", \"short\", \"long\".\n*\n* @name Highcharts.DateTimeFormatOptions#month\n* @type {'numeric'|'2-digit'|'narrow'|'short'|'long'|undefined}\n*/ /**\n* The representation of the day.\n*\n* @name Highcharts.DateTimeFormatOptions#day\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the hour.\n*\n* @name Highcharts.DateTimeFormatOptions#hour\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the minute.\n*\n* @name Highcharts.DateTimeFormatOptions#minute\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The representation of the second.\n*\n* @name Highcharts.DateTimeFormatOptions#second\n* @type {'numeric'|'2-digit'|undefined}\n*/ /**\n* The number of fractional digits to use. 3 means milliseconds.\n*\n* @name Highcharts.DateTimeFormatOptions#fractionalSecondDigits\n* @type {1|2|3|undefined}\n*/ /**\n* The representation of the time zone name.\n*\n* @name Highcharts.DateTimeFormatOptions#timeZoneName\n* @type {'short'|'long'|undefined}\n*/ /**\n* A prefix for the time string. Custom Highcharts option.\n*\n* @name Highcharts.DateTimeFormatOptions#prefix\n* @type {'string'|undefined}\n*/ /**\n* A suffix for the time string. Custom Highcharts option.\n*\n* @name Highcharts.DateTimeFormatOptions#suffix\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 TimeBase from '../Shared/TimeBase.js';\nimport { defined, extend } from '../Shared/Utilities.js';\nimport { timeUnits } from './Utilities.js';\n/* *\n *\n * Constants\n *\n * */\nclass Time extends TimeBase {\n getBoundaryTicks(tickPositions, unitRange, visibleMin, visibleMax) {\n const boundaryTicks = {};\n // No boundary ticks for year range.\n if (unitRange === timeUnits.year) {\n return boundaryTicks;\n }\n const hasVisibleRange = defined(visibleMin) && defined(visibleMax), needsHourBoundary = unitRange < timeUnits.hour, needsDayBoundary = unitRange < timeUnits.day, needsMonthBoundary = unitRange < timeUnits.month, tickAlignment = (unitRange >= timeUnits.hour ?\n 900000 : unitRange >= timeUnits.minute ?\n 60000 : unitRange >= timeUnits.second ?\n 1000 : false);\n // Handle boundary ticks. Use a reasonable dropout threshold\n // to prevent looping over dense data grouping (#6156).\n if (tickPositions.length < 10000) {\n let isFirstVisibleTick = true;\n for (let i = 0; i < tickPositions.length; i++) {\n const t = tickPositions[i];\n // Loop only over visible ticks.\n if (hasVisibleRange) {\n if (t < visibleMin) {\n continue;\n }\n if (t > visibleMax) {\n break;\n }\n }\n // Mark first visible tick as boundary, if timeUnit is month or\n // hour.\n if (isFirstVisibleTick) {\n if (unitRange === timeUnits.month) {\n boundaryTicks[t] = 'year';\n isFirstVisibleTick = false;\n continue;\n }\n if (unitRange === timeUnits.hour) {\n boundaryTicks[t] = 'day';\n isFirstVisibleTick = false;\n continue;\n }\n }\n // Skip misaligned ticks to save performance.\n if (tickAlignment && t % tickAlignment !== 0) {\n isFirstVisibleTick = false;\n continue;\n }\n const [, // Unused 'year' var\n month, day, hours, minutes, seconds, milliseconds] = this.toParts(t);\n const isMidnight = !hours && !minutes && !seconds && !milliseconds;\n if (needsHourBoundary && minutes === 0) {\n boundaryTicks[t] = 'hour';\n }\n if (needsDayBoundary && isMidnight) {\n boundaryTicks[t] = 'day';\n }\n if (needsMonthBoundary && day === 1 && isMidnight) {\n boundaryTicks[t] = 'month';\n }\n if (month === 0 && day === 1 && isMidnight) {\n boundaryTicks[t] = 'year';\n }\n isFirstVisibleTick = false;\n }\n }\n return boundaryTicks;\n }\n /**\n * Return an array with time positions distributed on round time values\n * right and right after min and max. Used in datetime axes as well as for\n * grouping data on a datetime axis.\n *\n * @function Highcharts.Time#getTimeTicks\n *\n * @param {Highcharts.TimeNormalizedObject} normalizedInterval\n * The interval in axis values (ms) and the count\n *\n * @param {number} [min]\n * The minimum in axis values\n *\n * @param {number} [max]\n * The maximum in axis values\n *\n * @param {number} [startOfWeek=1]\n *\n * @return {Highcharts.AxisTickPositionsArray}\n * Time positions\n */\n getTimeTicks(normalizedInterval, min, max, startOfWeek) {\n const time = this, tickPositions = [], { count = 1, unitRange } = normalizedInterval, visibleMin = min, visibleMax = max;\n let [year, month, dayOfMonth, hours, minutes, seconds] = time.toParts(min), milliseconds = (min || 0) % 1000, variableDayLength;\n startOfWeek ?? (startOfWeek = 1);\n if (defined(min)) { // #1300\n milliseconds = unitRange >= timeUnits.second ?\n 0 : // #3935\n count * Math.floor(milliseconds / count);\n if (unitRange >= timeUnits.second) { // Second\n seconds = unitRange >= timeUnits.minute ?\n 0 : // #3935\n count * Math.floor(seconds / count);\n }\n if (unitRange >= timeUnits.minute) { // Minute\n minutes = unitRange >= timeUnits.hour ?\n 0 :\n count * Math.floor(minutes / count);\n }\n if (unitRange >= timeUnits.hour) { // Hour\n hours = unitRange >= timeUnits.day ?\n 0 :\n count * Math.floor(hours / count);\n }\n if (unitRange >= timeUnits.day) { // Day\n dayOfMonth = unitRange >= timeUnits.month ?\n 1 :\n Math.max(1, count * Math.floor(dayOfMonth / count));\n }\n if (unitRange >= timeUnits.month) { // Month\n month = unitRange >= timeUnits.year ? 0 :\n count * Math.floor(month / count);\n }\n if (unitRange >= timeUnits.year) { // Year\n year -= year % count;\n }\n // Week is a special case that runs outside the hierarchy\n if (unitRange === timeUnits.week) {\n if (count) {\n min = time.makeTime(year, month, dayOfMonth, hours, minutes, seconds, milliseconds);\n }\n // Get start of current week, independent of count\n const weekday = this.dateTimeFormat({\n timeZone: this.timezone,\n weekday: 'narrow'\n }, min, 'es'), \n // Spanish weekday index\n weekdayNo = 'DLMXJVS'.indexOf(weekday);\n dayOfMonth += -weekdayNo + startOfWeek +\n // We don't want to skip days that are before\n // startOfWeek (#7051)\n (weekdayNo < startOfWeek ? -7 : 0);\n }\n min = time.makeTime(year, month, dayOfMonth, hours, minutes, seconds, milliseconds);\n // Handle local timezone offset\n if (time.variableTimezone && defined(max)) {\n // Detect whether we need to take the DST crossover into\n // consideration. If we're crossing over DST, the day length may\n // be 23h or 25h and we need to compute the exact clock time for\n // each tick instead of just adding hours. This comes at a cost,\n // so first we find out if it is needed (#4951).\n variableDayLength = (\n // Long range, assume we're crossing over.\n max - min > 4 * timeUnits.month ||\n // Short range, check if min and max are in different time\n // zones.\n time.getTimezoneOffset(min) !==\n time.getTimezoneOffset(max));\n }\n // Iterate and add tick positions at appropriate values\n let t = min, i = 1;\n while (t < max) {\n tickPositions.push(t);\n // Increase the years\n if (unitRange === timeUnits.year) {\n t = time.makeTime(year + i * count, 0);\n // Increase the months\n }\n else if (unitRange === timeUnits.month) {\n t = time.makeTime(year, month + i * count);\n // If we're using local time, the interval is not fixed as it\n // jumps one hour at the DST crossover\n }\n else if (variableDayLength && (unitRange === timeUnits.day ||\n unitRange === timeUnits.week)) {\n t = time.makeTime(year, month, dayOfMonth +\n i * count * (unitRange === timeUnits.day ? 1 : 7));\n }\n else if (variableDayLength &&\n unitRange === timeUnits.hour &&\n count > 1) {\n // Make sure boundary ticks are preserved across DST (#6797,\n // #7621)\n t = time.makeTime(year, month, dayOfMonth, hours + i * count);\n // Else, the interval is fixed and we use simple addition\n }\n else {\n t += unitRange * count;\n }\n i++;\n }\n // Push the last time\n tickPositions.push(t);\n }\n tickPositions.info = extend(normalizedInterval, {\n boundaryTicks: this.getBoundaryTicks(tickPositions, unitRange, visibleMin, visibleMax),\n totalRange: unitRange * count\n });\n return tickPositions;\n }\n}\n/* *\n *\n * Default export\n *\n * */\nexport default Time;\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 ChartDefaults from './Chart/ChartDefaults.js';\nimport H from './Globals.js';\nconst { isTouchDevice } = H;\nimport PaletteDefaults from './Color/PaletteDefaults.js';\nimport Time from './Time.js';\nimport { fireEvent, merge } from '../Shared/Utilities.js';\n/* *\n *\n * API Options\n *\n * */\n/**\n * Global default settings.\n *\n * @name Highcharts.defaultOptions\n * @type {Highcharts.Options}\n */ /**\n* @optionparent\n* @internal\n*/\nconst defaultOptions = {\n palette: PaletteDefaults,\n /**\n * An array containing the default colors for the chart's series. When\n * all colors are used, new colors are pulled from the start again.\n *\n * Default colors can also be set on a series or series.type basis,\n * see [column.colors](#plotOptions.column.colors),\n * [pie.colors](#plotOptions.pie.colors).\n *\n * In styled mode, the colors option doesn't exist. Instead, colors\n * are defined in CSS and applied either through series or point class\n * names, or through the [chart.colorCount](#chart.colorCount) option.\n *\n * The defaults from v13 invoke CSS variables that are set by the\n * `palette` option's light and dark themes.\n *\n * @sample {highcharts} highcharts/chart/colors/\n * Assign a global color theme\n * @sample highcharts/members/theme-v10/\n * Latest release styled like version 10\n *\n * @type {Array<Highcharts.ColorType>}\n * @default [\n * 'var(--highcharts-color-0)',\n * 'var(--highcharts-color-1)',\n * 'var(--highcharts-color-2)',\n * 'var(--highcharts-color-3)',\n * 'var(--highcharts-color-4)',\n * 'var(--highcharts-color-5)',\n * 'var(--highcharts-color-6)',\n * 'var(--highcharts-color-7)',\n * 'var(--highcharts-color-8)',\n * 'var(--highcharts-color-9)'\n * ]\n */\n colors: new Array(10).fill(1).map((_, i) => `var(--highcharts-color-${i})`),\n /**\n * Options for one or many chart-level data tables. The `dataTable` option,\n * or its array members, can be either configuration objects or instances of\n * the `DataTable` class. If a `DataTable` instance is passed, it\n * will be used directly. If a configuration object is passed, a new\n * `DataTable` instance will be created based on the provided\n * configuration.\n *\n * The data table is mapped to the series data points based on the\n * [series.dataMapping](#plotOptions.series.dataMapping) option, unless the\n * column keys match the point property names (`x`, `y` etc.), in which case\n * the mapping is automatic.\n *\n * @sample {highstock} stock/datatable/candlestick\n * Candlestick chart with data table\n * @sample {highstock} stock/datatable/live-candlestick\n * Live candlestick\n * @sample {highmaps} maps/datatable/chart-datatable\n * Map with data table and data mapping\n * @sample {highmaps} maps/demo/basic-map\n * World map\n * @sample {gantt} gantt/datatable/chart-datatable\n * Gantt chart with data table\n *\n * @sample highcharts/datatable/chart-datatable-single/\n * Chart with one data table as option\n * @sample highcharts/datatable/chart-datatable-single/\n * Chart with one data table as instance\n * @sample highcharts/datatable/chart-datatable-multiple/\n * Chart with two data tables\n * @sample highcharts/data/getdatatable\n * Data table from CSV\n *\n * @type {Highcharts.DataTable|Highcharts.DataTableOptionsObject|Array<Highcharts.DataTable|Highcharts.DataTableOptionsObject>}\n * @since 13.0.0\n * @apioption dataTable\n */\n /**\n * Styled mode only. Configuration object for adding SVG definitions for\n * reusable elements. See [gradients, shadows and\n * patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns)\n * for more information and code examples.\n *\n * @type {*}\n * @since 5.0.0\n * @apioption defs\n */\n /**\n * @ignore-option\n */\n symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n /**\n * An object containing language-related strings and settings. A typical\n * setup uses `Highcharts.setOptions` to make the options apply to all\n * charts in the same page.\n *\n * Some language options, like `months` and `weekdays`, are only used\n * with non-locale-aware date formats.\n *\n * ```js\n * Highcharts.setOptions({\n * lang: {\n * locale: 'fr'\n * }\n * });\n * ```\n *\n * @optionparent lang\n */\n lang: {\n weekFrom: 'week from',\n /**\n * The default chart title.\n *\n * @since 12.2.0\n */\n chartTitle: 'Chart title',\n /**\n * The browser locale to use for date and number formatting. The actual\n * locale used for each chart is determined in three steps:\n * 1. If this `lang.locale` option is specified, it is used.\n * 2. Else, look for the closest ancestor HTML element with a `lang`\n * attribute, typically the `<html>` element.\n * 3. If no 'lang' attribute is found, use the default browser locale.\n *\n * Use `en-GB`, British English, for approximate consistency with\n * Highcharts v < 12.\n *\n * @sample highcharts/lang/locale/\n * Set the locale using the `lang.locale` option\n * @sample highcharts/lang/locale-attribute/\n * Pick up the locale from the HTML `lang` attribute\n * @sample highcharts/members/highcharts-numberformat\n * Arabic locale with digits and dates *\n *\n * @since 12.0.0\n * @type {string|Array<string>}\n */\n locale: void 0,\n /**\n * The loading text that appears when the chart is set into the loading\n * state following a call to `chart.showLoading`.\n */\n loading: 'Loading...',\n /**\n * An array containing the months names. Corresponds to the `%B` format\n * in `Highcharts.dateFormat()`. Defaults to 'undefined',\n * meaning the default month names are used according to the\n * `lang.locale` or browser settings.\n *\n * @type {Array<string>}\n */\n months: void 0,\n /**\n * [Format string](https://www.highcharts.com/docs/chart-concepts/templating) for the default series name.\n *\n * @since 12.2.0\n */\n seriesName: 'Series {add index 1}',\n /**\n * An array containing the months names in abbreviated form. Corresponds\n * to the `%b` format in `Highcharts.dateFormat()`. Defaults to\n * 'undefined', meaning the default short month names are used according\n * to the `lang.locale` or browser settings.\n *\n * @type {Array<string>}\n */\n shortMonths: void 0,\n /**\n * An array containing the weekday names. Corresponds\n * to the `%A` format in `Highcharts.dateFormat()`. Defaults to\n * 'undefined', meaning the default weekday names are used according to\n * the `lang.locale` or browser settings.\n *\n * @type {Array<string>}\n */\n weekdays: void 0,\n /**\n * Short week days, starting Sunday. Corresponds to the `%a` format in\n * `Highcharts.dateFormat()`. Defaults to 'undefined', meaning\n * the default short weekday names are used according to the\n * `lang.locale` or browser settings.\n *\n * @sample highcharts/lang/shortweekdays/\n * Finnish two-letter abbreviations\n *\n * @type {Array<string>}\n * @since 4.2.4\n * @apioption lang.shortWeekdays\n */\n /**\n * What to show in a date field for invalid dates. Defaults to an empty\n * string.\n *\n * @type {string}\n * @since 4.1.8\n * @product highcharts highstock\n * @apioption lang.invalidDate\n */\n /**\n * The title appearing on hovering the zoom in button. The text itself\n * defaults to \"+\" and can be changed in the button options.\n *\n * @type {string}\n * @default Zoom in\n * @product highmaps\n * @apioption lang.zoomIn\n */\n /**\n * The title appearing on hovering the zoom out button. The text itself\n * defaults to \"-\" and can be changed in the button options.\n *\n * @type {string}\n * @default Zoom out\n * @product highmaps\n * @apioption lang.zoomOut\n */\n /**\n * The default decimal point used in the `Highcharts.numberFormat`\n * method unless otherwise specified in the function arguments. Defaults\n * to the locale decimal point as determined by `lang.locale`.\n *\n * @type {string}\n * @default undefined\n * @since 1.2.2\n * @apioption lang.decimalPoint\n */\n /**\n * [Metric prefixes](https://en.wikipedia.org/wiki/Metric_prefix) used\n * to shorten high numbers in axis labels. Replacing any of the\n * positions with `null` causes the full number to be written. Setting\n * `numericSymbols` to `undefined` disables shortening altogether.\n *\n * @sample {highcharts} highcharts/lang/numericsymbols/\n * Replacing the symbols with text\n * @sample {highstock} highcharts/lang/numericsymbols/\n * Replacing the symbols with text\n *\n * @type {Array<string>}\n * @default [\"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n * @since 2.3.0\n */\n numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'],\n /**\n * The default name for a pie slice (point).\n * @since 12.2.0\n */\n pieSliceName: 'Slice',\n /**\n * The magnitude of [numericSymbols](#lang.numericSymbol) replacements.\n * Use 10000 for Japanese, Korean and various Chinese locales, which\n * use symbols for 10^4, 10^8 and 10^12.\n *\n * @sample highcharts/lang/numericsymbolmagnitude/\n * 10000 magnitude for Japanese\n *\n * @type {number}\n * @default 1000\n * @since 5.0.3\n * @apioption lang.numericSymbolMagnitude\n */\n /**\n * The default thousands separator used in the `Highcharts.numberFormat`\n * method unless otherwise specified in the function arguments. Defaults\n * to the locale thousands separator as determined by `lang.locale`.\n *\n * @type {string}\n * @default undefined\n * @since 1.2.2\n * @apioption lang.thousandsSep\n */\n /**\n * The text for the label appearing when a chart is zoomed.\n *\n * @since 1.2.4\n */\n resetZoom: 'Reset zoom',\n /**\n * The default title of the Y axis\n *\n * @since 12.2.0\n */\n yAxisTitle: 'Values',\n /**\n * The tooltip title for the label appearing when a chart is zoomed.\n *\n * @since 1.2.4\n */\n resetZoomTitle: 'Reset zoom level 1:1'\n },\n /**\n * Global options that don't apply to each chart. These options must be set\n * using the `Highcharts.setOptions` method.\n *\n * ```js\n * Highcharts.setOptions({\n * global: {\n * buttonTheme: {\n * fill: '#d0d0d0'\n * }\n * }\n * });\n * ```\n */\n global: {\n /**\n * General theme for buttons. This applies to the zoom button, exporting\n * context menu, map navigation, range selector buttons and custom\n * buttons generated using the `SVGRenderer.button` function. However,\n * each of these may be overridden with more specific options.\n *\n * @sample highcharts/global/buttontheme\n * General button theme\n * @since 11.4.2\n */\n buttonTheme: {\n /**\n * The fill color for buttons\n */\n fill: 'var(--highcharts-neutral-color-3)',\n /**\n * The padding of buttons\n */\n padding: 8,\n /**\n * The border radius for buttons\n */\n r: 2,\n /**\n * The stroke color for buttons\n */\n stroke: 'var(--highcharts-neutral-color-20)',\n /**\n * The stroke width for buttons\n */\n 'stroke-width': 1,\n /**\n * CSS styling for the buttons' text\n */\n style: {\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-80)',\n cursor: 'pointer',\n fontSize: '0.8em',\n fontWeight: 'normal'\n },\n /**\n * State overrides for the buttons\n */\n states: {\n /**\n * Hover state overrides for the buttons are applied in addition\n * to the normal state options\n */\n hover: {\n fill: 'var(--highcharts-neutral-color-10)'\n },\n /**\n * Select state overrides for the buttons are applied in\n * addition to the normal state options\n */\n select: {\n /**\n * @type {Highcharts.ColorType}\n */\n fill: 'var(--highcharts-highlight-color-10)',\n style: {\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-100)',\n fontWeight: 'bold'\n }\n },\n /**\n * Disabled state overrides for the buttons are applied in\n * addition to the normal state options\n */\n disabled: {\n /**\n * Disabled state CSS style overrides for the buttons' text\n */\n style: {\n color: 'var(--highcharts-neutral-color-20)'\n }\n }\n }\n }\n },\n /**\n * Time options that can apply globally or to individual charts. These\n * settings affect how `datetime` axes are laid out, how tooltips are\n * formatted, how series\n * [pointIntervalUnit](#plotOptions.series.pointIntervalUnit) works and how\n * the Highcharts Stock range selector handles time.\n *\n * The common use case is that all charts in the same Highcharts object\n * share the same time settings, in which case the global settings are set\n * using `setOptions`.\n *\n * ```js\n * // Apply time settings globally\n * Highcharts.setOptions({\n * time: {\n * timezone: 'Europe/London'\n * }\n * });\n * // Apply time settings by instance\n * const chart = Highcharts.chart('container', {\n * time: {\n * timezone: 'America/New_York'\n * },\n * series: [{\n * data: [1, 4, 3, 5]\n * }]\n * });\n *\n * // Use the Time object\n * console.log(\n * 'Current time in New York',\n * chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n * );\n * ```\n *\n * Since v6.0.5, the time options were moved from the `global` object to the\n * `time` object, and time options can be set on each individual chart.\n *\n * @sample {highcharts|highstock}\n * highcharts/time/timezone/\n * Set the timezone globally\n * @sample {highcharts}\n * highcharts/time/individual/\n * Set the timezone per chart instance\n * @sample {highstock}\n * stock/time/individual/\n * Set the timezone per chart instance\n *\n * @since 6.0.5\n * @optionparent time\n */\n time: {\n /**\n * A custom `Date` class for advanced date handling. For example,\n * [JDate](https://github.com/tahajahangir/jdate) can be hooked in to\n * handle Jalali dates.\n *\n * @type {*}\n * @since 4.0.4\n * @product highcharts highstock gantt\n */\n Date: void 0,\n /**\n * A named time zone. Supported time zone names rely on the browser\n * implementations, as described in the [mdn\n * docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#timezone).\n * If the given time zone is not recognized by the browser, Highcharts\n * provides a warning and falls back to returning a 0 offset,\n * corresponding to the UTC time zone.\n *\n * The time zone affects axis scaling, tickmark placement and\n * time display in `Highcharts.dateFormat`.\n *\n * Setting `timezone` to `undefined` falls back to the default browser\n * timezone setting.\n *\n * Until v11.2.0, this option depended on moment.js.\n *\n * @sample {highcharts|highstock} highcharts/time/timezone/ Europe/Oslo\n *\n * @type {string}\n * @since 5.0.7\n * @product highcharts highstock gantt\n */\n timezone: 'UTC',\n /**\n * The timezone offset in minutes. Positive values are west, negative\n * values are east of UTC, as in the ECMAScript\n * [getTimezoneOffset](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)\n * method. Use this to display UTC based data in a predefined time zone.\n *\n * This option is deprecated as of v11.4.1 and will be removed in a\n * future release. Use the [time.timezone](#time.timezone) option\n * instead.\n *\n * @see [time.getTimezoneOffset](#time.getTimezoneOffset)\n *\n * @sample {highcharts|highstock} highcharts/time/timezoneoffset/\n * Timezone offset\n *\n * @since 3.0.8\n * @deprecated 11.4.2\n * @product highcharts highstock gantt\n */\n timezoneOffset: 0,\n /**\n * Whether to use UTC time for axis scaling, tickmark placement and\n * time display in `Highcharts.dateFormat`. Advantages of using UTC\n * is that the time displays equally regardless of the user agent's\n * time zone settings. Local time can be used when the data is loaded\n * in real time or when correct Daylight Saving Time transitions are\n * required.\n *\n * Setting `useUTC` to true is equivalent to setting `time.timezone` to\n * `\"UTC\"`. Setting `useUTC` to false is equivalent to setting\n * `time.timezone` to `undefined`.\n *\n * @see [timezone](#time.timezone)\n *\n * @sample {highcharts} highcharts/time/useutc-true/\n * True by default\n * @sample {highcharts} highcharts/time/useutc-false/\n * False\n *\n * @deprecated 12.0.0\n */\n useUTC: void 0\n },\n chart: ChartDefaults,\n /**\n * The chart's main title.\n *\n * @sample {highmaps} maps/title/title/\n * Title options demonstrated\n * @sample {highcharts} highcharts/title/align-auto/\n * Default title alignment\n */\n title: {\n /**\n * When the title is floating, the plot area will not move to make space\n * for it.\n *\n * @sample {highcharts} highcharts/chart/zoomtype-none/\n * False by default\n * @sample {highcharts} highcharts/title/floating/\n * True - title on top of the plot area\n * @sample {highstock} stock/chart/title-floating/\n * True - title on top of the plot area\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @apioption title.floating\n */\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the text.\n *\n * @type {boolean}\n * @default false\n * @apioption title.useHTML\n */\n /**\n * The vertical alignment of the title. Can be one of `\"top\"`,\n * `\"middle\"` and `\"bottom\"`. When a value is given, the title behaves\n * as if [floating](#title.floating) were `true`.\n *\n * @sample {highcharts} highcharts/title/verticalalign/\n * Chart title in bottom right corner\n * @sample {highstock} stock/chart/title-verticalalign/\n * Chart title in bottom right corner\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.1\n * @apioption title.verticalAlign\n */\n /**\n * The x position of the title relative to the alignment within\n * `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @sample {highcharts} highcharts/title/align/\n * Aligned to the plot area (x = 70px = margin left - spacing\n * left)\n * @sample {highstock} stock/chart/title-align/\n * Aligned to the plot area (x = 50px = margin left - spacing\n * left)\n *\n * @type {number}\n * @default 0\n * @since 2.0\n * @apioption title.x\n */\n /**\n * The y position of the title relative to the alignment within\n * [chart.spacingTop](#chart.spacingTop) and [chart.spacingBottom](\n * #chart.spacingBottom). By default it depends on the font size.\n *\n * @sample {highcharts} highcharts/title/y/\n * Title inside the plot area\n * @sample {highstock} stock/chart/title-verticalalign/\n * Chart title in bottom right corner\n *\n * @type {number}\n * @since 2.0\n * @apioption title.y\n */\n /**\n * CSS styles for the title. Use this for font styling, but use `align`,\n * `x` and `y` for text alignment.\n *\n * Note that the default [title.minScale](#title.minScale) option also\n * affects the rendered font size. In order to keep the font size fixed\n * regardless of title length, set `minScale` to 1.\n *\n * In styled mode, the title style is given in the `.highcharts-title`\n * class.\n *\n * @sample {highcharts} highcharts/title/style/\n * Custom color and weight\n * @sample {highstock} stock/chart/title-style/\n * Custom color and weight\n * @sample highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {highcharts|highmaps} { \"color\": \"#333333\", \"fontSize\": \"18px\" }\n * @default {highstock} { \"color\": \"#333333\", \"fontSize\": \"16px\" }\n */\n style: {\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-80)',\n fontWeight: 'bold'\n },\n /**\n * The title of the chart. To disable the title, set the `text` to\n * `undefined`.\n *\n * @sample {highcharts} highcharts/title/text/\n * Custom title\n * @sample {highstock} stock/chart/title-text/\n * Custom title\n *\n * @default {highcharts|highmaps} Chart title\n * @default {highstock} undefined\n */\n text: 'Chart title',\n /**\n * The horizontal alignment of the title. Can be one of \"left\", \"center\"\n * and \"right\".\n *\n * Since v12 it defaults to `undefined`, meaning the alignment is\n * computed for best fit. If the text fits in one line, it aligned to\n * the center, but if it is wrapped into multiple lines, it is aligned\n * to the left.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Default alignment, dynamic\n * @sample {highcharts} highcharts/title/align/\n * Aligned to the plot area (x = 70px = margin left - spacing\n * left)\n * @sample {highstock} stock/chart/title-align/\n * Aligned to the plot area (x = 50px = margin left - spacing\n * left)\n *\n * @type {Highcharts.AlignValue}\n * @default undefined\n * @since 2.0\n * @apioption title.align\n */\n /**\n * The margin between the title and the plot area, or if a subtitle\n * is present, the margin between the subtitle and the plot area.\n *\n * @sample {highcharts} highcharts/title/margin-50/\n * A chart title margin of 50\n * @sample {highcharts} highcharts/title/margin-subtitle/\n * The same margin applied with a subtitle\n * @sample {highstock} stock/chart/title-margin/\n * A chart title margin of 50\n *\n * @since 2.1\n */\n margin: 15,\n /**\n * When the title is too wide to fit in the chart, the default behavior\n * is to scale it down to fit, or apply word wrap if it is scaled down\n * to `minScale` and still doesn't fit.\n *\n * The default value reflects the scale, when using default font sizes,\n * when the title font size matches that of the subtitle. The title\n * still stands out as it is bold by default.\n *\n * Set `minScale` to 1 to avoid downscaling.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Downscaling demonstrated\n *\n * @since 12.0.0\n */\n minScale: 0.67\n },\n /**\n * The chart's subtitle. This can be used both to display a subtitle below\n * the main title, and to display random text anywhere in the chart. The\n * subtitle can be updated after chart initialization through the\n * `Chart.setTitle` method.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Default title alignment\n * @sample {highmaps} maps/title/subtitle/\n * Subtitle options demonstrated\n */\n subtitle: {\n /**\n * The horizontal alignment of the subtitle. Can be one of \"left\",\n * \"center\" and \"right\". Since v12, it defaults to `undefined`, meaning\n * the actual alignment is inherited from the alignment of the main\n * title.\n *\n * @sample {highcharts} highcharts/title/align-auto/\n * Default title and subtitle alignment, dynamic\n * @sample {highcharts} highcharts/subtitle/align/\n * Footnote at right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at bottom right of plot area\n *\n * @type {Highcharts.AlignValue}\n * @default undefined\n * @since 2.0\n * @apioption subtitle.align\n */\n /**\n * When the subtitle is floating, the plot area will not move to make\n * space for it.\n *\n * @sample {highcharts} highcharts/subtitle/floating/\n * Floating title and subtitle\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote floating at bottom right of plot area\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @apioption subtitle.floating\n */\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the text.\n *\n * @type {boolean}\n * @default false\n * @apioption subtitle.useHTML\n */\n /**\n * The vertical alignment of the title. Can be one of `\"top\"`,\n * `\"middle\"` and `\"bottom\"`. When middle, the subtitle behaves as\n * floating.\n *\n * @sample {highcharts} highcharts/subtitle/verticalalign/\n * Footnote at the bottom right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at the bottom right of plot area\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.1\n * @apioption subtitle.verticalAlign\n */\n /**\n * The x position of the subtitle relative to the alignment within\n * `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @sample {highcharts} highcharts/subtitle/align/\n * Footnote at right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at the bottom right of plot area\n *\n * @type {number}\n * @default 0\n * @since 2.0\n * @apioption subtitle.x\n */\n /**\n * The y position of the subtitle relative to the alignment within\n * `chart.spacingTop` and `chart.spacingBottom`. By default the subtitle\n * is laid out below the title unless the title is floating.\n *\n * @sample {highcharts} highcharts/subtitle/verticalalign/\n * Footnote at the bottom right of plot area\n * @sample {highstock} stock/chart/subtitle-footnote\n * Footnote at the bottom right of plot area\n *\n * @type {number}\n * @since 2.0\n * @apioption subtitle.y\n */\n /**\n * CSS styles for the title.\n *\n * In styled mode, the subtitle style is given in the\n * `.highcharts-subtitle` class.\n *\n * @sample {highcharts} highcharts/subtitle/style/\n * Custom color and weight\n * @sample {highcharts} highcharts/css/titles/\n * Styled mode\n * @sample {highstock} stock/chart/subtitle-style\n * Custom color and weight\n * @sample {highstock} highcharts/css/titles/\n * Styled mode\n * @sample {highmaps} highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#666666\"}\n */\n style: {\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-60)',\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * The subtitle of the chart.\n *\n * @sample {highcharts|highstock} highcharts/subtitle/text/\n * Custom subtitle\n * @sample {highcharts|highstock} highcharts/subtitle/text-formatted/\n * Formatted and linked text.\n */\n text: ''\n },\n /**\n * The chart's caption, which will render below the chart and will be part\n * of exported charts. The caption can be updated after chart initialization\n * through the `Chart.update` or `Chart.caption.update` methods.\n *\n * @sample highcharts/caption/text/\n * A chart with a caption\n * @since 7.2.0\n */\n caption: {\n /**\n * When the caption is floating, the plot area will not move to make\n * space for it.\n *\n * @type {boolean}\n * @default false\n * @apioption caption.floating\n */\n /**\n * The margin between the caption and the plot area.\n */\n margin: 15,\n /**\n * Whether to\n * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the text.\n *\n * @type {boolean}\n * @default false\n * @apioption caption.useHTML\n */\n /**\n * The x position of the caption relative to the alignment within\n * `chart.spacingLeft` and `chart.spacingRight`.\n *\n * @type {number}\n * @default 0\n * @apioption caption.x\n */\n /**\n * The y position of the caption relative to the alignment within\n * `chart.spacingTop` and `chart.spacingBottom`.\n *\n * @type {number}\n * @apioption caption.y\n */\n /**\n * CSS styles for the caption.\n *\n * In styled mode, the caption style is given in the\n * `.highcharts-caption` class.\n *\n * @sample {highcharts} highcharts/css/titles/\n * Styled mode\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#666666\"}\n */\n style: {\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-60)',\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * The caption text of the chart.\n *\n * @sample {highcharts} highcharts/caption/text/\n * Custom caption\n */\n text: '',\n /**\n * The horizontal alignment of the caption. Can be one of \"left\",\n * \"center\" and \"right\".\n *\n * @type {Highcharts.AlignValue}\n */\n align: 'left',\n /**\n * The vertical alignment of the caption. Can be one of `\"top\"`,\n * `\"middle\"` and `\"bottom\"`. When middle, the caption behaves as\n * floating.\n *\n * @type {Highcharts.VerticalAlignValue}\n */\n verticalAlign: 'bottom'\n },\n /**\n * The plotOptions is a wrapper object for config objects for each series\n * type. The config objects for each series can also be overridden for\n * each series item as given in the series array.\n *\n * Configuration options for the series are given in three levels. Options\n * for all series in a chart are given in the [plotOptions.series](\n * #plotOptions.series) object. Then options for all series of a specific\n * type are given in the plotOptions of that type, for example\n * `plotOptions.line`. Next, options for one single series are given in\n * [the series array](#series).\n */\n plotOptions: {},\n /**\n * The legend is a box containing a symbol and name for each series\n * item or point item in the chart. Each series (or points in case\n * of pie charts) is represented by a symbol and its name in the legend.\n *\n * It is possible to override the symbol creator function and create\n * [custom legend symbols](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/studies/legend-custom-symbol/).\n *\n * @productdesc {highmaps}\n * A Highmaps legend by default contains one legend item per series, but if\n * a `colorAxis` is defined, the axis will be displayed in the legend.\n * Either as a gradient, or as multiple legend items for `dataClasses`.\n */\n legend: {\n /**\n * The background color of the legend.\n *\n * @see In styled mode, the legend background fill can be applied with\n * the `.highcharts-legend-box` class.\n *\n * @sample {highcharts} highcharts/legend/backgroundcolor/\n * Yellowish background\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {Highcharts.ColorType}\n * @apioption legend.backgroundColor\n */\n /**\n * The width of the drawn border around the legend.\n *\n * @see In styled mode, the legend border stroke width can be applied\n * with the `.highcharts-legend-box` class.\n *\n * @sample {highcharts} highcharts/legend/borderwidth/\n * 2px border width\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {number}\n * @default 0\n * @apioption legend.borderWidth\n */\n /**\n * Enable or disable the legend. There is also a series-specific option,\n * [showInLegend](#plotOptions.series.showInLegend), that can hide the\n * series from the legend. In some series types this is `false` by\n * default, so it must set to `true` in order to show the legend for the\n * series.\n *\n * @sample {highcharts} highcharts/legend/enabled-false/ Legend disabled\n * @sample {highstock} stock/legend/align/ Various legend options\n * @sample {highmaps} maps/legend/enabled-false/ Legend disabled\n *\n * @default {highstock} false\n * @default {highmaps} true\n * @default {gantt} false\n */\n enabled: true,\n /**\n * The horizontal alignment of the legend box within the chart area.\n * Valid values are `left`, `center` and `right`.\n *\n * In the case that the legend is aligned in a corner position, the\n * `layout` option will determine whether to place it above/below\n * or on the side of the plot area.\n *\n * @sample {highcharts} highcharts/legend/align/\n * Legend at the right of the chart\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/alignment/\n * Legend alignment\n *\n * @type {Highcharts.AlignValue}\n * @since 2.0\n */\n align: 'center',\n /**\n * If the [layout](legend.layout) is `horizontal` and the legend items\n * span over two lines or more, whether to align the items into vertical\n * columns. Setting this to `false` makes room for more items, but will\n * look more messy.\n *\n * @sample highcharts/legend/aligncolumns\n * Align columns\n *\n * @since 6.1.0\n */\n alignColumns: true,\n /**\n * A CSS class name to apply to the legend group.\n */\n className: 'highcharts-no-tooltip',\n /**\n * General event handlers for the legend. These event hooks can\n * also be attached to the legend at run time using the\n * `Highcharts.addEvent` function.\n *\n * @declare Highcharts.LegendEventsOptionsObject\n */\n events: {\n /**\n * Fires when the legend item belonging to the series is clicked.\n * One parameter, `event`, is passed to the function. The default\n * action is to toggle the visibility of the series, point or data\n * class. This can be prevented by returning `false` or calling\n * `event.preventDefault()`.\n *\n * @sample {highcharts} highcharts/legend/itemclick/\n * Confirm hiding and showing\n * @sample {highcharts} highcharts/legend/pie-legend-itemclick/\n * Confirm toggle visibility of pie slices\n *\n * @type {Highcharts.LegendItemClickCallbackFunction}\n * @context Highcharts.Legend\n * @apioption legend.events.itemClick\n */\n },\n /**\n * When the legend is floating, the plot area ignores it and is allowed\n * to be placed below it.\n *\n * @sample {highcharts} highcharts/legend/floating-false/\n * False by default\n * @sample {highcharts} highcharts/legend/floating-true/\n * True\n * @sample {highmaps} maps/legend/alignment/\n * Floating legend\n *\n * @type {boolean}\n * @default false\n * @since 2.1\n * @apioption legend.floating\n */\n /**\n * The layout of the legend items. Can be one of `horizontal` or\n * `vertical` or `proximate`. When `proximate`, the legend items will be\n * placed as close as possible to the graphs they're representing,\n * except in inverted charts or when the legend position doesn't allow\n * it.\n *\n * @sample {highcharts} highcharts/legend/layout-horizontal/\n * Horizontal by default\n * @sample {highcharts} highcharts/legend/layout-vertical/\n * Vertical\n * @sample highcharts/legend/layout-proximate\n * Labels proximate to the data\n * @sample {highstock} stock/legend/layout-horizontal/\n * Horizontal by default\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Vertical with data classes\n * @sample {highmaps} maps/legend/layout-vertical/\n * Vertical with color axis gradient\n *\n * @validvalue [\"horizontal\", \"vertical\", \"proximate\"]\n */\n layout: 'horizontal',\n /**\n * In a legend with horizontal layout, the itemDistance defines the\n * pixel distance between each item.\n *\n * @sample {highcharts} highcharts/legend/itemwidth-default/\n * 40px item distance\n * @sample {highstock} highcharts/legend/itemwidth-default/\n * 40px item distance\n *\n * @type {number}\n * @default {highcharts} 20\n * @default {highstock} 20\n * @default {highmaps} 8\n * @since 3.0.3\n * @apioption legend.itemDistance\n */\n /**\n * The pixel bottom margin for each legend item.\n *\n * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n *\n * @since 2.2.0\n */\n itemMarginBottom: 2,\n /**\n * The pixel top margin for each legend item.\n *\n * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n *\n * @since 2.2.0\n */\n itemMarginTop: 2,\n /**\n * The width for each legend item. By default the items are laid out\n * successively. In a [horizontal layout](legend.layout), if the items\n * are laid out across two rows or more, they will be vertically aligned\n * depending on the [legend.alignColumns](legend.alignColumns) option.\n *\n * @sample {highcharts} highcharts/legend/itemwidth-default/\n * Undefined by default\n * @sample {highcharts} highcharts/legend/itemwidth-80/\n * 80 for aligned legend items\n *\n * @type {number}\n * @since 2.0\n * @apioption legend.itemWidth\n */\n /**\n * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for each legend label. Available variables relates to properties on\n * the series, or the point in case of pies.\n *\n * @sample {highcharts} highcharts/legend/labelformat/\n * Add text\n *\n * @type {string}\n * @default {name}\n * @since 1.3\n * @apioption legend.labelFormat\n */\n /**\n * Callback function to format each of the series' labels. The `this`\n * keyword refers to the series object, or the point object in case of\n * pie charts. By default the series or point name is printed. Since\n * v12.5.0, the callback also receives `ctx` as the first argument, so\n * that arrow functions can access the same context as regular\n * functions using `this`.\n *\n * @productdesc {highmaps}\n * In Highmaps the context can also be a data class in case of a\n * `colorAxis`.\n *\n * @sample {highcharts} highcharts/legend/labelformatter/\n * Add text\n * @sample {highmaps} maps/legend/labelformatter/\n * Data classes with label formatter\n *\n * @type {Highcharts.FormatterCallbackFunction<Highcharts.Point|Highcharts.Series>}\n */\n labelFormatter: function () {\n // eslint-enable valid-jsdoc\n return this.name;\n },\n /**\n * Line height for the legend items. Deprecated as of 2.1\\. Instead,\n * the line height for each item can be set using\n * `itemStyle.lineHeight`, and the padding between items using\n * `itemMarginTop` and `itemMarginBottom`.\n *\n * @sample {highcharts} highcharts/legend/lineheight/\n * Setting padding\n *\n * @deprecated 2.1.0\n *\n * @type {number}\n * @default 16\n * @since 2.0\n * @product highcharts gantt\n * @apioption legend.lineHeight\n */\n /**\n * If the plot area sized is calculated automatically and the legend is\n * not floating, the legend margin is the space between the legend and\n * the axis labels or plot area.\n *\n * @sample {highcharts} highcharts/legend/margin-default/\n * 12 pixels by default\n * @sample {highcharts} highcharts/legend/margin-30/\n * 30 pixels\n *\n * @type {number}\n * @default 12\n * @since 2.1\n * @apioption legend.margin\n */\n /**\n * Maximum width for the legend. Can be a percentage of the chart width,\n * or an integer representing how many pixels wide the legend can be.\n *\n * @sample {highcharts} highcharts/legend/maxwidth/\n * Max width set to 7%\n *\n * @type {number|string}\n * @apioption legend.maxWidth\n */\n /**\n * Maximum pixel height for the legend. When the maximum height is\n * extended, navigation will show.\n *\n * @type {number}\n * @since 2.3.0\n * @apioption legend.maxHeight\n */\n /**\n * The color of the drawn border around the legend.\n *\n * @see In styled mode, the legend border stroke can be applied with the\n * `.highcharts-legend-box` class.\n *\n * @sample {highcharts} highcharts/legend/bordercolor/\n * Brown border\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {Highcharts.ColorType}\n */\n borderColor: 'var(--highcharts-neutral-color-40)',\n /**\n * The border corner radius of the legend.\n *\n * @sample {highcharts} highcharts/legend/borderradius-default/\n * Square by default\n * @sample {highcharts} highcharts/legend/borderradius-round/\n * 5px rounded\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n */\n borderRadius: 0,\n /**\n * Options for the paging or navigation appearing when the legend is\n * overflown. Navigation works well on screen, but not in static\n * exported images. One way of working around that is to\n * [increase the chart height in\n * export](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/legend/navigation-enabled-false/).\n *\n * @sample highcharts/legend/scrollable-vertical/\n * Legend with vertical scrollable extension\n * @sample highcharts/legend/scrollable-horizontal/\n * Legend with horizontal scrollable extension\n *\n */\n navigation: {\n /**\n * How to animate the pages when navigating up or down. A value of\n * `true` applies the default navigation given in the\n * `chart.animation` option. Additional options can be given as an\n * object containing values for easing and duration.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n * @default true\n * @since 2.2.4\n * @apioption legend.navigation.animation\n */\n /**\n * The pixel size of the up and down arrows in the legend paging\n * navigation.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {number}\n * @default 12\n * @since 2.2.4\n * @apioption legend.navigation.arrowSize\n */\n /**\n * Whether to enable the legend navigation. In most cases, disabling\n * the navigation results in an unwanted overflow.\n *\n * See also the\n * [adapt chart to legend](https://github.com/highcharts/adapt-chart-to-legend)\n * plugin for a solution to extend the chart height to make room for\n * the legend, optionally in exported charts only.\n *\n * @type {boolean}\n * @default true\n * @since 4.2.4\n * @apioption legend.navigation.enabled\n */\n /**\n * Text styles for the legend page navigation.\n *\n * @see In styled mode, the navigation items are styled with the\n * `.highcharts-legend-navigation` class.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {Highcharts.CSSObject}\n * @since 2.2.4\n * @apioption legend.navigation.style\n */\n style: {\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * The color for the active up or down arrow in the legend page\n * navigation.\n *\n * @see In styled mode, the active arrow be styled with the\n * `.highcharts-legend-nav-active` class.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {Highcharts.ColorType}\n * @since 2.2.4\n */\n activeColor: 'var(--highcharts-highlight-color-100)',\n /**\n * The color of the inactive up or down arrow in the legend page\n * navigation. .\n *\n * @see In styled mode, the inactive arrow be styled with the\n * `.highcharts-legend-nav-inactive` class.\n *\n * @sample {highcharts} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n * @sample {highstock} highcharts/legend/navigation/\n * Legend page navigation demonstrated\n *\n * @type {Highcharts.ColorType}\n * @since 2.2.4\n */\n inactiveColor: 'var(--highcharts-neutral-color-20)'\n },\n /**\n * The inner padding of the legend box.\n *\n * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n *\n * @type {number}\n * @default 8\n * @since 2.2.0\n * @apioption legend.padding\n */\n /**\n * Whether to reverse the order of the legend items compared to the\n * order of the series or points as defined in the configuration object.\n *\n * @see [yAxis.reversedStacks](#yAxis.reversedStacks),\n * [series.legendIndex](#series.legendIndex)\n *\n * @sample {highcharts} highcharts/legend/reversed/\n * Stacked bar with reversed legend\n *\n * @type {boolean}\n * @default false\n * @since 1.2.5\n * @apioption legend.reversed\n */\n /**\n * Whether to show the symbol on the right side of the text rather than\n * the left side. This is common in Arabic and Hebrew.\n *\n * @sample {highcharts} highcharts/legend/rtl/\n * Symbol to the right\n *\n * @type {boolean}\n * @default false\n * @since 2.2\n * @apioption legend.rtl\n */\n /**\n * CSS styles for the legend area. In the 1.x versions the position\n * of the legend area was determined by CSS. In 2.x, the position is\n * determined by properties like `align`, `verticalAlign`, `x` and `y`,\n * but the styles are still parsed for backwards compatibility.\n *\n * @deprecated 2.0.0\n *\n * @type {Highcharts.CSSObject}\n * @product highcharts highstock\n * @apioption legend.style\n */\n /**\n * CSS styles for each legend item. Only a subset of CSS is supported,\n * notably those options related to text. The default `textOverflow`\n * property makes long texts truncate. Set it to `undefined` to wrap\n * text instead. A `width` property can be added to control the text\n * width.\n *\n * @see In styled mode, the legend items can be styled with the\n * `.highcharts-legend-item` class.\n *\n * @sample {highcharts} highcharts/legend/itemstyle/\n * Bold black text\n * @sample {highmaps} maps/legend/itemstyle/\n * Item text styles\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#333333\", \"cursor\": \"pointer\", \"fontSize\": \"0.8em\", \"fontWeight\": \"bold\", \"textOverflow\": \"ellipsis\"}\n */\n itemStyle: {\n /**\n * @ignore\n */\n color: 'var(--highcharts-neutral-color-80)',\n /**\n * @ignore\n */\n cursor: 'pointer',\n /**\n * @ignore\n */\n fontSize: '0.8em',\n /**\n * @ignore\n */\n textDecoration: 'none',\n /**\n * @ignore\n */\n textOverflow: 'ellipsis'\n },\n /**\n * CSS styles for each legend item in hover mode. Only a subset of\n * CSS is supported, notably those options related to text. Properties\n * are inherited from `style` unless overridden here.\n *\n * @see In styled mode, the hovered legend items can be styled with\n * the `.highcharts-legend-item:hover` pseudo-class.\n *\n * @sample {highcharts} highcharts/legend/itemhoverstyle/\n * Red on hover\n * @sample {highmaps} maps/legend/itemstyle/\n * Item text styles\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#000000\"}\n */\n itemHoverStyle: {\n /**\n * @ignore\n */\n color: 'var(--highcharts-neutral-color-100)'\n },\n /**\n * CSS styles for each legend item when the corresponding series or\n * point is hidden. Only a subset of CSS is supported, notably those\n * options related to text. Properties are inherited from `style`\n * unless overridden here.\n *\n * @see In styled mode, the hidden legend items can be styled with\n * the `.highcharts-legend-item-hidden` class.\n *\n * @sample {highcharts} highcharts/legend/itemhiddenstyle/\n * Darker gray color\n *\n * @type {Highcharts.CSSObject}\n * @default {\"color\": \"#cccccc\"}\n */\n itemHiddenStyle: {\n /**\n * @ignore\n */\n color: 'var(--highcharts-neutral-color-60)',\n /**\n * @ignore\n */\n textDecoration: 'line-through'\n },\n /**\n * Whether to apply a drop shadow to the legend. A `backgroundColor`\n * also needs to be applied for this to take effect. The shadow can be\n * an object configuration containing `color`, `offsetX`, `offsetY`,\n * `opacity` and `width`.\n *\n * @sample {highcharts} highcharts/legend/shadow/\n * White background and drop shadow\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/border-background/\n * Border and background options\n *\n * @type {boolean|Highcharts.CSSObject}\n */\n shadow: false,\n /**\n * Default styling for the checkbox next to a legend item when\n * `showCheckbox` is true.\n *\n * @type {Highcharts.CSSObject}\n * @default {\"width\": \"13px\", \"height\": \"13px\", \"position\":\"absolute\"}\n */\n itemCheckboxStyle: {\n /**\n * @ignore\n */\n position: 'absolute',\n /**\n * @ignore\n */\n width: '13px', // For IE precision\n /**\n * @ignore\n */\n height: '13px'\n },\n /// itemWidth: undefined,\n /**\n * When this is true, the legend symbol width will be the same as\n * the symbol height, which in turn defaults to the font size of the\n * legend items.\n *\n * @since 5.0.0\n */\n squareSymbol: true,\n /**\n * The pixel height of the symbol for series types that use a rectangle\n * in the legend. Defaults to the font size of legend items.\n *\n * Note: This option is a default source of color axis height, if the\n * [colorAxis.height](https://api.highcharts.com/highcharts/colorAxis.height)\n * option is not set.\n *\n * @productdesc {highmaps}\n * In Highmaps, when the symbol is the gradient of a vertical color\n * axis, the height defaults to 200.\n *\n * @sample {highmaps} maps/legend/layout-vertical-sized/\n * Sized vertical gradient\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * No distance between data classes\n *\n * @type {number}\n * @since 3.0.8\n * @apioption legend.symbolHeight\n */\n /**\n * The border radius of the symbol for series types that use a rectangle\n * in the legend. Defaults to half the `symbolHeight`, effectively\n * creating a circle.\n *\n * For color axis scales, it defaults to 3.\n *\n * @sample {highcharts} highcharts/legend/symbolradius/\n * Round symbols\n * @sample {highstock} highcharts/legend/symbolradius/\n * Round symbols\n * @sample {highmaps} highcharts/legend/symbolradius/\n * Round symbols\n *\n * @type {number}\n * @since 3.0.8\n * @apioption legend.symbolRadius\n */\n /**\n * The pixel width of the legend item symbol. When the `squareSymbol`\n * option is set, this defaults to the `symbolHeight`, otherwise 16.\n *\n * Note: This option is a default source of color axis width, if the\n * [colorAxis.width](https://api.highcharts.com/highcharts/colorAxis.width)\n * option is not set.\n *\n * @productdesc {highmaps}\n * In Highmaps, when the symbol is the gradient of a horizontal color\n * axis, the width defaults to 200.\n *\n * @sample {highcharts} highcharts/legend/symbolwidth/\n * Greater symbol width and padding\n * @sample {highmaps} maps/legend/padding-itemmargin/\n * Padding and item margins demonstrated\n * @sample {highmaps} maps/legend/layout-vertical-sized/\n * Sized vertical gradient\n *\n * @type {number}\n * @apioption legend.symbolWidth\n */\n /**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the legend item texts.\n *\n * Prior to 4.1.7, when using HTML, [legend.navigation](\n * #legend.navigation) was disabled.\n *\n * @sample highcharts/legend/scrollable-vertical/\n * Legend with vertical scrollable extension\n * @sample highcharts/legend/scrollable-horizontal/\n * Legend with horizontal scrollable extension\n *\n * @type {boolean}\n * @default false\n * @apioption legend.useHTML\n */\n /**\n * For a color axis with data classes, how many decimals to render in\n * the legend. The default preserves the decimals of the range numbers.\n *\n * @type {number}\n * @default -1\n * @product highcharts highmaps\n * @apioption legend.valueDecimals\n */\n /**\n * For a color axis with data classes, a suffix for the range numbers in\n * the legend.\n *\n * @type {string}\n * @default ''\n * @product highcharts highmaps\n * @apioption legend.valueSuffix\n */\n /**\n * The width of the legend box. If a number is set, it translates to\n * pixels. Since v7.0.2 it allows setting a percent string of the full\n * chart width, for example `40%`.\n *\n * Defaults to the full chart width for legends below or above the\n * chart, half the chart width for legends to the left and right.\n *\n * @sample {highcharts} highcharts/legend/width/\n * Aligned to the plot area\n * @sample {highcharts} highcharts/legend/width-percent/\n * A percent of the chart width\n *\n * @type {number|string}\n * @since 2.0\n * @apioption legend.width\n */\n /**\n * The pixel padding between the legend item symbol and the legend\n * item text.\n *\n * @sample {highcharts} highcharts/legend/symbolpadding/\n * Greater symbol width and padding\n */\n symbolPadding: 5,\n /**\n * The vertical alignment of the legend box. Can be one of `top`,\n * `middle` or `bottom`. Vertical position can be further determined\n * by the `y` option.\n *\n * In the case that the legend is aligned in a corner position, the\n * `layout` option will determine whether to place it above/below\n * or on the side of the plot area.\n *\n * When the [layout](#legend.layout) option is `proximate`, the\n * `verticalAlign` option doesn't apply.\n *\n * @sample {highcharts} highcharts/legend/verticalalign/\n * Legend 100px from the top of the chart\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/alignment/\n * Legend alignment\n *\n * @type {Highcharts.VerticalAlignValue}\n * @since 2.0\n */\n verticalAlign: 'bottom',\n // Width: undefined,\n /**\n * The x offset of the legend relative to its horizontal alignment\n * `align` within chart.spacingLeft and chart.spacingRight. Negative\n * x moves it to the left, positive x moves it to the right.\n *\n * @sample {highcharts} highcharts/legend/width/\n * Aligned to the plot area\n *\n * @since 2.0\n */\n x: 0,\n /**\n * The vertical offset of the legend relative to it's vertical alignment\n * `verticalAlign` within chart.spacingTop and chart.spacingBottom.\n * Negative y moves it up, positive y moves it down.\n *\n * @sample {highcharts} highcharts/legend/verticalalign/\n * Legend 100px from the top of the chart\n * @sample {highstock} stock/legend/align/\n * Various legend options\n * @sample {highmaps} maps/legend/alignment/\n * Legend alignment\n *\n * @since 2.0\n */\n y: 0,\n /**\n * A title to be added on top of the legend.\n *\n * @sample {highcharts} highcharts/legend/title/\n * Legend title\n * @sample {highmaps} maps/legend/alignment/\n * Legend with title\n *\n * @since 3.0\n */\n title: {\n /**\n * A text or HTML string for the title.\n *\n * @type {string}\n * @since 3.0\n * @apioption legend.title.text\n */\n /**\n * Generic CSS styles for the legend title.\n *\n * @see In styled mode, the legend title is styled with the\n * `.highcharts-legend-title` class.\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontSize\": \"0.8em\", \"fontWeight\": \"bold\"}\n * @since 3.0\n */\n style: {\n /**\n * @ignore\n */\n color: 'var(--highcharts-neutral-color-80)',\n /**\n * @ignore\n */\n fontSize: '0.8em',\n /**\n * @ignore\n */\n fontWeight: 'bold'\n }\n }\n },\n /**\n * The loading options control the appearance of the loading screen\n * that covers the plot area on chart operations. This screen only\n * appears after an explicit call to `chart.showLoading()`. It is a\n * utility for developers to communicate to the end user that something\n * is going on, for example while retrieving new data via an XHR connection.\n * The \"Loading...\" text itself is not part of this configuration\n * object, but part of the `lang` object.\n */\n loading: {\n /**\n * The duration in milliseconds of the fade out effect.\n *\n * @sample highcharts/loading/hideduration/\n * Fade in and out over a second\n *\n * @type {number}\n * @default 100\n * @since 1.2.0\n * @apioption loading.hideDuration\n */\n /**\n * The duration in milliseconds of the fade in effect.\n *\n * @sample highcharts/loading/hideduration/\n * Fade in and out over a second\n *\n * @type {number}\n * @default 100\n * @since 1.2.0\n * @apioption loading.showDuration\n */\n /**\n * CSS styles for the loading label `span`.\n *\n * @see In styled mode, the loading label is styled with the\n * `.highcharts-loading-inner` class.\n *\n * @sample {highcharts|highmaps} highcharts/loading/labelstyle/\n * Vertically centered\n * @sample {highstock} stock/loading/general/\n * Label styles\n *\n * @type {Highcharts.CSSObject}\n * @default {\"fontWeight\": \"bold\", \"position\": \"relative\", \"top\": \"45%\"}\n * @since 1.2.0\n */\n labelStyle: {\n /**\n * @ignore\n */\n fontWeight: 'bold',\n /**\n * @ignore\n */\n position: 'relative',\n /**\n * @ignore\n */\n top: '45%'\n },\n /**\n * CSS styles for the loading screen that covers the plot area.\n *\n * In styled mode, the loading label is styled with the\n * `.highcharts-loading` class.\n *\n * @sample {highcharts|highmaps} highcharts/loading/style/\n * Gray plot area, white text\n * @sample {highstock} stock/loading/general/\n * Gray plot area, white text\n *\n * @type {Highcharts.CSSObject}\n * @default {\"position\": \"absolute\", \"backgroundColor\": \"#ffffff\", \"opacity\": 0.5, \"textAlign\": \"center\"}\n * @since 1.2.0\n */\n style: {\n /**\n * @ignore\n */\n position: 'absolute',\n /**\n * @ignore\n */\n backgroundColor: 'var(--highcharts-background-color)',\n /**\n * @ignore\n */\n opacity: 0.5,\n /**\n * @ignore\n */\n textAlign: 'center'\n }\n },\n /**\n * Options for the tooltip that appears when the user hovers over a\n * series or point.\n *\n * @declare Highcharts.TooltipOptions\n */\n tooltip: {\n /**\n * A CSS class name to apply to the tooltip, allowing unique CSS\n * styling for each chart.\n *\n * **Note:** The class is applied to the SVG element of the tooltip\n * (the tooltip label group), not to a container div. This allows you\n * to style the tooltip using CSS applicable to SVG elements.\n *\n * When [tooltip.outside](#tooltip.outside) is `true`, a separate\n * container div with class `highcharts-tooltip-container` is created\n * as the parent to the SVG tooltip element, but the `className` option\n * is still applied to the SVG element itself, not to the container.\n *\n * @type {string}\n * @apioption tooltip.className\n */\n /**\n * Since 4.1, the crosshair definitions are moved to the Axis object\n * in order for a better separation from the tooltip. See\n * [xAxis.crosshair](#xAxis.crosshair).\n *\n * @sample {highcharts} highcharts/tooltip/crosshairs-x/\n * Enable a crosshair for the x value\n *\n * @deprecated 4.1.0\n *\n * @type {*}\n * @default true\n * @apioption tooltip.crosshairs\n */\n /**\n * Distance from point to tooltip in pixels.\n *\n * @type {number}\n * @default 16\n * @apioption tooltip.distance\n */\n /**\n * Whether the tooltip should be fixed to one position in the chart, or\n * located next to the point or mouse. When the tooltip is fixed, the\n * position can be further specified with the\n * [tooltip.position](#tooltip.position) options set.\n *\n * @sample highcharts/tooltip/fixed/\n * Fixed tooltip and position options\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n * @sample {highmaps} maps/tooltip/fixed/\n * Map with fixed tooltip\n *\n * @type {boolean}\n * @default false\n * @since 12.2.0\n * @apioption tooltip.fixed\n */\n /**\n * Whether the tooltip should follow the mouse as it moves across\n * columns, pie slices and other point types with an extent.\n * By default it behaves this way for pie, polygon, map, sankey\n * and wordcloud series by override in the `plotOptions`\n * for those series types.\n *\n * Does not apply if [split](#tooltip.split) is `true`.\n *\n * For touch moves to behave the same way, [followTouchMove](\n * #tooltip.followTouchMove) must be `true` also.\n *\n * @sample highcharts/tooltip/followpointer/\n * Tooltip follow pointer comparison\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock} false\n * @default {highmaps} true\n * @since 3.0\n * @apioption tooltip.followPointer\n */\n /**\n * Whether the tooltip should update as the finger moves on a touch\n * device. If this is `true` and [chart.panning](#chart.panning) is\n * set,`followTouchMove` will take over one-finger touches, so the user\n * needs to use two fingers for zooming and panning.\n *\n * Note the difference to [followPointer](#tooltip.followPointer) that\n * only defines the _position_ of the tooltip. If `followPointer` is\n * false in for example a column series, the tooltip will show above or\n * below the column, but as `followTouchMove` is true, the tooltip will\n * jump from column to column as the user swipes across the plot area.\n *\n * @sample {highcharts} highcharts/tooltip/followtouchmove/\n * Tooltip follows touch move\n *\n * @type {boolean}\n * @default {highcharts} true\n * @default {highstock} true\n * @default {highmaps} false\n * @since 3.0.1\n * @apioption tooltip.followTouchMove\n */\n /**\n * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * for the whole shared tooltip. When format strings are a requirement,\n * it is usually more convenient to use `headerFormat`, `pointFormat`\n * and `footerFormat`, but the `format` option allows combining them\n * into one setting.\n *\n * The context of the format string is the same as that of the\n * `tooltip.formatter` callback.\n *\n * @sample {highcharts} highcharts/tooltip/format-shared/\n * Format for shared tooltip\n *\n * @type {string}\n * @default undefined\n * @since 11.1.0\n * @apioption tooltip.format\n */\n /**\n * Callback function to format the text of the tooltip from scratch. In\n * case of single or [shared](#tooltip.shared) tooltips, a string should\n * be returned. In case of [split](#tooltip.split) tooltips, it should\n * return an array where the first item is the header, and subsequent\n * items are mapped to the points. Return `false` to disable tooltip for\n * a specific point on series.\n *\n * A subset of HTML is supported. Unless `useHTML` is true, the HTML of\n * the tooltip is parsed and converted to SVG, therefore this isn't a\n * complete HTML renderer. The following HTML tags are supported: `b`,\n * `br`, `em`, `i`, `span`, `strong`. Spans can be styled with a `style`\n * attribute, but only text-related CSS, that is shared with SVG, is\n * handled.\n *\n * The context of the formatter (since v12) is the\n * [Point](https://api.highcharts.com/class-reference/Highcharts.Point)\n * instance. If the tooltip is shared or split, an array `this.points`\n * contains all points of the hovered x-value.\n *\n * Common properties from the Point to use in the formatter include:\n *\n * - **Point.percentage**:\n * Stacked series and pies only. The point's percentage of the total.\n *\n * - **Point.points**:\n * In a shared or split tooltip, this is an array containing all the\n * hovered points.\n *\n * - **this.series**:\n * The series object. The series name is available through\n * `this.series.name`.\n *\n * - **this.total**:\n * The total value at this point's x value in a stacked series, or the\n * sum of all slices in a pie series.\n *\n * - **this.x**:\n * The x value.\n *\n * - **this.y**:\n * The y value.\n *\n * @sample {highcharts} highcharts/tooltip/formatter-simple/\n * Simple string formatting\n * @sample {highcharts} highcharts/tooltip/formatter-shared/\n * Formatting with shared tooltip\n * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n * Formatting with split tooltip\n * @sample highcharts/tooltip/formatter-conditional-default/\n * Extending default formatter\n * @sample {highstock} stock/tooltip/formatter/\n * Formatting with shared tooltip\n * @sample {highmaps} maps/tooltip/formatter/\n * String formatting\n *\n * Since v12.6.0, the callback also receives `ctx` as the second\n * argument, so that arrow functions can access the same context as\n * regular functions using `this`.\n *\n * @type {Highcharts.TooltipFormatterCallbackFunction}\n * @apioption tooltip.formatter\n */\n /**\n * Callback function to format the text of the tooltip for\n * visible null points.\n * Works analogously to [formatter](#tooltip.formatter), including the\n * `ctx` callback argument added in v12.5.0.\n *\n * @sample highcharts/plotoptions/series-nullformat\n * Format data label and tooltip for null point.\n *\n * @type {Highcharts.TooltipFormatterCallbackFunction}\n * @apioption tooltip.nullFormatter\n */\n /**\n * Whether to allow the tooltip to render outside the chart's SVG\n * element box. By default (`false`), the tooltip is rendered within the\n * chart's SVG element, which results in the tooltip being aligned\n * inside the chart area. For small charts, this may result in clipping\n * or overlapping. When `true`, a separate SVG element is created and\n * overlaid on the page, allowing the tooltip to be aligned inside the\n * page itself. Beware that with this option active, CSS classes on the\n * chart's target container, with classnames matching the pattern\n * 'highcharts-*', will be set on the tooltip as well. This is done to\n * support theming for tooltips with this option.\n *\n * Defaults to `true` if `chart.scrollablePlotArea` is activated,\n * otherwise `false`.\n *\n * @sample highcharts/tooltip/outside\n * Small charts with tooltips outside\n *\n * @type {boolean|undefined}\n * @default undefined\n * @since 6.1.1\n * @apioption tooltip.outside\n */\n /**\n * A callback function for formatting the HTML output for a single point\n * in the tooltip. Like the `pointFormat` string, but with more\n * flexibility. Since v12.6.0, the callback also receives `ctx` as the\n * first argument, so that arrow functions can access the same context\n * as regular functions using `this`.\n *\n * @type {Highcharts.FormatterCallbackFunction<Highcharts.Point>}\n * @since 4.1.0\n * @context Highcharts.Point\n * @apioption tooltip.pointFormatter\n */\n /**\n * A callback function to place the tooltip in a custom position. The\n * callback receives four parameters: `labelWidth`, `labelHeight`,\n * `point`, and `ctx`, where point contains values for `plotX` and\n * `plotY` telling where the reference point is in the plot area, and\n * `ctx` is the tooltip context (so that arrow-functions can access the\n * same context as a normal function using `this`). Add\n * `chart.plotLeft` and `chart.plotTop` to get the full coordinates.\n * Since v12.6.0, the callback receives `ctx`.\n *\n * To find the actual hovered `Point` instance, use\n * `this.chart.hoverPoint`. For shared or split tooltips, all the hover\n * points are available in `this.chart.hoverPoints`.\n *\n * Since v7, when [tooltip.split](#tooltip.split) option is enabled,\n * positioner is called for each of the boxes separately, including\n * xAxis header. xAxis header is not a point, instead `point` argument\n * contains info: `{ plotX: Number, plotY: Number, isHeader: Boolean }`\n *\n * Since v12.2, the [tooltip.fixed](#tooltip.fixed) option combined with\n * [tooltip.position](#tooltip.position) covers most of the use cases\n * for custom tooltip positioning.\n *\n * The return should be an object containing x and y values, for example\n * `{ x: 100, y: 100 }`.\n *\n * @sample {highcharts} highcharts/tooltip/positioner/\n * A fixed tooltip position\n * @sample {highstock} stock/tooltip/positioner/\n * A fixed tooltip position on top of the chart\n * @sample {highmaps} maps/tooltip/positioner/\n * A fixed tooltip position\n * @sample {highstock} stock/tooltip/split-positioner/\n * Split tooltip with fixed positions\n * @sample {highstock} stock/tooltip/positioner-scrollable-plotarea/\n * Scrollable plot area combined with tooltip positioner\n *\n * @see [position](#tooltip.position)\n *\n * @type {Highcharts.TooltipPositionerCallbackFunction}\n * @since 2.2.4\n * @apioption tooltip.positioner\n */\n /**\n * Shows tooltip for all points with the same X value. Splits the\n * tooltip into one label per series, with the header close to the axis.\n * This is recommended over [shared](#tooltip.shared)\n * tooltips for charts with multiple line series, generally making them\n * easier to read. This option takes precedence over `tooltip.shared`.\n *\n * Not supported for [polar](#chart.polar) and [inverted](#chart.inverted) charts.\n *\n * @productdesc {highstock} In Highcharts Stock, tooltips are split\n * by default since v6.0.0. Stock charts typically contain\n * multi-dimension points and multiple panes, making split tooltips\n * the preferred layout over\n * the previous `shared` tooltip.\n *\n * @sample highcharts/tooltip/split/\n * Split tooltip\n * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n * Split tooltip and custom formatter callback\n *\n * @type {boolean}\n * @default {highcharts} false\n * @default {highstock} true\n * @since 5.0.0\n * @product highcharts highstock\n * @apioption tooltip.split\n */\n /**\n * How many decimals to show in each series' y value. This is\n * overridable in each series' tooltip options object. The default is to\n * preserve all decimals.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n * @sample {highmaps} maps/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n *\n * @type {number|undefined}\n * @since 2.2\n * @apioption tooltip.valueDecimals\n */\n /**\n * A string to prepend to each series' y value. Overridable in each\n * series' tooltip options object.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n * @sample {highmaps} maps/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n *\n * @type {string}\n * @since 2.2\n * @apioption tooltip.valuePrefix\n */\n /**\n * A string to append to each series' y value. Overridable in each\n * series' tooltip options object.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n * @sample {highmaps} maps/tooltip/valuedecimals/\n * Set decimals, prefix and suffix for the value\n *\n * @type {string}\n * @since 2.2\n * @apioption tooltip.valueSuffix\n */\n /**\n * The format for the date in the tooltip header if the X axis is a\n * datetime axis. The default is a best guess based on the smallest\n * distance between points in the chart.\n *\n * @sample {highcharts} highcharts/tooltip/xdateformat/\n * A different format\n *\n * @type {string|Highcharts.DateTimeFormatOptions}\n * @product highcharts highstock gantt\n * @apioption tooltip.xDateFormat\n */\n /**\n * How many decimals to show for the `point.change`\n * or the `point.cumulativeSum` value when the `series.compare`\n * or the `series.cumulative` option is set.\n * This is overridable in each series' tooltip options object.\n *\n * @type {number}\n * @default 2\n * @since 1.0.1\n * @product highstock\n * @apioption tooltip.changeDecimals\n */\n /**\n * Enable or disable the tooltip.\n *\n * @sample {highcharts} highcharts/tooltip/enabled/\n * Disabled\n * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n * Disable tooltip and show values on chart instead\n */\n enabled: true,\n /**\n * Enable or disable animation of the tooltip.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n * @since 2.3.0\n */\n animation: {\n duration: 300,\n // EaseOutCirc\n easing: (x) => Math.sqrt(1 - Math.pow(x - 1, 2))\n },\n /**\n * The color of the tooltip border. When `undefined` or `null`, the\n * border takes the color of the corresponding series or point.\n *\n * By default, in light mode the border color matches the background\n * color because the shadow makes the tooltip stand out. In dark mode, a\n * visible line is used because the default shadow is too dark to be\n * visible on a dark background.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * Default border color\n * @sample {highcharts} highcharts/tooltip/bordercolor-black/\n * Black border\n * @sample {highstock} stock/tooltip/general/\n * Styled tooltip\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n *\n * @type {Highcharts.ColorType}\n */\n borderColor: 'light-dark(var(--highcharts-neutral-color-5), var(--highcharts-neutral-color-20))', // eslint-disable-line max-len\n /**\n * The radius of the rounded border corners.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * Default border radius\n * @sample {highcharts} highcharts/tooltip/borderradius-0/\n * Square borders\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n */\n borderRadius: 5,\n /**\n * For series on datetime axes, the date format in the tooltip's\n * header will by default be guessed based on the closest data points.\n * This member gives the default string representations used for\n * each unit. For an overview of the string or object configuration, see\n * [dateFormat](/class-reference/Highcharts.Time#dateFormat).\n *\n * @see [xAxis.dateTimeLabelFormats](#xAxis.dateTimeLabelFormats)\n *\n * @type {Highcharts.Dictionary<string|Highcharts.DateTimeFormatOptions>}\n * @product highcharts highstock gantt\n */\n dateTimeLabelFormats: {\n millisecond: '%[AebHMSL]',\n second: '%[AebHMS]',\n minute: '%[AebHM]',\n hour: '%[AebHM]',\n day: '%[AebY]',\n week: '%v %[AebY]',\n month: '%[BY]',\n year: '%[Y]'\n },\n /**\n * A string to append to the tooltip format.\n *\n * @sample {highcharts} highcharts/tooltip/footerformat/\n * A table for value alignment\n * @sample {highmaps} maps/tooltip/format/\n * Format demo\n *\n * @since 2.2\n */\n footerFormat: '',\n /**\n * The name of a symbol to use for the border around the tooltip\n * header. Applies only when [tooltip.split](#tooltip.split) is\n * enabled.\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n * [series.marker.symbol](plotOptions.line.marker.symbol).\n *\n * @see [tooltip.shape](#tooltip.shape)\n *\n * @sample {highstock} stock/tooltip/split-positioner/\n * Different shapes for header and split boxes\n *\n * @type {Highcharts.TooltipShapeValue}\n * @validvalue [\"callout\", \"rect\"]\n * @since 7.0\n * @deprecated 13.0\n * @apioption tooltip.headerShape\n */\n /**\n * Options for the tooltip header when [tooltip.split](#tooltip.split)\n * is enabled. The header is the box containing the X value in a split\n * tooltip.\n *\n * @sample {highcharts} highcharts/tooltip/header\n * Header options for split tooltip\n * @sample {highstock} stock/tooltip/header\n * Header options for split tooltip\n * @since 13.0.0\n */\n header: {\n /**\n * Background color for the tooltip header when\n * [tooltip.split](#tooltip.split) is enabled.\n *\n * @sample {highcharts} highcharts/tooltip/header\n * Header options for split tooltip\n * @sample {highstock} stock/tooltip/header\n * Header options for split tooltip\n *\n * @type {Highcharts.ColorType}\n * @apioption tooltip.header.backgroundColor\n */\n /**\n * Border color for the tooltip header when\n * [tooltip.split](#tooltip.split) is enabled.\n *\n * @sample {highcharts} highcharts/tooltip/header\n * Header options for split tooltip\n * @sample {highstock} stock/tooltip/header\n * Header options for split tooltip\n * @type {Highcharts.ColorType}\n * @apioption tooltip.header.borderColor\n */\n /**\n * The width of the border for the tooltip header when\n * [tooltip.split](#tooltip.split) is enabled.\n *\n * @sample {highcharts} highcharts/tooltip/header\n * Header options for split tooltip\n * @sample {highstock} stock/tooltip/header\n * Header options for split tooltip\n * @type {number}\n * @apioption tooltip.header.borderWidth\n */\n /**\n * Distance between the plot area and the header (except the\n * chevron) in a split tooltip, in pixels. The default value makes\n * the header text align with the axis labels.\n *\n * @sample {highcharts} highcharts/tooltip/header\n * Header options for split tooltip\n * @sample {highstock} stock/tooltip/header\n * Header options for split tooltip\n */\n distance: 5,\n /**\n * The name of a symbol to use for the border around the tooltip\n * header. Applies only when [tooltip.split](#tooltip.split) is\n * enabled.\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n * [series.marker.symbol](plotOptions.line.marker.symbol).\n *\n * @see [tooltip.shape](#tooltip.shape)\n *\n * @sample {highstock} stock/tooltip/split-positioner/\n * Different shapes for header and split boxes\n */\n shape: 'callout',\n /**\n * CSS styles for the tooltip header. The default is `{ fontSize:\n * '1em' }`, ensuring that the header text is the same size as the\n * axis labels.\n *\n * @sample {highcharts} highcharts/tooltip/header\n * Header options for split tooltip\n * @sample {highstock} stock/tooltip/header\n * Header options for split tooltip\n */\n style: {\n /** @internal */\n fontSize: '1em'\n }\n },\n /**\n * The number of milliseconds to wait until the tooltip is hidden when\n * mouse out from a point or chart.\n *\n * @since 3.0\n */\n hideDelay: 500,\n /**\n * The number of milliseconds to wait until the tooltip is shown when\n * mouse over a point. Works on initial hover.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/showdelay/\n * Show tooltip after 2 seconds\n *\n * @since 12.6.0\n */\n showDelay: 0,\n /**\n * Padding inside the tooltip, in pixels.\n *\n * @since 5.0.0\n */\n padding: 8,\n /**\n * Positioning options for fixed tooltip, taking effect only when\n * [tooltip.fixed](#tooltip.fixed) is `true`.\n *\n * @sample {highcharts} highcharts/tooltip/fixed/\n * Fixed tooltip and position options\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n * @sample {highmaps} maps/tooltip/fixed/\n * Map with fixed tooltip\n *\n * @since 12.2.0\n */\n position: {\n /**\n * The horizontal alignment of the fixed tooltip.\n *\n * @sample highcharts/tooltip/fixed/\n * Fixed tooltip\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n *\n * @type {Highcharts.AlignValue}\n * @default left\n * @apioption tooltip.position.align\n */\n /**\n * The vertical alignment of the fixed tooltip.\n *\n * @sample highcharts/tooltip/fixed/\n * Fixed tooltip\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n *\n * @type {Highcharts.VerticalAlignValue}\n * @default top\n * @apioption tooltip.position.verticalAlign\n */\n /**\n * What the fixed tooltip alignment should be relative to.\n *\n * The default, `pane`, means that it is aligned within the plot\n * area for that given series. If the tooltip is split (as default\n * in Stock charts), each partial tooltip is aligned within the\n * series' pane.\n *\n * @sample highcharts/tooltip/fixed/\n * Fixed tooltip\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n *\n * @type {string}\n * @default pane\n * @validvalue [\"pane\", \"chart\", \"plotBox\", \"spacingBox\"]\n * @apioption tooltip.position.relativeTo\n */\n /**\n * X pixel offset from the given position. Can be used to shy away\n * from axis lines, grid lines etc to avoid the tooltip overlapping\n * other elements.\n *\n * @sample highcharts/tooltip/fixed/\n * Fixed tooltip\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n */\n x: 0,\n /**\n * Y pixel offset from the given position. Can be used to shy away\n * from axis lines, grid lines etc to avoid the tooltip overlapping\n * other elements.\n *\n * @sample highcharts/tooltip/fixed/\n * Fixed tooltip\n * @sample {highstock} stock/tooltip/fixed/\n * Stock chart with fixed tooltip\n */\n y: 3\n },\n /**\n * The name of a symbol to use for the border around the tooltip. Can\n * be one of: `\"callout\"`, `\"circle\"` or `\"rect\"`. When\n * [tooltip.split](#tooltip.split)\n * option is enabled, shape is applied to all boxes except header, which\n * is controlled by\n * [tooltip.headerShape](#tooltip.headerShape).\n *\n * Custom callbacks for symbol path generation can also be added to\n * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n * [series.marker.symbol](plotOptions.line.marker.symbol).\n *\n * Defaults to `callout` for floating tooltip, `rect` for\n * [fixed](#tooltip.fixed) tooltip.\n *\n * @type {Highcharts.TooltipShapeValue}\n * @since 4.0\n * @default undefined\n * @apioption tooltip.shape\n */\n /**\n * Shows information in the tooltip for all points with the same X\n * value. When the tooltip is shared, the entire plot area will capture\n * mouse movement or touch events. Tooltip texts for series types with\n * ordered data (not pie, scatter, flags etc) will be shown in a single\n * bubble. This is recommended for single series charts and for\n * tablet/mobile optimized charts.\n *\n * See also [tooltip.split](#tooltip.split), that is better suited for\n * charts with many series, especially line-type series. The\n * `tooltip.split` option takes precedence over `tooltip.shared`.\n *\n * @sample {highcharts} highcharts/tooltip/shared-false/\n * False by default\n * @sample {highcharts} highcharts/tooltip/shared-true/\n * True\n * @sample {highcharts} highcharts/tooltip/shared-x-crosshair/\n * True with x axis crosshair\n * @sample {highcharts} highcharts/tooltip/shared-true-mixed-types/\n * True with mixed series types\n *\n * @since 2.1\n * @product highcharts highstock\n */\n shared: false,\n /**\n * Proximity snap for graphs or single points. It defaults to 10 for\n * mouse-powered devices and 25 for touch devices.\n *\n * Note that in most cases the whole plot area captures the mouse\n * movement, and in these cases `tooltip.snap` doesn't make sense. This\n * applies when [stickyTracking](#plotOptions.series.stickyTracking)\n * is `true` (default) and when the tooltip is [shared](#tooltip.shared)\n * or [split](#tooltip.split).\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * 10 px by default\n * @sample {highcharts} highcharts/tooltip/snap-50/\n * 50 px on graph\n *\n * @type {number}\n * @default 10/25\n * @since 1.2.0\n * @product highcharts highstock\n */\n snap: isTouchDevice ? 25 : 10,\n /**\n * The HTML of the tooltip header line. The context is the\n * [Point class](https://api.highcharts.com/class-reference/Highcharts.Point).\n * Variables are enclosed in curly brackets. Examples of common\n * variables to include are `x`, `y`, `series.name` and `series.color`\n * and other properties on the same form. The `point.key` variable\n * contains the category name, x value or datetime string depending on\n * the type of axis. For datetime axes, the `point.key` date format can\n * be set using `tooltip.xDateFormat`.\n * In v12+, locale-aware date names follow the browser's casing and can\n * be lower-case, so use the `ucfirst` helper (for example\n * `{ucfirst point.key}`) if you want a capitalized header.\n *\n * @sample {highcharts} highcharts/tooltip/footerformat/\n * An HTML table in the tooltip\n * @sample {highstock} highcharts/tooltip/footerformat/\n * An HTML table in the tooltip\n * @sample {highmaps} maps/tooltip/format/\n * Format demo\n *\n * @type {string}\n * @apioption tooltip.headerFormat\n */\n headerFormat: '<span style=\"font-size: 0.8em\">{ucfirst point.key}</span><br/>',\n /**\n * The HTML of the null point's line in the tooltip. Works analogously\n * to [pointFormat](#tooltip.pointFormat).\n *\n * @sample {highcharts} highcharts/series/null-interaction\n * Line chart with null interaction\n * @sample {highcharts} highcharts/plotoptions/series-nullformat\n * Heatmap with null interaction\n *\n * @type {string}\n * @apioption tooltip.nullFormat\n */\n /**\n * The HTML of the point's line in the tooltip. The context is the\n * [Point class](https://api.highcharts.com/class-reference/Highcharts.Point).\n * Variables are enclosed in curly brackets. Examples of common\n * variables to include are `x`, `y`, `series.name` and `series.color`\n * and other properties on the same form. Furthermore, `y` can be\n * extended by the `tooltip.valuePrefix` and `tooltip.valueSuffix`\n * variables. This can also be overridden for each series, which makes\n * it a good hook for displaying units.\n *\n * In styled mode, the dot is colored by a class name rather than the\n * point color.\n *\n * @sample {highcharts} highcharts/tooltip/pointformat/\n * A different point format with value suffix\n * @sample {highcharts|highstock} highcharts/tooltip/pointformat-extra-information/\n * Show extra information about points in the tooltip\n * @sample {highmaps} maps/tooltip/format/\n * Format demo\n *\n * @type {string}\n * @since 2.2\n * @apioption tooltip.pointFormat\n */\n pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.y}</b><br/>',\n /**\n * The background color or gradient for the tooltip.\n *\n * In styled mode, the stroke width is set in the\n * `.highcharts-tooltip-box` class.\n *\n * @sample {highcharts} highcharts/tooltip/backgroundcolor-solid/\n * Yellowish background\n * @sample {highcharts} highcharts/tooltip/backgroundcolor-gradient/\n * Gradient\n * @sample {highcharts} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highstock} stock/tooltip/general/\n * Custom tooltip\n * @sample {highstock} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n * @sample {highmaps} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n *\n * @type {Highcharts.ColorType}\n */\n backgroundColor: 'var(--highcharts-background-color)',\n /**\n * The pixel width of the tooltip border. Defaults to 1, but with a\n * `borderColor` to match the background in light mode, and a visible\n * lighter border in dark mode.\n *\n * In styled mode, the stroke width is set in the\n * `.highcharts-tooltip-box` class.\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * 2 pixels\n * @sample {highcharts} highcharts/tooltip/borderwidth/\n * No border (shadow only)\n * @sample {highcharts} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highstock} stock/tooltip/general/\n * Custom tooltip\n * @sample {highstock} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n * @sample {highmaps} maps/tooltip/background-border/\n * Background and border demo\n * @sample {highmaps} highcharts/css/tooltip-border-background/\n * Tooltip in styled mode\n *\n * @type {number}\n */\n borderWidth: void 0,\n /**\n * Whether to apply a drop shadow to the tooltip. Defaults to true,\n * unless the tooltip is [fixed](#tooltip.fixed).\n *\n * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n * True by default\n * @sample {highcharts} highcharts/tooltip/shadow/\n * False\n * @sample {highmaps} maps/tooltip/positioner/\n * Fixed tooltip position, border and shadow disabled\n *\n * @type {boolean|Highcharts.ShadowOptionsObject}\n * @default undefined\n * @apioption tooltip.shadow\n */\n /**\n * Prevents the tooltip from switching or closing, when touched or\n * pointed.\n *\n * @sample highcharts/tooltip/stickoncontact/\n * Tooltip sticks on pointer contact\n * @sample highcharts/tooltip/stickoncontact-anchor-link/\n * Tooltip with clickable links\n *\n * @type {boolean}\n * @since 8.0.1\n */\n stickOnContact: false,\n /**\n * CSS styles for the tooltip. The tooltip can also be styled through\n * the CSS class `.highcharts-tooltip`.\n *\n * Note that the default `pointerEvents` style makes the tooltip ignore\n * mouse events, so in order to use clickable tooltips, this value must\n * be set to `auto`.\n *\n * @sample {highcharts} highcharts/tooltip/style/\n * Greater padding, bold text\n *\n * @type {Highcharts.CSSObject}\n */\n style: {\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-80)',\n cursor: 'default',\n /**\n * @type {number|string}\n */\n fontSize: '0.8em'\n },\n /**\n * Use HTML to render the contents of the tooltip instead of SVG. Using\n * HTML allows advanced formatting like tables and images in the\n * tooltip. It is also recommended for rtl languages as it works around\n * rtl bugs in early Firefox.\n *\n * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n * A table for value alignment\n * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n * Full HTML tooltip\n * @sample {highmaps} maps/tooltip/usehtml/\n * Pure HTML tooltip\n *\n * @since 2.2\n */\n useHTML: false\n },\n /**\n * Highcharts by default puts a credits label in the lower right corner\n * of the chart. This can be changed using these options.\n */\n credits: {\n /**\n * Credits for map source to be concatenated with conventional credit\n * text. By default this is a format string that collects copyright\n * information from the map if available.\n *\n * @see [mapTextFull](#credits.mapTextFull)\n * @see [text](#credits.text)\n *\n * @type {string}\n * @default \\u00a9 <a href=\"{geojson.copyrightUrl}\">{geojson.copyrightShort}</a>\n * @since 4.2.2\n * @product highmaps\n * @apioption credits.mapText\n */\n /**\n * Detailed credits for map source to be displayed on hover of credits\n * text. By default this is a format string that collects copyright\n * information from the map if available.\n *\n * @see [mapText](#credits.mapText)\n * @see [text](#credits.text)\n *\n * @type {string}\n * @default {geojson.copyright}\n * @since 4.2.2\n * @product highmaps\n * @apioption credits.mapTextFull\n */\n /**\n * Events for the credits label.\n *\n * @type {object}\n * @since 12.6.0\n * @apioption credits.events\n */\n /**\n * Callback function to handle click events on the credits label.\n * The callback can call `event.preventDefault()` to prevent the\n * default navigation behavior. Alternatively, you can add a general\n * event handler using `Highcharts.addEvent(Chart, 'creditsClick',\n * callback)` instead of providing it in the options tree.\n *\n * @sample {highcharts} highcharts/credits/events-click/\n * Custom click handler\n *\n * @param {Event} event\n * The click event object.\n *\n * @type {Function}\n * @since 12.6.0\n * @apioption credits.events.click\n */\n /**\n * Whether to render the credits as HTML\n *\n * @since 13.0.0\n * @sample highcharts/palette/branding\n * Branding with HTML credits\n * @type {boolean}\n * @default false\n * @apioption credits.useHTML\n */\n /**\n * Whether to show the credits text.\n *\n * @sample {highcharts} highcharts/credits/enabled-false/\n * Credits disabled\n * @sample {highstock} stock/credits/enabled/\n * Credits disabled\n * @sample {highmaps} maps/credits/enabled-false/\n * Credits disabled\n */\n enabled: true,\n /**\n * The URL for the credits label.\n *\n * @sample {highcharts} highcharts/credits/href/\n * Custom URL and text\n * @sample {highmaps} maps/credits/customized/\n * Custom URL and text\n */\n href: 'https://www.highcharts.com?credits',\n /**\n * Position configuration for the credits label.\n *\n * @sample {highcharts} highcharts/credits/position-left/\n * Left aligned\n * @sample {highmaps} maps/credits/customized/\n * Left aligned\n *\n * @type {Highcharts.AlignObject}\n * @since 2.1\n */\n position: {\n align: 'right',\n verticalAlign: 'bottom',\n x: -10,\n y: -5\n },\n /**\n * CSS styles for the credits label.\n *\n * @see In styled mode, credits styles can be set with the\n * `.highcharts-credits` class.\n *\n * @type {Highcharts.CSSObject}\n */\n style: {\n cursor: 'pointer',\n /**\n * @type {Highcharts.ColorType}\n */\n color: 'var(--highcharts-neutral-color-40)',\n /**\n * @type {number|string}\n */\n fontSize: '0.6em'\n },\n /**\n * The text for the credits label.\n *\n * @productdesc {highmaps}\n * If a map is loaded as GeoJSON, the text defaults to\n * `Highcharts @ {map-credits}`. Otherwise, it defaults to\n * `Highcharts.com`.\n *\n * @sample {highcharts} highcharts/credits/href/\n * Custom URL and text\n * @sample {highmaps} maps/credits/customized/\n * Custom URL and text\n */\n text: 'Highcharts.com'\n }\n};\nconst defaultTime = new Time(defaultOptions.time, defaultOptions.lang);\n/**\n * Get the updated default options. Until 3.0.7, merely exposing defaultOptions\n * for outside modules wasn't enough because the setOptions method created a new\n * object.\n *\n * @function Highcharts.getOptions\n *\n * @return {Highcharts.Options}\n * Default options.\n */\nexport function getOptions() {\n return defaultOptions;\n}\n/**\n * Merge the default options with custom options and return the new options\n * structure. Commonly used for defining reusable templates.\n *\n * @sample highcharts/members/setoptions Applying a global theme\n *\n * @function Highcharts.setOptions\n *\n * @param {Highcharts.Options} options\n * The new custom chart options.\n *\n * @return {Highcharts.Options}\n * Updated options.\n */\nfunction setOptions(options) {\n fireEvent(H, 'setOptions', { options });\n // Copy in the default options\n merge(true, defaultOptions, options);\n // Update the time object\n if (options.time) {\n defaultTime.update(defaultOptions.time);\n }\n if (options.lang && 'locale' in options.lang) {\n defaultTime.update({\n locale: options.lang.locale\n });\n }\n if (options.lang?.chartTitle) {\n defaultOptions.title = {\n ...defaultOptions.title,\n text: options.lang.chartTitle\n };\n }\n return defaultOptions;\n}\n/* *\n *\n * Default Export\n *\n * */\nconst DefaultOptions = {\n defaultOptions,\n defaultTime,\n getOptions,\n setOptions\n};\nexport default DefaultOptions;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * @typedef {\"plotBox\"|\"spacingBox\"} Highcharts.ButtonRelativeToValue\n */\n/**\n * Gets fired when a series is added to the chart after load time, using the\n * `addSeries` method. Returning `false` prevents the series from being added.\n *\n * @callback Highcharts.ChartAddSeriesCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {Highcharts.ChartAddSeriesEventObject} event\n * The event that occurred.\n */\n/**\n * Contains common event information. Through the `options` property you can\n * access the series options that were passed to the `addSeries` method.\n *\n * @interface Highcharts.ChartAddSeriesEventObject\n */ /**\n* The series options that were passed to the `addSeries` method.\n* @name Highcharts.ChartAddSeriesEventObject#options\n* @type {Highcharts.SeriesOptionsType}\n*/ /**\n* Prevents the default behavior of the event.\n* @name Highcharts.ChartAddSeriesEventObject#preventDefault\n* @type {Function}\n*/ /**\n* The event target.\n* @name Highcharts.ChartAddSeriesEventObject#target\n* @type {Highcharts.Chart}\n*/ /**\n* The event type.\n* @name Highcharts.ChartAddSeriesEventObject#type\n* @type {\"addSeries\"}\n*/\n/**\n * Gets fired when clicking on the plot background.\n *\n * @callback Highcharts.ChartClickCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {Highcharts.PointerEventObject} event\n * The event that occurred.\n */\n/**\n * Contains an axes of the clicked spot.\n *\n * @interface Highcharts.ChartClickEventAxisObject\n */ /**\n* Axis at the clicked spot.\n* @name Highcharts.ChartClickEventAxisObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Axis value at the clicked spot.\n* @name Highcharts.ChartClickEventAxisObject#value\n* @type {number}\n*/\n/**\n * Contains information about the clicked spot on the chart. Remember the unit\n * of a datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * @interface Highcharts.ChartClickEventObject\n * @extends Highcharts.PointerEventObject\n */ /**\n* Information about the x-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#xAxis\n* @type {Array<Highcharts.ChartClickEventAxisObject>}\n*/ /**\n* Information about the y-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#yAxis\n* @type {Array<Highcharts.ChartClickEventAxisObject>}\n*/ /**\n* Information about the z-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#zAxis\n* @type {Array<Highcharts.ChartClickEventAxisObject>|undefined}\n*/\n/**\n * Gets fired when the chart is finished loading.\n *\n * @callback Highcharts.ChartLoadCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * Fires when the chart is redrawn, either after a call to `chart.redraw()` or\n * after an axis, series or point is modified with the `redraw` option set to\n * `true`.\n *\n * @callback Highcharts.ChartRedrawCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * Gets fired after initial load of the chart (directly after the `load` event),\n * and after each redraw (directly after the `redraw` event).\n *\n * @callback Highcharts.ChartRenderCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {global.Event} event\n * The event that occurred.\n */\n/**\n * Gets fired when an area of the chart has been selected. The default action\n * for the selection event is to zoom the chart to the selected area. It can be\n * prevented by calling `event.preventDefault()` or return false.\n *\n * @callback Highcharts.ChartSelectionCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * The chart on which the event occurred.\n *\n * @param {Highcharts.SelectEventObject} event\n * Event information\n *\n * @return {boolean|undefined}\n * Return false to prevent the default action, usually zoom.\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 '../Globals.js';\nconst { win } = H;\nimport { defined, isNumber, isString, merge, pInt } from '../../Shared/Utilities.js';\n/* *\n *\n * Helpers\n *\n * */\nconst colorMix = (color1, color2, weight) => (weight === 0 ? color1 :\n weight === 1 ? color2 :\n `color-mix(in srgb,${color1},${color2} ${weight * 100}%)`);\nconst isStringColor = (color) => isString(color) && !!color && color !== 'none';\n/* *\n *\n * Class\n *\n * */\n/**\n * Handle color operations. Some object methods are chainable.\n *\n * @class\n * @name Highcharts.Color\n *\n * @param {Highcharts.ColorType} input\n * The input color.\n */\nclass Color {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * Creates a color instance out of a color string or object.\n *\n * @function Highcharts.Color.parse\n *\n * @param {Highcharts.ColorType} [input]\n * The input color.\n *\n * @return {Highcharts.Color}\n * Color instance.\n */\n static parse(input) {\n return input ? new Color(input) : Color.None;\n }\n /* *\n *\n * Constructor\n *\n * */\n constructor(input) {\n /**\n * The RGBA color components, if the color is a solid color.\n * @name Highcharts.Color#rgba\n * @type {Highcharts.RGBA}\n */\n this.rgba = [NaN, NaN, NaN, NaN];\n this.input = input;\n const GlobalColor = H.Color;\n // Backwards compatibility, allow class overwrite\n if (GlobalColor && GlobalColor !== Color) {\n return new GlobalColor(input);\n }\n let result, rgba, i, parser;\n // Gradients\n if (typeof input === 'object' &&\n typeof input.stops !== 'undefined') {\n this.stops = input.stops.map((stop) => new Color(stop[1]));\n // Solid colors\n }\n else if (typeof input === 'string') {\n this.input = input = (Color.names[input.toLowerCase()] || input);\n i = Color.parsers.length;\n while (i-- && !rgba) {\n parser = Color.parsers[i];\n result = parser.regex.exec(input);\n if (result) {\n rgba = parser.parse(result);\n }\n }\n }\n if (rgba) {\n this.rgba = rgba;\n }\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Return the color or gradient stops in the specified format\n *\n * @function Highcharts.Color#get\n *\n * @param {string} [format]\n * Possible values are 'a', 'rgb', 'rgba' (default).\n *\n * @return {Highcharts.ColorType}\n * This color as a string or gradient stops.\n */\n get(format) {\n const input = this.input, rgba = this.rgba;\n if (this.output) {\n return this.output;\n }\n if (typeof input === 'object' &&\n typeof this.stops !== 'undefined') {\n const ret = merge(input);\n ret.stops = [].slice.call(ret.stops);\n this.stops.forEach((stop, i) => {\n ret.stops[i] = [\n ret.stops[i][0],\n stop.get(format)\n ];\n });\n return ret;\n }\n // It's NaN if gradient colors on a column chart\n if (rgba && isNumber(rgba[0])) {\n if (format === 'rgb' || (!format && rgba[3] === 1)) {\n return 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n }\n if (format === 'a') {\n return `${rgba[3]}`;\n }\n return 'rgba(' + rgba.join(',') + ')';\n }\n return input;\n }\n /**\n * Brighten the color instance.\n *\n * @function Highcharts.Color#brighten\n *\n * @param {number} alpha\n * The alpha value.\n *\n * @return {Highcharts.Color}\n * This color with modifications.\n */\n brighten(alpha) {\n const rgba = this.rgba;\n if (this.stops) {\n this.stops.forEach(function (stop) {\n stop.brighten(alpha);\n });\n }\n else if (isNumber(alpha) && alpha !== 0) {\n if (isNumber(rgba[0])) {\n for (let i = 0; i < 3; i++) {\n rgba[i] += pInt(alpha * 255);\n if (rgba[i] < 0) {\n rgba[i] = 0;\n }\n if (rgba[i] > 255) {\n rgba[i] = 255;\n }\n }\n }\n else if (Color.useColorMix && isStringColor(this.input)) {\n this.output = colorMix(this.input, alpha > 0 ? 'white' : 'black', Math.abs(alpha));\n }\n }\n return this;\n }\n /**\n * Set the color's opacity to a given alpha value.\n *\n * @function Highcharts.Color#setOpacity\n *\n * @param {number} alpha\n * Opacity between 0 and 1.\n *\n * @return {Highcharts.Color}\n * Color with modifications.\n */\n setOpacity(alpha) {\n if (isNumber(this.rgba[0])) {\n this.rgba[3] = alpha;\n }\n else if (Color.useColorMix && isStringColor(this.input)) {\n this.output = colorMix(this.input, '#0000', 1 - alpha);\n }\n return this;\n }\n /**\n * Return an intermediate color between two colors.\n *\n * @function Highcharts.Color#tweenTo\n *\n * @param {Highcharts.Color} to\n * The color object to tween to.\n *\n * @param {number} pos\n * The intermediate position, where 0 is the from color (current color\n * item), and 1 is the `to` color.\n *\n * @return {Highcharts.ColorType}\n * The intermediate color in rgba notation, or unsupported type.\n */\n tweenTo(to, pos) {\n const fromRgba = this.rgba, toRgba = to.rgba;\n // Unsupported color, return to-color (#3920, #7034)\n if (!isNumber(fromRgba[0]) || !isNumber(toRgba[0])) {\n if (Color.useColorMix &&\n isStringColor(this.input) &&\n isStringColor(to.input) &&\n pos < 0.99) {\n return colorMix(this.input, to.input, pos);\n }\n return to.input || 'none';\n }\n // Check for has alpha, because rgba colors perform worse due to\n // lack of support in WebKit.\n const hasAlpha = (toRgba[3] !== 1 || fromRgba[3] !== 1), channel = (to, i) => to + (fromRgba[i] - to) * (1 - pos), rgba = toRgba.slice(0, 3).map(channel).map(Math.round);\n if (hasAlpha) {\n rgba.push(channel(toRgba[3], 3));\n }\n return (hasAlpha ? 'rgba(' : 'rgb(') + rgba.join(',') + ')';\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n/**\n * Collection of named colors. Can be extended from the outside by adding\n * colors to Highcharts.Color.names.\n * @internal\n */\nColor.names = {\n white: '#ffffff',\n black: '#000000'\n};\n/**\n * Collection of parsers. This can be extended from the outside by pushing\n * parsers to `Color.parsers`.\n * @internal\n */\nColor.parsers = [{\n // RGBA color\n // eslint-disable-next-line max-len\n regex: /rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d?(?:\\.\\d+)?)\\s*\\)/,\n parse: function (result) {\n return [\n pInt(result[1]),\n pInt(result[2]),\n pInt(result[3]),\n parseFloat(result[4], 10)\n ];\n }\n }, {\n // RGB color\n regex: /rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)/,\n parse: function (result) {\n return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n }\n }, {\n // RGBA 3 & 4 digit hex color, e.g. #F0F, #F0FA\n regex: /^#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?$/i,\n parse: function (result) {\n // #abcd => #aabbccdd, hence result + result.\n return [\n (pInt(result[1] + result[1], 16)),\n (pInt(result[2] + result[2], 16)),\n (pInt(result[3] + result[3], 16)),\n !defined(result[4]) ?\n 1 :\n (pInt(result[4] + result[4], 16) / 255)\n ];\n }\n }, {\n // RGBA 6 & 8 digit hex color, e.g. #FFCC00, #FFCC00FF\n regex: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?$/i,\n parse: function (result) {\n return [\n pInt(result[1], 16),\n pInt(result[2], 16),\n pInt(result[3], 16),\n !defined(result[4]) ?\n 1 :\n (pInt(result[4], 16) / 255)\n ];\n }\n }];\n/**\n * Whether to use CSS `color-mix` for color handling (brightening,\n * tweening). This can be disabled from the outside.\n * @internal\n */\nColor.useColorMix = win.CSS?.supports('color', 'color-mix(in srgb,red,blue 9%)');\n/**\n * A static Color instance representing no color.\n * @name Highcharts.Color.None\n * @type {Highcharts.Color}\n * @internal\n */\nColor.None = new Color(''); // Must be last static for init\n/* *\n *\n * Default Export\n *\n * */\nexport default Color;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A valid color to be parsed and handled by Highcharts.\n *\n * @typedef {string} Highcharts.ColorString\n */\n/**\n * A valid color type than can be parsed and handled by Highcharts. It can be a\n * color string, a gradient object, or a pattern object.\n *\n * @typedef {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} Highcharts.ColorType\n */\n/**\n * Gradient options instead of a solid color.\n *\n * @example\n * // Linear gradient used as a color option\n * color: {\n * linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n * stops: [\n * [0, '#003399'], // start\n * [0.5, '#ffffff'], // middle\n * [1, '#3366AA'] // end\n * ]\n * }\n *\n * @interface Highcharts.GradientColorObject\n */ /**\n* Holds an object that defines the start position and the end position relative\n* to the shape.\n* @name Highcharts.GradientColorObject#linearGradient\n* @type {Highcharts.LinearGradientColorObject|undefined}\n*/ /**\n* Holds an object that defines the center position and the radius.\n* @name Highcharts.GradientColorObject#radialGradient\n* @type {Highcharts.RadialGradientColorObject|undefined}\n*/ /**\n* The first item in each tuple is the position in the gradient, where 0 is the\n* start of the gradient and 1 is the end of the gradient. Multiple stops can be\n* applied. The second item is the color for each stop. This color can also be\n* given in the rgba format.\n* @name Highcharts.GradientColorObject#stops\n* @type {Array<Highcharts.GradientColorStopObject>}\n*/\n/**\n * Color stop tuple.\n *\n * @see Highcharts.GradientColorObject\n *\n * @interface Highcharts.GradientColorStopObject\n */ /**\n* @name Highcharts.GradientColorStopObject#0\n* @type {number}\n*/ /**\n* @name Highcharts.GradientColorStopObject#1\n* @type {Highcharts.ColorString}\n*/ /**\n* @name Highcharts.GradientColorStopObject#color\n* @type {Highcharts.Color|undefined}\n*/\n/**\n * Defines the start position and the end position for a gradient relative\n * to the shape. Start position (x1, y1) and end position (x2, y2) are relative\n * to the shape, where 0 means top/left and 1 is bottom/right.\n *\n * @interface Highcharts.LinearGradientColorObject\n */ /**\n* Start horizontal position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#x1\n* @type {number}\n*/ /**\n* End horizontal position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#x2\n* @type {number}\n*/ /**\n* Start vertical position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#y1\n* @type {number}\n*/ /**\n* End vertical position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#y2\n* @type {number}\n*/\n/**\n * Defines the center position and the radius for a gradient.\n *\n * @interface Highcharts.RadialGradientColorObject\n */ /**\n* Center horizontal position relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#cx\n* @type {number}\n*/ /**\n* Center vertical position relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#cy\n* @type {number}\n*/ /**\n* Radius relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#r\n* @type {number}\n*/\n/**\n * @interface Highcharts.RGBA\n * @extends Array<number>\n */ /**\n* @name Highcharts.RGBA#length\n* @type {4}\n*/\n/**\n * Creates a color instance out of a color string.\n *\n * @function Highcharts.color\n *\n * @param {Highcharts.ColorType} input\n * The input color.\n *\n * @return {Highcharts.Color}\n * Color instance\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 Color from '../Color/Color.js';\nconst { parse: color } = Color;\nimport H from '../Globals.js';\nconst { win } = H;\nimport { isNumber, objectEach } from '../../Shared/Utilities.js';\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/* *\n *\n * Class\n *\n * */\n/**\n * An animator object used internally. One instance applies to one property\n * (attribute or style prop) on one element. Animation is always initiated\n * through {@link SVGElement#animate}.\n *\n * @example\n * let rect = renderer.rect(0, 0, 10, 10).add();\n * rect.animate({ width: 100 });\n *\n * @internal\n * @class\n * @name Highcharts.Fx\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} elem\n * The element to animate.\n *\n * @param {Partial<Highcharts.AnimationOptionsObject>} options\n * Animation options.\n *\n * @param {string} prop\n * The single attribute or CSS property to animate.\n */\nclass Fx {\n /* *\n *\n * Constructors\n *\n * */\n constructor(elem, options, prop) {\n /**\n * Current position of the animation, a value between 0 and 1.\n * @internal\n */\n this.pos = NaN;\n this.options = options;\n this.elem = elem;\n this.prop = prop;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Set the current step of a path definition on SVGElement.\n *\n * @function Highcharts.Fx#dSetter\n *\n */\n dSetter() {\n const paths = this.paths, start = paths?.[0], end = paths?.[1], now = this.now || 0;\n let path = [];\n // Land on the final path without adjustment points appended in the ends\n if (now === 1 || !start || !end) {\n path = this.toD || [];\n }\n else if (start.length === end.length && now < 1) {\n for (let i = 0; i < end.length; i++) {\n // Tween between the start segment and the end segment. Start\n // with a copy of the end segment and tween the appropriate\n // numerics\n const startSeg = start[i];\n const endSeg = end[i];\n const tweenSeg = [];\n for (let j = 0; j < endSeg.length; j++) {\n const startItem = startSeg[j];\n const endItem = endSeg[j];\n // Tween numbers\n if (isNumber(startItem) &&\n isNumber(endItem) &&\n // Arc boolean flags\n !(endSeg[0] === 'A' && (j === 4 || j === 5))) {\n tweenSeg[j] = startItem + now * (endItem - startItem);\n // Strings, take directly from the end segment\n }\n else {\n tweenSeg[j] = endItem;\n }\n }\n path.push(tweenSeg);\n }\n // If animation is finished or length not matching, land on right value\n }\n else {\n path = end;\n }\n this.elem.attr('d', path, void 0, true);\n }\n /**\n * Update the element with the current animation step.\n *\n * @function Highcharts.Fx#update\n *\n */\n update() {\n const elem = this.elem, prop = this.prop, // If destroyed, it is null\n now = this.now ?? 1, step = this.options.step;\n // Animation setter defined from outside\n if (this[prop + 'Setter']) {\n this[prop + 'Setter']();\n // Other animations on SVGElement\n }\n else if (elem && elem.attr) {\n if (elem.element) {\n elem.attr(prop, now, void 0, true);\n }\n // HTML styles, raw HTML content like container size\n }\n else if (elem) {\n elem.style[prop] = now + (this.unit || '');\n }\n step?.call(elem, now, this);\n }\n /**\n * Run an animation.\n *\n * @function Highcharts.Fx#run\n *\n * @param {number} from\n * The current value, value to start from.\n *\n * @param {number} to\n * The end value, value to land on.\n *\n * @param {string} unit\n * The property unit, for example `px`.\n *\n */\n run(from, to, unit) {\n const { elem, options } = this, { complete, curAnim = {} } = options, timer = (gotoEnd) => (timer.stopped ? false : this.step(gotoEnd)), requestAnimationFrame = win.requestAnimationFrame ||\n function (step) {\n setTimeout(step, 13);\n }, step = () => {\n for (let i = 0; i < Fx.timers.length; i++) {\n if (!Fx.timers[i]()) {\n Fx.timers.splice(i--, 1);\n }\n }\n if (Fx.timers.length) {\n requestAnimationFrame(step);\n }\n };\n if (from === to && !elem['forceAnimate:' + this.prop]) {\n delete curAnim[this.prop];\n if (complete &&\n Object.keys(curAnim).length === 0) {\n complete.call(elem);\n }\n }\n else { // #7166\n this.startTime = +new Date();\n this.start = from;\n this.end = to;\n this.unit = unit;\n this.now = this.start;\n this.pos = 0;\n timer.elem = elem;\n timer.prop = this.prop;\n if (timer() && Fx.timers.push(timer) === 1) {\n requestAnimationFrame(step);\n }\n }\n }\n /**\n * Run a single step in the animation.\n *\n * @function Highcharts.Fx#step\n *\n * @param {boolean} [gotoEnd]\n * Whether to go to the endpoint of the animation after abort.\n *\n * @return {boolean}\n * Returns `true` if animation continues.\n */\n step(gotoEnd) {\n const t = +new Date(), options = this.options, elem = this.elem, complete = options.complete, duration = options.duration, curAnim = options.curAnim;\n let ret, done;\n // #2616, element is destroyed\n if (elem?.attr && !elem.element) {\n ret = false;\n }\n else if (gotoEnd || t >= duration + this.startTime) {\n this.now = this.end;\n this.pos = 1;\n this.update();\n curAnim[this.prop] = true;\n done = true;\n objectEach(curAnim, function (val) {\n if (val !== true) {\n done = false;\n }\n });\n if (done && complete) {\n complete.call(elem);\n }\n ret = false;\n }\n else {\n this.pos = options.easing((t - this.startTime) / duration);\n this.now = this.start + ((this.end -\n this.start) * this.pos);\n this.update();\n ret = true;\n }\n return ret;\n }\n /**\n * Prepare start and end values so that the path can be animated one to one.\n *\n * @function Highcharts.Fx#initPath\n *\n * @param {Highcharts.SVGElement} elem\n * The SVGElement item.\n *\n * @param {Highcharts.SVGPathArray|undefined} fromD\n * Starting path definition.\n *\n * @param {Highcharts.SVGPathArray} toD\n * Ending path definition.\n *\n * @return {Array<Highcharts.SVGPathArray,Highcharts.SVGPathArray>}\n * An array containing start and end paths in array form so that\n * they can be animated in parallel.\n */\n initPath(elem, fromD, toD) {\n const startX = elem.startX, endX = elem.endX, end = toD.slice(), // Copy\n isArea = elem.isArea, positionFactor = isArea ? 2 : 1, disableAnimation = fromD &&\n toD.length > fromD.length &&\n toD.hasStackedCliffs; // #16925\n let shift, fullLength, i, reverse, start = fromD?.slice(); // Copy\n if (!start || disableAnimation) {\n return [end, end];\n }\n /**\n * If shifting points, prepend a dummy point to the end path.\n * @internal\n */\n function prepend(arr, other) {\n while (arr.length < fullLength) {\n // Move to, line to or curve to?\n const moveSegment = arr[0], otherSegment = other[fullLength - arr.length];\n if (otherSegment && moveSegment[0] === 'M') {\n if (otherSegment[0] === 'C') {\n arr[0] = [\n 'C',\n moveSegment[1],\n moveSegment[2],\n moveSegment[1],\n moveSegment[2],\n moveSegment[1],\n moveSegment[2]\n ];\n }\n else {\n arr[0] = ['L', moveSegment[1], moveSegment[2]];\n }\n }\n // Prepend a copy of the first point\n arr.unshift(moveSegment);\n // For areas, the bottom path goes back again to the left, so we\n // need to append a copy of the last point.\n if (isArea) {\n const z = arr.pop();\n arr.push(arr[arr.length - 1], z); // Append point and the Z\n }\n }\n }\n /**\n * Copy and append last point until the length matches the end length.\n * @internal\n */\n function append(arr) {\n while (arr.length < fullLength) {\n // Pull out the slice that is going to be appended or inserted.\n // In a line graph, the positionFactor is 1, and the last point\n // is sliced out. In an area graph, the positionFactor is 2,\n // causing the middle two points to be sliced out, since an area\n // path starts at left, follows the upper path then turns and\n // follows the bottom back.\n const segmentToAdd = arr[Math.floor(arr.length / positionFactor) - 1].slice();\n // Disable the first control point of curve segments\n if (segmentToAdd[0] === 'C') {\n segmentToAdd[1] = segmentToAdd[5];\n segmentToAdd[2] = segmentToAdd[6];\n }\n if (!isArea) {\n arr.push(segmentToAdd);\n }\n else {\n const lowerSegmentToAdd = arr[Math.floor(arr.length / positionFactor)].slice();\n arr.splice(arr.length / 2, 0, segmentToAdd, lowerSegmentToAdd);\n }\n }\n }\n // For sideways animation, find out how much we need to shift to get the\n // start path Xs to match the end path Xs.\n if (startX && endX && endX.length) {\n for (i = 0; i < startX.length; i++) {\n // Moving left, new points coming in on right\n if (startX[i] === endX[0]) {\n shift = i;\n break;\n // Moving right\n }\n else if (startX[0] ===\n endX[endX.length - startX.length + i]) {\n shift = i;\n reverse = true;\n break;\n // Fixed from the right side, \"scaling\" left\n }\n else if (startX[startX.length - 1] ===\n endX[endX.length - startX.length + i]) {\n shift = startX.length - i;\n break;\n }\n }\n if (typeof shift === 'undefined') {\n start = [];\n }\n }\n if (start.length && isNumber(shift)) {\n // The common target length for the start and end array, where both\n // arrays are padded in opposite ends\n fullLength = end.length + shift * positionFactor;\n if (!reverse) {\n prepend(end, start);\n append(start);\n }\n else {\n prepend(start, end);\n append(end);\n }\n }\n return [start, end];\n }\n /**\n * Handle animation of the color attributes directly.\n *\n * @function Highcharts.Fx#fillSetter\n *\n */\n fillSetter() {\n Fx.prototype.strokeSetter.apply(this, arguments);\n }\n /**\n * Handle animation of the color attributes directly.\n *\n * @function Highcharts.Fx#strokeSetter\n *\n */\n strokeSetter() {\n this.elem.attr(this.prop, color(this.start).tweenTo(color(this.end), this.pos), void 0, true);\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n/** @internal */\nFx.timers = [];\n/* *\n *\n * Default Export\n *\n * */\n/** @internal */\nexport default Fx;\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 Fx from './Fx.js';\nimport { defined, getStyle, isArray, isNumber, isObject, merge, objectEach, pick } from '../../Shared/Utilities.js';\n/* *\n *\n * Functions\n *\n * */\n/**\n * Set the global animation to either a given value, or fall back to the given\n * chart's animation option.\n *\n * @function Highcharts.setAnimation\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>|undefined} animation\n * The animation object.\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @todo\n * This function always relates to a chart, and sets a property on the renderer,\n * so it should be moved to the SVGRenderer.\n */\nexport function setAnimation(animation, chart) {\n chart.renderer.globalAnimation = pick(animation, chart.options.chart.animation, true);\n}\n/**\n * Get the animation in object form, where a disabled animation is always\n * returned as `{ duration: 0 }`.\n *\n * @function Highcharts.animObject\n *\n * @param {boolean|Highcharts.AnimationOptionsObject} [animation=0]\n * An animation setting. Can be an object with duration, complete and\n * easing properties, or a boolean to enable or disable.\n *\n * @return {Highcharts.AnimationOptionsObject}\n * An object with at least a duration property.\n */\nexport function animObject(animation) {\n return isObject(animation) ?\n merge({ duration: 500, defer: 0 }, animation) :\n { duration: animation ? 500 : 0, defer: 0 };\n}\n/**\n * Get the defer as a number value from series animation options.\n *\n * @function Highcharts.getDeferredAnimation\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {boolean|Highcharts.AnimationOptionsObject} animation\n * An animation setting. Can be an object with duration, complete and\n * easing properties, or a boolean to enable or disable.\n *\n * @param {Highcharts.Series} [series]\n * Series to defer animation.\n *\n * @return {number}\n * The numeric value.\n */\nexport function getDeferredAnimation(chart, animation, series) {\n const labelAnimation = animObject(animation), s = series ? [series] : chart.series;\n let defer = 0, duration = 0;\n s.forEach((series) => {\n const seriesAnim = animObject(series.options.animation);\n defer = isObject(animation) && defined(animation.defer) ?\n labelAnimation.defer :\n Math.max(defer, seriesAnim.duration + seriesAnim.defer);\n duration = Math.min(labelAnimation.duration, seriesAnim.duration);\n });\n // Disable defer for exporting\n if (chart.renderer.forExport) {\n defer = 0;\n }\n const anim = {\n defer: Math.max(0, defer - duration),\n duration: Math.min(defer, duration)\n };\n return anim;\n}\n/**\n * The global animate method, which uses Fx to create individual animators.\n *\n * @sample highcharts/members/renderer-basic\n * SVG elements with animation\n * @sample highcharts/members/animate\n * Animation without an owner element\n *\n * @function Highcharts.animate\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} el\n * The element to animate.\n *\n * @param {Highcharts.CSSObject|Highcharts.SVGAttributes} params\n * An object containing key-value pairs of the properties to animate.\n * Supports numeric as pixel-based CSS properties for HTML objects and\n * attributes for SVGElements.\n *\n * @param {Partial<Highcharts.AnimationOptionsObject>} [opt]\n * Animation options.\n *\n * @return {void}\n */\nexport function animate(el, params = { pos: 1 }, opt) {\n if (!isObject(opt)) { // Number or undefined/null\n opt = {\n duration: arguments[2],\n easing: arguments[3],\n complete: arguments[4]\n };\n }\n if (!isNumber(opt.duration)) {\n opt.duration = 400;\n }\n opt.easing = typeof opt.easing === 'function' ?\n opt.easing :\n (Math[opt.easing] || Math.easeInOutSine);\n opt.curAnim = merge(params);\n objectEach(params, (val, prop) => {\n // Stop current running animation of this property\n if (el) {\n stop(el, prop);\n }\n const fx = new Fx(el, opt, prop), d = params.d;\n let start = 0, end = void 0, unit = '';\n if (prop === 'd' && isArray(d)) {\n fx.paths = fx.initPath(el, el.pathArray, d);\n fx.toD = d;\n end = 1;\n }\n else if (el?.attr) {\n start = el.attr(prop);\n }\n else if (el) {\n start = +(getStyle(el, prop) || 0);\n if (prop !== 'opacity') {\n unit = 'px';\n }\n }\n if (!end) {\n end = val;\n }\n if (typeof end === 'string' && end.match('px')) {\n end = end.replace(/px/g, ''); // #4351\n }\n // Empty dashstyle animation crashes treemap on hover\n if (defined(end)) {\n fx.run(start, end, unit);\n }\n });\n}\n/**\n * Stop running animation.\n *\n * @function Highcharts.stop\n *\n * @param {Highcharts.SVGElement} el\n * The SVGElement to stop animation on.\n *\n * @param {string} [prop]\n * The property to stop animating. If given, the stop method will stop a\n * single property from animating, while others continue.\n *\n * @return {void}\n *\n * @todo\n * A possible extension to this would be to stop a single property, when\n * we want to continue animating others. Then assign the prop to the timer\n * in the Fx.run method, and check for the prop here. This would be an\n * improvement in all cases where we stop the animation from .attr. Instead of\n * stopping everything, we can just stop the actual attributes we're setting.\n */\nexport const stop = (el, prop) => Fx.timers.forEach((timer) => {\n if (timer.elem === el && (!prop || prop === timer.prop)) {\n timer.stopped = true; // #4667\n }\n});\n/* *\n *\n * API Options\n *\n * */\n/**\n * An animation configuration. Animation configurations can also be defined as\n * booleans, where `false` turns off animation and `true` defaults to a duration\n * of 500ms and defer of 0ms.\n *\n * @interface Highcharts.AnimationOptionsObject\n */ /**\n* A callback function to execute when the animation finishes.\n* @name Highcharts.AnimationOptionsObject#complete\n* @type {Function|undefined}\n*/ /**\n* The animation defer in milliseconds.\n* @name Highcharts.AnimationOptionsObject#defer\n* @type {number|undefined}\n*/ /**\n* The animation duration in milliseconds.\n* @name Highcharts.AnimationOptionsObject#duration\n* @type {number|undefined}\n*/ /**\n* The name of an easing function as defined on the `Math` object.\n* @name Highcharts.AnimationOptionsObject#easing\n* @type {string|Function|undefined}\n*/ /**\n* A callback function to execute on each step of each attribute or CSS property\n* that's being animated. The first argument contains information about the\n* animation and progress.\n* @name Highcharts.AnimationOptionsObject#step\n* @type {Function|undefined}\n*/\n''; // Keeps doclets in JS file\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10],"mappings":"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"}
|