highcharts 9.1.1 → 9.2.2

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 (718) hide show
  1. package/bower.json +1 -1
  2. package/css/annotations/popup.css +29 -28
  3. package/css/annotations/popup.scss +29 -27
  4. package/css/highcharts.css +15 -0
  5. package/css/highcharts.scss +12 -0
  6. package/css/stocktools/gui.css +1 -0
  7. package/css/stocktools/gui.scss +1 -0
  8. package/css/themes/dark-unica.css +15 -0
  9. package/css/themes/grid-light.css +15 -0
  10. package/css/themes/sand-signika.css +15 -0
  11. package/es-modules/Accessibility/Components/InfoRegionsComponent.js +8 -2
  12. package/es-modules/Accessibility/Components/LegendComponent.js +19 -8
  13. package/es-modules/Accessibility/Components/MenuComponent.js +19 -13
  14. package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +4 -8
  15. package/es-modules/Accessibility/FocusBorder.js +1 -3
  16. package/es-modules/Accessibility/Options/LangOptions.js +3 -3
  17. package/es-modules/Accessibility/Utils/Announcer.js +22 -5
  18. package/es-modules/Accessibility/Utils/ChartUtilities.js +6 -1
  19. package/es-modules/Core/Animation/AnimationUtilities.js +12 -4
  20. package/es-modules/Core/Animation/Fx.js +15 -12
  21. package/es-modules/Core/Axis/Axis.js +25 -13
  22. package/es-modules/Core/Axis/AxisDefaults.js +0 -1
  23. package/es-modules/Core/Axis/BrokenAxis.js +32 -15
  24. package/es-modules/Core/Axis/Color/ColorAxis.js +665 -0
  25. package/es-modules/Core/Axis/Color/ColorAxisComposition.js +237 -0
  26. package/es-modules/Core/Axis/Color/ColorAxisDefaults.js +434 -0
  27. package/es-modules/Core/Axis/DateTimeAxis.js +163 -133
  28. package/es-modules/Core/Axis/GridAxis.js +8 -3
  29. package/es-modules/Core/Axis/LogarithmicAxis.js +159 -117
  30. package/es-modules/Core/Axis/OrdinalAxis.js +666 -460
  31. package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js +874 -0
  32. package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js +292 -0
  33. package/es-modules/Core/Axis/RadialAxis.js +858 -745
  34. package/es-modules/Core/Axis/ScrollbarAxis.js +7 -0
  35. package/es-modules/Core/Axis/StackingAxis.js +159 -140
  36. package/es-modules/Core/Axis/Tick.js +17 -27
  37. package/es-modules/Core/Chart/Chart.js +24 -38
  38. package/es-modules/Core/Chart/ChartDefaults.js +1 -1
  39. package/es-modules/Core/Chart/StockChart.js +12 -0
  40. package/es-modules/Core/Color/Color.js +96 -104
  41. package/es-modules/Core/DefaultOptions.js +269 -248
  42. package/es-modules/Core/Foundation.js +9 -8
  43. package/es-modules/Core/Geometry/CircleUtilities.js +385 -0
  44. package/es-modules/Core/Geometry/GeometryUtilities.js +83 -0
  45. package/es-modules/Core/Globals.js +23 -1
  46. package/es-modules/{Extensions/Ajax.js → Core/HttpUtilities.js} +86 -42
  47. package/es-modules/Core/{Legend.js → Legend/Legend.js} +142 -116
  48. package/es-modules/{Mixins → Core/Legend}/LegendSymbol.js +54 -38
  49. package/es-modules/Core/Navigator.js +3 -0
  50. package/es-modules/Core/Pointer.js +9 -0
  51. package/es-modules/Core/Renderer/HTML/AST.js +100 -82
  52. package/es-modules/Core/Renderer/HTML/HTMLElement.js +17 -7
  53. package/es-modules/Core/Renderer/HTML/HTMLRenderer.js +26 -9
  54. package/es-modules/Core/Renderer/RendererRegistry.js +9 -4
  55. package/es-modules/Core/Renderer/RendererUtilities.js +159 -0
  56. package/es-modules/Core/Renderer/SVG/SVGElement.js +13 -7
  57. package/es-modules/Core/Renderer/SVG/SVGLabel.js +9 -29
  58. package/es-modules/Core/Renderer/SVG/SVGRenderer.js +2 -2
  59. package/es-modules/Core/Renderer/SVG/TextBuilder.js +18 -16
  60. package/es-modules/Core/Responsive.js +166 -148
  61. package/es-modules/Core/Series/DataLabel.js +564 -0
  62. package/es-modules/Core/Series/Point.js +233 -209
  63. package/es-modules/Core/Series/Series.js +174 -2339
  64. package/es-modules/Core/Series/SeriesDefaults.js +2293 -0
  65. package/es-modules/Core/Series/SeriesRegistry.js +3 -9
  66. package/es-modules/Core/Time.js +78 -2
  67. package/es-modules/Core/Tooltip.js +178 -236
  68. package/es-modules/Core/Utilities.js +409 -394
  69. package/es-modules/Extensions/Annotations/Annotations.js +102 -49
  70. package/es-modules/Extensions/Annotations/Mixins/EventEmitterMixin.js +9 -1
  71. package/es-modules/Extensions/Annotations/NavigationBindings.js +30 -25
  72. package/es-modules/Extensions/Annotations/Popup.js +16 -7
  73. package/es-modules/Extensions/Boost/BoostOverrides.js +5 -1
  74. package/es-modules/Extensions/Boost/WGLRenderer.js +5 -4
  75. package/es-modules/Extensions/Boost/WGLVBuffer.js +3 -0
  76. package/es-modules/Extensions/BoostCanvas.js +1 -1
  77. package/es-modules/Extensions/CurrentDateIndication.js +1 -1
  78. package/es-modules/Extensions/Data.js +82 -76
  79. package/es-modules/Extensions/DataGrouping.js +225 -184
  80. package/es-modules/Extensions/Debugger/ErrorMessages.js +2 -2
  81. package/es-modules/Extensions/DraggablePoints.js +13 -5
  82. package/es-modules/Extensions/Drilldown.js +41 -14
  83. package/es-modules/Extensions/ExportData.js +7 -4
  84. package/es-modules/Extensions/Exporting/Exporting.js +1273 -0
  85. package/es-modules/Extensions/Exporting/ExportingDefaults.js +803 -0
  86. package/es-modules/Extensions/Exporting/ExportingSymbols.js +73 -0
  87. package/es-modules/Extensions/FullScreen.js +7 -5
  88. package/es-modules/Extensions/NoDataToDisplay.js +1 -1
  89. package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +617 -0
  90. package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +58 -0
  91. package/es-modules/Extensions/Oldie/Oldie.js +1 -1
  92. package/es-modules/Extensions/Pane.js +0 -1
  93. package/es-modules/Extensions/PatternFill.js +23 -10
  94. package/es-modules/Extensions/Polar.js +2 -1
  95. package/es-modules/Extensions/RangeSelector.js +1 -1
  96. package/es-modules/Extensions/Themes/Avocado.js +49 -20
  97. package/es-modules/Extensions/Themes/DarkBlue.js +226 -203
  98. package/es-modules/Extensions/Themes/DarkGreen.js +231 -203
  99. package/es-modules/Extensions/Themes/DarkUnica.js +201 -172
  100. package/es-modules/Extensions/Themes/Gray.js +228 -205
  101. package/es-modules/Extensions/Themes/Grid.js +109 -81
  102. package/es-modules/Extensions/Themes/GridLight.js +83 -55
  103. package/es-modules/Extensions/Themes/HighContrastDark.js +192 -164
  104. package/es-modules/Extensions/Themes/HighContrastLight.js +49 -21
  105. package/es-modules/Extensions/Themes/SandSignika.js +115 -86
  106. package/es-modules/Extensions/Themes/Skies.js +102 -74
  107. package/es-modules/Extensions/Themes/Sunset.js +47 -19
  108. package/es-modules/Mixins/ColorSeries.js +0 -1
  109. package/es-modules/Mixins/MultipleLines.js +6 -0
  110. package/es-modules/Mixins/TreeSeries.js +1 -1
  111. package/es-modules/Series/Area/AreaSeries.js +2 -2
  112. package/es-modules/Series/AreaSpline/AreaSplineSeries.js +2 -2
  113. package/es-modules/Series/Bubble/BubbleLegendComposition.js +279 -0
  114. package/es-modules/Series/Bubble/BubbleLegendDefaults.js +267 -0
  115. package/es-modules/Series/Bubble/BubbleLegendItem.js +472 -0
  116. package/es-modules/Series/Bubble/BubbleSeries.js +6 -2
  117. package/es-modules/Series/Column/ColumnDataLabel.js +109 -0
  118. package/es-modules/Series/Column/ColumnSeries.js +39 -26
  119. package/es-modules/Series/Column3D/Column3DComposition.js +5 -2
  120. package/es-modules/Series/Flags/FlagsSeries.js +8 -1
  121. package/es-modules/Series/Gantt/GanttSeries.js +3 -3
  122. package/es-modules/Series/Heatmap/HeatmapSeries.js +9 -5
  123. package/es-modules/Series/HeikinAshi/HeikinAshiPoint.js +60 -0
  124. package/es-modules/Series/HeikinAshi/HeikinAshiSeries.js +277 -0
  125. package/es-modules/Series/HollowCandlestick/HollowCandlestickPoint.js +83 -0
  126. package/es-modules/Series/HollowCandlestick/HollowCandlestickSeries.js +370 -0
  127. package/es-modules/Series/Line/LineSeries.js +12 -8
  128. package/es-modules/Series/Map/MapSeries.js +5 -3
  129. package/es-modules/Series/MapBubble/MapBubbleSeries.js +6 -5
  130. package/es-modules/Series/OHLC/OHLCPoint.js +11 -0
  131. package/es-modules/Series/PackedBubble/PackedBubbleSeries.js +3 -1
  132. package/es-modules/Series/Pie/PieDataLabel.js +448 -0
  133. package/es-modules/Series/Pie/PiePoint.js +35 -34
  134. package/es-modules/Series/Pie/PieSeries.js +19 -16
  135. package/es-modules/Series/Polygon/PolygonSeries.js +3 -3
  136. package/es-modules/Series/Sankey/SankeySeries.js +9 -7
  137. package/es-modules/Series/SolidGauge/SolidGaugeSeries.js +2 -2
  138. package/es-modules/Series/Sunburst/SunburstSeries.js +1 -14
  139. package/es-modules/Series/Timeline/TimelinePoint.js +6 -0
  140. package/es-modules/Series/Timeline/TimelineSeries.js +14 -17
  141. package/es-modules/Series/Treemap/TreemapSeries.js +3 -3
  142. package/es-modules/Series/Venn/VennSeries.js +4 -4
  143. package/es-modules/Series/Venn/VennUtils.js +10 -16
  144. package/es-modules/Series/Waterfall/WaterfallSeries.js +40 -35
  145. package/es-modules/Series/Wordcloud/WordcloudSeries.js +1 -0
  146. package/es-modules/Series/XRange/XRangeSeries.js +4 -2
  147. package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +92 -75
  148. package/es-modules/Stock/Indicators/Supertrend/SupertrendIndicator.js +20 -8
  149. package/es-modules/Stock/Indicators/VBP/VBPIndicator.js +17 -4
  150. package/es-modules/Stock/StockToolsBindings.js +77 -38
  151. package/es-modules/Stock/StockToolsGui.js +28 -3
  152. package/es-modules/masters/highcharts-3d.src.js +1 -1
  153. package/es-modules/masters/highcharts-gantt.src.js +1 -1
  154. package/es-modules/masters/highcharts-more.src.js +11 -7
  155. package/es-modules/masters/highcharts.src.js +25 -9
  156. package/es-modules/masters/highmaps.src.js +1 -1
  157. package/es-modules/masters/highstock.src.js +1 -1
  158. package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
  159. package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
  160. package/es-modules/masters/indicators/ao.src.js +1 -1
  161. package/es-modules/masters/indicators/apo.src.js +1 -1
  162. package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
  163. package/es-modules/masters/indicators/aroon.src.js +1 -1
  164. package/es-modules/masters/indicators/atr.src.js +1 -1
  165. package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
  166. package/es-modules/masters/indicators/cci.src.js +1 -1
  167. package/es-modules/masters/indicators/chaikin.src.js +1 -1
  168. package/es-modules/masters/indicators/cmf.src.js +1 -1
  169. package/es-modules/masters/indicators/cmo.src.js +1 -1
  170. package/es-modules/masters/indicators/dema.src.js +1 -1
  171. package/es-modules/masters/indicators/disparity-index.src.js +1 -1
  172. package/es-modules/masters/indicators/dmi.src.js +1 -1
  173. package/es-modules/masters/indicators/dpo.src.js +1 -1
  174. package/es-modules/masters/indicators/ema.src.js +1 -1
  175. package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
  176. package/es-modules/masters/indicators/indicators-all.src.js +1 -1
  177. package/es-modules/masters/indicators/indicators.src.js +1 -1
  178. package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
  179. package/es-modules/masters/indicators/klinger.src.js +1 -1
  180. package/es-modules/masters/indicators/macd.src.js +1 -1
  181. package/es-modules/masters/indicators/mfi.src.js +1 -1
  182. package/es-modules/masters/indicators/momentum.src.js +1 -1
  183. package/es-modules/masters/indicators/natr.src.js +1 -1
  184. package/es-modules/masters/indicators/obv.src.js +1 -1
  185. package/es-modules/masters/indicators/pivot-points.src.js +1 -1
  186. package/es-modules/masters/indicators/ppo.src.js +1 -1
  187. package/es-modules/masters/indicators/price-channel.src.js +1 -1
  188. package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
  189. package/es-modules/masters/indicators/psar.src.js +1 -1
  190. package/es-modules/masters/indicators/regressions.src.js +1 -1
  191. package/es-modules/masters/indicators/roc.src.js +1 -1
  192. package/es-modules/masters/indicators/rsi.src.js +1 -1
  193. package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
  194. package/es-modules/masters/indicators/stochastic.src.js +1 -1
  195. package/es-modules/masters/indicators/supertrend.src.js +1 -1
  196. package/es-modules/masters/indicators/tema.src.js +1 -1
  197. package/es-modules/masters/indicators/trendline.src.js +1 -1
  198. package/es-modules/masters/indicators/trix.src.js +1 -1
  199. package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
  200. package/es-modules/masters/indicators/vwap.src.js +1 -1
  201. package/es-modules/masters/indicators/williams-r.src.js +1 -1
  202. package/es-modules/masters/indicators/wma.src.js +1 -1
  203. package/es-modules/masters/indicators/zigzag.src.js +1 -1
  204. package/es-modules/masters/modules/accessibility.src.js +1 -1
  205. package/es-modules/masters/modules/annotations-advanced.src.js +1 -1
  206. package/es-modules/masters/modules/annotations.src.js +1 -1
  207. package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
  208. package/es-modules/masters/modules/boost-canvas.src.js +1 -1
  209. package/es-modules/masters/modules/boost.src.js +1 -1
  210. package/es-modules/masters/modules/broken-axis.src.js +1 -1
  211. package/es-modules/masters/modules/bullet.src.js +1 -1
  212. package/es-modules/masters/modules/coloraxis.src.js +6 -2
  213. package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
  214. package/es-modules/masters/modules/cylinder.src.js +1 -1
  215. package/es-modules/masters/modules/data.src.js +8 -1
  216. package/es-modules/masters/modules/datagrouping.src.js +1 -1
  217. package/es-modules/masters/modules/debugger.src.js +1 -1
  218. package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
  219. package/es-modules/masters/modules/dotplot.src.js +1 -1
  220. package/es-modules/masters/modules/drag-panes.src.js +1 -1
  221. package/es-modules/masters/modules/draggable-points.src.js +1 -1
  222. package/es-modules/masters/modules/drilldown.src.js +1 -1
  223. package/es-modules/masters/modules/dumbbell.src.js +1 -1
  224. package/es-modules/masters/modules/export-data.src.js +1 -1
  225. package/es-modules/masters/modules/exporting.src.js +10 -2
  226. package/es-modules/masters/modules/full-screen.src.js +1 -1
  227. package/es-modules/masters/modules/funnel.src.js +1 -1
  228. package/es-modules/masters/modules/funnel3d.src.js +1 -1
  229. package/es-modules/masters/modules/gantt.src.js +9 -4
  230. package/es-modules/masters/modules/grid-axis.src.js +1 -1
  231. package/es-modules/masters/modules/heatmap.src.js +6 -2
  232. package/es-modules/masters/modules/heikinashi.src.js +14 -0
  233. package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
  234. package/es-modules/masters/modules/hollowcandlestick.src.js +14 -0
  235. package/es-modules/masters/modules/item-series.src.js +1 -1
  236. package/es-modules/masters/modules/lollipop.src.js +1 -1
  237. package/es-modules/masters/modules/map.src.js +10 -6
  238. package/es-modules/masters/modules/marker-clusters.src.js +1 -1
  239. package/es-modules/masters/modules/networkgraph.src.js +1 -1
  240. package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
  241. package/es-modules/masters/modules/offline-exporting.src.js +8 -2
  242. package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
  243. package/es-modules/masters/modules/oldie.src.js +1 -1
  244. package/es-modules/masters/modules/organization.src.js +1 -1
  245. package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
  246. package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
  247. package/es-modules/masters/modules/pareto.src.js +1 -1
  248. package/es-modules/masters/modules/pathfinder.src.js +1 -1
  249. package/es-modules/masters/modules/pattern-fill.src.js +1 -1
  250. package/es-modules/masters/modules/price-indicator.src.js +1 -1
  251. package/es-modules/masters/modules/pyramid3d.src.js +1 -1
  252. package/es-modules/masters/modules/sankey.src.js +1 -1
  253. package/es-modules/masters/modules/series-label.src.js +1 -1
  254. package/es-modules/masters/modules/solid-gauge.src.js +1 -1
  255. package/es-modules/masters/modules/sonification.src.js +1 -1
  256. package/es-modules/masters/modules/static-scale.src.js +1 -1
  257. package/es-modules/masters/modules/stock-tools.src.js +1 -1
  258. package/es-modules/masters/modules/stock.src.js +3 -2
  259. package/es-modules/masters/modules/streamgraph.src.js +1 -1
  260. package/es-modules/masters/modules/sunburst.src.js +1 -1
  261. package/es-modules/masters/modules/tilemap.src.js +1 -1
  262. package/es-modules/masters/modules/timeline.src.js +1 -1
  263. package/es-modules/masters/modules/treegrid.src.js +1 -1
  264. package/es-modules/masters/modules/treemap.src.js +1 -1
  265. package/es-modules/masters/modules/variable-pie.src.js +1 -1
  266. package/es-modules/masters/modules/variwide.src.js +1 -1
  267. package/es-modules/masters/modules/vector.src.js +1 -1
  268. package/es-modules/masters/modules/venn.src.js +1 -1
  269. package/es-modules/masters/modules/windbarb.src.js +1 -1
  270. package/es-modules/masters/modules/wordcloud.src.js +1 -1
  271. package/es-modules/masters/modules/xrange.src.js +1 -1
  272. package/es-modules/masters/themes/avocado.src.js +5 -2
  273. package/es-modules/masters/themes/dark-blue.src.js +5 -2
  274. package/es-modules/masters/themes/dark-green.src.js +5 -2
  275. package/es-modules/masters/themes/dark-unica.src.js +5 -2
  276. package/es-modules/masters/themes/gray.src.js +5 -2
  277. package/es-modules/masters/themes/grid-light.src.js +5 -2
  278. package/es-modules/masters/themes/grid.src.js +5 -2
  279. package/es-modules/masters/themes/high-contrast-dark.src.js +5 -2
  280. package/es-modules/masters/themes/high-contrast-light.src.js +5 -2
  281. package/es-modules/masters/themes/sand-signika.src.js +5 -2
  282. package/es-modules/masters/themes/skies.src.js +5 -2
  283. package/es-modules/masters/themes/sunset.src.js +5 -2
  284. package/gfx/stock-icons/annotations-hidden.svg +1 -1
  285. package/gfx/stock-icons/annotations-visible.svg +2 -2
  286. package/gfx/stock-icons/arrow-bottom.svg +1 -1
  287. package/gfx/stock-icons/arrow-left.svg +1 -1
  288. package/gfx/stock-icons/arrow-line.svg +1 -1
  289. package/gfx/stock-icons/arrow-ray.svg +1 -1
  290. package/gfx/stock-icons/arrow-right.svg +1 -1
  291. package/gfx/stock-icons/arrow-segment.svg +1 -2
  292. package/gfx/stock-icons/circle.svg +1 -1
  293. package/gfx/stock-icons/close.svg +2 -2
  294. package/gfx/stock-icons/crooked-3.svg +1 -1
  295. package/gfx/stock-icons/crooked-5.svg +1 -1
  296. package/gfx/stock-icons/current-price-hide.svg +3 -3
  297. package/gfx/stock-icons/current-price-show.svg +2 -2
  298. package/gfx/stock-icons/destroy.svg +1 -1
  299. package/gfx/stock-icons/drawing.svg +18 -0
  300. package/gfx/stock-icons/edit.svg +1 -1
  301. package/gfx/stock-icons/elliott-3.svg +1 -1
  302. package/gfx/stock-icons/elliott-5.svg +1 -1
  303. package/gfx/stock-icons/ellipse.svg +11 -0
  304. package/gfx/stock-icons/fibonacci-timezone.svg +16 -0
  305. package/gfx/stock-icons/fibonacci.svg +1 -1
  306. package/gfx/stock-icons/flag-basic.svg +1 -1
  307. package/gfx/stock-icons/flag-diamond.svg +2 -2
  308. package/gfx/stock-icons/flag-elipse.svg +1 -1
  309. package/gfx/stock-icons/flag-trapeze.svg +2 -2
  310. package/gfx/stock-icons/fullscreen.svg +4 -4
  311. package/gfx/stock-icons/horizontal-line.svg +1 -1
  312. package/gfx/stock-icons/indicators.svg +3 -3
  313. package/gfx/stock-icons/label.svg +4 -4
  314. package/gfx/stock-icons/line.svg +1 -1
  315. package/gfx/stock-icons/linear.svg +11 -0
  316. package/gfx/stock-icons/logarithmic.svg +1 -0
  317. package/gfx/stock-icons/measure-x.svg +2 -2
  318. package/gfx/stock-icons/measure-xy.svg +1 -1
  319. package/gfx/stock-icons/measure-y.svg +1 -1
  320. package/gfx/stock-icons/panning.svg +17 -0
  321. package/gfx/stock-icons/parallel-channel.svg +1 -1
  322. package/gfx/stock-icons/pitchfork.svg +1 -1
  323. package/gfx/stock-icons/ray.svg +1 -1
  324. package/gfx/stock-icons/rectangle.svg +1 -1
  325. package/gfx/stock-icons/remove-annotations.svg +2 -2
  326. package/gfx/stock-icons/save-chart.svg +3 -3
  327. package/gfx/stock-icons/segment.svg +1 -1
  328. package/gfx/stock-icons/separator.svg +1 -1
  329. package/gfx/stock-icons/series-candlestick.svg +1 -1
  330. package/gfx/stock-icons/series-heikin-ashi.svg +1 -0
  331. package/gfx/stock-icons/series-hlc.svg +1 -0
  332. package/gfx/stock-icons/series-hollow-candlestick.svg +1 -0
  333. package/gfx/stock-icons/series-line.svg +1 -1
  334. package/gfx/stock-icons/series-ohlc.svg +4 -4
  335. package/gfx/stock-icons/time-cycles.svg +35 -0
  336. package/gfx/stock-icons/vertical-arrow.svg +1 -1
  337. package/gfx/stock-icons/vertical-counter.svg +1 -1
  338. package/gfx/stock-icons/vertical-double-arrow.svg +1 -1
  339. package/gfx/stock-icons/vertical-label.svg +3 -3
  340. package/gfx/stock-icons/vertical-line.svg +1 -1
  341. package/gfx/stock-icons/zoom-x.svg +2 -2
  342. package/gfx/stock-icons/zoom-xy.svg +2 -2
  343. package/gfx/stock-icons/zoom-y.svg +2 -2
  344. package/highcharts-3d.js +24 -24
  345. package/highcharts-3d.js.map +1 -1
  346. package/highcharts-3d.src.js +6 -3
  347. package/highcharts-gantt.js +800 -792
  348. package/highcharts-gantt.js.map +1 -1
  349. package/highcharts-gantt.src.js +16535 -15918
  350. package/highcharts-more.d.ts +73 -1
  351. package/highcharts-more.js +193 -192
  352. package/highcharts-more.js.map +1 -1
  353. package/highcharts-more.src.d.ts +73 -1
  354. package/highcharts-more.src.js +8044 -7839
  355. package/highcharts.d.ts +3850 -177
  356. package/highcharts.js +589 -581
  357. package/highcharts.js.map +1 -1
  358. package/highcharts.src.d.ts +3850 -177
  359. package/highcharts.src.js +16635 -16060
  360. package/highmaps.js +708 -698
  361. package/highmaps.js.map +1 -1
  362. package/highmaps.src.js +17419 -16521
  363. package/highstock.js +782 -769
  364. package/highstock.js.map +1 -1
  365. package/highstock.src.js +28867 -27975
  366. package/indicators/acceleration-bands.js +9 -9
  367. package/indicators/acceleration-bands.js.map +1 -1
  368. package/indicators/acceleration-bands.src.js +7 -1
  369. package/indicators/accumulation-distribution.js +1 -1
  370. package/indicators/accumulation-distribution.src.js +1 -1
  371. package/indicators/ao.js +1 -1
  372. package/indicators/ao.src.js +1 -1
  373. package/indicators/apo.js +1 -1
  374. package/indicators/apo.src.js +1 -1
  375. package/indicators/aroon-oscillator.js +9 -9
  376. package/indicators/aroon-oscillator.js.map +1 -1
  377. package/indicators/aroon-oscillator.src.js +7 -1
  378. package/indicators/aroon.js +9 -9
  379. package/indicators/aroon.js.map +1 -1
  380. package/indicators/aroon.src.js +7 -1
  381. package/indicators/atr.js +1 -1
  382. package/indicators/atr.src.js +1 -1
  383. package/indicators/bollinger-bands.js +9 -9
  384. package/indicators/bollinger-bands.js.map +1 -1
  385. package/indicators/bollinger-bands.src.js +7 -1
  386. package/indicators/cci.js +1 -1
  387. package/indicators/cci.src.js +1 -1
  388. package/indicators/chaikin.js +1 -1
  389. package/indicators/chaikin.src.js +1 -1
  390. package/indicators/cmf.js +1 -1
  391. package/indicators/cmf.src.js +1 -1
  392. package/indicators/cmo.js +1 -1
  393. package/indicators/cmo.src.js +1 -1
  394. package/indicators/dema.js +1 -1
  395. package/indicators/dema.src.js +1 -1
  396. package/indicators/disparity-index.js +1 -1
  397. package/indicators/disparity-index.src.js +1 -1
  398. package/indicators/dmi.js +11 -11
  399. package/indicators/dmi.js.map +1 -1
  400. package/indicators/dmi.src.js +7 -1
  401. package/indicators/dpo.js +1 -1
  402. package/indicators/dpo.src.js +1 -1
  403. package/indicators/ema.js +1 -1
  404. package/indicators/ema.src.js +1 -1
  405. package/indicators/ichimoku-kinko-hyo.js +1 -1
  406. package/indicators/ichimoku-kinko-hyo.src.js +1 -1
  407. package/indicators/indicators-all.js +203 -200
  408. package/indicators/indicators-all.js.map +1 -1
  409. package/indicators/indicators-all.src.js +206 -104
  410. package/indicators/indicators.js +12 -11
  411. package/indicators/indicators.js.map +1 -1
  412. package/indicators/indicators.src.js +108 -90
  413. package/indicators/keltner-channels.js +9 -9
  414. package/indicators/keltner-channels.js.map +1 -1
  415. package/indicators/keltner-channels.src.js +7 -1
  416. package/indicators/klinger.js +13 -13
  417. package/indicators/klinger.js.map +1 -1
  418. package/indicators/klinger.src.js +7 -1
  419. package/indicators/macd.js +1 -1
  420. package/indicators/macd.src.js +1 -1
  421. package/indicators/mfi.js +1 -1
  422. package/indicators/mfi.src.js +1 -1
  423. package/indicators/momentum.js +1 -1
  424. package/indicators/momentum.src.js +1 -1
  425. package/indicators/natr.js +1 -1
  426. package/indicators/natr.src.js +1 -1
  427. package/indicators/obv.js +1 -1
  428. package/indicators/obv.src.js +1 -1
  429. package/indicators/pivot-points.js +1 -1
  430. package/indicators/pivot-points.src.js +1 -1
  431. package/indicators/ppo.js +1 -1
  432. package/indicators/ppo.src.js +1 -1
  433. package/indicators/price-channel.js +9 -9
  434. package/indicators/price-channel.js.map +1 -1
  435. package/indicators/price-channel.src.js +7 -1
  436. package/indicators/price-envelopes.js +1 -1
  437. package/indicators/price-envelopes.src.js +1 -1
  438. package/indicators/psar.js +1 -1
  439. package/indicators/psar.src.js +1 -1
  440. package/indicators/regressions.js +1 -1
  441. package/indicators/regressions.src.js +1 -1
  442. package/indicators/roc.js +1 -1
  443. package/indicators/roc.src.js +1 -1
  444. package/indicators/rsi.js +1 -1
  445. package/indicators/rsi.src.js +1 -1
  446. package/indicators/slow-stochastic.js +1 -1
  447. package/indicators/slow-stochastic.src.js +1 -1
  448. package/indicators/stochastic.js +10 -10
  449. package/indicators/stochastic.js.map +1 -1
  450. package/indicators/stochastic.src.js +7 -1
  451. package/indicators/supertrend.js +10 -10
  452. package/indicators/supertrend.js.map +1 -1
  453. package/indicators/supertrend.src.js +23 -10
  454. package/indicators/tema.js +1 -1
  455. package/indicators/tema.src.js +1 -1
  456. package/indicators/trendline.js +1 -1
  457. package/indicators/trendline.src.js +1 -1
  458. package/indicators/trix.js +1 -1
  459. package/indicators/trix.src.js +1 -1
  460. package/indicators/volume-by-price.js +17 -15
  461. package/indicators/volume-by-price.js.map +1 -1
  462. package/indicators/volume-by-price.src.js +71 -6
  463. package/indicators/vwap.js +1 -1
  464. package/indicators/vwap.src.js +1 -1
  465. package/indicators/williams-r.js +1 -1
  466. package/indicators/williams-r.src.js +1 -1
  467. package/indicators/wma.js +1 -1
  468. package/indicators/wma.src.js +1 -1
  469. package/indicators/zigzag.js +1 -1
  470. package/indicators/zigzag.src.js +1 -1
  471. package/modules/accessibility.js +203 -202
  472. package/modules/accessibility.js.map +1 -1
  473. package/modules/accessibility.src.js +89 -49
  474. package/modules/annotations-advanced.js +164 -163
  475. package/modules/annotations-advanced.js.map +1 -1
  476. package/modules/annotations-advanced.src.js +162 -87
  477. package/modules/annotations.js +111 -111
  478. package/modules/annotations.js.map +1 -1
  479. package/modules/annotations.src.js +162 -87
  480. package/modules/arrow-symbols.js +1 -1
  481. package/modules/arrow-symbols.src.js +1 -1
  482. package/modules/boost-canvas.js +2 -2
  483. package/modules/boost-canvas.js.map +1 -1
  484. package/modules/boost-canvas.src.js +2 -2
  485. package/modules/boost.js +52 -52
  486. package/modules/boost.js.map +1 -1
  487. package/modules/boost.src.js +15 -7
  488. package/modules/broken-axis.js +13 -13
  489. package/modules/broken-axis.js.map +1 -1
  490. package/modules/broken-axis.src.js +34 -15
  491. package/modules/bullet.js +1 -1
  492. package/modules/bullet.src.js +1 -1
  493. package/modules/coloraxis.js +24 -22
  494. package/modules/coloraxis.js.map +1 -1
  495. package/modules/coloraxis.src.js +954 -774
  496. package/modules/current-date-indicator.js +2 -2
  497. package/modules/current-date-indicator.js.map +1 -1
  498. package/modules/current-date-indicator.src.js +2 -2
  499. package/modules/cylinder.js +1 -1
  500. package/modules/cylinder.src.js +1 -1
  501. package/modules/data.js +33 -32
  502. package/modules/data.js.map +1 -1
  503. package/modules/data.src.js +182 -134
  504. package/modules/datagrouping.d.ts +5 -0
  505. package/modules/datagrouping.js +20 -20
  506. package/modules/datagrouping.js.map +1 -1
  507. package/modules/datagrouping.src.d.ts +5 -0
  508. package/modules/datagrouping.src.js +270 -228
  509. package/modules/debugger.js +3 -3
  510. package/modules/debugger.js.map +1 -1
  511. package/modules/debugger.src.js +3 -3
  512. package/modules/dependency-wheel.js +1 -1
  513. package/modules/dependency-wheel.src.js +1 -1
  514. package/modules/dotplot.js +1 -1
  515. package/modules/dotplot.src.js +1 -1
  516. package/modules/drag-panes.js +1 -1
  517. package/modules/drag-panes.src.js +1 -1
  518. package/modules/draggable-points.js +34 -34
  519. package/modules/draggable-points.js.map +1 -1
  520. package/modules/draggable-points.src.js +14 -5
  521. package/modules/drilldown.d.ts +27 -0
  522. package/modules/drilldown.js +18 -18
  523. package/modules/drilldown.js.map +1 -1
  524. package/modules/drilldown.src.d.ts +27 -0
  525. package/modules/drilldown.src.js +42 -16
  526. package/modules/dumbbell.js +1 -1
  527. package/modules/dumbbell.src.js +1 -1
  528. package/modules/export-data.js +20 -20
  529. package/modules/export-data.js.map +1 -1
  530. package/modules/export-data.src.js +8 -5
  531. package/modules/exporting.d.ts +29 -0
  532. package/modules/exporting.js +38 -35
  533. package/modules/exporting.js.map +1 -1
  534. package/modules/exporting.src.d.ts +29 -0
  535. package/modules/exporting.src.js +1937 -1614
  536. package/modules/full-screen.js +2 -2
  537. package/modules/full-screen.js.map +1 -1
  538. package/modules/full-screen.src.js +8 -6
  539. package/modules/funnel.js +1 -1
  540. package/modules/funnel.src.js +1 -1
  541. package/modules/funnel3d.js +1 -1
  542. package/modules/funnel3d.src.js +1 -1
  543. package/modules/gantt.js +218 -217
  544. package/modules/gantt.js.map +1 -1
  545. package/modules/gantt.src.js +74 -32
  546. package/modules/grid-axis.js +23 -22
  547. package/modules/grid-axis.js.map +1 -1
  548. package/modules/grid-axis.src.js +9 -4
  549. package/modules/heatmap.js +39 -37
  550. package/modules/heatmap.js.map +1 -1
  551. package/modules/heatmap.src.js +963 -779
  552. package/modules/heikinashi.js +17 -0
  553. package/modules/heikinashi.js.map +1 -0
  554. package/modules/heikinashi.src.js +394 -0
  555. package/modules/histogram-bellcurve.js +1 -1
  556. package/modules/histogram-bellcurve.src.js +1 -1
  557. package/modules/hollowcandlestick.js +18 -0
  558. package/modules/hollowcandlestick.js.map +1 -0
  559. package/modules/hollowcandlestick.src.js +504 -0
  560. package/modules/item-series.js +1 -1
  561. package/modules/item-series.src.js +1 -1
  562. package/modules/lollipop.js +1 -1
  563. package/modules/lollipop.src.js +1 -1
  564. package/modules/map.d.ts +9 -0
  565. package/modules/map.js +122 -119
  566. package/modules/map.js.map +1 -1
  567. package/modules/map.src.d.ts +9 -0
  568. package/modules/map.src.js +1655 -1332
  569. package/modules/marker-clusters.js +1 -1
  570. package/modules/marker-clusters.src.js +1 -1
  571. package/modules/networkgraph.js +1 -1
  572. package/modules/networkgraph.src.js +1 -1
  573. package/modules/no-data-to-display.js +3 -3
  574. package/modules/no-data-to-display.js.map +1 -1
  575. package/modules/no-data-to-display.src.js +2 -2
  576. package/modules/offline-exporting.js +18 -16
  577. package/modules/offline-exporting.js.map +1 -1
  578. package/modules/offline-exporting.src.js +623 -562
  579. package/modules/oldie-polyfills.js +1 -1
  580. package/modules/oldie-polyfills.src.js +1 -1
  581. package/modules/oldie.js +2 -2
  582. package/modules/oldie.src.js +2 -2
  583. package/modules/organization.js +1 -1
  584. package/modules/organization.src.js +1 -1
  585. package/modules/overlapping-datalabels.js +1 -1
  586. package/modules/overlapping-datalabels.src.js +1 -1
  587. package/modules/parallel-coordinates.js +1 -1
  588. package/modules/parallel-coordinates.src.js +1 -1
  589. package/modules/pareto.js +1 -1
  590. package/modules/pareto.src.js +1 -1
  591. package/modules/pathfinder.js +1 -1
  592. package/modules/pathfinder.src.js +1 -1
  593. package/modules/pattern-fill.js +14 -14
  594. package/modules/pattern-fill.js.map +1 -1
  595. package/modules/pattern-fill.src.js +24 -12
  596. package/modules/price-indicator.js +1 -1
  597. package/modules/price-indicator.src.js +1 -1
  598. package/modules/pyramid3d.js +1 -1
  599. package/modules/pyramid3d.src.js +1 -1
  600. package/modules/sankey.js +28 -28
  601. package/modules/sankey.js.map +1 -1
  602. package/modules/sankey.src.js +11 -11
  603. package/modules/series-label.js +1 -1
  604. package/modules/series-label.src.js +1 -1
  605. package/modules/solid-gauge.js +2 -2
  606. package/modules/solid-gauge.js.map +1 -1
  607. package/modules/solid-gauge.src.js +3 -3
  608. package/modules/sonification.js +1 -1
  609. package/modules/sonification.src.js +1 -1
  610. package/modules/static-scale.js +1 -1
  611. package/modules/static-scale.src.js +1 -1
  612. package/modules/stock-tools.js +159 -157
  613. package/modules/stock-tools.js.map +1 -1
  614. package/modules/stock-tools.src.js +253 -123
  615. package/modules/stock.d.ts +5 -0
  616. package/modules/stock.js +196 -191
  617. package/modules/stock.js.map +1 -1
  618. package/modules/stock.src.d.ts +5 -0
  619. package/modules/stock.src.js +7749 -7432
  620. package/modules/streamgraph.js +1 -1
  621. package/modules/streamgraph.src.js +1 -1
  622. package/modules/sunburst.js +5 -5
  623. package/modules/sunburst.js.map +1 -1
  624. package/modules/sunburst.src.js +6 -19
  625. package/modules/tilemap.js +1 -1
  626. package/modules/tilemap.src.js +1 -1
  627. package/modules/timeline.js +18 -17
  628. package/modules/timeline.js.map +1 -1
  629. package/modules/timeline.src.js +21 -24
  630. package/modules/treegrid.js +57 -57
  631. package/modules/treegrid.js.map +1 -1
  632. package/modules/treegrid.src.js +43 -19
  633. package/modules/treemap.js +5 -5
  634. package/modules/treemap.js.map +1 -1
  635. package/modules/treemap.src.js +5 -5
  636. package/modules/variable-pie.js +1 -1
  637. package/modules/variable-pie.src.js +1 -1
  638. package/modules/variwide.js +1 -1
  639. package/modules/variwide.src.js +1 -1
  640. package/modules/vector.js +1 -1
  641. package/modules/vector.src.js +1 -1
  642. package/modules/venn.js +31 -30
  643. package/modules/venn.js.map +1 -1
  644. package/modules/venn.src.js +508 -424
  645. package/modules/windbarb.js +1 -1
  646. package/modules/windbarb.src.js +1 -1
  647. package/modules/wordcloud.js +4 -4
  648. package/modules/wordcloud.js.map +1 -1
  649. package/modules/wordcloud.src.js +2 -1
  650. package/modules/xrange.js +17 -17
  651. package/modules/xrange.js.map +1 -1
  652. package/modules/xrange.src.js +7 -4
  653. package/package.json +1 -1
  654. package/themes/avocado.d.ts +6 -1
  655. package/themes/avocado.js +3 -3
  656. package/themes/avocado.js.map +1 -1
  657. package/themes/avocado.src.d.ts +6 -1
  658. package/themes/avocado.src.js +53 -22
  659. package/themes/dark-blue.d.ts +6 -1
  660. package/themes/dark-blue.js +3 -3
  661. package/themes/dark-blue.js.map +1 -1
  662. package/themes/dark-blue.src.d.ts +6 -1
  663. package/themes/dark-blue.src.js +231 -205
  664. package/themes/dark-green.d.ts +6 -1
  665. package/themes/dark-green.js +4 -4
  666. package/themes/dark-green.js.map +1 -1
  667. package/themes/dark-green.src.d.ts +6 -1
  668. package/themes/dark-green.src.js +236 -205
  669. package/themes/dark-unica.d.ts +6 -1
  670. package/themes/dark-unica.js +7 -7
  671. package/themes/dark-unica.js.map +1 -1
  672. package/themes/dark-unica.src.d.ts +6 -1
  673. package/themes/dark-unica.src.js +206 -174
  674. package/themes/gray.d.ts +6 -1
  675. package/themes/gray.js +3 -3
  676. package/themes/gray.js.map +1 -1
  677. package/themes/gray.src.d.ts +6 -1
  678. package/themes/gray.src.js +233 -207
  679. package/themes/grid-light.d.ts +6 -1
  680. package/themes/grid-light.js +4 -4
  681. package/themes/grid-light.js.map +1 -1
  682. package/themes/grid-light.src.d.ts +6 -1
  683. package/themes/grid-light.src.js +88 -57
  684. package/themes/grid.d.ts +6 -1
  685. package/themes/grid.js +3 -3
  686. package/themes/grid.js.map +1 -1
  687. package/themes/grid.src.d.ts +6 -1
  688. package/themes/grid.src.js +114 -83
  689. package/themes/high-contrast-dark.js +5 -4
  690. package/themes/high-contrast-dark.js.map +1 -1
  691. package/themes/high-contrast-dark.src.js +197 -166
  692. package/themes/high-contrast-light.js +3 -3
  693. package/themes/high-contrast-light.js.map +1 -1
  694. package/themes/high-contrast-light.src.js +54 -23
  695. package/themes/sand-signika.d.ts +6 -1
  696. package/themes/sand-signika.js +5 -5
  697. package/themes/sand-signika.js.map +1 -1
  698. package/themes/sand-signika.src.d.ts +6 -1
  699. package/themes/sand-signika.src.js +119 -88
  700. package/themes/skies.d.ts +6 -1
  701. package/themes/skies.js +5 -5
  702. package/themes/skies.js.map +1 -1
  703. package/themes/skies.src.d.ts +6 -1
  704. package/themes/skies.src.js +107 -76
  705. package/themes/sunset.d.ts +6 -1
  706. package/themes/sunset.js +3 -3
  707. package/themes/sunset.js.map +1 -1
  708. package/themes/sunset.src.d.ts +6 -1
  709. package/themes/sunset.src.js +52 -21
  710. package/es-modules/Core/Axis/ColorAxis.js +0 -1164
  711. package/es-modules/Core/Axis/HiddenAxis.js +0 -46
  712. package/es-modules/Core/Axis/PlotLineOrBand.js +0 -1051
  713. package/es-modules/Core/Series/DataLabels.js +0 -1173
  714. package/es-modules/Extensions/Exporting.js +0 -2024
  715. package/es-modules/Extensions/OfflineExporting.js +0 -621
  716. package/es-modules/Mixins/Geometry.js +0 -56
  717. package/es-modules/Mixins/GeometryCircles.js +0 -320
  718. package/es-modules/Series/Bubble/BubbleLegend.js +0 -893
@@ -1,1173 +0,0 @@
1
- /* *
2
- *
3
- * (c) 2010-2021 Torstein Honsi
4
- *
5
- * License: www.highcharts.com/license
6
- *
7
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8
- *
9
- * */
10
- 'use strict';
11
- import A from '../Animation/AnimationUtilities.js';
12
- var getDeferredAnimation = A.getDeferredAnimation;
13
- import F from '../FormatUtilities.js';
14
- var format = F.format;
15
- import H from '../Globals.js';
16
- var noop = H.noop;
17
- import palette from '../Color/Palette.js';
18
- import Series from '../Series/Series.js';
19
- import SeriesRegistry from './SeriesRegistry.js';
20
- var seriesTypes = SeriesRegistry.seriesTypes;
21
- import U from '../Utilities.js';
22
- var arrayMax = U.arrayMax, clamp = U.clamp, defined = U.defined, extend = U.extend, fireEvent = U.fireEvent, isArray = U.isArray, merge = U.merge, objectEach = U.objectEach, pick = U.pick, relativeLength = U.relativeLength, splat = U.splat, stableSort = U.stableSort;
23
- /**
24
- * Callback JavaScript function to format the data label as a string. Note that
25
- * if a `format` is defined, the format takes precedence and the formatter is
26
- * ignored.
27
- *
28
- * @callback Highcharts.DataLabelsFormatterCallbackFunction
29
- *
30
- * @param {Highcharts.PointLabelObject} this
31
- * Data label context to format
32
- *
33
- * @param {Highcharts.DataLabelsOptions} options
34
- * [API options](/highcharts/plotOptions.series.dataLabels) of the data label
35
- *
36
- * @return {number|string|null|undefined}
37
- * Formatted data label text
38
- */
39
- /**
40
- * Values for handling data labels that flow outside the plot area.
41
- *
42
- * @typedef {"allow"|"justify"} Highcharts.DataLabelsOverflowValue
43
- */
44
- ''; // detach doclets above
45
- /* eslint-disable valid-jsdoc */
46
- /**
47
- * General distribution algorithm for distributing labels of differing size
48
- * along a confined length in two dimensions. The algorithm takes an array of
49
- * objects containing a size, a target and a rank. It will place the labels as
50
- * close as possible to their targets, skipping the lowest ranked labels if
51
- * necessary.
52
- *
53
- * @private
54
- * @function Highcharts.distribute
55
- * @param {Highcharts.DataLabelsBoxArray} boxes
56
- * @param {number} len
57
- * @param {number} [maxDistance]
58
- * @return {void}
59
- */
60
- H.distribute = function (boxes, len, maxDistance) {
61
- var i, overlapping = true, origBoxes = boxes, // Original array will be altered with added .pos
62
- restBoxes = [], // The outranked overshoot
63
- box, target, total = 0, reducedLen = origBoxes.reducedLen || len;
64
- /**
65
- * @private
66
- */
67
- function sortByTarget(a, b) {
68
- return a.target - b.target;
69
- }
70
- // If the total size exceeds the len, remove those boxes with the lowest
71
- // rank
72
- i = boxes.length;
73
- while (i--) {
74
- total += boxes[i].size;
75
- }
76
- // Sort by rank, then slice away overshoot
77
- if (total > reducedLen) {
78
- stableSort(boxes, function (a, b) {
79
- return (b.rank || 0) - (a.rank || 0);
80
- });
81
- i = 0;
82
- total = 0;
83
- while (total <= reducedLen) {
84
- total += boxes[i].size;
85
- i++;
86
- }
87
- restBoxes = boxes.splice(i - 1, boxes.length);
88
- }
89
- // Order by target
90
- stableSort(boxes, sortByTarget);
91
- // So far we have been mutating the original array. Now
92
- // create a copy with target arrays
93
- boxes = boxes.map(function (box) {
94
- return {
95
- size: box.size,
96
- targets: [box.target],
97
- align: pick(box.align, 0.5)
98
- };
99
- });
100
- while (overlapping) {
101
- // Initial positions: target centered in box
102
- i = boxes.length;
103
- while (i--) {
104
- box = boxes[i];
105
- // Composite box, average of targets
106
- target = (Math.min.apply(0, box.targets) +
107
- Math.max.apply(0, box.targets)) / 2;
108
- box.pos = clamp(target - box.size * box.align, 0, len - box.size);
109
- }
110
- // Detect overlap and join boxes
111
- i = boxes.length;
112
- overlapping = false;
113
- while (i--) {
114
- // Overlap
115
- if (i > 0 &&
116
- boxes[i - 1].pos + boxes[i - 1].size >
117
- boxes[i].pos) {
118
- // Add this size to the previous box
119
- boxes[i - 1].size += boxes[i].size;
120
- boxes[i - 1].targets = boxes[i - 1]
121
- .targets
122
- .concat(boxes[i].targets);
123
- boxes[i - 1].align = 0.5;
124
- // Overlapping right, push left
125
- if (boxes[i - 1].pos + boxes[i - 1].size > len) {
126
- boxes[i - 1].pos = len - boxes[i - 1].size;
127
- }
128
- boxes.splice(i, 1); // Remove this item
129
- overlapping = true;
130
- }
131
- }
132
- }
133
- // Add the rest (hidden boxes)
134
- origBoxes.push.apply(origBoxes, restBoxes);
135
- // Now the composite boxes are placed, we need to put the original boxes
136
- // within them
137
- i = 0;
138
- boxes.some(function (box) {
139
- var posInCompositeBox = 0;
140
- if (box.targets.some(function () {
141
- origBoxes[i].pos = box.pos + posInCompositeBox;
142
- // If the distance between the position and the target exceeds
143
- // maxDistance, abort the loop and decrease the length in increments
144
- // of 10% to recursively reduce the number of visible boxes by
145
- // rank. Once all boxes are within the maxDistance, we're good.
146
- if (typeof maxDistance !== 'undefined' &&
147
- Math.abs(origBoxes[i].pos - origBoxes[i].target) > maxDistance) {
148
- // Reset the positions that are already set
149
- origBoxes.slice(0, i + 1).forEach(function (box) {
150
- delete box.pos;
151
- });
152
- // Try with a smaller length
153
- origBoxes.reducedLen =
154
- (origBoxes.reducedLen || len) - (len * 0.1);
155
- // Recurse
156
- if (origBoxes.reducedLen > len * 0.1) {
157
- H.distribute(origBoxes, len, maxDistance);
158
- }
159
- // Exceeded maxDistance => abort
160
- return true;
161
- }
162
- posInCompositeBox += origBoxes[i].size;
163
- i++;
164
- })) {
165
- // Exceeded maxDistance => abort
166
- return true;
167
- }
168
- });
169
- // Add the rest (hidden) boxes and sort by target
170
- stableSort(origBoxes, sortByTarget);
171
- };
172
- /**
173
- * Draw the data labels
174
- *
175
- * @private
176
- * @function Highcharts.Series#drawDataLabels
177
- * @return {void}
178
- * @fires Highcharts.Series#event:afterDrawDataLabels
179
- */
180
- Series.prototype.drawDataLabels = function () {
181
- var series = this, chart = series.chart, seriesOptions = series.options, seriesDlOptions = seriesOptions.dataLabels, points = series.points, pointOptions, hasRendered = series.hasRendered || 0, dataLabelsGroup, dataLabelAnim = seriesDlOptions.animation, animationConfig = seriesDlOptions.defer ?
182
- getDeferredAnimation(chart, dataLabelAnim, series) :
183
- { defer: 0, duration: 0 }, renderer = chart.renderer;
184
- /**
185
- * Handle the dataLabels.filter option.
186
- * @private
187
- */
188
- function applyFilter(point, options) {
189
- var filter = options.filter, op, prop, val;
190
- if (filter) {
191
- op = filter.operator;
192
- prop = point[filter.property];
193
- val = filter.value;
194
- if ((op === '>' && prop > val) ||
195
- (op === '<' && prop < val) ||
196
- (op === '>=' && prop >= val) ||
197
- (op === '<=' && prop <= val) ||
198
- (op === '==' && prop == val) || // eslint-disable-line eqeqeq
199
- (op === '===' && prop === val)) {
200
- return true;
201
- }
202
- return false;
203
- }
204
- return true;
205
- }
206
- /**
207
- * Merge two objects that can be arrays. If one of them is an array, the
208
- * other is merged into each element. If both are arrays, each element is
209
- * merged by index. If neither are arrays, we use normal merge.
210
- * @private
211
- */
212
- function mergeArrays(one, two) {
213
- var res = [], i;
214
- if (isArray(one) && !isArray(two)) {
215
- res = one.map(function (el) {
216
- return merge(el, two);
217
- });
218
- }
219
- else if (isArray(two) && !isArray(one)) {
220
- res = two.map(function (el) {
221
- return merge(one, el);
222
- });
223
- }
224
- else if (!isArray(one) && !isArray(two)) {
225
- res = merge(one, two);
226
- }
227
- else {
228
- i = Math.max(one.length, two.length);
229
- while (i--) {
230
- res[i] = merge(one[i], two[i]);
231
- }
232
- }
233
- return res;
234
- }
235
- // Merge in plotOptions.dataLabels for series
236
- seriesDlOptions = mergeArrays(mergeArrays(chart.options.plotOptions &&
237
- chart.options.plotOptions.series &&
238
- chart.options.plotOptions.series.dataLabels, chart.options.plotOptions &&
239
- chart.options.plotOptions[series.type] &&
240
- chart.options.plotOptions[series.type].dataLabels), seriesDlOptions);
241
- fireEvent(this, 'drawDataLabels');
242
- if (isArray(seriesDlOptions) ||
243
- seriesDlOptions.enabled ||
244
- series._hasPointLabels) {
245
- // Create a separate group for the data labels to avoid rotation
246
- dataLabelsGroup = series.plotGroup('dataLabelsGroup', 'data-labels', !hasRendered ? 'hidden' : 'inherit', // #5133, #10220
247
- seriesDlOptions.zIndex || 6);
248
- dataLabelsGroup.attr({ opacity: +hasRendered }); // #3300
249
- if (!hasRendered) {
250
- var group = series.dataLabelsGroup;
251
- if (group) {
252
- if (series.visible) { // #2597, #3023, #3024
253
- dataLabelsGroup.show(true);
254
- }
255
- group[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, animationConfig);
256
- }
257
- }
258
- // Make the labels for each point
259
- points.forEach(function (point) {
260
- // Merge in series options for the point.
261
- // @note dataLabelAttribs (like pointAttribs) would eradicate
262
- // the need for dlOptions, and simplify the section below.
263
- pointOptions = splat(mergeArrays(seriesDlOptions, point.dlOptions || // dlOptions is used in treemaps
264
- (point.options && point.options.dataLabels)));
265
- // Handle each individual data label for this point
266
- pointOptions.forEach(function (labelOptions, i) {
267
- // Options for one datalabel
268
- var labelEnabled = (labelOptions.enabled &&
269
- // #2282, #4641, #7112, #10049
270
- (!point.isNull || point.dataLabelOnNull) &&
271
- applyFilter(point, labelOptions)), labelConfig, formatString, labelText, style, rotation, attr, dataLabel = point.dataLabels ? point.dataLabels[i] :
272
- point.dataLabel, connector = point.connectors ? point.connectors[i] :
273
- point.connector, labelDistance = pick(labelOptions.distance, point.labelDistance), isNew = !dataLabel;
274
- if (labelEnabled) {
275
- // Create individual options structure that can be extended
276
- // without affecting others
277
- labelConfig = point.getLabelConfig();
278
- formatString = pick(labelOptions[point.formatPrefix + 'Format'], labelOptions.format);
279
- labelText = defined(formatString) ?
280
- format(formatString, labelConfig, chart) :
281
- (labelOptions[point.formatPrefix + 'Formatter'] ||
282
- labelOptions.formatter).call(labelConfig, labelOptions);
283
- style = labelOptions.style;
284
- rotation = labelOptions.rotation;
285
- if (!chart.styledMode) {
286
- // Determine the color
287
- style.color = pick(labelOptions.color, style.color, series.color, palette.neutralColor100);
288
- // Get automated contrast color
289
- if (style.color === 'contrast') {
290
- point.contrastColor = renderer.getContrast((point.color || series.color));
291
- style.color = (!defined(labelDistance) &&
292
- labelOptions.inside) ||
293
- labelDistance < 0 ||
294
- !!seriesOptions.stacking ?
295
- point.contrastColor :
296
- palette.neutralColor100;
297
- }
298
- else {
299
- delete point.contrastColor;
300
- }
301
- if (seriesOptions.cursor) {
302
- style.cursor = seriesOptions.cursor;
303
- }
304
- }
305
- attr = {
306
- r: labelOptions.borderRadius || 0,
307
- rotation: rotation,
308
- padding: labelOptions.padding,
309
- zIndex: 1
310
- };
311
- if (!chart.styledMode) {
312
- attr.fill = labelOptions.backgroundColor;
313
- attr.stroke = labelOptions.borderColor;
314
- attr['stroke-width'] = labelOptions.borderWidth;
315
- }
316
- // Remove unused attributes (#947)
317
- objectEach(attr, function (val, name) {
318
- if (typeof val === 'undefined') {
319
- delete attr[name];
320
- }
321
- });
322
- }
323
- // If the point is outside the plot area, destroy it. #678, #820
324
- if (dataLabel && (!labelEnabled || !defined(labelText))) {
325
- point.dataLabel =
326
- point.dataLabel && point.dataLabel.destroy();
327
- if (point.dataLabels) {
328
- // Remove point.dataLabels if this was the last one
329
- if (point.dataLabels.length === 1) {
330
- delete point.dataLabels;
331
- }
332
- else {
333
- delete point.dataLabels[i];
334
- }
335
- }
336
- if (!i) {
337
- delete point.dataLabel;
338
- }
339
- if (connector) {
340
- point.connector = point.connector.destroy();
341
- if (point.connectors) {
342
- // Remove point.connectors if this was the last one
343
- if (point.connectors.length === 1) {
344
- delete point.connectors;
345
- }
346
- else {
347
- delete point.connectors[i];
348
- }
349
- }
350
- }
351
- // Individual labels are disabled if the are explicitly disabled
352
- // in the point options, or if they fall outside the plot area.
353
- }
354
- else if (labelEnabled && defined(labelText)) {
355
- if (!dataLabel) {
356
- // Create new label element
357
- point.dataLabels = point.dataLabels || [];
358
- dataLabel = point.dataLabels[i] = rotation ?
359
- // Labels don't rotate, use text element
360
- renderer.text(labelText, 0, -9999, labelOptions.useHTML)
361
- .addClass('highcharts-data-label') :
362
- // We can use label
363
- renderer.label(labelText, 0, -9999, labelOptions.shape, null, null, labelOptions.useHTML, null, 'data-label');
364
- // Store for backwards compatibility
365
- if (!i) {
366
- point.dataLabel = dataLabel;
367
- }
368
- dataLabel.addClass(' highcharts-data-label-color-' + point.colorIndex +
369
- ' ' + (labelOptions.className || '') +
370
- ( // #3398
371
- labelOptions.useHTML ?
372
- ' highcharts-tracker' :
373
- ''));
374
- }
375
- else {
376
- // Use old element and just update text
377
- attr.text = labelText;
378
- }
379
- // Store data label options for later access
380
- dataLabel.options = labelOptions;
381
- dataLabel.attr(attr);
382
- if (!chart.styledMode) {
383
- // Styles must be applied before add in order to read
384
- // text bounding box
385
- dataLabel.css(style).shadow(labelOptions.shadow);
386
- }
387
- if (!dataLabel.added) {
388
- dataLabel.add(dataLabelsGroup);
389
- }
390
- if (labelOptions.textPath && !labelOptions.useHTML) {
391
- dataLabel.setTextPath((point.getDataLabelPath &&
392
- point.getDataLabelPath(dataLabel)) || point.graphic, labelOptions.textPath);
393
- if (point.dataLabelPath &&
394
- !labelOptions.textPath.enabled) {
395
- // clean the DOM
396
- point.dataLabelPath = point.dataLabelPath.destroy();
397
- }
398
- }
399
- // Now the data label is created and placed at 0,0, so we
400
- // need to align it
401
- series.alignDataLabel(point, dataLabel, labelOptions, null, isNew);
402
- }
403
- });
404
- });
405
- }
406
- fireEvent(this, 'afterDrawDataLabels');
407
- };
408
- /**
409
- * Align each individual data label.
410
- *
411
- * @private
412
- * @function Highcharts.Series#alignDataLabel
413
- * @param {Highcharts.Point} point
414
- * @param {Highcharts.SVGElement} dataLabel
415
- * @param {Highcharts.DataLabelsOptions} options
416
- * @param {Highcharts.BBoxObject} alignTo
417
- * @param {boolean} [isNew]
418
- * @return {void}
419
- */
420
- Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
421
- var series = this, chart = this.chart, inverted = this.isCartesian && chart.inverted, enabledDataSorting = this.enabledDataSorting, plotX = pick(point.dlBox && point.dlBox.centerX, point.plotX, -9999), plotY = pick(point.plotY, -9999), bBox = dataLabel.getBBox(), baseline, rotation = options.rotation, normRotation, negRotation, align = options.align, rotCorr, // rotation correction
422
- isInsidePlot = chart.isInsidePlot(plotX, Math.round(plotY), {
423
- inverted: inverted,
424
- paneCoordinates: true,
425
- series: series
426
- }),
427
- // Math.round for rounding errors (#2683), alignTo to allow column
428
- // labels (#2700)
429
- alignAttr, // the final position;
430
- justify = pick(options.overflow, (enabledDataSorting ? 'none' : 'justify')) === 'justify', visible = this.visible &&
431
- point.visible !== false &&
432
- (point.series.forceDL ||
433
- (enabledDataSorting && !justify) ||
434
- isInsidePlot ||
435
- (
436
- // If the data label is inside the align box, it is enough
437
- // that parts of the align box is inside the plot area
438
- // (#12370). When stacking, it is always inside regardless
439
- // of the option (#15148).
440
- pick(options.inside, !!this.options.stacking) &&
441
- alignTo &&
442
- chart.isInsidePlot(plotX, inverted ?
443
- alignTo.x + 1 :
444
- alignTo.y + alignTo.height - 1, {
445
- inverted: inverted,
446
- paneCoordinates: true,
447
- series: series
448
- }))), setStartPos = function (alignOptions) {
449
- if (enabledDataSorting && series.xAxis && !justify) {
450
- series.setDataLabelStartPos(point, dataLabel, isNew, isInsidePlot, alignOptions);
451
- }
452
- };
453
- if (visible) {
454
- baseline = chart.renderer.fontMetrics(chart.styledMode ? void 0 : options.style.fontSize, dataLabel).b;
455
- // The alignment box is a singular point
456
- alignTo = extend({
457
- x: inverted ? this.yAxis.len - plotY : plotX,
458
- y: Math.round(inverted ? this.xAxis.len - plotX : plotY),
459
- width: 0,
460
- height: 0
461
- }, alignTo);
462
- // Add the text size for alignment calculation
463
- extend(options, {
464
- width: bBox.width,
465
- height: bBox.height
466
- });
467
- // Allow a hook for changing alignment in the last moment, then do the
468
- // alignment
469
- if (rotation) {
470
- justify = false; // Not supported for rotated text
471
- rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723
472
- alignAttr = {
473
- x: (alignTo.x +
474
- (options.x || 0) +
475
- alignTo.width / 2 +
476
- rotCorr.x),
477
- y: (alignTo.y +
478
- (options.y || 0) +
479
- { top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] *
480
- alignTo.height)
481
- };
482
- setStartPos(alignAttr); // data sorting
483
- dataLabel[isNew ? 'attr' : 'animate'](alignAttr)
484
- .attr({
485
- align: align
486
- });
487
- // Compensate for the rotated label sticking out on the sides
488
- normRotation = (rotation + 720) % 360;
489
- negRotation = normRotation > 180 && normRotation < 360;
490
- if (align === 'left') {
491
- alignAttr.y -= negRotation ? bBox.height : 0;
492
- }
493
- else if (align === 'center') {
494
- alignAttr.x -= bBox.width / 2;
495
- alignAttr.y -= bBox.height / 2;
496
- }
497
- else if (align === 'right') {
498
- alignAttr.x -= bBox.width;
499
- alignAttr.y -= negRotation ? 0 : bBox.height;
500
- }
501
- dataLabel.placed = true;
502
- dataLabel.alignAttr = alignAttr;
503
- }
504
- else {
505
- setStartPos(alignTo); // data sorting
506
- dataLabel.align(options, void 0, alignTo);
507
- alignAttr = dataLabel.alignAttr;
508
- }
509
- // Handle justify or crop
510
- if (justify && alignTo.height >= 0) { // #8830
511
- this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
512
- // Now check that the data label is within the plot area
513
- }
514
- else if (pick(options.crop, true)) {
515
- visible =
516
- chart.isInsidePlot(alignAttr.x, alignAttr.y, {
517
- paneCoordinates: true,
518
- series: series
519
- }) &&
520
- chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height, {
521
- paneCoordinates: true,
522
- series: series
523
- });
524
- }
525
- // When we're using a shape, make it possible with a connector or an
526
- // arrow pointing to thie point
527
- if (options.shape && !rotation) {
528
- dataLabel[isNew ? 'attr' : 'animate']({
529
- anchorX: inverted ?
530
- chart.plotWidth - point.plotY :
531
- point.plotX,
532
- anchorY: inverted ?
533
- chart.plotHeight - point.plotX :
534
- point.plotY
535
- });
536
- }
537
- }
538
- // To use alignAttr property in hideOverlappingLabels
539
- if (isNew && enabledDataSorting) {
540
- dataLabel.placed = false;
541
- }
542
- // Show or hide based on the final aligned position
543
- if (!visible && (!enabledDataSorting || justify)) {
544
- dataLabel.hide(true);
545
- dataLabel.placed = false; // don't animate back in
546
- }
547
- };
548
- /**
549
- * Set starting position for data label sorting animation.
550
- *
551
- * @private
552
- * @function Highcharts.Series#setDataLabelStartPos
553
- * @param {Highcharts.SVGElement} dataLabel
554
- * @param {Highcharts.ColumnPoint} point
555
- * @param {boolean | undefined} [isNew]
556
- * @param {boolean} [isInside]
557
- * @param {Highcharts.AlignObject} [alignOptions]
558
- *
559
- * @return {void}
560
- */
561
- Series.prototype.setDataLabelStartPos = function (point, dataLabel, isNew, isInside, alignOptions) {
562
- var chart = this.chart, inverted = chart.inverted, xAxis = this.xAxis, reversed = xAxis.reversed, labelCenter = inverted ? dataLabel.height / 2 : dataLabel.width / 2, pointWidth = point.pointWidth, halfWidth = pointWidth ? pointWidth / 2 : 0, startXPos, startYPos;
563
- startXPos = inverted ?
564
- alignOptions.x :
565
- (reversed ?
566
- -labelCenter - halfWidth :
567
- xAxis.width - labelCenter + halfWidth);
568
- startYPos = inverted ?
569
- (reversed ?
570
- this.yAxis.height - labelCenter + halfWidth :
571
- -labelCenter - halfWidth) : alignOptions.y;
572
- dataLabel.startXPos = startXPos;
573
- dataLabel.startYPos = startYPos;
574
- // We need to handle visibility in case of sorting point outside plot area
575
- if (!isInside) {
576
- dataLabel
577
- .attr({ opacity: 1 })
578
- .animate({ opacity: 0 }, void 0, dataLabel.hide);
579
- }
580
- else if (dataLabel.visibility === 'hidden') {
581
- dataLabel.show();
582
- dataLabel
583
- .attr({ opacity: 0 })
584
- .animate({ opacity: 1 });
585
- }
586
- // Save start position on first render, but do not change position
587
- if (!chart.hasRendered) {
588
- return;
589
- }
590
- // Set start position
591
- if (isNew) {
592
- dataLabel.attr({ x: dataLabel.startXPos, y: dataLabel.startYPos });
593
- }
594
- dataLabel.placed = true;
595
- };
596
- /**
597
- * If data labels fall partly outside the plot area, align them back in, in a
598
- * way that doesn't hide the point.
599
- *
600
- * @private
601
- * @function Highcharts.Series#justifyDataLabel
602
- * @param {Highcharts.SVGElement} dataLabel
603
- * @param {Highcharts.DataLabelsOptions} options
604
- * @param {Highcharts.SVGAttributes} alignAttr
605
- * @param {Highcharts.BBoxObject} bBox
606
- * @param {Highcharts.BBoxObject} [alignTo]
607
- * @param {boolean} [isNew]
608
- * @return {boolean|undefined}
609
- */
610
- Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {
611
- var chart = this.chart, align = options.align, verticalAlign = options.verticalAlign, off, justified, padding = dataLabel.box ? 0 : (dataLabel.padding || 0);
612
- var _a = options.x, x = _a === void 0 ? 0 : _a, _b = options.y, y = _b === void 0 ? 0 : _b;
613
- // Off left
614
- off = (alignAttr.x || 0) + padding;
615
- if (off < 0) {
616
- if (align === 'right' && x >= 0) {
617
- options.align = 'left';
618
- options.inside = true;
619
- }
620
- else {
621
- x -= off;
622
- }
623
- justified = true;
624
- }
625
- // Off right
626
- off = (alignAttr.x || 0) + bBox.width - padding;
627
- if (off > chart.plotWidth) {
628
- if (align === 'left' && x <= 0) {
629
- options.align = 'right';
630
- options.inside = true;
631
- }
632
- else {
633
- x += chart.plotWidth - off;
634
- }
635
- justified = true;
636
- }
637
- // Off top
638
- off = alignAttr.y + padding;
639
- if (off < 0) {
640
- if (verticalAlign === 'bottom' && y >= 0) {
641
- options.verticalAlign = 'top';
642
- options.inside = true;
643
- }
644
- else {
645
- y -= off;
646
- }
647
- justified = true;
648
- }
649
- // Off bottom
650
- off = (alignAttr.y || 0) + bBox.height - padding;
651
- if (off > chart.plotHeight) {
652
- if (verticalAlign === 'top' && y <= 0) {
653
- options.verticalAlign = 'bottom';
654
- options.inside = true;
655
- }
656
- else {
657
- y += chart.plotHeight - off;
658
- }
659
- justified = true;
660
- }
661
- if (justified) {
662
- options.x = x;
663
- options.y = y;
664
- dataLabel.placed = !isNew;
665
- dataLabel.align(options, void 0, alignTo);
666
- }
667
- return justified;
668
- };
669
- if (seriesTypes.pie) {
670
- seriesTypes.pie.prototype.dataLabelPositioners = {
671
- // Based on the value computed in Highcharts' distribute algorithm.
672
- radialDistributionY: function (point) {
673
- return point.top + point.distributeBox.pos;
674
- },
675
- // get the x - use the natural x position for labels near the
676
- // top and bottom, to prevent the top and botton slice
677
- // connectors from touching each other on either side
678
- // Based on the value computed in Highcharts' distribute algorithm.
679
- radialDistributionX: function (series, point, y, naturalY) {
680
- return series.getX(y < point.top + 2 || y > point.bottom - 2 ?
681
- naturalY :
682
- y, point.half, point);
683
- },
684
- // dataLabels.distance determines the x position of the label
685
- justify: function (point, radius, seriesCenter) {
686
- return seriesCenter[0] + (point.half ? -1 : 1) *
687
- (radius + point.labelDistance);
688
- },
689
- // Left edges of the left-half labels touch the left edge of the plot
690
- // area. Right edges of the right-half labels touch the right edge of
691
- // the plot area.
692
- alignToPlotEdges: function (dataLabel, half, plotWidth, plotLeft) {
693
- var dataLabelWidth = dataLabel.getBBox().width;
694
- return half ? dataLabelWidth + plotLeft :
695
- plotWidth - dataLabelWidth - plotLeft;
696
- },
697
- // Connectors of each side end in the same x position. Labels are
698
- // aligned to them. Left edge of the widest left-half label touches the
699
- // left edge of the plot area. Right edge of the widest right-half label
700
- // touches the right edge of the plot area.
701
- alignToConnectors: function (points, half, plotWidth, plotLeft) {
702
- var maxDataLabelWidth = 0, dataLabelWidth;
703
- // find widest data label
704
- points.forEach(function (point) {
705
- dataLabelWidth = point.dataLabel.getBBox().width;
706
- if (dataLabelWidth > maxDataLabelWidth) {
707
- maxDataLabelWidth = dataLabelWidth;
708
- }
709
- });
710
- return half ? maxDataLabelWidth + plotLeft :
711
- plotWidth - maxDataLabelWidth - plotLeft;
712
- }
713
- };
714
- /**
715
- * Override the base drawDataLabels method by pie specific functionality
716
- *
717
- * @private
718
- * @function Highcharts.seriesTypes.pie#drawDataLabels
719
- * @return {void}
720
- */
721
- seriesTypes.pie.prototype.drawDataLabels = function () {
722
- var series = this, data = series.data, point, chart = series.chart, options = series.options.dataLabels || {}, connectorPadding = options.connectorPadding, connectorWidth, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, plotLeft = chart.plotLeft, maxWidth = Math.round(chart.chartWidth / 3), connector, seriesCenter = series.center, radius = seriesCenter[2] / 2, centerY = seriesCenter[1], dataLabel, dataLabelWidth,
723
- // labelPos,
724
- labelPosition, labelHeight,
725
- // divide the points into right and left halves for anti collision
726
- halves = [
727
- [],
728
- [] // left
729
- ], x, y, visibility, j, overflow = [0, 0, 0, 0], // top, right, bottom, left
730
- dataLabelPositioners = series.dataLabelPositioners, pointDataLabelsOptions;
731
- // get out if not enabled
732
- if (!series.visible ||
733
- (!options.enabled &&
734
- !series._hasPointLabels)) {
735
- return;
736
- }
737
- // Reset all labels that have been shortened
738
- data.forEach(function (point) {
739
- if (point.dataLabel && point.visible && point.dataLabel.shortened) {
740
- point.dataLabel
741
- .attr({
742
- width: 'auto'
743
- }).css({
744
- width: 'auto',
745
- textOverflow: 'clip'
746
- });
747
- point.dataLabel.shortened = false;
748
- }
749
- });
750
- // run parent method
751
- Series.prototype.drawDataLabels.apply(series);
752
- data.forEach(function (point) {
753
- if (point.dataLabel) {
754
- if (point.visible) { // #407, #2510
755
- // Arrange points for detection collision
756
- halves[point.half].push(point);
757
- // Reset positions (#4905)
758
- point.dataLabel._pos = null;
759
- // Avoid long labels squeezing the pie size too far down
760
- if (!defined(options.style.width) &&
761
- !defined(point.options.dataLabels &&
762
- point.options.dataLabels.style &&
763
- point.options.dataLabels.style.width)) {
764
- if (point.dataLabel.getBBox().width > maxWidth) {
765
- point.dataLabel.css({
766
- // Use a fraction of the maxWidth to avoid
767
- // wrapping close to the end of the string.
768
- width: Math.round(maxWidth * 0.7) + 'px'
769
- });
770
- point.dataLabel.shortened = true;
771
- }
772
- }
773
- }
774
- else {
775
- point.dataLabel = point.dataLabel.destroy();
776
- // Workaround to make pies destroy multiple datalabels
777
- // correctly. This logic needs rewriting to support multiple
778
- // datalabels fully.
779
- if (point.dataLabels && point.dataLabels.length === 1) {
780
- delete point.dataLabels;
781
- }
782
- }
783
- }
784
- });
785
- /* Loop over the points in each half, starting from the top and bottom
786
- * of the pie to detect overlapping labels.
787
- */
788
- halves.forEach(function (points, i) {
789
- var top, bottom, length = points.length, positions = [], naturalY, sideOverflow, size, distributionLength;
790
- if (!length) {
791
- return;
792
- }
793
- // Sort by angle
794
- series.sortByAngle(points, i - 0.5);
795
- // Only do anti-collision when we have dataLabels outside the pie
796
- // and have connectors. (#856)
797
- if (series.maxLabelDistance > 0) {
798
- top = Math.max(0, centerY - radius - series.maxLabelDistance);
799
- bottom = Math.min(centerY + radius + series.maxLabelDistance, chart.plotHeight);
800
- points.forEach(function (point) {
801
- // check if specific points' label is outside the pie
802
- if (point.labelDistance > 0 && point.dataLabel) {
803
- // point.top depends on point.labelDistance value
804
- // Used for calculation of y value in getX method
805
- point.top = Math.max(0, centerY - radius - point.labelDistance);
806
- point.bottom = Math.min(centerY + radius + point.labelDistance, chart.plotHeight);
807
- size = point.dataLabel.getBBox().height || 21;
808
- // point.positionsIndex is needed for getting index of
809
- // parameter related to specific point inside positions
810
- // array - not every point is in positions array.
811
- point.distributeBox = {
812
- target: point.labelPosition.natural.y -
813
- point.top + size / 2,
814
- size: size,
815
- rank: point.y
816
- };
817
- positions.push(point.distributeBox);
818
- }
819
- });
820
- distributionLength = bottom + size - top;
821
- H.distribute(positions, distributionLength, distributionLength / 5);
822
- }
823
- // Now the used slots are sorted, fill them up sequentially
824
- for (j = 0; j < length; j++) {
825
- point = points[j];
826
- // labelPos = point.labelPos;
827
- labelPosition = point.labelPosition;
828
- dataLabel = point.dataLabel;
829
- visibility = point.visible === false ? 'hidden' : 'inherit';
830
- naturalY = labelPosition.natural.y;
831
- y = naturalY;
832
- if (positions && defined(point.distributeBox)) {
833
- if (typeof point.distributeBox.pos === 'undefined') {
834
- visibility = 'hidden';
835
- }
836
- else {
837
- labelHeight = point.distributeBox.size;
838
- // Find label's y position
839
- y = dataLabelPositioners
840
- .radialDistributionY(point);
841
- }
842
- }
843
- // It is needed to delete point.positionIndex for
844
- // dynamically added points etc.
845
- delete point.positionIndex; // @todo unused
846
- // Find label's x position
847
- // justify is undocumented in the API - preserve support for it
848
- if (options.justify) {
849
- x = dataLabelPositioners.justify(point, radius, seriesCenter);
850
- }
851
- else {
852
- switch (options.alignTo) {
853
- case 'connectors':
854
- x = dataLabelPositioners.alignToConnectors(points, i, plotWidth, plotLeft);
855
- break;
856
- case 'plotEdges':
857
- x = dataLabelPositioners.alignToPlotEdges(dataLabel, i, plotWidth, plotLeft);
858
- break;
859
- default:
860
- x = dataLabelPositioners.radialDistributionX(series, point, y, naturalY);
861
- }
862
- }
863
- // Record the placement and visibility
864
- dataLabel._attr = {
865
- visibility: visibility,
866
- align: labelPosition.alignment
867
- };
868
- pointDataLabelsOptions = point.options.dataLabels || {};
869
- dataLabel._pos = {
870
- x: (x +
871
- pick(pointDataLabelsOptions.x, options.x) + // (#12985)
872
- ({
873
- left: connectorPadding,
874
- right: -connectorPadding
875
- }[labelPosition.alignment] || 0)),
876
- // 10 is for the baseline (label vs text)
877
- y: (y +
878
- pick(pointDataLabelsOptions.y, options.y) - // (#12985)
879
- 10)
880
- };
881
- // labelPos.x = x;
882
- // labelPos.y = y;
883
- labelPosition.final.x = x;
884
- labelPosition.final.y = y;
885
- // Detect overflowing data labels
886
- if (pick(options.crop, true)) {
887
- dataLabelWidth = dataLabel.getBBox().width;
888
- sideOverflow = null;
889
- // Overflow left
890
- if (x - dataLabelWidth < connectorPadding &&
891
- i === 1 // left half
892
- ) {
893
- sideOverflow = Math.round(dataLabelWidth - x + connectorPadding);
894
- overflow[3] = Math.max(sideOverflow, overflow[3]);
895
- // Overflow right
896
- }
897
- else if (x + dataLabelWidth > plotWidth - connectorPadding &&
898
- i === 0 // right half
899
- ) {
900
- sideOverflow = Math.round(x + dataLabelWidth - plotWidth + connectorPadding);
901
- overflow[1] = Math.max(sideOverflow, overflow[1]);
902
- }
903
- // Overflow top
904
- if (y - labelHeight / 2 < 0) {
905
- overflow[0] = Math.max(Math.round(-y + labelHeight / 2), overflow[0]);
906
- // Overflow left
907
- }
908
- else if (y + labelHeight / 2 > plotHeight) {
909
- overflow[2] = Math.max(Math.round(y + labelHeight / 2 - plotHeight), overflow[2]);
910
- }
911
- dataLabel.sideOverflow = sideOverflow;
912
- }
913
- } // for each point
914
- }); // for each half
915
- // Do not apply the final placement and draw the connectors until we
916
- // have verified that labels are not spilling over.
917
- if (arrayMax(overflow) === 0 ||
918
- this.verifyDataLabelOverflow(overflow)) {
919
- // Place the labels in the final position
920
- this.placeDataLabels();
921
- this.points.forEach(function (point) {
922
- // #8864: every connector can have individual options
923
- pointDataLabelsOptions =
924
- merge(options, point.options.dataLabels);
925
- connectorWidth =
926
- pick(pointDataLabelsOptions.connectorWidth, 1);
927
- // Draw the connector
928
- if (connectorWidth) {
929
- var isNew = void 0;
930
- connector = point.connector;
931
- dataLabel = point.dataLabel;
932
- if (dataLabel &&
933
- dataLabel._pos &&
934
- point.visible &&
935
- point.labelDistance > 0) {
936
- visibility = dataLabel._attr.visibility;
937
- isNew = !connector;
938
- if (isNew) {
939
- point.connector = connector = chart.renderer
940
- .path()
941
- .addClass('highcharts-data-label-connector ' +
942
- ' highcharts-color-' + point.colorIndex +
943
- (point.className ?
944
- ' ' + point.className :
945
- ''))
946
- .add(series.dataLabelsGroup);
947
- if (!chart.styledMode) {
948
- connector.attr({
949
- 'stroke-width': connectorWidth,
950
- 'stroke': (pointDataLabelsOptions.connectorColor ||
951
- point.color ||
952
- palette.neutralColor60)
953
- });
954
- }
955
- }
956
- connector[isNew ? 'attr' : 'animate']({
957
- d: point.getConnectorPath()
958
- });
959
- connector.attr('visibility', visibility);
960
- }
961
- else if (connector) {
962
- point.connector = connector.destroy();
963
- }
964
- }
965
- });
966
- }
967
- };
968
- /**
969
- * Extendable method for getting the path of the connector between the data
970
- * label and the pie slice.
971
- *
972
- * @private
973
- * @function Highcharts.seriesTypes.pie#connectorPath
974
- *
975
- * @param {*} labelPos
976
- *
977
- * @return {Highcharts.SVGPathArray}
978
- */
979
- // TODO: depracated - remove it
980
- /*
981
- seriesTypes.pie.prototype.connectorPath = function (labelPos) {
982
- let x = labelPos.x,
983
- y = labelPos.y;
984
- return pick(this.options.dataLabels.softConnector, true) ? [
985
- 'M',
986
- // end of the string at the label
987
- x + (labelPos[6] === 'left' ? 5 : -5), y,
988
- 'C',
989
- x, y, // first break, next to the label
990
- 2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
991
- labelPos[2], labelPos[3], // second break
992
- 'L',
993
- labelPos[4], labelPos[5] // base
994
- ] : [
995
- 'M',
996
- // end of the string at the label
997
- x + (labelPos[6] === 'left' ? 5 : -5), y,
998
- 'L',
999
- labelPos[2], labelPos[3], // second break
1000
- 'L',
1001
- labelPos[4], labelPos[5] // base
1002
- ];
1003
- };
1004
- */
1005
- /**
1006
- * Perform the final placement of the data labels after we have verified
1007
- * that they fall within the plot area.
1008
- *
1009
- * @private
1010
- * @function Highcharts.seriesTypes.pie#placeDataLabels
1011
- * @return {void}
1012
- */
1013
- seriesTypes.pie.prototype.placeDataLabels = function () {
1014
- this.points.forEach(function (point) {
1015
- var dataLabel = point.dataLabel, _pos;
1016
- if (dataLabel && point.visible) {
1017
- _pos = dataLabel._pos;
1018
- if (_pos) {
1019
- // Shorten data labels with ellipsis if they still overflow
1020
- // after the pie has reached minSize (#223).
1021
- if (dataLabel.sideOverflow) {
1022
- dataLabel._attr.width =
1023
- Math.max(dataLabel.getBBox().width -
1024
- dataLabel.sideOverflow, 0);
1025
- dataLabel.css({
1026
- width: dataLabel._attr.width + 'px',
1027
- textOverflow: ((this.options.dataLabels.style || {})
1028
- .textOverflow ||
1029
- 'ellipsis')
1030
- });
1031
- dataLabel.shortened = true;
1032
- }
1033
- dataLabel.attr(dataLabel._attr);
1034
- dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
1035
- dataLabel.moved = true;
1036
- }
1037
- else if (dataLabel) {
1038
- dataLabel.attr({ y: -9999 });
1039
- }
1040
- }
1041
- // Clear for update
1042
- delete point.distributeBox;
1043
- }, this);
1044
- };
1045
- seriesTypes.pie.prototype.alignDataLabel = noop;
1046
- /**
1047
- * Verify whether the data labels are allowed to draw, or we should run more
1048
- * translation and data label positioning to keep them inside the plot area.
1049
- * Returns true when data labels are ready to draw.
1050
- *
1051
- * @private
1052
- * @function Highcharts.seriesTypes.pie#verifyDataLabelOverflow
1053
- * @param {Array<number>} overflow
1054
- * @return {boolean}
1055
- */
1056
- seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {
1057
- var center = this.center, options = this.options, centerOption = options.center, minSize = options.minSize || 80, newSize = minSize,
1058
- // If a size is set, return true and don't try to shrink the pie
1059
- // to fit the labels.
1060
- ret = options.size !== null;
1061
- if (!ret) {
1062
- // Handle horizontal size and center
1063
- if (centerOption[0] !== null) { // Fixed center
1064
- newSize = Math.max(center[2] -
1065
- Math.max(overflow[1], overflow[3]), minSize);
1066
- }
1067
- else { // Auto center
1068
- newSize = Math.max(
1069
- // horizontal overflow
1070
- center[2] - overflow[1] - overflow[3], minSize);
1071
- // horizontal center
1072
- center[0] += (overflow[3] - overflow[1]) / 2;
1073
- }
1074
- // Handle vertical size and center
1075
- if (centerOption[1] !== null) { // Fixed center
1076
- newSize = clamp(newSize, minSize, center[2] - Math.max(overflow[0], overflow[2]));
1077
- }
1078
- else { // Auto center
1079
- newSize = clamp(newSize, minSize,
1080
- // vertical overflow
1081
- center[2] - overflow[0] - overflow[2]);
1082
- // vertical center
1083
- center[1] += (overflow[0] - overflow[2]) / 2;
1084
- }
1085
- // If the size must be decreased, we need to run translate and
1086
- // drawDataLabels again
1087
- if (newSize < center[2]) {
1088
- center[2] = newSize;
1089
- center[3] = Math.min(// #3632
1090
- relativeLength(options.innerSize || 0, newSize), newSize);
1091
- this.translate(center);
1092
- if (this.drawDataLabels) {
1093
- this.drawDataLabels();
1094
- }
1095
- // Else, return true to indicate that the pie and its labels is
1096
- // within the plot area
1097
- }
1098
- else {
1099
- ret = true;
1100
- }
1101
- }
1102
- return ret;
1103
- };
1104
- }
1105
- if (seriesTypes.column) {
1106
- /**
1107
- * Override the basic data label alignment by adjusting for the position of
1108
- * the column.
1109
- *
1110
- * @private
1111
- * @function Highcharts.seriesTypes.column#alignDataLabel
1112
- * @param {Highcharts.Point} point
1113
- * @param {Highcharts.SVGElement} dataLabel
1114
- * @param {Highcharts.DataLabelsOptions} options
1115
- * @param {Highcharts.BBoxObject} alignTo
1116
- * @param {boolean} [isNew]
1117
- * @return {void}
1118
- */
1119
- seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
1120
- var inverted = this.chart.inverted, series = point.series,
1121
- // data label box for alignment
1122
- dlBox = point.dlBox || point.shapeArgs, below = pick(point.below, // range series
1123
- point.plotY >
1124
- pick(this.translatedThreshold, series.yAxis.len)),
1125
- // draw it inside the box?
1126
- inside = pick(options.inside, !!this.options.stacking), overshoot;
1127
- // Align to the column itself, or the top of it
1128
- if (dlBox) { // Area range uses this method but not alignTo
1129
- alignTo = merge(dlBox);
1130
- if (alignTo.y < 0) {
1131
- alignTo.height += alignTo.y;
1132
- alignTo.y = 0;
1133
- }
1134
- // If parts of the box overshoots outside the plot area, modify the
1135
- // box to center the label inside
1136
- overshoot = alignTo.y + alignTo.height - series.yAxis.len;
1137
- if (overshoot > 0 && overshoot < alignTo.height) {
1138
- alignTo.height -= overshoot;
1139
- }
1140
- if (inverted) {
1141
- alignTo = {
1142
- x: series.yAxis.len - alignTo.y - alignTo.height,
1143
- y: series.xAxis.len - alignTo.x - alignTo.width,
1144
- width: alignTo.height,
1145
- height: alignTo.width
1146
- };
1147
- }
1148
- // Compute the alignment box
1149
- if (!inside) {
1150
- if (inverted) {
1151
- alignTo.x += below ? 0 : alignTo.width;
1152
- alignTo.width = 0;
1153
- }
1154
- else {
1155
- alignTo.y += below ? alignTo.height : 0;
1156
- alignTo.height = 0;
1157
- }
1158
- }
1159
- }
1160
- // When alignment is undefined (typically columns and bars), display the
1161
- // individual point below or above the point depending on the threshold
1162
- options.align = pick(options.align, !inverted || inside ? 'center' : below ? 'right' : 'left');
1163
- options.verticalAlign = pick(options.verticalAlign, inverted || inside ? 'middle' : below ? 'top' : 'bottom');
1164
- // Call the parent method
1165
- Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
1166
- // If label was justified and we have contrast, set it:
1167
- if (options.inside && point.contrastColor) {
1168
- dataLabel.css({
1169
- color: point.contrastColor
1170
- });
1171
- }
1172
- };
1173
- }