@acronis-platform/ui-react 0.60.0 → 0.61.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 +5 -5
- package/dist/components/ui/app-shell/app-shell.js.map +1 -1
- package/dist/components/ui/area-chart/area-chart.js +209 -146
- package/dist/components/ui/area-chart/area-chart.js.map +1 -1
- package/dist/components/ui/avatar/avatar.js +26 -23
- package/dist/components/ui/avatar/avatar.js.map +1 -1
- package/dist/components/ui/bar-chart/bar-chart.js +595 -180
- package/dist/components/ui/bar-chart/bar-chart.js.map +1 -1
- package/dist/components/ui/category-bar/category-bar.js +98 -77
- package/dist/components/ui/category-bar/category-bar.js.map +1 -1
- package/dist/components/ui/chart/chart-format.js +144 -14
- package/dist/components/ui/chart/chart-format.js.map +1 -1
- package/dist/components/ui/chart/chart.js +204 -150
- package/dist/components/ui/chart/chart.js.map +1 -1
- package/dist/components/ui/composed-chart/composed-chart.js +422 -125
- package/dist/components/ui/composed-chart/composed-chart.js.map +1 -1
- package/dist/components/ui/confidence-cone/confidence-cone.js +308 -202
- package/dist/components/ui/confidence-cone/confidence-cone.js.map +1 -1
- package/dist/components/ui/funnel-chart/funnel-chart.js +245 -51
- package/dist/components/ui/funnel-chart/funnel-chart.js.map +1 -1
- package/dist/components/ui/histogram/histogram.js +85 -81
- package/dist/components/ui/histogram/histogram.js.map +1 -1
- package/dist/components/ui/line-chart/line-chart.js +227 -184
- package/dist/components/ui/line-chart/line-chart.js.map +1 -1
- package/dist/components/ui/metric/metric.js +88 -70
- package/dist/components/ui/metric/metric.js.map +1 -1
- package/dist/components/ui/pie-chart/pie-chart.js +234 -80
- package/dist/components/ui/pie-chart/pie-chart.js.map +1 -1
- package/dist/components/ui/radar-chart/radar-chart.js +210 -57
- package/dist/components/ui/radar-chart/radar-chart.js.map +1 -1
- package/dist/components/ui/radial-bar-chart/radial-bar-chart.js +358 -50
- package/dist/components/ui/radial-bar-chart/radial-bar-chart.js.map +1 -1
- package/dist/components/ui/sankey-chart/sankey-chart.js +25 -18
- package/dist/components/ui/sankey-chart/sankey-chart.js.map +1 -1
- package/dist/components/ui/scatter-chart/scatter-chart.js +86 -78
- package/dist/components/ui/scatter-chart/scatter-chart.js.map +1 -1
- package/dist/components/ui/timeline/timeline.js +206 -142
- package/dist/components/ui/timeline/timeline.js.map +1 -1
- package/dist/components/ui/treemap/treemap.js +183 -59
- package/dist/components/ui/treemap/treemap.js.map +1 -1
- package/dist/index.js +441 -421
- package/dist/index.js.map +1 -1
- package/dist/react.js +441 -421
- package/dist/react.js.map +1 -1
- package/dist/src/components/ui/area-chart/area-chart.d.ts +53 -3
- package/dist/src/components/ui/area-chart/index.d.ts +1 -1
- package/dist/src/components/ui/avatar/avatar.d.ts +1 -1
- package/dist/src/components/ui/bar-chart/bar-chart.d.ts +154 -16
- package/dist/src/components/ui/bar-chart/index.d.ts +1 -1
- package/dist/src/components/ui/button/button.d.ts +1 -1
- package/dist/src/components/ui/button-menu/button-menu.d.ts +1 -1
- package/dist/src/components/ui/chart/__tests__/chart-layout.d.ts +63 -0
- package/dist/src/components/ui/chart/__tests__/chart-layout.test.d.ts +1 -0
- package/dist/src/components/ui/chart/chart-format.d.ts +415 -0
- package/dist/src/components/ui/chart/chart.d.ts +9 -3
- package/dist/src/components/ui/chart/index.d.ts +2 -2
- package/dist/src/components/ui/composed-chart/composed-chart.d.ts +156 -7
- package/dist/src/components/ui/composed-chart/index.d.ts +1 -1
- package/dist/src/components/ui/confidence-cone/confidence-cone.d.ts +138 -20
- package/dist/src/components/ui/confidence-cone/index.d.ts +1 -1
- package/dist/src/components/ui/funnel-chart/funnel-chart.d.ts +201 -3
- package/dist/src/components/ui/funnel-chart/index.d.ts +1 -1
- package/dist/src/components/ui/histogram/histogram.d.ts +2 -2
- package/dist/src/components/ui/line-chart/index.d.ts +1 -1
- package/dist/src/components/ui/line-chart/line-chart.d.ts +51 -3
- package/dist/src/components/ui/pie-chart/index.d.ts +1 -1
- package/dist/src/components/ui/pie-chart/pie-chart.d.ts +145 -4
- package/dist/src/components/ui/radar-chart/index.d.ts +1 -1
- package/dist/src/components/ui/radar-chart/radar-chart.d.ts +219 -6
- package/dist/src/components/ui/radial-bar-chart/index.d.ts +1 -1
- package/dist/src/components/ui/radial-bar-chart/radial-bar-chart.d.ts +215 -9
- package/dist/src/components/ui/scatter-chart/scatter-chart.d.ts +2 -2
- package/dist/src/components/ui/timeline/index.d.ts +1 -1
- package/dist/src/components/ui/timeline/timeline.d.ts +79 -20
- package/dist/src/components/ui/treemap/index.d.ts +1 -1
- package/dist/src/components/ui/treemap/treemap.d.ts +68 -8
- package/dist/src/index.d.ts +0 -1
- package/dist/ui-react.css +1 -1
- package/package.json +3 -3
- package/dist/components/ui/search-global/search-global.js +0 -60
- package/dist/components/ui/search-global/search-global.js.map +0 -1
- package/dist/src/components/ui/search-global/index.d.ts +0 -1
- package/dist/src/components/ui/search-global/search-global.d.ts +0 -7
|
@@ -1,148 +1,183 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import * as
|
|
3
|
-
import * as
|
|
4
|
-
import { cn as
|
|
5
|
-
const
|
|
6
|
-
function
|
|
7
|
-
const
|
|
8
|
-
if (!
|
|
1
|
+
import { jsx as o, jsxs as v, Fragment as L } from "react/jsx-runtime";
|
|
2
|
+
import * as p from "react";
|
|
3
|
+
import * as j from "recharts";
|
|
4
|
+
import { cn as d } from "../../../lib/utils.js";
|
|
5
|
+
const E = { light: "", dark: "[data-theme='dark']" }, N = p.createContext(null);
|
|
6
|
+
function P() {
|
|
7
|
+
const e = p.useContext(N);
|
|
8
|
+
if (!e)
|
|
9
9
|
throw new Error("useChart must be used within a <ChartContainer />");
|
|
10
|
-
return
|
|
10
|
+
return e;
|
|
11
11
|
}
|
|
12
|
-
function
|
|
13
|
-
id:
|
|
12
|
+
function O({
|
|
13
|
+
id: e,
|
|
14
14
|
className: r,
|
|
15
|
-
children:
|
|
16
|
-
config:
|
|
17
|
-
...
|
|
15
|
+
children: t,
|
|
16
|
+
config: n,
|
|
17
|
+
...s
|
|
18
18
|
}) {
|
|
19
|
-
const
|
|
20
|
-
return /* @__PURE__ */
|
|
19
|
+
const l = p.useId(), c = `chart-${e || l.replace(/:/g, "")}`;
|
|
20
|
+
return /* @__PURE__ */ o(N.Provider, { value: { config: n }, children: /* @__PURE__ */ v(
|
|
21
21
|
"div",
|
|
22
22
|
{
|
|
23
|
-
id:
|
|
23
|
+
id: e,
|
|
24
24
|
"data-slot": "chart",
|
|
25
|
-
"data-chart":
|
|
26
|
-
className:
|
|
27
|
-
"[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border flex aspect-video justify-center text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
|
|
25
|
+
"data-chart": c,
|
|
26
|
+
className: d(
|
|
27
|
+
"[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border flex aspect-video justify-center text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden [&_.recharts-trapezoid[stroke='#fff']]:stroke-transparent",
|
|
28
|
+
// A `<Brush>` traveller is the one `.recharts-layer` that is a real
|
|
29
|
+
// control (`role="slider"`, tabbable, arrow-key driven), so the blanket
|
|
30
|
+
// `outline-hidden` above would leave it with no focus indicator. Restore
|
|
31
|
+
// one — the `:focus-visible` pseudo-class outranks that rule, so this
|
|
32
|
+
// wins regardless of the order Tailwind emits them in. An `outline`
|
|
33
|
+
// rather than the usual `ring`: box-shadow doesn't paint on SVG children.
|
|
34
|
+
"[&_.recharts-brush-traveller:focus-visible]:[outline:3px_solid_var(--ui-focus-primary)] [&_.recharts-brush-traveller:focus-visible]:[outline-offset:1px]",
|
|
35
|
+
// recharts anchors its axis tick text with the *direction-relative*
|
|
36
|
+
// SVG keywords (`text-anchor: start|end`, see `getTickTextAnchor` in
|
|
37
|
+
// `CartesianAxis`), while placing every mark at a computed physical
|
|
38
|
+
// coordinate. Inheriting `direction: rtl` therefore flips only the
|
|
39
|
+
// text: an `end`-anchored Y tick mirrors about its anchor and lands
|
|
40
|
+
// inside the plot (measured: +24px to +39px), rotated ticks shift
|
|
41
|
+
// ~+15px, and a `ReferenceLine` label at the right edge overflows the
|
|
42
|
+
// surface. Pinning the surface keeps the plot's own coordinate system
|
|
43
|
+
// consistent with the geometry recharts computed for it. The chrome
|
|
44
|
+
// that *should* mirror — tooltip and legend — is HTML outside
|
|
45
|
+
// `.recharts-surface`, so it is unaffected.
|
|
46
|
+
//
|
|
47
|
+
// `Treemap` is the exception: its cell labels are HTML in a
|
|
48
|
+
// `<foreignObject>` *inside* the surface, put there precisely so they
|
|
49
|
+
// mirror with the page (see `treemap.tsx`). That is ordinary flow
|
|
50
|
+
// layout, not a computed SVG coordinate, so the pin has to stop at the
|
|
51
|
+
// `<foreignObject>` boundary and hand the page's direction back.
|
|
52
|
+
"[&_.recharts-surface]:[direction:ltr] rtl:[&_.recharts-surface_foreignObject]:[direction:rtl]",
|
|
28
53
|
r
|
|
29
54
|
),
|
|
30
|
-
...
|
|
55
|
+
...s,
|
|
31
56
|
children: [
|
|
32
|
-
/* @__PURE__ */
|
|
33
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ o(T, { id: c, config: n }),
|
|
58
|
+
/* @__PURE__ */ o(j.ResponsiveContainer, { children: t })
|
|
34
59
|
]
|
|
35
60
|
}
|
|
36
61
|
) });
|
|
37
62
|
}
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
([,
|
|
63
|
+
const T = ({ id: e, config: r }) => {
|
|
64
|
+
const t = Object.entries(r).filter(
|
|
65
|
+
([, n]) => n.theme || n.color
|
|
41
66
|
);
|
|
42
|
-
return
|
|
43
|
-
([
|
|
44
|
-
${
|
|
45
|
-
${
|
|
46
|
-
var
|
|
47
|
-
const
|
|
48
|
-
return
|
|
67
|
+
return t.length ? /* @__PURE__ */ o("style", { children: Object.entries(E).map(
|
|
68
|
+
([n, s]) => `
|
|
69
|
+
${s} [data-chart=${e}] {
|
|
70
|
+
${t.map(([l, c]) => {
|
|
71
|
+
var u;
|
|
72
|
+
const i = ((u = c.theme) == null ? void 0 : u[n]) || c.color;
|
|
73
|
+
return i ? ` --color-${l}: ${i};` : null;
|
|
49
74
|
}).join(`
|
|
50
75
|
`)}
|
|
51
76
|
}
|
|
52
77
|
`
|
|
53
78
|
).join(`
|
|
54
79
|
`) }) : null;
|
|
55
|
-
}
|
|
80
|
+
};
|
|
81
|
+
function y({
|
|
82
|
+
marker: e,
|
|
83
|
+
color: r,
|
|
84
|
+
className: t
|
|
85
|
+
}) {
|
|
86
|
+
return /* @__PURE__ */ o(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: d(
|
|
90
|
+
"shrink-0",
|
|
91
|
+
e === "swatch" ? "h-2.5 w-2.5 rounded-sm" : "h-[3px] w-4 rounded-full",
|
|
92
|
+
t
|
|
93
|
+
),
|
|
94
|
+
style: e === "dashed" ? {
|
|
95
|
+
// A dashed stroke can't be drawn with a background color, so the
|
|
96
|
+
// dash pattern is painted as a gradient.
|
|
97
|
+
backgroundImage: `repeating-linear-gradient(90deg, ${r} 0 4px, transparent 4px 7px)`
|
|
98
|
+
} : { backgroundColor: r }
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
const K = j.Tooltip;
|
|
103
|
+
function I({
|
|
104
|
+
item: e,
|
|
105
|
+
index: r,
|
|
106
|
+
payload: t,
|
|
107
|
+
itemConfig: n,
|
|
108
|
+
indicatorColor: s,
|
|
109
|
+
hideIndicator: l,
|
|
110
|
+
formatter: c
|
|
111
|
+
}) {
|
|
112
|
+
return /* @__PURE__ */ o("div", { className: "flex w-full flex-wrap items-center gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground", children: c && (e == null ? void 0 : e.value) !== void 0 && e.name ? c(e.value, e.name, e, r, t) : /* @__PURE__ */ v(L, { children: [
|
|
113
|
+
n != null && n.icon ? /* @__PURE__ */ o(n.icon, {}) : !l && // A row is always dotted, whatever marker the legend
|
|
114
|
+
// gives that series.
|
|
115
|
+
/* @__PURE__ */ o(
|
|
116
|
+
"div",
|
|
117
|
+
{
|
|
118
|
+
className: "h-2.5 w-2.5 shrink-0 rounded-full",
|
|
119
|
+
style: { backgroundColor: s }
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
/* @__PURE__ */ v("div", { className: "flex flex-1 items-center justify-between gap-4 leading-none", children: [
|
|
123
|
+
/* @__PURE__ */ o("span", { className: "text-muted-foreground", children: (n == null ? void 0 : n.label) || e.name }),
|
|
124
|
+
e.value != null && /* @__PURE__ */ o("span", { className: "font-medium tabular-nums text-foreground", children: e.value.toLocaleString() })
|
|
125
|
+
] })
|
|
126
|
+
] }) });
|
|
127
|
+
}
|
|
56
128
|
function q({
|
|
57
|
-
active:
|
|
129
|
+
active: e,
|
|
58
130
|
payload: r,
|
|
59
|
-
label:
|
|
60
|
-
className:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
labelKey: _
|
|
131
|
+
label: t,
|
|
132
|
+
className: n,
|
|
133
|
+
hideLabel: s = !1,
|
|
134
|
+
hideIndicator: l = !1,
|
|
135
|
+
labelFormatter: c,
|
|
136
|
+
formatter: i,
|
|
137
|
+
labelClassName: u,
|
|
138
|
+
color: h,
|
|
139
|
+
nameKey: x,
|
|
140
|
+
labelKey: b
|
|
70
141
|
}) {
|
|
71
|
-
const { config:
|
|
72
|
-
if (
|
|
142
|
+
const { config: g } = P(), C = p.useMemo(() => {
|
|
143
|
+
if (s || !(r != null && r.length))
|
|
73
144
|
return null;
|
|
74
|
-
const [
|
|
75
|
-
var
|
|
76
|
-
const
|
|
77
|
-
return typeof
|
|
145
|
+
const [a] = r, _ = `${b || (a == null ? void 0 : a.dataKey) || (a == null ? void 0 : a.name) || "value"}`, f = m(g, a, _), k = (() => {
|
|
146
|
+
var $;
|
|
147
|
+
const w = !b && typeof t == "string" ? (($ = g[t]) == null ? void 0 : $.label) ?? t : f == null ? void 0 : f.label;
|
|
148
|
+
return typeof w == "string" || typeof w == "number" ? w : void 0;
|
|
78
149
|
})();
|
|
79
|
-
return
|
|
150
|
+
return c ? /* @__PURE__ */ o("div", { className: d("font-medium", u), children: c(k, r) }) : k ? /* @__PURE__ */ o("div", { className: d("font-medium", u), children: k }) : null;
|
|
80
151
|
}, [
|
|
81
|
-
|
|
82
|
-
|
|
152
|
+
t,
|
|
153
|
+
c,
|
|
83
154
|
r,
|
|
155
|
+
s,
|
|
84
156
|
u,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
_
|
|
157
|
+
g,
|
|
158
|
+
b
|
|
88
159
|
]);
|
|
89
|
-
|
|
90
|
-
return null;
|
|
91
|
-
const x = r.length === 1 && n !== "dot";
|
|
92
|
-
return /* @__PURE__ */ v(
|
|
160
|
+
return !e || !(r != null && r.length) ? null : /* @__PURE__ */ v(
|
|
93
161
|
"div",
|
|
94
162
|
{
|
|
95
|
-
className:
|
|
163
|
+
className: d(
|
|
96
164
|
"grid min-w-[8rem] items-start gap-1.5 rounded-[var(--ui-tooltip-container-border-radius)] border border-border bg-background px-[var(--ui-tooltip-container-padding-x)] py-[var(--ui-tooltip-container-padding-y)] text-xs text-foreground shadow-md",
|
|
97
|
-
|
|
165
|
+
n
|
|
98
166
|
),
|
|
99
167
|
children: [
|
|
100
|
-
|
|
101
|
-
/* @__PURE__ */
|
|
102
|
-
const f = `${
|
|
103
|
-
return /* @__PURE__ */
|
|
104
|
-
|
|
168
|
+
C,
|
|
169
|
+
/* @__PURE__ */ o("div", { className: "grid gap-1.5", children: r.map((a, _) => {
|
|
170
|
+
const f = `${x || a.name || a.dataKey || "value"}`;
|
|
171
|
+
return /* @__PURE__ */ o(
|
|
172
|
+
I,
|
|
105
173
|
{
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
),
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
{
|
|
114
|
-
className: i(
|
|
115
|
-
"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)",
|
|
116
|
-
{
|
|
117
|
-
"h-2.5 w-2.5": n === "dot",
|
|
118
|
-
"h-4 w-1": n === "line",
|
|
119
|
-
"h-4 w-0 border-[1.5px] border-dashed bg-transparent": n === "dashed",
|
|
120
|
-
"my-0.5": x && n === "dashed"
|
|
121
|
-
}
|
|
122
|
-
),
|
|
123
|
-
style: {
|
|
124
|
-
"--color-bg": g,
|
|
125
|
-
"--color-border": g
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
),
|
|
129
|
-
/* @__PURE__ */ v(
|
|
130
|
-
"div",
|
|
131
|
-
{
|
|
132
|
-
className: i(
|
|
133
|
-
"flex flex-1 justify-between leading-none",
|
|
134
|
-
x ? "items-end" : "items-center"
|
|
135
|
-
),
|
|
136
|
-
children: [
|
|
137
|
-
/* @__PURE__ */ v("div", { className: "grid gap-1.5", children: [
|
|
138
|
-
x ? N : null,
|
|
139
|
-
/* @__PURE__ */ c("span", { className: "text-muted-foreground", children: (d == null ? void 0 : d.label) || t.name })
|
|
140
|
-
] }),
|
|
141
|
-
t.value != null && /* @__PURE__ */ c("span", { className: "font-medium tabular-nums text-foreground", children: t.value.toLocaleString() })
|
|
142
|
-
]
|
|
143
|
-
}
|
|
144
|
-
)
|
|
145
|
-
] })
|
|
174
|
+
item: a,
|
|
175
|
+
index: _,
|
|
176
|
+
payload: r,
|
|
177
|
+
itemConfig: m(g, a, f),
|
|
178
|
+
indicatorColor: h || a.payload.fill || a.color,
|
|
179
|
+
hideIndicator: l,
|
|
180
|
+
formatter: i
|
|
146
181
|
},
|
|
147
182
|
f
|
|
148
183
|
);
|
|
@@ -151,63 +186,82 @@ function q({
|
|
|
151
186
|
}
|
|
152
187
|
);
|
|
153
188
|
}
|
|
154
|
-
const
|
|
155
|
-
function
|
|
156
|
-
|
|
189
|
+
const z = j.Legend;
|
|
190
|
+
function R({
|
|
191
|
+
item: e,
|
|
192
|
+
itemConfig: r,
|
|
193
|
+
hideIcon: t
|
|
194
|
+
}) {
|
|
195
|
+
var l;
|
|
196
|
+
const n = (l = e.payload) == null ? void 0 : l.strokeDasharray, s = e.type !== "line" ? "swatch" : n ? "dashed" : "line";
|
|
197
|
+
return /* @__PURE__ */ v(
|
|
198
|
+
"div",
|
|
199
|
+
{
|
|
200
|
+
className: d(
|
|
201
|
+
"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"
|
|
202
|
+
),
|
|
203
|
+
children: [
|
|
204
|
+
r != null && r.icon && !t ? /* @__PURE__ */ o(r.icon, {}) : /* @__PURE__ */ o(y, { marker: s, color: e.color }),
|
|
205
|
+
(r == null ? void 0 : r.label) ?? e.value
|
|
206
|
+
]
|
|
207
|
+
}
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
function A({
|
|
211
|
+
className: e,
|
|
157
212
|
hideIcon: r = !1,
|
|
158
|
-
payload:
|
|
159
|
-
verticalAlign:
|
|
160
|
-
nameKey:
|
|
213
|
+
payload: t,
|
|
214
|
+
verticalAlign: n = "bottom",
|
|
215
|
+
nameKey: s,
|
|
216
|
+
config: l
|
|
161
217
|
}) {
|
|
162
|
-
|
|
163
|
-
|
|
218
|
+
var u;
|
|
219
|
+
const c = (u = p.useContext(N)) == null ? void 0 : u.config, i = l ?? c;
|
|
220
|
+
if (!i)
|
|
221
|
+
throw new Error(
|
|
222
|
+
"ChartLegendContent must be used within a <ChartContainer /> or given a `config` prop"
|
|
223
|
+
);
|
|
224
|
+
return t != null && t.length ? /* @__PURE__ */ o(
|
|
164
225
|
"div",
|
|
165
226
|
{
|
|
166
|
-
className:
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
s
|
|
227
|
+
className: d(
|
|
228
|
+
// Wraps rather than overflowing: a legend with many entries (a treemap's
|
|
229
|
+
// one-per-tile, a pie's one-per-slice) is wider than the chart on a narrow
|
|
230
|
+
// surface, and a row that can't wrap paints past the chart's edge. The
|
|
231
|
+
// column gap is unchanged, so a legend that already fits on one row keeps
|
|
232
|
+
// its exact layout.
|
|
233
|
+
"flex flex-wrap items-center justify-start gap-x-4 gap-y-2",
|
|
234
|
+
n === "top" ? "pb-3" : "pt-3",
|
|
235
|
+
e
|
|
170
236
|
),
|
|
171
|
-
children:
|
|
172
|
-
const
|
|
173
|
-
return /* @__PURE__ */
|
|
174
|
-
|
|
237
|
+
children: t.map((h) => {
|
|
238
|
+
const x = `${s || h.dataKey || "value"}`;
|
|
239
|
+
return /* @__PURE__ */ o(
|
|
240
|
+
R,
|
|
175
241
|
{
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
children: [
|
|
180
|
-
l != null && l.icon && !r ? /* @__PURE__ */ c(l.icon, {}) : /* @__PURE__ */ c(
|
|
181
|
-
"div",
|
|
182
|
-
{
|
|
183
|
-
className: "h-2 w-2 shrink-0 rounded-[2px]",
|
|
184
|
-
style: {
|
|
185
|
-
backgroundColor: a.color
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
),
|
|
189
|
-
l == null ? void 0 : l.label
|
|
190
|
-
]
|
|
242
|
+
item: h,
|
|
243
|
+
itemConfig: m(i, h, x),
|
|
244
|
+
hideIcon: r
|
|
191
245
|
},
|
|
192
|
-
|
|
246
|
+
h.value
|
|
193
247
|
);
|
|
194
248
|
})
|
|
195
249
|
}
|
|
196
250
|
) : null;
|
|
197
251
|
}
|
|
198
|
-
function
|
|
252
|
+
function m(e, r, t) {
|
|
199
253
|
if (typeof r != "object" || r === null)
|
|
200
254
|
return;
|
|
201
|
-
const
|
|
202
|
-
let
|
|
203
|
-
return
|
|
255
|
+
const n = "payload" in r && typeof r.payload == "object" && r.payload !== null ? r.payload : void 0;
|
|
256
|
+
let s = t;
|
|
257
|
+
return t in r && typeof r[t] == "string" ? s = r[t] : n && t in n && typeof n[t] == "string" && (s = n[t]), s in e ? e[s] : e[t];
|
|
204
258
|
}
|
|
205
259
|
export {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
260
|
+
O as ChartContainer,
|
|
261
|
+
z as ChartLegend,
|
|
262
|
+
A as ChartLegendContent,
|
|
263
|
+
T as ChartStyle,
|
|
264
|
+
K as ChartTooltip,
|
|
211
265
|
q as ChartTooltipContent
|
|
212
266
|
};
|
|
213
267
|
//# sourceMappingURL=chart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.js","sources":["../../../../src/components/ui/chart/chart.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\nimport type { LegendPayload } from 'recharts/types/component/DefaultLegendContent';\nimport {\n NameType,\n Payload,\n ValueType,\n} from 'recharts/types/component/DefaultTooltipContent';\nimport type { Props as LegendProps } from 'recharts/types/component/Legend';\nimport { TooltipContentProps } from 'recharts/types/component/Tooltip';\n\nimport { cn } from '@/lib/utils';\n\n// Format: { THEME_NAME: CSS_SELECTOR }. ui-react flips light/dark via the\n// `[data-theme]` attribute (the tokens resolve `light-dark()` through\n// `color-scheme`), not the legacy `.dark` class — so per-series `theme` colors\n// scope their dark value under `[data-theme='dark']`.\nconst THEMES = { light: '', dark: \"[data-theme='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};\n\nexport type ChartTooltipContentProps = Partial<\n TooltipContentProps<ValueType, NameType>\n> & {\n className?: string;\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n labelFormatter?: (\n label: TooltipContentProps<number, string>['label'],\n payload: TooltipContentProps<number, string>['payload']\n ) => React.ReactNode;\n formatter?: (\n value: number | string,\n name: string,\n item: Payload<number | string, string>,\n index: number,\n payload: ReadonlyArray<Payload<number | string, string>>\n ) => React.ReactNode;\n labelClassName?: string;\n color?: string;\n};\n\nexport type ChartLegendContentProps = {\n className?: string;\n hideIcon?: boolean;\n verticalAlign?: LegendProps['verticalAlign'];\n payload?: LegendPayload[];\n nameKey?: string;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\nexport interface ChartContainerProps extends React.ComponentProps<'div'> {\n config: ChartConfig;\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children'];\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n ...props\n}: ChartContainerProps) {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n id={id}\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border flex aspect-video justify-center text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\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\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n // Rendered as a text child (not dangerouslySetInnerHTML): React sets it via\n // textContent, which the browser does not HTML-parse, so a `</style>` in a\n // config color can't break out of the tag.\n return (\n <style>\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 </style>\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\n/** The `content` a caller passes to override the default tooltip (recharts' `Tooltip['content']`). */\nexport type ChartTooltipContentType = React.ComponentProps<\n typeof ChartTooltip\n>['content'];\n\nfunction ChartTooltipContent({\n active,\n payload,\n label,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n labelFormatter,\n formatter,\n labelClassName,\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 const v =\n !labelKey && typeof label === 'string'\n ? (config[label as keyof typeof config]?.label ?? label)\n : itemConfig?.label;\n\n return typeof v === 'string' || typeof v === 'number' ? v : undefined;\n })();\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ]);\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-[var(--ui-tooltip-container-border-radius)] border border-border bg-background px-[var(--ui-tooltip-container-padding-x)] py-[var(--ui-tooltip-container-padding-y)] text-xs text-foreground shadow-md',\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={key}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'h-4 w-1': indicator === 'line',\n 'h-4 w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\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-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-medium tabular-nums text-foreground\">\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\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n nameKey,\n}: ChartLegendContentProps) {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className\n )}\n >\n {payload.map((item) => {\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={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground'\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\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\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n};\n"],"names":["THEMES","ChartContext","React","useChart","context","ChartContainer","id","className","children","config","props","uniqueId","chartId","jsxs","cn","jsx","ChartStyle","RechartsPrimitive","colorConfig","theme","prefix","key","itemConfig","color","_a","ChartTooltip","ChartTooltipContent","active","payload","label","indicator","hideLabel","hideIndicator","labelFormatter","formatter","labelClassName","nameKey","labelKey","tooltipLabel","item","getPayloadConfigFromPayload","value","v","nestLabel","index","indicatorColor","Fragment","ChartLegend","ChartLegendContent","hideIcon","verticalAlign","payloadPayload","configLabelKey"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.js","sources":["../../../../src/components/ui/chart/chart.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\nimport type { LegendPayload } from 'recharts/types/component/DefaultLegendContent';\nimport {\n NameType,\n Payload,\n ValueType,\n} from 'recharts/types/component/DefaultTooltipContent';\nimport type { Props as LegendProps } from 'recharts/types/component/Legend';\nimport { TooltipContentProps } from 'recharts/types/component/Tooltip';\n\nimport { cn } from '@/lib/utils';\n\n// Format: { THEME_NAME: CSS_SELECTOR }. ui-react flips light/dark via the\n// `[data-theme]` attribute (the tokens resolve `light-dark()` through\n// `color-scheme`), not the legacy `.dark` class — so per-series `theme` colors\n// scope their dark value under `[data-theme='dark']`.\nconst THEMES = { light: '', dark: \"[data-theme='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};\n\n/**\n * How a series is marked in the legend. A filled series reads as a square\n * swatch; a stroke-drawn one (line, area) as the line it paints — dashed when\n * the stroke is. The tooltip always dots its rows instead.\n */\ntype ChartSeriesMarker = 'swatch' | 'line' | 'dashed';\n\nexport type ChartTooltipContentProps = Partial<\n TooltipContentProps<ValueType, NameType>\n> & {\n className?: string;\n hideLabel?: boolean;\n hideIndicator?: boolean;\n nameKey?: string;\n labelKey?: string;\n labelFormatter?: (\n label: TooltipContentProps<number, string>['label'],\n payload: TooltipContentProps<number, string>['payload']\n ) => React.ReactNode;\n formatter?: (\n value: number | string,\n name: string,\n item: Payload<number | string, string>,\n index: number,\n payload: ReadonlyArray<Payload<number | string, string>>\n ) => React.ReactNode;\n labelClassName?: string;\n color?: string;\n};\n\nexport type ChartLegendContentProps = {\n className?: string;\n hideIcon?: boolean;\n verticalAlign?: LegendProps['verticalAlign'];\n payload?: LegendPayload[];\n nameKey?: string;\n /**\n * The series config the entries take their labels and icons from. Defaults to\n * the enclosing `ChartContainer`'s — pass it only to render the legend *outside*\n * the container, which a chart type has to do when the renderer can't lay a\n * legend out inside its plot (see `Treemap`).\n */\n config?: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\nexport interface ChartContainerProps extends React.ComponentProps<'div'> {\n config: ChartConfig;\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children'];\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n ...props\n}: ChartContainerProps) {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n id={id}\n data-slot=\"chart\"\n data-chart={chartId}\n // The `[stroke='#fff']` rules undo recharts' hardcoded white outlines —\n // on pie/radial sectors, line dots and funnel trapezoids. They don't\n // follow the theme, so in dark mode they read as a light hairline around\n // every segment.\n className={cn(\n \"[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border flex aspect-video justify-center text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden [&_.recharts-trapezoid[stroke='#fff']]:stroke-transparent\",\n // A `<Brush>` traveller is the one `.recharts-layer` that is a real\n // control (`role=\"slider\"`, tabbable, arrow-key driven), so the blanket\n // `outline-hidden` above would leave it with no focus indicator. Restore\n // one — the `:focus-visible` pseudo-class outranks that rule, so this\n // wins regardless of the order Tailwind emits them in. An `outline`\n // rather than the usual `ring`: box-shadow doesn't paint on SVG children.\n '[&_.recharts-brush-traveller:focus-visible]:[outline:3px_solid_var(--ui-focus-primary)] [&_.recharts-brush-traveller:focus-visible]:[outline-offset:1px]',\n // recharts anchors its axis tick text with the *direction-relative*\n // SVG keywords (`text-anchor: start|end`, see `getTickTextAnchor` in\n // `CartesianAxis`), while placing every mark at a computed physical\n // coordinate. Inheriting `direction: rtl` therefore flips only the\n // text: an `end`-anchored Y tick mirrors about its anchor and lands\n // inside the plot (measured: +24px to +39px), rotated ticks shift\n // ~+15px, and a `ReferenceLine` label at the right edge overflows the\n // surface. Pinning the surface keeps the plot's own coordinate system\n // consistent with the geometry recharts computed for it. The chrome\n // that *should* mirror — tooltip and legend — is HTML outside\n // `.recharts-surface`, so it is unaffected.\n //\n // `Treemap` is the exception: its cell labels are HTML in a\n // `<foreignObject>` *inside* the surface, put there precisely so they\n // mirror with the page (see `treemap.tsx`). That is ordinary flow\n // layout, not a computed SVG coordinate, so the pin has to stop at the\n // `<foreignObject>` boundary and hand the page's direction back.\n '[&_.recharts-surface]:[direction:ltr] rtl:[&_.recharts-surface_foreignObject]:[direction:rtl]',\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\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n // Rendered as a text child (not dangerouslySetInnerHTML): React sets it via\n // textContent, which the browser does not HTML-parse, so a `</style>` in a\n // config color can't break out of the tag.\n return (\n <style>\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 </style>\n );\n};\n\n/** The marker drawn next to a series' name in the legend. */\nfunction SeriesMarker({\n marker,\n color,\n className,\n}: {\n marker: ChartSeriesMarker;\n color?: string;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'shrink-0',\n marker === 'swatch'\n ? 'h-2.5 w-2.5 rounded-sm'\n : 'h-[3px] w-4 rounded-full',\n className\n )}\n style={\n marker === 'dashed'\n ? {\n // A dashed stroke can't be drawn with a background color, so the\n // dash pattern is painted as a gradient.\n backgroundImage: `repeating-linear-gradient(90deg, ${color} 0 4px, transparent 4px 7px)`,\n }\n : { backgroundColor: color }\n }\n />\n );\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\n/** The `content` a caller passes to override the default tooltip (recharts' `Tooltip['content']`). */\nexport type ChartTooltipContentType = React.ComponentProps<\n typeof ChartTooltip\n>['content'];\n\n/**\n * What `getPayloadConfigFromPayload` resolves a payload item to — the lookup can\n * miss, so every consumer has to cope with `undefined`. Derived from the helper\n * rather than restated, so the two can't drift.\n */\ntype ChartItemConfig = ReturnType<typeof getPayloadConfigFromPayload>;\n\n/** One row of the tooltip's payload, after the `active`/empty guard. */\ntype ChartTooltipItem = NonNullable<\n ChartTooltipContentProps['payload']\n>[number];\n\n/**\n * One tooltip row. Its own three-way branching (caller formatter, config icon,\n * default dot) is what drove the nesting in `ChartTooltipContent`; as a\n * component the map body reads as a single element.\n */\nfunction ChartTooltipRow({\n item,\n index,\n payload,\n itemConfig,\n indicatorColor,\n hideIndicator,\n formatter,\n}: {\n item: ChartTooltipItem;\n index: number;\n payload: NonNullable<ChartTooltipContentProps['payload']>;\n itemConfig: ChartItemConfig;\n indicatorColor?: string;\n hideIndicator: boolean;\n formatter: ChartTooltipContentProps['formatter'];\n}) {\n return (\n <div className=\"flex w-full flex-wrap items-center gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\">\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n // A row is always dotted, whatever marker the legend\n // gives that series.\n <div\n className=\"h-2.5 w-2.5 shrink-0 rounded-full\"\n style={{ backgroundColor: indicatorColor }}\n />\n )\n )}\n {/*\n * `gap-4` puts a floor under the name/value separation.\n * `justify-between` alone only separates them while the\n * container has free space to distribute — which the tooltip's\n * `min-w-[8rem]` guarantees for a short value and not for a\n * long one (a currency `tickFormatter`, a `labelFormatter`\n * with units, a value plus its share), where the two would\n * otherwise butt up against each other. A minimum, so a row\n * with slack renders as before.\n */}\n <div className=\"flex flex-1 items-center justify-between gap-4 leading-none\">\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n {item.value != null && (\n <span className=\"font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction ChartTooltipContent({\n active,\n payload,\n label,\n className,\n hideLabel = false,\n hideIndicator = false,\n labelFormatter,\n formatter,\n labelClassName,\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 const v =\n !labelKey && typeof label === 'string'\n ? (config[label as keyof typeof config]?.label ?? label)\n : itemConfig?.label;\n\n return typeof v === 'string' || typeof v === 'number' ? v : undefined;\n })();\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-[var(--ui-tooltip-container-border-radius)] border border-border bg-background px-[var(--ui-tooltip-container-padding-x)] py-[var(--ui-tooltip-container-padding-y)] text-xs text-foreground shadow-md',\n className\n )}\n >\n {tooltipLabel}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n\n return (\n <ChartTooltipRow\n key={key}\n item={item}\n index={index}\n payload={payload}\n itemConfig={getPayloadConfigFromPayload(config, item, key)}\n indicatorColor={color || item.payload.fill || item.color}\n hideIndicator={hideIndicator}\n formatter={formatter}\n />\n );\n })}\n </div>\n </div>\n );\n}\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\n/**\n * One legend entry. Split out so the marker it has to derive from the payload\n * sits next to the markup that uses it, instead of above a nested map body.\n */\nfunction ChartLegendEntry({\n item,\n itemConfig,\n hideIcon,\n}: {\n item: LegendPayload;\n itemConfig: ChartItemConfig;\n hideIcon: boolean;\n}) {\n // recharts types stroke-drawn series (<Line>, <Area>) as `line`; a chart\n // that wants a swatch instead sets the series' `legendType=\"rect\"`.\n const dashArray = (\n item.payload as { strokeDasharray?: string | number } | undefined\n )?.strokeDasharray;\n const marker: ChartSeriesMarker =\n item.type !== 'line' ? 'swatch' : dashArray ? 'dashed' : 'line';\n\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground'\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <SeriesMarker marker={marker} color={item.color} />\n )}\n {/*\n * Falls back to the series key, the way the tooltip row and the\n * treemap's on-cell label both do. `label` is optional on a\n * `ChartConfig` entry, and `getPayloadConfigFromPayload` can miss\n * entirely, so without this an entry renders as a marker with no\n * text — worst on the charts whose legend is the only place a series\n * is named.\n */}\n {itemConfig?.label ?? item.value}\n </div>\n );\n}\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n nameKey,\n config: configFromProps,\n}: ChartLegendContentProps) {\n // The context read directly rather than through `useChart()`: a caller that\n // passes its own `config` is rendering the legend outside the container, where\n // the context is absent by design rather than by mistake. Every other caller\n // still gets `useChart()`'s error — the legend has no way to label itself\n // without a config, and failing loudly beats rendering an empty row.\n const contextConfig = React.useContext(ChartContext)?.config;\n const config = configFromProps ?? contextConfig;\n\n if (!config) {\n throw new Error(\n 'ChartLegendContent must be used within a <ChartContainer /> or given a `config` prop'\n );\n }\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n // Wraps rather than overflowing: a legend with many entries (a treemap's\n // one-per-tile, a pie's one-per-slice) is wider than the chart on a narrow\n // surface, and a row that can't wrap paints past the chart's edge. The\n // column gap is unchanged, so a legend that already fits on one row keeps\n // its exact layout.\n 'flex flex-wrap items-center justify-start gap-x-4 gap-y-2',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className\n )}\n >\n {payload.map((item) => {\n const key = `${nameKey || item.dataKey || 'value'}`;\n\n return (\n <ChartLegendEntry\n key={item.value}\n item={item}\n itemConfig={getPayloadConfigFromPayload(config, item, key)}\n hideIcon={hideIcon}\n />\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\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n};\n"],"names":["THEMES","ChartContext","React","useChart","context","ChartContainer","id","className","children","config","props","uniqueId","chartId","jsxs","cn","jsx","ChartStyle","RechartsPrimitive","colorConfig","theme","prefix","key","itemConfig","color","_a","SeriesMarker","marker","ChartTooltip","ChartTooltipRow","item","index","payload","indicatorColor","hideIndicator","formatter","Fragment","ChartTooltipContent","active","label","hideLabel","labelFormatter","labelClassName","nameKey","labelKey","tooltipLabel","getPayloadConfigFromPayload","value","v","ChartLegend","ChartLegendEntry","hideIcon","dashArray","ChartLegendContent","verticalAlign","configFromProps","contextConfig","payloadPayload","configLabelKey"],"mappings":"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"}
|