@fanvue/ui 1.18.2 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/charts.d.ts +372 -0
  2. package/dist/charts.mjs +28 -0
  3. package/dist/charts.mjs.map +1 -0
  4. package/dist/cjs/charts.cjs +28 -0
  5. package/dist/cjs/charts.cjs.map +1 -0
  6. package/dist/cjs/components/Autocomplete/Autocomplete.cjs +6 -6
  7. package/dist/cjs/components/Autocomplete/Autocomplete.cjs.map +1 -1
  8. package/dist/cjs/components/Chart/ChartCard.cjs +88 -0
  9. package/dist/cjs/components/Chart/ChartCard.cjs.map +1 -0
  10. package/dist/cjs/components/Chart/ChartCenterLabel.cjs +51 -0
  11. package/dist/cjs/components/Chart/ChartCenterLabel.cjs.map +1 -0
  12. package/dist/cjs/components/Chart/ChartContainer.cjs +64 -0
  13. package/dist/cjs/components/Chart/ChartContainer.cjs.map +1 -0
  14. package/dist/cjs/components/Chart/ChartLegend.cjs +69 -0
  15. package/dist/cjs/components/Chart/ChartLegend.cjs.map +1 -0
  16. package/dist/cjs/components/Chart/ChartLoadingOverlay.cjs +35 -0
  17. package/dist/cjs/components/Chart/ChartLoadingOverlay.cjs.map +1 -0
  18. package/dist/cjs/components/Chart/ChartPieLegend.cjs +54 -0
  19. package/dist/cjs/components/Chart/ChartPieLegend.cjs.map +1 -0
  20. package/dist/cjs/components/Chart/ChartSeriesToggle.cjs +65 -0
  21. package/dist/cjs/components/Chart/ChartSeriesToggle.cjs.map +1 -0
  22. package/dist/cjs/components/Chart/ChartStyle.cjs +40 -0
  23. package/dist/cjs/components/Chart/ChartStyle.cjs.map +1 -0
  24. package/dist/cjs/components/Chart/ChartTooltip.cjs +147 -0
  25. package/dist/cjs/components/Chart/ChartTooltip.cjs.map +1 -0
  26. package/dist/cjs/components/Chart/chartUtils.cjs +23 -0
  27. package/dist/cjs/components/Chart/chartUtils.cjs.map +1 -0
  28. package/dist/cjs/components/Chart/useChart.cjs +32 -0
  29. package/dist/cjs/components/Chart/useChart.cjs.map +1 -0
  30. package/dist/cjs/components/InfoBox/InfoBox.cjs +111 -0
  31. package/dist/cjs/components/InfoBox/InfoBox.cjs.map +1 -0
  32. package/dist/cjs/components/TextField/TextField.cjs +0 -4
  33. package/dist/cjs/components/TextField/TextField.cjs.map +1 -1
  34. package/dist/cjs/components/Tooltip/Tooltip.cjs +17 -92
  35. package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -1
  36. package/dist/cjs/index.cjs +4 -0
  37. package/dist/cjs/index.cjs.map +1 -1
  38. package/dist/components/Autocomplete/Autocomplete.mjs +5 -5
  39. package/dist/components/Autocomplete/Autocomplete.mjs.map +1 -1
  40. package/dist/components/Chart/ChartCard.mjs +71 -0
  41. package/dist/components/Chart/ChartCard.mjs.map +1 -0
  42. package/dist/components/Chart/ChartCenterLabel.mjs +34 -0
  43. package/dist/components/Chart/ChartCenterLabel.mjs.map +1 -0
  44. package/dist/components/Chart/ChartContainer.mjs +47 -0
  45. package/dist/components/Chart/ChartContainer.mjs.map +1 -0
  46. package/dist/components/Chart/ChartLegend.mjs +52 -0
  47. package/dist/components/Chart/ChartLegend.mjs.map +1 -0
  48. package/dist/components/Chart/ChartLoadingOverlay.mjs +18 -0
  49. package/dist/components/Chart/ChartLoadingOverlay.mjs.map +1 -0
  50. package/dist/components/Chart/ChartPieLegend.mjs +37 -0
  51. package/dist/components/Chart/ChartPieLegend.mjs.map +1 -0
  52. package/dist/components/Chart/ChartSeriesToggle.mjs +48 -0
  53. package/dist/components/Chart/ChartSeriesToggle.mjs.map +1 -0
  54. package/dist/components/Chart/ChartStyle.mjs +23 -0
  55. package/dist/components/Chart/ChartStyle.mjs.map +1 -0
  56. package/dist/components/Chart/ChartTooltip.mjs +130 -0
  57. package/dist/components/Chart/ChartTooltip.mjs.map +1 -0
  58. package/dist/components/Chart/chartUtils.mjs +23 -0
  59. package/dist/components/Chart/chartUtils.mjs.map +1 -0
  60. package/dist/components/Chart/useChart.mjs +15 -0
  61. package/dist/components/Chart/useChart.mjs.map +1 -0
  62. package/dist/components/InfoBox/InfoBox.mjs +93 -0
  63. package/dist/components/InfoBox/InfoBox.mjs.map +1 -0
  64. package/dist/components/TextField/TextField.mjs +0 -4
  65. package/dist/components/TextField/TextField.mjs.map +1 -1
  66. package/dist/components/Tooltip/Tooltip.mjs +18 -93
  67. package/dist/components/Tooltip/Tooltip.mjs.map +1 -1
  68. package/dist/index.d.ts +50 -88
  69. package/dist/index.mjs +4 -0
  70. package/dist/index.mjs.map +1 -1
  71. package/package.json +18 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartCard.cjs","sources":["../../../../src/components/Chart/ChartCard.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Card } from \"../Card/Card\";\nimport { IconButton } from \"../IconButton/IconButton\";\nimport { InfoCircleIcon } from \"../Icons/InfoCircleIcon\";\nimport { Skeleton } from \"../Skeleton/Skeleton\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../Tooltip/Tooltip\";\n\n/** Props for {@link ChartCard}. */\nexport interface ChartCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Card title text. Pass translated string for i18n. */\n title: React.ReactNode;\n /** Large subtitle value (e.g. formatted price or count). */\n subtitle?: React.ReactNode;\n /** Tooltip text shown next to the title. Pass translated string for i18n. */\n tooltip?: React.ReactNode;\n /** Accessible label for the info tooltip trigger. Override for i18n. @default \"More info\" */\n tooltipAriaLabel?: string;\n /** Date range or period label shown below the subtitle. */\n dateInfo?: React.ReactNode;\n /** Trend indicator chip config. */\n trendChip?: {\n /** Display label (e.g. \"12.5%\"). */\n label: React.ReactNode;\n /** Whether the trend is positive (green) or negative (red). */\n trend: \"positive\" | \"negative\";\n };\n /** Show loading skeleton instead of content. @default false */\n loading?: boolean;\n /** Chart content rendered below the header. */\n children?: React.ReactNode;\n}\n\nconst TREND_CLASSES: Record<\"positive\" | \"negative\", string> = {\n positive: \"bg-success-background text-success-default\",\n negative: \"bg-error-background text-error-default\",\n};\n\n/**\n * Wraps any chart with a structured header containing title, subtitle,\n * optional trend chip, date range label, info tooltip, and a loading\n * skeleton state.\n *\n * @example\n * ```tsx\n * <ChartCard\n * title=\"Revenue\"\n * subtitle=\"$4,523\"\n * trendChip={{ label: \"+12.5%\", trend: \"positive\" }}\n * dateInfo=\"Jan 1 – Mar 17\"\n * tooltip=\"Total revenue for the selected period.\"\n * >\n * <MyLineChart />\n * </ChartCard>\n * ```\n */\nexport const ChartCard = React.forwardRef<HTMLDivElement, ChartCardProps>(\n (\n {\n className,\n title,\n subtitle,\n tooltip,\n tooltipAriaLabel = \"More info\",\n dateInfo,\n trendChip,\n loading = false,\n children,\n ...props\n },\n ref,\n ) => {\n return (\n <Card ref={ref} variant=\"outlined\" noPadding className={className} {...props}>\n <div className=\"flex flex-col gap-2 p-4\">\n {loading ? (\n <>\n <Skeleton animation=\"wave\" variant=\"rounded\" className=\"h-4 w-32\" />\n <Skeleton animation=\"wave\" variant=\"rounded\" className=\"h-7 w-44\" />\n <Skeleton animation=\"wave\" variant=\"rounded\" className=\"h-3 w-24\" />\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"typography-semibold-body-md text-foreground-default\">{title}</span>\n {tooltip && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n variant=\"tertiary\"\n size=\"24\"\n aria-label={tooltipAriaLabel}\n icon={<InfoCircleIcon className=\"size-4 text-foreground-tertiary\" />}\n />\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n {subtitle && (\n <div className=\"flex items-center gap-2\">\n <span className=\"typography-bold-heading-sm text-foreground-default\">\n {subtitle}\n </span>\n {trendChip && (\n <span\n className={cn(\n \"typography-semibold-body-sm rounded-full px-2 py-0.5\",\n TREND_CLASSES[trendChip.trend],\n )}\n >\n {trendChip.label}\n </span>\n )}\n </div>\n )}\n {dateInfo && (\n <span className=\"typography-regular-body-sm text-foreground-tertiary\">\n {dateInfo}\n </span>\n )}\n </>\n )}\n <div className=\"mt-auto\">{children}</div>\n </div>\n </Card>\n );\n },\n);\nChartCard.displayName = \"ChartCard\";\n"],"names":["React","jsx","Card","jsxs","Fragment","Skeleton","TooltipProvider","Tooltip","TooltipTrigger","IconButton","InfoCircleIcon","TooltipContent","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,MAAM,gBAAyD;AAAA,EAC7D,UAAU;AAAA,EACV,UAAU;AACZ;AAoBO,MAAM,YAAYA,iBAAM;AAAA,EAC7B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,WACEC,2BAAAA,IAACC,KAAAA,MAAA,EAAK,KAAU,SAAQ,YAAW,WAAS,MAAC,WAAuB,GAAG,OACrE,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAA,UACCA,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,QAAAH,+BAACI,SAAAA,YAAS,WAAU,QAAO,SAAQ,WAAU,WAAU,YAAW;AAAA,uCACjEA,SAAAA,UAAA,EAAS,WAAU,QAAO,SAAQ,WAAU,WAAU,YAAW;AAAA,uCACjEA,SAAAA,UAAA,EAAS,WAAU,QAAO,SAAQ,WAAU,WAAU,WAAA,CAAW;AAAA,MAAA,EAAA,CACpE,IAEAF,2BAAAA,KAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,UAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,uDAAuD,UAAA,OAAM;AAAA,UAC5E,WACCA,2BAAAA,IAACK,yBAAA,EACC,UAAAH,gCAACI,QAAAA,SAAA,EACC,UAAA;AAAA,YAAAN,2BAAAA,IAACO,QAAAA,gBAAA,EAAe,SAAO,MACrB,UAAAP,2BAAAA;AAAAA,cAACQ,WAAAA;AAAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,cAAY;AAAA,gBACZ,MAAMR,2BAAAA,IAACS,eAAAA,gBAAA,EAAe,WAAU,kCAAA,CAAkC;AAAA,cAAA;AAAA,YAAA,GAEtE;AAAA,YACAT,2BAAAA,IAACU,QAAAA,kBAAgB,UAAA,QAAA,CAAQ;AAAA,UAAA,EAAA,CAC3B,EAAA,CACF;AAAA,QAAA,GAEJ;AAAA,QACC,YACCR,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,sDACb,UAAA,UACH;AAAA,UACC,aACCA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWW,GAAAA;AAAAA,gBACT;AAAA,gBACA,cAAc,UAAU,KAAK;AAAA,cAAA;AAAA,cAG9B,UAAA,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACb,GAEJ;AAAA,QAED,YACCX,2BAAAA,IAAC,QAAA,EAAK,WAAU,uDACb,UAAA,SAAA,CACH;AAAA,MAAA,GAEJ;AAAA,MAEFA,2BAAAA,IAAC,OAAA,EAAI,WAAU,WAAW,SAAA,CAAS;AAAA,IAAA,EAAA,CACrC,EAAA,CACF;AAAA,EAEJ;AACF;AACA,UAAU,cAAc;;"}
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ function _interopNamespaceDefault(e) {
7
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
8
+ if (e) {
9
+ for (const k in e) {
10
+ if (k !== "default") {
11
+ const d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: () => e[k]
15
+ });
16
+ }
17
+ }
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
23
+ const ChartCenterLabel = React__namespace.forwardRef(
24
+ ({
25
+ viewBox,
26
+ value,
27
+ subtitle,
28
+ valueClassName = "fill-foreground-default font-bold text-3xl",
29
+ ...props
30
+ }, ref) => {
31
+ if (!viewBox || !("cx" in viewBox) || !("cy" in viewBox)) return null;
32
+ return /* @__PURE__ */ jsxRuntime.jsxs(
33
+ "text",
34
+ {
35
+ ref,
36
+ x: viewBox.cx,
37
+ y: viewBox.cy,
38
+ textAnchor: "middle",
39
+ dominantBaseline: "middle",
40
+ ...props,
41
+ children: [
42
+ /* @__PURE__ */ jsxRuntime.jsx("tspan", { x: viewBox.cx, y: viewBox.cy, className: valueClassName, children: value }),
43
+ /* @__PURE__ */ jsxRuntime.jsx("tspan", { x: viewBox.cx, y: (viewBox.cy || 0) + 24, className: "fill-foreground-tertiary", children: subtitle })
44
+ ]
45
+ }
46
+ );
47
+ }
48
+ );
49
+ ChartCenterLabel.displayName = "ChartCenterLabel";
50
+ exports.ChartCenterLabel = ChartCenterLabel;
51
+ //# sourceMappingURL=ChartCenterLabel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartCenterLabel.cjs","sources":["../../../../src/components/Chart/ChartCenterLabel.tsx"],"sourcesContent":["import * as React from \"react\";\n\n/** Props for {@link ChartCenterLabel}. */\nexport interface ChartCenterLabelProps\n extends Omit<React.SVGAttributes<SVGTextElement>, \"viewBox\"> {\n /** Recharts viewBox with center coordinates. */\n viewBox?: { cx?: number; cy?: number; [key: string]: unknown };\n /** Primary value displayed in the center. */\n value: React.ReactNode;\n /** Secondary text below the value. */\n subtitle: React.ReactNode;\n /** Custom className for the value tspan. @default \"fill-foreground-default font-bold text-3xl\" */\n valueClassName?: string;\n}\n\n/**\n * Centered label for radial/pie charts, rendered inside a Recharts `<Label>`.\n *\n * @example\n * ```tsx\n * <PolarRadiusAxis tick={false} tickLine={false} axisLine={false}>\n * <Label content={({ viewBox }) => (\n * <ChartCenterLabel viewBox={viewBox} value=\"78%\" subtitle=\"Complete\" />\n * )} />\n * </PolarRadiusAxis>\n * ```\n */\nexport const ChartCenterLabel = React.forwardRef<SVGTextElement, ChartCenterLabelProps>(\n (\n {\n viewBox,\n value,\n subtitle,\n valueClassName = \"fill-foreground-default font-bold text-3xl\",\n ...props\n },\n ref,\n ) => {\n if (!viewBox || !(\"cx\" in viewBox) || !(\"cy\" in viewBox)) return null;\n\n return (\n <text\n ref={ref}\n x={viewBox.cx}\n y={viewBox.cy}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n {...props}\n >\n <tspan x={viewBox.cx} y={viewBox.cy} className={valueClassName}>\n {value}\n </tspan>\n <tspan x={viewBox.cx} y={(viewBox.cy || 0) + 24} className=\"fill-foreground-tertiary\">\n {subtitle}\n </tspan>\n </text>\n );\n },\n);\n\nChartCenterLabel.displayName = \"ChartCenterLabel\";\n"],"names":["React","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA2BO,MAAM,mBAAmBA,iBAAM;AAAA,EACpC,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,GAAG;AAAA,EAAA,GAEL,QACG;AACH,QAAI,CAAC,WAAW,EAAE,QAAQ,YAAY,EAAE,QAAQ,SAAU,QAAO;AAEjE,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,GAAG,QAAQ;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,YAAW;AAAA,QACX,kBAAiB;AAAA,QAChB,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAAC,2BAAAA,IAAC,SAAA,EAAM,GAAG,QAAQ,IAAI,GAAG,QAAQ,IAAI,WAAW,gBAC7C,UAAA,MAAA,CACH;AAAA,UACAA,2BAAAA,IAAC,SAAA,EAAM,GAAG,QAAQ,IAAI,IAAI,QAAQ,MAAM,KAAK,IAAI,WAAU,4BACxD,UAAA,SAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,iBAAiB,cAAc;;"}
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const recharts = require("recharts");
7
+ const cn = require("../../utils/cn.cjs");
8
+ const ChartStyle = require("./ChartStyle.cjs");
9
+ const useChart = require("./useChart.cjs");
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== "default") {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
27
+ const ChartContainer = React__namespace.forwardRef(
28
+ ({ id, className, children, config, ...props }, ref) => {
29
+ const uniqueId = React__namespace.useId();
30
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
31
+ return /* @__PURE__ */ jsxRuntime.jsx(useChart.ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxRuntime.jsxs(
32
+ "div",
33
+ {
34
+ ref,
35
+ "data-slot": "chart",
36
+ "data-chart": chartId,
37
+ className: cn.cn(
38
+ "flex aspect-video justify-center text-xs",
39
+ "[&_.recharts-cartesian-axis-tick_text]:fill-foreground-tertiary",
40
+ "[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-neutral-200",
41
+ "[&_.recharts-curve.recharts-tooltip-cursor]:stroke-neutral-200",
42
+ "[&_.recharts-dot[stroke='#fff']]:stroke-transparent",
43
+ "[&_.recharts-layer]:outline-hidden",
44
+ "[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-neutral-200",
45
+ "[&_.recharts-radial-bar-background-sector]:fill-neutral-100",
46
+ "[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-neutral-100",
47
+ "[&_.recharts-reference-line_[stroke='#ccc']]:stroke-neutral-200",
48
+ "[&_.recharts-sector]:outline-hidden",
49
+ "[&_.recharts-sector[stroke='#fff']]:stroke-transparent",
50
+ "[&_.recharts-surface]:outline-hidden",
51
+ className
52
+ ),
53
+ ...props,
54
+ children: [
55
+ /* @__PURE__ */ jsxRuntime.jsx(ChartStyle.ChartStyle, { id: chartId, config }),
56
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { children })
57
+ ]
58
+ }
59
+ ) });
60
+ }
61
+ );
62
+ ChartContainer.displayName = "ChartContainer";
63
+ exports.ChartContainer = ChartContainer;
64
+ //# sourceMappingURL=ChartContainer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartContainer.cjs","sources":["../../../../src/components/Chart/ChartContainer.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { ResponsiveContainer } from \"recharts\";\nimport { cn } from \"../../utils/cn\";\nimport { ChartStyle } from \"./ChartStyle\";\nimport type { ChartConfig } from \"./types\";\nimport { ChartContext } from \"./useChart\";\n\n/** Props for {@link ChartContainer}. */\nexport interface ChartContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Series configuration mapping data keys to labels, colors, and icons. */\n config: ChartConfig;\n /**\n * Recharts chart element(s) to render inside the responsive container.\n * Typically a single `<AreaChart>`, `<BarChart>`, `<LineChart>`, etc.\n */\n children: React.ComponentProps<typeof ResponsiveContainer>[\"children\"];\n}\n\n/**\n * Wraps a Recharts chart with responsive sizing, design-token theming, and\n * accessible config context for tooltips and legends.\n *\n * @example\n * ```tsx\n * <ChartContainer config={chartConfig} className=\"min-h-48\">\n * <LineChart data={data} accessibilityLayer>\n * <Line dataKey=\"revenue\" stroke=\"var(--color-revenue)\" />\n * </LineChart>\n * </ChartContainer>\n * ```\n */\nexport const ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(\n ({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n ref={ref}\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs\",\n \"[&_.recharts-cartesian-axis-tick_text]:fill-foreground-tertiary\",\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-neutral-200\",\n \"[&_.recharts-curve.recharts-tooltip-cursor]:stroke-neutral-200\",\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\n \"[&_.recharts-layer]:outline-hidden\",\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-neutral-200\",\n \"[&_.recharts-radial-bar-background-sector]:fill-neutral-100\",\n \"[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-neutral-100\",\n \"[&_.recharts-reference-line_[stroke='#ccc']]:stroke-neutral-200\",\n \"[&_.recharts-sector]:outline-hidden\",\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent\",\n \"[&_.recharts-surface]:outline-hidden\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <ResponsiveContainer>{children}</ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n },\n);\nChartContainer.displayName = \"ChartContainer\";\n"],"names":["React","ChartContext","jsxs","cn","jsx","ChartStyle","ResponsiveContainer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,MAAM,iBAAiBA,iBAAM;AAAA,EAClC,CAAC,EAAE,IAAI,WAAW,UAAU,QAAQ,GAAG,MAAA,GAAS,QAAQ;AACtD,UAAM,WAAWA,iBAAM,MAAA;AACvB,UAAM,UAAU,SAAS,MAAM,SAAS,QAAQ,MAAM,EAAE,CAAC;AAEzD,0CACGC,SAAAA,aAAa,UAAb,EAAsB,OAAO,EAAE,UAC9B,UAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,aAAU;AAAA,QACV,cAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAAC,2BAAAA,IAACC,WAAAA,YAAA,EAAW,IAAI,SAAS,OAAA,CAAgB;AAAA,UACzCD,+BAACE,SAAAA,uBAAqB,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEnC;AAAA,EAEJ;AACF;AACA,eAAe,cAAc;;"}
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const recharts = require("recharts");
7
+ const cn = require("../../utils/cn.cjs");
8
+ const chartUtils = require("./chartUtils.cjs");
9
+ const useChart = require("./useChart.cjs");
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== "default") {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
27
+ const ChartLegend = recharts.Legend;
28
+ const ChartLegendContent = React__namespace.forwardRef(
29
+ ({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey }, ref) => {
30
+ const { config } = useChart.useChart();
31
+ if (!payload?.length) return null;
32
+ return /* @__PURE__ */ jsxRuntime.jsx(
33
+ "div",
34
+ {
35
+ ref,
36
+ className: cn.cn(
37
+ "flex items-center justify-center gap-4",
38
+ verticalAlign === "top" ? "pb-3" : "pt-3",
39
+ className
40
+ ),
41
+ children: chartUtils.filterVisiblePayload(payload).map((item) => {
42
+ const key = String(nameKey || item.dataKey || "value");
43
+ const itemConfig = chartUtils.resolveConfigEntry(config, item, key);
44
+ return /* @__PURE__ */ jsxRuntime.jsxs(
45
+ "div",
46
+ {
47
+ className: "flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-foreground-tertiary",
48
+ children: [
49
+ itemConfig?.icon && !hideIcon ? /* @__PURE__ */ jsxRuntime.jsx(itemConfig.icon, {}) : /* @__PURE__ */ jsxRuntime.jsx(
50
+ "div",
51
+ {
52
+ className: "h-2 w-2 shrink-0 rounded-[2px]",
53
+ style: { backgroundColor: item.color }
54
+ }
55
+ ),
56
+ itemConfig?.label
57
+ ]
58
+ },
59
+ item.value
60
+ );
61
+ })
62
+ }
63
+ );
64
+ }
65
+ );
66
+ ChartLegendContent.displayName = "ChartLegendContent";
67
+ exports.ChartLegend = ChartLegend;
68
+ exports.ChartLegendContent = ChartLegendContent;
69
+ //# sourceMappingURL=ChartLegend.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartLegend.cjs","sources":["../../../../src/components/Chart/ChartLegend.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Legend as RechartsLegend } from \"recharts\";\nimport type { LegendPayload } from \"recharts/types/component/DefaultLegendContent\";\nimport { cn } from \"../../utils/cn\";\nimport { filterVisiblePayload, resolveConfigEntry } from \"./chartUtils\";\nimport { useChart } from \"./useChart\";\n\n/** Re-export of Recharts `Legend` — use with `content={<ChartLegendContent />}`. */\nexport const ChartLegend = RechartsLegend;\n\n/** Props for {@link ChartLegendContent}. */\nexport interface ChartLegendContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Legend payload data. Passed by Recharts. */\n payload?: readonly LegendPayload[];\n /** Vertical alignment — controls padding direction. @default \"bottom\" */\n verticalAlign?: \"top\" | \"bottom\";\n /** Hide the color/icon indicator. @default false */\n hideIcon?: boolean;\n /** Data key used to resolve the display name from config. */\n nameKey?: string;\n}\n\n/**\n * Styled legend content for use with `<ChartLegend content={<ChartLegendContent />} />`.\n *\n * Reads chart config from context to resolve labels and icons.\n *\n * @example\n * ```tsx\n * <ChartLegend content={<ChartLegendContent />} />\n * ```\n */\nexport const ChartLegendContent = React.forwardRef<HTMLDivElement, ChartLegendContentProps>(\n ({ className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey }, ref) => {\n const { config } = useChart();\n\n if (!payload?.length) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className,\n )}\n >\n {filterVisiblePayload(payload).map((item) => {\n const key = String(nameKey || item.dataKey || \"value\");\n const itemConfig = resolveConfigEntry(config, item, key);\n\n return (\n <div\n key={item.value}\n className=\"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-foreground-tertiary\"\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{ backgroundColor: item.color }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nChartLegendContent.displayName = \"ChartLegendContent\";\n"],"names":["RechartsLegend","React","useChart","jsx","cn","filterVisiblePayload","resolveConfigEntry","jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAQO,MAAM,cAAcA,SAAAA;AAwBpB,MAAM,qBAAqBC,iBAAM;AAAA,EACtC,CAAC,EAAE,WAAW,WAAW,OAAO,SAAS,gBAAgB,UAAU,QAAA,GAAW,QAAQ;AACpF,UAAM,EAAE,OAAA,IAAWC,kBAAA;AAEnB,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAWC,GAAAA;AAAAA,UACT;AAAA,UACA,kBAAkB,QAAQ,SAAS;AAAA,UACnC;AAAA,QAAA;AAAA,QAGD,UAAAC,WAAAA,qBAAqB,OAAO,EAAE,IAAI,CAAC,SAAS;AAC3C,gBAAM,MAAM,OAAO,WAAW,KAAK,WAAW,OAAO;AACrD,gBAAM,aAAaC,WAAAA,mBAAmB,QAAQ,MAAM,GAAG;AAEvD,iBACEC,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cAET,UAAA;AAAA,gBAAA,YAAY,QAAQ,CAAC,0CACnB,WAAW,MAAX,CAAA,CAAgB,IAEjBJ,2BAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,iBAAiB,KAAK,MAAA;AAAA,kBAAM;AAAA,gBAAA;AAAA,gBAGxC,YAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAXR,KAAK;AAAA,UAAA;AAAA,QAchB,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA,mBAAmB,cAAc;;;"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const cn = require("../../utils/cn.cjs");
7
+ const Loader = require("../Loader/Loader.cjs");
8
+ function _interopNamespaceDefault(e) {
9
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
10
+ if (e) {
11
+ for (const k in e) {
12
+ if (k !== "default") {
13
+ const d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: () => e[k]
17
+ });
18
+ }
19
+ }
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
25
+ const ChartLoadingOverlay = React__namespace.forwardRef(
26
+ ({ loading = false, children, className, ...props }, ref) => {
27
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn.cn("relative", className), ...props, children: [
28
+ children,
29
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 z-10 flex items-center justify-center bg-surface-container/60", children: /* @__PURE__ */ jsxRuntime.jsx(Loader.Loader, { show: true, center: true }) })
30
+ ] });
31
+ }
32
+ );
33
+ ChartLoadingOverlay.displayName = "ChartLoadingOverlay";
34
+ exports.ChartLoadingOverlay = ChartLoadingOverlay;
35
+ //# sourceMappingURL=ChartLoadingOverlay.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartLoadingOverlay.cjs","sources":["../../../../src/components/Chart/ChartLoadingOverlay.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Loader } from \"../Loader/Loader\";\n\n/** Props for {@link ChartLoadingOverlay}. */\nexport interface ChartLoadingOverlayProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether to show the loading overlay. @default false */\n loading?: boolean;\n /** Chart content to render underneath the overlay. */\n children: React.ReactNode;\n}\n\n/**\n * A positioned overlay that displays a loading spinner on top of chart content.\n * The children are always rendered to maintain layout dimensions; the overlay\n * covers them with a semi-transparent background and a centered spinner.\n *\n * @example\n * ```tsx\n * <ChartLoadingOverlay loading={isFetching}>\n * <ChartContainer config={config} className=\"min-h-48\">\n * <LineChart data={data}>...</LineChart>\n * </ChartContainer>\n * </ChartLoadingOverlay>\n * ```\n */\nexport const ChartLoadingOverlay = React.forwardRef<HTMLDivElement, ChartLoadingOverlayProps>(\n ({ loading = false, children, className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"relative\", className)} {...props}>\n {children}\n {loading && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-surface-container/60\">\n <Loader show center />\n </div>\n )}\n </div>\n );\n },\n);\n\nChartLoadingOverlay.displayName = \"ChartLoadingOverlay\";\n"],"names":["React","jsxs","cn","jsx","Loader"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0BO,MAAM,sBAAsBA,iBAAM;AAAA,EACvC,CAAC,EAAE,UAAU,OAAO,UAAU,WAAW,GAAG,MAAA,GAAS,QAAQ;AAC3D,WACEC,gCAAC,SAAI,KAAU,WAAWC,MAAG,YAAY,SAAS,GAAI,GAAG,OACtD,UAAA;AAAA,MAAA;AAAA,MACA,WACCC,2BAAAA,IAAC,OAAA,EAAI,WAAU,kFACb,UAAAA,2BAAAA,IAACC,OAAAA,QAAA,EAAO,MAAI,MAAC,QAAM,KAAA,CAAC,EAAA,CACtB;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEA,oBAAoB,cAAc;;"}
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const cn = require("../../utils/cn.cjs");
7
+ function _interopNamespaceDefault(e) {
8
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
9
+ if (e) {
10
+ for (const k in e) {
11
+ if (k !== "default") {
12
+ const d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: () => e[k]
16
+ });
17
+ }
18
+ }
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
24
+ const ChartPieLegend = React__namespace.forwardRef(
25
+ ({ items, className, ...props }, ref) => {
26
+ const total = items.reduce((sum, item) => sum + item.value, 0);
27
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn.cn("flex flex-col gap-3", className), ...props, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
28
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
29
+ item.icon ?? /* @__PURE__ */ jsxRuntime.jsx(
30
+ "span",
31
+ {
32
+ className: "size-2 shrink-0 rounded-full",
33
+ style: { backgroundColor: item.color }
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-regular-body-sm min-w-0 flex-1 truncate text-foreground-secondary", children: item.label }),
37
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-semibold-body-md text-foreground-default tabular-nums", children: item.formattedValue ?? item.value.toLocaleString() })
38
+ ] }),
39
+ /* @__PURE__ */ jsxRuntime.jsx(
40
+ "div",
41
+ {
42
+ className: "h-1.5 rounded-full",
43
+ style: {
44
+ backgroundColor: item.color,
45
+ width: total > 0 ? `${item.value / total * 100}%` : "0%"
46
+ }
47
+ }
48
+ )
49
+ ] }, `${item.color}-${item.value}`)) });
50
+ }
51
+ );
52
+ ChartPieLegend.displayName = "ChartPieLegend";
53
+ exports.ChartPieLegend = ChartPieLegend;
54
+ //# sourceMappingURL=ChartPieLegend.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartPieLegend.cjs","sources":["../../../../src/components/Chart/ChartPieLegend.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** A single item in a {@link ChartPieLegend}. */\nexport interface ChartPieLegendItem {\n /** Display label. Pass translated string for i18n. */\n label: React.ReactNode;\n /** Numeric value for this slice. Used to calculate the proportional bar width. */\n value: number;\n /** Formatted display value (e.g. \"$4,500\"). If omitted, `value.toLocaleString()` is used. */\n formattedValue?: React.ReactNode;\n /** Slice color (CSS value). */\n color: string;\n /** Optional icon to show instead of the color dot. */\n icon?: React.ReactNode;\n}\n\n/** Props for {@link ChartPieLegend}. */\nexport interface ChartPieLegendProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Legend items to display. */\n items: ChartPieLegendItem[];\n}\n\n/**\n * A side legend for pie/donut charts that shows each slice's label,\n * formatted value, and a proportional progress bar.\n *\n * @example\n * ```tsx\n * <ChartPieLegend\n * items={[\n * { label: \"Subscriptions\", value: 4500, formattedValue: \"$4,500\", color: \"var(--color-special-chart-teal)\" },\n * { label: \"Messages\", value: 2100, formattedValue: \"$2,100\", color: \"var(--color-special-chart-sky)\" },\n * { label: \"Tips\", value: 1200, formattedValue: \"$1,200\", color: \"var(--color-special-chart-orange)\" },\n * ]}\n * />\n * ```\n */\nexport const ChartPieLegend = React.forwardRef<HTMLDivElement, ChartPieLegendProps>(\n ({ items, className, ...props }, ref) => {\n const total = items.reduce((sum, item) => sum + item.value, 0);\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-3\", className)} {...props}>\n {items.map((item) => (\n <div key={`${item.color}-${item.value}`} className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-2\">\n {item.icon ?? (\n <span\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span className=\"typography-regular-body-sm min-w-0 flex-1 truncate text-foreground-secondary\">\n {item.label}\n </span>\n <span className=\"typography-semibold-body-md text-foreground-default tabular-nums\">\n {item.formattedValue ?? item.value.toLocaleString()}\n </span>\n </div>\n <div\n className=\"h-1.5 rounded-full\"\n style={{\n backgroundColor: item.color,\n width: total > 0 ? `${(item.value / total) * 100}%` : \"0%\",\n }}\n />\n </div>\n ))}\n </div>\n );\n },\n);\n\nChartPieLegend.displayName = \"ChartPieLegend\";\n"],"names":["React","cn","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsCO,MAAM,iBAAiBA,iBAAM;AAAA,EAClC,CAAC,EAAE,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AACvC,UAAM,QAAQ,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAE7D,0CACG,OAAA,EAAI,KAAU,WAAWC,MAAG,uBAAuB,SAAS,GAAI,GAAG,OACjE,gBAAM,IAAI,CAAC,SACVC,2BAAAA,KAAC,OAAA,EAAwC,WAAU,yBACjD,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,QAAA,KAAK,QACJC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,KAAK,MAAA;AAAA,UAAM;AAAA,QAAA;AAAA,QAGzCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,gFACb,eAAK,OACR;AAAA,QACAA,2BAAAA,IAAC,UAAK,WAAU,oEACb,eAAK,kBAAkB,KAAK,MAAM,eAAA,EAAe,CACpD;AAAA,MAAA,GACF;AAAA,MACAA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,iBAAiB,KAAK;AAAA,YACtB,OAAO,QAAQ,IAAI,GAAI,KAAK,QAAQ,QAAS,GAAG,MAAM;AAAA,UAAA;AAAA,QACxD;AAAA,MAAA;AAAA,IACF,KArBQ,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,EAsBrC,CACD,GACH;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;"}
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const cn = require("../../utils/cn.cjs");
7
+ function _interopNamespaceDefault(e) {
8
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
9
+ if (e) {
10
+ for (const k in e) {
11
+ if (k !== "default") {
12
+ const d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: () => e[k]
16
+ });
17
+ }
18
+ }
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
24
+ const ChartSeriesToggle = React__namespace.forwardRef(
25
+ ({ className, items, value, onValueChange, ...props }, ref) => {
26
+ const toggle = (key) => {
27
+ const next = new Set(value);
28
+ if (next.has(key)) {
29
+ next.delete(key);
30
+ } else {
31
+ next.add(key);
32
+ }
33
+ onValueChange(next);
34
+ };
35
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn.cn("grid grid-cols-2 gap-2 sm:grid-cols-3", className), ...props, children: items.map((item) => {
36
+ const isActive = value.has(item.key);
37
+ return /* @__PURE__ */ jsxRuntime.jsxs(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ "aria-pressed": isActive,
42
+ className: cn.cn(
43
+ "typography-regular-body-sm flex items-center gap-2 rounded-full border px-3 py-1.5 text-foreground-default transition-opacity hover:opacity-100",
44
+ isActive ? "border-neutral-200 bg-surface-container" : "border-transparent bg-transparent opacity-50"
45
+ ),
46
+ onClick: () => toggle(item.key),
47
+ children: [
48
+ /* @__PURE__ */ jsxRuntime.jsx(
49
+ "span",
50
+ {
51
+ className: "size-2 shrink-0 rounded-full",
52
+ style: { backgroundColor: item.color }
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label })
56
+ ]
57
+ },
58
+ item.key
59
+ );
60
+ }) });
61
+ }
62
+ );
63
+ ChartSeriesToggle.displayName = "ChartSeriesToggle";
64
+ exports.ChartSeriesToggle = ChartSeriesToggle;
65
+ //# sourceMappingURL=ChartSeriesToggle.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartSeriesToggle.cjs","sources":["../../../../src/components/Chart/ChartSeriesToggle.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** A single toggleable series in a {@link ChartSeriesToggle}. */\nexport interface ChartSeriesToggleItem {\n /** Unique key matching the data series key and ChartConfig key. */\n key: string;\n /** Human-readable label. Pass translated string for i18n. */\n label: React.ReactNode;\n /** Series color (CSS value). Shown as indicator dot. */\n color: string;\n}\n\n/** Props for {@link ChartSeriesToggle}. */\nexport interface ChartSeriesToggleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Available series that can be toggled. */\n items: ChartSeriesToggleItem[];\n /** Set of currently visible series keys. */\n value: Set<string>;\n /** Called when a series is toggled. Receives the updated Set. */\n onValueChange: (value: Set<string>) => void;\n}\n\n/**\n * Renders a grid of toggleable chips that control which series are visible\n * on a multi-series chart. Each toggle shows a color indicator dot and a label.\n *\n * @example\n * ```tsx\n * const [visible, setVisible] = useState(new Set([\"subscription\", \"message\", \"tip\"]));\n *\n * <ChartSeriesToggle\n * items={[\n * { key: \"subscription\", label: \"Subscription\", color: \"var(--color-special-chart-teal)\" },\n * { key: \"message\", label: \"Message\", color: \"var(--color-special-chart-sky)\" },\n * { key: \"tip\", label: \"Tip\", color: \"var(--color-special-chart-orange)\" },\n * ]}\n * value={visible}\n * onValueChange={setVisible}\n * />\n * ```\n */\nexport const ChartSeriesToggle = React.forwardRef<HTMLDivElement, ChartSeriesToggleProps>(\n ({ className, items, value, onValueChange, ...props }, ref) => {\n const toggle = (key: string) => {\n const next = new Set(value);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n onValueChange(next);\n };\n\n return (\n <div ref={ref} className={cn(\"grid grid-cols-2 gap-2 sm:grid-cols-3\", className)} {...props}>\n {items.map((item) => {\n const isActive = value.has(item.key);\n return (\n <button\n key={item.key}\n type=\"button\"\n aria-pressed={isActive}\n className={cn(\n \"typography-regular-body-sm flex items-center gap-2 rounded-full border px-3 py-1.5 text-foreground-default transition-opacity hover:opacity-100\",\n isActive\n ? \"border-neutral-200 bg-surface-container\"\n : \"border-transparent bg-transparent opacity-50\",\n )}\n onClick={() => toggle(item.key)}\n >\n <span\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n <span>{item.label}</span>\n </button>\n );\n })}\n </div>\n );\n },\n);\n\nChartSeriesToggle.displayName = \"ChartSeriesToggle\";\n"],"names":["React","jsx","cn","jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0CO,MAAM,oBAAoBA,iBAAM;AAAA,EACrC,CAAC,EAAE,WAAW,OAAO,OAAO,eAAe,GAAG,MAAA,GAAS,QAAQ;AAC7D,UAAM,SAAS,CAAC,QAAgB;AAC9B,YAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,UAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAK,OAAO,GAAG;AAAA,MACjB,OAAO;AACL,aAAK,IAAI,GAAG;AAAA,MACd;AACA,oBAAc,IAAI;AAAA,IACpB;AAEA,WACEC,2BAAAA,IAAC,OAAA,EAAI,KAAU,WAAWC,GAAAA,GAAG,yCAAyC,SAAS,GAAI,GAAG,OACnF,UAAA,MAAM,IAAI,CAAC,SAAS;AACnB,YAAM,WAAW,MAAM,IAAI,KAAK,GAAG;AACnC,aACEC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,gBAAc;AAAA,UACd,WAAWD,GAAAA;AAAAA,YACT;AAAA,YACA,WACI,4CACA;AAAA,UAAA;AAAA,UAEN,SAAS,MAAM,OAAO,KAAK,GAAG;AAAA,UAE9B,UAAA;AAAA,YAAAD,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,iBAAiB,KAAK,MAAA;AAAA,cAAM;AAAA,YAAA;AAAA,YAEvCA,2BAAAA,IAAC,QAAA,EAAM,UAAA,KAAK,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAfb,KAAK;AAAA,MAAA;AAAA,IAkBhB,CAAC,EAAA,CACH;AAAA,EAEJ;AACF;AAEA,kBAAkB,cAAc;;"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const chartUtils = require("./chartUtils.cjs");
7
+ function _interopNamespaceDefault(e) {
8
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
9
+ if (e) {
10
+ for (const k in e) {
11
+ if (k !== "default") {
12
+ const d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: () => e[k]
16
+ });
17
+ }
18
+ }
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
24
+ const ChartStyle = React__namespace.memo(function ChartStyle2({ id, config }) {
25
+ const colorEntries = Object.entries(config).filter(([, entry]) => entry.theme || entry.color);
26
+ if (colorEntries.length === 0) return null;
27
+ const css = Object.entries(chartUtils.THEMES).map(([theme, prefix]) => {
28
+ const vars = colorEntries.map(([key, entry]) => {
29
+ const color = entry.theme?.[theme] || entry.color;
30
+ return color ? ` --color-${key}: ${color};` : null;
31
+ }).filter(Boolean).join("\n");
32
+ return `${prefix} [data-chart=${id}] {
33
+ ${vars}
34
+ }`;
35
+ }).join("\n");
36
+ return /* @__PURE__ */ jsxRuntime.jsx("style", { children: css });
37
+ });
38
+ ChartStyle.displayName = "ChartStyle";
39
+ exports.ChartStyle = ChartStyle;
40
+ //# sourceMappingURL=ChartStyle.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartStyle.cjs","sources":["../../../../src/components/Chart/ChartStyle.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { THEMES } from \"./chartUtils\";\nimport type { ChartConfig } from \"./types\";\n\n/** Props for the scoped CSS variable injector used by {@link ChartContainer}. */\nexport interface ChartStyleProps {\n /** Unique identifier scoped to the chart instance. */\n id: string;\n /** Chart configuration mapping data keys to colors and themes. */\n config: ChartConfig;\n}\n\n/**\n * Injects a scoped `<style>` tag that maps each config entry to a\n * `--color-{key}` CSS custom property, with light/dark theme support.\n *\n * Rendered automatically by {@link ChartContainer} — you rarely need this directly.\n */\nexport const ChartStyle = React.memo(function ChartStyle({ id, config }: ChartStyleProps) {\n const colorEntries = Object.entries(config).filter(([, entry]) => entry.theme || entry.color);\n\n if (colorEntries.length === 0) return null;\n\n const css = Object.entries(THEMES)\n .map(([theme, prefix]) => {\n const vars = colorEntries\n .map(([key, entry]) => {\n const color = entry.theme?.[theme as keyof typeof entry.theme] || entry.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .filter(Boolean)\n .join(\"\\n\");\n return `${prefix} [data-chart=${id}] {\\n${vars}\\n}`;\n })\n .join(\"\\n\");\n\n return <style>{css}</style>;\n});\n\nChartStyle.displayName = \"ChartStyle\";\n"],"names":["React","ChartStyle","THEMES","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAM,aAAaA,iBAAM,KAAK,SAASC,YAAW,EAAE,IAAI,UAA2B;AACxF,QAAM,eAAe,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM,MAAM,SAAS,MAAM,KAAK;AAE5F,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,MAAM,OAAO,QAAQC,WAAAA,MAAM,EAC9B,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM;AACxB,UAAM,OAAO,aACV,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,YAAM,QAAQ,MAAM,QAAQ,KAAiC,KAAK,MAAM;AACxE,aAAO,QAAQ,aAAa,GAAG,KAAK,KAAK,MAAM;AAAA,IACjD,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,WAAO,GAAG,MAAM,gBAAgB,EAAE;AAAA,EAAQ,IAAI;AAAA;AAAA,EAChD,CAAC,EACA,KAAK,IAAI;AAEZ,SAAOC,2BAAAA,IAAC,WAAO,UAAA,IAAA,CAAI;AACrB,CAAC;AAED,WAAW,cAAc;;"}
@@ -0,0 +1,147 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const recharts = require("recharts");
7
+ const cn = require("../../utils/cn.cjs");
8
+ const chartUtils = require("./chartUtils.cjs");
9
+ const useChart = require("./useChart.cjs");
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== "default") {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
27
+ const ChartTooltip = recharts.Tooltip;
28
+ function TooltipRow({
29
+ item,
30
+ itemConfig,
31
+ indicator,
32
+ indicatorColor,
33
+ hideIndicator,
34
+ nestLabel,
35
+ tooltipLabel
36
+ }) {
37
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
38
+ itemConfig?.icon ? /* @__PURE__ */ jsxRuntime.jsx(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ jsxRuntime.jsx(
39
+ "div",
40
+ {
41
+ className: cn.cn("shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)", {
42
+ "h-2.5 w-2.5": indicator === "dot",
43
+ "w-1": indicator === "line",
44
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
45
+ "my-0.5": nestLabel && indicator === "dashed"
46
+ }),
47
+ style: {
48
+ "--color-bg": indicatorColor,
49
+ "--color-border": indicatorColor
50
+ }
51
+ }
52
+ ),
53
+ /* @__PURE__ */ jsxRuntime.jsxs(
54
+ "div",
55
+ {
56
+ className: cn.cn(
57
+ "flex flex-1 justify-between leading-none",
58
+ nestLabel ? "items-end" : "items-center"
59
+ ),
60
+ children: [
61
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-1.5", children: [
62
+ nestLabel ? tooltipLabel : null,
63
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground-tertiary", children: itemConfig?.label || item.name })
64
+ ] }),
65
+ item.value !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium font-mono text-foreground-default tabular-nums", children: typeof item.value === "number" ? item.value.toLocaleString() : item.value })
66
+ ]
67
+ }
68
+ )
69
+ ] });
70
+ }
71
+ const ChartTooltipContent = React__namespace.forwardRef(
72
+ ({
73
+ active,
74
+ payload,
75
+ className,
76
+ indicator = "dot",
77
+ hideLabel = false,
78
+ hideIndicator = false,
79
+ label,
80
+ labelFormatter,
81
+ labelClassName,
82
+ formatter,
83
+ color,
84
+ nameKey,
85
+ labelKey
86
+ }, ref) => {
87
+ const { config } = useChart.useChart();
88
+ const tooltipLabel = React__namespace.useMemo(() => {
89
+ if (hideLabel || !payload?.length) return null;
90
+ const [item] = payload;
91
+ const key = String(labelKey || item?.dataKey || item?.name || "value");
92
+ const itemConfig = chartUtils.resolveConfigEntry(config, item, key);
93
+ const value = !labelKey && typeof label === "string" ? config[label]?.label || label : itemConfig?.label;
94
+ if (labelFormatter && payload) {
95
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn.cn("font-medium", labelClassName), children: labelFormatter(value, payload) });
96
+ }
97
+ if (!value) return null;
98
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn.cn("font-medium", labelClassName), children: value });
99
+ }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);
100
+ if (!active || !payload?.length) return null;
101
+ const nestLabel = payload.length === 1 && indicator !== "dot";
102
+ return /* @__PURE__ */ jsxRuntime.jsxs(
103
+ "div",
104
+ {
105
+ ref,
106
+ className: cn.cn(
107
+ "grid min-w-32 items-start gap-1.5 rounded-lg border border-neutral-200 bg-surface-container px-2.5 py-1.5 text-xs shadow-float",
108
+ className
109
+ ),
110
+ children: [
111
+ !nestLabel ? tooltipLabel : null,
112
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-1.5", children: chartUtils.filterVisiblePayload(payload).map((item, index) => {
113
+ const key = String(nameKey || item.dataKey || item.name || "value");
114
+ const itemConfig = chartUtils.resolveConfigEntry(config, item, key);
115
+ const indicatorColor = color || item.payload?.fill || item.color;
116
+ return /* @__PURE__ */ jsxRuntime.jsx(
117
+ "div",
118
+ {
119
+ className: cn.cn(
120
+ "flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-foreground-tertiary",
121
+ indicator === "dot" && "items-center"
122
+ ),
123
+ children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, payload) : /* @__PURE__ */ jsxRuntime.jsx(
124
+ TooltipRow,
125
+ {
126
+ item,
127
+ itemConfig,
128
+ indicator,
129
+ indicatorColor,
130
+ hideIndicator,
131
+ nestLabel,
132
+ tooltipLabel
133
+ }
134
+ )
135
+ },
136
+ `${item.dataKey ?? item.name ?? index}`
137
+ );
138
+ }) })
139
+ ]
140
+ }
141
+ );
142
+ }
143
+ );
144
+ ChartTooltipContent.displayName = "ChartTooltipContent";
145
+ exports.ChartTooltip = ChartTooltip;
146
+ exports.ChartTooltipContent = ChartTooltipContent;
147
+ //# sourceMappingURL=ChartTooltip.cjs.map