@karakuri-ui/react 0.2.3 → 0.3.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.
- package/README.md +0 -1
- package/dist/components/ui/accordion.d.mts +40 -0
- package/dist/components/ui/accordion.d.ts +40 -0
- package/dist/components/ui/accordion.js +215 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/accordion.mjs +176 -0
- package/dist/components/ui/accordion.mjs.map +1 -0
- package/dist/components/ui/alert.d.mts +38 -0
- package/dist/components/ui/alert.d.ts +38 -0
- package/dist/components/ui/alert.js +217 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/alert.mjs +180 -0
- package/dist/components/ui/alert.mjs.map +1 -0
- package/dist/components/ui/avatar.d.mts +223 -0
- package/dist/components/ui/avatar.d.ts +223 -0
- package/dist/components/ui/avatar.js +245 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/avatar.mjs +204 -0
- package/dist/components/ui/avatar.mjs.map +1 -0
- package/dist/components/ui/badge.d.mts +31 -0
- package/dist/components/ui/badge.d.ts +31 -0
- package/dist/components/ui/badge.js +205 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/badge.mjs +170 -0
- package/dist/components/ui/badge.mjs.map +1 -0
- package/dist/components/ui/breadcrumb.d.mts +46 -0
- package/dist/components/ui/breadcrumb.d.ts +46 -0
- package/dist/components/ui/breadcrumb.js +201 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/breadcrumb.mjs +160 -0
- package/dist/components/ui/breadcrumb.mjs.map +1 -0
- package/dist/components/ui/button-group.d.mts +22 -0
- package/dist/components/ui/button-group.d.ts +22 -0
- package/dist/components/ui/button-group.js +107 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button-group.mjs +72 -0
- package/dist/components/ui/button-group.mjs.map +1 -0
- package/dist/components/ui/button.d.mts +31 -0
- package/dist/components/ui/button.d.ts +31 -0
- package/dist/components/ui/button.js +176 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/button.mjs +141 -0
- package/dist/components/ui/button.mjs.map +1 -0
- package/dist/components/ui/card.d.mts +60 -0
- package/dist/components/ui/card.d.ts +60 -0
- package/dist/components/ui/card.js +361 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/card.mjs +319 -0
- package/dist/components/ui/card.mjs.map +1 -0
- package/dist/{chart.d.mts → components/ui/chart.d.mts} +2 -18
- package/dist/{chart.d.ts → components/ui/chart.d.ts} +2 -18
- package/dist/{chart.js → components/ui/chart.js} +30 -55
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/{chart.mjs → components/ui/chart.mjs} +22 -46
- package/dist/components/ui/chart.mjs.map +1 -0
- package/dist/components/ui/checkbox.d.mts +24 -0
- package/dist/components/ui/checkbox.d.ts +24 -0
- package/dist/components/ui/checkbox.js +173 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/checkbox.mjs +138 -0
- package/dist/components/ui/checkbox.mjs.map +1 -0
- package/dist/components/ui/divider.d.mts +27 -0
- package/dist/components/ui/divider.d.ts +27 -0
- package/dist/components/ui/divider.js +147 -0
- package/dist/components/ui/divider.js.map +1 -0
- package/dist/components/ui/divider.mjs +112 -0
- package/dist/components/ui/divider.mjs.map +1 -0
- package/dist/components/ui/drawer.d.mts +36 -0
- package/dist/components/ui/drawer.d.ts +36 -0
- package/dist/components/ui/drawer.js +211 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/drawer.mjs +165 -0
- package/dist/components/ui/drawer.mjs.map +1 -0
- package/dist/components/ui/dropdown.d.mts +34 -0
- package/dist/components/ui/dropdown.d.ts +34 -0
- package/dist/components/ui/dropdown.js +295 -0
- package/dist/components/ui/dropdown.js.map +1 -0
- package/dist/components/ui/dropdown.mjs +248 -0
- package/dist/components/ui/dropdown.mjs.map +1 -0
- package/dist/components/ui/field.d.mts +26 -0
- package/dist/components/ui/field.d.ts +26 -0
- package/dist/components/ui/field.js +141 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/field.mjs +103 -0
- package/dist/components/ui/field.mjs.map +1 -0
- package/dist/components/ui/icon-button.d.mts +20 -0
- package/dist/components/ui/icon-button.d.ts +20 -0
- package/dist/components/ui/icon-button.js +147 -0
- package/dist/components/ui/icon-button.js.map +1 -0
- package/dist/components/ui/icon-button.mjs +112 -0
- package/dist/components/ui/icon-button.mjs.map +1 -0
- package/dist/components/ui/index.d.mts +55 -0
- package/dist/components/ui/index.d.ts +55 -0
- package/dist/components/ui/index.js +468 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/components/ui/index.mjs +242 -0
- package/dist/components/ui/index.mjs.map +1 -0
- package/dist/components/ui/input.d.mts +20 -0
- package/dist/components/ui/input.d.ts +20 -0
- package/dist/components/ui/input.js +250 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/input.mjs +215 -0
- package/dist/components/ui/input.mjs.map +1 -0
- package/dist/components/ui/metric-card.d.mts +38 -0
- package/dist/components/ui/metric-card.d.ts +38 -0
- package/dist/components/ui/metric-card.js +250 -0
- package/dist/components/ui/metric-card.js.map +1 -0
- package/dist/components/ui/metric-card.mjs +209 -0
- package/dist/components/ui/metric-card.mjs.map +1 -0
- package/dist/components/ui/modal.d.mts +47 -0
- package/dist/components/ui/modal.d.ts +47 -0
- package/dist/components/ui/modal.js +371 -0
- package/dist/components/ui/modal.js.map +1 -0
- package/dist/components/ui/modal.mjs +313 -0
- package/dist/components/ui/modal.mjs.map +1 -0
- package/dist/components/ui/navigation-menu.d.mts +120 -0
- package/dist/components/ui/navigation-menu.d.ts +120 -0
- package/dist/components/ui/navigation-menu.js +521 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/navigation-menu.mjs +478 -0
- package/dist/components/ui/navigation-menu.mjs.map +1 -0
- package/dist/components/ui/pagination.d.mts +113 -0
- package/dist/components/ui/pagination.d.ts +113 -0
- package/dist/components/ui/pagination.js +484 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/pagination.mjs +438 -0
- package/dist/components/ui/pagination.mjs.map +1 -0
- package/dist/components/ui/popover.d.mts +29 -0
- package/dist/components/ui/popover.d.ts +29 -0
- package/dist/components/ui/popover.js +165 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/popover.mjs +124 -0
- package/dist/components/ui/popover.mjs.map +1 -0
- package/dist/components/ui/progress.d.mts +35 -0
- package/dist/components/ui/progress.d.ts +35 -0
- package/dist/components/ui/progress.js +194 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/progress.mjs +159 -0
- package/dist/components/ui/progress.mjs.map +1 -0
- package/dist/components/ui/radio-group.d.mts +35 -0
- package/dist/components/ui/radio-group.d.ts +35 -0
- package/dist/components/ui/radio-group.js +174 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/radio-group.mjs +137 -0
- package/dist/components/ui/radio-group.mjs.map +1 -0
- package/dist/components/ui/segmented.d.mts +25 -0
- package/dist/components/ui/segmented.d.ts +25 -0
- package/dist/components/ui/segmented.js +238 -0
- package/dist/components/ui/segmented.js.map +1 -0
- package/dist/components/ui/segmented.mjs +201 -0
- package/dist/components/ui/segmented.mjs.map +1 -0
- package/dist/components/ui/select.d.mts +20 -0
- package/dist/components/ui/select.d.ts +20 -0
- package/dist/components/ui/select.js +308 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/select.mjs +267 -0
- package/dist/components/ui/select.mjs.map +1 -0
- package/dist/components/ui/skeleton.d.mts +26 -0
- package/dist/components/ui/skeleton.d.ts +26 -0
- package/dist/components/ui/skeleton.js +144 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/skeleton.mjs +109 -0
- package/dist/components/ui/skeleton.mjs.map +1 -0
- package/dist/components/ui/slider.d.mts +38 -0
- package/dist/components/ui/slider.d.ts +38 -0
- package/dist/components/ui/slider.js +180 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/slider.mjs +145 -0
- package/dist/components/ui/slider.mjs.map +1 -0
- package/dist/components/ui/spinner.d.mts +23 -0
- package/dist/components/ui/spinner.d.ts +23 -0
- package/dist/components/ui/spinner.js +471 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/spinner.mjs +436 -0
- package/dist/components/ui/spinner.mjs.map +1 -0
- package/dist/components/ui/switch.d.mts +22 -0
- package/dist/components/ui/switch.d.ts +22 -0
- package/dist/components/ui/switch.js +173 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/switch.mjs +138 -0
- package/dist/components/ui/switch.mjs.map +1 -0
- package/dist/components/ui/table.d.mts +60 -0
- package/dist/components/ui/table.d.ts +60 -0
- package/dist/components/ui/table.js +231 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/table.mjs +190 -0
- package/dist/components/ui/table.mjs.map +1 -0
- package/dist/components/ui/tabs.d.mts +31 -0
- package/dist/components/ui/tabs.d.ts +31 -0
- package/dist/components/ui/tabs.js +233 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/tabs.mjs +194 -0
- package/dist/components/ui/tabs.mjs.map +1 -0
- package/dist/components/ui/textarea.d.mts +19 -0
- package/dist/components/ui/textarea.d.ts +19 -0
- package/dist/components/ui/textarea.js +181 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/textarea.mjs +146 -0
- package/dist/components/ui/textarea.mjs.map +1 -0
- package/dist/components/ui/toast.d.mts +93 -0
- package/dist/components/ui/toast.d.ts +93 -0
- package/dist/components/ui/toast.js +429 -0
- package/dist/components/ui/toast.js.map +1 -0
- package/dist/components/ui/toast.mjs +393 -0
- package/dist/components/ui/toast.mjs.map +1 -0
- package/dist/components/ui/toggle-group.d.mts +42 -0
- package/dist/components/ui/toggle-group.d.ts +42 -0
- package/dist/components/ui/toggle-group.js +183 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle-group.mjs +146 -0
- package/dist/components/ui/toggle-group.mjs.map +1 -0
- package/dist/components/ui/toggle.d.mts +19 -0
- package/dist/components/ui/toggle.d.ts +19 -0
- package/dist/components/ui/toggle.js +194 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/toggle.mjs +159 -0
- package/dist/components/ui/toggle.mjs.map +1 -0
- package/dist/components/ui/tooltip.d.mts +26 -0
- package/dist/components/ui/tooltip.d.ts +26 -0
- package/dist/components/ui/tooltip.js +128 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/tooltip.mjs +88 -0
- package/dist/components/ui/tooltip.mjs.map +1 -0
- package/dist/lib/code-generator.d.mts +60 -0
- package/dist/lib/code-generator.d.ts +60 -0
- package/dist/lib/code-generator.js +224 -0
- package/dist/lib/code-generator.js.map +1 -0
- package/dist/lib/code-generator.mjs +159 -0
- package/dist/lib/code-generator.mjs.map +1 -0
- package/dist/lib/utils.d.mts +10 -0
- package/dist/lib/utils.d.ts +10 -0
- package/dist/lib/utils.js +33 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.mjs +9 -0
- package/dist/lib/utils.mjs.map +1 -0
- package/package.json +11 -11
- package/dist/chart.js.map +0 -1
- package/dist/chart.mjs.map +0 -1
- package/dist/index.d.mts +0 -1636
- package/dist/index.d.ts +0 -1636
- package/dist/index.js +0 -7291
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -7048
- package/dist/index.mjs.map +0 -1
|
@@ -27,14 +27,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
mod
|
|
28
28
|
));
|
|
29
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
-
|
|
31
|
-
// src/components/ui/chart.tsx
|
|
32
30
|
var chart_exports = {};
|
|
33
31
|
__export(chart_exports, {
|
|
34
32
|
Chart: () => Chart,
|
|
35
33
|
ChartArea: () => ChartArea,
|
|
36
34
|
ChartBar: () => ChartBar,
|
|
37
|
-
ChartContainer: () => ChartContainer,
|
|
38
35
|
ChartLegend: () => ChartLegend,
|
|
39
36
|
ChartLegendContent: () => ChartLegendContent,
|
|
40
37
|
ChartLine: () => ChartLine,
|
|
@@ -49,25 +46,17 @@ __export(chart_exports, {
|
|
|
49
46
|
module.exports = __toCommonJS(chart_exports);
|
|
50
47
|
var React = __toESM(require("react"));
|
|
51
48
|
var RechartsPrimitive = __toESM(require("recharts"));
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
var import_tailwind_merge = require("tailwind-merge");
|
|
56
|
-
function cn(...inputs) {
|
|
57
|
-
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// src/components/ui/chart.tsx
|
|
61
|
-
var THEMES = { light: "", dark: ".dark" };
|
|
62
|
-
var ChartContext = React.createContext(null);
|
|
49
|
+
var import_utils = require("../../lib/utils");
|
|
50
|
+
const THEMES = { light: "", dark: ".dark" };
|
|
51
|
+
const ChartContext = React.createContext(null);
|
|
63
52
|
function useChart() {
|
|
64
53
|
const context = React.useContext(ChartContext);
|
|
65
54
|
if (!context) {
|
|
66
|
-
throw new Error("useChart must be used within a <
|
|
55
|
+
throw new Error("useChart must be used within a <Chart />");
|
|
67
56
|
}
|
|
68
57
|
return context;
|
|
69
58
|
}
|
|
70
|
-
function
|
|
59
|
+
function Chart({
|
|
71
60
|
id,
|
|
72
61
|
className,
|
|
73
62
|
children,
|
|
@@ -88,7 +77,7 @@ function ChartContainer({
|
|
|
88
77
|
setActiveIndex(null);
|
|
89
78
|
setActiveDataKey(null);
|
|
90
79
|
} : void 0,
|
|
91
|
-
className: cn(
|
|
80
|
+
className: (0, import_utils.cn)(
|
|
92
81
|
"flex aspect-video w-full justify-center text-xs outline-none [&_*]:outline-none",
|
|
93
82
|
// Responsive axis tick font-size — consumed by ChartXAxis / ChartYAxis via var()
|
|
94
83
|
"[--chart-axis-fs:var(--font-size-2xs)] sm:[--chart-axis-fs:var(--font-size-xs)]",
|
|
@@ -114,8 +103,8 @@ function ChartContainer({
|
|
|
114
103
|
/* @__PURE__ */ React.createElement(RechartsPrimitive.ResponsiveContainer, null, children)
|
|
115
104
|
));
|
|
116
105
|
}
|
|
117
|
-
|
|
118
|
-
|
|
106
|
+
const CHART_TOOLTIP_KEYFRAME = "@keyframes chart-tooltip-in{from{opacity:0}to{opacity:1}}";
|
|
107
|
+
const ChartStyle = ({ id, config }) => {
|
|
119
108
|
const colorConfig = Object.entries(config).filter(
|
|
120
109
|
([, config2]) => config2.theme || config2.color
|
|
121
110
|
);
|
|
@@ -138,9 +127,9 @@ ${colorConfig.map(([key, itemConfig]) => {
|
|
|
138
127
|
}
|
|
139
128
|
);
|
|
140
129
|
};
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
130
|
+
const CHART_HOVER_FADE_OPACITY = 0.35;
|
|
131
|
+
const CHART_FADE_TRANSITION = { transition: "fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out" };
|
|
132
|
+
const CHART_BAR_RADIUS_MAP = {
|
|
144
133
|
none: 0,
|
|
145
134
|
// --radius-none: 0px
|
|
146
135
|
sm: 2,
|
|
@@ -247,12 +236,12 @@ function ChartTooltipContent({
|
|
|
247
236
|
const itemConfig = getPayloadConfigFromPayload(config, item, key);
|
|
248
237
|
const value = !labelKey && typeof label === "string" ? config[label]?.label || label : itemConfig?.label;
|
|
249
238
|
if (labelFormatter) {
|
|
250
|
-
return /* @__PURE__ */ React.createElement("div", { className: cn("font-semibold", labelClassName) }, labelFormatter(value, payload));
|
|
239
|
+
return /* @__PURE__ */ React.createElement("div", { className: (0, import_utils.cn)("font-semibold", labelClassName) }, labelFormatter(value, payload));
|
|
251
240
|
}
|
|
252
241
|
if (!value) {
|
|
253
242
|
return null;
|
|
254
243
|
}
|
|
255
|
-
return /* @__PURE__ */ React.createElement("div", { className: cn("font-semibold", labelClassName) }, value);
|
|
244
|
+
return /* @__PURE__ */ React.createElement("div", { className: (0, import_utils.cn)("font-semibold", labelClassName) }, value);
|
|
256
245
|
}, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);
|
|
257
246
|
if (!active || !payload?.length) {
|
|
258
247
|
return null;
|
|
@@ -261,7 +250,7 @@ function ChartTooltipContent({
|
|
|
261
250
|
return /* @__PURE__ */ React.createElement(
|
|
262
251
|
"div",
|
|
263
252
|
{
|
|
264
|
-
className: cn(
|
|
253
|
+
className: (0, import_utils.cn)(
|
|
265
254
|
"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-xs shadow-xl",
|
|
266
255
|
className
|
|
267
256
|
),
|
|
@@ -276,7 +265,7 @@ function ChartTooltipContent({
|
|
|
276
265
|
"div",
|
|
277
266
|
{
|
|
278
267
|
key: item.dataKey,
|
|
279
|
-
className: cn(
|
|
268
|
+
className: (0, import_utils.cn)(
|
|
280
269
|
"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-text-muted",
|
|
281
270
|
indicator === "dot" && "items-center"
|
|
282
271
|
)
|
|
@@ -284,7 +273,7 @@ function ChartTooltipContent({
|
|
|
284
273
|
formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ React.createElement(React.Fragment, null, itemConfig?.icon ? /* @__PURE__ */ React.createElement(itemConfig.icon, null) : !hideIndicator && /* @__PURE__ */ React.createElement(
|
|
285
274
|
"div",
|
|
286
275
|
{
|
|
287
|
-
className: cn(
|
|
276
|
+
className: (0, import_utils.cn)(
|
|
288
277
|
"shrink-0 rounded-sm",
|
|
289
278
|
{
|
|
290
279
|
"h-2.5 w-2.5": indicator === "dot",
|
|
@@ -301,7 +290,7 @@ function ChartTooltipContent({
|
|
|
301
290
|
), /* @__PURE__ */ React.createElement(
|
|
302
291
|
"div",
|
|
303
292
|
{
|
|
304
|
-
className: cn(
|
|
293
|
+
className: (0, import_utils.cn)(
|
|
305
294
|
"flex flex-1 justify-between leading-none",
|
|
306
295
|
nestLabel ? "items-end" : "items-center"
|
|
307
296
|
)
|
|
@@ -313,7 +302,7 @@ function ChartTooltipContent({
|
|
|
313
302
|
}))
|
|
314
303
|
);
|
|
315
304
|
}
|
|
316
|
-
|
|
305
|
+
const ChartLegend = RechartsPrimitive.Legend;
|
|
317
306
|
function ChartLegendContent({
|
|
318
307
|
className,
|
|
319
308
|
hideIcon = false,
|
|
@@ -331,7 +320,7 @@ function ChartLegendContent({
|
|
|
331
320
|
return /* @__PURE__ */ React.createElement(
|
|
332
321
|
"div",
|
|
333
322
|
{
|
|
334
|
-
className: cn(
|
|
323
|
+
className: (0, import_utils.cn)(
|
|
335
324
|
"flex gap-4",
|
|
336
325
|
isVertical ? "flex-col items-start gap-1.5" : [
|
|
337
326
|
"items-center",
|
|
@@ -377,17 +366,17 @@ function getPayloadConfigFromPayload(config, payload, key) {
|
|
|
377
366
|
}
|
|
378
367
|
return configLabelKey in config ? config[configLabelKey] : config[key];
|
|
379
368
|
}
|
|
380
|
-
|
|
381
|
-
|
|
369
|
+
const CHART_AXIS_TICK_STYLE = { style: { fontSize: "var(--chart-axis-fs)", fill: "var(--color-text-subtle)" } };
|
|
370
|
+
const CHART_XAXIS_PADDING = { left: 16, right: 16 };
|
|
382
371
|
function ChartXAxis({ tick, padding, ...props }) {
|
|
383
372
|
return /* @__PURE__ */ React.createElement(RechartsPrimitive.XAxis, { tick: tick ?? CHART_AXIS_TICK_STYLE, padding: padding ?? CHART_XAXIS_PADDING, ...props });
|
|
384
373
|
}
|
|
385
374
|
function ChartYAxis({ tick, width = "auto", ...props }) {
|
|
386
375
|
return /* @__PURE__ */ React.createElement(RechartsPrimitive.YAxis, { tick: tick ?? CHART_AXIS_TICK_STYLE, width, ...props });
|
|
387
376
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
377
|
+
const CHART_LINE_DASH = "5 5";
|
|
378
|
+
const CHART_DOT_PROPS = { r: 3, strokeWidth: 2 };
|
|
379
|
+
const CHART_ACTIVE_DOT_PROPS = { r: 5, strokeWidth: 2 };
|
|
391
380
|
function ChartLine({
|
|
392
381
|
type = "monotone",
|
|
393
382
|
variant = "solid",
|
|
@@ -420,7 +409,7 @@ function ChartLine({
|
|
|
420
409
|
}
|
|
421
410
|
);
|
|
422
411
|
}
|
|
423
|
-
|
|
412
|
+
const CHART_AREA_DEFAULT_OPACITY = 0.4;
|
|
424
413
|
function ChartArea({
|
|
425
414
|
type = "monotone",
|
|
426
415
|
variant = "solid",
|
|
@@ -459,11 +448,11 @@ function ChartArea({
|
|
|
459
448
|
}
|
|
460
449
|
));
|
|
461
450
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
451
|
+
const CHART_PIE_ACTIVE_OFFSET = 8;
|
|
452
|
+
const CHART_PIE_DONUT_INNER_RADIUS = 60;
|
|
453
|
+
const CHART_PIE_LABEL_RADIAL = 16;
|
|
454
|
+
const CHART_PIE_LABEL_HORIZ = 20;
|
|
455
|
+
const CHART_PIE_SKIP_ANGLE = 15;
|
|
467
456
|
function ChartPie({
|
|
468
457
|
variant = "pie",
|
|
469
458
|
label: labelMode = "none",
|
|
@@ -550,25 +539,11 @@ function ChartPie({
|
|
|
550
539
|
}
|
|
551
540
|
);
|
|
552
541
|
}
|
|
553
|
-
var Chart = Object.assign(ChartContainer, {
|
|
554
|
-
Bar: ChartBar,
|
|
555
|
-
Line: ChartLine,
|
|
556
|
-
Area: ChartArea,
|
|
557
|
-
Pie: ChartPie,
|
|
558
|
-
Tooltip: ChartTooltip,
|
|
559
|
-
TooltipContent: ChartTooltipContent,
|
|
560
|
-
Legend: ChartLegend,
|
|
561
|
-
LegendContent: ChartLegendContent,
|
|
562
|
-
XAxis: ChartXAxis,
|
|
563
|
-
YAxis: ChartYAxis,
|
|
564
|
-
Style: ChartStyle
|
|
565
|
-
});
|
|
566
542
|
// Annotate the CommonJS export names for ESM import in node:
|
|
567
543
|
0 && (module.exports = {
|
|
568
544
|
Chart,
|
|
569
545
|
ChartArea,
|
|
570
546
|
ChartBar,
|
|
571
|
-
ChartContainer,
|
|
572
547
|
ChartLegend,
|
|
573
548
|
ChartLegendContent,
|
|
574
549
|
ChartLine,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as RechartsPrimitive from 'recharts'\nimport { cn } from '../../lib/utils'\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n // Hover fade state\n hoverFade: boolean\n activeIndex: number | null\n setActiveIndex: (index: number | null) => void\n // Series-level hover fade (used by ChartLine)\n activeDataKey: string | null\n setActiveDataKey: (key: string | null) => void\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n if (!context) {\n throw new Error('useChart must be used within a <Chart />')\n }\n return context\n}\n\nfunction Chart({\n id,\n className,\n children,\n config,\n hoverFade = false,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig\n /** Enable hover-to-highlight: hovered bar group stays full opacity, others fade. */\n hoverFade?: boolean\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children']\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null)\n const [activeDataKey, setActiveDataKey] = React.useState<string | null>(null)\n\n return (\n <ChartContext.Provider value={{ config, hoverFade, activeIndex, setActiveIndex, activeDataKey, setActiveDataKey }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n onMouseLeave={hoverFade ? () => { setActiveIndex(null); setActiveDataKey(null) } : undefined}\n className={cn(\n 'flex aspect-video w-full justify-center text-xs outline-none [&_*]:outline-none',\n // Responsive axis tick font-size — consumed by ChartXAxis / ChartYAxis via var()\n '[--chart-axis-fs:var(--font-size-2xs)] sm:[--chart-axis-fs:var(--font-size-xs)]',\n // Recharts element overrides — use arbitrary properties for v3/v4 compat\n '[&_.recharts-cartesian-axis-tick_text]:[fill:var(--color-text-muted)]',\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-cartesian-grid_line]:[stroke-dasharray:3_3]',\n '[&_.recharts-curve.recharts-tooltip-cursor]:[stroke:var(--color-border)]',\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\n '[&_.recharts-layer]:outline-none',\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-radial-bar-background-sector]:[fill:var(--color-background-muted)]',\n '[&_.recharts-rectangle.recharts-tooltip-cursor]:[fill:transparent]',\n \"[&_.recharts-reference-line_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-sector]:outline-none',\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent\",\n '[&_.recharts-surface]:outline-none',\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\n// Tooltip fade-in keyframe — injected once per chart via ChartStyle\nconst CHART_TOOLTIP_KEYFRAME = '@keyframes chart-tooltip-in{from{opacity:0}to{opacity:1}}'\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n )\n\n const colorCss = colorConfig.length\n ? Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join('\\n')}\n}\n`\n )\n .join('\\n')\n : ''\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: CHART_TOOLTIP_KEYFRAME + colorCss,\n }}\n />\n )\n}\n\n// ─── ChartBar ─────────────────────────────────────────────────────────────────\n\nexport type ChartBarRadius = 'none' | 'sm' | 'base' | 'md' | 'lg'\nexport type ChartBarVariant = 'solid' | 'outline'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\n// Matches --opacity-35 token (0.35).\nconst CHART_HOVER_FADE_OPACITY = 0.35\n\n// Fade transition for hover effect — uses --duration-fast token via CSS variable\nconst CHART_FADE_TRANSITION = { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } as const\n\n// TOKEN-EXCEPTION: Recharts Bar radius is an SVG attribute — CSS variables not supported.\n// Values mirror --radius-* tokens from variables.css.\nconst CHART_BAR_RADIUS_MAP: Record<ChartBarRadius, number> = {\n none: 0, // --radius-none: 0px\n sm: 2, // --radius-sm: 2px\n base: 4, // --radius-base: 4px\n md: 6, // --radius-md: 6px\n lg: 8, // --radius-lg: 8px\n}\n\ntype ChartBarProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Bar>, 'radius'> & {\n /** Named radius token. Auto-adapts corners based on layout and stack position. */\n radius?: ChartBarRadius\n /** 'horizontal' rounds the right side (away from Y-axis). Default: 'vertical' */\n layout?: 'vertical' | 'horizontal'\n /** 'bottom' rounds the bottom corners (base of a stack). Default: 'top' */\n stackPosition?: 'top' | 'bottom'\n /** 'outline' renders a thick border with a semi-transparent fill. Default: 'solid' */\n variant?: ChartBarVariant\n}\n\nfunction ChartBar({\n radius = 'none',\n layout = 'vertical',\n stackPosition = 'top',\n variant = 'solid',\n fill,\n stackId,\n ...props\n}: ChartBarProps) {\n const { hoverFade, activeIndex, setActiveIndex } = useChart()\n const r = CHART_BAR_RADIUS_MAP[radius]\n const isStacked = !!stackId || stackPosition === 'bottom'\n const appliedRadius: number | [number, number, number, number] =\n r === 0 ? 0\n : variant === 'outline' && !isStacked ? r // outline standalone: all 4 corners (works for negative bars too)\n : layout === 'horizontal' && stackPosition === 'bottom' ? 0 // stacked horiz inner: all flat (connects to next bar)\n : layout === 'horizontal' ? [0, r, r, 0] // horiz tip: right corners\n : stackPosition === 'bottom' ? 0 // vertical stacked base: all flat (sits on axis, top connects to next bar)\n : [r, r, 0, 0] // default vertical: top corners only\n\n // TOKEN-EXCEPTION: SVG stroke is centered by default (half inside, half outside).\n // Custom shape renders an inset rect so the stroke stays fully inside the bar bounds.\n const outlineShape = React.useCallback((shapeProps: RechartsPrimitive.BarShapeProps & { x?: number; y?: number; width?: number; height?: number; index?: number }) => {\n const x = shapeProps.x ?? 0\n const y = shapeProps.y ?? 0\n const width = shapeProps.width ?? 0\n const height = shapeProps.height ?? 0\n if (!width || !height || width <= 0 || height <= 0) return <g />\n const sw = 2\n const inset = sw / 2\n const rx = typeof appliedRadius === 'number' ? Math.max(0, appliedRadius - inset) : 0\n // Hover fade: modulate base outline opacity (fill: 0.4, stroke: 1.0)\n const fadeMultiplier = hoverFade && activeIndex !== null && shapeProps.index !== activeIndex ? CHART_HOVER_FADE_OPACITY : 1\n return (\n <rect\n x={x + inset}\n y={y + inset}\n width={Math.max(0, width - sw)}\n height={Math.max(0, height - sw)}\n rx={rx}\n fill={fill}\n fillOpacity={0.4 * fadeMultiplier}\n stroke={fill}\n strokeOpacity={fadeMultiplier}\n strokeWidth={sw}\n style={hoverFade ? CHART_FADE_TRANSITION : undefined}\n />\n )\n }, [appliedRadius, fill, hoverFade, activeIndex])\n\n // Solid variant hover-fade shape: renders Rectangle with per-bar opacity\n const solidHoverShape = React.useCallback((shapeProps: any) => {\n const opacity = activeIndex === null ? 1 : shapeProps.index === activeIndex ? 1 : CHART_HOVER_FADE_OPACITY\n return (\n <RechartsPrimitive.Rectangle\n {...shapeProps}\n fillOpacity={opacity}\n style={CHART_FADE_TRANSITION}\n />\n )\n }, [activeIndex])\n\n // Determine which shape function to use\n const useOutline = variant === 'outline' && !isStacked\n const needsHoverShape = hoverFade && variant === 'solid' && !useOutline\n\n return (\n <RechartsPrimitive.Bar\n radius={appliedRadius}\n fill={fill}\n stackId={stackId}\n // Disable Recharts animation to prevent label/total flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(useOutline && { shape: outlineShape as any })}\n {...(needsHoverShape && { shape: solidHoverShape as any })}\n {...(hoverFade && { onMouseEnter: (_: unknown, index: number) => setActiveIndex(index) })}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Wrapper: kill position-slide so tooltip appears at the hovered bar instantly.\n// Smooth appearance is handled by CSS fade on ChartTooltipContent instead.\nfunction ChartTooltip(props: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) {\n return <RechartsPrimitive.Tooltip animationDuration={0} {...props} />\n}\n\n// Recharts 3.x injects these props at runtime via content render prop.\n// We define explicit types instead of deriving from RechartsPrimitive.Tooltip.\ntype TooltipPayloadItem = {\n dataKey?: string | number\n name?: string\n value?: number | string\n type?: string\n color?: string\n payload?: Record<string, unknown>\n fill?: string\n}\n\ntype ChartTooltipContentProps = React.ComponentProps<'div'> & {\n active?: boolean\n payload?: TooltipPayloadItem[]\n label?: string\n labelFormatter?: (value: unknown, payload: TooltipPayloadItem[]) => React.ReactNode\n labelClassName?: string\n formatter?: (value: unknown, name: string, item: TooltipPayloadItem, index: number, payload: Record<string, unknown>) => React.ReactNode\n color?: string\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n}\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: ChartTooltipContentProps) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item?.dataKey || item?.name || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn('font-semibold', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn('font-semibold', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot'\n\n return (\n <div\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className\n )}\n style={{ animation: 'chart-tooltip-in var(--duration-slow) ease-out' }}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item: TooltipPayloadItem) => item.type !== 'none')\n .map((item: TooltipPayloadItem, index: number) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || (item.payload as Record<string, unknown>)?.fill as string || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-text-muted',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload as Record<string, unknown>)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-sm',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={{\n backgroundColor: indicator === 'dashed' ? 'transparent' : indicatorColor,\n borderColor: indicatorColor,\n }}\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center'\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-text-muted\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-semibold text-foreground tabular-nums\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\n// Recharts 3.x legend payload type\ntype LegendPayloadItem = {\n value?: string\n type?: string\n color?: string\n dataKey?: string\n}\n\ntype ChartLegendContentProps = React.ComponentProps<'div'> & {\n payload?: LegendPayloadItem[]\n verticalAlign?: 'top' | 'middle' | 'bottom'\n align?: 'left' | 'center' | 'right'\n /** Recharts passes layout when Legend uses layout prop */\n layout?: 'horizontal' | 'vertical'\n hideIcon?: boolean\n nameKey?: string\n}\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n layout = 'horizontal',\n nameKey,\n}: ChartLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n const isVertical = layout === 'vertical'\n\n return (\n <div\n className={cn(\n 'flex gap-4',\n isVertical\n ? 'flex-col items-start gap-1.5'\n : [\n 'items-center',\n align === 'left' ? 'justify-start' : align === 'right' ? 'justify-end' : 'justify-center',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n ],\n className\n )}\n >\n {payload\n .filter((item: LegendPayloadItem) => item.type !== 'none')\n .map((item: LegendPayloadItem) => {\n const key = `${nameKey || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(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-text-muted\"\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-sm\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n <span className=\"text-foreground\">{itemConfig?.label}</span>\n </div>\n )\n })}\n </div>\n )\n}\n\n// Helper to extract item config from a payload\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n 'payload' in payload &&\n typeof payload.payload === 'object' &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === 'string'\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config]\n}\n\n// ─── ChartXAxis / ChartYAxis ──────────────────────────────────────────────────\n\n// TOKEN-EXCEPTION: Recharts ignores CSS overrides on axis tick text.\n// Wrapper components apply design-token styles via inline style to ensure override.\nconst CHART_AXIS_TICK_STYLE = { style: { fontSize: 'var(--chart-axis-fs)', fill: 'var(--color-text-subtle)' } } as const\n\ntype ChartXAxisProps = React.ComponentProps<typeof RechartsPrimitive.XAxis>\ntype ChartYAxisProps = React.ComponentProps<typeof RechartsPrimitive.YAxis>\n\nconst CHART_XAXIS_PADDING = { left: 16, right: 16 } as const\n\nfunction ChartXAxis({ tick, padding, ...props }: ChartXAxisProps) {\n return <RechartsPrimitive.XAxis tick={tick ?? CHART_AXIS_TICK_STYLE} padding={padding ?? CHART_XAXIS_PADDING} {...props} />\n}\n\nfunction ChartYAxis({ tick, width = 'auto', ...props }: ChartYAxisProps) {\n return <RechartsPrimitive.YAxis tick={tick ?? CHART_AXIS_TICK_STYLE} width={width} {...props} />\n}\n\n// ─── ChartLine ───────────────────────────────────────────────────────────────\n\nexport type ChartLineType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartLineVariant = 'solid' | 'dashed'\n\n// TOKEN-EXCEPTION: SVG strokeDasharray requires numeric values — CSS variables not supported.\nconst CHART_LINE_DASH = '5 5' as const\n\n// TOKEN-EXCEPTION: SVG r / strokeWidth are geometric attributes — CSS variables not supported.\n// Dot: r=3 strokeWidth=2, ActiveDot: r=5 strokeWidth=2\nconst CHART_DOT_PROPS = { r: 3, strokeWidth: 2 } as const\nconst CHART_ACTIVE_DOT_PROPS = { r: 5, strokeWidth: 2 } as const\n\ntype ChartLineProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Line>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartLineType\n /** Line style. 'dashed' applies stroke-dasharray. Default: 'solid' */\n variant?: ChartLineVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n}\n\nfunction ChartLine({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n stroke,\n dataKey,\n ...props\n}: ChartLineProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n // When dashed, override strokeDasharray on dots so they remain solid circles.\n const dotProps = showDot\n ? variant === 'dashed' ? { ...CHART_DOT_PROPS, strokeDasharray: '0' } : CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? variant === 'dashed' ? { ...CHART_ACTIVE_DOT_PROPS, strokeDasharray: '0' } : CHART_ACTIVE_DOT_PROPS\n : false\n\n return (\n <RechartsPrimitive.Line\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={2}\n strokeDasharray={variant === 'dashed' ? CHART_LINE_DASH : undefined}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n )\n}\n\n// ─── ChartArea ───────────────────────────────────────────────────────────────\n\nexport type ChartAreaType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartAreaVariant = 'solid' | 'gradient'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\nconst CHART_AREA_DEFAULT_OPACITY = 0.4\n\ntype ChartAreaProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Area>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartAreaType\n /** Fill style. 'gradient' auto-generates an SVG linearGradient. Default: 'solid' */\n variant?: ChartAreaVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n /** Fill opacity for this area (0–1). Default: 0.4 */\n fillOpacity?: number\n}\n\nfunction ChartArea({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n fillOpacity = CHART_AREA_DEFAULT_OPACITY,\n stroke,\n fill,\n dataKey,\n ...props\n}: ChartAreaProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n const dotProps = showDot\n ? CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? CHART_ACTIVE_DOT_PROPS\n : false\n\n // Gradient variant: use unique ID referencing dataKey\n const gradientId = `area-gradient-${String(dataKey)}`\n const effectiveFill = variant === 'gradient' ? `url(#${gradientId})` : (fill || stroke)\n const effectiveFillOpacity = variant === 'gradient' ? 1 : fillOpacity\n\n return (\n <>\n {variant === 'gradient' && (\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n {/* TOKEN-EXCEPTION: SVG stop attributes require inline values */}\n <stop offset=\"5%\" stopColor={fill || stroke} stopOpacity={0.8} />\n <stop offset=\"95%\" stopColor={fill || stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n )}\n <RechartsPrimitive.Area\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n fill={effectiveFill}\n fillOpacity={effectiveFillOpacity * opacity}\n strokeWidth={2}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n </>\n )\n}\n\n// ─── ChartPie ────────────────────────────────────────────────────────────────\n\nexport type ChartPieVariant = 'pie' | 'donut'\nexport type ChartPieLabel = 'none' | 'outside' | 'inside'\nexport type ChartPieLabelContent = 'value' | 'percent'\n\n// TOKEN-EXCEPTION: SVG outerRadius expansion on hover — numeric constant.\nconst CHART_PIE_ACTIVE_OFFSET = 8\n\n// TOKEN-EXCEPTION: SVG innerRadius for donut variant — numeric constant.\nconst CHART_PIE_DONUT_INNER_RADIUS = 60\n\n// TOKEN-EXCEPTION: SVG outside label line — numeric constants.\nconst CHART_PIE_LABEL_RADIAL = 16 // radial segment length from slice edge\nconst CHART_PIE_LABEL_HORIZ = 20 // horizontal segment length\n\n// TOKEN-EXCEPTION: SVG inside label skip angle — numeric constant.\nconst CHART_PIE_SKIP_ANGLE = 15 // hide label for slices smaller than this (degrees)\n\ntype ChartPieProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Pie>, 'label' | 'labelLine' | 'activeShape'> & {\n /** 'donut' applies innerRadius automatically. Default: 'pie' */\n variant?: ChartPieVariant\n /** Label position. Default: 'none' */\n label?: ChartPieLabel\n /** Label display content. Default: 'value' */\n labelContent?: ChartPieLabelContent\n /** Hover expand effect. Default: true */\n activeShape?: boolean\n /** Override inner radius (default: 0 for pie, 60 for donut) */\n innerRadius?: number\n /** Padding angle between slices (degrees). Default: 0 */\n paddingAngle?: number\n /** Corner radius for slices. Default: 0 */\n cornerRadius?: number\n}\n\nfunction ChartPie({\n variant = 'pie',\n label: labelMode = 'none',\n labelContent = 'value',\n activeShape: showActiveShape = true,\n innerRadius,\n paddingAngle = 0,\n cornerRadius = 0,\n startAngle = 90,\n endAngle = -270,\n ...props\n}: ChartPieProps) {\n // Resolve inner radius: explicit prop > variant default\n const resolvedInnerRadius = innerRadius ?? (variant === 'donut' ? CHART_PIE_DONUT_INNER_RADIUS : 0)\n\n // Active shape: render Sector with expanded outer radius on hover\n const activeShapeConfig = showActiveShape\n ? (props: any) => (\n <RechartsPrimitive.Sector\n {...props}\n outerRadius={props.outerRadius + CHART_PIE_ACTIVE_OFFSET}\n />\n )\n : undefined\n\n // Resolve display text from labelContent\n const getDisplayText = (entry: any) =>\n labelContent === 'percent'\n ? `${(entry.percent * 100).toFixed(0)}%`\n : entry.value\n\n // Label rendering\n const labelConfig = labelMode === 'outside'\n ? (entry: any) => {\n const RADIAN = Math.PI / 180\n const { cx, cy, midAngle, outerRadius, fill } = entry\n\n // Point on slice edge\n const sx = cx + outerRadius * Math.cos(-midAngle * RADIAN)\n const sy = cy + outerRadius * Math.sin(-midAngle * RADIAN)\n\n // End of radial segment\n const mx = cx + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.cos(-midAngle * RADIAN)\n const my = cy + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.sin(-midAngle * RADIAN)\n\n // Horizontal elbow direction\n const isRight = mx > cx\n const ex = mx + (isRight ? CHART_PIE_LABEL_HORIZ : -CHART_PIE_LABEL_HORIZ)\n\n return (\n <g>\n <polyline\n points={`${sx},${sy} ${mx},${my} ${ex},${my}`}\n fill=\"none\"\n stroke={fill}\n strokeWidth={1}\n strokeOpacity={0.5}\n />\n <text\n x={ex + (isRight ? 4 : -4)}\n y={my}\n textAnchor={isRight ? 'start' : 'end'}\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'var(--color-text-muted)' }}\n >\n {getDisplayText(entry)}\n </text>\n </g>\n )\n }\n : labelMode === 'inside'\n ? (entry: any) => {\n // Skip label for small slices\n const angle = Math.abs(entry.endAngle - entry.startAngle)\n if (angle < CHART_PIE_SKIP_ANGLE) return null\n\n const RADIAN = Math.PI / 180\n const { cx, cy, innerRadius: ir, outerRadius: or, midAngle } = entry\n // Pie: push toward outer edge (0.65). Donut ring: use midpoint (0.5)\n const ratio = ir > 0 ? 0.5 : 0.65\n const radius = ir + (or - ir) * ratio\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n\n return (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'white', fontWeight: 600 }}\n >\n {getDisplayText(entry)}\n </text>\n )\n }\n : false\n\n return (\n <RechartsPrimitive.Pie\n innerRadius={resolvedInnerRadius}\n paddingAngle={paddingAngle}\n cornerRadius={cornerRadius}\n startAngle={startAngle}\n endAngle={endAngle}\n label={labelConfig as any}\n labelLine={false}\n activeShape={activeShapeConfig as any}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n Chart,\n ChartBar,\n ChartLine,\n ChartArea,\n ChartPie,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartXAxis,\n ChartYAxis,\n ChartStyle,\n useChart,\n}\n"],"mappings":"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","names":["config","props"]}
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
|
-
// src/components/ui/chart.tsx
|
|
4
2
|
import * as React from "react";
|
|
5
3
|
import * as RechartsPrimitive from "recharts";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import { twMerge } from "tailwind-merge";
|
|
10
|
-
function cn(...inputs) {
|
|
11
|
-
return twMerge(clsx(inputs));
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// src/components/ui/chart.tsx
|
|
15
|
-
var THEMES = { light: "", dark: ".dark" };
|
|
16
|
-
var ChartContext = React.createContext(null);
|
|
4
|
+
import { cn } from "../../lib/utils";
|
|
5
|
+
const THEMES = { light: "", dark: ".dark" };
|
|
6
|
+
const ChartContext = React.createContext(null);
|
|
17
7
|
function useChart() {
|
|
18
8
|
const context = React.useContext(ChartContext);
|
|
19
9
|
if (!context) {
|
|
20
|
-
throw new Error("useChart must be used within a <
|
|
10
|
+
throw new Error("useChart must be used within a <Chart />");
|
|
21
11
|
}
|
|
22
12
|
return context;
|
|
23
13
|
}
|
|
24
|
-
function
|
|
14
|
+
function Chart({
|
|
25
15
|
id,
|
|
26
16
|
className,
|
|
27
17
|
children,
|
|
@@ -68,8 +58,8 @@ function ChartContainer({
|
|
|
68
58
|
/* @__PURE__ */ React.createElement(RechartsPrimitive.ResponsiveContainer, null, children)
|
|
69
59
|
));
|
|
70
60
|
}
|
|
71
|
-
|
|
72
|
-
|
|
61
|
+
const CHART_TOOLTIP_KEYFRAME = "@keyframes chart-tooltip-in{from{opacity:0}to{opacity:1}}";
|
|
62
|
+
const ChartStyle = ({ id, config }) => {
|
|
73
63
|
const colorConfig = Object.entries(config).filter(
|
|
74
64
|
([, config2]) => config2.theme || config2.color
|
|
75
65
|
);
|
|
@@ -92,9 +82,9 @@ ${colorConfig.map(([key, itemConfig]) => {
|
|
|
92
82
|
}
|
|
93
83
|
);
|
|
94
84
|
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
const CHART_HOVER_FADE_OPACITY = 0.35;
|
|
86
|
+
const CHART_FADE_TRANSITION = { transition: "fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out" };
|
|
87
|
+
const CHART_BAR_RADIUS_MAP = {
|
|
98
88
|
none: 0,
|
|
99
89
|
// --radius-none: 0px
|
|
100
90
|
sm: 2,
|
|
@@ -267,7 +257,7 @@ function ChartTooltipContent({
|
|
|
267
257
|
}))
|
|
268
258
|
);
|
|
269
259
|
}
|
|
270
|
-
|
|
260
|
+
const ChartLegend = RechartsPrimitive.Legend;
|
|
271
261
|
function ChartLegendContent({
|
|
272
262
|
className,
|
|
273
263
|
hideIcon = false,
|
|
@@ -331,17 +321,17 @@ function getPayloadConfigFromPayload(config, payload, key) {
|
|
|
331
321
|
}
|
|
332
322
|
return configLabelKey in config ? config[configLabelKey] : config[key];
|
|
333
323
|
}
|
|
334
|
-
|
|
335
|
-
|
|
324
|
+
const CHART_AXIS_TICK_STYLE = { style: { fontSize: "var(--chart-axis-fs)", fill: "var(--color-text-subtle)" } };
|
|
325
|
+
const CHART_XAXIS_PADDING = { left: 16, right: 16 };
|
|
336
326
|
function ChartXAxis({ tick, padding, ...props }) {
|
|
337
327
|
return /* @__PURE__ */ React.createElement(RechartsPrimitive.XAxis, { tick: tick ?? CHART_AXIS_TICK_STYLE, padding: padding ?? CHART_XAXIS_PADDING, ...props });
|
|
338
328
|
}
|
|
339
329
|
function ChartYAxis({ tick, width = "auto", ...props }) {
|
|
340
330
|
return /* @__PURE__ */ React.createElement(RechartsPrimitive.YAxis, { tick: tick ?? CHART_AXIS_TICK_STYLE, width, ...props });
|
|
341
331
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
332
|
+
const CHART_LINE_DASH = "5 5";
|
|
333
|
+
const CHART_DOT_PROPS = { r: 3, strokeWidth: 2 };
|
|
334
|
+
const CHART_ACTIVE_DOT_PROPS = { r: 5, strokeWidth: 2 };
|
|
345
335
|
function ChartLine({
|
|
346
336
|
type = "monotone",
|
|
347
337
|
variant = "solid",
|
|
@@ -374,7 +364,7 @@ function ChartLine({
|
|
|
374
364
|
}
|
|
375
365
|
);
|
|
376
366
|
}
|
|
377
|
-
|
|
367
|
+
const CHART_AREA_DEFAULT_OPACITY = 0.4;
|
|
378
368
|
function ChartArea({
|
|
379
369
|
type = "monotone",
|
|
380
370
|
variant = "solid",
|
|
@@ -413,11 +403,11 @@ function ChartArea({
|
|
|
413
403
|
}
|
|
414
404
|
));
|
|
415
405
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
406
|
+
const CHART_PIE_ACTIVE_OFFSET = 8;
|
|
407
|
+
const CHART_PIE_DONUT_INNER_RADIUS = 60;
|
|
408
|
+
const CHART_PIE_LABEL_RADIAL = 16;
|
|
409
|
+
const CHART_PIE_LABEL_HORIZ = 20;
|
|
410
|
+
const CHART_PIE_SKIP_ANGLE = 15;
|
|
421
411
|
function ChartPie({
|
|
422
412
|
variant = "pie",
|
|
423
413
|
label: labelMode = "none",
|
|
@@ -504,24 +494,10 @@ function ChartPie({
|
|
|
504
494
|
}
|
|
505
495
|
);
|
|
506
496
|
}
|
|
507
|
-
var Chart = Object.assign(ChartContainer, {
|
|
508
|
-
Bar: ChartBar,
|
|
509
|
-
Line: ChartLine,
|
|
510
|
-
Area: ChartArea,
|
|
511
|
-
Pie: ChartPie,
|
|
512
|
-
Tooltip: ChartTooltip,
|
|
513
|
-
TooltipContent: ChartTooltipContent,
|
|
514
|
-
Legend: ChartLegend,
|
|
515
|
-
LegendContent: ChartLegendContent,
|
|
516
|
-
XAxis: ChartXAxis,
|
|
517
|
-
YAxis: ChartYAxis,
|
|
518
|
-
Style: ChartStyle
|
|
519
|
-
});
|
|
520
497
|
export {
|
|
521
498
|
Chart,
|
|
522
499
|
ChartArea,
|
|
523
500
|
ChartBar,
|
|
524
|
-
ChartContainer,
|
|
525
501
|
ChartLegend,
|
|
526
502
|
ChartLegendContent,
|
|
527
503
|
ChartLine,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as RechartsPrimitive from 'recharts'\nimport { cn } from '../../lib/utils'\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n // Hover fade state\n hoverFade: boolean\n activeIndex: number | null\n setActiveIndex: (index: number | null) => void\n // Series-level hover fade (used by ChartLine)\n activeDataKey: string | null\n setActiveDataKey: (key: string | null) => void\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n if (!context) {\n throw new Error('useChart must be used within a <Chart />')\n }\n return context\n}\n\nfunction Chart({\n id,\n className,\n children,\n config,\n hoverFade = false,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig\n /** Enable hover-to-highlight: hovered bar group stays full opacity, others fade. */\n hoverFade?: boolean\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children']\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null)\n const [activeDataKey, setActiveDataKey] = React.useState<string | null>(null)\n\n return (\n <ChartContext.Provider value={{ config, hoverFade, activeIndex, setActiveIndex, activeDataKey, setActiveDataKey }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n onMouseLeave={hoverFade ? () => { setActiveIndex(null); setActiveDataKey(null) } : undefined}\n className={cn(\n 'flex aspect-video w-full justify-center text-xs outline-none [&_*]:outline-none',\n // Responsive axis tick font-size — consumed by ChartXAxis / ChartYAxis via var()\n '[--chart-axis-fs:var(--font-size-2xs)] sm:[--chart-axis-fs:var(--font-size-xs)]',\n // Recharts element overrides — use arbitrary properties for v3/v4 compat\n '[&_.recharts-cartesian-axis-tick_text]:[fill:var(--color-text-muted)]',\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-cartesian-grid_line]:[stroke-dasharray:3_3]',\n '[&_.recharts-curve.recharts-tooltip-cursor]:[stroke:var(--color-border)]',\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\n '[&_.recharts-layer]:outline-none',\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-radial-bar-background-sector]:[fill:var(--color-background-muted)]',\n '[&_.recharts-rectangle.recharts-tooltip-cursor]:[fill:transparent]',\n \"[&_.recharts-reference-line_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-sector]:outline-none',\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent\",\n '[&_.recharts-surface]:outline-none',\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\n// Tooltip fade-in keyframe — injected once per chart via ChartStyle\nconst CHART_TOOLTIP_KEYFRAME = '@keyframes chart-tooltip-in{from{opacity:0}to{opacity:1}}'\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n )\n\n const colorCss = colorConfig.length\n ? Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join('\\n')}\n}\n`\n )\n .join('\\n')\n : ''\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: CHART_TOOLTIP_KEYFRAME + colorCss,\n }}\n />\n )\n}\n\n// ─── ChartBar ─────────────────────────────────────────────────────────────────\n\nexport type ChartBarRadius = 'none' | 'sm' | 'base' | 'md' | 'lg'\nexport type ChartBarVariant = 'solid' | 'outline'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\n// Matches --opacity-35 token (0.35).\nconst CHART_HOVER_FADE_OPACITY = 0.35\n\n// Fade transition for hover effect — uses --duration-fast token via CSS variable\nconst CHART_FADE_TRANSITION = { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } as const\n\n// TOKEN-EXCEPTION: Recharts Bar radius is an SVG attribute — CSS variables not supported.\n// Values mirror --radius-* tokens from variables.css.\nconst CHART_BAR_RADIUS_MAP: Record<ChartBarRadius, number> = {\n none: 0, // --radius-none: 0px\n sm: 2, // --radius-sm: 2px\n base: 4, // --radius-base: 4px\n md: 6, // --radius-md: 6px\n lg: 8, // --radius-lg: 8px\n}\n\ntype ChartBarProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Bar>, 'radius'> & {\n /** Named radius token. Auto-adapts corners based on layout and stack position. */\n radius?: ChartBarRadius\n /** 'horizontal' rounds the right side (away from Y-axis). Default: 'vertical' */\n layout?: 'vertical' | 'horizontal'\n /** 'bottom' rounds the bottom corners (base of a stack). Default: 'top' */\n stackPosition?: 'top' | 'bottom'\n /** 'outline' renders a thick border with a semi-transparent fill. Default: 'solid' */\n variant?: ChartBarVariant\n}\n\nfunction ChartBar({\n radius = 'none',\n layout = 'vertical',\n stackPosition = 'top',\n variant = 'solid',\n fill,\n stackId,\n ...props\n}: ChartBarProps) {\n const { hoverFade, activeIndex, setActiveIndex } = useChart()\n const r = CHART_BAR_RADIUS_MAP[radius]\n const isStacked = !!stackId || stackPosition === 'bottom'\n const appliedRadius: number | [number, number, number, number] =\n r === 0 ? 0\n : variant === 'outline' && !isStacked ? r // outline standalone: all 4 corners (works for negative bars too)\n : layout === 'horizontal' && stackPosition === 'bottom' ? 0 // stacked horiz inner: all flat (connects to next bar)\n : layout === 'horizontal' ? [0, r, r, 0] // horiz tip: right corners\n : stackPosition === 'bottom' ? 0 // vertical stacked base: all flat (sits on axis, top connects to next bar)\n : [r, r, 0, 0] // default vertical: top corners only\n\n // TOKEN-EXCEPTION: SVG stroke is centered by default (half inside, half outside).\n // Custom shape renders an inset rect so the stroke stays fully inside the bar bounds.\n const outlineShape = React.useCallback((shapeProps: RechartsPrimitive.BarShapeProps & { x?: number; y?: number; width?: number; height?: number; index?: number }) => {\n const x = shapeProps.x ?? 0\n const y = shapeProps.y ?? 0\n const width = shapeProps.width ?? 0\n const height = shapeProps.height ?? 0\n if (!width || !height || width <= 0 || height <= 0) return <g />\n const sw = 2\n const inset = sw / 2\n const rx = typeof appliedRadius === 'number' ? Math.max(0, appliedRadius - inset) : 0\n // Hover fade: modulate base outline opacity (fill: 0.4, stroke: 1.0)\n const fadeMultiplier = hoverFade && activeIndex !== null && shapeProps.index !== activeIndex ? CHART_HOVER_FADE_OPACITY : 1\n return (\n <rect\n x={x + inset}\n y={y + inset}\n width={Math.max(0, width - sw)}\n height={Math.max(0, height - sw)}\n rx={rx}\n fill={fill}\n fillOpacity={0.4 * fadeMultiplier}\n stroke={fill}\n strokeOpacity={fadeMultiplier}\n strokeWidth={sw}\n style={hoverFade ? CHART_FADE_TRANSITION : undefined}\n />\n )\n }, [appliedRadius, fill, hoverFade, activeIndex])\n\n // Solid variant hover-fade shape: renders Rectangle with per-bar opacity\n const solidHoverShape = React.useCallback((shapeProps: any) => {\n const opacity = activeIndex === null ? 1 : shapeProps.index === activeIndex ? 1 : CHART_HOVER_FADE_OPACITY\n return (\n <RechartsPrimitive.Rectangle\n {...shapeProps}\n fillOpacity={opacity}\n style={CHART_FADE_TRANSITION}\n />\n )\n }, [activeIndex])\n\n // Determine which shape function to use\n const useOutline = variant === 'outline' && !isStacked\n const needsHoverShape = hoverFade && variant === 'solid' && !useOutline\n\n return (\n <RechartsPrimitive.Bar\n radius={appliedRadius}\n fill={fill}\n stackId={stackId}\n // Disable Recharts animation to prevent label/total flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(useOutline && { shape: outlineShape as any })}\n {...(needsHoverShape && { shape: solidHoverShape as any })}\n {...(hoverFade && { onMouseEnter: (_: unknown, index: number) => setActiveIndex(index) })}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Wrapper: kill position-slide so tooltip appears at the hovered bar instantly.\n// Smooth appearance is handled by CSS fade on ChartTooltipContent instead.\nfunction ChartTooltip(props: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) {\n return <RechartsPrimitive.Tooltip animationDuration={0} {...props} />\n}\n\n// Recharts 3.x injects these props at runtime via content render prop.\n// We define explicit types instead of deriving from RechartsPrimitive.Tooltip.\ntype TooltipPayloadItem = {\n dataKey?: string | number\n name?: string\n value?: number | string\n type?: string\n color?: string\n payload?: Record<string, unknown>\n fill?: string\n}\n\ntype ChartTooltipContentProps = React.ComponentProps<'div'> & {\n active?: boolean\n payload?: TooltipPayloadItem[]\n label?: string\n labelFormatter?: (value: unknown, payload: TooltipPayloadItem[]) => React.ReactNode\n labelClassName?: string\n formatter?: (value: unknown, name: string, item: TooltipPayloadItem, index: number, payload: Record<string, unknown>) => React.ReactNode\n color?: string\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n}\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: ChartTooltipContentProps) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item?.dataKey || item?.name || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn('font-semibold', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn('font-semibold', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot'\n\n return (\n <div\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className\n )}\n style={{ animation: 'chart-tooltip-in var(--duration-slow) ease-out' }}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item: TooltipPayloadItem) => item.type !== 'none')\n .map((item: TooltipPayloadItem, index: number) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || (item.payload as Record<string, unknown>)?.fill as string || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-text-muted',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload as Record<string, unknown>)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-sm',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={{\n backgroundColor: indicator === 'dashed' ? 'transparent' : indicatorColor,\n borderColor: indicatorColor,\n }}\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center'\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-text-muted\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-semibold text-foreground tabular-nums\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\n// Recharts 3.x legend payload type\ntype LegendPayloadItem = {\n value?: string\n type?: string\n color?: string\n dataKey?: string\n}\n\ntype ChartLegendContentProps = React.ComponentProps<'div'> & {\n payload?: LegendPayloadItem[]\n verticalAlign?: 'top' | 'middle' | 'bottom'\n align?: 'left' | 'center' | 'right'\n /** Recharts passes layout when Legend uses layout prop */\n layout?: 'horizontal' | 'vertical'\n hideIcon?: boolean\n nameKey?: string\n}\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n layout = 'horizontal',\n nameKey,\n}: ChartLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n const isVertical = layout === 'vertical'\n\n return (\n <div\n className={cn(\n 'flex gap-4',\n isVertical\n ? 'flex-col items-start gap-1.5'\n : [\n 'items-center',\n align === 'left' ? 'justify-start' : align === 'right' ? 'justify-end' : 'justify-center',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n ],\n className\n )}\n >\n {payload\n .filter((item: LegendPayloadItem) => item.type !== 'none')\n .map((item: LegendPayloadItem) => {\n const key = `${nameKey || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(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-text-muted\"\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-sm\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n <span className=\"text-foreground\">{itemConfig?.label}</span>\n </div>\n )\n })}\n </div>\n )\n}\n\n// Helper to extract item config from a payload\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n 'payload' in payload &&\n typeof payload.payload === 'object' &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === 'string'\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config]\n}\n\n// ─── ChartXAxis / ChartYAxis ──────────────────────────────────────────────────\n\n// TOKEN-EXCEPTION: Recharts ignores CSS overrides on axis tick text.\n// Wrapper components apply design-token styles via inline style to ensure override.\nconst CHART_AXIS_TICK_STYLE = { style: { fontSize: 'var(--chart-axis-fs)', fill: 'var(--color-text-subtle)' } } as const\n\ntype ChartXAxisProps = React.ComponentProps<typeof RechartsPrimitive.XAxis>\ntype ChartYAxisProps = React.ComponentProps<typeof RechartsPrimitive.YAxis>\n\nconst CHART_XAXIS_PADDING = { left: 16, right: 16 } as const\n\nfunction ChartXAxis({ tick, padding, ...props }: ChartXAxisProps) {\n return <RechartsPrimitive.XAxis tick={tick ?? CHART_AXIS_TICK_STYLE} padding={padding ?? CHART_XAXIS_PADDING} {...props} />\n}\n\nfunction ChartYAxis({ tick, width = 'auto', ...props }: ChartYAxisProps) {\n return <RechartsPrimitive.YAxis tick={tick ?? CHART_AXIS_TICK_STYLE} width={width} {...props} />\n}\n\n// ─── ChartLine ───────────────────────────────────────────────────────────────\n\nexport type ChartLineType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartLineVariant = 'solid' | 'dashed'\n\n// TOKEN-EXCEPTION: SVG strokeDasharray requires numeric values — CSS variables not supported.\nconst CHART_LINE_DASH = '5 5' as const\n\n// TOKEN-EXCEPTION: SVG r / strokeWidth are geometric attributes — CSS variables not supported.\n// Dot: r=3 strokeWidth=2, ActiveDot: r=5 strokeWidth=2\nconst CHART_DOT_PROPS = { r: 3, strokeWidth: 2 } as const\nconst CHART_ACTIVE_DOT_PROPS = { r: 5, strokeWidth: 2 } as const\n\ntype ChartLineProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Line>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartLineType\n /** Line style. 'dashed' applies stroke-dasharray. Default: 'solid' */\n variant?: ChartLineVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n}\n\nfunction ChartLine({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n stroke,\n dataKey,\n ...props\n}: ChartLineProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n // When dashed, override strokeDasharray on dots so they remain solid circles.\n const dotProps = showDot\n ? variant === 'dashed' ? { ...CHART_DOT_PROPS, strokeDasharray: '0' } : CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? variant === 'dashed' ? { ...CHART_ACTIVE_DOT_PROPS, strokeDasharray: '0' } : CHART_ACTIVE_DOT_PROPS\n : false\n\n return (\n <RechartsPrimitive.Line\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={2}\n strokeDasharray={variant === 'dashed' ? CHART_LINE_DASH : undefined}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n )\n}\n\n// ─── ChartArea ───────────────────────────────────────────────────────────────\n\nexport type ChartAreaType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartAreaVariant = 'solid' | 'gradient'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\nconst CHART_AREA_DEFAULT_OPACITY = 0.4\n\ntype ChartAreaProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Area>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartAreaType\n /** Fill style. 'gradient' auto-generates an SVG linearGradient. Default: 'solid' */\n variant?: ChartAreaVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n /** Fill opacity for this area (0–1). Default: 0.4 */\n fillOpacity?: number\n}\n\nfunction ChartArea({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n fillOpacity = CHART_AREA_DEFAULT_OPACITY,\n stroke,\n fill,\n dataKey,\n ...props\n}: ChartAreaProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n const dotProps = showDot\n ? CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? CHART_ACTIVE_DOT_PROPS\n : false\n\n // Gradient variant: use unique ID referencing dataKey\n const gradientId = `area-gradient-${String(dataKey)}`\n const effectiveFill = variant === 'gradient' ? `url(#${gradientId})` : (fill || stroke)\n const effectiveFillOpacity = variant === 'gradient' ? 1 : fillOpacity\n\n return (\n <>\n {variant === 'gradient' && (\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n {/* TOKEN-EXCEPTION: SVG stop attributes require inline values */}\n <stop offset=\"5%\" stopColor={fill || stroke} stopOpacity={0.8} />\n <stop offset=\"95%\" stopColor={fill || stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n )}\n <RechartsPrimitive.Area\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n fill={effectiveFill}\n fillOpacity={effectiveFillOpacity * opacity}\n strokeWidth={2}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n </>\n )\n}\n\n// ─── ChartPie ────────────────────────────────────────────────────────────────\n\nexport type ChartPieVariant = 'pie' | 'donut'\nexport type ChartPieLabel = 'none' | 'outside' | 'inside'\nexport type ChartPieLabelContent = 'value' | 'percent'\n\n// TOKEN-EXCEPTION: SVG outerRadius expansion on hover — numeric constant.\nconst CHART_PIE_ACTIVE_OFFSET = 8\n\n// TOKEN-EXCEPTION: SVG innerRadius for donut variant — numeric constant.\nconst CHART_PIE_DONUT_INNER_RADIUS = 60\n\n// TOKEN-EXCEPTION: SVG outside label line — numeric constants.\nconst CHART_PIE_LABEL_RADIAL = 16 // radial segment length from slice edge\nconst CHART_PIE_LABEL_HORIZ = 20 // horizontal segment length\n\n// TOKEN-EXCEPTION: SVG inside label skip angle — numeric constant.\nconst CHART_PIE_SKIP_ANGLE = 15 // hide label for slices smaller than this (degrees)\n\ntype ChartPieProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Pie>, 'label' | 'labelLine' | 'activeShape'> & {\n /** 'donut' applies innerRadius automatically. Default: 'pie' */\n variant?: ChartPieVariant\n /** Label position. Default: 'none' */\n label?: ChartPieLabel\n /** Label display content. Default: 'value' */\n labelContent?: ChartPieLabelContent\n /** Hover expand effect. Default: true */\n activeShape?: boolean\n /** Override inner radius (default: 0 for pie, 60 for donut) */\n innerRadius?: number\n /** Padding angle between slices (degrees). Default: 0 */\n paddingAngle?: number\n /** Corner radius for slices. Default: 0 */\n cornerRadius?: number\n}\n\nfunction ChartPie({\n variant = 'pie',\n label: labelMode = 'none',\n labelContent = 'value',\n activeShape: showActiveShape = true,\n innerRadius,\n paddingAngle = 0,\n cornerRadius = 0,\n startAngle = 90,\n endAngle = -270,\n ...props\n}: ChartPieProps) {\n // Resolve inner radius: explicit prop > variant default\n const resolvedInnerRadius = innerRadius ?? (variant === 'donut' ? CHART_PIE_DONUT_INNER_RADIUS : 0)\n\n // Active shape: render Sector with expanded outer radius on hover\n const activeShapeConfig = showActiveShape\n ? (props: any) => (\n <RechartsPrimitive.Sector\n {...props}\n outerRadius={props.outerRadius + CHART_PIE_ACTIVE_OFFSET}\n />\n )\n : undefined\n\n // Resolve display text from labelContent\n const getDisplayText = (entry: any) =>\n labelContent === 'percent'\n ? `${(entry.percent * 100).toFixed(0)}%`\n : entry.value\n\n // Label rendering\n const labelConfig = labelMode === 'outside'\n ? (entry: any) => {\n const RADIAN = Math.PI / 180\n const { cx, cy, midAngle, outerRadius, fill } = entry\n\n // Point on slice edge\n const sx = cx + outerRadius * Math.cos(-midAngle * RADIAN)\n const sy = cy + outerRadius * Math.sin(-midAngle * RADIAN)\n\n // End of radial segment\n const mx = cx + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.cos(-midAngle * RADIAN)\n const my = cy + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.sin(-midAngle * RADIAN)\n\n // Horizontal elbow direction\n const isRight = mx > cx\n const ex = mx + (isRight ? CHART_PIE_LABEL_HORIZ : -CHART_PIE_LABEL_HORIZ)\n\n return (\n <g>\n <polyline\n points={`${sx},${sy} ${mx},${my} ${ex},${my}`}\n fill=\"none\"\n stroke={fill}\n strokeWidth={1}\n strokeOpacity={0.5}\n />\n <text\n x={ex + (isRight ? 4 : -4)}\n y={my}\n textAnchor={isRight ? 'start' : 'end'}\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'var(--color-text-muted)' }}\n >\n {getDisplayText(entry)}\n </text>\n </g>\n )\n }\n : labelMode === 'inside'\n ? (entry: any) => {\n // Skip label for small slices\n const angle = Math.abs(entry.endAngle - entry.startAngle)\n if (angle < CHART_PIE_SKIP_ANGLE) return null\n\n const RADIAN = Math.PI / 180\n const { cx, cy, innerRadius: ir, outerRadius: or, midAngle } = entry\n // Pie: push toward outer edge (0.65). Donut ring: use midpoint (0.5)\n const ratio = ir > 0 ? 0.5 : 0.65\n const radius = ir + (or - ir) * ratio\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n\n return (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'white', fontWeight: 600 }}\n >\n {getDisplayText(entry)}\n </text>\n )\n }\n : false\n\n return (\n <RechartsPrimitive.Pie\n innerRadius={resolvedInnerRadius}\n paddingAngle={paddingAngle}\n cornerRadius={cornerRadius}\n startAngle={startAngle}\n endAngle={endAngle}\n label={labelConfig as any}\n labelLine={false}\n activeShape={activeShapeConfig as any}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n Chart,\n ChartBar,\n ChartLine,\n ChartArea,\n ChartPie,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartXAxis,\n ChartYAxis,\n ChartStyle,\n useChart,\n}\n"],"mappings":"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","names":["config","props"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
declare const checkboxColorMap: {
|
|
7
|
+
readonly default: "data-[state=checked]:bg-foreground data-[state=checked]:border-foreground data-[state=checked]:text-background data-[state=indeterminate]:bg-foreground data-[state=indeterminate]:border-foreground data-[state=indeterminate]:text-background";
|
|
8
|
+
readonly primary: "data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:text-primary-foreground";
|
|
9
|
+
};
|
|
10
|
+
type CheckboxColor = keyof typeof checkboxColorMap;
|
|
11
|
+
declare const checkboxVariants: (props?: ({
|
|
12
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
13
|
+
radius?: "sm" | "none" | "md" | null | undefined;
|
|
14
|
+
weight?: "bold" | "thin" | null | undefined;
|
|
15
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
16
|
+
interface CheckboxProps extends Omit<React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, 'children'>, VariantProps<typeof checkboxVariants> {
|
|
17
|
+
/** Checked state color */
|
|
18
|
+
color?: CheckboxColor;
|
|
19
|
+
label?: string;
|
|
20
|
+
radius?: 'none' | 'sm' | 'md';
|
|
21
|
+
}
|
|
22
|
+
declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLButtonElement>>;
|
|
23
|
+
|
|
24
|
+
export { Checkbox, type CheckboxColor, type CheckboxProps, checkboxVariants };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
declare const checkboxColorMap: {
|
|
7
|
+
readonly default: "data-[state=checked]:bg-foreground data-[state=checked]:border-foreground data-[state=checked]:text-background data-[state=indeterminate]:bg-foreground data-[state=indeterminate]:border-foreground data-[state=indeterminate]:text-background";
|
|
8
|
+
readonly primary: "data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:text-primary-foreground";
|
|
9
|
+
};
|
|
10
|
+
type CheckboxColor = keyof typeof checkboxColorMap;
|
|
11
|
+
declare const checkboxVariants: (props?: ({
|
|
12
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
13
|
+
radius?: "sm" | "none" | "md" | null | undefined;
|
|
14
|
+
weight?: "bold" | "thin" | null | undefined;
|
|
15
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
16
|
+
interface CheckboxProps extends Omit<React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, 'children'>, VariantProps<typeof checkboxVariants> {
|
|
17
|
+
/** Checked state color */
|
|
18
|
+
color?: CheckboxColor;
|
|
19
|
+
label?: string;
|
|
20
|
+
radius?: 'none' | 'sm' | 'md';
|
|
21
|
+
}
|
|
22
|
+
declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLButtonElement>>;
|
|
23
|
+
|
|
24
|
+
export { Checkbox, type CheckboxColor, type CheckboxProps, checkboxVariants };
|