@jarllyng/nostromo 3.2.0 → 3.3.1
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/chunk-35I2BJC3.js +3 -0
- package/dist/chunk-35I2BJC3.js.map +1 -0
- package/dist/chunk-35RWQSO2.cjs +3 -0
- package/dist/chunk-35RWQSO2.cjs.map +1 -0
- package/dist/chunk-3QVQ2TNE.cjs +3 -0
- package/dist/chunk-3QVQ2TNE.cjs.map +1 -0
- package/dist/{chunk-ZC4HJSII.cjs → chunk-5Z3MYAVM.cjs} +2 -2
- package/dist/{chunk-ZC4HJSII.cjs.map → chunk-5Z3MYAVM.cjs.map} +1 -1
- package/dist/{chunk-ZQDFYSZB.cjs → chunk-AYEM2M4H.cjs} +2 -2
- package/dist/{chunk-ZQDFYSZB.cjs.map → chunk-AYEM2M4H.cjs.map} +1 -1
- package/dist/chunk-BL2TM4YT.js +3 -0
- package/dist/chunk-BL2TM4YT.js.map +1 -0
- package/dist/{chunk-BSUHBLZO.cjs → chunk-BZ5ZCZJX.cjs} +2 -2
- package/dist/{chunk-BSUHBLZO.cjs.map → chunk-BZ5ZCZJX.cjs.map} +1 -1
- package/dist/chunk-C7HZAQBX.cjs +3 -0
- package/dist/chunk-C7HZAQBX.cjs.map +1 -0
- package/dist/chunk-DNTPD3PJ.js +3 -0
- package/dist/chunk-DNTPD3PJ.js.map +1 -0
- package/dist/{chunk-TGPWW7FC.js → chunk-HRJXPCGF.js} +2 -2
- package/dist/{chunk-TGPWW7FC.js.map → chunk-HRJXPCGF.js.map} +1 -1
- package/dist/chunk-JCETHQ55.cjs +3 -0
- package/dist/chunk-JCETHQ55.cjs.map +1 -0
- package/dist/chunk-MY2KMTUS.js +3 -0
- package/dist/chunk-MY2KMTUS.js.map +1 -0
- package/dist/chunk-NBX6FKCA.cjs +3 -0
- package/dist/chunk-NBX6FKCA.cjs.map +1 -0
- package/dist/chunk-NC27D5Y3.cjs +3 -0
- package/dist/chunk-NC27D5Y3.cjs.map +1 -0
- package/dist/chunk-NPSIDFOF.cjs +3 -0
- package/dist/chunk-NPSIDFOF.cjs.map +1 -0
- package/dist/chunk-QKM5LPRW.js +3 -0
- package/dist/chunk-QKM5LPRW.js.map +1 -0
- package/dist/chunk-SVWQWRPZ.js +3 -0
- package/dist/chunk-SVWQWRPZ.js.map +1 -0
- package/dist/chunk-TCA5Z7FL.js +3 -0
- package/dist/chunk-TCA5Z7FL.js.map +1 -0
- package/dist/chunk-UIEGBT4T.js +3 -0
- package/dist/chunk-UIEGBT4T.js.map +1 -0
- package/dist/chunk-VNDL67OG.cjs +3 -0
- package/dist/chunk-VNDL67OG.cjs.map +1 -0
- package/dist/chunk-WK6LNC2E.cjs +3 -0
- package/dist/chunk-WK6LNC2E.cjs.map +1 -0
- package/dist/{chunk-M5IBD3KV.js → chunk-WO3KCAN6.js} +2 -2
- package/dist/{chunk-M5IBD3KV.js.map → chunk-WO3KCAN6.js.map} +1 -1
- package/dist/{chunk-7W456HZL.js → chunk-XJJJEWSU.js} +2 -2
- package/dist/{chunk-7W456HZL.js.map → chunk-XJJJEWSU.js.map} +1 -1
- package/dist/chunk-XLZJ6HBL.js +3 -0
- package/dist/chunk-XLZJ6HBL.js.map +1 -0
- package/dist/chunk-XRVHMGMD.js +3 -0
- package/dist/chunk-XRVHMGMD.js.map +1 -0
- package/dist/chunk-Z7WEJ5IQ.cjs +3 -0
- package/dist/chunk-Z7WEJ5IQ.cjs.map +1 -0
- package/dist/components/core/breadcrumb.cjs +1 -1
- package/dist/components/core/breadcrumb.d.cts +7 -1
- package/dist/components/core/breadcrumb.d.ts +7 -1
- package/dist/components/core/breadcrumb.js +1 -1
- package/dist/components/core/calendar.cjs +1 -1
- package/dist/components/core/calendar.js +1 -1
- package/dist/components/core/charts-lazy.cjs +1 -1
- package/dist/components/core/charts-lazy.js +1 -1
- package/dist/components/core/charts.cjs +1 -1
- package/dist/components/core/charts.js +1 -1
- package/dist/components/core/checkbox.cjs +1 -1
- package/dist/components/core/checkbox.js +1 -1
- package/dist/components/core/data-table.cjs +1 -1
- package/dist/components/core/data-table.js +1 -1
- package/dist/components/core/dialog.cjs +1 -1
- package/dist/components/core/dialog.d.cts +20 -2
- package/dist/components/core/dialog.d.ts +20 -2
- package/dist/components/core/dialog.js +1 -1
- package/dist/components/core/icon.cjs +1 -1
- package/dist/components/core/icon.d.cts +1 -1
- package/dist/components/core/icon.d.ts +1 -1
- package/dist/components/core/icon.js +1 -1
- package/dist/components/core/separator.cjs +1 -1
- package/dist/components/core/separator.js +1 -1
- package/dist/components/core/skeleton.cjs +1 -1
- package/dist/components/core/skeleton.js +1 -1
- package/dist/components/core/table.cjs +1 -1
- package/dist/components/core/table.d.cts +11 -1
- package/dist/components/core/table.d.ts +11 -1
- package/dist/components/core/table.js +1 -1
- package/dist/components/core/toast.cjs +1 -1
- package/dist/components/core/toast.js +1 -1
- package/dist/components/core/tooltip.cjs +1 -1
- package/dist/components/core/tooltip.d.cts +9 -1
- package/dist/components/core/tooltip.d.ts +9 -1
- package/dist/components/core/tooltip.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/chunk-4PN7OGLX.cjs +0 -3
- package/dist/chunk-4PN7OGLX.cjs.map +0 -1
- package/dist/chunk-4TYVEXRA.cjs +0 -3
- package/dist/chunk-4TYVEXRA.cjs.map +0 -1
- package/dist/chunk-B2BWBKZA.cjs +0 -3
- package/dist/chunk-B2BWBKZA.cjs.map +0 -1
- package/dist/chunk-CVOSWGQZ.js +0 -3
- package/dist/chunk-CVOSWGQZ.js.map +0 -1
- package/dist/chunk-EGQ2Q37R.cjs +0 -3
- package/dist/chunk-EGQ2Q37R.cjs.map +0 -1
- package/dist/chunk-EIXD3Y4R.js +0 -3
- package/dist/chunk-EIXD3Y4R.js.map +0 -1
- package/dist/chunk-G5ZSOVJY.cjs +0 -3
- package/dist/chunk-G5ZSOVJY.cjs.map +0 -1
- package/dist/chunk-G6TR5RGR.js +0 -3
- package/dist/chunk-G6TR5RGR.js.map +0 -1
- package/dist/chunk-GUJB555L.js +0 -3
- package/dist/chunk-GUJB555L.js.map +0 -1
- package/dist/chunk-JZROH43C.js +0 -3
- package/dist/chunk-JZROH43C.js.map +0 -1
- package/dist/chunk-MRZOLUSF.js +0 -3
- package/dist/chunk-MRZOLUSF.js.map +0 -1
- package/dist/chunk-OZ3RIKZO.cjs +0 -3
- package/dist/chunk-OZ3RIKZO.cjs.map +0 -1
- package/dist/chunk-PEYPRWZP.js +0 -3
- package/dist/chunk-PEYPRWZP.js.map +0 -1
- package/dist/chunk-PVHTEE5T.cjs +0 -3
- package/dist/chunk-PVHTEE5T.cjs.map +0 -1
- package/dist/chunk-QF5CRDZI.js +0 -3
- package/dist/chunk-QF5CRDZI.js.map +0 -1
- package/dist/chunk-RPRISB7O.cjs +0 -3
- package/dist/chunk-RPRISB7O.cjs.map +0 -1
- package/dist/chunk-SD4IIQ2I.cjs +0 -3
- package/dist/chunk-SD4IIQ2I.cjs.map +0 -1
- package/dist/chunk-TJFZAMBB.js +0 -3
- package/dist/chunk-TJFZAMBB.js.map +0 -1
- package/dist/chunk-VXMDVKAD.js +0 -3
- package/dist/chunk-VXMDVKAD.js.map +0 -1
- package/dist/chunk-ZYP2PDSX.cjs +0 -3
- package/dist/chunk-ZYP2PDSX.cjs.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var chunk7SPPGTBT_cjs=require('./chunk-7SPPGTBT.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),r=require('react'),recharts=require('recharts'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var r__default=/*#__PURE__*/_interopDefault(r);var U=classVarianceAuthority.cva("w-full",{variants:{variant:{default:"",minimal:"",detailed:""},size:{sm:"h-48",md:"h-64",lg:"h-96",xl:"h-[500px]"}},defaultVariants:{variant:"default",size:"md"}}),s=["hsl(var(--nostromo-color-brand-500))","hsl(var(--nostromo-color-info-500))","hsl(var(--nostromo-color-success-500))","hsl(var(--nostromo-color-warning-500))","hsl(var(--nostromo-color-error-500))","hsl(var(--nostromo-color-brand-300))","hsl(var(--nostromo-color-info-700))","hsl(var(--nostromo-color-success-700))"],g=({active:u,payload:t,label:i})=>u&&t&&t.length?r__default.default.createElement("div",{className:"rounded-lg border border-border bg-popover p-3 shadow-lg"},r__default.default.createElement("p",{className:"mb-2 font-semibold text-popover-foreground"},String(i??"")),t.map((m,n)=>r__default.default.createElement("p",{key:n,className:"text-sm",style:{color:m.color}},`${m.name??""}: ${m.value??""}`))):null,v=({payload:u})=>r__default.default.createElement("div",{className:"mt-4 flex flex-wrap justify-center gap-4"},u?.map((t,i)=>r__default.default.createElement("div",{key:i,className:"flex items-center gap-2"},r__default.default.createElement("div",{className:"h-3 w-3 rounded",style:{backgroundColor:t.color},"aria-hidden":"true"}),r__default.default.createElement("span",{className:"text-sm text-popover-foreground"},t.value)))),w=r__default.default.forwardRef(({type:u,data:t,dataKeys:i,xAxisKey:m="name",colors:n=s,showGrid:C=true,showLegend:h=true,showTooltip:d=true,title:b,description:N,className:z,variant:A,size:p,height:K,ariaLabel:T,ariaLabelledBy:V,strokeWidth:D=2,fillOpacity:B=.6,...I},j)=>{let L=K||(p==="sm"?192:p==="lg"?384:p==="xl"?500:256),H=()=>{if(typeof window>"u")return r__default.default.createElement("div",{className:"flex items-center justify-center h-full text-muted-foreground"},r__default.default.createElement("p",null,"Chart loading..."));let y={data:t,margin:{top:5,right:5,left:5,bottom:5}};switch(u){case "line":return r__default.default.createElement(recharts.LineChart,{...y},C&&r__default.default.createElement(recharts.CartesianGrid,{strokeDasharray:"3 3",stroke:"hsl(var(--nostromo-color-neutral-300))"}),r__default.default.createElement(recharts.XAxis,{dataKey:m,stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),r__default.default.createElement(recharts.YAxis,{stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),d&&r__default.default.createElement(recharts.Tooltip,{content:r__default.default.createElement(g,null)}),i.map((e,a)=>{let o=a%n.length,l=n[o]??s[o%s.length];return r__default.default.createElement(recharts.Line,{key:e,type:"monotone",dataKey:e,stroke:l,strokeWidth:D,dot:{r:4,fill:l},activeDot:{r:6}})}),h&&r__default.default.createElement(recharts.Legend,{content:r__default.default.createElement(v,null)}));case "bar":return r__default.default.createElement(recharts.BarChart,{...y},C&&r__default.default.createElement(recharts.CartesianGrid,{strokeDasharray:"3 3",stroke:"hsl(var(--nostromo-color-neutral-300))"}),r__default.default.createElement(recharts.XAxis,{dataKey:m,stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),r__default.default.createElement(recharts.YAxis,{stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),d&&r__default.default.createElement(recharts.Tooltip,{content:r__default.default.createElement(g,null)}),i.map((e,a)=>{let o=a%n.length,l=n[o]??s[o%s.length];return r__default.default.createElement(recharts.Bar,{key:e,dataKey:e,fill:l,radius:[4,4,0,0]})}),h&&r__default.default.createElement(recharts.Legend,{content:r__default.default.createElement(v,null)}));case "area":return r__default.default.createElement(recharts.AreaChart,{...y},C&&r__default.default.createElement(recharts.CartesianGrid,{strokeDasharray:"3 3",stroke:"hsl(var(--nostromo-color-neutral-300))"}),r__default.default.createElement(recharts.XAxis,{dataKey:m,stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),r__default.default.createElement(recharts.YAxis,{stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),d&&r__default.default.createElement(recharts.Tooltip,{content:r__default.default.createElement(g,null)}),i.map((e,a)=>{let o=a%n.length,l=n[o]??s[o%s.length];return r__default.default.createElement(recharts.Area,{key:e,type:"monotone",dataKey:e,stroke:l,fill:l,fillOpacity:B,strokeWidth:D})}),h&&r__default.default.createElement(recharts.Legend,{content:r__default.default.createElement(v,null)}));case "pie":{let e=i[0]||"value";return r__default.default.createElement(recharts.PieChart,null,r__default.default.createElement(recharts.Pie,{data:t,dataKey:e,nameKey:m,cx:"50%",cy:"50%",outerRadius:L/4,label:a=>`${a.name??""}: ${((a.percent??0)*100).toFixed(0)}%`},t.map((a,o)=>{let l=n[o%n.length]||s[o%s.length];return r__default.default.createElement(recharts.Cell,{key:`cell-${o}`,fill:l??"#8884d8"})})),d&&r__default.default.createElement(recharts.Tooltip,{content:r__default.default.createElement(g,null)}),h&&r__default.default.createElement(recharts.Legend,{content:r__default.default.createElement(v,null)}))}default:return null}};return r__default.default.createElement("div",{ref:j,className:chunkITRGJNWL_cjs.a(U({variant:A,size:p}),z),role:"img","aria-label":T||b||`${u} chart`,"aria-labelledby":V,...I},b&&r__default.default.createElement("h3",{className:"mb-2 text-lg font-semibold text-foreground"},b),N&&r__default.default.createElement("p",{className:"mb-4 text-sm text-muted-foreground"},N),r__default.default.createElement(recharts.ResponsiveContainer,{width:"100%",height:L},H()))});w.displayName="Chart";var tr=chunk7SPPGTBT_cjs.a(w);exports.a=U;exports.b=tr;//# sourceMappingURL=chunk-WK6LNC2E.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-WK6LNC2E.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/charts.tsx"],"names":["chartContainerVariants","cva","defaultColors","CustomTooltip","active","payload","label","React","entry","index","CustomLegend","ChartComponent","type","data","dataKeys","xAxisKey","colors","showGrid","showLegend","showTooltip","title","description","className","variant","size","height","ariaLabel","ariaLabelledBy","strokeWidth","fillOpacity","props","ref","chartHeight","renderChart","commonProps","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","key","colorIndex","color","Line","Legend","BarChart","Bar","AreaChart","Area","pieDataKey","PieChart","Pie","fillColor","Cell","cn","ResponsiveContainer","Chart","memo"],"mappings":"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","file":"chunk-WK6LNC2E.cjs","sourcesContent":["import React from \"react\";\nimport {\n LineChart,\n Line,\n BarChart,\n Bar,\n PieChart,\n Pie,\n AreaChart,\n Area,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n ResponsiveContainer,\n Cell,\n} from \"recharts\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\n\n// Chart container variants\nconst chartContainerVariants = cva(\"w-full\", {\n variants: {\n variant: {\n default: \"\",\n minimal: \"\",\n detailed: \"\",\n },\n size: {\n sm: \"h-48\",\n md: \"h-64\",\n lg: \"h-96\",\n xl: \"h-[500px]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\nexport type ChartType = \"line\" | \"bar\" | \"pie\" | \"area\";\n\nexport interface ChartDataPoint {\n name: string;\n [key: string]: string | number;\n}\n\nexport interface ChartProps extends VariantProps<\n typeof chartContainerVariants\n> {\n type: ChartType;\n data: ChartDataPoint[];\n dataKeys: string[];\n xAxisKey?: string;\n colors?: (string | undefined)[];\n showGrid?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n title?: string;\n description?: string;\n className?: string;\n height?: number;\n // Accessibility\n ariaLabel?: string;\n ariaLabelledBy?: string;\n // Styling\n strokeWidth?: number;\n fillOpacity?: number;\n}\n\n// Default color palette matching Nostromo theme\nconst defaultColors = [\n // Ordered for distinguishability. It used to open with brand-500 and\n // brand-600 - two neighbouring shades of the same purple - so a two-series\n // chart was two near-identical lines. Distinct hues first, brand variants last.\n \"hsl(var(--nostromo-color-brand-500))\",\n \"hsl(var(--nostromo-color-info-500))\",\n \"hsl(var(--nostromo-color-success-500))\",\n \"hsl(var(--nostromo-color-warning-500))\",\n \"hsl(var(--nostromo-color-error-500))\",\n \"hsl(var(--nostromo-color-brand-300))\",\n \"hsl(var(--nostromo-color-info-700))\",\n \"hsl(var(--nostromo-color-success-700))\",\n];\n\n// Custom tooltip component with Tailwind styling\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: Array<{\n name?: string;\n value?: number | string;\n color?: string;\n }>;\n label?: string | number;\n}\n\nconst CustomTooltip = ({ active, payload, label }: CustomTooltipProps) => {\n if (active && payload && payload.length) {\n return (\n <div className=\"rounded-lg border border-border bg-popover p-3 shadow-lg\">\n <p className=\"mb-2 font-semibold text-popover-foreground\">\n {String(label ?? \"\")}\n </p>\n {payload.map((entry, index: number) => (\n <p key={index} className=\"text-sm\" style={{ color: entry.color }}>\n {`${entry.name ?? \"\"}: ${entry.value ?? \"\"}`}\n </p>\n ))}\n </div>\n );\n }\n return null;\n};\n\n// Custom legend component with Tailwind styling\ninterface CustomLegendProps {\n payload?: Array<{\n value?: string;\n color?: string;\n }>;\n}\n\nconst CustomLegend = ({ payload }: CustomLegendProps) => {\n return (\n <div className=\"mt-4 flex flex-wrap justify-center gap-4\">\n {payload?.map((entry, index: number) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div\n className=\"h-3 w-3 rounded\"\n style={{ backgroundColor: entry.color }}\n aria-hidden=\"true\"\n />\n <span className=\"text-sm text-popover-foreground\">{entry.value}</span>\n </div>\n ))}\n </div>\n );\n};\n\nconst ChartComponent = React.forwardRef<HTMLDivElement, ChartProps>(\n (\n {\n type,\n data,\n dataKeys,\n xAxisKey = \"name\",\n colors = defaultColors,\n showGrid = true,\n showLegend = true,\n showTooltip = true,\n title,\n description,\n className,\n variant,\n size,\n height,\n ariaLabel,\n ariaLabelledBy,\n strokeWidth = 2,\n fillOpacity = 0.6,\n ...props\n },\n ref,\n ) => {\n const chartHeight =\n height ||\n (size === \"sm\" ? 192 : size === \"lg\" ? 384 : size === \"xl\" ? 500 : 256);\n\n const renderChart = () => {\n // SSR guard: recharts requires browser environment\n if (typeof window === \"undefined\") {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground\">\n <p>Chart loading...</p>\n </div>\n );\n }\n\n const commonProps = {\n data,\n margin: { top: 5, right: 5, left: 5, bottom: 5 },\n };\n\n switch (type) {\n case \"line\":\n return (\n <LineChart {...commonProps}>\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--nostromo-color-neutral-300))\"\n />\n )}\n <XAxis\n dataKey={xAxisKey}\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n <YAxis\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {dataKeys.map((key, index) => {\n const colorIndex = index % colors.length;\n const color = (colors[colorIndex] ??\n defaultColors[colorIndex % defaultColors.length]) as string;\n return (\n <Line\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={color}\n strokeWidth={strokeWidth}\n dot={{ r: 4, fill: color }}\n activeDot={{ r: 6 }}\n />\n );\n })}\n {showLegend && <Legend content={<CustomLegend />} />}\n </LineChart>\n );\n\n case \"bar\":\n return (\n <BarChart {...commonProps}>\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--nostromo-color-neutral-300))\"\n />\n )}\n <XAxis\n dataKey={xAxisKey}\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n <YAxis\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {dataKeys.map((key, index) => {\n const colorIndex = index % colors.length;\n const color = (colors[colorIndex] ??\n defaultColors[colorIndex % defaultColors.length]) as string;\n return (\n <Bar\n key={key}\n dataKey={key}\n fill={color}\n radius={[4, 4, 0, 0]}\n />\n );\n })}\n {showLegend && <Legend content={<CustomLegend />} />}\n </BarChart>\n );\n\n case \"area\":\n return (\n <AreaChart {...commonProps}>\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--nostromo-color-neutral-300))\"\n />\n )}\n <XAxis\n dataKey={xAxisKey}\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n <YAxis\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {dataKeys.map((key, index) => {\n const colorIndex = index % colors.length;\n const color = (colors[colorIndex] ??\n defaultColors[colorIndex % defaultColors.length]) as string;\n return (\n <Area\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={color}\n fill={color}\n fillOpacity={fillOpacity}\n strokeWidth={strokeWidth}\n />\n );\n })}\n {showLegend && <Legend content={<CustomLegend />} />}\n </AreaChart>\n );\n\n case \"pie\": {\n const pieDataKey = dataKeys[0] || \"value\";\n return (\n <PieChart>\n <Pie\n data={data}\n dataKey={pieDataKey}\n nameKey={xAxisKey}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={chartHeight / 4}\n label={(props: { name?: string; percent?: number }) =>\n `${props.name ?? \"\"}: ${((props.percent ?? 0) * 100).toFixed(0)}%`\n }\n >\n {data.map((entry, index) => {\n const fillColor =\n colors[index % colors.length] ||\n defaultColors[index % defaultColors.length];\n return (\n <Cell key={`cell-${index}`} fill={fillColor ?? \"#8884d8\"} />\n );\n })}\n </Pie>\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {showLegend && <Legend content={<CustomLegend />} />}\n </PieChart>\n );\n }\n\n default:\n return null;\n }\n };\n\n return (\n <div\n ref={ref}\n className={cn(chartContainerVariants({ variant, size }), className)}\n role=\"img\"\n aria-label={ariaLabel || title || `${type} chart`}\n aria-labelledby={ariaLabelledBy}\n {...props}\n >\n {title && (\n <h3 className=\"mb-2 text-lg font-semibold text-foreground\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"mb-4 text-sm text-muted-foreground\">{description}</p>\n )}\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n {renderChart()}\n </ResponsiveContainer>\n </div>\n );\n },\n);\n\nChartComponent.displayName = \"Chart\";\n\n// Memoize Chart component for performance optimization\n// Charts are expensive to render, so memoization helps prevent unnecessary re-renders\nexport const Chart = memo(ChartComponent) as typeof ChartComponent;\n\nexport { chartContainerVariants };\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {a as a$1}from'./chunk-COXN6XBA.js';import {a}from'./chunk-AC2JBXHQ.js';import t,{useState,useEffect,useCallback,useRef}from'react';import {cva}from'class-variance-authority';var E=cva("relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all duration-300",{variants:{variant:{default:"border-border bg-card text-card-foreground shadow-lg hover:shadow-xl",success:"border-success-200 bg-success-50 text-success-900 shadow-lg hover:shadow-xl",error:"border-destructive/20 bg-destructive/10 text-destructive shadow-lg hover:shadow-xl",warning:"border-warning-200 bg-warning-50 text-warning-900 shadow-lg hover:shadow-xl",info:"border-info-200 bg-info-50 text-info-900 shadow-lg hover:shadow-xl"},position:{"top-left":"fixed top-4 left-4 z-50","top-center":"fixed top-4 left-1/2 -translate-x-1/2 z-50","top-right":"fixed top-4 right-4 z-50","bottom-left":"fixed bottom-4 left-4 z-50","bottom-center":"fixed bottom-4 left-1/2 -translate-x-1/2 z-50","bottom-right":"fixed bottom-4 right-4 z-50"},animation:{default:"animate-in slide-in-from-right-full duration-300",slide:"animate-in slide-in-from-bottom-4 duration-300",fade:"animate-in fade-in-0 duration-300",scale:"animate-in zoom-in-95 duration-300",none:""}},defaultVariants:{variant:"default",position:"top-right",animation:"default"}}),m=cva("flex-shrink-0 w-5 h-5 transition-colors duration-200",{variants:{variant:{default:"text-muted-foreground",success:"text-success-600",error:"text-destructive",warning:"text-warning-600",info:"text-info-600"}},defaultVariants:{variant:"default"}}),M=t.createContext(void 0),I=()=>{let i=t.useContext(M);if(!i)throw new Error("useToast must be used within a ToastProvider");return i},X=({children:i})=>{let[d,r]=useState([]),o=useRef(new Map),e=useCallback(s=>{let a=o.current.get(s);a&&(clearTimeout(a),o.current.delete(s)),r(f=>f.filter(l=>l.id!==s));},[]),n=useRef(e);useEffect(()=>{n.current=e;},[e]);let u=useCallback(s=>{let a=Math.random().toString(36).substr(2,9),f={...s,id:a};if(r(l=>[...l,f]),s.duration!==0){let l=setTimeout(()=>{n.current(a),o.current.delete(a);},s.duration||5e3);o.current.set(a,l);}return a},[]),c=useCallback(()=>{o.current.forEach(s=>clearTimeout(s)),o.current.clear(),r([]);},[]);return useEffect(()=>{let s=o.current;return ()=>{s.forEach(a=>clearTimeout(a)),s.clear();}},[]),t.createElement(M.Provider,{value:{toasts:d,addToast:u,removeToast:e,clearToasts:c}},i,t.createElement(H,{toasts:d}))},H=({toasts:i})=>{if(i.length===0)return null;let d=i.reduce((r,o)=>{let e=o.position||"top-right";return r[e]||(r[e]=[]),r[e].push(o),r},{});return t.createElement("div",{className:"fixed inset-0 z-50 pointer-events-none"},Object.entries(d).map(([r,o])=>t.createElement("div",{key:r,className:"pointer-events-none"},o.map((e,n)=>{let{style:u,...c}=e;return t.createElement(S,{key:e.id,...c,style:{...u,transform:`translateY(${n*8}px) ${u?.transform||""}`,marginBottom:n<o.length-1?"8px":"0"}})}))))},V=t.forwardRef(({id:i,title:d,description:r,variant:o="default",position:e="top-right",animation:n="default",duration:u=5e3,onClose:c,action:s,className:a$1,children:f,appearDelay:l=10,animationMs:g=150,...x},k)=>{let[C,y]=useState(l<=0),[T,O]=useState(false);useEffect(()=>{if(l<=0)return;let
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
import {a as a$1}from'./chunk-COXN6XBA.js';import {a}from'./chunk-AC2JBXHQ.js';import t,{useState,useEffect,useCallback,useRef}from'react';import {cva}from'class-variance-authority';var E=cva("relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all duration-300",{variants:{variant:{default:"border-border bg-card text-card-foreground shadow-lg hover:shadow-xl",success:"border-success-200 bg-success-50 text-success-900 shadow-lg hover:shadow-xl",error:"border-destructive/20 bg-destructive/10 text-destructive shadow-lg hover:shadow-xl",warning:"border-warning-200 bg-warning-50 text-warning-900 shadow-lg hover:shadow-xl",info:"border-info-200 bg-info-50 text-info-900 shadow-lg hover:shadow-xl"},position:{"top-left":"fixed top-4 left-4 z-50","top-center":"fixed top-4 left-1/2 -translate-x-1/2 z-50","top-right":"fixed top-4 right-4 z-50","bottom-left":"fixed bottom-4 left-4 z-50","bottom-center":"fixed bottom-4 left-1/2 -translate-x-1/2 z-50","bottom-right":"fixed bottom-4 right-4 z-50"},animation:{default:"animate-in slide-in-from-right-full duration-300",slide:"animate-in slide-in-from-bottom-4 duration-300",fade:"animate-in fade-in-0 duration-300",scale:"animate-in zoom-in-95 duration-300",none:""}},defaultVariants:{variant:"default",position:"top-right",animation:"default"}}),m=cva("flex-shrink-0 w-5 h-5 transition-colors duration-200",{variants:{variant:{default:"text-muted-foreground",success:"text-success-600",error:"text-destructive",warning:"text-warning-600",info:"text-info-600"}},defaultVariants:{variant:"default"}}),M=t.createContext(void 0),I=()=>{let i=t.useContext(M);if(!i)throw new Error("useToast must be used within a ToastProvider");return i},X=({children:i})=>{let[d,r]=useState([]),o=useRef(new Map),e=useCallback(s=>{let a=o.current.get(s);a&&(clearTimeout(a),o.current.delete(s)),r(f=>f.filter(l=>l.id!==s));},[]),n=useRef(e);useEffect(()=>{n.current=e;},[e]);let u=useCallback(s=>{let a=Math.random().toString(36).substr(2,9),f={...s,id:a};if(r(l=>[...l,f]),s.duration!==0){let l=setTimeout(()=>{n.current(a),o.current.delete(a);},s.duration||5e3);o.current.set(a,l);}return a},[]),c=useCallback(()=>{o.current.forEach(s=>clearTimeout(s)),o.current.clear(),r([]);},[]);return useEffect(()=>{let s=o.current;return ()=>{s.forEach(a=>clearTimeout(a)),s.clear();}},[]),t.createElement(M.Provider,{value:{toasts:d,addToast:u,removeToast:e,clearToasts:c}},i,t.createElement(H,{toasts:d}))},H=({toasts:i})=>{if(i.length===0)return null;let d=i.reduce((r,o)=>{let e=o.position||"top-right";return r[e]||(r[e]=[]),r[e].push(o),r},{});return t.createElement("div",{className:"fixed inset-0 z-50 pointer-events-none"},Object.entries(d).map(([r,o])=>t.createElement("div",{key:r,className:"pointer-events-none"},o.map((e,n)=>{let{style:u,...c}=e;return t.createElement(S,{key:e.id,...c,style:{...u,transform:`translateY(${n*8}px) ${u?.transform||""}`,marginBottom:n<o.length-1?"8px":"0"}})}))))},V=t.forwardRef(({id:i,title:d,description:r,variant:o="default",position:e="top-right",animation:n="default",duration:u=5e3,onClose:c,action:s,className:a$1,children:f,appearDelay:l=10,animationMs:g=150,...x},k)=>{let[C,y]=useState(l<=0),[T,O]=useState(false);useEffect(()=>{if(l<=0)return;let w=window.setTimeout(()=>y(true),l);return ()=>clearTimeout(w)},[l]);let h=useCallback(()=>{O(true),window.setTimeout(()=>{c?.(),y(false);},g);},[c,g]);useEffect(()=>{if(u>0){let w=window.setTimeout(h,u);return ()=>clearTimeout(w)}},[u,h]);let B=()=>{switch(o){case "success":return t.createElement("svg",{className:m({variant:o}),fill:"currentColor",viewBox:"0 0 20 20"},t.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"}));case "error":return t.createElement("svg",{className:m({variant:o}),fill:"currentColor",viewBox:"0 0 20 20"},t.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"}));case "warning":return t.createElement("svg",{className:m({variant:o}),fill:"currentColor",viewBox:"0 0 20 20"},t.createElement("path",{fillRule:"evenodd",d:"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",clipRule:"evenodd"}));case "info":return t.createElement("svg",{className:m({variant:o}),fill:"currentColor",viewBox:"0 0 20 20"},t.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z",clipRule:"evenodd"}));default:return null}};return C?t.createElement("div",{ref:k,className:a(E({variant:o,position:e,animation:n}),T?"opacity-0":"opacity-100","pointer-events-auto",a$1),"data-visible":C?"true":"false","data-leaving":T?"true":"false",style:{transition:`all ${g}ms ease-in-out`,transform:T?"translateX(100%)":x.style?.transform||"translateX(0)",...x.style},...x},t.createElement("div",{className:"flex items-start space-x-3"},B(),t.createElement("div",{className:"flex-1 min-w-0"},d&&t.createElement("div",{className:"text-sm font-medium"},d),r&&t.createElement("div",{className:"mt-1 text-sm opacity-90"},r),f)),s&&t.createElement("button",{type:"button",onClick:s.onClick,className:"ml-4 text-sm font-medium underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-ring"},s.label),t.createElement("button",{type:"button",onClick:h,className:"absolute top-2 right-2 p-1 rounded-md hover:bg-muted focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-ring","aria-label":"Close notification"},t.createElement("svg",{className:"w-4 h-4",fill:"currentColor",viewBox:"0 0 20 20"},t.createElement("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})))):null});V.displayName="Toast";var S=a$1(V),A=()=>{let{addToast:i,removeToast:d,clearToasts:r}=I();return {success:(e,n)=>i({variant:"success",title:"Success",description:e,...n}),error:(e,n)=>i({variant:"error",title:"Error",description:e,...n}),warning:(e,n)=>i({variant:"warning",title:"Warning",description:e,...n}),info:(e,n)=>i({variant:"info",title:"Info",description:e,...n}),custom:e=>i(e),dismiss:d,clear:r}};export{E as a,m as b,I as c,X as d,S as e,A as f};//# sourceMappingURL=chunk-WO3KCAN6.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-WO3KCAN6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/core/toast.tsx"],"names":["toastVariants","cva","toastIconVariants","ToastContext","React","useToast","context","ToastProvider","children","toasts","setToasts","useState","timeoutRefs","useRef","removeToast","useCallback","id","timeoutId","prev","toast","removeToastRef","useEffect","addToast","newToast","clearToasts","refs","ToastContainer","toastsByPosition","acc","position","positionToasts","index","toastStyle","toastProps","Toast","ToastComponent","_id","title","description","variant","animation","duration","onClose","action","className","appearDelay","animationMs","props","ref","isVisible","setIsVisible","isLeaving","setIsLeaving","timer","handleClose","getIcon","cn","memo","useToastNotification","message","options"],"mappings":"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","file":"chunk-M5IBD3KV.js","sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\n\n// Toast variants\nconst toastVariants = cva(\n \"relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all duration-300\",\n {\n variants: {\n variant: {\n default:\n \"border-border bg-card text-card-foreground shadow-lg hover:shadow-xl\",\n success:\n \"border-success-200 bg-success-50 text-success-900 shadow-lg hover:shadow-xl\",\n error:\n \"border-destructive/20 bg-destructive/10 text-destructive shadow-lg hover:shadow-xl\",\n warning:\n \"border-warning-200 bg-warning-50 text-warning-900 shadow-lg hover:shadow-xl\",\n info: \"border-info-200 bg-info-50 text-info-900 shadow-lg hover:shadow-xl\",\n },\n position: {\n \"top-left\": \"fixed top-4 left-4 z-50\",\n \"top-center\": \"fixed top-4 left-1/2 -translate-x-1/2 z-50\",\n \"top-right\": \"fixed top-4 right-4 z-50\",\n \"bottom-left\": \"fixed bottom-4 left-4 z-50\",\n \"bottom-center\": \"fixed bottom-4 left-1/2 -translate-x-1/2 z-50\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-50\",\n },\n animation: {\n default: \"animate-in slide-in-from-right-full duration-300\",\n slide: \"animate-in slide-in-from-bottom-4 duration-300\",\n fade: \"animate-in fade-in-0 duration-300\",\n scale: \"animate-in zoom-in-95 duration-300\",\n none: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n position: \"top-right\",\n animation: \"default\",\n },\n },\n);\n\nconst toastIconVariants = cva(\n \"flex-shrink-0 w-5 h-5 transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: \"text-muted-foreground\",\n success: \"text-success-600\",\n error: \"text-destructive\",\n warning: \"text-warning-600\",\n info: \"text-info-600\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n// Types\nexport interface ToastProps\n extends\n VariantProps<typeof toastVariants>,\n React.HTMLAttributes<HTMLDivElement> {\n id?: string;\n title?: string;\n description?: string;\n duration?: number;\n onClose?: () => void;\n action?: {\n label: string;\n onClick: () => void;\n };\n className?: string;\n children?: React.ReactNode;\n appearDelay?: number; // time in ms before first render becomes visible; default 10\n animationMs?: number; // exit animation duration; default 150\n}\n\nexport interface ToastContextType {\n toasts: ToastProps[];\n addToast: (toast: Omit<ToastProps, \"id\">) => string;\n removeToast: (id: string) => void;\n clearToasts: () => void;\n}\n\n// Toast Context\nconst ToastContext = React.createContext<ToastContextType | undefined>(\n undefined,\n);\n\nexport const useToast = () => {\n const context = React.useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n};\n\n// Toast Provider\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [toasts, setToasts] = useState<ToastProps[]>([]);\n const timeoutRefs = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const removeToast = useCallback((id: string) => {\n // Clear timeout if it exists\n const timeoutId = timeoutRefs.current.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutRefs.current.delete(id);\n }\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const removeToastRef = useRef(removeToast);\n useEffect(() => {\n removeToastRef.current = removeToast;\n }, [removeToast]);\n\n const addToast = useCallback((toast: Omit<ToastProps, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9);\n const newToast = { ...toast, id };\n\n setToasts((prev) => [...prev, newToast]);\n\n // Auto remove toast after duration\n if (toast.duration !== 0) {\n const timeoutId = setTimeout(() => {\n removeToastRef.current(id);\n timeoutRefs.current.delete(id);\n }, toast.duration || 5000);\n timeoutRefs.current.set(id, timeoutId);\n }\n\n return id;\n }, []);\n\n const clearToasts = useCallback(() => {\n // Clear all timeouts\n timeoutRefs.current.forEach((timeoutId) => clearTimeout(timeoutId));\n timeoutRefs.current.clear();\n setToasts([]);\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n const refs = timeoutRefs.current;\n return () => {\n refs.forEach((timeoutId) => clearTimeout(timeoutId));\n refs.clear();\n };\n }, []);\n\n return (\n <ToastContext.Provider\n value={{ toasts, addToast, removeToast, clearToasts }}\n >\n {children}\n <ToastContainer toasts={toasts} />\n </ToastContext.Provider>\n );\n};\n\n// Toast Container\nconst ToastContainer: React.FC<{ toasts: ToastProps[] }> = ({ toasts }) => {\n if (toasts.length === 0) return null;\n\n // Group toasts by position for stacking\n const toastsByPosition = toasts.reduce(\n (acc, toast) => {\n const position = toast.position || \"top-right\";\n if (!acc[position]) {\n acc[position] = [];\n }\n acc[position].push(toast);\n return acc;\n },\n {} as Record<string, ToastProps[]>,\n );\n\n return (\n <div className=\"fixed inset-0 z-50 pointer-events-none\">\n {Object.entries(toastsByPosition).map(([position, positionToasts]) => (\n <div key={position} className=\"pointer-events-none\">\n {positionToasts.map((toast, index) => {\n const { style: toastStyle, ...toastProps } = toast;\n return (\n <Toast\n key={toast.id}\n {...toastProps}\n style={{\n ...toastStyle,\n // Stack toasts with offset\n transform: `translateY(${index * 8}px) ${toastStyle?.transform || \"\"}`,\n marginBottom: index < positionToasts.length - 1 ? \"8px\" : \"0\",\n }}\n />\n );\n })}\n </div>\n ))}\n </div>\n );\n};\n\n// Individual Toast Component\nconst ToastComponent = React.forwardRef<HTMLDivElement, ToastProps>(\n (\n {\n id: _id,\n title,\n description,\n variant = \"default\",\n position = \"top-right\",\n animation = \"default\",\n duration = 5000,\n onClose,\n action,\n className,\n children,\n appearDelay = 10,\n animationMs = 150,\n ...props\n },\n ref,\n ) => {\n const [isVisible, setIsVisible] = useState(appearDelay <= 0);\n const [isLeaving, setIsLeaving] = useState(false);\n\n useEffect(() => {\n if (appearDelay <= 0) {\n return;\n }\n const timer = window.setTimeout(() => setIsVisible(true), appearDelay);\n return () => clearTimeout(timer);\n }, [appearDelay]);\n\n const handleClose = useCallback(() => {\n setIsLeaving(true);\n window.setTimeout(() => {\n onClose?.();\n setIsVisible(false);\n }, animationMs);\n }, [onClose, animationMs]);\n\n // Auto close after duration\n useEffect(() => {\n if (duration > 0) {\n const timer = window.setTimeout(handleClose, duration);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [duration, handleClose]);\n\n const getIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n case \"error\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n case \"warning\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n case \"info\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n default:\n return null;\n }\n };\n\n if (!isVisible) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n toastVariants({ variant, position, animation }),\n isLeaving ? \"opacity-0\" : \"opacity-100\",\n \"pointer-events-auto\",\n className,\n )}\n data-visible={isVisible ? \"true\" : \"false\"}\n data-leaving={isLeaving ? \"true\" : \"false\"}\n style={{\n transition: `all ${animationMs}ms ease-in-out`,\n transform: isLeaving\n ? \"translateX(100%)\"\n : props.style?.transform || \"translateX(0)\",\n ...props.style,\n }}\n {...props}\n >\n <div className=\"flex items-start space-x-3\">\n {getIcon()}\n <div className=\"flex-1 min-w-0\">\n {title && <div className=\"text-sm font-medium\">{title}</div>}\n {description && (\n <div className=\"mt-1 text-sm opacity-90\">{description}</div>\n )}\n {children}\n </div>\n </div>\n\n {action && (\n <button\n type=\"button\"\n onClick={action.onClick}\n className=\"ml-4 text-sm font-medium underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n {action.label}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"absolute top-2 right-2 p-1 rounded-md hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n aria-label=\"Close notification\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n );\n },\n);\n\nToastComponent.displayName = \"Toast\";\n\n// Memoize Toast for performance optimization\nexport const Toast = memo(ToastComponent) as typeof ToastComponent;\n\n// Toast Hook for easy usage\nexport const useToastNotification = () => {\n const { addToast, removeToast, clearToasts } = useToast();\n\n const toast = {\n success: (\n message: string,\n options?: Omit<ToastProps, \"variant\" | \"title\">,\n ) =>\n addToast({\n variant: \"success\",\n title: \"Success\",\n description: message,\n ...options,\n }),\n\n error: (message: string, options?: Omit<ToastProps, \"variant\" | \"title\">) =>\n addToast({\n variant: \"error\",\n title: \"Error\",\n description: message,\n ...options,\n }),\n\n warning: (\n message: string,\n options?: Omit<ToastProps, \"variant\" | \"title\">,\n ) =>\n addToast({\n variant: \"warning\",\n title: \"Warning\",\n description: message,\n ...options,\n }),\n\n info: (message: string, options?: Omit<ToastProps, \"variant\" | \"title\">) =>\n addToast({\n variant: \"info\",\n title: \"Info\",\n description: message,\n ...options,\n }),\n\n custom: (toast: Omit<ToastProps, \"id\">) => addToast(toast),\n\n dismiss: removeToast,\n clear: clearToasts,\n };\n\n return toast;\n};\n\n// Export variants for external use\nexport { toastVariants, toastIconVariants };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/core/toast.tsx"],"names":["toastVariants","cva","toastIconVariants","ToastContext","React","useToast","context","ToastProvider","children","toasts","setToasts","useState","timeoutRefs","useRef","removeToast","useCallback","id","timeoutId","prev","toast","removeToastRef","useEffect","addToast","newToast","clearToasts","refs","ToastContainer","toastsByPosition","acc","position","positionToasts","index","toastStyle","toastProps","Toast","ToastComponent","_id","title","description","variant","animation","duration","onClose","action","className","appearDelay","animationMs","props","ref","isVisible","setIsVisible","isLeaving","setIsLeaving","timer","handleClose","getIcon","cn","memo","useToastNotification","message","options"],"mappings":"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","file":"chunk-WO3KCAN6.js","sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\n\n// Toast variants\nconst toastVariants = cva(\n \"relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all duration-300\",\n {\n variants: {\n variant: {\n default:\n \"border-border bg-card text-card-foreground shadow-lg hover:shadow-xl\",\n success:\n \"border-success-200 bg-success-50 text-success-900 shadow-lg hover:shadow-xl\",\n error:\n \"border-destructive/20 bg-destructive/10 text-destructive shadow-lg hover:shadow-xl\",\n warning:\n \"border-warning-200 bg-warning-50 text-warning-900 shadow-lg hover:shadow-xl\",\n info: \"border-info-200 bg-info-50 text-info-900 shadow-lg hover:shadow-xl\",\n },\n position: {\n \"top-left\": \"fixed top-4 left-4 z-50\",\n \"top-center\": \"fixed top-4 left-1/2 -translate-x-1/2 z-50\",\n \"top-right\": \"fixed top-4 right-4 z-50\",\n \"bottom-left\": \"fixed bottom-4 left-4 z-50\",\n \"bottom-center\": \"fixed bottom-4 left-1/2 -translate-x-1/2 z-50\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-50\",\n },\n animation: {\n default: \"animate-in slide-in-from-right-full duration-300\",\n slide: \"animate-in slide-in-from-bottom-4 duration-300\",\n fade: \"animate-in fade-in-0 duration-300\",\n scale: \"animate-in zoom-in-95 duration-300\",\n none: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n position: \"top-right\",\n animation: \"default\",\n },\n },\n);\n\nconst toastIconVariants = cva(\n \"flex-shrink-0 w-5 h-5 transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: \"text-muted-foreground\",\n success: \"text-success-600\",\n error: \"text-destructive\",\n warning: \"text-warning-600\",\n info: \"text-info-600\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n// Types\nexport interface ToastProps\n extends\n VariantProps<typeof toastVariants>,\n React.HTMLAttributes<HTMLDivElement> {\n id?: string;\n title?: string;\n description?: string;\n duration?: number;\n onClose?: () => void;\n action?: {\n label: string;\n onClick: () => void;\n };\n className?: string;\n children?: React.ReactNode;\n appearDelay?: number; // time in ms before first render becomes visible; default 10\n animationMs?: number; // exit animation duration; default 150\n}\n\nexport interface ToastContextType {\n toasts: ToastProps[];\n addToast: (toast: Omit<ToastProps, \"id\">) => string;\n removeToast: (id: string) => void;\n clearToasts: () => void;\n}\n\n// Toast Context\nconst ToastContext = React.createContext<ToastContextType | undefined>(\n undefined,\n);\n\nexport const useToast = () => {\n const context = React.useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n};\n\n// Toast Provider\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [toasts, setToasts] = useState<ToastProps[]>([]);\n const timeoutRefs = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const removeToast = useCallback((id: string) => {\n // Clear timeout if it exists\n const timeoutId = timeoutRefs.current.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutRefs.current.delete(id);\n }\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const removeToastRef = useRef(removeToast);\n useEffect(() => {\n removeToastRef.current = removeToast;\n }, [removeToast]);\n\n const addToast = useCallback((toast: Omit<ToastProps, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9);\n const newToast = { ...toast, id };\n\n setToasts((prev) => [...prev, newToast]);\n\n // Auto remove toast after duration\n if (toast.duration !== 0) {\n const timeoutId = setTimeout(() => {\n removeToastRef.current(id);\n timeoutRefs.current.delete(id);\n }, toast.duration || 5000);\n timeoutRefs.current.set(id, timeoutId);\n }\n\n return id;\n }, []);\n\n const clearToasts = useCallback(() => {\n // Clear all timeouts\n timeoutRefs.current.forEach((timeoutId) => clearTimeout(timeoutId));\n timeoutRefs.current.clear();\n setToasts([]);\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n const refs = timeoutRefs.current;\n return () => {\n refs.forEach((timeoutId) => clearTimeout(timeoutId));\n refs.clear();\n };\n }, []);\n\n return (\n <ToastContext.Provider\n value={{ toasts, addToast, removeToast, clearToasts }}\n >\n {children}\n <ToastContainer toasts={toasts} />\n </ToastContext.Provider>\n );\n};\n\n// Toast Container\nconst ToastContainer: React.FC<{ toasts: ToastProps[] }> = ({ toasts }) => {\n if (toasts.length === 0) return null;\n\n // Group toasts by position for stacking\n const toastsByPosition = toasts.reduce(\n (acc, toast) => {\n const position = toast.position || \"top-right\";\n if (!acc[position]) {\n acc[position] = [];\n }\n acc[position].push(toast);\n return acc;\n },\n {} as Record<string, ToastProps[]>,\n );\n\n return (\n <div className=\"fixed inset-0 z-50 pointer-events-none\">\n {Object.entries(toastsByPosition).map(([position, positionToasts]) => (\n <div key={position} className=\"pointer-events-none\">\n {positionToasts.map((toast, index) => {\n const { style: toastStyle, ...toastProps } = toast;\n return (\n <Toast\n key={toast.id}\n {...toastProps}\n style={{\n ...toastStyle,\n // Stack toasts with offset\n transform: `translateY(${index * 8}px) ${toastStyle?.transform || \"\"}`,\n marginBottom: index < positionToasts.length - 1 ? \"8px\" : \"0\",\n }}\n />\n );\n })}\n </div>\n ))}\n </div>\n );\n};\n\n// Individual Toast Component\nconst ToastComponent = React.forwardRef<HTMLDivElement, ToastProps>(\n (\n {\n id: _id,\n title,\n description,\n variant = \"default\",\n position = \"top-right\",\n animation = \"default\",\n duration = 5000,\n onClose,\n action,\n className,\n children,\n appearDelay = 10,\n animationMs = 150,\n ...props\n },\n ref,\n ) => {\n const [isVisible, setIsVisible] = useState(appearDelay <= 0);\n const [isLeaving, setIsLeaving] = useState(false);\n\n useEffect(() => {\n if (appearDelay <= 0) {\n return;\n }\n const timer = window.setTimeout(() => setIsVisible(true), appearDelay);\n return () => clearTimeout(timer);\n }, [appearDelay]);\n\n const handleClose = useCallback(() => {\n setIsLeaving(true);\n window.setTimeout(() => {\n onClose?.();\n setIsVisible(false);\n }, animationMs);\n }, [onClose, animationMs]);\n\n // Auto close after duration\n useEffect(() => {\n if (duration > 0) {\n const timer = window.setTimeout(handleClose, duration);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [duration, handleClose]);\n\n const getIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n case \"error\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n case \"warning\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n case \"info\":\n return (\n <svg\n className={toastIconVariants({ variant })}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n default:\n return null;\n }\n };\n\n if (!isVisible) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n toastVariants({ variant, position, animation }),\n isLeaving ? \"opacity-0\" : \"opacity-100\",\n \"pointer-events-auto\",\n className,\n )}\n data-visible={isVisible ? \"true\" : \"false\"}\n data-leaving={isLeaving ? \"true\" : \"false\"}\n style={{\n transition: `all ${animationMs}ms ease-in-out`,\n transform: isLeaving\n ? \"translateX(100%)\"\n : props.style?.transform || \"translateX(0)\",\n ...props.style,\n }}\n {...props}\n >\n <div className=\"flex items-start space-x-3\">\n {getIcon()}\n <div className=\"flex-1 min-w-0\">\n {title && <div className=\"text-sm font-medium\">{title}</div>}\n {description && (\n <div className=\"mt-1 text-sm opacity-90\">{description}</div>\n )}\n {children}\n </div>\n </div>\n\n {action && (\n <button\n type=\"button\"\n onClick={action.onClick}\n className=\"ml-4 text-sm font-medium underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-ring\"\n >\n {action.label}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"absolute top-2 right-2 p-1 rounded-md hover:bg-muted focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-ring\"\n aria-label=\"Close notification\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n );\n },\n);\n\nToastComponent.displayName = \"Toast\";\n\n// Memoize Toast for performance optimization\nexport const Toast = memo(ToastComponent) as typeof ToastComponent;\n\n// Toast Hook for easy usage\nexport const useToastNotification = () => {\n const { addToast, removeToast, clearToasts } = useToast();\n\n const toast = {\n success: (\n message: string,\n options?: Omit<ToastProps, \"variant\" | \"title\">,\n ) =>\n addToast({\n variant: \"success\",\n title: \"Success\",\n description: message,\n ...options,\n }),\n\n error: (message: string, options?: Omit<ToastProps, \"variant\" | \"title\">) =>\n addToast({\n variant: \"error\",\n title: \"Error\",\n description: message,\n ...options,\n }),\n\n warning: (\n message: string,\n options?: Omit<ToastProps, \"variant\" | \"title\">,\n ) =>\n addToast({\n variant: \"warning\",\n title: \"Warning\",\n description: message,\n ...options,\n }),\n\n info: (message: string, options?: Omit<ToastProps, \"variant\" | \"title\">) =>\n addToast({\n variant: \"info\",\n title: \"Info\",\n description: message,\n ...options,\n }),\n\n custom: (toast: Omit<ToastProps, \"id\">) => addToast(toast),\n\n dismiss: removeToast,\n clear: clearToasts,\n };\n\n return toast;\n};\n\n// Export variants for external use\nexport { toastVariants, toastIconVariants };\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {d}from'./chunk-
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
import {d}from'./chunk-UIEGBT4T.js';import {b}from'./chunk-HD3TMQPR.js';import {a}from'./chunk-COXN6XBA.js';import {a as a$1}from'./chunk-AC2JBXHQ.js';import t,{useState,useMemo,useCallback}from'react';import {cva}from'class-variance-authority';var Ve=cva("flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border",{variants:{variant:{default:"bg-muted",compact:"p-2 bg-card",minimal:"p-2 bg-transparent border-0"}},defaultVariants:{variant:"default"}});function te({data:F,columns:x,searchable:z=true,searchPlaceholder:oe="Search...",searchKeys:j,onSearch:V,searchTerm:E,onSearchTermChange:K,filterable:D=false,filters:b$1=[],onFilter:B,columnFilters:_,onColumnFiltersChange:q,defaultSortColumn:ae,defaultSortDirection:se="asc",sortColumn:G,sortDirection:ie,onSortChange:y,defaultPageSize:ue=10,showPagination:h=true,currentPage:H,pageSize:J,onPageChange:Q,onPageSizeChange:M,totalItems:s,showSearch:U=true,showFilters:W=true,filterBarClassName:le,searchBarClassName:de,rowKey:ce="id",emptyText:me="No data found",...ge}){let I=E!==void 0,L=_!==void 0,k=G!==void 0,o=H!==void 0,[fe,pe]=useState(""),m=I?E:fe,X=useMemo(()=>I?e=>K?.(e):pe,[I,K]),[be,ye]=useState({}),d$1=L?_:be,$=useMemo(()=>L?e=>q?.(e):ye,[L,q]),[he,ke]=useState(ae),[ve,Te]=useState(se),g=k?G:he,v=k?ie:ve,Y=useMemo(()=>k?e=>{e&&y&&v&&y(e,v);}:ke,[k,y,v]),Z=useMemo(()=>k?e=>{g&&y&&y(g,e);}:Te,[k,y,g]),[xe,Ce]=useState(1),[Se,we]=useState(ue),f=o?H:xe,a=J!==void 0?J:Se,p=useMemo(()=>o?e=>Q?.(e):Ce,[o,Q]),R=useMemo(()=>M?e=>M(e):we,[M]),C=useMemo(()=>{if(!z||!m.trim())return F;let e=m.toLowerCase(),r=j||x.map(n=>n.dataIndex||n.key).filter(Boolean);return F.filter(n=>r.some(i=>{let c=n[i];return c==null?false:String(c).toLowerCase().includes(e)}))},[F,m,z,j,x]),S=useMemo(()=>!D||b$1.length===0||Object.keys(d$1).length===0?C:C.filter(e=>b$1.every(r=>{let n=d$1[r.key];if(n==null||n==="")return true;if(r.filterFn)return r.filterFn(n,e);let i=e[r.key];switch(r.type){case "text":return String(i).toLowerCase().includes(String(n).toLowerCase());case "number":return Number(i)===Number(n);case "boolean":return !!i==!!n;case "select":return String(i)===String(n);default:return String(i).includes(String(n))}})),[C,d$1,D,b$1]),l=useMemo(()=>{if(!g)return S;let e=[...S],r=x.find(n=>n.key===g);return !r||!r.sortable||e.sort((n,i)=>{let c=r.dataIndex?n[r.dataIndex]:n[r.key],w=r.dataIndex?i[r.dataIndex]:i[r.key];if(c==null)return 1;if(w==null)return -1;let N=0;return typeof c=="number"&&typeof w=="number"?N=c-w:N=String(c).localeCompare(String(w)),v==="asc"?N:-N}),e},[S,g,v,x]),Fe=useMemo(()=>{if(!h||o&&s!==void 0)return l;let e=(f-1)*a,r=e+a;return l.slice(e,r)},[l,f,a,h,o,s]);useMemo(()=>h?Math.ceil(o&&s!==void 0?s/a:l.length/a):1,[h,o,s,a,l.length]);let De=useCallback(e=>{X(e),o||p(1);},[X,p,o]),ee=useCallback((e,r)=>{let n={...d$1,[e]:r};$(n),o||p(1);},[d$1,$,p,o]),Ne=useCallback((e,r)=>{Y(e.key),Z(r);},[Y,Z]),Pe=useCallback((e,r)=>{p(e),r!==a&&(R(r),p(1));},[a,p,R]);return t.useEffect(()=>{V&&V(m,C);},[m,C,V]),t.useEffect(()=>{B&&B(d$1,S);},[d$1,S,B]),t.createElement("div",{className:"w-full"},(U||W&&D&&b$1.length>0)&&t.createElement("div",{className:a$1(Ve(),le)},U&&z&&t.createElement("div",{className:a$1("flex-1 min-w-[200px]",de)},t.createElement(b,{type:"text",placeholder:oe,value:m,onChange:e=>De(e.target.value),className:"w-full","aria-label":"Search table"})),W&&D&&b$1.length>0&&t.createElement("div",{className:"flex flex-wrap items-center gap-2"},b$1.map(e=>{let r=d$1[e.key];return e.type==="select"&&e.options?t.createElement("select",{key:e.key,value:String(r||""),onChange:n=>ee(e.key,n.target.value||void 0),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t.createElement("option",{value:""},"All ",e.key),e.options.map(n=>t.createElement("option",{key:n.value,value:String(n.value)},n.label))):t.createElement(b,{key:e.key,type:e.type==="number"?"number":"text",placeholder:e.placeholder||`Filter ${e.key}...`,value:String(r||""),onChange:n=>ee(e.key,e.type==="number"?Number(n.target.value):n.target.value),className:"min-w-[150px]","aria-label":`Filter by ${e.key}`})}),Object.keys(d$1).length>0&&t.createElement("button",{type:"button",onClick:()=>$({}),className:"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline","aria-label":"Clear all filters"},"Clear filters"))),t.createElement(d,{...ge,data:Fe,columns:x,rowKey:ce,emptyText:me,...g&&{sortColumn:g,sortDirection:v},onSort:Ne,...h&&{pagination:{current:f,pageSize:a,total:o&&s!==void 0?s:l.length,onChange:Pe,showSizeChanger:true}}}),h&&(o&&s!==void 0?s>0:l.length>0)&&t.createElement("div",{className:"mt-2 px-4 py-2 text-sm text-muted-foreground"},o&&s!==void 0?t.createElement(t.Fragment,null,"Showing ",(f-1)*a+1," to"," ",Math.min(f*a,s)," of ",s," ","results",m&&" (filtered)"):t.createElement(t.Fragment,null,"Showing ",(f-1)*a+1," to"," ",Math.min(f*a,l.length)," of"," ",l.length," results",m&&` (filtered from ${F.length} total)`)))}te.displayName="DataTable";var Ke=a(te);export{te as a,Ke as b};//# sourceMappingURL=chunk-XJJJEWSU.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-XJJJEWSU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/core/data-table.tsx"],"names":["filterBarVariants","cva","DataTable","initialData","columns","searchable","searchPlaceholder","searchKeys","onSearch","controlledSearchTerm","onSearchTermChange","filterable","filters","onFilter","controlledColumnFilters","onColumnFiltersChange","defaultSortColumn","defaultSortDirection","controlledSortColumn","controlledSortDirection","onSortChange","defaultPageSize","showPagination","controlledCurrentPage","controlledPageSize","onPageChange","onPageSizeChange","totalItems","showSearch","showFilters","filterBarClassName","searchBarClassName","rowKey","emptyText","tableProps","isControlledSearch","isControlledFilters","isControlledSort","isControlledPagination","internalSearchTerm","setInternalSearchTerm","useState","searchTerm","setSearchTerm","useMemo","value","internalColumnFilters","setInternalColumnFilters","columnFilters","setColumnFilters","internalSortColumn","setInternalSortColumn","internalSortDirection","setInternalSortDirection","sortColumn","sortDirection","setSortColumn","column","setSortDirection","dir","internalCurrentPage","setInternalCurrentPage","internalPageSize","setInternalPageSize","currentPage","pageSize","setCurrentPage","page","setPageSize","size","searchFilteredData","term","keys","col","record","key","filterFilteredData","filter","filterValue","recordValue","sortedData","sorted","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSearch","useCallback","handleFilterChange","newFilters","handleSort","direction","handlePageChange","newPageSize","React","cn","Input","e","option","Table","DataTableMemoized","memo"],"mappings":"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","file":"chunk-7W456HZL.js","sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\nimport { Table, TableColumn, TableProps } from \"./table\";\nimport { Input } from \"./input\";\n\n// Filter types\nexport type FilterType = \"text\" | \"select\" | \"number\" | \"date\" | \"boolean\";\n\nexport interface ColumnFilter<T = Record<string, unknown>> {\n key: string;\n type: FilterType;\n options?: Array<{ label: string; value: string | number }>;\n placeholder?: string;\n filterFn?: (value: unknown, record: T) => boolean;\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> extends Omit<\n TableProps<T>,\n \"data\" | \"onSort\" | \"sortColumn\" | \"sortDirection\"\n> {\n data: T[];\n columns: TableColumn<T>[];\n\n // Search\n searchable?: boolean;\n searchPlaceholder?: string;\n searchKeys?: Array<keyof T | string>;\n onSearch?: (searchTerm: string, filteredData: T[]) => void;\n\n // Controlled search (for server-side filtering)\n searchTerm?: string;\n onSearchTermChange?: (searchTerm: string) => void;\n\n // Filtering\n filterable?: boolean;\n filters?: ColumnFilter<T>[];\n onFilter?: (filters: Record<string, unknown>, filteredData: T[]) => void;\n\n // Controlled filters (for server-side filtering)\n columnFilters?: Record<string, unknown>;\n onColumnFiltersChange?: (filters: Record<string, unknown>) => void;\n\n // Sorting (enhanced)\n defaultSortColumn?: string;\n defaultSortDirection?: \"asc\" | \"desc\";\n\n // Controlled sorting (for server-side sorting)\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n onSortChange?: (column: string, direction: \"asc\" | \"desc\") => void;\n\n // Pagination (enhanced)\n defaultPageSize?: number;\n showPagination?: boolean;\n\n // Controlled pagination (for server-side pagination)\n currentPage?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n totalItems?: number; // Required for server-side pagination\n\n // UI\n showSearch?: boolean;\n showFilters?: boolean;\n filterBarClassName?: string;\n searchBarClassName?: string;\n}\n\n// Filter bar component\nconst filterBarVariants = cva(\n \"flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n compact: \"p-2 bg-card\",\n minimal: \"p-2 bg-transparent border-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function DataTable<\n T extends Record<string, unknown> = Record<string, unknown>,\n>({\n data: initialData,\n columns,\n searchable = true,\n searchPlaceholder = \"Search...\",\n searchKeys,\n onSearch,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n filterable = false,\n filters = [],\n onFilter,\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n defaultSortColumn,\n defaultSortDirection = \"asc\",\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n onSortChange,\n defaultPageSize = 10,\n showPagination = true,\n currentPage: controlledCurrentPage,\n pageSize: controlledPageSize,\n onPageChange,\n onPageSizeChange,\n totalItems,\n showSearch = true,\n showFilters = true,\n filterBarClassName,\n searchBarClassName,\n rowKey = \"id\",\n emptyText = \"No data found\",\n ...tableProps\n}: DataTableProps<T>) {\n // Determine if component is in controlled mode\n const isControlledSearch = controlledSearchTerm !== undefined;\n const isControlledFilters = controlledColumnFilters !== undefined;\n const isControlledSort = controlledSortColumn !== undefined;\n const isControlledPagination = controlledCurrentPage !== undefined;\n\n // Search state (controlled or uncontrolled)\n const [internalSearchTerm, setInternalSearchTerm] = useState(\"\");\n const searchTerm = isControlledSearch\n ? controlledSearchTerm\n : internalSearchTerm;\n const setSearchTerm = useMemo(\n () =>\n isControlledSearch\n ? (value: string) => onSearchTermChange?.(value)\n : setInternalSearchTerm,\n [isControlledSearch, onSearchTermChange],\n );\n\n // Filter state (controlled or uncontrolled)\n const [internalColumnFilters, setInternalColumnFilters] = useState<\n Record<string, unknown>\n >({});\n const columnFilters = isControlledFilters\n ? controlledColumnFilters\n : internalColumnFilters;\n const setColumnFilters = useMemo(\n () =>\n isControlledFilters\n ? (filters: Record<string, unknown>) => onColumnFiltersChange?.(filters)\n : setInternalColumnFilters,\n [isControlledFilters, onColumnFiltersChange],\n );\n\n // Sort state (controlled or uncontrolled)\n const [internalSortColumn, setInternalSortColumn] = useState<\n string | undefined\n >(defaultSortColumn);\n const [internalSortDirection, setInternalSortDirection] = useState<\n \"asc\" | \"desc\"\n >(defaultSortDirection);\n const sortColumn = isControlledSort\n ? controlledSortColumn\n : internalSortColumn;\n const sortDirection = isControlledSort\n ? controlledSortDirection\n : internalSortDirection;\n const setSortColumn = useMemo(\n () =>\n isControlledSort\n ? (column: string | undefined) => {\n if (column && onSortChange && sortDirection) {\n onSortChange(column, sortDirection);\n }\n }\n : setInternalSortColumn,\n [isControlledSort, onSortChange, sortDirection],\n );\n const setSortDirection = useMemo(\n () =>\n isControlledSort\n ? (dir: \"asc\" | \"desc\") => {\n if (sortColumn && onSortChange) {\n onSortChange(sortColumn, dir);\n }\n }\n : setInternalSortDirection,\n [isControlledSort, onSortChange, sortColumn],\n );\n\n // Pagination state (controlled or uncontrolled)\n const [internalCurrentPage, setInternalCurrentPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const currentPage = isControlledPagination\n ? controlledCurrentPage\n : internalCurrentPage;\n const pageSize =\n controlledPageSize !== undefined ? controlledPageSize : internalPageSize;\n const setCurrentPage = useMemo(\n () =>\n isControlledPagination\n ? (page: number) => onPageChange?.(page)\n : setInternalCurrentPage,\n [isControlledPagination, onPageChange],\n );\n const setPageSize = useMemo(\n () =>\n onPageSizeChange\n ? (size: number) => onPageSizeChange(size)\n : setInternalPageSize,\n [onPageSizeChange],\n );\n\n // Apply search\n const searchFilteredData = useMemo(() => {\n if (!searchable || !searchTerm.trim()) {\n return initialData;\n }\n\n const term = searchTerm.toLowerCase();\n const keys =\n searchKeys ||\n columns.map((col) => col.dataIndex || col.key).filter(Boolean);\n\n return initialData.filter((record) => {\n return keys.some((key) => {\n const value =\n typeof key === \"string\"\n ? (record as Record<string, unknown>)[key]\n : record[key as keyof T];\n\n if (value === null || value === undefined) return false;\n\n return String(value).toLowerCase().includes(term);\n });\n });\n }, [initialData, searchTerm, searchable, searchKeys, columns]);\n\n // Apply column filters\n const filterFilteredData = useMemo(() => {\n if (\n !filterable ||\n filters.length === 0 ||\n Object.keys(columnFilters).length === 0\n ) {\n return searchFilteredData;\n }\n\n return searchFilteredData.filter((record) => {\n return filters.every((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // Skip if no filter value\n if (\n filterValue === undefined ||\n filterValue === null ||\n filterValue === \"\"\n ) {\n return true;\n }\n\n // Use custom filter function if provided\n if (filter.filterFn) {\n return filter.filterFn(filterValue, record);\n }\n\n // Default filtering logic\n const recordValue = (record as Record<string, unknown>)[filter.key];\n\n switch (filter.type) {\n case \"text\":\n return String(recordValue)\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n case \"number\":\n return Number(recordValue) === Number(filterValue);\n case \"boolean\":\n return Boolean(recordValue) === Boolean(filterValue);\n case \"select\":\n return String(recordValue) === String(filterValue);\n default:\n return String(recordValue).includes(String(filterValue));\n }\n });\n });\n }, [searchFilteredData, columnFilters, filterable, filters]);\n\n // Apply sorting\n const sortedData = useMemo(() => {\n if (!sortColumn) {\n return filterFilteredData;\n }\n\n const sorted = [...filterFilteredData];\n const column = columns.find((col) => col.key === sortColumn);\n\n if (!column || !column.sortable) {\n return sorted;\n }\n\n sorted.sort((a, b) => {\n const aValue = column.dataIndex\n ? a[column.dataIndex]\n : (a as Record<string, unknown>)[column.key];\n const bValue = column.dataIndex\n ? b[column.dataIndex]\n : (b as Record<string, unknown>)[column.key];\n\n // Handle null/undefined\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n // Compare values\n let comparison = 0;\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n comparison = aValue - bValue;\n } else {\n comparison = String(aValue).localeCompare(String(bValue));\n }\n\n return sortDirection === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n }, [filterFilteredData, sortColumn, sortDirection, columns]);\n\n // Apply pagination\n // In controlled mode with server-side pagination, use provided data directly\n // In uncontrolled mode, slice the data client-side\n const paginatedData = useMemo(() => {\n if (!showPagination) {\n return sortedData;\n }\n\n // If in controlled pagination mode with totalItems, assume data is already paginated\n if (isControlledPagination && totalItems !== undefined) {\n return sortedData; // Data is already paginated server-side\n }\n\n // Client-side pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n return sortedData.slice(startIndex, endIndex);\n }, [\n sortedData,\n currentPage,\n pageSize,\n showPagination,\n isControlledPagination,\n totalItems,\n ]);\n\n // Calculate total pages for pagination display\n // Note: Currently not used but kept for future pagination UI enhancements\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _totalPages = useMemo(() => {\n if (!showPagination) return 1;\n if (isControlledPagination && totalItems !== undefined) {\n return Math.ceil(totalItems / pageSize);\n }\n return Math.ceil(sortedData.length / pageSize);\n }, [\n showPagination,\n isControlledPagination,\n totalItems,\n pageSize,\n sortedData.length,\n ]);\n\n // Callbacks\n const handleSearch = useCallback(\n (value: string) => {\n setSearchTerm(value);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on search (only in uncontrolled mode)\n }\n },\n [setSearchTerm, setCurrentPage, isControlledPagination],\n );\n\n const handleFilterChange = useCallback(\n (key: string, value: unknown) => {\n const newFilters = {\n ...columnFilters,\n [key]: value,\n };\n setColumnFilters(newFilters);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on filter (only in uncontrolled mode)\n }\n },\n [columnFilters, setColumnFilters, setCurrentPage, isControlledPagination],\n );\n\n const handleSort = useCallback(\n (column: TableColumn<T>, direction: \"asc\" | \"desc\") => {\n setSortColumn(column.key);\n setSortDirection(direction);\n },\n [setSortColumn, setSortDirection],\n );\n\n const handlePageChange = useCallback(\n (page: number, newPageSize: number) => {\n setCurrentPage(page);\n if (newPageSize !== pageSize) {\n setPageSize(newPageSize);\n setCurrentPage(1); // Reset to first page when page size changes\n }\n },\n [pageSize, setCurrentPage, setPageSize],\n );\n\n // Notify callbacks\n React.useEffect(() => {\n if (onSearch) {\n onSearch(searchTerm, searchFilteredData);\n }\n }, [searchTerm, searchFilteredData, onSearch]);\n\n React.useEffect(() => {\n if (onFilter) {\n onFilter(columnFilters, filterFilteredData);\n }\n }, [columnFilters, filterFilteredData, onFilter]);\n\n return (\n <div className=\"w-full\">\n {/* Search and Filter Bar */}\n {(showSearch || (showFilters && filterable && filters.length > 0)) && (\n <div className={cn(filterBarVariants(), filterBarClassName)}>\n {/* Search */}\n {showSearch && searchable && (\n <div className={cn(\"flex-1 min-w-[200px]\", searchBarClassName)}>\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full\"\n aria-label=\"Search table\"\n />\n </div>\n )}\n\n {/* Column Filters */}\n {showFilters && filterable && filters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {filters.map((filter) => {\n const filterValue = columnFilters[filter.key];\n\n if (filter.type === \"select\" && filter.options) {\n return (\n <select\n key={filter.key}\n value={String(filterValue || \"\")}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value || undefined,\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <Input\n key={filter.key}\n type={filter.type === \"number\" ? \"number\" : \"text\"}\n placeholder={\n filter.placeholder || `Filter ${filter.key}...`\n }\n value={String(filterValue || \"\")}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n filter.type === \"number\"\n ? Number(e.target.value)\n : e.target.value,\n )\n }\n className=\"min-w-[150px]\"\n aria-label={`Filter by ${filter.key}`}\n />\n );\n })}\n\n {/* Clear Filters */}\n {Object.keys(columnFilters).length > 0 && (\n <button\n type=\"button\"\n onClick={() => setColumnFilters({})}\n className=\"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline\"\n aria-label=\"Clear all filters\"\n >\n Clear filters\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Table */}\n <Table\n {...tableProps}\n data={paginatedData}\n columns={columns}\n rowKey={rowKey}\n emptyText={emptyText}\n {...(sortColumn && {\n sortColumn,\n sortDirection,\n })}\n onSort={handleSort}\n {...(showPagination && {\n pagination: {\n current: currentPage,\n pageSize: pageSize,\n total:\n isControlledPagination && totalItems !== undefined\n ? totalItems\n : sortedData.length,\n onChange: handlePageChange,\n showSizeChanger: true,\n },\n })}\n />\n\n {/* Results Summary */}\n {showPagination &&\n (isControlledPagination && totalItems !== undefined\n ? totalItems > 0\n : sortedData.length > 0) && (\n <div className=\"mt-2 px-4 py-2 text-sm text-muted-foreground\">\n {isControlledPagination && totalItems !== undefined ? (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, totalItems)} of {totalItems}{\" \"}\n results\n {searchTerm && \" (filtered)\"}\n </>\n ) : (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, sortedData.length)} of{\" \"}\n {sortedData.length} results\n {searchTerm && ` (filtered from ${initialData.length} total)`}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDataTable.displayName = \"DataTable\";\n\n// Memoize DataTable for performance optimization\n// DataTable is a complex component with filtering, sorting, and pagination\nexport const DataTableMemoized = memo(DataTable) as typeof DataTable;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/core/data-table.tsx"],"names":["filterBarVariants","cva","DataTable","initialData","columns","searchable","searchPlaceholder","searchKeys","onSearch","controlledSearchTerm","onSearchTermChange","filterable","filters","onFilter","controlledColumnFilters","onColumnFiltersChange","defaultSortColumn","defaultSortDirection","controlledSortColumn","controlledSortDirection","onSortChange","defaultPageSize","showPagination","controlledCurrentPage","controlledPageSize","onPageChange","onPageSizeChange","totalItems","showSearch","showFilters","filterBarClassName","searchBarClassName","rowKey","emptyText","tableProps","isControlledSearch","isControlledFilters","isControlledSort","isControlledPagination","internalSearchTerm","setInternalSearchTerm","useState","searchTerm","setSearchTerm","useMemo","value","internalColumnFilters","setInternalColumnFilters","columnFilters","setColumnFilters","internalSortColumn","setInternalSortColumn","internalSortDirection","setInternalSortDirection","sortColumn","sortDirection","setSortColumn","column","setSortDirection","dir","internalCurrentPage","setInternalCurrentPage","internalPageSize","setInternalPageSize","currentPage","pageSize","setCurrentPage","page","setPageSize","size","searchFilteredData","term","keys","col","record","key","filterFilteredData","filter","filterValue","recordValue","sortedData","sorted","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSearch","useCallback","handleFilterChange","newFilters","handleSort","direction","handlePageChange","newPageSize","React","cn","Input","e","option","Table","DataTableMemoized","memo"],"mappings":"qPAwEA,IAAMA,EAAAA,CAAoBC,GAAAA,CACxB,uEAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,UAAA,CACT,OAAA,CAAS,aAAA,CACT,OAAA,CAAS,6BACX,CACF,CAAA,CACA,gBAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAEO,SAASC,EAAAA,CAEd,CACA,IAAA,CAAMC,CAAAA,CACN,OAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,kBAAAC,EAAAA,CAAoB,WAAA,CACpB,UAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAYC,CAAAA,CACZ,mBAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,KAAA,CACb,OAAA,CAAAC,GAAAA,CAAU,EAAC,CACX,SAAAC,CAAAA,CACA,aAAA,CAAeC,CAAAA,CACf,qBAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,EAAAA,CACA,oBAAA,CAAAC,EAAAA,CAAuB,KAAA,CACvB,UAAA,CAAYC,CAAAA,CACZ,aAAA,CAAeC,EAAAA,CACf,YAAA,CAAAC,CAAAA,CACA,gBAAAC,EAAAA,CAAkB,EAAA,CAClB,cAAA,CAAAC,CAAAA,CAAiB,IAAA,CACjB,WAAA,CAAaC,CAAAA,CACb,QAAA,CAAUC,EACV,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,KACb,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,kBAAA,CAAAC,EAAAA,CACA,kBAAA,CAAAC,EAAAA,CACA,MAAA,CAAAC,EAAAA,CAAS,IAAA,CACT,SAAA,CAAAC,EAAAA,CAAY,eAAA,CACZ,GAAGC,EACL,CAAA,CAAsB,CAEpB,IAAMC,CAAAA,CAAqB1B,CAAAA,GAAyB,MAAA,CAC9C2B,CAAAA,CAAsBtB,CAAAA,GAA4B,MAAA,CAClDuB,CAAAA,CAAmBnB,IAAyB,MAAA,CAC5CoB,CAAAA,CAAyBf,CAAAA,GAA0B,MAAA,CAGnD,CAACgB,EAAAA,CAAoBC,EAAqB,CAAA,CAAIC,SAAS,EAAE,CAAA,CACzDC,CAAAA,CAAaP,CAAAA,CACf1B,CAAAA,CACA8B,EAAAA,CACEI,CAAAA,CAAgBC,OAAAA,CACpB,IACET,CAAAA,CACKU,CAAAA,EAAkBnC,CAAAA,GAAqBmC,CAAK,CAAA,CAC7CL,EAAAA,CACN,CAACL,EAAoBzB,CAAkB,CACzC,CAAA,CAGM,CAACoC,EAAAA,CAAuBC,EAAwB,CAAA,CAAIN,QAAAA,CAExD,EAAE,CAAA,CACEO,GAAAA,CAAgBZ,CAAAA,CAClBtB,CAAAA,CACAgC,EAAAA,CACEG,CAAAA,CAAmBL,QACvB,IACER,CAAAA,CACKxB,CAAAA,EAAqCG,CAAAA,GAAwBH,CAAO,CAAA,CACrEmC,EAAAA,CACN,CAACX,CAAAA,CAAqBrB,CAAqB,CAC7C,CAAA,CAGM,CAACmC,EAAAA,CAAoBC,EAAqB,CAAA,CAAIV,SAElDzB,EAAiB,CAAA,CACb,CAACoC,EAAAA,CAAuBC,EAAwB,CAAA,CAAIZ,QAAAA,CAExDxB,EAAoB,EAChBqC,CAAAA,CAAajB,CAAAA,CACfnB,CAAAA,CACAgC,EAAAA,CACEK,CAAAA,CAAgBlB,CAAAA,CAClBlB,EAAAA,CACAiC,EAAAA,CACEI,EAAgBZ,OAAAA,CACpB,IACEP,CAAAA,CACKoB,CAAAA,EAA+B,CAC1BA,CAAAA,EAAUrC,CAAAA,EAAgBmC,CAAAA,EAC5BnC,CAAAA,CAAaqC,CAAAA,CAAQF,CAAa,EAEtC,CAAA,CACAJ,EAAAA,CACN,CAACd,CAAAA,CAAkBjB,EAAcmC,CAAa,CAChD,CAAA,CACMG,CAAAA,CAAmBd,OAAAA,CACvB,IACEP,CAAAA,CACKsB,CAAAA,EAAwB,CACnBL,CAAAA,EAAclC,CAAAA,EAChBA,CAAAA,CAAakC,CAAAA,CAAYK,CAAG,EAEhC,CAAA,CACAN,EAAAA,CACN,CAAChB,CAAAA,CAAkBjB,CAAAA,CAAckC,CAAU,CAC7C,CAAA,CAGM,CAACM,EAAAA,CAAqBC,EAAsB,CAAA,CAAIpB,QAAAA,CAAS,CAAC,CAAA,CAC1D,CAACqB,EAAAA,CAAkBC,EAAmB,CAAA,CAAItB,SAASpB,EAAe,CAAA,CAClE2C,CAAAA,CAAc1B,CAAAA,CAChBf,CAAAA,CACAqC,EAAAA,CACEK,CAAAA,CACJzC,CAAAA,GAAuB,OAAYA,CAAAA,CAAqBsC,EAAAA,CACpDI,CAAAA,CAAiBtB,OAAAA,CACrB,IACEN,CAAAA,CACK6B,CAAAA,EAAiB1C,CAAAA,GAAe0C,CAAI,CAAA,CACrCN,EAAAA,CACN,CAACvB,CAAAA,CAAwBb,CAAY,CACvC,CAAA,CACM2C,CAAAA,CAAcxB,OAAAA,CAClB,IACElB,CAAAA,CACK2C,CAAAA,EAAiB3C,CAAAA,CAAiB2C,CAAI,CAAA,CACvCN,EAAAA,CACN,CAACrC,CAAgB,CACnB,CAAA,CAGM4C,CAAAA,CAAqB1B,OAAAA,CAAQ,IAAM,CACvC,GAAI,CAACvC,CAAAA,EAAc,CAACqC,CAAAA,CAAW,IAAA,EAAK,CAClC,OAAOvC,CAAAA,CAGT,IAAMoE,CAAAA,CAAO7B,CAAAA,CAAW,WAAA,EAAY,CAC9B8B,CAAAA,CACJjE,CAAAA,EACAH,CAAAA,CAAQ,GAAA,CAAKqE,CAAAA,EAAQA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,EAE/D,OAAOtE,CAAAA,CAAY,MAAA,CAAQuE,CAAAA,EAClBF,CAAAA,CAAK,IAAA,CAAMG,CAAAA,EAAQ,CACxB,IAAM9B,CAAAA,CAEC6B,CAAAA,CAAmCC,CAAG,CAAA,CAG7C,OAAI9B,CAAAA,EAAU,IAAA,CAAoC,KAAA,CAE3C,OAAOA,CAAK,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS0B,CAAI,CAClD,CAAC,CACF,CACH,CAAA,CAAG,CAACpE,CAAAA,CAAauC,CAAAA,CAAYrC,CAAAA,CAAYE,CAAAA,CAAYH,CAAO,CAAC,CAAA,CAGvDwE,CAAAA,CAAqBhC,OAAAA,CAAQ,IAE/B,CAACjC,CAAAA,EACDC,GAAAA,CAAQ,SAAW,CAAA,EACnB,MAAA,CAAO,IAAA,CAAKoC,GAAa,CAAA,CAAE,MAAA,GAAW,CAAA,CAE/BsB,CAAAA,CAGFA,EAAmB,MAAA,CAAQI,CAAAA,EACzB9D,GAAAA,CAAQ,KAAA,CAAOiE,CAAAA,EAAW,CAC/B,IAAMC,CAAAA,CAAc9B,GAAAA,CAAc6B,CAAAA,CAAO,GAAG,CAAA,CAG5C,GAEEC,CAAAA,EAAgB,IAAA,EAChBA,CAAAA,GAAgB,GAEhB,OAAO,KAAA,CAIT,GAAID,CAAAA,CAAO,QAAA,CACT,OAAOA,CAAAA,CAAO,QAAA,CAASC,EAAaJ,CAAM,CAAA,CAI5C,IAAMK,CAAAA,CAAeL,CAAAA,CAAmCG,CAAAA,CAAO,GAAG,CAAA,CAElE,OAAQA,CAAAA,CAAO,IAAA,EACb,KAAK,MAAA,CACH,OAAO,MAAA,CAAOE,CAAW,CAAA,CACtB,WAAA,EAAY,CACZ,QAAA,CAAS,MAAA,CAAOD,CAAW,CAAA,CAAE,WAAA,EAAa,CAAA,CAC/C,KAAK,QAAA,CACH,OAAO,MAAA,CAAOC,CAAW,CAAA,GAAM,MAAA,CAAOD,CAAW,CAAA,CACnD,KAAK,SAAA,CACH,OAAO,CAAA,CAAQC,CAAAA,EAAiB,CAAA,CAAQD,EAC1C,KAAK,QAAA,CACH,OAAO,MAAA,CAAOC,CAAW,CAAA,GAAM,MAAA,CAAOD,CAAW,CAAA,CACnD,QACE,OAAO,MAAA,CAAOC,CAAW,CAAA,CAAE,QAAA,CAAS,MAAA,CAAOD,CAAW,CAAC,CAC3D,CACF,CAAC,CACF,CAAA,CACA,CAACR,CAAAA,CAAoBtB,IAAerC,CAAAA,CAAYC,GAAO,CAAC,CAAA,CAGrDoE,CAAAA,CAAapC,OAAAA,CAAQ,IAAM,CAC/B,GAAI,CAACU,CAAAA,CACH,OAAOsB,CAAAA,CAGT,IAAMK,CAAAA,CAAS,CAAC,GAAGL,CAAkB,CAAA,CAC/BnB,CAAAA,CAASrD,CAAAA,CAAQ,IAAA,CAAMqE,CAAAA,EAAQA,CAAAA,CAAI,GAAA,GAAQnB,CAAU,CAAA,CAE3D,OAAI,CAACG,CAAAA,EAAU,CAACA,CAAAA,CAAO,QAAA,EAIvBwB,CAAAA,CAAO,KAAK,CAACC,CAAAA,CAAGC,CAAAA,GAAM,CACpB,IAAMC,CAAAA,CAAS3B,CAAAA,CAAO,SAAA,CAClByB,EAAEzB,CAAAA,CAAO,SAAS,CAAA,CACjByB,CAAAA,CAA8BzB,CAAAA,CAAO,GAAG,CAAA,CACvC4B,CAAAA,CAAS5B,CAAAA,CAAO,SAAA,CAClB0B,CAAAA,CAAE1B,CAAAA,CAAO,SAAS,CAAA,CACjB0B,CAAAA,CAA8B1B,CAAAA,CAAO,GAAG,CAAA,CAG7C,GAAI2B,CAAAA,EAAW,IAAA,CAA8B,OAAO,CAAA,CACpD,GAAIC,CAAAA,EAAW,KAA8B,OAAO,GAAA,CAGpD,IAAIC,CAAAA,CAAa,CAAA,CACjB,OAAI,OAAOF,CAAAA,EAAW,UAAY,OAAOC,CAAAA,EAAW,QAAA,CAClDC,CAAAA,CAAaF,CAAAA,CAASC,CAAAA,CAEtBC,CAAAA,CAAa,MAAA,CAAOF,CAAM,CAAA,CAAE,aAAA,CAAc,MAAA,CAAOC,CAAM,CAAC,CAAA,CAGnD9B,CAAAA,GAAkB,MAAQ+B,CAAAA,CAAa,CAACA,CACjD,CAAC,CAAA,CAEML,CACT,CAAA,CAAG,CAACL,CAAAA,CAAoBtB,CAAAA,CAAYC,CAAAA,CAAenD,CAAO,CAAC,CAAA,CAKrDmF,EAAAA,CAAgB3C,OAAAA,CAAQ,IAAM,CAMlC,GALI,CAACtB,CAAAA,EAKDgB,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CAC3C,OAAOqD,CAAAA,CAIT,IAAMQ,CAAAA,CAAAA,CAAcxB,CAAAA,CAAc,CAAA,EAAKC,CAAAA,CACjCwB,CAAAA,CAAWD,CAAAA,CAAavB,EAE9B,OAAOe,CAAAA,CAAW,KAAA,CAAMQ,CAAAA,CAAYC,CAAQ,CAC9C,CAAA,CAAG,CACDT,EACAhB,CAAAA,CACAC,CAAAA,CACA3C,CAAAA,CACAgB,CAAAA,CACAX,CACF,CAAC,CAAA,CAKmBiB,QAAQ,IACrBtB,CAAAA,CAEI,IAAA,CAAK,IAAA,CADVgB,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CAC1BA,CAAAA,CAAasC,CAAAA,CAEfe,CAAAA,CAAW,MAAA,CAASf,CAFG,CAAA,CAFZ,CAAA,CAK3B,CACD3C,CAAAA,CACAgB,EACAX,CAAAA,CACAsC,CAAAA,CACAe,CAAAA,CAAW,MACb,CAAC,CAAA,KAGKU,EAAAA,CAAeC,WAAAA,CAClB9C,GAAkB,CACjBF,CAAAA,CAAcE,CAAK,CAAA,CACdP,CAAAA,EACH4B,CAAAA,CAAe,CAAC,EAEpB,EACA,CAACvB,CAAAA,CAAeuB,CAAAA,CAAgB5B,CAAsB,CACxD,CAAA,CAEMsD,EAAAA,CAAqBD,WAAAA,CACzB,CAAChB,CAAAA,CAAa9B,CAAAA,GAAmB,CAC/B,IAAMgD,CAAAA,CAAa,CACjB,GAAG7C,IACH,CAAC2B,CAAG,EAAG9B,CACT,CAAA,CACAI,CAAAA,CAAiB4C,CAAU,CAAA,CACtBvD,GACH4B,CAAAA,CAAe,CAAC,EAEpB,CAAA,CACA,CAAClB,GAAAA,CAAeC,CAAAA,CAAkBiB,CAAAA,CAAgB5B,CAAsB,CAC1E,CAAA,CAEMwD,EAAAA,CAAaH,WAAAA,CACjB,CAAClC,CAAAA,CAAwBsC,CAAAA,GAA8B,CACrDvC,CAAAA,CAAcC,CAAAA,CAAO,GAAG,CAAA,CACxBC,CAAAA,CAAiBqC,CAAS,EAC5B,CAAA,CACA,CAACvC,CAAAA,CAAeE,CAAgB,CAClC,CAAA,CAEMsC,EAAAA,CAAmBL,WAAAA,CACvB,CAACxB,CAAAA,CAAc8B,CAAAA,GAAwB,CACrC/B,CAAAA,CAAeC,CAAI,CAAA,CACf8B,CAAAA,GAAgBhC,CAAAA,GAClBG,CAAAA,CAAY6B,CAAW,CAAA,CACvB/B,CAAAA,CAAe,CAAC,CAAA,EAEpB,CAAA,CACA,CAACD,CAAAA,CAAUC,CAAAA,CAAgBE,CAAW,CACxC,EAGA,OAAA8B,CAAAA,CAAM,SAAA,CAAU,IAAM,CAChB1F,GACFA,CAAAA,CAASkC,CAAAA,CAAY4B,CAAkB,EAE3C,CAAA,CAAG,CAAC5B,CAAAA,CAAY4B,CAAAA,CAAoB9D,CAAQ,CAAC,CAAA,CAE7C0F,CAAAA,CAAM,SAAA,CAAU,IAAM,CAChBrF,CAAAA,EACFA,CAAAA,CAASmC,IAAe4B,CAAkB,EAE9C,CAAA,CAAG,CAAC5B,GAAAA,CAAe4B,CAAAA,CAAoB/D,CAAQ,CAAC,CAAA,CAG9CqF,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CAAA,CAAA,CAEXtE,CAAAA,EAAeC,CAAAA,EAAelB,GAAcC,GAAAA,CAAQ,MAAA,CAAS,CAAA,GAC7DsF,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,GAAAA,CAAGnG,IAAkB,CAAG8B,EAAkB,CAAA,CAAA,CAEvDF,CAAAA,EAAcvB,CAAAA,EACb6F,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,UAAWC,GAAAA,CAAG,sBAAA,CAAwBpE,EAAkB,CAAA,CAAA,CAC3DmE,CAAAA,CAAA,aAAA,CAACE,CAAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,WAAA,CAAa9F,EAAAA,CACb,KAAA,CAAOoC,CAAAA,CACP,QAAA,CAAW,CAAA,EAAMgD,GAAa,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC5C,SAAA,CAAU,QAAA,CACV,YAAA,CAAW,cAAA,CACb,CACF,CAAA,CAID7D,CAAAA,EAAelB,CAAAA,EAAcC,GAAAA,CAAQ,MAAA,CAAS,CAAA,EAC7CsF,CAAAA,CAAA,aAAA,CAAC,OAAI,SAAA,CAAU,mCAAA,CAAA,CACZtF,GAAAA,CAAQ,GAAA,CAAKiE,CAAAA,EAAW,CACvB,IAAMC,CAAAA,CAAc9B,GAAAA,CAAc6B,CAAAA,CAAO,GAAG,CAAA,CAE5C,OAAIA,CAAAA,CAAO,IAAA,GAAS,QAAA,EAAYA,EAAO,OAAA,CAEnCqB,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKrB,CAAAA,CAAO,GAAA,CACZ,KAAA,CAAO,MAAA,CAAOC,CAAAA,EAAe,EAAE,CAAA,CAC/B,QAAA,CAAWuB,CAAAA,EACTT,EAAAA,CACEf,CAAAA,CAAO,IACPwB,CAAAA,CAAE,MAAA,CAAO,KAAA,EAAS,MACpB,CAAA,CAEF,SAAA,CAAU,uHAAA,CACV,YAAA,CAAY,CAAA,UAAA,EAAaxB,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CAEnCqB,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CAAO,KAAA,CAAM,IAAG,MAAA,CAAKrB,CAAAA,CAAO,GAAI,CAAA,CAChCA,CAAAA,CAAO,OAAA,CAAQ,GAAA,CAAKyB,CAAAA,EACnBJ,EAAA,aAAA,CAAC,QAAA,CAAA,CAAO,GAAA,CAAKI,CAAAA,CAAO,KAAA,CAAO,KAAA,CAAO,MAAA,CAAOA,CAAAA,CAAO,KAAK,CAAA,CAAA,CAClDA,CAAAA,CAAO,KACV,CACD,CACH,CAAA,CAKFJ,CAAAA,CAAA,aAAA,CAACE,CAAAA,CAAA,CACC,GAAA,CAAKvB,CAAAA,CAAO,GAAA,CACZ,IAAA,CAAMA,CAAAA,CAAO,IAAA,GAAS,SAAW,QAAA,CAAW,MAAA,CAC5C,WAAA,CACEA,CAAAA,CAAO,WAAA,EAAe,CAAA,OAAA,EAAUA,CAAAA,CAAO,GAAG,MAE5C,KAAA,CAAO,MAAA,CAAOC,CAAAA,EAAe,EAAE,CAAA,CAC/B,QAAA,CAAWuB,CAAAA,EACTT,EAAAA,CACEf,EAAO,GAAA,CACPA,CAAAA,CAAO,IAAA,GAAS,QAAA,CACZ,MAAA,CAAOwB,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACrBA,CAAAA,CAAE,MAAA,CAAO,KACf,CAAA,CAEF,SAAA,CAAU,eAAA,CACV,YAAA,CAAY,aAAaxB,CAAAA,CAAO,GAAG,CAAA,CAAA,CACrC,CAEJ,CAAC,CAAA,CAGA,MAAA,CAAO,IAAA,CAAK7B,GAAa,CAAA,CAAE,MAAA,CAAS,CAAA,EACnCkD,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMjD,CAAAA,CAAiB,EAAE,CAAA,CAClC,SAAA,CAAU,yEAAA,CACV,YAAA,CAAW,mBAAA,CAAA,CACZ,eAED,CAEJ,CAEJ,CAAA,CAIFiD,CAAAA,CAAA,aAAA,CAACK,CAAAA,CAAA,CACE,GAAGrE,EAAAA,CACJ,IAAA,CAAMqD,EAAAA,CACN,OAAA,CAASnF,CAAAA,CACT,MAAA,CAAQ4B,EAAAA,CACR,SAAA,CAAWC,EAAAA,CACV,GAAIqB,CAAAA,EAAc,CACjB,UAAA,CAAAA,CAAAA,CACA,aAAA,CAAAC,CACF,CAAA,CACA,MAAA,CAAQuC,EAAAA,CACP,GAAIxE,CAAAA,EAAkB,CACrB,UAAA,CAAY,CACV,OAAA,CAAS0C,CAAAA,CACT,QAAA,CAAUC,CAAAA,CACV,KAAA,CACE3B,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CACrCA,EACAqD,CAAAA,CAAW,MAAA,CACjB,QAAA,CAAUgB,EAAAA,CACV,eAAA,CAAiB,IACnB,CACF,CAAA,CACF,EAGC1E,CAAAA,GACEgB,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CACtCA,CAAAA,CAAa,CAAA,CACbqD,CAAAA,CAAW,MAAA,CAAS,IACtBkB,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CAAA,CACZ5D,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CACxCuE,CAAAA,CAAA,aAAA,CAAAA,CAAAA,CAAA,QAAA,CAAA,IAAA,CAAE,UAAA,CAAA,CACUlC,CAAAA,CAAc,CAAA,EAAKC,CAAAA,CAAW,EAAE,KAAA,CAAI,GAAA,CAC7C,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAcC,CAAAA,CAAUtC,CAAU,CAAA,CAAE,OAAKA,CAAAA,CAAY,GAAA,CAAI,SAAA,CAElEe,CAAAA,EAAc,aACjB,CAAA,CAEAwD,CAAAA,CAAA,aAAA,CAAAA,EAAA,QAAA,CAAA,IAAA,CAAE,UAAA,CAAA,CACUlC,CAAAA,CAAc,CAAA,EAAKC,CAAAA,CAAW,CAAA,CAAE,KAAA,CAAI,GAAA,CAC7C,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAcC,CAAAA,CAAUe,CAAAA,CAAW,MAAM,CAAA,CAAE,KAAA,CAAI,IACxDA,CAAAA,CAAW,MAAA,CAAO,UAAA,CAClBtC,CAAAA,EAAc,CAAA,gBAAA,EAAmBvC,CAAAA,CAAY,MAAM,CAAA,OAAA,CACtD,CAEJ,CAEN,CAEJ,CAEAD,EAAAA,CAAU,WAAA,CAAc,WAAA,CAIjB,IAAMsG,EAAAA,CAAoBC,EAAKvG,EAAS","file":"chunk-XJJJEWSU.js","sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\nimport { Table, TableColumn, TableProps } from \"./table\";\nimport { Input } from \"./input\";\n\n// Filter types\nexport type FilterType = \"text\" | \"select\" | \"number\" | \"date\" | \"boolean\";\n\nexport interface ColumnFilter<T = Record<string, unknown>> {\n key: string;\n type: FilterType;\n options?: Array<{ label: string; value: string | number }>;\n placeholder?: string;\n filterFn?: (value: unknown, record: T) => boolean;\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> extends Omit<\n TableProps<T>,\n \"data\" | \"onSort\" | \"sortColumn\" | \"sortDirection\"\n> {\n data: T[];\n columns: TableColumn<T>[];\n\n // Search\n searchable?: boolean;\n searchPlaceholder?: string;\n searchKeys?: Array<keyof T | string>;\n onSearch?: (searchTerm: string, filteredData: T[]) => void;\n\n // Controlled search (for server-side filtering)\n searchTerm?: string;\n onSearchTermChange?: (searchTerm: string) => void;\n\n // Filtering\n filterable?: boolean;\n filters?: ColumnFilter<T>[];\n onFilter?: (filters: Record<string, unknown>, filteredData: T[]) => void;\n\n // Controlled filters (for server-side filtering)\n columnFilters?: Record<string, unknown>;\n onColumnFiltersChange?: (filters: Record<string, unknown>) => void;\n\n // Sorting (enhanced)\n defaultSortColumn?: string;\n defaultSortDirection?: \"asc\" | \"desc\";\n\n // Controlled sorting (for server-side sorting)\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n onSortChange?: (column: string, direction: \"asc\" | \"desc\") => void;\n\n // Pagination (enhanced)\n defaultPageSize?: number;\n showPagination?: boolean;\n\n // Controlled pagination (for server-side pagination)\n currentPage?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n totalItems?: number; // Required for server-side pagination\n\n // UI\n showSearch?: boolean;\n showFilters?: boolean;\n filterBarClassName?: string;\n searchBarClassName?: string;\n}\n\n// Filter bar component\nconst filterBarVariants = cva(\n \"flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n compact: \"p-2 bg-card\",\n minimal: \"p-2 bg-transparent border-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function DataTable<\n T extends Record<string, unknown> = Record<string, unknown>,\n>({\n data: initialData,\n columns,\n searchable = true,\n searchPlaceholder = \"Search...\",\n searchKeys,\n onSearch,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n filterable = false,\n filters = [],\n onFilter,\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n defaultSortColumn,\n defaultSortDirection = \"asc\",\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n onSortChange,\n defaultPageSize = 10,\n showPagination = true,\n currentPage: controlledCurrentPage,\n pageSize: controlledPageSize,\n onPageChange,\n onPageSizeChange,\n totalItems,\n showSearch = true,\n showFilters = true,\n filterBarClassName,\n searchBarClassName,\n rowKey = \"id\",\n emptyText = \"No data found\",\n ...tableProps\n}: DataTableProps<T>) {\n // Determine if component is in controlled mode\n const isControlledSearch = controlledSearchTerm !== undefined;\n const isControlledFilters = controlledColumnFilters !== undefined;\n const isControlledSort = controlledSortColumn !== undefined;\n const isControlledPagination = controlledCurrentPage !== undefined;\n\n // Search state (controlled or uncontrolled)\n const [internalSearchTerm, setInternalSearchTerm] = useState(\"\");\n const searchTerm = isControlledSearch\n ? controlledSearchTerm\n : internalSearchTerm;\n const setSearchTerm = useMemo(\n () =>\n isControlledSearch\n ? (value: string) => onSearchTermChange?.(value)\n : setInternalSearchTerm,\n [isControlledSearch, onSearchTermChange],\n );\n\n // Filter state (controlled or uncontrolled)\n const [internalColumnFilters, setInternalColumnFilters] = useState<\n Record<string, unknown>\n >({});\n const columnFilters = isControlledFilters\n ? controlledColumnFilters\n : internalColumnFilters;\n const setColumnFilters = useMemo(\n () =>\n isControlledFilters\n ? (filters: Record<string, unknown>) => onColumnFiltersChange?.(filters)\n : setInternalColumnFilters,\n [isControlledFilters, onColumnFiltersChange],\n );\n\n // Sort state (controlled or uncontrolled)\n const [internalSortColumn, setInternalSortColumn] = useState<\n string | undefined\n >(defaultSortColumn);\n const [internalSortDirection, setInternalSortDirection] = useState<\n \"asc\" | \"desc\"\n >(defaultSortDirection);\n const sortColumn = isControlledSort\n ? controlledSortColumn\n : internalSortColumn;\n const sortDirection = isControlledSort\n ? controlledSortDirection\n : internalSortDirection;\n const setSortColumn = useMemo(\n () =>\n isControlledSort\n ? (column: string | undefined) => {\n if (column && onSortChange && sortDirection) {\n onSortChange(column, sortDirection);\n }\n }\n : setInternalSortColumn,\n [isControlledSort, onSortChange, sortDirection],\n );\n const setSortDirection = useMemo(\n () =>\n isControlledSort\n ? (dir: \"asc\" | \"desc\") => {\n if (sortColumn && onSortChange) {\n onSortChange(sortColumn, dir);\n }\n }\n : setInternalSortDirection,\n [isControlledSort, onSortChange, sortColumn],\n );\n\n // Pagination state (controlled or uncontrolled)\n const [internalCurrentPage, setInternalCurrentPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const currentPage = isControlledPagination\n ? controlledCurrentPage\n : internalCurrentPage;\n const pageSize =\n controlledPageSize !== undefined ? controlledPageSize : internalPageSize;\n const setCurrentPage = useMemo(\n () =>\n isControlledPagination\n ? (page: number) => onPageChange?.(page)\n : setInternalCurrentPage,\n [isControlledPagination, onPageChange],\n );\n const setPageSize = useMemo(\n () =>\n onPageSizeChange\n ? (size: number) => onPageSizeChange(size)\n : setInternalPageSize,\n [onPageSizeChange],\n );\n\n // Apply search\n const searchFilteredData = useMemo(() => {\n if (!searchable || !searchTerm.trim()) {\n return initialData;\n }\n\n const term = searchTerm.toLowerCase();\n const keys =\n searchKeys ||\n columns.map((col) => col.dataIndex || col.key).filter(Boolean);\n\n return initialData.filter((record) => {\n return keys.some((key) => {\n const value =\n typeof key === \"string\"\n ? (record as Record<string, unknown>)[key]\n : record[key as keyof T];\n\n if (value === null || value === undefined) return false;\n\n return String(value).toLowerCase().includes(term);\n });\n });\n }, [initialData, searchTerm, searchable, searchKeys, columns]);\n\n // Apply column filters\n const filterFilteredData = useMemo(() => {\n if (\n !filterable ||\n filters.length === 0 ||\n Object.keys(columnFilters).length === 0\n ) {\n return searchFilteredData;\n }\n\n return searchFilteredData.filter((record) => {\n return filters.every((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // Skip if no filter value\n if (\n filterValue === undefined ||\n filterValue === null ||\n filterValue === \"\"\n ) {\n return true;\n }\n\n // Use custom filter function if provided\n if (filter.filterFn) {\n return filter.filterFn(filterValue, record);\n }\n\n // Default filtering logic\n const recordValue = (record as Record<string, unknown>)[filter.key];\n\n switch (filter.type) {\n case \"text\":\n return String(recordValue)\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n case \"number\":\n return Number(recordValue) === Number(filterValue);\n case \"boolean\":\n return Boolean(recordValue) === Boolean(filterValue);\n case \"select\":\n return String(recordValue) === String(filterValue);\n default:\n return String(recordValue).includes(String(filterValue));\n }\n });\n });\n }, [searchFilteredData, columnFilters, filterable, filters]);\n\n // Apply sorting\n const sortedData = useMemo(() => {\n if (!sortColumn) {\n return filterFilteredData;\n }\n\n const sorted = [...filterFilteredData];\n const column = columns.find((col) => col.key === sortColumn);\n\n if (!column || !column.sortable) {\n return sorted;\n }\n\n sorted.sort((a, b) => {\n const aValue = column.dataIndex\n ? a[column.dataIndex]\n : (a as Record<string, unknown>)[column.key];\n const bValue = column.dataIndex\n ? b[column.dataIndex]\n : (b as Record<string, unknown>)[column.key];\n\n // Handle null/undefined\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n // Compare values\n let comparison = 0;\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n comparison = aValue - bValue;\n } else {\n comparison = String(aValue).localeCompare(String(bValue));\n }\n\n return sortDirection === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n }, [filterFilteredData, sortColumn, sortDirection, columns]);\n\n // Apply pagination\n // In controlled mode with server-side pagination, use provided data directly\n // In uncontrolled mode, slice the data client-side\n const paginatedData = useMemo(() => {\n if (!showPagination) {\n return sortedData;\n }\n\n // If in controlled pagination mode with totalItems, assume data is already paginated\n if (isControlledPagination && totalItems !== undefined) {\n return sortedData; // Data is already paginated server-side\n }\n\n // Client-side pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n return sortedData.slice(startIndex, endIndex);\n }, [\n sortedData,\n currentPage,\n pageSize,\n showPagination,\n isControlledPagination,\n totalItems,\n ]);\n\n // Calculate total pages for pagination display\n // Note: Currently not used but kept for future pagination UI enhancements\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _totalPages = useMemo(() => {\n if (!showPagination) return 1;\n if (isControlledPagination && totalItems !== undefined) {\n return Math.ceil(totalItems / pageSize);\n }\n return Math.ceil(sortedData.length / pageSize);\n }, [\n showPagination,\n isControlledPagination,\n totalItems,\n pageSize,\n sortedData.length,\n ]);\n\n // Callbacks\n const handleSearch = useCallback(\n (value: string) => {\n setSearchTerm(value);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on search (only in uncontrolled mode)\n }\n },\n [setSearchTerm, setCurrentPage, isControlledPagination],\n );\n\n const handleFilterChange = useCallback(\n (key: string, value: unknown) => {\n const newFilters = {\n ...columnFilters,\n [key]: value,\n };\n setColumnFilters(newFilters);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on filter (only in uncontrolled mode)\n }\n },\n [columnFilters, setColumnFilters, setCurrentPage, isControlledPagination],\n );\n\n const handleSort = useCallback(\n (column: TableColumn<T>, direction: \"asc\" | \"desc\") => {\n setSortColumn(column.key);\n setSortDirection(direction);\n },\n [setSortColumn, setSortDirection],\n );\n\n const handlePageChange = useCallback(\n (page: number, newPageSize: number) => {\n setCurrentPage(page);\n if (newPageSize !== pageSize) {\n setPageSize(newPageSize);\n setCurrentPage(1); // Reset to first page when page size changes\n }\n },\n [pageSize, setCurrentPage, setPageSize],\n );\n\n // Notify callbacks\n React.useEffect(() => {\n if (onSearch) {\n onSearch(searchTerm, searchFilteredData);\n }\n }, [searchTerm, searchFilteredData, onSearch]);\n\n React.useEffect(() => {\n if (onFilter) {\n onFilter(columnFilters, filterFilteredData);\n }\n }, [columnFilters, filterFilteredData, onFilter]);\n\n return (\n <div className=\"w-full\">\n {/* Search and Filter Bar */}\n {(showSearch || (showFilters && filterable && filters.length > 0)) && (\n <div className={cn(filterBarVariants(), filterBarClassName)}>\n {/* Search */}\n {showSearch && searchable && (\n <div className={cn(\"flex-1 min-w-[200px]\", searchBarClassName)}>\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full\"\n aria-label=\"Search table\"\n />\n </div>\n )}\n\n {/* Column Filters */}\n {showFilters && filterable && filters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {filters.map((filter) => {\n const filterValue = columnFilters[filter.key];\n\n if (filter.type === \"select\" && filter.options) {\n return (\n <select\n key={filter.key}\n value={String(filterValue || \"\")}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value || undefined,\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <Input\n key={filter.key}\n type={filter.type === \"number\" ? \"number\" : \"text\"}\n placeholder={\n filter.placeholder || `Filter ${filter.key}...`\n }\n value={String(filterValue || \"\")}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n filter.type === \"number\"\n ? Number(e.target.value)\n : e.target.value,\n )\n }\n className=\"min-w-[150px]\"\n aria-label={`Filter by ${filter.key}`}\n />\n );\n })}\n\n {/* Clear Filters */}\n {Object.keys(columnFilters).length > 0 && (\n <button\n type=\"button\"\n onClick={() => setColumnFilters({})}\n className=\"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline\"\n aria-label=\"Clear all filters\"\n >\n Clear filters\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Table */}\n <Table\n {...tableProps}\n data={paginatedData}\n columns={columns}\n rowKey={rowKey}\n emptyText={emptyText}\n {...(sortColumn && {\n sortColumn,\n sortDirection,\n })}\n onSort={handleSort}\n {...(showPagination && {\n pagination: {\n current: currentPage,\n pageSize: pageSize,\n total:\n isControlledPagination && totalItems !== undefined\n ? totalItems\n : sortedData.length,\n onChange: handlePageChange,\n showSizeChanger: true,\n },\n })}\n />\n\n {/* Results Summary */}\n {showPagination &&\n (isControlledPagination && totalItems !== undefined\n ? totalItems > 0\n : sortedData.length > 0) && (\n <div className=\"mt-2 px-4 py-2 text-sm text-muted-foreground\">\n {isControlledPagination && totalItems !== undefined ? (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, totalItems)} of {totalItems}{\" \"}\n results\n {searchTerm && \" (filtered)\"}\n </>\n ) : (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, sortedData.length)} of{\" \"}\n {sortedData.length} results\n {searchTerm && ` (filtered from ${initialData.length} total)`}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDataTable.displayName = \"DataTable\";\n\n// Memoize DataTable for performance optimization\n// DataTable is a complex component with filtering, sorting, and pagination\nexport const DataTableMemoized = memo(DataTable) as typeof DataTable;\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a as a$1}from'./chunk-COXN6XBA.js';import {a}from'./chunk-AC2JBXHQ.js';import r from'react';import {ResponsiveContainer,PieChart,Pie,Cell,Tooltip,Legend,AreaChart,CartesianGrid,XAxis,YAxis,Area,BarChart,Bar,LineChart,Line}from'recharts';import {cva}from'class-variance-authority';var U=cva("w-full",{variants:{variant:{default:"",minimal:"",detailed:""},size:{sm:"h-48",md:"h-64",lg:"h-96",xl:"h-[500px]"}},defaultVariants:{variant:"default",size:"md"}}),s=["hsl(var(--nostromo-color-brand-500))","hsl(var(--nostromo-color-info-500))","hsl(var(--nostromo-color-success-500))","hsl(var(--nostromo-color-warning-500))","hsl(var(--nostromo-color-error-500))","hsl(var(--nostromo-color-brand-300))","hsl(var(--nostromo-color-info-700))","hsl(var(--nostromo-color-success-700))"],g=({active:u,payload:t,label:i})=>u&&t&&t.length?r.createElement("div",{className:"rounded-lg border border-border bg-popover p-3 shadow-lg"},r.createElement("p",{className:"mb-2 font-semibold text-popover-foreground"},String(i??"")),t.map((m,n)=>r.createElement("p",{key:n,className:"text-sm",style:{color:m.color}},`${m.name??""}: ${m.value??""}`))):null,v=({payload:u})=>r.createElement("div",{className:"mt-4 flex flex-wrap justify-center gap-4"},u?.map((t,i)=>r.createElement("div",{key:i,className:"flex items-center gap-2"},r.createElement("div",{className:"h-3 w-3 rounded",style:{backgroundColor:t.color},"aria-hidden":"true"}),r.createElement("span",{className:"text-sm text-popover-foreground"},t.value)))),w=r.forwardRef(({type:u,data:t,dataKeys:i,xAxisKey:m="name",colors:n=s,showGrid:C=true,showLegend:h=true,showTooltip:d=true,title:b,description:N,className:z,variant:A,size:p,height:K,ariaLabel:T,ariaLabelledBy:V,strokeWidth:D=2,fillOpacity:B=.6,...I},j)=>{let L=K||(p==="sm"?192:p==="lg"?384:p==="xl"?500:256),H=()=>{if(typeof window>"u")return r.createElement("div",{className:"flex items-center justify-center h-full text-muted-foreground"},r.createElement("p",null,"Chart loading..."));let y={data:t,margin:{top:5,right:5,left:5,bottom:5}};switch(u){case "line":return r.createElement(LineChart,{...y},C&&r.createElement(CartesianGrid,{strokeDasharray:"3 3",stroke:"hsl(var(--nostromo-color-neutral-300))"}),r.createElement(XAxis,{dataKey:m,stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),r.createElement(YAxis,{stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),d&&r.createElement(Tooltip,{content:r.createElement(g,null)}),i.map((e,a)=>{let o=a%n.length,l=n[o]??s[o%s.length];return r.createElement(Line,{key:e,type:"monotone",dataKey:e,stroke:l,strokeWidth:D,dot:{r:4,fill:l},activeDot:{r:6}})}),h&&r.createElement(Legend,{content:r.createElement(v,null)}));case "bar":return r.createElement(BarChart,{...y},C&&r.createElement(CartesianGrid,{strokeDasharray:"3 3",stroke:"hsl(var(--nostromo-color-neutral-300))"}),r.createElement(XAxis,{dataKey:m,stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),r.createElement(YAxis,{stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),d&&r.createElement(Tooltip,{content:r.createElement(g,null)}),i.map((e,a)=>{let o=a%n.length,l=n[o]??s[o%s.length];return r.createElement(Bar,{key:e,dataKey:e,fill:l,radius:[4,4,0,0]})}),h&&r.createElement(Legend,{content:r.createElement(v,null)}));case "area":return r.createElement(AreaChart,{...y},C&&r.createElement(CartesianGrid,{strokeDasharray:"3 3",stroke:"hsl(var(--nostromo-color-neutral-300))"}),r.createElement(XAxis,{dataKey:m,stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),r.createElement(YAxis,{stroke:"hsl(var(--nostromo-color-neutral-600))",tick:{fill:"hsl(var(--nostromo-color-neutral-700))",fontSize:12}}),d&&r.createElement(Tooltip,{content:r.createElement(g,null)}),i.map((e,a)=>{let o=a%n.length,l=n[o]??s[o%s.length];return r.createElement(Area,{key:e,type:"monotone",dataKey:e,stroke:l,fill:l,fillOpacity:B,strokeWidth:D})}),h&&r.createElement(Legend,{content:r.createElement(v,null)}));case "pie":{let e=i[0]||"value";return r.createElement(PieChart,null,r.createElement(Pie,{data:t,dataKey:e,nameKey:m,cx:"50%",cy:"50%",outerRadius:L/4,label:a=>`${a.name??""}: ${((a.percent??0)*100).toFixed(0)}%`},t.map((a,o)=>{let l=n[o%n.length]||s[o%s.length];return r.createElement(Cell,{key:`cell-${o}`,fill:l??"#8884d8"})})),d&&r.createElement(Tooltip,{content:r.createElement(g,null)}),h&&r.createElement(Legend,{content:r.createElement(v,null)}))}default:return null}};return r.createElement("div",{ref:j,className:a(U({variant:A,size:p}),z),role:"img","aria-label":T||b||`${u} chart`,"aria-labelledby":V,...I},b&&r.createElement("h3",{className:"mb-2 text-lg font-semibold text-foreground"},b),N&&r.createElement("p",{className:"mb-4 text-sm text-muted-foreground"},N),r.createElement(ResponsiveContainer,{width:"100%",height:L},H()))});w.displayName="Chart";var tr=a$1(w);export{U as a,tr as b};//# sourceMappingURL=chunk-XLZJ6HBL.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-XLZJ6HBL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/charts.tsx"],"names":["chartContainerVariants","cva","defaultColors","CustomTooltip","active","payload","label","React","entry","index","CustomLegend","ChartComponent","type","data","dataKeys","xAxisKey","colors","showGrid","showLegend","showTooltip","title","description","className","variant","size","height","ariaLabel","ariaLabelledBy","strokeWidth","fillOpacity","props","ref","chartHeight","renderChart","commonProps","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","key","colorIndex","color","Line","Legend","BarChart","Bar","AreaChart","Area","pieDataKey","PieChart","Pie","fillColor","Cell","cn","ResponsiveContainer","Chart","memo"],"mappings":"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","file":"chunk-XLZJ6HBL.js","sourcesContent":["import React from \"react\";\nimport {\n LineChart,\n Line,\n BarChart,\n Bar,\n PieChart,\n Pie,\n AreaChart,\n Area,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n ResponsiveContainer,\n Cell,\n} from \"recharts\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\n\n// Chart container variants\nconst chartContainerVariants = cva(\"w-full\", {\n variants: {\n variant: {\n default: \"\",\n minimal: \"\",\n detailed: \"\",\n },\n size: {\n sm: \"h-48\",\n md: \"h-64\",\n lg: \"h-96\",\n xl: \"h-[500px]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\nexport type ChartType = \"line\" | \"bar\" | \"pie\" | \"area\";\n\nexport interface ChartDataPoint {\n name: string;\n [key: string]: string | number;\n}\n\nexport interface ChartProps extends VariantProps<\n typeof chartContainerVariants\n> {\n type: ChartType;\n data: ChartDataPoint[];\n dataKeys: string[];\n xAxisKey?: string;\n colors?: (string | undefined)[];\n showGrid?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n title?: string;\n description?: string;\n className?: string;\n height?: number;\n // Accessibility\n ariaLabel?: string;\n ariaLabelledBy?: string;\n // Styling\n strokeWidth?: number;\n fillOpacity?: number;\n}\n\n// Default color palette matching Nostromo theme\nconst defaultColors = [\n // Ordered for distinguishability. It used to open with brand-500 and\n // brand-600 - two neighbouring shades of the same purple - so a two-series\n // chart was two near-identical lines. Distinct hues first, brand variants last.\n \"hsl(var(--nostromo-color-brand-500))\",\n \"hsl(var(--nostromo-color-info-500))\",\n \"hsl(var(--nostromo-color-success-500))\",\n \"hsl(var(--nostromo-color-warning-500))\",\n \"hsl(var(--nostromo-color-error-500))\",\n \"hsl(var(--nostromo-color-brand-300))\",\n \"hsl(var(--nostromo-color-info-700))\",\n \"hsl(var(--nostromo-color-success-700))\",\n];\n\n// Custom tooltip component with Tailwind styling\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: Array<{\n name?: string;\n value?: number | string;\n color?: string;\n }>;\n label?: string | number;\n}\n\nconst CustomTooltip = ({ active, payload, label }: CustomTooltipProps) => {\n if (active && payload && payload.length) {\n return (\n <div className=\"rounded-lg border border-border bg-popover p-3 shadow-lg\">\n <p className=\"mb-2 font-semibold text-popover-foreground\">\n {String(label ?? \"\")}\n </p>\n {payload.map((entry, index: number) => (\n <p key={index} className=\"text-sm\" style={{ color: entry.color }}>\n {`${entry.name ?? \"\"}: ${entry.value ?? \"\"}`}\n </p>\n ))}\n </div>\n );\n }\n return null;\n};\n\n// Custom legend component with Tailwind styling\ninterface CustomLegendProps {\n payload?: Array<{\n value?: string;\n color?: string;\n }>;\n}\n\nconst CustomLegend = ({ payload }: CustomLegendProps) => {\n return (\n <div className=\"mt-4 flex flex-wrap justify-center gap-4\">\n {payload?.map((entry, index: number) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div\n className=\"h-3 w-3 rounded\"\n style={{ backgroundColor: entry.color }}\n aria-hidden=\"true\"\n />\n <span className=\"text-sm text-popover-foreground\">{entry.value}</span>\n </div>\n ))}\n </div>\n );\n};\n\nconst ChartComponent = React.forwardRef<HTMLDivElement, ChartProps>(\n (\n {\n type,\n data,\n dataKeys,\n xAxisKey = \"name\",\n colors = defaultColors,\n showGrid = true,\n showLegend = true,\n showTooltip = true,\n title,\n description,\n className,\n variant,\n size,\n height,\n ariaLabel,\n ariaLabelledBy,\n strokeWidth = 2,\n fillOpacity = 0.6,\n ...props\n },\n ref,\n ) => {\n const chartHeight =\n height ||\n (size === \"sm\" ? 192 : size === \"lg\" ? 384 : size === \"xl\" ? 500 : 256);\n\n const renderChart = () => {\n // SSR guard: recharts requires browser environment\n if (typeof window === \"undefined\") {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground\">\n <p>Chart loading...</p>\n </div>\n );\n }\n\n const commonProps = {\n data,\n margin: { top: 5, right: 5, left: 5, bottom: 5 },\n };\n\n switch (type) {\n case \"line\":\n return (\n <LineChart {...commonProps}>\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--nostromo-color-neutral-300))\"\n />\n )}\n <XAxis\n dataKey={xAxisKey}\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n <YAxis\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {dataKeys.map((key, index) => {\n const colorIndex = index % colors.length;\n const color = (colors[colorIndex] ??\n defaultColors[colorIndex % defaultColors.length]) as string;\n return (\n <Line\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={color}\n strokeWidth={strokeWidth}\n dot={{ r: 4, fill: color }}\n activeDot={{ r: 6 }}\n />\n );\n })}\n {showLegend && <Legend content={<CustomLegend />} />}\n </LineChart>\n );\n\n case \"bar\":\n return (\n <BarChart {...commonProps}>\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--nostromo-color-neutral-300))\"\n />\n )}\n <XAxis\n dataKey={xAxisKey}\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n <YAxis\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {dataKeys.map((key, index) => {\n const colorIndex = index % colors.length;\n const color = (colors[colorIndex] ??\n defaultColors[colorIndex % defaultColors.length]) as string;\n return (\n <Bar\n key={key}\n dataKey={key}\n fill={color}\n radius={[4, 4, 0, 0]}\n />\n );\n })}\n {showLegend && <Legend content={<CustomLegend />} />}\n </BarChart>\n );\n\n case \"area\":\n return (\n <AreaChart {...commonProps}>\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--nostromo-color-neutral-300))\"\n />\n )}\n <XAxis\n dataKey={xAxisKey}\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n <YAxis\n stroke=\"hsl(var(--nostromo-color-neutral-600))\"\n tick={{\n fill: \"hsl(var(--nostromo-color-neutral-700))\",\n fontSize: 12,\n }}\n />\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {dataKeys.map((key, index) => {\n const colorIndex = index % colors.length;\n const color = (colors[colorIndex] ??\n defaultColors[colorIndex % defaultColors.length]) as string;\n return (\n <Area\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={color}\n fill={color}\n fillOpacity={fillOpacity}\n strokeWidth={strokeWidth}\n />\n );\n })}\n {showLegend && <Legend content={<CustomLegend />} />}\n </AreaChart>\n );\n\n case \"pie\": {\n const pieDataKey = dataKeys[0] || \"value\";\n return (\n <PieChart>\n <Pie\n data={data}\n dataKey={pieDataKey}\n nameKey={xAxisKey}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={chartHeight / 4}\n label={(props: { name?: string; percent?: number }) =>\n `${props.name ?? \"\"}: ${((props.percent ?? 0) * 100).toFixed(0)}%`\n }\n >\n {data.map((entry, index) => {\n const fillColor =\n colors[index % colors.length] ||\n defaultColors[index % defaultColors.length];\n return (\n <Cell key={`cell-${index}`} fill={fillColor ?? \"#8884d8\"} />\n );\n })}\n </Pie>\n {showTooltip && <Tooltip content={<CustomTooltip />} />}\n {showLegend && <Legend content={<CustomLegend />} />}\n </PieChart>\n );\n }\n\n default:\n return null;\n }\n };\n\n return (\n <div\n ref={ref}\n className={cn(chartContainerVariants({ variant, size }), className)}\n role=\"img\"\n aria-label={ariaLabel || title || `${type} chart`}\n aria-labelledby={ariaLabelledBy}\n {...props}\n >\n {title && (\n <h3 className=\"mb-2 text-lg font-semibold text-foreground\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"mb-4 text-sm text-muted-foreground\">{description}</p>\n )}\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n {renderChart()}\n </ResponsiveContainer>\n </div>\n );\n },\n);\n\nChartComponent.displayName = \"Chart\";\n\n// Memoize Chart component for performance optimization\n// Charts are expensive to render, so memoization helps prevent unnecessary re-renders\nexport const Chart = memo(ChartComponent) as typeof ChartComponent;\n\nexport { chartContainerVariants };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a as a$1}from'./chunk-AC2JBXHQ.js';import*as a from'react';import {cva}from'class-variance-authority';var f=cva("shrink-0 bg-border",{variants:{orientation:{horizontal:"h-[1px] w-full",vertical:"w-[1px] self-stretch h-full"},variant:{default:"bg-border",muted:"bg-muted",subtle:"bg-muted/50"},size:{default:"",sm:"h-px",lg:"h-0.5"}},defaultVariants:{orientation:"horizontal",variant:"default",size:"default"}}),d=a.forwardRef(({className:o,orientation:t="horizontal",variant:i="default",size:n="default",decorative:r=true,...l},s)=>a.createElement("div",{ref:s,role:r?"none":"separator",...r?{}:{"aria-orientation":t||void 0},className:a$1(f({orientation:t,variant:i,size:n}),o),...l}));d.displayName="Separator";export{f as a,d as b};//# sourceMappingURL=chunk-XRVHMGMD.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-XRVHMGMD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/separator.tsx"],"names":["separatorVariants","cva","Separator","className","orientation","variant","size","decorative","props","ref","cn"],"mappings":"8GAIA,IAAMA,CAAAA,CAAoBC,GAAAA,CAAI,oBAAA,CAAsB,CAClD,QAAA,CAAU,CACR,WAAA,CAAa,CACX,UAAA,CAAY,gBAAA,CAMZ,QAAA,CAAU,6BACZ,EACA,OAAA,CAAS,CACP,OAAA,CAAS,WAAA,CACT,KAAA,CAAO,UAAA,CACP,OAAQ,aACV,CAAA,CACA,IAAA,CAAM,CACJ,OAAA,CAAS,EAAA,CACT,GAAI,MAAA,CACJ,EAAA,CAAI,OACN,CACF,CAAA,CACA,eAAA,CAAiB,CACf,WAAA,CAAa,YAAA,CACb,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,SACR,CACF,CAAC,CAAA,CAUKC,CAAAA,CAAkB,CAAA,CAAA,UAAA,CACtB,CACE,CACE,UAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,YAAA,CACd,OAAA,CAAAC,CAAAA,CAAU,UACV,IAAA,CAAAC,CAAAA,CAAO,SAAA,CACP,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,GAAGC,CACL,CAAA,CACAC,CAAAA,GAGE,CAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKA,EACL,IAAA,CAAMF,CAAAA,CAAa,MAAA,CAAS,WAAA,CAC3B,GAAIA,CAAAA,CACD,EAAC,CACD,CAAE,kBAAA,CAAoBH,CAAAA,EAAe,MAAU,CAAA,CACnD,UAAWM,GAAAA,CACTV,CAAAA,CAAkB,CAAE,WAAA,CAAAI,CAAAA,CAAa,OAAA,CAAAC,EAAS,IAAA,CAAAC,CAAK,CAAC,CAAA,CAChDH,CACF,CAAA,CACC,GAAGK,CAAAA,CACN,CAGN,EACAN,CAAAA,CAAU,WAAA,CAAc,WAAA","file":"chunk-XRVHMGMD.js","sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\nconst separatorVariants = cva(\"shrink-0 bg-border\", {\n variants: {\n orientation: {\n horizontal: \"h-[1px] w-full\",\n // self-stretch, not just h-full: `height: 100%` against an auto-height\n // flex row resolves to nothing, and with the usual `items-center` the\n // item does not stretch either - so a vertical separator rendered 1px\n // wide and 0px tall, which looked like the prop did nothing at all.\n // Stretching fills the cross axis; h-full still covers non-flex parents.\n vertical: \"w-[1px] self-stretch h-full\",\n },\n variant: {\n default: \"bg-border\",\n muted: \"bg-muted\",\n subtle: \"bg-muted/50\",\n },\n size: {\n default: \"\",\n sm: \"h-px\",\n lg: \"h-0.5\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n variant: \"default\",\n size: \"default\",\n },\n});\n\nexport interface SeparatorProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, \"aria-orientation\">,\n VariantProps<typeof separatorVariants> {\n decorative?: boolean;\n \"aria-orientation\"?: \"horizontal\" | \"vertical\";\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n {\n className,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"default\",\n decorative = true,\n ...props\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n role={decorative ? \"none\" : \"separator\"}\n {...(decorative\n ? {}\n : { \"aria-orientation\": orientation || undefined })}\n className={cn(\n separatorVariants({ orientation, variant, size }),\n className,\n )}\n {...props}\n />\n );\n },\n);\nSeparator.displayName = \"Separator\";\n\nexport { Separator, separatorVariants };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var chunk7SPPGTBT_cjs=require('./chunk-7SPPGTBT.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),a=require('react'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var a__default=/*#__PURE__*/_interopDefault(a);var Y=classVarianceAuthority.cva("absolute z-50 px-3 py-2 text-sm font-medium rounded-md shadow-lg transition-opacity duration-200",{variants:{variant:{default:"bg-popover text-popover-foreground border border-border",light:"bg-popover text-popover-foreground border border-border",dark:"bg-popover text-popover-foreground border border-border",success:"bg-success text-success-foreground",warning:"bg-warning text-warning-foreground",error:"bg-destructive text-destructive-foreground",info:"bg-info text-info-foreground"},size:{sm:"text-xs px-2 py-1",md:"text-sm px-3 py-2",lg:"text-base px-4 py-3"},placement:{top:"bottom-full left-1/2 -translate-x-1/2 mb-2","top-start":"bottom-full left-0 mb-2","top-end":"bottom-full right-0 mb-2",bottom:"top-full left-1/2 -translate-x-1/2 mt-2","bottom-start":"top-full left-0 mt-2","bottom-end":"top-full right-0 mt-2",left:"right-full top-1/2 -translate-y-1/2 mr-2","left-start":"right-full top-0 mr-2","left-end":"right-full bottom-0 mr-2",right:"left-full top-1/2 -translate-y-1/2 ml-2","right-start":"left-full top-0 ml-2","right-end":"left-full bottom-0 ml-2"}},defaultVariants:{variant:"default",size:"md",placement:"top"}}),Z=classVarianceAuthority.cva("absolute w-2 h-2 rotate-45",{variants:{variant:{default:"bg-popover border border-border",light:"bg-popover border border-border",dark:"bg-popover border border-border",success:"bg-success-500",warning:"bg-warning-500",error:"bg-destructive",info:"bg-info-500"},placement:{top:"top-full left-1/2 -translate-x-1/2 -translate-y-1/2","top-start":"top-full left-4 -translate-y-1/2","top-end":"top-full right-4 -translate-y-1/2",bottom:"bottom-full left-1/2 -translate-x-1/2 translate-y-1/2","bottom-start":"bottom-full left-4 translate-y-1/2","bottom-end":"bottom-full right-4 translate-y-1/2",left:"left-full top-1/2 -translate-x-1/2 -translate-y-1/2","left-start":"left-full top-4 -translate-x-1/2","left-end":"left-full bottom-4 -translate-x-1/2",right:"right-full top-1/2 translate-x-1/2 -translate-y-1/2","right-start":"right-full top-4 translate-x-1/2","right-end":"right-full bottom-4 translate-x-1/2"}},defaultVariants:{variant:"default",placement:"top"}}),O=a__default.default.createContext(void 0),$=()=>{let u=a__default.default.useContext(O);if(!u)throw new Error("Tooltip components must be used within a Tooltip");return u},q=a__default.default.forwardRef(({children:u,content:h,trigger:T="hover",open:i,onOpenChange:d,delayDuration:e=700,skipDelayDuration:y=300,disabled:f=false,className:E,contentClassName:s,sideOffset:C=4,alignOffset:M=0,avoidCollisions:R=true,collisionBoundary:w,collisionPadding:o=8,hideWhenDetached:x=false,sticky:D="partial",updatePositionDeps:L,closeOnBlur:H=true,...v},c)=>{let[N,t]=a.useState(false),r=a.useRef(null),g=a.useRef(null),l=i!==void 0,n=l?i:N,p=a.useCallback(_=>{f||(l||t(_),d?.(_));},[f,l,d]),m=a.useCallback(()=>{r.current!=null&&(clearTimeout(r.current),r.current=null),g.current!=null&&(clearTimeout(g.current),g.current=null);},[]),W=a.useCallback(()=>{m(),p(true);},[m,p]),B=a.useCallback(()=>{m(),p(false);},[m,p]),V=a.useCallback(()=>{m(),!f&&(e>0?r.current=window.setTimeout(()=>{p(true);},e):p(true));},[m,f,e,p]),z=a.useCallback(()=>{m(),y>0?g.current=window.setTimeout(()=>{p(false);},y):p(false);},[m,y,p]),G=a.useCallback(()=>{n?z():V();},[n,V,z]),J=a.useCallback(()=>{n?B():W();},[n,W,B]);a.useEffect(()=>()=>{m();},[m]);let Q={open:n,setOpen:p,trigger:T,delayDuration:e,skipDelayDuration:y,openNow:W,closeNow:B,openWithDelay:V,closeWithDelay:z,toggleWithDelay:G,toggleNow:J,closeOnBlur:H},U=n===true&&h!==void 0;return a__default.default.createElement(O.Provider,{value:Q},a__default.default.createElement("div",{ref:c,className:chunkITRGJNWL_cjs.a("relative inline-block",E),"data-open":n,...v},u,U?a__default.default.createElement(F,{className:s||"",sideOffset:C,alignOffset:M,avoidCollisions:R,collisionBoundary:w||null,collisionPadding:o,hideWhenDetached:x,sticky:D,updatePositionDeps:L||[],variant:v.variant,size:v.size,placement:v.placement},h):null))});q.displayName="Tooltip";var A=a__default.default.forwardRef(({children:u,asChild:h=true,className:T,...i},d)=>{let{trigger:e,openNow:y,closeNow:f,openWithDelay:E,closeWithDelay:s,toggleNow:C,closeOnBlur:M}=$(),R=a.useRef(null),w={ref:o=>{R.current=o,typeof d=="function"?d(o):d&&(d.current=o);},className:chunkITRGJNWL_cjs.a(T),"data-tooltip-trigger":true,onMouseEnter:o=>{i.onMouseEnter?.(o),e==="hover"&&E();},onMouseLeave:o=>{i.onMouseLeave?.(o),e==="hover"&&s();},onPointerEnter:o=>{i.onPointerEnter?.(o),e==="hover"&&E();},onPointerLeave:o=>{i.onPointerLeave?.(o),e==="hover"&&s();},onClick:o=>{i.onClick?.(o),e==="click"&&C();},onFocus:o=>{i.onFocus?.(o),e==="focus"&&y();},onBlur:o=>{i.onBlur?.(o),M&&f();},onKeyDown:o=>{i.onKeyDown?.(o),o.key==="Escape"&&f();}};return h&&a__default.default.isValidElement(u)?a__default.default.cloneElement(u,{...u.props||{},...w}):a__default.default.createElement("span",{...w,tabIndex:e==="focus"?0:void 0,role:e==="click"?"button":void 0},u)});A.displayName="TooltipTrigger";var F=a__default.default.forwardRef(({children:u,variant:h="default",size:T="md",placement:i="top",className:d,sideOffset:e=4,alignOffset:y=0,avoidCollisions:f=true,collisionBoundary:E,collisionPadding:s=8,hideWhenDetached:C=false,sticky:M="partial",updatePositionDeps:R,...w},o)=>{let x=a__default.default.useContext(O)?.open??true,D=a.useRef(null),[L,H]=a.useState({top:0,left:0}),v=a.useCallback(()=>{if(!D.current)return;let c=D.current,N=c.parentElement?.querySelector("[data-tooltip-trigger]");if(!N)return;let t=N.getBoundingClientRect(),r=c.getBoundingClientRect(),g={width:window.innerWidth,height:window.innerHeight},l=0,n=0;switch(i){case "top":l=t.top-r.height-e,n=t.left+t.width/2-r.width/2;break;case "top-start":l=t.top-r.height-e,n=t.left;break;case "top-end":l=t.top-r.height-e,n=t.right-r.width;break;case "bottom":l=t.bottom+e,n=t.left+t.width/2-r.width/2;break;case "bottom-start":l=t.bottom+e,n=t.left;break;case "bottom-end":l=t.bottom+e,n=t.right-r.width;break;case "left":l=t.top+t.height/2-r.height/2,n=t.left-r.width-e;break;case "left-start":l=t.top,n=t.left-r.width-e;break;case "left-end":l=t.bottom-r.height,n=t.left-r.width-e;break;case "right":l=t.top+t.height/2-r.height/2,n=t.right+e;break;case "right-start":l=t.top,n=t.right+e;break;case "right-end":l=t.bottom-r.height,n=t.right+e;break}f&&(n<s?n=s:n+r.width>g.width-s&&(n=g.width-r.width-s),l<s?l=s:l+r.height>g.height-s&&(l=g.height-r.height-s)),H({top:l,left:n});},[i,e,f,s]);return a__default.default.useLayoutEffect(()=>{v();let c=()=>v();return window.addEventListener("resize",c),window.addEventListener("scroll",c),()=>{window.removeEventListener("resize",c),window.removeEventListener("scroll",c);}},[v,R,x]),a__default.default.createElement("div",{ref:c=>{D.current=c,typeof o=="function"?o(c):o&&(o.current=c);},role:"tooltip","data-tooltip-instance":"nostromo","data-state":x?"open":"closed","aria-hidden":x?void 0:true,className:chunkITRGJNWL_cjs.a(Y({variant:h,size:T,placement:i}),x?"opacity-100":"pointer-events-none opacity-0",d),style:{position:"fixed",top:L.top,left:L.left,zIndex:50},...w},u,a__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(Z({variant:h,placement:i}))}))});F.displayName="TooltipContent";var tt=({children:u,delayDuration:h=700,skipDelayDuration:T=300,defaultOpen:i=false})=>a__default.default.createElement("div",{"data-tooltip-provider":true},u),j=chunk7SPPGTBT_cjs.a(q);j.Trigger=A;j.Content=F;j.Provider=tt;exports.a=Y;exports.b=Z;exports.c=A;exports.d=F;exports.e=tt;exports.f=j;//# sourceMappingURL=chunk-Z7WEJ5IQ.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-Z7WEJ5IQ.cjs.map
|