@elliemae/ds-dataviz 3.9.0 → 3.10.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/cjs/graphs/Chart/Chart.js +1 -4
  2. package/dist/cjs/graphs/Chart/Chart.js.map +2 -2
  3. package/dist/cjs/graphs/Chart/ChartContext.js +1 -4
  4. package/dist/cjs/graphs/Chart/ChartContext.js.map +2 -2
  5. package/dist/cjs/graphs/Chart/config/useChart.js +26 -22
  6. package/dist/cjs/graphs/Chart/config/useChart.js.map +2 -2
  7. package/dist/cjs/graphs/Chart/config/useGetters.js +90 -0
  8. package/dist/cjs/graphs/Chart/config/useGetters.js.map +7 -0
  9. package/dist/cjs/graphs/Chart/config/useInternalMargins.js +1 -1
  10. package/dist/cjs/graphs/Chart/config/useInternalMargins.js.map +1 -1
  11. package/dist/cjs/graphs/Chart/config/useKeyboardNavigation.js +42 -13
  12. package/dist/cjs/graphs/Chart/config/useKeyboardNavigation.js.map +2 -2
  13. package/dist/cjs/graphs/Chart/config/useScales.js +67 -41
  14. package/dist/cjs/graphs/Chart/config/useScales.js.map +2 -2
  15. package/dist/cjs/graphs/Chart/helpers/colorPallet.js +1 -1
  16. package/dist/cjs/graphs/Chart/helpers/colorPallet.js.map +1 -1
  17. package/dist/cjs/graphs/Chart/helpers/index.js +4 -4
  18. package/dist/cjs/graphs/Chart/helpers/index.js.map +2 -2
  19. package/dist/cjs/graphs/Chart/helpers/useUniqueData.js +124 -0
  20. package/dist/cjs/graphs/Chart/helpers/useUniqueData.js.map +7 -0
  21. package/dist/cjs/graphs/Chart/helpers/useVirtualizedSeries.js +42 -11
  22. package/dist/cjs/graphs/Chart/helpers/useVirtualizedSeries.js.map +2 -2
  23. package/dist/cjs/graphs/Chart/parts/Axis/Axes.js +13 -2
  24. package/dist/cjs/graphs/Chart/parts/Axis/Axes.js.map +2 -2
  25. package/dist/cjs/graphs/Chart/parts/Axis/AxisBottom.js +72 -23
  26. package/dist/cjs/graphs/Chart/parts/Axis/AxisBottom.js.map +2 -2
  27. package/dist/cjs/graphs/Chart/parts/Axis/AxisLeft.js +36 -16
  28. package/dist/cjs/graphs/Chart/parts/Axis/AxisLeft.js.map +2 -2
  29. package/dist/cjs/graphs/Chart/parts/Axis/AxisRight.js +10 -8
  30. package/dist/cjs/graphs/Chart/parts/Axis/AxisRight.js.map +2 -2
  31. package/dist/cjs/graphs/Chart/parts/ChartContainer.js +60 -60
  32. package/dist/cjs/graphs/Chart/parts/ChartContainer.js.map +2 -2
  33. package/dist/cjs/graphs/Chart/parts/ClipPaths.js +85 -0
  34. package/dist/cjs/graphs/Chart/parts/ClipPaths.js.map +7 -0
  35. package/dist/cjs/graphs/Chart/parts/Labels/BottomLabel.js +2 -2
  36. package/dist/cjs/graphs/Chart/parts/Labels/BottomLabel.js.map +2 -2
  37. package/dist/cjs/graphs/Chart/parts/Labels/LeftLabel.js +7 -14
  38. package/dist/cjs/graphs/Chart/parts/Labels/LeftLabel.js.map +2 -2
  39. package/dist/cjs/graphs/Chart/parts/Legend/BottomLegend.js +4 -4
  40. package/dist/cjs/graphs/Chart/parts/Legend/BottomLegend.js.map +2 -2
  41. package/dist/cjs/graphs/Chart/parts/Legend/LegendItem.js +1 -1
  42. package/dist/cjs/graphs/Chart/parts/Legend/LegendItem.js.map +2 -2
  43. package/dist/cjs/graphs/Chart/parts/Scrapper/ScrapperLine.js +6 -2
  44. package/dist/cjs/graphs/Chart/parts/Scrapper/ScrapperLine.js.map +2 -2
  45. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapper.js +2 -77
  46. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapper.js.map +2 -2
  47. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js +3 -3
  48. package/dist/cjs/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js.map +3 -3
  49. package/dist/cjs/graphs/Chart/parts/Scroller/BlurMask.js +112 -0
  50. package/dist/cjs/graphs/Chart/parts/Scroller/BlurMask.js.map +7 -0
  51. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollBarX.js +4 -7
  52. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollBarX.js.map +2 -2
  53. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollBarY.js +114 -0
  54. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollBarY.js.map +7 -0
  55. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollableContainerX.js +14 -29
  56. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollableContainerX.js.map +2 -2
  57. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollableContainerY.js +84 -0
  58. package/dist/cjs/graphs/Chart/parts/Scroller/ScrollableContainerY.js.map +7 -0
  59. package/dist/cjs/graphs/Chart/parts/SeriesFactory.js +4 -9
  60. package/dist/cjs/graphs/Chart/parts/SeriesFactory.js.map +2 -2
  61. package/dist/cjs/graphs/Chart/react-desc-prop-types.js.map +2 -2
  62. package/dist/cjs/graphs/Chart/series/Area.js +1 -3
  63. package/dist/cjs/graphs/Chart/series/Area.js.map +2 -2
  64. package/dist/cjs/graphs/Chart/series/Bars.js.map +2 -2
  65. package/dist/cjs/graphs/Chart/series/HorizontalBars.js +4 -24
  66. package/dist/cjs/graphs/Chart/series/HorizontalBars.js.map +2 -2
  67. package/dist/cjs/graphs/Chart/series/HorizontalStackedBars.js +2 -2
  68. package/dist/cjs/graphs/Chart/series/HorizontalStackedBars.js.map +2 -2
  69. package/dist/cjs/graphs/Chart/series/StackedBar.js +3 -2
  70. package/dist/cjs/graphs/Chart/series/StackedBar.js.map +2 -2
  71. package/dist/cjs/graphs/Chart/styles.js +12 -11
  72. package/dist/cjs/graphs/Chart/styles.js.map +2 -2
  73. package/dist/cjs/graphs/constants.js +6 -5
  74. package/dist/cjs/graphs/constants.js.map +2 -2
  75. package/dist/esm/graphs/Chart/Chart.js +1 -4
  76. package/dist/esm/graphs/Chart/Chart.js.map +2 -2
  77. package/dist/esm/graphs/Chart/ChartContext.js +1 -4
  78. package/dist/esm/graphs/Chart/ChartContext.js.map +2 -2
  79. package/dist/esm/graphs/Chart/config/useChart.js +27 -23
  80. package/dist/esm/graphs/Chart/config/useChart.js.map +2 -2
  81. package/dist/esm/graphs/Chart/config/useGetters.js +64 -0
  82. package/dist/esm/graphs/Chart/config/useGetters.js.map +7 -0
  83. package/dist/esm/graphs/Chart/config/useInternalMargins.js +1 -1
  84. package/dist/esm/graphs/Chart/config/useInternalMargins.js.map +1 -1
  85. package/dist/esm/graphs/Chart/config/useKeyboardNavigation.js +42 -13
  86. package/dist/esm/graphs/Chart/config/useKeyboardNavigation.js.map +2 -2
  87. package/dist/esm/graphs/Chart/config/useScales.js +67 -41
  88. package/dist/esm/graphs/Chart/config/useScales.js.map +2 -2
  89. package/dist/esm/graphs/Chart/helpers/colorPallet.js +1 -1
  90. package/dist/esm/graphs/Chart/helpers/colorPallet.js.map +1 -1
  91. package/dist/esm/graphs/Chart/helpers/index.js +4 -4
  92. package/dist/esm/graphs/Chart/helpers/index.js.map +2 -2
  93. package/dist/esm/graphs/Chart/helpers/useUniqueData.js +98 -0
  94. package/dist/esm/graphs/Chart/helpers/useUniqueData.js.map +7 -0
  95. package/dist/esm/graphs/Chart/helpers/useVirtualizedSeries.js +42 -11
  96. package/dist/esm/graphs/Chart/helpers/useVirtualizedSeries.js.map +2 -2
  97. package/dist/esm/graphs/Chart/parts/Axis/Axes.js +13 -2
  98. package/dist/esm/graphs/Chart/parts/Axis/Axes.js.map +2 -2
  99. package/dist/esm/graphs/Chart/parts/Axis/AxisBottom.js +72 -23
  100. package/dist/esm/graphs/Chart/parts/Axis/AxisBottom.js.map +2 -2
  101. package/dist/esm/graphs/Chart/parts/Axis/AxisLeft.js +36 -16
  102. package/dist/esm/graphs/Chart/parts/Axis/AxisLeft.js.map +2 -2
  103. package/dist/esm/graphs/Chart/parts/Axis/AxisRight.js +10 -8
  104. package/dist/esm/graphs/Chart/parts/Axis/AxisRight.js.map +2 -2
  105. package/dist/esm/graphs/Chart/parts/ChartContainer.js +60 -60
  106. package/dist/esm/graphs/Chart/parts/ChartContainer.js.map +2 -2
  107. package/dist/esm/graphs/Chart/parts/ClipPaths.js +59 -0
  108. package/dist/esm/graphs/Chart/parts/ClipPaths.js.map +7 -0
  109. package/dist/esm/graphs/Chart/parts/Labels/BottomLabel.js +2 -2
  110. package/dist/esm/graphs/Chart/parts/Labels/BottomLabel.js.map +2 -2
  111. package/dist/esm/graphs/Chart/parts/Labels/LeftLabel.js +8 -15
  112. package/dist/esm/graphs/Chart/parts/Labels/LeftLabel.js.map +2 -2
  113. package/dist/esm/graphs/Chart/parts/Legend/BottomLegend.js +5 -5
  114. package/dist/esm/graphs/Chart/parts/Legend/BottomLegend.js.map +2 -2
  115. package/dist/esm/graphs/Chart/parts/Legend/LegendItem.js +1 -1
  116. package/dist/esm/graphs/Chart/parts/Legend/LegendItem.js.map +2 -2
  117. package/dist/esm/graphs/Chart/parts/Scrapper/ScrapperLine.js +6 -2
  118. package/dist/esm/graphs/Chart/parts/Scrapper/ScrapperLine.js.map +2 -2
  119. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapper.js +3 -78
  120. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapper.js.map +2 -2
  121. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js +3 -3
  122. package/dist/esm/graphs/Chart/parts/Scrapper/VerticalScrapperLine.js.map +3 -3
  123. package/dist/esm/graphs/Chart/parts/Scroller/BlurMask.js +86 -0
  124. package/dist/esm/graphs/Chart/parts/Scroller/BlurMask.js.map +7 -0
  125. package/dist/esm/graphs/Chart/parts/Scroller/ScrollBarX.js +4 -7
  126. package/dist/esm/graphs/Chart/parts/Scroller/ScrollBarX.js.map +2 -2
  127. package/dist/esm/graphs/Chart/parts/Scroller/ScrollBarY.js +88 -0
  128. package/dist/esm/graphs/Chart/parts/Scroller/ScrollBarY.js.map +7 -0
  129. package/dist/esm/graphs/Chart/parts/Scroller/ScrollableContainerX.js +14 -29
  130. package/dist/esm/graphs/Chart/parts/Scroller/ScrollableContainerX.js.map +2 -2
  131. package/dist/esm/graphs/Chart/parts/Scroller/ScrollableContainerY.js +58 -0
  132. package/dist/esm/graphs/Chart/parts/Scroller/ScrollableContainerY.js.map +7 -0
  133. package/dist/esm/graphs/Chart/parts/SeriesFactory.js +5 -10
  134. package/dist/esm/graphs/Chart/parts/SeriesFactory.js.map +2 -2
  135. package/dist/esm/graphs/Chart/react-desc-prop-types.js.map +2 -2
  136. package/dist/esm/graphs/Chart/series/Area.js +1 -3
  137. package/dist/esm/graphs/Chart/series/Area.js.map +2 -2
  138. package/dist/esm/graphs/Chart/series/Bars.js.map +2 -2
  139. package/dist/esm/graphs/Chart/series/HorizontalBars.js +4 -24
  140. package/dist/esm/graphs/Chart/series/HorizontalBars.js.map +2 -2
  141. package/dist/esm/graphs/Chart/series/HorizontalStackedBars.js +2 -2
  142. package/dist/esm/graphs/Chart/series/HorizontalStackedBars.js.map +2 -2
  143. package/dist/esm/graphs/Chart/series/StackedBar.js +3 -2
  144. package/dist/esm/graphs/Chart/series/StackedBar.js.map +2 -2
  145. package/dist/esm/graphs/Chart/styles.js +13 -12
  146. package/dist/esm/graphs/Chart/styles.js.map +2 -2
  147. package/dist/esm/graphs/constants.js +7 -6
  148. package/dist/esm/graphs/constants.js.map +2 -2
  149. package/package.json +8 -8
  150. package/dist/cjs/graphs/Chart/Pie.js +0 -49
  151. package/dist/cjs/graphs/Chart/Pie.js.map +0 -7
  152. package/dist/cjs/graphs/Chart/parts/ActivePoint.js +0 -83
  153. package/dist/cjs/graphs/Chart/parts/ActivePoint.js.map +0 -7
  154. package/dist/esm/graphs/Chart/Pie.js +0 -23
  155. package/dist/esm/graphs/Chart/Pie.js.map +0 -7
  156. package/dist/esm/graphs/Chart/parts/ActivePoint.js +0 -57
  157. package/dist/esm/graphs/Chart/parts/ActivePoint.js.map +0 -7
@@ -4,46 +4,95 @@ import React2, { useContext, useEffect, useRef } from "react";
4
4
  import { select, axisBottom, timeFormat } from "d3";
5
5
  import { StyledAxis, StyledGrid } from "../../styles";
6
6
  import { ChartContext } from "../../ChartContext";
7
+ import { useUniqueData } from "../../helpers/useUniqueData";
7
8
  const AxisBottom = React2.memo(() => {
8
9
  const {
9
- props: { xAxis, width },
10
+ props: { xAxis },
10
11
  innerHeight,
11
12
  xScale,
13
+ innerWidth,
14
+ containerRatio,
15
+ internalMargin,
12
16
  setAxisBottomRef
13
17
  } = useContext(ChartContext);
14
- if (xAxis.hideAxis)
15
- return null;
16
- const axisRef = useRef();
17
- const gridRef = useRef();
18
- const ticks = xScale.ticks?.(xAxis.tickCount ?? width / 100);
18
+ const axisRef = useRef(null);
19
+ const gridRef = useRef(null);
20
+ const { tickValues, tickFormat, overwriteTicks, color, tickRotation, tickCount } = xAxis.tick || {};
21
+ const ticksScales = ["linear", "time", "log"];
22
+ const uniqueData = useUniqueData();
19
23
  useEffect(() => {
20
- const grid = axisBottom(xScale).tickSize(xAxis?.showGrid ? -innerHeight : 0).tickFormat("").tickSizeOuter(0);
24
+ const grid = axisBottom(xScale).tickSize(-innerHeight).tickFormat("").tickSizeOuter(0);
21
25
  const axis = axisBottom(xScale).tickSizeOuter(0);
22
- if (xAxis.tickValues && ticks) {
23
- const finalTicks = xAxis.overwriteTicks ? xAxis.tickValues : [...ticks, ...xAxis.tickValues];
24
- axis.tickValues(finalTicks);
25
- } else {
26
- axis.tickValues(ticks);
27
- grid.tickValues(ticks);
28
- }
29
- if (xAxis.tickFormat) {
30
- if (typeof xAxis.tickFormat === "string") {
31
- const formatGenerator = timeFormat(xAxis.tickFormat);
32
- axis.tickFormat((d) => formatGenerator(d));
26
+ if (ticksScales.includes(xAxis.type)) {
27
+ const ticksNum = (() => {
28
+ if (tickCount)
29
+ return tickCount;
30
+ if (containerRatio > 1) {
31
+ return innerWidth / 100 * containerRatio;
32
+ }
33
+ return innerWidth / 100;
34
+ })();
35
+ const ticks = xScale.ticks?.(ticksNum);
36
+ if (containerRatio > 1 && uniqueData.length < 10) {
37
+ const ticksName = uniqueData.map((u) => u.xValue);
38
+ axis.tickValues(ticksName);
39
+ grid.tickValues(ticksName);
40
+ } else if (tickValues && ticks) {
41
+ const finalTicks = overwriteTicks ? tickValues : [...ticks, ...tickValues];
42
+ axis.tickValues(finalTicks);
43
+ } else {
44
+ axis.tickValues(ticks);
45
+ grid.tickValues(ticks);
33
46
  }
34
- if (typeof xAxis.tickFormat === "function") {
35
- axis.tickFormat(xAxis.tickFormat);
47
+ if (tickFormat) {
48
+ if (typeof tickFormat === "string") {
49
+ const formatGenerator = timeFormat(tickFormat);
50
+ axis.tickFormat((d) => formatGenerator(d));
51
+ }
52
+ if (typeof tickFormat === "function") {
53
+ axis.tickFormat(tickFormat);
54
+ }
55
+ }
56
+ }
57
+ if (axisRef?.current && gridRef?.current) {
58
+ if (xAxis?.showGrid)
59
+ select(gridRef.current).call(grid);
60
+ const axisNode = select(axisRef.current);
61
+ axisNode.call(axis);
62
+ const firstTick = axisNode.select(".tick").node();
63
+ if (firstTick?.getBoundingClientRect().left < internalMargin.left + 10) {
64
+ firstTick.remove();
36
65
  }
66
+ if (tickRotation)
67
+ axisNode.selectAll("text").style("text-anchor", tickRotation > 0 ? "start" : "end").attr("dx", 8 * Math.sin(Math.PI * (tickRotation / 180))).attr("dy", ".71em").attr("y", 11.5 - 2.5 * (tickRotation / 15) * (tickRotation > 0 ? 1 : -1)).attr("transform", `rotate(${tickRotation})`);
37
68
  }
38
- select(gridRef.current).call(grid);
39
- select(axisRef.current).call(axis);
40
- }, [innerHeight, ticks, xAxis.overwriteTicks, xAxis?.showGrid, xAxis.tickFormat, xAxis.tickValues, xScale]);
69
+ }, [
70
+ innerHeight,
71
+ overwriteTicks,
72
+ xAxis?.showGrid,
73
+ tickFormat,
74
+ tickValues,
75
+ xScale,
76
+ tickRotation,
77
+ xAxis.type,
78
+ ticksScales,
79
+ tickCount,
80
+ containerRatio,
81
+ innerWidth,
82
+ uniqueData.length,
83
+ uniqueData,
84
+ internalMargin.left
85
+ ]);
86
+ if (xAxis.hideAxis)
87
+ return null;
41
88
  return /* @__PURE__ */ jsxs("g", {
42
89
  transform: `translate(0,${innerHeight})`,
43
90
  children: [
44
91
  /* @__PURE__ */ jsx("g", {
45
92
  ref: setAxisBottomRef,
46
93
  children: /* @__PURE__ */ jsx(StyledAxis, {
94
+ axisColor: xAxis.color,
95
+ tickColor: color,
47
96
  ref: axisRef
48
97
  })
49
98
  }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Axis/AxisBottom.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo, useEffect, useRef } from 'react';\nimport { select, axisBottom, timeFormat } from 'd3';\nimport { StyledAxis, StyledGrid, StyledAxisLabel } from '../../styles';\nimport { ChartContext } from '../../ChartContext';\n\nexport const AxisBottom = React.memo(() => {\n const {\n props: { xAxis, width },\n innerHeight,\n xScale,\n setAxisBottomRef,\n } = useContext(ChartContext);\n if (xAxis.hideAxis) return null;\n const axisRef = useRef();\n const gridRef = useRef();\n const ticks = xScale.ticks?.(xAxis.tickCount ?? width / 100);\n\n useEffect(() => {\n const grid = axisBottom(xScale)\n .tickSize(xAxis?.showGrid ? -innerHeight : 0)\n .tickFormat('')\n .tickSizeOuter(0);\n\n const axis = axisBottom(xScale).tickSizeOuter(0);\n\n if (xAxis.tickValues && ticks) {\n const finalTicks = xAxis.overwriteTicks ? xAxis.tickValues : [...ticks, ...xAxis.tickValues];\n axis.tickValues(finalTicks);\n } else {\n axis.tickValues(ticks);\n grid.tickValues(ticks);\n }\n\n if (xAxis.tickFormat) {\n if (typeof xAxis.tickFormat === 'string') {\n const formatGenerator = timeFormat(xAxis.tickFormat);\n axis.tickFormat((d) => formatGenerator(d));\n }\n if (typeof xAxis.tickFormat === 'function') {\n axis.tickFormat(xAxis.tickFormat);\n }\n }\n\n select(gridRef.current).call(grid);\n select(axisRef.current).call(axis);\n }, [innerHeight, ticks, xAxis.overwriteTicks, xAxis?.showGrid, xAxis.tickFormat, xAxis.tickValues, xScale]);\n\n return (\n <g transform={`translate(0,${innerHeight})`}>\n <g ref={setAxisBottomRef}>\n <StyledAxis ref={axisRef}></StyledAxis>\n </g>\n\n <StyledGrid ref={gridRef}></StyledGrid>\n </g>\n );\n});\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,OAAOA,UAAS,YAAqB,WAAW,cAAc;AAC9D,SAAS,QAAQ,YAAY,kBAAkB;AAC/C,SAAS,YAAY,kBAAmC;AACxD,SAAS,oBAAoB;AAEtB,MAAM,aAAaA,OAAM,KAAK,MAAM;AACzC,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAC3B,MAAI,MAAM;AAAU,WAAO;AAC3B,QAAM,UAAU,OAAO;AACvB,QAAM,UAAU,OAAO;AACvB,QAAM,QAAQ,OAAO,QAAQ,MAAM,aAAa,QAAQ,GAAG;AAE3D,YAAU,MAAM;AACd,UAAM,OAAO,WAAW,MAAM,EAC3B,SAAS,OAAO,WAAW,CAAC,cAAc,CAAC,EAC3C,WAAW,EAAE,EACb,cAAc,CAAC;AAElB,UAAM,OAAO,WAAW,MAAM,EAAE,cAAc,CAAC;AAE/C,QAAI,MAAM,cAAc,OAAO;AAC7B,YAAM,aAAa,MAAM,iBAAiB,MAAM,aAAa,CAAC,GAAG,OAAO,GAAG,MAAM,UAAU;AAC3F,WAAK,WAAW,UAAU;AAAA,IAC5B,OAAO;AACL,WAAK,WAAW,KAAK;AACrB,WAAK,WAAW,KAAK;AAAA,IACvB;AAEA,QAAI,MAAM,YAAY;AACpB,UAAI,OAAO,MAAM,eAAe,UAAU;AACxC,cAAM,kBAAkB,WAAW,MAAM,UAAU;AACnD,aAAK,WAAW,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAAA,MAC3C;AACA,UAAI,OAAO,MAAM,eAAe,YAAY;AAC1C,aAAK,WAAW,MAAM,UAAU;AAAA,MAClC;AAAA,IACF;AAEA,WAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AACjC,WAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AAAA,EACnC,GAAG,CAAC,aAAa,OAAO,MAAM,gBAAgB,OAAO,UAAU,MAAM,YAAY,MAAM,YAAY,MAAM,CAAC;AAE1G,SACE,qBAAC;AAAA,IAAE,WAAW,eAAe;AAAA,IAC3B;AAAA,0BAAC;AAAA,QAAE,KAAK;AAAA,QACN,8BAAC;AAAA,UAAW,KAAK;AAAA,SAAS;AAAA,OAC5B;AAAA,MAEA,oBAAC;AAAA,QAAW,KAAK;AAAA,OAAS;AAAA;AAAA,GAC5B;AAEJ,CAAC;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport React, { useContext, useEffect, useRef } from 'react';\nimport { select, axisBottom, timeFormat, ScaleLinear, ScaleTime } from 'd3';\nimport { StyledAxis, StyledGrid } from '../../styles';\nimport { ChartContext } from '../../ChartContext';\nimport { DSChartT } from '../../react-desc-prop-types';\nimport { useUniqueData } from '../../helpers/useUniqueData';\n\nexport const AxisBottom = React.memo(() => {\n const {\n props: { xAxis },\n innerHeight,\n xScale,\n innerWidth,\n containerRatio,\n internalMargin,\n setAxisBottomRef,\n } = useContext(ChartContext);\n\n const axisRef = useRef<SVGSVGElement>(null);\n const gridRef = useRef<SVGSVGElement>(null);\n const { tickValues, tickFormat, overwriteTicks, color, tickRotation, tickCount } =\n xAxis.tick || ({} as DSChartT.AxisTickT);\n\n const ticksScales = ['linear', 'time', 'log'];\n // const ticks = xScale.ticks?.(tickCount ?? width / 100);\n\n const uniqueData = useUniqueData();\n useEffect(() => {\n const grid = axisBottom(xScale as ScaleLinear<number, number>)\n .tickSize(-innerHeight)\n .tickFormat('')\n .tickSizeOuter(0);\n\n const axis = axisBottom(xScale as ScaleLinear<number, number>).tickSizeOuter(0);\n\n if (ticksScales.includes(xAxis.type)) {\n const ticksNum = (() => {\n if (tickCount) return tickCount;\n if (containerRatio > 1) {\n return (innerWidth / 100) * containerRatio;\n }\n return innerWidth / 100;\n })();\n const ticks = (xScale as ScaleLinear<number, number> | ScaleTime<number, number, never>).ticks?.(ticksNum);\n\n // we show the only the ticks values on the screen when zoomed enough\n if (containerRatio > 1 && uniqueData.length < 10) {\n const ticksName = uniqueData.map((u) => u.xValue);\n axis.tickValues(ticksName);\n grid.tickValues(ticksName);\n } else if (tickValues && ticks) {\n const finalTicks = overwriteTicks ? tickValues : [...ticks, ...tickValues];\n axis.tickValues(finalTicks);\n } else {\n axis.tickValues(ticks);\n grid.tickValues(ticks);\n }\n\n if (tickFormat) {\n if (typeof tickFormat === 'string') {\n const formatGenerator = timeFormat(tickFormat);\n axis.tickFormat((d) => formatGenerator(d));\n }\n if (typeof tickFormat === 'function') {\n axis.tickFormat(tickFormat);\n }\n }\n }\n\n if (axisRef?.current && gridRef?.current) {\n if (xAxis?.showGrid) select(gridRef.current).call(grid);\n const axisNode = select(axisRef.current);\n axisNode.call(axis);\n\n // need to remove the first tick when live under the domain line\n const firstTick = axisNode.select('.tick').node() as SVGGElement; // select all the text elements\n if (firstTick?.getBoundingClientRect().left < internalMargin.left + 10) {\n firstTick.remove();\n }\n if (tickRotation)\n axisNode\n .selectAll('text')\n .style('text-anchor', tickRotation > 0 ? 'start' : 'end')\n .attr('dx', 8 * Math.sin(Math.PI * (tickRotation / 180)))\n .attr('dy', '.71em')\n .attr('y', 11.5 - 2.5 * (tickRotation / 15) * (tickRotation > 0 ? 1 : -1))\n .attr('transform', `rotate(${tickRotation})`);\n }\n }, [\n innerHeight,\n overwriteTicks,\n xAxis?.showGrid,\n tickFormat,\n tickValues,\n xScale,\n tickRotation,\n xAxis.type,\n ticksScales,\n tickCount,\n containerRatio,\n innerWidth,\n uniqueData.length,\n uniqueData,\n internalMargin.left,\n ]);\n if (xAxis.hideAxis) return null;\n return (\n <g transform={`translate(0,${innerHeight})`}>\n <g ref={setAxisBottomRef}>\n <StyledAxis axisColor={xAxis.color} tickColor={color} ref={axisRef}></StyledAxis>\n </g>\n\n <StyledGrid ref={gridRef}></StyledGrid>\n </g>\n );\n});\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,OAAOA,UAAS,YAAY,WAAW,cAAc;AACrD,SAAS,QAAQ,YAAY,kBAA0C;AACvE,SAAS,YAAY,kBAAkB;AACvC,SAAS,oBAAoB;AAE7B,SAAS,qBAAqB;AAEvB,MAAM,aAAaA,OAAM,KAAK,MAAM;AACzC,QAAM;AAAA,IACJ,OAAO,EAAE,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,UAAU,OAAsB,IAAI;AAC1C,QAAM,UAAU,OAAsB,IAAI;AAC1C,QAAM,EAAE,YAAY,YAAY,gBAAgB,OAAO,cAAc,UAAU,IAC7E,MAAM,QAAS,CAAC;AAElB,QAAM,cAAc,CAAC,UAAU,QAAQ,KAAK;AAG5C,QAAM,aAAa,cAAc;AACjC,YAAU,MAAM;AACd,UAAM,OAAO,WAAW,MAAqC,EAC1D,SAAS,CAAC,WAAW,EACrB,WAAW,EAAE,EACb,cAAc,CAAC;AAElB,UAAM,OAAO,WAAW,MAAqC,EAAE,cAAc,CAAC;AAE9E,QAAI,YAAY,SAAS,MAAM,IAAI,GAAG;AACpC,YAAM,YAAY,MAAM;AACtB,YAAI;AAAW,iBAAO;AACtB,YAAI,iBAAiB,GAAG;AACtB,iBAAQ,aAAa,MAAO;AAAA,QAC9B;AACA,eAAO,aAAa;AAAA,MACtB,GAAG;AACH,YAAM,QAAS,OAA0E,QAAQ,QAAQ;AAGzG,UAAI,iBAAiB,KAAK,WAAW,SAAS,IAAI;AAChD,cAAM,YAAY,WAAW,IAAI,CAAC,MAAM,EAAE,MAAM;AAChD,aAAK,WAAW,SAAS;AACzB,aAAK,WAAW,SAAS;AAAA,MAC3B,WAAW,cAAc,OAAO;AAC9B,cAAM,aAAa,iBAAiB,aAAa,CAAC,GAAG,OAAO,GAAG,UAAU;AACzE,aAAK,WAAW,UAAU;AAAA,MAC5B,OAAO;AACL,aAAK,WAAW,KAAK;AACrB,aAAK,WAAW,KAAK;AAAA,MACvB;AAEA,UAAI,YAAY;AACd,YAAI,OAAO,eAAe,UAAU;AAClC,gBAAM,kBAAkB,WAAW,UAAU;AAC7C,eAAK,WAAW,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAAA,QAC3C;AACA,YAAI,OAAO,eAAe,YAAY;AACpC,eAAK,WAAW,UAAU;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,SAAS,SAAS;AACxC,UAAI,OAAO;AAAU,eAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AACtD,YAAM,WAAW,OAAO,QAAQ,OAAO;AACvC,eAAS,KAAK,IAAI;AAGlB,YAAM,YAAY,SAAS,OAAO,OAAO,EAAE,KAAK;AAChD,UAAI,WAAW,sBAAsB,EAAE,OAAO,eAAe,OAAO,IAAI;AACtE,kBAAU,OAAO;AAAA,MACnB;AACA,UAAI;AACF,iBACG,UAAU,MAAM,EAChB,MAAM,eAAe,eAAe,IAAI,UAAU,KAAK,EACvD,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,MAAM,eAAe,IAAI,CAAC,EACvD,KAAK,MAAM,OAAO,EAClB,KAAK,KAAK,OAAO,OAAO,eAAe,OAAO,eAAe,IAAI,IAAI,GAAG,EACxE,KAAK,aAAa,UAAU,eAAe;AAAA,IAClD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,eAAe;AAAA,EACjB,CAAC;AACD,MAAI,MAAM;AAAU,WAAO;AAC3B,SACE,qBAAC;AAAA,IAAE,WAAW,eAAe;AAAA,IAC3B;AAAA,0BAAC;AAAA,QAAE,KAAK;AAAA,QACN,8BAAC;AAAA,UAAW,WAAW,MAAM;AAAA,UAAO,WAAW;AAAA,UAAO,KAAK;AAAA,SAAS;AAAA,OACtE;AAAA,MAEA,oBAAC;AAAA,QAAW,KAAK;AAAA,OAAS;AAAA;AAAA,GAC5B;AAEJ,CAAC;",
6
6
  "names": ["React"]
7
7
  }
@@ -11,20 +11,19 @@ const AxisLeft = () => {
11
11
  innerHeight,
12
12
  innerWidth,
13
13
  yScale,
14
+ chartId,
14
15
  setAxisLeftRef
15
16
  } = useContext(ChartContext);
16
- if (yAxis.hideAxis)
17
- return null;
18
- const ref = useRef();
19
- const gridRef = useRef();
20
- const ticks = yScale.ticks?.(yAxis.tickCount ?? height / 80);
21
- const hasNegativeDomain = yScale(innerHeight) < 0;
22
- const { tickFormat, type } = yAxis;
17
+ const ref = useRef(null);
18
+ const gridRef = useRef(null);
19
+ const { tickValues, color: tickColor, tickFormat, overwriteTicks, tickRotation, tickCount } = yAxis.tick || {};
20
+ const ticks = yScale.ticks?.(tickCount ?? height / 80);
21
+ const { type, showGrid, color: axisColor } = yAxis;
23
22
  useEffect(() => {
24
23
  const axis = axisLeft(yScale).tickSizeOuter(0);
25
- const grid = axisLeft(yScale).tickFormat((_) => "").tickSize(yAxis?.showGrid ? -innerWidth : 0).tickSizeOuter(0);
26
- if (yAxis.tickValues && ticks) {
27
- const finalTicks = yAxis.overwriteTicks ? yAxis.tickValues : [...ticks, ...yAxis.tickValues];
24
+ const grid = axisLeft(yScale).tickFormat((_) => "").tickSize(showGrid ? -innerWidth : 0).tickSizeOuter(0);
25
+ if (tickValues && ticks) {
26
+ const finalTicks = overwriteTicks ? tickValues : [...ticks, ...tickValues];
28
27
  axis.tickValues(finalTicks);
29
28
  } else {
30
29
  axis.tickValues(ticks);
@@ -41,21 +40,42 @@ const AxisLeft = () => {
41
40
  }
42
41
  if (ref?.current && gridRef?.current) {
43
42
  select(gridRef.current).call(grid);
44
- select(ref.current).call(axis);
43
+ const axisNode = select(ref.current);
44
+ axisNode.call(axis);
45
+ if (tickRotation)
46
+ axisNode.selectAll("text").style("text-anchor", "end").attr("dx", "-.8em").attr("dy", ".15em").attr("transform", `rotate(-${tickRotation})`);
45
47
  }
46
- }, [hasNegativeDomain, innerHeight, innerWidth, tickFormat, ticks, type, yAxis, yScale]);
48
+ }, [
49
+ innerHeight,
50
+ innerWidth,
51
+ overwriteTicks,
52
+ showGrid,
53
+ tickFormat,
54
+ tickRotation,
55
+ tickValues,
56
+ ticks,
57
+ type,
58
+ yAxis,
59
+ yScale
60
+ ]);
61
+ if (yAxis.hideAxis)
62
+ return null;
47
63
  return /* @__PURE__ */ jsxs("g", {
48
64
  children: [
65
+ /* @__PURE__ */ jsx("g", {
66
+ mask: `url(#mask-${chartId})`,
67
+ children: /* @__PURE__ */ jsx(StyledGrid, {
68
+ ref: gridRef
69
+ })
70
+ }),
49
71
  /* @__PURE__ */ jsx("g", {
50
72
  ref: setAxisLeftRef,
51
73
  children: /* @__PURE__ */ jsx(StyledAxis, {
74
+ axisColor,
52
75
  ref,
53
- color: yAxis.color,
76
+ tickColor,
54
77
  className: "axis-left"
55
78
  })
56
- }),
57
- /* @__PURE__ */ jsx(StyledGrid, {
58
- ref: gridRef
59
79
  })
60
80
  ]
61
81
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Axis/AxisLeft.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport React, { useContext, useEffect, useRef } from 'react';\nimport { select, axisLeft } from 'd3';\nimport { StyledAxis, StyledGrid } from '../../styles';\nimport { ChartContext } from '../../ChartContext';\nimport { getFormatGenerator } from '../../helpers';\nexport const AxisLeft = () => {\n const {\n props: { yAxis, height },\n innerHeight,\n innerWidth,\n yScale,\n setAxisLeftRef,\n } = useContext(ChartContext);\n if (yAxis.hideAxis) return null;\n\n const ref = useRef<SVGSVGElement>();\n const gridRef = useRef<SVGSVGElement>();\n const ticks = yScale.ticks?.(yAxis.tickCount ?? height / 80);\n const hasNegativeDomain = yScale(innerHeight) < 0;\n const { tickFormat, type } = yAxis;\n useEffect(() => {\n const axis = axisLeft(yScale).tickSizeOuter(0);\n\n const grid = axisLeft(yScale)\n .tickFormat((_) => '')\n .tickSize(yAxis?.showGrid ? -innerWidth : 0)\n .tickSizeOuter(0);\n\n if (yAxis.tickValues && ticks) {\n const finalTicks = yAxis.overwriteTicks ? yAxis.tickValues : [...ticks, ...yAxis.tickValues];\n axis.tickValues(finalTicks);\n } else {\n axis.tickValues(ticks);\n grid.tickValues(ticks);\n }\n\n if (tickFormat) {\n if (typeof tickFormat === 'string') {\n const formatGenerator = getFormatGenerator(type ?? 'linear');\n\n axis.tickFormat((d) => formatGenerator(tickFormat)(d));\n }\n if (typeof tickFormat === 'function') {\n axis.tickFormat(tickFormat);\n }\n }\n\n if (ref?.current && gridRef?.current) {\n select(gridRef.current).call(grid);\n select(ref.current).call(axis);\n\n // if (yAxis.hideAxis) {\n // select(ref.current).call((g) => {\n // g.selectAll('.tick').remove();\n // g.select('.domain').remove();\n // });\n // select(gridRef.current).call((g) => g.select('.domain').remove());\n // }\n }\n }, [hasNegativeDomain, innerHeight, innerWidth, tickFormat, ticks, type, yAxis, yScale]);\n return (\n <g>\n <g ref={setAxisLeftRef}>\n <StyledAxis ref={ref} color={yAxis.color} className=\"axis-left\"></StyledAxis>\n </g>\n\n <StyledGrid ref={gridRef}></StyledGrid>\n {/* {hasNegativeDomain ? (\n <line stroke=\"black\" strokeWidth={2} x1={0} x2={innerWidth} y1={yScale(0)} y2={yScale(0)} />\n ) : null} */}\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,YAAY,WAAW,cAAc;AACrD,SAAS,QAAQ,gBAAgB;AACjC,SAAS,YAAY,kBAAkB;AACvC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AAC5B,MAAM,WAAW,MAAM;AAC5B,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAC3B,MAAI,MAAM;AAAU,WAAO;AAE3B,QAAM,MAAM,OAAsB;AAClC,QAAM,UAAU,OAAsB;AACtC,QAAM,QAAQ,OAAO,QAAQ,MAAM,aAAa,SAAS,EAAE;AAC3D,QAAM,oBAAoB,OAAO,WAAW,IAAI;AAChD,QAAM,EAAE,YAAY,KAAK,IAAI;AAC7B,YAAU,MAAM;AACd,UAAM,OAAO,SAAS,MAAM,EAAE,cAAc,CAAC;AAE7C,UAAM,OAAO,SAAS,MAAM,EACzB,WAAW,CAAC,MAAM,EAAE,EACpB,SAAS,OAAO,WAAW,CAAC,aAAa,CAAC,EAC1C,cAAc,CAAC;AAElB,QAAI,MAAM,cAAc,OAAO;AAC7B,YAAM,aAAa,MAAM,iBAAiB,MAAM,aAAa,CAAC,GAAG,OAAO,GAAG,MAAM,UAAU;AAC3F,WAAK,WAAW,UAAU;AAAA,IAC5B,OAAO;AACL,WAAK,WAAW,KAAK;AACrB,WAAK,WAAW,KAAK;AAAA,IACvB;AAEA,QAAI,YAAY;AACd,UAAI,OAAO,eAAe,UAAU;AAClC,cAAM,kBAAkB,mBAAmB,QAAQ,QAAQ;AAE3D,aAAK,WAAW,CAAC,MAAM,gBAAgB,UAAU,EAAE,CAAC,CAAC;AAAA,MACvD;AACA,UAAI,OAAO,eAAe,YAAY;AACpC,aAAK,WAAW,UAAU;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,SAAS,SAAS;AACpC,aAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AACjC,aAAO,IAAI,OAAO,EAAE,KAAK,IAAI;AAAA,IAS/B;AAAA,EACF,GAAG,CAAC,mBAAmB,aAAa,YAAY,YAAY,OAAO,MAAM,OAAO,MAAM,CAAC;AACvF,SACE,qBAAC;AAAA,IACC;AAAA,0BAAC;AAAA,QAAE,KAAK;AAAA,QACN,8BAAC;AAAA,UAAW;AAAA,UAAU,OAAO,MAAM;AAAA,UAAO,WAAU;AAAA,SAAY;AAAA,OAClE;AAAA,MAEA,oBAAC;AAAA,QAAW,KAAK;AAAA,OAAS;AAAA;AAAA,GAI5B;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport React, { useContext, useEffect, useRef } from 'react';\nimport { select, axisLeft } from 'd3';\nimport { StyledAxis, StyledGrid } from '../../styles';\nimport { ChartContext } from '../../ChartContext';\nimport { getFormatGenerator } from '../../helpers';\nexport const AxisLeft = () => {\n const {\n props: { yAxis, height },\n innerHeight,\n innerWidth,\n yScale,\n chartId,\n setAxisLeftRef,\n } = useContext(ChartContext);\n\n const ref = useRef<SVGSVGElement>(null);\n const gridRef = useRef<SVGSVGElement>(null);\n const { tickValues, color: tickColor, tickFormat, overwriteTicks, tickRotation, tickCount } = yAxis.tick || {};\n\n const ticks = yScale.ticks?.(tickCount ?? height / 80);\n\n const { type, showGrid, color: axisColor } = yAxis;\n useEffect(() => {\n const axis = axisLeft(yScale).tickSizeOuter(0);\n\n const grid = axisLeft(yScale)\n .tickFormat((_) => '')\n .tickSize(showGrid ? -innerWidth : 0)\n .tickSizeOuter(0);\n\n if (tickValues && ticks) {\n const finalTicks = overwriteTicks ? tickValues : [...ticks, ...tickValues];\n axis.tickValues(finalTicks);\n } else {\n axis.tickValues(ticks);\n grid.tickValues(ticks);\n }\n\n if (tickFormat) {\n if (typeof tickFormat === 'string') {\n const formatGenerator = getFormatGenerator(type ?? 'linear');\n\n axis.tickFormat((d) => formatGenerator(tickFormat)(d));\n }\n if (typeof tickFormat === 'function') {\n axis.tickFormat(tickFormat);\n }\n }\n if (ref?.current && gridRef?.current) {\n select(gridRef.current).call(grid);\n const axisNode = select(ref.current);\n axisNode.call(axis);\n if (tickRotation)\n axisNode\n .selectAll('text')\n .style('text-anchor', 'end')\n .attr('dx', '-.8em')\n .attr('dy', '.15em')\n .attr('transform', `rotate(-${tickRotation})`);\n }\n }, [\n innerHeight,\n innerWidth,\n overwriteTicks,\n showGrid,\n tickFormat,\n tickRotation,\n tickValues,\n ticks,\n type,\n yAxis,\n yScale,\n ]);\n\n if (yAxis.hideAxis) return null;\n\n return (\n <g>\n <g mask={`url(#mask-${chartId})`}>\n <StyledGrid ref={gridRef}></StyledGrid>\n </g>\n <g ref={setAxisLeftRef}>\n <StyledAxis axisColor={axisColor} ref={ref} tickColor={tickColor} className=\"axis-left\"></StyledAxis>\n </g>\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,YAAY,WAAW,cAAc;AACrD,SAAS,QAAQ,gBAAgB;AACjC,SAAS,YAAY,kBAAkB;AACvC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AAC5B,MAAM,WAAW,MAAM;AAC5B,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,MAAM,OAAsB,IAAI;AACtC,QAAM,UAAU,OAAsB,IAAI;AAC1C,QAAM,EAAE,YAAY,OAAO,WAAW,YAAY,gBAAgB,cAAc,UAAU,IAAI,MAAM,QAAQ,CAAC;AAE7G,QAAM,QAAQ,OAAO,QAAQ,aAAa,SAAS,EAAE;AAErD,QAAM,EAAE,MAAM,UAAU,OAAO,UAAU,IAAI;AAC7C,YAAU,MAAM;AACd,UAAM,OAAO,SAAS,MAAM,EAAE,cAAc,CAAC;AAE7C,UAAM,OAAO,SAAS,MAAM,EACzB,WAAW,CAAC,MAAM,EAAE,EACpB,SAAS,WAAW,CAAC,aAAa,CAAC,EACnC,cAAc,CAAC;AAElB,QAAI,cAAc,OAAO;AACvB,YAAM,aAAa,iBAAiB,aAAa,CAAC,GAAG,OAAO,GAAG,UAAU;AACzE,WAAK,WAAW,UAAU;AAAA,IAC5B,OAAO;AACL,WAAK,WAAW,KAAK;AACrB,WAAK,WAAW,KAAK;AAAA,IACvB;AAEA,QAAI,YAAY;AACd,UAAI,OAAO,eAAe,UAAU;AAClC,cAAM,kBAAkB,mBAAmB,QAAQ,QAAQ;AAE3D,aAAK,WAAW,CAAC,MAAM,gBAAgB,UAAU,EAAE,CAAC,CAAC;AAAA,MACvD;AACA,UAAI,OAAO,eAAe,YAAY;AACpC,aAAK,WAAW,UAAU;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,KAAK,WAAW,SAAS,SAAS;AACpC,aAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AACjC,YAAM,WAAW,OAAO,IAAI,OAAO;AACnC,eAAS,KAAK,IAAI;AAClB,UAAI;AACF,iBACG,UAAU,MAAM,EAChB,MAAM,eAAe,KAAK,EAC1B,KAAK,MAAM,OAAO,EAClB,KAAK,MAAM,OAAO,EAClB,KAAK,aAAa,WAAW,eAAe;AAAA,IACnD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,MAAM;AAAU,WAAO;AAE3B,SACE,qBAAC;AAAA,IACC;AAAA,0BAAC;AAAA,QAAE,MAAM,aAAa;AAAA,QACpB,8BAAC;AAAA,UAAW,KAAK;AAAA,SAAS;AAAA,OAC5B;AAAA,MACA,oBAAC;AAAA,QAAE,KAAK;AAAA,QACN,8BAAC;AAAA,UAAW;AAAA,UAAsB;AAAA,UAAU;AAAA,UAAsB,WAAU;AAAA,SAAY;AAAA,OAC1F;AAAA;AAAA,GACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -6,27 +6,29 @@ import { StyledAxis } from "../../styles";
6
6
  import { ChartContext } from "../../ChartContext";
7
7
  const AxisRight = () => {
8
8
  const {
9
- props: { y2Axis, height },
9
+ props: { y2Axis },
10
10
  innerWidth,
11
11
  y2Scale,
12
12
  setAxisRightRef
13
13
  } = useContext(ChartContext);
14
- if (!y2Axis)
15
- return null;
16
- const ticks = y2Scale.ticks?.(y2Axis.tickCount ?? height / 80);
17
- const ref = useRef();
14
+ const { color: tickColor } = y2Axis?.tick || {};
15
+ const ref = useRef(null);
18
16
  useEffect(() => {
19
17
  const axis = axisRight(y2Scale).tickSizeOuter(0);
20
- select(ref.current).call(axis);
18
+ if (ref.current)
19
+ select(ref.current).call(axis);
21
20
  }, [innerWidth, y2Scale]);
21
+ if (!y2Axis)
22
+ return null;
22
23
  return /* @__PURE__ */ jsx("g", {
23
24
  ref: setAxisRightRef,
24
25
  transform: `translate(${innerWidth},0)`,
25
26
  children: /* @__PURE__ */ jsx(StyledAxis, {
27
+ axisColor: y2Axis?.color,
26
28
  ref,
27
- color: y2Axis.color
29
+ tickColor
28
30
  })
29
- }, ticks.toString());
31
+ });
30
32
  };
31
33
  export {
32
34
  AxisRight
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../../src/graphs/Chart/parts/Axis/AxisRight.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useEffect, useMemo, useRef } from 'react';\nimport { select, axisRight } from 'd3';\nimport { StyledAxis, StyledAxisLabel } from '../../styles';\nimport { ChartContext } from '../../ChartContext';\nexport const AxisRight = () => {\n const {\n props: { y2Axis, height },\n innerWidth,\n y2Scale,\n setAxisRightRef,\n } = useContext(ChartContext);\n if (!y2Axis) return null;\n\n const ticks = y2Scale.ticks?.(y2Axis.tickCount ?? height / 80);\n\n const ref = useRef();\n useEffect(() => {\n const axis = axisRight(y2Scale).tickSizeOuter(0);\n\n select(ref.current).call(axis);\n }, [innerWidth, y2Scale]);\n\n return (\n <g key={ticks.toString()} ref={setAxisRightRef} transform={`translate(${innerWidth},0)`}>\n <StyledAxis ref={ref} color={y2Axis.color} />\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,WAAoB,cAAc;AAC9D,SAAS,QAAQ,iBAAiB;AAClC,SAAS,kBAAmC;AAC5C,SAAS,oBAAoB;AACtB,MAAM,YAAY,MAAM;AAC7B,QAAM;AAAA,IACJ,OAAO,EAAE,QAAQ,OAAO;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAC3B,MAAI,CAAC;AAAQ,WAAO;AAEpB,QAAM,QAAQ,QAAQ,QAAQ,OAAO,aAAa,SAAS,EAAE;AAE7D,QAAM,MAAM,OAAO;AACnB,YAAU,MAAM;AACd,UAAM,OAAO,UAAU,OAAO,EAAE,cAAc,CAAC;AAE/C,WAAO,IAAI,OAAO,EAAE,KAAK,IAAI;AAAA,EAC/B,GAAG,CAAC,YAAY,OAAO,CAAC;AAExB,SACE,oBAAC;AAAA,IAAyB,KAAK;AAAA,IAAiB,WAAW,aAAa;AAAA,IACtE,8BAAC;AAAA,MAAW;AAAA,MAAU,OAAO,OAAO;AAAA,KAAO;AAAA,KADrC,MAAM,SAAS,CAEvB;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useEffect, useRef } from 'react';\nimport { select, axisRight } from 'd3';\nimport { StyledAxis } from '../../styles';\nimport { ChartContext } from '../../ChartContext';\nexport const AxisRight = () => {\n const {\n props: { y2Axis },\n innerWidth,\n y2Scale,\n setAxisRightRef,\n } = useContext(ChartContext);\n\n const { color: tickColor } = y2Axis?.tick || {};\n const ref = useRef<SVGGElement>(null);\n useEffect(() => {\n const axis = axisRight(y2Scale).tickSizeOuter(0);\n\n if (ref.current) select(ref.current).call(axis);\n }, [innerWidth, y2Scale]);\n if (!y2Axis) return null;\n return (\n <g ref={setAxisRightRef} transform={`translate(${innerWidth},0)`}>\n <StyledAxis axisColor={y2Axis?.color} ref={ref} tickColor={tickColor} />\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,WAAW,cAAc;AACrD,SAAS,QAAQ,iBAAiB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AACtB,MAAM,YAAY,MAAM;AAC7B,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,YAAY;AAE3B,QAAM,EAAE,OAAO,UAAU,IAAI,QAAQ,QAAQ,CAAC;AAC9C,QAAM,MAAM,OAAoB,IAAI;AACpC,YAAU,MAAM;AACd,UAAM,OAAO,UAAU,OAAO,EAAE,cAAc,CAAC;AAE/C,QAAI,IAAI;AAAS,aAAO,IAAI,OAAO,EAAE,KAAK,IAAI;AAAA,EAChD,GAAG,CAAC,YAAY,OAAO,CAAC;AACxB,MAAI,CAAC;AAAQ,WAAO;AACpB,SACE,oBAAC;AAAA,IAAE,KAAK;AAAA,IAAiB,WAAW,aAAa;AAAA,IAC/C,8BAAC;AAAA,MAAW,WAAW,QAAQ;AAAA,MAAO;AAAA,MAAU;AAAA,KAAsB;AAAA,GACxE;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -6,9 +6,12 @@ import { ChartContext } from "../ChartContext";
6
6
  import { useKeyboardNavigation } from "../config/useKeyboardNavigation";
7
7
  import { Legend } from "./Legend/Legend";
8
8
  import { Label } from "./Labels/Label";
9
- const ChartContainer = ({ children }) => {
9
+ import { BlurMask } from "./Scroller/BlurMask";
10
+ import { ClipPaths } from "./ClipPaths";
11
+ import { Axes } from "./Axis/Axes";
12
+ const ChartContainer = () => {
10
13
  const {
11
- props: { width, height },
14
+ props: { width, height, xAxis, yAxis },
12
15
  containerRef,
13
16
  activePoint,
14
17
  internalMargin,
@@ -30,8 +33,8 @@ const ChartContainer = ({ children }) => {
30
33
  yScale,
31
34
  currentData
32
35
  } = useContext(ChartContext);
33
- if (currentData.length === 0)
34
- return null;
36
+ const xScroll = xAxis.advanced?.pointSpacing?.value > 1;
37
+ const yScroll = yAxis.advanced?.pointSpacing?.value > 1;
35
38
  const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();
36
39
  const onMouseEnterHandler = useCallback(() => {
37
40
  setIsScrollbarVisible(true);
@@ -47,15 +50,37 @@ const ChartContainer = ({ children }) => {
47
50
  if (!isGrabbed)
48
51
  return;
49
52
  setActivePoint(null);
50
- const newPosition = oldLastPosition?.current + e.clientX - startPosition;
51
- if (newPosition < 0)
52
- setXScrollbarPosition(0);
53
- else if (newPosition > innerWidth - innerWidth / containerRatio)
54
- setXScrollbarPosition(innerWidth - innerWidth / containerRatio);
55
- else
56
- setXScrollbarPosition(newPosition);
53
+ if (xScroll) {
54
+ const newPosition = oldLastPosition?.current + e.clientX - startPosition;
55
+ if (newPosition < 0)
56
+ setXScrollbarPosition(0);
57
+ else if (newPosition > innerWidth - innerWidth / containerRatio)
58
+ setXScrollbarPosition(innerWidth - innerWidth / containerRatio);
59
+ else
60
+ setXScrollbarPosition(newPosition);
61
+ }
62
+ if (yScroll) {
63
+ const newPosition = oldLastPosition?.current + e.clientY - startPosition;
64
+ if (newPosition < 0)
65
+ setXScrollbarPosition(0);
66
+ else if (newPosition > innerHeight - innerHeight / containerRatio)
67
+ setXScrollbarPosition(innerHeight - innerHeight / containerRatio);
68
+ else
69
+ setXScrollbarPosition(newPosition);
70
+ }
57
71
  },
58
- [isGrabbed, setActivePoint, oldLastPosition, startPosition, setXScrollbarPosition, innerWidth, containerRatio]
72
+ [
73
+ isGrabbed,
74
+ setActivePoint,
75
+ xScroll,
76
+ yScroll,
77
+ oldLastPosition,
78
+ startPosition,
79
+ setXScrollbarPosition,
80
+ innerWidth,
81
+ containerRatio,
82
+ innerHeight
83
+ ]
59
84
  );
60
85
  const handleMouseUp = useCallback(() => {
61
86
  oldLastPosition.current = xScrollbarPosition;
@@ -67,10 +92,13 @@ const ChartContainer = ({ children }) => {
67
92
  );
68
93
  useEffect(() => {
69
94
  containerRef?.current?.addEventListener("mousemove", handleMouseMove);
95
+ const container = containerRef?.current;
70
96
  return () => {
71
- containerRef?.current?.removeEventListener("mousemove", handleMouseMove);
97
+ container?.removeEventListener("mousemove", handleMouseMove);
72
98
  };
73
99
  }, [containerRef, handleMouseMove]);
100
+ if (currentData.length === 0)
101
+ return null;
74
102
  return /* @__PURE__ */ jsx(StyledSVGWrapper, {
75
103
  ref: containerRef,
76
104
  onKeyDown: onInputKeyDown,
@@ -84,57 +112,29 @@ const ChartContainer = ({ children }) => {
84
112
  onMouseDown: (e) => e.preventDefault(),
85
113
  isGrabbed,
86
114
  style: { width },
87
- children: /* @__PURE__ */ jsx("svg", {
115
+ children: /* @__PURE__ */ jsxs("svg", {
88
116
  ref: svgRef,
89
117
  width,
90
118
  height,
91
- children: /* @__PURE__ */ jsxs("g", {
92
- children: [
93
- /* @__PURE__ */ jsxs("g", {
94
- children: [
95
- /* @__PURE__ */ jsx(Legend, {}),
96
- /* @__PURE__ */ jsx(Label, {})
97
- ]
98
- }),
99
- /* @__PURE__ */ jsx("g", {
100
- className: "container",
101
- transform: `translate(${internalMargin.left},${internalMargin.top})`,
102
- children
103
- }),
104
- /* @__PURE__ */ jsx("defs", {
105
- children: /* @__PURE__ */ jsx("clipPath", {
106
- id: `rect-focus-ring-${chartId}`,
107
- children: /* @__PURE__ */ jsx("rect", {
108
- width: innerWidth * containerRatio,
109
- height: innerHeight + 4,
110
- y: -4
111
- })
112
- })
113
- }),
114
- /* @__PURE__ */ jsx("defs", {
115
- children: /* @__PURE__ */ jsx("clipPath", {
116
- id: `rects-positive-${chartId}`,
117
- children: /* @__PURE__ */ jsx("rect", {
118
- width: innerWidth * containerRatio,
119
- height: yScale(0) + 8,
120
- y: -8,
121
- x: -10
122
- })
123
- })
124
- }),
125
- innerHeight - yScale(0) > 0 ? /* @__PURE__ */ jsx("defs", {
126
- children: /* @__PURE__ */ jsx("clipPath", {
127
- id: `rects-negative-${chartId}`,
128
- children: /* @__PURE__ */ jsx("rect", {
129
- width: innerWidth * containerRatio,
130
- height: innerHeight - yScale(0),
131
- x: -10,
132
- y: yScale(0)
133
- })
119
+ children: [
120
+ /* @__PURE__ */ jsx(BlurMask, {}),
121
+ /* @__PURE__ */ jsxs("g", {
122
+ children: [
123
+ /* @__PURE__ */ jsxs("g", {
124
+ children: [
125
+ /* @__PURE__ */ jsx(Legend, {}),
126
+ /* @__PURE__ */ jsx(Label, {})
127
+ ]
128
+ }),
129
+ /* @__PURE__ */ jsx("g", {
130
+ className: "container",
131
+ transform: `translate(${internalMargin.left},${internalMargin.top})`,
132
+ children: /* @__PURE__ */ jsx(Axes, {})
134
133
  })
135
- }) : null
136
- ]
137
- }, key)
134
+ ]
135
+ }, key),
136
+ /* @__PURE__ */ jsx(ClipPaths, {})
137
+ ]
138
138
  })
139
139
  });
140
140
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/graphs/Chart/parts/ChartContainer.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo, useCallback, useEffect } from 'react';\nimport { StyledSVGWrapper } from '../styles';\n\nimport { ChartContext } from '../ChartContext';\nimport { useKeyboardNavigation } from '../config/useKeyboardNavigation';\nimport { Legend } from './Legend/Legend';\nimport { Label } from './Labels/Label';\ninterface ChartContainerT {\n children: JSX.Element | JSX.Element[] | string | string[];\n}\nexport const ChartContainer: React.ComponentType<ChartContainerT> = ({ children }) => {\n const {\n props: { width, height },\n containerRef,\n activePoint,\n internalMargin,\n setScrapperPosY,\n setScrapperPosX,\n svgRef,\n isGrabbed,\n setIsGrabbed,\n startPosition,\n innerWidth,\n innerHeight,\n setActivePoint,\n setXScrollbarPosition,\n xScrollbarPosition,\n containerRatio,\n oldLastPosition,\n setIsScrollbarVisible,\n chartId,\n yScale,\n currentData,\n } = useContext(ChartContext);\n\n if (currentData.length === 0) return null;\n const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();\n\n const onMouseEnterHandler = useCallback(() => {\n setIsScrollbarVisible(true);\n }, [setIsScrollbarVisible]);\n const onMouseLeaveHandler = useCallback(() => {\n setScrapperPosY('');\n setScrapperPosX('');\n setIsScrollbarVisible(false);\n setIsGrabbed(false);\n }, [setIsGrabbed, setIsScrollbarVisible, setScrapperPosX, setScrapperPosY]);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isGrabbed) return;\n setActivePoint(null);\n const newPosition = oldLastPosition?.current + e.clientX - startPosition;\n if (newPosition < 0) setXScrollbarPosition(0);\n else if (newPosition > innerWidth - innerWidth / containerRatio)\n setXScrollbarPosition(innerWidth - innerWidth / containerRatio);\n else setXScrollbarPosition(newPosition);\n },\n [isGrabbed, setActivePoint, oldLastPosition, startPosition, setXScrollbarPosition, innerWidth, containerRatio],\n );\n const handleMouseUp = useCallback(() => {\n oldLastPosition.current = xScrollbarPosition;\n setIsGrabbed(false);\n }, [oldLastPosition, setIsGrabbed, xScrollbarPosition]);\n const key = useMemo(\n () => `translate(${internalMargin.left},${internalMargin.top},${internalMargin.right})`,\n [internalMargin],\n );\n\n useEffect(() => {\n containerRef?.current?.addEventListener('mousemove', handleMouseMove);\n // containerRef?.current?.addEventListener('wheel', handleScroll);\n\n return () => {\n containerRef?.current?.removeEventListener('mousemove', handleMouseMove);\n // containerRef?.current?.removeEventListener('wheel', handleScroll);\n };\n }, [containerRef, handleMouseMove]);\n\n return (\n <StyledSVGWrapper\n ref={containerRef}\n onKeyDown={onInputKeyDown}\n aria-hidden=\"true\"\n tabIndex={activePoint ? -1 : 0}\n onBlur={handleOnBlur}\n onFocus={handleOnFocus}\n onMouseEnter={onMouseEnterHandler}\n onMouseLeave={onMouseLeaveHandler}\n // // onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseDown={(e) => e.preventDefault()}\n isGrabbed={isGrabbed}\n style={{ width }}\n >\n <svg ref={svgRef} width={width} height={height}>\n <g key={key}>\n <g>\n <Legend />\n <Label />\n </g>\n <g className=\"container\" transform={`translate(${internalMargin.left},${internalMargin.top})`}>\n {children}\n </g>\n {/* @todo we need to put this somewhere. this will clip the focus ring bottom line */}\n <defs>\n <clipPath id={`rect-focus-ring-${chartId}`}>\n <rect width={innerWidth * containerRatio} height={innerHeight + 4} y={-4} />\n </clipPath>\n </defs>\n <defs>\n <clipPath id={`rects-positive-${chartId}`}>\n <rect width={innerWidth * containerRatio} height={yScale(0) + 8} y={-8} x={-10} />\n </clipPath>\n </defs>\n {innerHeight - yScale(0) > 0 ? (\n <defs>\n <clipPath id={`rects-negative-${chartId}`}>\n <rect width={innerWidth * containerRatio} height={innerHeight - yScale(0)} x={-10} y={yScale(0)} />\n </clipPath>\n </defs>\n ) : null}\n </g>\n </svg>\n </StyledSVGWrapper>\n );\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo, useCallback, useEffect } from 'react';\nimport { StyledSVGWrapper } from '../styles';\n\nimport { ChartContext } from '../ChartContext';\nimport { useKeyboardNavigation } from '../config/useKeyboardNavigation';\nimport { Legend } from './Legend/Legend';\nimport { Label } from './Labels/Label';\nimport { BlurMask } from './Scroller/BlurMask';\nimport { ClipPaths } from './ClipPaths';\nimport { Axes } from './Axis/Axes';\n\nexport const ChartContainer = () => {\n const {\n props: { width, height, xAxis, yAxis },\n containerRef,\n activePoint,\n internalMargin,\n setScrapperPosY,\n setScrapperPosX,\n svgRef,\n isGrabbed,\n setIsGrabbed,\n startPosition,\n innerWidth,\n innerHeight,\n setActivePoint,\n setXScrollbarPosition,\n xScrollbarPosition,\n containerRatio,\n oldLastPosition,\n setIsScrollbarVisible,\n chartId,\n yScale,\n currentData,\n } = useContext(ChartContext);\n\n const xScroll = xAxis.advanced?.pointSpacing?.value > 1;\n const yScroll = yAxis.advanced?.pointSpacing?.value > 1;\n const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();\n\n const onMouseEnterHandler = useCallback(() => {\n setIsScrollbarVisible(true);\n }, [setIsScrollbarVisible]);\n const onMouseLeaveHandler = useCallback(() => {\n setScrapperPosY('');\n setScrapperPosX('');\n setIsScrollbarVisible(false);\n setIsGrabbed(false);\n }, [setIsGrabbed, setIsScrollbarVisible, setScrapperPosX, setScrapperPosY]);\n\n const handleMouseMove: React.MouseEventHandler = useCallback(\n (e) => {\n if (!isGrabbed) return;\n setActivePoint(null);\n\n if (xScroll) {\n const newPosition = oldLastPosition?.current + e.clientX - startPosition;\n if (newPosition < 0) setXScrollbarPosition(0);\n else if (newPosition > innerWidth - innerWidth / containerRatio)\n setXScrollbarPosition(innerWidth - innerWidth / containerRatio);\n else setXScrollbarPosition(newPosition);\n }\n if (yScroll) {\n const newPosition = oldLastPosition?.current + e.clientY - startPosition;\n if (newPosition < 0) setXScrollbarPosition(0);\n else if (newPosition > innerHeight - innerHeight / containerRatio)\n setXScrollbarPosition(innerHeight - innerHeight / containerRatio);\n else setXScrollbarPosition(newPosition);\n }\n },\n [\n isGrabbed,\n setActivePoint,\n xScroll,\n yScroll,\n oldLastPosition,\n startPosition,\n setXScrollbarPosition,\n innerWidth,\n containerRatio,\n innerHeight,\n ],\n );\n const handleMouseUp = useCallback(() => {\n oldLastPosition.current = xScrollbarPosition;\n setIsGrabbed(false);\n }, [oldLastPosition, setIsGrabbed, xScrollbarPosition]);\n const key = useMemo(\n () => `translate(${internalMargin.left},${internalMargin.top},${internalMargin.right})`,\n [internalMargin],\n );\n\n useEffect(() => {\n containerRef?.current?.addEventListener('mousemove', handleMouseMove);\n // containerRef?.current?.addEventListener('wheel', handleScroll);\n const container = containerRef?.current;\n return () => {\n container?.removeEventListener('mousemove', handleMouseMove);\n // containerRef?.current?.removeEventListener('wheel', handleScroll);\n };\n }, [containerRef, handleMouseMove]);\n\n if (currentData.length === 0) return null;\n\n return (\n <StyledSVGWrapper\n ref={containerRef}\n onKeyDown={onInputKeyDown}\n aria-hidden=\"true\"\n tabIndex={activePoint ? -1 : 0}\n onBlur={handleOnBlur}\n onFocus={handleOnFocus}\n onMouseEnter={onMouseEnterHandler}\n onMouseLeave={onMouseLeaveHandler}\n // // onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseDown={(e) => e.preventDefault()}\n isGrabbed={isGrabbed}\n style={{ width }}\n >\n <svg ref={svgRef} width={width} height={height}>\n <BlurMask />\n <g key={key}>\n <g>\n <Legend />\n <Label />\n </g>\n <g className=\"container\" transform={`translate(${internalMargin.left},${internalMargin.top})`}>\n <Axes />\n </g>\n </g>\n {/* this clipaths for animations and focus ring.. need to give a deeper look */}\n <ClipPaths />\n </svg>\n </StyledSVGWrapper>\n );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,59 @@
1
+ import * as React from "react";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useContext } from "react";
4
+ import { ChartContext } from "../ChartContext";
5
+ const ClipPaths = () => {
6
+ const {
7
+ innerWidth,
8
+ containerRatio,
9
+ innerHeight,
10
+ chartId,
11
+ yScale,
12
+ props: { xAxis, yAxis }
13
+ } = useContext(ChartContext);
14
+ const yScroll = yAxis.advanced?.pointSpacing?.value > 1;
15
+ return /* @__PURE__ */ jsxs(Fragment, {
16
+ children: [
17
+ /* @__PURE__ */ jsx("defs", {
18
+ children: /* @__PURE__ */ jsx("clipPath", {
19
+ id: `rect-focus-ring-${chartId}`,
20
+ children: yScroll ? /* @__PURE__ */ jsx("rect", {
21
+ width: innerWidth + 4,
22
+ height: innerHeight * containerRatio,
23
+ x: -4
24
+ }) : /* @__PURE__ */ jsx("rect", {
25
+ width: innerWidth * containerRatio,
26
+ height: innerHeight + 4,
27
+ y: -4
28
+ })
29
+ })
30
+ }),
31
+ /* @__PURE__ */ jsx("defs", {
32
+ children: /* @__PURE__ */ jsx("clipPath", {
33
+ id: `rects-positive-${chartId}`,
34
+ children: /* @__PURE__ */ jsx("rect", {
35
+ width: innerWidth * containerRatio,
36
+ height: yScale(0) + 8,
37
+ y: -8,
38
+ x: -10
39
+ })
40
+ })
41
+ }),
42
+ innerHeight - yScale(0) > 0 ? /* @__PURE__ */ jsx("defs", {
43
+ children: /* @__PURE__ */ jsx("clipPath", {
44
+ id: `rects-negative-${chartId}`,
45
+ children: /* @__PURE__ */ jsx("rect", {
46
+ width: innerWidth * containerRatio,
47
+ height: innerHeight - yScale(0),
48
+ x: -10,
49
+ y: yScale(0)
50
+ })
51
+ })
52
+ }) : null
53
+ ]
54
+ });
55
+ };
56
+ export {
57
+ ClipPaths
58
+ };
59
+ //# sourceMappingURL=ClipPaths.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/graphs/Chart/parts/ClipPaths.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable arrow-body-style */\n/* eslint-disable indent */\nimport React, { useContext } from 'react';\nimport { ChartContext } from '../ChartContext';\n\nexport const ClipPaths = () => {\n const {\n innerWidth,\n containerRatio,\n innerHeight,\n chartId,\n yScale,\n props: { xAxis, yAxis },\n } = useContext(ChartContext);\n\n const yScroll = yAxis.advanced?.pointSpacing?.value > 1;\n\n return (\n <>\n <defs>\n <clipPath id={`rect-focus-ring-${chartId}`}>\n {yScroll ? (\n <rect width={innerWidth + 4} height={innerHeight * containerRatio} x={-4} />\n ) : (\n <rect width={innerWidth * containerRatio} height={innerHeight + 4} y={-4} />\n )}\n </clipPath>\n </defs>\n <defs>\n <clipPath id={`rects-positive-${chartId}`}>\n <rect width={innerWidth * containerRatio} height={yScale(0) + 8} y={-8} x={-10} />\n </clipPath>\n </defs>\n {innerHeight - yScale(0) > 0 ? (\n <defs>\n <clipPath id={`rects-negative-${chartId}`}>\n <rect width={innerWidth * containerRatio} height={innerHeight - yScale(0)} x={-10} y={yScale(0)} />\n </clipPath>\n </defs>\n ) : null}\n </>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAEA,SAAgB,kBAAkB;AAClC,SAAS,oBAAoB;AAEtB,MAAM,YAAY,MAAM;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,MAAM;AAAA,EACxB,IAAI,WAAW,YAAY;AAE3B,QAAM,UAAU,MAAM,UAAU,cAAc,QAAQ;AAEtD,SACE;AAAA,IACE;AAAA,0BAAC;AAAA,QACC,8BAAC;AAAA,UAAS,IAAI,mBAAmB;AAAA,UAC9B,oBACC,oBAAC;AAAA,YAAK,OAAO,aAAa;AAAA,YAAG,QAAQ,cAAc;AAAA,YAAgB,GAAG;AAAA,WAAI,IAE1E,oBAAC;AAAA,YAAK,OAAO,aAAa;AAAA,YAAgB,QAAQ,cAAc;AAAA,YAAG,GAAG;AAAA,WAAI;AAAA,SAE9E;AAAA,OACF;AAAA,MACA,oBAAC;AAAA,QACC,8BAAC;AAAA,UAAS,IAAI,kBAAkB;AAAA,UAC9B,8BAAC;AAAA,YAAK,OAAO,aAAa;AAAA,YAAgB,QAAQ,OAAO,CAAC,IAAI;AAAA,YAAG,GAAG;AAAA,YAAI,GAAG;AAAA,WAAK;AAAA,SAClF;AAAA,OACF;AAAA,MACC,cAAc,OAAO,CAAC,IAAI,IACzB,oBAAC;AAAA,QACC,8BAAC;AAAA,UAAS,IAAI,kBAAkB;AAAA,UAC9B,8BAAC;AAAA,YAAK,OAAO,aAAa;AAAA,YAAgB,QAAQ,cAAc,OAAO,CAAC;AAAA,YAAG,GAAG;AAAA,YAAK,GAAG,OAAO,CAAC;AAAA,WAAG;AAAA,SACnG;AAAA,OACF,IACE;AAAA;AAAA,GACN;AAEJ;",
6
+ "names": []
7
+ }
@@ -9,15 +9,15 @@ const BottomLabel = () => {
9
9
  setBottomLabel,
10
10
  innerHeight,
11
11
  innerWidth,
12
+ axisBottomHeight,
12
13
  props: { xAxis }
13
14
  } = useContext(ChartContext);
14
15
  return /* @__PURE__ */ jsx("g", {
15
16
  ref: setBottomLabel,
16
- transform: `translate(${innerWidth / 2 + internalMargin.left},${innerHeight + internalMargin.top})`,
17
+ transform: `translate(${innerWidth / 2 + internalMargin.left},${innerHeight + axisBottomHeight + internalMargin.top + 20})`,
17
18
  children: /* @__PURE__ */ jsx(StyledAxisLabel, {
18
19
  className: "axis-label",
19
20
  textAnchor: "middle",
20
- dy: 35,
21
21
  children: xAxis?.label
22
22
  })
23
23
  });