@erpsquad/common 1.8.8 → 1.8.10
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.
- package/dist/_virtual/ArrowDropDown/index.esm.js +5 -0
- package/dist/_virtual/ArrowDropDown/index.esm.js.map +1 -0
- package/dist/_virtual/ArrowDropDown/index.js +2 -0
- package/dist/_virtual/ArrowDropDown/index.js.map +1 -0
- package/dist/_virtual/ArrowDropUp/index.esm.js +5 -0
- package/dist/_virtual/ArrowDropUp/index.esm.js.map +1 -0
- package/dist/_virtual/ArrowDropUp/index.js +2 -0
- package/dist/_virtual/ArrowDropUp/index.js.map +1 -0
- package/dist/_virtual/extends/index.esm.js +2 -4
- package/dist/_virtual/extends/index.esm.js.map +1 -1
- package/dist/_virtual/extends/index.js +1 -1
- package/dist/components/Dashboard/dashboard-card/index.esm.js +17 -0
- package/dist/components/Dashboard/dashboard-card/index.esm.js.map +1 -0
- package/dist/components/Dashboard/dashboard-card/index.js +6 -0
- package/dist/components/Dashboard/dashboard-card/index.js.map +1 -0
- package/dist/components/Dashboard/dashboard-header/index.esm.js +68 -0
- package/dist/components/Dashboard/dashboard-header/index.esm.js.map +1 -0
- package/dist/components/Dashboard/dashboard-header/index.js +7 -0
- package/dist/components/Dashboard/dashboard-header/index.js.map +1 -0
- package/dist/components/activityLog/activity-log/index.esm.js +104 -0
- package/dist/components/activityLog/activity-log/index.esm.js.map +1 -0
- package/dist/components/activityLog/activity-log/index.js +14 -0
- package/dist/components/activityLog/activity-log/index.js.map +1 -0
- package/dist/components/charts/ChartLegends/index.esm.js +31 -0
- package/dist/components/charts/ChartLegends/index.esm.js.map +1 -0
- package/dist/components/charts/ChartLegends/index.js +5 -0
- package/dist/components/charts/ChartLegends/index.js.map +1 -0
- package/dist/components/charts/areaLinerChart/index.esm.js +110 -0
- package/dist/components/charts/areaLinerChart/index.esm.js.map +1 -0
- package/dist/components/charts/areaLinerChart/index.js +4 -0
- package/dist/components/charts/areaLinerChart/index.js.map +1 -0
- package/dist/components/charts/bar-chart/bar-chart/index.esm.js +85 -0
- package/dist/components/charts/bar-chart/bar-chart/index.esm.js.map +1 -0
- package/dist/components/charts/bar-chart/bar-chart/index.js +2 -0
- package/dist/components/charts/bar-chart/bar-chart/index.js.map +1 -0
- package/dist/components/charts/barChart/barChart/index.esm.js +147 -0
- package/dist/components/charts/barChart/barChart/index.esm.js.map +1 -0
- package/dist/components/charts/barChart/barChart/index.js +2 -0
- package/dist/components/charts/barChart/barChart/index.js.map +1 -0
- package/dist/components/charts/barLineChart/barLinechart/index.esm.js +193 -0
- package/dist/components/charts/barLineChart/barLinechart/index.esm.js.map +1 -0
- package/dist/components/charts/barLineChart/barLinechart/index.js +11 -0
- package/dist/components/charts/barLineChart/barLinechart/index.js.map +1 -0
- package/dist/components/charts/donut-chart/donut-chart/index.esm.js +85 -0
- package/dist/components/charts/donut-chart/donut-chart/index.esm.js.map +1 -0
- package/dist/components/charts/donut-chart/donut-chart/index.js +6 -0
- package/dist/components/charts/donut-chart/donut-chart/index.js.map +1 -0
- package/dist/components/charts/donutChart/DonutChart/index.esm.js +96 -0
- package/dist/components/charts/donutChart/DonutChart/index.esm.js.map +1 -0
- package/dist/components/charts/donutChart/DonutChart/index.js +5 -0
- package/dist/components/charts/donutChart/DonutChart/index.js.map +1 -0
- package/dist/components/charts/groupBarChart/GroupBarChart/index.esm.js +92 -0
- package/dist/components/charts/groupBarChart/GroupBarChart/index.esm.js.map +1 -0
- package/dist/components/charts/groupBarChart/GroupBarChart/index.js +2 -0
- package/dist/components/charts/groupBarChart/GroupBarChart/index.js.map +1 -0
- package/dist/components/charts/line-chart/area-lineChart/index.esm.js +55 -0
- package/dist/components/charts/line-chart/area-lineChart/index.esm.js.map +1 -0
- package/dist/components/charts/line-chart/area-lineChart/index.js +2 -0
- package/dist/components/charts/line-chart/area-lineChart/index.js.map +1 -0
- package/dist/components/charts/line-chart/line-chart/index.esm.js +108 -0
- package/dist/components/charts/line-chart/line-chart/index.esm.js.map +1 -0
- package/dist/components/charts/line-chart/line-chart/index.js +2 -0
- package/dist/components/charts/line-chart/line-chart/index.js.map +1 -0
- package/dist/components/charts/multiLineChart/multi-line-chart/index.esm.js +100 -0
- package/dist/components/charts/multiLineChart/multi-line-chart/index.esm.js.map +1 -0
- package/dist/components/charts/multiLineChart/multi-line-chart/index.js +2 -0
- package/dist/components/charts/multiLineChart/multi-line-chart/index.js.map +1 -0
- package/dist/components/grid/custom-grid-card/custom-grid-card/index.esm.js +131 -0
- package/dist/components/grid/custom-grid-card/custom-grid-card/index.esm.js.map +1 -0
- package/dist/components/grid/custom-grid-card/custom-grid-card/index.js +11 -0
- package/dist/components/grid/custom-grid-card/custom-grid-card/index.js.map +1 -0
- package/dist/components/grid/grid-card/grid-card/index.esm.js +102 -0
- package/dist/components/grid/grid-card/grid-card/index.esm.js.map +1 -0
- package/dist/components/grid/grid-card/grid-card/index.js +12 -0
- package/dist/components/grid/grid-card/grid-card/index.js.map +1 -0
- package/dist/components/grid/grid-wrapper/grid-wrapper/index.esm.js +17 -0
- package/dist/components/grid/grid-wrapper/grid-wrapper/index.esm.js.map +1 -0
- package/dist/components/grid/grid-wrapper/grid-wrapper/index.js +5 -0
- package/dist/components/grid/grid-wrapper/grid-wrapper/index.js.map +1 -0
- package/dist/components/index.d.ts +54 -12
- package/dist/components/index.esm.js +479 -431
- package/dist/components/index.esm.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/mulitline/multiline/index.esm.js +62 -0
- package/dist/components/mulitline/multiline/index.esm.js.map +1 -0
- package/dist/components/mulitline/multiline/index.js +13 -0
- package/dist/components/mulitline/multiline/index.js.map +1 -0
- package/dist/components/reports/dynamic-report/dynamic-report/index.esm.js +472 -0
- package/dist/components/reports/dynamic-report/dynamic-report/index.esm.js.map +1 -0
- package/dist/components/reports/dynamic-report/dynamic-report/index.js +8 -0
- package/dist/components/reports/dynamic-report/dynamic-report/index.js.map +1 -0
- package/dist/components/reports/dynamic-report/dynamic-rows/index.esm.js +201 -0
- package/dist/components/reports/dynamic-report/dynamic-rows/index.esm.js.map +1 -0
- package/dist/components/reports/dynamic-report/dynamic-rows/index.js +6 -0
- package/dist/components/reports/dynamic-report/dynamic-rows/index.js.map +1 -0
- package/dist/components/rfq-response/item-response-details/index.esm.js +91 -0
- package/dist/components/rfq-response/item-response-details/index.esm.js.map +1 -0
- package/dist/components/rfq-response/item-response-details/index.js +9 -0
- package/dist/components/rfq-response/item-response-details/index.js.map +1 -0
- package/dist/index.esm.js +571 -523
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/node_modules/@babel/runtime/helpers/extends/index.esm.js +23 -0
- package/dist/node_modules/@babel/runtime/helpers/extends/index.esm.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/extends/index.js +2 -0
- package/dist/node_modules/@babel/runtime/helpers/extends/index.js.map +1 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropDown/index.esm.js +18 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropDown/index.esm.js.map +1 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropDown/index.js +2 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropDown/index.js.map +1 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropUp/index.esm.js +18 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropUp/index.esm.js.map +1 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropUp/index.js +2 -0
- package/dist/node_modules/@mui/icons-material/ArrowDropUp/index.js.map +1 -0
- package/dist/node_modules/@mui/system/createStyled/index.esm.js +4 -4
- package/dist/node_modules/@mui/system/createStyled/index.esm.js.map +1 -1
- package/dist/node_modules/@mui/system/createStyled/index.js +1 -1
- package/dist/node_modules/@mui/system/createStyled/index.js.map +1 -1
- package/dist/node_modules/d3-array/src/ascending/index.esm.js +7 -0
- package/dist/node_modules/d3-array/src/ascending/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/ascending/index.js +2 -0
- package/dist/node_modules/d3-array/src/ascending/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/bisect/index.esm.js +11 -0
- package/dist/node_modules/d3-array/src/bisect/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/bisect/index.js +2 -0
- package/dist/node_modules/d3-array/src/bisect/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/bisector/index.esm.js +48 -0
- package/dist/node_modules/d3-array/src/bisector/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/bisector/index.js +2 -0
- package/dist/node_modules/d3-array/src/bisector/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/descending/index.esm.js +7 -0
- package/dist/node_modules/d3-array/src/descending/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/descending/index.js +2 -0
- package/dist/node_modules/d3-array/src/descending/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/max/index.esm.js +22 -0
- package/dist/node_modules/d3-array/src/max/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/max/index.js +2 -0
- package/dist/node_modules/d3-array/src/max/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/min/index.esm.js +22 -0
- package/dist/node_modules/d3-array/src/min/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/min/index.js +2 -0
- package/dist/node_modules/d3-array/src/min/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/number/index.esm.js +7 -0
- package/dist/node_modules/d3-array/src/number/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/number/index.js +2 -0
- package/dist/node_modules/d3-array/src/number/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/range/index.esm.js +12 -0
- package/dist/node_modules/d3-array/src/range/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/range/index.js +2 -0
- package/dist/node_modules/d3-array/src/range/index.js.map +1 -0
- package/dist/node_modules/d3-array/src/ticks/index.esm.js +52 -0
- package/dist/node_modules/d3-array/src/ticks/index.esm.js.map +1 -0
- package/dist/node_modules/d3-array/src/ticks/index.js +2 -0
- package/dist/node_modules/d3-array/src/ticks/index.js.map +1 -0
- package/dist/node_modules/d3-axis/src/axis/index.esm.js +99 -0
- package/dist/node_modules/d3-axis/src/axis/index.esm.js.map +1 -0
- package/dist/node_modules/d3-axis/src/axis/index.js +2 -0
- package/dist/node_modules/d3-axis/src/axis/index.js.map +1 -0
- package/dist/node_modules/d3-axis/src/identity/index.esm.js +7 -0
- package/dist/node_modules/d3-axis/src/identity/index.esm.js.map +1 -0
- package/dist/node_modules/d3-axis/src/identity/index.js +2 -0
- package/dist/node_modules/d3-axis/src/identity/index.js.map +1 -0
- package/dist/node_modules/d3-color/src/color/index.esm.js +339 -0
- package/dist/node_modules/d3-color/src/color/index.esm.js.map +1 -0
- package/dist/node_modules/d3-color/src/color/index.js +2 -0
- package/dist/node_modules/d3-color/src/color/index.js.map +1 -0
- package/dist/node_modules/d3-color/src/define/index.esm.js +14 -0
- package/dist/node_modules/d3-color/src/define/index.esm.js.map +1 -0
- package/dist/node_modules/d3-color/src/define/index.js +2 -0
- package/dist/node_modules/d3-color/src/define/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/defaultLocale/index.esm.js +21 -0
- package/dist/node_modules/d3-format/src/defaultLocale/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/defaultLocale/index.js +2 -0
- package/dist/node_modules/d3-format/src/defaultLocale/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/exponent/index.esm.js +8 -0
- package/dist/node_modules/d3-format/src/exponent/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/exponent/index.js +2 -0
- package/dist/node_modules/d3-format/src/exponent/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatDecimal/index.esm.js +16 -0
- package/dist/node_modules/d3-format/src/formatDecimal/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatDecimal/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatDecimal/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatGroup/index.esm.js +16 -0
- package/dist/node_modules/d3-format/src/formatGroup/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatGroup/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatGroup/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatNumerals/index.esm.js +11 -0
- package/dist/node_modules/d3-format/src/formatNumerals/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatNumerals/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatNumerals/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatPrefixAuto/index.esm.js +13 -0
- package/dist/node_modules/d3-format/src/formatPrefixAuto/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatPrefixAuto/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatPrefixAuto/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatRounded/index.esm.js +11 -0
- package/dist/node_modules/d3-format/src/formatRounded/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatRounded/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatRounded/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatSpecifier/index.esm.js +38 -0
- package/dist/node_modules/d3-format/src/formatSpecifier/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatSpecifier/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatSpecifier/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatTrim/index.esm.js +22 -0
- package/dist/node_modules/d3-format/src/formatTrim/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatTrim/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatTrim/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatTypes/index.esm.js +22 -0
- package/dist/node_modules/d3-format/src/formatTypes/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/formatTypes/index.js +2 -0
- package/dist/node_modules/d3-format/src/formatTypes/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/identity/index.esm.js +7 -0
- package/dist/node_modules/d3-format/src/identity/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/identity/index.js +2 -0
- package/dist/node_modules/d3-format/src/identity/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/locale/index.esm.js +83 -0
- package/dist/node_modules/d3-format/src/locale/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/locale/index.js +2 -0
- package/dist/node_modules/d3-format/src/locale/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/precisionFixed/index.esm.js +8 -0
- package/dist/node_modules/d3-format/src/precisionFixed/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/precisionFixed/index.js +2 -0
- package/dist/node_modules/d3-format/src/precisionFixed/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/precisionPrefix/index.esm.js +8 -0
- package/dist/node_modules/d3-format/src/precisionPrefix/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/precisionPrefix/index.js +2 -0
- package/dist/node_modules/d3-format/src/precisionPrefix/index.js.map +1 -0
- package/dist/node_modules/d3-format/src/precisionRound/index.esm.js +9 -0
- package/dist/node_modules/d3-format/src/precisionRound/index.esm.js.map +1 -0
- package/dist/node_modules/d3-format/src/precisionRound/index.js +2 -0
- package/dist/node_modules/d3-format/src/precisionRound/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/array/index.esm.js +14 -0
- package/dist/node_modules/d3-interpolate/src/array/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/array/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/array/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/color/index.esm.js +25 -0
- package/dist/node_modules/d3-interpolate/src/color/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/color/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/color/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/constant/index.esm.js +5 -0
- package/dist/node_modules/d3-interpolate/src/constant/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/constant/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/constant/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/date/index.esm.js +10 -0
- package/dist/node_modules/d3-interpolate/src/date/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/date/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/date/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/number/index.esm.js +9 -0
- package/dist/node_modules/d3-interpolate/src/number/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/number/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/number/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/numberArray/index.esm.js +16 -0
- package/dist/node_modules/d3-interpolate/src/numberArray/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/numberArray/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/numberArray/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/object/index.esm.js +21 -0
- package/dist/node_modules/d3-interpolate/src/object/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/object/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/object/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/rgb/index.esm.js +21 -0
- package/dist/node_modules/d3-interpolate/src/rgb/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/rgb/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/rgb/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/round/index.esm.js +9 -0
- package/dist/node_modules/d3-interpolate/src/round/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/round/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/round/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/string/index.esm.js +44 -0
- package/dist/node_modules/d3-interpolate/src/string/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/string/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/string/index.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/value/index.esm.js +17 -0
- package/dist/node_modules/d3-interpolate/src/value/index.esm.js.map +1 -0
- package/dist/node_modules/d3-interpolate/src/value/index.js +2 -0
- package/dist/node_modules/d3-interpolate/src/value/index.js.map +1 -0
- package/dist/node_modules/d3-path/src/path/index.esm.js +89 -0
- package/dist/node_modules/d3-path/src/path/index.esm.js.map +1 -0
- package/dist/node_modules/d3-path/src/path/index.js +2 -0
- package/dist/node_modules/d3-path/src/path/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/band/index.esm.js +71 -0
- package/dist/node_modules/d3-scale/src/band/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/band/index.js +2 -0
- package/dist/node_modules/d3-scale/src/band/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/constant/index.esm.js +9 -0
- package/dist/node_modules/d3-scale/src/constant/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/constant/index.js +2 -0
- package/dist/node_modules/d3-scale/src/constant/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/continuous/index.esm.js +96 -0
- package/dist/node_modules/d3-scale/src/continuous/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/continuous/index.js +2 -0
- package/dist/node_modules/d3-scale/src/continuous/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/init/index.esm.js +17 -0
- package/dist/node_modules/d3-scale/src/init/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/init/index.js +2 -0
- package/dist/node_modules/d3-scale/src/init/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/linear/index.esm.js +62 -0
- package/dist/node_modules/d3-scale/src/linear/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/linear/index.js +2 -0
- package/dist/node_modules/d3-scale/src/linear/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/number/index.esm.js +7 -0
- package/dist/node_modules/d3-scale/src/number/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/number/index.js +2 -0
- package/dist/node_modules/d3-scale/src/number/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/ordinal/index.esm.js +39 -0
- package/dist/node_modules/d3-scale/src/ordinal/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/ordinal/index.js +2 -0
- package/dist/node_modules/d3-scale/src/ordinal/index.js.map +1 -0
- package/dist/node_modules/d3-scale/src/tickFormat/index.esm.js +35 -0
- package/dist/node_modules/d3-scale/src/tickFormat/index.esm.js.map +1 -0
- package/dist/node_modules/d3-scale/src/tickFormat/index.js +2 -0
- package/dist/node_modules/d3-scale/src/tickFormat/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/array/index.esm.js +7 -0
- package/dist/node_modules/d3-selection/src/array/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/array/index.js +2 -0
- package/dist/node_modules/d3-selection/src/array/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/constant/index.esm.js +9 -0
- package/dist/node_modules/d3-selection/src/constant/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/constant/index.js +2 -0
- package/dist/node_modules/d3-selection/src/constant/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/creator/index.esm.js +21 -0
- package/dist/node_modules/d3-selection/src/creator/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/creator/index.js +2 -0
- package/dist/node_modules/d3-selection/src/creator/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/matcher/index.esm.js +15 -0
- package/dist/node_modules/d3-selection/src/matcher/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/matcher/index.js +2 -0
- package/dist/node_modules/d3-selection/src/matcher/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/namespace/index.esm.js +10 -0
- package/dist/node_modules/d3-selection/src/namespace/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/namespace/index.js +2 -0
- package/dist/node_modules/d3-selection/src/namespace/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/namespaces/index.esm.js +13 -0
- package/dist/node_modules/d3-selection/src/namespaces/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/namespaces/index.js +2 -0
- package/dist/node_modules/d3-selection/src/namespaces/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/pointer/index.esm.js +23 -0
- package/dist/node_modules/d3-selection/src/pointer/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/pointer/index.js +2 -0
- package/dist/node_modules/d3-selection/src/pointer/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/select/index.esm.js +8 -0
- package/dist/node_modules/d3-selection/src/select/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/select/index.js +2 -0
- package/dist/node_modules/d3-selection/src/select/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/append/index.esm.js +11 -0
- package/dist/node_modules/d3-selection/src/selection/append/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/append/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/append/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/attr/index.esm.js +47 -0
- package/dist/node_modules/d3-selection/src/selection/attr/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/attr/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/attr/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/call/index.esm.js +10 -0
- package/dist/node_modules/d3-selection/src/selection/call/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/call/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/call/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/classed/index.esm.js +65 -0
- package/dist/node_modules/d3-selection/src/selection/classed/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/classed/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/classed/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/clone/index.esm.js +15 -0
- package/dist/node_modules/d3-selection/src/selection/clone/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/clone/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/clone/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/data/index.esm.js +77 -0
- package/dist/node_modules/d3-selection/src/selection/data/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/data/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/data/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/datum/index.esm.js +7 -0
- package/dist/node_modules/d3-selection/src/selection/datum/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/datum/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/datum/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/dispatch/index.esm.js +29 -0
- package/dist/node_modules/d3-selection/src/selection/dispatch/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/dispatch/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/dispatch/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/each/index.esm.js +12 -0
- package/dist/node_modules/d3-selection/src/selection/each/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/each/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/each/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/empty/index.esm.js +7 -0
- package/dist/node_modules/d3-selection/src/selection/empty/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/empty/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/empty/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/enter/index.esm.js +32 -0
- package/dist/node_modules/d3-selection/src/selection/enter/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/enter/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/enter/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/exit/index.esm.js +9 -0
- package/dist/node_modules/d3-selection/src/selection/exit/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/exit/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/exit/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/filter/index.esm.js +17 -0
- package/dist/node_modules/d3-selection/src/selection/filter/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/filter/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/filter/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/html/index.esm.js +21 -0
- package/dist/node_modules/d3-selection/src/selection/html/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/html/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/html/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/index/index.esm.js +85 -0
- package/dist/node_modules/d3-selection/src/selection/index/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/index/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/index/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/insert/index.esm.js +15 -0
- package/dist/node_modules/d3-selection/src/selection/insert/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/insert/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/insert/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/iterator/index.esm.js +11 -0
- package/dist/node_modules/d3-selection/src/selection/iterator/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/iterator/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/iterator/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/join/index.esm.js +20 -0
- package/dist/node_modules/d3-selection/src/selection/join/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/join/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/join/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/lower/index.esm.js +10 -0
- package/dist/node_modules/d3-selection/src/selection/lower/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/lower/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/lower/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/merge/index.esm.js +19 -0
- package/dist/node_modules/d3-selection/src/selection/merge/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/merge/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/merge/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/node/index.esm.js +13 -0
- package/dist/node_modules/d3-selection/src/selection/node/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/node/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/node/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/nodes/index.esm.js +7 -0
- package/dist/node_modules/d3-selection/src/selection/nodes/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/nodes/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/nodes/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/on/index.esm.js +65 -0
- package/dist/node_modules/d3-selection/src/selection/on/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/on/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/on/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/order/index.esm.js +15 -0
- package/dist/node_modules/d3-selection/src/selection/order/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/order/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/order/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/property/index.esm.js +24 -0
- package/dist/node_modules/d3-selection/src/selection/property/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/property/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/property/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/raise/index.esm.js +10 -0
- package/dist/node_modules/d3-selection/src/selection/raise/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/raise/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/raise/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/remove/index.esm.js +11 -0
- package/dist/node_modules/d3-selection/src/selection/remove/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/remove/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/remove/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/select/index.esm.js +18 -0
- package/dist/node_modules/d3-selection/src/selection/select/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/select/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/select/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/selectAll/index.esm.js +25 -0
- package/dist/node_modules/d3-selection/src/selection/selectAll/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/selectAll/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/selectAll/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/selectChild/index.esm.js +17 -0
- package/dist/node_modules/d3-selection/src/selection/selectChild/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/selectChild/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/selectChild/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/selectChildren/index.esm.js +17 -0
- package/dist/node_modules/d3-selection/src/selection/selectChildren/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/selectChildren/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/selectChildren/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/size/index.esm.js +9 -0
- package/dist/node_modules/d3-selection/src/selection/size/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/size/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/size/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/sort/index.esm.js +23 -0
- package/dist/node_modules/d3-selection/src/selection/sort/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/sort/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/sort/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/sparse/index.esm.js +7 -0
- package/dist/node_modules/d3-selection/src/selection/sparse/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/sparse/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/sparse/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/style/index.esm.js +29 -0
- package/dist/node_modules/d3-selection/src/selection/style/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/style/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/style/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/text/index.esm.js +21 -0
- package/dist/node_modules/d3-selection/src/selection/text/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selection/text/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selection/text/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selector/index.esm.js +11 -0
- package/dist/node_modules/d3-selection/src/selector/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selector/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selector/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selectorAll/index.esm.js +12 -0
- package/dist/node_modules/d3-selection/src/selectorAll/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/selectorAll/index.js +2 -0
- package/dist/node_modules/d3-selection/src/selectorAll/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/sourceEvent/index.esm.js +9 -0
- package/dist/node_modules/d3-selection/src/sourceEvent/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/sourceEvent/index.js +2 -0
- package/dist/node_modules/d3-selection/src/sourceEvent/index.js.map +1 -0
- package/dist/node_modules/d3-selection/src/window/index.esm.js +7 -0
- package/dist/node_modules/d3-selection/src/window/index.esm.js.map +1 -0
- package/dist/node_modules/d3-selection/src/window/index.js +2 -0
- package/dist/node_modules/d3-selection/src/window/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/arc/index.esm.js +134 -0
- package/dist/node_modules/d3-shape/src/arc/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/arc/index.js +2 -0
- package/dist/node_modules/d3-shape/src/arc/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/area/index.esm.js +82 -0
- package/dist/node_modules/d3-shape/src/area/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/area/index.js +2 -0
- package/dist/node_modules/d3-shape/src/area/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/array/index.esm.js +7 -0
- package/dist/node_modules/d3-shape/src/array/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/array/index.js +2 -0
- package/dist/node_modules/d3-shape/src/array/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/constant/index.esm.js +9 -0
- package/dist/node_modules/d3-shape/src/constant/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/constant/index.js +2 -0
- package/dist/node_modules/d3-shape/src/constant/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/curve/linear/index.esm.js +39 -0
- package/dist/node_modules/d3-shape/src/curve/linear/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/curve/linear/index.js +2 -0
- package/dist/node_modules/d3-shape/src/curve/linear/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/curve/monotone/index.esm.js +76 -0
- package/dist/node_modules/d3-shape/src/curve/monotone/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/curve/monotone/index.js +2 -0
- package/dist/node_modules/d3-shape/src/curve/monotone/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/descending/index.esm.js +7 -0
- package/dist/node_modules/d3-shape/src/descending/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/descending/index.js +2 -0
- package/dist/node_modules/d3-shape/src/descending/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/identity/index.esm.js +7 -0
- package/dist/node_modules/d3-shape/src/identity/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/identity/index.js +2 -0
- package/dist/node_modules/d3-shape/src/identity/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/line/index.esm.js +42 -0
- package/dist/node_modules/d3-shape/src/line/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/line/index.js +2 -0
- package/dist/node_modules/d3-shape/src/line/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/math/index.esm.js +33 -0
- package/dist/node_modules/d3-shape/src/math/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/math/index.js +2 -0
- package/dist/node_modules/d3-shape/src/math/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/path/index.esm.js +20 -0
- package/dist/node_modules/d3-shape/src/path/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/path/index.js +2 -0
- package/dist/node_modules/d3-shape/src/path/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/pie/index.esm.js +56 -0
- package/dist/node_modules/d3-shape/src/pie/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/pie/index.js +2 -0
- package/dist/node_modules/d3-shape/src/pie/index.js.map +1 -0
- package/dist/node_modules/d3-shape/src/point/index.esm.js +11 -0
- package/dist/node_modules/d3-shape/src/point/index.esm.js.map +1 -0
- package/dist/node_modules/d3-shape/src/point/index.js +2 -0
- package/dist/node_modules/d3-shape/src/point/index.js.map +1 -0
- package/dist/node_modules/internmap/src/index/index.esm.js +44 -0
- package/dist/node_modules/internmap/src/index/index.esm.js.map +1 -0
- package/dist/node_modules/internmap/src/index/index.js +2 -0
- package/dist/node_modules/internmap/src/index/index.js.map +1 -0
- package/dist/style.css +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/charts/areaLinerChart.tsx"],"sourcesContent":["import { Box } from '@mui/material';\nimport * as d3 from 'd3';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface IChartProps {\n data: { name: string, values: { month: string, value: number }[], isSmooth?: boolean }[],\n height: number,\n yAxisLabelType?: 'inPercent' | 'inValue' | 'custom';\n customLabelFormatter?: (value: number) => string;\n currency?: string;\n colors?: string[];\n customLegend: React.ReactNode\n}\n\nconst formatNumber = (num: number, symbol: string, labelType: string) => {\n if (labelType === 'inPercent') {\n return `${d3.format(\".0%\")(num / 100)}`;\n } else if (labelType === 'inValue') {\n return `${symbol || ''} ${d3.format(\".2s\")(num).replace('k', 'K')}`;\n }\n return num.toString();\n};\n\nconst AreaLineChart = ({ data, height = 400, customLabelFormatter, yAxisLabelType = 'inValue', currency, colors, customLegend }: IChartProps) => {\n const svgRef = useRef<SVGSVGElement | null>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n const [tooltipData, setTooltipData] = useState<any>(null);\n useEffect(() => {\n const wrapper = wrapperRef.current;\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (entries[0]) {\n const newWidth = entries[0].contentRect.width;\n setContainerWidth(newWidth);\n }\n });\n\n if (wrapper) {\n resizeObserver.observe(wrapper);\n }\n\n return () => {\n if (wrapper) {\n resizeObserver.unobserve(wrapper);\n }\n };\n }, []);\n\n useEffect(() => {\n if (containerWidth === 0) return; // Wait for the container width\n\n const margin = { top: 20, right: 30, bottom: 30, left: 40 };\n const width = containerWidth - margin.left - margin.right;\n const chartHeight = height - margin.top - margin.bottom;\n\n // Clear the SVG\n d3.select(svgRef.current).selectAll('*').remove();\n\n const svg = d3\n .select(svgRef.current)\n .attr('width', containerWidth)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n // Define scales\n const x = d3\n .scalePoint()\n .domain(data[0].values.map(d => d.month)) // Assuming all datasets share the same x-domain\n .range([0, width]);\n\n const y = d3\n .scaleLinear()\n .domain([0, d3.max(data, dataset => d3.max(dataset.values, d => d.value))!]) // Max value across all datasets\n .range([chartHeight, 0]);\n\n // Limit x-axis ticks dynamically based on width\n const numTicks = Math.floor(width / 80); // Adjust the factor (80) based on chart width\n const xAxis = d3.axisBottom(x).ticks(numTicks);\n\n const xAxisGroup = svg.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(xAxis);\n\n xAxisGroup.selectAll(\"text\")\n .attr(\"transform\", \"translate(0, 10)\")\n .attr('color', '#8E8E93')\n .style(\"text-anchor\", \"middle\");\n\n // Y Axis\n const yAxis = svg.append('g')\n yAxis.append('g').attr('color', '#8E8E93').attr(\"transform\", `translate(-10,0)`)\n .call(d3.axisLeft(y).tickSize(-width).tickFormat((d: any) =>\n customLabelFormatter\n ? customLabelFormatter(d)\n : formatNumber(d, currency, yAxisLabelType)\n ).tickSizeOuter(0) as any)\n .selectAll('line')\n .attr('stroke-dasharray', '3,3')\n .attr('stroke', '#D3D3D4');\n\n xAxisGroup.selectAll(\".tick line\").remove();\n yAxis.select(\".domain\").attr(\"stroke\", \"none\");\n xAxisGroup.select(\".domain\").attr(\"stroke\", \"none\");\n\n // Define color scale for lines\n // const color = d3.scaleOrdinal(d3.schemeCategory10);\n\n // Line and area generators\n const line = (isSmooth: boolean) => d3.line<any>()\n .x(d => x(d.month)!)\n .y(d => y(d.value))\n .curve(isSmooth ? d3.curveMonotoneX : d3.curveLinear); // Conditionally smooth the line\n\n const area = d3.area<any>()\n .x(d => x(d.month)!)\n .y0(chartHeight)\n .y1(d => y(d.value));\n\n // Iterate over each dataset to create lines and areas\n data.forEach((dataset, i) => {\n // const datasetColor = color(i.toString());\n\n // Create gradient for each area\n const gradient = svg.append('defs')\n .append('linearGradient')\n .attr('id', `area-gradient-${i}`)\n .attr('x1', '0%')\n .attr('x2', '0%')\n .attr('y1', '0%')\n .attr('y2', '100%');\n\n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', colors[i])\n .attr('stop-opacity', 0.4);\n\n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', colors[i])\n .attr('stop-opacity', 0.1);\n\n // Append the area with gradient\n svg.append('path')\n .datum(dataset.values)\n .attr('fill', `url(#area-gradient-${i})`)\n .attr('d', area);\n\n // Append the line with smoothness condition\n svg.append('path')\n .datum(dataset.values)\n .attr('fill', 'none')\n .attr('stroke', colors[i])\n .attr('stroke-width', 2)\n .attr('d', line(dataset.isSmooth || false)); // Use smoothness from the dataset\n\n // Append circles for hover effect\n {\n dataset?.showCircle &&\n svg.selectAll(`circle-${i}`)\n .data(dataset.values)\n .enter()\n .append('circle')\n .attr('cx', d => x(d.month)!)\n .attr('cy', d => y(d.value))\n .attr('r', 5)\n .attr('fill', colors[i])\n .attr('stroke', '#fff')\n .style('cursor', 'pointer')\n .on('mouseover', function (event, d) {\n setTooltipData({\n x: `${event.pageX + 10}px`,\n y: `${event.pageY - 30}px`,\n content: `${dataset.name}: ${d.value}`\n });\n d3.select(this).transition().attr('r', 7).attr('fill', '#ff4500');\n })\n .on('mouseout', function () {\n setTooltipData(null);\n d3.select(this).transition().attr('r', 5).attr('fill', colors[i]);\n });\n }\n\n });\n\n }, [data, containerWidth, height, customLabelFormatter, yAxisLabelType, currency, colors, customLegend]);\n\n return (\n <div ref={wrapperRef} style={{ width: '100%', height: '100%' }}>\n <div style={{ position: 'relative' }}>\n <svg ref={svgRef} width=\"100%\" height={height} />\n {\n customLegend &&\n customLegend\n\n }\n </div>\n {tooltipData &&\n <Box sx={{\n position: 'absolute',\n left: tooltipData.x,\n top: tooltipData.y,\n pointerEvents: 'none',\n backgroundColor: '#2EB273',\n zIndex: '99999',\n border: 'none',\n borderRadius: '3px',\n transform: 'translate(-50%, -100%)',\n padding: '2px 6px 2px 6px',\n gap: '10px'\n }}>\n <span style={{ fontSize: '16px', weight: '500', color: '#ffff' }}>\n {tooltipData.content}\n </span>\n </Box>\n }\n </div>\n );\n};\n\nexport default AreaLineChart;\n"],"names":["data","height","customLabelFormatter","yAxisLabelType","currency","colors","customLegend","svgRef","useRef","wrapperRef","containerWidth","setContainerWidth","useState","tooltipData","setTooltipData","useEffect","wrapper","current","resizeObserver","ResizeObserver","entries","newWidth","contentRect","width","observe","unobserve","chartHeight","d3.select","selectAll","remove","svg","attr","append","x","d3.scalePoint","domain","values","map","d","month","range","y","d3.scaleLinear","d3.max","dataset","value","numTicks","Math","floor","xAxis","d3.axisBottom","ticks","xAxisGroup","call","style","yAxis","d3.axisLeft","tickSize","tickFormat","num","symbol","labelType","d3.format","replace","toString","tickSizeOuter","select","area","d3.area","y0","y1","forEach","i","gradient","isSmooth","datum","d3.line","curve","d3.curveMonotoneX","d3.curveLinear","showCircle","enter","on","event","pageX","pageY","content","name","this","transition","jsxs","ref","children","position","jsx","Box","sx","left","top","pointerEvents","backgroundColor","zIndex","border","borderRadius","transform","padding","gap","fontSize","weight","color"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useMemo, useEffect } from "react";
|
|
3
|
+
import band from "../../../../node_modules/d3-scale/src/band/index.esm.js";
|
|
4
|
+
import linear from "../../../../node_modules/d3-scale/src/linear/index.esm.js";
|
|
5
|
+
import select from "../../../../node_modules/d3-selection/src/select/index.esm.js";
|
|
6
|
+
import { axisBottom, axisLeft } from "../../../../node_modules/d3-axis/src/axis/index.esm.js";
|
|
7
|
+
const formatNumber = (num) => {
|
|
8
|
+
if (num >= 1e9) return (num / 1e9).toFixed(1) + "B";
|
|
9
|
+
if (num >= 1e6) return (num / 1e6).toFixed(1) + "M";
|
|
10
|
+
if (num >= 1e3) return (num / 1e3).toFixed(1) + "K";
|
|
11
|
+
return num;
|
|
12
|
+
};
|
|
13
|
+
const BarChart = ({
|
|
14
|
+
data,
|
|
15
|
+
numOfLines = 5,
|
|
16
|
+
width = 500,
|
|
17
|
+
height = 300,
|
|
18
|
+
line = false
|
|
19
|
+
}) => {
|
|
20
|
+
const svgRef = useRef(null);
|
|
21
|
+
const maxValue = useMemo(() => {
|
|
22
|
+
return Math.max(...data.map((d) => d.value));
|
|
23
|
+
}, [data]);
|
|
24
|
+
const yAxisMaxValue = useMemo(() => {
|
|
25
|
+
return maxValue * 1.25;
|
|
26
|
+
}, [maxValue]);
|
|
27
|
+
const yAxisTicks = useMemo(() => {
|
|
28
|
+
const ticks = [];
|
|
29
|
+
const interval = yAxisMaxValue / numOfLines;
|
|
30
|
+
for (let i = 0; i <= numOfLines; i++) {
|
|
31
|
+
ticks.push(interval * i);
|
|
32
|
+
}
|
|
33
|
+
return ticks;
|
|
34
|
+
}, [yAxisMaxValue, numOfLines]);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (!svgRef.current) return;
|
|
37
|
+
const svg = select(svgRef.current);
|
|
38
|
+
svg.selectAll("*").remove();
|
|
39
|
+
const margin = { top: 20, right: 20, bottom: 70, left: 40 };
|
|
40
|
+
const barWidth = width - margin.left - margin.right;
|
|
41
|
+
const barHeight = height - margin.top - margin.bottom;
|
|
42
|
+
const mousemove = (event, d) => {
|
|
43
|
+
var _a, _b;
|
|
44
|
+
let xPosition = event.offsetX + margin.left - 25;
|
|
45
|
+
const yPosition = event.offsetY + margin.top - 40;
|
|
46
|
+
const tooltipWidth = (_b = (_a = tooltip.node()) == null ? void 0 : _a.getBoundingClientRect()) == null ? void 0 : _b.width;
|
|
47
|
+
const rightOffset = tooltipWidth ? xPosition + tooltipWidth : xPosition;
|
|
48
|
+
if (rightOffset > width) {
|
|
49
|
+
xPosition = Math.floor(
|
|
50
|
+
tooltipWidth ? xPosition - tooltipWidth - 20 : xPosition - 20
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
const text = `${d.label} - ${d.value}`;
|
|
54
|
+
tooltip.attr("x", xPosition).attr("y", yPosition).style("opacity", 9).style("height", text.length >= 16 ? 50 : 35);
|
|
55
|
+
tooltipText.html(text);
|
|
56
|
+
};
|
|
57
|
+
const mouseleave = () => {
|
|
58
|
+
tooltip.style("opacity", 0);
|
|
59
|
+
};
|
|
60
|
+
const x = band().domain(data.map((d) => d.label)).range([0, barWidth]).padding(0.1);
|
|
61
|
+
const y = linear().domain([0, yAxisMaxValue]).range([barHeight, 0]);
|
|
62
|
+
const chart = svg.append("g").attr("transform", `translate(${margin.left},${margin.top})`);
|
|
63
|
+
if (line) {
|
|
64
|
+
yAxisTicks.slice(1).forEach((tick) => {
|
|
65
|
+
chart.append("line").attr("class", "dotted-line").attr("x1", 0).attr("y1", y(tick)).attr("x2", barWidth).attr("y2", y(tick)).style("stroke", "gray").style("stroke-dasharray", "3,3").style("opacity", 1);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
chart.selectAll(".bar").data(data).enter().append("rect").attr("class", "bar").attr("x", (d) => x(d.label)).attr("y", (d) => y(d.value)).attr("width", x.bandwidth()).attr("height", (d) => barHeight - y(d.value)).style("fill", "#357AF6").style("opacity", "1").on("mousemove", mousemove).on("mouseleave", mouseleave);
|
|
69
|
+
const xAxis = chart.append("g").attr("class", "x-axis").attr("transform", `translate(0, ${barHeight})`).call(axisBottom(x));
|
|
70
|
+
xAxis.selectAll(".tick line").remove();
|
|
71
|
+
const yAxis = chart.append("g").attr("class", "y-axis").call(
|
|
72
|
+
axisLeft(y).tickValues(yAxisTicks).tickFormat((d) => {
|
|
73
|
+
return formatNumber(d);
|
|
74
|
+
}).tickSizeOuter(0)
|
|
75
|
+
);
|
|
76
|
+
yAxis.selectAll(".tick line").remove();
|
|
77
|
+
const tooltip = svg.append("foreignObject").attr("class", "tooltip").attr("width", 120).attr("height", 20).style("opacity", 0).style("position", "absolute").style("background-color", "white").style("border", "none").style("box-shadow", "0rem 0rem 0.469rem 0rem rgba(0, 0, 0, 0.15)").style("border-radius", "0.313rem").style("padding", "0.625rem").style("font-size", "0.75rem");
|
|
78
|
+
const tooltipText = tooltip.append("xhtml:div").style("font-size", "0.75rem").style("color", "black");
|
|
79
|
+
}, [data, height, width, line, yAxisMaxValue, yAxisTicks]);
|
|
80
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("svg", { ref: svgRef, width, height }) });
|
|
81
|
+
};
|
|
82
|
+
export {
|
|
83
|
+
BarChart as default
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../../../src/components/charts/bar-chart/bar-chart.tsx"],"sourcesContent":["import React, { useRef, useEffect, useMemo } from \"react\";\nimport * as d3 from \"d3\";\n\ninterface DataPoint {\n label: string;\n value: number;\n}\n\ninterface BarChartProps {\n data: DataPoint[];\n numOfLines?: number;\n width?: number;\n height?: number;\n line?: boolean;\n}\n\nconst formatNumber = (num: number) => {\n if (num >= 1e9) return (num / 1e9).toFixed(1) + \"B\";\n if (num >= 1e6) return (num / 1e6).toFixed(1) + \"M\";\n if (num >= 1e3) return (num / 1e3).toFixed(1) + \"K\";\n return num;\n};\n\nconst BarChart: React.FC<BarChartProps> = ({\n data,\n numOfLines = 5,\n width = 500,\n height = 300,\n line = false,\n}) => {\n const svgRef = useRef<SVGSVGElement>(null);\n\n const maxValue = useMemo(() => {\n return Math.max(...data.map((d) => d.value));\n }, [data]);\n\n const yAxisMaxValue = useMemo(() => {\n return maxValue * 1.25;\n }, [maxValue]);\n\n const yAxisTicks = useMemo(() => {\n const ticks = [];\n const interval = yAxisMaxValue / numOfLines;\n for (let i = 0; i <= numOfLines; i++) {\n ticks.push(interval * i);\n }\n return ticks;\n }, [yAxisMaxValue, numOfLines]);\n\n useEffect(() => {\n if (!svgRef.current) return;\n\n const svg = d3.select(svgRef.current);\n\n svg.selectAll(\"*\").remove();\n\n const margin = { top: 20, right: 20, bottom: 70, left: 40 };\n const barWidth = width - margin.left - margin.right;\n const barHeight = height - margin.top - margin.bottom;\n\n const mousemove = (event: MouseEvent, d: DataPoint) => {\n let xPosition = event.offsetX + margin.left - 25;\n const yPosition = event.offsetY + margin.top - 40;\n const tooltipWidth = tooltip.node()?.getBoundingClientRect()?.width;\n const rightOffset = tooltipWidth ? xPosition + tooltipWidth : xPosition;\n if (rightOffset > width) {\n xPosition = Math.floor(\n tooltipWidth ? xPosition - tooltipWidth - 20 : xPosition - 20,\n );\n }\n\n const text = `${d.label} - ${d.value}`;\n tooltip\n .attr(\"x\", xPosition)\n .attr(\"y\", yPosition)\n .style(\"opacity\", 9)\n .style(\"height\", text.length >= 16 ? 50 : 35);\n\n tooltipText.html(text);\n };\n\n const mouseleave = () => {\n tooltip.style(\"opacity\", 0);\n };\n\n const x = d3\n .scaleBand()\n .domain(data.map((d) => d.label))\n .range([0, barWidth])\n .padding(0.1);\n\n const y = d3.scaleLinear().domain([0, yAxisMaxValue]).range([barHeight, 0]);\n\n const chart = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`);\n\n if (line) {\n yAxisTicks.slice(1).forEach((tick) => {\n chart\n .append(\"line\")\n .attr(\"class\", \"dotted-line\")\n .attr(\"x1\", 0)\n .attr(\"y1\", y(tick))\n .attr(\"x2\", barWidth)\n .attr(\"y2\", y(tick))\n .style(\"stroke\", \"gray\")\n .style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", 1);\n });\n }\n\n chart\n .selectAll(\".bar\")\n .data(data)\n .enter()\n .append(\"rect\")\n .attr(\"class\", \"bar\")\n //@ts-expect-error not applicable\n .attr(\"x\", (d: any) => x(d.label))\n .attr(\"y\", (d: any) => y(d.value))\n .attr(\"width\", x.bandwidth())\n .attr(\"height\", (d: any) => barHeight - y(d.value))\n .style(\"fill\", \"#357AF6\")\n .style(\"opacity\", \"1\")\n .on(\"mousemove\", mousemove)\n .on(\"mouseleave\", mouseleave);\n\n const xAxis = chart\n .append(\"g\")\n .attr(\"class\", \"x-axis\")\n .attr(\"transform\", `translate(0, ${barHeight})`)\n .call(d3.axisBottom(x) as any);\n\n xAxis.selectAll(\".tick line\").remove();\n\n const yAxis = chart\n .append(\"g\")\n .attr(\"class\", \"y-axis\")\n .call(\n d3\n .axisLeft(y)\n .tickValues(yAxisTicks)\n //@ts-expect-error not applicable\n .tickFormat((d: any) => {\n return formatNumber(d);\n })\n .tickSizeOuter(0) as any,\n );\n\n yAxis.selectAll(\".tick line\").remove();\n\n const tooltip = svg\n .append(\"foreignObject\")\n .attr(\"class\", \"tooltip\")\n .attr(\"width\", 120)\n .attr(\"height\", 20)\n .style(\"opacity\", 0)\n .style(\"position\", \"absolute\")\n .style(\"background-color\", \"white\")\n .style(\"border\", \"none\")\n .style(\"box-shadow\", \"0rem 0rem 0.469rem 0rem rgba(0, 0, 0, 0.15)\")\n .style(\"border-radius\", \"0.313rem\")\n .style(\"padding\", \"0.625rem\")\n .style(\"font-size\", \"0.75rem\");\n\n const tooltipText = tooltip\n .append(\"xhtml:div\")\n .style(\"font-size\", \"0.75rem\")\n .style(\"color\", \"black\");\n }, [data, height, width, line, yAxisMaxValue, yAxisTicks]);\n\n return (\n <>\n <svg ref={svgRef} width={width} height={height}></svg>\n </>\n );\n};\n\nexport default BarChart;\n"],"names":["d3.select","d3.scaleBand","d3.scaleLinear","d3.axisBottom","d3.axisLeft"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),r=require("../../../../node_modules/d3-scale/src/band/index.js"),a=require("../../../../node_modules/d3-scale/src/linear/index.js"),s=require("../../../../node_modules/d3-selection/src/select/index.js"),l=require("../../../../node_modules/d3-axis/src/axis/index.js");exports.default=({data:o,numOfLines:i=5,width:n=500,height:d=300,line:c=!1})=>{const u=t.useRef(null),m=t.useMemo(()=>Math.max(...o.map(e=>e.value)),[o]),y=t.useMemo(()=>1.25*m,[m]),p=t.useMemo(()=>{const e=[],t=y/i;for(let r=0;r<=i;r++)e.push(t*r);return e},[y,i]);return t.useEffect(()=>{if(!u.current)return;const e=s.default(u.current);e.selectAll("*").remove();const t=n-40-20,i=d-20-70,m=r.default().domain(o.map(e=>e.label)).range([0,t]).padding(.1),h=a.default().domain([0,y]).range([i,0]),x=e.append("g").attr("transform","translate(40,20)");c&&p.slice(1).forEach(e=>{x.append("line").attr("class","dotted-line").attr("x1",0).attr("y1",h(e)).attr("x2",t).attr("y2",h(e)).style("stroke","gray").style("stroke-dasharray","3,3").style("opacity",1)}),x.selectAll(".bar").data(o).enter().append("rect").attr("class","bar").attr("x",e=>m(e.label)).attr("y",e=>h(e.value)).attr("width",m.bandwidth()).attr("height",e=>i-h(e.value)).style("fill","#357AF6").style("opacity","1").on("mousemove",(e,t)=>{var r,a;let s=e.offsetX+40-25;const l=e.offsetY+20-40,o=null==(a=null==(r=f.node())?void 0:r.getBoundingClientRect())?void 0:a.width;(o?s+o:s)>n&&(s=Math.floor(o?s-o-20:s-20));const i=`${t.label} - ${t.value}`;f.attr("x",s).attr("y",l).style("opacity",9).style("height",i.length>=16?50:35),g.html(i)}).on("mouseleave",()=>{f.style("opacity",0)}),x.append("g").attr("class","x-axis").attr("transform",`translate(0, ${i})`).call(l.axisBottom(m)).selectAll(".tick line").remove(),x.append("g").attr("class","y-axis").call(l.axisLeft(h).tickValues(p).tickFormat(e=>{return(t=e)>=1e9?(t/1e9).toFixed(1)+"B":t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(1)+"K":t;var t}).tickSizeOuter(0)).selectAll(".tick line").remove();const f=e.append("foreignObject").attr("class","tooltip").attr("width",120).attr("height",20).style("opacity",0).style("position","absolute").style("background-color","white").style("border","none").style("box-shadow","0rem 0rem 0.469rem 0rem rgba(0, 0, 0, 0.15)").style("border-radius","0.313rem").style("padding","0.625rem").style("font-size","0.75rem"),g=f.append("xhtml:div").style("font-size","0.75rem").style("color","black")},[o,d,n,c,y,p]),/* @__PURE__ */e.jsx(e.Fragment,{children:/* @__PURE__ */e.jsx("svg",{ref:u,width:n,height:d})})};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/charts/bar-chart/bar-chart.tsx"],"sourcesContent":["import React, { useRef, useEffect, useMemo } from \"react\";\nimport * as d3 from \"d3\";\n\ninterface DataPoint {\n label: string;\n value: number;\n}\n\ninterface BarChartProps {\n data: DataPoint[];\n numOfLines?: number;\n width?: number;\n height?: number;\n line?: boolean;\n}\n\nconst formatNumber = (num: number) => {\n if (num >= 1e9) return (num / 1e9).toFixed(1) + \"B\";\n if (num >= 1e6) return (num / 1e6).toFixed(1) + \"M\";\n if (num >= 1e3) return (num / 1e3).toFixed(1) + \"K\";\n return num;\n};\n\nconst BarChart: React.FC<BarChartProps> = ({\n data,\n numOfLines = 5,\n width = 500,\n height = 300,\n line = false,\n}) => {\n const svgRef = useRef<SVGSVGElement>(null);\n\n const maxValue = useMemo(() => {\n return Math.max(...data.map((d) => d.value));\n }, [data]);\n\n const yAxisMaxValue = useMemo(() => {\n return maxValue * 1.25;\n }, [maxValue]);\n\n const yAxisTicks = useMemo(() => {\n const ticks = [];\n const interval = yAxisMaxValue / numOfLines;\n for (let i = 0; i <= numOfLines; i++) {\n ticks.push(interval * i);\n }\n return ticks;\n }, [yAxisMaxValue, numOfLines]);\n\n useEffect(() => {\n if (!svgRef.current) return;\n\n const svg = d3.select(svgRef.current);\n\n svg.selectAll(\"*\").remove();\n\n const margin = { top: 20, right: 20, bottom: 70, left: 40 };\n const barWidth = width - margin.left - margin.right;\n const barHeight = height - margin.top - margin.bottom;\n\n const mousemove = (event: MouseEvent, d: DataPoint) => {\n let xPosition = event.offsetX + margin.left - 25;\n const yPosition = event.offsetY + margin.top - 40;\n const tooltipWidth = tooltip.node()?.getBoundingClientRect()?.width;\n const rightOffset = tooltipWidth ? xPosition + tooltipWidth : xPosition;\n if (rightOffset > width) {\n xPosition = Math.floor(\n tooltipWidth ? xPosition - tooltipWidth - 20 : xPosition - 20,\n );\n }\n\n const text = `${d.label} - ${d.value}`;\n tooltip\n .attr(\"x\", xPosition)\n .attr(\"y\", yPosition)\n .style(\"opacity\", 9)\n .style(\"height\", text.length >= 16 ? 50 : 35);\n\n tooltipText.html(text);\n };\n\n const mouseleave = () => {\n tooltip.style(\"opacity\", 0);\n };\n\n const x = d3\n .scaleBand()\n .domain(data.map((d) => d.label))\n .range([0, barWidth])\n .padding(0.1);\n\n const y = d3.scaleLinear().domain([0, yAxisMaxValue]).range([barHeight, 0]);\n\n const chart = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`);\n\n if (line) {\n yAxisTicks.slice(1).forEach((tick) => {\n chart\n .append(\"line\")\n .attr(\"class\", \"dotted-line\")\n .attr(\"x1\", 0)\n .attr(\"y1\", y(tick))\n .attr(\"x2\", barWidth)\n .attr(\"y2\", y(tick))\n .style(\"stroke\", \"gray\")\n .style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", 1);\n });\n }\n\n chart\n .selectAll(\".bar\")\n .data(data)\n .enter()\n .append(\"rect\")\n .attr(\"class\", \"bar\")\n //@ts-expect-error not applicable\n .attr(\"x\", (d: any) => x(d.label))\n .attr(\"y\", (d: any) => y(d.value))\n .attr(\"width\", x.bandwidth())\n .attr(\"height\", (d: any) => barHeight - y(d.value))\n .style(\"fill\", \"#357AF6\")\n .style(\"opacity\", \"1\")\n .on(\"mousemove\", mousemove)\n .on(\"mouseleave\", mouseleave);\n\n const xAxis = chart\n .append(\"g\")\n .attr(\"class\", \"x-axis\")\n .attr(\"transform\", `translate(0, ${barHeight})`)\n .call(d3.axisBottom(x) as any);\n\n xAxis.selectAll(\".tick line\").remove();\n\n const yAxis = chart\n .append(\"g\")\n .attr(\"class\", \"y-axis\")\n .call(\n d3\n .axisLeft(y)\n .tickValues(yAxisTicks)\n //@ts-expect-error not applicable\n .tickFormat((d: any) => {\n return formatNumber(d);\n })\n .tickSizeOuter(0) as any,\n );\n\n yAxis.selectAll(\".tick line\").remove();\n\n const tooltip = svg\n .append(\"foreignObject\")\n .attr(\"class\", \"tooltip\")\n .attr(\"width\", 120)\n .attr(\"height\", 20)\n .style(\"opacity\", 0)\n .style(\"position\", \"absolute\")\n .style(\"background-color\", \"white\")\n .style(\"border\", \"none\")\n .style(\"box-shadow\", \"0rem 0rem 0.469rem 0rem rgba(0, 0, 0, 0.15)\")\n .style(\"border-radius\", \"0.313rem\")\n .style(\"padding\", \"0.625rem\")\n .style(\"font-size\", \"0.75rem\");\n\n const tooltipText = tooltip\n .append(\"xhtml:div\")\n .style(\"font-size\", \"0.75rem\")\n .style(\"color\", \"black\");\n }, [data, height, width, line, yAxisMaxValue, yAxisTicks]);\n\n return (\n <>\n <svg ref={svgRef} width={width} height={height}></svg>\n </>\n );\n};\n\nexport default BarChart;\n"],"names":["data","numOfLines","width","height","line","svgRef","useRef","maxValue","useMemo","Math","max","map","d","value","yAxisMaxValue","yAxisTicks","ticks","interval","i","push","useEffect","current","svg","d3.select","selectAll","remove","barWidth","barHeight","x","d3.scaleBand","domain","label","range","padding","y","d3.scaleLinear","chart","append","attr","slice","forEach","tick","style","enter","bandwidth","on","event","xPosition","offsetX","yPosition","offsetY","tooltipWidth","_b","_a","tooltip","node","getBoundingClientRect","floor","text","length","tooltipText","html","call","d3.axisBottom","d3.axisLeft","tickValues","tickFormat","num","toFixed","tickSizeOuter","children","jsx","ref"],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState, useMemo, useEffect } from "react";
|
|
3
|
+
import band from "../../../../node_modules/d3-scale/src/band/index.esm.js";
|
|
4
|
+
import linear from "../../../../node_modules/d3-scale/src/linear/index.esm.js";
|
|
5
|
+
import select from "../../../../node_modules/d3-selection/src/select/index.esm.js";
|
|
6
|
+
import { axisTop, axisBottom, axisLeft } from "../../../../node_modules/d3-axis/src/axis/index.esm.js";
|
|
7
|
+
import { format } from "../../../../node_modules/d3-format/src/defaultLocale/index.esm.js";
|
|
8
|
+
const formatNumber = (num, symbol, labelType) => {
|
|
9
|
+
if (labelType === "inPercent") {
|
|
10
|
+
return `${format(".0%")(num / 100)}`;
|
|
11
|
+
} else if (labelType === "inValue") {
|
|
12
|
+
return `${symbol || ""} ${format(".2s")(num).replace("k", "K")}`;
|
|
13
|
+
}
|
|
14
|
+
return num.toString();
|
|
15
|
+
};
|
|
16
|
+
function wrapText(textSelection, width) {
|
|
17
|
+
textSelection.each(function() {
|
|
18
|
+
const text = select(this);
|
|
19
|
+
const originalText = text.text();
|
|
20
|
+
if (originalText.length <= 8) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (originalText.length > 12) {
|
|
24
|
+
text.text(originalText.substring(0, 10) + "...");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const words = originalText.split(/\s+/).reverse();
|
|
28
|
+
let word;
|
|
29
|
+
let line = [];
|
|
30
|
+
let lineNumber = 0;
|
|
31
|
+
const lineHeight = 1.1;
|
|
32
|
+
const y = text.attr("y");
|
|
33
|
+
const dy = parseFloat(text.attr("dy")) || 0;
|
|
34
|
+
let tspan = text.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", `${dy}em`);
|
|
35
|
+
while (word = words.pop()) {
|
|
36
|
+
line.push(word);
|
|
37
|
+
tspan.text(line.join(" "));
|
|
38
|
+
if (tspan.node() && tspan.node().getComputedTextLength() > width) {
|
|
39
|
+
line.pop();
|
|
40
|
+
tspan.text(line.join(" "));
|
|
41
|
+
line = [word];
|
|
42
|
+
tspan = text.append("tspan").attr("x", 0).attr("y", y).attr("dy", `${++lineNumber * lineHeight + dy}em`).text(word);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const BarChart = ({
|
|
48
|
+
data,
|
|
49
|
+
numOfLines = 5,
|
|
50
|
+
initialWidth = 500,
|
|
51
|
+
height = 400,
|
|
52
|
+
line = false,
|
|
53
|
+
yAxisLabelType = "inValue",
|
|
54
|
+
currency,
|
|
55
|
+
customLabelFormatter
|
|
56
|
+
}) => {
|
|
57
|
+
const svgRef = useRef(null);
|
|
58
|
+
const wrapperRef = useRef(null);
|
|
59
|
+
const [containerWidth, setContainerWidth] = useState(initialWidth);
|
|
60
|
+
const maxValue = useMemo(() => Math.max(...data.map((d) => d.value)), [data]);
|
|
61
|
+
const yAxisMaxValue = useMemo(() => maxValue * 1.25, [maxValue]);
|
|
62
|
+
const yAxisTicks = useMemo(() => {
|
|
63
|
+
const ticks = [];
|
|
64
|
+
const interval = yAxisMaxValue / numOfLines;
|
|
65
|
+
for (let i = 0; i <= numOfLines; i++) {
|
|
66
|
+
ticks.push(interval * i);
|
|
67
|
+
}
|
|
68
|
+
return ticks;
|
|
69
|
+
}, [yAxisMaxValue, numOfLines]);
|
|
70
|
+
const needsHorizontalScroll = data.length > 12;
|
|
71
|
+
const minGroupWidth = 120;
|
|
72
|
+
const calculatedChartWidth = needsHorizontalScroll ? Math.max(data.length * minGroupWidth, containerWidth) : containerWidth;
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
const wrapper = wrapperRef.current;
|
|
75
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
76
|
+
if (entries[0]) {
|
|
77
|
+
const newWidth = entries[0].contentRect.width;
|
|
78
|
+
setContainerWidth(newWidth);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
if (wrapper) {
|
|
82
|
+
resizeObserver.observe(wrapper);
|
|
83
|
+
}
|
|
84
|
+
return () => {
|
|
85
|
+
if (wrapper) {
|
|
86
|
+
resizeObserver.unobserve(wrapper);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}, []);
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
if (containerWidth === 0) return;
|
|
92
|
+
const svg = select(svgRef.current);
|
|
93
|
+
svg.selectAll("*").remove();
|
|
94
|
+
const maxLabelWidth = 80;
|
|
95
|
+
const dynamicLeftMargin = Math.max(60, maxLabelWidth + 30);
|
|
96
|
+
const margin = { top: 20, right: 20, bottom: 25, left: dynamicLeftMargin };
|
|
97
|
+
const barWidth = calculatedChartWidth - margin.left - margin.right;
|
|
98
|
+
const barHeight = maxValue ? height - margin.top - margin.bottom : 0;
|
|
99
|
+
const x = band().domain(data.map((d) => d.label)).range([0, barWidth]).padding(0.5);
|
|
100
|
+
const y = linear().domain([0, yAxisMaxValue]).range([barHeight, 0]);
|
|
101
|
+
const chart = svg.append("g").attr("transform", `translate(${margin.left},${maxValue ? margin.top : height - 50})`);
|
|
102
|
+
if (line) {
|
|
103
|
+
yAxisTicks.slice(1).forEach((tick) => {
|
|
104
|
+
chart.append("line").attr("class", "dotted-line").attr("x1", 0).attr("y1", y(tick)).attr("x2", barWidth).attr("y2", y(tick)).style("stroke", "#D3D3D4").style("stroke-dasharray", "3,3").style("opacity", 1);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
chart.selectAll(".bar").data(data).enter().append("rect").attr("rx", 5).attr("ry", 5).attr("class", "bar").attr("x", (d) => x(d.label)).attr("y", (d) => y(d.value)).attr("width", x.bandwidth()).attr("height", (d) => barHeight - y(d.value)).style("fill", (d) => d.color);
|
|
108
|
+
const xAxis = chart.append("g").attr("class", "x-axis").attr("transform", `translate(0, ${barHeight})`).call(axisTop(x).tickPadding(10)).call(axisBottom(x).tickPadding(5));
|
|
109
|
+
xAxis.selectAll(".tick line").remove();
|
|
110
|
+
xAxis.selectAll(".tick text").call(wrapText, 80);
|
|
111
|
+
const availableHeight = barHeight;
|
|
112
|
+
const minTickSpacing = 30;
|
|
113
|
+
const maxOptimalTicks = Math.floor(availableHeight / minTickSpacing);
|
|
114
|
+
const optimalNumTicks = Math.min(numOfLines, maxOptimalTicks, 8);
|
|
115
|
+
const optimalTicks = [];
|
|
116
|
+
const optimalInterval = yAxisMaxValue / optimalNumTicks;
|
|
117
|
+
for (let i = 0; i <= optimalNumTicks; i++) {
|
|
118
|
+
optimalTicks.push(optimalInterval * i);
|
|
119
|
+
}
|
|
120
|
+
const yAxis = chart.append("g").attr("class", "y-axis").call(
|
|
121
|
+
axisLeft(y).tickValues(optimalTicks).tickFormat(
|
|
122
|
+
(d) => customLabelFormatter ? customLabelFormatter(d) : formatNumber(d, currency, yAxisLabelType)
|
|
123
|
+
).tickSizeOuter(0).tickPadding(8)
|
|
124
|
+
// Add padding between ticks and labels
|
|
125
|
+
);
|
|
126
|
+
yAxis.selectAll(".tick line").remove();
|
|
127
|
+
yAxis.select(".domain").attr("stroke", "none");
|
|
128
|
+
xAxis.select(".domain").attr("stroke", "none");
|
|
129
|
+
yAxis.selectAll(".tick text").style("font-size", "11px").style("fill", "#666").style("font-family", "Inter, system-ui, Avenir, Helvetica, Arial, sans-serif").style("text-anchor", "end");
|
|
130
|
+
}, [data, containerWidth, height, line, yAxisMaxValue, yAxisTicks, currency, yAxisLabelType, customLabelFormatter, calculatedChartWidth]);
|
|
131
|
+
return /* @__PURE__ */ jsx(
|
|
132
|
+
"div",
|
|
133
|
+
{
|
|
134
|
+
ref: wrapperRef,
|
|
135
|
+
style: {
|
|
136
|
+
width: "100%",
|
|
137
|
+
overflowX: needsHorizontalScroll ? "auto" : "hidden",
|
|
138
|
+
overflowY: "hidden"
|
|
139
|
+
},
|
|
140
|
+
children: /* @__PURE__ */ jsx("svg", { ref: svgRef, width: calculatedChartWidth, height, viewBox: `0 0 ${calculatedChartWidth} ${height}` })
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
};
|
|
144
|
+
export {
|
|
145
|
+
BarChart as default
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../../../src/components/charts/barChart/barChart.tsx"],"sourcesContent":["import React, { useRef, useEffect, useMemo, useState } from \"react\";\nimport * as d3 from \"d3\";\n\ninterface DataPoint {\n label: string;\n value: number;\n}\n\ninterface BarChartProps {\n data: DataPoint[];\n numOfLines?: number;\n initialWidth?: number;\n height?: any;\n line?: boolean;\n chartBarWidth?: number;\n yAxisLabelType?: 'inPercent' | 'inValue' | 'custom';\n customLabelFormatter?: (value: number) => string;\n currency: string\n}\n\nconst formatNumber = (num: number, symbol: string, labelType: string) => {\n if (labelType === 'inPercent') {\n return `${d3.format(\".0%\")(num / 100)}`;\n } else if (labelType === 'inValue') {\n return `${symbol || ''} ${d3.format(\".2s\")(num).replace('k', 'K')}`;\n }\n return num.toString();\n};\n\nfunction wrapText(textSelection: any, width: number) {\n textSelection.each(function (this: any) {\n const text = d3.select(this);\n const originalText = text.text();\n \n if (originalText.length <= 8) {\n return;\n }\n \n if (originalText.length > 12) {\n text.text(originalText.substring(0, 10) + '...');\n return;\n }\n \n const words = originalText.split(/\\s+/).reverse();\n let word;\n let line: string[] = [];\n let lineNumber = 0;\n const lineHeight = 1.1; // ems\n const y = text.attr(\"y\");\n const dy = parseFloat(text.attr(\"dy\")) || 0;\n \n let tspan = text\n .text(null)\n .append(\"tspan\")\n .attr(\"x\", 0)\n .attr(\"y\", y)\n .attr(\"dy\", `${dy}em`);\n \n while ((word = words.pop())) {\n line.push(word);\n tspan.text(line.join(\" \"));\n if (tspan.node() && tspan.node()!.getComputedTextLength() > width) {\n line.pop();\n tspan.text(line.join(\" \"));\n line = [word];\n tspan = text\n .append(\"tspan\")\n .attr(\"x\", 0)\n .attr(\"y\", y)\n .attr(\"dy\", `${++lineNumber * lineHeight + dy}em`)\n .text(word);\n }\n }\n });\n }\n \nconst BarChart: React.FC<BarChartProps> = ({\n data,\n numOfLines = 5,\n initialWidth = 500,\n height = 400,\n line = false,\n yAxisLabelType = 'inValue',\n currency,\n customLabelFormatter,\n}) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(initialWidth);\n\n const maxValue = useMemo(() => Math.max(...data.map((d) => d.value)), [data]);\n\n const yAxisMaxValue = useMemo(() => maxValue * 1.25, [maxValue]);\n\n const yAxisTicks = useMemo(() => {\n const ticks = [];\n const interval = yAxisMaxValue / numOfLines;\n for (let i = 0; i <= numOfLines; i++) {\n ticks.push(interval * i);\n }\n return ticks;\n }, [yAxisMaxValue, numOfLines]);\n\n\n const needsHorizontalScroll = data.length > 12;\n const minGroupWidth = 120; \n const calculatedChartWidth = needsHorizontalScroll \n ? Math.max(data.length * minGroupWidth, containerWidth)\n : containerWidth;\n\n // ResizeObserver to make the chart responsive\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (entries[0]) {\n const newWidth = entries[0].contentRect.width;\n setContainerWidth(newWidth);\n }\n });\n\n if (wrapper) {\n resizeObserver.observe(wrapper);\n }\n \n return () => {\n if (wrapper) {\n resizeObserver.unobserve(wrapper);\n }\n };\n }, []);\n useEffect(() => {\n if (containerWidth === 0) return;\n\n const svg = d3.select(svgRef.current);\n\n svg.selectAll(\"*\").remove();\n\n // Calculate dynamic left margin based on label length (accounting for wrapping)\n // const sampleLabel = customLabelFormatter \n // ? customLabelFormatter(yAxisMaxValue)\n // : formatNumber(yAxisMaxValue, currency, yAxisLabelType);\n const maxLabelWidth = 80; // Maximum width for wrapped labels\n const dynamicLeftMargin = Math.max(60, maxLabelWidth + 30);\n \n const margin = { top: 20, right: 20, bottom: 25, left: dynamicLeftMargin };\n const barWidth = calculatedChartWidth - margin.left - margin.right;\n const barHeight = maxValue ? height - margin.top - margin.bottom : 0;\n\n const x = d3\n .scaleBand()\n .domain(data.map((d) => d.label))\n .range([0, barWidth])\n .padding(0.5);\n\n const y = d3.scaleLinear().domain([0, yAxisMaxValue]).range([barHeight, 0]);\n\n \n const chart = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${maxValue?margin.top:height-50})`);\n \n if (line) {\n yAxisTicks.slice(1).forEach((tick) => {\n chart\n .append(\"line\")\n .attr(\"class\", \"dotted-line\")\n .attr(\"x1\", 0)\n .attr(\"y1\", y(tick))\n .attr(\"x2\", barWidth)\n .attr(\"y2\", y(tick))\n .style(\"stroke\", \"#D3D3D4\")\n .style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", 1);\n });\n }\n\n chart\n .selectAll(\".bar\")\n .data(data)\n .enter()\n .append(\"rect\")\n .attr(\"rx\", 5)\n .attr(\"ry\", 5)\n .attr(\"class\", \"bar\")\n .attr(\"x\", (d: any) => x(d.label))\n .attr(\"y\", (d: any) => y(d.value))\n .attr(\"width\", x.bandwidth())\n .attr(\"height\", (d: any) => barHeight - y(d.value))\n .style(\"fill\", (d: any) => d.color);\n\n const xAxis = chart\n .append(\"g\")\n .attr(\"class\", \"x-axis\")\n .attr(\"transform\", `translate(0, ${barHeight})`)\n .call(d3.axisTop(x).tickPadding(10) as any)\n .call(d3.axisBottom(x).tickPadding(5) as any)\n // .call(d3.axisLeft(x).tickPadding(5) as any)\n\n xAxis.selectAll(\".tick line\").remove();\n xAxis.selectAll(\".tick text\").call(wrapText,80); \n\n // Calculate optimal number of ticks to prevent overlap\n const availableHeight = barHeight;\n const minTickSpacing = 30; // Minimum pixels between ticks\n const maxOptimalTicks = Math.floor(availableHeight / minTickSpacing);\n const optimalNumTicks = Math.min(numOfLines, maxOptimalTicks, 8);\n \n // Generate optimal tick values\n const optimalTicks = [];\n const optimalInterval = yAxisMaxValue / optimalNumTicks;\n for (let i = 0; i <= optimalNumTicks; i++) {\n optimalTicks.push(optimalInterval * i);\n }\n\n const yAxis = chart\n .append(\"g\")\n .attr(\"class\", \"y-axis\")\n .call(\n d3.axisLeft(y)\n .tickValues(optimalTicks)\n .tickFormat((d: any) =>\n customLabelFormatter\n ? customLabelFormatter(d)\n : formatNumber(d, currency, yAxisLabelType)\n )\n .tickSizeOuter(0)\n .tickPadding(8) as any, // Add padding between ticks and labels\n );\n\n yAxis.selectAll(\".tick line\").remove();\n yAxis.select(\".domain\").attr(\"stroke\", \"none\");\n xAxis.select(\".domain\").attr(\"stroke\", \"none\");\n \n // Style y-axis labels for better readability and apply text wrapping\n yAxis.selectAll(\".tick text\")\n .style(\"font-size\", \"11px\")\n .style(\"fill\", \"#666\")\n .style(\"font-family\", \"Inter, system-ui, Avenir, Helvetica, Arial, sans-serif\")\n .style(\"text-anchor\", \"end\")\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, containerWidth, height, line, yAxisMaxValue, yAxisTicks, currency, yAxisLabelType, customLabelFormatter, calculatedChartWidth]);\n\n return (\n <div ref={wrapperRef} \n style={{ \n width: '100%', \n overflowX: needsHorizontalScroll ? 'auto' : 'hidden',\n overflowY: 'hidden'\n }}>\n <svg ref={svgRef} width={calculatedChartWidth} height={height} viewBox={`0 0 ${calculatedChartWidth} ${height}`} />\n </div>\n );\n};\n\nexport default BarChart;\n"],"names":["d3.format","d3.select","d3.scaleBand","d3.scaleLinear","d3.axisTop","d3.axisBottom","d3.axisLeft"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),r=require("../../../../node_modules/d3-scale/src/band/index.js"),a=require("../../../../node_modules/d3-scale/src/linear/index.js"),s=require("../../../../node_modules/d3-selection/src/select/index.js"),n=require("../../../../node_modules/d3-axis/src/axis/index.js"),l=require("../../../../node_modules/d3-format/src/defaultLocale/index.js");function i(e,t){e.each(function(){const e=s.default(this),r=e.text();if(r.length<=8)return;if(r.length>12)return void e.text(r.substring(0,10)+"...");const a=r.split(/\s+/).reverse();let n,l=[],i=0;const o=e.attr("y"),c=parseFloat(e.attr("dy"))||0;let d=e.text(null).append("tspan").attr("x",0).attr("y",o).attr("dy",`${c}em`);for(;n=a.pop();)l.push(n),d.text(l.join(" ")),d.node()&&d.node().getComputedTextLength()>t&&(l.pop(),d.text(l.join(" ")),l=[n],d=e.append("tspan").attr("x",0).attr("y",o).attr("dy",`${1.1*++i+c}em`).text(n))})}exports.default=({data:o,numOfLines:c=5,initialWidth:d=500,height:u=400,line:f=!1,yAxisLabelType:x="inValue",currency:m,customLabelFormatter:p})=>{const h=t.useRef(null),y=t.useRef(null),[g,v]=t.useState(d),k=t.useMemo(()=>Math.max(...o.map(e=>e.value)),[o]),b=t.useMemo(()=>1.25*k,[k]),j=t.useMemo(()=>{const e=[],t=b/c;for(let r=0;r<=c;r++)e.push(t*r);return e},[b,c]),$=o.length>12,w=$?Math.max(120*o.length,g):g;return t.useEffect(()=>{const e=y.current,t=new ResizeObserver(e=>{if(e[0]){const t=e[0].contentRect.width;v(t)}});return e&&t.observe(e),()=>{e&&t.unobserve(e)}},[]),t.useEffect(()=>{if(0===g)return;const e=s.default(h.current);e.selectAll("*").remove();const t=Math.max(60,110),d=w-t-20,y=k?u-20-25:0,v=r.default().domain(o.map(e=>e.label)).range([0,d]).padding(.5),$=a.default().domain([0,b]).range([y,0]),A=e.append("g").attr("transform",`translate(${t},${k?20:u-50})`);f&&j.slice(1).forEach(e=>{A.append("line").attr("class","dotted-line").attr("x1",0).attr("y1",$(e)).attr("x2",d).attr("y2",$(e)).style("stroke","#D3D3D4").style("stroke-dasharray","3,3").style("opacity",1)}),A.selectAll(".bar").data(o).enter().append("rect").attr("rx",5).attr("ry",5).attr("class","bar").attr("x",e=>v(e.label)).attr("y",e=>$(e.value)).attr("width",v.bandwidth()).attr("height",e=>y-$(e.value)).style("fill",e=>e.color);const M=A.append("g").attr("class","x-axis").attr("transform",`translate(0, ${y})`).call(n.axisTop(v).tickPadding(10)).call(n.axisBottom(v).tickPadding(5));M.selectAll(".tick line").remove(),M.selectAll(".tick text").call(i,80);const q=y,_=Math.floor(q/30),L=Math.min(c,_,8),P=[],O=b/L;for(let r=0;r<=L;r++)P.push(O*r);const R=A.append("g").attr("class","y-axis").call(n.axisLeft($).tickValues(P).tickFormat(e=>{return p?p(e):(t=e,r=m,"inPercent"===(a=x)?`${l.format(".0%")(t/100)}`:"inValue"===a?`${r||""} ${l.format(".2s")(t).replace("k","K")}`:t.toString());var t,r,a}).tickSizeOuter(0).tickPadding(8));R.selectAll(".tick line").remove(),R.select(".domain").attr("stroke","none"),M.select(".domain").attr("stroke","none"),R.selectAll(".tick text").style("font-size","11px").style("fill","#666").style("font-family","Inter, system-ui, Avenir, Helvetica, Arial, sans-serif").style("text-anchor","end")},[o,g,u,f,b,j,m,x,p,w]),/* @__PURE__ */e.jsx("div",{ref:y,style:{width:"100%",overflowX:$?"auto":"hidden",overflowY:"hidden"},children:/* @__PURE__ */e.jsx("svg",{ref:h,width:w,height:u,viewBox:`0 0 ${w} ${u}`})})};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/charts/barChart/barChart.tsx"],"sourcesContent":["import React, { useRef, useEffect, useMemo, useState } from \"react\";\nimport * as d3 from \"d3\";\n\ninterface DataPoint {\n label: string;\n value: number;\n}\n\ninterface BarChartProps {\n data: DataPoint[];\n numOfLines?: number;\n initialWidth?: number;\n height?: any;\n line?: boolean;\n chartBarWidth?: number;\n yAxisLabelType?: 'inPercent' | 'inValue' | 'custom';\n customLabelFormatter?: (value: number) => string;\n currency: string\n}\n\nconst formatNumber = (num: number, symbol: string, labelType: string) => {\n if (labelType === 'inPercent') {\n return `${d3.format(\".0%\")(num / 100)}`;\n } else if (labelType === 'inValue') {\n return `${symbol || ''} ${d3.format(\".2s\")(num).replace('k', 'K')}`;\n }\n return num.toString();\n};\n\nfunction wrapText(textSelection: any, width: number) {\n textSelection.each(function (this: any) {\n const text = d3.select(this);\n const originalText = text.text();\n \n if (originalText.length <= 8) {\n return;\n }\n \n if (originalText.length > 12) {\n text.text(originalText.substring(0, 10) + '...');\n return;\n }\n \n const words = originalText.split(/\\s+/).reverse();\n let word;\n let line: string[] = [];\n let lineNumber = 0;\n const lineHeight = 1.1; // ems\n const y = text.attr(\"y\");\n const dy = parseFloat(text.attr(\"dy\")) || 0;\n \n let tspan = text\n .text(null)\n .append(\"tspan\")\n .attr(\"x\", 0)\n .attr(\"y\", y)\n .attr(\"dy\", `${dy}em`);\n \n while ((word = words.pop())) {\n line.push(word);\n tspan.text(line.join(\" \"));\n if (tspan.node() && tspan.node()!.getComputedTextLength() > width) {\n line.pop();\n tspan.text(line.join(\" \"));\n line = [word];\n tspan = text\n .append(\"tspan\")\n .attr(\"x\", 0)\n .attr(\"y\", y)\n .attr(\"dy\", `${++lineNumber * lineHeight + dy}em`)\n .text(word);\n }\n }\n });\n }\n \nconst BarChart: React.FC<BarChartProps> = ({\n data,\n numOfLines = 5,\n initialWidth = 500,\n height = 400,\n line = false,\n yAxisLabelType = 'inValue',\n currency,\n customLabelFormatter,\n}) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(initialWidth);\n\n const maxValue = useMemo(() => Math.max(...data.map((d) => d.value)), [data]);\n\n const yAxisMaxValue = useMemo(() => maxValue * 1.25, [maxValue]);\n\n const yAxisTicks = useMemo(() => {\n const ticks = [];\n const interval = yAxisMaxValue / numOfLines;\n for (let i = 0; i <= numOfLines; i++) {\n ticks.push(interval * i);\n }\n return ticks;\n }, [yAxisMaxValue, numOfLines]);\n\n\n const needsHorizontalScroll = data.length > 12;\n const minGroupWidth = 120; \n const calculatedChartWidth = needsHorizontalScroll \n ? Math.max(data.length * minGroupWidth, containerWidth)\n : containerWidth;\n\n // ResizeObserver to make the chart responsive\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (entries[0]) {\n const newWidth = entries[0].contentRect.width;\n setContainerWidth(newWidth);\n }\n });\n\n if (wrapper) {\n resizeObserver.observe(wrapper);\n }\n \n return () => {\n if (wrapper) {\n resizeObserver.unobserve(wrapper);\n }\n };\n }, []);\n useEffect(() => {\n if (containerWidth === 0) return;\n\n const svg = d3.select(svgRef.current);\n\n svg.selectAll(\"*\").remove();\n\n // Calculate dynamic left margin based on label length (accounting for wrapping)\n // const sampleLabel = customLabelFormatter \n // ? customLabelFormatter(yAxisMaxValue)\n // : formatNumber(yAxisMaxValue, currency, yAxisLabelType);\n const maxLabelWidth = 80; // Maximum width for wrapped labels\n const dynamicLeftMargin = Math.max(60, maxLabelWidth + 30);\n \n const margin = { top: 20, right: 20, bottom: 25, left: dynamicLeftMargin };\n const barWidth = calculatedChartWidth - margin.left - margin.right;\n const barHeight = maxValue ? height - margin.top - margin.bottom : 0;\n\n const x = d3\n .scaleBand()\n .domain(data.map((d) => d.label))\n .range([0, barWidth])\n .padding(0.5);\n\n const y = d3.scaleLinear().domain([0, yAxisMaxValue]).range([barHeight, 0]);\n\n \n const chart = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${maxValue?margin.top:height-50})`);\n \n if (line) {\n yAxisTicks.slice(1).forEach((tick) => {\n chart\n .append(\"line\")\n .attr(\"class\", \"dotted-line\")\n .attr(\"x1\", 0)\n .attr(\"y1\", y(tick))\n .attr(\"x2\", barWidth)\n .attr(\"y2\", y(tick))\n .style(\"stroke\", \"#D3D3D4\")\n .style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", 1);\n });\n }\n\n chart\n .selectAll(\".bar\")\n .data(data)\n .enter()\n .append(\"rect\")\n .attr(\"rx\", 5)\n .attr(\"ry\", 5)\n .attr(\"class\", \"bar\")\n .attr(\"x\", (d: any) => x(d.label))\n .attr(\"y\", (d: any) => y(d.value))\n .attr(\"width\", x.bandwidth())\n .attr(\"height\", (d: any) => barHeight - y(d.value))\n .style(\"fill\", (d: any) => d.color);\n\n const xAxis = chart\n .append(\"g\")\n .attr(\"class\", \"x-axis\")\n .attr(\"transform\", `translate(0, ${barHeight})`)\n .call(d3.axisTop(x).tickPadding(10) as any)\n .call(d3.axisBottom(x).tickPadding(5) as any)\n // .call(d3.axisLeft(x).tickPadding(5) as any)\n\n xAxis.selectAll(\".tick line\").remove();\n xAxis.selectAll(\".tick text\").call(wrapText,80); \n\n // Calculate optimal number of ticks to prevent overlap\n const availableHeight = barHeight;\n const minTickSpacing = 30; // Minimum pixels between ticks\n const maxOptimalTicks = Math.floor(availableHeight / minTickSpacing);\n const optimalNumTicks = Math.min(numOfLines, maxOptimalTicks, 8);\n \n // Generate optimal tick values\n const optimalTicks = [];\n const optimalInterval = yAxisMaxValue / optimalNumTicks;\n for (let i = 0; i <= optimalNumTicks; i++) {\n optimalTicks.push(optimalInterval * i);\n }\n\n const yAxis = chart\n .append(\"g\")\n .attr(\"class\", \"y-axis\")\n .call(\n d3.axisLeft(y)\n .tickValues(optimalTicks)\n .tickFormat((d: any) =>\n customLabelFormatter\n ? customLabelFormatter(d)\n : formatNumber(d, currency, yAxisLabelType)\n )\n .tickSizeOuter(0)\n .tickPadding(8) as any, // Add padding between ticks and labels\n );\n\n yAxis.selectAll(\".tick line\").remove();\n yAxis.select(\".domain\").attr(\"stroke\", \"none\");\n xAxis.select(\".domain\").attr(\"stroke\", \"none\");\n \n // Style y-axis labels for better readability and apply text wrapping\n yAxis.selectAll(\".tick text\")\n .style(\"font-size\", \"11px\")\n .style(\"fill\", \"#666\")\n .style(\"font-family\", \"Inter, system-ui, Avenir, Helvetica, Arial, sans-serif\")\n .style(\"text-anchor\", \"end\")\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, containerWidth, height, line, yAxisMaxValue, yAxisTicks, currency, yAxisLabelType, customLabelFormatter, calculatedChartWidth]);\n\n return (\n <div ref={wrapperRef} \n style={{ \n width: '100%', \n overflowX: needsHorizontalScroll ? 'auto' : 'hidden',\n overflowY: 'hidden'\n }}>\n <svg ref={svgRef} width={calculatedChartWidth} height={height} viewBox={`0 0 ${calculatedChartWidth} ${height}`} />\n </div>\n );\n};\n\nexport default BarChart;\n"],"names":["wrapText","textSelection","width","each","text","d3.select","this","originalText","length","substring","words","split","reverse","word","line","lineNumber","y","attr","dy","parseFloat","tspan","append","pop","push","join","node","getComputedTextLength","data","numOfLines","initialWidth","height","yAxisLabelType","currency","customLabelFormatter","svgRef","useRef","wrapperRef","containerWidth","setContainerWidth","useState","maxValue","useMemo","Math","max","map","d","value","yAxisMaxValue","yAxisTicks","ticks","interval","i","needsHorizontalScroll","calculatedChartWidth","useEffect","wrapper","current","resizeObserver","ResizeObserver","entries","newWidth","contentRect","observe","unobserve","svg","selectAll","remove","margin","maxLabelWidth","barWidth","barHeight","x","d3.scaleBand","domain","label","range","padding","d3.scaleLinear","chart","slice","forEach","tick","style","enter","bandwidth","color","xAxis","call","d3.axisTop","tickPadding","d3.axisBottom","availableHeight","maxOptimalTicks","floor","optimalNumTicks","min","optimalTicks","optimalInterval","yAxis","d3.axisLeft","tickValues","tickFormat","num","symbol","labelType","d3.format","replace","toString","tickSizeOuter","select","jsx","ref","overflowX","overflowY","children","viewBox"],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState, useEffect } from "react";
|
|
3
|
+
import { Typography } from "../../../typography/typography/index.esm.js";
|
|
4
|
+
/* empty css */
|
|
5
|
+
import max from "../../../../node_modules/d3-array/src/max/index.esm.js";
|
|
6
|
+
import min from "../../../../node_modules/d3-array/src/min/index.esm.js";
|
|
7
|
+
import band from "../../../../node_modules/d3-scale/src/band/index.esm.js";
|
|
8
|
+
import linear from "../../../../node_modules/d3-scale/src/linear/index.esm.js";
|
|
9
|
+
import Box from "../../../../node_modules/@mui/material/Box/Box/index.esm.js";
|
|
10
|
+
import select from "../../../../node_modules/d3-selection/src/select/index.esm.js";
|
|
11
|
+
import { axisLeft, axisBottom } from "../../../../node_modules/d3-axis/src/axis/index.esm.js";
|
|
12
|
+
import { format } from "../../../../node_modules/d3-format/src/defaultLocale/index.esm.js";
|
|
13
|
+
import pointer from "../../../../node_modules/d3-selection/src/pointer/index.esm.js";
|
|
14
|
+
import line from "../../../../node_modules/d3-shape/src/line/index.esm.js";
|
|
15
|
+
import { monotoneX } from "../../../../node_modules/d3-shape/src/curve/monotone/index.esm.js";
|
|
16
|
+
const BarLineChart = ({
|
|
17
|
+
data,
|
|
18
|
+
height = 400,
|
|
19
|
+
margin = { top: 20, right: 30, bottom: 30, left: 50 },
|
|
20
|
+
bars,
|
|
21
|
+
lines,
|
|
22
|
+
line: line$1 = true,
|
|
23
|
+
showGrid = true,
|
|
24
|
+
barColors,
|
|
25
|
+
lineColors
|
|
26
|
+
}) => {
|
|
27
|
+
var _a;
|
|
28
|
+
const svgRef = useRef(null);
|
|
29
|
+
const wrapperRef = useRef(null);
|
|
30
|
+
const scrollContainerRef = useRef(null);
|
|
31
|
+
const [tooltip, setTooltip] = useState(null);
|
|
32
|
+
const [containerWidth, setContainerWidth] = useState(0);
|
|
33
|
+
const formatNumber = (num) => format(".2s")(num).replace("k", "K");
|
|
34
|
+
const needsHorizontalScroll = data.length > bars.length;
|
|
35
|
+
const minBarWidth = 60;
|
|
36
|
+
const calculatedChartWidth = needsHorizontalScroll ? Math.max(data.length * minBarWidth, containerWidth) : containerWidth;
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const wrapper = wrapperRef.current;
|
|
39
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
40
|
+
if (entries[0]) {
|
|
41
|
+
const newWidth = entries[0].contentRect.width;
|
|
42
|
+
setContainerWidth(newWidth);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (wrapper) {
|
|
46
|
+
resizeObserver.observe(wrapper);
|
|
47
|
+
}
|
|
48
|
+
return () => {
|
|
49
|
+
if (wrapper) {
|
|
50
|
+
resizeObserver.unobserve(wrapper);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}, []);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (containerWidth === 0) return;
|
|
56
|
+
const yMax = max(data, (d) => {
|
|
57
|
+
return Math.max(
|
|
58
|
+
...bars.map((bar) => d[bar.field]),
|
|
59
|
+
...lines.map((line2) => d[line2.field])
|
|
60
|
+
);
|
|
61
|
+
}) ?? 0;
|
|
62
|
+
const yMin = min(data, (d) => {
|
|
63
|
+
return Math.min(
|
|
64
|
+
...bars.map((bar) => d[bar.field]),
|
|
65
|
+
...lines.map((line2) => d[line2.field])
|
|
66
|
+
);
|
|
67
|
+
}) ?? 0;
|
|
68
|
+
const svg = select(svgRef.current);
|
|
69
|
+
const innerWidth = calculatedChartWidth - margin.left - margin.right;
|
|
70
|
+
const innerHeight = yMax || yMin ? height - margin.top - margin.bottom : 0;
|
|
71
|
+
const x = band().domain(data.map((d) => d.month)).range([0, innerWidth]).padding(0.3);
|
|
72
|
+
const y = linear().domain([yMin, yMax]).nice().range([innerHeight, 0]);
|
|
73
|
+
svg.selectAll("*").remove();
|
|
74
|
+
const g = svg.append("g").attr("transform", `translate(${margin.left},${margin.top})`);
|
|
75
|
+
const yAxis = g.append("g").call(axisLeft(y).tickFormat(formatNumber)).call((g2) => g2.select(".domain").remove());
|
|
76
|
+
yAxis.select(".domain").attr("stroke", "none");
|
|
77
|
+
const xAxis = g.append("g").attr("transform", `translate(0,${innerHeight})`).call(axisBottom(x)).selectAll(".tick text").attr("text-anchor", "middle");
|
|
78
|
+
xAxis.select(".domain").attr("stroke", "none");
|
|
79
|
+
if (showGrid) {
|
|
80
|
+
g.selectAll(".grid-line").data(y.ticks()).enter().append("line").attr("class", "grid-line").attr("x1", 0).attr("x2", innerWidth).attr("y1", (d) => y(d)).attr("y2", (d) => y(d)).style("stroke", "#ddd").style("stroke-dasharray", "8,8").style("stroke-width", 1);
|
|
81
|
+
}
|
|
82
|
+
if (line$1) {
|
|
83
|
+
g.selectAll(".grid-line-2").data(y.ticks()).enter().append("line").attr("class", "grid-line-2").attr("x1", 0).attr("x2", innerWidth).attr("y1", (d) => y(d)).attr("y2", (d) => y(d)).style("stroke", "#ddd").style("stroke-dasharray", "8,8").style("stroke-width", 1);
|
|
84
|
+
}
|
|
85
|
+
bars.forEach((bar, i) => {
|
|
86
|
+
g.selectAll(`.bar-${bar.field}`).data(data).enter().append("rect").attr("class", `bar bar-${bar.field}`).attr("x", (d) => x(d.month) ?? 0).attr("y", (d) => d[bar.field] >= 0 ? y(d[bar.field]) : y(0)).attr("rx", 5).attr("ry", 5).attr("width", x.bandwidth() / bars.length).attr("height", (d) => {
|
|
87
|
+
return Math.abs(y(d[bar.field]) - y(0));
|
|
88
|
+
}).attr("fill", barColors[i]).attr("transform", `translate(${i * x.bandwidth() / bars.length}, 0)`).on("mouseover", function(event, d) {
|
|
89
|
+
var _a2;
|
|
90
|
+
const [xPos, yPos] = pointer(event, svgRef.current);
|
|
91
|
+
const scrollLeft = ((_a2 = scrollContainerRef.current) == null ? void 0 : _a2.scrollLeft) || 0;
|
|
92
|
+
setTooltip({
|
|
93
|
+
x: xPos + margin.left - scrollLeft,
|
|
94
|
+
y: yPos + margin.top,
|
|
95
|
+
content: d
|
|
96
|
+
});
|
|
97
|
+
}).on("mouseout", () => setTooltip(null));
|
|
98
|
+
});
|
|
99
|
+
lines.forEach((line2, index) => {
|
|
100
|
+
const lineGenerator = line().x((d) => (x(d.month) ?? 0) + x.bandwidth() / 2).y((d) => y(d[line2.field])).curve(monotoneX);
|
|
101
|
+
g.append("path").datum(data).attr("fill", "none").attr("stroke", lineColors[index]).attr("stroke-width", 2).attr("d", lineGenerator).on("mouseover", function(event) {
|
|
102
|
+
var _a2;
|
|
103
|
+
const [xPos] = pointer(event, svgRef.current);
|
|
104
|
+
const month = x.domain().find((month2) => {
|
|
105
|
+
const monthPosition = x(month2) ?? 0;
|
|
106
|
+
return xPos >= monthPosition && xPos <= monthPosition + x.bandwidth();
|
|
107
|
+
});
|
|
108
|
+
if (month) {
|
|
109
|
+
const closestDataPoint = data.find((d) => d.month === month);
|
|
110
|
+
if (closestDataPoint) {
|
|
111
|
+
const scrollLeft = ((_a2 = scrollContainerRef.current) == null ? void 0 : _a2.scrollLeft) || 0;
|
|
112
|
+
setTooltip({
|
|
113
|
+
x: xPos + margin.left - scrollLeft,
|
|
114
|
+
y: y(closestDataPoint[line2.field]) + margin.top,
|
|
115
|
+
content: closestDataPoint
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}).on("mouseout", () => setTooltip(null));
|
|
120
|
+
});
|
|
121
|
+
}, [data, containerWidth, calculatedChartWidth, line$1, height, margin, bars, lines, showGrid, barColors, lineColors]);
|
|
122
|
+
return /* @__PURE__ */ jsx("div", { ref: wrapperRef, style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
|
|
123
|
+
/* @__PURE__ */ jsx(
|
|
124
|
+
"div",
|
|
125
|
+
{
|
|
126
|
+
ref: scrollContainerRef,
|
|
127
|
+
style: {
|
|
128
|
+
width: "100%",
|
|
129
|
+
overflowX: needsHorizontalScroll ? "auto" : "hidden",
|
|
130
|
+
overflowY: "hidden"
|
|
131
|
+
},
|
|
132
|
+
children: /* @__PURE__ */ jsx(
|
|
133
|
+
"svg",
|
|
134
|
+
{
|
|
135
|
+
ref: svgRef,
|
|
136
|
+
width: calculatedChartWidth,
|
|
137
|
+
height,
|
|
138
|
+
viewBox: `0 0 ${calculatedChartWidth} ${height}`,
|
|
139
|
+
style: { display: "block" }
|
|
140
|
+
}
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
tooltip && /* @__PURE__ */ jsx(
|
|
145
|
+
"div",
|
|
146
|
+
{
|
|
147
|
+
style: {
|
|
148
|
+
position: "absolute",
|
|
149
|
+
left: tooltip.x,
|
|
150
|
+
top: tooltip.y,
|
|
151
|
+
pointerEvents: "none",
|
|
152
|
+
backgroundColor: "white",
|
|
153
|
+
zIndex: "99999",
|
|
154
|
+
border: "none",
|
|
155
|
+
padding: "5px",
|
|
156
|
+
borderRadius: "3px",
|
|
157
|
+
transform: "translate(-50%, -100%)"
|
|
158
|
+
},
|
|
159
|
+
children: /* @__PURE__ */ jsxs(Box, { children: [
|
|
160
|
+
/* @__PURE__ */ jsx("div", { style: { background: "#F3F2F2", padding: "10px" }, children: /* @__PURE__ */ jsx(Typography, { type: "s4", style: { whiteSpace: "noWrap", width: "200px", color: "#232529" }, children: (_a = tooltip.content) == null ? void 0 : _a.month }) }),
|
|
161
|
+
/* @__PURE__ */ jsxs(Box, { sx: { p: 1.5, display: "flex", flexDirection: "column", gap: 1.5 }, children: [
|
|
162
|
+
bars.map((bar, index) => /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 1.5, alignItems: "center" }, children: [
|
|
163
|
+
/* @__PURE__ */ jsx("div", { className: "circle", style: { backgroundColor: barColors[index] } }),
|
|
164
|
+
/* @__PURE__ */ jsxs(Typography, { type: "s5", color: "theme.secondary.900", children: [
|
|
165
|
+
bar.label,
|
|
166
|
+
": ",
|
|
167
|
+
/* @__PURE__ */ jsxs("span", { style: { fontWeight: 600 }, children: [
|
|
168
|
+
"$ ",
|
|
169
|
+
tooltip.content[bar.field]
|
|
170
|
+
] })
|
|
171
|
+
] })
|
|
172
|
+
] }, `bar-${index}`)),
|
|
173
|
+
lines.map((line2, index) => /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 1.5, alignItems: "center" }, children: [
|
|
174
|
+
/* @__PURE__ */ jsx("div", { className: "circle", style: { backgroundColor: lineColors[index] } }),
|
|
175
|
+
/* @__PURE__ */ jsxs(Typography, { type: "s5", color: "theme.secondary.900", children: [
|
|
176
|
+
line2.label,
|
|
177
|
+
": ",
|
|
178
|
+
/* @__PURE__ */ jsxs("span", { style: { fontWeight: 600 }, children: [
|
|
179
|
+
"$ ",
|
|
180
|
+
tooltip.content[line2.field]
|
|
181
|
+
] })
|
|
182
|
+
] })
|
|
183
|
+
] }, `line-${index}`))
|
|
184
|
+
] })
|
|
185
|
+
] })
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
] }) });
|
|
189
|
+
};
|
|
190
|
+
export {
|
|
191
|
+
BarLineChart as default
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=index.esm.js.map
|