@elliemae/ds-dataviz-pie 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 (40) hide show
  1. package/dist/cjs/PieContext.js +1 -11
  2. package/dist/cjs/PieContext.js.map +2 -2
  3. package/dist/cjs/config/useKeyboardNavigation.js +13 -57
  4. package/dist/cjs/config/useKeyboardNavigation.js.map +2 -2
  5. package/dist/cjs/config/usePie.js +11 -5
  6. package/dist/cjs/config/usePie.js.map +2 -2
  7. package/dist/cjs/{parts/Tooltip.js → helpers/colorPallet.js} +24 -28
  8. package/dist/cjs/helpers/colorPallet.js.map +7 -0
  9. package/dist/cjs/index.js +2 -0
  10. package/dist/cjs/index.js.map +2 -2
  11. package/dist/cjs/parts/ChartContainer.js +8 -3
  12. package/dist/cjs/parts/ChartContainer.js.map +2 -2
  13. package/dist/cjs/parts/Pie.js +3 -2
  14. package/dist/cjs/parts/Pie.js.map +2 -2
  15. package/dist/cjs/parts/Slice.js +49 -34
  16. package/dist/cjs/parts/Slice.js.map +2 -2
  17. package/dist/cjs/styles.js +17 -57
  18. package/dist/cjs/styles.js.map +2 -2
  19. package/dist/esm/PieContext.js +2 -12
  20. package/dist/esm/PieContext.js.map +2 -2
  21. package/dist/esm/config/useKeyboardNavigation.js +14 -58
  22. package/dist/esm/config/useKeyboardNavigation.js.map +2 -2
  23. package/dist/esm/config/usePie.js +11 -5
  24. package/dist/esm/config/usePie.js.map +2 -2
  25. package/dist/esm/helpers/colorPallet.js +25 -0
  26. package/dist/esm/helpers/colorPallet.js.map +7 -0
  27. package/dist/esm/index.js +2 -0
  28. package/dist/esm/index.js.map +2 -2
  29. package/dist/esm/parts/ChartContainer.js +8 -3
  30. package/dist/esm/parts/ChartContainer.js.map +2 -2
  31. package/dist/esm/parts/Pie.js +3 -2
  32. package/dist/esm/parts/Pie.js.map +2 -2
  33. package/dist/esm/parts/Slice.js +50 -35
  34. package/dist/esm/parts/Slice.js.map +2 -2
  35. package/dist/esm/styles.js +18 -58
  36. package/dist/esm/styles.js.map +2 -2
  37. package/package.json +8 -8
  38. package/dist/cjs/parts/Tooltip.js.map +0 -7
  39. package/dist/esm/parts/Tooltip.js +0 -29
  40. package/dist/esm/parts/Tooltip.js.map +0 -7
@@ -24,14 +24,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
25
  var styles_exports = {};
26
26
  __export(styles_exports, {
27
- StyleFocusableRegion: () => StyleFocusableRegion,
28
- StyledArea: () => StyledArea,
29
- StyledAxis: () => StyledAxis,
30
- StyledGrid: () => StyledGrid,
31
- StyledLine: () => StyledLine,
32
- StyledMark: () => StyledMark,
33
- StyledPoint: () => StyledPoint,
34
- StyledSVGWrapper: () => StyledSVGWrapper
27
+ StyledInnerText: () => StyledInnerText,
28
+ StyledMouseOverDetectionBox: () => StyledMouseOverDetectionBox,
29
+ StyledSVGWrapper: () => StyledSVGWrapper,
30
+ StyledTooltipContainer: () => StyledTooltipContainer
35
31
  });
36
32
  module.exports = __toCommonJS(styles_exports);
37
33
  var React = __toESM(require("react"));
@@ -44,56 +40,20 @@ const StyledSVGWrapper = import_ds_system.styled.div`
44
40
  outline: none;
45
41
  }
46
42
  `;
47
- const StyledAxis = (0, import_ds_system.styled)("g")`
48
- text {
49
- fill: #635f5d;
50
- }
51
-
52
- text.axis-label {
53
- font-size: 2.5em;
54
- }
55
-
56
- .tick text {
57
- ${({ color }) => color ? `fill: ${color}` : ""}
58
- }
59
- .tick line {
60
- ${({ color }) => color ? `stroke: ${color}` : ""}
61
- }
62
- line {
63
- stroke: #c0c0bb;
64
- }
65
- `;
66
- const StyledGrid = (0, import_ds_system.styled)("g")`
67
- line {
68
- stroke: #c0c0bb;
69
- }
70
- `;
71
- const borderCircle = import_ds_system.css`
72
- stroke: red;
73
- stroke-width: 2;
74
- `;
75
- const StyledMark = (0, import_ds_system.styled)("rect")`
76
- ${({ isFocused }) => isFocused ? borderCircle : ""};
77
- `;
78
- const StyleFocusableRegion = (0, import_ds_system.styled)("div")`
79
- width: ${({ s }) => s * 2}px;
80
- height: ${({ s }) => s * 2}px;
81
- :focus {
82
- outline: none;
83
- }
84
- `;
85
- const StyledLine = (0, import_ds_system.styled)("path")`
86
- fill: none;
87
- stroke-width: ${({ isActiveLine }) => isActiveLine ? 5 : 3};
88
- stroke-linejoin: round;
43
+ const StyledInnerText = import_ds_system.styled.text`
44
+ font-size: 14px;
45
+ font-weight: 600;
89
46
  `;
90
- const StyledArea = (0, import_ds_system.styled)("path")`
91
- stroke-width: ${({ isActiveLine }) => isActiveLine ? 5 : 3};
92
- stroke-linejoin: round;
93
- opacity: 0.8;
47
+ const StyledTooltipContainer = import_ds_system.styled.div`
48
+ max-width: 350px;
49
+ background-color: white;
94
50
  `;
95
- const StyledPoint = (0, import_ds_system.styled)("circle")`
96
- opacity: ${({ opacity }) => opacity};
97
- ${({ isFocused }) => isFocused ? borderCircle : ""};
51
+ const StyledMouseOverDetectionBox = import_ds_system.styled.div`
52
+ position: absolute;
53
+ top: -15px;
54
+ right: -15px;
55
+ width: calc(100% + 30px);
56
+ height: calc(100% + 30px);
57
+ z-index: -1;
98
58
  `;
99
59
  //# sourceMappingURL=styles.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/styles.tsx", "../../../../scripts/build/transpile/react-shim.js"],
4
- "sourcesContent": ["import { styled, css } from '@elliemae/ds-system';\n\nexport const StyledSVGWrapper = styled.div`\n :focus {\n outline: none;\n }\n :focus-within {\n outline: none;\n }\n`;\n\nexport const StyledAxis = styled('g')`\n text {\n fill: #635f5d;\n }\n\n text.axis-label {\n font-size: 2.5em;\n }\n\n .tick text {\n ${({ color }) => (color ? `fill: ${color}` : '')}\n }\n .tick line {\n ${({ color }) => (color ? `stroke: ${color}` : '')}\n }\n line {\n stroke: #c0c0bb;\n }\n`;\n\nexport const StyledGrid = styled('g')`\n line {\n stroke: #c0c0bb;\n }\n`;\n\nconst borderCircle = css`\n stroke: red;\n stroke-width: 2;\n`;\nexport const StyledMark = styled('rect')<{ isFocused: boolean }>`\n ${({ isFocused }) => (isFocused ? borderCircle : '')};\n`;\n\nexport const StyleFocusableRegion = styled('div')<{ s: number }>`\n width: ${({ s }) => s * 2 ?? '1'}px;\n height: ${({ s }) => s * 2 ?? '1'}px;\n :focus {\n outline: none;\n }\n`;\n\nexport const StyledLine = styled('path')`\n fill: none;\n stroke-width: ${({ isActiveLine }) => (isActiveLine ? 5 : 3)};\n stroke-linejoin: round;\n`;\nexport const StyledArea = styled('path')`\n stroke-width: ${({ isActiveLine }) => (isActiveLine ? 5 : 3)};\n stroke-linejoin: round;\n opacity: 0.8;\n`;\n\nexport const StyledPoint = styled('circle')<{ isFocused: boolean }>`\n opacity: ${({ opacity }) => opacity};\n ${({ isFocused }) => (isFocused ? borderCircle : '')};\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,uBAA4B;AAErB,MAAM,mBAAmB,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,MAAM,iBAAa,yBAAO,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAU9B,CAAC,EAAE,MAAM,MAAO,QAAQ,SAAS,UAAU;AAAA;AAAA;AAAA,MAG3C,CAAC,EAAE,MAAM,MAAO,QAAQ,WAAW,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5C,MAAM,iBAAa,yBAAO,GAAG;AAAA;AAAA;AAAA;AAAA;AAMpC,MAAM,eAAe;AAAA;AAAA;AAAA;AAId,MAAM,iBAAa,yBAAO,MAAM;AAAA,IACnC,CAAC,EAAE,UAAU,MAAO,YAAY,eAAe;AAAA;AAG5C,MAAM,2BAAuB,yBAAO,KAAK;AAAA,WACrC,CAAC,EAAE,EAAE,MAAM,IAAI;AAAA,YACd,CAAC,EAAE,EAAE,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA;AAMpB,MAAM,iBAAa,yBAAO,MAAM;AAAA;AAAA,kBAErB,CAAC,EAAE,aAAa,MAAO,eAAe,IAAI;AAAA;AAAA;AAGrD,MAAM,iBAAa,yBAAO,MAAM;AAAA,kBACrB,CAAC,EAAE,aAAa,MAAO,eAAe,IAAI;AAAA;AAAA;AAAA;AAKrD,MAAM,kBAAc,yBAAO,QAAQ;AAAA,aAC7B,CAAC,EAAE,QAAQ,MAAM;AAAA,IAC1B,CAAC,EAAE,UAAU,MAAO,YAAY,eAAe;AAAA;",
4
+ "sourcesContent": ["import { styled, css } from '@elliemae/ds-system';\n\nexport const StyledSVGWrapper = styled.div`\n :focus {\n outline: none;\n }\n :focus-within {\n outline: none;\n }\n`;\n\nexport const StyledInnerText = styled.text`\n font-size: 14px;\n font-weight: 600;\n`;\n\nexport const StyledTooltipContainer = styled.div`\n max-width: 350px;\n background-color: white;\n`;\n\nexport const StyledMouseOverDetectionBox = styled.div`\n position: absolute;\n top: -15px;\n right: -15px;\n width: calc(100% + 30px);\n height: calc(100% + 30px);\n z-index: -1;\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,uBAA4B;AAErB,MAAM,mBAAmB,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,MAAM,kBAAkB,wBAAO;AAAA;AAAA;AAAA;AAK/B,MAAM,yBAAyB,wBAAO;AAAA;AAAA;AAAA;AAKtC,MAAM,8BAA8B,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -1,16 +1,6 @@
1
1
  import * as React from "react";
2
- import { createContext, createRef } from "react";
3
- import { scaleOrdinal } from "d3";
4
- const pieChartdefaultContext = {
5
- innerHeight: 0,
6
- innerWidth: 0,
7
- activeSerie: "",
8
- setActiveSerie: () => {
9
- },
10
- containerRef: createRef(),
11
- groups: [],
12
- colorScale: scaleOrdinal()
13
- };
2
+ import { createContext } from "react";
3
+ const pieChartdefaultContext = {};
14
4
  const PieContext = createContext(pieChartdefaultContext);
15
5
  export {
16
6
  PieContext
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../scripts/build/transpile/react-shim.js", "../../src/PieContext.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { createContext, createRef } from 'react';\nimport { scaleOrdinal, ScaleOrdinal } from 'd3';\nimport { DSPieT } from './react-desc-prop-types';\n\ninterface PieChartContextT {\n props: Partial<DSPieT.Props>;\n innerHeight: number;\n innerWidth: number;\n activeSerie: string;\n setActiveSerie: React.Dispatch<React.SetStateAction<string>>;\n containerRef: React.RefObject<HTMLDivElement>;\n groups: string[];\n colorScale: ScaleOrdinal<string, unknown, never>;\n}\n\nconst pieChartdefaultContext: PieChartContextT = {\n // props: defaultProps,\n innerHeight: 0,\n innerWidth: 0,\n activeSerie: '',\n setActiveSerie: () => {},\n containerRef: createRef<HTMLDivElement>(),\n groups: [],\n colorScale: scaleOrdinal(),\n};\n\nexport const PieContext = createContext(pieChartdefaultContext);\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,eAAe,iBAAiB;AACzC,SAAS,oBAAkC;AAc3C,MAAM,yBAA2C;AAAA,EAE/C,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,gBAAgB,MAAM;AAAA,EAAC;AAAA,EACvB,cAAc,UAA0B;AAAA,EACxC,QAAQ,CAAC;AAAA,EACT,YAAY,aAAa;AAC3B;AAEO,MAAM,aAAa,cAAc,sBAAsB;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { createContext, createRef } from 'react';\nimport { scaleOrdinal, ScaleOrdinal } from 'd3';\nimport { DSPieT } from './react-desc-prop-types';\n\ninterface PieChartContextT {\n props: Partial<DSPieT.Props>;\n innerHeight: number;\n innerWidth: number;\n activeSerie: string;\n setActiveSerie: React.Dispatch<React.SetStateAction<string>>;\n containerRef: React.RefObject<HTMLDivElement>;\n groups: string[];\n colorScale: ScaleOrdinal<string, unknown, never>;\n}\n\nconst pieChartdefaultContext: PieChartContextT = {\n // props: defaultProps,\n // innerHeight: 0,\n // innerWidth: 0,\n // activeSerie: '',\n // setActiveSerie: () => {},\n // containerRef: createRef<HTMLDivElement>(),\n // groups: [],\n // colorScale: scaleOrdinal(),\n};\n\nexport const PieContext = createContext(pieChartdefaultContext);\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,qBAAgC;AAezC,MAAM,yBAA2C,CASjD;AAEO,MAAM,aAAa,cAAc,sBAAsB;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { useCallback, useContext, useMemo, useState } from "react";
2
+ import { useCallback, useContext } from "react";
3
3
  import { PieContext } from "../PieContext";
4
4
  const findInCircularList = (list, from, step = 1) => {
5
5
  for (let i = (from + step + list.length) % list.length; i !== from && from > -1; i = (i + step + list.length) % list.length) {
@@ -9,62 +9,27 @@ const findInCircularList = (list, from, step = 1) => {
9
9
  return from;
10
10
  };
11
11
  const useKeyboardNavigation = () => {
12
- const {
13
- activePoint,
14
- setActivePoint,
15
- containerRef,
16
- groups,
17
- yScale,
18
- props: { data }
19
- } = useContext(PieContext);
20
- const [currentFocusedDataset, setCurrentFocusedDataset] = useState(groups[0]);
21
- const currentGroup = useMemo(() => data.find((d) => d.name === currentFocusedDataset), [currentFocusedDataset, data]);
22
- const currentItemIndex = useMemo(
23
- () => currentGroup.data.findIndex((opt) => opt.key === activePoint),
24
- [activePoint, currentGroup]
25
- );
26
- const handleOnFocus = useCallback(
27
- (e) => {
28
- console.log("focus");
29
- if (containerRef?.current === e.target) {
30
- setActivePoint(currentGroup.data[0].key);
31
- }
32
- },
33
- [containerRef, currentGroup, setActivePoint]
34
- );
12
+ const { activeSerie, setActiveSerie, containerRef, currentData } = useContext(PieContext);
13
+ const handleOnFocus = useCallback(() => {
14
+ setActiveSerie(currentData[0].key);
15
+ }, [currentData, setActiveSerie]);
35
16
  const handleOnBlur = useCallback(() => {
36
17
  setTimeout(() => {
37
18
  if (!containerRef?.current?.contains(document.activeElement) || containerRef?.current === document.activeElement) {
38
- console.log("blur");
39
- setActivePoint("");
19
+ setActiveSerie("");
40
20
  }
41
21
  });
42
- }, [containerRef, setActivePoint]);
22
+ }, [containerRef, setActiveSerie]);
43
23
  const navigateSerie = useCallback(
44
24
  (step) => {
45
- const newValue = findInCircularList(
46
- currentGroup.data.map((d) => d.value),
47
- currentItemIndex,
25
+ const newFocusedSliceIndex = findInCircularList(
26
+ currentData,
27
+ currentData.findIndex((serie) => serie.key === activeSerie),
48
28
  step
49
29
  );
50
- setActivePoint(currentGroup.data[newValue].key);
30
+ setActiveSerie(currentData[newFocusedSliceIndex].key);
51
31
  },
52
- [currentGroup.data, currentItemIndex, setActivePoint]
53
- );
54
- const changeSerie = useCallback(
55
- (step) => {
56
- setCurrentFocusedDataset((prev) => {
57
- const nextGroup = findInCircularList(
58
- groups,
59
- groups.findIndex((item) => item === prev),
60
- step
61
- );
62
- const nextGroupData = data.find((d) => d.name === groups[nextGroup]);
63
- setActivePoint(nextGroupData.data[currentItemIndex].key);
64
- return groups[nextGroup];
65
- });
66
- },
67
- [currentItemIndex, data, setActivePoint, groups]
32
+ [activeSerie, currentData, setActiveSerie]
68
33
  );
69
34
  const onInputKeyDown = useCallback(
70
35
  (e) => {
@@ -72,19 +37,10 @@ const useKeyboardNavigation = () => {
72
37
  e.preventDefault();
73
38
  }
74
39
  if (["ArrowLeft", "ArrowRight"].includes(e.code)) {
75
- if (yScale.bandwidth)
76
- changeSerie(e.code === "ArrowLeft" ? -1 : 1);
77
- else
78
- navigateSerie(e.code === "ArrowLeft" ? -1 : 1);
79
- }
80
- if (["ArrowDown", "ArrowUp"].includes(e.code)) {
81
- if (yScale.bandwidth)
82
- navigateSerie(e.code === "ArrowDown" ? -1 : 1);
83
- else
84
- changeSerie(e.code === "ArrowDown" ? -1 : 1);
40
+ navigateSerie(e.code === "ArrowLeft" ? -1 : 1);
85
41
  }
86
42
  },
87
- [changeSerie, navigateSerie, yScale.bandwidth]
43
+ [navigateSerie]
88
44
  );
89
45
  return { onInputKeyDown, handleOnBlur, handleOnFocus };
90
46
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/config/useKeyboardNavigation.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable max-depth */\n/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport { useCallback, useContext, useMemo, useState } from 'react';\nimport { PieContext } from '../PieContext';\n\nexport const findInCircularList = (\n list,\n from: number,\n //criteria: (item) => boolean,\n step = 1,\n // eslint-disable-next-line max-params\n): number => {\n for (\n let i = (from + step + list.length) % list.length;\n i !== from && from > -1;\n i = (i + step + list.length) % list.length\n ) {\n if (list[i]) return i;\n }\n return from; // return same item\n};\n\nexport const useKeyboardNavigation = () => {\n const {\n activePoint,\n setActivePoint,\n containerRef,\n groups,\n yScale,\n props: { data },\n } = useContext(PieContext);\n\n const [currentFocusedDataset, setCurrentFocusedDataset] = useState(groups[0]);\n\n const currentGroup = useMemo(() => data.find((d) => d.name === currentFocusedDataset), [currentFocusedDataset, data]);\n\n const currentItemIndex = useMemo(\n () => currentGroup.data.findIndex((opt) => opt.key === activePoint),\n [activePoint, currentGroup],\n );\n\n const handleOnFocus: React.FocusEventHandler<HTMLDivElement> = useCallback(\n (e) => {\n console.log('focus');\n\n if (containerRef?.current === e.target) {\n setActivePoint(currentGroup.data[0].key);\n }\n },\n [containerRef, currentGroup, setActivePoint],\n );\n\n const handleOnBlur: React.FocusEventHandler<HTMLInputElement> = useCallback(() => {\n setTimeout(() => {\n if (\n !containerRef?.current?.contains(document.activeElement) ||\n containerRef?.current === document.activeElement\n ) {\n console.log('blur');\n setActivePoint('');\n }\n });\n }, [containerRef, setActivePoint]);\n\n const navigateSerie = useCallback(\n (step: number) => {\n const newValue = findInCircularList(\n currentGroup.data.map((d) => d.value),\n currentItemIndex,\n step,\n );\n setActivePoint(currentGroup.data[newValue].key);\n },\n [currentGroup.data, currentItemIndex, setActivePoint],\n );\n\n const changeSerie = useCallback(\n (step: number) => {\n setCurrentFocusedDataset((prev) => {\n const nextGroup = findInCircularList(\n groups,\n groups.findIndex((item) => item === prev),\n step,\n );\n const nextGroupData = data.find((d) => d.name === groups[nextGroup]);\n setActivePoint(nextGroupData.data[currentItemIndex].key);\n return groups[nextGroup];\n });\n },\n [currentItemIndex, data, setActivePoint, groups],\n );\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = useCallback(\n (e) => {\n if (e.code !== 'Tab') {\n e.preventDefault();\n }\n if (['ArrowLeft', 'ArrowRight'].includes(e.code)) {\n if (yScale.bandwidth) changeSerie(e.code === 'ArrowLeft' ? -1 : 1);\n else navigateSerie(e.code === 'ArrowLeft' ? -1 : 1);\n }\n\n if (['ArrowDown', 'ArrowUp'].includes(e.code)) {\n if (yScale.bandwidth) navigateSerie(e.code === 'ArrowDown' ? -1 : 1);\n else changeSerie(e.code === 'ArrowDown' ? -1 : 1);\n }\n },\n [changeSerie, navigateSerie, yScale.bandwidth],\n );\n\n return { onInputKeyDown, handleOnBlur, handleOnFocus };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable max-depth */\n/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport { useCallback, useContext } from 'react';\nimport { PieContext } from '../PieContext';\n\nexport const findInCircularList = (\n list,\n from: number,\n //criteria: (item) => boolean,\n step = 1,\n // eslint-disable-next-line max-params\n): number => {\n for (\n let i = (from + step + list.length) % list.length;\n i !== from && from > -1;\n i = (i + step + list.length) % list.length\n ) {\n if (list[i]) return i;\n }\n return from; // return same item\n};\n\nexport const useKeyboardNavigation = () => {\n const { activeSerie, setActiveSerie, containerRef, currentData } = useContext(PieContext);\n\n // const currentGroup = useMemo(() => data.find((d) => d.name === currentFocusedDataset), [currentFocusedDataset, data]);\n\n const handleOnFocus: React.FocusEventHandler<HTMLDivElement> = useCallback(() => {\n setActiveSerie(currentData[0].key);\n }, [currentData, setActiveSerie]);\n\n const handleOnBlur: React.FocusEventHandler<HTMLInputElement> = useCallback(() => {\n setTimeout(() => {\n if (\n !containerRef?.current?.contains(document.activeElement) ||\n containerRef?.current === document.activeElement\n ) {\n setActiveSerie('');\n }\n });\n }, [containerRef, setActiveSerie]);\n\n const navigateSerie = useCallback(\n (step: number) => {\n const newFocusedSliceIndex = findInCircularList(\n currentData,\n currentData.findIndex((serie) => serie.key === activeSerie),\n step,\n );\n setActiveSerie(currentData[newFocusedSliceIndex].key);\n },\n [activeSerie, currentData, setActiveSerie],\n );\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = useCallback(\n (e) => {\n if (e.code !== 'Tab') {\n e.preventDefault();\n }\n if (['ArrowLeft', 'ArrowRight'].includes(e.code)) {\n navigateSerie(e.code === 'ArrowLeft' ? -1 : 1);\n }\n },\n [navigateSerie],\n );\n\n return { onInputKeyDown, handleOnBlur, handleOnFocus };\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACIvB,SAAS,aAAa,kBAAkB;AACxC,SAAS,kBAAkB;AAEpB,MAAM,qBAAqB,CAChC,MACA,MAEA,OAAO,MAEI;AACX,WACM,KAAK,OAAO,OAAO,KAAK,UAAU,KAAK,QAC3C,MAAM,QAAQ,OAAO,IACrB,KAAK,IAAI,OAAO,KAAK,UAAU,KAAK,QACpC;AACA,QAAI,KAAK;AAAI,aAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEO,MAAM,wBAAwB,MAAM;AACzC,QAAM,EAAE,aAAa,gBAAgB,cAAc,YAAY,IAAI,WAAW,UAAU;AAIxF,QAAM,gBAAyD,YAAY,MAAM;AAC/E,mBAAe,YAAY,GAAG,GAAG;AAAA,EACnC,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,QAAM,eAA0D,YAAY,MAAM;AAChF,eAAW,MAAM;AACf,UACE,CAAC,cAAc,SAAS,SAAS,SAAS,aAAa,KACvD,cAAc,YAAY,SAAS,eACnC;AACA,uBAAe,EAAE;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,cAAc,CAAC;AAEjC,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAiB;AAChB,YAAM,uBAAuB;AAAA,QAC3B;AAAA,QACA,YAAY,UAAU,CAAC,UAAU,MAAM,QAAQ,WAAW;AAAA,QAC1D;AAAA,MACF;AACA,qBAAe,YAAY,sBAAsB,GAAG;AAAA,IACtD;AAAA,IACA,CAAC,aAAa,aAAa,cAAc;AAAA,EAC3C;AAEA,QAAM,iBAA+D;AAAA,IACnE,CAAC,MAAM;AACL,UAAI,EAAE,SAAS,OAAO;AACpB,UAAE,eAAe;AAAA,MACnB;AACA,UAAI,CAAC,aAAa,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG;AAChD,sBAAc,EAAE,SAAS,cAAc,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,SAAO,EAAE,gBAAgB,cAAc,cAAc;AACvD;",
6
6
  "names": []
7
7
  }
@@ -9,10 +9,15 @@ const usePie = (props) => {
9
9
  const innerHeight = height - margin.top - margin.bottom;
10
10
  const innerWidth = width - margin.left - margin.right;
11
11
  const groups = series.map((serie) => serie.name);
12
+ const currentData = useMemo(
13
+ () => series.map((serie, i) => ({
14
+ ...serie,
15
+ key: `${serie.name}-${i}`
16
+ })),
17
+ [series]
18
+ );
12
19
  const data = series.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
13
- const pieGenerator = pie().value(function(d) {
14
- return d[1];
15
- }).sort(null).padAngle(0.02);
20
+ const pieGenerator = pie().value((d) => d[1]).sort(null).padAngle(0.02);
16
21
  const pieData = pieGenerator(Object.entries(data));
17
22
  return useMemo(
18
23
  () => ({
@@ -24,9 +29,10 @@ const usePie = (props) => {
24
29
  containerRef,
25
30
  activeSerie,
26
31
  pieData,
27
- setActiveSerie
32
+ setActiveSerie,
33
+ currentData
28
34
  }),
29
- [props, pieData, innerHeight, innerWidth, groups, activeSerie]
35
+ [props, innerHeight, innerWidth, groups, activeSerie, pieData, currentData]
30
36
  );
31
37
  };
32
38
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/config/usePie.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useMemo, useState, useRef } from 'react';\nimport { pie } from 'd3';\n// import { useValidateTypescriptPropTypes } from '@elliemae/ds-utilities';\nimport type { DSPieT } from '../react-desc-prop-types';\n\nexport const usePie = (props: DSPieT.Props) => {\n // useValidateTypescriptPropTypes(props, propTypes);\n\n const { series, width, height, margin } = props;\n\n const containerRef = useRef(null);\n const svgRef = useRef(null);\n\n const [activeSerie, setActiveSerie] = useState('');\n\n const innerHeight = height - margin.top - margin.bottom;\n const innerWidth = width - margin.left - margin.right;\n\n const groups = series.map((serie) => serie.name);\n\n const data = series.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});\n const pieGenerator = pie()\n .value(function (d) {\n return d[1];\n })\n .sort(null)\n .padAngle(0.02);\n const pieData = pieGenerator(Object.entries(data));\n\n return useMemo(\n () => ({\n props,\n innerHeight,\n innerWidth,\n groups,\n svgRef,\n containerRef,\n activeSerie,\n pieData,\n setActiveSerie,\n }),\n [props, pieData, innerHeight, innerWidth, groups, activeSerie],\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,SAAS,UAAU,cAAc;AAC1C,SAAS,WAAW;AAIb,MAAM,SAAS,CAAC,UAAwB;AAG7C,QAAM,EAAE,QAAQ,OAAO,QAAQ,OAAO,IAAI;AAE1C,QAAM,eAAe,OAAO,IAAI;AAChC,QAAM,SAAS,OAAO,IAAI;AAE1B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AAEjD,QAAM,cAAc,SAAS,OAAO,MAAM,OAAO;AACjD,QAAM,aAAa,QAAQ,OAAO,OAAO,OAAO;AAEhD,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAE/C,QAAM,OAAO,OAAO,OAAO,CAAC,KAAK,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAClF,QAAM,eAAe,IAAI,EACtB,MAAM,SAAU,GAAG;AAClB,WAAO,EAAE;AAAA,EACX,CAAC,EACA,KAAK,IAAI,EACT,SAAS,IAAI;AAChB,QAAM,UAAU,aAAa,OAAO,QAAQ,IAAI,CAAC;AAEjD,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,SAAS,aAAa,YAAY,QAAQ,WAAW;AAAA,EAC/D;AACF;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useMemo, useState, useRef } from 'react';\nimport { pie } from 'd3';\n// import { useValidateTypescriptPropTypes } from '@elliemae/ds-utilities';\nimport type { DSPieT } from '../react-desc-prop-types';\n\nexport const usePie = (props: DSPieT.Props) => {\n // useValidateTypescriptPropTypes(props, propTypes);\n\n const { series, width, height, margin } = props;\n\n const containerRef = useRef(null);\n const svgRef = useRef(null);\n\n const [activeSerie, setActiveSerie] = useState('');\n\n const innerHeight = height - margin.top - margin.bottom;\n const innerWidth = width - margin.left - margin.right;\n\n const groups = series.map((serie) => serie.name);\n\n const currentData = useMemo(\n () =>\n series.map((serie, i) => ({\n ...serie,\n key: `${serie.name}-${i}`,\n })),\n [series],\n );\n const data = series.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});\n const pieGenerator = pie()\n .value((d) => d[1])\n .sort(null)\n .padAngle(0.02);\n const pieData = pieGenerator(Object.entries(data));\n\n return useMemo(\n () => ({\n props,\n innerHeight,\n innerWidth,\n groups,\n svgRef,\n containerRef,\n activeSerie,\n pieData,\n setActiveSerie,\n currentData,\n }),\n [props, innerHeight, innerWidth, groups, activeSerie, pieData, currentData],\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,SAAS,UAAU,cAAc;AAC1C,SAAS,WAAW;AAIb,MAAM,SAAS,CAAC,UAAwB;AAG7C,QAAM,EAAE,QAAQ,OAAO,QAAQ,OAAO,IAAI;AAE1C,QAAM,eAAe,OAAO,IAAI;AAChC,QAAM,SAAS,OAAO,IAAI;AAE1B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AAEjD,QAAM,cAAc,SAAS,OAAO,MAAM,OAAO;AACjD,QAAM,aAAa,QAAQ,OAAO,OAAO,OAAO;AAEhD,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAE/C,QAAM,cAAc;AAAA,IAClB,MACE,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,MACxB,GAAG;AAAA,MACH,KAAK,GAAG,MAAM,QAAQ;AAAA,IACxB,EAAE;AAAA,IACJ,CAAC,MAAM;AAAA,EACT;AACA,QAAM,OAAO,OAAO,OAAO,CAAC,KAAK,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAClF,QAAM,eAAe,IAAI,EACtB,MAAM,CAAC,MAAM,EAAE,EAAE,EACjB,KAAK,IAAI,EACT,SAAS,IAAI;AAChB,QAAM,UAAU,aAAa,OAAO,QAAQ,IAAI,CAAC;AAEjD,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,aAAa,YAAY,QAAQ,aAAa,SAAS,WAAW;AAAA,EAC5E;AACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,25 @@
1
+ import * as React from "react";
2
+ const COLOR_PALLET = {
3
+ "blue-100": "#1E79C2",
4
+ "blue-200": "#165A91",
5
+ "blue-400": "#10426A",
6
+ "magenta-100": "#CA3981",
7
+ "magenta-200": "#832553",
8
+ "magenta-400": "#6E1F46",
9
+ "orange-100": "#B25119",
10
+ "orange-200": "#853C12",
11
+ "orange-400": "#612C0D",
12
+ "purple-100": "#8E49B2",
13
+ "purple-200": "#61327A",
14
+ "purple-400": "#4D2861",
15
+ "green-100": "#007A78",
16
+ "green-200": "#005B59",
17
+ "green-400": "#004241",
18
+ "grey-100": "#697489",
19
+ "grey-200": "#4E5666",
20
+ "grey-400": "#323842"
21
+ };
22
+ export {
23
+ COLOR_PALLET
24
+ };
25
+ //# sourceMappingURL=colorPallet.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/helpers/colorPallet.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export const COLOR_PALLET = {\n 'blue-100': '#1E79C2',\n 'blue-200': '#165A91',\n 'blue-400': '#10426A',\n 'magenta-100': '#CA3981',\n 'magenta-200': '#832553',\n 'magenta-400': '#6E1F46',\n 'orange-100': '#B25119',\n 'orange-200': '#853C12',\n 'orange-400': '#612C0D',\n 'purple-100': '#8E49B2',\n 'purple-200': '#61327A',\n 'purple-400': '#4D2861',\n 'green-100': '#007A78',\n 'green-200': '#005B59',\n 'green-400': '#004241',\n 'grey-100': '#697489',\n 'grey-200': '#4E5666',\n 'grey-400': '#323842',\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAhB,MAAM,eAAe;AAAA,EAC1B,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;",
6
+ "names": []
7
+ }
package/dist/esm/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import * as React from "react";
2
2
  import { PieChart } from "./Pie";
3
+ import { COLOR_PALLET } from "./helpers/colorPallet";
3
4
  export {
5
+ COLOR_PALLET,
4
6
  PieChart
5
7
  };
6
8
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../scripts/build/transpile/react-shim.js", "../../src/index.ts"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export { PieChart } from './Pie';\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,gBAAgB;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export { PieChart } from './Pie';\nexport { COLOR_PALLET } from './helpers/colorPallet';\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;",
6
6
  "names": []
7
7
  }
@@ -2,13 +2,13 @@ import * as React from "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { useContext, useMemo } from "react";
4
4
  import { StyledSVGWrapper } from "../styles";
5
+ import { useKeyboardNavigation } from "../config/useKeyboardNavigation";
5
6
  import { PieContext } from "../PieContext";
6
7
  const ChartContainer = ({ children }) => {
7
8
  const {
8
9
  props: { width, height, margin, responsive },
9
10
  containerRef,
10
- activeSerie,
11
- svgRef
11
+ activeSerie
12
12
  } = useContext(PieContext);
13
13
  const dimensions = useMemo(
14
14
  () => responsive ? {
@@ -19,10 +19,15 @@ const ChartContainer = ({ children }) => {
19
19
  },
20
20
  [height, responsive, width]
21
21
  );
22
+ const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();
22
23
  return /* @__PURE__ */ jsx(StyledSVGWrapper, {
23
24
  ref: containerRef,
25
+ onKeyDown: onInputKeyDown,
26
+ tabIndex: activeSerie ? -1 : 0,
27
+ onBlur: handleOnBlur,
28
+ onFocus: handleOnFocus,
29
+ onMouseDown: (e) => e.preventDefault(),
24
30
  children: /* @__PURE__ */ jsx("svg", {
25
- ref: svgRef,
26
31
  ...dimensions,
27
32
  children: /* @__PURE__ */ jsx("g", {
28
33
  className: "container",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/ChartContainer.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { StyledSVGWrapper } from '../styles';\n\nimport { PieContext } from '../PieContext';\n// import { useKeyboardNavigation } from '../config/useKeyboardNavigation';\ninterface ChartContainerT {\n children: JSX.Element | JSX.Element[] | string | string[];\n}\nexport const ChartContainer: React.ComponentType<ChartContainerT> = ({ children }) => {\n const {\n props: { width, height, margin, responsive },\n containerRef,\n activeSerie,\n svgRef,\n } = useContext(PieContext);\n\n const dimensions = useMemo(\n () =>\n responsive\n ? {\n viewBox: `0 0 ${width} ${height}`,\n }\n : {\n width,\n height,\n },\n [height, responsive, width],\n );\n // const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();\n return (\n <StyledSVGWrapper\n ref={containerRef}\n // onKeyDown={onInputKeyDown}\n // aria-hidden=\"true\"\n // tabIndex={activeSerie ? -1 : 0}\n // onBlur={handleOnBlur}\n // onFocus={handleOnFocus}\n // onMouseDown={(e) => e.preventDefault()}\n >\n <svg ref={svgRef} {...dimensions}>\n <g className=\"container\" transform={`translate(${margin.left},${margin.top})`}>\n {children}\n </g>\n </svg>\n </StyledSVGWrapper>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,wBAAwB;AAEjC,SAAS,kBAAkB;AAKpB,MAAM,iBAAuD,CAAC,EAAE,SAAS,MAAM;AACpF,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,UAAU;AAEzB,QAAM,aAAa;AAAA,IACjB,MACE,aACI;AAAA,MACE,SAAS,OAAO,SAAS;AAAA,IAC3B,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACN,CAAC,QAAQ,YAAY,KAAK;AAAA,EAC5B;AAEA,SACE,oBAAC;AAAA,IACC,KAAK;AAAA,IAQL,8BAAC;AAAA,MAAI,KAAK;AAAA,MAAS,GAAG;AAAA,MACpB,8BAAC;AAAA,QAAE,WAAU;AAAA,QAAY,WAAW,aAAa,OAAO,QAAQ,OAAO;AAAA,QACpE;AAAA,OACH;AAAA,KACF;AAAA,GACF;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { StyledSVGWrapper } from '../styles';\nimport { useKeyboardNavigation } from '../config/useKeyboardNavigation';\nimport { PieContext } from '../PieContext';\n// import { useKeyboardNavigation } from '../config/useKeyboardNavigation';\ninterface ChartContainerT {\n children: JSX.Element | JSX.Element[] | string | string[];\n}\nexport const ChartContainer: React.ComponentType<ChartContainerT> = ({ children }) => {\n const {\n props: { width, height, margin, responsive },\n containerRef,\n activeSerie,\n } = useContext(PieContext);\n\n const dimensions = useMemo(\n () =>\n responsive\n ? {\n viewBox: `0 0 ${width} ${height}`,\n }\n : {\n width,\n height,\n },\n [height, responsive, width],\n );\n const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();\n return (\n <StyledSVGWrapper\n ref={containerRef}\n onKeyDown={onInputKeyDown}\n // aria-hidden=\"true\"\n tabIndex={activeSerie ? -1 : 0}\n onBlur={handleOnBlur}\n onFocus={handleOnFocus}\n onMouseDown={(e) => e.preventDefault()}\n >\n <svg {...dimensions}>\n <g className=\"container\" transform={`translate(${margin.left},${margin.top})`}>\n {children}\n </g>\n </svg>\n </StyledSVGWrapper>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAKpB,MAAM,iBAAuD,CAAC,EAAE,SAAS,MAAM;AACpF,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,IAAI,WAAW,UAAU;AAEzB,QAAM,aAAa;AAAA,IACjB,MACE,aACI;AAAA,MACE,SAAS,OAAO,SAAS;AAAA,IAC3B,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACN,CAAC,QAAQ,YAAY,KAAK;AAAA,EAC5B;AACA,QAAM,EAAE,gBAAgB,cAAc,cAAc,IAAI,sBAAsB;AAC9E,SACE,oBAAC;AAAA,IACC,KAAK;AAAA,IACL,WAAW;AAAA,IAEX,UAAU,cAAc,KAAK;AAAA,IAC7B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,IAErC,8BAAC;AAAA,MAAK,GAAG;AAAA,MACP,8BAAC;AAAA,QAAE,WAAU;AAAA,QAAY,WAAW,aAAa,OAAO,QAAQ,OAAO;AAAA,QACpE;AAAA,OACH;AAAA,KACF;AAAA,GACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useContext } from "react";
4
4
  import { Slice } from "./Slice";
5
5
  import { PieContext } from "../PieContext";
6
+ import { StyledInnerText } from "../styles";
6
7
  const Pie = () => {
7
8
  const {
8
9
  innerHeight,
@@ -18,14 +19,14 @@ const Pie = () => {
18
19
  pieData.map((slice) => /* @__PURE__ */ jsx(Slice, {
19
20
  data: slice
20
21
  }, slice.index)),
21
- !isHalfPie && label ? /* @__PURE__ */ jsx("text", {
22
+ !isHalfPie && label ? /* @__PURE__ */ jsx(StyledInnerText, {
22
23
  x: 0,
23
24
  y: 0,
24
25
  textAnchor: "middle",
25
26
  alignmentBaseline: "middle",
26
27
  children: label
27
28
  }) : null,
28
- isHalfPie && label ? /* @__PURE__ */ jsx("text", {
29
+ isHalfPie && label ? /* @__PURE__ */ jsx(StyledInnerText, {
29
30
  x: 0,
30
31
  y: -innerRadius / 4,
31
32
  textAnchor: "middle",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/Pie.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext } from 'react';\nimport { Slice } from './Slice';\nimport { PieContext } from '../PieContext';\n\nexport const Pie = () => {\n const {\n innerHeight,\n innerWidth,\n pieData,\n\n props: { isHalfPie, label, innerRadius },\n } = useContext(PieContext);\n\n const radius = Math.min(innerWidth, innerHeight) / 2;\n\n const currentInnerHeight = isHalfPie ? innerHeight : innerHeight / 2;\n return (\n <g transform={`translate(${innerWidth / 2},${currentInnerHeight})`}>\n {pieData.map((slice) => (\n <Slice key={slice.index} data={slice} />\n ))}\n {!isHalfPie && label ? (\n <text x={0} y={0} textAnchor=\"middle\" alignmentBaseline=\"middle\">\n {label}\n </text>\n ) : null}\n {isHalfPie && label ? (\n <text x={0} y={-innerRadius / 4} textAnchor=\"middle\" alignmentBaseline=\"middle\">\n {label}\n </text>\n ) : null}\n </g>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,kBAAkB;AAClC,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAEpB,MAAM,MAAM,MAAM;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAEA,OAAO,EAAE,WAAW,OAAO,YAAY;AAAA,EACzC,IAAI,WAAW,UAAU;AAEzB,QAAM,SAAS,KAAK,IAAI,YAAY,WAAW,IAAI;AAEnD,QAAM,qBAAqB,YAAY,cAAc,cAAc;AACnE,SACE,qBAAC;AAAA,IAAE,WAAW,aAAa,aAAa,KAAK;AAAA,IAC1C;AAAA,cAAQ,IAAI,CAAC,UACZ,oBAAC;AAAA,QAAwB,MAAM;AAAA,SAAnB,MAAM,KAAoB,CACvC;AAAA,MACA,CAAC,aAAa,QACb,oBAAC;AAAA,QAAK,GAAG;AAAA,QAAG,GAAG;AAAA,QAAG,YAAW;AAAA,QAAS,mBAAkB;AAAA,QACrD;AAAA,OACH,IACE;AAAA,MACH,aAAa,QACZ,oBAAC;AAAA,QAAK,GAAG;AAAA,QAAG,GAAG,CAAC,cAAc;AAAA,QAAG,YAAW;AAAA,QAAS,mBAAkB;AAAA,QACpE;AAAA,OACH,IACE;AAAA;AAAA,GACN;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext } from 'react';\nimport { Slice } from './Slice';\nimport { PieContext } from '../PieContext';\nimport { StyledInnerText } from '../styles';\nexport const Pie = () => {\n const {\n innerHeight,\n innerWidth,\n pieData,\n\n props: { isHalfPie, label, innerRadius },\n } = useContext(PieContext);\n\n const radius = Math.min(innerWidth, innerHeight) / 2;\n\n const currentInnerHeight = isHalfPie ? innerHeight : innerHeight / 2;\n return (\n <g transform={`translate(${innerWidth / 2},${currentInnerHeight})`}>\n {pieData.map((slice) => (\n <Slice key={slice.index} data={slice} />\n ))}\n {!isHalfPie && label ? (\n <StyledInnerText x={0} y={0} textAnchor=\"middle\" alignmentBaseline=\"middle\">\n {label}\n </StyledInnerText>\n ) : null}\n {isHalfPie && label ? (\n <StyledInnerText x={0} y={-innerRadius / 4} textAnchor=\"middle\" alignmentBaseline=\"middle\">\n {label}\n </StyledInnerText>\n ) : null}\n </g>\n );\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,kBAAkB;AAClC,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AACzB,MAAM,MAAM,MAAM;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAEA,OAAO,EAAE,WAAW,OAAO,YAAY;AAAA,EACzC,IAAI,WAAW,UAAU;AAEzB,QAAM,SAAS,KAAK,IAAI,YAAY,WAAW,IAAI;AAEnD,QAAM,qBAAqB,YAAY,cAAc,cAAc;AACnE,SACE,qBAAC;AAAA,IAAE,WAAW,aAAa,aAAa,KAAK;AAAA,IAC1C;AAAA,cAAQ,IAAI,CAAC,UACZ,oBAAC;AAAA,QAAwB,MAAM;AAAA,SAAnB,MAAM,KAAoB,CACvC;AAAA,MACA,CAAC,aAAa,QACb,oBAAC;AAAA,QAAgB,GAAG;AAAA,QAAG,GAAG;AAAA,QAAG,YAAW;AAAA,QAAS,mBAAkB;AAAA,QAChE;AAAA,OACH,IACE;AAAA,MACH,aAAa,QACZ,oBAAC;AAAA,QAAgB,GAAG;AAAA,QAAG,GAAG,CAAC,cAAc;AAAA,QAAG,YAAW;AAAA,QAAS,mBAAkB;AAAA,QAC/E;AAAA,OACH,IACE;AAAA;AAAA,GACN;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,70 +1,85 @@
1
1
  import * as React from "react";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useState, useEffect, useMemo, useRef, useContext } from "react";
3
+ import { useState, useEffect, useCallback, useMemo, useRef, useContext } from "react";
4
4
  import { arc, select } from "d3";
5
+ import { DSPopperJS } from "@elliemae/ds-popperjs";
5
6
  import { PieContext } from "../PieContext";
6
- import { Tooltip } from "./Tooltip";
7
+ import { COLOR_PALLET } from "../helpers/colorPallet";
8
+ import { StyledTooltipContainer, StyledMouseOverDetectionBox } from "../styles";
7
9
  const Slice = ({ data }) => {
8
10
  const {
9
11
  innerHeight,
10
12
  innerWidth,
11
13
  activeSerie,
12
14
  setActiveSerie,
13
- props: { series, innerRadius: innerRadiusProp, isHalfPie, TooltipRenderer }
15
+ props: { series, innerRadius, isHalfPie, TooltipRenderer }
14
16
  } = useContext(PieContext);
15
- const [isTooltipShown, setIsTooltipShown] = useState(false);
16
- const innerRadius = innerRadiusProp ?? 0;
17
- const tooltipRef = useRef(null);
18
17
  const arcRef = useRef(null);
18
+ const arcFocusedRef = useRef(null);
19
19
  const radius = isHalfPie ? Math.min(innerWidth, innerHeight) : Math.min(innerWidth, innerHeight) / 2;
20
- const { startAngle, endAngle, index, value } = data;
20
+ const { startAngle, endAngle, index } = data;
21
21
  const currentStartAngle = isHalfPie ? startAngle / 2 : startAngle;
22
22
  const currentEndAngle = isHalfPie ? endAngle / 2 : endAngle;
23
23
  const serieData = series?.find((serie) => serie.name === data.data[0]);
24
24
  const { color, name } = serieData;
25
- const sliceData = arc().innerRadius(innerRadius).outerRadius(radius).startAngle(currentStartAngle).endAngle(currentEndAngle);
25
+ const sliceData = useMemo(
26
+ () => arc().innerRadius(innerRadius ?? 0).outerRadius(radius).startAngle(currentStartAngle).endAngle(currentEndAngle)(),
27
+ [currentEndAngle, currentStartAngle, innerRadius, radius]
28
+ );
29
+ const sliceOver = useMemo(
30
+ () => arc().innerRadius(innerRadius ?? 0).outerRadius(radius + 5).startAngle(currentStartAngle).endAngle(currentEndAngle),
31
+ [currentEndAngle, currentStartAngle, innerRadius, radius]
32
+ );
26
33
  const deltaAngle = currentStartAngle + (currentEndAngle - currentStartAngle) / 2;
27
34
  const x = radius * Math.sin(deltaAngle);
28
35
  const y = -radius * Math.cos(deltaAngle);
29
- const isOpen = useMemo(
30
- () => activeSerie === "" && isTooltipShown || activeSerie === `${name}-${index}` && !isTooltipShown,
31
- [activeSerie, index, isTooltipShown, name]
32
- );
36
+ const isFocus = useMemo(() => activeSerie === `${name}-${index}`, [activeSerie, index, name]);
37
+ const [isHover, setIsHover] = useState(false);
33
38
  useEffect(() => {
34
39
  if (arcRef.current) {
35
- select(arcRef.current).attr("d", sliceData());
40
+ select(arcRef.current).attr("d", sliceData);
36
41
  }
37
- }, [sliceData]);
42
+ }, [sliceData, sliceOver]);
43
+ const [referenceElement, setReferenceElement] = useState();
44
+ const handleMouseEnter = useCallback(() => {
45
+ setActiveSerie(`${name}-${index}`);
46
+ setIsHover(true);
47
+ if (!isHalfPie)
48
+ select(arcRef.current).transition().attr("d", sliceOver).duration(300);
49
+ }, [index, isHalfPie, name, setActiveSerie, sliceOver]);
50
+ const handleOnMouseLeave = useCallback(() => {
51
+ setActiveSerie("");
52
+ setIsHover(false);
53
+ if (!isHalfPie)
54
+ select(arcRef.current).transition().attr("d", sliceData).duration(300);
55
+ }, [isHalfPie, setActiveSerie, sliceData]);
38
56
  return /* @__PURE__ */ jsxs("g", {
39
- onMouseEnter: () => {
40
- setActiveSerie("");
41
- setIsTooltipShown(true);
42
- },
43
- onMouseLeave: (e) => {
44
- setIsTooltipShown(false);
45
- },
57
+ onMouseEnter: handleMouseEnter,
58
+ onMouseLeave: handleOnMouseLeave,
46
59
  transform: isHalfPie ? "rotate(-90)" : "",
47
60
  children: [
48
61
  /* @__PURE__ */ jsx("path", {
49
62
  ref: arcRef,
50
- fill: color,
63
+ fill: COLOR_PALLET[color] ?? color,
51
64
  stroke: "white"
52
65
  }),
53
- name !== "no-data" && TooltipRenderer && /* @__PURE__ */ jsx("foreignObject", {
66
+ name !== "no-data" && TooltipRenderer && isFocus && /* @__PURE__ */ jsx("foreignObject", {
54
67
  x,
55
68
  y,
56
- children: /* @__PURE__ */ jsx(Tooltip, {
57
- isTooltipShown: isOpen,
58
- withoutAnimation: true,
59
- onFocus: () => {
60
- setActiveSerie(`${name}-${index}`);
61
- },
62
- onBlur: () => {
63
- setActiveSerie("");
64
- },
65
- startPlacementPreference: "bottom",
66
- children: /* @__PURE__ */ jsx(TooltipRenderer, {
67
- data: serieData
69
+ children: /* @__PURE__ */ jsx("div", {
70
+ ref: setReferenceElement,
71
+ children: /* @__PURE__ */ jsxs(DSPopperJS, {
72
+ referenceElement,
73
+ showPopover: true,
74
+ zIndex: 3e3,
75
+ children: [
76
+ /* @__PURE__ */ jsx(StyledTooltipContainer, {
77
+ children: /* @__PURE__ */ jsx(TooltipRenderer, {
78
+ data: serieData
79
+ })
80
+ }),
81
+ /* @__PURE__ */ jsx(StyledMouseOverDetectionBox, {})
82
+ ]
68
83
  })
69
84
  })
70
85
  })