highcharts 9.3.2 → 10.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 (700) hide show
  1. package/bower.json +1 -1
  2. package/css/highcharts.css +19 -2
  3. package/css/highcharts.scss +17 -2
  4. package/css/themes/dark-unica.css +19 -2
  5. package/css/themes/grid-light.css +19 -2
  6. package/css/themes/sand-signika.css +19 -2
  7. package/es-modules/Accessibility/A11yI18n.js +4 -4
  8. package/es-modules/Accessibility/Accessibility.js +1 -1
  9. package/es-modules/Accessibility/Components/ContainerComponent.js +8 -9
  10. package/es-modules/Accessibility/Components/InfoRegionsComponent.js +14 -9
  11. package/es-modules/Accessibility/Components/LegendComponent.js +31 -23
  12. package/es-modules/Accessibility/Components/MenuComponent.js +15 -5
  13. package/es-modules/Accessibility/Components/RangeSelectorComponent.js +2 -2
  14. package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +7 -6
  15. package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +1 -1
  16. package/es-modules/Accessibility/Components/SeriesComponent/SeriesComponent.js +0 -1
  17. package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +34 -18
  18. package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +84 -33
  19. package/es-modules/Accessibility/Components/ZoomComponent.js +13 -10
  20. package/es-modules/Accessibility/FocusBorder.js +6 -5
  21. package/es-modules/Accessibility/HighContrastMode.js +2 -2
  22. package/es-modules/Accessibility/KeyboardNavigation.js +113 -98
  23. package/es-modules/Accessibility/Options/LangOptions.js +36 -31
  24. package/es-modules/Accessibility/Options/Options.js +66 -3
  25. package/es-modules/Accessibility/ProxyElement.js +14 -6
  26. package/es-modules/Accessibility/ProxyProvider.js +10 -2
  27. package/es-modules/Accessibility/Utils/ChartUtilities.js +9 -4
  28. package/es-modules/Core/Axis/Axis.js +180 -73
  29. package/es-modules/Core/Axis/Color/ColorAxis.js +22 -5
  30. package/es-modules/Core/Axis/GridAxis.js +15 -11
  31. package/es-modules/Core/Axis/LogarithmicAxis.js +1 -1
  32. package/es-modules/Core/Axis/OrdinalAxis.js +3 -2
  33. package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js +1 -1
  34. package/es-modules/Core/Axis/StackingAxis.js +0 -1
  35. package/es-modules/Core/Axis/Tick.js +2 -2
  36. package/es-modules/Core/Axis/TreeGridTick.js +11 -0
  37. package/es-modules/Core/Chart/Chart.js +21 -3
  38. package/es-modules/Core/Chart/Chart3D.js +1 -11
  39. package/es-modules/Core/Chart/ChartDefaults.js +43 -11
  40. package/es-modules/Core/Chart/MapChart.js +1 -6
  41. package/es-modules/Core/Chart/StockChart.js +1 -1
  42. package/es-modules/Core/DefaultOptions.js +8 -4
  43. package/es-modules/Core/Geometry/PolygonClip.js +84 -0
  44. package/es-modules/Core/Globals.js +4 -18
  45. package/es-modules/Core/HttpUtilities.js +13 -8
  46. package/es-modules/Core/Legend/Legend.js +11 -9
  47. package/es-modules/Core/Navigator.js +10 -7
  48. package/es-modules/Core/Pointer.js +15 -11
  49. package/es-modules/Core/Renderer/HTML/AST.js +68 -8
  50. package/es-modules/Core/Renderer/SVG/SVGElement.js +47 -63
  51. package/es-modules/Core/Renderer/SVG/SVGElement3D.js +17 -5
  52. package/es-modules/Core/Renderer/SVG/SVGRenderer.js +31 -28
  53. package/es-modules/Core/Renderer/SVG/SVGRenderer3D.js +1 -1
  54. package/es-modules/Core/Renderer/SVG/TextBuilder.js +12 -10
  55. package/es-modules/Core/Scrollbar.js +9 -5
  56. package/es-modules/Core/Series/DataLabel.js +65 -36
  57. package/es-modules/Core/Series/Point.js +2 -2
  58. package/es-modules/Core/Series/Series.js +52 -22
  59. package/es-modules/Core/Series/SeriesDefaults.js +4 -1
  60. package/es-modules/Core/Tooltip.js +14 -31
  61. package/es-modules/Core/Utilities.js +29 -29
  62. package/es-modules/Extensions/Annotations/Annotations.js +9 -2
  63. package/es-modules/Extensions/Annotations/ControlPoint.js +1 -1
  64. package/es-modules/Extensions/Annotations/MockPoint.js +1 -1
  65. package/es-modules/Extensions/Annotations/NavigationBindings.js +9 -1
  66. package/es-modules/Extensions/Annotations/Popup.js +1 -1
  67. package/es-modules/Extensions/Annotations/Types/BasicAnnotation.js +5 -3
  68. package/es-modules/Extensions/Boost/BoostInit.js +6 -1
  69. package/es-modules/Extensions/Boost/BoostOptions.js +26 -0
  70. package/es-modules/Extensions/Boost/Boostables.js +1 -0
  71. package/es-modules/Extensions/Boost/WGLRenderer.js +48 -37
  72. package/es-modules/Extensions/Boost/WGLShader.js +4 -3
  73. package/es-modules/Extensions/Breadcrumbs.js +873 -0
  74. package/es-modules/Extensions/Data.js +26 -14
  75. package/es-modules/Extensions/DataGrouping.js +8 -3
  76. package/es-modules/Extensions/Debugger/ErrorMessages.js +4 -0
  77. package/es-modules/Extensions/DraggablePoints.js +9 -7
  78. package/es-modules/Extensions/Drilldown.js +150 -95
  79. package/es-modules/Extensions/ExportData.js +1 -2
  80. package/es-modules/Extensions/Exporting/Exporting.js +31 -20
  81. package/es-modules/Extensions/Exporting/ExportingDefaults.js +49 -1
  82. package/es-modules/Extensions/FullScreen.js +121 -54
  83. package/es-modules/Extensions/GeoJSON.js +151 -125
  84. package/es-modules/Extensions/MarkerClusters.js +34 -20
  85. package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +110 -22
  86. package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +1 -1
  87. package/es-modules/Extensions/Oldie/Oldie.js +1 -1
  88. package/es-modules/Extensions/OverlappingDataLabels.js +5 -4
  89. package/es-modules/Extensions/Polar.js +4 -1
  90. package/es-modules/Extensions/ScrollablePlotArea.js +5 -1
  91. package/es-modules/Extensions/Stacking.js +4 -3
  92. package/es-modules/Extensions/Themes/HighContrastDark.js +10 -10
  93. package/es-modules/Extensions/Themes/HighContrastLight.js +10 -10
  94. package/es-modules/Maps/MapNavigation.js +50 -13
  95. package/es-modules/Maps/MapPointer.js +16 -0
  96. package/es-modules/Maps/MapUtilities.js +56 -0
  97. package/es-modules/Maps/MapView.js +611 -136
  98. package/es-modules/Maps/MapViewInsetsOptionsDefault.js +148 -0
  99. package/es-modules/Maps/MapViewOptionsDefault.js +60 -20
  100. package/es-modules/Maps/Projection.js +169 -77
  101. package/es-modules/Maps/Projections/EqualEarth.js +15 -6
  102. package/es-modules/Maps/Projections/LambertConformalConic.js +27 -19
  103. package/es-modules/Maps/Projections/Miller.js +23 -10
  104. package/es-modules/Maps/Projections/Orthographic.js +21 -10
  105. package/es-modules/Maps/Projections/WebMercator.js +25 -13
  106. package/es-modules/Series/ArcDiagram/ArcDiagramPoint.js +77 -0
  107. package/es-modules/Series/ArcDiagram/ArcDiagramSeries.js +589 -0
  108. package/es-modules/Series/CenteredUtilities.js +6 -1
  109. package/es-modules/Series/Column/ColumnSeries.js +4 -3
  110. package/es-modules/Series/DataModifyComposition.js +1 -0
  111. package/es-modules/Series/DependencyWheel/DependencyWheelSeries.js +2 -2
  112. package/es-modules/Series/DrawPointComposition.js +7 -4
  113. package/es-modules/Series/Flags/FlagsSeries.js +7 -12
  114. package/es-modules/Series/Gauge/GaugeSeries.js +1 -1
  115. package/es-modules/Series/Heatmap/HeatmapSeries.js +13 -20
  116. package/es-modules/Series/Lollipop/LollipopSeries.js +1 -1
  117. package/es-modules/Series/Map/MapPoint.js +24 -1
  118. package/es-modules/Series/Map/MapSeries.js +206 -169
  119. package/es-modules/Series/MapBubble/MapBubblePoint.js +16 -24
  120. package/es-modules/Series/MapBubble/MapBubbleSeries.js +58 -1
  121. package/es-modules/Series/MapPoint/MapPointPoint.js +2 -8
  122. package/es-modules/Series/MapPoint/MapPointSeries.js +40 -14
  123. package/es-modules/Series/NodesComposition.js +60 -13
  124. package/es-modules/Series/OHLC/OHLCSeries.js +7 -0
  125. package/es-modules/Series/Organization/OrganizationPoint.js +68 -2
  126. package/es-modules/Series/Organization/OrganizationSeries.js +79 -25
  127. package/es-modules/Series/Pie/PieDataLabel.js +3 -1
  128. package/es-modules/Series/Pie/PiePoint.js +12 -5
  129. package/es-modules/Series/Pie/PieSeries.js +12 -1
  130. package/es-modules/Series/Pie3D/Pie3DSeries.js +19 -0
  131. package/es-modules/Series/Sankey/SankeyColumnComposition.js +193 -0
  132. package/es-modules/Series/Sankey/SankeyPoint.js +37 -1
  133. package/es-modules/Series/Sankey/SankeySeries.js +13 -128
  134. package/es-modules/Series/Scatter/ScatterSeries.js +1 -1
  135. package/es-modules/Series/Sunburst/SunburstSeries.js +14 -3
  136. package/es-modules/Series/Treemap/TreemapSeries.js +88 -80
  137. package/es-modules/Series/Waterfall/WaterfallSeries.js +2 -0
  138. package/es-modules/Series/Wordcloud/WordcloudSeries.js +4 -4
  139. package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +9 -2
  140. package/es-modules/Stock/StockToolsBindings.js +31 -24
  141. package/es-modules/Stock/StockToolsGui.js +1 -1
  142. package/es-modules/masters/highcharts-3d.src.js +1 -1
  143. package/es-modules/masters/highcharts-gantt.src.js +1 -1
  144. package/es-modules/masters/highcharts-more.src.js +1 -1
  145. package/es-modules/masters/highcharts.src.js +1 -1
  146. package/es-modules/masters/highmaps.src.js +1 -1
  147. package/es-modules/masters/highstock.src.js +1 -1
  148. package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
  149. package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
  150. package/es-modules/masters/indicators/ao.src.js +1 -1
  151. package/es-modules/masters/indicators/apo.src.js +1 -1
  152. package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
  153. package/es-modules/masters/indicators/aroon.src.js +1 -1
  154. package/es-modules/masters/indicators/atr.src.js +1 -1
  155. package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
  156. package/es-modules/masters/indicators/cci.src.js +1 -1
  157. package/es-modules/masters/indicators/chaikin.src.js +1 -1
  158. package/es-modules/masters/indicators/cmf.src.js +1 -1
  159. package/es-modules/masters/indicators/cmo.src.js +1 -1
  160. package/es-modules/masters/indicators/dema.src.js +1 -1
  161. package/es-modules/masters/indicators/disparity-index.src.js +1 -1
  162. package/es-modules/masters/indicators/dmi.src.js +1 -1
  163. package/es-modules/masters/indicators/dpo.src.js +1 -1
  164. package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
  165. package/es-modules/masters/indicators/indicators-all.src.js +1 -1
  166. package/es-modules/masters/indicators/indicators.src.js +1 -1
  167. package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
  168. package/es-modules/masters/indicators/klinger.src.js +1 -1
  169. package/es-modules/masters/indicators/macd.src.js +1 -1
  170. package/es-modules/masters/indicators/mfi.src.js +1 -1
  171. package/es-modules/masters/indicators/momentum.src.js +1 -1
  172. package/es-modules/masters/indicators/natr.src.js +1 -1
  173. package/es-modules/masters/indicators/obv.src.js +1 -1
  174. package/es-modules/masters/indicators/pivot-points.src.js +1 -1
  175. package/es-modules/masters/indicators/ppo.src.js +1 -1
  176. package/es-modules/masters/indicators/price-channel.src.js +1 -1
  177. package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
  178. package/es-modules/masters/indicators/psar.src.js +1 -1
  179. package/es-modules/masters/indicators/regressions.src.js +1 -1
  180. package/es-modules/masters/indicators/roc.src.js +1 -1
  181. package/es-modules/masters/indicators/rsi.src.js +1 -1
  182. package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
  183. package/es-modules/masters/indicators/stochastic.src.js +1 -1
  184. package/es-modules/masters/indicators/supertrend.src.js +1 -1
  185. package/es-modules/masters/indicators/tema.src.js +1 -1
  186. package/es-modules/masters/indicators/trendline.src.js +1 -1
  187. package/es-modules/masters/indicators/trix.src.js +1 -1
  188. package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
  189. package/es-modules/masters/indicators/vwap.src.js +1 -1
  190. package/es-modules/masters/indicators/williams-r.src.js +1 -1
  191. package/es-modules/masters/indicators/wma.src.js +1 -1
  192. package/es-modules/masters/indicators/zigzag.src.js +1 -1
  193. package/es-modules/masters/modules/accessibility.src.js +1 -1
  194. package/es-modules/masters/modules/annotations-advanced.src.js +1 -1
  195. package/es-modules/masters/modules/annotations.src.js +1 -1
  196. package/es-modules/masters/modules/arc-diagram.src.js +14 -0
  197. package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
  198. package/es-modules/masters/modules/boost-canvas.src.js +1 -1
  199. package/es-modules/masters/modules/boost.src.js +1 -1
  200. package/es-modules/masters/modules/broken-axis.src.js +1 -1
  201. package/es-modules/masters/modules/bullet.src.js +1 -1
  202. package/es-modules/masters/modules/coloraxis.src.js +1 -1
  203. package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
  204. package/es-modules/masters/modules/cylinder.src.js +1 -1
  205. package/es-modules/masters/modules/data.src.js +1 -1
  206. package/es-modules/masters/modules/datagrouping.src.js +1 -1
  207. package/es-modules/masters/modules/debugger.src.js +1 -1
  208. package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
  209. package/es-modules/masters/modules/dotplot.src.js +1 -1
  210. package/es-modules/masters/modules/drag-panes.src.js +1 -1
  211. package/es-modules/masters/modules/draggable-points.src.js +1 -1
  212. package/es-modules/masters/modules/drilldown.src.js +2 -1
  213. package/es-modules/masters/modules/dumbbell.src.js +1 -1
  214. package/es-modules/masters/modules/export-data.src.js +1 -1
  215. package/es-modules/masters/modules/exporting.src.js +1 -1
  216. package/es-modules/masters/modules/full-screen.src.js +1 -1
  217. package/es-modules/masters/modules/funnel.src.js +1 -1
  218. package/es-modules/masters/modules/funnel3d.src.js +1 -1
  219. package/es-modules/masters/modules/gantt.src.js +1 -1
  220. package/es-modules/masters/modules/grid-axis.src.js +1 -1
  221. package/es-modules/masters/modules/heatmap.src.js +1 -1
  222. package/es-modules/masters/modules/heikinashi.src.js +1 -1
  223. package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
  224. package/es-modules/masters/modules/hollowcandlestick.src.js +1 -1
  225. package/es-modules/masters/modules/item-series.src.js +1 -1
  226. package/es-modules/masters/modules/lollipop.src.js +1 -1
  227. package/es-modules/masters/modules/map.src.js +5 -1
  228. package/es-modules/masters/modules/marker-clusters.src.js +1 -1
  229. package/es-modules/masters/modules/networkgraph.src.js +1 -1
  230. package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
  231. package/es-modules/masters/modules/offline-exporting.src.js +1 -1
  232. package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
  233. package/es-modules/masters/modules/oldie.src.js +1 -1
  234. package/es-modules/masters/modules/organization.src.js +1 -1
  235. package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
  236. package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
  237. package/es-modules/masters/modules/pareto.src.js +1 -1
  238. package/es-modules/masters/modules/pathfinder.src.js +1 -1
  239. package/es-modules/masters/modules/pattern-fill.src.js +1 -1
  240. package/es-modules/masters/modules/price-indicator.src.js +1 -1
  241. package/es-modules/masters/modules/pyramid3d.src.js +1 -1
  242. package/es-modules/masters/modules/sankey.src.js +1 -1
  243. package/es-modules/masters/modules/series-label.src.js +1 -1
  244. package/es-modules/masters/modules/solid-gauge.src.js +1 -1
  245. package/es-modules/masters/modules/sonification.src.js +1 -1
  246. package/es-modules/masters/modules/static-scale.src.js +1 -1
  247. package/es-modules/masters/modules/stock-tools.src.js +1 -1
  248. package/es-modules/masters/modules/stock.src.js +1 -1
  249. package/es-modules/masters/modules/streamgraph.src.js +1 -1
  250. package/es-modules/masters/modules/sunburst.src.js +1 -1
  251. package/es-modules/masters/modules/tilemap.src.js +1 -1
  252. package/es-modules/masters/modules/timeline.src.js +1 -1
  253. package/es-modules/masters/modules/treegrid.src.js +1 -1
  254. package/es-modules/masters/modules/treemap.src.js +5 -1
  255. package/es-modules/masters/modules/variable-pie.src.js +1 -1
  256. package/es-modules/masters/modules/variwide.src.js +1 -1
  257. package/es-modules/masters/modules/vector.src.js +1 -1
  258. package/es-modules/masters/modules/venn.src.js +1 -1
  259. package/es-modules/masters/modules/windbarb.src.js +1 -1
  260. package/es-modules/masters/modules/wordcloud.src.js +1 -1
  261. package/es-modules/masters/modules/xrange.src.js +1 -1
  262. package/es-modules/masters/themes/avocado.src.js +1 -1
  263. package/es-modules/masters/themes/brand-dark.src.js +1 -1
  264. package/es-modules/masters/themes/brand-light.src.js +1 -1
  265. package/es-modules/masters/themes/dark-blue.src.js +1 -1
  266. package/es-modules/masters/themes/dark-green.src.js +1 -1
  267. package/es-modules/masters/themes/dark-unica.src.js +1 -1
  268. package/es-modules/masters/themes/gray.src.js +1 -1
  269. package/es-modules/masters/themes/grid-light.src.js +1 -1
  270. package/es-modules/masters/themes/grid.src.js +1 -1
  271. package/es-modules/masters/themes/high-contrast-dark.src.js +1 -1
  272. package/es-modules/masters/themes/high-contrast-light.src.js +1 -1
  273. package/es-modules/masters/themes/sand-signika.src.js +1 -1
  274. package/es-modules/masters/themes/skies.src.js +1 -1
  275. package/es-modules/masters/themes/sunset.src.js +1 -1
  276. package/highcharts-3d.js +99 -98
  277. package/highcharts-3d.js.map +1 -1
  278. package/highcharts-3d.src.js +51 -21
  279. package/highcharts-gantt.js +808 -800
  280. package/highcharts-gantt.js.map +1 -1
  281. package/highcharts-gantt.src.js +781 -426
  282. package/highcharts-more.js +195 -194
  283. package/highcharts-more.js.map +1 -1
  284. package/highcharts-more.src.js +18 -4
  285. package/highcharts.d.ts +3224 -542
  286. package/highcharts.js +592 -584
  287. package/highcharts.js.map +1 -1
  288. package/highcharts.src.d.ts +3224 -542
  289. package/highcharts.src.js +732 -400
  290. package/highmaps.js +760 -728
  291. package/highmaps.js.map +1 -1
  292. package/highmaps.src.js +3840 -2189
  293. package/highstock.js +793 -786
  294. package/highstock.js.map +1 -1
  295. package/highstock.src.js +783 -432
  296. package/indicators/acceleration-bands.js +12 -11
  297. package/indicators/acceleration-bands.js.map +1 -1
  298. package/indicators/acceleration-bands.src.js +11 -2
  299. package/indicators/accumulation-distribution.js +5 -5
  300. package/indicators/accumulation-distribution.js.map +1 -1
  301. package/indicators/accumulation-distribution.src.js +11 -2
  302. package/indicators/ao.js +6 -6
  303. package/indicators/ao.js.map +1 -1
  304. package/indicators/ao.src.js +11 -2
  305. package/indicators/apo.js +5 -5
  306. package/indicators/apo.js.map +1 -1
  307. package/indicators/apo.src.js +11 -2
  308. package/indicators/aroon-oscillator.js +10 -10
  309. package/indicators/aroon-oscillator.js.map +1 -1
  310. package/indicators/aroon-oscillator.src.js +11 -2
  311. package/indicators/aroon.js +11 -11
  312. package/indicators/aroon.js.map +1 -1
  313. package/indicators/aroon.src.js +11 -2
  314. package/indicators/atr.js +5 -5
  315. package/indicators/atr.js.map +1 -1
  316. package/indicators/atr.src.js +11 -2
  317. package/indicators/bollinger-bands.js +12 -12
  318. package/indicators/bollinger-bands.js.map +1 -1
  319. package/indicators/bollinger-bands.src.js +11 -2
  320. package/indicators/cci.js +5 -5
  321. package/indicators/cci.js.map +1 -1
  322. package/indicators/cci.src.js +11 -2
  323. package/indicators/chaikin.js +8 -8
  324. package/indicators/chaikin.js.map +1 -1
  325. package/indicators/chaikin.src.js +11 -2
  326. package/indicators/cmf.js +6 -6
  327. package/indicators/cmf.js.map +1 -1
  328. package/indicators/cmf.src.js +11 -2
  329. package/indicators/cmo.js +5 -5
  330. package/indicators/cmo.js.map +1 -1
  331. package/indicators/cmo.src.js +11 -2
  332. package/indicators/dema.js +5 -5
  333. package/indicators/dema.js.map +1 -1
  334. package/indicators/dema.src.js +11 -2
  335. package/indicators/disparity-index.js +6 -6
  336. package/indicators/disparity-index.js.map +1 -1
  337. package/indicators/disparity-index.src.js +11 -2
  338. package/indicators/dmi.js +12 -12
  339. package/indicators/dmi.js.map +1 -1
  340. package/indicators/dmi.src.js +11 -2
  341. package/indicators/dpo.js +5 -5
  342. package/indicators/dpo.js.map +1 -1
  343. package/indicators/dpo.src.js +11 -2
  344. package/indicators/ema.js +2 -1
  345. package/indicators/ema.js.map +1 -1
  346. package/indicators/ema.src.js +10 -1
  347. package/indicators/ichimoku-kinko-hyo.js +16 -16
  348. package/indicators/ichimoku-kinko-hyo.js.map +1 -1
  349. package/indicators/ichimoku-kinko-hyo.src.js +11 -2
  350. package/indicators/indicators-all.js +195 -194
  351. package/indicators/indicators-all.js.map +1 -1
  352. package/indicators/indicators-all.src.js +21 -5
  353. package/indicators/indicators.js +13 -12
  354. package/indicators/indicators.js.map +1 -1
  355. package/indicators/indicators.src.js +21 -5
  356. package/indicators/keltner-channels.js +12 -11
  357. package/indicators/keltner-channels.js.map +1 -1
  358. package/indicators/keltner-channels.src.js +11 -2
  359. package/indicators/klinger.js +13 -13
  360. package/indicators/klinger.js.map +1 -1
  361. package/indicators/klinger.src.js +11 -2
  362. package/indicators/macd.js +12 -11
  363. package/indicators/macd.js.map +1 -1
  364. package/indicators/macd.src.js +11 -2
  365. package/indicators/mfi.js +6 -6
  366. package/indicators/mfi.js.map +1 -1
  367. package/indicators/mfi.src.js +11 -2
  368. package/indicators/momentum.js +5 -5
  369. package/indicators/momentum.js.map +1 -1
  370. package/indicators/momentum.src.js +11 -2
  371. package/indicators/natr.js +5 -4
  372. package/indicators/natr.js.map +1 -1
  373. package/indicators/natr.src.js +11 -2
  374. package/indicators/obv.js +5 -5
  375. package/indicators/obv.js.map +1 -1
  376. package/indicators/obv.src.js +11 -2
  377. package/indicators/pivot-points.js +11 -11
  378. package/indicators/pivot-points.js.map +1 -1
  379. package/indicators/pivot-points.src.js +11 -2
  380. package/indicators/ppo.js +5 -5
  381. package/indicators/ppo.js.map +1 -1
  382. package/indicators/ppo.src.js +11 -2
  383. package/indicators/price-channel.js +11 -11
  384. package/indicators/price-channel.js.map +1 -1
  385. package/indicators/price-channel.src.js +11 -2
  386. package/indicators/price-envelopes.js +8 -8
  387. package/indicators/price-envelopes.js.map +1 -1
  388. package/indicators/price-envelopes.src.js +11 -2
  389. package/indicators/psar.js +7 -6
  390. package/indicators/psar.js.map +1 -1
  391. package/indicators/psar.src.js +11 -2
  392. package/indicators/regressions.js +12 -12
  393. package/indicators/regressions.js.map +1 -1
  394. package/indicators/regressions.src.js +11 -2
  395. package/indicators/roc.js +5 -5
  396. package/indicators/roc.js.map +1 -1
  397. package/indicators/roc.src.js +11 -2
  398. package/indicators/rsi.js +6 -5
  399. package/indicators/rsi.js.map +1 -1
  400. package/indicators/rsi.src.js +11 -2
  401. package/indicators/slow-stochastic.js +5 -5
  402. package/indicators/slow-stochastic.js.map +1 -1
  403. package/indicators/slow-stochastic.src.js +11 -2
  404. package/indicators/stochastic.js +12 -12
  405. package/indicators/stochastic.js.map +1 -1
  406. package/indicators/stochastic.src.js +11 -2
  407. package/indicators/supertrend.js +10 -10
  408. package/indicators/supertrend.js.map +1 -1
  409. package/indicators/supertrend.src.js +11 -2
  410. package/indicators/tema.js +6 -6
  411. package/indicators/tema.js.map +1 -1
  412. package/indicators/tema.src.js +11 -2
  413. package/indicators/trendline.js +5 -5
  414. package/indicators/trendline.js.map +1 -1
  415. package/indicators/trendline.src.js +11 -2
  416. package/indicators/trix.js +4 -4
  417. package/indicators/trix.js.map +1 -1
  418. package/indicators/trix.src.js +11 -2
  419. package/indicators/volume-by-price.js +17 -17
  420. package/indicators/volume-by-price.js.map +1 -1
  421. package/indicators/volume-by-price.src.js +11 -2
  422. package/indicators/vwap.js +5 -5
  423. package/indicators/vwap.js.map +1 -1
  424. package/indicators/vwap.src.js +11 -2
  425. package/indicators/williams-r.js +6 -5
  426. package/indicators/williams-r.js.map +1 -1
  427. package/indicators/williams-r.src.js +11 -2
  428. package/indicators/wma.js +5 -5
  429. package/indicators/wma.js.map +1 -1
  430. package/indicators/wma.src.js +11 -2
  431. package/indicators/zigzag.js +6 -6
  432. package/indicators/zigzag.js.map +1 -1
  433. package/indicators/zigzag.src.js +11 -2
  434. package/lib/jspdf.js +299 -184
  435. package/lib/jspdf.src.js +25266 -18067
  436. package/lib/svg2pdf.js +35 -31
  437. package/lib/svg2pdf.src.js +5721 -4179
  438. package/modules/accessibility.js +245 -240
  439. package/modules/accessibility.js.map +1 -1
  440. package/modules/accessibility.src.js +510 -283
  441. package/modules/annotations-advanced.js +144 -144
  442. package/modules/annotations-advanced.js.map +1 -1
  443. package/modules/annotations-advanced.src.js +37 -11
  444. package/modules/annotations.js +79 -79
  445. package/modules/annotations.js.map +1 -1
  446. package/modules/annotations.src.js +32 -8
  447. package/modules/arc-diagram.js +25 -0
  448. package/modules/arc-diagram.js.map +1 -0
  449. package/modules/arc-diagram.src.js +778 -0
  450. package/modules/arrow-symbols.js +4 -3
  451. package/modules/arrow-symbols.js.map +1 -1
  452. package/modules/arrow-symbols.src.js +11 -2
  453. package/modules/boost-canvas.js +15 -15
  454. package/modules/boost-canvas.js.map +1 -1
  455. package/modules/boost-canvas.src.js +11 -2
  456. package/modules/boost.js +80 -79
  457. package/modules/boost.js.map +1 -1
  458. package/modules/boost.src.js +71 -43
  459. package/modules/broken-axis.js +13 -13
  460. package/modules/broken-axis.js.map +1 -1
  461. package/modules/broken-axis.src.js +11 -2
  462. package/modules/bullet.js +9 -9
  463. package/modules/bullet.js.map +1 -1
  464. package/modules/bullet.src.js +11 -2
  465. package/modules/coloraxis.js +24 -24
  466. package/modules/coloraxis.js.map +1 -1
  467. package/modules/coloraxis.src.js +33 -7
  468. package/modules/current-date-indicator.js +5 -4
  469. package/modules/current-date-indicator.js.map +1 -1
  470. package/modules/current-date-indicator.src.js +11 -2
  471. package/modules/cylinder.js +11 -11
  472. package/modules/cylinder.js.map +1 -1
  473. package/modules/cylinder.src.js +11 -2
  474. package/modules/data.js +34 -33
  475. package/modules/data.js.map +1 -1
  476. package/modules/data.src.js +59 -32
  477. package/modules/datagrouping.js +21 -20
  478. package/modules/datagrouping.js.map +1 -1
  479. package/modules/datagrouping.src.js +19 -5
  480. package/modules/debugger.js +8 -7
  481. package/modules/debugger.js.map +1 -1
  482. package/modules/debugger.src.js +15 -2
  483. package/modules/dependency-wheel.js +12 -11
  484. package/modules/dependency-wheel.js.map +1 -1
  485. package/modules/dependency-wheel.src.js +14 -5
  486. package/modules/dotplot.js +6 -6
  487. package/modules/dotplot.js.map +1 -1
  488. package/modules/dotplot.src.js +11 -2
  489. package/modules/drag-panes.js +10 -10
  490. package/modules/drag-panes.js.map +1 -1
  491. package/modules/drag-panes.src.js +11 -2
  492. package/modules/draggable-points.js +35 -34
  493. package/modules/draggable-points.js.map +1 -1
  494. package/modules/draggable-points.src.js +20 -9
  495. package/modules/drilldown.d.ts +19 -0
  496. package/modules/drilldown.js +36 -25
  497. package/modules/drilldown.js.map +1 -1
  498. package/modules/drilldown.src.d.ts +19 -0
  499. package/modules/drilldown.src.js +1091 -106
  500. package/modules/dumbbell.js +17 -17
  501. package/modules/dumbbell.js.map +1 -1
  502. package/modules/dumbbell.src.js +11 -2
  503. package/modules/export-data.js +21 -20
  504. package/modules/export-data.js.map +1 -1
  505. package/modules/export-data.src.js +12 -4
  506. package/modules/exporting.js +39 -39
  507. package/modules/exporting.js.map +1 -1
  508. package/modules/exporting.src.js +227 -92
  509. package/modules/full-screen.js +8 -7
  510. package/modules/full-screen.js.map +1 -1
  511. package/modules/full-screen.src.js +135 -58
  512. package/modules/funnel.js +12 -12
  513. package/modules/funnel.js.map +1 -1
  514. package/modules/funnel.src.js +11 -2
  515. package/modules/funnel3d.js +21 -21
  516. package/modules/funnel3d.js.map +1 -1
  517. package/modules/funnel3d.src.js +11 -2
  518. package/modules/gantt.js +216 -215
  519. package/modules/gantt.js.map +1 -1
  520. package/modules/gantt.src.js +60 -28
  521. package/modules/grid-axis.js +23 -23
  522. package/modules/grid-axis.js.map +1 -1
  523. package/modules/grid-axis.src.js +27 -13
  524. package/modules/heatmap.js +40 -39
  525. package/modules/heatmap.js.map +1 -1
  526. package/modules/heatmap.src.js +46 -27
  527. package/modules/heikinashi.js +8 -8
  528. package/modules/heikinashi.js.map +1 -1
  529. package/modules/heikinashi.src.js +11 -2
  530. package/modules/histogram-bellcurve.js +13 -13
  531. package/modules/histogram-bellcurve.js.map +1 -1
  532. package/modules/histogram-bellcurve.src.js +11 -2
  533. package/modules/hollowcandlestick.js +9 -9
  534. package/modules/hollowcandlestick.js.map +1 -1
  535. package/modules/hollowcandlestick.src.js +11 -2
  536. package/modules/item-series.js +12 -12
  537. package/modules/item-series.js.map +1 -1
  538. package/modules/item-series.src.js +11 -2
  539. package/modules/lollipop.js +7 -7
  540. package/modules/lollipop.js.map +1 -1
  541. package/modules/lollipop.src.js +12 -3
  542. package/modules/map.d.ts +80 -43
  543. package/modules/map.js +169 -144
  544. package/modules/map.js.map +1 -1
  545. package/modules/map.src.d.ts +80 -43
  546. package/modules/map.src.js +8024 -6696
  547. package/modules/marker-clusters.js +36 -36
  548. package/modules/marker-clusters.js.map +1 -1
  549. package/modules/marker-clusters.src.js +47 -23
  550. package/modules/networkgraph.d.ts +5 -0
  551. package/modules/networkgraph.js +49 -48
  552. package/modules/networkgraph.js.map +1 -1
  553. package/modules/networkgraph.src.d.ts +5 -0
  554. package/modules/networkgraph.src.js +77 -15
  555. package/modules/no-data-to-display.js +5 -5
  556. package/modules/no-data-to-display.js.map +1 -1
  557. package/modules/no-data-to-display.src.js +11 -2
  558. package/modules/offline-exporting.js +20 -18
  559. package/modules/offline-exporting.js.map +1 -1
  560. package/modules/offline-exporting.src.js +126 -25
  561. package/modules/oldie-polyfills.js +7 -7
  562. package/modules/oldie-polyfills.js.map +1 -1
  563. package/modules/oldie-polyfills.src.js +11 -2
  564. package/modules/oldie.js +30 -30
  565. package/modules/oldie.js.map +1 -1
  566. package/modules/oldie.src.js +12 -3
  567. package/modules/organization.js +16 -14
  568. package/modules/organization.js.map +1 -1
  569. package/modules/organization.src.js +166 -32
  570. package/modules/overlapping-datalabels.js +3 -2
  571. package/modules/overlapping-datalabels.js.map +1 -1
  572. package/modules/overlapping-datalabels.src.js +11 -2
  573. package/modules/parallel-coordinates.js +11 -11
  574. package/modules/parallel-coordinates.js.map +1 -1
  575. package/modules/parallel-coordinates.src.js +11 -2
  576. package/modules/pareto.js +7 -7
  577. package/modules/pareto.js.map +1 -1
  578. package/modules/pareto.src.js +11 -2
  579. package/modules/pathfinder.js +31 -31
  580. package/modules/pathfinder.js.map +1 -1
  581. package/modules/pathfinder.src.js +11 -2
  582. package/modules/pattern-fill.js +14 -14
  583. package/modules/pattern-fill.js.map +1 -1
  584. package/modules/pattern-fill.src.js +11 -2
  585. package/modules/price-indicator.js +5 -5
  586. package/modules/price-indicator.js.map +1 -1
  587. package/modules/price-indicator.src.js +11 -2
  588. package/modules/pyramid3d.js +4 -4
  589. package/modules/pyramid3d.js.map +1 -1
  590. package/modules/pyramid3d.src.js +11 -2
  591. package/modules/sankey.d.ts +5 -0
  592. package/modules/sankey.js +32 -29
  593. package/modules/sankey.js.map +1 -1
  594. package/modules/sankey.src.d.ts +5 -0
  595. package/modules/sankey.src.js +341 -157
  596. package/modules/series-label.js +18 -17
  597. package/modules/series-label.js.map +1 -1
  598. package/modules/series-label.src.js +11 -2
  599. package/modules/solid-gauge.js +10 -10
  600. package/modules/solid-gauge.js.map +1 -1
  601. package/modules/solid-gauge.src.js +11 -2
  602. package/modules/sonification.js +59 -59
  603. package/modules/sonification.js.map +1 -1
  604. package/modules/sonification.src.js +11 -2
  605. package/modules/static-scale.js +5 -4
  606. package/modules/static-scale.js.map +1 -1
  607. package/modules/static-scale.src.js +11 -2
  608. package/modules/stock-tools.js +145 -145
  609. package/modules/stock-tools.js.map +1 -1
  610. package/modules/stock-tools.src.js +64 -32
  611. package/modules/stock.js +204 -204
  612. package/modules/stock.js.map +1 -1
  613. package/modules/stock.src.js +62 -34
  614. package/modules/streamgraph.js +5 -4
  615. package/modules/streamgraph.js.map +1 -1
  616. package/modules/streamgraph.src.js +11 -2
  617. package/modules/sunburst.d.ts +3 -0
  618. package/modules/sunburst.js +73 -60
  619. package/modules/sunburst.js.map +1 -1
  620. package/modules/sunburst.src.d.ts +3 -0
  621. package/modules/sunburst.src.js +1048 -97
  622. package/modules/tilemap.js +17 -17
  623. package/modules/tilemap.js.map +1 -1
  624. package/modules/tilemap.src.js +11 -2
  625. package/modules/timeline.js +18 -18
  626. package/modules/timeline.js.map +1 -1
  627. package/modules/timeline.src.js +11 -2
  628. package/modules/treegrid.js +57 -56
  629. package/modules/treegrid.js.map +1 -1
  630. package/modules/treegrid.src.js +38 -13
  631. package/modules/treemap.d.ts +3 -0
  632. package/modules/treemap.js +53 -41
  633. package/modules/treemap.js.map +1 -1
  634. package/modules/treemap.src.d.ts +3 -0
  635. package/modules/treemap.src.js +1037 -95
  636. package/modules/variable-pie.js +9 -9
  637. package/modules/variable-pie.js.map +1 -1
  638. package/modules/variable-pie.src.js +11 -2
  639. package/modules/variwide.js +12 -12
  640. package/modules/variwide.js.map +1 -1
  641. package/modules/variwide.src.js +11 -2
  642. package/modules/vector.js +8 -7
  643. package/modules/vector.js.map +1 -1
  644. package/modules/vector.src.js +11 -2
  645. package/modules/venn.js +31 -31
  646. package/modules/venn.js.map +1 -1
  647. package/modules/venn.src.js +18 -6
  648. package/modules/windbarb.js +15 -15
  649. package/modules/windbarb.js.map +1 -1
  650. package/modules/windbarb.src.js +11 -2
  651. package/modules/wordcloud.js +24 -23
  652. package/modules/wordcloud.js.map +1 -1
  653. package/modules/wordcloud.src.js +22 -10
  654. package/modules/xrange.js +16 -16
  655. package/modules/xrange.js.map +1 -1
  656. package/modules/xrange.src.js +11 -2
  657. package/package.json +1 -1
  658. package/themes/avocado.js +4 -3
  659. package/themes/avocado.js.map +1 -1
  660. package/themes/avocado.src.js +11 -2
  661. package/themes/brand-dark.js +9 -8
  662. package/themes/brand-dark.js.map +1 -1
  663. package/themes/brand-dark.src.js +11 -2
  664. package/themes/brand-light.js +8 -8
  665. package/themes/brand-light.js.map +1 -1
  666. package/themes/brand-light.src.js +11 -2
  667. package/themes/dark-blue.js +9 -8
  668. package/themes/dark-blue.js.map +1 -1
  669. package/themes/dark-blue.src.js +11 -2
  670. package/themes/dark-green.js +9 -8
  671. package/themes/dark-green.js.map +1 -1
  672. package/themes/dark-green.src.js +11 -2
  673. package/themes/dark-unica.js +8 -7
  674. package/themes/dark-unica.js.map +1 -1
  675. package/themes/dark-unica.src.js +11 -2
  676. package/themes/gray.js +9 -8
  677. package/themes/gray.js.map +1 -1
  678. package/themes/gray.src.js +11 -2
  679. package/themes/grid-light.js +5 -4
  680. package/themes/grid-light.js.map +1 -1
  681. package/themes/grid-light.src.js +11 -2
  682. package/themes/grid.js +5 -5
  683. package/themes/grid.js.map +1 -1
  684. package/themes/grid.src.js +11 -2
  685. package/themes/high-contrast-dark.js +7 -7
  686. package/themes/high-contrast-dark.js.map +1 -1
  687. package/themes/high-contrast-dark.src.js +21 -12
  688. package/themes/high-contrast-light.js +3 -3
  689. package/themes/high-contrast-light.js.map +1 -1
  690. package/themes/high-contrast-light.src.js +21 -12
  691. package/themes/sand-signika.js +5 -5
  692. package/themes/sand-signika.js.map +1 -1
  693. package/themes/sand-signika.src.js +11 -2
  694. package/themes/skies.js +5 -5
  695. package/themes/skies.js.map +1 -1
  696. package/themes/skies.src.js +11 -2
  697. package/themes/sunset.js +3 -3
  698. package/themes/sunset.js.map +1 -1
  699. package/themes/sunset.src.js +11 -2
  700. package/es-modules/Maps/ProjectionDefinition.js +0 -9
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v9.3.2 (2021-11-29)
2
+ * @license Highcharts JS v10.1.0 (2022-04-29)
3
3
  *
4
4
  * Accessibility module
5
5
  *
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * License: www.highcharts.com/license
10
10
  */
11
- 'use strict';
12
11
  (function (factory) {
13
12
  if (typeof module === 'object' && module.exports) {
14
13
  factory['default'] = factory;
@@ -23,10 +22,20 @@
23
22
  factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
24
23
  }
25
24
  }(function (Highcharts) {
25
+ 'use strict';
26
26
  var _modules = Highcharts ? Highcharts._modules : {};
27
27
  function _registerModule(obj, path, args, fn) {
28
28
  if (!obj.hasOwnProperty(path)) {
29
29
  obj[path] = fn.apply(null, args);
30
+
31
+ if (typeof CustomEvent === 'function') {
32
+ window.dispatchEvent(
33
+ new CustomEvent(
34
+ 'HighchartsModuleLoaded',
35
+ { detail: { path: path, module: obj[path] }
36
+ })
37
+ );
38
+ }
30
39
  }
31
40
  }
32
41
  _registerModule(_modules, 'Accessibility/A11yI18n.js', [_modules['Core/FormatUtilities.js'], _modules['Core/Utilities.js']], function (F, U) {
@@ -43,7 +52,8 @@
43
52
  *
44
53
  * */
45
54
  var format = F.format;
46
- var pick = U.pick;
55
+ var getNestedProperty = U.getNestedProperty,
56
+ pick = U.pick;
47
57
  /* *
48
58
  *
49
59
  * Composition
@@ -102,7 +112,7 @@
102
112
  var lenArg = Number(eachArguments[1]),
103
113
  len = void 0;
104
114
  result = '';
105
- arr = ctx[eachArguments[0]];
115
+ arr = getNestedProperty(eachArguments[0], ctx);
106
116
  if (arr) {
107
117
  lenArg = isNaN(lenArg) ? arr.length : lenArg;
108
118
  len = lenArg < 0 ?
@@ -117,7 +127,7 @@
117
127
  }
118
128
  // Dealing with a plural-function?
119
129
  if (pluralStart > -1) {
120
- var pluralEnd = (statement.slice(pluralStart).indexOf(')') + pluralStart), pluralStatement = statement.substring(pluralStart + 8, pluralEnd), pluralArguments = pluralStatement.split(','), num = Number(ctx[pluralArguments[0]]);
130
+ var pluralEnd = (statement.slice(pluralStart).indexOf(')') + pluralStart), pluralStatement = statement.substring(pluralStart + 8, pluralEnd), pluralArguments = pluralStatement.split(','), num = Number(getNestedProperty(pluralArguments[0], ctx));
121
131
  switch (num) {
122
132
  case 0:
123
133
  result = pick(pluralArguments[4], pluralArguments[1]);
@@ -140,7 +150,7 @@
140
150
  ix = Number(statement.substring(indexStart + 1,
141
151
  indexEnd));
142
152
  var val = void 0;
143
- arr = ctx[arrayName];
153
+ arr = getNestedProperty(arrayName, ctx);
144
154
  if (!isNaN(ix) && arr) {
145
155
  if (ix < 0) {
146
156
  val = arr[arr.length + ix];
@@ -759,9 +769,11 @@
759
769
  */
760
770
  function getAxisTimeLengthDesc(axis) {
761
771
  var chart = axis.chart,
762
- range = {};
772
+ range = {},
773
+ min = axis.dataMin || axis.min || 0,
774
+ max = axis.dataMax || axis.max || 0;
763
775
  var rangeUnit = 'Seconds';
764
- range.Seconds = ((axis.max || 0) - (axis.min || 0)) / 1000;
776
+ range.Seconds = (max - min) / 1000;
765
777
  range.Minutes = range.Seconds / 60;
766
778
  range.Hours = range.Minutes / 60;
767
779
  range.Days = range.Hours / 24;
@@ -791,9 +803,15 @@
791
803
  options.accessibility &&
792
804
  options.accessibility.screenReaderSection.axisRangeDateFormat ||
793
805
  ''),
794
- format = function (axisKey) {
795
- return axis.dateTime ? chart.time.dateFormat(dateRangeFormat,
796
- axis[axisKey]) : axis[axisKey];
806
+ extremes = {
807
+ min: axis.dataMin || axis.min || 0,
808
+ max: axis.dataMax || axis.max || 0
809
+ },
810
+ format = function (key) {
811
+ return axis.dateTime ?
812
+ chart.time.dateFormat(dateRangeFormat,
813
+ extremes[key]) :
814
+ extremes[key].toString();
797
815
  };
798
816
  return chart.langFormat('accessibility.axis.rangeFromTo', {
799
817
  chart: chart,
@@ -1454,20 +1472,19 @@
1454
1472
  }
1455
1473
  };
1456
1474
  /**
1475
+ * Set attributes on the chart container element.
1457
1476
  * @private
1458
1477
  */
1459
1478
  ContainerComponent.prototype.setRenderToAttrs = function () {
1460
- var chart = this.chart;
1461
- if (chart.options.accessibility.landmarkVerbosity !== 'disabled') {
1462
- chart.renderTo.setAttribute('role', 'region');
1463
- }
1464
- else {
1465
- chart.renderTo.removeAttribute('role');
1479
+ var chart = this.chart, shouldHaveLandmark = chart.options.accessibility
1480
+ .landmarkVerbosity !== 'disabled', containerLabel = chart.langFormat('accessibility.chartContainerLabel', {
1481
+ title: getChartTitle(chart),
1482
+ chart: chart
1483
+ });
1484
+ if (containerLabel) {
1485
+ chart.renderTo.setAttribute('role', shouldHaveLandmark ? 'region' : 'group');
1486
+ chart.renderTo.setAttribute('aria-label', containerLabel);
1466
1487
  }
1467
- chart.renderTo.setAttribute('aria-label', chart.langFormat('accessibility.chartContainerLabel', {
1468
- title: getChartTitle(chart),
1469
- chart: chart
1470
- }));
1471
1488
  };
1472
1489
  /**
1473
1490
  * @private
@@ -1672,15 +1689,21 @@
1672
1689
  }
1673
1690
  // Add the border rect
1674
1691
  var bb = this.getBBox(),
1675
- pad = pick(margin, 3);
1692
+ pad = pick(margin, 3),
1693
+ parent = this.parentGroup,
1694
+ scaleX = this.scaleX || parent && parent.scaleX,
1695
+ scaleY = this.scaleY || parent && parent.scaleY,
1696
+ oneDefined = scaleX ? !scaleY : scaleY,
1697
+ scaleBoth = oneDefined ? Math.abs(scaleX || scaleY || 1) :
1698
+ (Math.abs(scaleX || 1) + Math.abs(scaleY || 1)) / 2;
1676
1699
  bb.x += this.translateX ? this.translateX : 0;
1677
1700
  bb.y += this.translateY ? this.translateY : 0;
1678
1701
  var borderPosX = bb.x - pad,
1679
1702
  borderPosY = bb.y - pad,
1680
1703
  borderWidth = bb.width + 2 * pad,
1681
1704
  borderHeight = bb.height + 2 * pad;
1682
- // For text elements, apply x and y offset, #11397.
1683
1705
  /**
1706
+ * For text elements, apply x and y offset, #11397.
1684
1707
  * @private
1685
1708
  */
1686
1709
  function getTextAnchorCorrection(text) {
@@ -1728,16 +1751,16 @@
1728
1751
  }
1729
1752
  }
1730
1753
  }
1731
- this.focusBorder = this.renderer.rect(borderPosX, borderPosY, borderWidth, borderHeight, parseInt((attribs && attribs.r || 0).toString(), 10))
1754
+ this.focusBorder = this.renderer.rect(borderPosX, borderPosY, borderWidth, borderHeight, parseInt((attribs && attribs.r || 0).toString(), 10) / scaleBoth)
1732
1755
  .addClass('highcharts-focus-border')
1733
1756
  .attr({
1734
1757
  zIndex: 99
1735
1758
  })
1736
- .add(this.parentGroup);
1759
+ .add(parent);
1737
1760
  if (!this.renderer.styledMode) {
1738
1761
  this.focusBorder.attr({
1739
1762
  stroke: attribs && attribs.stroke,
1740
- 'stroke-width': attribs && attribs.strokeWidth
1763
+ 'stroke-width': (attribs && attribs.strokeWidth || 0) / scaleBoth
1741
1764
  });
1742
1765
  }
1743
1766
  avgElementAddUpdateFocusBorderHooks(this, margin, attribs);
@@ -2176,11 +2199,13 @@
2176
2199
  function getTypeDescription(chart, types) {
2177
2200
  var firstType = types[0],
2178
2201
  firstSeries = chart.series && chart.series[0] || {},
2202
+ mapTitle = chart.mapView && chart.mapView.geoMap &&
2203
+ chart.mapView.geoMap.title,
2179
2204
  formatContext = {
2180
2205
  numSeries: chart.series.length,
2181
2206
  numPoints: firstSeries.points && firstSeries.points.length,
2182
2207
  chart: chart,
2183
- mapTitle: firstSeries.mapTitle
2208
+ mapTitle: mapTitle
2184
2209
  };
2185
2210
  if (!firstType) {
2186
2211
  return getTypeDescForEmptyChart(chart, formatContext);
@@ -2374,23 +2399,27 @@
2374
2399
  }
2375
2400
  };
2376
2401
  /**
2402
+ * Apply a11y attributes to a screen reader info section
2377
2403
  * @private
2378
2404
  * @param {Highcharts.HTMLDOMElement} sectionDiv The section element
2379
2405
  * @param {string} regionKey Name/key of the region we are setting attrs for
2380
2406
  */
2381
2407
  InfoRegionsComponent.prototype.setScreenReaderSectionAttribs = function (sectionDiv, regionKey) {
2382
- var labelLangKey = ('accessibility.screenReaderSection.' + regionKey + 'RegionLabel'), chart = this.chart, labelText = chart.langFormat(labelLangKey, { chart: chart, chartTitle: getChartTitle(chart) }), sectionId = 'highcharts-screen-reader-region-' + regionKey + '-' +
2383
- chart.index;
2408
+ var chart = this.chart,
2409
+ labelText = chart.langFormat('accessibility.screenReaderSection.' + regionKey +
2410
+ 'RegionLabel', { chart: chart,
2411
+ chartTitle: getChartTitle(chart) }),
2412
+ sectionId = "highcharts-screen-reader-region-" + regionKey + "-" + chart.index;
2384
2413
  attr(sectionDiv, {
2385
2414
  id: sectionId,
2386
- 'aria-label': labelText
2415
+ 'aria-label': labelText || void 0
2387
2416
  });
2388
2417
  // Sections are wrapped to be positioned relatively to chart in case
2389
2418
  // elements inside are tabbed to.
2390
2419
  sectionDiv.style.position = 'relative';
2391
- if (chart.options.accessibility.landmarkVerbosity === 'all' &&
2392
- labelText) {
2393
- sectionDiv.setAttribute('role', 'region');
2420
+ if (labelText) {
2421
+ sectionDiv.setAttribute('role', chart.options.accessibility.landmarkVerbosity === 'all' ?
2422
+ 'region' : 'group');
2394
2423
  }
2395
2424
  };
2396
2425
  /**
@@ -2611,7 +2640,10 @@
2611
2640
  return axes.length > 1 || axes[0] &&
2612
2641
  pick(axes[0].options.accessibility &&
2613
2642
  axes[0].options.accessibility.enabled, defaultCondition);
2614
- }, hasNoMap = !!chart.types && chart.types.indexOf('map') < 0, hasCartesian = !!chart.hasCartesianSeries, showXAxes = shouldDescribeColl('xAxis', !chart.angular && hasCartesian && hasNoMap), showYAxes = shouldDescribeColl('yAxis', hasCartesian && hasNoMap), desc = {};
2643
+ }, hasNoMap = !!chart.types &&
2644
+ chart.types.indexOf('map') < 0 &&
2645
+ chart.types.indexOf('treemap') < 0 &&
2646
+ chart.types.indexOf('tilemap') < 0, hasCartesian = !!chart.hasCartesianSeries, showXAxes = shouldDescribeColl('xAxis', !chart.angular && hasCartesian && hasNoMap), showYAxes = shouldDescribeColl('yAxis', hasCartesian && hasNoMap), desc = {};
2615
2647
  if (showXAxes) {
2616
2648
  desc.xAxis = this.getAxisDescriptionText('xAxis');
2617
2649
  }
@@ -2758,7 +2790,6 @@
2758
2790
  if (menu) {
2759
2791
  menu.setAttribute('aria-hidden', 'true');
2760
2792
  }
2761
- this.isExportMenuShown = false;
2762
2793
  this.setExportButtonExpandedState('false');
2763
2794
  };
2764
2795
  /**
@@ -2771,7 +2802,6 @@
2771
2802
  this.addAccessibleContextMenuAttribs();
2772
2803
  unhideChartElementFromAT(chart, menu);
2773
2804
  }
2774
- this.isExportMenuShown = true;
2775
2805
  this.setExportButtonExpandedState('true');
2776
2806
  };
2777
2807
  /**
@@ -2788,8 +2818,21 @@
2788
2818
  * proxy overlay.
2789
2819
  */
2790
2820
  MenuComponent.prototype.onChartRender = function () {
2821
+ var chart = this.chart,
2822
+ focusEl = chart.focusElement,
2823
+ a11y = chart.accessibility;
2791
2824
  this.proxyProvider.clearGroup('chartMenu');
2792
2825
  this.proxyMenuButton();
2826
+ if (this.exportButtonProxy &&
2827
+ focusEl &&
2828
+ focusEl === chart.exportingGroup) {
2829
+ if (focusEl.focusBorder) {
2830
+ chart.setFocusToElement(focusEl, this.exportButtonProxy.buttonElement);
2831
+ }
2832
+ else if (a11y) {
2833
+ a11y.keyboardNavigation.tabindexContainer.focus();
2834
+ }
2835
+ }
2793
2836
  };
2794
2837
  /**
2795
2838
  * @private
@@ -2804,7 +2847,8 @@
2804
2847
  chart: chart,
2805
2848
  chartTitle: getChartTitle(chart)
2806
2849
  }),
2807
- 'aria-expanded': false
2850
+ 'aria-expanded': false,
2851
+ title: chart.options.lang.contextButtonTitle || null
2808
2852
  });
2809
2853
  }
2810
2854
  };
@@ -2958,7 +3002,7 @@
2958
3002
  var chart = this.chart;
2959
3003
  var curHighlightedItem = chart.exportDivElements[chart.highlightedExportItemIx];
2960
3004
  var exportButtonElement = getExportMenuButtonElement(chart).element;
2961
- if (this.isExportMenuShown) {
3005
+ if (chart.openMenu) {
2962
3006
  this.fakeClickEvent(curHighlightedItem);
2963
3007
  }
2964
3008
  else {
@@ -3028,7 +3072,7 @@
3028
3072
  function chartHideExportMenu() {
3029
3073
  var chart = this,
3030
3074
  exportList = chart.exportDivElements;
3031
- if (exportList && chart.exportContextMenu) {
3075
+ if (exportList && chart.exportContextMenu && chart.openMenu) {
3032
3076
  // Reset hover states etc.
3033
3077
  exportList.forEach(function (el) {
3034
3078
  if (el &&
@@ -3226,6 +3270,65 @@
3226
3270
  this.removeExitAnchor();
3227
3271
  }
3228
3272
  };
3273
+ /**
3274
+ * We use an exit anchor to move focus out of chart whenever we want, by
3275
+ * setting focus to this div and not preventing the default tab action. We
3276
+ * also use this when users come back into the chart by tabbing back, in
3277
+ * order to navigate from the end of the chart.
3278
+ * @private
3279
+ */
3280
+ KeyboardNavigation.prototype.updateExitAnchor = function () {
3281
+ var endMarkerId = "highcharts-end-of-chart-marker-" + this.chart.index,
3282
+ endMarker = getElement(endMarkerId);
3283
+ this.removeExitAnchor();
3284
+ if (endMarker) {
3285
+ this.makeElementAnExitAnchor(endMarker);
3286
+ this.exitAnchor = endMarker;
3287
+ }
3288
+ else {
3289
+ this.createExitAnchor();
3290
+ }
3291
+ };
3292
+ /**
3293
+ * Move to prev/next module.
3294
+ * @private
3295
+ * @param {number} direction
3296
+ * Direction to move. +1 for next, -1 for prev.
3297
+ * @return {boolean}
3298
+ * True if there was a valid module in direction.
3299
+ */
3300
+ KeyboardNavigation.prototype.move = function (direction) {
3301
+ var curModule = this.modules && this.modules[this.currentModuleIx];
3302
+ if (curModule && curModule.terminate) {
3303
+ curModule.terminate(direction);
3304
+ }
3305
+ // Remove existing focus border if any
3306
+ if (this.chart.focusElement) {
3307
+ this.chart.focusElement.removeFocusBorder();
3308
+ }
3309
+ this.currentModuleIx += direction;
3310
+ var newModule = this.modules && this.modules[this.currentModuleIx];
3311
+ if (newModule) {
3312
+ if (newModule.validate && !newModule.validate()) {
3313
+ return this.move(direction); // Invalid module, recurse
3314
+ }
3315
+ if (newModule.init) {
3316
+ newModule.init(direction); // Valid module, init it
3317
+ return true;
3318
+ }
3319
+ }
3320
+ // No module
3321
+ this.currentModuleIx = 0; // Reset counter
3322
+ // Set focus to chart or exit anchor depending on direction
3323
+ this.exiting = true;
3324
+ if (direction > 0) {
3325
+ this.exitAnchor.focus();
3326
+ }
3327
+ else {
3328
+ this.tabindexContainer.focus();
3329
+ }
3330
+ return false;
3331
+ };
3229
3332
  /**
3230
3333
  * Function to run on container focus
3231
3334
  * @private
@@ -3239,30 +3342,37 @@
3239
3342
  if (!this.exiting &&
3240
3343
  !this.tabbingInBackwards &&
3241
3344
  !this.isClickingChart &&
3242
- !focusComesFromChart &&
3243
- this.modules[0]) {
3244
- this.modules[0].init(1);
3345
+ !focusComesFromChart) {
3346
+ var ix = this.getFirstValidModuleIx();
3347
+ if (ix !== null) {
3348
+ this.currentModuleIx = ix;
3349
+ this.modules[ix].init(1);
3350
+ }
3245
3351
  }
3246
3352
  this.exiting = false;
3247
3353
  };
3248
3354
  /**
3249
- * Reset chart navigation state if we click outside the chart and it's
3250
- * not already reset.
3355
+ * Reset chart navigation state if we mouse click and it's not already
3356
+ * reset. Reset fully if outside the chart, otherwise just hide focus
3357
+ * indicator.
3251
3358
  * @private
3252
3359
  */
3253
3360
  KeyboardNavigation.prototype.onMouseUp = function () {
3254
3361
  delete this.isClickingChart;
3255
- if (!this.keyboardReset && !this.pointerIsOverChart) {
3256
- var chart = this.chart,
3257
- curMod = this.modules &&
3258
- this.modules[this.currentModuleIx || 0];
3259
- if (curMod && curMod.terminate) {
3260
- curMod.terminate();
3362
+ if (!this.keyboardReset) {
3363
+ var chart = this.chart;
3364
+ if (!this.pointerIsOverChart) {
3365
+ var curMod = this.modules &&
3366
+ this.modules[this.currentModuleIx || 0];
3367
+ if (curMod && curMod.terminate) {
3368
+ curMod.terminate();
3369
+ }
3370
+ this.currentModuleIx = 0;
3261
3371
  }
3262
3372
  if (chart.focusElement) {
3263
3373
  chart.focusElement.removeFocusBorder();
3374
+ delete chart.focusElement;
3264
3375
  }
3265
- this.currentModuleIx = 0;
3266
3376
  this.keyboardReset = true;
3267
3377
  }
3268
3378
  };
@@ -3289,10 +3399,10 @@
3289
3399
  preventDefault = true;
3290
3400
  }
3291
3401
  else if (response === curNavModule.response.prev) {
3292
- preventDefault = this.prev();
3402
+ preventDefault = this.move(-1);
3293
3403
  }
3294
3404
  else if (response === curNavModule.response.next) {
3295
- preventDefault = this.next();
3405
+ preventDefault = this.move(1);
3296
3406
  }
3297
3407
  if (preventDefault) {
3298
3408
  e.preventDefault();
@@ -3300,79 +3410,6 @@
3300
3410
  }
3301
3411
  }
3302
3412
  };
3303
- /**
3304
- * Go to previous module.
3305
- * @private
3306
- */
3307
- KeyboardNavigation.prototype.prev = function () {
3308
- return this.move(-1);
3309
- };
3310
- /**
3311
- * Go to next module.
3312
- * @private
3313
- */
3314
- KeyboardNavigation.prototype.next = function () {
3315
- return this.move(1);
3316
- };
3317
- /**
3318
- * Move to prev/next module.
3319
- * @private
3320
- * @param {number} direction
3321
- * Direction to move. +1 for next, -1 for prev.
3322
- * @return {boolean}
3323
- * True if there was a valid module in direction.
3324
- */
3325
- KeyboardNavigation.prototype.move = function (direction) {
3326
- var curModule = this.modules && this.modules[this.currentModuleIx];
3327
- if (curModule && curModule.terminate) {
3328
- curModule.terminate(direction);
3329
- }
3330
- // Remove existing focus border if any
3331
- if (this.chart.focusElement) {
3332
- this.chart.focusElement.removeFocusBorder();
3333
- }
3334
- this.currentModuleIx += direction;
3335
- var newModule = this.modules && this.modules[this.currentModuleIx];
3336
- if (newModule) {
3337
- if (newModule.validate && !newModule.validate()) {
3338
- return this.move(direction); // Invalid module, recurse
3339
- }
3340
- if (newModule.init) {
3341
- newModule.init(direction); // Valid module, init it
3342
- return true;
3343
- }
3344
- }
3345
- // No module
3346
- this.currentModuleIx = 0; // Reset counter
3347
- // Set focus to chart or exit anchor depending on direction
3348
- this.exiting = true;
3349
- if (direction > 0) {
3350
- this.exitAnchor.focus();
3351
- }
3352
- else {
3353
- this.tabindexContainer.focus();
3354
- }
3355
- return false;
3356
- };
3357
- /**
3358
- * We use an exit anchor to move focus out of chart whenever we want, by
3359
- * setting focus to this div and not preventing the default tab action. We
3360
- * also use this when users come back into the chart by tabbing back, in
3361
- * order to navigate from the end of the chart.
3362
- * @private
3363
- */
3364
- KeyboardNavigation.prototype.updateExitAnchor = function () {
3365
- var endMarkerId = ('highcharts-end-of-chart-marker-' + this.chart.index),
3366
- endMarker = getElement(endMarkerId);
3367
- this.removeExitAnchor();
3368
- if (endMarker) {
3369
- this.makeElementAnExitAnchor(endMarker);
3370
- this.exitAnchor = endMarker;
3371
- }
3372
- else {
3373
- this.createExitAnchor();
3374
- }
3375
- };
3376
3413
  /**
3377
3414
  * Chart container should have tabindex if navigation is enabled.
3378
3415
  * @private
@@ -3401,6 +3438,18 @@
3401
3438
  }
3402
3439
  };
3403
3440
  /**
3441
+ * Add new exit anchor to the chart.
3442
+ * @private
3443
+ */
3444
+ KeyboardNavigation.prototype.createExitAnchor = function () {
3445
+ var chart = this.chart,
3446
+ exitAnchor = this.exitAnchor = doc.createElement('div');
3447
+ chart.renderTo.appendChild(exitAnchor);
3448
+ this.makeElementAnExitAnchor(exitAnchor);
3449
+ };
3450
+ /**
3451
+ * Add attributes and events to an element to make it function as an
3452
+ * exit anchor.
3404
3453
  * @private
3405
3454
  */
3406
3455
  KeyboardNavigation.prototype.makeElementAnExitAnchor = function (el) {
@@ -3412,27 +3461,17 @@
3412
3461
  this.addExitAnchorEventsToEl(el);
3413
3462
  };
3414
3463
  /**
3415
- * Add new exit anchor to the chart.
3416
- *
3417
- * @private
3418
- */
3419
- KeyboardNavigation.prototype.createExitAnchor = function () {
3420
- var chart = this.chart,
3421
- exitAnchor = this.exitAnchor = doc.createElement('div');
3422
- chart.renderTo.appendChild(exitAnchor);
3423
- this.makeElementAnExitAnchor(exitAnchor);
3424
- };
3425
- /**
3464
+ * Destroy the exit anchor and remove from DOM.
3426
3465
  * @private
3427
3466
  */
3428
3467
  KeyboardNavigation.prototype.removeExitAnchor = function () {
3429
3468
  if (this.exitAnchor && this.exitAnchor.parentNode) {
3430
- this.exitAnchor.parentNode
3431
- .removeChild(this.exitAnchor);
3469
+ this.exitAnchor.parentNode.removeChild(this.exitAnchor);
3432
3470
  delete this.exitAnchor;
3433
3471
  }
3434
3472
  };
3435
3473
  /**
3474
+ * Add focus handler to exit anchor element.
3436
3475
  * @private
3437
3476
  */
3438
3477
  KeyboardNavigation.prototype.addExitAnchorEventsToEl = function (element) {
@@ -3443,6 +3482,9 @@
3443
3482
  focusComesFromChart = (e.relatedTarget &&
3444
3483
  chart.container.contains(e.relatedTarget)),
3445
3484
  comingInBackwards = !(focusComesFromChart || keyboardNavigation.exiting);
3485
+ if (chart.focusElement) {
3486
+ delete chart.focusElement;
3487
+ }
3446
3488
  if (comingInBackwards) {
3447
3489
  // Focus the container instead
3448
3490
  keyboardNavigation.tabbingInBackwards = true;
@@ -3460,7 +3502,7 @@
3460
3502
  if (curModule &&
3461
3503
  curModule.validate && !curModule.validate()) {
3462
3504
  // Invalid. Try moving backwards to find next valid.
3463
- keyboardNavigation.prev();
3505
+ keyboardNavigation.move(-1);
3464
3506
  }
3465
3507
  else if (curModule) {
3466
3508
  // We have a valid module, init it
@@ -3474,6 +3516,21 @@
3474
3516
  }
3475
3517
  });
3476
3518
  };
3519
+ /**
3520
+ * Get the ix of the first module that either does not require validation or
3521
+ * validates positively.
3522
+ * @private
3523
+ */
3524
+ KeyboardNavigation.prototype.getFirstValidModuleIx = function () {
3525
+ var len = this.modules.length;
3526
+ for (var i = 0; i < len; ++i) {
3527
+ var mod = this.modules[i];
3528
+ if (!mod.validate || mod.validate()) {
3529
+ return i;
3530
+ }
3531
+ }
3532
+ return null;
3533
+ };
3477
3534
  /**
3478
3535
  * Remove all traces of keyboard navigation.
3479
3536
  * @private
@@ -3509,6 +3566,7 @@
3509
3566
  * */
3510
3567
  /* eslint-disable valid-jsdoc */
3511
3568
  /**
3569
+ * Composition function.
3512
3570
  * @private
3513
3571
  */
3514
3572
  function compose(ChartClass) {
@@ -3592,6 +3650,7 @@
3592
3650
  };
3593
3651
  })();
3594
3652
  var animObject = A.animObject;
3653
+ var doc = H.doc;
3595
3654
  var addEvent = U.addEvent,
3596
3655
  fireEvent = U.fireEvent,
3597
3656
  isNumber = U.isNumber,
@@ -3627,6 +3686,19 @@
3627
3686
  !(chart.colorAxis && chart.colorAxis.length) &&
3628
3687
  legendA11yOptions.enabled !== false);
3629
3688
  }
3689
+ /**
3690
+ * @private
3691
+ */
3692
+ function setLegendItemHoverState(hoverActive, legendItem) {
3693
+ legendItem.setState(hoverActive ? 'hover' : '', true);
3694
+ ['legendGroup', 'legendItem', 'legendSymbol'].forEach(function (i) {
3695
+ var obj = legendItem[i];
3696
+ var el = obj && obj.element || obj;
3697
+ if (el) {
3698
+ fireEvent(el, hoverActive ? 'mouseover' : 'mouseout');
3699
+ }
3700
+ });
3701
+ }
3630
3702
  /* *
3631
3703
  *
3632
3704
  * Class
@@ -3650,6 +3722,7 @@
3650
3722
  var _this = _super !== null && _super.apply(this,
3651
3723
  arguments) || this;
3652
3724
  _this.highlightedLegendItemIx = NaN;
3725
+ _this.proxyGroup = null;
3653
3726
  return _this;
3654
3727
  }
3655
3728
  /* *
@@ -3775,12 +3848,19 @@
3775
3848
  * @private
3776
3849
  */
3777
3850
  LegendComponent.prototype.recreateProxies = function () {
3851
+ var focusedElement = doc.activeElement;
3852
+ var proxyGroup = this.proxyGroup;
3853
+ var shouldRestoreFocus = focusedElement && proxyGroup &&
3854
+ proxyGroup.contains(focusedElement);
3778
3855
  this.removeProxies();
3779
3856
  if (shouldDoLegendA11y(this.chart)) {
3780
3857
  this.addLegendProxyGroup();
3781
3858
  this.proxyLegendItems();
3782
3859
  this.updateLegendItemProxyVisibility();
3783
3860
  this.updateLegendTitle();
3861
+ if (shouldRestoreFocus) {
3862
+ this.chart.highlightLegendItem(this.highlightedLegendItemIx);
3863
+ }
3784
3864
  return true;
3785
3865
  }
3786
3866
  return false;
@@ -3816,7 +3896,7 @@
3816
3896
  var a11yOptions = this.chart.options.accessibility;
3817
3897
  var groupRole = a11yOptions.landmarkVerbosity === 'all' ?
3818
3898
  'region' : null;
3819
- this.proxyProvider.addGroup('legend', 'ul', {
3899
+ this.proxyGroup = this.proxyProvider.addGroup('legend', 'ul', {
3820
3900
  // Filled by updateLegendTitle, to keep up to date without
3821
3901
  // recreating group
3822
3902
  'aria-label': '_placeholder_',
@@ -3900,21 +3980,19 @@
3900
3980
  validate: function () {
3901
3981
  return component.shouldHaveLegendNavigation();
3902
3982
  },
3903
- init: function (direction) {
3904
- return component.onKbdNavigationInit(direction);
3983
+ init: function () {
3984
+ chart.highlightLegendItem(0);
3985
+ component.highlightedLegendItemIx = 0;
3905
3986
  },
3906
3987
  terminate: function () {
3907
3988
  component.highlightedLegendItemIx = -1;
3908
- chart.legend.allItems.forEach(function (item) { return item.setState('', true); });
3989
+ chart.legend.allItems.forEach(function (item) { return setLegendItemHoverState(false, item); });
3909
3990
  }
3910
3991
  });
3911
3992
  };
3912
3993
  /**
3994
+ * Arrow key navigation
3913
3995
  * @private
3914
- * @param {Highcharts.KeyboardNavigationHandler} keyboardNavigationHandler
3915
- * @param {number} keyCode
3916
- * @return {number}
3917
- * Response code
3918
3996
  */
3919
3997
  LegendComponent.prototype.onKbdArrowKey = function (keyboardNavigationHandler, keyCode) {
3920
3998
  var keys = this.keyCodes,
@@ -3933,8 +4011,7 @@
3933
4011
  keyboardNavigationHandler.init(direction);
3934
4012
  return response.success;
3935
4013
  }
3936
- // No wrap, move
3937
- return response[direction > 0 ? 'next' : 'prev'];
4014
+ return response.success;
3938
4015
  };
3939
4016
  /**
3940
4017
  * @private
@@ -3964,17 +4041,6 @@
3964
4041
  legendA11yOptions.keyboardNavigation &&
3965
4042
  legendA11yOptions.keyboardNavigation.enabled);
3966
4043
  };
3967
- /**
3968
- * @private
3969
- * @param {number} direction
3970
- */
3971
- LegendComponent.prototype.onKbdNavigationInit = function (direction) {
3972
- var chart = this.chart,
3973
- lastIx = chart.legend.allItems.length - 1,
3974
- ixToHighlight = direction > 0 ? 0 : lastIx;
3975
- chart.highlightLegendItem(ixToHighlight);
3976
- this.highlightedLegendItemIx = ixToHighlight;
3977
- };
3978
4044
  return LegendComponent;
3979
4045
  }(AccessibilityComponent));
3980
4046
  /* *
@@ -4011,7 +4077,7 @@
4011
4077
  var itemToHighlight = items[ix];
4012
4078
  if (itemToHighlight) {
4013
4079
  if (isNumber(oldIx) && items[oldIx]) {
4014
- fireEvent(items[oldIx].legendGroup.element, 'mouseout');
4080
+ setLegendItemHoverState(false, items[oldIx]);
4015
4081
  }
4016
4082
  scrollLegendToItem(this.legend, ix);
4017
4083
  var legendItemProp = itemToHighlight.legendItem;
@@ -4020,9 +4086,7 @@
4020
4086
  if (legendItemProp && legendItemProp.element && proxyBtn) {
4021
4087
  this.setFocusToElement(legendItemProp, proxyBtn);
4022
4088
  }
4023
- if (itemToHighlight.legendGroup) {
4024
- fireEvent(itemToHighlight.legendGroup.element, 'mouseover');
4025
- }
4089
+ setLegendItemHoverState(true, itemToHighlight);
4026
4090
  return true;
4027
4091
  }
4028
4092
  return false;
@@ -4111,14 +4175,21 @@
4111
4175
  }) || null;
4112
4176
  }
4113
4177
  /**
4178
+ * Whether or not we should add a dummy point element in
4179
+ * order to describe a point that has no graphic.
4114
4180
  * @private
4115
4181
  */
4116
4182
  function shouldAddDummyPoint(point) {
4117
4183
  // Note: Sunburst series use isNull for hidden points on drilldown.
4118
4184
  // Ignore these.
4119
- var isSunburst = point.series && point.series.is('sunburst'),
4120
- isNull = point.isNull;
4121
- return isNull && !isSunburst;
4185
+ var series = point.series,
4186
+ chart = series && series.chart,
4187
+ isSunburst = series && series.is('sunburst'),
4188
+ isNull = point.isNull,
4189
+ shouldDescribeNull = chart &&
4190
+ chart
4191
+ .options.accessibility.point.describeNull;
4192
+ return isNull && !isSunburst && shouldDescribeNull;
4122
4193
  }
4123
4194
  /**
4124
4195
  * @private
@@ -4366,9 +4437,9 @@
4366
4437
  * @private
4367
4438
  */
4368
4439
  function defaultPointDescriptionFormatter(point) {
4369
- var series = point.series, chart = series.chart, valText = getPointValueDescription(point), description = point.options && point.options.accessibility &&
4370
- point.options.accessibility.description, userDescText = description ? ' ' + description : '', seriesNameText = chart.series.length > 1 && series.name ?
4371
- ' ' + series.name + '.' : '', annotationsDesc = getPointAnnotationDescription(point), pointAnnotationsText = annotationsDesc ? ' ' + annotationsDesc : '';
4440
+ var series = point.series, shouldExposeSeriesName = series.chart.series.length > 1 ||
4441
+ series.options.name, valText = getPointValueDescription(point), description = point.options && point.options.accessibility &&
4442
+ point.options.accessibility.description, userDescText = description ? ' ' + description : '', seriesNameText = shouldExposeSeriesName ? ' ' + series.name + '.' : '', annotationsDesc = getPointAnnotationDescription(point), pointAnnotationsText = annotationsDesc ? ' ' + annotationsDesc : '';
4372
4443
  point.accessibility = point.accessibility || {};
4373
4444
  point.accessibility.valueDescription = valText;
4374
4445
  return valText + userDescText + seriesNameText + pointAnnotationsText;
@@ -4399,15 +4470,21 @@
4399
4470
  */
4400
4471
  function describePointsInSeries(series) {
4401
4472
  var setScreenReaderProps = shouldSetScreenReaderPropsOnPoints(series),
4402
- setKeyboardProps = shouldSetKeyboardNavPropsOnPoints(series);
4473
+ setKeyboardProps = shouldSetKeyboardNavPropsOnPoints(series),
4474
+ shouldDescribeNullPoints = series.chart.options.accessibility
4475
+ .point.describeNull;
4403
4476
  if (setScreenReaderProps || setKeyboardProps) {
4404
4477
  series.points.forEach(function (point) {
4405
4478
  var pointEl = point.graphic && point.graphic.element ||
4406
- shouldAddDummyPoint(point) && addDummyPointElement(point);
4407
- var pointA11yDisabled = (point.options &&
4479
+ shouldAddDummyPoint(point) && addDummyPointElement(point),
4480
+ pointA11yDisabled = (point.options &&
4408
4481
  point.options.accessibility &&
4409
4482
  point.options.accessibility.enabled === false);
4410
4483
  if (pointEl) {
4484
+ if (point.isNull && !shouldDescribeNullPoints) {
4485
+ pointEl.setAttribute('aria-hidden', true);
4486
+ return;
4487
+ }
4411
4488
  // We always set tabindex, as long as we are setting props.
4412
4489
  // When setting tabindex, also remove default outline to
4413
4490
  // avoid ugly border on click.
@@ -4435,14 +4512,19 @@
4435
4512
  description = getSeriesDescriptionText(series),
4436
4513
  shouldDescribeAxis = function (coll) {
4437
4514
  return chart[coll] && chart[coll].length > 1 && series[coll];
4438
- }, xAxisInfo = getSeriesAxisDescriptionText(series, 'xAxis'), yAxisInfo = getSeriesAxisDescriptionText(series, 'yAxis'), summaryContext = {
4439
- name: series.name || '',
4440
- ix: series.index + 1,
4441
- numSeries: chart.series && chart.series.length,
4442
- numPoints: series.points && series.points.length,
4443
- series: series
4444
- }, combinationSuffix = chartTypes.length > 1 ? 'Combination' : '', summary = chart.langFormat('accessibility.series.summary.' + series.type + combinationSuffix, summaryContext) || chart.langFormat('accessibility.series.summary.default' + combinationSuffix, summaryContext);
4445
- return summary + (description ? ' ' + description : '') + (shouldDescribeAxis('yAxis') ? ' ' + yAxisInfo : '') + (shouldDescribeAxis('xAxis') ? ' ' + xAxisInfo : '');
4515
+ }, seriesNumber = series.index + 1, xAxisInfo = getSeriesAxisDescriptionText(series, 'xAxis'), yAxisInfo = getSeriesAxisDescriptionText(series, 'yAxis'), summaryContext = {
4516
+ seriesNumber: seriesNumber,
4517
+ series: series,
4518
+ chart: chart
4519
+ }, combinationSuffix = chartTypes.length > 1 ? 'Combination' : '', summary = chart.langFormat('accessibility.series.summary.' + series.type + combinationSuffix, summaryContext) || chart.langFormat('accessibility.series.summary.default' + combinationSuffix, summaryContext), axisDescription = (shouldDescribeAxis('yAxis') ? ' ' + yAxisInfo + '.' : '') + (shouldDescribeAxis('xAxis') ? ' ' + xAxisInfo + '.' : ''), formatStr = chart.options.accessibility.series.descriptionFormat || '';
4520
+ return format(formatStr, {
4521
+ seriesDescription: summary,
4522
+ authorDescription: (description ? ' ' + description : ''),
4523
+ axisDescription: axisDescription,
4524
+ series: series,
4525
+ chart: chart,
4526
+ seriesNumber: seriesNumber
4527
+ }, void 0);
4446
4528
  }
4447
4529
  /**
4448
4530
  * Set a11y props on a series element
@@ -4460,7 +4542,10 @@
4460
4542
  }
4461
4543
  else if (landmarkVerbosity === 'all') {
4462
4544
  seriesElement.setAttribute('role', 'region');
4463
- } /* else do not add role */
4545
+ }
4546
+ else {
4547
+ seriesElement.setAttribute('role', 'group');
4548
+ }
4464
4549
  seriesElement.setAttribute('tabindex', '-1');
4465
4550
  if (!series.chart.styledMode) {
4466
4551
  // Don't show browser outline on click, despite tabindex
@@ -4493,7 +4578,7 @@
4493
4578
  describeSeriesElement(series, seriesEl);
4494
4579
  }
4495
4580
  else {
4496
- seriesEl.setAttribute('aria-label', '');
4581
+ seriesEl.removeAttribute('aria-label');
4497
4582
  }
4498
4583
  }
4499
4584
  }
@@ -4628,7 +4713,7 @@
4628
4713
  var announcer = this,
4629
4714
  chart = this.chart,
4630
4715
  e = this.eventProvider;
4631
- e.addEvent(chart, 'afterDrilldown', function () {
4716
+ e.addEvent(chart, 'afterApplyDrilldown', function () {
4632
4717
  announcer.lastAnnouncementTime = 0;
4633
4718
  });
4634
4719
  e.addEvent(chart, 'afterAddSeries', function (e) {
@@ -4938,9 +5023,15 @@
4938
5023
  ProxyElement.prototype.updateTarget = function (target, attributes) {
4939
5024
  this.target = target;
4940
5025
  this.updateCSSClassName();
5026
+ var attrs = attributes || {};
5027
+ Object.keys(attrs).forEach(function (a) {
5028
+ if (attrs[a] === null) {
5029
+ delete attrs[a];
5030
+ }
5031
+ });
4941
5032
  attr(this.buttonElement, merge({
4942
5033
  'aria-label': this.getTargetAttr(target.click, 'aria-label')
4943
- }, attributes));
5034
+ }, attrs));
4944
5035
  this.eventProvider.removeAddedEvents();
4945
5036
  this.addProxyEventsToButton(this.buttonElement, target.click);
4946
5037
  this.refreshPosition();
@@ -5038,12 +5129,14 @@
5038
5129
  var chartDiv = this.chart.renderTo;
5039
5130
  if (chartDiv && posElement && posElement.getBoundingClientRect) {
5040
5131
  var rectEl = posElement.getBoundingClientRect(),
5041
- rectDiv = chartDiv.getBoundingClientRect();
5132
+ chartPos = this.chart.pointer.getChartPosition();
5042
5133
  return {
5043
- x: rectEl.left - rectDiv.left,
5044
- y: rectEl.top - rectDiv.top,
5045
- width: rectEl.right - rectEl.left,
5046
- height: rectEl.bottom - rectEl.top
5134
+ x: (rectEl.left - chartPos.left) / chartPos.scaleX,
5135
+ y: (rectEl.top - chartPos.top) / chartPos.scaleY,
5136
+ width: rectEl.right / chartPos.scaleX -
5137
+ rectEl.left / chartPos.scaleX,
5138
+ height: rectEl.bottom / chartPos.scaleY -
5139
+ rectEl.top / chartPos.scaleY
5047
5140
  };
5048
5141
  }
5049
5142
  return { x: 0, y: 0, width: 1, height: 1 };
@@ -5140,10 +5233,13 @@
5140
5233
  /**
5141
5234
  * Create a group that will contain proxy elements. The group order is
5142
5235
  * automatically updated according to the last group order keys.
5236
+ *
5237
+ * Returns the added group.
5143
5238
  */
5144
5239
  ProxyProvider.prototype.addGroup = function (groupKey, groupType, attributes) {
5145
- if (this.groups[groupKey]) {
5146
- return;
5240
+ var existingGroup = this.groups[groupKey];
5241
+ if (existingGroup) {
5242
+ return existingGroup.groupElement;
5147
5243
  }
5148
5244
  var proxyContainer = this.domElementProvider.createElement(groupType);
5149
5245
  // If we want to add a role to the group, and still use e.g.
@@ -5172,6 +5268,7 @@
5172
5268
  // won't have to reorder the whole set of groups.
5173
5269
  this.afterChartProxyPosContainer.appendChild(groupElement);
5174
5270
  this.updateGroupOrder(this.groupOrder);
5271
+ return groupElement;
5175
5272
  };
5176
5273
  /**
5177
5274
  * Update HTML attributes of a group.
@@ -5355,6 +5452,10 @@
5355
5452
  */
5356
5453
  ProxyProvider.prototype.updatePosContainerPositions = function () {
5357
5454
  var chart = this.chart;
5455
+ // If exporting, don't add these containers to the DOM.
5456
+ if (chart.renderer.forExport) {
5457
+ return;
5458
+ }
5358
5459
  var rendererSVGEl = chart.renderer.box;
5359
5460
  chart.container.insertBefore(this.afterChartProxyPosContainer, rendererSVGEl.nextSibling);
5360
5461
  chart.container.insertBefore(this.beforeChartProxyPosContainer, rendererSVGEl);
@@ -7968,7 +8069,7 @@
7968
8069
  if (chart.accessibility) {
7969
8070
  chart.accessibility.keyboardNavigation.tabindexContainer
7970
8071
  .focus();
7971
- chart.accessibility.keyboardNavigation[direction < 0 ? 'prev' : 'next']();
8072
+ chart.accessibility.keyboardNavigation.move(direction);
7972
8073
  }
7973
8074
  }
7974
8075
  else if (rangeSel) {
@@ -8059,7 +8160,7 @@
8059
8160
  e.stopPropagation();
8060
8161
  if (a11y) {
8061
8162
  a11y.keyboardNavigation.tabindexContainer.focus();
8062
- a11y.keyboardNavigation[e.shiftKey ? 'prev' : 'next']();
8163
+ a11y.keyboardNavigation.move(e.shiftKey ? -1 : 1);
8063
8164
  }
8064
8165
  }
8065
8166
  });
@@ -8417,6 +8518,7 @@
8417
8518
  else if (series.a11yMarkersForced) {
8418
8519
  delete series.a11yMarkersForced;
8419
8520
  unforceSeriesMarkerOptions(series);
8521
+ delete series.resetA11yMarkerOptions;
8420
8522
  }
8421
8523
  }
8422
8524
  /**
@@ -8444,20 +8546,20 @@
8444
8546
  });
8445
8547
  }
8446
8548
  /**
8549
+ * Reset markers to normal
8447
8550
  * @private
8448
8551
  */
8449
8552
  function unforceSeriesMarkerOptions(series) {
8450
8553
  var resetMarkerOptions = series.resetA11yMarkerOptions;
8451
8554
  if (resetMarkerOptions) {
8452
- merge(true, series.options, {
8555
+ var originalOpactiy = resetMarkerOptions.states &&
8556
+ resetMarkerOptions.states.normal &&
8557
+ resetMarkerOptions.states.normal.opacity;
8558
+ series.update({
8453
8559
  marker: {
8454
8560
  enabled: resetMarkerOptions.enabled,
8455
8561
  states: {
8456
- normal: {
8457
- opacity: resetMarkerOptions.states &&
8458
- resetMarkerOptions.states.normal &&
8459
- resetMarkerOptions.states.normal.opacity
8460
- }
8562
+ normal: { opacity: originalOpactiy }
8461
8563
  }
8462
8564
  }
8463
8565
  });
@@ -8557,6 +8659,37 @@
8557
8659
  pointA11yDisabled ||
8558
8660
  isSkipSeries(point.series);
8559
8661
  }
8662
+ /**
8663
+ * Get the first point that is not a skip point in this series.
8664
+ * @private
8665
+ */
8666
+ function getFirstValidPointInSeries(series) {
8667
+ var points = series.points || [],
8668
+ len = points.length;
8669
+ for (var i = 0; i < len; ++i) {
8670
+ if (!isSkipPoint(points[i])) {
8671
+ return points[i];
8672
+ }
8673
+ }
8674
+ return null;
8675
+ }
8676
+ /**
8677
+ * Get the first point that is not a skip point in this chart.
8678
+ * @private
8679
+ */
8680
+ function getFirstValidPointInChart(chart) {
8681
+ var series = chart.series || [],
8682
+ len = series.length;
8683
+ for (var i = 0; i < len; ++i) {
8684
+ if (!isSkipSeries(series[i])) {
8685
+ var point = getFirstValidPointInSeries(series[i]);
8686
+ if (point) {
8687
+ return point;
8688
+ }
8689
+ }
8690
+ }
8691
+ return null;
8692
+ }
8560
8693
  /**
8561
8694
  * @private
8562
8695
  */
@@ -8569,7 +8702,7 @@
8569
8702
  // Highlight first valid point in the series will also
8570
8703
  // look backwards. It always starts from currently
8571
8704
  // highlighted point.
8572
- res = chart.series[i].highlightFirstValidPoint();
8705
+ res = chart.series[i].highlightNextValidPoint();
8573
8706
  if (res) {
8574
8707
  break;
8575
8708
  }
@@ -8577,24 +8710,24 @@
8577
8710
  return res;
8578
8711
  }
8579
8712
  /**
8713
+ * After drilling down/up, we need to set focus to the first point for
8714
+ * screen readers and keyboard nav.
8580
8715
  * @private
8581
8716
  */
8582
8717
  function updateChartFocusAfterDrilling(chart) {
8583
- highlightFirstValidPointInChart(chart);
8584
- if (chart.focusElement) {
8585
- chart.focusElement.removeFocusBorder();
8718
+ var point = getFirstValidPointInChart(chart);
8719
+ if (point) {
8720
+ point.highlight(false); // Do not visually highlight
8586
8721
  }
8587
8722
  }
8588
8723
  /**
8724
+ * Highlight the first point in chart that is not a skip point
8589
8725
  * @private
8590
8726
  */
8591
8727
  function highlightFirstValidPointInChart(chart) {
8592
- var res = false;
8593
8728
  delete chart.highlightedPoint;
8594
- res = chart.series.reduce(function (acc, cur) {
8595
- return acc || cur.highlightFirstValidPoint();
8596
- }, false);
8597
- return res;
8729
+ var point = getFirstValidPointInChart(chart);
8730
+ return point ? point.highlight() : false;
8598
8731
  }
8599
8732
  /* *
8600
8733
  *
@@ -8632,7 +8765,7 @@
8632
8765
  e.addEvent(Series, 'destroy', function () {
8633
8766
  return keyboardNavigation.onSeriesDestroy(this);
8634
8767
  });
8635
- e.addEvent(chart, 'afterDrilldown', function () {
8768
+ e.addEvent(chart, 'afterApplyDrilldown', function () {
8636
8769
  updateChartFocusAfterDrilling(this);
8637
8770
  });
8638
8771
  e.addEvent(chart, 'drilldown', function (e) {
@@ -8672,11 +8805,11 @@
8672
8805
  });
8673
8806
  };
8674
8807
  /**
8808
+ * After drillup we want to find the point that was drilled down to and
8809
+ * highlight it.
8675
8810
  * @private
8676
8811
  */
8677
8812
  SeriesKeyboardNavigation.prototype.onDrillupAll = function () {
8678
- // After drillup we want to find the point that was drilled down to and
8679
- // highlight it.
8680
8813
  var last = this.lastDrilledDownPoint,
8681
8814
  chart = this.chart,
8682
8815
  series = last && getSeriesFromName(chart,
@@ -8685,15 +8818,13 @@
8685
8818
  if (last && series && defined(last.x) && defined(last.y)) {
8686
8819
  point = getPointFromXY(series, last.x, last.y);
8687
8820
  }
8821
+ point = point || getFirstValidPointInChart(chart);
8688
8822
  // Container focus can be lost on drillup due to deleted elements.
8689
8823
  if (chart.container) {
8690
8824
  chart.container.focus();
8691
8825
  }
8692
8826
  if (point && point.highlight) {
8693
- point.highlight();
8694
- }
8695
- if (chart.focusElement) {
8696
- chart.focusElement.removeFocusBorder();
8827
+ point.highlight(false); // Do not visually highlight
8697
8828
  }
8698
8829
  };
8699
8830
  /**
@@ -8735,8 +8866,10 @@
8735
8866
  }]
8736
8867
  ],
8737
8868
  init: function () {
8738
- highlightFirstValidPointInChart(chart);
8739
- return this.response.success;
8869
+ return keyboardNavigation.onHandlerInit(this);
8870
+ },
8871
+ validate: function () {
8872
+ return !!getFirstValidPointInChart(chart);
8740
8873
  },
8741
8874
  terminate: function () {
8742
8875
  return keyboardNavigation.onHandlerTerminate();
@@ -8755,6 +8888,25 @@
8755
8888
  isNext = keyCode === keys.right || keyCode === keys.down;
8756
8889
  return this.attemptHighlightAdjacentPoint(handler, isNext);
8757
8890
  };
8891
+ /**
8892
+ * When keyboard navigation inits.
8893
+ * @private
8894
+ * @param {Highcharts.KeyboardNavigationHandler} handler The handler object
8895
+ * @return {number}
8896
+ * response
8897
+ */
8898
+ SeriesKeyboardNavigation.prototype.onHandlerInit = function (handler) {
8899
+ var chart = this.chart,
8900
+ kbdNavOptions = chart.options.accessibility.keyboardNavigation;
8901
+ if (kbdNavOptions.seriesNavigation.rememberPointFocus &&
8902
+ chart.highlightedPoint) {
8903
+ chart.highlightedPoint.highlight();
8904
+ }
8905
+ else {
8906
+ highlightFirstValidPointInChart(chart);
8907
+ }
8908
+ return handler.response.success;
8909
+ };
8758
8910
  /**
8759
8911
  * @private
8760
8912
  * @param {Highcharts.KeyboardNavigationHandler} handler
@@ -8784,7 +8936,8 @@
8784
8936
  * @private
8785
8937
  */
8786
8938
  SeriesKeyboardNavigation.prototype.onHandlerTerminate = function () {
8787
- var chart = this.chart;
8939
+ var chart = this.chart,
8940
+ kbdNavOptions = chart.options.accessibility.keyboardNavigation;
8788
8941
  if (chart.tooltip) {
8789
8942
  chart.tooltip.hide(0);
8790
8943
  }
@@ -8795,15 +8948,13 @@
8795
8948
  if (chart.highlightedPoint && chart.highlightedPoint.onMouseOut) {
8796
8949
  chart.highlightedPoint.onMouseOut();
8797
8950
  }
8798
- delete chart.highlightedPoint;
8951
+ if (!kbdNavOptions.seriesNavigation.rememberPointFocus) {
8952
+ delete chart.highlightedPoint;
8953
+ }
8799
8954
  };
8800
8955
  /**
8801
8956
  * Function that attempts to highlight next/prev point. Handles wrap around.
8802
8957
  * @private
8803
- * @param {Highcharts.KeyboardNavigationHandler} handler
8804
- * @param {boolean} directionIsNext
8805
- * @return {number}
8806
- * response
8807
8958
  */
8808
8959
  SeriesKeyboardNavigation.prototype.attemptHighlightAdjacentPoint = function (handler, directionIsNext) {
8809
8960
  var chart = this.chart,
@@ -8811,8 +8962,10 @@
8811
8962
  .wrapAround,
8812
8963
  highlightSuccessful = chart.highlightAdjacentPoint(directionIsNext);
8813
8964
  if (!highlightSuccessful) {
8814
- if (wrapAround) {
8815
- return handler.init(directionIsNext ? 1 : -1);
8965
+ if (wrapAround && (directionIsNext ?
8966
+ highlightFirstValidPointInChart(chart) :
8967
+ highlightLastValidPointInChart(chart))) {
8968
+ return handler.response.success;
8816
8969
  }
8817
8970
  return handler.response[directionIsNext ? 'next' : 'prev'];
8818
8971
  }
@@ -9019,7 +9172,7 @@
9019
9172
  // Highlight the new point or any first valid point back or forwards
9020
9173
  // from it
9021
9174
  newPoint.highlight();
9022
- return newPoint.series.highlightFirstValidPoint();
9175
+ return newPoint.series.highlightNextValidPoint();
9023
9176
  }
9024
9177
  /**
9025
9178
  * @private
@@ -9056,7 +9209,7 @@
9056
9209
  seriesTypes[type].prototype.keyboardMoveVertical = false;
9057
9210
  }
9058
9211
  });
9059
- seriesProto.highlightFirstValidPoint = (seriesHighlightFirstValidPoint);
9212
+ seriesProto.highlightNextValidPoint = (seriesHighlightNextValidPoint);
9060
9213
  }
9061
9214
  }
9062
9215
  SeriesKeyboardNavigation.compose = compose;
@@ -9094,7 +9247,7 @@
9094
9247
  return defined(minIx) ? series.points[minIx] : void 0;
9095
9248
  }
9096
9249
  /**
9097
- * Highlights a point (show tooltip and display hover state).
9250
+ * Highlights a point (show tooltip, display hover state, focus element).
9098
9251
  *
9099
9252
  * @private
9100
9253
  * @function Highcharts.Point#highlight
@@ -9102,9 +9255,10 @@
9102
9255
  * @return {Highcharts.Point}
9103
9256
  * This highlighted point.
9104
9257
  */
9105
- function pointHighlight() {
9258
+ function pointHighlight(highlightVisually) {
9259
+ if (highlightVisually === void 0) { highlightVisually = true; }
9106
9260
  var chart = this.series.chart;
9107
- if (!this.isNull) {
9261
+ if (!this.isNull && highlightVisually) {
9108
9262
  this.onMouseOver(); // Show the hover marker and tooltip
9109
9263
  }
9110
9264
  else {
@@ -9119,6 +9273,9 @@
9119
9273
  // change z-index and mess up the element.
9120
9274
  if (this.graphic) {
9121
9275
  chart.setFocusToElement(this.graphic);
9276
+ if (!highlightVisually && chart.focusElement) {
9277
+ chart.focusElement.removeFocusBorder();
9278
+ }
9122
9279
  }
9123
9280
  chart.highlightedPoint = this;
9124
9281
  return this;
@@ -9129,9 +9286,9 @@
9129
9286
  * point in the series, use that as starting point.
9130
9287
  *
9131
9288
  * @private
9132
- * @function Highcharts.Series#highlightFirstValidPoint
9289
+ * @function Highcharts.Series#highlightNextValidPoint
9133
9290
  */
9134
- function seriesHighlightFirstValidPoint() {
9291
+ function seriesHighlightNextValidPoint() {
9135
9292
  var curPoint = this.chart.highlightedPoint,
9136
9293
  start = (curPoint && curPoint.series) === this ?
9137
9294
  getPointIndex(curPoint) :
@@ -9218,7 +9375,6 @@
9218
9375
  * @private
9219
9376
  */
9220
9377
  SeriesComponent.compose = function (ChartClass, PointClass, SeriesClass) {
9221
- // Handle forcing markers
9222
9378
  NewDataAnnouncer.compose(SeriesClass);
9223
9379
  ForcedMarkers.compose(SeriesClass);
9224
9380
  SeriesKeyboardNavigation.compose(ChartClass, PointClass, SeriesClass);
@@ -9351,8 +9507,8 @@
9351
9507
  */
9352
9508
  function chartHasMapZoom(chart) {
9353
9509
  return !!(chart.mapZoom &&
9354
- chart.mapNavButtons &&
9355
- chart.mapNavButtons.length);
9510
+ chart.mapNavigation &&
9511
+ chart.mapNavigation.navButtons.length);
9356
9512
  }
9357
9513
  /* *
9358
9514
  *
@@ -9392,7 +9548,7 @@
9392
9548
  chart = this.chart;
9393
9549
  this.proxyProvider.addGroup('zoom', 'div');
9394
9550
  [
9395
- 'afterShowResetZoom', 'afterDrilldown', 'drillupall'
9551
+ 'afterShowResetZoom', 'afterApplyDrilldown', 'drillupall'
9396
9552
  ].forEach(function (eventType) {
9397
9553
  component.addEvent(chart, eventType, function () {
9398
9554
  component.updateProxyOverlays();
@@ -9406,8 +9562,8 @@
9406
9562
  var chart = this.chart,
9407
9563
  component = this;
9408
9564
  // Make map zoom buttons accessible
9409
- if (chart.mapNavButtons) {
9410
- chart.mapNavButtons.forEach(function (button, i) {
9565
+ if (chart.mapNavigation) {
9566
+ chart.mapNavigation.navButtons.forEach(function (button, i) {
9411
9567
  unhideChartElementFromAT(chart, button.element);
9412
9568
  component.setMapNavButtonAttrs(button.element, 'accessibility.zoom.mapZoom' + (i ? 'Out' : 'In'));
9413
9569
  });
@@ -9444,10 +9600,13 @@
9444
9600
  if (chart.resetZoomButton) {
9445
9601
  this.createZoomProxyButton(chart.resetZoomButton, 'resetZoomProxyButton', chart.langFormat('accessibility.zoom.resetZoomButton', { chart: chart }));
9446
9602
  }
9447
- if (chart.drillUpButton) {
9603
+ if (chart.drillUpButton &&
9604
+ chart.breadcrumbs &&
9605
+ chart.breadcrumbs.list) {
9606
+ var lastBreadcrumb = chart.breadcrumbs.list[chart.breadcrumbs.list.length - 1];
9448
9607
  this.createZoomProxyButton(chart.drillUpButton, 'drillUpProxyButton', chart.langFormat('accessibility.drillUpButton', {
9449
9608
  chart: chart,
9450
- buttonText: chart.getDrilldownBackText()
9609
+ buttonText: chart.breadcrumbs.getButtonText(lastBreadcrumb)
9451
9610
  }));
9452
9611
  }
9453
9612
  };
@@ -9531,14 +9690,14 @@
9531
9690
  var isMoveOutOfRange = isBackwards && !this.focusedMapNavButtonIx ||
9532
9691
  !isBackwards && this.focusedMapNavButtonIx;
9533
9692
  // Deselect old
9534
- chart.mapNavButtons[this.focusedMapNavButtonIx].setState(0);
9693
+ chart.mapNavigation.navButtons[this.focusedMapNavButtonIx].setState(0);
9535
9694
  if (isMoveOutOfRange) {
9536
9695
  chart.mapZoom(); // Reset zoom
9537
9696
  return response[isBackwards ? 'prev' : 'next'];
9538
9697
  }
9539
9698
  // Select other button
9540
9699
  this.focusedMapNavButtonIx += isBackwards ? -1 : 1;
9541
- var button = chart.mapNavButtons[this.focusedMapNavButtonIx];
9700
+ var button = chart.mapNavigation.navButtons[this.focusedMapNavButtonIx];
9542
9701
  chart.setFocusToElement(button.box, button.element);
9543
9702
  button.setState(2);
9544
9703
  return response.success;
@@ -9559,8 +9718,8 @@
9559
9718
  */
9560
9719
  ZoomComponent.prototype.onMapNavInit = function (direction) {
9561
9720
  var chart = this.chart,
9562
- zoomIn = chart.mapNavButtons[0],
9563
- zoomOut = chart.mapNavButtons[1],
9721
+ zoomIn = chart.mapNavigation.navButtons[0],
9722
+ zoomOut = chart.mapNavigation.navButtons[1],
9564
9723
  initialButton = direction > 0 ? zoomIn : zoomOut;
9565
9724
  chart.setFocusToElement(initialButton.box, initialButton.element);
9566
9725
  initialButton.setState(2);
@@ -9743,8 +9902,8 @@
9743
9902
  doc.body.removeChild(testDiv);
9744
9903
  return bi === 'none';
9745
9904
  }
9746
- // Not used for other browsers
9747
- return false;
9905
+ // Other browsers use the forced-colors standard
9906
+ return win.matchMedia && win.matchMedia('(forced-colors: active)').matches;
9748
9907
  }
9749
9908
  /**
9750
9909
  * Force high contrast theme for the chart. The default theme is defined in
@@ -10112,7 +10271,17 @@
10112
10271
  */
10113
10272
  accessibility: {
10114
10273
  /**
10115
- * Enable accessibility functionality for the chart.
10274
+ * Enable accessibility functionality for the chart. For more
10275
+ * information on how to include these features, and why this is
10276
+ * recommended, see [Highcharts Accessibility](https://www.highcharts.com/docs/accessibility/accessibility-module).
10277
+ *
10278
+ * Highcharts will by default emit a warning to the console if
10279
+ * the [accessibility module](https://code.highcharts.com/modules/accessibility.js)
10280
+ * is not loaded. Setting this option to `false` will override
10281
+ * and silence the warning.
10282
+ *
10283
+ * Once the module is loaded, setting this option to `false`
10284
+ * will disable the module for this chart.
10116
10285
  *
10117
10286
  * @since 5.0.0
10118
10287
  */
@@ -10226,12 +10395,43 @@
10226
10395
  * of the series for a screen reader user. If `false` is returned,
10227
10396
  * the default formatter will be used for that series.
10228
10397
  *
10398
+ * @see [series.descriptionFormat](#accessibility.series.descriptionFormat)
10229
10399
  * @see [series.description](#plotOptions.series.description)
10230
10400
  *
10231
10401
  * @type {Highcharts.ScreenReaderFormatterCallbackFunction<Highcharts.Series>}
10232
10402
  * @since 8.0.0
10233
10403
  * @apioption accessibility.series.descriptionFormatter
10234
10404
  */
10405
+ /**
10406
+ * Format to use for describing the data series group to assistive
10407
+ * technology - including screen readers.
10408
+ *
10409
+ * The series context and its subproperties are available under the
10410
+ * variable `{series}`, for example `{series.name}` for the series
10411
+ * name, and `{series.points.length}` for the number of data points.
10412
+ *
10413
+ * The chart context and its subproperties are available under the
10414
+ * variable `{chart}`, for example `{chart.series.length}` for the
10415
+ * number of series in the chart.
10416
+ *
10417
+ * `{seriesDescription}` refers to the automatic description of the
10418
+ * series type and number of points added by Highcharts by default.
10419
+ * `{authorDescription}` refers to the description added in
10420
+ * [series.description](#plotOptions.series.description) if one is
10421
+ * present. `{axisDescription}` refers to the description added if
10422
+ * the chart has multiple X or Y axes.
10423
+ *
10424
+ * Note that if [series.descriptionFormatter](#accessibility.series.descriptionFormatter)
10425
+ * is declared it will take precedence, and this option will be
10426
+ * overridden.
10427
+ *
10428
+ * @sample highcharts/accessibility/advanced-accessible
10429
+ * Accessible low-medium-high chart
10430
+ *
10431
+ * @type {string}
10432
+ * @since 10.1.0
10433
+ */
10434
+ descriptionFormat: '{seriesDescription}{authorDescription}{axisDescription}',
10235
10435
  /**
10236
10436
  * Whether or not to add series descriptions to charts with a single
10237
10437
  * series.
@@ -10333,6 +10533,8 @@
10333
10533
  * to assistive technology - including screen readers.
10334
10534
  * The point context is available as `{point}`.
10335
10535
  *
10536
+ * Other available context variables include `{index}`, `{value}`, and `{xDescription}`.
10537
+ *
10336
10538
  * Additionally, the series name, annotation info, and
10337
10539
  * description added in `point.accessibility.description`
10338
10540
  * is added by default if relevant. To override this, use the
@@ -10345,7 +10547,18 @@
10345
10547
  * @type {string}
10346
10548
  * @since 8.0.1
10347
10549
  */
10348
- valueDescriptionFormat: '{index}. {xDescription}{separator}{value}.'
10550
+ valueDescriptionFormat: '{xDescription}{separator}{value}.',
10551
+ /**
10552
+ * Whether or not to describe points with the value `null` to
10553
+ * assistive technology, such as screen readers.
10554
+ *
10555
+ * @sample {highmaps} maps/demo/all-areas-as-null
10556
+ * Accessible map with null points
10557
+ *
10558
+ * @type {boolean}
10559
+ * @since 10.1.0
10560
+ */
10561
+ describeNull: true
10349
10562
  },
10350
10563
  /**
10351
10564
  * Amount of landmarks/regions to create for screen reader users. More
@@ -10589,7 +10802,16 @@
10589
10802
  * @type {boolean|number}
10590
10803
  * @since 8.0.0
10591
10804
  */
10592
- pointNavigationEnabledThreshold: false
10805
+ pointNavigationEnabledThreshold: false,
10806
+ /**
10807
+ * Remember which point was focused even after navigating away
10808
+ * from the series, so that when navigating back to the series
10809
+ * you start at the last focused point.
10810
+ *
10811
+ * @type {boolean}
10812
+ * @since 10.1.0
10813
+ */
10814
+ rememberPointFocus: false
10593
10815
  }
10594
10816
  },
10595
10817
  /**
@@ -10923,7 +11145,7 @@
10923
11145
  * @since 8.0.0
10924
11146
  */
10925
11147
  screenReaderSection: {
10926
- beforeRegionLabel: 'Chart screen reader information, {chartTitle}.',
11148
+ beforeRegionLabel: '',
10927
11149
  afterRegionLabel: '',
10928
11150
  /**
10929
11151
  * Language options for annotation descriptions.
@@ -11089,12 +11311,12 @@
11089
11311
  xAxisDescriptionPlural: 'The chart has {numAxes} X axes displaying {#each(names, -1) }and {names[-1]}.',
11090
11312
  yAxisDescriptionSingular: 'The chart has 1 Y axis displaying {names[0]}. {ranges[0]}',
11091
11313
  yAxisDescriptionPlural: 'The chart has {numAxes} Y axes displaying {#each(names, -1) }and {names[-1]}.',
11092
- timeRangeDays: 'Range: {range} days.',
11093
- timeRangeHours: 'Range: {range} hours.',
11094
- timeRangeMinutes: 'Range: {range} minutes.',
11095
- timeRangeSeconds: 'Range: {range} seconds.',
11096
- rangeFromTo: 'Range: {rangeFrom} to {rangeTo}.',
11097
- rangeCategories: 'Range: {numCategories} categories.'
11314
+ timeRangeDays: 'Data range: {range} days.',
11315
+ timeRangeHours: 'Data range: {range} hours.',
11316
+ timeRangeMinutes: 'Data range: {range} minutes.',
11317
+ timeRangeSeconds: 'Data range: {range} seconds.',
11318
+ rangeFromTo: 'Data ranges from {rangeFrom} to {rangeTo}.',
11319
+ rangeCategories: 'Data range: {numCategories} categories.'
11098
11320
  },
11099
11321
  /**
11100
11322
  * Exporting menu format strings for accessibility module.
@@ -11125,34 +11347,39 @@
11125
11347
  * If a definition does not exist for the specific series type
11126
11348
  * and mode, the 'default' lang definitions are used.
11127
11349
  *
11350
+ * Chart and its subproperties can be accessed with the `{chart}` variable.
11351
+ * The series and its subproperties can be accessed with the `{series}` variable.
11352
+ *
11353
+ * The series index (starting from 1) can be accessed with the `{seriesNumber}` variable.
11354
+ *
11128
11355
  * @since 6.0.6
11129
11356
  */
11130
11357
  summary: {
11131
11358
  /* eslint-disable max-len */
11132
- 'default': '{name}, series {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.',
11133
- defaultCombination: '{name}, series {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.',
11134
- line: '{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.',
11135
- lineCombination: '{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.',
11136
- spline: '{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.',
11137
- splineCombination: '{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.',
11138
- column: '{name}, bar series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bars, bar)}.',
11139
- columnCombination: '{name}, series {ix} of {numSeries}. Bar series with {numPoints} {#plural(numPoints, bars, bar)}.',
11140
- bar: '{name}, bar series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bars, bar)}.',
11141
- barCombination: '{name}, series {ix} of {numSeries}. Bar series with {numPoints} {#plural(numPoints, bars, bar)}.',
11142
- pie: '{name}, pie {ix} of {numSeries} with {numPoints} {#plural(numPoints, slices, slice)}.',
11143
- pieCombination: '{name}, series {ix} of {numSeries}. Pie with {numPoints} {#plural(numPoints, slices, slice)}.',
11144
- scatter: '{name}, scatter plot {ix} of {numSeries} with {numPoints} {#plural(numPoints, points, point)}.',
11145
- scatterCombination: '{name}, series {ix} of {numSeries}, scatter plot with {numPoints} {#plural(numPoints, points, point)}.',
11146
- boxplot: '{name}, boxplot {ix} of {numSeries} with {numPoints} {#plural(numPoints, boxes, box)}.',
11147
- boxplotCombination: '{name}, series {ix} of {numSeries}. Boxplot with {numPoints} {#plural(numPoints, boxes, box)}.',
11148
- bubble: '{name}, bubble series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bubbles, bubble)}.',
11149
- bubbleCombination: '{name}, series {ix} of {numSeries}. Bubble series with {numPoints} {#plural(numPoints, bubbles, bubble)}.',
11150
- map: '{name}, map {ix} of {numSeries} with {numPoints} {#plural(numPoints, areas, area)}.',
11151
- mapCombination: '{name}, series {ix} of {numSeries}. Map with {numPoints} {#plural(numPoints, areas, area)}.',
11152
- mapline: '{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.',
11153
- maplineCombination: '{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.',
11154
- mapbubble: '{name}, bubble series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bubbles, bubble)}.',
11155
- mapbubbleCombination: '{name}, series {ix} of {numSeries}. Bubble series with {numPoints} {#plural(numPoints, bubbles, bubble)}.'
11359
+ 'default': '{series.name}, series {seriesNumber} of {chart.series.length} with {series.points.length} data {#plural(series.points.length, points, point)}.',
11360
+ defaultCombination: '{series.name}, series {seriesNumber} of {chart.series.length} with {series.points.length} data {#plural(series.points.length, points, point)}.',
11361
+ line: '{series.name}, line {seriesNumber} of {chart.series.length} with {series.points.length} data {#plural(series.points.length, points, point)}.',
11362
+ lineCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Line with {series.points.length} data {#plural(series.points.length, points, point)}.',
11363
+ spline: '{series.name}, line {seriesNumber} of {chart.series.length} with {series.points.length} data {#plural(series.points.length, points, point)}.',
11364
+ splineCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Line with {series.points.length} data {#plural(series.points.length, points, point)}.',
11365
+ column: '{series.name}, bar series {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, bars, bar)}.',
11366
+ columnCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Bar series with {series.points.length} {#plural(series.points.length, bars, bar)}.',
11367
+ bar: '{series.name}, bar series {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, bars, bar)}.',
11368
+ barCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Bar series with {series.points.length} {#plural(series.points.length, bars, bar)}.',
11369
+ pie: '{series.name}, pie {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, slices, slice)}.',
11370
+ pieCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Pie with {series.points.length} {#plural(series.points.length, slices, slice)}.',
11371
+ scatter: '{series.name}, scatter plot {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, points, point)}.',
11372
+ scatterCombination: '{series.name}, series {seriesNumber} of {chart.series.length}, scatter plot with {series.points.length} {#plural(series.points.length, points, point)}.',
11373
+ boxplot: '{series.name}, boxplot {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, boxes, box)}.',
11374
+ boxplotCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Boxplot with {series.points.length} {#plural(series.points.length, boxes, box)}.',
11375
+ bubble: '{series.name}, bubble series {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, bubbles, bubble)}.',
11376
+ bubbleCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Bubble series with {series.points.length} {#plural(series.points.length, bubbles, bubble)}.',
11377
+ map: '{series.name}, map {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, areas, area)}.',
11378
+ mapCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Map with {series.points.length} {#plural(series.points.length, areas, area)}.',
11379
+ mapline: '{series.name}, line {seriesNumber} of {chart.series.length} with {series.points.length} data {#plural(series.points.length, points, point)}.',
11380
+ maplineCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Line with {series.points.length} data {#plural(series.points.length, points, point)}.',
11381
+ mapbubble: '{series.name}, bubble series {seriesNumber} of {chart.series.length} with {series.points.length} {#plural(series.points.length, bubbles, bubble)}.',
11382
+ mapbubbleCombination: '{series.name}, series {seriesNumber} of {chart.series.length}. Bubble series with {series.points.length} {#plural(series.points.length, bubbles, bubble)}.'
11156
11383
  },
11157
11384
  /**
11158
11385
  * User supplied description text. This is added in the point
@@ -11784,7 +12011,7 @@
11784
12011
  });
11785
12012
  });
11786
12013
  // Direct updates (events happen after render)
11787
- ['afterDrilldown', 'drillupall'].forEach(function (event) {
12014
+ ['afterApplyDrilldown', 'drillupall'].forEach(function (event) {
11788
12015
  addEvent(ChartClass, event, function chartOnAfterDrilldown() {
11789
12016
  var a11y = this.accessibility;
11790
12017
  if (a11y && !a11y.zombie) {