@economic/taco 8.1.1 → 8.1.2-EC-71727-update-tanstack-virtual.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -71,7 +71,7 @@ function BarLineChart(props) {
71
71
  /* @__PURE__ */ React.createElement(RechartsPrimitive__namespace.YAxis, { ...common.getAxisProps("y", props) }),
72
72
  BarChart.renderBars(barShapes, showLabels, stacked, false),
73
73
  LineChart.renderLines(lineShapes, showDots, lineType)
74
- )), showLegend ? /* @__PURE__ */ React.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React.createElement("div", { className: "[&>div]:!w-auto" }, /* @__PURE__ */ React.createElement(Legend.Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }))) : null);
74
+ )), showLegend ? /* @__PURE__ */ React.createElement(Legend.Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }) : null);
75
75
  }
76
76
  function Bar(_) {
77
77
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"BarLineChart.cjs","sources":["../../../../src/charts/components/Composed/BarLineChart.tsx"],"sourcesContent":["import React from 'react';\nimport * as RechartsPrimitive from 'recharts';\nimport { clsx } from 'clsx';\nimport { getAxisProps, stripCartesianProps } from '../../utils/common';\nimport { ChartChildProps, CartesianChartProps, CurveType } from '../types';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { Tooltip } from '../Tooltip';\nimport { Legend } from '../Legend';\nimport { useChart } from '../useChartData';\nimport { renderBars } from '../Bar/BarChart';\nimport { renderLines } from '../Line/LineChart';\n\nexport interface BarLineChartProps<TData extends object> extends CartesianChartProps<TData> {\n /** Show bar values as labels next to/inside the bar\n * @default false\n */\n showLabels?: boolean;\n /** Stack bars on top of one another, instead of next to each other. 'expand' fills the available space\n * @default false\n */\n stacked?: boolean | 'expand';\n /** Show dots for each data point on lines\n * @default false\n */\n showDots?: boolean;\n /** Interpolation type of the line\n * @default linear\n */\n lineType?: CurveType;\n}\n\nexport function BarLineChart<TData extends object>(props: BarLineChartProps<TData>) {\n const {\n children,\n className: customClassName,\n data,\n showLabels = false,\n showLegend = false,\n stacked = false,\n showDots = false,\n lineType = 'linear',\n tooltipTitle,\n ...attributes\n } = stripCartesianProps<BarLineChartProps<TData>>(props);\n\n const className = clsx('relative aspect-video', { 'pb-8': showLegend }, customClassName);\n const { items, shapes, activeIndex, setActiveIndex, toggleItem } = useChart<TData>(children);\n\n // Separate bars and lines based on child component type to identify bar dataKeys\n const barChildren = React.Children.toArray(children).filter(child => React.isValidElement(child) && child.type === Bar);\n // Apply same fallback as useChart: dataKey ?? label\n const barDataKeys = new Set(\n barChildren\n .filter(child => React.isValidElement<ChartChildProps<TData>>(child))\n .map(child => {\n const props = (child as React.ReactElement<ChartChildProps<TData>>).props;\n return props.dataKey ?? props.label;\n })\n );\n\n // Filter shapes from the main useChart call in order to ensure we are not rendering bars or lines that are currently hidden.\n const barShapes = shapes.filter(shape => barDataKeys.has(shape.dataKey as keyof TData & string));\n const lineShapes = shapes.filter(shape => !barDataKeys.has(shape.dataKey as keyof TData & string));\n\n return (\n <div className={className} data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className=\"h-full w-full\" data-taco=\"chart-bar-line\">\n <RechartsPrimitive.ComposedChart\n data={data}\n barCategoryGap=\"15%\"\n barGap=\"7.5%\"\n margin={{\n bottom: 0,\n left: 4,\n right: 4,\n top: 10,\n }}\n stackOffset={stacked === 'expand' ? 'expand' : undefined}>\n <RechartsPrimitive.CartesianGrid vertical={false} />\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.XAxis {...getAxisProps('x', props)} />\n <RechartsPrimitive.YAxis {...getAxisProps('y', props)} />\n {renderBars(barShapes, showLabels, stacked, false)}\n {renderLines(lineShapes, showDots, lineType)}\n </RechartsPrimitive.ComposedChart>\n </ChartWrapper>\n {showLegend ? (\n <div className=\"flex justify-center\">\n <div className=\"[&>div]:!w-auto\">\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartBarProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Bar<TData extends object>(_: BarLineChartBarProps<TData>): JSX.Element | null {\n return null;\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartLineProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Line<TData extends object>(_: BarLineChartLineProps<TData>): JSX.Element | null {\n return null;\n}\n\n// Attach the marker components to BarLineChart\nBarLineChart.Bar = Bar;\nBarLineChart.Line = Line;\n"],"names":["stripCartesianProps","clsx","useChart","props","ChartWrapper","RechartsPrimitive","Tooltip","getAxisProps","renderBars","renderLines","Legend"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,SAAS,aAAmC,OAAiC;AAC1E,QAAA;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EAAA,IACHA,OAAAA,oBAA8C,KAAK;AAEvD,QAAM,YAAYC,GAAAA,KAAK,yBAAyB,EAAE,QAAQ,cAAc,eAAe;AACjF,QAAA,EAAE,OAAO,QAAQ,aAAa,gBAAgB,WAAW,IAAIC,sBAAgB,QAAQ;AAG3F,QAAM,cAAc,MAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,CAAS,UAAA,MAAM,eAAe,KAAK,KAAK,MAAM,SAAS,GAAG;AAEtH,QAAM,cAAc,IAAI;AAAA,IACpB,YACK,OAAO,CAAS,UAAA,MAAM,eAAuC,KAAK,CAAC,EACnE,IAAI,CAAS,UAAA;AACV,YAAMC,SAAS,MAAqD;AAC7DA,aAAAA,OAAM,WAAWA,OAAM;AAAA,IACjC,CAAA;AAAA,EACT;AAGM,QAAA,YAAY,OAAO,OAAO,CAAA,UAAS,YAAY,IAAI,MAAM,OAA+B,CAAC;AACzF,QAAA,aAAa,OAAO,OAAO,CAAA,UAAS,CAAC,YAAY,IAAI,MAAM,OAA+B,CAAC;AAEjG,SACK,sBAAA,cAAA,OAAA,EAAI,WAAsB,aAAU,gBACjC,GAAA,sBAAA,cAACC,aAAAA,cAAc,EAAA,GAAG,YAAY,WAAU,iBAAgB,aAAU,iBAC9D,GAAA,sBAAA;AAAA,IAACC,6BAAkB;AAAA,IAAlB;AAAA,MACG;AAAA,MACA,gBAAe;AAAA,MACf,QAAO;AAAA,MACP,QAAQ;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACT;AAAA,MACA,aAAa,YAAY,WAAW,WAAW;AAAA,IAAA;AAAA,IAC9C,sBAAA,cAAAA,6BAAkB,eAAlB,EAAgC,UAAU,OAAO;AAAA,IAClD,sBAAA,cAACA,6BAAkB,SAAlB,EAA0B,SAAU,sBAAA,cAAAC,QAAA,SAAA,EAAQ,OAAO,aAAA,CAAc,EAAI,CAAA;AAAA,IACtE,sBAAA,cAACD,6BAAkB,OAAlB,EAAyB,GAAGE,oBAAa,KAAK,KAAK,GAAG;AAAA,IACvD,sBAAA,cAACF,6BAAkB,OAAlB,EAAyB,GAAGE,oBAAa,KAAK,KAAK,GAAG;AAAA,IACtDC,SAAAA,WAAW,WAAW,YAAY,SAAS,KAAK;AAAA,IAChDC,sBAAY,YAAY,UAAU,QAAQ;AAAA,EAEnD,CAAA,GACC,aACG,sBAAA,cAAC,SAAI,WAAU,sBAAA,GACV,sBAAA,cAAA,OAAA,EAAI,WAAU,kBAAA,uCACVC,OAAc,QAAA,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAY,CAAA,CACzG,CACJ,IACA,IACR;AAER;AAKA,SAAS,IAA0B,GAAoD;AAC5E,SAAA;AACX;AAKA,SAAS,KAA2B,GAAqD;AAC9E,SAAA;AACX;AAGA,aAAa,MAAM;AACnB,aAAa,OAAO;;"}
1
+ {"version":3,"file":"BarLineChart.cjs","sources":["../../../../src/charts/components/Composed/BarLineChart.tsx"],"sourcesContent":["import React from 'react';\nimport * as RechartsPrimitive from 'recharts';\nimport { clsx } from 'clsx';\nimport { getAxisProps, stripCartesianProps } from '../../utils/common';\nimport { ChartChildProps, CartesianChartProps, CurveType } from '../types';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { Tooltip } from '../Tooltip';\nimport { Legend } from '../Legend';\nimport { useChart } from '../useChartData';\nimport { renderBars } from '../Bar/BarChart';\nimport { renderLines } from '../Line/LineChart';\n\nexport interface BarLineChartProps<TData extends object> extends CartesianChartProps<TData> {\n /** Show bar values as labels next to/inside the bar\n * @default false\n */\n showLabels?: boolean;\n /** Stack bars on top of one another, instead of next to each other. 'expand' fills the available space\n * @default false\n */\n stacked?: boolean | 'expand';\n /** Show dots for each data point on lines\n * @default false\n */\n showDots?: boolean;\n /** Interpolation type of the line\n * @default linear\n */\n lineType?: CurveType;\n}\n\nexport function BarLineChart<TData extends object>(props: BarLineChartProps<TData>) {\n const {\n children,\n className: customClassName,\n data,\n showLabels = false,\n showLegend = false,\n stacked = false,\n showDots = false,\n lineType = 'linear',\n tooltipTitle,\n ...attributes\n } = stripCartesianProps<BarLineChartProps<TData>>(props);\n\n const className = clsx('relative aspect-video', { 'pb-8': showLegend }, customClassName);\n const { items, shapes, activeIndex, setActiveIndex, toggleItem } = useChart<TData>(children);\n\n // Separate bars and lines based on child component type to identify bar dataKeys\n const barChildren = React.Children.toArray(children).filter(child => React.isValidElement(child) && child.type === Bar);\n // Apply same fallback as useChart: dataKey ?? label\n const barDataKeys = new Set(\n barChildren\n .filter(child => React.isValidElement<ChartChildProps<TData>>(child))\n .map(child => {\n const props = (child as React.ReactElement<ChartChildProps<TData>>).props;\n return props.dataKey ?? props.label;\n })\n );\n\n // Filter shapes from the main useChart call in order to ensure we are not rendering bars or lines that are currently hidden.\n const barShapes = shapes.filter(shape => barDataKeys.has(shape.dataKey as keyof TData & string));\n const lineShapes = shapes.filter(shape => !barDataKeys.has(shape.dataKey as keyof TData & string));\n\n return (\n <div className={className} data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className=\"h-full w-full\" data-taco=\"chart-bar-line\">\n <RechartsPrimitive.ComposedChart\n data={data}\n barCategoryGap=\"15%\"\n barGap=\"7.5%\"\n margin={{\n bottom: 0,\n left: 4,\n right: 4,\n top: 10,\n }}\n stackOffset={stacked === 'expand' ? 'expand' : undefined}>\n <RechartsPrimitive.CartesianGrid vertical={false} />\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.XAxis {...getAxisProps('x', props)} />\n <RechartsPrimitive.YAxis {...getAxisProps('y', props)} />\n {renderBars(barShapes, showLabels, stacked, false)}\n {renderLines(lineShapes, showDots, lineType)}\n </RechartsPrimitive.ComposedChart>\n </ChartWrapper>\n {showLegend ? (\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartBarProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Bar<TData extends object>(_: BarLineChartBarProps<TData>): JSX.Element | null {\n return null;\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartLineProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Line<TData extends object>(_: BarLineChartLineProps<TData>): JSX.Element | null {\n return null;\n}\n\n// Attach the marker components to BarLineChart\nBarLineChart.Bar = Bar;\nBarLineChart.Line = Line;\n"],"names":["stripCartesianProps","clsx","useChart","props","ChartWrapper","RechartsPrimitive","Tooltip","getAxisProps","renderBars","renderLines","Legend"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,SAAS,aAAmC,OAAiC;AAC1E,QAAA;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EAAA,IACHA,OAAAA,oBAA8C,KAAK;AAEvD,QAAM,YAAYC,GAAAA,KAAK,yBAAyB,EAAE,QAAQ,cAAc,eAAe;AACjF,QAAA,EAAE,OAAO,QAAQ,aAAa,gBAAgB,WAAW,IAAIC,sBAAgB,QAAQ;AAG3F,QAAM,cAAc,MAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,CAAS,UAAA,MAAM,eAAe,KAAK,KAAK,MAAM,SAAS,GAAG;AAEtH,QAAM,cAAc,IAAI;AAAA,IACpB,YACK,OAAO,CAAS,UAAA,MAAM,eAAuC,KAAK,CAAC,EACnE,IAAI,CAAS,UAAA;AACV,YAAMC,SAAS,MAAqD;AAC7DA,aAAAA,OAAM,WAAWA,OAAM;AAAA,IACjC,CAAA;AAAA,EACT;AAGM,QAAA,YAAY,OAAO,OAAO,CAAA,UAAS,YAAY,IAAI,MAAM,OAA+B,CAAC;AACzF,QAAA,aAAa,OAAO,OAAO,CAAA,UAAS,CAAC,YAAY,IAAI,MAAM,OAA+B,CAAC;AAEjG,SACK,sBAAA,cAAA,OAAA,EAAI,WAAsB,aAAU,gBACjC,GAAA,sBAAA,cAACC,aAAAA,cAAc,EAAA,GAAG,YAAY,WAAU,iBAAgB,aAAU,iBAC9D,GAAA,sBAAA;AAAA,IAACC,6BAAkB;AAAA,IAAlB;AAAA,MACG;AAAA,MACA,gBAAe;AAAA,MACf,QAAO;AAAA,MACP,QAAQ;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACT;AAAA,MACA,aAAa,YAAY,WAAW,WAAW;AAAA,IAAA;AAAA,IAC9C,sBAAA,cAAAA,6BAAkB,eAAlB,EAAgC,UAAU,OAAO;AAAA,IAClD,sBAAA,cAACA,6BAAkB,SAAlB,EAA0B,SAAU,sBAAA,cAAAC,QAAA,SAAA,EAAQ,OAAO,aAAA,CAAc,EAAI,CAAA;AAAA,IACtE,sBAAA,cAACD,6BAAkB,OAAlB,EAAyB,GAAGE,oBAAa,KAAK,KAAK,GAAG;AAAA,IACvD,sBAAA,cAACF,6BAAkB,OAAlB,EAAyB,GAAGE,oBAAa,KAAK,KAAK,GAAG;AAAA,IACtDC,SAAAA,WAAW,WAAW,YAAY,SAAS,KAAK;AAAA,IAChDC,sBAAY,YAAY,UAAU,QAAQ;AAAA,EAAA,CAEnD,GACC,aACG,sBAAA,cAACC,OAAc,QAAA,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAY,CAAA,IACrG,IACR;AAER;AAKA,SAAS,IAA0B,GAAoD;AAC5E,SAAA;AACX;AAKA,SAAS,KAA2B,GAAqD;AAC9E,SAAA;AACX;AAGA,aAAa,MAAM;AACnB,aAAa,OAAO;;"}
@@ -52,7 +52,7 @@ function BarLineChart(props) {
52
52
  /* @__PURE__ */ React__default.createElement(RechartsPrimitive.YAxis, { ...getAxisProps("y", props) }),
53
53
  renderBars(barShapes, showLabels, stacked, false),
54
54
  renderLines(lineShapes, showDots, lineType)
55
- )), showLegend ? /* @__PURE__ */ React__default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React__default.createElement("div", { className: "[&>div]:!w-auto" }, /* @__PURE__ */ React__default.createElement(Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }))) : null);
55
+ )), showLegend ? /* @__PURE__ */ React__default.createElement(Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }) : null);
56
56
  }
57
57
  function Bar(_) {
58
58
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"BarLineChart.js","sources":["../../../../src/charts/components/Composed/BarLineChart.tsx"],"sourcesContent":["import React from 'react';\nimport * as RechartsPrimitive from 'recharts';\nimport { clsx } from 'clsx';\nimport { getAxisProps, stripCartesianProps } from '../../utils/common';\nimport { ChartChildProps, CartesianChartProps, CurveType } from '../types';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { Tooltip } from '../Tooltip';\nimport { Legend } from '../Legend';\nimport { useChart } from '../useChartData';\nimport { renderBars } from '../Bar/BarChart';\nimport { renderLines } from '../Line/LineChart';\n\nexport interface BarLineChartProps<TData extends object> extends CartesianChartProps<TData> {\n /** Show bar values as labels next to/inside the bar\n * @default false\n */\n showLabels?: boolean;\n /** Stack bars on top of one another, instead of next to each other. 'expand' fills the available space\n * @default false\n */\n stacked?: boolean | 'expand';\n /** Show dots for each data point on lines\n * @default false\n */\n showDots?: boolean;\n /** Interpolation type of the line\n * @default linear\n */\n lineType?: CurveType;\n}\n\nexport function BarLineChart<TData extends object>(props: BarLineChartProps<TData>) {\n const {\n children,\n className: customClassName,\n data,\n showLabels = false,\n showLegend = false,\n stacked = false,\n showDots = false,\n lineType = 'linear',\n tooltipTitle,\n ...attributes\n } = stripCartesianProps<BarLineChartProps<TData>>(props);\n\n const className = clsx('relative aspect-video', { 'pb-8': showLegend }, customClassName);\n const { items, shapes, activeIndex, setActiveIndex, toggleItem } = useChart<TData>(children);\n\n // Separate bars and lines based on child component type to identify bar dataKeys\n const barChildren = React.Children.toArray(children).filter(child => React.isValidElement(child) && child.type === Bar);\n // Apply same fallback as useChart: dataKey ?? label\n const barDataKeys = new Set(\n barChildren\n .filter(child => React.isValidElement<ChartChildProps<TData>>(child))\n .map(child => {\n const props = (child as React.ReactElement<ChartChildProps<TData>>).props;\n return props.dataKey ?? props.label;\n })\n );\n\n // Filter shapes from the main useChart call in order to ensure we are not rendering bars or lines that are currently hidden.\n const barShapes = shapes.filter(shape => barDataKeys.has(shape.dataKey as keyof TData & string));\n const lineShapes = shapes.filter(shape => !barDataKeys.has(shape.dataKey as keyof TData & string));\n\n return (\n <div className={className} data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className=\"h-full w-full\" data-taco=\"chart-bar-line\">\n <RechartsPrimitive.ComposedChart\n data={data}\n barCategoryGap=\"15%\"\n barGap=\"7.5%\"\n margin={{\n bottom: 0,\n left: 4,\n right: 4,\n top: 10,\n }}\n stackOffset={stacked === 'expand' ? 'expand' : undefined}>\n <RechartsPrimitive.CartesianGrid vertical={false} />\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.XAxis {...getAxisProps('x', props)} />\n <RechartsPrimitive.YAxis {...getAxisProps('y', props)} />\n {renderBars(barShapes, showLabels, stacked, false)}\n {renderLines(lineShapes, showDots, lineType)}\n </RechartsPrimitive.ComposedChart>\n </ChartWrapper>\n {showLegend ? (\n <div className=\"flex justify-center\">\n <div className=\"[&>div]:!w-auto\">\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartBarProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Bar<TData extends object>(_: BarLineChartBarProps<TData>): JSX.Element | null {\n return null;\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartLineProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Line<TData extends object>(_: BarLineChartLineProps<TData>): JSX.Element | null {\n return null;\n}\n\n// Attach the marker components to BarLineChart\nBarLineChart.Bar = Bar;\nBarLineChart.Line = Line;\n"],"names":["React","props"],"mappings":";;;;;;;;;;AA+BO,SAAS,aAAmC,OAAiC;AAC1E,QAAA;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EAAA,IACH,oBAA8C,KAAK;AAEvD,QAAM,YAAY,KAAK,yBAAyB,EAAE,QAAQ,cAAc,eAAe;AACjF,QAAA,EAAE,OAAO,QAAQ,aAAa,gBAAgB,WAAW,IAAI,SAAgB,QAAQ;AAG3F,QAAM,cAAcA,eAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,CAAS,UAAAA,eAAM,eAAe,KAAK,KAAK,MAAM,SAAS,GAAG;AAEtH,QAAM,cAAc,IAAI;AAAA,IACpB,YACK,OAAO,CAAS,UAAAA,eAAM,eAAuC,KAAK,CAAC,EACnE,IAAI,CAAS,UAAA;AACV,YAAMC,SAAS,MAAqD;AAC7DA,aAAAA,OAAM,WAAWA,OAAM;AAAA,IACjC,CAAA;AAAA,EACT;AAGM,QAAA,YAAY,OAAO,OAAO,CAAA,UAAS,YAAY,IAAI,MAAM,OAA+B,CAAC;AACzF,QAAA,aAAa,OAAO,OAAO,CAAA,UAAS,CAAC,YAAY,IAAI,MAAM,OAA+B,CAAC;AAEjG,SACKD,+BAAA,cAAA,OAAA,EAAI,WAAsB,aAAU,gBACjC,GAAAA,+BAAA,cAAC,cAAc,EAAA,GAAG,YAAY,WAAU,iBAAgB,aAAU,iBAC9D,GAAAA,+BAAA;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACG;AAAA,MACA,gBAAe;AAAA,MACf,QAAO;AAAA,MACP,QAAQ;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACT;AAAA,MACA,aAAa,YAAY,WAAW,WAAW;AAAA,IAAA;AAAA,IAC9CA,+BAAA,cAAA,kBAAkB,eAAlB,EAAgC,UAAU,OAAO;AAAA,IAClDA,+BAAA,cAAC,kBAAkB,SAAlB,EAA0B,SAAUA,+BAAA,cAAA,SAAA,EAAQ,OAAO,aAAA,CAAc,EAAI,CAAA;AAAA,IACtEA,+BAAA,cAAC,kBAAkB,OAAlB,EAAyB,GAAG,aAAa,KAAK,KAAK,GAAG;AAAA,IACvDA,+BAAA,cAAC,kBAAkB,OAAlB,EAAyB,GAAG,aAAa,KAAK,KAAK,GAAG;AAAA,IACtD,WAAW,WAAW,YAAY,SAAS,KAAK;AAAA,IAChD,YAAY,YAAY,UAAU,QAAQ;AAAA,EAEnD,CAAA,GACC,aACGA,+BAAA,cAAC,SAAI,WAAU,sBAAA,GACVA,+BAAA,cAAA,OAAA,EAAI,WAAU,kBAAA,gDACV,QAAc,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAY,CAAA,CACzG,CACJ,IACA,IACR;AAER;AAKA,SAAS,IAA0B,GAAoD;AAC5E,SAAA;AACX;AAKA,SAAS,KAA2B,GAAqD;AAC9E,SAAA;AACX;AAGA,aAAa,MAAM;AACnB,aAAa,OAAO;"}
1
+ {"version":3,"file":"BarLineChart.js","sources":["../../../../src/charts/components/Composed/BarLineChart.tsx"],"sourcesContent":["import React from 'react';\nimport * as RechartsPrimitive from 'recharts';\nimport { clsx } from 'clsx';\nimport { getAxisProps, stripCartesianProps } from '../../utils/common';\nimport { ChartChildProps, CartesianChartProps, CurveType } from '../types';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { Tooltip } from '../Tooltip';\nimport { Legend } from '../Legend';\nimport { useChart } from '../useChartData';\nimport { renderBars } from '../Bar/BarChart';\nimport { renderLines } from '../Line/LineChart';\n\nexport interface BarLineChartProps<TData extends object> extends CartesianChartProps<TData> {\n /** Show bar values as labels next to/inside the bar\n * @default false\n */\n showLabels?: boolean;\n /** Stack bars on top of one another, instead of next to each other. 'expand' fills the available space\n * @default false\n */\n stacked?: boolean | 'expand';\n /** Show dots for each data point on lines\n * @default false\n */\n showDots?: boolean;\n /** Interpolation type of the line\n * @default linear\n */\n lineType?: CurveType;\n}\n\nexport function BarLineChart<TData extends object>(props: BarLineChartProps<TData>) {\n const {\n children,\n className: customClassName,\n data,\n showLabels = false,\n showLegend = false,\n stacked = false,\n showDots = false,\n lineType = 'linear',\n tooltipTitle,\n ...attributes\n } = stripCartesianProps<BarLineChartProps<TData>>(props);\n\n const className = clsx('relative aspect-video', { 'pb-8': showLegend }, customClassName);\n const { items, shapes, activeIndex, setActiveIndex, toggleItem } = useChart<TData>(children);\n\n // Separate bars and lines based on child component type to identify bar dataKeys\n const barChildren = React.Children.toArray(children).filter(child => React.isValidElement(child) && child.type === Bar);\n // Apply same fallback as useChart: dataKey ?? label\n const barDataKeys = new Set(\n barChildren\n .filter(child => React.isValidElement<ChartChildProps<TData>>(child))\n .map(child => {\n const props = (child as React.ReactElement<ChartChildProps<TData>>).props;\n return props.dataKey ?? props.label;\n })\n );\n\n // Filter shapes from the main useChart call in order to ensure we are not rendering bars or lines that are currently hidden.\n const barShapes = shapes.filter(shape => barDataKeys.has(shape.dataKey as keyof TData & string));\n const lineShapes = shapes.filter(shape => !barDataKeys.has(shape.dataKey as keyof TData & string));\n\n return (\n <div className={className} data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className=\"h-full w-full\" data-taco=\"chart-bar-line\">\n <RechartsPrimitive.ComposedChart\n data={data}\n barCategoryGap=\"15%\"\n barGap=\"7.5%\"\n margin={{\n bottom: 0,\n left: 4,\n right: 4,\n top: 10,\n }}\n stackOffset={stacked === 'expand' ? 'expand' : undefined}>\n <RechartsPrimitive.CartesianGrid vertical={false} />\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.XAxis {...getAxisProps('x', props)} />\n <RechartsPrimitive.YAxis {...getAxisProps('y', props)} />\n {renderBars(barShapes, showLabels, stacked, false)}\n {renderLines(lineShapes, showDots, lineType)}\n </RechartsPrimitive.ComposedChart>\n </ChartWrapper>\n {showLegend ? (\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartBarProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Bar<TData extends object>(_: BarLineChartBarProps<TData>): JSX.Element | null {\n return null;\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface BarLineChartLineProps<TData extends object> extends ChartChildProps<TData> {}\n\nfunction Line<TData extends object>(_: BarLineChartLineProps<TData>): JSX.Element | null {\n return null;\n}\n\n// Attach the marker components to BarLineChart\nBarLineChart.Bar = Bar;\nBarLineChart.Line = Line;\n"],"names":["React","props"],"mappings":";;;;;;;;;;AA+BO,SAAS,aAAmC,OAAiC;AAC1E,QAAA;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EAAA,IACH,oBAA8C,KAAK;AAEvD,QAAM,YAAY,KAAK,yBAAyB,EAAE,QAAQ,cAAc,eAAe;AACjF,QAAA,EAAE,OAAO,QAAQ,aAAa,gBAAgB,WAAW,IAAI,SAAgB,QAAQ;AAG3F,QAAM,cAAcA,eAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,CAAS,UAAAA,eAAM,eAAe,KAAK,KAAK,MAAM,SAAS,GAAG;AAEtH,QAAM,cAAc,IAAI;AAAA,IACpB,YACK,OAAO,CAAS,UAAAA,eAAM,eAAuC,KAAK,CAAC,EACnE,IAAI,CAAS,UAAA;AACV,YAAMC,SAAS,MAAqD;AAC7DA,aAAAA,OAAM,WAAWA,OAAM;AAAA,IACjC,CAAA;AAAA,EACT;AAGM,QAAA,YAAY,OAAO,OAAO,CAAA,UAAS,YAAY,IAAI,MAAM,OAA+B,CAAC;AACzF,QAAA,aAAa,OAAO,OAAO,CAAA,UAAS,CAAC,YAAY,IAAI,MAAM,OAA+B,CAAC;AAEjG,SACKD,+BAAA,cAAA,OAAA,EAAI,WAAsB,aAAU,gBACjC,GAAAA,+BAAA,cAAC,cAAc,EAAA,GAAG,YAAY,WAAU,iBAAgB,aAAU,iBAC9D,GAAAA,+BAAA;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACG;AAAA,MACA,gBAAe;AAAA,MACf,QAAO;AAAA,MACP,QAAQ;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACT;AAAA,MACA,aAAa,YAAY,WAAW,WAAW;AAAA,IAAA;AAAA,IAC9CA,+BAAA,cAAA,kBAAkB,eAAlB,EAAgC,UAAU,OAAO;AAAA,IAClDA,+BAAA,cAAC,kBAAkB,SAAlB,EAA0B,SAAUA,+BAAA,cAAA,SAAA,EAAQ,OAAO,aAAA,CAAc,EAAI,CAAA;AAAA,IACtEA,+BAAA,cAAC,kBAAkB,OAAlB,EAAyB,GAAG,aAAa,KAAK,KAAK,GAAG;AAAA,IACvDA,+BAAA,cAAC,kBAAkB,OAAlB,EAAyB,GAAG,aAAa,KAAK,KAAK,GAAG;AAAA,IACtD,WAAW,WAAW,YAAY,SAAS,KAAK;AAAA,IAChD,YAAY,YAAY,UAAU,QAAQ;AAAA,EAAA,CAEnD,GACC,aACGA,+BAAA,cAAC,QAAc,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAY,CAAA,IACrG,IACR;AAER;AAKA,SAAS,IAA0B,GAAoD;AAC5E,SAAA;AACX;AAKA,SAAS,KAA2B,GAAqD;AAC9E,SAAA;AACX;AAGA,aAAa,MAAM;AACnB,aAAa,OAAO;"}
@@ -45,7 +45,7 @@ function DonutChart(props) {
45
45
  unit,
46
46
  style: { top: radius + DONUT_WIDTH / 2, width: radius + DONUT_WIDTH * 2 }
47
47
  }
48
- ) : null, showLegend ? /* @__PURE__ */ React.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React.createElement("div", { className: "[&>div]:!w-auto" }, /* @__PURE__ */ React.createElement(Legend.Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }))) : null);
48
+ ) : null, showLegend ? /* @__PURE__ */ React.createElement(Legend.Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }) : null);
49
49
  }
50
50
  function Segment(_) {
51
51
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"DonutChart.cjs","sources":["../../../../src/charts/components/Donut/DonutChart.tsx"],"sourcesContent":["import React from 'react';\nimport { clsx } from 'clsx';\nimport * as RechartsPrimitive from 'recharts';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { usePieChart } from '../Pie/util';\nimport { Legend } from '../Legend';\nimport { PieChartSegmentProps } from '../Pie/PieChart';\nimport { ChartValueFormatter, PolarChartProps } from '../types';\nimport { Tooltip } from '../Tooltip';\nimport { Tooltip as TacoTooltip } from '../../../components/Tooltip/Tooltip';\nimport './style.css';\n\nconst DONUT_WIDTH = 20;\n\nexport interface DonutChartProps extends PolarChartProps {\n /** Show total value in center of Donut\n * @default false\n */\n showTotal?: boolean;\n}\n\nexport function DonutChart<TData extends object>(props: DonutChartProps) {\n const { children, formatter, showLegend = false, showTotal = false, tooltipTitle, unit, ...attributes } = props;\n const { pieProps, radius, setRadius, items, activeIndex, setActiveIndex, globalFormatter, toggleItem } = usePieChart<TData>(\n children,\n {\n formatter,\n unit,\n }\n );\n const className = clsx('aspect-square', attributes.className);\n\n return (\n <div className=\"relative\" data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className={className} data-taco=\"chart-donut\" onSetWidth={setRadius}>\n <RechartsPrimitive.PieChart>\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.Pie {...pieProps} innerRadius={radius - DONUT_WIDTH} />\n </RechartsPrimitive.PieChart>\n </ChartWrapper>\n {showTotal ? (\n <Total<TData>\n formatter={globalFormatter}\n items={items as unknown[] as DonutChartSegmentProps<TData>[]}\n unit={unit}\n style={{ top: radius + DONUT_WIDTH / 2, width: radius + DONUT_WIDTH * 2 }}\n />\n ) : null}\n {showLegend ? (\n <div className=\"flex justify-center\">\n <div className=\"[&>div]:!w-auto\">\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface DonutChartSegmentProps<TData extends object> extends PieChartSegmentProps<TData> {}\n\nfunction Segment<TData extends object>(_: DonutChartSegmentProps<TData>): JSX.Element | null {\n return null;\n}\nDonutChart.Segment = Segment;\n\ninterface DonutTotalProps<TData extends object> extends React.ComponentProps<'div'> {\n formatter: ChartValueFormatter;\n items: DonutChartSegmentProps<TData>[];\n unit?: string;\n}\n\nfunction Total<TData extends object>(props: DonutTotalProps<TData>) {\n const { formatter, items, unit, ...attributes } = props;\n const total = React.useMemo(() => {\n const total = items.filter(item => !item.isHidden).reduce((acc, curr) => acc + curr.value, 0);\n return formatter(total);\n }, [items]);\n\n return (\n <div\n {...attributes}\n className=\"absolute-center flex aspect-video flex-col items-center justify-center overflow-hidden rounded-full\"\n data-taco=\"chart-donut-total\">\n <TacoTooltip title={total}>\n <span className=\"w-full truncate text-center text-lg font-bold tabular-nums\">{total}</span>\n </TacoTooltip>\n {unit ? <span className=\"-mb-1 -mt-0.5 truncate text-xs text-gray-700\">{unit}</span> : null}\n </div>\n );\n}\n"],"names":["usePieChart","clsx","ChartWrapper","RechartsPrimitive","Tooltip","Legend","total","TacoTooltip"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,cAAc;AASb,SAAS,WAAiC,OAAwB;AAC/D,QAAA,EAAE,UAAU,WAAW,aAAa,OAAO,YAAY,OAAO,cAAc,MAAM,GAAG,WAAe,IAAA;AACpG,QAAA,EAAE,UAAU,QAAQ,WAAW,OAAO,aAAa,gBAAgB,iBAAiB,WAAA,IAAeA,KAAA;AAAA,IACrG;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AACA,QAAM,YAAYC,GAAA,KAAK,iBAAiB,WAAW,SAAS;AAE5D,6CACK,OAAI,EAAA,WAAU,YAAW,aAAU,gBAAA,uCAC/BC,aAAAA,cAAc,EAAA,GAAG,YAAY,WAAsB,aAAU,eAAc,YAAY,UAAA,uCACnFC,6BAAkB,UAAlB,MACI,sBAAA,cAAAA,6BAAkB,SAAlB,EAA0B,SAAU,sBAAA,cAAAC,iBAAA,EAAQ,OAAO,cAAc,EAAA,CAAI,GACrE,sBAAA,cAAAD,6BAAkB,KAAlB,EAAuB,GAAG,UAAU,aAAa,SAAS,aAAa,CAC5E,CACJ,GACC,YACG,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,EAAE,KAAK,SAAS,cAAc,GAAG,OAAO,SAAS,cAAc,EAAE;AAAA,IAAA;AAAA,EAC5E,IACA,MACH,aACG,sBAAA,cAAC,SAAI,WAAU,sBAAA,GACV,sBAAA,cAAA,OAAA,EAAI,WAAU,yDACVE,OAAAA,QAAc,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAY,CAAA,CACzG,CACJ,IACA,IACR;AAER;AAKA,SAAS,QAA8B,GAAsD;AAClF,SAAA;AACX;AACA,WAAW,UAAU;AAQrB,SAAS,MAA4B,OAA+B;AAChE,QAAM,EAAE,WAAW,OAAO,MAAM,GAAG,WAAe,IAAA;AAC5C,QAAA,QAAQ,MAAM,QAAQ,MAAM;AAC9B,UAAMC,SAAQ,MAAM,OAAO,CAAA,SAAQ,CAAC,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAC5F,WAAO,UAAUA,MAAK;AAAA,EAAA,GACvB,CAAC,KAAK,CAAC;AAGN,SAAA,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,aAAU;AAAA,IAAA;AAAA,IACV,sBAAA,cAACC,UAAAA,WAAY,OAAO,MAAA,uCACf,QAAK,EAAA,WAAU,6DAA8D,GAAA,KAAM,CACxF;AAAA,IACC,OAAQ,sBAAA,cAAA,QAAA,EAAK,WAAU,+CAAA,GAAgD,IAAK,IAAU;AAAA,EAC3F;AAER;;"}
1
+ {"version":3,"file":"DonutChart.cjs","sources":["../../../../src/charts/components/Donut/DonutChart.tsx"],"sourcesContent":["import React from 'react';\nimport { clsx } from 'clsx';\nimport * as RechartsPrimitive from 'recharts';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { usePieChart } from '../Pie/util';\nimport { Legend } from '../Legend';\nimport { PieChartSegmentProps } from '../Pie/PieChart';\nimport { ChartValueFormatter, PolarChartProps } from '../types';\nimport { Tooltip } from '../Tooltip';\nimport { Tooltip as TacoTooltip } from '../../../components/Tooltip/Tooltip';\nimport './style.css';\n\nconst DONUT_WIDTH = 20;\n\nexport interface DonutChartProps extends PolarChartProps {\n /** Show total value in center of Donut\n * @default false\n */\n showTotal?: boolean;\n}\n\nexport function DonutChart<TData extends object>(props: DonutChartProps) {\n const { children, formatter, showLegend = false, showTotal = false, tooltipTitle, unit, ...attributes } = props;\n const { pieProps, radius, setRadius, items, activeIndex, setActiveIndex, globalFormatter, toggleItem } = usePieChart<TData>(\n children,\n {\n formatter,\n unit,\n }\n );\n const className = clsx('aspect-square', attributes.className);\n\n return (\n <div className=\"relative\" data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className={className} data-taco=\"chart-donut\" onSetWidth={setRadius}>\n <RechartsPrimitive.PieChart>\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.Pie {...pieProps} innerRadius={radius - DONUT_WIDTH} />\n </RechartsPrimitive.PieChart>\n </ChartWrapper>\n {showTotal ? (\n <Total<TData>\n formatter={globalFormatter}\n items={items as unknown[] as DonutChartSegmentProps<TData>[]}\n unit={unit}\n style={{ top: radius + DONUT_WIDTH / 2, width: radius + DONUT_WIDTH * 2 }}\n />\n ) : null}\n {showLegend ? (\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface DonutChartSegmentProps<TData extends object> extends PieChartSegmentProps<TData> {}\n\nfunction Segment<TData extends object>(_: DonutChartSegmentProps<TData>): JSX.Element | null {\n return null;\n}\nDonutChart.Segment = Segment;\n\ninterface DonutTotalProps<TData extends object> extends React.ComponentProps<'div'> {\n formatter: ChartValueFormatter;\n items: DonutChartSegmentProps<TData>[];\n unit?: string;\n}\n\nfunction Total<TData extends object>(props: DonutTotalProps<TData>) {\n const { formatter, items, unit, ...attributes } = props;\n const total = React.useMemo(() => {\n const total = items.filter(item => !item.isHidden).reduce((acc, curr) => acc + curr.value, 0);\n return formatter(total);\n }, [items]);\n\n return (\n <div\n {...attributes}\n className=\"absolute-center flex aspect-video flex-col items-center justify-center overflow-hidden rounded-full\"\n data-taco=\"chart-donut-total\">\n <TacoTooltip title={total}>\n <span className=\"w-full truncate text-center text-lg font-bold tabular-nums\">{total}</span>\n </TacoTooltip>\n {unit ? <span className=\"-mb-1 -mt-0.5 truncate text-xs text-gray-700\">{unit}</span> : null}\n </div>\n );\n}\n"],"names":["usePieChart","clsx","ChartWrapper","RechartsPrimitive","Tooltip","Legend","total","TacoTooltip"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,cAAc;AASb,SAAS,WAAiC,OAAwB;AAC/D,QAAA,EAAE,UAAU,WAAW,aAAa,OAAO,YAAY,OAAO,cAAc,MAAM,GAAG,WAAe,IAAA;AACpG,QAAA,EAAE,UAAU,QAAQ,WAAW,OAAO,aAAa,gBAAgB,iBAAiB,WAAA,IAAeA,KAAA;AAAA,IACrG;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AACA,QAAM,YAAYC,GAAA,KAAK,iBAAiB,WAAW,SAAS;AAE5D,6CACK,OAAI,EAAA,WAAU,YAAW,aAAU,gBAAA,uCAC/BC,aAAAA,cAAc,EAAA,GAAG,YAAY,WAAsB,aAAU,eAAc,YAAY,UAAA,uCACnFC,6BAAkB,UAAlB,MACI,sBAAA,cAAAA,6BAAkB,SAAlB,EAA0B,SAAU,sBAAA,cAAAC,iBAAA,EAAQ,OAAO,cAAc,EAAA,CAAI,GACrE,sBAAA,cAAAD,6BAAkB,KAAlB,EAAuB,GAAG,UAAU,aAAa,SAAS,aAAa,CAC5E,CACJ,GACC,YACG,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,EAAE,KAAK,SAAS,cAAc,GAAG,OAAO,SAAS,cAAc,EAAE;AAAA,IAAA;AAAA,EAAA,IAE5E,MACH,aACG,sBAAA,cAACE,OAAAA,QAAc,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAA,CAAY,IACrG,IACR;AAER;AAKA,SAAS,QAA8B,GAAsD;AAClF,SAAA;AACX;AACA,WAAW,UAAU;AAQrB,SAAS,MAA4B,OAA+B;AAChE,QAAM,EAAE,WAAW,OAAO,MAAM,GAAG,WAAe,IAAA;AAC5C,QAAA,QAAQ,MAAM,QAAQ,MAAM;AAC9B,UAAMC,SAAQ,MAAM,OAAO,CAAA,SAAQ,CAAC,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAC5F,WAAO,UAAUA,MAAK;AAAA,EAAA,GACvB,CAAC,KAAK,CAAC;AAGN,SAAA,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,aAAU;AAAA,IAAA;AAAA,IACV,sBAAA,cAACC,UAAAA,WAAY,OAAO,MAAA,uCACf,QAAK,EAAA,WAAU,6DAA8D,GAAA,KAAM,CACxF;AAAA,IACC,OAAQ,sBAAA,cAAA,QAAA,EAAK,WAAU,+CAAA,GAAgD,IAAK,IAAU;AAAA,EAC3F;AAER;;"}
@@ -26,7 +26,7 @@ function DonutChart(props) {
26
26
  unit,
27
27
  style: { top: radius + DONUT_WIDTH / 2, width: radius + DONUT_WIDTH * 2 }
28
28
  }
29
- ) : null, showLegend ? /* @__PURE__ */ React__default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React__default.createElement("div", { className: "[&>div]:!w-auto" }, /* @__PURE__ */ React__default.createElement(Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }))) : null);
29
+ ) : null, showLegend ? /* @__PURE__ */ React__default.createElement(Legend, { items, hoverIndex: activeIndex, onHover: setActiveIndex, onToggle: toggleItem }) : null);
30
30
  }
31
31
  function Segment(_) {
32
32
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"DonutChart.js","sources":["../../../../src/charts/components/Donut/DonutChart.tsx"],"sourcesContent":["import React from 'react';\nimport { clsx } from 'clsx';\nimport * as RechartsPrimitive from 'recharts';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { usePieChart } from '../Pie/util';\nimport { Legend } from '../Legend';\nimport { PieChartSegmentProps } from '../Pie/PieChart';\nimport { ChartValueFormatter, PolarChartProps } from '../types';\nimport { Tooltip } from '../Tooltip';\nimport { Tooltip as TacoTooltip } from '../../../components/Tooltip/Tooltip';\nimport './style.css';\n\nconst DONUT_WIDTH = 20;\n\nexport interface DonutChartProps extends PolarChartProps {\n /** Show total value in center of Donut\n * @default false\n */\n showTotal?: boolean;\n}\n\nexport function DonutChart<TData extends object>(props: DonutChartProps) {\n const { children, formatter, showLegend = false, showTotal = false, tooltipTitle, unit, ...attributes } = props;\n const { pieProps, radius, setRadius, items, activeIndex, setActiveIndex, globalFormatter, toggleItem } = usePieChart<TData>(\n children,\n {\n formatter,\n unit,\n }\n );\n const className = clsx('aspect-square', attributes.className);\n\n return (\n <div className=\"relative\" data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className={className} data-taco=\"chart-donut\" onSetWidth={setRadius}>\n <RechartsPrimitive.PieChart>\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.Pie {...pieProps} innerRadius={radius - DONUT_WIDTH} />\n </RechartsPrimitive.PieChart>\n </ChartWrapper>\n {showTotal ? (\n <Total<TData>\n formatter={globalFormatter}\n items={items as unknown[] as DonutChartSegmentProps<TData>[]}\n unit={unit}\n style={{ top: radius + DONUT_WIDTH / 2, width: radius + DONUT_WIDTH * 2 }}\n />\n ) : null}\n {showLegend ? (\n <div className=\"flex justify-center\">\n <div className=\"[&>div]:!w-auto\">\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface DonutChartSegmentProps<TData extends object> extends PieChartSegmentProps<TData> {}\n\nfunction Segment<TData extends object>(_: DonutChartSegmentProps<TData>): JSX.Element | null {\n return null;\n}\nDonutChart.Segment = Segment;\n\ninterface DonutTotalProps<TData extends object> extends React.ComponentProps<'div'> {\n formatter: ChartValueFormatter;\n items: DonutChartSegmentProps<TData>[];\n unit?: string;\n}\n\nfunction Total<TData extends object>(props: DonutTotalProps<TData>) {\n const { formatter, items, unit, ...attributes } = props;\n const total = React.useMemo(() => {\n const total = items.filter(item => !item.isHidden).reduce((acc, curr) => acc + curr.value, 0);\n return formatter(total);\n }, [items]);\n\n return (\n <div\n {...attributes}\n className=\"absolute-center flex aspect-video flex-col items-center justify-center overflow-hidden rounded-full\"\n data-taco=\"chart-donut-total\">\n <TacoTooltip title={total}>\n <span className=\"w-full truncate text-center text-lg font-bold tabular-nums\">{total}</span>\n </TacoTooltip>\n {unit ? <span className=\"-mb-1 -mt-0.5 truncate text-xs text-gray-700\">{unit}</span> : null}\n </div>\n );\n}\n"],"names":["React","total","TacoTooltip"],"mappings":";;;;;;;;;AAYA,MAAM,cAAc;AASb,SAAS,WAAiC,OAAwB;AAC/D,QAAA,EAAE,UAAU,WAAW,aAAa,OAAO,YAAY,OAAO,cAAc,MAAM,GAAG,WAAe,IAAA;AACpG,QAAA,EAAE,UAAU,QAAQ,WAAW,OAAO,aAAa,gBAAgB,iBAAiB,WAAA,IAAe;AAAA,IACrG;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AACA,QAAM,YAAY,KAAK,iBAAiB,WAAW,SAAS;AAE5D,sDACK,OAAI,EAAA,WAAU,YAAW,aAAU,gBAAA,gDAC/B,cAAc,EAAA,GAAG,YAAY,WAAsB,aAAU,eAAc,YAAY,UAAA,gDACnF,kBAAkB,UAAlB,MACIA,+BAAA,cAAA,kBAAkB,SAAlB,EAA0B,SAAUA,+BAAA,cAAA,SAAA,EAAQ,OAAO,cAAc,EAAA,CAAI,GACrEA,+BAAA,cAAA,kBAAkB,KAAlB,EAAuB,GAAG,UAAU,aAAa,SAAS,aAAa,CAC5E,CACJ,GACC,YACGA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,EAAE,KAAK,SAAS,cAAc,GAAG,OAAO,SAAS,cAAc,EAAE;AAAA,IAAA;AAAA,EAC5E,IACA,MACH,aACGA,+BAAA,cAAC,SAAI,WAAU,sBAAA,GACVA,+BAAA,cAAA,OAAA,EAAI,WAAU,kEACV,QAAc,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAY,CAAA,CACzG,CACJ,IACA,IACR;AAER;AAKA,SAAS,QAA8B,GAAsD;AAClF,SAAA;AACX;AACA,WAAW,UAAU;AAQrB,SAAS,MAA4B,OAA+B;AAChE,QAAM,EAAE,WAAW,OAAO,MAAM,GAAG,WAAe,IAAA;AAC5C,QAAA,QAAQA,eAAM,QAAQ,MAAM;AAC9B,UAAMC,SAAQ,MAAM,OAAO,CAAA,SAAQ,CAAC,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAC5F,WAAO,UAAUA,MAAK;AAAA,EAAA,GACvB,CAAC,KAAK,CAAC;AAGN,SAAAD,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,aAAU;AAAA,IAAA;AAAA,IACVA,+BAAA,cAACE,aAAY,OAAO,MAAA,gDACf,QAAK,EAAA,WAAU,6DAA8D,GAAA,KAAM,CACxF;AAAA,IACC,OAAQF,+BAAA,cAAA,QAAA,EAAK,WAAU,+CAAA,GAAgD,IAAK,IAAU;AAAA,EAC3F;AAER;"}
1
+ {"version":3,"file":"DonutChart.js","sources":["../../../../src/charts/components/Donut/DonutChart.tsx"],"sourcesContent":["import React from 'react';\nimport { clsx } from 'clsx';\nimport * as RechartsPrimitive from 'recharts';\nimport { ChartWrapper } from '../ChartWrapper';\nimport { usePieChart } from '../Pie/util';\nimport { Legend } from '../Legend';\nimport { PieChartSegmentProps } from '../Pie/PieChart';\nimport { ChartValueFormatter, PolarChartProps } from '../types';\nimport { Tooltip } from '../Tooltip';\nimport { Tooltip as TacoTooltip } from '../../../components/Tooltip/Tooltip';\nimport './style.css';\n\nconst DONUT_WIDTH = 20;\n\nexport interface DonutChartProps extends PolarChartProps {\n /** Show total value in center of Donut\n * @default false\n */\n showTotal?: boolean;\n}\n\nexport function DonutChart<TData extends object>(props: DonutChartProps) {\n const { children, formatter, showLegend = false, showTotal = false, tooltipTitle, unit, ...attributes } = props;\n const { pieProps, radius, setRadius, items, activeIndex, setActiveIndex, globalFormatter, toggleItem } = usePieChart<TData>(\n children,\n {\n formatter,\n unit,\n }\n );\n const className = clsx('aspect-square', attributes.className);\n\n return (\n <div className=\"relative\" data-taco=\"chart-wrapper\">\n <ChartWrapper {...attributes} className={className} data-taco=\"chart-donut\" onSetWidth={setRadius}>\n <RechartsPrimitive.PieChart>\n <RechartsPrimitive.Tooltip content={<Tooltip title={tooltipTitle} />} />\n <RechartsPrimitive.Pie {...pieProps} innerRadius={radius - DONUT_WIDTH} />\n </RechartsPrimitive.PieChart>\n </ChartWrapper>\n {showTotal ? (\n <Total<TData>\n formatter={globalFormatter}\n items={items as unknown[] as DonutChartSegmentProps<TData>[]}\n unit={unit}\n style={{ top: radius + DONUT_WIDTH / 2, width: radius + DONUT_WIDTH * 2 }}\n />\n ) : null}\n {showLegend ? (\n <Legend<TData> items={items} hoverIndex={activeIndex} onHover={setActiveIndex} onToggle={toggleItem} />\n ) : null}\n </div>\n );\n}\n\n// oxlint-disable-next-line no-empty-object-type\nexport interface DonutChartSegmentProps<TData extends object> extends PieChartSegmentProps<TData> {}\n\nfunction Segment<TData extends object>(_: DonutChartSegmentProps<TData>): JSX.Element | null {\n return null;\n}\nDonutChart.Segment = Segment;\n\ninterface DonutTotalProps<TData extends object> extends React.ComponentProps<'div'> {\n formatter: ChartValueFormatter;\n items: DonutChartSegmentProps<TData>[];\n unit?: string;\n}\n\nfunction Total<TData extends object>(props: DonutTotalProps<TData>) {\n const { formatter, items, unit, ...attributes } = props;\n const total = React.useMemo(() => {\n const total = items.filter(item => !item.isHidden).reduce((acc, curr) => acc + curr.value, 0);\n return formatter(total);\n }, [items]);\n\n return (\n <div\n {...attributes}\n className=\"absolute-center flex aspect-video flex-col items-center justify-center overflow-hidden rounded-full\"\n data-taco=\"chart-donut-total\">\n <TacoTooltip title={total}>\n <span className=\"w-full truncate text-center text-lg font-bold tabular-nums\">{total}</span>\n </TacoTooltip>\n {unit ? <span className=\"-mb-1 -mt-0.5 truncate text-xs text-gray-700\">{unit}</span> : null}\n </div>\n );\n}\n"],"names":["React","total","TacoTooltip"],"mappings":";;;;;;;;;AAYA,MAAM,cAAc;AASb,SAAS,WAAiC,OAAwB;AAC/D,QAAA,EAAE,UAAU,WAAW,aAAa,OAAO,YAAY,OAAO,cAAc,MAAM,GAAG,WAAe,IAAA;AACpG,QAAA,EAAE,UAAU,QAAQ,WAAW,OAAO,aAAa,gBAAgB,iBAAiB,WAAA,IAAe;AAAA,IACrG;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AACA,QAAM,YAAY,KAAK,iBAAiB,WAAW,SAAS;AAE5D,sDACK,OAAI,EAAA,WAAU,YAAW,aAAU,gBAAA,gDAC/B,cAAc,EAAA,GAAG,YAAY,WAAsB,aAAU,eAAc,YAAY,UAAA,gDACnF,kBAAkB,UAAlB,MACIA,+BAAA,cAAA,kBAAkB,SAAlB,EAA0B,SAAUA,+BAAA,cAAA,SAAA,EAAQ,OAAO,cAAc,EAAA,CAAI,GACrEA,+BAAA,cAAA,kBAAkB,KAAlB,EAAuB,GAAG,UAAU,aAAa,SAAS,aAAa,CAC5E,CACJ,GACC,YACGA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,EAAE,KAAK,SAAS,cAAc,GAAG,OAAO,SAAS,cAAc,EAAE;AAAA,IAAA;AAAA,EAAA,IAE5E,MACH,aACGA,+BAAA,cAAC,QAAc,EAAA,OAAc,YAAY,aAAa,SAAS,gBAAgB,UAAU,WAAA,CAAY,IACrG,IACR;AAER;AAKA,SAAS,QAA8B,GAAsD;AAClF,SAAA;AACX;AACA,WAAW,UAAU;AAQrB,SAAS,MAA4B,OAA+B;AAChE,QAAM,EAAE,WAAW,OAAO,MAAM,GAAG,WAAe,IAAA;AAC5C,QAAA,QAAQA,eAAM,QAAQ,MAAM;AAC9B,UAAMC,SAAQ,MAAM,OAAO,CAAA,SAAQ,CAAC,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAC5F,WAAO,UAAUA,MAAK;AAAA,EAAA,GACvB,CAAC,KAAK,CAAC;AAGN,SAAAD,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,aAAU;AAAA,IAAA;AAAA,IACVA,+BAAA,cAACE,aAAY,OAAO,MAAA,gDACf,QAAK,EAAA,WAAU,6DAA8D,GAAA,KAAM,CACxF;AAAA,IACC,OAAQF,+BAAA,cAAA,QAAA,EAAK,WAAU,+CAAA,GAAgD,IAAK,IAAU;AAAA,EAC3F;AAER;"}
@@ -114,7 +114,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
114
114
  return /* @__PURE__ */ React.createElement(SkeletonRow.SkeletonRow, { key: skeletonKey, index: virtualRow.index, table });
115
115
  }
116
116
  const measureRow = (rowHeight) => {
117
- virtualiser.resizeItem(virtualRow, rowHeight);
117
+ virtualiser.resizeItem(virtualRow.index, rowHeight);
118
118
  };
119
119
  return /* @__PURE__ */ React.createElement(
120
120
  Row.Row,
@@ -1 +1 @@
1
- {"version":3,"file":"useTableRenderer.cjs","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["ROW_HEIGHT_ESTIMATES","rows","useVirtualizer","_a","SkeletonRow","Row","defaultRangeExtractor"],"mappings":"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"}
1
+ {"version":3,"file":"useTableRenderer.cjs","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow.index, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["ROW_HEIGHT_ESTIMATES","rows","useVirtualizer","_a","SkeletonRow","Row","defaultRangeExtractor"],"mappings":"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"}
@@ -112,7 +112,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
112
112
  return /* @__PURE__ */ React__default.createElement(SkeletonRow, { key: skeletonKey, index: virtualRow.index, table });
113
113
  }
114
114
  const measureRow = (rowHeight) => {
115
- virtualiser.resizeItem(virtualRow, rowHeight);
115
+ virtualiser.resizeItem(virtualRow.index, rowHeight);
116
116
  };
117
117
  return /* @__PURE__ */ React__default.createElement(
118
118
  Row,
@@ -1 +1 @@
1
- {"version":3,"file":"useTableRenderer.js","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["React","_a"],"mappings":"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"}
1
+ {"version":3,"file":"useTableRenderer.js","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow.index, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["React","_a"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@economic/taco",
3
- "version": "8.1.1",
3
+ "version": "8.1.2-EC-71727-update-tanstack-virtual.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -49,7 +49,7 @@
49
49
  "@react-aria/focus": "^3.19.0",
50
50
  "@react-aria/interactions": "^3.12.0",
51
51
  "@tanstack/react-table": "^8.21.3",
52
- "@tanstack/react-virtual": "3.0.1",
52
+ "@tanstack/react-virtual": "3.13.23",
53
53
  "clsx": "^2.1.1",
54
54
  "date-fns": "^3.6.0",
55
55
  "framer-motion": "12.38.0",
@@ -99,5 +99,5 @@
99
99
  "optionalDependencies": {
100
100
  "@rollup/rollup-linux-x64-gnu": "^4.60.4"
101
101
  },
102
- "gitHead": "506d59cf8cf45e3de1faf89c9f60b6e17666313e"
102
+ "gitHead": "9d3b3ab1756c82abccb6d2b35b9104dee28dc5b9"
103
103
  }