highcharts 12.0.2 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/bower.json +1 -1
  2. package/es-modules/Accessibility/Options/A11yDefaults.js +2 -0
  3. package/es-modules/Core/Color/Color.js +5 -12
  4. package/es-modules/Core/Renderer/HTML/HTMLElement.js +1 -3
  5. package/es-modules/Core/Renderer/SVG/SVGElement.js +3 -1
  6. package/es-modules/Core/Renderer/SVG/SVGLabel.js +8 -11
  7. package/es-modules/Core/Series/DataLabel.js +3 -1
  8. package/es-modules/Core/Series/Series.js +13 -15
  9. package/es-modules/Core/Templating.js +14 -10
  10. package/es-modules/Core/Time.js +6 -3
  11. package/es-modules/Core/Utilities.js +1 -1
  12. package/es-modules/Data/Converters/CSVConverter.js +1 -0
  13. package/es-modules/Data/Converters/DataConverter.js +31 -0
  14. package/es-modules/Data/Converters/GoogleSheetsConverter.js +1 -0
  15. package/es-modules/Data/Converters/HTMLTableConverter.js +1 -0
  16. package/es-modules/Data/Converters/JSONConverter.js +1 -0
  17. package/es-modules/Extensions/Boost/BoostSeries.js +13 -7
  18. package/es-modules/Extensions/DragPanes/AxisResizer.js +1 -1
  19. package/es-modules/Extensions/SeriesLabel/SeriesLabelDefaults.js +7 -2
  20. package/es-modules/Series/Bubble/BubbleSeries.js +24 -0
  21. package/es-modules/Series/Organization/OrganizationSeriesDefaults.js +3 -1
  22. package/es-modules/Series/Timeline/TimelineSeriesDefaults.js +3 -1
  23. package/es-modules/Series/Treegraph/TreegraphSeriesDefaults.js +3 -1
  24. package/es-modules/Series/Treemap/TreemapPoint.js +7 -2
  25. package/es-modules/Series/Treemap/TreemapSeries.js +154 -53
  26. package/es-modules/Series/Treemap/TreemapSeriesDefaults.js +126 -4
  27. package/es-modules/Stock/Indicators/VBP/VBPIndicator.js +1 -0
  28. package/es-modules/Stock/RangeSelector/RangeSelector.js +68 -72
  29. package/es-modules/Stock/RangeSelector/RangeSelectorDefaults.js +10 -4
  30. package/es-modules/masters/indicators/indicators-all.src.js +4 -0
  31. package/es-modules/tsconfig.tsbuildinfo +1 -1
  32. package/highcharts-3d.js +2 -2
  33. package/highcharts-3d.src.js +1 -1
  34. package/highcharts-gantt.js +5 -5
  35. package/highcharts-gantt.src.js +140 -141
  36. package/highcharts-more.js +2 -2
  37. package/highcharts-more.src.js +25 -1
  38. package/highcharts.d.ts +281 -762
  39. package/highcharts.js +3 -3
  40. package/highcharts.src.d.ts +281 -762
  41. package/highcharts.src.js +57 -60
  42. package/highmaps.js +5 -5
  43. package/highmaps.src.js +84 -63
  44. package/highstock.js +5 -5
  45. package/highstock.src.js +140 -141
  46. package/indicators/acceleration-bands.js +2 -2
  47. package/indicators/acceleration-bands.src.js +1 -1
  48. package/indicators/accumulation-distribution.js +2 -2
  49. package/indicators/accumulation-distribution.src.js +1 -1
  50. package/indicators/ao.js +2 -2
  51. package/indicators/ao.src.js +1 -1
  52. package/indicators/apo.js +2 -2
  53. package/indicators/apo.src.js +1 -1
  54. package/indicators/aroon-oscillator.js +2 -2
  55. package/indicators/aroon-oscillator.src.js +1 -1
  56. package/indicators/aroon.js +2 -2
  57. package/indicators/aroon.src.js +1 -1
  58. package/indicators/atr.js +2 -2
  59. package/indicators/atr.src.js +1 -1
  60. package/indicators/bollinger-bands.js +2 -2
  61. package/indicators/bollinger-bands.src.js +1 -1
  62. package/indicators/cci.js +2 -2
  63. package/indicators/cci.src.js +1 -1
  64. package/indicators/chaikin.js +2 -2
  65. package/indicators/chaikin.src.js +1 -1
  66. package/indicators/cmf.js +2 -2
  67. package/indicators/cmf.src.js +1 -1
  68. package/indicators/cmo.js +2 -2
  69. package/indicators/cmo.src.js +1 -1
  70. package/indicators/dema.js +2 -2
  71. package/indicators/dema.src.js +1 -1
  72. package/indicators/disparity-index.js +2 -2
  73. package/indicators/disparity-index.src.js +1 -1
  74. package/indicators/dmi.js +2 -2
  75. package/indicators/dmi.src.js +1 -1
  76. package/indicators/dpo.js +2 -2
  77. package/indicators/dpo.src.js +1 -1
  78. package/indicators/ema.js +1 -1
  79. package/indicators/ichimoku-kinko-hyo.js +2 -2
  80. package/indicators/ichimoku-kinko-hyo.src.js +1 -1
  81. package/indicators/indicators-all.js +2 -2
  82. package/indicators/indicators-all.src.js +6 -1
  83. package/indicators/indicators.js +2 -2
  84. package/indicators/indicators.src.js +1 -1
  85. package/indicators/keltner-channels.js +2 -2
  86. package/indicators/keltner-channels.src.js +1 -1
  87. package/indicators/klinger.js +2 -2
  88. package/indicators/klinger.src.js +1 -1
  89. package/indicators/macd.js +2 -2
  90. package/indicators/macd.src.js +1 -1
  91. package/indicators/mfi.js +2 -2
  92. package/indicators/mfi.src.js +1 -1
  93. package/indicators/momentum.js +2 -2
  94. package/indicators/momentum.src.js +1 -1
  95. package/indicators/natr.js +2 -2
  96. package/indicators/natr.src.js +1 -1
  97. package/indicators/obv.js +2 -2
  98. package/indicators/obv.src.js +1 -1
  99. package/indicators/pivot-points.js +2 -2
  100. package/indicators/pivot-points.src.js +1 -1
  101. package/indicators/ppo.js +2 -2
  102. package/indicators/ppo.src.js +1 -1
  103. package/indicators/price-channel.js +2 -2
  104. package/indicators/price-channel.src.js +1 -1
  105. package/indicators/price-envelopes.js +2 -2
  106. package/indicators/price-envelopes.src.js +1 -1
  107. package/indicators/psar.js +2 -2
  108. package/indicators/psar.src.js +1 -1
  109. package/indicators/regressions.js +2 -2
  110. package/indicators/regressions.src.js +1 -1
  111. package/indicators/roc.js +2 -2
  112. package/indicators/roc.src.js +1 -1
  113. package/indicators/rsi.js +2 -2
  114. package/indicators/rsi.src.js +1 -1
  115. package/indicators/slow-stochastic.js +2 -2
  116. package/indicators/slow-stochastic.src.js +1 -1
  117. package/indicators/stochastic.js +2 -2
  118. package/indicators/stochastic.src.js +1 -1
  119. package/indicators/supertrend.js +2 -2
  120. package/indicators/supertrend.src.js +1 -1
  121. package/indicators/tema.js +2 -2
  122. package/indicators/tema.src.js +1 -1
  123. package/indicators/trendline.js +2 -2
  124. package/indicators/trendline.src.js +1 -1
  125. package/indicators/trix.js +2 -2
  126. package/indicators/trix.src.js +1 -1
  127. package/indicators/volume-by-price.js +2 -2
  128. package/indicators/volume-by-price.src.js +2 -1
  129. package/indicators/vwap.js +2 -2
  130. package/indicators/vwap.src.js +1 -1
  131. package/indicators/williams-r.js +2 -2
  132. package/indicators/williams-r.src.js +1 -1
  133. package/indicators/wma.js +2 -2
  134. package/indicators/wma.src.js +1 -1
  135. package/indicators/zigzag.js +2 -2
  136. package/indicators/zigzag.src.js +1 -1
  137. package/modules/accessibility.js +2 -2
  138. package/modules/accessibility.src.js +3 -1
  139. package/modules/annotations-advanced.js +3 -3
  140. package/modules/annotations-advanced.src.js +4 -4
  141. package/modules/annotations.js +2 -2
  142. package/modules/annotations.src.js +3 -3
  143. package/modules/arc-diagram.js +2 -2
  144. package/modules/arc-diagram.src.js +1 -1
  145. package/modules/arrow-symbols.js +2 -2
  146. package/modules/arrow-symbols.src.js +1 -1
  147. package/modules/boost-canvas.js +2 -2
  148. package/modules/boost-canvas.src.js +14 -11
  149. package/modules/boost.js +2 -2
  150. package/modules/boost.src.js +14 -11
  151. package/modules/broken-axis.js +2 -2
  152. package/modules/broken-axis.src.js +1 -1
  153. package/modules/bullet.js +2 -2
  154. package/modules/bullet.src.js +1 -1
  155. package/modules/coloraxis.js +2 -2
  156. package/modules/coloraxis.src.js +1 -1
  157. package/modules/current-date-indicator.js +2 -2
  158. package/modules/current-date-indicator.src.js +1 -1
  159. package/modules/cylinder.js +2 -2
  160. package/modules/cylinder.src.js +1 -1
  161. package/modules/data-tools.js +2 -2
  162. package/modules/data-tools.src.js +36 -1
  163. package/modules/data.js +2 -2
  164. package/modules/data.src.js +1 -1
  165. package/modules/datagrouping.js +2 -2
  166. package/modules/datagrouping.src.js +1 -1
  167. package/modules/debugger.js +2 -2
  168. package/modules/debugger.src.js +1 -1
  169. package/modules/dependency-wheel.js +2 -2
  170. package/modules/dependency-wheel.src.js +1 -1
  171. package/modules/dotplot.js +2 -2
  172. package/modules/dotplot.src.js +1 -1
  173. package/modules/drag-panes.js +2 -2
  174. package/modules/drag-panes.src.js +2 -2
  175. package/modules/draggable-points.js +2 -2
  176. package/modules/draggable-points.src.js +1 -1
  177. package/modules/drilldown.js +2 -2
  178. package/modules/drilldown.src.js +1 -1
  179. package/modules/dumbbell.js +2 -2
  180. package/modules/dumbbell.src.js +1 -1
  181. package/modules/export-data.js +2 -2
  182. package/modules/export-data.src.js +1 -1
  183. package/modules/exporting.js +2 -2
  184. package/modules/exporting.src.js +1 -1
  185. package/modules/flowmap.js +2 -2
  186. package/modules/flowmap.src.js +1 -1
  187. package/modules/full-screen.js +2 -2
  188. package/modules/full-screen.src.js +1 -1
  189. package/modules/funnel.js +2 -2
  190. package/modules/funnel.src.js +1 -1
  191. package/modules/funnel3d.js +2 -2
  192. package/modules/funnel3d.src.js +1 -1
  193. package/modules/gantt.js +6 -6
  194. package/modules/gantt.src.js +82 -80
  195. package/modules/geoheatmap.js +2 -2
  196. package/modules/geoheatmap.src.js +1 -1
  197. package/modules/grid-axis.js +2 -2
  198. package/modules/grid-axis.src.js +1 -1
  199. package/modules/heatmap.js +3 -3
  200. package/modules/heatmap.src.js +2 -2
  201. package/modules/heikinashi.js +2 -2
  202. package/modules/heikinashi.src.js +1 -1
  203. package/modules/histogram-bellcurve.js +2 -2
  204. package/modules/histogram-bellcurve.src.js +1 -1
  205. package/modules/hollowcandlestick.js +2 -2
  206. package/modules/hollowcandlestick.src.js +1 -1
  207. package/modules/item-series.js +2 -2
  208. package/modules/item-series.src.js +1 -1
  209. package/modules/lollipop.js +2 -2
  210. package/modules/lollipop.src.js +1 -1
  211. package/modules/map.js +4 -4
  212. package/modules/map.src.js +26 -2
  213. package/modules/marker-clusters.js +2 -2
  214. package/modules/marker-clusters.src.js +1 -1
  215. package/modules/mouse-wheel-zoom.js +2 -2
  216. package/modules/mouse-wheel-zoom.src.js +1 -1
  217. package/modules/navigator.js +2 -2
  218. package/modules/navigator.src.js +1 -1
  219. package/modules/networkgraph.js +2 -2
  220. package/modules/networkgraph.src.js +1 -1
  221. package/modules/no-data-to-display.js +2 -2
  222. package/modules/no-data-to-display.src.js +1 -1
  223. package/modules/offline-exporting.js +2 -2
  224. package/modules/offline-exporting.src.js +2 -2
  225. package/modules/organization.js +2 -2
  226. package/modules/organization.src.js +4 -2
  227. package/modules/overlapping-datalabels.js +2 -2
  228. package/modules/overlapping-datalabels.src.js +1 -1
  229. package/modules/parallel-coordinates.js +2 -2
  230. package/modules/parallel-coordinates.src.js +1 -1
  231. package/modules/pareto.js +2 -2
  232. package/modules/pareto.src.js +1 -1
  233. package/modules/pathfinder.js +2 -2
  234. package/modules/pathfinder.src.js +1 -1
  235. package/modules/pattern-fill.js +2 -2
  236. package/modules/pattern-fill.src.js +1 -1
  237. package/modules/pictorial.js +2 -2
  238. package/modules/pictorial.src.js +1 -1
  239. package/modules/pointandfigure.js +2 -2
  240. package/modules/pointandfigure.src.js +1 -1
  241. package/modules/price-indicator.js +2 -2
  242. package/modules/price-indicator.src.js +1 -1
  243. package/modules/pyramid3d.js +2 -2
  244. package/modules/pyramid3d.src.js +1 -1
  245. package/modules/renko.js +2 -2
  246. package/modules/renko.src.js +1 -1
  247. package/modules/sankey.js +2 -2
  248. package/modules/sankey.src.js +1 -1
  249. package/modules/series-label.js +2 -2
  250. package/modules/series-label.src.js +8 -3
  251. package/modules/series-on-point.js +2 -2
  252. package/modules/series-on-point.src.js +1 -1
  253. package/modules/solid-gauge.js +2 -2
  254. package/modules/solid-gauge.src.js +1 -1
  255. package/modules/sonification.js +2 -2
  256. package/modules/sonification.src.js +1 -1
  257. package/modules/static-scale.js +2 -2
  258. package/modules/static-scale.src.js +1 -1
  259. package/modules/stock-tools.js +2 -2
  260. package/modules/stock-tools.src.js +3 -3
  261. package/modules/stock.js +6 -6
  262. package/modules/stock.src.js +82 -80
  263. package/modules/streamgraph.js +2 -2
  264. package/modules/streamgraph.src.js +1 -1
  265. package/modules/sunburst.js +2 -2
  266. package/modules/sunburst.src.js +290 -62
  267. package/modules/textpath.js +2 -2
  268. package/modules/textpath.src.js +1 -1
  269. package/modules/tiledwebmap.js +3 -3
  270. package/modules/tiledwebmap.src.js +1 -1
  271. package/modules/tilemap.js +2 -2
  272. package/modules/tilemap.src.js +1 -1
  273. package/modules/timeline.js +2 -2
  274. package/modules/timeline.src.js +4 -2
  275. package/modules/treegraph.js +2 -2
  276. package/modules/treegraph.src.js +4 -2
  277. package/modules/treegrid.js +2 -2
  278. package/modules/treegrid.src.js +1 -1
  279. package/modules/treemap.js +2 -2
  280. package/modules/treemap.src.js +288 -60
  281. package/modules/variable-pie.js +2 -2
  282. package/modules/variable-pie.src.js +1 -1
  283. package/modules/variwide.js +2 -2
  284. package/modules/variwide.src.js +1 -1
  285. package/modules/vector.js +2 -2
  286. package/modules/vector.src.js +1 -1
  287. package/modules/venn.js +2 -2
  288. package/modules/venn.src.js +1 -1
  289. package/modules/windbarb.js +2 -2
  290. package/modules/windbarb.src.js +1 -1
  291. package/modules/wordcloud.js +2 -2
  292. package/modules/wordcloud.src.js +1 -1
  293. package/modules/xrange.js +2 -2
  294. package/modules/xrange.src.js +1 -1
  295. package/options/treegraph.d.ts +559 -70
  296. package/options/treegraph.src.d.ts +559 -70
  297. package/options/treemap.d.ts +314 -160
  298. package/options/treemap.src.d.ts +314 -160
  299. package/options/vbp.d.ts +1 -1
  300. package/options/vbp.src.d.ts +1 -1
  301. package/package.json +1 -1
  302. package/standalone-navigator.js +3 -3
  303. package/standalone-navigator.src.js +58 -61
  304. package/themes/avocado.js +2 -2
  305. package/themes/avocado.src.js +1 -1
  306. package/themes/brand-dark.js +2 -2
  307. package/themes/brand-dark.src.js +1 -1
  308. package/themes/brand-light.js +2 -2
  309. package/themes/brand-light.src.js +1 -1
  310. package/themes/dark-blue.js +2 -2
  311. package/themes/dark-blue.src.js +1 -1
  312. package/themes/dark-green.js +2 -2
  313. package/themes/dark-green.src.js +1 -1
  314. package/themes/dark-unica.js +2 -2
  315. package/themes/dark-unica.src.js +1 -1
  316. package/themes/gray.js +2 -2
  317. package/themes/gray.src.js +1 -1
  318. package/themes/grid-light.js +2 -2
  319. package/themes/grid-light.src.js +1 -1
  320. package/themes/grid.js +2 -2
  321. package/themes/grid.src.js +1 -1
  322. package/themes/high-contrast-dark.js +2 -2
  323. package/themes/high-contrast-dark.src.js +1 -1
  324. package/themes/high-contrast-light.js +2 -2
  325. package/themes/high-contrast-light.src.js +1 -1
  326. package/themes/sand-signika.js +2 -2
  327. package/themes/sand-signika.src.js +1 -1
  328. package/themes/skies.js +2 -2
  329. package/themes/skies.src.js +1 -1
  330. package/themes/sunset.js +2 -2
  331. package/themes/sunset.src.js +1 -1
package/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "highcharts",
3
- "version": "12.0.2",
3
+ "version": "12.1.0",
4
4
  "main": "highcharts.js",
5
5
  "license": "https://www.highcharts.com/license",
6
6
  "types": "highcharts.d.ts"
@@ -266,6 +266,8 @@ const Options = {
266
266
  /**
267
267
  * When a series contains more points than this, we no longer expose
268
268
  * information about individual points to screen readers.
269
+ * Note that the keyboard navigation remains functional, but points
270
+ * won't have accessible descriptions unless handled separately.
269
271
  *
270
272
  * Set to `false` to disable.
271
273
  *
@@ -192,18 +192,11 @@ class Color {
192
192
  }
193
193
  // Check for has alpha, because rgba colors perform worse due to
194
194
  // lack of support in WebKit.
195
- const hasAlpha = (toRgba[3] !== 1 || fromRgba[3] !== 1);
196
- return (hasAlpha ? 'rgba(' : 'rgb(') +
197
- Math.round(toRgba[0] + (fromRgba[0] - toRgba[0]) * (1 - pos)) +
198
- ',' +
199
- Math.round(toRgba[1] + (fromRgba[1] - toRgba[1]) * (1 - pos)) +
200
- ',' +
201
- Math.round(toRgba[2] + (fromRgba[2] - toRgba[2]) * (1 - pos)) +
202
- (hasAlpha ?
203
- (',' +
204
- (toRgba[3] + (fromRgba[3] - toRgba[3]) * (1 - pos))) :
205
- '') +
206
- ')';
195
+ 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);
196
+ if (hasAlpha) {
197
+ rgba.push(channel(toRgba[3], 3));
198
+ }
199
+ return (hasAlpha ? 'rgba(' : 'rgb(') + rgba.join(',') + ')';
207
200
  }
208
201
  }
209
202
  /* *
@@ -251,7 +251,7 @@ class HTMLElement extends SVGElement {
251
251
  textWidth,
252
252
  this.textAlign
253
253
  ].join(','), parentPadding = (this.parentGroup?.padding * -1) || 0;
254
- let baseline, hasBoxWidthChanged = false;
254
+ let baseline;
255
255
  // Update textWidth. Use the memoized textPxLength if possible, to
256
256
  // avoid the getTextPxLength function using elem.offsetWidth.
257
257
  // Calling offsetWidth affects rendering time as it forces layout
@@ -274,10 +274,8 @@ class HTMLElement extends SVGElement {
274
274
  whiteSpace: whiteSpace || 'normal' // #3331
275
275
  });
276
276
  this.oldTextWidth = textWidth;
277
- hasBoxWidthChanged = true; // #8159
278
277
  }
279
278
  }
280
- this.hasBoxWidthChanged = hasBoxWidthChanged; // #8159
281
279
  // Do the calculations and DOM access only if properties changed
282
280
  if (currentTextTransform !== this.cTT) {
283
281
  baseline = renderer.fontMetrics(element).b;
@@ -213,7 +213,9 @@ class SVGElement {
213
213
  * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.
214
214
  */
215
215
  align(alignOptions, alignByTranslate, alignTo, redraw = true) {
216
- const attribs = {}, renderer = this.renderer, alignedObjects = renderer.alignedObjects, initialAlignment = Boolean(alignOptions);
216
+ const attribs = {
217
+ 'text-align': alignOptions?.align
218
+ }, renderer = this.renderer, alignedObjects = renderer.alignedObjects, initialAlignment = Boolean(alignOptions);
217
219
  // First call on instanciate
218
220
  if (alignOptions) {
219
221
  this.alignOptions = alignOptions;
@@ -71,6 +71,7 @@ class SVGLabel extends SVGElement {
71
71
  * */
72
72
  alignSetter(value) {
73
73
  const alignFactor = getAlignFactor(value);
74
+ this.textAlign = value;
74
75
  if (alignFactor !== this.alignFactor) {
75
76
  this.alignFactor = alignFactor;
76
77
  // Bounding box exists, means we're dynamically changing
@@ -246,6 +247,7 @@ class SVGLabel extends SVGElement {
246
247
  }
247
248
  'text-alignSetter'(value) {
248
249
  this.textAlign = value;
250
+ this.updateTextPadding();
249
251
  }
250
252
  textSetter(text) {
251
253
  if (typeof text !== 'undefined') {
@@ -315,24 +317,19 @@ class SVGLabel extends SVGElement {
315
317
  * is changed.
316
318
  */
317
319
  updateTextPadding() {
318
- const text = this.text;
320
+ const text = this.text, textAlign = text.styles.textAlign || this.textAlign;
319
321
  if (!text.textPath) {
320
322
  this.updateBoxSize();
321
323
  // Determine y based on the baseline
322
324
  const textY = this.baseline ? 0 : this.baselineOffset, textX = (this.paddingLeft ?? this.padding) +
323
325
  // Compensate for alignment
324
- ((defined(this.widthSetting) && this.bBox) ?
325
- getAlignFactor(this.textAlign) *
326
- (this.widthSetting - this.bBox.width) :
327
- 0);
326
+ getAlignFactor(textAlign) * (this.widthSetting ?? this.bBox.width);
328
327
  // Update if anything changed
329
328
  if (textX !== text.x || textY !== text.y) {
330
- text.attr('x', textX);
331
- // #8159 - prevent misplaced data labels in treemap
332
- // (useHTML: true)
333
- if (text.hasBoxWidthChanged) {
334
- this.bBox = text.getBBox(true);
335
- }
329
+ text.attr({
330
+ align: textAlign,
331
+ x: textX
332
+ });
336
333
  if (typeof textY !== 'undefined') {
337
334
  text.attr('y', textY);
338
335
  }
@@ -110,7 +110,9 @@ var DataLabel;
110
110
  (unrotatedbBox.width - bBox.width);
111
111
  dataLabel.alignAttr.y += getAlignFactor(options.verticalAlign) *
112
112
  (unrotatedbBox.height - bBox.height);
113
- dataLabel[dataLabel.placed ? 'animate' : 'attr']({
113
+ dataLabel.attr({
114
+ 'text-align': dataLabel.alignAttr['text-align'] || 'center'
115
+ })[dataLabel.placed ? 'animate' : 'attr']({
114
116
  x: dataLabel.alignAttr.x +
115
117
  (bBox.width - unrotatedbBox.width) / 2,
116
118
  y: dataLabel.alignAttr.y +
@@ -2394,9 +2394,14 @@ class Series {
2394
2394
  * @private
2395
2395
  * @function Highcharts.Series#searchKDTree
2396
2396
  */
2397
- searchKDTree(point, compareX, e) {
2397
+ searchKDTree(point, compareX, e, suppliedPointEvaluator, suppliedBSideCheckEvaluator) {
2398
2398
  const series = this, [kdX, kdY] = this.kdAxisArray, kdComparer = compareX ? 'distX' : 'dist', kdDimensions = (series.options.findNearestPointBy || '')
2399
- .indexOf('y') > -1 ? 2 : 1, useRadius = !!series.isBubble;
2399
+ .indexOf('y') > -1 ? 2 : 1, useRadius = !!series.isBubble, pointEvaluator = suppliedPointEvaluator || ((p1, p2, comparisonProp) => [
2400
+ (p1[comparisonProp] || 0) < (p2[comparisonProp] || 0) ?
2401
+ p1 :
2402
+ p2,
2403
+ false
2404
+ ]), bSideCheckEvaluator = suppliedBSideCheckEvaluator || ((a, b) => a < b);
2400
2405
  /**
2401
2406
  * Set the one and two dimensional distance on the point object.
2402
2407
  * @private
@@ -2411,28 +2416,21 @@ class Series {
2411
2416
  */
2412
2417
  function doSearch(search, tree, depth, dimensions) {
2413
2418
  const point = tree.point, axis = series.kdAxisArray[depth % dimensions];
2414
- let nPoint1, nPoint2, ret = point;
2419
+ let ret = point, flip = false;
2415
2420
  setDistance(search, point);
2416
2421
  // Pick side based on distance to splitting point
2417
2422
  const tdist = (search[axis] || 0) - (point[axis] || 0) +
2418
2423
  (useRadius ? (point.marker?.radius || 0) : 0), sideA = tdist < 0 ? 'left' : 'right', sideB = tdist < 0 ? 'right' : 'left';
2419
2424
  // End of tree
2420
2425
  if (tree[sideA]) {
2421
- nPoint1 = doSearch(search, tree[sideA], depth + 1, dimensions);
2422
- ret = (nPoint1[kdComparer] <
2423
- ret[kdComparer] ?
2424
- nPoint1 :
2425
- point);
2426
+ [ret, flip] = pointEvaluator(point, doSearch(search, tree[sideA], depth + 1, dimensions), kdComparer);
2426
2427
  }
2427
2428
  if (tree[sideB]) {
2429
+ const sqrtTDist = Math.sqrt(tdist * tdist), retDist = ret[kdComparer];
2428
2430
  // Compare distance to current best to splitting point to decide
2429
- // whether to check side B or not
2430
- if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {
2431
- nPoint2 = doSearch(search, tree[sideB], depth + 1, dimensions);
2432
- ret = (nPoint2[kdComparer] <
2433
- ret[kdComparer] ?
2434
- nPoint2 :
2435
- ret);
2431
+ // whether to check side B or no
2432
+ if (bSideCheckEvaluator(sqrtTDist, retDist, flip)) {
2433
+ ret = pointEvaluator(ret, doSearch(search, tree[sideB], depth + 1, dimensions), kdComparer)[0];
2436
2434
  }
2437
2435
  }
2438
2436
  return ret;
@@ -13,7 +13,7 @@ const { defaultOptions, defaultTime } = D;
13
13
  import G from './Globals.js';
14
14
  const { doc } = G;
15
15
  import U from './Utilities.js';
16
- const { extend, getNestedProperty, isArray, isNumber, isObject, pick, ucfirst } = U;
16
+ const { extend, getNestedProperty, isArray, isNumber, isObject, isString, pick, ucfirst } = U;
17
17
  const helpers = {
18
18
  // Built-in helpers
19
19
  add: (a, b) => a + b,
@@ -48,6 +48,8 @@ const numberFormatCache = {};
48
48
  * Functions
49
49
  *
50
50
  * */
51
+ // Internal convenience function
52
+ const isQuotedString = (str) => /^["'].+["']$/.test(str);
51
53
  /**
52
54
  * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a
53
55
  * human readable date string. The format is a subset of the formats for PHP's
@@ -125,11 +127,11 @@ function dateFormat(format, timestamp, upperCaseFirst) {
125
127
  * The formatted string.
126
128
  */
127
129
  function format(str = '', ctx, chart) {
128
- const regex = /\{([\p{L}\d:\.,;\-\/<>\[\]%_@"'’= #\(\)]+)\}/gu,
130
+ const regex = /\{([\p{L}\d:\.,;\-\/<>\[\]%_@+"'’= #\(\)]+)\}/gu,
129
131
  // The sub expression regex is the same as the top expression regex,
130
132
  // but except parens and block helpers (#), and surrounded by parens
131
133
  // instead of curly brackets.
132
- subRegex = /\(([\p{L}\d:\.,;\-\/<>\[\]%_@"'= ]+)\)/gu, matches = [], floatRegex = /f$/, decRegex = /\.(\d)/, lang = chart?.options.lang || defaultOptions.lang, time = chart && chart.time || defaultTime, numberFormatter = chart && chart.numberFormatter || numberFormat;
134
+ subRegex = /\(([\p{L}\d:\.,;\-\/<>\[\]%_@+"'= ]+)\)/gu, matches = [], floatRegex = /f$/, decRegex = /\.(\d)/, lang = chart?.options.lang || defaultOptions.lang, time = chart && chart.time || defaultTime, numberFormatter = chart && chart.numberFormatter || numberFormat;
133
135
  /*
134
136
  * Get a literal or variable value inside a template expression. May be
135
137
  * extended with other types like string or null if needed, but keep it
@@ -147,7 +149,7 @@ function format(str = '', ctx, chart) {
147
149
  if ((n = Number(key)).toString() === key) {
148
150
  return n;
149
151
  }
150
- if (/^["'].+["']$/.test(key)) {
152
+ if (isQuotedString(key)) {
151
153
  return key.slice(1, -1);
152
154
  }
153
155
  // Variables and constants
@@ -260,7 +262,8 @@ function format(str = '', ctx, chart) {
260
262
  // Simple variable replacement
261
263
  }
262
264
  else {
263
- const valueAndFormat = expression.split(':');
265
+ const valueAndFormat = isQuotedString(expression) ?
266
+ [expression] : expression.split(':');
264
267
  replacement = resolveProperty(valueAndFormat.shift() || '');
265
268
  // Format the replacement
266
269
  if (valueAndFormat.length && typeof replacement === 'number') {
@@ -273,13 +276,14 @@ function format(str = '', ctx, chart) {
273
276
  }
274
277
  else {
275
278
  replacement = time.dateFormat(segment, replacement);
276
- // Use string literal in order to be preserved in the outer
277
- // expression
278
- if (hasSub) {
279
- replacement = `"${replacement}"`;
280
- }
281
279
  }
282
280
  }
281
+ // Use string literal in order to be preserved in the outer
282
+ // expression
283
+ subRegex.lastIndex = 0;
284
+ if (subRegex.test(match.find) && isString(replacement)) {
285
+ replacement = `"${replacement}"`;
286
+ }
283
287
  }
284
288
  str = str.replace(match.find, pick(replacement, ''));
285
289
  });
@@ -91,7 +91,9 @@ class Time {
91
91
  * Properties
92
92
  *
93
93
  * */
94
- this.options = {};
94
+ this.options = {
95
+ timezone: 'UTC'
96
+ };
95
97
  this.variableTimezone = false;
96
98
  this.Date = win.Date;
97
99
  this.update(options);
@@ -113,12 +115,13 @@ class Time {
113
115
  *
114
116
  */
115
117
  update(options = {}) {
116
- let timezone = options.timezone ?? 'UTC';
117
118
  this.dTLCache = {};
118
119
  this.options = options = merge(true, this.options, options);
119
120
  const { timezoneOffset, useUTC } = options;
120
121
  // Allow using a different Date class
121
122
  this.Date = options.Date || win.Date || Date;
123
+ // Assign the time zone. Handle the legacy, deprecated `useUTC` option.
124
+ let timezone = options.timezone;
122
125
  if (defined(useUTC)) {
123
126
  timezone = useUTC ? 'UTC' : void 0;
124
127
  }
@@ -561,7 +564,7 @@ class Time {
561
564
  }
562
565
  else if (isObject(format)) {
563
566
  const tzHours = (this.getTimezoneOffset(timestamp) || 0) /
564
- (60000 * 60), timeZone = this.options.timezone || ('Etc/GMT' + (tzHours >= 0 ? '+' : '') + tzHours), { prefix = '', suffix = '' } = format;
567
+ (60000 * 60), timeZone = this.timezone || ('Etc/GMT' + (tzHours >= 0 ? '+' : '') + tzHours), { prefix = '', suffix = '' } = format;
565
568
  format = prefix + this.dateTimeFormat(extend({ timeZone }, format), timestamp) + suffix;
566
569
  }
567
570
  // Optionally sentence-case the string and return
@@ -1094,7 +1094,7 @@ function getNestedProperty(path, parent) {
1094
1094
  }
1095
1095
  return thisProp ?? parent;
1096
1096
  }
1097
- const child = parent[pathElement];
1097
+ const child = parent[pathElement.replace(/[\\'"]/g, '')];
1098
1098
  // Filter on the child
1099
1099
  if (!defined(child) ||
1100
1100
  typeof child === 'function' ||
@@ -432,6 +432,7 @@ CSVConverter.defaultOptions = {
432
432
  ...DataConverter.defaultOptions,
433
433
  lineDelimiter: '\n'
434
434
  };
435
+ DataConverter.registerType('CSV', CSVConverter);
435
436
  /* *
436
437
  *
437
438
  * Default Export
@@ -12,6 +12,7 @@
12
12
  * - Gøran Slettemark
13
13
  * - Torstein Hønsi
14
14
  * - Wojciech Chmiel
15
+ * - Jomar Hønsi
15
16
  *
16
17
  * */
17
18
  'use strict';
@@ -560,11 +561,41 @@ DataConverter.defaultOptions = {
560
561
  * Declarations
561
562
  *
562
563
  * */
564
+ /* *
565
+ *
566
+ * Constants
567
+ *
568
+ * */
569
+ /**
570
+ * Registry as a record object with connector names and their class.
571
+ */
572
+ DataConverter.types = {};
563
573
  /* *
564
574
  *
565
575
  * Functions
566
576
  *
567
577
  * */
578
+ /**
579
+ * Adds a converter class to the registry.
580
+ *
581
+ * @private
582
+ *
583
+ * @param {string} key
584
+ * Registry key of the converter class.
585
+ *
586
+ * @param {DataConverterTypes} DataConverterClass
587
+ * Connector class (aka class constructor) to register.
588
+ *
589
+ * @return {boolean}
590
+ * Returns true, if the registration was successful. False is returned, if
591
+ * their is already a converter registered with this key.
592
+ */
593
+ function registerType(key, DataConverterClass) {
594
+ return (!!key &&
595
+ !DataConverter.types[key] &&
596
+ !!(DataConverter.types[key] = DataConverterClass));
597
+ }
598
+ DataConverter.registerType = registerType;
568
599
  /**
569
600
  * Converts an array of columns to a table instance. Second dimension of the
570
601
  * array are the row cells.
@@ -127,6 +127,7 @@ class GoogleSheetsConverter extends DataConverter {
127
127
  GoogleSheetsConverter.defaultOptions = {
128
128
  ...DataConverter.defaultOptions
129
129
  };
130
+ DataConverter.registerType('GoogleSheets', GoogleSheetsConverter);
130
131
  /* *
131
132
  *
132
133
  * Default Export
@@ -352,6 +352,7 @@ HTMLTableConverter.defaultOptions = {
352
352
  useRowspanHeaders: true,
353
353
  useMultiLevelHeaders: true
354
354
  };
355
+ DataConverter.registerType('HTMLTable', HTMLTableConverter);
355
356
  /* *
356
357
  *
357
358
  * Default Export
@@ -173,6 +173,7 @@ JSONConverter.defaultOptions = {
173
173
  data: [],
174
174
  orientation: 'rows'
175
175
  };
176
+ DataConverter.registerType('JSON', JSONConverter);
176
177
  /* *
177
178
  *
178
179
  * Default Export
@@ -547,10 +547,17 @@ function getPoint(series, boostPoint) {
547
547
  if (boostPoint instanceof PointClass) {
548
548
  return boostPoint;
549
549
  }
550
- const xData = ((series.getColumn('x').length ? series.getColumn('x') : void 0) ||
550
+ const isScatter = series.is('scatter'), xData = ((isScatter && series.getColumn('x', true).length ?
551
+ series.getColumn('x', true) :
552
+ void 0) ||
553
+ (series.getColumn('x').length ? series.getColumn('x') : void 0) ||
551
554
  seriesOptions.xData ||
552
555
  series.getColumn('x', true) ||
553
- false), point = new PointClass(series, (isArray(series.options.data) ? series.options.data : [])[boostPoint.i], xData ? xData[boostPoint.i] : void 0);
556
+ false), yData = (series.getColumn('y', true) ||
557
+ seriesOptions.yData ||
558
+ false), point = new PointClass(series, (isScatter && xData && yData) ?
559
+ [xData[boostPoint.i], yData[boostPoint.i]] :
560
+ (isArray(series.options.data) ? series.options.data : [])[boostPoint.i], xData ? xData[boostPoint.i] : void 0);
554
561
  point.category = pick(xAxis.categories ?
555
562
  xAxis.categories[point.x] :
556
563
  point.x, // @todo simplify
@@ -569,7 +576,6 @@ function getPoint(series, boostPoint) {
569
576
  * @private
570
577
  */
571
578
  function scatterProcessData(force) {
572
- var _a, _b, _c, _d;
573
579
  const series = this, { options, xAxis, yAxis } = series;
574
580
  // Process only on changes
575
581
  if (!series.isDirty &&
@@ -636,12 +642,12 @@ function scatterProcessData(force) {
636
642
  }
637
643
  }
638
644
  if (xRangeNeeded) {
639
- (_a = xAxis.options).max ?? (_a.max = xDataMax);
640
- (_b = xAxis.options).min ?? (_b.min = xDataMin);
645
+ xAxis.dataMax = Math.max(xDataMax, xAxis.dataMax || 0);
646
+ xAxis.dataMin = Math.min(xDataMin, xAxis.dataMin || 0);
641
647
  }
642
648
  if (yRangeNeeded) {
643
- (_c = yAxis.options).max ?? (_c.max = yDataMax);
644
- (_d = yAxis.options).min ?? (_d.min = yDataMin);
649
+ yAxis.dataMax = Math.max(yDataMax, yAxis.dataMax || 0);
650
+ yAxis.dataMin = Math.min(yDataMin, yAxis.dataMin || 0);
645
651
  }
646
652
  // Set properties as base processData
647
653
  series.cropped = cropped;
@@ -214,7 +214,7 @@ class AxisResizer {
214
214
  }
215
215
  top = axis.top;
216
216
  const minLength = Math.round(relativeLength(axisOptions.minLength || NaN, plotHeight)), maxLength = Math.round(relativeLength(axisOptions.maxLength || NaN, plotHeight));
217
- if (!isFirst) {
217
+ if (!isFirst && axesGroup === nextAxes) {
218
218
  // Try to change height first. yDelta could had changed
219
219
  yDelta = chartY - resizer.lastPos;
220
220
  // Normalize height to option limits
@@ -79,7 +79,9 @@ const SeriesLabelDefaults = {
79
79
  * small areas get a smaller font size. The default applies this
80
80
  * effect to area-like series but not line-like series.
81
81
  *
82
- * @type {number|null}
82
+ * @sample highcharts/demo/streamgraph
83
+ * Min and max font size on a streamgraph
84
+ * @type {number|null}
83
85
  */
84
86
  minFontSize: null,
85
87
  /**
@@ -87,7 +89,10 @@ const SeriesLabelDefaults = {
87
89
  * small areas get a smaller font size. The default applies this
88
90
  * effect to area-like series but not line-like series.
89
91
  *
90
- * @type {number|null}
92
+ * @sample highcharts/demo/streamgraph
93
+ * Min and max font size on a streamgraph
94
+ *
95
+ * @type {number|null}
91
96
  */
92
97
  maxFontSize: null,
93
98
  /**
@@ -325,6 +325,30 @@ class BubbleSeries extends ScatterSeries {
325
325
  }
326
326
  }
327
327
  }
328
+ /**
329
+ * @private
330
+ * @function Highcharts.Series#searchKDTree
331
+ */
332
+ searchKDTree(point, compareX, e, suppliedPointEvaluator = noop, suppliedBSideCheckEvaluator = noop) {
333
+ suppliedPointEvaluator = (p1, p2, comparisonProp) => {
334
+ const p1Dist = p1[comparisonProp] || 0;
335
+ const p2Dist = p2[comparisonProp] || 0;
336
+ let ret, flip = false;
337
+ if (p1Dist < 0 && p2Dist < 0) {
338
+ ret = (p1Dist - (p1.marker?.radius || 0) >=
339
+ p2Dist - (p2.marker?.radius || 0)) ?
340
+ p1 :
341
+ p2;
342
+ flip = true;
343
+ }
344
+ else {
345
+ ret = p1Dist < p2Dist ? p1 : p2;
346
+ }
347
+ return [ret, flip];
348
+ };
349
+ suppliedBSideCheckEvaluator = (a, b, flip) => !flip && (a > b) || (a < b);
350
+ return super.searchKDTree(point, compareX, e, suppliedPointEvaluator, suppliedBSideCheckEvaluator);
351
+ }
328
352
  }
329
353
  /* *
330
354
  *
@@ -209,7 +209,9 @@ const OrganizationSeriesDefaults = {
209
209
  /** @internal */
210
210
  fontWeight: 'normal',
211
211
  /** @internal */
212
- fontSize: '0.9em'
212
+ fontSize: '0.9em',
213
+ /** @internal */
214
+ textAlign: 'left'
213
215
  },
214
216
  useHTML: true,
215
217
  linkTextPath: {
@@ -150,7 +150,9 @@ const TimelineSeriesDefaults = {
150
150
  /** @internal */
151
151
  fontWeight: 'normal',
152
152
  /** @internal */
153
- fontSize: '0.8em'
153
+ fontSize: '0.8em',
154
+ /** @internal */
155
+ textAlign: 'left'
154
156
  },
155
157
  /**
156
158
  * Shadow options for the data label.
@@ -32,7 +32,7 @@
32
32
  * alternateStartingDirection, borderRadius, breadcrumbs,
33
33
  * interactByLeaf, layoutStartingDirection, levelIsConstant,
34
34
  * lineWidth, negativeColor, nodes, sortIndex, zoneAxis,
35
- * zones
35
+ * zones, cluster
36
36
  *
37
37
  * @product highcharts
38
38
  * @since 10.3.0
@@ -174,6 +174,7 @@ const TreegraphSeriesDefaults = {
174
174
  fillSpace: false,
175
175
  /**
176
176
  * @extends plotOptions.series.tooltip
177
+ * @excluding clusterFormat
177
178
  */
178
179
  tooltip: {
179
180
  /**
@@ -234,6 +235,7 @@ const TreegraphSeriesDefaults = {
234
235
  },
235
236
  enabled: true,
236
237
  linkFormatter: () => '',
238
+ padding: 5,
237
239
  style: {
238
240
  textOverflow: 'none'
239
241
  }
@@ -28,6 +28,7 @@ class TreemapPoint extends ScatterPoint {
28
28
  *
29
29
  * */
30
30
  super(...arguments);
31
+ this.groupedPointsAmount = 0;
31
32
  this.shapeType = 'rect';
32
33
  }
33
34
  /* *
@@ -46,11 +47,15 @@ class TreemapPoint extends ScatterPoint {
46
47
  this.node.children.length) {
47
48
  className += ' highcharts-above-level';
48
49
  }
49
- else if (!this.node.isLeaf &&
50
+ else if (!this.node.isGroup &&
51
+ !this.node.isLeaf &&
52
+ !series.nodeMap[series.rootNode].isGroup &&
50
53
  !pick(options.interactByLeaf, !options.allowTraversingTree)) {
51
54
  className += ' highcharts-internal-node-interactive';
52
55
  }
53
- else if (!this.node.isLeaf) {
56
+ else if (!this.node.isGroup &&
57
+ !this.node.isLeaf &&
58
+ !series.nodeMap[series.rootNode].isGroup) {
54
59
  className += ' highcharts-internal-node';
55
60
  }
56
61
  return className;