@craftzbay/ui 0.9.0 → 0.11.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 +82 -10
- package/dist-lib/__tests__/helpers/color.d.ts +9 -0
- package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
- package/dist-lib/components/ui/Accordion.js +71 -0
- package/dist-lib/components/ui/Accordion.js.map +1 -0
- package/dist-lib/components/ui/Alert.d.ts +17 -1
- package/dist-lib/components/ui/Alert.js +79 -0
- package/dist-lib/components/ui/Alert.js.map +1 -0
- package/dist-lib/components/ui/Avatar.d.ts +3 -3
- package/dist-lib/components/ui/Avatar.js +94 -0
- package/dist-lib/components/ui/Avatar.js.map +1 -0
- package/dist-lib/components/ui/Badge.d.ts +4 -2
- package/dist-lib/components/ui/Badge.js +76 -0
- package/dist-lib/components/ui/Badge.js.map +1 -0
- package/dist-lib/components/ui/Breadcrumbs.d.ts +2 -0
- package/dist-lib/components/ui/Breadcrumbs.js +52 -0
- package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
- package/dist-lib/components/ui/Button.d.ts +6 -4
- package/dist-lib/components/ui/Button.js +131 -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 +139 -0
- package/dist-lib/components/ui/Calendar.js.map +1 -0
- package/dist-lib/components/ui/Card.d.ts +3 -1
- package/dist-lib/components/ui/Card.js +97 -0
- package/dist-lib/components/ui/Card.js.map +1 -0
- package/dist-lib/components/ui/Carousel.d.ts +11 -7
- package/dist-lib/components/ui/Carousel.js +174 -0
- package/dist-lib/components/ui/Carousel.js.map +1 -0
- package/dist-lib/components/ui/Chart.d.ts +68 -7
- package/dist-lib/components/ui/Chart.js +487 -0
- package/dist-lib/components/ui/Chart.js.map +1 -0
- package/dist-lib/components/ui/Checkbox.js +70 -0
- package/dist-lib/components/ui/Checkbox.js.map +1 -0
- package/dist-lib/components/ui/Combobox.d.ts +9 -0
- package/dist-lib/components/ui/Combobox.js +195 -0
- package/dist-lib/components/ui/Combobox.js.map +1 -0
- package/dist-lib/components/ui/CommandPalette.d.ts +9 -6
- package/dist-lib/components/ui/CommandPalette.js +179 -0
- package/dist-lib/components/ui/CommandPalette.js.map +1 -0
- package/dist-lib/components/ui/ContextMenu.d.ts +7 -2
- package/dist-lib/components/ui/ContextMenu.js +165 -0
- package/dist-lib/components/ui/ContextMenu.js.map +1 -0
- package/dist-lib/components/ui/DataGrid.d.ts +17 -4
- package/dist-lib/components/ui/DataGrid.js +99 -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 +193 -0
- package/dist-lib/components/ui/DatePicker.js.map +1 -0
- package/dist-lib/components/ui/DesignSystemProvider.d.ts +102 -41
- package/dist-lib/components/ui/DesignSystemProvider.js +135 -0
- package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
- package/dist-lib/components/ui/Dialog.d.ts +19 -4
- package/dist-lib/components/ui/Dialog.js +165 -0
- package/dist-lib/components/ui/Dialog.js.map +1 -0
- package/dist-lib/components/ui/Drawer.d.ts +23 -2
- package/dist-lib/components/ui/Drawer.js +132 -0
- package/dist-lib/components/ui/Drawer.js.map +1 -0
- package/dist-lib/components/ui/DropdownMenu.js +169 -0
- package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
- package/dist-lib/components/ui/EmptyState.d.ts +2 -0
- package/dist-lib/components/ui/EmptyState.js +46 -0
- package/dist-lib/components/ui/EmptyState.js.map +1 -0
- package/dist-lib/components/ui/ErrorState.d.ts +13 -2
- package/dist-lib/components/ui/ErrorState.js +69 -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 +111 -0
- package/dist-lib/components/ui/FileUpload.js.map +1 -0
- package/dist-lib/components/ui/Form.d.ts +16 -2
- package/dist-lib/components/ui/Form.js +131 -0
- package/dist-lib/components/ui/Form.js.map +1 -0
- package/dist-lib/components/ui/Icon.d.ts +1 -1
- package/dist-lib/components/ui/Icon.js +32 -0
- package/dist-lib/components/ui/Icon.js.map +1 -0
- package/dist-lib/components/ui/IconButton.d.ts +3 -3
- package/dist-lib/components/ui/IconButton.js +64 -0
- package/dist-lib/components/ui/IconButton.js.map +1 -0
- package/dist-lib/components/ui/Input.d.ts +9 -4
- package/dist-lib/components/ui/Input.js +149 -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 +210 -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 +153 -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.d.ts +3 -3
- package/dist-lib/components/ui/Progress.js +100 -0
- package/dist-lib/components/ui/Progress.js.map +1 -0
- package/dist-lib/components/ui/RadioGroup.d.ts +1 -1
- package/dist-lib/components/ui/RadioGroup.js +81 -0
- package/dist-lib/components/ui/RadioGroup.js.map +1 -0
- package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
- package/dist-lib/components/ui/RelativeTime.js +31 -0
- package/dist-lib/components/ui/RelativeTime.js.map +1 -0
- package/dist-lib/components/ui/ScrollArea.d.ts +9 -1
- package/dist-lib/components/ui/ScrollArea.js +60 -0
- package/dist-lib/components/ui/ScrollArea.js.map +1 -0
- package/dist-lib/components/ui/Select.d.ts +6 -1
- package/dist-lib/components/ui/Select.js +139 -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 +10 -1
- package/dist-lib/components/ui/Sheet.js +136 -0
- package/dist-lib/components/ui/Sheet.js.map +1 -0
- package/dist-lib/components/ui/Sidebar.d.ts +29 -14
- package/dist-lib/components/ui/Sidebar.js +212 -0
- package/dist-lib/components/ui/Sidebar.js.map +1 -0
- package/dist-lib/components/ui/Skeleton.d.ts +13 -2
- package/dist-lib/components/ui/Skeleton.js +29 -0
- package/dist-lib/components/ui/Skeleton.js.map +1 -0
- package/dist-lib/components/ui/Slider.js +64 -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 +57 -0
- package/dist-lib/components/ui/Snackbar.js.map +1 -0
- package/dist-lib/components/ui/Spinner.js +54 -0
- package/dist-lib/components/ui/Spinner.js.map +1 -0
- package/dist-lib/components/ui/Stepper.d.ts +6 -0
- package/dist-lib/components/ui/Stepper.js +111 -0
- package/dist-lib/components/ui/Stepper.js.map +1 -0
- package/dist-lib/components/ui/Switch.js +80 -0
- package/dist-lib/components/ui/Switch.js.map +1 -0
- package/dist-lib/components/ui/Table.d.ts +41 -5
- package/dist-lib/components/ui/Table.js +179 -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 +91 -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 +88 -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 +56 -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 +158 -0
- package/dist-lib/components/ui/Toast.js.map +1 -0
- package/dist-lib/components/ui/Tooltip.d.ts +4 -1
- package/dist-lib/components/ui/Tooltip.js +60 -0
- package/dist-lib/components/ui/Tooltip.js.map +1 -0
- package/dist-lib/components/ui/TopNav.d.ts +7 -3
- package/dist-lib/components/ui/TopNav.js +62 -0
- package/dist-lib/components/ui/TopNav.js.map +1 -0
- package/dist-lib/components/ui/Tree.d.ts +34 -7
- package/dist-lib/components/ui/Tree.js +170 -0
- package/dist-lib/components/ui/Tree.js.map +1 -0
- package/dist-lib/hooks/use-debounce.d.ts +19 -0
- package/dist-lib/hooks/use-debounce.js +36 -0
- package/dist-lib/hooks/use-debounce.js.map +1 -0
- package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
- package/dist-lib/hooks/use-delayed-loading.js +20 -0
- package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
- package/dist-lib/hooks/use-field-ids.d.ts +30 -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.d.ts +3 -1
- package/dist-lib/hooks/use-media-query.js +22 -0
- package/dist-lib/hooks/use-media-query.js.map +1 -0
- package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
- package/dist-lib/hooks/use-modifier-key.js +19 -0
- package/dist-lib/hooks/use-modifier-key.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.d.ts +7 -2
- package/dist-lib/hooks/use-toast.js +67 -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 +80 -88
- package/dist-lib/icons/index.js +163 -0
- package/dist-lib/icons/index.js.map +1 -0
- package/dist-lib/illustrations/index.d.ts +1 -0
- package/dist-lib/illustrations/index.js +114 -0
- package/dist-lib/illustrations/index.js.map +1 -0
- package/dist-lib/index.d.ts +68 -59
- package/dist-lib/index.js +288 -4530
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/lib/format.d.ts +65 -0
- package/dist-lib/lib/format.js +95 -0
- package/dist-lib/lib/format.js.map +1 -0
- package/dist-lib/lib/return-focus.d.ts +11 -0
- package/dist-lib/lib/return-focus.js +12 -0
- package/dist-lib/lib/return-focus.js.map +1 -0
- package/dist-lib/lib/strings.d.ts +190 -0
- package/dist-lib/lib/strings.js +141 -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 +115 -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 +840 -0
- package/package.json +38 -8
- package/dist-lib/index.cjs +0 -8
- package/dist-lib/index.cjs.map +0 -1
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as s, jsxs as $, Fragment as U } from "react/jsx-runtime";
|
|
3
|
+
import { useId as oe, useState as K, useRef as ae, useCallback as se, useEffect as ie, useLayoutEffect as ce } from "react";
|
|
4
|
+
import { cn as w } from "../../lib/utils.js";
|
|
5
|
+
import { useStrings as X } from "../../hooks/use-strings.js";
|
|
6
|
+
import { formatString as z } from "../../lib/strings.js";
|
|
7
|
+
import { Skeleton as le } from "./Skeleton.js";
|
|
8
|
+
const Ie = {
|
|
9
|
+
summary: ({ name: e, count: n, min: r, max: t, lastX: o, lastY: a }) => `${e}: ${n} points, min ${r}, max ${t}, last ${o}: ${a}`,
|
|
10
|
+
point: (e, n, r) => `${e ? `${e} — ` : ""}${n}: ${r}`,
|
|
11
|
+
series: (e, n) => `${e}, ${n} points. Use arrow keys to move between points.`
|
|
12
|
+
};
|
|
13
|
+
function V(e) {
|
|
14
|
+
return {
|
|
15
|
+
summary: ({ name: n, count: r, min: t, max: o, lastX: a, lastY: i }) => z(e.summary, { name: n, count: r, min: t, max: o, x: a, y: i }),
|
|
16
|
+
point: (n, r, t) => (n ? `${n} — ` : "") + z(e.point, { x: r, y: t }),
|
|
17
|
+
series: (n, r) => z(e.seriesNav, { name: n, count: r })
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const q = [
|
|
21
|
+
"var(--chart-1)",
|
|
22
|
+
"var(--chart-2)",
|
|
23
|
+
"var(--chart-3)",
|
|
24
|
+
"var(--chart-4)",
|
|
25
|
+
"var(--chart-5)",
|
|
26
|
+
"var(--chart-6)"
|
|
27
|
+
], de = 600, S = 6;
|
|
28
|
+
function ue() {
|
|
29
|
+
const e = ae(null), [n, r] = K(0);
|
|
30
|
+
return (typeof window > "u" ? ie : ce)(() => {
|
|
31
|
+
const o = e.current;
|
|
32
|
+
if (!o) return;
|
|
33
|
+
const a = () => r(o.clientWidth);
|
|
34
|
+
if (a(), typeof ResizeObserver > "u") return;
|
|
35
|
+
const i = new ResizeObserver(a);
|
|
36
|
+
return i.observe(o), () => i.disconnect();
|
|
37
|
+
}, []), { ref: e, width: n || de };
|
|
38
|
+
}
|
|
39
|
+
const he = 5;
|
|
40
|
+
function fe(e) {
|
|
41
|
+
const n = Math.abs(e), r = (t, o) => `${(Math.round(t * 10) / 10).toString()}${o}`;
|
|
42
|
+
return n >= 1e9 ? r(e / 1e9, "B") : n >= 1e6 ? r(e / 1e6, "M") : n >= 1e3 ? r(e / 1e3, "K") : Number.isInteger(e) ? String(e) : (Math.round(e * 100) / 100).toString();
|
|
43
|
+
}
|
|
44
|
+
function me(e) {
|
|
45
|
+
if (e <= 0) return 1;
|
|
46
|
+
const r = 10 ** Math.floor(Math.log10(e)), t = e / r;
|
|
47
|
+
return (t <= 1 ? 1 : t <= 2 ? 2 : t <= 2.5 ? 2.5 : t <= 5 ? 5 : 10) * r;
|
|
48
|
+
}
|
|
49
|
+
function xe(e, n, r = he) {
|
|
50
|
+
n === e && (n = e + 1);
|
|
51
|
+
const t = me((n - e) / Math.max(1, r - 1)), o = Math.floor(e / t) * t, a = Math.ceil(n / t) * t, i = [];
|
|
52
|
+
for (let c = a; c >= o - t / 2; c -= t) i.push(Number(c.toFixed(10)));
|
|
53
|
+
return { min: o, max: a, ticks: i };
|
|
54
|
+
}
|
|
55
|
+
function J(e, n) {
|
|
56
|
+
return n && n.length ? n : [{ data: e ?? [] }];
|
|
57
|
+
}
|
|
58
|
+
const k = (e) => typeof e == "number";
|
|
59
|
+
function Q(e, n = !0) {
|
|
60
|
+
const r = e.flatMap((f) => f.data.map((u) => u.y).filter(k)), t = n ? Math.min(0, ...r) : Math.min(...r), o = Math.max(...r, n ? 1 : -1 / 0), { min: a, max: i, ticks: c } = xe(
|
|
61
|
+
Number.isFinite(t) ? t : 0,
|
|
62
|
+
o === -1 / 0 ? 1 : o
|
|
63
|
+
);
|
|
64
|
+
return { min: a, max: i, range: i - a || 1, ticks: c };
|
|
65
|
+
}
|
|
66
|
+
function Z(e, n, r, t, o) {
|
|
67
|
+
const a = n - S * 2, i = r - S * 2;
|
|
68
|
+
return { sx: (u) => e <= 1 ? S + a / 2 : S + u / (e - 1) * a, sy: (u) => S + i - (u - t) / o * i };
|
|
69
|
+
}
|
|
70
|
+
function G(e) {
|
|
71
|
+
if (e.length === 0) return "";
|
|
72
|
+
if (e.length < 3) return e.map((r, t) => `${t ? "L" : "M"}${r[0]},${r[1]}`).join(" ");
|
|
73
|
+
let n = `M${e[0][0]},${e[0][1]}`;
|
|
74
|
+
for (let r = 0; r < e.length - 1; r++) {
|
|
75
|
+
const t = e[r - 1] ?? e[r], o = e[r], a = e[r + 1], i = e[r + 2] ?? a, c = o[0] + (a[0] - t[0]) / 6, f = o[1] + (a[1] - t[1]) / 6, u = a[0] - (i[0] - o[0]) / 6, l = a[1] - (i[1] - o[1]) / 6;
|
|
76
|
+
n += ` C${c.toFixed(1)},${f.toFixed(1)} ${u.toFixed(1)},${l.toFixed(1)} ${a[0].toFixed(1)},${a[1].toFixed(1)}`;
|
|
77
|
+
}
|
|
78
|
+
return n;
|
|
79
|
+
}
|
|
80
|
+
function pe(e, n, r) {
|
|
81
|
+
const t = [];
|
|
82
|
+
let o = [];
|
|
83
|
+
return e.forEach((a, i) => {
|
|
84
|
+
k(a.y) ? o.push([n(i), r(a.y)]) : o.length && (t.push(o), o = []);
|
|
85
|
+
}), o.length && t.push(o), t;
|
|
86
|
+
}
|
|
87
|
+
const Y = (e, n, r) => e.name ?? z(r.series, { n: n + 1 });
|
|
88
|
+
function ye(e, n, r) {
|
|
89
|
+
return e.map((t, o) => {
|
|
90
|
+
const a = t.data.map((f) => f.y).filter(k), i = Y(t, o, n);
|
|
91
|
+
if (!a.length) return `${i}: ${n.noData}`;
|
|
92
|
+
const c = [...t.data].reverse().find((f) => k(f.y));
|
|
93
|
+
return r.summary({
|
|
94
|
+
name: i,
|
|
95
|
+
count: a.length,
|
|
96
|
+
min: Math.min(...a),
|
|
97
|
+
max: Math.max(...a),
|
|
98
|
+
lastX: c == null ? void 0 : c.x,
|
|
99
|
+
lastY: (c == null ? void 0 : c.y) ?? void 0
|
|
100
|
+
});
|
|
101
|
+
}).join(". ");
|
|
102
|
+
}
|
|
103
|
+
function ee({ width: e, height: n, lines: r }) {
|
|
104
|
+
const t = n - S * 2, o = Math.max(1, r);
|
|
105
|
+
return /* @__PURE__ */ s("g", { "aria-hidden": !0, children: Array.from({ length: o + 1 }, (a, i) => {
|
|
106
|
+
const c = S + i / o * t;
|
|
107
|
+
return /* @__PURE__ */ s(
|
|
108
|
+
"line",
|
|
109
|
+
{
|
|
110
|
+
x1: 0,
|
|
111
|
+
x2: e,
|
|
112
|
+
y1: c,
|
|
113
|
+
y2: c,
|
|
114
|
+
stroke: "var(--color-border)",
|
|
115
|
+
strokeWidth: 1,
|
|
116
|
+
opacity: 0.6
|
|
117
|
+
},
|
|
118
|
+
i
|
|
119
|
+
);
|
|
120
|
+
}) });
|
|
121
|
+
}
|
|
122
|
+
function ge({ ticks: e }) {
|
|
123
|
+
return /* @__PURE__ */ s(
|
|
124
|
+
"div",
|
|
125
|
+
{
|
|
126
|
+
"aria-hidden": !0,
|
|
127
|
+
className: "tabular text-foreground-subtle pointer-events-none flex shrink-0 flex-col justify-between py-1.5 pr-1.5 text-right text-xs",
|
|
128
|
+
children: e.map((n, r) => /* @__PURE__ */ s("span", { className: "leading-none", children: fe(n) }, r))
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
function be({ first: e, last: n }) {
|
|
133
|
+
return e ? /* @__PURE__ */ $("div", { "aria-hidden": !0, className: "text-foreground-subtle flex justify-between text-xs", children: [
|
|
134
|
+
/* @__PURE__ */ s("span", { children: String(e.x) }),
|
|
135
|
+
n && n !== e && /* @__PURE__ */ s("span", { children: String(n.x) })
|
|
136
|
+
] }) : null;
|
|
137
|
+
}
|
|
138
|
+
function ve({
|
|
139
|
+
id: e,
|
|
140
|
+
all: n,
|
|
141
|
+
name: r,
|
|
142
|
+
visible: t,
|
|
143
|
+
t: o
|
|
144
|
+
}) {
|
|
145
|
+
var f;
|
|
146
|
+
const a = Math.max(...n.map((u) => u.data.length)), i = ((f = n.find((u) => u.data.length === a)) == null ? void 0 : f.data) ?? [], c = /* @__PURE__ */ $(
|
|
147
|
+
"table",
|
|
148
|
+
{
|
|
149
|
+
id: e,
|
|
150
|
+
"data-chart-table": !0,
|
|
151
|
+
className: w(t && "tabular text-foreground-muted mt-2 w-full text-left text-xs"),
|
|
152
|
+
children: [
|
|
153
|
+
/* @__PURE__ */ s("caption", { className: w(t && "text-foreground-subtle pb-1 text-left"), children: z(o.tableCaption, { name: r ?? "" }).trim() }),
|
|
154
|
+
/* @__PURE__ */ s("thead", { children: /* @__PURE__ */ $("tr", { children: [
|
|
155
|
+
/* @__PURE__ */ s("th", { scope: "col", className: w(t && "border-border border-b py-1 pr-3 font-medium"), children: "x" }),
|
|
156
|
+
n.map((u, l) => /* @__PURE__ */ s(
|
|
157
|
+
"th",
|
|
158
|
+
{
|
|
159
|
+
scope: "col",
|
|
160
|
+
className: w(t && "border-border border-b py-1 pr-3 font-medium"),
|
|
161
|
+
children: Y(u, l, o)
|
|
162
|
+
},
|
|
163
|
+
l
|
|
164
|
+
))
|
|
165
|
+
] }) }),
|
|
166
|
+
/* @__PURE__ */ s("tbody", { children: i.map((u, l) => /* @__PURE__ */ $("tr", { children: [
|
|
167
|
+
/* @__PURE__ */ s("th", { scope: "row", className: w(t && "py-0.5 pr-3 font-normal"), children: String(u.x) }),
|
|
168
|
+
n.map((d, m) => {
|
|
169
|
+
var h, y;
|
|
170
|
+
return /* @__PURE__ */ s("td", { className: w(t && "py-0.5 pr-3"), children: k((h = d.data[l]) == null ? void 0 : h.y) ? String((y = d.data[l]) == null ? void 0 : y.y) : "—" }, m);
|
|
171
|
+
})
|
|
172
|
+
] }, l)) })
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
return t ? c : /* @__PURE__ */ s("div", { className: "sr-only", children: c });
|
|
177
|
+
}
|
|
178
|
+
function te({
|
|
179
|
+
caption: e,
|
|
180
|
+
ariaLabel: n,
|
|
181
|
+
title: r,
|
|
182
|
+
all: t,
|
|
183
|
+
height: o,
|
|
184
|
+
width: a,
|
|
185
|
+
className: i,
|
|
186
|
+
showAxis: c,
|
|
187
|
+
ticks: f,
|
|
188
|
+
xFirst: u,
|
|
189
|
+
xLast: l,
|
|
190
|
+
tableFallback: d,
|
|
191
|
+
showTableToggle: m,
|
|
192
|
+
state: h,
|
|
193
|
+
labels: y,
|
|
194
|
+
children: E
|
|
195
|
+
}) {
|
|
196
|
+
const g = X().chart, x = oe().replace(/:/g, ""), I = `chart-cap-${x}`, F = `chart-title-${x}`, C = `chart-desc-${x}`, O = `chart-table-${x}`, v = n ?? r, [p, M] = K(!1), { ref: P, width: A } = ue(), N = $e(t, g, y);
|
|
197
|
+
process.env.NODE_ENV !== "production" && !v && !e && console.warn(
|
|
198
|
+
"[craftzbay/ui] Chart: provide `caption`, `aria-label`, or `title` so the chart has an accessible name."
|
|
199
|
+
);
|
|
200
|
+
const L = (d || p) && !h, R = h === "loading" ? /* @__PURE__ */ $("div", { role: "status", "aria-label": g.loading, style: { height: o }, className: "w-full", children: [
|
|
201
|
+
/* @__PURE__ */ s(le, { style: { height: o }, className: "w-full" }),
|
|
202
|
+
/* @__PURE__ */ s("span", { className: "sr-only", children: g.loading })
|
|
203
|
+
] }) : h ? /* @__PURE__ */ s(
|
|
204
|
+
"div",
|
|
205
|
+
{
|
|
206
|
+
role: h === "error" ? "alert" : "status",
|
|
207
|
+
style: { height: o },
|
|
208
|
+
className: "text-foreground-subtle flex w-full items-center justify-center text-sm",
|
|
209
|
+
children: h === "error" ? g.error : g.empty
|
|
210
|
+
}
|
|
211
|
+
) : null;
|
|
212
|
+
return /* @__PURE__ */ $("figure", { className: w("flex flex-col gap-1.5", i), style: { width: a }, children: [
|
|
213
|
+
e && /* @__PURE__ */ s("figcaption", { id: I, className: "text-foreground-muted text-xs", children: e }),
|
|
214
|
+
R ?? /* @__PURE__ */ $(U, { children: [
|
|
215
|
+
/* @__PURE__ */ $("div", { className: "flex", children: [
|
|
216
|
+
c && /* @__PURE__ */ s(ge, { ticks: f }),
|
|
217
|
+
/* @__PURE__ */ s("div", { ref: P, className: "min-w-0 flex-1", children: /* @__PURE__ */ $(
|
|
218
|
+
"svg",
|
|
219
|
+
{
|
|
220
|
+
viewBox: `0 0 ${A} ${o}`,
|
|
221
|
+
width: A,
|
|
222
|
+
height: o,
|
|
223
|
+
role: "group",
|
|
224
|
+
"aria-labelledby": e ? I : v ? F : void 0,
|
|
225
|
+
"aria-describedby": C,
|
|
226
|
+
className: "block max-w-full overflow-visible",
|
|
227
|
+
children: [
|
|
228
|
+
v && /* @__PURE__ */ s("title", { id: F, children: v }),
|
|
229
|
+
/* @__PURE__ */ s("desc", { id: C, children: ye(t, g, y) }),
|
|
230
|
+
E({ width: A, ...N })
|
|
231
|
+
]
|
|
232
|
+
}
|
|
233
|
+
) })
|
|
234
|
+
] }),
|
|
235
|
+
c && /* @__PURE__ */ s(be, { first: u, last: l }),
|
|
236
|
+
/* @__PURE__ */ s("span", { className: "sr-only", "aria-live": "polite", "aria-atomic": "true", children: N.announcement })
|
|
237
|
+
] }),
|
|
238
|
+
m && !h && /* @__PURE__ */ s(
|
|
239
|
+
"button",
|
|
240
|
+
{
|
|
241
|
+
type: "button",
|
|
242
|
+
onClick: () => M((W) => !W),
|
|
243
|
+
"aria-expanded": p,
|
|
244
|
+
"aria-controls": L ? O : void 0,
|
|
245
|
+
className: w(
|
|
246
|
+
"text-foreground-subtle hover:text-foreground self-start rounded-sm text-xs underline-offset-2 outline-none hover:underline",
|
|
247
|
+
"focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2"
|
|
248
|
+
),
|
|
249
|
+
children: p ? g.hideTable : g.viewAsTable
|
|
250
|
+
}
|
|
251
|
+
),
|
|
252
|
+
L && /* @__PURE__ */ s(
|
|
253
|
+
ve,
|
|
254
|
+
{
|
|
255
|
+
id: O,
|
|
256
|
+
all: t,
|
|
257
|
+
name: v ?? (typeof e == "string" ? e : void 0),
|
|
258
|
+
visible: p,
|
|
259
|
+
t: g
|
|
260
|
+
}
|
|
261
|
+
)
|
|
262
|
+
] });
|
|
263
|
+
}
|
|
264
|
+
function $e(e, n, r) {
|
|
265
|
+
const [t, o] = K(null), [a, i] = K(""), c = se(
|
|
266
|
+
(l, d) => {
|
|
267
|
+
const m = e[l], h = m == null ? void 0 : m.data[d];
|
|
268
|
+
!h || !k(h.y) || (o({ series: l, index: d }), i(r.point(m.name, h.x, h.y)));
|
|
269
|
+
},
|
|
270
|
+
[e, r]
|
|
271
|
+
), f = (l) => e[l].data.map((d, m) => k(d.y) ? m : -1).filter((d) => d >= 0);
|
|
272
|
+
return { active: t, announcement: a, seriesProps: (l) => ({
|
|
273
|
+
tabIndex: 0,
|
|
274
|
+
role: "group",
|
|
275
|
+
"aria-label": r.series(Y(e[l], l, n), f(l).length),
|
|
276
|
+
// Focus ring comes from theme.css `[data-chart-series]:focus-visible`
|
|
277
|
+
// (CSS outline — Tailwind's box-shadow ring does not paint on SVG <g>).
|
|
278
|
+
"data-chart-series": !0,
|
|
279
|
+
className: w(
|
|
280
|
+
"[&:focus-visible_[data-active]]:stroke-[var(--ring)] [&:focus-visible_[data-active]]:stroke-[3px]"
|
|
281
|
+
),
|
|
282
|
+
onFocus: () => {
|
|
283
|
+
const d = f(l);
|
|
284
|
+
d.length && c(l, (t == null ? void 0 : t.series) === l ? t.index : d[d.length - 1]);
|
|
285
|
+
},
|
|
286
|
+
onBlur: () => {
|
|
287
|
+
o(null), i("");
|
|
288
|
+
},
|
|
289
|
+
onKeyDown: (d) => {
|
|
290
|
+
const m = f(l);
|
|
291
|
+
if (!m.length) return;
|
|
292
|
+
const h = (t == null ? void 0 : t.series) === l ? m.indexOf(t.index) : m.length - 1;
|
|
293
|
+
let y = h;
|
|
294
|
+
if (d.key === "ArrowRight" || d.key === "ArrowUp") y = Math.min(m.length - 1, h + 1);
|
|
295
|
+
else if (d.key === "ArrowLeft" || d.key === "ArrowDown") y = Math.max(0, h - 1);
|
|
296
|
+
else if (d.key === "Home") y = 0;
|
|
297
|
+
else if (d.key === "End") y = m.length - 1;
|
|
298
|
+
else return;
|
|
299
|
+
d.preventDefault(), c(l, m[y]);
|
|
300
|
+
}
|
|
301
|
+
}) };
|
|
302
|
+
}
|
|
303
|
+
function Me({
|
|
304
|
+
x: e,
|
|
305
|
+
y: n,
|
|
306
|
+
color: r,
|
|
307
|
+
label: t,
|
|
308
|
+
always: o,
|
|
309
|
+
active: a
|
|
310
|
+
}) {
|
|
311
|
+
return /* @__PURE__ */ s(
|
|
312
|
+
"circle",
|
|
313
|
+
{
|
|
314
|
+
cx: e,
|
|
315
|
+
cy: n,
|
|
316
|
+
r: 3.5,
|
|
317
|
+
fill: r,
|
|
318
|
+
"data-active": a || void 0,
|
|
319
|
+
className: w(!o && !a && "opacity-0 hover:opacity-100"),
|
|
320
|
+
children: /* @__PURE__ */ s("title", { children: t })
|
|
321
|
+
}
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
function Ne({
|
|
325
|
+
data: e,
|
|
326
|
+
series: n,
|
|
327
|
+
colors: r = q,
|
|
328
|
+
height: t = 160,
|
|
329
|
+
width: o = "100%",
|
|
330
|
+
caption: a,
|
|
331
|
+
"aria-label": i,
|
|
332
|
+
title: c,
|
|
333
|
+
grid: f = !0,
|
|
334
|
+
showAxis: u = !0,
|
|
335
|
+
tableFallback: l = !0,
|
|
336
|
+
showTableToggle: d,
|
|
337
|
+
state: m,
|
|
338
|
+
labels: h,
|
|
339
|
+
className: y
|
|
340
|
+
}) {
|
|
341
|
+
const E = X().chart, g = { ...V(E), ...h }, x = J(e, n), { min: I, range: F, ticks: C } = Q(x), O = Math.max(...x.map((p) => p.data.length)), v = x[0].data;
|
|
342
|
+
return /* @__PURE__ */ s(
|
|
343
|
+
te,
|
|
344
|
+
{
|
|
345
|
+
caption: a,
|
|
346
|
+
ariaLabel: i,
|
|
347
|
+
title: c,
|
|
348
|
+
all: x,
|
|
349
|
+
height: t,
|
|
350
|
+
width: o,
|
|
351
|
+
className: y,
|
|
352
|
+
showAxis: u,
|
|
353
|
+
ticks: C,
|
|
354
|
+
xFirst: v[0],
|
|
355
|
+
xLast: v[v.length - 1],
|
|
356
|
+
tableFallback: l,
|
|
357
|
+
showTableToggle: d,
|
|
358
|
+
state: m,
|
|
359
|
+
labels: g,
|
|
360
|
+
children: ({ width: p, active: M, seriesProps: P }) => /* @__PURE__ */ $(U, { children: [
|
|
361
|
+
f && /* @__PURE__ */ s(ee, { width: p, height: t, lines: C.length - 1 }),
|
|
362
|
+
x.map((A, N) => {
|
|
363
|
+
const L = r[N % r.length], { sx: R, sy: W } = Z(O, p, t, I, F), D = pe(A.data, R, W), H = D.map(G).join(" "), j = W(Math.max(I, 0)), T = D.map(
|
|
364
|
+
(b) => `${G(b)} L${b[b.length - 1][0].toFixed(1)},${j.toFixed(1)} L${b[0][0].toFixed(1)},${j.toFixed(1)} Z`
|
|
365
|
+
).join(" "), B = A.data.map((b) => k(b.y)).lastIndexOf(!0);
|
|
366
|
+
return /* @__PURE__ */ $("g", { ...P(N), children: [
|
|
367
|
+
T && /* @__PURE__ */ s("path", { d: T, fill: L, fillOpacity: 0.08 }),
|
|
368
|
+
/* @__PURE__ */ s(
|
|
369
|
+
"path",
|
|
370
|
+
{
|
|
371
|
+
d: H,
|
|
372
|
+
fill: "none",
|
|
373
|
+
stroke: L,
|
|
374
|
+
strokeWidth: 2,
|
|
375
|
+
strokeLinecap: "round",
|
|
376
|
+
strokeLinejoin: "round"
|
|
377
|
+
}
|
|
378
|
+
),
|
|
379
|
+
A.data.map(
|
|
380
|
+
(b, _) => k(b.y) ? /* @__PURE__ */ s(
|
|
381
|
+
Me,
|
|
382
|
+
{
|
|
383
|
+
x: R(_),
|
|
384
|
+
y: W(b.y),
|
|
385
|
+
color: L,
|
|
386
|
+
always: _ === B,
|
|
387
|
+
active: (M == null ? void 0 : M.series) === N && M.index === _,
|
|
388
|
+
label: g.point(A.name, b.x, b.y)
|
|
389
|
+
},
|
|
390
|
+
_
|
|
391
|
+
) : null
|
|
392
|
+
)
|
|
393
|
+
] }, N);
|
|
394
|
+
})
|
|
395
|
+
] })
|
|
396
|
+
}
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
function Ce(e) {
|
|
400
|
+
return /* @__PURE__ */ s(Ne, { ...e });
|
|
401
|
+
}
|
|
402
|
+
function We({
|
|
403
|
+
data: e,
|
|
404
|
+
series: n,
|
|
405
|
+
colors: r = q,
|
|
406
|
+
height: t = 160,
|
|
407
|
+
width: o = "100%",
|
|
408
|
+
caption: a,
|
|
409
|
+
"aria-label": i,
|
|
410
|
+
title: c,
|
|
411
|
+
grid: f = !0,
|
|
412
|
+
showAxis: u = !0,
|
|
413
|
+
tableFallback: l = !0,
|
|
414
|
+
showTableToggle: d,
|
|
415
|
+
state: m,
|
|
416
|
+
labels: h,
|
|
417
|
+
className: y
|
|
418
|
+
}) {
|
|
419
|
+
const E = X().chart, g = { ...V(E), ...h }, x = J(e, n), I = Math.max(...x.map((p) => p.data.length)), { min: F, range: C, ticks: O } = Q(x), v = x[0].data;
|
|
420
|
+
return /* @__PURE__ */ s(
|
|
421
|
+
te,
|
|
422
|
+
{
|
|
423
|
+
caption: a,
|
|
424
|
+
ariaLabel: i,
|
|
425
|
+
title: c,
|
|
426
|
+
all: x,
|
|
427
|
+
height: t,
|
|
428
|
+
width: o,
|
|
429
|
+
className: y,
|
|
430
|
+
showAxis: u,
|
|
431
|
+
ticks: O,
|
|
432
|
+
xFirst: v[0],
|
|
433
|
+
xLast: v[v.length - 1],
|
|
434
|
+
tableFallback: l,
|
|
435
|
+
showTableToggle: d,
|
|
436
|
+
state: m,
|
|
437
|
+
labels: g,
|
|
438
|
+
children: ({ width: p, active: M, seriesProps: P }) => {
|
|
439
|
+
const N = (p - S * 2) / Math.max(1, I), L = N * 0.62, R = Math.max(2, L / x.length), { sy: W } = Z(I, p, t, F, C), D = W(Math.min(Math.max(0, F), F + C));
|
|
440
|
+
return /* @__PURE__ */ $(U, { children: [
|
|
441
|
+
f && /* @__PURE__ */ s(ee, { width: p, height: t, lines: O.length - 1 }),
|
|
442
|
+
F < 0 && /* @__PURE__ */ s(
|
|
443
|
+
"line",
|
|
444
|
+
{
|
|
445
|
+
"aria-hidden": !0,
|
|
446
|
+
x1: 0,
|
|
447
|
+
x2: p,
|
|
448
|
+
y1: D,
|
|
449
|
+
y2: D,
|
|
450
|
+
stroke: "var(--color-border-strong)",
|
|
451
|
+
strokeWidth: 1
|
|
452
|
+
}
|
|
453
|
+
),
|
|
454
|
+
x.map((H, j) => /* @__PURE__ */ s("g", { ...P(j), children: H.data.map((T, B) => {
|
|
455
|
+
if (!k(T.y)) return null;
|
|
456
|
+
const b = W(T.y), _ = S + B * N + (N - L) / 2 + j * R, ne = g.point(H.name, T.x, T.y), re = (M == null ? void 0 : M.series) === j && M.index === B;
|
|
457
|
+
return /* @__PURE__ */ s(
|
|
458
|
+
"rect",
|
|
459
|
+
{
|
|
460
|
+
x: _,
|
|
461
|
+
y: Math.min(D, b),
|
|
462
|
+
width: R,
|
|
463
|
+
height: Math.abs(D - b),
|
|
464
|
+
fill: r[j % r.length],
|
|
465
|
+
rx: 2,
|
|
466
|
+
"data-active": re || void 0,
|
|
467
|
+
className: "transition-opacity hover:opacity-80",
|
|
468
|
+
children: /* @__PURE__ */ s("title", { children: ne })
|
|
469
|
+
},
|
|
470
|
+
B
|
|
471
|
+
);
|
|
472
|
+
}) }, j))
|
|
473
|
+
] });
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
export {
|
|
479
|
+
Ce as AreaChart,
|
|
480
|
+
We as BarChart,
|
|
481
|
+
q as DEFAULT_CHART_COLORS,
|
|
482
|
+
Ne as LineChart,
|
|
483
|
+
fe as abbreviateNumber,
|
|
484
|
+
Ie as defaultChartLabels,
|
|
485
|
+
xe as niceTicks
|
|
486
|
+
};
|
|
487
|
+
//# sourceMappingURL=Chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../src/components/ui/Chart.tsx"],"sourcesContent":["'use client';\n\nimport {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { formatString, type UiStrings } from '@/lib/strings';\nimport { Skeleton } from './Skeleton';\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. The SVG is drawn in real pixels: a ResizeObserver\n * measures the container width, so points and bars are never distorted.\n *\n * Keyboard: one tab stop per series; ←/→ (Home/End) move between points and\n * the active point is announced via a polite live region.\n */\n\nexport interface ChartPoint {\n x: string | number;\n /** `null` breaks the line (a gap) and is skipped in bars/tables. */\n y: number | null;\n}\n\nexport interface ChartSeries {\n /** Name used in the accessible summary, table header and tooltips. */\n name?: string;\n data: ChartPoint[];\n}\n\nexport type ChartState = 'loading' | 'empty' | 'error';\n\n/** Text builders for the accessible summary + point labels (i18n). */\nexport interface ChartLabels {\n /** `<desc>` sentence per series. */\n summary: (s: {\n name: string;\n count: number;\n min: number;\n max: number;\n lastX: string | number | undefined;\n lastY: number | undefined;\n }) => string;\n /** Label of one data point (tooltip, live region). */\n point: (name: string | undefined, x: string | number, y: number) => string;\n /** Accessible name of a series' tab stop. */\n series: (name: string, count: number) => string;\n}\n\nexport const defaultChartLabels: ChartLabels = {\n summary: ({ name, count, min, max, lastX, lastY }) =>\n `${name}: ${count} points, min ${min}, max ${max}, last ${lastX}: ${lastY}`,\n point: (name, x, y) => `${name ? `${name} — ` : ''}${x}: ${y}`,\n series: (name, count) => `${name}, ${count} points. Use arrow keys to move between points.`,\n};\n\nfunction chartLabelsFromStrings(t: UiStrings['chart']): ChartLabels {\n return {\n summary: ({ name, count, min, max, lastX, lastY }) =>\n formatString(t.summary, { name, count, min, max, x: lastX, y: lastY }),\n point: (name, x, y) => (name ? `${name} — ` : '') + formatString(t.point, { x, y }),\n series: (name, count) => formatString(t.seriesNav, { name, count }),\n };\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 /** Per-series colours. Defaults to `--chart-1..6` (categorical; never the accent). */\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 /**\n * Render a visually-hidden `<table>` of the data after the SVG so screen\n * readers and copy/paste get the numbers. Default true.\n */\n tableFallback?: boolean;\n /** Show a small \"View as table\" toggle that reveals the fallback table. */\n showTableToggle?: boolean;\n /** Replace the drawing with a loading skeleton / empty / error message. */\n state?: ChartState;\n /** Override the generated accessible text (English defaults). */\n labels?: Partial<ChartLabels>;\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// Width used before the container has been measured (SSR / first paint).\nconst FALLBACK_W = 600;\nconst PAD = 6;\n\n/** Measure the container's content width; re-renders on resize. */\nfunction useMeasuredWidth<T extends HTMLElement>() {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState(0);\n const useIso = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n useIso(() => {\n const el = ref.current;\n if (!el) return;\n const update = () => setWidth(el.clientWidth);\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n return { ref, width: width || FALLBACK_W };\n}\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\n/** Round a raw step up to 1 / 2 / 2.5 / 5 × 10^n. */\nfunction niceStep(raw: number): number {\n if (raw <= 0) return 1;\n const exp = Math.floor(Math.log10(raw));\n const base = 10 ** exp;\n const f = raw / base;\n const nice = f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 ? 2.5 : f <= 5 ? 5 : 10;\n return nice * base;\n}\n\n/**\n * \"Nice\" axis: expands [min, max] to multiples of a 1/2/2.5/5 step so ticks\n * read as round numbers (never `754.5`).\n */\nexport function niceTicks(min: number, max: number, maxTicks = MAX_TICKS) {\n if (max === min) max = min + 1;\n const step = niceStep((max - min) / Math.max(1, maxTicks - 1));\n const lo = Math.floor(min / step) * step;\n const hi = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n // +step/2 guards float drift; toFixed strips 0.30000000000000004-style noise.\n for (let v = hi; v >= lo - step / 2; v -= step) ticks.push(Number(v.toFixed(10)));\n return { min: lo, max: hi, ticks };\n}\n\nfunction resolveSeries(data?: ChartPoint[], series?: ChartSeries[]): ChartSeries[] {\n if (series && series.length) return series;\n return [{ data: data ?? [] }];\n}\n\nconst isNum = (v: number | null | undefined): v is number => typeof v === 'number';\n\nfunction domain(all: ChartSeries[], includeZero = true) {\n const ys = all.flatMap((s) => s.data.map((d) => d.y).filter(isNum));\n const rawMin = includeZero ? Math.min(0, ...ys) : Math.min(...ys);\n const rawMax = Math.max(...ys, includeZero ? 1 : -Infinity);\n const { min, max, ticks } = niceTicks(\n Number.isFinite(rawMin) ? rawMin : 0,\n rawMax === -Infinity ? 1 : rawMax,\n );\n return { min, max, range: max - min || 1, ticks };\n}\n\nfunction scales(length: number, w: number, h: number, min: number, range: number) {\n const innerW = 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/** Split at `null` gaps → one smooth sub-path per run of real values. */\nfunction segments(\n data: ChartPoint[],\n sx: (i: number) => number,\n sy: (v: number) => number,\n): [number, number][][] {\n const out: [number, number][][] = [];\n let run: [number, number][] = [];\n data.forEach((d, i) => {\n if (isNum(d.y)) run.push([sx(i), sy(d.y)]);\n else if (run.length) {\n out.push(run);\n run = [];\n }\n });\n if (run.length) out.push(run);\n return out;\n}\n\nconst seriesName = (s: ChartSeries, i: number, t: UiStrings['chart']) =>\n s.name ?? formatString(t.series, { n: i + 1 });\n\n/** Plain-language summary for the `<desc>` element. */\nfunction describe(all: ChartSeries[], t: UiStrings['chart'], labels: ChartLabels): string {\n return all\n .map((s, i) => {\n const ys = s.data.map((d) => d.y).filter(isNum);\n const name = seriesName(s, i, t);\n if (!ys.length) return `${name}: ${t.noData}`;\n const last = [...s.data].reverse().find((d) => isNum(d.y));\n return labels.summary({\n name,\n count: ys.length,\n min: Math.min(...ys),\n max: Math.max(...ys),\n lastX: last?.x,\n lastY: last?.y ?? undefined,\n });\n })\n .join('. ');\n}\n\nfunction Grid({ width, height, lines }: { width: number; height: number; lines: number }) {\n const innerH = height - PAD * 2;\n const n = Math.max(1, lines);\n return (\n <g aria-hidden>\n {Array.from({ length: n + 1 }, (_, i) => {\n const y = PAD + (i / n) * innerH;\n return (\n <line\n key={i}\n x1={0}\n x2={width}\n y1={y}\n y2={y}\n stroke=\"var(--color-border)\"\n strokeWidth={1}\n opacity={0.6}\n />\n );\n })}\n </g>\n );\n}\n\n/** Axis labels are HTML so they follow the document font and wrap normally. */\nfunction YAxis({ ticks }: { ticks: number[] }) {\n return (\n <div\n aria-hidden\n className=\"tabular text-foreground-subtle pointer-events-none flex shrink-0 flex-col justify-between py-1.5 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 DataTable({\n id,\n all,\n name,\n visible,\n t,\n}: {\n id: string;\n all: ChartSeries[];\n name?: string;\n visible: boolean;\n t: UiStrings['chart'];\n}) {\n const longest = Math.max(...all.map((s) => s.data.length));\n const xs = all.find((s) => s.data.length === longest)?.data ?? [];\n // A <table> ignores `sr-only`'s 1px width (min-content wins) and can widen\n // the document on narrow viewports — hide it inside a wrapper instead.\n const table = (\n <table\n id={id}\n data-chart-table\n className={cn(visible && 'tabular text-foreground-muted mt-2 w-full text-left text-xs')}\n >\n <caption className={cn(visible && 'text-foreground-subtle pb-1 text-left')}>\n {formatString(t.tableCaption, { name: name ?? '' }).trim()}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\" className={cn(visible && 'border-border border-b py-1 pr-3 font-medium')}>\n x\n </th>\n {all.map((s, i) => (\n <th\n key={i}\n scope=\"col\"\n className={cn(visible && 'border-border border-b py-1 pr-3 font-medium')}\n >\n {seriesName(s, i, t)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {xs.map((p, i) => (\n <tr key={i}>\n <th scope=\"row\" className={cn(visible && 'py-0.5 pr-3 font-normal')}>\n {String(p.x)}\n </th>\n {all.map((s, si) => (\n <td key={si} className={cn(visible && 'py-0.5 pr-3')}>\n {isNum(s.data[i]?.y) ? String(s.data[i]?.y) : '—'}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n return visible ? table : <div className=\"sr-only\">{table}</div>;\n}\n\nfunction Frame({\n caption,\n ariaLabel,\n title,\n all,\n height,\n width,\n className,\n showAxis,\n ticks,\n xFirst,\n xLast,\n tableFallback,\n showTableToggle,\n state,\n labels,\n children,\n}: {\n caption?: ReactNode;\n ariaLabel?: string;\n title?: string;\n all: ChartSeries[];\n height: number;\n width: number | string;\n className?: string;\n showAxis: boolean;\n ticks: number[];\n xFirst?: ChartPoint;\n xLast?: ChartPoint;\n tableFallback: boolean;\n showTableToggle?: boolean;\n state?: ChartState;\n labels: ChartLabels;\n children: (ctx: FrameContext) => ReactNode;\n}) {\n const t = useStrings().chart;\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 tableId = `chart-table-${id}`;\n const name = ariaLabel ?? title;\n const [tableOpen, setTableOpen] = useState(false);\n const { ref: plotRef, width: plotW } = useMeasuredWidth<HTMLDivElement>();\n const roving = useRovingPoints(all, t, labels);\n\n if (process.env.NODE_ENV !== 'production' && !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 const tableRendered = (tableFallback || tableOpen) && !state;\n\n const stateNode =\n state === 'loading' ? (\n <div role=\"status\" aria-label={t.loading} style={{ height }} className=\"w-full\">\n <Skeleton style={{ height }} className=\"w-full\" />\n <span className=\"sr-only\">{t.loading}</span>\n </div>\n ) : state ? (\n <div\n role={state === 'error' ? 'alert' : 'status'}\n style={{ height }}\n className=\"text-foreground-subtle flex w-full items-center justify-center text-sm\"\n >\n {state === 'error' ? t.error : t.empty}\n </div>\n ) : null;\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 {stateNode ?? (\n <>\n <div className=\"flex\">\n {showAxis && <YAxis ticks={ticks} />}\n {/* The plot area is measured; the SVG is drawn 1:1 in px inside it. */}\n <div ref={plotRef} className=\"min-w-0 flex-1\">\n {/* role=group (not img): series inside are focusable and carry their own labels. */}\n <svg\n viewBox={`0 0 ${plotW} ${height}`}\n width={plotW}\n height={height}\n role=\"group\"\n aria-labelledby={caption ? captionId : name ? titleId : undefined}\n aria-describedby={descId}\n className=\"block max-w-full overflow-visible\"\n >\n {name && <title id={titleId}>{name}</title>}\n <desc id={descId}>{describe(all, t, labels)}</desc>\n {children({ width: plotW, ...roving })}\n </svg>\n </div>\n </div>\n {showAxis && <XAxis first={xFirst} last={xLast} />}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {roving.announcement}\n </span>\n </>\n )}\n {showTableToggle && !state && (\n <button\n type=\"button\"\n onClick={() => setTableOpen((v) => !v)}\n aria-expanded={tableOpen}\n aria-controls={tableRendered ? tableId : undefined}\n className={cn(\n 'text-foreground-subtle hover:text-foreground self-start rounded-sm text-xs underline-offset-2 outline-none hover:underline',\n 'focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2',\n )}\n >\n {tableOpen ? t.hideTable : t.viewAsTable}\n </button>\n )}\n {tableRendered && (\n <DataTable\n id={tableId}\n all={all}\n name={name ?? (typeof caption === 'string' ? caption : undefined)}\n visible={tableOpen}\n t={t}\n />\n )}\n </figure>\n );\n}\n\ninterface FrameContext {\n width: number;\n active: { series: number; index: number } | null;\n seriesProps: (si: number) => {\n tabIndex: number;\n role: 'group';\n 'aria-label': string;\n 'data-chart-series': true;\n onKeyDown: (e: KeyboardEvent<SVGGElement>) => void;\n onFocus: () => void;\n onBlur: () => void;\n className: string;\n };\n}\n\n/**\n * Roving focus: each series is a single tab stop; ←/→/Home/End move the\n * active point and the live region announces it. Per-point tab stops would\n * make a 200-point chart a 200-tab ordeal.\n */\nfunction useRovingPoints(all: ChartSeries[], t: UiStrings['chart'], labels: ChartLabels) {\n const [active, setActive] = useState<{ series: number; index: number } | null>(null);\n const [announcement, setAnnouncement] = useState('');\n\n const announce = useCallback(\n (si: number, idx: number) => {\n const s = all[si];\n const d = s?.data[idx];\n if (!d || !isNum(d.y)) return;\n setActive({ series: si, index: idx });\n setAnnouncement(labels.point(s.name, d.x, d.y));\n },\n [all, labels],\n );\n\n const validIndices = (si: number) =>\n all[si].data.map((d, i) => (isNum(d.y) ? i : -1)).filter((i) => i >= 0);\n\n const seriesProps = (si: number) => ({\n tabIndex: 0,\n role: 'group' as const,\n 'aria-label': labels.series(seriesName(all[si], si, t), validIndices(si).length),\n // Focus ring comes from theme.css `[data-chart-series]:focus-visible`\n // (CSS outline — Tailwind's box-shadow ring does not paint on SVG <g>).\n 'data-chart-series': true as const,\n className: cn(\n '[&:focus-visible_[data-active]]:stroke-[var(--ring)] [&:focus-visible_[data-active]]:stroke-[3px]',\n ),\n onFocus: () => {\n const idxs = validIndices(si);\n if (idxs.length) announce(si, active?.series === si ? active.index : idxs[idxs.length - 1]);\n },\n onBlur: () => {\n setActive(null);\n setAnnouncement('');\n },\n onKeyDown: (e: KeyboardEvent<SVGGElement>) => {\n const idxs = validIndices(si);\n if (!idxs.length) return;\n const pos = active?.series === si ? idxs.indexOf(active.index) : idxs.length - 1;\n let next = pos;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') next = Math.min(idxs.length - 1, pos + 1);\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') next = Math.max(0, pos - 1);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = idxs.length - 1;\n else return;\n e.preventDefault();\n announce(si, idxs[next]);\n },\n });\n\n return { active, announcement, seriesProps };\n}\n\n/** Labelled data point. Invisible until hovered / active unless `always`. */\nfunction Point({\n x,\n y,\n color,\n label,\n always,\n active,\n}: {\n x: number;\n y: number;\n color: string;\n label: string;\n always?: boolean;\n active?: boolean;\n}) {\n return (\n <circle\n cx={x}\n cy={y}\n r={3.5}\n fill={color}\n data-active={active || undefined}\n className={cn(!always && !active && 'opacity-0 hover:opacity-100')}\n >\n <title>{label}</title>\n </circle>\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 tableFallback = true,\n showTableToggle,\n state,\n labels: labelsProp,\n className,\n}: ChartProps) {\n const t = useStrings().chart;\n const labels = { ...chartLabelsFromStrings(t), ...labelsProp };\n const all = resolveSeries(data, series);\n const { min, range, ticks } = 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 all={all}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n ticks={ticks}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n tableFallback={tableFallback}\n showTableToggle={showTableToggle}\n state={state}\n labels={labels}\n >\n {({ width: w, active, seriesProps }) => (\n <>\n {grid && <Grid width={w} height={height} lines={ticks.length - 1} />}\n {all.map((s, si) => {\n const color = colors[si % colors.length];\n const { sx, sy } = scales(longest, w, height, min, range);\n const segs = segments(s.data, sx, sy);\n const line = segs.map(smoothPath).join(' ');\n const baseline = sy(Math.max(min, 0));\n const area = segs\n .map(\n (pts) =>\n `${smoothPath(pts)} L${pts[pts.length - 1][0].toFixed(1)},${baseline.toFixed(1)} L${pts[0][0].toFixed(1)},${baseline.toFixed(1)} Z`,\n )\n .join(' ');\n const lastIdx = s.data.map((d) => isNum(d.y)).lastIndexOf(true);\n return (\n <g key={si} {...seriesProps(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 />\n {s.data.map((d, i) =>\n isNum(d.y) ? (\n <Point\n key={i}\n x={sx(i)}\n y={sy(d.y)}\n color={color}\n always={i === lastIdx}\n active={active?.series === si && active.index === i}\n label={labels.point(s.name, d.x, d.y)}\n />\n ) : null,\n )}\n </g>\n );\n })}\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 tableFallback = true,\n showTableToggle,\n state,\n labels: labelsProp,\n className,\n}: ChartProps) {\n const t = useStrings().chart;\n const labels = { ...chartLabelsFromStrings(t), ...labelsProp };\n const all = resolveSeries(data, series);\n const longest = Math.max(...all.map((s) => s.data.length));\n const { min, range, ticks } = domain(all);\n const primary = all[0].data;\n\n return (\n <Frame\n caption={caption}\n ariaLabel={ariaLabel}\n title={title}\n all={all}\n height={height}\n width={width}\n className={className}\n showAxis={showAxis}\n ticks={ticks}\n xFirst={primary[0]}\n xLast={primary[primary.length - 1]}\n tableFallback={tableFallback}\n showTableToggle={showTableToggle}\n state={state}\n labels={labels}\n >\n {({ width: w, active, seriesProps }) => {\n const innerW = w - PAD * 2;\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 { sy } = scales(longest, w, height, min, range);\n // Bars grow from the zero line, so negatives hang below it.\n const zeroY = sy(Math.min(Math.max(0, min), min + range));\n return (\n <>\n {grid && <Grid width={w} height={height} lines={ticks.length - 1} />}\n {min < 0 && (\n <line\n aria-hidden\n x1={0}\n x2={w}\n y1={zeroY}\n y2={zeroY}\n stroke=\"var(--color-border-strong)\"\n strokeWidth={1}\n />\n )}\n {all.map((s, si) => (\n <g key={si} {...seriesProps(si)}>\n {s.data.map((d, i) => {\n if (!isNum(d.y)) return null;\n const yv = sy(d.y);\n const x = PAD + i * slot + (slot - groupW) / 2 + si * barW;\n const label = labels.point(s.name, d.x, d.y);\n const isActive = active?.series === si && active.index === i;\n return (\n <rect\n key={i}\n x={x}\n y={Math.min(zeroY, yv)}\n width={barW}\n height={Math.abs(zeroY - yv)}\n fill={colors[si % colors.length]}\n rx={2}\n data-active={isActive || undefined}\n className=\"transition-opacity hover:opacity-80\"\n >\n <title>{label}</title>\n </rect>\n );\n })}\n </g>\n ))}\n </>\n );\n }}\n </Frame>\n );\n}\n"],"names":["defaultChartLabels","name","count","min","max","lastX","lastY","x","y","chartLabelsFromStrings","t","formatString","DEFAULT_CHART_COLORS","FALLBACK_W","PAD","useMeasuredWidth","ref","useRef","width","setWidth","useState","useEffect","useLayoutEffect","el","update","ro","MAX_TICKS","abbreviateNumber","n","abs","fmt","v","s","niceStep","raw","base","f","niceTicks","maxTicks","step","lo","hi","ticks","resolveSeries","data","series","isNum","domain","all","includeZero","ys","d","rawMin","rawMax","scales","length","w","h","range","innerW","innerH","i","smoothPath","pts","p","p0","p1","p2","p3","c1x","c1y","c2x","c2y","segments","sx","sy","out","run","seriesName","describe","labels","last","Grid","height","lines","jsx","_","YAxis","XAxis","first","jsxs","DataTable","id","visible","longest","xs","_a","table","cn","si","_b","Frame","caption","ariaLabel","title","className","showAxis","xFirst","xLast","tableFallback","showTableToggle","state","children","useStrings","useId","captionId","titleId","descId","tableId","tableOpen","setTableOpen","plotRef","plotW","roving","useRovingPoints","tableRendered","stateNode","Skeleton","Fragment","active","setActive","announcement","setAnnouncement","announce","useCallback","idx","validIndices","idxs","e","pos","next","Point","color","label","always","LineChart","colors","grid","labelsProp","primary","seriesProps","segs","line","baseline","area","lastIdx","AreaChart","props","BarChart","slot","groupW","barW","zeroY","yv","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as s, jsx as e } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as N, useId as y } from "react";
|
|
4
|
+
import * as m from "@radix-ui/react-checkbox";
|
|
5
|
+
import { Minus as j, Check as C } from "../../icons/index.js";
|
|
6
|
+
import { cn as o } from "../../lib/utils.js";
|
|
7
|
+
const I = N(
|
|
8
|
+
function({
|
|
9
|
+
className: u,
|
|
10
|
+
label: c,
|
|
11
|
+
description: a,
|
|
12
|
+
error: t,
|
|
13
|
+
hideLabel: b,
|
|
14
|
+
id: x,
|
|
15
|
+
disabled: n,
|
|
16
|
+
"aria-describedby": h,
|
|
17
|
+
"aria-invalid": i,
|
|
18
|
+
...d
|
|
19
|
+
}, g) {
|
|
20
|
+
const v = y(), r = x ?? v, l = a ? `${r}-desc` : void 0, f = t ? `${r}-error` : void 0, k = [f, l, h].filter(Boolean).join(" ") || void 0, p = !!t || i === !0 || i === "true";
|
|
21
|
+
return /* @__PURE__ */ s("div", { className: o("flex flex-col gap-1", u), children: [
|
|
22
|
+
/* @__PURE__ */ s("div", { className: "flex items-start gap-2.5", children: [
|
|
23
|
+
/* @__PURE__ */ e(
|
|
24
|
+
m.Root,
|
|
25
|
+
{
|
|
26
|
+
ref: g,
|
|
27
|
+
id: r,
|
|
28
|
+
disabled: n,
|
|
29
|
+
"aria-describedby": k,
|
|
30
|
+
"aria-invalid": p ? !0 : i,
|
|
31
|
+
className: o(
|
|
32
|
+
"peer relative mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-sm border",
|
|
33
|
+
// WCAG 2.5.8: 16px visual box, ≥24px hit area via an invisible inset halo.
|
|
34
|
+
'before:absolute before:-inset-1.5 before:content-[""]',
|
|
35
|
+
"transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
|
|
36
|
+
"focus-visible:ring-ring focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
37
|
+
"data-[state=checked]:bg-accent data-[state=checked]:border-accent data-[state=checked]:text-on-accent",
|
|
38
|
+
"data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:text-on-accent",
|
|
39
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
40
|
+
"border-border-input aria-invalid:border-danger"
|
|
41
|
+
),
|
|
42
|
+
...d,
|
|
43
|
+
children: /* @__PURE__ */ e(m.Indicator, { className: "flex items-center justify-center", children: d.checked === "indeterminate" ? /* @__PURE__ */ e(j, { className: "size-3", "aria-hidden": !0, strokeWidth: 3 }) : /* @__PURE__ */ e(C, { className: "size-3", "aria-hidden": !0, strokeWidth: 3 }) })
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
c && /* @__PURE__ */ s("div", { className: "flex flex-col gap-0.5", children: [
|
|
47
|
+
/* @__PURE__ */ e(
|
|
48
|
+
"label",
|
|
49
|
+
{
|
|
50
|
+
htmlFor: r,
|
|
51
|
+
className: o(
|
|
52
|
+
"text-foreground text-sm select-none",
|
|
53
|
+
n && "cursor-not-allowed opacity-50",
|
|
54
|
+
b && "sr-only"
|
|
55
|
+
),
|
|
56
|
+
children: c
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
a && /* @__PURE__ */ e("p", { id: l, className: "text-foreground-subtle text-xs", children: a })
|
|
60
|
+
] })
|
|
61
|
+
] }),
|
|
62
|
+
t && /* @__PURE__ */ e("p", { id: f, className: "text-danger-text text-xs", children: t })
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
I.displayName = "Checkbox";
|
|
67
|
+
export {
|
|
68
|
+
I as Checkbox
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=Checkbox.js.map
|