@economic/taco 2.46.6 → 2.46.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. package/dist/charts/components/Area/AreaChart.d.ts +19 -0
  2. package/dist/charts/components/Bar/BarChart.d.ts +20 -0
  3. package/dist/charts/components/Donut/ActiveShape.d.ts +8 -0
  4. package/dist/charts/components/Donut/CenteredLabel.d.ts +11 -0
  5. package/dist/charts/components/Donut/DonutChart.d.ts +21 -0
  6. package/dist/charts/components/Donut/Legend.d.ts +13 -0
  7. package/dist/charts/components/Donut/util.d.ts +2 -0
  8. package/dist/charts/components/Legend.d.ts +16 -0
  9. package/dist/charts/components/Line/LineChart.d.ts +18 -0
  10. package/dist/charts/components/ResponsiveContainer.d.ts +5 -0
  11. package/dist/charts/components/Tooltip.d.ts +10 -0
  12. package/dist/charts/components/types.d.ts +5 -0
  13. package/dist/charts/utils/color.d.ts +3 -0
  14. package/dist/charts/utils/common.d.ts +37 -0
  15. package/dist/esm/index.css +18 -0
  16. package/dist/esm/packages/taco/src/charts/components/Area/AreaChart.js +67 -0
  17. package/dist/esm/packages/taco/src/charts/components/Area/AreaChart.js.map +1 -0
  18. package/dist/esm/packages/taco/src/charts/components/Bar/BarChart.js +120 -0
  19. package/dist/esm/packages/taco/src/charts/components/Bar/BarChart.js.map +1 -0
  20. package/dist/esm/packages/taco/src/charts/components/Donut/ActiveShape.js +47 -0
  21. package/dist/esm/packages/taco/src/charts/components/Donut/ActiveShape.js.map +1 -0
  22. package/dist/esm/packages/taco/src/charts/components/Donut/CenteredLabel.js +27 -0
  23. package/dist/esm/packages/taco/src/charts/components/Donut/CenteredLabel.js.map +1 -0
  24. package/dist/esm/packages/taco/src/charts/components/Donut/DonutChart.js +170 -0
  25. package/dist/esm/packages/taco/src/charts/components/Donut/DonutChart.js.map +1 -0
  26. package/dist/esm/packages/taco/src/charts/components/Donut/Legend.js +164 -0
  27. package/dist/esm/packages/taco/src/charts/components/Donut/Legend.js.map +1 -0
  28. package/dist/esm/packages/taco/src/charts/components/Donut/util.js +5 -0
  29. package/dist/esm/packages/taco/src/charts/components/Donut/util.js.map +1 -0
  30. package/dist/esm/packages/taco/src/charts/components/Legend.js +145 -0
  31. package/dist/esm/packages/taco/src/charts/components/Legend.js.map +1 -0
  32. package/dist/esm/packages/taco/src/charts/components/Line/LineChart.js +65 -0
  33. package/dist/esm/packages/taco/src/charts/components/Line/LineChart.js.map +1 -0
  34. package/dist/esm/packages/taco/src/charts/components/ResponsiveContainer.js +10 -0
  35. package/dist/esm/packages/taco/src/charts/components/ResponsiveContainer.js.map +1 -0
  36. package/dist/esm/packages/taco/src/charts/components/Tooltip.js +44 -0
  37. package/dist/esm/packages/taco/src/charts/components/Tooltip.js.map +1 -0
  38. package/dist/esm/packages/taco/src/charts/utils/color.js +24 -0
  39. package/dist/esm/packages/taco/src/charts/utils/color.js.map +1 -0
  40. package/dist/esm/packages/taco/src/charts/utils/common.js +34 -0
  41. package/dist/esm/packages/taco/src/charts/utils/common.js.map +1 -0
  42. package/dist/esm/packages/taco/src/index.js +4 -0
  43. package/dist/esm/packages/taco/src/index.js.map +1 -1
  44. package/dist/esm/packages/taco/src/utils/colors.js +122 -0
  45. package/dist/esm/packages/taco/src/utils/colors.js.map +1 -0
  46. package/dist/index.css +18 -0
  47. package/dist/index.d.ts +5 -0
  48. package/dist/taco.cjs.development.js +795 -0
  49. package/dist/taco.cjs.development.js.map +1 -1
  50. package/dist/taco.cjs.production.min.js +1 -1
  51. package/dist/taco.cjs.production.min.js.map +1 -1
  52. package/package.json +3 -3
  53. package/tailwind.config.js +3 -2
@@ -0,0 +1,170 @@
1
+ import React__default from 'react';
2
+ import cn from 'clsx';
3
+ import { PieChart, Tooltip, Pie, Cell } from 'recharts';
4
+ import { getThemeColor } from '../../utils/color.js';
5
+ import { getTooltipProps } from '../../utils/common.js';
6
+ import { Legend } from './Legend.js';
7
+ import { HOVER_DONUT_WIDTH, DONUT_WIDTH } from './util.js';
8
+ import { CenteredLabel } from './CenteredLabel.js';
9
+ import { ActiveShape } from './ActiveShape.js';
10
+
11
+ const Segment = _ => null;
12
+ const DonutChart = function DonutChart({
13
+ children,
14
+ formatter,
15
+ onClick,
16
+ showLegend = false,
17
+ legendPosition = 'bottom',
18
+ label
19
+ }) {
20
+ const ref = React__default.useRef(null);
21
+ const [radius, setRadius] = React__default.useState(0);
22
+ const [hoveredItem, setHoveredItem] = React__default.useState([]);
23
+ // used for right legends
24
+ const [selectedItem, setSelectedItem] = React__default.useState([]);
25
+ // used for bottom legends
26
+ const [visibleItems, setVisibleItems] = React__default.useState(() => {
27
+ const keys = {};
28
+ React__default.Children.forEach(children, child => {
29
+ keys[child.props.id] = true;
30
+ });
31
+ return keys;
32
+ });
33
+ React__default.useEffect(() => {
34
+ if (ref.current) {
35
+ var _ref$current$parentEl;
36
+ const rect = (_ref$current$parentEl = ref.current.parentElement) === null || _ref$current$parentEl === void 0 ? void 0 : _ref$current$parentEl.getBoundingClientRect();
37
+ if (rect) {
38
+ const width = showLegend ? rect.width / 2 : rect.width;
39
+ const max = rect.height < width ? rect.height : width;
40
+ setRadius(max / 2);
41
+ }
42
+ }
43
+ }, [showLegend]);
44
+ const diameter = radius * 2; // get dimensions of the parent container to find the max radius, so we can fill the container AND always have a 16px wide donut
45
+ const data = React__default.Children.map(children, child => ({
46
+ id: child.props.id,
47
+ color: child.props.color,
48
+ label: child.props.label,
49
+ value: child.props.value
50
+ }));
51
+ const displayedData = data.filter(child => visibleItems[child.id]);
52
+ const total = displayedData.reduce((accum, entry) => accum + entry.value, 0);
53
+ const showTooltip = (!showLegend || legendPosition === 'bottom') && displayedData.length > 0;
54
+ const handleLegendClick = entry => {
55
+ if (legendPosition === 'bottom' && !Array.isArray(entry)) {
56
+ setVisibleItems({
57
+ ...visibleItems,
58
+ [entry.id]: !visibleItems[entry.id]
59
+ });
60
+ } else {
61
+ const nextSelectedItem = Array.isArray(entry) ? entry.map(entryItem => entryItem.id) : [entry.id];
62
+ // Using slice to avoid mutation of the react state 'selectedItem'
63
+ const isCurrentSegmentActive = selectedItem.slice().sort().join(',') === nextSelectedItem.sort().join(',');
64
+ if (onClick && !isCurrentSegmentActive) {
65
+ onClick(entry);
66
+ }
67
+ setSelectedItem(isCurrentSegmentActive ? [] : nextSelectedItem);
68
+ }
69
+ };
70
+ const handlePieClick = React__default.useCallback(pieId => {
71
+ if (onClick && pieId !== undefined) {
72
+ const pieProps = displayedData.find(item => item.id === pieId);
73
+ onClick(pieProps);
74
+ }
75
+ }, [onClick, displayedData]);
76
+ const singlePieDonutChart = displayedData.length === 1;
77
+ const activeShapeColor = React__default.useMemo(() => {
78
+ const getSegmentColor = item => item.reduce((colors, itemId) => {
79
+ const visibleHoveredItem = displayedData.find(dataItem => dataItem.id === itemId);
80
+ if (visibleHoveredItem) {
81
+ colors[visibleHoveredItem.id] = visibleHoveredItem.color;
82
+ }
83
+ return colors;
84
+ }, {});
85
+ const hoveredSegmentColor = getSegmentColor(hoveredItem);
86
+ const selectedSegmentColor = getSegmentColor(selectedItem);
87
+ return legendPosition === 'bottom' || hoveredItem.length !== 0 ? hoveredSegmentColor : selectedSegmentColor;
88
+ }, [hoveredItem, selectedItem, legendPosition]);
89
+ if (ref.current && !radius) {
90
+ return null;
91
+ }
92
+ const getActiveIndex = () => {
93
+ if (hoveredItem.length > 0) {
94
+ return hoveredItem.map(itemId => displayedData.findIndex(element => element.id === itemId));
95
+ }
96
+ return selectedItem.map(selectedItemId => displayedData.findIndex(element => element.id === selectedItemId));
97
+ };
98
+ const content = () => {
99
+ const elements = React__default.Children.toArray(children).filter(child => /*#__PURE__*/React__default.isValidElement(child) && visibleItems[child.props.id]);
100
+ return elements.length > 0 ? elements.map((child, index) => {
101
+ var _getThemeColor;
102
+ return /*#__PURE__*/React__default.createElement(Cell, {
103
+ key: `cell-${index}`,
104
+ name: child.props.label,
105
+ fill: (_getThemeColor = getThemeColor(child.props.color)) !== null && _getThemeColor !== void 0 ? _getThemeColor : getThemeColor('blue-300')
106
+ });
107
+ }) : (/*#__PURE__*/React__default.createElement(Cell, {
108
+ key: "empty-chart",
109
+ name: '',
110
+ fill: getThemeColor('grey-200')
111
+ }));
112
+ };
113
+ return /*#__PURE__*/React__default.createElement("div", {
114
+ className: cn('relative h-full w-full', {
115
+ [`flex `]: showLegend,
116
+ 'flex-col items-center': legendPosition === 'bottom'
117
+ }),
118
+ ref: ref
119
+ }, /*#__PURE__*/React__default.createElement(CenteredLabel, {
120
+ radius: radius,
121
+ legendPosition: legendPosition,
122
+ label: label,
123
+ total: total,
124
+ formatter: formatter,
125
+ showLegend: showLegend
126
+ }), /*#__PURE__*/React__default.createElement(PieChart, {
127
+ data: data,
128
+ height: diameter,
129
+ width: diameter,
130
+ style: {
131
+ transform: 'rotate(90deg) scale(-1,1)'
132
+ }
133
+ }, showTooltip ? (/*#__PURE__*/React__default.createElement(Tooltip, Object.assign({}, getTooltipProps({
134
+ style: {
135
+ transform: 'rotate(90deg) scale(-1,1)'
136
+ },
137
+ singlePieDonutChart
138
+ })))) : null, /*#__PURE__*/React__default.createElement(Pie, {
139
+ isAnimationActive: false,
140
+ activeIndex: getActiveIndex(),
141
+ activeShape: /*#__PURE__*/React__default.createElement(ActiveShape, {
142
+ pieColors: activeShapeColor,
143
+ onClick: handlePieClick
144
+ }),
145
+ data: displayedData.length > 0 ? displayedData : [],
146
+ dataKey: "value",
147
+ innerRadius: radius - HOVER_DONUT_WIDTH - DONUT_WIDTH,
148
+ onMouseEnter: segment => displayedData.length > 0 && setHoveredItem([segment.id]),
149
+ onMouseLeave: () => setHoveredItem([]),
150
+ outerRadius: radius - HOVER_DONUT_WIDTH,
151
+ paddingAngle: 2,
152
+ // Prevents the pie group element from being focusable
153
+ rootTabIndex: -1
154
+ }, content())), showLegend && (/*#__PURE__*/React__default.createElement(Legend, {
155
+ data: data,
156
+ visibleItems: visibleItems,
157
+ onClick: handleLegendClick,
158
+ total: total,
159
+ setHoveredItem: setHoveredItem,
160
+ label: label,
161
+ legendPosition: legendPosition,
162
+ hoveredItem: hoveredItem,
163
+ selectedItem: selectedItem,
164
+ formatter: formatter
165
+ })));
166
+ };
167
+ DonutChart.Segment = Segment;
168
+
169
+ export { DonutChart };
170
+ //# sourceMappingURL=DonutChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DonutChart.js","sources":["../../../../../../../../src/charts/components/Donut/DonutChart.tsx"],"sourcesContent":["import React from 'react';\nimport * as Recharts from 'recharts';\nimport cn from 'clsx';\n\nimport { Color, getThemeColor } from '../../utils/color';\nimport { getTooltipProps } from '../../utils/common';\nimport { Legend } from './Legend';\nimport { CenteredLabel } from './CenteredLabel';\nimport { ActiveShape } from './ActiveShape';\nimport { DONUT_WIDTH, HOVER_DONUT_WIDTH } from './util';\n\nconst Segment = (_: DonutChartSegmentProps) => null;\n\nexport type DonutChartSegmentProps = {\n color: Color;\n id: string;\n label: string;\n value: number;\n};\n\nexport type SegmentIds = string[];\n\nexport type DonutChartProps = {\n children: React.ReactElement<DonutChartSegmentProps> | React.ReactElement<DonutChartSegmentProps>[];\n formatter?: (value: number) => string;\n onClick?: (segment: DonutChartSegmentProps | DonutChartSegmentProps[]) => void;\n showLegend?: boolean;\n legendPosition?: string;\n label: string;\n};\n\nexport const DonutChart = function DonutChart({\n children,\n formatter,\n onClick,\n showLegend = false,\n legendPosition = 'bottom',\n label,\n}: DonutChartProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n const [radius, setRadius] = React.useState<number>(0);\n\n const [hoveredItem, setHoveredItem] = React.useState<SegmentIds>([]);\n // used for right legends\n const [selectedItem, setSelectedItem] = React.useState<SegmentIds>([]);\n // used for bottom legends\n const [visibleItems, setVisibleItems] = React.useState<Record<string, boolean>>(() => {\n const keys = {};\n\n React.Children.forEach(children, child => {\n keys[child.props.id] = true;\n });\n\n return keys;\n });\n\n React.useEffect(() => {\n if (ref.current) {\n const rect = ref.current.parentElement?.getBoundingClientRect();\n\n if (rect) {\n const width = showLegend ? rect.width / 2 : rect.width;\n const max: number = rect.height < width ? rect.height : width;\n setRadius(max / 2);\n }\n }\n }, [showLegend]);\n\n const diameter = radius * 2; // get dimensions of the parent container to find the max radius, so we can fill the container AND always have a 16px wide donut\n const data: DonutChartSegmentProps[] = React.Children.map(children, child => ({\n id: child.props.id,\n color: child.props.color,\n label: child.props.label,\n value: child.props.value,\n }));\n const displayedData = data.filter(child => visibleItems[child.id]);\n\n const total = displayedData.reduce((accum, entry) => accum + entry.value, 0);\n const showTooltip = (!showLegend || legendPosition === 'bottom') && displayedData.length > 0;\n\n const handleLegendClick = (entry: DonutChartSegmentProps | DonutChartSegmentProps[]): void => {\n if (legendPosition === 'bottom' && !Array.isArray(entry)) {\n setVisibleItems({ ...visibleItems, [entry.id]: !visibleItems[entry.id] });\n } else {\n const nextSelectedItem = Array.isArray(entry) ? entry.map(entryItem => entryItem.id) : [entry.id];\n\n // Using slice to avoid mutation of the react state 'selectedItem'\n const isCurrentSegmentActive = selectedItem.slice().sort().join(',') === nextSelectedItem.sort().join(',');\n\n if (onClick && !isCurrentSegmentActive) {\n onClick(entry);\n }\n\n setSelectedItem(isCurrentSegmentActive ? [] : nextSelectedItem);\n }\n };\n const handlePieClick = React.useCallback(\n (pieId: string | undefined) => {\n if (onClick && pieId !== undefined) {\n const pieProps = displayedData.find(item => item.id === pieId);\n\n onClick(pieProps as DonutChartSegmentProps);\n }\n },\n [onClick, displayedData]\n );\n\n const singlePieDonutChart = displayedData.length === 1;\n const activeShapeColor = React.useMemo(() => {\n const getSegmentColor = (item: SegmentIds) =>\n item.reduce((colors, itemId) => {\n const visibleHoveredItem = displayedData.find(dataItem => dataItem.id === itemId);\n\n if (visibleHoveredItem) {\n colors[visibleHoveredItem.id] = visibleHoveredItem.color;\n }\n\n return colors;\n }, {});\n\n const hoveredSegmentColor = getSegmentColor(hoveredItem);\n const selectedSegmentColor = getSegmentColor(selectedItem);\n\n return legendPosition === 'bottom' || hoveredItem.length !== 0 ? hoveredSegmentColor : selectedSegmentColor;\n }, [hoveredItem, selectedItem, legendPosition]);\n\n if (ref.current && !radius) {\n return null;\n }\n\n const getActiveIndex = () => {\n if (hoveredItem.length > 0) {\n return hoveredItem.map(itemId => displayedData.findIndex(element => element.id === itemId));\n }\n\n return selectedItem.map(selectedItemId => displayedData.findIndex(element => element.id === selectedItemId));\n };\n\n const content = () => {\n const elements = React.Children.toArray(children).filter(\n (child): child is React.ReactElement<DonutChartSegmentProps> =>\n React.isValidElement<DonutChartSegmentProps>(child) && visibleItems[child.props.id]\n );\n\n return elements.length > 0 ? (\n elements.map((child, index) => {\n return (\n <Recharts.Cell\n key={`cell-${index}`}\n name={child.props.label}\n fill={getThemeColor(child.props.color) ?? getThemeColor('blue-300')}\n />\n );\n })\n ) : (\n <Recharts.Cell key=\"empty-chart\" name={''} fill={getThemeColor('grey-200')} />\n );\n };\n\n return (\n <div\n className={cn('relative h-full w-full', {\n [`flex `]: showLegend,\n 'flex-col items-center': legendPosition === 'bottom',\n })}\n ref={ref}>\n <CenteredLabel\n radius={radius}\n legendPosition={legendPosition}\n label={label}\n total={total}\n formatter={formatter}\n showLegend={showLegend}\n />\n\n <Recharts.PieChart data={data} height={diameter} width={diameter} style={{ transform: 'rotate(90deg) scale(-1,1)' }}>\n {showTooltip ? (\n <Recharts.Tooltip\n {...getTooltipProps({\n style: { transform: 'rotate(90deg) scale(-1,1)' },\n singlePieDonutChart,\n })}\n />\n ) : null}\n <Recharts.Pie\n isAnimationActive={false}\n activeIndex={getActiveIndex()}\n activeShape={<ActiveShape pieColors={activeShapeColor} onClick={handlePieClick} />}\n data={displayedData.length > 0 ? displayedData : []}\n dataKey=\"value\"\n innerRadius={radius - HOVER_DONUT_WIDTH - DONUT_WIDTH} // offset the 12px wider hover state, and then make the donut 16px wide\n onMouseEnter={segment => displayedData.length > 0 && setHoveredItem([segment.id])}\n onMouseLeave={() => setHoveredItem([])}\n outerRadius={radius - HOVER_DONUT_WIDTH} // offset the 12px wide hover state\n paddingAngle={2}\n // Prevents the pie group element from being focusable\n rootTabIndex={-1}>\n {content()}\n </Recharts.Pie>\n </Recharts.PieChart>\n {showLegend && (\n <Legend\n data={data}\n visibleItems={visibleItems}\n onClick={handleLegendClick}\n total={total}\n setHoveredItem={setHoveredItem}\n label={label}\n legendPosition={legendPosition}\n hoveredItem={hoveredItem}\n selectedItem={selectedItem}\n formatter={formatter}\n />\n )}\n </div>\n );\n};\n\nDonutChart.Segment = Segment;\n"],"names":["Segment","_","DonutChart","children","formatter","onClick","showLegend","legendPosition","label","ref","React","useRef","radius","setRadius","useState","hoveredItem","setHoveredItem","selectedItem","setSelectedItem","visibleItems","setVisibleItems","keys","Children","forEach","child","props","id","useEffect","current","_ref$current$parentEl","rect","parentElement","getBoundingClientRect","width","max","height","diameter","data","map","color","value","displayedData","filter","total","reduce","accum","entry","showTooltip","length","handleLegendClick","Array","isArray","nextSelectedItem","entryItem","isCurrentSegmentActive","slice","sort","join","handlePieClick","useCallback","pieId","undefined","pieProps","find","item","singlePieDonutChart","activeShapeColor","useMemo","getSegmentColor","colors","itemId","visibleHoveredItem","dataItem","hoveredSegmentColor","selectedSegmentColor","getActiveIndex","findIndex","element","selectedItemId","content","elements","toArray","isValidElement","index","Recharts","key","name","fill","_getThemeColor","getThemeColor","className","cn","CenteredLabel","style","transform","getTooltipProps","isAnimationActive","activeIndex","activeShape","ActiveShape","pieColors","dataKey","innerRadius","HOVER_DONUT_WIDTH","DONUT_WIDTH","onMouseEnter","segment","onMouseLeave","outerRadius","paddingAngle","rootTabIndex","Legend"],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ import React__default from 'react';
2
+ import cn from 'clsx';
3
+ import '../../../components/Icon/components/index.js';
4
+ import { Icon } from '../../../components/Icon/Icon.js';
5
+ import '../../../components/BadgeIcon/BadgeIcon.js';
6
+ import '../../../components/Alert/Alert.js';
7
+ import '../../../utils/mergeRefs.js';
8
+ import '../../../components/Backdrop/Backdrop.js';
9
+ import '../../../components/AlertDialog/AlertDialog.js';
10
+ import '../../../components/Accordion/Accordion.js';
11
+ import '../../../components/VisuallyHidden/VisuallyHidden.js';
12
+ import '../../../components/Badge/Badge.js';
13
+ import '../../../hooks/useMergedRef.js';
14
+ import '../../../utils/keyboard.js';
15
+ import '../../../components/Tooltip/Tooltip.js';
16
+ import '../../../components/IconButton/IconButton.js';
17
+ import '../../../components/Provider/Localization.js';
18
+ import '../../../components/Banner/Banner.js';
19
+ import { Button } from '../../../components/Button/Button.js';
20
+ import '../../../components/Calendar/Calendar.js';
21
+ import '../../../components/Card/Card.js';
22
+ import '../../../components/Spinner/Spinner.js';
23
+ import '../../../components/Checkbox/Checkbox.js';
24
+ import '../../../hooks/useBoundingClientRectListener.js';
25
+ import '../../../components/Input/Input.js';
26
+ import '../../../utils/hooks/useListKeyboardNavigation.js';
27
+ import '../../../utils/hooks/useListScrollTo.js';
28
+ import '../../../components/Combobox/Combobox.js';
29
+ import '../../../utils/date.js';
30
+ import '../../../components/Popover/Popover.js';
31
+ import '../../../components/Datepicker/Datepicker.js';
32
+ import '../../../components/Dialog/Dialog.js';
33
+ import '../../../components/Group/Group.js';
34
+ import '../../../components/Drawer/Drawer.js';
35
+ import '../../../components/Field/Field.js';
36
+ import '../../../components/Form/Form.js';
37
+ import '../../../components/Hanger/Hanger.js';
38
+ import '../../../components/HoverCard/HoverCard.js';
39
+ import '../../../components/Switch/Switch.js';
40
+ import '../../../components/List/List.js';
41
+ import '../../../components/Listbox/Listbox.js';
42
+ import '../../../components/Shortcut/Shortcut.js';
43
+ import '../../../components/RadioGroup/RadioGroup.js';
44
+ import '../../../components/Menu/Menu.js';
45
+ import '../../../components/ModeSwitch/ModeSwitch.js';
46
+ import '../../../components/Treeview/Treeview.js';
47
+ import '../../../utils/hooks/useDropTarget.js';
48
+ import '../../../components/Navigation/Navigation.js';
49
+ import '../../../hooks/useIntersectionObserver.js';
50
+ import { OverflowGroup } from '../../../components/OverflowGroup/OverflowGroup.js';
51
+ import '../../../components/Select/Select.js';
52
+ import '../../../components/Pagination/usePagination.js';
53
+ import '../../../components/Pagination/Pagination.js';
54
+ import '../../../components/Progress/Progress.js';
55
+ import '../../../components/Toast/Toaster.js';
56
+ import '../../../components/Provider/Provider.js';
57
+ import '../../../types.js';
58
+ import '../../../primitives/Table/types.js';
59
+ import '../../../primitives/Table/useTableDataLoader.js';
60
+ import '../../../hooks/useLazyEffect.js';
61
+ import '../../../components/SearchInput/SearchInput.js';
62
+ import '../../../components/SearchInput2/SearchInput2.js';
63
+ import '../../../primitives/Collection/Collection.js';
64
+ import '../../../components/Tag/Tag.js';
65
+ import '../../../components/Select2/Select2.js';
66
+ import '../../../hooks/useMatchMedia.js';
67
+ import '../../../hooks/useIsLargeScreen.js';
68
+ import '../../../components/Report/Report.js';
69
+ import '../../../components/Table/components/Table.js';
70
+ import '../../../components/Table/components/PaginatedTable.js';
71
+ import '../../../components/Table/components/WindowedTable.js';
72
+ import '../../../components/Table/util/rowIndexPath.js';
73
+ import '../../../components/Table/hooks/useRowCreation.js';
74
+ import '../../../components/Textarea/Textarea.js';
75
+ import '../../../components/Table3/Table3.js';
76
+ import '../../../components/Tabs/Tabs.js';
77
+ import '../../../components/Tour/Tour.js';
78
+ import { getThemeColor } from '../../utils/color.js';
79
+ import '../Area/AreaChart.js';
80
+ import '../Bar/BarChart.js';
81
+ import './DonutChart.js';
82
+ import '../Line/LineChart.js';
83
+ import '../../../components/Header/Header.js';
84
+ import '../../../components/Layout/Layout.js';
85
+ import '../../../components/Navigation2/components/Link.js';
86
+ import '../../../components/Navigation2/Navigation2.js';
87
+ import '../../../hooks/useBoundaryOverflowDetection.js';
88
+ import '../../../utils/hooks/useOnClickOutside.js';
89
+
90
+ const Legend = ({
91
+ legendPosition,
92
+ hoveredItem,
93
+ selectedItem,
94
+ data,
95
+ onClick,
96
+ setHoveredItem,
97
+ formatter,
98
+ total,
99
+ visibleItems,
100
+ label
101
+ }) => {
102
+ const isTotalLegendSelected = selectedItem.length === data.length;
103
+ const isTotalLegendHovered = hoveredItem.length === data.length;
104
+ const handleMouseLeave = () => setHoveredItem([]);
105
+ const renderLegendItem = (entry, index) => {
106
+ const isTotal = entry === null;
107
+ // We can't use `isTotal` here because TypeScript is unable to infer the type when `entry` is not null.
108
+ const itemData = entry === null ? {
109
+ id: 'total',
110
+ label,
111
+ value: total,
112
+ color: 'grey-300'
113
+ } : entry;
114
+ const isSelected = isTotal ? isTotalLegendSelected : selectedItem.includes(itemData.id);
115
+ const isHovered = isTotal ? isTotalLegendHovered : hoveredItem.includes(itemData.id);
116
+ return /*#__PURE__*/React__default.createElement("li", {
117
+ key: isTotal ? 'total' : `${itemData.label}-${index}`,
118
+ className: cn('mr-2 flex cursor-pointer gap-2 rounded pl-0 pr-1', {
119
+ 'bg-grey-100': isHovered && (!isTotal || legendPosition === 'right'),
120
+ 'bg-grey-200': isSelected && (!isTotal || legendPosition === 'right')
121
+ }),
122
+ onClick: () => onClick(isTotal ? data : itemData),
123
+ onMouseEnter: () => setHoveredItem(isTotal ? data.map(item => item.id) : [itemData.id]),
124
+ onMouseLeave: handleMouseLeave
125
+ }, legendPosition === 'bottom' ? (/*#__PURE__*/React__default.createElement("div", {
126
+ className: "flex items-center gap-1"
127
+ }, /*#__PURE__*/React__default.createElement("span", {
128
+ className: cn('ml-1 h-3 w-3 rounded-sm', {
129
+ 'border-grey-300 border !bg-white': !visibleItems[itemData.id]
130
+ }),
131
+ style: {
132
+ backgroundColor: getThemeColor(itemData.color)
133
+ }
134
+ }, visibleItems[itemData.id] && isHovered && (/*#__PURE__*/React__default.createElement(Icon, {
135
+ name: "tick-bold",
136
+ className: "mb-2.5 !h-full !w-full text-white"
137
+ }))), /*#__PURE__*/React__default.createElement("div", null, itemData.label))) : (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
138
+ className: "ml-1 mt-1 h-9 w-2 rounded-[1px]",
139
+ style: {
140
+ backgroundColor: getThemeColor(itemData.color)
141
+ }
142
+ }), /*#__PURE__*/React__default.createElement("div", null, itemData.label, /*#__PURE__*/React__default.createElement("span", {
143
+ className: "-mt-1 flex w-full text-lg font-bold"
144
+ }, formatter ? formatter(itemData.value) : itemData.value)))));
145
+ };
146
+ const moreButton = moreButtonText => (/*#__PURE__*/React__default.createElement(Button, {
147
+ appearance: "transparent",
148
+ className: "text-grey-700"
149
+ }, moreButtonText));
150
+ const className = cn('flex-grow pl-4', {
151
+ 'w-full': legendPosition === 'bottom'
152
+ });
153
+ return /*#__PURE__*/React__default.createElement("div", {
154
+ className: className
155
+ }, /*#__PURE__*/React__default.createElement("ul", {
156
+ className: cn('mb-0 ml-0 mt-4 flex justify-center space-y-1', legendPosition === 'right' ? 'flex-col gap-1' : 'flex-row')
157
+ }, legendPosition === 'right' ? (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, renderLegendItem(null), data.map(renderLegendItem))) : (/*#__PURE__*/React__default.createElement(OverflowGroup, {
158
+ className: "w-full items-center py-1",
159
+ moreButton: moreButton
160
+ }, data.map(renderLegendItem)))));
161
+ };
162
+
163
+ export { Legend };
164
+ //# sourceMappingURL=Legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Legend.js","sources":["../../../../../../../../src/charts/components/Donut/Legend.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Button, Icon, OverflowGroup } from '../../../index';\n\nimport { getThemeColor } from '../../utils/color';\nimport { DonutChartProps, DonutChartSegmentProps, SegmentIds } from './DonutChart';\n\ntype LegendProps = Pick<DonutChartProps, 'formatter' | 'label' | 'legendPosition'> & {\n data: DonutChartSegmentProps[];\n hoveredItem: SegmentIds;\n onClick: (entry: DonutChartSegmentProps | DonutChartSegmentProps[]) => void;\n selectedItem: SegmentIds;\n setHoveredItem: React.Dispatch<React.SetStateAction<SegmentIds>>;\n total: number;\n visibleItems: Record<string, boolean>;\n};\n\nexport const Legend = ({\n legendPosition,\n hoveredItem,\n selectedItem,\n data,\n onClick,\n setHoveredItem,\n formatter,\n total,\n visibleItems,\n label,\n}: LegendProps) => {\n const isTotalLegendSelected = selectedItem.length === data.length;\n const isTotalLegendHovered = hoveredItem.length === data.length;\n\n const handleMouseLeave = () => setHoveredItem([]);\n\n const renderLegendItem = (entry: DonutChartSegmentProps | null, index?: number) => {\n const isTotal = entry === null;\n // We can't use `isTotal` here because TypeScript is unable to infer the type when `entry` is not null.\n const itemData = entry === null ? { id: 'total', label, value: total, color: 'grey-300' } : entry;\n const isSelected = isTotal ? isTotalLegendSelected : selectedItem.includes(itemData.id);\n const isHovered = isTotal ? isTotalLegendHovered : hoveredItem.includes(itemData.id);\n\n return (\n <li\n key={isTotal ? 'total' : `${itemData.label}-${index}`}\n className={cn('mr-2 flex cursor-pointer gap-2 rounded pl-0 pr-1', {\n 'bg-grey-100': isHovered && (!isTotal || legendPosition === 'right'),\n 'bg-grey-200': isSelected && (!isTotal || legendPosition === 'right'),\n })}\n onClick={() => onClick(isTotal ? data : itemData)}\n onMouseEnter={() => setHoveredItem(isTotal ? data.map(item => item.id) : [itemData.id])}\n onMouseLeave={handleMouseLeave}>\n {legendPosition === 'bottom' ? (\n <div className=\"flex items-center gap-1\">\n <span\n className={cn('ml-1 h-3 w-3 rounded-sm', {\n 'border-grey-300 border !bg-white': !visibleItems[itemData.id],\n })}\n style={{ backgroundColor: getThemeColor(itemData.color) }}>\n {visibleItems[itemData.id] && isHovered && (\n <Icon name=\"tick-bold\" className=\"mb-2.5 !h-full !w-full text-white\" />\n )}\n </span>\n <div>{itemData.label}</div>\n </div>\n ) : (\n <>\n <span\n className=\"ml-1 mt-1 h-9 w-2 rounded-[1px]\"\n style={{ backgroundColor: getThemeColor(itemData.color) }}\n />\n <div>\n {itemData.label}\n <span className=\"-mt-1 flex w-full text-lg font-bold\">\n {formatter ? formatter(itemData.value) : itemData.value}\n </span>\n </div>\n </>\n )}\n </li>\n );\n };\n\n const moreButton = moreButtonText => (\n <Button appearance=\"transparent\" className=\"text-grey-700\">\n {moreButtonText}\n </Button>\n );\n\n const className = cn('flex-grow pl-4', {\n 'w-full': legendPosition === 'bottom',\n });\n return (\n <div className={className}>\n <ul\n className={cn(\n 'mb-0 ml-0 mt-4 flex justify-center space-y-1',\n legendPosition === 'right' ? 'flex-col gap-1' : 'flex-row'\n )}>\n {legendPosition === 'right' ? (\n <>\n {renderLegendItem(null)}\n {data.map(renderLegendItem)}\n </>\n ) : (\n <OverflowGroup className=\"w-full items-center py-1\" moreButton={moreButton}>\n {data.map(renderLegendItem)}\n </OverflowGroup>\n )}\n </ul>\n </div>\n );\n};\n"],"names":["Legend","legendPosition","hoveredItem","selectedItem","data","onClick","setHoveredItem","formatter","total","visibleItems","label","isTotalLegendSelected","length","isTotalLegendHovered","handleMouseLeave","renderLegendItem","entry","index","isTotal","itemData","id","value","color","isSelected","includes","isHovered","React","key","className","cn","onMouseEnter","map","item","onMouseLeave","style","backgroundColor","getThemeColor","Icon","name","moreButton","moreButtonText","Button","appearance","OverflowGroup"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ const DONUT_WIDTH = 16;
2
+ const HOVER_DONUT_WIDTH = 10;
3
+
4
+ export { DONUT_WIDTH, HOVER_DONUT_WIDTH };
5
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sources":["../../../../../../../../src/charts/components/Donut/util.ts"],"sourcesContent":["export const DONUT_WIDTH = 16;\nexport const HOVER_DONUT_WIDTH = 10;\n"],"names":["DONUT_WIDTH","HOVER_DONUT_WIDTH"],"mappings":"MAAaA,WAAW,GAAG;MACdC,iBAAiB,GAAG;;;;"}
@@ -0,0 +1,145 @@
1
+ import React__default, { useState } from 'react';
2
+ import cn from 'clsx';
3
+ import '../../components/Icon/components/index.js';
4
+ import { Icon } from '../../components/Icon/Icon.js';
5
+ import '../../components/BadgeIcon/BadgeIcon.js';
6
+ import '../../components/Alert/Alert.js';
7
+ import '../../utils/mergeRefs.js';
8
+ import '../../components/Backdrop/Backdrop.js';
9
+ import '../../components/AlertDialog/AlertDialog.js';
10
+ import '../../components/Accordion/Accordion.js';
11
+ import '../../components/VisuallyHidden/VisuallyHidden.js';
12
+ import '../../components/Badge/Badge.js';
13
+ import '../../hooks/useMergedRef.js';
14
+ import '../../utils/keyboard.js';
15
+ import '../../components/Tooltip/Tooltip.js';
16
+ import '../../components/IconButton/IconButton.js';
17
+ import '../../components/Provider/Localization.js';
18
+ import '../../components/Banner/Banner.js';
19
+ import { Button } from '../../components/Button/Button.js';
20
+ import '../../components/Calendar/Calendar.js';
21
+ import '../../components/Card/Card.js';
22
+ import '../../components/Spinner/Spinner.js';
23
+ import '../../components/Checkbox/Checkbox.js';
24
+ import '../../hooks/useBoundingClientRectListener.js';
25
+ import '../../components/Input/Input.js';
26
+ import '../../utils/hooks/useListKeyboardNavigation.js';
27
+ import '../../utils/hooks/useListScrollTo.js';
28
+ import '../../components/Combobox/Combobox.js';
29
+ import '../../utils/date.js';
30
+ import '../../components/Popover/Popover.js';
31
+ import '../../components/Datepicker/Datepicker.js';
32
+ import '../../components/Dialog/Dialog.js';
33
+ import '../../components/Group/Group.js';
34
+ import '../../components/Drawer/Drawer.js';
35
+ import '../../components/Field/Field.js';
36
+ import '../../components/Form/Form.js';
37
+ import '../../components/Hanger/Hanger.js';
38
+ import '../../components/HoverCard/HoverCard.js';
39
+ import '../../components/Switch/Switch.js';
40
+ import '../../components/List/List.js';
41
+ import '../../components/Listbox/Listbox.js';
42
+ import '../../components/Shortcut/Shortcut.js';
43
+ import '../../components/RadioGroup/RadioGroup.js';
44
+ import '../../components/Menu/Menu.js';
45
+ import '../../components/ModeSwitch/ModeSwitch.js';
46
+ import '../../components/Treeview/Treeview.js';
47
+ import '../../utils/hooks/useDropTarget.js';
48
+ import '../../components/Navigation/Navigation.js';
49
+ import '../../hooks/useIntersectionObserver.js';
50
+ import { OverflowGroup } from '../../components/OverflowGroup/OverflowGroup.js';
51
+ import '../../components/Select/Select.js';
52
+ import '../../components/Pagination/usePagination.js';
53
+ import '../../components/Pagination/Pagination.js';
54
+ import '../../components/Progress/Progress.js';
55
+ import '../../components/Toast/Toaster.js';
56
+ import '../../components/Provider/Provider.js';
57
+ import '../../types.js';
58
+ import '../../primitives/Table/types.js';
59
+ import '../../primitives/Table/useTableDataLoader.js';
60
+ import '../../hooks/useLazyEffect.js';
61
+ import '../../components/SearchInput/SearchInput.js';
62
+ import '../../components/SearchInput2/SearchInput2.js';
63
+ import '../../primitives/Collection/Collection.js';
64
+ import '../../components/Tag/Tag.js';
65
+ import '../../components/Select2/Select2.js';
66
+ import '../../hooks/useMatchMedia.js';
67
+ import '../../hooks/useIsLargeScreen.js';
68
+ import '../../components/Report/Report.js';
69
+ import '../../components/Table/components/Table.js';
70
+ import '../../components/Table/components/PaginatedTable.js';
71
+ import '../../components/Table/components/WindowedTable.js';
72
+ import '../../components/Table/util/rowIndexPath.js';
73
+ import '../../components/Table/hooks/useRowCreation.js';
74
+ import '../../components/Textarea/Textarea.js';
75
+ import '../../components/Table3/Table3.js';
76
+ import '../../components/Tabs/Tabs.js';
77
+ import '../../components/Tour/Tour.js';
78
+ import './Area/AreaChart.js';
79
+ import './Bar/BarChart.js';
80
+ import './Donut/DonutChart.js';
81
+ import './Line/LineChart.js';
82
+ import '../../components/Header/Header.js';
83
+ import '../../components/Layout/Layout.js';
84
+ import '../../components/Navigation2/components/Link.js';
85
+ import '../../components/Navigation2/Navigation2.js';
86
+ import '../../hooks/useBoundaryOverflowDetection.js';
87
+ import '../../utils/hooks/useOnClickOutside.js';
88
+
89
+ function Legend(props) {
90
+ const {
91
+ activeIndex,
92
+ onMouseEnter,
93
+ onMouseLeave,
94
+ onClick,
95
+ payload,
96
+ layout,
97
+ activeItems
98
+ } = props;
99
+ const [hoverIndex, setHoverIndex] = useState(null);
100
+ const handleMouseEnter = (entry, index) => {
101
+ setHoverIndex(index);
102
+ if (activeItems[entry.dataKey]) onMouseEnter(entry, index);
103
+ };
104
+ const handleMouseLeave = () => {
105
+ onMouseLeave();
106
+ setHoverIndex(null);
107
+ };
108
+ const moreButton = moreButtonText => (/*#__PURE__*/React__default.createElement(Button, {
109
+ appearance: "transparent",
110
+ className: "text-grey-700"
111
+ }, moreButtonText));
112
+ return /*#__PURE__*/React__default.createElement("div", {
113
+ className: "mx-auto w-auto max-w-full overflow-hidden"
114
+ }, /*#__PURE__*/React__default.createElement("div", {
115
+ className: cn('mb-0 ml-0 flex justify-center', {
116
+ 'flex-col': layout === 'vertical'
117
+ })
118
+ }, /*#__PURE__*/React__default.createElement(OverflowGroup, {
119
+ className: "w-full items-center py-1",
120
+ moreButton: moreButton
121
+ }, payload.map((entry, index) => (/*#__PURE__*/React__default.createElement("span", {
122
+ key: `${entry.dataKey}-${index}`,
123
+ className: cn(' hover:bg-grey-100 cursor-pointer px-[8px] py-[2px] hover:rounded-[4px]', {
124
+ 'bg-grey-100 rounded': activeIndex === index
125
+ }),
126
+ onMouseEnter: () => handleMouseEnter(entry, index),
127
+ onMouseLeave: handleMouseLeave,
128
+ onClick: onClick ? () => onClick(entry) : undefined
129
+ }, /*#__PURE__*/React__default.createElement("span", {
130
+ className: "text-grey-700 flex items-center gap-[4px]"
131
+ }, /*#__PURE__*/React__default.createElement("span", {
132
+ className: cn('-mt-px ml-1 flex h-3 w-3 rounded-sm', {
133
+ 'border-grey-300 border !bg-white': !activeItems[entry.dataKey]
134
+ }),
135
+ style: {
136
+ backgroundColor: entry.color
137
+ }
138
+ }, hoverIndex === index && activeItems[entry.dataKey] && (/*#__PURE__*/React__default.createElement(Icon, {
139
+ name: "tick-bold",
140
+ className: "!h-full !w-full text-white"
141
+ }))), entry.value)))))));
142
+ }
143
+
144
+ export { Legend };
145
+ //# sourceMappingURL=Legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Legend.js","sources":["../../../../../../../src/charts/components/Legend.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport cn from 'clsx';\nimport { Icon, OverflowGroup, Button } from '../../index';\n\nimport { ActiveChartItems, PayloadType } from './types';\n\ntype InternalProps<TType> = {\n payload: PayloadType<TType>[];\n layout: string;\n activeIndex: number | undefined;\n};\n\nexport type LegendProps<TType> = {\n activeItems: ActiveChartItems<TType>;\n onMouseEnter: (entry: PayloadType<TType>, index: number) => void;\n onMouseLeave: () => void;\n onClick: (entry: PayloadType<TType>) => void;\n};\n\nexport type Props<TType> = LegendProps<TType> & InternalProps<TType>;\n\nexport function Legend<TType>(props: LegendProps<TType>) {\n const { activeIndex, onMouseEnter, onMouseLeave, onClick, payload, layout, activeItems } = props as Props<TType>;\n const [hoverIndex, setHoverIndex] = useState<number | null>(null);\n\n const handleMouseEnter = (entry: PayloadType<TType>, index: number) => {\n setHoverIndex(index);\n if (activeItems[entry.dataKey]) onMouseEnter(entry, index);\n };\n\n const handleMouseLeave = () => {\n onMouseLeave();\n setHoverIndex(null);\n };\n\n const moreButton = moreButtonText => (\n <Button appearance=\"transparent\" className=\"text-grey-700\">\n {moreButtonText}\n </Button>\n );\n\n return (\n <div className=\"mx-auto w-auto max-w-full overflow-hidden\">\n <div className={cn('mb-0 ml-0 flex justify-center', { 'flex-col': layout === 'vertical' })}>\n {/** py-1 is need to make sure the more button focus outline doesn't get cropped */}\n <OverflowGroup className=\"w-full items-center py-1\" moreButton={moreButton}>\n {payload.map((entry, index) => (\n <span\n key={`${entry.dataKey}-${index}`}\n className={cn(' hover:bg-grey-100 cursor-pointer px-[8px] py-[2px] hover:rounded-[4px]', {\n 'bg-grey-100 rounded': activeIndex === index,\n })}\n onMouseEnter={() => handleMouseEnter(entry, index)}\n onMouseLeave={handleMouseLeave}\n onClick={onClick ? () => onClick(entry) : undefined}>\n <span className=\"text-grey-700 flex items-center gap-[4px]\">\n <span\n className={cn('-mt-px ml-1 flex h-3 w-3 rounded-sm', {\n 'border-grey-300 border !bg-white': !activeItems[entry.dataKey],\n })}\n style={{ backgroundColor: entry.color }}>\n {hoverIndex === index && activeItems[entry.dataKey] && (\n <Icon name=\"tick-bold\" className=\"!h-full !w-full text-white\" />\n )}\n </span>\n {entry.value}\n </span>\n </span>\n ))}\n </OverflowGroup>\n </div>\n </div>\n );\n}\n"],"names":["Legend","props","activeIndex","onMouseEnter","onMouseLeave","onClick","payload","layout","activeItems","hoverIndex","setHoverIndex","useState","handleMouseEnter","entry","index","dataKey","handleMouseLeave","moreButton","moreButtonText","React","Button","appearance","className","cn","OverflowGroup","map","key","undefined","style","backgroundColor","color","Icon","name","value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAqBgBA,MAAMA,CAAQC,KAAyB;EACnD,MAAM;IAAEC,WAAW;IAAEC,YAAY;IAAEC,YAAY;IAAEC,OAAO;IAAEC,OAAO;IAAEC,MAAM;IAAEC;GAAa,GAAGP,KAAqB;EAChH,MAAM,CAACQ,UAAU,EAAEC,aAAa,CAAC,GAAGC,QAAQ,CAAgB,IAAI,CAAC;EAEjE,MAAMC,gBAAgB,GAAGA,CAACC,KAAyB,EAAEC,KAAa;IAC9DJ,aAAa,CAACI,KAAK,CAAC;IACpB,IAAIN,WAAW,CAACK,KAAK,CAACE,OAAO,CAAC,EAAEZ,YAAY,CAACU,KAAK,EAAEC,KAAK,CAAC;GAC7D;EAED,MAAME,gBAAgB,GAAGA;IACrBZ,YAAY,EAAE;IACdM,aAAa,CAAC,IAAI,CAAC;GACtB;EAED,MAAMO,UAAU,GAAGC,cAAc,kBAC7BC,6BAACC,MAAM;IAACC,UAAU,EAAC,aAAa;IAACC,SAAS,EAAC;KACtCJ,cAAc,CACV,CACZ;EAED,oBACIC;IAAKG,SAAS,EAAC;kBACXH;IAAKG,SAAS,EAAEC,EAAE,CAAC,+BAA+B,EAAE;MAAE,UAAU,EAAEhB,MAAM,KAAK;KAAY;kBAErFY,6BAACK,aAAa;IAACF,SAAS,EAAC,0BAA0B;IAACL,UAAU,EAAEA;KAC3DX,OAAO,CAACmB,GAAG,CAAC,CAACZ,KAAK,EAAEC,KAAK,mBACtBK;IACIO,GAAG,EAAE,GAAGb,KAAK,CAACE,OAAO,IAAID,KAAK,EAAE;IAChCQ,SAAS,EAAEC,EAAE,CAAC,yEAAyE,EAAE;MACrF,qBAAqB,EAAErB,WAAW,KAAKY;KAC1C,CAAC;IACFX,YAAY,EAAEA,MAAMS,gBAAgB,CAACC,KAAK,EAAEC,KAAK,CAAC;IAClDV,YAAY,EAAEY,gBAAgB;IAC9BX,OAAO,EAAEA,OAAO,GAAG,MAAMA,OAAO,CAACQ,KAAK,CAAC,GAAGc;kBAC1CR;IAAMG,SAAS,EAAC;kBACZH;IACIG,SAAS,EAAEC,EAAE,CAAC,qCAAqC,EAAE;MACjD,kCAAkC,EAAE,CAACf,WAAW,CAACK,KAAK,CAACE,OAAO;KACjE,CAAC;IACFa,KAAK,EAAE;MAAEC,eAAe,EAAEhB,KAAK,CAACiB;;KAC/BrB,UAAU,KAAKK,KAAK,IAAIN,WAAW,CAACK,KAAK,CAACE,OAAO,CAAC,kBAC/CI,6BAACY,IAAI;IAACC,IAAI,EAAC,WAAW;IAACV,SAAS,EAAC;IAA+B,CACnE,CACE,EACNT,KAAK,CAACoB,KAAK,CACT,CACJ,CACV,CAAC,CACU,CACd,CACJ;AAEd;;;;"}
@@ -0,0 +1,65 @@
1
+ import React__default, { useState } from 'react';
2
+ import { LineChart as LineChart$1, CartesianGrid, XAxis, YAxis, Legend, Tooltip, Line as Line$1 } from 'recharts';
3
+ import { getThemeColor } from '../../utils/color.js';
4
+ import { getCartesianGridProps, getXAxisProps, getYAxisProps, getLegendProps, getTooltipProps } from '../../utils/common.js';
5
+ import { ResponsiveContainer } from '../ResponsiveContainer.js';
6
+
7
+ const Line = _ => null;
8
+ const LineChart = function LineChart(externalProps) {
9
+ const {
10
+ children,
11
+ data,
12
+ formatter,
13
+ ...props
14
+ } = externalProps;
15
+ const [hoveredLine, setHoveredLine] = useState(null);
16
+ const [activeLines, setActiveLines] = useState(() => {
17
+ const keys = {};
18
+ React__default.Children.forEach(children, child => {
19
+ keys[child.props.accessor] = true;
20
+ });
21
+ return keys;
22
+ });
23
+ const handleLegendClick = entry => {
24
+ setHoveredLine(null);
25
+ setActiveLines({
26
+ ...activeLines,
27
+ [entry.dataKey]: !activeLines[entry.dataKey]
28
+ });
29
+ };
30
+ return /*#__PURE__*/React__default.createElement(ResponsiveContainer, null, /*#__PURE__*/React__default.createElement(LineChart$1, {
31
+ data: data,
32
+ margin: {
33
+ top: 10,
34
+ right: 0,
35
+ left: -25,
36
+ bottom: 0
37
+ }
38
+ }, /*#__PURE__*/React__default.createElement(CartesianGrid, Object.assign({}, getCartesianGridProps())), /*#__PURE__*/React__default.createElement(XAxis, Object.assign({}, getXAxisProps(props))), /*#__PURE__*/React__default.createElement(YAxis, Object.assign({}, getYAxisProps(props))), /*#__PURE__*/React__default.createElement(Legend, Object.assign({}, getLegendProps({
39
+ onClick: handleLegendClick,
40
+ onMouseEnter: entry => setHoveredLine(entry.dataKey),
41
+ onMouseLeave: () => setHoveredLine(null),
42
+ activeItems: activeLines
43
+ }))), /*#__PURE__*/React__default.createElement(Tooltip, Object.assign({}, getTooltipProps(), {
44
+ formatter: formatter
45
+ })), React__default.Children.map(children, child => {
46
+ var _child$props$color, _child$props$color2;
47
+ return /*#__PURE__*/React__default.createElement(Line$1, {
48
+ activeDot: {
49
+ fill: getThemeColor((_child$props$color = child.props.color) !== null && _child$props$color !== void 0 ? _child$props$color : 'blue-300')
50
+ },
51
+ dataKey: child.props.accessor,
52
+ isAnimationActive: false,
53
+ dot: false,
54
+ name: child.props.label,
55
+ stroke: getThemeColor((_child$props$color2 = child.props.color) !== null && _child$props$color2 !== void 0 ? _child$props$color2 : 'blue-300'),
56
+ strokeWidth: 2,
57
+ hide: !activeLines[child.props.accessor],
58
+ opacity: hoveredLine && child.props.accessor !== hoveredLine ? 0.3 : 1
59
+ });
60
+ })));
61
+ };
62
+ LineChart.Line = Line;
63
+
64
+ export { LineChart };
65
+ //# sourceMappingURL=LineChart.js.map