@elliemae/ds-dataviz 3.8.1 → 3.9.0-next.1

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 (164) hide show
  1. package/dist/cjs/graphs/Chart/Chart.js.map +2 -2
  2. package/dist/cjs/graphs/Chart/ChartContext.js +3 -1
  3. package/dist/cjs/graphs/Chart/ChartContext.js.map +2 -2
  4. package/dist/cjs/graphs/Chart/config/useChart.js +86 -33
  5. package/dist/cjs/graphs/Chart/config/useChart.js.map +3 -3
  6. package/dist/cjs/graphs/Chart/config/useInternalMargins.js +103 -0
  7. package/dist/cjs/graphs/Chart/config/useInternalMargins.js.map +7 -0
  8. package/dist/cjs/graphs/Chart/config/useKeyboardNavigation.js +25 -15
  9. package/dist/cjs/graphs/Chart/config/useKeyboardNavigation.js.map +2 -2
  10. package/dist/cjs/graphs/Chart/config/useScales.js +43 -17
  11. package/dist/cjs/graphs/Chart/config/useScales.js.map +2 -2
  12. package/dist/cjs/graphs/Chart/helpers/index.js +9 -13
  13. package/dist/cjs/graphs/Chart/helpers/index.js.map +2 -2
  14. package/dist/cjs/graphs/Chart/parts/ActivePoint.js +1 -1
  15. package/dist/cjs/graphs/Chart/parts/ActivePoint.js.map +2 -2
  16. package/dist/cjs/graphs/Chart/parts/Axis/AxisBottom.js +17 -25
  17. package/dist/cjs/graphs/Chart/parts/Axis/AxisBottom.js.map +3 -3
  18. package/dist/cjs/graphs/Chart/parts/Axis/AxisLeft.js +33 -38
  19. package/dist/cjs/graphs/Chart/parts/Axis/AxisLeft.js.map +2 -2
  20. package/dist/cjs/graphs/Chart/parts/Axis/AxisRight.js +6 -11
  21. package/dist/cjs/graphs/Chart/parts/Axis/AxisRight.js.map +2 -2
  22. package/dist/cjs/graphs/Chart/parts/ChartContainer.js +65 -16
  23. package/dist/cjs/graphs/Chart/parts/ChartContainer.js.map +2 -2
  24. package/dist/cjs/graphs/Chart/parts/FocusableRegion.js +17 -68
  25. package/dist/cjs/graphs/Chart/parts/FocusableRegion.js.map +2 -2
  26. package/dist/cjs/graphs/Chart/{series/Pie.js → parts/Labels/BottomLabel.js} +20 -12
  27. package/dist/cjs/graphs/Chart/parts/Labels/BottomLabel.js.map +7 -0
  28. package/dist/cjs/graphs/Chart/parts/Labels/Label.js +52 -0
  29. package/dist/cjs/graphs/Chart/parts/Labels/Label.js.map +7 -0
  30. package/dist/cjs/graphs/Chart/parts/Labels/LeftLabel.js +61 -0
  31. package/dist/cjs/graphs/Chart/parts/Labels/LeftLabel.js.map +7 -0
  32. package/dist/cjs/graphs/Chart/parts/Labels/RightLabel.js +65 -0
  33. package/dist/cjs/graphs/Chart/parts/Labels/RightLabel.js.map +7 -0
  34. package/dist/cjs/graphs/Chart/parts/Legend/BottomLegend.js +28 -30
  35. package/dist/cjs/graphs/Chart/parts/Legend/BottomLegend.js.map +2 -2
  36. package/dist/cjs/graphs/Chart/parts/Legend/LeftLegend.js +14 -19
  37. package/dist/cjs/graphs/Chart/parts/Legend/LeftLegend.js.map +2 -2
  38. package/dist/cjs/graphs/Chart/parts/Legend/LegendItem.js +100 -0
  39. package/dist/cjs/graphs/Chart/parts/Legend/LegendItem.js.map +7 -0
  40. package/dist/cjs/graphs/Chart/parts/Legend/RightLegend.js +31 -25
  41. package/dist/cjs/graphs/Chart/parts/Legend/RightLegend.js.map +2 -2
  42. package/dist/cjs/graphs/Chart/parts/Legend/TopLegend.js +3 -13
  43. package/dist/cjs/graphs/Chart/parts/Legend/TopLegend.js.map +2 -2
  44. package/dist/cjs/graphs/Chart/parts/Scrapper/Scrapper.js +50 -16
  45. package/dist/cjs/graphs/Chart/parts/Scrapper/Scrapper.js.map +2 -2
  46. package/dist/cjs/graphs/Chart/parts/Scrapper/ScrapperLine.js +3 -1
  47. package/dist/cjs/graphs/Chart/parts/Scrapper/ScrapperLine.js.map +2 -2
  48. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapper.js +39 -17
  49. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapper.js.map +2 -2
  50. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js +29 -28
  51. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js.map +2 -2
  52. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollBarX.js.map +2 -2
  53. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollableContainerX.js +2 -2
  54. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollableContainerX.js.map +2 -2
  55. package/dist/cjs/graphs/Chart/parts/SeriesFactory.js +57 -41
  56. package/dist/cjs/graphs/Chart/parts/SeriesFactory.js.map +2 -2
  57. package/dist/cjs/graphs/Chart/react-desc-prop-types.js +1 -12
  58. package/dist/cjs/graphs/Chart/react-desc-prop-types.js.map +2 -2
  59. package/dist/cjs/graphs/Chart/series/Bars.js +29 -27
  60. package/dist/cjs/graphs/Chart/series/Bars.js.map +2 -2
  61. package/dist/cjs/graphs/Chart/series/HorizontalBars.js +85 -0
  62. package/dist/cjs/graphs/Chart/series/HorizontalBars.js.map +7 -0
  63. package/dist/cjs/graphs/Chart/series/HorizontalStackedBars.js +77 -0
  64. package/dist/cjs/graphs/Chart/series/HorizontalStackedBars.js.map +7 -0
  65. package/dist/cjs/graphs/Chart/series/Line.js +23 -19
  66. package/dist/cjs/graphs/Chart/series/Line.js.map +2 -2
  67. package/dist/cjs/graphs/Chart/series/Point.js +88 -18
  68. package/dist/cjs/graphs/Chart/series/Point.js.map +2 -2
  69. package/dist/cjs/graphs/Chart/series/Points.js +23 -27
  70. package/dist/cjs/graphs/Chart/series/Points.js.map +2 -2
  71. package/dist/cjs/graphs/Chart/series/Rect.js +105 -8
  72. package/dist/cjs/graphs/Chart/series/Rect.js.map +2 -2
  73. package/dist/cjs/graphs/Chart/series/StackedBar.js +23 -30
  74. package/dist/cjs/graphs/Chart/series/StackedBar.js.map +2 -2
  75. package/dist/cjs/graphs/Chart/series/index.js +0 -1
  76. package/dist/cjs/graphs/Chart/series/index.js.map +2 -2
  77. package/dist/cjs/graphs/Chart/styles.js +5 -20
  78. package/dist/cjs/graphs/Chart/styles.js.map +2 -2
  79. package/dist/cjs/graphs/constants.js +20 -0
  80. package/dist/cjs/graphs/constants.js.map +2 -2
  81. package/dist/esm/graphs/Chart/Chart.js.map +2 -2
  82. package/dist/esm/graphs/Chart/ChartContext.js +3 -1
  83. package/dist/esm/graphs/Chart/ChartContext.js.map +2 -2
  84. package/dist/esm/graphs/Chart/config/useChart.js +87 -34
  85. package/dist/esm/graphs/Chart/config/useChart.js.map +2 -2
  86. package/dist/esm/graphs/Chart/config/useInternalMargins.js +77 -0
  87. package/dist/esm/graphs/Chart/config/useInternalMargins.js.map +7 -0
  88. package/dist/esm/graphs/Chart/config/useKeyboardNavigation.js +26 -16
  89. package/dist/esm/graphs/Chart/config/useKeyboardNavigation.js.map +2 -2
  90. package/dist/esm/graphs/Chart/config/useScales.js +44 -18
  91. package/dist/esm/graphs/Chart/config/useScales.js.map +2 -2
  92. package/dist/esm/graphs/Chart/helpers/index.js +10 -14
  93. package/dist/esm/graphs/Chart/helpers/index.js.map +2 -2
  94. package/dist/esm/graphs/Chart/parts/ActivePoint.js +1 -1
  95. package/dist/esm/graphs/Chart/parts/ActivePoint.js.map +2 -2
  96. package/dist/esm/graphs/Chart/parts/Axis/AxisBottom.js +18 -26
  97. package/dist/esm/graphs/Chart/parts/Axis/AxisBottom.js.map +3 -3
  98. package/dist/esm/graphs/Chart/parts/Axis/AxisLeft.js +34 -39
  99. package/dist/esm/graphs/Chart/parts/Axis/AxisLeft.js.map +2 -2
  100. package/dist/esm/graphs/Chart/parts/Axis/AxisRight.js +6 -11
  101. package/dist/esm/graphs/Chart/parts/Axis/AxisRight.js.map +2 -2
  102. package/dist/esm/graphs/Chart/parts/ChartContainer.js +66 -17
  103. package/dist/esm/graphs/Chart/parts/ChartContainer.js.map +2 -2
  104. package/dist/esm/graphs/Chart/parts/FocusableRegion.js +18 -69
  105. package/dist/esm/graphs/Chart/parts/FocusableRegion.js.map +2 -2
  106. package/dist/esm/graphs/Chart/parts/Labels/BottomLabel.js +28 -0
  107. package/dist/esm/graphs/Chart/parts/Labels/BottomLabel.js.map +7 -0
  108. package/dist/esm/graphs/Chart/parts/Labels/Label.js +26 -0
  109. package/dist/esm/graphs/Chart/parts/Labels/Label.js.map +7 -0
  110. package/dist/esm/graphs/Chart/parts/Labels/LeftLabel.js +35 -0
  111. package/dist/esm/graphs/Chart/parts/Labels/LeftLabel.js.map +7 -0
  112. package/dist/esm/graphs/Chart/parts/Labels/RightLabel.js +39 -0
  113. package/dist/esm/graphs/Chart/parts/Labels/RightLabel.js.map +7 -0
  114. package/dist/esm/graphs/Chart/parts/Legend/BottomLegend.js +28 -30
  115. package/dist/esm/graphs/Chart/parts/Legend/BottomLegend.js.map +2 -2
  116. package/dist/esm/graphs/Chart/parts/Legend/LeftLegend.js +16 -21
  117. package/dist/esm/graphs/Chart/parts/Legend/LeftLegend.js.map +2 -2
  118. package/dist/esm/graphs/Chart/parts/Legend/LegendItem.js +74 -0
  119. package/dist/esm/graphs/Chart/parts/Legend/LegendItem.js.map +7 -0
  120. package/dist/esm/graphs/Chart/parts/Legend/RightLegend.js +32 -26
  121. package/dist/esm/graphs/Chart/parts/Legend/RightLegend.js.map +2 -2
  122. package/dist/esm/graphs/Chart/parts/Legend/TopLegend.js +3 -13
  123. package/dist/esm/graphs/Chart/parts/Legend/TopLegend.js.map +2 -2
  124. package/dist/esm/graphs/Chart/parts/Scrapper/Scrapper.js +51 -17
  125. package/dist/esm/graphs/Chart/parts/Scrapper/Scrapper.js.map +2 -2
  126. package/dist/esm/graphs/Chart/parts/Scrapper/ScrapperLine.js +3 -1
  127. package/dist/esm/graphs/Chart/parts/Scrapper/ScrapperLine.js.map +2 -2
  128. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapper.js +39 -17
  129. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapper.js.map +2 -2
  130. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js +29 -28
  131. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js.map +2 -2
  132. package/dist/esm/graphs/Chart/parts/Scroller/ScrollBarX.js.map +2 -2
  133. package/dist/esm/graphs/Chart/parts/Scroller/ScrollableContainerX.js +2 -2
  134. package/dist/esm/graphs/Chart/parts/Scroller/ScrollableContainerX.js.map +2 -2
  135. package/dist/esm/graphs/Chart/parts/SeriesFactory.js +58 -42
  136. package/dist/esm/graphs/Chart/parts/SeriesFactory.js.map +2 -2
  137. package/dist/esm/graphs/Chart/react-desc-prop-types.js +1 -12
  138. package/dist/esm/graphs/Chart/react-desc-prop-types.js.map +2 -2
  139. package/dist/esm/graphs/Chart/series/Bars.js +30 -28
  140. package/dist/esm/graphs/Chart/series/Bars.js.map +2 -2
  141. package/dist/esm/graphs/Chart/series/HorizontalBars.js +59 -0
  142. package/dist/esm/graphs/Chart/series/HorizontalBars.js.map +7 -0
  143. package/dist/esm/graphs/Chart/series/HorizontalStackedBars.js +51 -0
  144. package/dist/esm/graphs/Chart/series/HorizontalStackedBars.js.map +7 -0
  145. package/dist/esm/graphs/Chart/series/Line.js +25 -21
  146. package/dist/esm/graphs/Chart/series/Line.js.map +2 -2
  147. package/dist/esm/graphs/Chart/series/Point.js +89 -19
  148. package/dist/esm/graphs/Chart/series/Point.js.map +2 -2
  149. package/dist/esm/graphs/Chart/series/Points.js +24 -28
  150. package/dist/esm/graphs/Chart/series/Points.js.map +2 -2
  151. package/dist/esm/graphs/Chart/series/Rect.js +106 -9
  152. package/dist/esm/graphs/Chart/series/Rect.js.map +2 -2
  153. package/dist/esm/graphs/Chart/series/StackedBar.js +24 -31
  154. package/dist/esm/graphs/Chart/series/StackedBar.js.map +2 -2
  155. package/dist/esm/graphs/Chart/series/index.js +0 -1
  156. package/dist/esm/graphs/Chart/series/index.js.map +2 -2
  157. package/dist/esm/graphs/Chart/styles.js +5 -20
  158. package/dist/esm/graphs/Chart/styles.js.map +2 -2
  159. package/dist/esm/graphs/constants.js +20 -0
  160. package/dist/esm/graphs/constants.js.map +2 -2
  161. package/package.json +8 -8
  162. package/dist/cjs/graphs/Chart/series/Pie.js.map +0 -7
  163. package/dist/esm/graphs/Chart/series/Pie.js +0 -20
  164. package/dist/esm/graphs/Chart/series/Pie.js.map +0 -7
@@ -1,36 +1,70 @@
1
1
  import * as React from "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { useContext, useMemo } from "react";
3
+ import { useContext, useCallback, useMemo } from "react";
4
4
  import { ChartContext } from "../../ChartContext";
5
5
  import { ScrapperLine } from "./ScrapperLine";
6
6
  const Scrapper = () => {
7
7
  const {
8
8
  yScale,
9
9
  y2Scale,
10
- props: { xAxis, data }
10
+ xScale,
11
+ getXValue,
12
+ getYValue,
13
+ isHorizontal,
14
+ getBandwidth,
15
+ props: { data }
11
16
  } = useContext(ChartContext);
17
+ const getPosition = useCallback(
18
+ (datum, scale) => {
19
+ if (isHorizontal) {
20
+ return xScale(getXValue(datum));
21
+ }
22
+ if (scale === "y" || !scale) {
23
+ return yScale(getYValue(datum));
24
+ }
25
+ return y2Scale(getYValue(datum));
26
+ },
27
+ [getXValue, getYValue, isHorizontal, xScale, y2Scale, yScale]
28
+ );
29
+ const isBandAxis = !!yScale.bandwidth;
12
30
  const uniqueData = useMemo(() => {
13
- const valueToPositionPerSeries = data.map(
14
- (serie) => serie.data.map((datum, i) => ({
15
- position: serie.scale === "y" || !serie.scale ? yScale(datum.value) : y2Scale(datum.value),
16
- name: serie.name,
17
- xValue: xAxis.cols[i],
18
- yValue: datum.value
19
- }))
20
- ).flat(1);
21
- const postionUniqueData = {};
31
+ let valueToPositionPerSeries;
32
+ if (isBandAxis) {
33
+ valueToPositionPerSeries = data.map(
34
+ (serie) => serie.data.map((datum) => {
35
+ const x = getXValue(datum);
36
+ const y = getYValue(datum);
37
+ return {
38
+ position: yScale(y),
39
+ name: serie.name,
40
+ xValue: x,
41
+ yValue: y
42
+ };
43
+ })
44
+ ).flat(1);
45
+ } else {
46
+ valueToPositionPerSeries = data.map(
47
+ (serie) => serie.data.map((datum, i) => ({
48
+ position: getPosition(datum, serie.scale),
49
+ name: serie.name,
50
+ xValue: getXValue(datum),
51
+ yValue: getYValue(datum)
52
+ }))
53
+ ).flat(1);
54
+ }
55
+ const positionUniqueData = {};
22
56
  valueToPositionPerSeries.forEach((set) => {
23
- if (postionUniqueData[[set.position]]) {
24
- postionUniqueData[[set.position]] = [...postionUniqueData[[set.position]], { ...set }];
57
+ if (positionUniqueData[[set.position]]) {
58
+ positionUniqueData[[set.position]] = [...positionUniqueData[[set.position]], { ...set }];
25
59
  } else {
26
- postionUniqueData[[set.position]] = [{ ...set }];
60
+ positionUniqueData[[set.position]] = [{ ...set }];
27
61
  }
28
62
  });
29
- return postionUniqueData;
30
- }, [data, xAxis.cols, y2Scale, yScale]);
63
+ return positionUniqueData;
64
+ }, [data, getXValue, getYValue, y2Scale, yScale]);
31
65
  return /* @__PURE__ */ jsx("g", {
32
66
  children: Object.keys(uniqueData).map((key) => {
33
- const yPosition = parseFloat(key);
67
+ const yPosition = parseFloat(key) + (isBandAxis ? getBandwidth() / 2 : 0);
34
68
  const datum = uniqueData[key];
35
69
  return /* @__PURE__ */ jsx(ScrapperLine, {
36
70
  yPosition,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Scrapper/Scrapper.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\nimport { ScrapperLine } from './ScrapperLine';\nexport const Scrapper = () => {\n const {\n yScale,\n y2Scale,\n props: { xAxis, data },\n } = useContext(ChartContext);\n\n const uniqueData = useMemo(() => {\n const valueToPositionPerSeries = data\n .map((serie) =>\n serie.data.map((datum, i) => ({\n position: serie.scale === 'y' || !serie.scale ? yScale(datum.value) : y2Scale(datum.value),\n name: serie.name,\n xValue: xAxis.cols[i],\n yValue: datum.value,\n })),\n )\n .flat(1);\n\n const postionUniqueData = {};\n\n valueToPositionPerSeries.forEach((set) => {\n if (postionUniqueData[[set.position]]) {\n postionUniqueData[[set.position]] = [...postionUniqueData[[set.position]], { ...set }];\n } else {\n postionUniqueData[[set.position]] = [{ ...set }];\n }\n });\n\n return postionUniqueData;\n }, [data, xAxis.cols, y2Scale, yScale]);\n\n return (\n <g>\n {Object.keys(uniqueData).map((key) => {\n const yPosition = parseFloat(key);\n const datum = uniqueData[key];\n return <ScrapperLine key={key} yPosition={yPosition} datum={datum} />;\n })}\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AACtB,MAAM,WAAW,MAAM;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,KAAK;AAAA,EACvB,IAAI,WAAW,YAAY;AAE3B,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,2BAA2B,KAC9B;AAAA,MAAI,CAAC,UACJ,MAAM,KAAK,IAAI,CAAC,OAAO,OAAO;AAAA,QAC5B,UAAU,MAAM,UAAU,OAAO,CAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,QAAQ,MAAM,KAAK;AAAA,QACzF,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM,KAAK;AAAA,QACnB,QAAQ,MAAM;AAAA,MAChB,EAAE;AAAA,IACJ,EACC,KAAK,CAAC;AAET,UAAM,oBAAoB,CAAC;AAE3B,6BAAyB,QAAQ,CAAC,QAAQ;AACxC,UAAI,kBAAkB,CAAC,IAAI,QAAQ,IAAI;AACrC,0BAAkB,CAAC,IAAI,QAAQ,KAAK,CAAC,GAAG,kBAAkB,CAAC,IAAI,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC;AAAA,MACvF,OAAO;AACL,0BAAkB,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,MAAM,MAAM,SAAS,MAAM,CAAC;AAEtC,SACE,oBAAC;AAAA,IACE,iBAAO,KAAK,UAAU,EAAE,IAAI,CAAC,QAAQ;AACpC,YAAM,YAAY,WAAW,GAAG;AAChC,YAAM,QAAQ,WAAW;AACzB,aAAO,oBAAC;AAAA,QAAuB;AAAA,QAAsB;AAAA,SAA3B,GAAyC;AAAA,IACrE,CAAC;AAAA,GACH;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useCallback, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\nimport { ScrapperLine } from './ScrapperLine';\nexport const Scrapper = () => {\n const {\n yScale,\n y2Scale,\n xScale,\n getXValue,\n getYValue,\n isHorizontal,\n getBandwidth,\n props: { data },\n } = useContext(ChartContext);\n\n const getPosition = useCallback(\n (datum, scale) => {\n if (isHorizontal) {\n return xScale(getXValue(datum));\n }\n if (scale === 'y' || !scale) {\n return yScale(getYValue(datum));\n }\n return y2Scale(getYValue(datum));\n },\n [getXValue, getYValue, isHorizontal, xScale, y2Scale, yScale],\n );\n const isBandAxis = !!yScale.bandwidth;\n\n const uniqueData = useMemo(() => {\n let valueToPositionPerSeries;\n\n if (isBandAxis) {\n valueToPositionPerSeries = data\n .map((serie) =>\n serie.data.map((datum) => {\n const x = getXValue(datum);\n const y = getYValue(datum);\n return {\n position: yScale(y),\n name: serie.name,\n xValue: x,\n yValue: y,\n };\n }),\n )\n .flat(1);\n } else {\n valueToPositionPerSeries = data\n .map((serie) =>\n serie.data.map((datum, i) => ({\n position: getPosition(datum, serie.scale),\n name: serie.name,\n xValue: getXValue(datum),\n yValue: getYValue(datum),\n })),\n )\n .flat(1);\n }\n const positionUniqueData = {};\n\n valueToPositionPerSeries.forEach((set) => {\n if (positionUniqueData[[set.position]]) {\n positionUniqueData[[set.position]] = [...positionUniqueData[[set.position]], { ...set }];\n } else {\n positionUniqueData[[set.position]] = [{ ...set }];\n }\n });\n\n return positionUniqueData;\n }, [data, getXValue, getYValue, y2Scale, yScale]);\n\n return (\n <g>\n {Object.keys(uniqueData).map((key) => {\n const yPosition = parseFloat(key) + (isBandAxis ? getBandwidth() / 2 : 0);\n const datum = uniqueData[key];\n return <ScrapperLine key={key} yPosition={yPosition} datum={datum} />;\n })}\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,aAAa,eAAe;AACxD,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AACtB,MAAM,WAAW,MAAM;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,KAAK;AAAA,EAChB,IAAI,WAAW,YAAY;AAE3B,QAAM,cAAc;AAAA,IAClB,CAAC,OAAO,UAAU;AAChB,UAAI,cAAc;AAChB,eAAO,OAAO,UAAU,KAAK,CAAC;AAAA,MAChC;AACA,UAAI,UAAU,OAAO,CAAC,OAAO;AAC3B,eAAO,OAAO,UAAU,KAAK,CAAC;AAAA,MAChC;AACA,aAAO,QAAQ,UAAU,KAAK,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,WAAW,WAAW,cAAc,QAAQ,SAAS,MAAM;AAAA,EAC9D;AACA,QAAM,aAAa,CAAC,CAAC,OAAO;AAE5B,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI;AAEJ,QAAI,YAAY;AACd,iCAA2B,KACxB;AAAA,QAAI,CAAC,UACJ,MAAM,KAAK,IAAI,CAAC,UAAU;AACxB,gBAAM,IAAI,UAAU,KAAK;AACzB,gBAAM,IAAI,UAAU,KAAK;AACzB,iBAAO;AAAA,YACL,UAAU,OAAO,CAAC;AAAA,YAClB,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,EACC,KAAK,CAAC;AAAA,IACX,OAAO;AACL,iCAA2B,KACxB;AAAA,QAAI,CAAC,UACJ,MAAM,KAAK,IAAI,CAAC,OAAO,OAAO;AAAA,UAC5B,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UACxC,MAAM,MAAM;AAAA,UACZ,QAAQ,UAAU,KAAK;AAAA,UACvB,QAAQ,UAAU,KAAK;AAAA,QACzB,EAAE;AAAA,MACJ,EACC,KAAK,CAAC;AAAA,IACX;AACA,UAAM,qBAAqB,CAAC;AAE5B,6BAAyB,QAAQ,CAAC,QAAQ;AACxC,UAAI,mBAAmB,CAAC,IAAI,QAAQ,IAAI;AACtC,2BAAmB,CAAC,IAAI,QAAQ,KAAK,CAAC,GAAG,mBAAmB,CAAC,IAAI,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC;AAAA,MACzF,OAAO;AACL,2BAAmB,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;AAAA,MAClD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,WAAW,WAAW,SAAS,MAAM,CAAC;AAEhD,SACE,oBAAC;AAAA,IACE,iBAAO,KAAK,UAAU,EAAE,IAAI,CAAC,QAAQ;AACpC,YAAM,YAAY,WAAW,GAAG,KAAK,aAAa,aAAa,IAAI,IAAI;AACvE,YAAM,QAAQ,WAAW;AACzB,aAAO,oBAAC;AAAA,QAAuB;AAAA,QAAsB;AAAA,SAA3B,GAAyC;AAAA,IACrE,CAAC;AAAA,GACH;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -10,6 +10,7 @@ const ScrapperLine = ({ yPosition, datum }) => {
10
10
  scrapperPosY,
11
11
  setScrapperPosY,
12
12
  innerWidth,
13
+ yScale,
13
14
  props: { TooltipRenderer, scrapper }
14
15
  } = useContext(ChartContext);
15
16
  const theme = useContext(ThemeContext);
@@ -17,6 +18,7 @@ const ScrapperLine = ({ yPosition, datum }) => {
17
18
  const handleOnMouseEnter = useCallback(() => {
18
19
  setScrapperPosY(yPosition);
19
20
  }, [setScrapperPosY, yPosition]);
21
+ const strokeDetectorWidth = yScale.bandwidth ? yScale.bandwidth() : "4px";
20
22
  return /* @__PURE__ */ jsxs("g", {
21
23
  children: [
22
24
  scrapperPosY === yPosition ? /* @__PURE__ */ jsxs("g", {
@@ -63,7 +65,7 @@ const ScrapperLine = ({ yPosition, datum }) => {
63
65
  /* @__PURE__ */ jsx("line", {
64
66
  onMouseEnter: handleOnMouseEnter,
65
67
  x1: 0,
66
- strokeWidth: "4px",
68
+ strokeWidth: strokeDetectorWidth,
67
69
  stroke: "transparent",
68
70
  y1: yPosition,
69
71
  x2: innerWidth,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Scrapper/ScrapperLine.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useCallback, useState } from 'react';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { ThemeContext } from '@elliemae/ds-system';\nimport { ChartContext } from '../../ChartContext';\nimport { StyledMouseOverDetectionBox, StyledTooltipContainer } from '../../styles';\n\nexport const ScrapperLine = ({ yPosition, datum }) => {\n const {\n scrapperPosY,\n setScrapperPosY,\n innerWidth,\n props: { TooltipRenderer, scrapper },\n } = useContext(ChartContext);\n const theme = useContext(ThemeContext);\n const [referenceElement, setReferenceElement] = useState<React.SVGProps<SVGLineElement> | null>();\n\n const handleOnMouseEnter = useCallback(() => {\n setScrapperPosY(yPosition);\n }, [setScrapperPosY, yPosition]);\n\n return (\n <g>\n {scrapperPosY === yPosition ? (\n <g>\n {TooltipRenderer ? (\n <foreignObject>\n <DSPopperJS\n withoutAnimation\n withoutArrow\n customOffset={[0, 5]}\n referenceElement={referenceElement}\n showPopover\n zIndex={theme.zIndex.tooltip}\n // placementOrderPreference=\"\"\n startPlacementPreference={scrapper.tooltipPreference}\n >\n <StyledMouseOverDetectionBox />\n <StyledTooltipContainer>\n <TooltipRenderer data={datum} />\n </StyledTooltipContainer>\n </DSPopperJS>\n </foreignObject>\n ) : null}\n <line\n ref={setReferenceElement}\n x1={innerWidth}\n strokeWidth=\"2px\"\n stroke=\"transparent\"\n y1={yPosition}\n x2={innerWidth}\n y2={yPosition}\n />\n <line\n // ref={setReferenceElement}\n x1={0}\n strokeWidth=\"2px\"\n stroke=\"grey\"\n strokeDasharray={(4, 4)}\n y1={yPosition}\n x2={innerWidth}\n y2={yPosition}\n />\n </g>\n ) : null}\n <line\n onMouseEnter={handleOnMouseEnter}\n x1={0}\n strokeWidth=\"4px\"\n stroke=\"transparent\"\n y1={yPosition}\n x2={innerWidth}\n y2={yPosition}\n />\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,aAAa,gBAAgB;AACzD,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B,8BAA8B;AAE7D,MAAM,eAAe,CAAC,EAAE,WAAW,MAAM,MAAM;AACpD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,iBAAiB,SAAS;AAAA,EACrC,IAAI,WAAW,YAAY;AAC3B,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAgD;AAEhG,QAAM,qBAAqB,YAAY,MAAM;AAC3C,oBAAgB,SAAS;AAAA,EAC3B,GAAG,CAAC,iBAAiB,SAAS,CAAC;AAE/B,SACE,qBAAC;AAAA,IACE;AAAA,uBAAiB,YAChB,qBAAC;AAAA,QACE;AAAA,4BACC,oBAAC;AAAA,YACC,+BAAC;AAAA,cACC,kBAAgB;AAAA,cAChB,cAAY;AAAA,cACZ,cAAc,CAAC,GAAG,CAAC;AAAA,cACnB;AAAA,cACA,aAAW;AAAA,cACX,QAAQ,MAAM,OAAO;AAAA,cAErB,0BAA0B,SAAS;AAAA,cAEnC;AAAA,oCAAC,+BAA4B;AAAA,gBAC7B,oBAAC;AAAA,kBACC,8BAAC;AAAA,oBAAgB,MAAM;AAAA,mBAAO;AAAA,iBAChC;AAAA;AAAA,aACF;AAAA,WACF,IACE;AAAA,UACJ,oBAAC;AAAA,YACC,KAAK;AAAA,YACL,IAAI;AAAA,YACJ,aAAY;AAAA,YACZ,QAAO;AAAA,YACP,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,WACN;AAAA,UACA,oBAAC;AAAA,YAEC,IAAI;AAAA,YACJ,aAAY;AAAA,YACZ,QAAO;AAAA,YACP,kBAAkB,GAAG;AAAA,YACrB,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,WACN;AAAA;AAAA,OACF,IACE;AAAA,MACJ,oBAAC;AAAA,QACC,cAAc;AAAA,QACd,IAAI;AAAA,QACJ,aAAY;AAAA,QACZ,QAAO;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,OACN;AAAA;AAAA,GACF;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useCallback, useState } from 'react';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { ThemeContext } from '@elliemae/ds-system';\nimport { ChartContext } from '../../ChartContext';\nimport { StyledMouseOverDetectionBox, StyledTooltipContainer } from '../../styles';\n\nexport const ScrapperLine = ({ yPosition, datum }) => {\n const {\n scrapperPosY,\n setScrapperPosY,\n innerWidth,\n yScale,\n props: { TooltipRenderer, scrapper },\n } = useContext(ChartContext);\n const theme = useContext(ThemeContext);\n const [referenceElement, setReferenceElement] = useState<React.SVGProps<SVGLineElement> | null>();\n\n const handleOnMouseEnter = useCallback(() => {\n setScrapperPosY(yPosition);\n }, [setScrapperPosY, yPosition]);\n\n const strokeDetectorWidth = yScale.bandwidth ? yScale.bandwidth() : '4px';\n\n return (\n <g>\n {scrapperPosY === yPosition ? (\n <g>\n {TooltipRenderer ? (\n <foreignObject>\n <DSPopperJS\n withoutAnimation\n withoutArrow\n customOffset={[0, 5]}\n referenceElement={referenceElement}\n showPopover\n zIndex={theme.zIndex.tooltip}\n // placementOrderPreference=\"\"\n startPlacementPreference={scrapper.tooltipPreference}\n >\n <StyledMouseOverDetectionBox />\n <StyledTooltipContainer>\n <TooltipRenderer data={datum} />\n </StyledTooltipContainer>\n </DSPopperJS>\n </foreignObject>\n ) : null}\n <line\n ref={setReferenceElement}\n x1={innerWidth}\n strokeWidth=\"2px\"\n stroke=\"transparent\"\n y1={yPosition}\n x2={innerWidth}\n y2={yPosition}\n />\n <line\n // ref={setReferenceElement}\n x1={0}\n strokeWidth=\"2px\"\n stroke=\"grey\"\n strokeDasharray={(4, 4)}\n y1={yPosition}\n x2={innerWidth}\n y2={yPosition}\n />\n </g>\n ) : null}\n <line\n onMouseEnter={handleOnMouseEnter}\n x1={0}\n strokeWidth={strokeDetectorWidth}\n stroke=\"transparent\"\n y1={yPosition}\n x2={innerWidth}\n y2={yPosition}\n />\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,aAAa,gBAAgB;AACzD,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B,8BAA8B;AAE7D,MAAM,eAAe,CAAC,EAAE,WAAW,MAAM,MAAM;AACpD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,iBAAiB,SAAS;AAAA,EACrC,IAAI,WAAW,YAAY;AAC3B,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAgD;AAEhG,QAAM,qBAAqB,YAAY,MAAM;AAC3C,oBAAgB,SAAS;AAAA,EAC3B,GAAG,CAAC,iBAAiB,SAAS,CAAC;AAE/B,QAAM,sBAAsB,OAAO,YAAY,OAAO,UAAU,IAAI;AAEpE,SACE,qBAAC;AAAA,IACE;AAAA,uBAAiB,YAChB,qBAAC;AAAA,QACE;AAAA,4BACC,oBAAC;AAAA,YACC,+BAAC;AAAA,cACC,kBAAgB;AAAA,cAChB,cAAY;AAAA,cACZ,cAAc,CAAC,GAAG,CAAC;AAAA,cACnB;AAAA,cACA,aAAW;AAAA,cACX,QAAQ,MAAM,OAAO;AAAA,cAErB,0BAA0B,SAAS;AAAA,cAEnC;AAAA,oCAAC,+BAA4B;AAAA,gBAC7B,oBAAC;AAAA,kBACC,8BAAC;AAAA,oBAAgB,MAAM;AAAA,mBAAO;AAAA,iBAChC;AAAA;AAAA,aACF;AAAA,WACF,IACE;AAAA,UACJ,oBAAC;AAAA,YACC,KAAK;AAAA,YACL,IAAI;AAAA,YACJ,aAAY;AAAA,YACZ,QAAO;AAAA,YACP,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,WACN;AAAA,UACA,oBAAC;AAAA,YAEC,IAAI;AAAA,YACJ,aAAY;AAAA,YACZ,QAAO;AAAA,YACP,kBAAkB,GAAG;AAAA,YACrB,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,WACN;AAAA;AAAA,OACF,IACE;AAAA,MACJ,oBAAC;AAAA,QACC,cAAc;AAAA,QACd,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,QAAO;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,OACN;AAAA;AAAA,GACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -9,16 +9,27 @@ const VerticalScrapper = () => {
9
9
  getBandwidth,
10
10
  xScrollbarPosition,
11
11
  containerRatio,
12
+ getXValue,
13
+ getYValue,
12
14
  props: { xAxis, data }
13
15
  } = useContext(ChartContext);
16
+ function compare(a, b) {
17
+ if (a.xPosition < b.xPosition) {
18
+ return -1;
19
+ }
20
+ if (a.xPosition > b.xPosition) {
21
+ return 1;
22
+ }
23
+ return 0;
24
+ }
14
25
  const isBandAxis = !!xScale.bandwidth;
15
26
  const uniqueData = useMemo(() => {
16
27
  let valueToPositionPerSeries;
17
28
  if (isBandAxis) {
18
- valueToPositionPerSeries = data.map(
29
+ valueToPositionPerSeries = data.filter((serie) => !serie.isHidden).map(
19
30
  (serie) => serie.data.map((datum) => {
20
- const x = xAxis.cols ? xAxis.cols[datum.position] : datum.value.x;
21
- const y = typeof datum.value === "number" ? datum.value : datum.value.y;
31
+ const x = getXValue(datum);
32
+ const y = getYValue(datum);
22
33
  return {
23
34
  position: xScale(x),
24
35
  name: serie.name,
@@ -28,7 +39,7 @@ const VerticalScrapper = () => {
28
39
  })
29
40
  ).flat(1);
30
41
  } else {
31
- valueToPositionPerSeries = data.map(
42
+ valueToPositionPerSeries = data.filter((serie) => !serie.isHidden).map(
32
43
  (serie) => serie.data.filter((datum) => {
33
44
  const xScaleValue = xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x);
34
45
  return xScaleValue >= xScrollbarPosition * (containerRatio ?? 1) && xScaleValue < xScrollbarPosition * (containerRatio ?? 1) + innerWidth;
@@ -50,23 +61,34 @@ const VerticalScrapper = () => {
50
61
  postionUniqueData[[set.position]] = [{ ...set }];
51
62
  }
52
63
  });
53
- return postionUniqueData;
54
- }, [isBandAxis, data, xAxis.cols, xScale, xScrollbarPosition, containerRatio]);
55
- const lineWidth = parseFloat(innerWidth / Object.keys(uniqueData).length, 10);
64
+ const postionUniqueDataArray = Object.keys(postionUniqueData).map((key) => {
65
+ const xPosition = parseFloat(key) + (isBandAxis ? getBandwidth() / 2 : 0);
66
+ const datum = postionUniqueData[key];
67
+ return { xPosition, datum };
68
+ });
69
+ if (isBandAxis) {
70
+ return postionUniqueDataArray;
71
+ }
72
+ return postionUniqueDataArray.sort(compare).map((line, i, array) => {
73
+ const prevPoint = parseFloat(array[i - 1]?.xPosition ?? 0);
74
+ const postPoint = parseFloat(array[i + 1]?.xPosition ?? 0);
75
+ const rectDetector = {
76
+ left: (line.xPosition - prevPoint) / 2,
77
+ right: Math.abs((postPoint === 0 ? 0 : postPoint - line.xPosition) / 2)
78
+ };
79
+ return { ...line, rectDetector };
80
+ });
81
+ }, [isBandAxis, data, getXValue, getYValue, xScale, xAxis.cols, xScrollbarPosition, containerRatio, getBandwidth]);
56
82
  const render = useMemo(
57
83
  () => /* @__PURE__ */ jsx("g", {
58
84
  className: "vertical-scrapper",
59
- children: Object.keys(uniqueData).map((key, i) => {
60
- const xPosition = parseFloat(key) + (isBandAxis ? getBandwidth() / 2 : 0);
61
- const datum = uniqueData[key];
62
- return /* @__PURE__ */ jsx(VerticalScrapperLine, {
63
- lineWidth,
64
- xPosition,
65
- datum
66
- }, key);
67
- })
85
+ children: uniqueData.map((line) => /* @__PURE__ */ jsx(VerticalScrapperLine, {
86
+ rectDetector: line?.rectDetector,
87
+ xPosition: line.xPosition,
88
+ datum: line.datum
89
+ }, line.xPosition))
68
90
  }),
69
- [getBandwidth, isBandAxis, lineWidth, uniqueData]
91
+ [uniqueData]
70
92
  );
71
93
  return render;
72
94
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Scrapper/VerticalScrapper.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\nimport { VerticalScrapperLine } from './VerticalScrapperLine';\n\nexport const VerticalScrapper = () => {\n const {\n xScale,\n getBandwidth,\n xScrollbarPosition,\n containerRatio,\n props: { xAxis, data },\n } = useContext(ChartContext);\n\n const isBandAxis = !!xScale.bandwidth;\n const uniqueData = useMemo(() => {\n let valueToPositionPerSeries;\n if (isBandAxis) {\n valueToPositionPerSeries = data\n .map((serie) =>\n serie.data.map((datum) => {\n const x = xAxis.cols ? xAxis.cols[datum.position] : datum.value.x;\n const y = typeof datum.value === 'number' ? datum.value : datum.value.y;\n return {\n position: xScale(x),\n name: serie.name,\n xValue: x,\n yValue: y,\n };\n }),\n )\n .flat(1);\n } else {\n valueToPositionPerSeries = data\n .map((serie) =>\n serie.data\n .filter((datum) => {\n const xScaleValue = xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x);\n return (\n xScaleValue >= xScrollbarPosition * (containerRatio ?? 1) &&\n xScaleValue < xScrollbarPosition * (containerRatio ?? 1) + innerWidth\n );\n })\n .map((datum) => {\n return {\n position: xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x),\n name: serie.name,\n xValue: xAxis.cols ? xAxis.cols[datum.position] : datum.value.x,\n yValue: typeof datum.value === 'number' ? datum.value : datum.value.y,\n };\n }),\n )\n .flat(1);\n }\n const postionUniqueData = {};\n\n valueToPositionPerSeries.forEach((set) => {\n if (postionUniqueData[[set.position]]) {\n postionUniqueData[[set.position]] = [...postionUniqueData[[set.position]], { ...set }];\n } else {\n postionUniqueData[[set.position]] = [{ ...set }];\n }\n });\n\n return postionUniqueData;\n }, [isBandAxis, data, xAxis.cols, xScale, xScrollbarPosition, containerRatio]);\n\n const lineWidth = parseFloat(innerWidth / Object.keys(uniqueData).length, 10);\n\n const render = useMemo(\n () => (\n <g className=\"vertical-scrapper\">\n {Object.keys(uniqueData).map((key, i) => {\n const xPosition = parseFloat(key) + (isBandAxis ? getBandwidth() / 2 : 0);\n const datum = uniqueData[key];\n\n return <VerticalScrapperLine lineWidth={lineWidth} xPosition={xPosition} key={key} datum={datum} />;\n })}\n </g>\n ),\n\n [getBandwidth, isBandAxis, lineWidth, uniqueData],\n );\n\n return render;\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,oBAAoB;AAC7B,SAAS,4BAA4B;AAE9B,MAAM,mBAAmB,MAAM;AACpC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,KAAK;AAAA,EACvB,IAAI,WAAW,YAAY;AAE3B,QAAM,aAAa,CAAC,CAAC,OAAO;AAC5B,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI;AACJ,QAAI,YAAY;AACd,iCAA2B,KACxB;AAAA,QAAI,CAAC,UACJ,MAAM,KAAK,IAAI,CAAC,UAAU;AACxB,gBAAM,IAAI,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM;AAChE,gBAAM,IAAI,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,MAAM,MAAM;AACtE,iBAAO;AAAA,YACL,UAAU,OAAO,CAAC;AAAA,YAClB,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,EACC,KAAK,CAAC;AAAA,IACX,OAAO;AACL,iCAA2B,KACxB;AAAA,QAAI,CAAC,UACJ,MAAM,KACH,OAAO,CAAC,UAAU;AACjB,gBAAM,cAAc,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM,CAAC;AAClF,iBACE,eAAe,sBAAsB,kBAAkB,MACvD,cAAc,sBAAsB,kBAAkB,KAAK;AAAA,QAE/D,CAAC,EACA,IAAI,CAAC,UAAU;AACd,iBAAO;AAAA,YACL,UAAU,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,YACxE,MAAM,MAAM;AAAA,YACZ,QAAQ,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM;AAAA,YAC9D,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,MAAM,MAAM;AAAA,UACtE;AAAA,QACF,CAAC;AAAA,MACL,EACC,KAAK,CAAC;AAAA,IACX;AACA,UAAM,oBAAoB,CAAC;AAE3B,6BAAyB,QAAQ,CAAC,QAAQ;AACxC,UAAI,kBAAkB,CAAC,IAAI,QAAQ,IAAI;AACrC,0BAAkB,CAAC,IAAI,QAAQ,KAAK,CAAC,GAAG,kBAAkB,CAAC,IAAI,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC;AAAA,MACvF,OAAO;AACL,0BAAkB,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,MAAM,MAAM,MAAM,QAAQ,oBAAoB,cAAc,CAAC;AAE7E,QAAM,YAAY,WAAW,aAAa,OAAO,KAAK,UAAU,EAAE,QAAQ,EAAE;AAE5E,QAAM,SAAS;AAAA,IACb,MACE,oBAAC;AAAA,MAAE,WAAU;AAAA,MACV,iBAAO,KAAK,UAAU,EAAE,IAAI,CAAC,KAAK,MAAM;AACvC,cAAM,YAAY,WAAW,GAAG,KAAK,aAAa,aAAa,IAAI,IAAI;AACvE,cAAM,QAAQ,WAAW;AAEzB,eAAO,oBAAC;AAAA,UAAqB;AAAA,UAAsB;AAAA,UAAgC;AAAA,WAAL,GAAmB;AAAA,MACnG,CAAC;AAAA,KACH;AAAA,IAGF,CAAC,cAAc,YAAY,WAAW,UAAU;AAAA,EAClD;AAEA,SAAO;AACT;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\nimport { VerticalScrapperLine } from './VerticalScrapperLine';\n\nexport const VerticalScrapper = () => {\n const {\n xScale,\n getBandwidth,\n xScrollbarPosition,\n containerRatio,\n getXValue,\n getYValue,\n props: { xAxis, data },\n } = useContext(ChartContext);\n\n function compare(a, b) {\n if (a.xPosition < b.xPosition) {\n return -1;\n }\n if (a.xPosition > b.xPosition) {\n return 1;\n }\n return 0;\n }\n\n const isBandAxis = !!xScale.bandwidth;\n const uniqueData = useMemo(() => {\n let valueToPositionPerSeries;\n if (isBandAxis) {\n valueToPositionPerSeries = data\n .filter((serie) => !serie.isHidden)\n .map((serie) =>\n serie.data.map((datum) => {\n const x = getXValue(datum);\n const y = getYValue(datum);\n return {\n position: xScale(x),\n name: serie.name,\n xValue: x,\n yValue: y,\n };\n }),\n )\n .flat(1);\n } else {\n valueToPositionPerSeries = data\n .filter((serie) => !serie.isHidden)\n .map((serie) =>\n serie.data\n .filter((datum) => {\n const xScaleValue = xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x);\n return (\n xScaleValue >= xScrollbarPosition * (containerRatio ?? 1) &&\n xScaleValue < xScrollbarPosition * (containerRatio ?? 1) + innerWidth\n );\n })\n .map((datum) => {\n return {\n position: xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x),\n name: serie.name,\n xValue: xAxis.cols ? xAxis.cols[datum.position] : datum.value.x,\n yValue: typeof datum.value === 'number' ? datum.value : datum.value.y,\n };\n }),\n )\n .flat(1);\n }\n const postionUniqueData = {};\n\n // grouping points by xAxis position\n valueToPositionPerSeries.forEach((set) => {\n if (postionUniqueData[[set.position]]) {\n postionUniqueData[[set.position]] = [...postionUniqueData[[set.position]], { ...set }];\n } else {\n postionUniqueData[[set.position]] = [{ ...set }];\n }\n });\n\n const postionUniqueDataArray = Object.keys(postionUniqueData).map((key) => {\n const xPosition = parseFloat(key) + (isBandAxis ? getBandwidth() / 2 : 0);\n const datum = postionUniqueData[key];\n\n return { xPosition, datum };\n });\n\n if (isBandAxis) {\n return postionUniqueDataArray;\n }\n return postionUniqueDataArray.sort(compare).map((line, i, array) => {\n const prevPoint = parseFloat(array[i - 1]?.xPosition ?? 0);\n const postPoint = parseFloat(array[i + 1]?.xPosition ?? 0);\n\n const rectDetector = {\n left: (line.xPosition - prevPoint) / 2,\n right: Math.abs((postPoint === 0 ? 0 : postPoint - line.xPosition) / 2),\n };\n\n return { ...line, rectDetector };\n });\n }, [isBandAxis, data, getXValue, getYValue, xScale, xAxis.cols, xScrollbarPosition, containerRatio, getBandwidth]);\n\n const render = useMemo(\n () => (\n <g className=\"vertical-scrapper\">\n {uniqueData.map((line) => (\n <VerticalScrapperLine\n rectDetector={line?.rectDetector}\n xPosition={line.xPosition}\n key={line.xPosition}\n datum={line.datum}\n />\n ))}\n </g>\n ),\n\n [uniqueData],\n );\n\n return render;\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,oBAAoB;AAC7B,SAAS,4BAA4B;AAE9B,MAAM,mBAAmB,MAAM;AACpC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,KAAK;AAAA,EACvB,IAAI,WAAW,YAAY;AAE3B,WAAS,QAAQ,GAAG,GAAG;AACrB,QAAI,EAAE,YAAY,EAAE,WAAW;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,EAAE,YAAY,EAAE,WAAW;AAC7B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,CAAC,OAAO;AAC5B,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI;AACJ,QAAI,YAAY;AACd,iCAA2B,KACxB,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,EACjC;AAAA,QAAI,CAAC,UACJ,MAAM,KAAK,IAAI,CAAC,UAAU;AACxB,gBAAM,IAAI,UAAU,KAAK;AACzB,gBAAM,IAAI,UAAU,KAAK;AACzB,iBAAO;AAAA,YACL,UAAU,OAAO,CAAC;AAAA,YAClB,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,EACC,KAAK,CAAC;AAAA,IACX,OAAO;AACL,iCAA2B,KACxB,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,EACjC;AAAA,QAAI,CAAC,UACJ,MAAM,KACH,OAAO,CAAC,UAAU;AACjB,gBAAM,cAAc,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM,CAAC;AAClF,iBACE,eAAe,sBAAsB,kBAAkB,MACvD,cAAc,sBAAsB,kBAAkB,KAAK;AAAA,QAE/D,CAAC,EACA,IAAI,CAAC,UAAU;AACd,iBAAO;AAAA,YACL,UAAU,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,YACxE,MAAM,MAAM;AAAA,YACZ,QAAQ,MAAM,OAAO,MAAM,KAAK,MAAM,YAAY,MAAM,MAAM;AAAA,YAC9D,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,MAAM,MAAM;AAAA,UACtE;AAAA,QACF,CAAC;AAAA,MACL,EACC,KAAK,CAAC;AAAA,IACX;AACA,UAAM,oBAAoB,CAAC;AAG3B,6BAAyB,QAAQ,CAAC,QAAQ;AACxC,UAAI,kBAAkB,CAAC,IAAI,QAAQ,IAAI;AACrC,0BAAkB,CAAC,IAAI,QAAQ,KAAK,CAAC,GAAG,kBAAkB,CAAC,IAAI,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC;AAAA,MACvF,OAAO;AACL,0BAAkB,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAED,UAAM,yBAAyB,OAAO,KAAK,iBAAiB,EAAE,IAAI,CAAC,QAAQ;AACzE,YAAM,YAAY,WAAW,GAAG,KAAK,aAAa,aAAa,IAAI,IAAI;AACvE,YAAM,QAAQ,kBAAkB;AAEhC,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B,CAAC;AAED,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,WAAO,uBAAuB,KAAK,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU;AAClE,YAAM,YAAY,WAAW,MAAM,IAAI,IAAI,aAAa,CAAC;AACzD,YAAM,YAAY,WAAW,MAAM,IAAI,IAAI,aAAa,CAAC;AAEzD,YAAM,eAAe;AAAA,QACnB,OAAO,KAAK,YAAY,aAAa;AAAA,QACrC,OAAO,KAAK,KAAK,cAAc,IAAI,IAAI,YAAY,KAAK,aAAa,CAAC;AAAA,MACxE;AAEA,aAAO,EAAE,GAAG,MAAM,aAAa;AAAA,IACjC,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,MAAM,WAAW,WAAW,QAAQ,MAAM,MAAM,oBAAoB,gBAAgB,YAAY,CAAC;AAEjH,QAAM,SAAS;AAAA,IACb,MACE,oBAAC;AAAA,MAAE,WAAU;AAAA,MACV,qBAAW,IAAI,CAAC,SACf,oBAAC;AAAA,QACC,cAAc,MAAM;AAAA,QACpB,WAAW,KAAK;AAAA,QAEhB,OAAO,KAAK;AAAA,SADP,KAAK,SAEZ,CACD;AAAA,KACH;AAAA,IAGF,CAAC,UAAU;AAAA,EACb;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -5,13 +5,13 @@ import { DSPopperJS } from "@elliemae/ds-popperjs";
5
5
  import { ThemeContext } from "@elliemae/ds-system";
6
6
  import { ChartContext } from "../../ChartContext";
7
7
  import { StyledMouseOverDetectionBox, StyledTooltipContainer } from "../../styles";
8
- const VerticalScrapperLine = ({ lineWidth, xPosition, datum }) => {
8
+ const VerticalScrapperLine = ({ rectDetector, xPosition, datum }) => {
9
9
  const {
10
10
  scrapperPosX,
11
11
  setScrapperPosX,
12
12
  isGrabbed,
13
13
  xScale,
14
- innerWidth,
14
+ setActivePoint,
15
15
  innerHeight,
16
16
  props: { TooltipRenderer, scrapper }
17
17
  } = useContext(ChartContext);
@@ -21,10 +21,10 @@ const VerticalScrapperLine = ({ lineWidth, xPosition, datum }) => {
21
21
  const handleOnMouseEnter = useCallback(() => {
22
22
  if (!isGrabbed)
23
23
  setScrapperPosX(xPosition);
24
- }, [isGrabbed, setScrapperPosX, xPosition]);
25
- const strokeDetectorWidth = xScale.bandwidth ? xScale.bandwidth() : lineWidth;
26
- const render = useMemo(() => {
27
- return /* @__PURE__ */ jsxs("g", {
24
+ setActivePoint(null);
25
+ }, [isGrabbed, setActivePoint, setScrapperPosX, xPosition]);
26
+ const render = useMemo(
27
+ () => /* @__PURE__ */ jsxs("g", {
28
28
  children: [
29
29
  isActive && !isGrabbed ? /* @__PURE__ */ jsxs("g", {
30
30
  children: [
@@ -59,31 +59,32 @@ const VerticalScrapperLine = ({ lineWidth, xPosition, datum }) => {
59
59
  })
60
60
  ]
61
61
  }) : null,
62
- /* @__PURE__ */ jsx("line", {
62
+ /* @__PURE__ */ jsx("rect", {
63
63
  onMouseOver: handleOnMouseEnter,
64
- x1: xPosition,
65
- strokeWidth: strokeDetectorWidth,
66
- stroke: "transparent",
67
- y1: 0,
68
- x2: xPosition,
69
- y2: innerHeight
64
+ x: xScale.bandwidth ? xPosition - xScale.bandwidth() / 2 : xPosition - rectDetector?.left,
65
+ fill: "transparent",
66
+ y: 0,
67
+ width: xScale.bandwidth?.() ?? rectDetector?.right + rectDetector?.left,
68
+ height: innerHeight
70
69
  })
71
70
  ]
72
- });
73
- }, [
74
- isActive,
75
- isGrabbed,
76
- TooltipRenderer,
77
- referenceElement,
78
- theme.zIndex.tooltip,
79
- scrapper.tooltipPreference,
80
- scrapper.color,
81
- datum,
82
- xPosition,
83
- innerHeight,
84
- handleOnMouseEnter,
85
- strokeDetectorWidth
86
- ]);
71
+ }),
72
+ [
73
+ isActive,
74
+ isGrabbed,
75
+ TooltipRenderer,
76
+ referenceElement,
77
+ theme.zIndex.tooltip,
78
+ scrapper.tooltipPreference,
79
+ scrapper.color,
80
+ datum,
81
+ xPosition,
82
+ innerHeight,
83
+ handleOnMouseEnter,
84
+ xScale,
85
+ rectDetector
86
+ ]
87
+ );
87
88
  return render;
88
89
  };
89
90
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Scrapper/VerticalScrapperLine.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useCallback, useState, useMemo } from 'react';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { ThemeContext } from '@elliemae/ds-system';\nimport { ChartContext } from '../../ChartContext';\nimport { StyledMouseOverDetectionBox, StyledTooltipContainer } from '../../styles';\n\nexport const VerticalScrapperLine = ({ lineWidth, xPosition, datum }) => {\n const {\n scrapperPosX,\n setScrapperPosX,\n isGrabbed,\n xScale,\n innerWidth,\n innerHeight,\n props: { TooltipRenderer, scrapper },\n } = useContext(ChartContext);\n const theme = useContext(ThemeContext);\n const [referenceElement, setReferenceElement] = useState<React.SVGProps<SVGLineElement> | null>();\n const isActive = scrapperPosX === xPosition;\n const handleOnMouseEnter = useCallback(() => {\n if (!isGrabbed) setScrapperPosX(xPosition);\n }, [isGrabbed, setScrapperPosX, xPosition]);\n\n const strokeDetectorWidth = xScale.bandwidth ? xScale.bandwidth() : lineWidth;\n\n const render = useMemo(() => {\n return (\n <g>\n {isActive && !isGrabbed ? (\n <g>\n {TooltipRenderer ? (\n <foreignObject>\n <DSPopperJS\n withoutAnimation\n withoutArrow\n customOffset={[0, 5]}\n referenceElement={referenceElement}\n showPopover\n zIndex={theme.zIndex.tooltip}\n startPlacementPreference={scrapper.tooltipPreference}\n >\n <StyledMouseOverDetectionBox />\n <StyledTooltipContainer>\n <TooltipRenderer data={datum} />\n </StyledTooltipContainer>\n </DSPopperJS>\n </foreignObject>\n ) : null}\n <line\n ref={setReferenceElement}\n x1={xPosition}\n strokeWidth=\"2px\"\n stroke={scrapper.color}\n y1={0}\n x2={xPosition}\n y2={innerHeight}\n strokeDasharray={(4, 4)}\n />\n </g>\n ) : null}\n\n <line\n onMouseOver={handleOnMouseEnter}\n // onMouseLeave={() => setScrapperPosY('')}\n // id=\"horizontal-scrapper-zone\"\n x1={xPosition}\n strokeWidth={strokeDetectorWidth}\n stroke=\"transparent\"\n y1={0}\n x2={xPosition}\n y2={innerHeight}\n />\n </g>\n );\n }, [\n isActive,\n isGrabbed,\n TooltipRenderer,\n referenceElement,\n theme.zIndex.tooltip,\n scrapper.tooltipPreference,\n scrapper.color,\n datum,\n xPosition,\n innerHeight,\n handleOnMouseEnter,\n strokeDetectorWidth,\n ]);\n return render;\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,aAAa,UAAU,eAAe;AAClE,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B,8BAA8B;AAE7D,MAAM,uBAAuB,CAAC,EAAE,WAAW,WAAW,MAAM,MAAM;AACvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,iBAAiB,SAAS;AAAA,EACrC,IAAI,WAAW,YAAY;AAC3B,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAgD;AAChG,QAAM,WAAW,iBAAiB;AAClC,QAAM,qBAAqB,YAAY,MAAM;AAC3C,QAAI,CAAC;AAAW,sBAAgB,SAAS;AAAA,EAC3C,GAAG,CAAC,WAAW,iBAAiB,SAAS,CAAC;AAE1C,QAAM,sBAAsB,OAAO,YAAY,OAAO,UAAU,IAAI;AAEpE,QAAM,SAAS,QAAQ,MAAM;AAC3B,WACE,qBAAC;AAAA,MACE;AAAA,oBAAY,CAAC,YACZ,qBAAC;AAAA,UACE;AAAA,8BACC,oBAAC;AAAA,cACC,+BAAC;AAAA,gBACC,kBAAgB;AAAA,gBAChB,cAAY;AAAA,gBACZ,cAAc,CAAC,GAAG,CAAC;AAAA,gBACnB;AAAA,gBACA,aAAW;AAAA,gBACX,QAAQ,MAAM,OAAO;AAAA,gBACrB,0BAA0B,SAAS;AAAA,gBAEnC;AAAA,sCAAC,+BAA4B;AAAA,kBAC7B,oBAAC;AAAA,oBACC,8BAAC;AAAA,sBAAgB,MAAM;AAAA,qBAAO;AAAA,mBAChC;AAAA;AAAA,eACF;AAAA,aACF,IACE;AAAA,YACJ,oBAAC;AAAA,cACC,KAAK;AAAA,cACL,IAAI;AAAA,cACJ,aAAY;AAAA,cACZ,QAAQ,SAAS;AAAA,cACjB,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,kBAAkB,GAAG;AAAA,aACvB;AAAA;AAAA,SACF,IACE;AAAA,QAEJ,oBAAC;AAAA,UACC,aAAa;AAAA,UAGb,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,QAAO;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,SACN;AAAA;AAAA,KACF;AAAA,EAEJ,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useCallback, useState, useMemo } from 'react';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { ThemeContext } from '@elliemae/ds-system';\nimport { ChartContext } from '../../ChartContext';\nimport { StyledMouseOverDetectionBox, StyledTooltipContainer } from '../../styles';\n\nexport const VerticalScrapperLine = ({ rectDetector, xPosition, datum }) => {\n const {\n scrapperPosX,\n setScrapperPosX,\n isGrabbed,\n xScale,\n setActivePoint,\n innerHeight,\n props: { TooltipRenderer, scrapper },\n } = useContext(ChartContext);\n const theme = useContext(ThemeContext);\n const [referenceElement, setReferenceElement] = useState<React.SVGProps<SVGLineElement> | null>();\n const isActive = scrapperPosX === xPosition;\n const handleOnMouseEnter = useCallback(() => {\n if (!isGrabbed) setScrapperPosX(xPosition);\n setActivePoint(null);\n }, [isGrabbed, setActivePoint, setScrapperPosX, xPosition]);\n\n // const strokeDetectorWidth = xScale.bandwidth ? xScale.bandwidth() : lineWidth;\n\n const render = useMemo(\n () => (\n <g>\n {isActive && !isGrabbed ? (\n <g>\n {TooltipRenderer ? (\n <foreignObject>\n <DSPopperJS\n withoutAnimation\n withoutArrow\n customOffset={[0, 5]}\n referenceElement={referenceElement}\n showPopover\n zIndex={theme.zIndex.tooltip}\n startPlacementPreference={scrapper.tooltipPreference}\n >\n <StyledMouseOverDetectionBox />\n <StyledTooltipContainer>\n <TooltipRenderer data={datum} />\n </StyledTooltipContainer>\n </DSPopperJS>\n </foreignObject>\n ) : null}\n <line\n ref={setReferenceElement}\n x1={xPosition}\n strokeWidth=\"2px\"\n stroke={scrapper.color}\n y1={0}\n x2={xPosition}\n y2={innerHeight}\n strokeDasharray={(4, 4)}\n />\n </g>\n ) : null}\n <rect\n onMouseOver={handleOnMouseEnter}\n // onMouseLeave={() => setScrapperPosY('')}\n // id=\"horizontal-scrapper-zone\"\n x={xScale.bandwidth ? xPosition - xScale.bandwidth() / 2 : xPosition - rectDetector?.left}\n fill=\"transparent\"\n y={0}\n width={xScale.bandwidth?.() ?? rectDetector?.right + rectDetector?.left}\n height={innerHeight}\n />\n </g>\n ),\n [\n isActive,\n isGrabbed,\n TooltipRenderer,\n referenceElement,\n theme.zIndex.tooltip,\n scrapper.tooltipPreference,\n scrapper.color,\n datum,\n xPosition,\n innerHeight,\n handleOnMouseEnter,\n xScale,\n rectDetector,\n ],\n );\n return render;\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,aAAa,UAAU,eAAe;AAClE,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B,8BAA8B;AAE7D,MAAM,uBAAuB,CAAC,EAAE,cAAc,WAAW,MAAM,MAAM;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,iBAAiB,SAAS;AAAA,EACrC,IAAI,WAAW,YAAY;AAC3B,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAgD;AAChG,QAAM,WAAW,iBAAiB;AAClC,QAAM,qBAAqB,YAAY,MAAM;AAC3C,QAAI,CAAC;AAAW,sBAAgB,SAAS;AACzC,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,WAAW,gBAAgB,iBAAiB,SAAS,CAAC;AAI1D,QAAM,SAAS;AAAA,IACb,MACE,qBAAC;AAAA,MACE;AAAA,oBAAY,CAAC,YACZ,qBAAC;AAAA,UACE;AAAA,8BACC,oBAAC;AAAA,cACC,+BAAC;AAAA,gBACC,kBAAgB;AAAA,gBAChB,cAAY;AAAA,gBACZ,cAAc,CAAC,GAAG,CAAC;AAAA,gBACnB;AAAA,gBACA,aAAW;AAAA,gBACX,QAAQ,MAAM,OAAO;AAAA,gBACrB,0BAA0B,SAAS;AAAA,gBAEnC;AAAA,sCAAC,+BAA4B;AAAA,kBAC7B,oBAAC;AAAA,oBACC,8BAAC;AAAA,sBAAgB,MAAM;AAAA,qBAAO;AAAA,mBAChC;AAAA;AAAA,eACF;AAAA,aACF,IACE;AAAA,YACJ,oBAAC;AAAA,cACC,KAAK;AAAA,cACL,IAAI;AAAA,cACJ,aAAY;AAAA,cACZ,QAAQ,SAAS;AAAA,cACjB,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,kBAAkB,GAAG;AAAA,aACvB;AAAA;AAAA,SACF,IACE;AAAA,QACJ,oBAAC;AAAA,UACC,aAAa;AAAA,UAGb,GAAG,OAAO,YAAY,YAAY,OAAO,UAAU,IAAI,IAAI,YAAY,cAAc;AAAA,UACrF,MAAK;AAAA,UACL,GAAG;AAAA,UACH,OAAO,OAAO,YAAY,KAAK,cAAc,QAAQ,cAAc;AAAA,UACnE,QAAQ;AAAA,SACV;AAAA;AAAA,KACF;AAAA,IAEF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,OAAO;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Scroller/ScrollBarX.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable arrow-body-style */\n/* eslint-disable indent */\nimport React, { useContext, useCallback, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\n\nexport const ScrollBarX = () => {\n const {\n setIsGrabbed,\n setStartPosition,\n innerWidth,\n xScrollbarPosition,\n activePoint,\n setXScrollbarPosition,\n innerHeight,\n isGrabbed,\n containerRatio,\n setScrapperPosX,\n isScrollbarVisible,\n oldLastPosition,\n } = useContext(ChartContext);\n\n const barWidth = useMemo(() => parseInt(innerWidth / containerRatio, 10), [containerRatio, innerWidth]);\n\n // const [endPosition, setEndPosition] = useState(0);\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n setScrapperPosX('');\n setIsGrabbed(true);\n setStartPosition(e.clientX);\n e.preventDefault();\n },\n [setIsGrabbed, setScrapperPosX, setStartPosition],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n setScrapperPosX('');\n },\n [setScrapperPosX],\n );\n\n // const [endPosition, setEndPosition] = useState(0);\n const handleClickFullBar = useCallback(\n (e: React.MouseEvent) => {\n let newPosition = 0;\n const bar = e.target;\n const bounds = bar.getBoundingClientRect();\n const left = e.clientX - bounds.left;\n if (left + barWidth / 2 > innerWidth) {\n newPosition = innerWidth - barWidth;\n } else if (left - barWidth / 2 > 0) {\n newPosition = left - barWidth / 2;\n }\n\n setXScrollbarPosition(newPosition);\n oldLastPosition.current = newPosition;\n e.preventDefault();\n },\n [barWidth, innerWidth, oldLastPosition, setXScrollbarPosition],\n );\n\n const isBarVisible = useMemo(\n () => (isScrollbarVisible || activePoint) && containerRatio > 1,\n [activePoint, containerRatio, isScrollbarVisible],\n );\n\n return (\n <g\n className=\"scrollbarx\"\n transform={`translate(0,${innerHeight})`}\n style={{ visibility: isBarVisible ? 'visible' : 'hidden' }}\n onMouseEnter={handleMouseEnter}\n >\n <rect style={{ cursor: 'pointer' }} width={innerWidth} height=\"6\" fill=\"#ebecf0c5\" onClick={handleClickFullBar} />\n <g transform={`translate(${xScrollbarPosition},0)`}>\n <rect\n style={{ cursor: isGrabbed ? 'grabbing' : 'grab' }}\n width={barWidth}\n height=\"6\"\n fill=\"grey\"\n onMouseDown={handleMouseDown}\n />\n </g>\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,YAAY,aAAa,eAAe;AACxD,SAAS,oBAAoB;AAEtB,MAAM,aAAa,MAAM;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,WAAW,QAAQ,MAAM,SAAS,aAAa,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,UAAU,CAAC;AAGtG,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAAwB;AACvB,sBAAgB,EAAE;AAClB,mBAAa,IAAI;AACjB,uBAAiB,EAAE,OAAO;AAC1B,QAAE,eAAe;AAAA,IACnB;AAAA,IACA,CAAC,cAAc,iBAAiB,gBAAgB;AAAA,EAClD;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,MAAwB;AACvB,sBAAgB,EAAE;AAAA,IACpB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAGA,QAAM,qBAAqB;AAAA,IACzB,CAAC,MAAwB;AACvB,UAAI,cAAc;AAClB,YAAM,MAAM,EAAE;AACd,YAAM,SAAS,IAAI,sBAAsB;AACzC,YAAM,OAAO,EAAE,UAAU,OAAO;AAChC,UAAI,OAAO,WAAW,IAAI,YAAY;AACpC,sBAAc,aAAa;AAAA,MAC7B,WAAW,OAAO,WAAW,IAAI,GAAG;AAClC,sBAAc,OAAO,WAAW;AAAA,MAClC;AAEA,4BAAsB,WAAW;AACjC,sBAAgB,UAAU;AAC1B,QAAE,eAAe;AAAA,IACnB;AAAA,IACA,CAAC,UAAU,YAAY,iBAAiB,qBAAqB;AAAA,EAC/D;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,sBAAsB,gBAAgB,iBAAiB;AAAA,IAC9D,CAAC,aAAa,gBAAgB,kBAAkB;AAAA,EAClD;AAEA,SACE,qBAAC;AAAA,IACC,WAAU;AAAA,IACV,WAAW,eAAe;AAAA,IAC1B,OAAO,EAAE,YAAY,eAAe,YAAY,SAAS;AAAA,IACzD,cAAc;AAAA,IAEd;AAAA,0BAAC;AAAA,QAAK,OAAO,EAAE,QAAQ,UAAU;AAAA,QAAG,OAAO;AAAA,QAAY,QAAO;AAAA,QAAI,MAAK;AAAA,QAAY,SAAS;AAAA,OAAoB;AAAA,MAChH,oBAAC;AAAA,QAAE,WAAW,aAAa;AAAA,QACzB,8BAAC;AAAA,UACC,OAAO,EAAE,QAAQ,YAAY,aAAa,OAAO;AAAA,UACjD,OAAO;AAAA,UACP,QAAO;AAAA,UACP,MAAK;AAAA,UACL,aAAa;AAAA,SACf;AAAA,OACF;AAAA;AAAA,GACF;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable arrow-body-style */\n/* eslint-disable indent */\nimport React, { useContext, useCallback, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\n\nexport const ScrollBarX = () => {\n const {\n setIsGrabbed,\n setStartPosition,\n innerWidth,\n xScrollbarPosition,\n activePoint,\n setXScrollbarPosition,\n innerHeight,\n isGrabbed,\n containerRatio,\n setScrapperPosX,\n isScrollbarVisible,\n oldLastPosition,\n } = useContext(ChartContext);\n\n const barWidth = useMemo(() => parseInt(innerWidth / containerRatio, 10), [containerRatio, innerWidth]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n setScrapperPosX('');\n setIsGrabbed(true);\n setStartPosition(e.clientX);\n e.preventDefault();\n },\n [setIsGrabbed, setScrapperPosX, setStartPosition],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n setScrapperPosX('');\n },\n [setScrapperPosX],\n );\n\n const handleClickFullBar = useCallback(\n (e: React.MouseEvent) => {\n let newPosition = 0;\n const bar = e.target;\n const bounds = bar.getBoundingClientRect();\n const left = e.clientX - bounds.left;\n if (left + barWidth / 2 > innerWidth) {\n newPosition = innerWidth - barWidth;\n } else if (left - barWidth / 2 > 0) {\n newPosition = left - barWidth / 2;\n }\n\n setXScrollbarPosition(newPosition);\n oldLastPosition.current = newPosition;\n e.preventDefault();\n },\n [barWidth, innerWidth, oldLastPosition, setXScrollbarPosition],\n );\n\n const isBarVisible = useMemo(\n () => (isScrollbarVisible || activePoint) && containerRatio > 1,\n [activePoint, containerRatio, isScrollbarVisible],\n );\n\n return (\n <g\n className=\"scrollbarx\"\n transform={`translate(0,${innerHeight})`}\n style={{ visibility: isBarVisible ? 'visible' : 'hidden' }}\n onMouseEnter={handleMouseEnter}\n >\n <rect style={{ cursor: 'pointer' }} width={innerWidth} height=\"6\" fill=\"#ebecf0c5\" onClick={handleClickFullBar} />\n <g transform={`translate(${xScrollbarPosition},0)`}>\n <rect\n style={{ cursor: isGrabbed ? 'grabbing' : 'grab' }}\n width={barWidth}\n height=\"6\"\n fill=\"grey\"\n onMouseDown={handleMouseDown}\n />\n </g>\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,YAAY,aAAa,eAAe;AACxD,SAAS,oBAAoB;AAEtB,MAAM,aAAa,MAAM;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,WAAW,QAAQ,MAAM,SAAS,aAAa,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,UAAU,CAAC;AAEtG,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAAwB;AACvB,sBAAgB,EAAE;AAClB,mBAAa,IAAI;AACjB,uBAAiB,EAAE,OAAO;AAC1B,QAAE,eAAe;AAAA,IACnB;AAAA,IACA,CAAC,cAAc,iBAAiB,gBAAgB;AAAA,EAClD;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,MAAwB;AACvB,sBAAgB,EAAE;AAAA,IACpB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,qBAAqB;AAAA,IACzB,CAAC,MAAwB;AACvB,UAAI,cAAc;AAClB,YAAM,MAAM,EAAE;AACd,YAAM,SAAS,IAAI,sBAAsB;AACzC,YAAM,OAAO,EAAE,UAAU,OAAO;AAChC,UAAI,OAAO,WAAW,IAAI,YAAY;AACpC,sBAAc,aAAa;AAAA,MAC7B,WAAW,OAAO,WAAW,IAAI,GAAG;AAClC,sBAAc,OAAO,WAAW;AAAA,MAClC;AAEA,4BAAsB,WAAW;AACjC,sBAAgB,UAAU;AAC1B,QAAE,eAAe;AAAA,IACnB;AAAA,IACA,CAAC,UAAU,YAAY,iBAAiB,qBAAqB;AAAA,EAC/D;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,sBAAsB,gBAAgB,iBAAiB;AAAA,IAC9D,CAAC,aAAa,gBAAgB,kBAAkB;AAAA,EAClD;AAEA,SACE,qBAAC;AAAA,IACC,WAAU;AAAA,IACV,WAAW,eAAe;AAAA,IAC1B,OAAO,EAAE,YAAY,eAAe,YAAY,SAAS;AAAA,IACzD,cAAc;AAAA,IAEd;AAAA,0BAAC;AAAA,QAAK,OAAO,EAAE,QAAQ,UAAU;AAAA,QAAG,OAAO;AAAA,QAAY,QAAO;AAAA,QAAI,MAAK;AAAA,QAAY,SAAS;AAAA,OAAoB;AAAA,MAChH,oBAAC;AAAA,QAAE,WAAW,aAAa;AAAA,QACzB,8BAAC;AAAA,UACC,OAAO,EAAE,QAAQ,YAAY,aAAa,OAAO;AAAA,UACjD,OAAO;AAAA,UACP,QAAO;AAAA,UACP,MAAK;AAAA,UACL,aAAa;AAAA,SACf;AAAA,OACF;AAAA;AAAA,GACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -41,8 +41,8 @@ const ScrollableContainerX = () => {
41
41
  children: /* @__PURE__ */ jsx("path", {
42
42
  d: `M 0 -10
43
43
  H ${innerWidth}
44
- V ${innerHeight}
45
- L ${innerWidth + 10} ${innerHeight}
44
+ V ${innerHeight + 2}
45
+ L ${innerWidth + 10} ${innerHeight + 2}
46
46
  L ${innerWidth + 10} ${height}
47
47
  L -10 ${height}
48
48
  L -10 ${innerHeight}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Scroller/ScrollableContainerX.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable arrow-body-style */\n/* eslint-disable indent */\nimport React, { useContext, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\nimport { AxisBottom } from '../Axis/AxisBottom';\nimport { SeriesFactory } from '../SeriesFactory';\nimport { ScrollBarX } from './ScrollBarX';\nimport { Scrapper } from '../Scrapper/Scrapper';\nimport { VerticalScrapper } from '../Scrapper/VerticalScrapper';\nexport const ScrollableContainerX = () => {\n const {\n props: { scrapper, height },\n xScrollbarPosition,\n containerRatio,\n innerHeight,\n innerWidth,\n } = useContext(ChartContext);\n\n const Scrappers = useMemo(() => {\n if (scrapper?.type === 'horizontal') return <Scrapper />;\n else if (scrapper?.type === 'vertical') return <VerticalScrapper />;\n return null;\n }, [scrapper?.type]);\n\n return (\n <g className=\"scrollable-container-x\" clipPath=\"url(#myClip)\">\n <g transform={`translate(${-xScrollbarPosition * containerRatio},0)`}>\n <AxisBottom />\n <SeriesFactory />\n {Scrappers}\n </g>\n <ScrollBarX />\n\n <defs>\n <clipPath id=\"myClip\">\n <path\n d={`M 0 -10 \n H ${innerWidth} \n V ${innerHeight} \n L ${innerWidth + 10} ${innerHeight} \n L ${innerWidth + 10} ${height} \n L -10 ${height} \n L -10 ${innerHeight} \n L 0 ${innerHeight} \n L 0 -10`}\n />\n </clipPath>\n </defs>\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,YAAY,eAAe;AAC3C,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AAC1B,MAAM,uBAAuB,MAAM;AACxC,QAAM;AAAA,IACJ,OAAO,EAAE,UAAU,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,YAAY,QAAQ,MAAM;AAC9B,QAAI,UAAU,SAAS;AAAc,aAAO,oBAAC,YAAS;AAAA,aAC7C,UAAU,SAAS;AAAY,aAAO,oBAAC,oBAAiB;AACjE,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,SACE,qBAAC;AAAA,IAAE,WAAU;AAAA,IAAyB,UAAS;AAAA,IAC7C;AAAA,2BAAC;AAAA,QAAE,WAAW,aAAa,CAAC,qBAAqB;AAAA,QAC/C;AAAA,8BAAC,cAAW;AAAA,UACZ,oBAAC,iBAAc;AAAA,UACd;AAAA;AAAA,OACH;AAAA,MACA,oBAAC,cAAW;AAAA,MAEZ,oBAAC;AAAA,QACC,8BAAC;AAAA,UAAS,IAAG;AAAA,UACX,8BAAC;AAAA,YACC,GAAG;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,aAAa,OAAO;AAAA,gBACpB,aAAa,OAAO;AAAA,oBAChB;AAAA,oBACA;AAAA,kBACF;AAAA;AAAA,WAER;AAAA,SACF;AAAA,OACF;AAAA;AAAA,GACF;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable arrow-body-style */\n/* eslint-disable indent */\nimport React, { useContext, useMemo } from 'react';\nimport { ChartContext } from '../../ChartContext';\nimport { AxisBottom } from '../Axis/AxisBottom';\nimport { SeriesFactory } from '../SeriesFactory';\nimport { ScrollBarX } from './ScrollBarX';\nimport { Scrapper } from '../Scrapper/Scrapper';\nimport { VerticalScrapper } from '../Scrapper/VerticalScrapper';\nexport const ScrollableContainerX = () => {\n const {\n props: { scrapper, height },\n xScrollbarPosition,\n containerRatio,\n innerHeight,\n innerWidth,\n } = useContext(ChartContext);\n\n const Scrappers = useMemo(() => {\n if (scrapper?.type === 'horizontal') return <Scrapper />;\n else if (scrapper?.type === 'vertical') return <VerticalScrapper />;\n return null;\n }, [scrapper?.type]);\n\n return (\n <g className=\"scrollable-container-x\" clipPath=\"url(#myClip)\">\n <g transform={`translate(${-xScrollbarPosition * containerRatio},0)`}>\n <AxisBottom />\n <SeriesFactory />\n {Scrappers}\n </g>\n <ScrollBarX />\n\n <defs>\n <clipPath id=\"myClip\">\n <path\n d={`M 0 -10 \n H ${innerWidth} \n V ${innerHeight + 2} \n L ${innerWidth + 10} ${innerHeight + 2} \n L ${innerWidth + 10} ${height} \n L -10 ${height} \n L -10 ${innerHeight} \n L 0 ${innerHeight} \n L 0 -10`}\n />\n </clipPath>\n </defs>\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,YAAY,eAAe;AAC3C,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AAC1B,MAAM,uBAAuB,MAAM;AACxC,QAAM;AAAA,IACJ,OAAO,EAAE,UAAU,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,YAAY,QAAQ,MAAM;AAC9B,QAAI,UAAU,SAAS;AAAc,aAAO,oBAAC,YAAS;AAAA,aAC7C,UAAU,SAAS;AAAY,aAAO,oBAAC,oBAAiB;AACjE,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,SACE,qBAAC;AAAA,IAAE,WAAU;AAAA,IAAyB,UAAS;AAAA,IAC7C;AAAA,2BAAC;AAAA,QAAE,WAAW,aAAa,CAAC,qBAAqB;AAAA,QAC/C;AAAA,8BAAC,cAAW;AAAA,UACZ,oBAAC,iBAAc;AAAA,UACd;AAAA;AAAA,OACH;AAAA,MACA,oBAAC,cAAW;AAAA,MAEZ,oBAAC;AAAA,QACC,8BAAC;AAAA,UAAS,IAAG;AAAA,UACX,8BAAC;AAAA,YACC,GAAG;AAAA,gBACC;AAAA,gBACA,cAAc;AAAA,gBACd,aAAa,OAAO,cAAc;AAAA,gBAClC,aAAa,OAAO;AAAA,oBAChB;AAAA,oBACA;AAAA,kBACF;AAAA;AAAA,WAER;AAAA,SACF;AAAA,OACF;AAAA;AAAA,GACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,58 +1,74 @@
1
1
  import * as React from "react";
2
2
  import { Fragment, jsx } from "react/jsx-runtime";
3
- import { useContext } from "react";
3
+ import { useContext, useMemo } from "react";
4
4
  import { ChartContext } from "../ChartContext";
5
5
  import { Line, Points, Bars, StackedBar, Area } from "../series";
6
6
  import { getStackedIndex } from "../helpers";
7
+ import { HorizontalBars } from "../series/HorizontalBars";
8
+ import { HorizontalStackedBars } from "../series/HorizontalStackedBars";
7
9
  const SeriesFactory = () => {
8
10
  const {
9
11
  props: { data, xAxis, groups, types },
10
12
  xScrollbarPosition,
11
13
  innerWidth,
12
14
  xScale,
13
- containerRatio
15
+ containerRatio,
16
+ isHorizontal
14
17
  } = useContext(ChartContext);
15
- return /* @__PURE__ */ jsx("g", {
16
- className: "content",
17
- children: data.map((serie) => {
18
- const serieProps = {
19
- key: serie.key,
20
- serie: {
21
- ...serie,
22
- data: containerRatio > 1 ? serie.data.filter((datum) => {
23
- const xScaleValue = xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x);
24
- return xScaleValue > xScrollbarPosition * (containerRatio ?? 1) - 20 * containerRatio && xScaleValue < xScrollbarPosition * (containerRatio ?? 1) + innerWidth + 20 * containerRatio;
25
- }) : serie.data
18
+ return useMemo(
19
+ () => /* @__PURE__ */ jsx("g", {
20
+ className: "content",
21
+ children: data.filter((serie) => !serie.isHidden).map((serie) => {
22
+ const serieProps = {
23
+ key: serie.key,
24
+ serie: {
25
+ ...serie,
26
+ data: containerRatio > 1 ? serie.data.filter((datum) => {
27
+ const xScaleValue = xScale(xAxis.cols ? xAxis.cols[datum.position] : datum.value.x);
28
+ return xScaleValue > xScrollbarPosition * (containerRatio ?? 1) - 40 * containerRatio && xScaleValue < xScrollbarPosition * (containerRatio ?? 1) + innerWidth + 40 * containerRatio;
29
+ }) : serie.data
30
+ }
31
+ };
32
+ if (serie.type === "bar" && groups && getStackedIndex(groups, serie.name) > -1 && isHorizontal) {
33
+ return /* @__PURE__ */ jsx(HorizontalStackedBars, {
34
+ ...serieProps
35
+ });
26
36
  }
27
- };
28
- if (serie.type === "bar" && groups && getStackedIndex(groups, serie.name) > -1) {
29
- return /* @__PURE__ */ jsx(StackedBar, {
30
- ...serieProps
31
- });
32
- }
33
- if (serie.type === "bar") {
34
- return /* @__PURE__ */ jsx(Bars, {
35
- ...serieProps
36
- });
37
- }
38
- if (types === "scatter" && !serie.type || serie.type === "point") {
39
- return /* @__PURE__ */ jsx(Points, {
40
- ...serieProps
41
- });
42
- }
43
- if (serie.type === "line") {
44
- return /* @__PURE__ */ jsx(Line, {
45
- ...serieProps
46
- });
47
- }
48
- if (serie.type === "area") {
49
- return /* @__PURE__ */ jsx(Area, {
50
- ...serieProps
51
- });
52
- }
53
- return /* @__PURE__ */ jsx(Fragment, {});
54
- })
55
- });
37
+ if (serie.type === "bar" && groups && getStackedIndex(groups, serie.name) > -1) {
38
+ return /* @__PURE__ */ jsx(StackedBar, {
39
+ ...serieProps
40
+ });
41
+ }
42
+ if (serie.type === "bar" && isHorizontal) {
43
+ return /* @__PURE__ */ jsx(HorizontalBars, {
44
+ ...serieProps
45
+ });
46
+ }
47
+ if (serie.type === "bar") {
48
+ return /* @__PURE__ */ jsx(Bars, {
49
+ ...serieProps
50
+ });
51
+ }
52
+ if (types === "scatter" && !serie.type || serie.type === "point") {
53
+ return /* @__PURE__ */ jsx(Points, {
54
+ ...serieProps
55
+ });
56
+ }
57
+ if (serie.type === "line") {
58
+ return /* @__PURE__ */ jsx(Line, {
59
+ ...serieProps
60
+ });
61
+ }
62
+ if (serie.type === "area") {
63
+ return /* @__PURE__ */ jsx(Area, {
64
+ ...serieProps
65
+ });
66
+ }
67
+ return /* @__PURE__ */ jsx(Fragment, {});
68
+ })
69
+ }),
70
+ [containerRatio, data, groups, innerWidth, isHorizontal, types, xAxis.cols, xScale, xScrollbarPosition]
71
+ );
56
72
  };
57
73
  export {
58
74
  SeriesFactory