@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.
Files changed (208) hide show
  1. package/README.md +82 -10
  2. package/dist-lib/__tests__/helpers/color.d.ts +9 -0
  3. package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
  4. package/dist-lib/components/ui/Accordion.js +71 -0
  5. package/dist-lib/components/ui/Accordion.js.map +1 -0
  6. package/dist-lib/components/ui/Alert.d.ts +17 -1
  7. package/dist-lib/components/ui/Alert.js +79 -0
  8. package/dist-lib/components/ui/Alert.js.map +1 -0
  9. package/dist-lib/components/ui/Avatar.d.ts +3 -3
  10. package/dist-lib/components/ui/Avatar.js +94 -0
  11. package/dist-lib/components/ui/Avatar.js.map +1 -0
  12. package/dist-lib/components/ui/Badge.d.ts +4 -2
  13. package/dist-lib/components/ui/Badge.js +76 -0
  14. package/dist-lib/components/ui/Badge.js.map +1 -0
  15. package/dist-lib/components/ui/Breadcrumbs.d.ts +2 -0
  16. package/dist-lib/components/ui/Breadcrumbs.js +52 -0
  17. package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
  18. package/dist-lib/components/ui/Button.d.ts +6 -4
  19. package/dist-lib/components/ui/Button.js +131 -0
  20. package/dist-lib/components/ui/Button.js.map +1 -0
  21. package/dist-lib/components/ui/Calendar.d.ts +7 -1
  22. package/dist-lib/components/ui/Calendar.js +139 -0
  23. package/dist-lib/components/ui/Calendar.js.map +1 -0
  24. package/dist-lib/components/ui/Card.d.ts +3 -1
  25. package/dist-lib/components/ui/Card.js +97 -0
  26. package/dist-lib/components/ui/Card.js.map +1 -0
  27. package/dist-lib/components/ui/Carousel.d.ts +11 -7
  28. package/dist-lib/components/ui/Carousel.js +174 -0
  29. package/dist-lib/components/ui/Carousel.js.map +1 -0
  30. package/dist-lib/components/ui/Chart.d.ts +68 -7
  31. package/dist-lib/components/ui/Chart.js +487 -0
  32. package/dist-lib/components/ui/Chart.js.map +1 -0
  33. package/dist-lib/components/ui/Checkbox.js +70 -0
  34. package/dist-lib/components/ui/Checkbox.js.map +1 -0
  35. package/dist-lib/components/ui/Combobox.d.ts +9 -0
  36. package/dist-lib/components/ui/Combobox.js +195 -0
  37. package/dist-lib/components/ui/Combobox.js.map +1 -0
  38. package/dist-lib/components/ui/CommandPalette.d.ts +9 -6
  39. package/dist-lib/components/ui/CommandPalette.js +179 -0
  40. package/dist-lib/components/ui/CommandPalette.js.map +1 -0
  41. package/dist-lib/components/ui/ContextMenu.d.ts +7 -2
  42. package/dist-lib/components/ui/ContextMenu.js +165 -0
  43. package/dist-lib/components/ui/ContextMenu.js.map +1 -0
  44. package/dist-lib/components/ui/DataGrid.d.ts +17 -4
  45. package/dist-lib/components/ui/DataGrid.js +99 -0
  46. package/dist-lib/components/ui/DataGrid.js.map +1 -0
  47. package/dist-lib/components/ui/DatePicker.d.ts +16 -13
  48. package/dist-lib/components/ui/DatePicker.js +193 -0
  49. package/dist-lib/components/ui/DatePicker.js.map +1 -0
  50. package/dist-lib/components/ui/DesignSystemProvider.d.ts +102 -41
  51. package/dist-lib/components/ui/DesignSystemProvider.js +135 -0
  52. package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
  53. package/dist-lib/components/ui/Dialog.d.ts +19 -4
  54. package/dist-lib/components/ui/Dialog.js +165 -0
  55. package/dist-lib/components/ui/Dialog.js.map +1 -0
  56. package/dist-lib/components/ui/Drawer.d.ts +23 -2
  57. package/dist-lib/components/ui/Drawer.js +132 -0
  58. package/dist-lib/components/ui/Drawer.js.map +1 -0
  59. package/dist-lib/components/ui/DropdownMenu.js +169 -0
  60. package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
  61. package/dist-lib/components/ui/EmptyState.d.ts +2 -0
  62. package/dist-lib/components/ui/EmptyState.js +46 -0
  63. package/dist-lib/components/ui/EmptyState.js.map +1 -0
  64. package/dist-lib/components/ui/ErrorState.d.ts +13 -2
  65. package/dist-lib/components/ui/ErrorState.js +69 -0
  66. package/dist-lib/components/ui/ErrorState.js.map +1 -0
  67. package/dist-lib/components/ui/FileUpload.d.ts +3 -0
  68. package/dist-lib/components/ui/FileUpload.js +111 -0
  69. package/dist-lib/components/ui/FileUpload.js.map +1 -0
  70. package/dist-lib/components/ui/Form.d.ts +16 -2
  71. package/dist-lib/components/ui/Form.js +131 -0
  72. package/dist-lib/components/ui/Form.js.map +1 -0
  73. package/dist-lib/components/ui/Icon.d.ts +1 -1
  74. package/dist-lib/components/ui/Icon.js +32 -0
  75. package/dist-lib/components/ui/Icon.js.map +1 -0
  76. package/dist-lib/components/ui/IconButton.d.ts +3 -3
  77. package/dist-lib/components/ui/IconButton.js +64 -0
  78. package/dist-lib/components/ui/IconButton.js.map +1 -0
  79. package/dist-lib/components/ui/Input.d.ts +9 -4
  80. package/dist-lib/components/ui/Input.js +149 -0
  81. package/dist-lib/components/ui/Input.js.map +1 -0
  82. package/dist-lib/components/ui/Kbd.js +24 -0
  83. package/dist-lib/components/ui/Kbd.js.map +1 -0
  84. package/dist-lib/components/ui/MultiSelect.d.ts +3 -1
  85. package/dist-lib/components/ui/MultiSelect.js +210 -0
  86. package/dist-lib/components/ui/MultiSelect.js.map +1 -0
  87. package/dist-lib/components/ui/Pagination.d.ts +23 -0
  88. package/dist-lib/components/ui/Pagination.js +153 -0
  89. package/dist-lib/components/ui/Pagination.js.map +1 -0
  90. package/dist-lib/components/ui/Popover.js +35 -0
  91. package/dist-lib/components/ui/Popover.js.map +1 -0
  92. package/dist-lib/components/ui/Progress.d.ts +3 -3
  93. package/dist-lib/components/ui/Progress.js +100 -0
  94. package/dist-lib/components/ui/Progress.js.map +1 -0
  95. package/dist-lib/components/ui/RadioGroup.d.ts +1 -1
  96. package/dist-lib/components/ui/RadioGroup.js +81 -0
  97. package/dist-lib/components/ui/RadioGroup.js.map +1 -0
  98. package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
  99. package/dist-lib/components/ui/RelativeTime.js +31 -0
  100. package/dist-lib/components/ui/RelativeTime.js.map +1 -0
  101. package/dist-lib/components/ui/ScrollArea.d.ts +9 -1
  102. package/dist-lib/components/ui/ScrollArea.js +60 -0
  103. package/dist-lib/components/ui/ScrollArea.js.map +1 -0
  104. package/dist-lib/components/ui/Select.d.ts +6 -1
  105. package/dist-lib/components/ui/Select.js +139 -0
  106. package/dist-lib/components/ui/Select.js.map +1 -0
  107. package/dist-lib/components/ui/Separator.js +26 -0
  108. package/dist-lib/components/ui/Separator.js.map +1 -0
  109. package/dist-lib/components/ui/Sheet.d.ts +10 -1
  110. package/dist-lib/components/ui/Sheet.js +136 -0
  111. package/dist-lib/components/ui/Sheet.js.map +1 -0
  112. package/dist-lib/components/ui/Sidebar.d.ts +29 -14
  113. package/dist-lib/components/ui/Sidebar.js +212 -0
  114. package/dist-lib/components/ui/Sidebar.js.map +1 -0
  115. package/dist-lib/components/ui/Skeleton.d.ts +13 -2
  116. package/dist-lib/components/ui/Skeleton.js +29 -0
  117. package/dist-lib/components/ui/Skeleton.js.map +1 -0
  118. package/dist-lib/components/ui/Slider.js +64 -0
  119. package/dist-lib/components/ui/Slider.js.map +1 -0
  120. package/dist-lib/components/ui/Snackbar.d.ts +1 -1
  121. package/dist-lib/components/ui/Snackbar.js +57 -0
  122. package/dist-lib/components/ui/Snackbar.js.map +1 -0
  123. package/dist-lib/components/ui/Spinner.js +54 -0
  124. package/dist-lib/components/ui/Spinner.js.map +1 -0
  125. package/dist-lib/components/ui/Stepper.d.ts +6 -0
  126. package/dist-lib/components/ui/Stepper.js +111 -0
  127. package/dist-lib/components/ui/Stepper.js.map +1 -0
  128. package/dist-lib/components/ui/Switch.js +80 -0
  129. package/dist-lib/components/ui/Switch.js.map +1 -0
  130. package/dist-lib/components/ui/Table.d.ts +41 -5
  131. package/dist-lib/components/ui/Table.js +179 -0
  132. package/dist-lib/components/ui/Table.js.map +1 -0
  133. package/dist-lib/components/ui/Tabs.d.ts +1 -1
  134. package/dist-lib/components/ui/Tabs.js +91 -0
  135. package/dist-lib/components/ui/Tabs.js.map +1 -0
  136. package/dist-lib/components/ui/TagInput.d.ts +17 -2
  137. package/dist-lib/components/ui/TagInput.js +111 -0
  138. package/dist-lib/components/ui/TagInput.js.map +1 -0
  139. package/dist-lib/components/ui/Textarea.js +88 -0
  140. package/dist-lib/components/ui/Textarea.js.map +1 -0
  141. package/dist-lib/components/ui/Timeline.d.ts +16 -6
  142. package/dist-lib/components/ui/Timeline.js +56 -0
  143. package/dist-lib/components/ui/Timeline.js.map +1 -0
  144. package/dist-lib/components/ui/Toast.d.ts +1 -1
  145. package/dist-lib/components/ui/Toast.js +158 -0
  146. package/dist-lib/components/ui/Toast.js.map +1 -0
  147. package/dist-lib/components/ui/Tooltip.d.ts +4 -1
  148. package/dist-lib/components/ui/Tooltip.js +60 -0
  149. package/dist-lib/components/ui/Tooltip.js.map +1 -0
  150. package/dist-lib/components/ui/TopNav.d.ts +7 -3
  151. package/dist-lib/components/ui/TopNav.js +62 -0
  152. package/dist-lib/components/ui/TopNav.js.map +1 -0
  153. package/dist-lib/components/ui/Tree.d.ts +34 -7
  154. package/dist-lib/components/ui/Tree.js +170 -0
  155. package/dist-lib/components/ui/Tree.js.map +1 -0
  156. package/dist-lib/hooks/use-debounce.d.ts +19 -0
  157. package/dist-lib/hooks/use-debounce.js +36 -0
  158. package/dist-lib/hooks/use-debounce.js.map +1 -0
  159. package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
  160. package/dist-lib/hooks/use-delayed-loading.js +20 -0
  161. package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
  162. package/dist-lib/hooks/use-field-ids.d.ts +30 -0
  163. package/dist-lib/hooks/use-field-ids.js +18 -0
  164. package/dist-lib/hooks/use-field-ids.js.map +1 -0
  165. package/dist-lib/hooks/use-media-query.d.ts +3 -1
  166. package/dist-lib/hooks/use-media-query.js +22 -0
  167. package/dist-lib/hooks/use-media-query.js.map +1 -0
  168. package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
  169. package/dist-lib/hooks/use-modifier-key.js +19 -0
  170. package/dist-lib/hooks/use-modifier-key.js.map +1 -0
  171. package/dist-lib/hooks/use-strings.d.ts +5 -0
  172. package/dist-lib/hooks/use-strings.js +12 -0
  173. package/dist-lib/hooks/use-strings.js.map +1 -0
  174. package/dist-lib/hooks/use-toast.d.ts +7 -2
  175. package/dist-lib/hooks/use-toast.js +67 -0
  176. package/dist-lib/hooks/use-toast.js.map +1 -0
  177. package/dist-lib/icon.d.ts +8 -0
  178. package/dist-lib/icon.js +7 -0
  179. package/dist-lib/icon.js.map +1 -0
  180. package/dist-lib/icons/index.d.ts +80 -88
  181. package/dist-lib/icons/index.js +163 -0
  182. package/dist-lib/icons/index.js.map +1 -0
  183. package/dist-lib/illustrations/index.d.ts +1 -0
  184. package/dist-lib/illustrations/index.js +114 -0
  185. package/dist-lib/illustrations/index.js.map +1 -0
  186. package/dist-lib/index.d.ts +68 -59
  187. package/dist-lib/index.js +288 -4530
  188. package/dist-lib/index.js.map +1 -1
  189. package/dist-lib/lib/format.d.ts +65 -0
  190. package/dist-lib/lib/format.js +95 -0
  191. package/dist-lib/lib/format.js.map +1 -0
  192. package/dist-lib/lib/return-focus.d.ts +11 -0
  193. package/dist-lib/lib/return-focus.js +12 -0
  194. package/dist-lib/lib/return-focus.js.map +1 -0
  195. package/dist-lib/lib/strings.d.ts +190 -0
  196. package/dist-lib/lib/strings.js +141 -0
  197. package/dist-lib/lib/strings.js.map +1 -0
  198. package/dist-lib/lib/strings.mn.d.ts +3 -0
  199. package/dist-lib/lib/strings.mn.js +115 -0
  200. package/dist-lib/lib/strings.mn.js.map +1 -0
  201. package/dist-lib/lib/utils.d.ts +0 -1
  202. package/dist-lib/lib/utils.js +10 -0
  203. package/dist-lib/lib/utils.js.map +1 -0
  204. package/dist-lib/styles.css +1 -1
  205. package/dist-lib/theme.css +840 -0
  206. package/package.json +38 -8
  207. package/dist-lib/index.cjs +0 -8
  208. 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