AreaRangeSeries.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. /* *
  2. *
  3. * (c) 2010-2021 Torstein Honsi
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * */
  10. 'use strict';
  11. 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. import AreaRangePoint from './AreaRangePoint.js';
  25. import AreaSeries from '../Area/AreaSeries.js';
  26. var areaProto = AreaSeries.prototype;
  27. import ColumnSeries from '../Column/ColumnSeries.js';
  28. var columnProto = ColumnSeries.prototype;
  29. import H from '../../Core/Globals.js';
  30. var noop = H.noop;
  31. import Series from '../../Core/Series/Series.js';
  32. var seriesProto = Series.prototype;
  33. import SeriesRegistry from '../../Core/Series/SeriesRegistry.js';
  34. import U from '../../Core/Utilities.js';
  35. var defined = U.defined, extend = U.extend, isArray = U.isArray, pick = U.pick, merge = U.merge;
  36. /* *
  37. *
  38. * Class
  39. *
  40. * */
  41. /**
  42. * The AreaRange series type.
  43. *
  44. * @private
  45. * @class
  46. * @name Highcharts.seriesTypes.arearange
  47. *
  48. * @augments Highcharts.Series
  49. */
  50. var AreaRangeSeries = /** @class */ (function (_super) {
  51. __extends(AreaRangeSeries, _super);
  52. function AreaRangeSeries() {
  53. /**
  54. *
  55. * Static properties
  56. *
  57. */
  58. var _this = _super !== null && _super.apply(this, arguments) || this;
  59. /* *
  60. *
  61. * Properties
  62. *
  63. * */
  64. _this.data = void 0;
  65. _this.options = void 0;
  66. _this.points = void 0;
  67. _this.lowerStateMarkerGraphic = void 0;
  68. _this.xAxis = void 0;
  69. return _this;
  70. /* eslint-enable valid-jsdoc */
  71. }
  72. /* *
  73. *
  74. * Functions
  75. *
  76. * */
  77. /* eslint-disable valid-jsdoc */
  78. AreaRangeSeries.prototype.toYData = function (point) {
  79. return [point.low, point.high];
  80. };
  81. /**
  82. * Translate a point's plotHigh from the internal angle and radius measures
  83. * to true plotHigh coordinates. This is an addition of the toXY method
  84. * found in Polar.js, because it runs too early for arearanges to be
  85. * considered (#3419).
  86. * @private
  87. */
  88. AreaRangeSeries.prototype.highToXY = function (point) {
  89. // Find the polar plotX and plotY
  90. var chart = this.chart, xy = this.xAxis.postTranslate(point.rectPlotX || 0, this.yAxis.len - point.plotHigh);
  91. point.plotHighX = xy.x - chart.plotLeft;
  92. point.plotHigh = xy.y - chart.plotTop;
  93. point.plotLowX = point.plotX;
  94. };
  95. /**
  96. * Translate data points from raw values x and y to plotX and plotY.
  97. * @private
  98. */
  99. AreaRangeSeries.prototype.translate = function () {
  100. var series = this, yAxis = series.yAxis, hasModifyValue = !!series.modifyValue;
  101. areaProto.translate.apply(series);
  102. // Set plotLow and plotHigh
  103. series.points.forEach(function (point) {
  104. var high = point.high, plotY = point.plotY;
  105. if (point.isNull) {
  106. point.plotY = null;
  107. }
  108. else {
  109. point.plotLow = plotY;
  110. point.plotHigh = yAxis.translate(hasModifyValue ?
  111. series.modifyValue(high, point) :
  112. high, 0, 1, 0, 1);
  113. if (hasModifyValue) {
  114. point.yBottom = point.plotHigh;
  115. }
  116. }
  117. });
  118. // Postprocess plotHigh
  119. if (this.chart.polar) {
  120. this.points.forEach(function (point) {
  121. series.highToXY(point);
  122. point.tooltipPos = [
  123. (point.plotHighX + point.plotLowX) / 2,
  124. (point.plotHigh + point.plotLow) / 2
  125. ];
  126. });
  127. }
  128. };
  129. /**
  130. * Extend the line series' getSegmentPath method by applying the segment
  131. * path to both lower and higher values of the range.
  132. * @private
  133. */
  134. AreaRangeSeries.prototype.getGraphPath = function (points) {
  135. var highPoints = [], highAreaPoints = [], i, getGraphPath = areaProto.getGraphPath, point, pointShim, linePath, lowerPath, options = this.options, polar = this.chart.polar, connectEnds = polar && options.connectEnds !== false, connectNulls = options.connectNulls, step = options.step, higherPath, higherAreaPath;
  136. points = points || this.points;
  137. // Create the top line and the top part of the area fill. The area fill
  138. // compensates for null points by drawing down to the lower graph,
  139. // moving across the null gap and starting again at the lower graph.
  140. i = points.length;
  141. while (i--) {
  142. point = points[i];
  143. // Support for polar
  144. var highAreaPoint = polar ? {
  145. plotX: point.rectPlotX,
  146. plotY: point.yBottom,
  147. doCurve: false // #5186, gaps in areasplinerange fill
  148. } : {
  149. plotX: point.plotX,
  150. plotY: point.plotY,
  151. doCurve: false // #5186, gaps in areasplinerange fill
  152. };
  153. if (!point.isNull &&
  154. !connectEnds &&
  155. !connectNulls &&
  156. (!points[i + 1] || points[i + 1].isNull)) {
  157. highAreaPoints.push(highAreaPoint);
  158. }
  159. pointShim = {
  160. polarPlotY: point.polarPlotY,
  161. rectPlotX: point.rectPlotX,
  162. yBottom: point.yBottom,
  163. // plotHighX is for polar charts
  164. plotX: pick(point.plotHighX, point.plotX),
  165. plotY: point.plotHigh,
  166. isNull: point.isNull
  167. };
  168. highAreaPoints.push(pointShim);
  169. highPoints.push(pointShim);
  170. if (!point.isNull &&
  171. !connectEnds &&
  172. !connectNulls &&
  173. (!points[i - 1] || points[i - 1].isNull)) {
  174. highAreaPoints.push(highAreaPoint);
  175. }
  176. }
  177. // Get the paths
  178. lowerPath = getGraphPath.call(this, points);
  179. if (step) {
  180. if (step === true) {
  181. step = 'left';
  182. }
  183. options.step = {
  184. left: 'right',
  185. center: 'center',
  186. right: 'left'
  187. }[step]; // swap for reading in getGraphPath
  188. }
  189. higherPath = getGraphPath.call(this, highPoints);
  190. higherAreaPath = getGraphPath.call(this, highAreaPoints);
  191. options.step = step;
  192. // Create a line on both top and bottom of the range
  193. linePath = []
  194. .concat(lowerPath, higherPath);
  195. // For the area path, we need to change the 'move' statement
  196. // into 'lineTo'
  197. if (!this.chart.polar && higherAreaPath[0] && higherAreaPath[0][0] === 'M') {
  198. // This probably doesn't work for spline
  199. higherAreaPath[0] = ['L', higherAreaPath[0][1], higherAreaPath[0][2]];
  200. }
  201. this.graphPath = linePath;
  202. this.areaPath = lowerPath.concat(higherAreaPath);
  203. // Prepare for sideways animation
  204. linePath.isArea = true;
  205. linePath.xMap = lowerPath.xMap;
  206. this.areaPath.xMap = lowerPath.xMap;
  207. return linePath;
  208. };
  209. /**
  210. * Extend the basic drawDataLabels method by running it for both lower and
  211. * higher values.
  212. * @private
  213. */
  214. AreaRangeSeries.prototype.drawDataLabels = function () {
  215. var data = this.points, length = data.length, i, originalDataLabels = [], dataLabelOptions = this.options.dataLabels, point, up, inverted = this.chart.inverted, upperDataLabelOptions, lowerDataLabelOptions;
  216. if (dataLabelOptions) {
  217. // Split into upper and lower options. If data labels is an array,
  218. // the first element is the upper label, the second is the lower.
  219. //
  220. // TODO: We want to change this and allow multiple labels for both
  221. // upper and lower values in the future - introducing some options
  222. // for which point value to use as Y for the dataLabel, so that
  223. // this could be handled in Series.drawDataLabels. This would also
  224. // improve performance since we now have to loop over all the
  225. // points multiple times to work around the data label logic.
  226. if (isArray(dataLabelOptions)) {
  227. upperDataLabelOptions = dataLabelOptions[0] || { enabled: false };
  228. lowerDataLabelOptions = dataLabelOptions[1] || { enabled: false };
  229. }
  230. else {
  231. // Make copies
  232. upperDataLabelOptions = extend({}, dataLabelOptions);
  233. upperDataLabelOptions.x = dataLabelOptions.xHigh;
  234. upperDataLabelOptions.y = dataLabelOptions.yHigh;
  235. lowerDataLabelOptions = extend({}, dataLabelOptions);
  236. lowerDataLabelOptions.x = dataLabelOptions.xLow;
  237. lowerDataLabelOptions.y = dataLabelOptions.yLow;
  238. }
  239. // Draw upper labels
  240. if (upperDataLabelOptions.enabled || this._hasPointLabels) {
  241. // Set preliminary values for plotY and dataLabel
  242. // and draw the upper labels
  243. i = length;
  244. while (i--) {
  245. point = data[i];
  246. if (point) {
  247. up = upperDataLabelOptions.inside ?
  248. point.plotHigh < point.plotLow :
  249. point.plotHigh > point.plotLow;
  250. point.y = point.high;
  251. point._plotY = point.plotY;
  252. point.plotY = point.plotHigh;
  253. // Store original data labels and set preliminary label
  254. // objects to be picked up in the uber method
  255. originalDataLabels[i] = point.dataLabel;
  256. point.dataLabel = point.dataLabelUpper;
  257. // Set the default offset
  258. point.below = up;
  259. if (inverted) {
  260. if (!upperDataLabelOptions.align) {
  261. upperDataLabelOptions.align = up ? 'right' : 'left';
  262. }
  263. }
  264. else {
  265. if (!upperDataLabelOptions.verticalAlign) {
  266. upperDataLabelOptions.verticalAlign = up ?
  267. 'top' :
  268. 'bottom';
  269. }
  270. }
  271. }
  272. }
  273. this.options.dataLabels = upperDataLabelOptions;
  274. if (seriesProto.drawDataLabels) {
  275. // #1209:
  276. seriesProto.drawDataLabels.apply(this, arguments);
  277. }
  278. // Reset state after the upper labels were created. Move
  279. // it to point.dataLabelUpper and reassign the originals.
  280. // We do this here to support not drawing a lower label.
  281. i = length;
  282. while (i--) {
  283. point = data[i];
  284. if (point) {
  285. point.dataLabelUpper = point.dataLabel;
  286. point.dataLabel = originalDataLabels[i];
  287. delete point.dataLabels;
  288. point.y = point.low;
  289. point.plotY = point._plotY;
  290. }
  291. }
  292. }
  293. // Draw lower labels
  294. if (lowerDataLabelOptions.enabled || this._hasPointLabels) {
  295. i = length;
  296. while (i--) {
  297. point = data[i];
  298. if (point) {
  299. up = lowerDataLabelOptions.inside ?
  300. point.plotHigh < point.plotLow :
  301. point.plotHigh > point.plotLow;
  302. // Set the default offset
  303. point.below = !up;
  304. if (inverted) {
  305. if (!lowerDataLabelOptions.align) {
  306. lowerDataLabelOptions.align = up ? 'left' : 'right';
  307. }
  308. }
  309. else {
  310. if (!lowerDataLabelOptions.verticalAlign) {
  311. lowerDataLabelOptions.verticalAlign = up ?
  312. 'bottom' :
  313. 'top';
  314. }
  315. }
  316. }
  317. }
  318. this.options.dataLabels = lowerDataLabelOptions;
  319. if (seriesProto.drawDataLabels) {
  320. seriesProto.drawDataLabels.apply(this, arguments);
  321. }
  322. }
  323. // Merge upper and lower into point.dataLabels for later destroying
  324. if (upperDataLabelOptions.enabled) {
  325. i = length;
  326. while (i--) {
  327. point = data[i];
  328. if (point) {
  329. point.dataLabels = [
  330. point.dataLabelUpper,
  331. point.dataLabel
  332. ].filter(function (label) {
  333. return !!label;
  334. });
  335. }
  336. }
  337. }
  338. // Reset options
  339. this.options.dataLabels = dataLabelOptions;
  340. }
  341. };
  342. AreaRangeSeries.prototype.alignDataLabel = function () {
  343. columnProto.alignDataLabel.apply(this, arguments);
  344. };
  345. AreaRangeSeries.prototype.drawPoints = function () {
  346. var series = this, pointLength = series.points.length, point, i;
  347. // Draw bottom points
  348. seriesProto.drawPoints.apply(series, arguments);
  349. // Prepare drawing top points
  350. i = 0;
  351. while (i < pointLength) {
  352. point = series.points[i];
  353. // Save original props to be overridden by temporary props for top
  354. // points
  355. point.origProps = {
  356. plotY: point.plotY,
  357. plotX: point.plotX,
  358. isInside: point.isInside,
  359. negative: point.negative,
  360. zone: point.zone,
  361. y: point.y
  362. };
  363. point.lowerGraphic = point.graphic;
  364. point.graphic = point.upperGraphic;
  365. point.plotY = point.plotHigh;
  366. if (defined(point.plotHighX)) {
  367. point.plotX = point.plotHighX;
  368. }
  369. point.y = pick(point.high, point.origProps.y); // #15523
  370. point.negative = point.y < (series.options.threshold || 0);
  371. if (series.zones.length) {
  372. point.zone = point.getZone();
  373. }
  374. if (!series.chart.polar) {
  375. point.isInside = point.isTopInside = (typeof point.plotY !== 'undefined' &&
  376. point.plotY >= 0 &&
  377. point.plotY <= series.yAxis.len && // #3519
  378. point.plotX >= 0 &&
  379. point.plotX <= series.xAxis.len);
  380. }
  381. i++;
  382. }
  383. // Draw top points
  384. seriesProto.drawPoints.apply(series, arguments);
  385. // Reset top points preliminary modifications
  386. i = 0;
  387. while (i < pointLength) {
  388. point = series.points[i];
  389. point.upperGraphic = point.graphic;
  390. point.graphic = point.lowerGraphic;
  391. if (point.origProps) {
  392. extend(point, point.origProps);
  393. delete point.origProps;
  394. }
  395. i++;
  396. }
  397. };
  398. /**
  399. * The area range series is a carteseian series with higher and lower
  400. * values for each point along an X axis, where the area between the
  401. * values is shaded.
  402. *
  403. * @sample {highcharts} highcharts/demo/arearange/
  404. * Area range chart
  405. * @sample {highstock} stock/demo/arearange/
  406. * Area range chart
  407. *
  408. * @extends plotOptions.area
  409. * @product highcharts highstock
  410. * @excluding stack, stacking
  411. * @requires highcharts-more
  412. * @optionparent plotOptions.arearange
  413. */
  414. AreaRangeSeries.defaultOptions = merge(AreaSeries.defaultOptions, {
  415. /**
  416. * @see [fillColor](#plotOptions.arearange.fillColor)
  417. * @see [fillOpacity](#plotOptions.arearange.fillOpacity)
  418. *
  419. * @apioption plotOptions.arearange.color
  420. */
  421. /**
  422. * @default low
  423. * @apioption plotOptions.arearange.colorKey
  424. */
  425. /**
  426. * @see [color](#plotOptions.arearange.color)
  427. * @see [fillOpacity](#plotOptions.arearange.fillOpacity)
  428. *
  429. * @apioption plotOptions.arearange.fillColor
  430. */
  431. /**
  432. * @see [color](#plotOptions.arearange.color)
  433. * @see [fillColor](#plotOptions.arearange.fillColor)
  434. *
  435. * @default {highcharts} 0.75
  436. * @default {highstock} 0.75
  437. * @apioption plotOptions.arearange.fillOpacity
  438. */
  439. /**
  440. * Whether to apply a drop shadow to the graph line. Since 2.3 the
  441. * shadow can be an object configuration containing `color`, `offsetX`,
  442. * `offsetY`, `opacity` and `width`.
  443. *
  444. * @type {boolean|Highcharts.ShadowOptionsObject}
  445. * @product highcharts
  446. * @apioption plotOptions.arearange.shadow
  447. */
  448. /**
  449. * Pixel width of the arearange graph line.
  450. *
  451. * @since 2.3.0
  452. *
  453. * @private
  454. */
  455. lineWidth: 1,
  456. threshold: null,
  457. tooltip: {
  458. pointFormat: '<span style="color:{series.color}">\u25CF</span> ' +
  459. '{series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'
  460. },
  461. /**
  462. * Whether the whole area or just the line should respond to mouseover
  463. * tooltips and other mouse or touch events.
  464. *
  465. * @since 2.3.0
  466. *
  467. * @private
  468. */
  469. trackByArea: true,
  470. /**
  471. * Extended data labels for range series types. Range series data
  472. * labels use no `x` and `y` options. Instead, they have `xLow`,
  473. * `xHigh`, `yLow` and `yHigh` options to allow the higher and lower
  474. * data label sets individually.
  475. *
  476. * @declare Highcharts.SeriesAreaRangeDataLabelsOptionsObject
  477. * @exclude x, y
  478. * @since 2.3.0
  479. * @product highcharts highstock
  480. *
  481. * @private
  482. */
  483. dataLabels: {
  484. align: void 0,
  485. verticalAlign: void 0,
  486. /**
  487. * X offset of the lower data labels relative to the point value.
  488. *
  489. * @sample highcharts/plotoptions/arearange-datalabels/
  490. * Data labels on range series
  491. * @sample highcharts/plotoptions/arearange-datalabels/
  492. * Data labels on range series
  493. */
  494. xLow: 0,
  495. /**
  496. * X offset of the higher data labels relative to the point value.
  497. *
  498. * @sample highcharts/plotoptions/arearange-datalabels/
  499. * Data labels on range series
  500. */
  501. xHigh: 0,
  502. /**
  503. * Y offset of the lower data labels relative to the point value.
  504. *
  505. * @sample highcharts/plotoptions/arearange-datalabels/
  506. * Data labels on range series
  507. */
  508. yLow: 0,
  509. /**
  510. * Y offset of the higher data labels relative to the point value.
  511. *
  512. * @sample highcharts/plotoptions/arearange-datalabels/
  513. * Data labels on range series
  514. */
  515. yHigh: 0
  516. }
  517. });
  518. return AreaRangeSeries;
  519. }(AreaSeries));
  520. extend(AreaRangeSeries.prototype, {
  521. pointArrayMap: ['low', 'high'],
  522. pointValKey: 'low',
  523. deferTranslatePolar: true,
  524. pointClass: AreaRangePoint,
  525. setStackedPoints: noop
  526. });
  527. SeriesRegistry.registerSeriesType('arearange', AreaRangeSeries);
  528. /* *
  529. *
  530. * Default export
  531. *
  532. * */
  533. export default AreaRangeSeries;
  534. /**
  535. * A `arearange` series. If the [type](#series.arearange.type) option is not
  536. * specified, it is inherited from [chart.type](#chart.type).
  537. *
  538. *
  539. * @extends series,plotOptions.arearange
  540. * @excluding dataParser, dataURL, stack, stacking
  541. * @product highcharts highstock
  542. * @requires highcharts-more
  543. * @apioption series.arearange
  544. */
  545. /**
  546. * @see [fillColor](#series.arearange.fillColor)
  547. * @see [fillOpacity](#series.arearange.fillOpacity)
  548. *
  549. * @apioption series.arearange.color
  550. */
  551. /**
  552. * An array of data points for the series. For the `arearange` series type,
  553. * points can be given in the following ways:
  554. *
  555. * 1. An array of arrays with 3 or 2 values. In this case, the values
  556. * correspond to `x,low,high`. If the first value is a string, it is
  557. * applied as the name of the point, and the `x` value is inferred.
  558. * The `x` value can also be omitted, in which case the inner arrays
  559. * should be of length 2\. Then the `x` value is automatically calculated,
  560. * either starting at 0 and incremented by 1, or from `pointStart`
  561. * and `pointInterval` given in the series options.
  562. * ```js
  563. * data: [
  564. * [0, 8, 3],
  565. * [1, 1, 1],
  566. * [2, 6, 8]
  567. * ]
  568. * ```
  569. *
  570. * 2. An array of objects with named values. The following snippet shows only a
  571. * few settings, see the complete options set below. If the total number of
  572. * data points exceeds the series'
  573. * [turboThreshold](#series.arearange.turboThreshold),
  574. * this option is not available.
  575. * ```js
  576. * data: [{
  577. * x: 1,
  578. * low: 9,
  579. * high: 0,
  580. * name: "Point2",
  581. * color: "#00FF00"
  582. * }, {
  583. * x: 1,
  584. * low: 3,
  585. * high: 4,
  586. * name: "Point1",
  587. * color: "#FF00FF"
  588. * }]
  589. * ```
  590. *
  591. * @sample {highcharts} highcharts/series/data-array-of-arrays/
  592. * Arrays of numeric x and y
  593. * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/
  594. * Arrays of datetime x and y
  595. * @sample {highcharts} highcharts/series/data-array-of-name-value/
  596. * Arrays of point.name and y
  597. * @sample {highcharts} highcharts/series/data-array-of-objects/
  598. * Config objects
  599. *
  600. * @type {Array<Array<(number|string),number>|Array<(number|string),number,number>|*>}
  601. * @extends series.line.data
  602. * @excluding marker, y
  603. * @product highcharts highstock
  604. * @apioption series.arearange.data
  605. */
  606. /**
  607. * @extends series.arearange.dataLabels
  608. * @product highcharts highstock
  609. * @apioption series.arearange.data.dataLabels
  610. */
  611. /**
  612. * @see [color](#series.arearange.color)
  613. * @see [fillOpacity](#series.arearange.fillOpacity)
  614. *
  615. * @apioption series.arearange.fillColor
  616. */
  617. /**
  618. * @see [color](#series.arearange.color)
  619. * @see [fillColor](#series.arearange.fillColor)
  620. *
  621. * @default {highcharts} 0.75
  622. * @default {highstock} 0.75
  623. * @apioption series.arearange.fillOpacity
  624. */
  625. /**
  626. * The high or maximum value for each data point.
  627. *
  628. * @type {number}
  629. * @product highcharts highstock
  630. * @apioption series.arearange.data.high
  631. */
  632. /**
  633. * The low or minimum value for each data point.
  634. *
  635. * @type {number}
  636. * @product highcharts highstock
  637. * @apioption series.arearange.data.low
  638. */
  639. ''; // adds doclets above to tranpiled file