highcharts 9.3.3 → 10.0.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 (670) 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/Accessibility.js +1 -1
  8. package/es-modules/Accessibility/Components/LegendComponent.js +31 -23
  9. package/es-modules/Accessibility/Components/MenuComponent.js +4 -5
  10. package/es-modules/Accessibility/Components/RangeSelectorComponent.js +2 -2
  11. package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +7 -6
  12. package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +1 -1
  13. package/es-modules/Accessibility/Components/SeriesComponent/SeriesComponent.js +0 -1
  14. package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +3 -3
  15. package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +61 -29
  16. package/es-modules/Accessibility/Components/ZoomComponent.js +13 -10
  17. package/es-modules/Accessibility/HighContrastMode.js +2 -2
  18. package/es-modules/Accessibility/KeyboardNavigation.js +113 -98
  19. package/es-modules/Accessibility/ProxyElement.js +14 -6
  20. package/es-modules/Accessibility/ProxyProvider.js +10 -2
  21. package/es-modules/Core/Axis/Axis.js +150 -46
  22. package/es-modules/Core/Axis/Color/ColorAxis.js +22 -5
  23. package/es-modules/Core/Axis/GridAxis.js +10 -9
  24. package/es-modules/Core/Axis/TreeGridTick.js +11 -0
  25. package/es-modules/Core/Chart/Chart3D.js +1 -11
  26. package/es-modules/Core/Chart/ChartDefaults.js +32 -11
  27. package/es-modules/Core/Chart/MapChart.js +1 -6
  28. package/es-modules/Core/DefaultOptions.js +2 -0
  29. package/es-modules/Core/Geometry/PolygonClip.js +84 -0
  30. package/es-modules/Core/Globals.js +4 -18
  31. package/es-modules/Core/HttpUtilities.js +13 -8
  32. package/es-modules/Core/Legend/Legend.js +10 -8
  33. package/es-modules/Core/Navigator.js +9 -6
  34. package/es-modules/Core/Pointer.js +15 -11
  35. package/es-modules/Core/Renderer/HTML/AST.js +62 -5
  36. package/es-modules/Core/Renderer/SVG/SVGElement.js +25 -41
  37. package/es-modules/Core/Renderer/SVG/SVGElement3D.js +17 -5
  38. package/es-modules/Core/Renderer/SVG/SVGRenderer.js +17 -17
  39. package/es-modules/Core/Renderer/SVG/TextBuilder.js +12 -10
  40. package/es-modules/Core/Series/DataLabel.js +11 -3
  41. package/es-modules/Core/Series/Point.js +2 -2
  42. package/es-modules/Core/Series/Series.js +33 -15
  43. package/es-modules/Core/Series/SeriesDefaults.js +4 -1
  44. package/es-modules/Core/Tooltip.js +14 -31
  45. package/es-modules/Core/Utilities.js +28 -28
  46. package/es-modules/Extensions/Annotations/Annotations.js +7 -0
  47. package/es-modules/Extensions/Annotations/MockPoint.js +1 -1
  48. package/es-modules/Extensions/Annotations/NavigationBindings.js +1 -1
  49. package/es-modules/Extensions/Annotations/Popup.js +1 -1
  50. package/es-modules/Extensions/Annotations/Types/BasicAnnotation.js +5 -3
  51. package/es-modules/Extensions/Boost/BoostInit.js +6 -1
  52. package/es-modules/Extensions/Boost/BoostOptions.js +26 -0
  53. package/es-modules/Extensions/Boost/Boostables.js +1 -0
  54. package/es-modules/Extensions/Boost/WGLRenderer.js +48 -37
  55. package/es-modules/Extensions/Boost/WGLShader.js +4 -3
  56. package/es-modules/Extensions/Breadcrumbs.js +874 -0
  57. package/es-modules/Extensions/Data.js +26 -14
  58. package/es-modules/Extensions/DataGrouping.js +5 -2
  59. package/es-modules/Extensions/DraggablePoints.js +9 -7
  60. package/es-modules/Extensions/Drilldown.js +147 -94
  61. package/es-modules/Extensions/Exporting/Exporting.js +9 -7
  62. package/es-modules/Extensions/Exporting/ExportingDefaults.js +49 -1
  63. package/es-modules/Extensions/GeoJSON.js +149 -124
  64. package/es-modules/Extensions/MarkerClusters.js +34 -20
  65. package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +110 -22
  66. package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +1 -1
  67. package/es-modules/Extensions/Oldie/Oldie.js +1 -1
  68. package/es-modules/Extensions/ScrollablePlotArea.js +5 -1
  69. package/es-modules/Extensions/Stacking.js +3 -2
  70. package/es-modules/Extensions/Themes/HighContrastDark.js +10 -10
  71. package/es-modules/Extensions/Themes/HighContrastLight.js +10 -10
  72. package/es-modules/Maps/MapNavigation.js +49 -8
  73. package/es-modules/Maps/MapPointer.js +16 -0
  74. package/es-modules/Maps/MapUtilities.js +56 -0
  75. package/es-modules/Maps/MapView.js +606 -135
  76. package/es-modules/Maps/MapViewInsetsOptionsDefault.js +148 -0
  77. package/es-modules/Maps/MapViewOptionsDefault.js +58 -20
  78. package/es-modules/Maps/Projection.js +169 -77
  79. package/es-modules/Maps/Projections/EqualEarth.js +15 -6
  80. package/es-modules/Maps/Projections/LambertConformalConic.js +27 -19
  81. package/es-modules/Maps/Projections/Miller.js +23 -10
  82. package/es-modules/Maps/Projections/Orthographic.js +21 -10
  83. package/es-modules/Maps/Projections/WebMercator.js +25 -13
  84. package/es-modules/Series/ArcDiagram/ArcDiagramPoint.js +77 -0
  85. package/es-modules/Series/ArcDiagram/ArcDiagramSeries.js +581 -0
  86. package/es-modules/Series/Column/ColumnSeries.js +4 -3
  87. package/es-modules/Series/DataModifyComposition.js +1 -0
  88. package/es-modules/Series/DependencyWheel/DependencyWheelSeries.js +2 -2
  89. package/es-modules/Series/DrawPointComposition.js +7 -4
  90. package/es-modules/Series/Lollipop/LollipopSeries.js +1 -1
  91. package/es-modules/Series/Map/MapPoint.js +24 -1
  92. package/es-modules/Series/Map/MapSeries.js +196 -169
  93. package/es-modules/Series/MapBubble/MapBubblePoint.js +16 -24
  94. package/es-modules/Series/MapBubble/MapBubbleSeries.js +11 -0
  95. package/es-modules/Series/MapPoint/MapPointPoint.js +2 -8
  96. package/es-modules/Series/MapPoint/MapPointSeries.js +36 -14
  97. package/es-modules/Series/NodesComposition.js +60 -13
  98. package/es-modules/Series/OHLC/OHLCSeries.js +7 -0
  99. package/es-modules/Series/Organization/OrganizationPoint.js +68 -2
  100. package/es-modules/Series/Organization/OrganizationSeries.js +79 -25
  101. package/es-modules/Series/Pie/PiePoint.js +12 -5
  102. package/es-modules/Series/Pie3D/Pie3DSeries.js +19 -0
  103. package/es-modules/Series/Sankey/SankeyColumnComposition.js +193 -0
  104. package/es-modules/Series/Sankey/SankeyPoint.js +37 -1
  105. package/es-modules/Series/Sankey/SankeySeries.js +10 -127
  106. package/es-modules/Series/Scatter/ScatterSeries.js +1 -1
  107. package/es-modules/Series/Sunburst/SunburstSeries.js +13 -2
  108. package/es-modules/Series/Treemap/TreemapSeries.js +88 -80
  109. package/es-modules/Series/Waterfall/WaterfallSeries.js +2 -0
  110. package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +9 -2
  111. package/es-modules/Stock/StockToolsGui.js +1 -1
  112. package/es-modules/masters/highcharts-3d.src.js +1 -1
  113. package/es-modules/masters/highcharts-gantt.src.js +1 -1
  114. package/es-modules/masters/highcharts-more.src.js +1 -1
  115. package/es-modules/masters/highcharts.src.js +1 -1
  116. package/es-modules/masters/highmaps.src.js +1 -1
  117. package/es-modules/masters/highstock.src.js +1 -1
  118. package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
  119. package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
  120. package/es-modules/masters/indicators/ao.src.js +1 -1
  121. package/es-modules/masters/indicators/apo.src.js +1 -1
  122. package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
  123. package/es-modules/masters/indicators/aroon.src.js +1 -1
  124. package/es-modules/masters/indicators/atr.src.js +1 -1
  125. package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
  126. package/es-modules/masters/indicators/cci.src.js +1 -1
  127. package/es-modules/masters/indicators/chaikin.src.js +1 -1
  128. package/es-modules/masters/indicators/cmf.src.js +1 -1
  129. package/es-modules/masters/indicators/cmo.src.js +1 -1
  130. package/es-modules/masters/indicators/dema.src.js +1 -1
  131. package/es-modules/masters/indicators/disparity-index.src.js +1 -1
  132. package/es-modules/masters/indicators/dmi.src.js +1 -1
  133. package/es-modules/masters/indicators/dpo.src.js +1 -1
  134. package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
  135. package/es-modules/masters/indicators/indicators-all.src.js +1 -1
  136. package/es-modules/masters/indicators/indicators.src.js +1 -1
  137. package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
  138. package/es-modules/masters/indicators/klinger.src.js +1 -1
  139. package/es-modules/masters/indicators/macd.src.js +1 -1
  140. package/es-modules/masters/indicators/mfi.src.js +1 -1
  141. package/es-modules/masters/indicators/momentum.src.js +1 -1
  142. package/es-modules/masters/indicators/natr.src.js +1 -1
  143. package/es-modules/masters/indicators/obv.src.js +1 -1
  144. package/es-modules/masters/indicators/pivot-points.src.js +1 -1
  145. package/es-modules/masters/indicators/ppo.src.js +1 -1
  146. package/es-modules/masters/indicators/price-channel.src.js +1 -1
  147. package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
  148. package/es-modules/masters/indicators/psar.src.js +1 -1
  149. package/es-modules/masters/indicators/regressions.src.js +1 -1
  150. package/es-modules/masters/indicators/roc.src.js +1 -1
  151. package/es-modules/masters/indicators/rsi.src.js +1 -1
  152. package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
  153. package/es-modules/masters/indicators/stochastic.src.js +1 -1
  154. package/es-modules/masters/indicators/supertrend.src.js +1 -1
  155. package/es-modules/masters/indicators/tema.src.js +1 -1
  156. package/es-modules/masters/indicators/trendline.src.js +1 -1
  157. package/es-modules/masters/indicators/trix.src.js +1 -1
  158. package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
  159. package/es-modules/masters/indicators/vwap.src.js +1 -1
  160. package/es-modules/masters/indicators/williams-r.src.js +1 -1
  161. package/es-modules/masters/indicators/wma.src.js +1 -1
  162. package/es-modules/masters/indicators/zigzag.src.js +1 -1
  163. package/es-modules/masters/modules/accessibility.src.js +1 -1
  164. package/es-modules/masters/modules/annotations-advanced.src.js +1 -1
  165. package/es-modules/masters/modules/annotations.src.js +1 -1
  166. package/es-modules/masters/modules/arc-diagram.src.js +14 -0
  167. package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
  168. package/es-modules/masters/modules/boost-canvas.src.js +1 -1
  169. package/es-modules/masters/modules/boost.src.js +1 -1
  170. package/es-modules/masters/modules/broken-axis.src.js +1 -1
  171. package/es-modules/masters/modules/bullet.src.js +1 -1
  172. package/es-modules/masters/modules/coloraxis.src.js +1 -1
  173. package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
  174. package/es-modules/masters/modules/cylinder.src.js +1 -1
  175. package/es-modules/masters/modules/data.src.js +1 -1
  176. package/es-modules/masters/modules/datagrouping.src.js +1 -1
  177. package/es-modules/masters/modules/debugger.src.js +1 -1
  178. package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
  179. package/es-modules/masters/modules/dotplot.src.js +1 -1
  180. package/es-modules/masters/modules/drag-panes.src.js +1 -1
  181. package/es-modules/masters/modules/draggable-points.src.js +1 -1
  182. package/es-modules/masters/modules/drilldown.src.js +2 -1
  183. package/es-modules/masters/modules/dumbbell.src.js +1 -1
  184. package/es-modules/masters/modules/export-data.src.js +1 -1
  185. package/es-modules/masters/modules/exporting.src.js +1 -1
  186. package/es-modules/masters/modules/full-screen.src.js +1 -1
  187. package/es-modules/masters/modules/funnel.src.js +1 -1
  188. package/es-modules/masters/modules/funnel3d.src.js +1 -1
  189. package/es-modules/masters/modules/gantt.src.js +1 -1
  190. package/es-modules/masters/modules/grid-axis.src.js +1 -1
  191. package/es-modules/masters/modules/heatmap.src.js +1 -1
  192. package/es-modules/masters/modules/heikinashi.src.js +1 -1
  193. package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
  194. package/es-modules/masters/modules/hollowcandlestick.src.js +1 -1
  195. package/es-modules/masters/modules/item-series.src.js +1 -1
  196. package/es-modules/masters/modules/lollipop.src.js +1 -1
  197. package/es-modules/masters/modules/map.src.js +5 -1
  198. package/es-modules/masters/modules/marker-clusters.src.js +1 -1
  199. package/es-modules/masters/modules/networkgraph.src.js +1 -1
  200. package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
  201. package/es-modules/masters/modules/offline-exporting.src.js +1 -1
  202. package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
  203. package/es-modules/masters/modules/oldie.src.js +1 -1
  204. package/es-modules/masters/modules/organization.src.js +1 -1
  205. package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
  206. package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
  207. package/es-modules/masters/modules/pareto.src.js +1 -1
  208. package/es-modules/masters/modules/pathfinder.src.js +1 -1
  209. package/es-modules/masters/modules/pattern-fill.src.js +1 -1
  210. package/es-modules/masters/modules/price-indicator.src.js +1 -1
  211. package/es-modules/masters/modules/pyramid3d.src.js +1 -1
  212. package/es-modules/masters/modules/sankey.src.js +1 -1
  213. package/es-modules/masters/modules/series-label.src.js +1 -1
  214. package/es-modules/masters/modules/solid-gauge.src.js +1 -1
  215. package/es-modules/masters/modules/sonification.src.js +1 -1
  216. package/es-modules/masters/modules/static-scale.src.js +1 -1
  217. package/es-modules/masters/modules/stock-tools.src.js +1 -1
  218. package/es-modules/masters/modules/stock.src.js +1 -1
  219. package/es-modules/masters/modules/streamgraph.src.js +1 -1
  220. package/es-modules/masters/modules/sunburst.src.js +1 -1
  221. package/es-modules/masters/modules/tilemap.src.js +1 -1
  222. package/es-modules/masters/modules/timeline.src.js +1 -1
  223. package/es-modules/masters/modules/treegrid.src.js +1 -1
  224. package/es-modules/masters/modules/treemap.src.js +5 -1
  225. package/es-modules/masters/modules/variable-pie.src.js +1 -1
  226. package/es-modules/masters/modules/variwide.src.js +1 -1
  227. package/es-modules/masters/modules/vector.src.js +1 -1
  228. package/es-modules/masters/modules/venn.src.js +1 -1
  229. package/es-modules/masters/modules/windbarb.src.js +1 -1
  230. package/es-modules/masters/modules/wordcloud.src.js +1 -1
  231. package/es-modules/masters/modules/xrange.src.js +1 -1
  232. package/es-modules/masters/themes/avocado.src.js +1 -1
  233. package/es-modules/masters/themes/brand-dark.src.js +1 -1
  234. package/es-modules/masters/themes/brand-light.src.js +1 -1
  235. package/es-modules/masters/themes/dark-blue.src.js +1 -1
  236. package/es-modules/masters/themes/dark-green.src.js +1 -1
  237. package/es-modules/masters/themes/dark-unica.src.js +1 -1
  238. package/es-modules/masters/themes/gray.src.js +1 -1
  239. package/es-modules/masters/themes/grid-light.src.js +1 -1
  240. package/es-modules/masters/themes/grid.src.js +1 -1
  241. package/es-modules/masters/themes/high-contrast-dark.src.js +1 -1
  242. package/es-modules/masters/themes/high-contrast-light.src.js +1 -1
  243. package/es-modules/masters/themes/sand-signika.src.js +1 -1
  244. package/es-modules/masters/themes/skies.src.js +1 -1
  245. package/es-modules/masters/themes/sunset.src.js +1 -1
  246. package/highcharts-3d.js +99 -98
  247. package/highcharts-3d.js.map +1 -1
  248. package/highcharts-3d.src.js +50 -20
  249. package/highcharts-gantt.js +800 -795
  250. package/highcharts-gantt.js.map +1 -1
  251. package/highcharts-gantt.src.js +528 -290
  252. package/highcharts-more.js +195 -194
  253. package/highcharts-more.js.map +1 -1
  254. package/highcharts-more.src.js +13 -2
  255. package/highcharts.d.ts +2162 -504
  256. package/highcharts.js +586 -581
  257. package/highcharts.js.map +1 -1
  258. package/highcharts.src.d.ts +2162 -504
  259. package/highcharts.src.js +494 -272
  260. package/highmaps.js +753 -723
  261. package/highmaps.js.map +1 -1
  262. package/highmaps.src.js +3603 -2117
  263. package/highstock.js +790 -786
  264. package/highstock.js.map +1 -1
  265. package/highstock.src.js +519 -283
  266. package/indicators/acceleration-bands.js +12 -11
  267. package/indicators/acceleration-bands.js.map +1 -1
  268. package/indicators/acceleration-bands.src.js +11 -2
  269. package/indicators/accumulation-distribution.js +5 -5
  270. package/indicators/accumulation-distribution.js.map +1 -1
  271. package/indicators/accumulation-distribution.src.js +11 -2
  272. package/indicators/ao.js +6 -6
  273. package/indicators/ao.js.map +1 -1
  274. package/indicators/ao.src.js +11 -2
  275. package/indicators/apo.js +5 -5
  276. package/indicators/apo.js.map +1 -1
  277. package/indicators/apo.src.js +11 -2
  278. package/indicators/aroon-oscillator.js +10 -10
  279. package/indicators/aroon-oscillator.js.map +1 -1
  280. package/indicators/aroon-oscillator.src.js +11 -2
  281. package/indicators/aroon.js +11 -11
  282. package/indicators/aroon.js.map +1 -1
  283. package/indicators/aroon.src.js +11 -2
  284. package/indicators/atr.js +5 -5
  285. package/indicators/atr.js.map +1 -1
  286. package/indicators/atr.src.js +11 -2
  287. package/indicators/bollinger-bands.js +12 -12
  288. package/indicators/bollinger-bands.js.map +1 -1
  289. package/indicators/bollinger-bands.src.js +11 -2
  290. package/indicators/cci.js +5 -5
  291. package/indicators/cci.js.map +1 -1
  292. package/indicators/cci.src.js +11 -2
  293. package/indicators/chaikin.js +8 -8
  294. package/indicators/chaikin.js.map +1 -1
  295. package/indicators/chaikin.src.js +11 -2
  296. package/indicators/cmf.js +6 -6
  297. package/indicators/cmf.js.map +1 -1
  298. package/indicators/cmf.src.js +11 -2
  299. package/indicators/cmo.js +5 -5
  300. package/indicators/cmo.js.map +1 -1
  301. package/indicators/cmo.src.js +11 -2
  302. package/indicators/dema.js +5 -5
  303. package/indicators/dema.js.map +1 -1
  304. package/indicators/dema.src.js +11 -2
  305. package/indicators/disparity-index.js +6 -6
  306. package/indicators/disparity-index.js.map +1 -1
  307. package/indicators/disparity-index.src.js +11 -2
  308. package/indicators/dmi.js +12 -12
  309. package/indicators/dmi.js.map +1 -1
  310. package/indicators/dmi.src.js +11 -2
  311. package/indicators/dpo.js +5 -5
  312. package/indicators/dpo.js.map +1 -1
  313. package/indicators/dpo.src.js +11 -2
  314. package/indicators/ema.js +2 -1
  315. package/indicators/ema.js.map +1 -1
  316. package/indicators/ema.src.js +10 -1
  317. package/indicators/ichimoku-kinko-hyo.js +16 -16
  318. package/indicators/ichimoku-kinko-hyo.js.map +1 -1
  319. package/indicators/ichimoku-kinko-hyo.src.js +11 -2
  320. package/indicators/indicators-all.js +195 -194
  321. package/indicators/indicators-all.js.map +1 -1
  322. package/indicators/indicators-all.src.js +21 -5
  323. package/indicators/indicators.js +13 -12
  324. package/indicators/indicators.js.map +1 -1
  325. package/indicators/indicators.src.js +21 -5
  326. package/indicators/keltner-channels.js +12 -11
  327. package/indicators/keltner-channels.js.map +1 -1
  328. package/indicators/keltner-channels.src.js +11 -2
  329. package/indicators/klinger.js +13 -13
  330. package/indicators/klinger.js.map +1 -1
  331. package/indicators/klinger.src.js +11 -2
  332. package/indicators/macd.js +12 -11
  333. package/indicators/macd.js.map +1 -1
  334. package/indicators/macd.src.js +11 -2
  335. package/indicators/mfi.js +6 -6
  336. package/indicators/mfi.js.map +1 -1
  337. package/indicators/mfi.src.js +11 -2
  338. package/indicators/momentum.js +5 -5
  339. package/indicators/momentum.js.map +1 -1
  340. package/indicators/momentum.src.js +11 -2
  341. package/indicators/natr.js +5 -4
  342. package/indicators/natr.js.map +1 -1
  343. package/indicators/natr.src.js +11 -2
  344. package/indicators/obv.js +5 -5
  345. package/indicators/obv.js.map +1 -1
  346. package/indicators/obv.src.js +11 -2
  347. package/indicators/pivot-points.js +11 -11
  348. package/indicators/pivot-points.js.map +1 -1
  349. package/indicators/pivot-points.src.js +11 -2
  350. package/indicators/ppo.js +5 -5
  351. package/indicators/ppo.js.map +1 -1
  352. package/indicators/ppo.src.js +11 -2
  353. package/indicators/price-channel.js +11 -11
  354. package/indicators/price-channel.js.map +1 -1
  355. package/indicators/price-channel.src.js +11 -2
  356. package/indicators/price-envelopes.js +8 -8
  357. package/indicators/price-envelopes.js.map +1 -1
  358. package/indicators/price-envelopes.src.js +11 -2
  359. package/indicators/psar.js +7 -6
  360. package/indicators/psar.js.map +1 -1
  361. package/indicators/psar.src.js +11 -2
  362. package/indicators/regressions.js +12 -12
  363. package/indicators/regressions.js.map +1 -1
  364. package/indicators/regressions.src.js +11 -2
  365. package/indicators/roc.js +5 -5
  366. package/indicators/roc.js.map +1 -1
  367. package/indicators/roc.src.js +11 -2
  368. package/indicators/rsi.js +6 -5
  369. package/indicators/rsi.js.map +1 -1
  370. package/indicators/rsi.src.js +11 -2
  371. package/indicators/slow-stochastic.js +5 -5
  372. package/indicators/slow-stochastic.js.map +1 -1
  373. package/indicators/slow-stochastic.src.js +11 -2
  374. package/indicators/stochastic.js +12 -12
  375. package/indicators/stochastic.js.map +1 -1
  376. package/indicators/stochastic.src.js +11 -2
  377. package/indicators/supertrend.js +10 -10
  378. package/indicators/supertrend.js.map +1 -1
  379. package/indicators/supertrend.src.js +11 -2
  380. package/indicators/tema.js +6 -6
  381. package/indicators/tema.js.map +1 -1
  382. package/indicators/tema.src.js +11 -2
  383. package/indicators/trendline.js +5 -5
  384. package/indicators/trendline.js.map +1 -1
  385. package/indicators/trendline.src.js +11 -2
  386. package/indicators/trix.js +4 -4
  387. package/indicators/trix.js.map +1 -1
  388. package/indicators/trix.src.js +11 -2
  389. package/indicators/volume-by-price.js +17 -17
  390. package/indicators/volume-by-price.js.map +1 -1
  391. package/indicators/volume-by-price.src.js +11 -2
  392. package/indicators/vwap.js +5 -5
  393. package/indicators/vwap.js.map +1 -1
  394. package/indicators/vwap.src.js +11 -2
  395. package/indicators/williams-r.js +6 -5
  396. package/indicators/williams-r.js.map +1 -1
  397. package/indicators/williams-r.src.js +11 -2
  398. package/indicators/wma.js +5 -5
  399. package/indicators/wma.js.map +1 -1
  400. package/indicators/wma.src.js +11 -2
  401. package/indicators/zigzag.js +6 -6
  402. package/indicators/zigzag.js.map +1 -1
  403. package/indicators/zigzag.src.js +11 -2
  404. package/lib/jspdf.js +299 -184
  405. package/lib/jspdf.src.js +25266 -18067
  406. package/lib/svg2pdf.js +35 -31
  407. package/lib/svg2pdf.src.js +5721 -4179
  408. package/modules/accessibility.js +231 -229
  409. package/modules/accessibility.js.map +1 -1
  410. package/modules/accessibility.src.js +278 -197
  411. package/modules/annotations-advanced.js +144 -144
  412. package/modules/annotations-advanced.js.map +1 -1
  413. package/modules/annotations-advanced.src.js +26 -8
  414. package/modules/annotations.js +79 -79
  415. package/modules/annotations.js.map +1 -1
  416. package/modules/annotations.src.js +21 -5
  417. package/modules/arc-diagram.js +25 -0
  418. package/modules/arc-diagram.js.map +1 -0
  419. package/modules/arc-diagram.src.js +770 -0
  420. package/modules/arrow-symbols.js +4 -3
  421. package/modules/arrow-symbols.js.map +1 -1
  422. package/modules/arrow-symbols.src.js +11 -2
  423. package/modules/boost-canvas.js +15 -15
  424. package/modules/boost-canvas.js.map +1 -1
  425. package/modules/boost-canvas.src.js +11 -2
  426. package/modules/boost.js +80 -79
  427. package/modules/boost.js.map +1 -1
  428. package/modules/boost.src.js +71 -43
  429. package/modules/broken-axis.js +13 -13
  430. package/modules/broken-axis.js.map +1 -1
  431. package/modules/broken-axis.src.js +11 -2
  432. package/modules/bullet.js +9 -9
  433. package/modules/bullet.js.map +1 -1
  434. package/modules/bullet.src.js +11 -2
  435. package/modules/coloraxis.js +24 -24
  436. package/modules/coloraxis.js.map +1 -1
  437. package/modules/coloraxis.src.js +33 -7
  438. package/modules/current-date-indicator.js +5 -4
  439. package/modules/current-date-indicator.js.map +1 -1
  440. package/modules/current-date-indicator.src.js +11 -2
  441. package/modules/cylinder.js +11 -11
  442. package/modules/cylinder.js.map +1 -1
  443. package/modules/cylinder.src.js +11 -2
  444. package/modules/data.js +34 -33
  445. package/modules/data.js.map +1 -1
  446. package/modules/data.src.js +59 -32
  447. package/modules/datagrouping.js +21 -20
  448. package/modules/datagrouping.js.map +1 -1
  449. package/modules/datagrouping.src.js +16 -4
  450. package/modules/debugger.js +6 -6
  451. package/modules/debugger.js.map +1 -1
  452. package/modules/debugger.src.js +11 -2
  453. package/modules/dependency-wheel.js +12 -11
  454. package/modules/dependency-wheel.js.map +1 -1
  455. package/modules/dependency-wheel.src.js +14 -5
  456. package/modules/dotplot.js +6 -6
  457. package/modules/dotplot.js.map +1 -1
  458. package/modules/dotplot.src.js +11 -2
  459. package/modules/drag-panes.js +10 -10
  460. package/modules/drag-panes.js.map +1 -1
  461. package/modules/drag-panes.src.js +11 -2
  462. package/modules/draggable-points.js +35 -34
  463. package/modules/draggable-points.js.map +1 -1
  464. package/modules/draggable-points.src.js +20 -9
  465. package/modules/drilldown.d.ts +19 -0
  466. package/modules/drilldown.js +37 -25
  467. package/modules/drilldown.js.map +1 -1
  468. package/modules/drilldown.src.d.ts +19 -0
  469. package/modules/drilldown.src.js +1090 -105
  470. package/modules/dumbbell.js +17 -17
  471. package/modules/dumbbell.js.map +1 -1
  472. package/modules/dumbbell.src.js +11 -2
  473. package/modules/export-data.js +21 -20
  474. package/modules/export-data.js.map +1 -1
  475. package/modules/export-data.src.js +11 -2
  476. package/modules/exporting.js +39 -39
  477. package/modules/exporting.js.map +1 -1
  478. package/modules/exporting.src.js +82 -18
  479. package/modules/full-screen.js +8 -7
  480. package/modules/full-screen.js.map +1 -1
  481. package/modules/full-screen.src.js +11 -2
  482. package/modules/funnel.js +12 -12
  483. package/modules/funnel.js.map +1 -1
  484. package/modules/funnel.src.js +11 -2
  485. package/modules/funnel3d.js +21 -21
  486. package/modules/funnel3d.js.map +1 -1
  487. package/modules/funnel3d.src.js +11 -2
  488. package/modules/gantt.js +217 -217
  489. package/modules/gantt.js.map +1 -1
  490. package/modules/gantt.src.js +45 -20
  491. package/modules/grid-axis.js +23 -23
  492. package/modules/grid-axis.js.map +1 -1
  493. package/modules/grid-axis.src.js +22 -11
  494. package/modules/heatmap.js +40 -39
  495. package/modules/heatmap.js.map +1 -1
  496. package/modules/heatmap.src.js +33 -7
  497. package/modules/heikinashi.js +8 -8
  498. package/modules/heikinashi.js.map +1 -1
  499. package/modules/heikinashi.src.js +11 -2
  500. package/modules/histogram-bellcurve.js +13 -13
  501. package/modules/histogram-bellcurve.js.map +1 -1
  502. package/modules/histogram-bellcurve.src.js +11 -2
  503. package/modules/hollowcandlestick.js +9 -9
  504. package/modules/hollowcandlestick.js.map +1 -1
  505. package/modules/hollowcandlestick.src.js +11 -2
  506. package/modules/item-series.js +12 -12
  507. package/modules/item-series.js.map +1 -1
  508. package/modules/item-series.src.js +11 -2
  509. package/modules/lollipop.js +7 -7
  510. package/modules/lollipop.js.map +1 -1
  511. package/modules/lollipop.src.js +12 -3
  512. package/modules/map.d.ts +80 -43
  513. package/modules/map.js +169 -144
  514. package/modules/map.js.map +1 -1
  515. package/modules/map.src.d.ts +80 -43
  516. package/modules/map.src.js +7960 -6687
  517. package/modules/marker-clusters.js +36 -36
  518. package/modules/marker-clusters.js.map +1 -1
  519. package/modules/marker-clusters.src.js +47 -23
  520. package/modules/networkgraph.d.ts +5 -0
  521. package/modules/networkgraph.js +49 -48
  522. package/modules/networkgraph.js.map +1 -1
  523. package/modules/networkgraph.src.d.ts +5 -0
  524. package/modules/networkgraph.src.js +77 -15
  525. package/modules/no-data-to-display.js +5 -5
  526. package/modules/no-data-to-display.js.map +1 -1
  527. package/modules/no-data-to-display.src.js +11 -2
  528. package/modules/offline-exporting.js +20 -18
  529. package/modules/offline-exporting.js.map +1 -1
  530. package/modules/offline-exporting.src.js +126 -25
  531. package/modules/oldie-polyfills.js +7 -7
  532. package/modules/oldie-polyfills.js.map +1 -1
  533. package/modules/oldie-polyfills.src.js +11 -2
  534. package/modules/oldie.js +30 -30
  535. package/modules/oldie.js.map +1 -1
  536. package/modules/oldie.src.js +12 -3
  537. package/modules/organization.js +16 -14
  538. package/modules/organization.js.map +1 -1
  539. package/modules/organization.src.js +166 -32
  540. package/modules/overlapping-datalabels.js +3 -2
  541. package/modules/overlapping-datalabels.js.map +1 -1
  542. package/modules/overlapping-datalabels.src.js +11 -2
  543. package/modules/parallel-coordinates.js +11 -11
  544. package/modules/parallel-coordinates.js.map +1 -1
  545. package/modules/parallel-coordinates.src.js +11 -2
  546. package/modules/pareto.js +7 -7
  547. package/modules/pareto.js.map +1 -1
  548. package/modules/pareto.src.js +11 -2
  549. package/modules/pathfinder.js +31 -31
  550. package/modules/pathfinder.js.map +1 -1
  551. package/modules/pathfinder.src.js +11 -2
  552. package/modules/pattern-fill.js +14 -14
  553. package/modules/pattern-fill.js.map +1 -1
  554. package/modules/pattern-fill.src.js +11 -2
  555. package/modules/price-indicator.js +5 -5
  556. package/modules/price-indicator.js.map +1 -1
  557. package/modules/price-indicator.src.js +11 -2
  558. package/modules/pyramid3d.js +4 -4
  559. package/modules/pyramid3d.js.map +1 -1
  560. package/modules/pyramid3d.src.js +11 -2
  561. package/modules/sankey.d.ts +5 -0
  562. package/modules/sankey.js +32 -29
  563. package/modules/sankey.js.map +1 -1
  564. package/modules/sankey.src.d.ts +5 -0
  565. package/modules/sankey.src.js +338 -156
  566. package/modules/series-label.js +18 -17
  567. package/modules/series-label.js.map +1 -1
  568. package/modules/series-label.src.js +11 -2
  569. package/modules/solid-gauge.js +10 -10
  570. package/modules/solid-gauge.js.map +1 -1
  571. package/modules/solid-gauge.src.js +11 -2
  572. package/modules/sonification.js +59 -59
  573. package/modules/sonification.js.map +1 -1
  574. package/modules/sonification.src.js +11 -2
  575. package/modules/static-scale.js +5 -4
  576. package/modules/static-scale.js.map +1 -1
  577. package/modules/static-scale.src.js +11 -2
  578. package/modules/stock-tools.js +78 -78
  579. package/modules/stock-tools.js.map +1 -1
  580. package/modules/stock-tools.src.js +21 -5
  581. package/modules/stock.js +162 -162
  582. package/modules/stock.js.map +1 -1
  583. package/modules/stock.src.js +36 -13
  584. package/modules/streamgraph.js +5 -4
  585. package/modules/streamgraph.js.map +1 -1
  586. package/modules/streamgraph.src.js +11 -2
  587. package/modules/sunburst.d.ts +3 -0
  588. package/modules/sunburst.js +73 -60
  589. package/modules/sunburst.js.map +1 -1
  590. package/modules/sunburst.src.d.ts +3 -0
  591. package/modules/sunburst.src.js +1049 -96
  592. package/modules/tilemap.js +17 -17
  593. package/modules/tilemap.js.map +1 -1
  594. package/modules/tilemap.src.js +11 -2
  595. package/modules/timeline.js +18 -18
  596. package/modules/timeline.js.map +1 -1
  597. package/modules/timeline.src.js +11 -2
  598. package/modules/treegrid.js +57 -56
  599. package/modules/treegrid.js.map +1 -1
  600. package/modules/treegrid.src.js +33 -11
  601. package/modules/treemap.d.ts +3 -0
  602. package/modules/treemap.js +53 -41
  603. package/modules/treemap.js.map +1 -1
  604. package/modules/treemap.src.d.ts +3 -0
  605. package/modules/treemap.src.js +1039 -95
  606. package/modules/variable-pie.js +9 -9
  607. package/modules/variable-pie.js.map +1 -1
  608. package/modules/variable-pie.src.js +11 -2
  609. package/modules/variwide.js +12 -12
  610. package/modules/variwide.js.map +1 -1
  611. package/modules/variwide.src.js +11 -2
  612. package/modules/vector.js +8 -7
  613. package/modules/vector.js.map +1 -1
  614. package/modules/vector.src.js +11 -2
  615. package/modules/venn.js +31 -31
  616. package/modules/venn.js.map +1 -1
  617. package/modules/venn.src.js +18 -6
  618. package/modules/windbarb.js +15 -15
  619. package/modules/windbarb.js.map +1 -1
  620. package/modules/windbarb.src.js +11 -2
  621. package/modules/wordcloud.js +23 -23
  622. package/modules/wordcloud.js.map +1 -1
  623. package/modules/wordcloud.src.js +18 -6
  624. package/modules/xrange.js +16 -16
  625. package/modules/xrange.js.map +1 -1
  626. package/modules/xrange.src.js +11 -2
  627. package/package.json +1 -1
  628. package/themes/avocado.js +4 -3
  629. package/themes/avocado.js.map +1 -1
  630. package/themes/avocado.src.js +11 -2
  631. package/themes/brand-dark.js +9 -8
  632. package/themes/brand-dark.js.map +1 -1
  633. package/themes/brand-dark.src.js +11 -2
  634. package/themes/brand-light.js +8 -8
  635. package/themes/brand-light.js.map +1 -1
  636. package/themes/brand-light.src.js +11 -2
  637. package/themes/dark-blue.js +9 -8
  638. package/themes/dark-blue.js.map +1 -1
  639. package/themes/dark-blue.src.js +11 -2
  640. package/themes/dark-green.js +9 -8
  641. package/themes/dark-green.js.map +1 -1
  642. package/themes/dark-green.src.js +11 -2
  643. package/themes/dark-unica.js +8 -7
  644. package/themes/dark-unica.js.map +1 -1
  645. package/themes/dark-unica.src.js +11 -2
  646. package/themes/gray.js +9 -8
  647. package/themes/gray.js.map +1 -1
  648. package/themes/gray.src.js +11 -2
  649. package/themes/grid-light.js +5 -4
  650. package/themes/grid-light.js.map +1 -1
  651. package/themes/grid-light.src.js +11 -2
  652. package/themes/grid.js +5 -5
  653. package/themes/grid.js.map +1 -1
  654. package/themes/grid.src.js +11 -2
  655. package/themes/high-contrast-dark.js +7 -7
  656. package/themes/high-contrast-dark.js.map +1 -1
  657. package/themes/high-contrast-dark.src.js +21 -12
  658. package/themes/high-contrast-light.js +3 -3
  659. package/themes/high-contrast-light.js.map +1 -1
  660. package/themes/high-contrast-light.src.js +21 -12
  661. package/themes/sand-signika.js +5 -5
  662. package/themes/sand-signika.js.map +1 -1
  663. package/themes/sand-signika.src.js +11 -2
  664. package/themes/skies.js +5 -5
  665. package/themes/skies.js.map +1 -1
  666. package/themes/skies.src.js +11 -2
  667. package/themes/sunset.js +3 -3
  668. package/themes/sunset.js.map +1 -1
  669. package/themes/sunset.src.js +11 -2
  670. package/es-modules/Maps/ProjectionDefinition.js +0 -9
@@ -8,16 +8,72 @@
8
8
  *
9
9
  * */
10
10
  'use strict';
11
+ var __extends = (this && this.__extends) || (function () {
12
+ var extendStatics = function (d, b) {
13
+ extendStatics = Object.setPrototypeOf ||
14
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
15
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
16
+ return extendStatics(d, b);
17
+ };
18
+ return function (d, b) {
19
+ extendStatics(d, b);
20
+ function __() { this.constructor = d; }
21
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
22
+ };
23
+ })();
24
+ var __spreadArrays = (this && this.__spreadArrays) || function () {
25
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
26
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
27
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
28
+ r[k] = a[j];
29
+ return r;
30
+ };
11
31
  import defaultOptions from './MapViewOptionsDefault.js';
32
+ import defaultInsetsOptions from './MapViewInsetsOptionsDefault.js';
33
+ import GeoJSONModule from '../Extensions/GeoJSON.js';
34
+ var topo2geo = GeoJSONModule.topo2geo;
35
+ import MapChart from '../Core/Chart/MapChart.js';
36
+ var maps = MapChart.maps;
37
+ import MU from './MapUtilities.js';
38
+ var boundsFromPath = MU.boundsFromPath, pointInPolygon = MU.pointInPolygon;
12
39
  import Projection from './Projection.js';
13
40
  import U from '../Core/Utilities.js';
14
- var addEvent = U.addEvent, clamp = U.clamp, fireEvent = U.fireEvent, isNumber = U.isNumber, merge = U.merge, pick = U.pick, relativeLength = U.relativeLength;
41
+ var addEvent = U.addEvent, clamp = U.clamp, defined = U.defined, fireEvent = U.fireEvent, isArray = U.isArray, isNumber = U.isNumber, isObject = U.isObject, isString = U.isString, merge = U.merge, pick = U.pick, relativeLength = U.relativeLength;
15
42
  /**
16
43
  * The world size in terms of 10k meters in the Web Mercator projection, to
17
44
  * match a 256 square tile to zoom level 0
18
45
  */
19
46
  var worldSize = 400.979322;
20
47
  var tileSize = 256;
48
+ // Compute the zoom from given bounds and the size of the playing field. Used in
49
+ // two places, hence the local function.
50
+ var zoomFromBounds = function (b, playingField) {
51
+ var width = playingField.width, height = playingField.height, scaleToField = Math.max((b.x2 - b.x1) / (width / tileSize), (b.y2 - b.y1) / (height / tileSize));
52
+ return Math.log(worldSize / scaleToField) / Math.log(2);
53
+ };
54
+ /*
55
+ const mergeCollections = <
56
+ T extends Array<AnyRecord|undefined>
57
+ >(a: T, b: T): T => {
58
+ b.forEach((newer, i): void => {
59
+ // Only merge by id supported for now. We may consider later to support
60
+ // more complex rules like those of `Chart.update` with `oneToOne`, but
61
+ // it is probably not needed. Existing insets can be disabled by
62
+ // overwriting the `geoBounds` with empty data.
63
+ if (newer && isString(newer.id)) {
64
+ const older = U.find(
65
+ a,
66
+ (aItem): boolean => (aItem && aItem.id) === newer.id
67
+ );
68
+ if (older) {
69
+ const aIndex = a.indexOf(older);
70
+ a[aIndex] = merge(older, newer);
71
+ }
72
+ }
73
+ });
74
+ return a;
75
+ };
76
+ */
21
77
  /**
22
78
  * The map view handles zooming and centering on the map, and various
23
79
  * client-side projection capabilities.
@@ -35,8 +91,60 @@ var tileSize = 256;
35
91
  var MapView = /** @class */ (function () {
36
92
  function MapView(chart, options) {
37
93
  var _this = this;
94
+ this.insets = [];
95
+ this.padding = [0, 0, 0, 0];
96
+ this.eventsToUnbind = [];
97
+ var recommendedMapView;
98
+ var recommendedProjection;
99
+ if (!(this instanceof MapViewInset)) {
100
+ // Handle the global map and series-level mapData
101
+ var geoMaps = __spreadArrays([
102
+ chart.options.chart.map
103
+ ], (chart.options.series || []).map(function (s) { return s.mapData; })).map(function (mapData) { return _this.getGeoMap(mapData); });
104
+ var allGeoBounds_1 = [];
105
+ geoMaps.forEach(function (geoMap) {
106
+ if (geoMap) {
107
+ // Use the first geo map as main
108
+ if (!recommendedMapView) {
109
+ recommendedMapView = geoMap['hc-recommended-mapview'];
110
+ }
111
+ // Combine the bounding boxes of all loaded maps
112
+ if (geoMap.bbox) {
113
+ var _a = geoMap.bbox, x1 = _a[0], y1 = _a[1], x2 = _a[2], y2 = _a[3];
114
+ allGeoBounds_1.push({ x1: x1, y1: y1, x2: x2, y2: y2 });
115
+ }
116
+ }
117
+ });
118
+ // Get the composite bounds
119
+ var geoBounds = (allGeoBounds_1.length &&
120
+ MapView.compositeBounds(allGeoBounds_1));
121
+ // Provide a best-guess recommended projection if not set in the map
122
+ // or in user options
123
+ if (geoBounds) {
124
+ var x1 = geoBounds.x1, y1 = geoBounds.y1, x2 = geoBounds.x2, y2 = geoBounds.y2;
125
+ recommendedProjection = (x2 - x1 > 180 && y2 - y1 > 90) ?
126
+ // Wide angle, go for the world view
127
+ {
128
+ name: 'EqualEarth'
129
+ } :
130
+ // Narrower angle, use a projection better suited for local
131
+ // view
132
+ {
133
+ name: 'LambertConformalConic',
134
+ parallels: [y1, y2],
135
+ rotation: [-(x1 + x2) / 2]
136
+ };
137
+ }
138
+ // Register the main geo map (from options.chart.map) if set
139
+ this.geoMap = geoMaps[0];
140
+ }
38
141
  this.userOptions = options || {};
39
- var o = merge(defaultOptions, options);
142
+ var o = merge(defaultOptions, { projection: recommendedProjection }, recommendedMapView, options);
143
+ // Merge the inset collections by id, or index if id missing
144
+ var recInsets = recommendedMapView && recommendedMapView.insets, optInsets = options && options.insets;
145
+ if (recInsets && optInsets) {
146
+ o.insets = MapView.mergeInsets(recInsets, optInsets);
147
+ }
40
148
  this.chart = chart;
41
149
  /**
42
150
  * The current center of the view in terms of `[longitude, latitude]`.
@@ -47,6 +155,9 @@ var MapView = /** @class */ (function () {
47
155
  this.center = o.center;
48
156
  this.options = o;
49
157
  this.projection = new Projection(o.projection);
158
+ // Initialize with full plot box so we don't have to check for undefined
159
+ // every time we use it
160
+ this.playingField = chart.plotBox;
50
161
  /**
51
162
  * The current zoom level of the view.
52
163
  * @name Highcharts.MapView#zoom
@@ -54,8 +165,11 @@ var MapView = /** @class */ (function () {
54
165
  * @type {number}
55
166
  */
56
167
  this.zoom = o.zoom || 0;
168
+ // Create the insets
169
+ this.createInsets();
57
170
  // Initialize and respond to chart size changes
58
- addEvent(chart, 'afterSetChartSize', function () {
171
+ this.eventsToUnbind.push(addEvent(chart, 'afterSetChartSize', function () {
172
+ _this.playingField = _this.getField();
59
173
  if (_this.minZoom === void 0 || // When initializing the chart
60
174
  _this.minZoom === _this.zoom // When resizing the chart
61
175
  ) {
@@ -67,93 +181,34 @@ var MapView = /** @class */ (function () {
67
181
  merge(true, _this.center, _this.userOptions.center);
68
182
  }
69
183
  }
70
- });
71
- // Set up panning for maps. In orthographic projections the globe will
72
- // rotate, otherwise adjust the map center.
73
- var mouseDownCenterProjected;
74
- var mouseDownKey;
75
- var mouseDownRotation;
76
- var onPan = function (e) {
77
- var pinchDown = chart.pointer.pinchDown;
78
- var mouseDownX = chart.mouseDownX, mouseDownY = chart.mouseDownY;
79
- if (pinchDown.length === 1) {
80
- mouseDownX = pinchDown[0].chartX;
81
- mouseDownY = pinchDown[0].chartY;
82
- }
83
- if (typeof mouseDownX === 'number' &&
84
- typeof mouseDownY === 'number') {
85
- var key = mouseDownX + "," + mouseDownY, _a = e.originalEvent, chartX = _a.chartX, chartY = _a.chartY;
86
- // Reset starting position
87
- if (key !== mouseDownKey) {
88
- mouseDownKey = key;
89
- mouseDownCenterProjected = _this.projection
90
- .forward(_this.center);
91
- mouseDownRotation = (_this.projection.options.rotation || [0, 0]).slice();
92
- }
93
- // Panning rotates the globe
94
- if (_this.projection.options.name === 'Orthographic' &&
95
- // ... but don't rotate if we're loading only a part of the
96
- // world
97
- (_this.minZoom || Infinity) < 3) {
98
- // Empirical ratio where the globe rotates roughly the same
99
- // speed as moving the pointer across the center of the
100
- // projection
101
- var ratio = 440 / (_this.getScale() * Math.min(chart.plotWidth, chart.plotHeight));
102
- if (mouseDownRotation) {
103
- var lon = (mouseDownX - chartX) * ratio -
104
- mouseDownRotation[0];
105
- var lat = clamp(-mouseDownRotation[1] -
106
- (mouseDownY - chartY) * ratio, -80, 80);
107
- _this.update({
108
- projection: {
109
- rotation: [-lon, -lat]
110
- },
111
- center: [lon, lat],
112
- zoom: _this.zoom
113
- }, true, false);
114
- }
115
- }
116
- else {
117
- var scale = _this.getScale();
118
- var newCenter = _this.projection.inverse([
119
- mouseDownCenterProjected[0] +
120
- (mouseDownX - chartX) / scale,
121
- mouseDownCenterProjected[1] -
122
- (mouseDownY - chartY) / scale
123
- ]);
124
- _this.setView(newCenter, void 0, true, false);
125
- }
126
- e.preventDefault();
127
- }
128
- };
129
- addEvent(chart, 'pan', onPan);
130
- addEvent(chart, 'touchpan', onPan);
131
- // Perform the map zoom by selection
132
- addEvent(chart, 'selection', function (evt) {
133
- // Zoom in
134
- if (!evt.resetSelection) {
135
- var x = evt.x - chart.plotLeft;
136
- var y = evt.y - chart.plotTop;
137
- var _a = _this.pixelsToProjectedUnits({ x: x, y: y }), y1 = _a.y, x1 = _a.x;
138
- var _b = _this.pixelsToProjectedUnits({ x: x + evt.width, y: y + evt.height }), y2 = _b.y, x2 = _b.x;
139
- _this.fitToBounds({ x1: x1, y1: y1, x2: x2, y2: y2 }, void 0, true, evt.originalEvent.touches ?
140
- // On touch zoom, don't animate, since we're already in
141
- // transformed zoom preview
142
- false :
143
- // On mouse zoom, obey the chart-level animation
144
- void 0);
145
- // Only for mouse. Touch users can pinch out.
146
- if (!/^touch/.test((evt.originalEvent.type))) {
147
- chart.showResetZoom();
148
- }
149
- evt.preventDefault();
150
- // Reset zoom
151
- }
152
- else {
153
- _this.zoomBy();
154
- }
155
- });
184
+ }));
185
+ this.setUpEvents();
156
186
  }
187
+ // Merge two collections of insets by the id
188
+ MapView.mergeInsets = function (a, b) {
189
+ var toObject = function (insets) {
190
+ var ob = {};
191
+ insets.forEach(function (inset, i) {
192
+ ob[inset && inset.id || "i" + i] = inset;
193
+ });
194
+ return ob;
195
+ };
196
+ var insetsObj = merge(toObject(a), toObject(b)), insets = Object
197
+ .keys(insetsObj)
198
+ .map(function (key) { return insetsObj[key]; });
199
+ return insets;
200
+ };
201
+ // Create MapViewInset instances from insets options
202
+ MapView.prototype.createInsets = function () {
203
+ var _this = this;
204
+ var options = this.options, insets = options.insets;
205
+ if (insets) {
206
+ insets.forEach(function (item) {
207
+ var inset = new MapViewInset(_this, merge(options.insetOptions, item));
208
+ _this.insets.push(inset);
209
+ });
210
+ }
211
+ };
157
212
  /**
158
213
  * Fit the view to given bounds
159
214
  *
@@ -174,9 +229,16 @@ var MapView = /** @class */ (function () {
174
229
  if (redraw === void 0) { redraw = true; }
175
230
  var b = bounds || this.getProjectedBounds();
176
231
  if (b) {
177
- var _a = this.chart, plotWidth = _a.plotWidth, plotHeight = _a.plotHeight, pad = pick(padding, bounds ? 0 : this.options.padding), paddingX = relativeLength(pad, plotWidth), paddingY = relativeLength(pad, plotHeight);
178
- var scaleToPlotArea = Math.max((b.x2 - b.x1) / ((plotWidth - paddingX) / tileSize), (b.y2 - b.y1) / ((plotHeight - paddingY) / tileSize));
179
- var zoom = Math.log(worldSize / scaleToPlotArea) / Math.log(2);
232
+ var pad = pick(padding, bounds ? 0 : this.options.padding), fullField = this.getField(false), padArr = isArray(pad) ? pad : [pad, pad, pad, pad];
233
+ this.padding = [
234
+ relativeLength(padArr[0], fullField.height),
235
+ relativeLength(padArr[1], fullField.width),
236
+ relativeLength(padArr[2], fullField.height),
237
+ relativeLength(padArr[3], fullField.width)
238
+ ];
239
+ // Apply the playing field, corrected with padding
240
+ this.playingField = this.getField();
241
+ var zoom = zoomFromBounds(b, this.playingField);
180
242
  // Reset minZoom when fitting to natural bounds
181
243
  if (!bounds) {
182
244
  this.minZoom = zoom;
@@ -188,21 +250,176 @@ var MapView = /** @class */ (function () {
188
250
  this.setView(center, zoom, redraw, animation);
189
251
  }
190
252
  };
253
+ MapView.prototype.getField = function (padded) {
254
+ if (padded === void 0) { padded = true; }
255
+ var padding = padded ? this.padding : [0, 0, 0, 0];
256
+ return {
257
+ x: padding[3],
258
+ y: padding[0],
259
+ width: this.chart.plotWidth - padding[1] - padding[3],
260
+ height: this.chart.plotHeight - padding[0] - padding[2]
261
+ };
262
+ };
263
+ MapView.prototype.getGeoMap = function (map) {
264
+ if (isString(map)) {
265
+ return maps[map];
266
+ }
267
+ if (isObject(map, true)) {
268
+ if (map.type === 'FeatureCollection') {
269
+ return map;
270
+ }
271
+ if (map.type === 'Topology') {
272
+ return topo2geo(map);
273
+ }
274
+ }
275
+ };
276
+ MapView.prototype.getMapBBox = function () {
277
+ var bounds = this.getProjectedBounds(), scale = this.getScale();
278
+ if (bounds) {
279
+ var padding = this.padding, p1 = this.projectedUnitsToPixels({
280
+ x: bounds.x1,
281
+ y: bounds.y2
282
+ }), width = ((bounds.x2 - bounds.x1) * scale +
283
+ padding[1] + padding[3]), height = ((bounds.y2 - bounds.y1) * scale +
284
+ padding[0] + padding[2]);
285
+ return {
286
+ width: width,
287
+ height: height,
288
+ x: p1.x - padding[3],
289
+ y: p1.y - padding[0]
290
+ };
291
+ }
292
+ };
191
293
  MapView.prototype.getProjectedBounds = function () {
192
294
  var allBounds = this.chart.series.reduce(function (acc, s) {
193
295
  var bounds = s.getProjectedBounds && s.getProjectedBounds();
194
- if (bounds) {
296
+ if (bounds &&
297
+ s.options.affectsMapView !== false) {
195
298
  acc.push(bounds);
196
299
  }
197
300
  return acc;
198
301
  }, []);
199
- return MapView.compositeBounds(allBounds);
302
+ return this.projection.bounds || MapView.compositeBounds(allBounds);
200
303
  };
201
304
  MapView.prototype.getScale = function () {
202
305
  // A zoom of 0 means the world (360x360 degrees) fits in a 256x256 px
203
306
  // tile
204
307
  return (tileSize / worldSize) * Math.pow(2, this.zoom);
205
308
  };
309
+ // Calculate the SVG transform to be applied to series groups
310
+ MapView.prototype.getSVGTransform = function () {
311
+ var _a = this.playingField, x = _a.x, y = _a.y, width = _a.width, height = _a.height, projectedCenter = this.projection.forward(this.center), flipFactor = this.projection.hasCoordinates ? -1 : 1, scaleX = this.getScale(), scaleY = scaleX * flipFactor, translateX = x + width / 2 - projectedCenter[0] * scaleX, translateY = y + height / 2 - projectedCenter[1] * scaleY;
312
+ return { scaleX: scaleX, scaleY: scaleY, translateX: translateX, translateY: translateY };
313
+ };
314
+ /**
315
+ * Convert map coordinates in longitude/latitude to pixels
316
+ *
317
+ * @function Highcharts.MapView#lonLatToPixels
318
+ * @since 10.0.0
319
+ * @param {Highcharts.MapLonLatObject} lonLat
320
+ * The map coordinates
321
+ * @return {Highcharts.PositionObject|undefined}
322
+ * The pixel position
323
+ */
324
+ MapView.prototype.lonLatToPixels = function (lonLat) {
325
+ var pos = this.lonLatToProjectedUnits(lonLat);
326
+ if (pos) {
327
+ return this.projectedUnitsToPixels(pos);
328
+ }
329
+ };
330
+ /**
331
+ * Get projected units from longitude/latitude. Insets are accounted for.
332
+ * Returns an object with x and y values corresponding to positions on the
333
+ * projected plane.
334
+ *
335
+ * @requires modules/map
336
+ *
337
+ * @function Highcharts.MapView#lonLatToProjectedUnits
338
+ *
339
+ * @since 10.0.0
340
+ * @sample maps/series/latlon-to-point/ Find a point from lon/lat
341
+ *
342
+ * @param {Highcharts.MapLonLatObject} lonLat Coordinates.
343
+ *
344
+ * @return {Highcharts.ProjectedXY} X and Y coordinates in terms of
345
+ * projected values
346
+ */
347
+ MapView.prototype.lonLatToProjectedUnits = function (lonLat) {
348
+ var chart = this.chart, mapTransforms = chart.mapTransforms;
349
+ // Legacy, built-in transforms
350
+ if (mapTransforms) {
351
+ for (var transform in mapTransforms) {
352
+ if (Object.hasOwnProperty.call(mapTransforms, transform) &&
353
+ mapTransforms[transform].hitZone) {
354
+ var coords = chart.transformFromLatLon(lonLat, mapTransforms[transform]);
355
+ if (coords && pointInPolygon(coords, mapTransforms[transform].hitZone.coordinates[0])) {
356
+ return coords;
357
+ }
358
+ }
359
+ }
360
+ return chart.transformFromLatLon(lonLat, mapTransforms['default'] // eslint-disable-line dot-notation
361
+ );
362
+ }
363
+ // Handle insets
364
+ for (var _i = 0, _a = this.insets; _i < _a.length; _i++) {
365
+ var inset = _a[_i];
366
+ if (inset.options.geoBounds &&
367
+ pointInPolygon({ x: lonLat.lon, y: lonLat.lat }, inset.options.geoBounds.coordinates[0])) {
368
+ var insetProjectedPoint = inset.projection.forward([lonLat.lon, lonLat.lat]), pxPoint = inset.projectedUnitsToPixels({ x: insetProjectedPoint[0], y: insetProjectedPoint[1] });
369
+ return this.pixelsToProjectedUnits(pxPoint);
370
+ }
371
+ }
372
+ var point = this.projection.forward([lonLat.lon, lonLat.lat]);
373
+ if (!point.outside) {
374
+ return { x: point[0], y: point[1] };
375
+ }
376
+ };
377
+ /**
378
+ * Calculate longitude/latitude values for a point or position. Returns an
379
+ * object with the numeric properties `lon` and `lat`.
380
+ *
381
+ * @requires modules/map
382
+ *
383
+ * @function Highcharts.MapView#projectedUnitsToLonLat
384
+ *
385
+ * @since 10.0.0
386
+ *
387
+ * @sample maps/demo/latlon-advanced/ Advanced lat/lon demo
388
+ *
389
+ * @param {Highcharts.Point|Highcharts.ProjectedXY} point
390
+ * A `Point` instance or anything containing `x` and `y` properties
391
+ * with numeric values.
392
+ *
393
+ * @return {Highcharts.MapLonLatObject|undefined} An object with `lat` and
394
+ * `lon` properties.
395
+ */
396
+ MapView.prototype.projectedUnitsToLonLat = function (point) {
397
+ var chart = this.chart, mapTransforms = chart.mapTransforms;
398
+ // Legacy, built-in transforms
399
+ if (mapTransforms) {
400
+ for (var transform in mapTransforms) {
401
+ if (Object.hasOwnProperty.call(mapTransforms, transform) &&
402
+ mapTransforms[transform].hitZone &&
403
+ pointInPolygon(point, mapTransforms[transform].hitZone.coordinates[0])) {
404
+ return chart.transformToLatLon(point, mapTransforms[transform]);
405
+ }
406
+ }
407
+ return chart.transformToLatLon(point, mapTransforms['default'] // eslint-disable-line dot-notation
408
+ );
409
+ }
410
+ var pxPoint = this.projectedUnitsToPixels(point);
411
+ for (var _i = 0, _a = this.insets; _i < _a.length; _i++) {
412
+ var inset = _a[_i];
413
+ if (inset.hitZone &&
414
+ pointInPolygon(pxPoint, inset.hitZone.coordinates[0])) {
415
+ var insetProjectedPoint = inset
416
+ .pixelsToProjectedUnits(pxPoint), coordinates_1 = inset.projection.inverse([insetProjectedPoint.x, insetProjectedPoint.y]);
417
+ return { lon: coordinates_1[0], lat: coordinates_1[1] };
418
+ }
419
+ }
420
+ var coordinates = this.projection.inverse([point.x, point.y]);
421
+ return { lon: coordinates[0], lat: coordinates[1] };
422
+ };
206
423
  MapView.prototype.redraw = function (animation) {
207
424
  this.chart.series.forEach(function (s) {
208
425
  if (s.useMapGeometry) {
@@ -228,7 +445,6 @@ var MapView = /** @class */ (function () {
228
445
  */
229
446
  MapView.prototype.setView = function (center, zoom, redraw, animation) {
230
447
  if (redraw === void 0) { redraw = true; }
231
- var zoomingIn = false;
232
448
  if (center) {
233
449
  this.center = center;
234
450
  }
@@ -239,64 +455,59 @@ var MapView = /** @class */ (function () {
239
455
  if (typeof this.options.maxZoom === 'number') {
240
456
  zoom = Math.min(zoom, this.options.maxZoom);
241
457
  }
242
- zoomingIn = zoom > this.zoom;
243
458
  this.zoom = zoom;
244
459
  }
245
- // Stay within the data bounds
246
460
  var bounds = this.getProjectedBounds();
247
- if (bounds &&
248
- // When zooming in, we don't need to adjust to the bounds, as that
249
- // could shift the location under the mouse
250
- !zoomingIn) {
251
- var projectedCenter = this.projection.forward(this.center);
252
- var _a = this.chart, plotWidth = _a.plotWidth, plotHeight = _a.plotHeight;
253
- var scale = this.getScale();
254
- var bottomLeft = this.projectedUnitsToPixels({
461
+ if (bounds) {
462
+ var projectedCenter = this.projection.forward(this.center), _a = this.playingField, x = _a.x, y = _a.y, width = _a.width, height = _a.height, scale = this.getScale(), bottomLeft = this.projectedUnitsToPixels({
255
463
  x: bounds.x1,
256
464
  y: bounds.y1
257
- });
258
- var topRight = this.projectedUnitsToPixels({
465
+ }), topRight = this.projectedUnitsToPixels({
259
466
  x: bounds.x2,
260
467
  y: bounds.y2
261
- });
262
- var boundsCenterProjected = [
468
+ }), boundsCenterProjected = [
263
469
  (bounds.x1 + bounds.x2) / 2,
264
470
  (bounds.y1 + bounds.y2) / 2
265
471
  ];
472
+ // Constrain to data bounds
266
473
  // Pixel coordinate system is reversed vs projected
267
- var x1 = bottomLeft.x;
268
- var y1 = topRight.y;
269
- var x2 = topRight.x;
270
- var y2 = bottomLeft.y;
474
+ var x1 = bottomLeft.x, y1 = topRight.y, x2 = topRight.x, y2 = bottomLeft.y;
271
475
  // Map smaller than plot area, center it
272
- if (x2 - x1 < plotWidth) {
476
+ if (x2 - x1 < width) {
273
477
  projectedCenter[0] = boundsCenterProjected[0];
274
478
  // Off west
275
479
  }
276
- else if (x1 < 0 && x2 < plotWidth) {
480
+ else if (x1 < x && x2 < x + width) {
277
481
  // Adjust eastwards
278
- projectedCenter[0] += Math.max(x1, x2 - plotWidth) / scale;
482
+ projectedCenter[0] += Math.max(x1 - x, x2 - width - x) / scale;
279
483
  // Off east
280
484
  }
281
- else if (x2 > plotWidth && x1 > 0) {
485
+ else if (x2 > x + width && x1 > x) {
282
486
  // Adjust westwards
283
- projectedCenter[0] += Math.min(x2 - plotWidth, x1) / scale;
487
+ projectedCenter[0] += Math.min(x2 - width - x, x1 - x) / scale;
284
488
  }
285
489
  // Map smaller than plot area, center it
286
- if (y2 - y1 < plotHeight) {
490
+ if (y2 - y1 < height) {
287
491
  projectedCenter[1] = boundsCenterProjected[1];
288
492
  // Off north
289
493
  }
290
- else if (y1 < 0 && y2 < plotHeight) {
494
+ else if (y1 < y && y2 < y + height) {
291
495
  // Adjust southwards
292
- projectedCenter[1] -= Math.max(y1, y2 - plotHeight) / scale;
496
+ projectedCenter[1] -= Math.max(y1 - y, y2 - height - y) / scale;
293
497
  // Off south
294
498
  }
295
- else if (y2 > plotHeight && y1 > 0) {
499
+ else if (y2 > y + height && y1 > y) {
296
500
  // Adjust northwards
297
- projectedCenter[1] -= Math.min(y2 - plotHeight, y1) / scale;
501
+ projectedCenter[1] -= Math.min(y2 - height - y, y1 - y) / scale;
298
502
  }
299
503
  this.center = this.projection.inverse(projectedCenter);
504
+ this.insets.forEach(function (inset) {
505
+ if (inset.options.field) {
506
+ inset.hitZone = inset.getHitZone();
507
+ inset.playingField = inset.getField();
508
+ }
509
+ });
510
+ this.render();
300
511
  }
301
512
  fireEvent(this, 'afterSetView');
302
513
  if (redraw) {
@@ -312,14 +523,24 @@ var MapView = /** @class */ (function () {
312
523
  * @return {Highcharts.PositionObject} The position in pixels
313
524
  */
314
525
  MapView.prototype.projectedUnitsToPixels = function (pos) {
315
- var scale = this.getScale();
316
- var projectedCenter = this.projection.forward(this.center);
317
- var centerPxX = this.chart.plotWidth / 2;
318
- var centerPxY = this.chart.plotHeight / 2;
526
+ var scale = this.getScale(), projectedCenter = this.projection.forward(this.center), field = this.playingField, centerPxX = field.x + field.width / 2, centerPxY = field.y + field.height / 2;
319
527
  var x = centerPxX - scale * (projectedCenter[0] - pos.x);
320
528
  var y = centerPxY + scale * (projectedCenter[1] - pos.y);
321
529
  return { x: x, y: y };
322
530
  };
531
+ /**
532
+ * Convert pixel position to longitude and latitude.
533
+ *
534
+ * @function Highcharts.MapView#pixelsToLonLat
535
+ * @since 10.0.0
536
+ * @param {Highcharts.PositionObject} pos
537
+ * The position in pixels
538
+ * @return {Highcharts.MapLonLatObject|undefined}
539
+ * The map coordinates
540
+ */
541
+ MapView.prototype.pixelsToLonLat = function (pos) {
542
+ return this.projectedUnitsToLonLat(this.pixelsToProjectedUnits(pos));
543
+ };
323
544
  /**
324
545
  * Convert pixel position to projected units
325
546
  *
@@ -329,15 +550,111 @@ var MapView = /** @class */ (function () {
329
550
  * @return {Highcharts.PositionObject} The position in projected units
330
551
  */
331
552
  MapView.prototype.pixelsToProjectedUnits = function (pos) {
332
- var x = pos.x, y = pos.y;
333
- var scale = this.getScale();
334
- var projectedCenter = this.projection.forward(this.center);
335
- var centerPxX = this.chart.plotWidth / 2;
336
- var centerPxY = this.chart.plotHeight / 2;
553
+ var x = pos.x, y = pos.y, scale = this.getScale(), projectedCenter = this.projection.forward(this.center), field = this.playingField, centerPxX = field.x + field.width / 2, centerPxY = field.y + field.height / 2;
337
554
  var projectedX = projectedCenter[0] + (x - centerPxX) / scale;
338
555
  var projectedY = projectedCenter[1] - (y - centerPxY) / scale;
339
556
  return { x: projectedX, y: projectedY };
340
557
  };
558
+ MapView.prototype.setUpEvents = function () {
559
+ var _this = this;
560
+ var chart = this.chart;
561
+ // Set up panning for maps. In orthographic projections the globe will
562
+ // rotate, otherwise adjust the map center.
563
+ var mouseDownCenterProjected;
564
+ var mouseDownKey;
565
+ var mouseDownRotation;
566
+ var onPan = function (e) {
567
+ var pinchDown = chart.pointer.pinchDown, projection = _this.projection;
568
+ var mouseDownX = chart.mouseDownX, mouseDownY = chart.mouseDownY;
569
+ if (pinchDown.length === 1) {
570
+ mouseDownX = pinchDown[0].chartX;
571
+ mouseDownY = pinchDown[0].chartY;
572
+ }
573
+ if (typeof mouseDownX === 'number' &&
574
+ typeof mouseDownY === 'number') {
575
+ var key = mouseDownX + "," + mouseDownY, _a = e.originalEvent, chartX = _a.chartX, chartY = _a.chartY;
576
+ // Reset starting position
577
+ if (key !== mouseDownKey) {
578
+ mouseDownKey = key;
579
+ mouseDownCenterProjected = _this.projection
580
+ .forward(_this.center);
581
+ mouseDownRotation = (_this.projection.options.rotation || [0, 0]).slice();
582
+ }
583
+ // Get the natural zoom level of the projection itself when
584
+ // zoomed to view the full world
585
+ var worldBounds = projection.def && projection.def.bounds, worldZoom = (worldBounds &&
586
+ zoomFromBounds(worldBounds, _this.playingField)) || -Infinity;
587
+ // Panning rotates the globe
588
+ if (projection.options.name === 'Orthographic' &&
589
+ // ... but don't rotate if we're loading only a part of the
590
+ // world
591
+ (_this.minZoom || Infinity) < worldZoom * 1.1) {
592
+ // Empirical ratio where the globe rotates roughly the same
593
+ // speed as moving the pointer across the center of the
594
+ // projection
595
+ var ratio = 440 / (_this.getScale() * Math.min(chart.plotWidth, chart.plotHeight));
596
+ if (mouseDownRotation) {
597
+ var lon = (mouseDownX - chartX) * ratio -
598
+ mouseDownRotation[0], lat = clamp(-mouseDownRotation[1] -
599
+ (mouseDownY - chartY) * ratio, -80, 80), zoom = _this.zoom;
600
+ _this.update({
601
+ projection: {
602
+ rotation: [-lon, -lat]
603
+ }
604
+ }, false);
605
+ _this.zoom = zoom;
606
+ chart.redraw(false);
607
+ }
608
+ }
609
+ else {
610
+ var scale = _this.getScale();
611
+ var newCenter = _this.projection.inverse([
612
+ mouseDownCenterProjected[0] +
613
+ (mouseDownX - chartX) / scale,
614
+ mouseDownCenterProjected[1] -
615
+ (mouseDownY - chartY) / scale
616
+ ]);
617
+ _this.setView(newCenter, void 0, true, false);
618
+ }
619
+ e.preventDefault();
620
+ }
621
+ };
622
+ addEvent(chart, 'pan', onPan);
623
+ addEvent(chart, 'touchpan', onPan);
624
+ // Perform the map zoom by selection
625
+ addEvent(chart, 'selection', function (evt) {
626
+ // Zoom in
627
+ if (!evt.resetSelection) {
628
+ var x = evt.x - chart.plotLeft;
629
+ var y = evt.y - chart.plotTop;
630
+ var _a = _this.pixelsToProjectedUnits({ x: x, y: y }), y1 = _a.y, x1 = _a.x;
631
+ var _b = _this.pixelsToProjectedUnits({ x: x + evt.width, y: y + evt.height }), y2 = _b.y, x2 = _b.x;
632
+ _this.fitToBounds({ x1: x1, y1: y1, x2: x2, y2: y2 }, void 0, true, evt.originalEvent.touches ?
633
+ // On touch zoom, don't animate, since we're already in
634
+ // transformed zoom preview
635
+ false :
636
+ // On mouse zoom, obey the chart-level animation
637
+ void 0);
638
+ // Only for mouse. Touch users can pinch out.
639
+ if (!/^touch/.test((evt.originalEvent.type))) {
640
+ chart.showResetZoom();
641
+ }
642
+ evt.preventDefault();
643
+ // Reset zoom
644
+ }
645
+ else {
646
+ _this.zoomBy();
647
+ }
648
+ });
649
+ };
650
+ MapView.prototype.render = function () {
651
+ // We need a group for the insets
652
+ if (!this.group) {
653
+ this.group = this.chart.renderer.g('map-view')
654
+ .attr({ zIndex: 4 })
655
+ .add();
656
+ }
657
+ };
341
658
  /**
342
659
  * Update the view with given options
343
660
  *
@@ -354,18 +671,41 @@ var MapView = /** @class */ (function () {
354
671
  if (redraw === void 0) { redraw = true; }
355
672
  var newProjection = options.projection;
356
673
  var isDirtyProjection = newProjection && ((Projection.toString(newProjection) !==
357
- Projection.toString(this.options.projection)));
674
+ Projection.toString(this.options.projection))), isDirtyInsets = false;
358
675
  merge(true, this.userOptions, options);
359
676
  merge(true, this.options, options);
360
- if (isDirtyProjection) {
677
+ // If anything changed with the insets, destroy them all and create
678
+ // again below
679
+ if ('insets' in options) {
680
+ this.insets.forEach(function (inset) { return inset.destroy(); });
681
+ this.insets.length = 0;
682
+ isDirtyInsets = true;
683
+ }
684
+ if (isDirtyProjection || isDirtyInsets) {
361
685
  this.chart.series.forEach(function (series) {
686
+ var groups = series.transformGroups;
362
687
  if (series.clearBounds) {
363
688
  series.clearBounds();
364
689
  }
365
690
  series.isDirty = true;
366
691
  series.isDirtyData = true;
692
+ // Destroy inset transform groups
693
+ if (isDirtyInsets && groups) {
694
+ while (groups.length > 1) {
695
+ var group = groups.pop();
696
+ if (group) {
697
+ group.destroy();
698
+ }
699
+ }
700
+ }
367
701
  });
368
- this.projection = new Projection(this.options.projection);
702
+ if (isDirtyProjection) {
703
+ this.projection = new Projection(this.options.projection);
704
+ }
705
+ // Create new insets
706
+ if (isDirtyInsets) {
707
+ this.createInsets();
708
+ }
369
709
  // Fit to natural bounds if center/zoom are not explicitly given
370
710
  if (!options.center && !isNumber(options.zoom)) {
371
711
  this.fitToBounds(void 0, void 0, false);
@@ -447,4 +787,135 @@ var MapView = /** @class */ (function () {
447
787
  };
448
788
  return MapView;
449
789
  }());
790
+ // Putting this in the same file due to circular dependency with MapView
791
+ var MapViewInset = /** @class */ (function (_super) {
792
+ __extends(MapViewInset, _super);
793
+ function MapViewInset(mapView, options) {
794
+ var _this = _super.call(this, mapView.chart, options) || this;
795
+ _this.id = options.id;
796
+ _this.mapView = mapView;
797
+ _this.options = merge(defaultInsetsOptions, options);
798
+ _this.allBounds = [];
799
+ if (_this.options.geoBounds) {
800
+ // The path in projected units in the map view's main projection.
801
+ // This is used for hit testing where the points should render.
802
+ var path = mapView.projection.path(_this.options.geoBounds);
803
+ _this.geoBoundsProjectedBox = boundsFromPath(path);
804
+ _this.geoBoundsProjectedPolygon = path.map(function (segment) { return [
805
+ segment[1] || 0,
806
+ segment[2] || 0
807
+ ]; });
808
+ }
809
+ return _this;
810
+ }
811
+ // Get the playing field in pixels
812
+ MapViewInset.prototype.getField = function (padded) {
813
+ if (padded === void 0) { padded = true; }
814
+ var hitZone = this.hitZone;
815
+ if (hitZone) {
816
+ var padding = padded ? this.padding : [0, 0, 0, 0], polygon = hitZone.coordinates[0], xs = polygon.map(function (xy) { return xy[0]; }), ys = polygon.map(function (xy) { return xy[1]; }), x = Math.min.apply(0, xs) + padding[3], x2 = Math.max.apply(0, xs) - padding[1], y = Math.min.apply(0, ys) + padding[0], y2 = Math.max.apply(0, ys) - padding[2];
817
+ if (isNumber(x) && isNumber(y)) {
818
+ return {
819
+ x: x,
820
+ y: y,
821
+ width: x2 - x,
822
+ height: y2 - y
823
+ };
824
+ }
825
+ }
826
+ // Fall back to plot area
827
+ return _super.prototype.getField.call(this, padded);
828
+ };
829
+ // Get the hit zone in pixels
830
+ MapViewInset.prototype.getHitZone = function () {
831
+ var _a = this, chart = _a.chart, mapView = _a.mapView, options = _a.options, coordinates = (options.field || {}).coordinates;
832
+ if (coordinates) {
833
+ var polygon = coordinates[0];
834
+ if (options.units === 'percent') {
835
+ var relativeTo_1 = options.relativeTo === 'mapBoundingBox' &&
836
+ mapView.getMapBBox() ||
837
+ merge(chart.plotBox, { x: 0, y: 0 });
838
+ polygon = polygon.map(function (xy) { return [
839
+ relativeLength(xy[0] + "%", relativeTo_1.width, relativeTo_1.x),
840
+ relativeLength(xy[1] + "%", relativeTo_1.height, relativeTo_1.y)
841
+ ]; });
842
+ }
843
+ return {
844
+ type: 'Polygon',
845
+ coordinates: [polygon]
846
+ };
847
+ }
848
+ };
849
+ MapViewInset.prototype.getProjectedBounds = function () {
850
+ return MapView.compositeBounds(this.allBounds);
851
+ };
852
+ // Determine whether a point on the main projected plane is inside the
853
+ // geoBounds of the inset.
854
+ MapViewInset.prototype.isInside = function (point) {
855
+ var _a = this, geoBoundsProjectedBox = _a.geoBoundsProjectedBox, geoBoundsProjectedPolygon = _a.geoBoundsProjectedPolygon;
856
+ return Boolean(
857
+ // First we do a pre-pass to check whether the test point is inside
858
+ // the rectangular bounding box of the polygon. This is less
859
+ // expensive and will rule out most cases.
860
+ geoBoundsProjectedBox &&
861
+ point.x >= geoBoundsProjectedBox.x1 &&
862
+ point.x <= geoBoundsProjectedBox.x2 &&
863
+ point.y >= geoBoundsProjectedBox.y1 &&
864
+ point.y <= geoBoundsProjectedBox.y2 &&
865
+ // Next, do the more expensive check whether the point is inside the
866
+ // polygon itself.
867
+ geoBoundsProjectedPolygon &&
868
+ pointInPolygon(point, geoBoundsProjectedPolygon));
869
+ };
870
+ // Render the map view inset with the border path
871
+ MapViewInset.prototype.render = function () {
872
+ var _a = this, chart = _a.chart, mapView = _a.mapView, options = _a.options, borderPath = options.borderPath || options.field;
873
+ if (borderPath && mapView.group) {
874
+ var animate = true;
875
+ if (!this.border) {
876
+ this.border = chart.renderer
877
+ .path()
878
+ .addClass('highcharts-mapview-inset-border')
879
+ .add(mapView.group);
880
+ animate = false;
881
+ }
882
+ if (!chart.styledMode) {
883
+ this.border.attr({
884
+ stroke: options.borderColor,
885
+ 'stroke-width': options.borderWidth
886
+ });
887
+ }
888
+ var crisp_1 = Math.round(this.border.strokeWidth()) % 2 / 2, field_1 = (options.relativeTo === 'mapBoundingBox' &&
889
+ mapView.getMapBBox()) || mapView.playingField;
890
+ var d = (borderPath.coordinates || []).reduce(function (d, lineString) {
891
+ return lineString.reduce(function (d, point, i) {
892
+ var x = point[0], y = point[1];
893
+ if (options.units === 'percent') {
894
+ x = chart.plotLeft + relativeLength(x + "%", field_1.width, field_1.x);
895
+ y = chart.plotTop + relativeLength(y + "%", field_1.height, field_1.y);
896
+ }
897
+ x = Math.floor(x) + crisp_1;
898
+ y = Math.floor(y) + crisp_1;
899
+ d.push(i === 0 ? ['M', x, y] : ['L', x, y]);
900
+ return d;
901
+ }, d);
902
+ }, []);
903
+ // Apply the border path
904
+ this.border[animate ? 'animate' : 'attr']({ d: d });
905
+ }
906
+ };
907
+ MapViewInset.prototype.destroy = function () {
908
+ if (this.border) {
909
+ this.border = this.border.destroy();
910
+ }
911
+ this.eventsToUnbind.forEach(function (f) { return f(); });
912
+ };
913
+ // No chart-level events for insets
914
+ MapViewInset.prototype.setUpEvents = function () { };
915
+ return MapViewInset;
916
+ }(MapView));
917
+ // Initialize the MapView after initialization, but before firstRender
918
+ addEvent(MapChart, 'afterInit', function () {
919
+ this.mapView = new MapView(this, this.options.mapView);
920
+ });
450
921
  export default MapView;