@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
@@ -48,6 +48,7 @@ var setWith = _interopDefault(require('lodash/setWith'));
48
48
  var TabsPrimitive = require('@radix-ui/react-tabs');
49
49
  var Joyride = require('react-joyride');
50
50
  var Joyride__default = _interopDefault(Joyride);
51
+ var Recharts = require('recharts');
51
52
 
52
53
  const AVAILABLE_COLORS = ['green', 'yellow', 'red', 'blue', 'purple', 'brown', 'pink', 'orange', 'grey', 'transparent'];
53
54
  const getColorByState = state => {
@@ -20462,6 +20463,796 @@ const Tour = props => {
20462
20463
  };
20463
20464
  Tour.Step = TourStep;
20464
20465
 
20466
+ // NOTE: this file is intentianally a js file so that it can be consumed by tailwind.config.js
20467
+
20468
+ const THEME_COLORS = {
20469
+ transparent: 'transparent',
20470
+ current: 'currentColor',
20471
+ white: '#fff',
20472
+ black: '#1c1c1c',
20473
+ brand: {
20474
+ vismaRed: '#E70641',
20475
+ paleOrange: '#FFF5E5',
20476
+ sunsetOrange: '#E89C2E',
20477
+ midnightBlue: '#29283E',
20478
+ coolBlue: '#F5F7F9'
20479
+ },
20480
+ grey: {
20481
+ lightest: '#fafafa',
20482
+ light: '#F6F6F6',
20483
+ DEFAULT: '#EBEBEB',
20484
+ dark: '#DDDDDD',
20485
+ darker: '#ACACAC',
20486
+ darkest: '#595959',
20487
+ darkNew: '#a5a6a9',
20488
+ 50: '#fafafa',
20489
+ 100: '#F6F6F6',
20490
+ 200: '#EBEBEB',
20491
+ 300: '#DDDDDD',
20492
+ 500: '#ACACAC',
20493
+ 700: '#595959',
20494
+ 900: '#303030'
20495
+ },
20496
+ purple: {
20497
+ lightest: '#585c74',
20498
+ light: '#4b4f64',
20499
+ DEFAULT: '#3d4153',
20500
+ dark: '#353a48',
20501
+ darker: '#29283e',
20502
+ darkest: '#212032',
20503
+ darkNew_1: '#373647',
20504
+ darkNew_2: '#414050',
20505
+ 100: '#EEE5FF',
20506
+ 200: '#ddd1ff',
20507
+ 300: '#CBBCFE',
20508
+ 500: '#9270FA',
20509
+ 700: '#6542D1',
20510
+ 900: '#412970'
20511
+ },
20512
+ blue: {
20513
+ lightest: '#DEEBFF',
20514
+ light: '#75A0F5',
20515
+ DEFAULT: '#4573D2',
20516
+ dark: '#2B57B4',
20517
+ 100: '#DEEBFF',
20518
+ 200: '#AACCFF',
20519
+ 300: '#75A0F5',
20520
+ 500: '#4573D2',
20521
+ 700: '#2B57B4',
20522
+ 900: '#29283E'
20523
+ },
20524
+ red: {
20525
+ lightest: '#FFDAD2',
20526
+ light: '#E66568',
20527
+ DEFAULT: '#CE3F42',
20528
+ dark: '#950027',
20529
+ 100: '#FFDAD2',
20530
+ 200: '#f3a09d',
20531
+ 300: '#E66568',
20532
+ 500: '#CE3F42',
20533
+ 700: '#950027',
20534
+ 900: '#64001B'
20535
+ },
20536
+ green: {
20537
+ lightest: '#cdf0e7',
20538
+ light: '#52C7AB',
20539
+ DEFAULT: '#08AE87',
20540
+ dark: '#028465',
20541
+ 100: '#cdf0e7',
20542
+ 200: '#9be1ce',
20543
+ 300: '#52C7AB',
20544
+ 500: '#08AE87',
20545
+ 700: '#028465',
20546
+ 900: '#14493A'
20547
+ },
20548
+ yellow: {
20549
+ lightest: '#FFF1C3',
20550
+ light: '#FFD665',
20551
+ DEFAULT: '#FFBD3B',
20552
+ dark: '#e89c2e',
20553
+ 100: '#FFF1C3',
20554
+ 200: '#ffe494',
20555
+ 300: '#FFD665',
20556
+ 500: '#FFBD3B',
20557
+ 700: '#e89c2e',
20558
+ 900: '#733700'
20559
+ },
20560
+ pink: {
20561
+ 100: '#FFE3F7',
20562
+ 200: '#fcb9e9',
20563
+ 300: '#F98EDB',
20564
+ 500: '#E165BF',
20565
+ 700: '#CF49AA',
20566
+ 900: '#870062'
20567
+ },
20568
+ brown: {
20569
+ 100: '#EEE0DA',
20570
+ 200: '#DFCCC2',
20571
+ 300: '#C4AB9E',
20572
+ 500: '#93715D',
20573
+ 700: '#73503B',
20574
+ 900: '#45291F'
20575
+ },
20576
+ orange: {
20577
+ 100: '#FFE3BB',
20578
+ 200: '#FCCB80',
20579
+ 300: '#FAB64D',
20580
+ 500: '#F99702',
20581
+ 700: '#EF7D00',
20582
+ 900: '#4A2811'
20583
+ }
20584
+ };
20585
+
20586
+ const mapColor = (palette, prefix = '') => {
20587
+ return Object.keys(palette).reduce((accum, color) => {
20588
+ if (color === 'current') {
20589
+ return accum;
20590
+ } else if (typeof palette[color] === 'string') {
20591
+ return {
20592
+ ...accum,
20593
+ [prefix ? color === 'DEFAULT' ? prefix : `${prefix}-${color}` : color]: palette[color]
20594
+ };
20595
+ } else {
20596
+ return {
20597
+ ...accum,
20598
+ ...mapColor(palette[color], color)
20599
+ };
20600
+ }
20601
+ }, {});
20602
+ };
20603
+ const colors = /*#__PURE__*/mapColor(THEME_COLORS);
20604
+ const getThemeColor = color => colors[color];
20605
+
20606
+ function Legend(props) {
20607
+ const {
20608
+ activeIndex,
20609
+ onMouseEnter,
20610
+ onMouseLeave,
20611
+ onClick,
20612
+ payload,
20613
+ layout,
20614
+ activeItems
20615
+ } = props;
20616
+ const [hoverIndex, setHoverIndex] = React.useState(null);
20617
+ const handleMouseEnter = (entry, index) => {
20618
+ setHoverIndex(index);
20619
+ if (activeItems[entry.dataKey]) onMouseEnter(entry, index);
20620
+ };
20621
+ const handleMouseLeave = () => {
20622
+ onMouseLeave();
20623
+ setHoverIndex(null);
20624
+ };
20625
+ const moreButton = moreButtonText => (/*#__PURE__*/React__default.createElement(Button$1, {
20626
+ appearance: "transparent",
20627
+ className: "text-grey-700"
20628
+ }, moreButtonText));
20629
+ return /*#__PURE__*/React__default.createElement("div", {
20630
+ className: "mx-auto w-auto max-w-full overflow-hidden"
20631
+ }, /*#__PURE__*/React__default.createElement("div", {
20632
+ className: cn('mb-0 ml-0 flex justify-center', {
20633
+ 'flex-col': layout === 'vertical'
20634
+ })
20635
+ }, /*#__PURE__*/React__default.createElement(OverflowGroup, {
20636
+ className: "w-full items-center py-1",
20637
+ moreButton: moreButton
20638
+ }, payload.map((entry, index) => (/*#__PURE__*/React__default.createElement("span", {
20639
+ key: `${entry.dataKey}-${index}`,
20640
+ className: cn(' hover:bg-grey-100 cursor-pointer px-[8px] py-[2px] hover:rounded-[4px]', {
20641
+ 'bg-grey-100 rounded': activeIndex === index
20642
+ }),
20643
+ onMouseEnter: () => handleMouseEnter(entry, index),
20644
+ onMouseLeave: handleMouseLeave,
20645
+ onClick: onClick ? () => onClick(entry) : undefined
20646
+ }, /*#__PURE__*/React__default.createElement("span", {
20647
+ className: "text-grey-700 flex items-center gap-[4px]"
20648
+ }, /*#__PURE__*/React__default.createElement("span", {
20649
+ className: cn('-mt-px ml-1 flex h-3 w-3 rounded-sm', {
20650
+ 'border-grey-300 border !bg-white': !activeItems[entry.dataKey]
20651
+ }),
20652
+ style: {
20653
+ backgroundColor: entry.color
20654
+ }
20655
+ }, hoverIndex === index && activeItems[entry.dataKey] && (/*#__PURE__*/React__default.createElement(Icon, {
20656
+ name: "tick-bold",
20657
+ className: "!h-full !w-full text-white"
20658
+ }))), entry.value)))))));
20659
+ }
20660
+
20661
+ const Tooltip$2 = ({
20662
+ active,
20663
+ formatter,
20664
+ payload,
20665
+ style,
20666
+ singlePieDonutChart
20667
+ }) => {
20668
+ const getColor = entry => {
20669
+ var _ref, _entry$color;
20670
+ if (singlePieDonutChart) {
20671
+ // We use entry.payload.label because the payload structure differs between a Donut chart with a single pie
20672
+ // and one with multiple pies.
20673
+ return getThemeColor(entry.payload.color);
20674
+ }
20675
+ return (_ref = (_entry$color = entry.color) !== null && _entry$color !== void 0 ? _entry$color : entry.payload.fill) !== null && _ref !== void 0 ? _ref : 'blue-500';
20676
+ };
20677
+ if (active && payload && payload.length) {
20678
+ return /*#__PURE__*/React__default.createElement("dl", {
20679
+ className: "z-20 grid grid-cols-[max-content_max-content] gap-x-4 rounded-md bg-white p-4 text-xs shadow-[0px_0px_1px_rgba(0,0,0,0.1),_0px_6px_18px_rgba(47,51,68,0.2)]",
20680
+ style: style
20681
+ }, payload.map((entry, index) => (/*#__PURE__*/React__default.createElement(React__default.Fragment, {
20682
+ key: `${entry.name}-${index}`
20683
+ }, /*#__PURE__*/React__default.createElement("dt", {
20684
+ className: "text-grey-700 mb-0 flex items-center gap-1 font-normal"
20685
+ }, /*#__PURE__*/React__default.createElement("span", {
20686
+ className: "-mt-px h-2.5 w-2.5 rounded-sm",
20687
+ style: {
20688
+ background: getColor(entry)
20689
+ }
20690
+ }),
20691
+ // We use entry.payload.label because the payload structure differs between a Donut chart with a single pie
20692
+ // and one with multiple pies.
20693
+ singlePieDonutChart ? entry.payload.label : entry.name), /*#__PURE__*/React__default.createElement("dd", {
20694
+ className: "mb-0 text-right font-bold text-black "
20695
+ }, formatter ? formatter(entry.value) : entry.value)))));
20696
+ }
20697
+ return null;
20698
+ };
20699
+
20700
+ const getCartesianGridProps = () => ({
20701
+ vertical: false
20702
+ });
20703
+ const getXAxisProps = props => ({
20704
+ axisLine: false,
20705
+ dataKey: props.accessor,
20706
+ fontSize: 12,
20707
+ scale: props.xAxisScale,
20708
+ tickLine: false,
20709
+ tickFormatter: props.xAxisTickFormat
20710
+ });
20711
+ const getYAxisProps = props => ({
20712
+ axisLine: false,
20713
+ fontSize: 12,
20714
+ scale: props.yAxisScale,
20715
+ tickLine: false,
20716
+ tickFormatter: props.yAxisTickFormat
20717
+ });
20718
+ const getLegendProps = props => ({
20719
+ content: /*#__PURE__*/React__default.createElement(Legend, Object.assign({}, props))
20720
+ });
20721
+ const getTooltipProps = (props = undefined) => ({
20722
+ content: /*#__PURE__*/React__default.createElement(Tooltip$2, Object.assign({}, props)),
20723
+ wrapperStyle: {
20724
+ outline: 'none'
20725
+ }
20726
+ });
20727
+
20728
+ // A hacky fix for EC-50037 to make sure that Chart doesn't resize when it is inside a Card.
20729
+ const ResponsiveContainer = props => (/*#__PURE__*/React__default.createElement(Recharts.ResponsiveContainer, Object.assign({
20730
+ className: "!h-[calc(100%-1px)] !w-[calc(100%-1px)]"
20731
+ }, props)));
20732
+
20733
+ const Area = _ => null;
20734
+ const AreaChart = function AreaChart(externalProps) {
20735
+ const {
20736
+ children,
20737
+ data,
20738
+ formatter,
20739
+ ...props
20740
+ } = externalProps;
20741
+ const [hoveredArea, setHoveredArea] = React.useState(null);
20742
+ const [activeAreas, setActiveAreas] = React.useState(() => {
20743
+ const areas = {};
20744
+ React__default.Children.forEach(children, child => {
20745
+ areas[child.props.accessor] = true;
20746
+ });
20747
+ return areas;
20748
+ });
20749
+ const handleLegendClick = entry => {
20750
+ setHoveredArea(null);
20751
+ setActiveAreas({
20752
+ ...activeAreas,
20753
+ [entry.dataKey]: !activeAreas[entry.dataKey]
20754
+ });
20755
+ };
20756
+ return /*#__PURE__*/React__default.createElement(ResponsiveContainer, null, /*#__PURE__*/React__default.createElement(Recharts.AreaChart, {
20757
+ data: data,
20758
+ margin: {
20759
+ top: 10,
20760
+ right: 0,
20761
+ left: -25,
20762
+ bottom: 0
20763
+ }
20764
+ }, /*#__PURE__*/React__default.createElement(Recharts.CartesianGrid, Object.assign({}, getCartesianGridProps())), /*#__PURE__*/React__default.createElement(Recharts.XAxis, Object.assign({}, getXAxisProps(props))), /*#__PURE__*/React__default.createElement(Recharts.YAxis, Object.assign({}, getYAxisProps(props))), /*#__PURE__*/React__default.createElement(Recharts.Legend, Object.assign({}, getLegendProps({
20765
+ onClick: handleLegendClick,
20766
+ onMouseEnter: entry => setHoveredArea(entry.dataKey),
20767
+ onMouseLeave: () => setHoveredArea(null),
20768
+ activeItems: activeAreas
20769
+ }))), /*#__PURE__*/React__default.createElement(Recharts.Tooltip, Object.assign({}, getTooltipProps(), {
20770
+ formatter: formatter
20771
+ })), React__default.Children.map(children, child => {
20772
+ var _child$props$color, _child$props$color2, _child$props$color3;
20773
+ return /*#__PURE__*/React__default.createElement(Recharts.Area, {
20774
+ activeDot: {
20775
+ fill: getThemeColor((_child$props$color = child.props.color) !== null && _child$props$color !== void 0 ? _child$props$color : 'blue-300')
20776
+ },
20777
+ isAnimationActive: false,
20778
+ dataKey: child.props.accessor,
20779
+ dot: false,
20780
+ fill: getThemeColor((_child$props$color2 = child.props.color) !== null && _child$props$color2 !== void 0 ? _child$props$color2 : 'grey-100'),
20781
+ name: child.props.label,
20782
+ strokeWidth: 2,
20783
+ stroke: getThemeColor((_child$props$color3 = child.props.color) !== null && _child$props$color3 !== void 0 ? _child$props$color3 : 'grey-300'),
20784
+ stackId: child.props.stackId,
20785
+ hide: !activeAreas[child.props.accessor],
20786
+ opacity: hoveredArea && child.props.accessor !== hoveredArea ? 0.3 : 1
20787
+ });
20788
+ })));
20789
+ };
20790
+ AreaChart.Area = Area;
20791
+
20792
+ const Bar$1 = _ => null;
20793
+ const getXAxisVerticalProps = props => ({
20794
+ ...getXAxisProps(props),
20795
+ ...{
20796
+ type: 'number',
20797
+ dataKey: undefined
20798
+ }
20799
+ });
20800
+ const getYAxisVerticalProps = props => ({
20801
+ ...getYAxisProps(props),
20802
+ ...{
20803
+ dataKey: props.accessor,
20804
+ type: 'category'
20805
+ }
20806
+ });
20807
+ const BarChart = function BarChart(externalProps) {
20808
+ const {
20809
+ children,
20810
+ data,
20811
+ formatter,
20812
+ layout = 'horizontal',
20813
+ ...props
20814
+ } = externalProps;
20815
+ const [activeIndex, setActiveIndex] = React__default.useState(undefined);
20816
+ const [hoveredBar, setHoveredBar] = React.useState(null);
20817
+ const [activeBars, setActiveBars] = React.useState(() => {
20818
+ const keys = {};
20819
+ React__default.Children.forEach(children, child => {
20820
+ keys[child.props.accessor] = true;
20821
+ });
20822
+ return keys;
20823
+ });
20824
+ // Recharts doesn't provide a way for us to know if a stacked bar is at the top or the bottom,
20825
+ // so we can't set proper radiuses without some "magic"
20826
+ const stacks = {};
20827
+ React__default.Children.forEach(children, child => {
20828
+ if (child.props.stackId) {
20829
+ if (!stacks[child.props.stackId]) {
20830
+ stacks[child.props.stackId] = [child.props.accessor];
20831
+ } else {
20832
+ stacks[child.props.stackId].push(child.props.accessor);
20833
+ }
20834
+ }
20835
+ });
20836
+ const handleLegendClick = entry => {
20837
+ setHoveredBar(null);
20838
+ setActiveBars({
20839
+ ...activeBars,
20840
+ [entry.dataKey]: !activeBars[entry.dataKey]
20841
+ });
20842
+ };
20843
+ const handleLegendHover = (entry, index) => {
20844
+ setHoveredBar(entry.dataKey);
20845
+ setActiveIndex(index);
20846
+ };
20847
+ return /*#__PURE__*/React__default.createElement(ResponsiveContainer, null, /*#__PURE__*/React__default.createElement(Recharts.BarChart, {
20848
+ layout: layout,
20849
+ data: data,
20850
+ margin: {
20851
+ top: 10,
20852
+ right: 0,
20853
+ left: layout === 'vertical' ? 0 : -25,
20854
+ bottom: 0
20855
+ },
20856
+ onMouseMove: chartState => setActiveIndex(chartState.activeTooltipIndex),
20857
+ onMouseLeave: () => setActiveIndex(undefined)
20858
+ }, /*#__PURE__*/React__default.createElement(Recharts.CartesianGrid, Object.assign({}, getCartesianGridProps())), /*#__PURE__*/React__default.createElement(Recharts.XAxis, Object.assign({}, layout === 'vertical' ? getXAxisVerticalProps(props) : getXAxisProps(props))), /*#__PURE__*/React__default.createElement(Recharts.YAxis, Object.assign({}, layout === 'vertical' ? getYAxisVerticalProps(props) : getYAxisProps(props))), /*#__PURE__*/React__default.createElement(Recharts.Legend, Object.assign({}, getLegendProps({
20859
+ onClick: handleLegendClick,
20860
+ onMouseEnter: handleLegendHover,
20861
+ onMouseLeave: () => setHoveredBar(null),
20862
+ activeItems: activeBars
20863
+ }))), /*#__PURE__*/React__default.createElement(Recharts.Tooltip, Object.assign({}, getTooltipProps(), {
20864
+ formatter: formatter
20865
+ })), React__default.Children.map(children, child => (/*#__PURE__*/React__default.createElement(Recharts.Bar, {
20866
+ isAnimationActive: false,
20867
+ barSize: 16,
20868
+ dataKey: child.props.accessor,
20869
+ name: child.props.label,
20870
+ onMouseEnter: (_, index) => setActiveIndex(index),
20871
+ onMouseLeave: () => setActiveIndex(undefined),
20872
+ fill: getThemeColor(child.props.color ? `${child.props.color}` : `blue-300`),
20873
+ radius: getBarRadius(stacks, child.props.accessor, child.props.stackId, activeBars),
20874
+ stackId: child.props.stackId,
20875
+ style: child.props.stackId ? {
20876
+ stroke: '#fff',
20877
+ strokeWidth: '2px'
20878
+ } : undefined,
20879
+ hide: !activeBars[child.props.accessor]
20880
+ }, data.map((_, index) => (/*#__PURE__*/React__default.createElement(Recharts.Cell, {
20881
+ key: `cell-${index}`,
20882
+ opacity: hoveredBar && child.props.accessor !== hoveredBar || activeIndex !== undefined && activeIndex !== index ? 0.3 : 1
20883
+ }))))))));
20884
+ };
20885
+ BarChart.Bar = Bar$1;
20886
+ const getBarRadius = (stacks, accessor, stackId, activeBars) => {
20887
+ if (stackId && Array.isArray(stacks[stackId])) {
20888
+ const length = stacks[stackId].length - 1;
20889
+ const index = stacks[stackId].indexOf(accessor);
20890
+ if (Object.entries(activeBars).filter(item => item[0] !== accessor).every(item => !item[1])) {
20891
+ return [3, 3, 0, 0];
20892
+ }
20893
+ if (activeBars[stacks[stackId][index + 1]] === false) {
20894
+ return [index === 0 ? 0 : 3, index === 0 ? 0 : 3, index === length - 1 ? 0 : 3, index === length - 1 ? 0 : 3];
20895
+ }
20896
+ if (index !== 0 && index !== length) {
20897
+ return 0;
20898
+ }
20899
+ return [index === 0 ? 0 : 3, index === 0 ? 0 : 3, index === length ? 0 : 3, index === length ? 0 : 3];
20900
+ }
20901
+ return 3;
20902
+ };
20903
+
20904
+ const Legend$1 = ({
20905
+ legendPosition,
20906
+ hoveredItem,
20907
+ selectedItem,
20908
+ data,
20909
+ onClick,
20910
+ setHoveredItem,
20911
+ formatter,
20912
+ total,
20913
+ visibleItems,
20914
+ label
20915
+ }) => {
20916
+ const isTotalLegendSelected = selectedItem.length === data.length;
20917
+ const isTotalLegendHovered = hoveredItem.length === data.length;
20918
+ const handleMouseLeave = () => setHoveredItem([]);
20919
+ const renderLegendItem = (entry, index) => {
20920
+ const isTotal = entry === null;
20921
+ // We can't use `isTotal` here because TypeScript is unable to infer the type when `entry` is not null.
20922
+ const itemData = entry === null ? {
20923
+ id: 'total',
20924
+ label,
20925
+ value: total,
20926
+ color: 'grey-300'
20927
+ } : entry;
20928
+ const isSelected = isTotal ? isTotalLegendSelected : selectedItem.includes(itemData.id);
20929
+ const isHovered = isTotal ? isTotalLegendHovered : hoveredItem.includes(itemData.id);
20930
+ return /*#__PURE__*/React__default.createElement("li", {
20931
+ key: isTotal ? 'total' : `${itemData.label}-${index}`,
20932
+ className: cn('mr-2 flex cursor-pointer gap-2 rounded pl-0 pr-1', {
20933
+ 'bg-grey-100': isHovered && (!isTotal || legendPosition === 'right'),
20934
+ 'bg-grey-200': isSelected && (!isTotal || legendPosition === 'right')
20935
+ }),
20936
+ onClick: () => onClick(isTotal ? data : itemData),
20937
+ onMouseEnter: () => setHoveredItem(isTotal ? data.map(item => item.id) : [itemData.id]),
20938
+ onMouseLeave: handleMouseLeave
20939
+ }, legendPosition === 'bottom' ? (/*#__PURE__*/React__default.createElement("div", {
20940
+ className: "flex items-center gap-1"
20941
+ }, /*#__PURE__*/React__default.createElement("span", {
20942
+ className: cn('ml-1 h-3 w-3 rounded-sm', {
20943
+ 'border-grey-300 border !bg-white': !visibleItems[itemData.id]
20944
+ }),
20945
+ style: {
20946
+ backgroundColor: getThemeColor(itemData.color)
20947
+ }
20948
+ }, visibleItems[itemData.id] && isHovered && (/*#__PURE__*/React__default.createElement(Icon, {
20949
+ name: "tick-bold",
20950
+ className: "mb-2.5 !h-full !w-full text-white"
20951
+ }))), /*#__PURE__*/React__default.createElement("div", null, itemData.label))) : (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
20952
+ className: "ml-1 mt-1 h-9 w-2 rounded-[1px]",
20953
+ style: {
20954
+ backgroundColor: getThemeColor(itemData.color)
20955
+ }
20956
+ }), /*#__PURE__*/React__default.createElement("div", null, itemData.label, /*#__PURE__*/React__default.createElement("span", {
20957
+ className: "-mt-1 flex w-full text-lg font-bold"
20958
+ }, formatter ? formatter(itemData.value) : itemData.value)))));
20959
+ };
20960
+ const moreButton = moreButtonText => (/*#__PURE__*/React__default.createElement(Button$1, {
20961
+ appearance: "transparent",
20962
+ className: "text-grey-700"
20963
+ }, moreButtonText));
20964
+ const className = cn('flex-grow pl-4', {
20965
+ 'w-full': legendPosition === 'bottom'
20966
+ });
20967
+ return /*#__PURE__*/React__default.createElement("div", {
20968
+ className: className
20969
+ }, /*#__PURE__*/React__default.createElement("ul", {
20970
+ className: cn('mb-0 ml-0 mt-4 flex justify-center space-y-1', legendPosition === 'right' ? 'flex-col gap-1' : 'flex-row')
20971
+ }, legendPosition === 'right' ? (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, renderLegendItem(null), data.map(renderLegendItem))) : (/*#__PURE__*/React__default.createElement(OverflowGroup, {
20972
+ className: "w-full items-center py-1",
20973
+ moreButton: moreButton
20974
+ }, data.map(renderLegendItem)))));
20975
+ };
20976
+
20977
+ const DONUT_WIDTH = 16;
20978
+ const HOVER_DONUT_WIDTH = 10;
20979
+
20980
+ const CenteredLabel = ({
20981
+ radius,
20982
+ legendPosition,
20983
+ label,
20984
+ total,
20985
+ formatter,
20986
+ showLegend
20987
+ }) => {
20988
+ const totalInset = HOVER_DONUT_WIDTH + DONUT_WIDTH + DONUT_WIDTH;
20989
+ const diameter = radius * 2;
20990
+ return /*#__PURE__*/React__default.createElement("div", {
20991
+ className: "absolute mt-1 flex h-12 flex-col text-center",
20992
+ style: {
20993
+ top: `calc(${radius}px - (3rem / 2))`,
20994
+ left: legendPosition === 'right' ? `${totalInset}px` : `calc(50%-${diameter - 2 * totalInset})`,
20995
+ width: showLegend ? `${diameter - 2 * totalInset}px` : `${diameter}px`
20996
+ }
20997
+ }, /*#__PURE__*/React__default.createElement("span", {
20998
+ className: "w-full truncate text-lg font-bold"
20999
+ }, formatter ? formatter(total) : total), label);
21000
+ };
21001
+
21002
+ const ActiveShape = props => {
21003
+ var _getThemeColor;
21004
+ const {
21005
+ cx,
21006
+ cy,
21007
+ id,
21008
+ innerRadius,
21009
+ onClick,
21010
+ outerRadius = 0,
21011
+ pieColors,
21012
+ startAngle,
21013
+ endAngle,
21014
+ fill
21015
+ } = props;
21016
+ return /*#__PURE__*/React__default.createElement("g", {
21017
+ onClick: () => onClick(id),
21018
+ className: cn({
21019
+ 'cursor-pointer': !!onClick
21020
+ })
21021
+ }, /*#__PURE__*/React__default.createElement(Recharts.Sector, {
21022
+ cx: cx,
21023
+ cy: cy,
21024
+ innerRadius: innerRadius,
21025
+ outerRadius: outerRadius,
21026
+ startAngle: startAngle,
21027
+ endAngle: endAngle,
21028
+ fill: fill
21029
+ }), /*#__PURE__*/React__default.createElement(Recharts.Sector, {
21030
+ cx: cx,
21031
+ cy: cy,
21032
+ startAngle: startAngle,
21033
+ endAngle: endAngle,
21034
+ innerRadius: outerRadius + 2,
21035
+ outerRadius: outerRadius + HOVER_DONUT_WIDTH,
21036
+ fill: id !== undefined ? (_getThemeColor = getThemeColor(pieColors[id])) !== null && _getThemeColor !== void 0 ? _getThemeColor : getThemeColor('blue-500') : getThemeColor('blue-500'),
21037
+ opacity: 0.3
21038
+ }));
21039
+ };
21040
+
21041
+ const Segment = _ => null;
21042
+ const DonutChart = function DonutChart({
21043
+ children,
21044
+ formatter,
21045
+ onClick,
21046
+ showLegend = false,
21047
+ legendPosition = 'bottom',
21048
+ label
21049
+ }) {
21050
+ const ref = React__default.useRef(null);
21051
+ const [radius, setRadius] = React__default.useState(0);
21052
+ const [hoveredItem, setHoveredItem] = React__default.useState([]);
21053
+ // used for right legends
21054
+ const [selectedItem, setSelectedItem] = React__default.useState([]);
21055
+ // used for bottom legends
21056
+ const [visibleItems, setVisibleItems] = React__default.useState(() => {
21057
+ const keys = {};
21058
+ React__default.Children.forEach(children, child => {
21059
+ keys[child.props.id] = true;
21060
+ });
21061
+ return keys;
21062
+ });
21063
+ React__default.useEffect(() => {
21064
+ if (ref.current) {
21065
+ var _ref$current$parentEl;
21066
+ const rect = (_ref$current$parentEl = ref.current.parentElement) === null || _ref$current$parentEl === void 0 ? void 0 : _ref$current$parentEl.getBoundingClientRect();
21067
+ if (rect) {
21068
+ const width = showLegend ? rect.width / 2 : rect.width;
21069
+ const max = rect.height < width ? rect.height : width;
21070
+ setRadius(max / 2);
21071
+ }
21072
+ }
21073
+ }, [showLegend]);
21074
+ 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
21075
+ const data = React__default.Children.map(children, child => ({
21076
+ id: child.props.id,
21077
+ color: child.props.color,
21078
+ label: child.props.label,
21079
+ value: child.props.value
21080
+ }));
21081
+ const displayedData = data.filter(child => visibleItems[child.id]);
21082
+ const total = displayedData.reduce((accum, entry) => accum + entry.value, 0);
21083
+ const showTooltip = (!showLegend || legendPosition === 'bottom') && displayedData.length > 0;
21084
+ const handleLegendClick = entry => {
21085
+ if (legendPosition === 'bottom' && !Array.isArray(entry)) {
21086
+ setVisibleItems({
21087
+ ...visibleItems,
21088
+ [entry.id]: !visibleItems[entry.id]
21089
+ });
21090
+ } else {
21091
+ const nextSelectedItem = Array.isArray(entry) ? entry.map(entryItem => entryItem.id) : [entry.id];
21092
+ // Using slice to avoid mutation of the react state 'selectedItem'
21093
+ const isCurrentSegmentActive = selectedItem.slice().sort().join(',') === nextSelectedItem.sort().join(',');
21094
+ if (onClick && !isCurrentSegmentActive) {
21095
+ onClick(entry);
21096
+ }
21097
+ setSelectedItem(isCurrentSegmentActive ? [] : nextSelectedItem);
21098
+ }
21099
+ };
21100
+ const handlePieClick = React__default.useCallback(pieId => {
21101
+ if (onClick && pieId !== undefined) {
21102
+ const pieProps = displayedData.find(item => item.id === pieId);
21103
+ onClick(pieProps);
21104
+ }
21105
+ }, [onClick, displayedData]);
21106
+ const singlePieDonutChart = displayedData.length === 1;
21107
+ const activeShapeColor = React__default.useMemo(() => {
21108
+ const getSegmentColor = item => item.reduce((colors, itemId) => {
21109
+ const visibleHoveredItem = displayedData.find(dataItem => dataItem.id === itemId);
21110
+ if (visibleHoveredItem) {
21111
+ colors[visibleHoveredItem.id] = visibleHoveredItem.color;
21112
+ }
21113
+ return colors;
21114
+ }, {});
21115
+ const hoveredSegmentColor = getSegmentColor(hoveredItem);
21116
+ const selectedSegmentColor = getSegmentColor(selectedItem);
21117
+ return legendPosition === 'bottom' || hoveredItem.length !== 0 ? hoveredSegmentColor : selectedSegmentColor;
21118
+ }, [hoveredItem, selectedItem, legendPosition]);
21119
+ if (ref.current && !radius) {
21120
+ return null;
21121
+ }
21122
+ const getActiveIndex = () => {
21123
+ if (hoveredItem.length > 0) {
21124
+ return hoveredItem.map(itemId => displayedData.findIndex(element => element.id === itemId));
21125
+ }
21126
+ return selectedItem.map(selectedItemId => displayedData.findIndex(element => element.id === selectedItemId));
21127
+ };
21128
+ const content = () => {
21129
+ const elements = React__default.Children.toArray(children).filter(child => /*#__PURE__*/React__default.isValidElement(child) && visibleItems[child.props.id]);
21130
+ return elements.length > 0 ? elements.map((child, index) => {
21131
+ var _getThemeColor;
21132
+ return /*#__PURE__*/React__default.createElement(Recharts.Cell, {
21133
+ key: `cell-${index}`,
21134
+ name: child.props.label,
21135
+ fill: (_getThemeColor = getThemeColor(child.props.color)) !== null && _getThemeColor !== void 0 ? _getThemeColor : getThemeColor('blue-300')
21136
+ });
21137
+ }) : (/*#__PURE__*/React__default.createElement(Recharts.Cell, {
21138
+ key: "empty-chart",
21139
+ name: '',
21140
+ fill: getThemeColor('grey-200')
21141
+ }));
21142
+ };
21143
+ return /*#__PURE__*/React__default.createElement("div", {
21144
+ className: cn('relative h-full w-full', {
21145
+ [`flex `]: showLegend,
21146
+ 'flex-col items-center': legendPosition === 'bottom'
21147
+ }),
21148
+ ref: ref
21149
+ }, /*#__PURE__*/React__default.createElement(CenteredLabel, {
21150
+ radius: radius,
21151
+ legendPosition: legendPosition,
21152
+ label: label,
21153
+ total: total,
21154
+ formatter: formatter,
21155
+ showLegend: showLegend
21156
+ }), /*#__PURE__*/React__default.createElement(Recharts.PieChart, {
21157
+ data: data,
21158
+ height: diameter,
21159
+ width: diameter,
21160
+ style: {
21161
+ transform: 'rotate(90deg) scale(-1,1)'
21162
+ }
21163
+ }, showTooltip ? (/*#__PURE__*/React__default.createElement(Recharts.Tooltip, Object.assign({}, getTooltipProps({
21164
+ style: {
21165
+ transform: 'rotate(90deg) scale(-1,1)'
21166
+ },
21167
+ singlePieDonutChart
21168
+ })))) : null, /*#__PURE__*/React__default.createElement(Recharts.Pie, {
21169
+ isAnimationActive: false,
21170
+ activeIndex: getActiveIndex(),
21171
+ activeShape: /*#__PURE__*/React__default.createElement(ActiveShape, {
21172
+ pieColors: activeShapeColor,
21173
+ onClick: handlePieClick
21174
+ }),
21175
+ data: displayedData.length > 0 ? displayedData : [],
21176
+ dataKey: "value",
21177
+ innerRadius: radius - HOVER_DONUT_WIDTH - DONUT_WIDTH,
21178
+ onMouseEnter: segment => displayedData.length > 0 && setHoveredItem([segment.id]),
21179
+ onMouseLeave: () => setHoveredItem([]),
21180
+ outerRadius: radius - HOVER_DONUT_WIDTH,
21181
+ paddingAngle: 2,
21182
+ // Prevents the pie group element from being focusable
21183
+ rootTabIndex: -1
21184
+ }, content())), showLegend && (/*#__PURE__*/React__default.createElement(Legend$1, {
21185
+ data: data,
21186
+ visibleItems: visibleItems,
21187
+ onClick: handleLegendClick,
21188
+ total: total,
21189
+ setHoveredItem: setHoveredItem,
21190
+ label: label,
21191
+ legendPosition: legendPosition,
21192
+ hoveredItem: hoveredItem,
21193
+ selectedItem: selectedItem,
21194
+ formatter: formatter
21195
+ })));
21196
+ };
21197
+ DonutChart.Segment = Segment;
21198
+
21199
+ const Line$1 = _ => null;
21200
+ const LineChart = function LineChart(externalProps) {
21201
+ const {
21202
+ children,
21203
+ data,
21204
+ formatter,
21205
+ ...props
21206
+ } = externalProps;
21207
+ const [hoveredLine, setHoveredLine] = React.useState(null);
21208
+ const [activeLines, setActiveLines] = React.useState(() => {
21209
+ const keys = {};
21210
+ React__default.Children.forEach(children, child => {
21211
+ keys[child.props.accessor] = true;
21212
+ });
21213
+ return keys;
21214
+ });
21215
+ const handleLegendClick = entry => {
21216
+ setHoveredLine(null);
21217
+ setActiveLines({
21218
+ ...activeLines,
21219
+ [entry.dataKey]: !activeLines[entry.dataKey]
21220
+ });
21221
+ };
21222
+ return /*#__PURE__*/React__default.createElement(ResponsiveContainer, null, /*#__PURE__*/React__default.createElement(Recharts.LineChart, {
21223
+ data: data,
21224
+ margin: {
21225
+ top: 10,
21226
+ right: 0,
21227
+ left: -25,
21228
+ bottom: 0
21229
+ }
21230
+ }, /*#__PURE__*/React__default.createElement(Recharts.CartesianGrid, Object.assign({}, getCartesianGridProps())), /*#__PURE__*/React__default.createElement(Recharts.XAxis, Object.assign({}, getXAxisProps(props))), /*#__PURE__*/React__default.createElement(Recharts.YAxis, Object.assign({}, getYAxisProps(props))), /*#__PURE__*/React__default.createElement(Recharts.Legend, Object.assign({}, getLegendProps({
21231
+ onClick: handleLegendClick,
21232
+ onMouseEnter: entry => setHoveredLine(entry.dataKey),
21233
+ onMouseLeave: () => setHoveredLine(null),
21234
+ activeItems: activeLines
21235
+ }))), /*#__PURE__*/React__default.createElement(Recharts.Tooltip, Object.assign({}, getTooltipProps(), {
21236
+ formatter: formatter
21237
+ })), React__default.Children.map(children, child => {
21238
+ var _child$props$color, _child$props$color2;
21239
+ return /*#__PURE__*/React__default.createElement(Recharts.Line, {
21240
+ activeDot: {
21241
+ fill: getThemeColor((_child$props$color = child.props.color) !== null && _child$props$color !== void 0 ? _child$props$color : 'blue-300')
21242
+ },
21243
+ dataKey: child.props.accessor,
21244
+ isAnimationActive: false,
21245
+ dot: false,
21246
+ name: child.props.label,
21247
+ stroke: getThemeColor((_child$props$color2 = child.props.color) !== null && _child$props$color2 !== void 0 ? _child$props$color2 : 'blue-300'),
21248
+ strokeWidth: 2,
21249
+ hide: !activeLines[child.props.accessor],
21250
+ opacity: hoveredLine && child.props.accessor !== hoveredLine ? 0.3 : 1
21251
+ });
21252
+ })));
21253
+ };
21254
+ LineChart.Line = Line$1;
21255
+
20465
21256
  const Button$4 = /*#__PURE__*/React__default.forwardRef(function Button(props, ref) {
20466
21257
  const {
20467
21258
  ...attributes
@@ -21206,10 +21997,12 @@ const useOnClickOutside = (ref, callback) => {
21206
21997
  exports.Accordion = Accordion;
21207
21998
  exports.Alert = Alert;
21208
21999
  exports.AlertDialog = AlertDialog;
22000
+ exports.AreaChart = AreaChart;
21209
22001
  exports.Backdrop = Backdrop;
21210
22002
  exports.Badge = Badge;
21211
22003
  exports.BadgeIcon = BadgeIcon;
21212
22004
  exports.Banner = Banner;
22005
+ exports.BarChart = BarChart;
21213
22006
  exports.Base = Base;
21214
22007
  exports.Button = Button$1;
21215
22008
  exports.Calendar = Calendar$1;
@@ -21220,6 +22013,7 @@ exports.Combobox = Combobox;
21220
22013
  exports.DEFAULT_PAGE_SIZE = DEFAULT_PAGE_SIZE;
21221
22014
  exports.Datepicker = Datepicker;
21222
22015
  exports.Dialog = Dialog;
22016
+ exports.DonutChart = DonutChart;
21223
22017
  exports.Drawer = Drawer;
21224
22018
  exports.Field = Field;
21225
22019
  exports.Form = Form;
@@ -21231,6 +22025,7 @@ exports.Icon = Icon;
21231
22025
  exports.IconButton = IconButton;
21232
22026
  exports.Input = Input;
21233
22027
  exports.Layout = Layout$1;
22028
+ exports.LineChart = LineChart;
21234
22029
  exports.List = List$1;
21235
22030
  exports.Listbox = Listbox;
21236
22031
  exports.LocalizationContext = LocalizationContext;