@craftzbay/ui 0.9.0 → 0.10.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 +72 -6
- package/dist-lib/components/ui/Accordion.js +60 -0
- package/dist-lib/components/ui/Accordion.js.map +1 -0
- package/dist-lib/components/ui/Alert.d.ts +1 -1
- package/dist-lib/components/ui/Alert.js +66 -0
- package/dist-lib/components/ui/Alert.js.map +1 -0
- package/dist-lib/components/ui/Avatar.d.ts +2 -2
- package/dist-lib/components/ui/Avatar.js +96 -0
- package/dist-lib/components/ui/Avatar.js.map +1 -0
- package/dist-lib/components/ui/Badge.d.ts +1 -1
- package/dist-lib/components/ui/Badge.js +67 -0
- package/dist-lib/components/ui/Badge.js.map +1 -0
- package/dist-lib/components/ui/Breadcrumbs.js +34 -0
- package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
- package/dist-lib/components/ui/Button.d.ts +1 -1
- package/dist-lib/components/ui/Button.js +117 -0
- package/dist-lib/components/ui/Button.js.map +1 -0
- package/dist-lib/components/ui/Calendar.d.ts +7 -1
- package/dist-lib/components/ui/Calendar.js +111 -0
- package/dist-lib/components/ui/Calendar.js.map +1 -0
- package/dist-lib/components/ui/Card.d.ts +1 -1
- package/dist-lib/components/ui/Card.js +116 -0
- package/dist-lib/components/ui/Card.js.map +1 -0
- package/dist-lib/components/ui/Carousel.d.ts +5 -1
- package/dist-lib/components/ui/Carousel.js +143 -0
- package/dist-lib/components/ui/Carousel.js.map +1 -0
- package/dist-lib/components/ui/Chart.d.ts +26 -4
- package/dist-lib/components/ui/Chart.js +253 -0
- package/dist-lib/components/ui/Chart.js.map +1 -0
- package/dist-lib/components/ui/Checkbox.js +56 -0
- package/dist-lib/components/ui/Checkbox.js.map +1 -0
- package/dist-lib/components/ui/Combobox.d.ts +7 -0
- package/dist-lib/components/ui/Combobox.js +164 -0
- package/dist-lib/components/ui/Combobox.js.map +1 -0
- package/dist-lib/components/ui/CommandPalette.d.ts +3 -3
- package/dist-lib/components/ui/CommandPalette.js +174 -0
- package/dist-lib/components/ui/CommandPalette.js.map +1 -0
- package/dist-lib/components/ui/ContextMenu.js +150 -0
- package/dist-lib/components/ui/ContextMenu.js.map +1 -0
- package/dist-lib/components/ui/DataGrid.js +84 -0
- package/dist-lib/components/ui/DataGrid.js.map +1 -0
- package/dist-lib/components/ui/DatePicker.d.ts +16 -13
- package/dist-lib/components/ui/DatePicker.js +174 -0
- package/dist-lib/components/ui/DatePicker.js.map +1 -0
- package/dist-lib/components/ui/DesignSystemProvider.d.ts +8 -1
- package/dist-lib/components/ui/DesignSystemProvider.js +79 -0
- package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
- package/dist-lib/components/ui/Dialog.d.ts +1 -1
- package/dist-lib/components/ui/Dialog.js +140 -0
- package/dist-lib/components/ui/Dialog.js.map +1 -0
- package/dist-lib/components/ui/Drawer.d.ts +6 -0
- package/dist-lib/components/ui/Drawer.js +98 -0
- package/dist-lib/components/ui/Drawer.js.map +1 -0
- package/dist-lib/components/ui/DropdownMenu.js +164 -0
- package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
- package/dist-lib/components/ui/EmptyState.js +32 -0
- package/dist-lib/components/ui/EmptyState.js.map +1 -0
- package/dist-lib/components/ui/ErrorState.js +48 -0
- package/dist-lib/components/ui/ErrorState.js.map +1 -0
- package/dist-lib/components/ui/FileUpload.d.ts +3 -0
- package/dist-lib/components/ui/FileUpload.js +108 -0
- package/dist-lib/components/ui/FileUpload.js.map +1 -0
- package/dist-lib/components/ui/Form.d.ts +1 -0
- package/dist-lib/components/ui/Form.js +105 -0
- package/dist-lib/components/ui/Form.js.map +1 -0
- package/dist-lib/components/ui/Icon.js +26 -0
- package/dist-lib/components/ui/Icon.js.map +1 -0
- package/dist-lib/components/ui/IconButton.d.ts +1 -1
- package/dist-lib/components/ui/IconButton.js +56 -0
- package/dist-lib/components/ui/IconButton.js.map +1 -0
- package/dist-lib/components/ui/Input.d.ts +6 -3
- package/dist-lib/components/ui/Input.js +135 -0
- package/dist-lib/components/ui/Input.js.map +1 -0
- package/dist-lib/components/ui/Kbd.js +24 -0
- package/dist-lib/components/ui/Kbd.js.map +1 -0
- package/dist-lib/components/ui/MultiSelect.d.ts +3 -1
- package/dist-lib/components/ui/MultiSelect.js +196 -0
- package/dist-lib/components/ui/MultiSelect.js.map +1 -0
- package/dist-lib/components/ui/Pagination.d.ts +23 -0
- package/dist-lib/components/ui/Pagination.js +148 -0
- package/dist-lib/components/ui/Pagination.js.map +1 -0
- package/dist-lib/components/ui/Popover.js +35 -0
- package/dist-lib/components/ui/Popover.js.map +1 -0
- package/dist-lib/components/ui/Progress.js +95 -0
- package/dist-lib/components/ui/Progress.js.map +1 -0
- package/dist-lib/components/ui/RadioGroup.js +64 -0
- package/dist-lib/components/ui/RadioGroup.js.map +1 -0
- package/dist-lib/components/ui/ScrollArea.js +44 -0
- package/dist-lib/components/ui/ScrollArea.js.map +1 -0
- package/dist-lib/components/ui/Select.js +131 -0
- package/dist-lib/components/ui/Select.js.map +1 -0
- package/dist-lib/components/ui/Separator.js +26 -0
- package/dist-lib/components/ui/Separator.js.map +1 -0
- package/dist-lib/components/ui/Sheet.d.ts +1 -1
- package/dist-lib/components/ui/Sheet.js +113 -0
- package/dist-lib/components/ui/Sheet.js.map +1 -0
- package/dist-lib/components/ui/Sidebar.d.ts +18 -6
- package/dist-lib/components/ui/Sidebar.js +169 -0
- package/dist-lib/components/ui/Sidebar.js.map +1 -0
- package/dist-lib/components/ui/Skeleton.js +28 -0
- package/dist-lib/components/ui/Skeleton.js.map +1 -0
- package/dist-lib/components/ui/Slider.js +52 -0
- package/dist-lib/components/ui/Slider.js.map +1 -0
- package/dist-lib/components/ui/Snackbar.d.ts +1 -1
- package/dist-lib/components/ui/Snackbar.js +56 -0
- package/dist-lib/components/ui/Snackbar.js.map +1 -0
- package/dist-lib/components/ui/Spinner.js +42 -0
- package/dist-lib/components/ui/Spinner.js.map +1 -0
- package/dist-lib/components/ui/Stepper.js +88 -0
- package/dist-lib/components/ui/Stepper.js.map +1 -0
- package/dist-lib/components/ui/Switch.js +77 -0
- package/dist-lib/components/ui/Switch.js.map +1 -0
- package/dist-lib/components/ui/Table.d.ts +9 -1
- package/dist-lib/components/ui/Table.js +157 -0
- package/dist-lib/components/ui/Table.js.map +1 -0
- package/dist-lib/components/ui/Tabs.d.ts +1 -1
- package/dist-lib/components/ui/Tabs.js +89 -0
- package/dist-lib/components/ui/Tabs.js.map +1 -0
- package/dist-lib/components/ui/TagInput.d.ts +17 -2
- package/dist-lib/components/ui/TagInput.js +111 -0
- package/dist-lib/components/ui/TagInput.js.map +1 -0
- package/dist-lib/components/ui/Textarea.js +77 -0
- package/dist-lib/components/ui/Textarea.js.map +1 -0
- package/dist-lib/components/ui/Timeline.d.ts +16 -6
- package/dist-lib/components/ui/Timeline.js +52 -0
- package/dist-lib/components/ui/Timeline.js.map +1 -0
- package/dist-lib/components/ui/Toast.d.ts +1 -1
- package/dist-lib/components/ui/Toast.js +171 -0
- package/dist-lib/components/ui/Toast.js.map +1 -0
- package/dist-lib/components/ui/Tooltip.js +58 -0
- package/dist-lib/components/ui/Tooltip.js.map +1 -0
- package/dist-lib/components/ui/TopNav.js +52 -0
- package/dist-lib/components/ui/TopNav.js.map +1 -0
- package/dist-lib/components/ui/Tree.d.ts +27 -5
- package/dist-lib/components/ui/Tree.js +167 -0
- package/dist-lib/components/ui/Tree.js.map +1 -0
- package/dist-lib/hooks/use-field-ids.d.ts +29 -0
- package/dist-lib/hooks/use-field-ids.js +18 -0
- package/dist-lib/hooks/use-field-ids.js.map +1 -0
- package/dist-lib/hooks/use-media-query.js +18 -0
- package/dist-lib/hooks/use-media-query.js.map +1 -0
- package/dist-lib/hooks/use-strings.d.ts +5 -0
- package/dist-lib/hooks/use-strings.js +12 -0
- package/dist-lib/hooks/use-strings.js.map +1 -0
- package/dist-lib/hooks/use-toast.js +36 -0
- package/dist-lib/hooks/use-toast.js.map +1 -0
- package/dist-lib/icon.d.ts +8 -0
- package/dist-lib/icon.js +7 -0
- package/dist-lib/icon.js.map +1 -0
- package/dist-lib/icons/index.d.ts +71 -88
- package/dist-lib/icons/index.js +145 -0
- package/dist-lib/icons/index.js.map +1 -0
- package/dist-lib/illustrations/index.js +105 -0
- package/dist-lib/illustrations/index.js.map +1 -0
- package/dist-lib/index.d.ts +62 -59
- package/dist-lib/index.js +267 -4529
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/lib/strings.d.ts +129 -0
- package/dist-lib/lib/strings.js +85 -0
- package/dist-lib/lib/strings.js.map +1 -0
- package/dist-lib/lib/strings.mn.d.ts +3 -0
- package/dist-lib/lib/strings.mn.js +70 -0
- package/dist-lib/lib/strings.mn.js.map +1 -0
- package/dist-lib/lib/utils.d.ts +0 -1
- package/dist-lib/lib/utils.js +10 -0
- package/dist-lib/lib/utils.js.map +1 -0
- package/dist-lib/styles.css +1 -1
- package/dist-lib/theme.css +777 -0
- package/package.json +31 -8
- package/dist-lib/index.cjs +0 -8
- package/dist-lib/index.cjs.map +0 -1
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as i, jsxs as M } from "react/jsx-runtime";
|
|
3
|
+
import { useId as T } from "react";
|
|
4
|
+
import { cn as G } from "../../lib/utils.js";
|
|
5
|
+
const w = [
|
|
6
|
+
"var(--chart-1)",
|
|
7
|
+
"var(--chart-2)",
|
|
8
|
+
"var(--chart-3)",
|
|
9
|
+
"var(--chart-4)",
|
|
10
|
+
"var(--chart-5)",
|
|
11
|
+
"var(--chart-6)"
|
|
12
|
+
], A = 600, h = 6, W = 4, _ = 5;
|
|
13
|
+
function K(t) {
|
|
14
|
+
const n = Math.abs(t), e = (r, a) => `${(Math.round(r * 10) / 10).toString()}${a}`;
|
|
15
|
+
return n >= 1e9 ? e(t / 1e9, "B") : n >= 1e6 ? e(t / 1e6, "M") : n >= 1e3 ? e(t / 1e3, "K") : Number.isInteger(t) ? String(t) : (Math.round(t * 100) / 100).toString();
|
|
16
|
+
}
|
|
17
|
+
function E(t, n) {
|
|
18
|
+
return n && n.length ? n : [{ data: t ?? [] }];
|
|
19
|
+
}
|
|
20
|
+
function B(t, n = !0) {
|
|
21
|
+
const e = t.flatMap((o) => o.data.map((c) => c.y)), r = n ? Math.min(0, ...e) : Math.min(...e), a = Math.max(...e, n ? 1 : -1 / 0);
|
|
22
|
+
return { min: r, max: a === -1 / 0 ? 1 : a, range: a - r || 1 };
|
|
23
|
+
}
|
|
24
|
+
function X(t, n, e, r) {
|
|
25
|
+
const a = A - h * 2, o = n - h * 2;
|
|
26
|
+
return { sx: (l) => t <= 1 ? h + a / 2 : h + l / (t - 1) * a, sy: (l) => h + o - (l - e) / r * o };
|
|
27
|
+
}
|
|
28
|
+
function U(t) {
|
|
29
|
+
if (t.length === 0) return "";
|
|
30
|
+
if (t.length < 3) return t.map((e, r) => `${r ? "L" : "M"}${e[0]},${e[1]}`).join(" ");
|
|
31
|
+
let n = `M${t[0][0]},${t[0][1]}`;
|
|
32
|
+
for (let e = 0; e < t.length - 1; e++) {
|
|
33
|
+
const r = t[e - 1] ?? t[e], a = t[e], o = t[e + 1], c = t[e + 2] ?? o, d = a[0] + (o[0] - r[0]) / 6, l = a[1] + (o[1] - r[1]) / 6, $ = o[0] - (c[0] - a[0]) / 6, y = o[1] - (c[1] - a[1]) / 6;
|
|
34
|
+
n += ` C${d.toFixed(1)},${l.toFixed(1)} ${$.toFixed(1)},${y.toFixed(1)} ${o[0].toFixed(1)},${o[1].toFixed(1)}`;
|
|
35
|
+
}
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
function D(t) {
|
|
39
|
+
return t.map((n, e) => {
|
|
40
|
+
const r = n.data.map((d) => d.y);
|
|
41
|
+
if (!r.length) return `${n.name ?? `Series ${e + 1}`}: no data`;
|
|
42
|
+
const a = Math.min(...r), o = Math.max(...r), c = n.data[n.data.length - 1];
|
|
43
|
+
return `${n.name ?? `Series ${e + 1}`}: ${r.length} points, min ${a}, max ${o}, last ${c.x}: ${c.y}`;
|
|
44
|
+
}).join(". ");
|
|
45
|
+
}
|
|
46
|
+
function H({ height: t }) {
|
|
47
|
+
const n = t - h * 2;
|
|
48
|
+
return /* @__PURE__ */ i("g", { "aria-hidden": !0, children: Array.from({ length: W + 1 }, (e, r) => {
|
|
49
|
+
const a = h + r / W * n;
|
|
50
|
+
return /* @__PURE__ */ i(
|
|
51
|
+
"line",
|
|
52
|
+
{
|
|
53
|
+
x1: 0,
|
|
54
|
+
x2: A,
|
|
55
|
+
y1: a,
|
|
56
|
+
y2: a,
|
|
57
|
+
stroke: "var(--color-border)",
|
|
58
|
+
strokeWidth: 1,
|
|
59
|
+
vectorEffect: "non-scaling-stroke",
|
|
60
|
+
opacity: 0.6
|
|
61
|
+
},
|
|
62
|
+
r
|
|
63
|
+
);
|
|
64
|
+
}) });
|
|
65
|
+
}
|
|
66
|
+
function V({ min: t, max: n }) {
|
|
67
|
+
const e = Array.from(
|
|
68
|
+
{ length: _ },
|
|
69
|
+
(r, a) => n - (n - t) * a / (_ - 1)
|
|
70
|
+
);
|
|
71
|
+
return /* @__PURE__ */ i(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
"aria-hidden": !0,
|
|
75
|
+
className: "tabular text-foreground-subtle pointer-events-none flex shrink-0 flex-col justify-between py-[6px] pr-1.5 text-right text-xs",
|
|
76
|
+
children: e.map((r, a) => /* @__PURE__ */ i("span", { className: "leading-none", children: K(r) }, a))
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
function Y({ first: t, last: n }) {
|
|
81
|
+
return t ? /* @__PURE__ */ M("div", { "aria-hidden": !0, className: "text-foreground-subtle flex justify-between text-xs", children: [
|
|
82
|
+
/* @__PURE__ */ i("span", { children: String(t.x) }),
|
|
83
|
+
n && n !== t && /* @__PURE__ */ i("span", { children: String(n.x) })
|
|
84
|
+
] }) : null;
|
|
85
|
+
}
|
|
86
|
+
function R({
|
|
87
|
+
caption: t,
|
|
88
|
+
ariaLabel: n,
|
|
89
|
+
title: e,
|
|
90
|
+
desc: r,
|
|
91
|
+
height: a,
|
|
92
|
+
width: o,
|
|
93
|
+
className: c,
|
|
94
|
+
showAxis: d,
|
|
95
|
+
yDomain: l,
|
|
96
|
+
xFirst: $,
|
|
97
|
+
xLast: y,
|
|
98
|
+
children: s
|
|
99
|
+
}) {
|
|
100
|
+
const f = T().replace(/:/g, ""), p = `chart-cap-${f}`, F = `chart-title-${f}`, g = `chart-desc-${f}`, x = n ?? e;
|
|
101
|
+
return /* @__PURE__ */ M("figure", { className: G("flex flex-col gap-1.5", c), style: { width: o }, children: [
|
|
102
|
+
t && /* @__PURE__ */ i("figcaption", { id: p, className: "text-foreground-muted text-xs", children: t }),
|
|
103
|
+
/* @__PURE__ */ M("div", { className: "flex", children: [
|
|
104
|
+
d && /* @__PURE__ */ i(V, { min: l.min, max: l.max }),
|
|
105
|
+
/* @__PURE__ */ M(
|
|
106
|
+
"svg",
|
|
107
|
+
{
|
|
108
|
+
viewBox: `0 0 ${A} ${a}`,
|
|
109
|
+
width: "100%",
|
|
110
|
+
height: a,
|
|
111
|
+
preserveAspectRatio: "none",
|
|
112
|
+
role: "img",
|
|
113
|
+
"aria-labelledby": t ? p : x ? F : void 0,
|
|
114
|
+
"aria-describedby": g,
|
|
115
|
+
className: "min-w-0 flex-1 overflow-visible",
|
|
116
|
+
children: [
|
|
117
|
+
x && /* @__PURE__ */ i("title", { id: F, children: x }),
|
|
118
|
+
/* @__PURE__ */ i("desc", { id: g, children: r }),
|
|
119
|
+
s
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
] }),
|
|
124
|
+
d && /* @__PURE__ */ i(Y, { first: $, last: y })
|
|
125
|
+
] });
|
|
126
|
+
}
|
|
127
|
+
function q({
|
|
128
|
+
data: t,
|
|
129
|
+
series: n,
|
|
130
|
+
colors: e = w,
|
|
131
|
+
height: r = 160,
|
|
132
|
+
width: a = "100%",
|
|
133
|
+
caption: o,
|
|
134
|
+
"aria-label": c,
|
|
135
|
+
title: d,
|
|
136
|
+
grid: l = !0,
|
|
137
|
+
showAxis: $ = !0,
|
|
138
|
+
className: y
|
|
139
|
+
}) {
|
|
140
|
+
const s = E(t, n), { min: f, max: p, range: F } = B(s), g = Math.max(...s.map((u) => u.data.length)), x = s[0].data;
|
|
141
|
+
return /* @__PURE__ */ M(
|
|
142
|
+
R,
|
|
143
|
+
{
|
|
144
|
+
caption: o,
|
|
145
|
+
ariaLabel: c,
|
|
146
|
+
title: d,
|
|
147
|
+
desc: D(s),
|
|
148
|
+
height: r,
|
|
149
|
+
width: a,
|
|
150
|
+
className: y,
|
|
151
|
+
showAxis: $,
|
|
152
|
+
yDomain: { min: f, max: p },
|
|
153
|
+
xFirst: x[0],
|
|
154
|
+
xLast: x[x.length - 1],
|
|
155
|
+
children: [
|
|
156
|
+
l && /* @__PURE__ */ i(H, { height: r }),
|
|
157
|
+
s.map((u, L) => {
|
|
158
|
+
const v = e[L % e.length], { sx: b, sy: k } = X(g, r, f, F), m = u.data.map((O, P) => [b(P), k(O.y)]), N = U(m), S = k(Math.max(f, 0)), I = m.length ? `${N} L${m[m.length - 1][0].toFixed(1)},${S.toFixed(1)} L${m[0][0].toFixed(1)},${S.toFixed(1)} Z` : "", j = m[m.length - 1], C = u.data[u.data.length - 1];
|
|
159
|
+
return /* @__PURE__ */ M("g", { children: [
|
|
160
|
+
I && /* @__PURE__ */ i("path", { d: I, fill: v, fillOpacity: 0.08 }),
|
|
161
|
+
/* @__PURE__ */ i(
|
|
162
|
+
"path",
|
|
163
|
+
{
|
|
164
|
+
d: N,
|
|
165
|
+
fill: "none",
|
|
166
|
+
stroke: v,
|
|
167
|
+
strokeWidth: 2,
|
|
168
|
+
strokeLinecap: "round",
|
|
169
|
+
strokeLinejoin: "round",
|
|
170
|
+
vectorEffect: "non-scaling-stroke"
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
j && /* @__PURE__ */ i(
|
|
174
|
+
"circle",
|
|
175
|
+
{
|
|
176
|
+
cx: j[0],
|
|
177
|
+
cy: j[1],
|
|
178
|
+
r: 3.5,
|
|
179
|
+
fill: v,
|
|
180
|
+
vectorEffect: "non-scaling-stroke",
|
|
181
|
+
children: /* @__PURE__ */ i("title", { children: `${u.name ? `${u.name} — ` : ""}${C.x}: ${C.y}` })
|
|
182
|
+
}
|
|
183
|
+
)
|
|
184
|
+
] }, L);
|
|
185
|
+
})
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
function Z(t) {
|
|
191
|
+
return /* @__PURE__ */ i(q, { ...t });
|
|
192
|
+
}
|
|
193
|
+
function tt({
|
|
194
|
+
data: t,
|
|
195
|
+
series: n,
|
|
196
|
+
colors: e = w,
|
|
197
|
+
height: r = 160,
|
|
198
|
+
width: a = "100%",
|
|
199
|
+
caption: o,
|
|
200
|
+
"aria-label": c,
|
|
201
|
+
title: d,
|
|
202
|
+
grid: l = !0,
|
|
203
|
+
showAxis: $ = !0,
|
|
204
|
+
className: y
|
|
205
|
+
}) {
|
|
206
|
+
const s = E(t, n), f = A - h * 2, p = r - h * 2, F = Math.max(...s.map((b) => b.data.length)), g = f / Math.max(1, F), x = g * 0.62, u = Math.max(2, x / s.length), { max: L } = B(s), v = s[0].data;
|
|
207
|
+
return /* @__PURE__ */ M(
|
|
208
|
+
R,
|
|
209
|
+
{
|
|
210
|
+
caption: o,
|
|
211
|
+
ariaLabel: c,
|
|
212
|
+
title: d,
|
|
213
|
+
desc: D(s),
|
|
214
|
+
height: r,
|
|
215
|
+
width: a,
|
|
216
|
+
className: y,
|
|
217
|
+
showAxis: $,
|
|
218
|
+
yDomain: { min: 0, max: L },
|
|
219
|
+
xFirst: v[0],
|
|
220
|
+
xLast: v[v.length - 1],
|
|
221
|
+
children: [
|
|
222
|
+
l && /* @__PURE__ */ i(H, { height: r }),
|
|
223
|
+
s.map(
|
|
224
|
+
(b, k) => b.data.map((m, N) => {
|
|
225
|
+
const S = Math.max(0, m.y) / L * p, I = h + N * g + (g - x) / 2 + k * u;
|
|
226
|
+
return /* @__PURE__ */ i(
|
|
227
|
+
"rect",
|
|
228
|
+
{
|
|
229
|
+
x: I,
|
|
230
|
+
y: h + p - S,
|
|
231
|
+
width: u,
|
|
232
|
+
height: Math.max(0, S),
|
|
233
|
+
fill: e[k % e.length],
|
|
234
|
+
rx: 2,
|
|
235
|
+
className: "transition-opacity hover:opacity-80",
|
|
236
|
+
children: /* @__PURE__ */ i("title", { children: `${b.name ? `${b.name} — ` : ""}${m.x}: ${m.y}` })
|
|
237
|
+
},
|
|
238
|
+
`${k}-${N}`
|
|
239
|
+
);
|
|
240
|
+
})
|
|
241
|
+
)
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
export {
|
|
247
|
+
Z as AreaChart,
|
|
248
|
+
tt as BarChart,
|
|
249
|
+
w as DEFAULT_CHART_COLORS,
|
|
250
|
+
q as LineChart,
|
|
251
|
+
K as abbreviateNumber
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=Chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../src/components/ui/Chart.tsx"],"sourcesContent":["'use client';\n\nimport { useId, type ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * Tiny, dependency-free chart primitives for inline dashboards — sparklines,\n * KPI cards, at-a-glance trends. For heavy interactive visualisations reach for\n * a charting library. These render as responsive SVG (the line/area stretch to\n * the container width; strokes stay crisp via non-scaling-stroke).\n */\n\nexport interface ChartPoint {\n x: string | number;\n y: number;\n}\n\nexport interface ChartSeries {\n /** Name used in the accessible summary and tooltips. */\n name?: string;\n data: ChartPoint[];\n}\n\nexport interface ChartProps {\n /** Primary series. Ignored when `series` is provided. */\n data?: ChartPoint[];\n /** Multiple series drawn on the same scale. */\n series?: ChartSeries[];\n /**\n * Per-series colours. Defaults to the categorical token list below.\n * TODO(globals.css): add `--chart-1..6` tokens and switch the defaults.\n */\n colors?: string[];\n /** Drawing height in px. */\n height?: number;\n /** Defaults to fluid 100%. */\n width?: number | string;\n /** Visible caption rendered above the chart. Doubles as the accessible name. */\n caption?: ReactNode;\n /** Accessible name when there is no `caption`. */\n 'aria-label'?: string;\n /** Alias of `aria-label` (SVG `<title>`). */\n title?: string;\n /** Faint horizontal gridlines. Default true. */\n grid?: boolean;\n /** Y-axis tick labels + first/last x labels. Default true. */\n showAxis?: boolean;\n className?: string;\n}\n\nexport const DEFAULT_CHART_COLORS = [\n 'var(--chart-1)',\n 'var(--chart-2)',\n 'var(--chart-3)',\n 'var(--chart-4)',\n 'var(--chart-5)',\n 'var(--chart-6)',\n];\n\n// Fixed internal coordinate space; preserveAspectRatio=\"none\" stretches it to\n// the container, so this only controls smoothing resolution, not the aspect.\nconst VB_W = 600;\nconst PAD = 6;\nconst GRID_LINES = 4;\nconst MAX_TICKS = 5;\n\n/** 1234 → \"1.2K\", 3_400_000 → \"3.4M\". */\nexport function abbreviateNumber(n: number): string {\n const abs = Math.abs(n);\n const fmt = (v: number, s: string) => `${(Math.round(v * 10) / 10).toString()}${s}`;\n if (abs >= 1e9) return fmt(n / 1e9, 'B');\n if (abs >= 1e6) return fmt(n / 1e6, 'M');\n if (abs >= 1e3) return fmt(n / 1e3, 'K');\n return Number.isInteger(n) ? String(n) : (Math.round(n * 100) / 100).toString();\n}\n\nfunction resolveSeries(data?: ChartPoint[], series?: ChartSeries[]): ChartSeries[] {\n if (series && series.length) return series;\n return [{ data: data ?? [] }];\n}\n\nfunction domain(all: ChartSeries[], includeZero = true) {\n const ys = all.flatMap((s) => s.data.map((d) => d.y));\n const min = includeZero ? Math.min(0, ...ys) : Math.min(...ys);\n const max = Math.max(...ys, includeZero ? 1 : -Infinity);\n return { min, max: max === -Infinity ? 1 : max, range: max - min || 1 };\n}\n\nfunction scales(length: number, h: number, min: number, range: number) {\n const innerW = VB_W - PAD * 2;\n const innerH = h - PAD * 2;\n const sx = (i: number) => (length <= 1 ? PAD + innerW / 2 : PAD + (i / (length - 1)) * innerW);\n const sy = (v: number) => PAD + innerH - ((v - min) / range) * innerH;\n return { sx, sy };\n}\n\n/** Catmull-Rom → cubic bézier: a smooth curve through every point. */\nfunction smoothPath(pts: [number, number][]): string {\n if (pts.length === 0) return '';\n if (pts.length < 3) return pts.map((p, i) => `${i ? 'L' : 'M'}${p[0]},${p[1]}`).join(' ');\n let d = `M${pts[0][0]},${pts[0][1]}`;\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[i - 1] ?? pts[i];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[i + 2] ?? p2;\n const c1x = p1[0] + (p2[0] - p0[0]) / 6;\n const c1y = p1[1] + (p2[1] - p0[1]) / 6;\n const c2x = p2[0] - (p3[0] - p1[0]) / 6;\n const c2y = p2[1] - (p3[1] - p1[1]) / 6;\n d += ` C${c1x.toFixed(1)},${c1y.toFixed(1)} ${c2x.toFixed(1)},${c2y.toFixed(1)} ${p2[0].toFixed(1)},${p2[1].toFixed(1)}`;\n }\n return d;\n}\n\n/** Plain-language summary for the `<desc>` element. */\nfunction describe(all: ChartSeries[]): string {\n return all\n .map((s, i) => {\n const ys = s.data.map((d) => d.y);\n if (!ys.length) return `${s.name ?? `Series ${i + 1}`}: no data`;\n const min = Math.min(...ys);\n const max = Math.max(...ys);\n const last = s.data[s.data.length - 1];\n return `${s.name ?? `Series ${i + 1}`}: ${ys.length} points, min ${min}, max ${max}, last ${last.x}: ${last.y}`;\n })\n .join('. ');\n}\n\nfunction Grid({ height }: { height: number }) {\n const innerH = height - PAD * 2;\n return (\n <g aria-hidden>\n {Array.from({ length: GRID_LINES + 1 }, (_, i) => {\n const y = PAD + (i / GRID_LINES) * innerH;\n return (\n <line\n key={i}\n x1={0}\n x2={VB_W}\n y1={y}\n y2={y}\n stroke=\"var(--color-border)\"\n strokeWidth={1}\n vectorEffect=\"non-scaling-stroke\"\n opacity={0.6}\n />\n );\n })}\n </g>\n );\n}\n\n/**\n * Axis labels are rendered in HTML (not inside the stretched SVG) so the text\n * is never distorted by `preserveAspectRatio=\"none\"`.\n */\nfunction YAxis({ min, max }: { min: number; max: number }) {\n const ticks = Array.from(\n { length: MAX_TICKS },\n (_, i) => max - ((max - min) * i) / (MAX_TICKS - 1),\n );\n return (\n <div\n aria-hidden\n className=\"tabular text-foreground-subtle pointer-events-none flex shrink-0 flex-col justify-between py-[6px] pr-1.5 text-right text-xs\"\n >\n {ticks.map((t, i) => (\n <span key={i} className=\"leading-none\">\n {abbreviateNumber(t)}\n </span>\n ))}\n </div>\n );\n}\n\nfunction XAxis({ first, last }: { first?: ChartPoint; last?: ChartPoint }) {\n if (!first) return null;\n return (\n <div aria-hidden className=\"text-foreground-subtle flex justify-between text-xs\">\n <span>{String(first.x)}</span>\n {last && last !== first && <span>{String(last.x)}</span>}\n </div>\n );\n}\n\nfunction Frame({\n caption,\n ariaLabel,\n title,\n desc,\n height,\n width,\n className,\n showAxis,\n yDomain,\n xFirst,\n xLast,\n children,\n}: {\n caption?: ReactNode;\n ariaLabel?: string;\n title?: string;\n desc: string;\n height: number;\n width: number | string;\n className?: string;\n showAxis: boolean;\n yDomain: { min: number; max: number };\n xFirst?: ChartPoint;\n xLast?: ChartPoint;\n children: ReactNode;\n}) {\n const id = useId().replace(/:/g, '');\n const captionId = `chart-cap-${id}`;\n const titleId = `chart-title-${id}`;\n const descId = `chart-desc-${id}`;\n const name = ariaLabel ?? title;\n\n if (import.meta.env?.DEV && !name && !caption) {\n console.warn(\n '[craftzbay/ui] Chart: provide `caption`, `aria-label`, or `title` so the chart has an accessible name.',\n );\n }\n\n return (\n <figure className={cn('flex flex-col gap-1.5', className)} style={{ width }}>\n {caption && (\n <figcaption id={captionId} className=\"text-foreground-muted text-xs\">\n {caption}\n </figcaption>\n )}\n <div className=\"flex\">\n {showAxis && <YAxis min={yDomain.min} max={yDomain.max} />}\n <svg\n viewBox={`0 0 ${VB_W} ${height}`}\n width=\"100%\"\n height={height}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-labelledby={caption ? captionId : name ? titleId : undefined}\n aria-describedby={descId}\n className=\"min-w-0 flex-1 overflow-visible\"\n >\n {name && <title id={titleId}>{name}</title>}\n <desc id={descId}>{desc}</desc>\n {children}\n </svg>\n </div>\n {showAxis && <XAxis first={xFirst} last={xLast} />}\n </figure>\n );\n}\n\nexport function LineChart({\n data,\n series,\n colors = DEFAULT_CHART_COLORS,\n height = 160,\n width = '100%',\n caption,\n 'aria-label': ariaLabel,\n title,\n grid = true,\n showAxis = true,\n className,\n}: ChartProps) {\n const all = resolveSeries(data, series);\n const { min, max, range } = domain(all);\n const longest = Math.max(...all.map((s) => s.data.length));\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n desc={describe(all)}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n yDomain={{ min, max }}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n >\n {grid && <Grid height={height} />}\n {all.map((s, si) => {\n const color = colors[si % colors.length];\n const { sx, sy } = scales(longest, height, min, range);\n const pts = s.data.map((d, i) => [sx(i), sy(d.y)] as [number, number]);\n const line = smoothPath(pts);\n const baseline = sy(Math.max(min, 0));\n const area = pts.length\n ? `${line} L${pts[pts.length - 1][0].toFixed(1)},${baseline.toFixed(1)} L${pts[0][0].toFixed(1)},${baseline.toFixed(1)} Z`\n : '';\n const last = pts[pts.length - 1];\n const lastPoint = s.data[s.data.length - 1];\n return (\n <g key={si}>\n {area && <path d={area} fill={color} fillOpacity={0.08} />}\n <path\n d={line}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {last && (\n <circle\n cx={last[0]}\n cy={last[1]}\n r={3.5}\n fill={color}\n vectorEffect=\"non-scaling-stroke\"\n >\n <title>{`${s.name ? `${s.name} — ` : ''}${lastPoint.x}: ${lastPoint.y}`}</title>\n </circle>\n )}\n </g>\n );\n })}\n </Frame>\n );\n}\n\nexport function AreaChart(props: ChartProps) {\n // The line chart already renders a flat low-opacity area; alias for intent / naming.\n return <LineChart {...props} />;\n}\n\nexport function BarChart({\n data,\n series,\n colors = DEFAULT_CHART_COLORS,\n height = 160,\n width = '100%',\n caption,\n 'aria-label': ariaLabel,\n title,\n grid = true,\n showAxis = true,\n className,\n}: ChartProps) {\n const all = resolveSeries(data, series);\n const innerW = VB_W - PAD * 2;\n const innerH = height - PAD * 2;\n const longest = Math.max(...all.map((s) => s.data.length));\n const slot = innerW / Math.max(1, longest);\n const groupW = slot * 0.62;\n const barW = Math.max(2, groupW / all.length);\n const { max } = domain(all);\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n desc={describe(all)}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n yDomain={{ min: 0, max }}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n >\n {grid && <Grid height={height} />}\n {all.map((s, si) =>\n s.data.map((d, i) => {\n const h = (Math.max(0, d.y) / max) * innerH;\n const x = PAD + i * slot + (slot - groupW) / 2 + si * barW;\n return (\n <rect\n key={`${si}-${i}`}\n x={x}\n y={PAD + innerH - h}\n width={barW}\n height={Math.max(0, h)}\n fill={colors[si % colors.length]}\n rx={2}\n className=\"transition-opacity hover:opacity-80\"\n >\n <title>{`${s.name ? `${s.name} — ` : ''}${d.x}: ${d.y}`}</title>\n </rect>\n );\n }),\n )}\n </Frame>\n );\n}\n"],"names":["DEFAULT_CHART_COLORS","VB_W","PAD","GRID_LINES","MAX_TICKS","abbreviateNumber","n","abs","fmt","v","s","resolveSeries","data","series","domain","all","includeZero","ys","d","min","max","scales","length","h","range","innerW","innerH","i","smoothPath","pts","p","p0","p1","p2","p3","c1x","c1y","c2x","c2y","describe","last","Grid","height","jsx","_","y","YAxis","ticks","t","XAxis","first","Frame","caption","ariaLabel","title","desc","width","className","showAxis","yDomain","xFirst","xLast","children","id","useId","captionId","titleId","descId","name","jsxs","cn","LineChart","colors","grid","longest","primary","si","color","sx","sy","line","baseline","area","lastPoint","AreaChart","props","BarChart","slot","groupW","barW","x"],"mappings":";;;;AAkDO,MAAMA,IAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAIMC,IAAO,KACPC,IAAM,GACNC,IAAa,GACbC,IAAY;AAGX,SAASC,EAAiBC,GAAmB;AAClD,QAAMC,IAAM,KAAK,IAAID,CAAC,GAChBE,IAAM,CAACC,GAAWC,MAAc,IAAI,KAAK,MAAMD,IAAI,EAAE,IAAI,IAAI,SAAA,CAAU,GAAGC,CAAC;AACjF,SAAIH,KAAO,MAAYC,EAAIF,IAAI,KAAK,GAAG,IACnCC,KAAO,MAAYC,EAAIF,IAAI,KAAK,GAAG,IACnCC,KAAO,MAAYC,EAAIF,IAAI,KAAK,GAAG,IAChC,OAAO,UAAUA,CAAC,IAAI,OAAOA,CAAC,KAAK,KAAK,MAAMA,IAAI,GAAG,IAAI,KAAK,SAAA;AACvE;AAEA,SAASK,EAAcC,GAAqBC,GAAuC;AACjF,SAAIA,KAAUA,EAAO,SAAeA,IAC7B,CAAC,EAAE,MAAMD,KAAQ,CAAA,GAAI;AAC9B;AAEA,SAASE,EAAOC,GAAoBC,IAAc,IAAM;AACtD,QAAMC,IAAKF,EAAI,QAAQ,CAACL,MAAMA,EAAE,KAAK,IAAI,CAACQ,MAAMA,EAAE,CAAC,CAAC,GAC9CC,IAAMH,IAAc,KAAK,IAAI,GAAG,GAAGC,CAAE,IAAI,KAAK,IAAI,GAAGA,CAAE,GACvDG,IAAM,KAAK,IAAI,GAAGH,GAAID,IAAc,IAAI,MAAS;AACvD,SAAO,EAAE,KAAAG,GAAK,KAAKC,MAAQ,SAAY,IAAIA,GAAK,OAAOA,IAAMD,KAAO,EAAA;AACtE;AAEA,SAASE,EAAOC,GAAgBC,GAAWJ,GAAaK,GAAe;AACrE,QAAMC,IAASxB,IAAOC,IAAM,GACtBwB,IAASH,IAAIrB,IAAM;AAGzB,SAAO,EAAE,IAFE,CAACyB,MAAeL,KAAU,IAAIpB,IAAMuB,IAAS,IAAIvB,IAAOyB,KAAKL,IAAS,KAAMG,GAE1E,IADF,CAAChB,MAAcP,IAAMwB,KAAWjB,IAAIU,KAAOK,IAASE,EAClD;AACf;AAGA,SAASE,EAAWC,GAAiC;AACnD,MAAIA,EAAI,WAAW,EAAG,QAAO;AAC7B,MAAIA,EAAI,SAAS,EAAG,QAAOA,EAAI,IAAI,CAACC,GAAGH,MAAM,GAAGA,IAAI,MAAM,GAAG,GAAGG,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACxF,MAAIZ,IAAI,IAAIW,EAAI,CAAC,EAAE,CAAC,CAAC,IAAIA,EAAI,CAAC,EAAE,CAAC,CAAC;AAClC,WAASF,IAAI,GAAGA,IAAIE,EAAI,SAAS,GAAGF,KAAK;AACvC,UAAMI,IAAKF,EAAIF,IAAI,CAAC,KAAKE,EAAIF,CAAC,GACxBK,IAAKH,EAAIF,CAAC,GACVM,IAAKJ,EAAIF,IAAI,CAAC,GACdO,IAAKL,EAAIF,IAAI,CAAC,KAAKM,GACnBE,IAAMH,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK,GAChCK,IAAMJ,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK,GAChCM,IAAMJ,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK,GAChCM,IAAML,EAAG,CAAC,KAAKC,EAAG,CAAC,IAAIF,EAAG,CAAC,KAAK;AACtC,IAAAd,KAAK,KAAKiB,EAAI,QAAQ,CAAC,CAAC,IAAIC,EAAI,QAAQ,CAAC,CAAC,IAAIC,EAAI,QAAQ,CAAC,CAAC,IAAIC,EAAI,QAAQ,CAAC,CAAC,IAAIL,EAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxH;AACA,SAAOf;AACT;AAGA,SAASqB,EAASxB,GAA4B;AAC5C,SAAOA,EACJ,IAAI,CAACL,GAAGiB,MAAM;AACb,UAAMV,IAAKP,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;AAChC,QAAI,CAACO,EAAG,OAAQ,QAAO,GAAGP,EAAE,QAAQ,UAAUiB,IAAI,CAAC,EAAE;AACrD,UAAMR,IAAM,KAAK,IAAI,GAAGF,CAAE,GACpBG,IAAM,KAAK,IAAI,GAAGH,CAAE,GACpBuB,IAAO9B,EAAE,KAAKA,EAAE,KAAK,SAAS,CAAC;AACrC,WAAO,GAAGA,EAAE,QAAQ,UAAUiB,IAAI,CAAC,EAAE,KAAKV,EAAG,MAAM,gBAAgBE,CAAG,SAASC,CAAG,UAAUoB,EAAK,CAAC,KAAKA,EAAK,CAAC;AAAA,EAC/G,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAASC,EAAK,EAAE,QAAAC,KAA8B;AAC5C,QAAMhB,IAASgB,IAASxC,IAAM;AAC9B,SACE,gBAAAyC,EAAC,KAAA,EAAE,eAAW,IACX,UAAA,MAAM,KAAK,EAAE,QAAQxC,IAAa,EAAA,GAAK,CAACyC,GAAGjB,MAAM;AAChD,UAAMkB,IAAI3C,IAAOyB,IAAIxB,IAAcuB;AACnC,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,IAAI;AAAA,QACJ,IAAI1C;AAAA,QACJ,IAAI4C;AAAA,QACJ,IAAIA;AAAA,QACJ,QAAO;AAAA,QACP,aAAa;AAAA,QACb,cAAa;AAAA,QACb,SAAS;AAAA,MAAA;AAAA,MARJlB;AAAA,IAAA;AAAA,EAWX,CAAC,GACH;AAEJ;AAMA,SAASmB,EAAM,EAAE,KAAA3B,GAAK,KAAAC,KAAqC;AACzD,QAAM2B,IAAQ,MAAM;AAAA,IAClB,EAAE,QAAQ3C,EAAA;AAAA,IACV,CAACwC,GAAGjB,MAAMP,KAAQA,IAAMD,KAAOQ,KAAMvB,IAAY;AAAA,EAAA;AAEnD,SACE,gBAAAuC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAU;AAAA,MAET,UAAAI,EAAM,IAAI,CAACC,GAAGrB,MACb,gBAAAgB,EAAC,QAAA,EAAa,WAAU,gBACrB,UAAAtC,EAAiB2C,CAAC,EAAA,GADVrB,CAEX,CACD;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASsB,EAAM,EAAE,OAAAC,GAAO,MAAAV,KAAmD;AACzE,SAAKU,sBAEF,OAAA,EAAI,eAAW,IAAC,WAAU,uDACzB,UAAA;AAAA,IAAA,gBAAAP,EAAC,QAAA,EAAM,UAAA,OAAOO,EAAM,CAAC,GAAE;AAAA,IACtBV,KAAQA,MAASU,KAAS,gBAAAP,EAAC,UAAM,UAAA,OAAOH,EAAK,CAAC,EAAA,CAAE;AAAA,EAAA,GACnD,IALiB;AAOrB;AAEA,SAASW,EAAM;AAAA,EACb,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,QAAAb;AAAA,EACA,OAAAc;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACF,GAaG;AACD,QAAMC,IAAKC,EAAA,EAAQ,QAAQ,MAAM,EAAE,GAC7BC,IAAY,aAAaF,CAAE,IAC3BG,IAAU,eAAeH,CAAE,IAC3BI,IAAS,cAAcJ,CAAE,IACzBK,IAAOf,KAAaC;AAQ1B,SACE,gBAAAe,EAAC,UAAA,EAAO,WAAWC,EAAG,yBAAyBb,CAAS,GAAG,OAAO,EAAE,OAAAD,EAAA,GACjE,UAAA;AAAA,IAAAJ,uBACE,cAAA,EAAW,IAAIa,GAAW,WAAU,iCAClC,UAAAb,GACH;AAAA,IAEF,gBAAAiB,EAAC,OAAA,EAAI,WAAU,QACZ,UAAA;AAAA,MAAAX,uBAAaZ,GAAA,EAAM,KAAKa,EAAQ,KAAK,KAAKA,EAAQ,KAAK;AAAA,MACxD,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,OAAOpE,CAAI,IAAIyC,CAAM;AAAA,UAC9B,OAAM;AAAA,UACN,QAAAA;AAAA,UACA,qBAAoB;AAAA,UACpB,MAAK;AAAA,UACL,mBAAiBU,IAAUa,IAAYG,IAAOF,IAAU;AAAA,UACxD,oBAAkBC;AAAA,UAClB,WAAU;AAAA,UAET,UAAA;AAAA,YAAAC,uBAAS,SAAA,EAAM,IAAIF,GAAU,UAAAE,GAAK;AAAA,8BAClC,QAAA,EAAK,IAAID,GAAS,UAAAZ,GAAK;AAAA,YACvBO;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GACF;AAAA,IACCJ,uBAAaT,GAAA,EAAM,OAAOW,GAAQ,MAAMC,GAAO;AAAA,EAAA,GAClD;AAEJ;AAEO,SAASU,EAAU;AAAA,EACxB,MAAA3D;AAAA,EACA,QAAAC;AAAA,EACA,QAAA2D,IAASxE;AAAA,EACT,QAAA0C,IAAS;AAAA,EACT,OAAAc,IAAQ;AAAA,EACR,SAAAJ;AAAA,EACA,cAAcC;AAAA,EACd,OAAAC;AAAA,EACA,MAAAmB,IAAO;AAAA,EACP,UAAAf,IAAW;AAAA,EACX,WAAAD;AACF,GAAe;AACb,QAAM1C,IAAMJ,EAAcC,GAAMC,CAAM,GAChC,EAAE,KAAAM,GAAK,KAAAC,GAAK,OAAAI,EAAA,IAAUV,EAAOC,CAAG,GAChC2D,IAAU,KAAK,IAAI,GAAG3D,EAAI,IAAI,CAACL,MAAMA,EAAE,KAAK,MAAM,CAAC,GACnDiE,IAAU5D,EAAI,CAAC,EAAE;AAEvB,SACE,gBAAAsD;AAAA,IAAClB;AAAA,IAAA;AAAA,MACC,SAAAC;AAAA,MACA,WAAAC;AAAA,MACA,OAAAC;AAAA,MACA,MAAMf,EAASxB,CAAG;AAAA,MAClB,QAAA2B;AAAA,MACA,OAAAc;AAAA,MACA,WAAAC;AAAA,MACA,UAAAC;AAAA,MACA,SAAS,EAAE,KAAAvC,GAAK,KAAAC,EAAA;AAAA,MAChB,QAAQuD,EAAQ,CAAC;AAAA,MACjB,OAAOA,EAAQA,EAAQ,SAAS,CAAC;AAAA,MAEhC,UAAA;AAAA,QAAAF,KAAQ,gBAAA9B,EAACF,KAAK,QAAAC,GAAgB;AAAA,QAC9B3B,EAAI,IAAI,CAACL,GAAGkE,MAAO;AAClB,gBAAMC,IAAQL,EAAOI,IAAKJ,EAAO,MAAM,GACjC,EAAE,IAAAM,GAAI,IAAAC,MAAO1D,EAAOqD,GAAShC,GAAQvB,GAAKK,CAAK,GAC/CK,IAAMnB,EAAE,KAAK,IAAI,CAACQ,GAAGS,MAAM,CAACmD,EAAGnD,CAAC,GAAGoD,EAAG7D,EAAE,CAAC,CAAC,CAAqB,GAC/D8D,IAAOpD,EAAWC,CAAG,GACrBoD,IAAWF,EAAG,KAAK,IAAI5D,GAAK,CAAC,CAAC,GAC9B+D,IAAOrD,EAAI,SACb,GAAGmD,CAAI,KAAKnD,EAAIA,EAAI,SAAS,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIoD,EAAS,QAAQ,CAAC,CAAC,KAAKpD,EAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIoD,EAAS,QAAQ,CAAC,CAAC,OACpH,IACEzC,IAAOX,EAAIA,EAAI,SAAS,CAAC,GACzBsD,IAAYzE,EAAE,KAAKA,EAAE,KAAK,SAAS,CAAC;AAC1C,mCACG,KAAA,EACE,UAAA;AAAA,YAAAwE,uBAAS,QAAA,EAAK,GAAGA,GAAM,MAAML,GAAO,aAAa,MAAM;AAAA,YACxD,gBAAAlC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,GAAGqC;AAAA,gBACH,MAAK;AAAA,gBACL,QAAQH;AAAA,gBACR,aAAa;AAAA,gBACb,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,cAAa;AAAA,cAAA;AAAA,YAAA;AAAA,YAEdrC,KACC,gBAAAG;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIH,EAAK,CAAC;AAAA,gBACV,IAAIA,EAAK,CAAC;AAAA,gBACV,GAAG;AAAA,gBACH,MAAMqC;AAAA,gBACN,cAAa;AAAA,gBAEb,4BAAC,SAAA,EAAO,UAAA,GAAGnE,EAAE,OAAO,GAAGA,EAAE,IAAI,QAAQ,EAAE,GAAGyE,EAAU,CAAC,KAAKA,EAAU,CAAC,IAAG;AAAA,cAAA;AAAA,YAAA;AAAA,UAC1E,EAAA,GApBIP,CAsBR;AAAA,QAEJ,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEO,SAASQ,EAAUC,GAAmB;AAE3C,SAAO,gBAAA1C,EAAC4B,GAAA,EAAW,GAAGc,GAAO;AAC/B;AAEO,SAASC,GAAS;AAAA,EACvB,MAAA1E;AAAA,EACA,QAAAC;AAAA,EACA,QAAA2D,IAASxE;AAAA,EACT,QAAA0C,IAAS;AAAA,EACT,OAAAc,IAAQ;AAAA,EACR,SAAAJ;AAAA,EACA,cAAcC;AAAA,EACd,OAAAC;AAAA,EACA,MAAAmB,IAAO;AAAA,EACP,UAAAf,IAAW;AAAA,EACX,WAAAD;AACF,GAAe;AACb,QAAM1C,IAAMJ,EAAcC,GAAMC,CAAM,GAChCY,IAASxB,IAAOC,IAAM,GACtBwB,IAASgB,IAASxC,IAAM,GACxBwE,IAAU,KAAK,IAAI,GAAG3D,EAAI,IAAI,CAACL,MAAMA,EAAE,KAAK,MAAM,CAAC,GACnD6E,IAAO9D,IAAS,KAAK,IAAI,GAAGiD,CAAO,GACnCc,IAASD,IAAO,MAChBE,IAAO,KAAK,IAAI,GAAGD,IAASzE,EAAI,MAAM,GACtC,EAAE,KAAAK,EAAA,IAAQN,EAAOC,CAAG,GACpB4D,IAAU5D,EAAI,CAAC,EAAE;AAEvB,SACE,gBAAAsD;AAAA,IAAClB;AAAA,IAAA;AAAA,MACC,SAAAC;AAAA,MACA,WAAAC;AAAA,MACA,OAAAC;AAAA,MACA,MAAMf,EAASxB,CAAG;AAAA,MAClB,QAAA2B;AAAA,MACA,OAAAc;AAAA,MACA,WAAAC;AAAA,MACA,UAAAC;AAAA,MACA,SAAS,EAAE,KAAK,GAAG,KAAAtC,EAAA;AAAA,MACnB,QAAQuD,EAAQ,CAAC;AAAA,MACjB,OAAOA,EAAQA,EAAQ,SAAS,CAAC;AAAA,MAEhC,UAAA;AAAA,QAAAF,KAAQ,gBAAA9B,EAACF,KAAK,QAAAC,GAAgB;AAAA,QAC9B3B,EAAI;AAAA,UAAI,CAACL,GAAGkE,MACXlE,EAAE,KAAK,IAAI,CAACQ,GAAGS,MAAM;AACnB,kBAAMJ,IAAK,KAAK,IAAI,GAAGL,EAAE,CAAC,IAAIE,IAAOM,GAC/BgE,IAAIxF,IAAMyB,IAAI4D,KAAQA,IAAOC,KAAU,IAAIZ,IAAKa;AACtD,mBACE,gBAAA9C;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,GAAA+C;AAAA,gBACA,GAAGxF,IAAMwB,IAASH;AAAA,gBAClB,OAAOkE;AAAA,gBACP,QAAQ,KAAK,IAAI,GAAGlE,CAAC;AAAA,gBACrB,MAAMiD,EAAOI,IAAKJ,EAAO,MAAM;AAAA,gBAC/B,IAAI;AAAA,gBACJ,WAAU;AAAA,gBAEV,4BAAC,SAAA,EAAO,UAAA,GAAG9D,EAAE,OAAO,GAAGA,EAAE,IAAI,QAAQ,EAAE,GAAGQ,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAG;AAAA,cAAA;AAAA,cATnD,GAAG0D,CAAE,IAAIjD,CAAC;AAAA,YAAA;AAAA,UAYrB,CAAC;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as r, jsx as e } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as g, useId as v } from "react";
|
|
4
|
+
import * as m from "@radix-ui/react-checkbox";
|
|
5
|
+
import { Minus as k, Check as p } from "../../icons/index.js";
|
|
6
|
+
import { cn as i } from "../../lib/utils.js";
|
|
7
|
+
const N = g(
|
|
8
|
+
function({ className: f, label: c, description: s, error: t, hideLabel: u, id: x, disabled: o, ...d }, h) {
|
|
9
|
+
const b = v(), a = x ?? b, n = s ? `${a}-desc` : void 0, l = t ? `${a}-error` : void 0;
|
|
10
|
+
return /* @__PURE__ */ r("div", { className: i("flex flex-col gap-1", f), children: [
|
|
11
|
+
/* @__PURE__ */ r("div", { className: "flex items-start gap-2.5", children: [
|
|
12
|
+
/* @__PURE__ */ e(
|
|
13
|
+
m.Root,
|
|
14
|
+
{
|
|
15
|
+
ref: h,
|
|
16
|
+
id: a,
|
|
17
|
+
disabled: o,
|
|
18
|
+
"aria-describedby": l ?? n,
|
|
19
|
+
"aria-invalid": !!t || void 0,
|
|
20
|
+
className: i(
|
|
21
|
+
"peer mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-sm border",
|
|
22
|
+
"transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
|
|
23
|
+
"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
24
|
+
"data-[state=checked]:bg-accent data-[state=checked]:border-accent data-[state=checked]:text-on-accent",
|
|
25
|
+
"data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:text-on-accent",
|
|
26
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
27
|
+
t ? "border-danger" : "border-border-input"
|
|
28
|
+
),
|
|
29
|
+
...d,
|
|
30
|
+
children: /* @__PURE__ */ e(m.Indicator, { className: "flex items-center justify-center", children: d.checked === "indeterminate" ? /* @__PURE__ */ e(k, { className: "size-3", "aria-hidden": !0, strokeWidth: 3 }) : /* @__PURE__ */ e(p, { className: "size-3", "aria-hidden": !0, strokeWidth: 3 }) })
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
c && /* @__PURE__ */ r("div", { className: i("flex flex-col gap-0.5", u && "sr-only"), children: [
|
|
34
|
+
/* @__PURE__ */ e(
|
|
35
|
+
"label",
|
|
36
|
+
{
|
|
37
|
+
htmlFor: a,
|
|
38
|
+
className: i(
|
|
39
|
+
"text-sm text-foreground select-none",
|
|
40
|
+
o && "opacity-50 cursor-not-allowed"
|
|
41
|
+
),
|
|
42
|
+
children: c
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
s && /* @__PURE__ */ e("p", { id: n, className: "text-xs text-foreground-subtle", children: s })
|
|
46
|
+
] })
|
|
47
|
+
] }),
|
|
48
|
+
t && /* @__PURE__ */ e("p", { id: l, role: "alert", className: "text-xs text-danger-text", children: t })
|
|
49
|
+
] });
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
N.displayName = "Checkbox";
|
|
53
|
+
export {
|
|
54
|
+
N as Checkbox
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/ui/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, useId, type ComponentPropsWithoutRef, type ElementRef, type ReactNode } from 'react';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { Check, Minus } from '@/icons';\nimport { cn } from '@/lib/utils';\n\nexport interface CheckboxProps\n extends Omit<ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, 'asChild'> {\n /** Visible label rendered to the right of the box. */\n label?: ReactNode;\n /** Secondary description rendered below the label. */\n description?: ReactNode;\n /** Validation error message. */\n error?: ReactNode;\n /** Hide the label visually while keeping it in the a11y tree. */\n hideLabel?: boolean;\n}\n\n/**\n * Checkbox with optional inline label + description. Pass `checked=\"indeterminate\"`\n * for the indeterminate state — Radix renders a `Minus` icon automatically.\n *\n * @example Single\n * <Checkbox label=\"I agree to the terms\" checked={ok} onCheckedChange={setOk} />\n *\n * @example Tri-state header\n * <Checkbox aria-label=\"Select all\"\n * checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n * onCheckedChange={toggleAll} />\n *\n * @do Use indeterminate to summarise child rows in a table header.\n * @dont Use a Checkbox for mutually exclusive choices — use RadioGroup.\n */\nexport const Checkbox = forwardRef<ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox({ className, label, description, error, hideLabel, id, disabled, ...props }, ref) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const descId = description ? `${fieldId}-desc` : undefined;\n const errorId = error ? `${fieldId}-error` : undefined;\n\n return (\n <div className={cn('flex flex-col gap-1', className)}>\n <div className=\"flex items-start gap-2.5\">\n <CheckboxPrimitive.Root\n ref={ref}\n id={fieldId}\n disabled={disabled}\n aria-describedby={errorId ?? descId}\n aria-invalid={Boolean(error) || undefined}\n className={cn(\n 'peer mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-sm border',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent data-[state=checked]:text-on-accent',\n 'data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:text-on-accent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error ? 'border-danger' : 'border-border-input',\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center\">\n {props.checked === 'indeterminate' ? (\n <Minus className=\"size-3\" aria-hidden strokeWidth={3} />\n ) : (\n <Check className=\"size-3\" aria-hidden strokeWidth={3} />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n {label && (\n <div className={cn('flex flex-col gap-0.5', hideLabel && 'sr-only')}>\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-sm text-foreground select-none',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n >\n {label}\n </label>\n {description && (\n <p id={descId} className=\"text-xs text-foreground-subtle\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-xs text-danger-text\">\n {error}\n </p>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"names":["Checkbox","forwardRef","className","label","description","error","hideLabel","id","disabled","props","ref","autoId","useId","fieldId","descId","errorId","cn","jsxs","jsx","CheckboxPrimitive","Minus","Check"],"mappings":";;;;;;AAkCO,MAAMA,IAAWC;AAAA,EACtB,SAAkB,EAAE,WAAAC,GAAW,OAAAC,GAAO,aAAAC,GAAa,OAAAC,GAAO,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,GAAK;AAClG,UAAMC,IAASC,EAAA,GACTC,IAAUN,KAAMI,GAChBG,IAASV,IAAc,GAAGS,CAAO,UAAU,QAC3CE,IAAUV,IAAQ,GAAGQ,CAAO,WAAW;AAE7C,6BACG,OAAA,EAAI,WAAWG,EAAG,uBAAuBd,CAAS,GACjD,UAAA;AAAA,MAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAACC,EAAkB;AAAA,UAAlB;AAAA,YACC,KAAAT;AAAA,YACA,IAAIG;AAAA,YACJ,UAAAL;AAAA,YACA,oBAAkBO,KAAWD;AAAA,YAC7B,gBAAc,EAAQT,KAAU;AAAA,YAChC,WAAWW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACAX,IAAQ,kBAAkB;AAAA,YAAA;AAAA,YAE3B,GAAGI;AAAA,YAEJ,UAAA,gBAAAS,EAACC,EAAkB,WAAlB,EAA4B,WAAU,oCACpC,UAAAV,EAAM,YAAY,kBACjB,gBAAAS,EAACE,GAAA,EAAM,WAAU,UAAS,eAAW,IAAC,aAAa,EAAA,CAAG,IAEtD,gBAAAF,EAACG,GAAA,EAAM,WAAU,UAAS,eAAW,IAAC,aAAa,EAAA,CAAG,EAAA,CAE1D;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDlB,uBACE,OAAA,EAAI,WAAWa,EAAG,yBAAyBV,KAAa,SAAS,GAChE,UAAA;AAAA,UAAA,gBAAAY;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASL;AAAA,cACT,WAAWG;AAAA,gBACT;AAAA,gBACAR,KAAY;AAAA,cAAA;AAAA,cAGb,UAAAL;AAAA,YAAA;AAAA,UAAA;AAAA,UAEFC,KACC,gBAAAc,EAAC,KAAA,EAAE,IAAIJ,GAAQ,WAAU,kCACtB,UAAAV,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GAEJ;AAAA,MACCC,uBACE,KAAA,EAAE,IAAIU,GAAS,MAAK,SAAQ,WAAU,4BACpC,UAAAV,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAL,EAAS,cAAc;"}
|
|
@@ -17,6 +17,11 @@ export interface ComboboxProps {
|
|
|
17
17
|
* Use for server-side search.
|
|
18
18
|
*/
|
|
19
19
|
loadOptions?: (query: string) => Promise<ComboboxOption[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Label to show for a preset `value` in `loadOptions` mode before the
|
|
22
|
+
* first search has resolved (the component has no option list yet).
|
|
23
|
+
*/
|
|
24
|
+
selectedLabel?: string;
|
|
20
25
|
/** Visible label above the field. */
|
|
21
26
|
label?: ReactNode;
|
|
22
27
|
/** Hint below the field. Hidden when `error` is set. */
|
|
@@ -35,6 +40,8 @@ export interface ComboboxProps {
|
|
|
35
40
|
disabled?: boolean;
|
|
36
41
|
/** Field size, matches Input. */
|
|
37
42
|
size?: 'sm' | 'md' | 'lg';
|
|
43
|
+
/** Consumer-supplied id for the trigger (label association). */
|
|
44
|
+
id?: string;
|
|
38
45
|
className?: string;
|
|
39
46
|
}
|
|
40
47
|
/**
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as r, jsx as e } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as O, useState as i, useMemo as R, useEffect as ee, useCallback as te } from "react";
|
|
4
|
+
import * as p from "@radix-ui/react-popover";
|
|
5
|
+
import { Command as d } from "cmdk";
|
|
6
|
+
import { X as re, ChevronsUpDown as oe, Loader2 as ae, Check as se } from "../../icons/index.js";
|
|
7
|
+
import { cn as c } from "../../lib/utils.js";
|
|
8
|
+
import { useStrings as le } from "../../hooks/use-strings.js";
|
|
9
|
+
import { useFieldIds as ne } from "../../hooks/use-field-ids.js";
|
|
10
|
+
import { IconButton as ie } from "./IconButton.js";
|
|
11
|
+
const de = O(function({
|
|
12
|
+
value: o,
|
|
13
|
+
onChange: x,
|
|
14
|
+
options: C,
|
|
15
|
+
loadOptions: a,
|
|
16
|
+
selectedLabel: g,
|
|
17
|
+
label: I,
|
|
18
|
+
helperText: h,
|
|
19
|
+
error: v,
|
|
20
|
+
placeholder: H,
|
|
21
|
+
searchPlaceholder: L,
|
|
22
|
+
emptyText: q,
|
|
23
|
+
clearable: P = !0,
|
|
24
|
+
disabled: z,
|
|
25
|
+
size: u = "md",
|
|
26
|
+
id: D,
|
|
27
|
+
className: M
|
|
28
|
+
}, Q) {
|
|
29
|
+
const m = le(), T = H ?? m.combobox.placeholder, U = L ?? m.combobox.searchPlaceholder, V = q ?? m.combobox.empty, N = !!v, { fieldId: y, helperId: X, errorId: $, describedBy: A } = ne(D, {
|
|
30
|
+
hasHelper: !!h,
|
|
31
|
+
hasError: N
|
|
32
|
+
}), k = `${y}-list`, [f, S] = i(!1), [w, G] = i(""), [B, J] = i([]), [E, j] = i(!1), [l, F] = i(null), b = R(() => a ? B : C ?? [], [a, B, C]);
|
|
33
|
+
ee(() => {
|
|
34
|
+
if (!a || !f) return;
|
|
35
|
+
let t = !1;
|
|
36
|
+
return j(!0), a(w).then((n) => {
|
|
37
|
+
t || J(n);
|
|
38
|
+
}).finally(() => {
|
|
39
|
+
t || j(!1);
|
|
40
|
+
}), () => {
|
|
41
|
+
t = !0;
|
|
42
|
+
};
|
|
43
|
+
}, [w, f, a]);
|
|
44
|
+
const s = R(() => {
|
|
45
|
+
if (o == null) return null;
|
|
46
|
+
const t = b.find((n) => n.value === o);
|
|
47
|
+
return t || ((l == null ? void 0 : l.value) === o ? l : g !== void 0 ? { value: o, label: g } : null);
|
|
48
|
+
}, [b, o, l, g]), K = u === "sm" ? "h-8" : u === "lg" ? "h-10" : "h-9", W = u === "sm" ? "px-2.5" : u === "lg" ? "px-3.5" : "px-3", Y = P ? "pr-14" : "pr-9", Z = te(() => {
|
|
49
|
+
F(null), x(null);
|
|
50
|
+
}, [x]);
|
|
51
|
+
return /* @__PURE__ */ r("div", { ref: Q, className: c("flex flex-col gap-1.5", M), children: [
|
|
52
|
+
I && /* @__PURE__ */ e("label", { htmlFor: y, className: "text-foreground text-sm font-medium", children: I }),
|
|
53
|
+
/* @__PURE__ */ r(p.Root, { open: f, onOpenChange: S, children: [
|
|
54
|
+
/* @__PURE__ */ r("div", { className: "relative w-full", children: [
|
|
55
|
+
/* @__PURE__ */ e(p.Trigger, { asChild: !0, children: /* @__PURE__ */ e(
|
|
56
|
+
"button",
|
|
57
|
+
{
|
|
58
|
+
id: y,
|
|
59
|
+
type: "button",
|
|
60
|
+
role: "combobox",
|
|
61
|
+
"aria-expanded": f,
|
|
62
|
+
"aria-haspopup": "listbox",
|
|
63
|
+
"aria-controls": k,
|
|
64
|
+
"aria-invalid": N || void 0,
|
|
65
|
+
"aria-describedby": A,
|
|
66
|
+
disabled: z,
|
|
67
|
+
className: c(
|
|
68
|
+
"bg-card text-foreground inline-flex w-full items-center justify-between gap-2 rounded-md border text-sm",
|
|
69
|
+
"transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
|
|
70
|
+
"focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
71
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
72
|
+
K,
|
|
73
|
+
W,
|
|
74
|
+
Y,
|
|
75
|
+
N ? "border-danger focus-visible:border-danger focus-visible:ring-danger" : "border-border focus-visible:border-accent focus-visible:ring-ring"
|
|
76
|
+
),
|
|
77
|
+
children: /* @__PURE__ */ e(
|
|
78
|
+
"span",
|
|
79
|
+
{
|
|
80
|
+
className: c("truncate", !s && "text-foreground-subtle"),
|
|
81
|
+
title: s ? s.label : void 0,
|
|
82
|
+
children: s ? s.label : T
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
) }),
|
|
87
|
+
/* @__PURE__ */ r("span", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center gap-0.5 pr-2", children: [
|
|
88
|
+
P && s && !z && /* @__PURE__ */ e(
|
|
89
|
+
ie,
|
|
90
|
+
{
|
|
91
|
+
size: "sm",
|
|
92
|
+
variant: "ghost",
|
|
93
|
+
"aria-label": m.combobox.clear,
|
|
94
|
+
icon: /* @__PURE__ */ e(re, {}),
|
|
95
|
+
onClick: Z,
|
|
96
|
+
className: "text-foreground-subtle hover:text-foreground pointer-events-auto size-6"
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ e(oe, { className: "text-foreground-subtle size-4", "aria-hidden": !0 })
|
|
100
|
+
] })
|
|
101
|
+
] }),
|
|
102
|
+
/* @__PURE__ */ e(p.Portal, { children: /* @__PURE__ */ e(
|
|
103
|
+
p.Content,
|
|
104
|
+
{
|
|
105
|
+
align: "start",
|
|
106
|
+
sideOffset: 4,
|
|
107
|
+
className: c(
|
|
108
|
+
"border-border bg-popover text-popover-foreground z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] overflow-hidden rounded-lg border shadow-md",
|
|
109
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
110
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
111
|
+
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95"
|
|
112
|
+
),
|
|
113
|
+
children: /* @__PURE__ */ r(d, { shouldFilter: !a, className: "flex h-full w-full flex-col", children: [
|
|
114
|
+
/* @__PURE__ */ r("div", { className: "border-border flex items-center border-b px-3", children: [
|
|
115
|
+
/* @__PURE__ */ e(
|
|
116
|
+
d.Input,
|
|
117
|
+
{
|
|
118
|
+
value: w,
|
|
119
|
+
onValueChange: G,
|
|
120
|
+
placeholder: U,
|
|
121
|
+
className: "placeholder:text-foreground-subtle flex h-9 w-full bg-transparent py-2 text-sm outline-none"
|
|
122
|
+
}
|
|
123
|
+
),
|
|
124
|
+
E && /* @__PURE__ */ e(ae, { className: "text-foreground-subtle size-4 animate-spin", "aria-hidden": !0 })
|
|
125
|
+
] }),
|
|
126
|
+
/* @__PURE__ */ r(d.List, { id: k, className: "max-h-64 overflow-y-auto p-1", children: [
|
|
127
|
+
b.map((t) => {
|
|
128
|
+
const n = t.value === o;
|
|
129
|
+
return /* @__PURE__ */ r(
|
|
130
|
+
d.Item,
|
|
131
|
+
{
|
|
132
|
+
value: t.value,
|
|
133
|
+
disabled: t.disabled,
|
|
134
|
+
onSelect: (_) => {
|
|
135
|
+
F(t), x(_), S(!1);
|
|
136
|
+
},
|
|
137
|
+
className: c(
|
|
138
|
+
"text-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm",
|
|
139
|
+
"data-[selected=true]:bg-background-muted",
|
|
140
|
+
"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50"
|
|
141
|
+
),
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ e("span", { className: "flex-1", children: t.label }),
|
|
144
|
+
t.description && /* @__PURE__ */ e("span", { className: "text-foreground-subtle text-xs", children: t.description }),
|
|
145
|
+
n && /* @__PURE__ */ e(se, { className: "text-accent size-4", "aria-hidden": !0 })
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
t.value
|
|
149
|
+
);
|
|
150
|
+
}),
|
|
151
|
+
!E && b.length === 0 && /* @__PURE__ */ e(d.Empty, { className: "text-foreground-subtle px-2 py-6 text-center text-sm", children: V })
|
|
152
|
+
] })
|
|
153
|
+
] })
|
|
154
|
+
}
|
|
155
|
+
) })
|
|
156
|
+
] }),
|
|
157
|
+
v ? /* @__PURE__ */ e("p", { id: $, role: "alert", className: "text-danger-text text-xs", children: v }) : h ? /* @__PURE__ */ e("p", { id: X, className: "text-foreground-subtle text-xs", children: h }) : null
|
|
158
|
+
] });
|
|
159
|
+
});
|
|
160
|
+
de.displayName = "Combobox";
|
|
161
|
+
export {
|
|
162
|
+
de as Combobox
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=Combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../../src/components/ui/Combobox.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, useCallback, useEffect, useMemo, useState, type ReactNode } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Check, ChevronsUpDown, Loader2, X } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { useFieldIds } from '@/hooks/use-field-ids';\nimport { IconButton } from './IconButton';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n /** Currently selected value (controlled). */\n value: string | null;\n /** Called when a value is picked or cleared. */\n onChange: (value: string | null) => void;\n /** Static options. Ignored if `loadOptions` is provided. */\n options?: ComboboxOption[];\n /**\n * Async loader called with the current query each time it changes.\n * Use for server-side search.\n */\n loadOptions?: (query: string) => Promise<ComboboxOption[]>;\n /**\n * Label to show for a preset `value` in `loadOptions` mode before the\n * first search has resolved (the component has no option list yet).\n */\n selectedLabel?: string;\n /** Visible label above the field. */\n label?: ReactNode;\n /** Hint below the field. Hidden when `error` is set. */\n helperText?: ReactNode;\n /** Validation error. */\n error?: ReactNode;\n /** Placeholder shown when no value is selected. */\n placeholder?: string;\n /** Search placeholder inside the popover. */\n searchPlaceholder?: string;\n /** Empty state copy when nothing matches. */\n emptyText?: string;\n /** Allow clearing the selection with an inline ×. */\n clearable?: boolean;\n /** Disable the entire field. */\n disabled?: boolean;\n /** Field size, matches Input. */\n size?: 'sm' | 'md' | 'lg';\n /** Consumer-supplied id for the trigger (label association). */\n id?: string;\n className?: string;\n}\n\n/**\n * Single-select with typeahead. Use `options` for client-side filtering or\n * `loadOptions` for server-side search.\n *\n * @example Client-side\n * <Combobox label=\"Country\" options={countries} value={c} onChange={setC} />\n *\n * @example Server-side\n * <Combobox label=\"Assignee\"\n * value={user}\n * onChange={setUser}\n * loadOptions={async (q) => api.searchUsers(q)} />\n *\n * @do Use Combobox over Select for >12 options or when the user is expected\n * to know what they want.\n * @dont Re-query on every keystroke without debouncing — pass a debounced\n * `loadOptions` to avoid hammering the server.\n */\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(function Combobox(\n {\n value,\n onChange,\n options,\n loadOptions,\n selectedLabel,\n label,\n helperText,\n error,\n placeholder: placeholderProp,\n searchPlaceholder: searchPlaceholderProp,\n emptyText: emptyTextProp,\n clearable = true,\n disabled,\n size = 'md',\n id,\n className,\n },\n ref,\n) {\n const strings = useStrings();\n const placeholder = placeholderProp ?? strings.combobox.placeholder;\n const searchPlaceholder = searchPlaceholderProp ?? strings.combobox.searchPlaceholder;\n const emptyText = emptyTextProp ?? strings.combobox.empty;\n const isError = Boolean(error);\n const { fieldId, helperId, errorId, describedBy } = useFieldIds(id, {\n hasHelper: Boolean(helperText),\n hasError: isError,\n });\n const listId = `${fieldId}-list`;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [loaded, setLoaded] = useState<ComboboxOption[]>([]);\n const [loading, setLoading] = useState(false);\n // In async mode the option list only exists after the first search, so the\n // chosen option is remembered here to keep its label on the trigger.\n const [selectedOption, setSelectedOption] = useState<ComboboxOption | null>(null);\n\n // Resolve options: static or async-loaded.\n const items = useMemo(() => (loadOptions ? loaded : (options ?? [])), [loadOptions, loaded, options]);\n\n useEffect(() => {\n if (!loadOptions || !open) return;\n let cancelled = false;\n setLoading(true);\n loadOptions(query)\n .then((res) => {\n if (!cancelled) setLoaded(res);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [query, open, loadOptions]);\n\n const selected = useMemo<ComboboxOption | null>(() => {\n if (value === null || value === undefined) return null;\n const fromItems = items.find((o) => o.value === value);\n if (fromItems) return fromItems;\n if (selectedOption?.value === value) return selectedOption;\n if (selectedLabel !== undefined) return { value, label: selectedLabel };\n return null;\n }, [items, value, selectedOption, selectedLabel]);\n\n const triggerHeight = size === 'sm' ? 'h-8' : size === 'lg' ? 'h-10' : 'h-9';\n const triggerPadding = size === 'sm' ? 'px-2.5' : size === 'lg' ? 'px-3.5' : 'px-3';\n // Leave room on the right for the clear button + chevron.\n const triggerPaddingRight = clearable ? 'pr-14' : 'pr-9';\n\n const handleClear = useCallback(() => {\n setSelectedOption(null);\n onChange(null);\n }, [onChange]);\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <label htmlFor={fieldId} className=\"text-foreground text-sm font-medium\">\n {label}\n </label>\n )}\n\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <div className=\"relative w-full\">\n <PopoverPrimitive.Trigger asChild>\n <button\n id={fieldId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-invalid={isError || undefined}\n aria-describedby={describedBy}\n disabled={disabled}\n className={cn(\n 'bg-card text-foreground inline-flex w-full items-center justify-between gap-2 rounded-md border text-sm',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n triggerHeight,\n triggerPadding,\n triggerPaddingRight,\n isError\n ? 'border-danger focus-visible:border-danger focus-visible:ring-danger'\n : 'border-border focus-visible:border-accent focus-visible:ring-ring',\n )}\n >\n <span\n className={cn('truncate', !selected && 'text-foreground-subtle')}\n title={selected ? selected.label : undefined}\n >\n {selected ? selected.label : placeholder}\n </span>\n </button>\n </PopoverPrimitive.Trigger>\n\n {/* Controls sit outside the trigger: a button inside a button is invalid HTML. */}\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center gap-0.5 pr-2\">\n {clearable && selected && !disabled && (\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n aria-label={strings.combobox.clear}\n icon={<X />}\n onClick={handleClear}\n className=\"text-foreground-subtle hover:text-foreground pointer-events-auto size-6\"\n />\n )}\n <ChevronsUpDown className=\"text-foreground-subtle size-4\" aria-hidden />\n </span>\n </div>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className={cn(\n 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] overflow-hidden rounded-lg border shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n )}\n >\n <CommandPrimitive shouldFilter={!loadOptions} className=\"flex h-full w-full flex-col\">\n <div className=\"border-border flex items-center border-b px-3\">\n <CommandPrimitive.Input\n value={query}\n onValueChange={setQuery}\n placeholder={searchPlaceholder}\n className=\"placeholder:text-foreground-subtle flex h-9 w-full bg-transparent py-2 text-sm outline-none\"\n />\n {loading && (\n <Loader2 className=\"text-foreground-subtle size-4 animate-spin\" aria-hidden />\n )}\n </div>\n <CommandPrimitive.List id={listId} className=\"max-h-64 overflow-y-auto p-1\">\n {items.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <CommandPrimitive.Item\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled}\n onSelect={(v) => {\n setSelectedOption(opt);\n onChange(v);\n setOpen(false);\n }}\n className={cn(\n 'text-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm',\n 'data-[selected=true]:bg-background-muted',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50',\n )}\n >\n <span className=\"flex-1\">{opt.label}</span>\n {opt.description && (\n <span className=\"text-foreground-subtle text-xs\">{opt.description}</span>\n )}\n {isSelected && <Check className=\"text-accent size-4\" aria-hidden />}\n </CommandPrimitive.Item>\n );\n })}\n {!loading && items.length === 0 && (\n <CommandPrimitive.Empty className=\"text-foreground-subtle px-2 py-6 text-center text-sm\">\n {emptyText}\n </CommandPrimitive.Empty>\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {error ? (\n <p id={errorId} role=\"alert\" className=\"text-danger-text text-xs\">\n {error}\n </p>\n ) : helperText ? (\n <p id={helperId} className=\"text-foreground-subtle text-xs\">\n {helperText}\n </p>\n ) : null}\n </div>\n );\n});\n\nCombobox.displayName = 'Combobox';\n"],"names":["Combobox","forwardRef","value","onChange","options","loadOptions","selectedLabel","label","helperText","error","placeholderProp","searchPlaceholderProp","emptyTextProp","clearable","disabled","size","id","className","ref","strings","useStrings","placeholder","searchPlaceholder","emptyText","isError","fieldId","helperId","errorId","describedBy","useFieldIds","listId","open","setOpen","useState","query","setQuery","loaded","setLoaded","loading","setLoading","selectedOption","setSelectedOption","items","useMemo","useEffect","cancelled","res","selected","fromItems","o","triggerHeight","triggerPadding","triggerPaddingRight","handleClear","useCallback","cn","PopoverPrimitive","jsxs","jsx","IconButton","X","ChevronsUpDown","CommandPrimitive","Loader2","opt","isSelected","v","Check"],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export declare const CommandInput: import('react').ForwardRefExoticComponent<Omi
|
|
|
20
20
|
ref?: React.Ref<HTMLInputElement>;
|
|
21
21
|
} & {
|
|
22
22
|
asChild?: boolean;
|
|
23
|
-
}, "key" | "asChild" | keyof import('react').InputHTMLAttributes<HTMLInputElement>>, "
|
|
23
|
+
}, "key" | "asChild" | keyof import('react').InputHTMLAttributes<HTMLInputElement>>, "value" | "type" | "onChange"> & {
|
|
24
24
|
value?: string;
|
|
25
25
|
onValueChange?: (search: string) => void;
|
|
26
26
|
} & import('react').RefAttributes<HTMLInputElement>, "ref"> & import('react').RefAttributes<HTMLInputElement>>;
|
|
@@ -46,7 +46,7 @@ export declare const CommandGroup: import('react').ForwardRefExoticComponent<Omi
|
|
|
46
46
|
ref?: React.Ref<HTMLDivElement>;
|
|
47
47
|
} & {
|
|
48
48
|
asChild?: boolean;
|
|
49
|
-
}, "key" | keyof import('react').HTMLAttributes<HTMLDivElement> | "asChild">, "
|
|
49
|
+
}, "key" | keyof import('react').HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "heading"> & {
|
|
50
50
|
heading?: React.ReactNode;
|
|
51
51
|
value?: string;
|
|
52
52
|
forceMount?: boolean;
|
|
@@ -64,7 +64,7 @@ export declare const CommandItem: import('react').ForwardRefExoticComponent<Omit
|
|
|
64
64
|
ref?: React.Ref<HTMLDivElement>;
|
|
65
65
|
} & {
|
|
66
66
|
asChild?: boolean;
|
|
67
|
-
}, "key" | keyof import('react').HTMLAttributes<HTMLDivElement> | "asChild">, "
|
|
67
|
+
}, "key" | keyof import('react').HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "onSelect" | "disabled"> & {
|
|
68
68
|
disabled?: boolean;
|
|
69
69
|
onSelect?: (value: string) => void;
|
|
70
70
|
value?: string;
|