@nocoo/basalt 2.0.0-rc.1

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 (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/charts/area.d.ts +8 -0
  4. package/dist/charts/area.js +55 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +9 -0
  7. package/dist/charts/bar.js +42 -0
  8. package/dist/charts/bar.js.map +1 -0
  9. package/dist/charts/bullet.d.ts +8 -0
  10. package/dist/charts/bullet.js +50 -0
  11. package/dist/charts/bullet.js.map +1 -0
  12. package/dist/charts/chart-colors.d.ts +1 -0
  13. package/dist/charts/chart-colors.js +3 -0
  14. package/dist/charts/charts.d.ts +6 -0
  15. package/dist/charts/charts.js +15 -0
  16. package/dist/charts/charts.js.map +1 -0
  17. package/dist/charts/config.d.ts +117 -0
  18. package/dist/charts/config.js +117 -0
  19. package/dist/charts/config.js.map +1 -0
  20. package/dist/charts/custom-chart.d.ts +6 -0
  21. package/dist/charts/custom-chart.js +15 -0
  22. package/dist/charts/custom-chart.js.map +1 -0
  23. package/dist/charts/date-navigation.d.ts +22 -0
  24. package/dist/charts/date-navigation.js +122 -0
  25. package/dist/charts/date-navigation.js.map +1 -0
  26. package/dist/charts/donut.d.ts +8 -0
  27. package/dist/charts/donut.js +36 -0
  28. package/dist/charts/donut.js.map +1 -0
  29. package/dist/charts/frame.d.ts +9 -0
  30. package/dist/charts/frame.js +22 -0
  31. package/dist/charts/frame.js.map +1 -0
  32. package/dist/charts/funnel.d.ts +7 -0
  33. package/dist/charts/funnel.js +35 -0
  34. package/dist/charts/funnel.js.map +1 -0
  35. package/dist/charts/gauge.d.ts +8 -0
  36. package/dist/charts/gauge.js +46 -0
  37. package/dist/charts/gauge.js.map +1 -0
  38. package/dist/charts/grouped-bar.d.ts +7 -0
  39. package/dist/charts/grouped-bar.js +42 -0
  40. package/dist/charts/grouped-bar.js.map +1 -0
  41. package/dist/charts/heatmap-calendar.d.ts +27 -0
  42. package/dist/charts/heatmap-calendar.js +200 -0
  43. package/dist/charts/heatmap-calendar.js.map +1 -0
  44. package/dist/charts/item-list.d.ts +9 -0
  45. package/dist/charts/item-list.js +22 -0
  46. package/dist/charts/item-list.js.map +1 -0
  47. package/dist/charts/line.d.ts +9 -0
  48. package/dist/charts/line.js +58 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/palette.d.ts +33 -0
  51. package/dist/charts/palette.js +44 -0
  52. package/dist/charts/palette.js.map +1 -0
  53. package/dist/charts/radar.d.ts +6 -0
  54. package/dist/charts/radar.js +37 -0
  55. package/dist/charts/radar.js.map +1 -0
  56. package/dist/charts/sample.d.ts +42 -0
  57. package/dist/charts/sample.js +124 -0
  58. package/dist/charts/sample.js.map +1 -0
  59. package/dist/charts/sankey.d.ts +6 -0
  60. package/dist/charts/sankey.js +51 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/slot-bar.d.ts +15 -0
  63. package/dist/charts/slot-bar.js +80 -0
  64. package/dist/charts/slot-bar.js.map +1 -0
  65. package/dist/charts/sparkline.d.ts +6 -0
  66. package/dist/charts/sparkline.js +29 -0
  67. package/dist/charts/sparkline.js.map +1 -0
  68. package/dist/charts/stacked-bar.d.ts +7 -0
  69. package/dist/charts/stacked-bar.js +51 -0
  70. package/dist/charts/stacked-bar.js.map +1 -0
  71. package/dist/charts/stat-card.d.ts +21 -0
  72. package/dist/charts/stat-card.js +66 -0
  73. package/dist/charts/stat-card.js.map +1 -0
  74. package/dist/charts/timeline.d.ts +17 -0
  75. package/dist/charts/timeline.js +79 -0
  76. package/dist/charts/timeline.js.map +1 -0
  77. package/dist/charts/timeseries.d.ts +6 -0
  78. package/dist/charts/timeseries.js +15 -0
  79. package/dist/charts/timeseries.js.map +1 -0
  80. package/dist/components/accordion.d.ts +6 -0
  81. package/dist/components/accordion.js +21 -0
  82. package/dist/components/accordion.js.map +1 -0
  83. package/dist/components/alert-dialog.d.ts +25 -0
  84. package/dist/components/alert-dialog.js +61 -0
  85. package/dist/components/alert-dialog.js.map +1 -0
  86. package/dist/components/app-header.d.ts +10 -0
  87. package/dist/components/app-header.js +35 -0
  88. package/dist/components/app-header.js.map +1 -0
  89. package/dist/components/app-shell.d.ts +4 -0
  90. package/dist/components/app-shell.js +29 -0
  91. package/dist/components/app-shell.js.map +1 -0
  92. package/dist/components/autocomplete.d.ts +47 -0
  93. package/dist/components/autocomplete.js +28 -0
  94. package/dist/components/autocomplete.js.map +1 -0
  95. package/dist/components/avatar.d.ts +5 -0
  96. package/dist/components/avatar.js +28 -0
  97. package/dist/components/avatar.js.map +1 -0
  98. package/dist/components/badge.d.ts +10 -0
  99. package/dist/components/badge.js +37 -0
  100. package/dist/components/badge.js.map +1 -0
  101. package/dist/components/banner.d.ts +22 -0
  102. package/dist/components/banner.js +88 -0
  103. package/dist/components/banner.js.map +1 -0
  104. package/dist/components/basalt-mark.d.ts +8 -0
  105. package/dist/components/basalt-mark.js +17 -0
  106. package/dist/components/basalt-mark.js.map +1 -0
  107. package/dist/components/breadcrumbs.d.ts +9 -0
  108. package/dist/components/breadcrumbs.js +38 -0
  109. package/dist/components/breadcrumbs.js.map +1 -0
  110. package/dist/components/button.d.ts +17 -0
  111. package/dist/components/button.js +73 -0
  112. package/dist/components/button.js.map +1 -0
  113. package/dist/components/checkbox.d.ts +86 -0
  114. package/dist/components/checkbox.js +107 -0
  115. package/dist/components/checkbox.js.map +1 -0
  116. package/dist/components/clipboard-text.d.ts +5 -0
  117. package/dist/components/clipboard-text.js +33 -0
  118. package/dist/components/clipboard-text.js.map +1 -0
  119. package/dist/components/code.d.ts +26 -0
  120. package/dist/components/code.js +45 -0
  121. package/dist/components/code.js.map +1 -0
  122. package/dist/components/collapsible.d.ts +33 -0
  123. package/dist/components/collapsible.js +38 -0
  124. package/dist/components/collapsible.js.map +1 -0
  125. package/dist/components/combobox.d.ts +47 -0
  126. package/dist/components/combobox.js +28 -0
  127. package/dist/components/combobox.js.map +1 -0
  128. package/dist/components/command-palette.d.ts +83 -0
  129. package/dist/components/command-palette.js +90 -0
  130. package/dist/components/command-palette.js.map +1 -0
  131. package/dist/components/confirm-dialog.d.ts +52 -0
  132. package/dist/components/confirm-dialog.js +61 -0
  133. package/dist/components/confirm-dialog.js.map +1 -0
  134. package/dist/components/context-menu.d.ts +7 -0
  135. package/dist/components/context-menu.js +23 -0
  136. package/dist/components/context-menu.js.map +1 -0
  137. package/dist/components/data-table.d.ts +76 -0
  138. package/dist/components/data-table.js +230 -0
  139. package/dist/components/data-table.js.map +1 -0
  140. package/dist/components/date-picker.d.ts +90 -0
  141. package/dist/components/date-picker.js +452 -0
  142. package/dist/components/date-picker.js.map +1 -0
  143. package/dist/components/dialog.d.ts +37 -0
  144. package/dist/components/dialog.js +67 -0
  145. package/dist/components/dialog.js.map +1 -0
  146. package/dist/components/dropdown-menu.d.ts +38 -0
  147. package/dist/components/dropdown-menu.js +24 -0
  148. package/dist/components/dropdown-menu.js.map +1 -0
  149. package/dist/components/empty.d.ts +6 -0
  150. package/dist/components/empty.js +28 -0
  151. package/dist/components/empty.js.map +1 -0
  152. package/dist/components/field.d.ts +39 -0
  153. package/dist/components/field.js +52 -0
  154. package/dist/components/field.js.map +1 -0
  155. package/dist/components/flow.d.ts +24 -0
  156. package/dist/components/flow.js +56 -0
  157. package/dist/components/flow.js.map +1 -0
  158. package/dist/components/grid.d.ts +15 -0
  159. package/dist/components/grid.js +24 -0
  160. package/dist/components/grid.js.map +1 -0
  161. package/dist/components/hover-card.d.ts +5 -0
  162. package/dist/components/hover-card.js +18 -0
  163. package/dist/components/hover-card.js.map +1 -0
  164. package/dist/components/input-area.d.ts +19 -0
  165. package/dist/components/input-area.js +27 -0
  166. package/dist/components/input-area.js.map +1 -0
  167. package/dist/components/input-group.d.ts +70 -0
  168. package/dist/components/input-group.js +78 -0
  169. package/dist/components/input-group.js.map +1 -0
  170. package/dist/components/input.d.ts +19 -0
  171. package/dist/components/input.js +28 -0
  172. package/dist/components/input.js.map +1 -0
  173. package/dist/components/label.d.ts +20 -0
  174. package/dist/components/label.js +34 -0
  175. package/dist/components/label.js.map +1 -0
  176. package/dist/components/layer-card.d.ts +69 -0
  177. package/dist/components/layer-card.js +104 -0
  178. package/dist/components/layer-card.js.map +1 -0
  179. package/dist/components/link.d.ts +8 -0
  180. package/dist/components/link.js +18 -0
  181. package/dist/components/link.js.map +1 -0
  182. package/dist/components/loader.d.ts +4 -0
  183. package/dist/components/loader.js +66 -0
  184. package/dist/components/loader.js.map +1 -0
  185. package/dist/components/loading-screen.d.ts +5 -0
  186. package/dist/components/loading-screen.js +24 -0
  187. package/dist/components/loading-screen.js.map +1 -0
  188. package/dist/components/menu-bar.d.ts +8 -0
  189. package/dist/components/menu-bar.js +42 -0
  190. package/dist/components/menu-bar.js.map +1 -0
  191. package/dist/components/meter.d.ts +8 -0
  192. package/dist/components/meter.js +26 -0
  193. package/dist/components/meter.js.map +1 -0
  194. package/dist/components/navigation-menu.d.ts +6 -0
  195. package/dist/components/navigation-menu.js +16 -0
  196. package/dist/components/navigation-menu.js.map +1 -0
  197. package/dist/components/overlay.d.ts +16 -0
  198. package/dist/components/overlay.js +14 -0
  199. package/dist/components/overlay.js.map +1 -0
  200. package/dist/components/page-header.d.ts +19 -0
  201. package/dist/components/page-header.js +43 -0
  202. package/dist/components/page-header.js.map +1 -0
  203. package/dist/components/pagination.d.ts +35 -0
  204. package/dist/components/pagination.js +68 -0
  205. package/dist/components/pagination.js.map +1 -0
  206. package/dist/components/popover.d.ts +38 -0
  207. package/dist/components/popover.js +65 -0
  208. package/dist/components/popover.js.map +1 -0
  209. package/dist/components/radio.d.ts +108 -0
  210. package/dist/components/radio.js +80 -0
  211. package/dist/components/radio.js.map +1 -0
  212. package/dist/components/scroll-area.d.ts +15 -0
  213. package/dist/components/scroll-area.js +49 -0
  214. package/dist/components/scroll-area.js.map +1 -0
  215. package/dist/components/segment-control.d.ts +35 -0
  216. package/dist/components/segment-control.js +46 -0
  217. package/dist/components/segment-control.js.map +1 -0
  218. package/dist/components/select.d.ts +99 -0
  219. package/dist/components/select.js +51 -0
  220. package/dist/components/select.js.map +1 -0
  221. package/dist/components/sensitive-input.d.ts +23 -0
  222. package/dist/components/sensitive-input.js +43 -0
  223. package/dist/components/sensitive-input.js.map +1 -0
  224. package/dist/components/separator.d.ts +26 -0
  225. package/dist/components/separator.js +18 -0
  226. package/dist/components/separator.js.map +1 -0
  227. package/dist/components/sheet.d.ts +26 -0
  228. package/dist/components/sheet.js +49 -0
  229. package/dist/components/sheet.js.map +1 -0
  230. package/dist/components/sidebar.d.ts +101 -0
  231. package/dist/components/sidebar.js +260 -0
  232. package/dist/components/sidebar.js.map +1 -0
  233. package/dist/components/skeleton-line.d.ts +6 -0
  234. package/dist/components/skeleton-line.js +22 -0
  235. package/dist/components/skeleton-line.js.map +1 -0
  236. package/dist/components/slider.d.ts +3 -0
  237. package/dist/components/slider.js +21 -0
  238. package/dist/components/slider.js.map +1 -0
  239. package/dist/components/stat-strip.d.ts +19 -0
  240. package/dist/components/stat-strip.js +27 -0
  241. package/dist/components/stat-strip.js.map +1 -0
  242. package/dist/components/switch.d.ts +85 -0
  243. package/dist/components/switch.js +94 -0
  244. package/dist/components/switch.js.map +1 -0
  245. package/dist/components/table-of-contents.d.ts +33 -0
  246. package/dist/components/table-of-contents.js +37 -0
  247. package/dist/components/table-of-contents.js.map +1 -0
  248. package/dist/components/table-pager.d.ts +26 -0
  249. package/dist/components/table-pager.js +35 -0
  250. package/dist/components/table-pager.js.map +1 -0
  251. package/dist/components/table.d.ts +45 -0
  252. package/dist/components/table.js +32 -0
  253. package/dist/components/table.js.map +1 -0
  254. package/dist/components/tabs.d.ts +65 -0
  255. package/dist/components/tabs.js +56 -0
  256. package/dist/components/tabs.js.map +1 -0
  257. package/dist/components/text.d.ts +32 -0
  258. package/dist/components/text.js +46 -0
  259. package/dist/components/text.js.map +1 -0
  260. package/dist/components/theme-toggle.d.ts +7 -0
  261. package/dist/components/theme-toggle.js +28 -0
  262. package/dist/components/theme-toggle.js.map +1 -0
  263. package/dist/components/toast.d.ts +27 -0
  264. package/dist/components/toast.js +78 -0
  265. package/dist/components/toast.js.map +1 -0
  266. package/dist/components/toggle-group.d.ts +4 -0
  267. package/dist/components/toggle-group.js +48 -0
  268. package/dist/components/toggle-group.js.map +1 -0
  269. package/dist/components/toggle.d.ts +7 -0
  270. package/dist/components/toggle.js +37 -0
  271. package/dist/components/toggle.js.map +1 -0
  272. package/dist/components/toolbar.d.ts +58 -0
  273. package/dist/components/toolbar.js +76 -0
  274. package/dist/components/toolbar.js.map +1 -0
  275. package/dist/components/tooltip.d.ts +13 -0
  276. package/dist/components/tooltip.js +18 -0
  277. package/dist/components/tooltip.js.map +1 -0
  278. package/dist/components/typeahead-field.d.ts +24 -0
  279. package/dist/components/typeahead-field.js +177 -0
  280. package/dist/components/typeahead-field.js.map +1 -0
  281. package/dist/index.d.ts +33 -0
  282. package/dist/index.js +35 -0
  283. package/dist/providers/link.d.ts +12 -0
  284. package/dist/providers/link.js +18 -0
  285. package/dist/providers/link.js.map +1 -0
  286. package/dist/providers/theme.d.ts +11 -0
  287. package/dist/providers/theme.js +43 -0
  288. package/dist/providers/theme.js.map +1 -0
  289. package/dist/styles/standalone.css +2233 -0
  290. package/dist/styles/tailwind.css +103 -0
  291. package/dist/styles/tokens.css +277 -0
  292. package/dist/utils/cn.d.ts +2 -0
  293. package/dist/utils/cn.js +11 -0
  294. package/dist/utils/cn.js.map +1 -0
  295. package/dist/utils/control-surface.d.ts +2 -0
  296. package/dist/utils/control-surface.js +11 -0
  297. package/dist/utils/control-surface.js.map +1 -0
  298. package/dist/utils/selection-indicator.d.ts +24 -0
  299. package/dist/utils/selection-indicator.js +108 -0
  300. package/dist/utils/selection-indicator.js.map +1 -0
  301. package/package.json +107 -0
@@ -0,0 +1,260 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { OVERLAY_LAYER as t, OVERLAY_MOTION as n } from "./overlay.js";
4
+ import { Dialog as r, DialogOverlay as i, DialogPortal as a } from "./dialog.js";
5
+ import { Collapsible as o, CollapsibleContent as s, CollapsibleTrigger as c } from "./collapsible.js";
6
+ import { SkeletonLine as l } from "./skeleton-line.js";
7
+ import { createContext as u, useCallback as d, useContext as f, useLayoutEffect as p, useRef as m, useState as h } from "react";
8
+ import { ChevronUp as g, Search as _ } from "lucide-react";
9
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
10
+ import * as b from "@radix-ui/react-dialog";
11
+ //#region src/components/sidebar.tsx
12
+ var x = u(null);
13
+ function S() {
14
+ let e = f(x);
15
+ if (!e) throw Error("useSidebar must be used within SidebarProvider");
16
+ return e;
17
+ }
18
+ function C({ collapsed: e, defaultCollapsed: t = !1, onCollapsedChange: n, side: r = "left", loading: i = !1, peek: a = !1, overlay: o = !1, defaultWidth: s = 260, children: c }) {
19
+ let [l, u] = h(t), [f, g] = h(!1), [_, y] = h(() => w(s)), b = d((e) => {
20
+ y(w(e));
21
+ }, []), S = m(null), C = m(e ?? t), T = m(o), E = e ?? l;
22
+ p(() => {
23
+ o && !E && (C.current || !T.current) && document.activeElement instanceof HTMLElement && (S.current = document.activeElement), C.current = E, T.current = o;
24
+ });
25
+ let D = d((t) => {
26
+ !t && document.activeElement instanceof HTMLElement && (S.current = document.activeElement), e === void 0 && u(t), n?.(t);
27
+ }, [e, n]);
28
+ return /* @__PURE__ */ v(x.Provider, {
29
+ value: {
30
+ collapsed: E,
31
+ setCollapsed: D,
32
+ side: r,
33
+ loading: i,
34
+ peek: a,
35
+ peeking: f,
36
+ setPeeking: g,
37
+ overlay: o,
38
+ width: _,
39
+ setWidth: b,
40
+ lastFocusRef: S
41
+ },
42
+ children: c
43
+ });
44
+ }
45
+ function w(e) {
46
+ return Math.min(400, Math.max(180, e));
47
+ }
48
+ function T({ side: t, width: n, onWidth: r }) {
49
+ return /* @__PURE__ */ v("div", {
50
+ role: "separator",
51
+ "aria-orientation": "vertical",
52
+ "aria-valuenow": n,
53
+ "aria-valuemin": 180,
54
+ "aria-valuemax": 400,
55
+ "aria-label": "Resize sidebar",
56
+ tabIndex: 0,
57
+ className: e("absolute top-0 h-full w-1 cursor-col-resize bg-transparent", t === "right" ? "left-0" : "right-0"),
58
+ onPointerDown: (e) => {
59
+ e.preventDefault(), e.currentTarget.setPointerCapture(e.pointerId);
60
+ let i = e.clientX, a = n, o = e.currentTarget, s = (e) => {
61
+ let n = t === "right" ? i - e.clientX : e.clientX - i;
62
+ r(w(a + n));
63
+ }, c = () => {
64
+ o.removeEventListener("pointermove", s), o.removeEventListener("pointerup", c), o.removeEventListener("pointercancel", c);
65
+ };
66
+ o.addEventListener("pointermove", s), o.addEventListener("pointerup", c), o.addEventListener("pointercancel", c);
67
+ },
68
+ onKeyDown: (e) => {
69
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
70
+ e.preventDefault();
71
+ let i = e.key === "ArrowRight" ? 1 : -1;
72
+ r(w(n + (t === "right" ? -i * 8 : i * 8)));
73
+ }
74
+ });
75
+ }
76
+ function E({ collapsed: o, className: s, children: c, onMouseEnter: u, onMouseLeave: d, style: p, ...m }) {
77
+ let h = f(x), g = h ? h.collapsed && !(h.peek && h.peeking) : o ?? !1, _ = h?.side ?? "left", S = h?.overlay ?? !1, C = h?.width ?? 260, w = h?.loading ? /* @__PURE__ */ y("div", {
78
+ className: "flex flex-col gap-2 p-3",
79
+ role: "status",
80
+ "aria-live": "polite",
81
+ children: [
82
+ /* @__PURE__ */ v(l, {}),
83
+ /* @__PURE__ */ v(l, {}),
84
+ /* @__PURE__ */ v(l, {})
85
+ ]
86
+ }) : c, E = h && !g ? /* @__PURE__ */ v(T, {
87
+ side: _,
88
+ width: h.width,
89
+ onWidth: h.setWidth
90
+ }) : null, D = e("relative flex h-screen shrink-0 flex-col bg-basalt-background text-sm text-basalt-foreground", n, s);
91
+ return S && h ? /* @__PURE__ */ v(r, {
92
+ open: !h.collapsed,
93
+ onOpenChange: (e) => h.setCollapsed(!e),
94
+ children: /* @__PURE__ */ y(a, { children: [/* @__PURE__ */ v(i, {}), /* @__PURE__ */ y(b.Content, {
95
+ "aria-label": "Sidebar",
96
+ "data-overlay": "",
97
+ "data-side": _,
98
+ "aria-busy": h.loading || void 0,
99
+ onMouseEnter: u,
100
+ onMouseLeave: d,
101
+ ref: (e) => {
102
+ e && document.activeElement instanceof HTMLElement && !e.contains(document.activeElement) && (h.lastFocusRef.current = document.activeElement);
103
+ },
104
+ onOpenAutoFocus: (e) => {
105
+ let t = "relatedTarget" in e ? e.relatedTarget : null;
106
+ t instanceof HTMLElement && (h.lastFocusRef.current = t);
107
+ },
108
+ onCloseAutoFocus: (e) => {
109
+ e.preventDefault(), h.lastFocusRef.current?.focus();
110
+ },
111
+ className: e(D, t, "fixed inset-y-0 overflow-hidden shadow-md", _ === "right" ? "right-0" : "left-0"),
112
+ style: {
113
+ width: C,
114
+ ...p
115
+ },
116
+ ...m,
117
+ children: [w, E]
118
+ })] })
119
+ }) : /* @__PURE__ */ y("aside", {
120
+ "data-collapsed": g ? "" : void 0,
121
+ "data-side": _,
122
+ "aria-busy": h?.loading || void 0,
123
+ onMouseEnter: (e) => {
124
+ h?.peek && h.collapsed && h.setPeeking(!0), u?.(e);
125
+ },
126
+ onMouseLeave: (e) => {
127
+ h?.peek && h.setPeeking(!1), d?.(e);
128
+ },
129
+ className: e(D, "sticky top-0 transition-all duration-300 ease-in-out", _ === "right" ? "order-last" : void 0, g ? "w-[68px] overflow-y-hidden" : "overflow-hidden"),
130
+ style: g ? p : {
131
+ width: C,
132
+ ...p
133
+ },
134
+ ...m,
135
+ children: [w, E]
136
+ });
137
+ }
138
+ function D({ className: t, ...n }) {
139
+ return /* @__PURE__ */ v("div", {
140
+ className: e("flex h-14 shrink-0 items-center px-3", t),
141
+ ...n
142
+ });
143
+ }
144
+ function O({ shortcut: t = "⌘K", className: n, children: r, ...i }) {
145
+ return /* @__PURE__ */ y("button", {
146
+ type: "button",
147
+ className: e("flex w-full cursor-pointer items-center gap-3 rounded-lg bg-basalt-secondary px-3 py-1.5 transition-colors hover:bg-basalt-accent", n),
148
+ ...i,
149
+ children: [
150
+ /* @__PURE__ */ v(_, {
151
+ className: "h-4 w-4 text-basalt-muted-foreground",
152
+ strokeWidth: 1.5
153
+ }),
154
+ /* @__PURE__ */ v("span", {
155
+ className: "flex-1 text-left text-sm text-basalt-muted-foreground",
156
+ children: r
157
+ }),
158
+ /* @__PURE__ */ v("kbd", {
159
+ className: "pointer-events-none hidden rounded-sm border border-basalt-border bg-basalt-card px-1.5 py-0.5 text-[10px] font-medium text-basalt-muted-foreground sm:inline-block",
160
+ children: t
161
+ })
162
+ ]
163
+ });
164
+ }
165
+ function k({ className: t, ...n }) {
166
+ return /* @__PURE__ */ v("nav", {
167
+ className: e("flex min-h-0 flex-1 flex-col overflow-y-auto", t),
168
+ ...n
169
+ });
170
+ }
171
+ function A({ className: t, ...n }) {
172
+ return /* @__PURE__ */ v("p", {
173
+ className: e("px-6 pt-3 pb-1 text-[11px] font-medium tracking-[0.14em] text-basalt-muted-foreground uppercase", t),
174
+ ...n
175
+ });
176
+ }
177
+ function j({ active: t = !1, className: n, ...r }) {
178
+ return /* @__PURE__ */ v("button", {
179
+ type: "button",
180
+ "aria-current": t ? "page" : void 0,
181
+ className: e("flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-normal transition-colors", t ? "bg-basalt-accent text-basalt-foreground" : "text-basalt-muted-foreground hover:bg-basalt-accent hover:text-basalt-foreground", n),
182
+ ...r
183
+ });
184
+ }
185
+ function M({ active: t = !1, className: n, ...r }) {
186
+ return /* @__PURE__ */ v("button", {
187
+ type: "button",
188
+ "aria-current": t ? "page" : void 0,
189
+ className: e("relative flex h-10 w-10 items-center justify-center rounded-lg transition-colors", t ? "bg-basalt-accent text-basalt-foreground" : "text-basalt-muted-foreground hover:bg-basalt-accent hover:text-basalt-foreground", n),
190
+ ...r
191
+ });
192
+ }
193
+ function N({ label: t, defaultOpen: r = !0, children: i }) {
194
+ let [a, l] = h(r);
195
+ return /* @__PURE__ */ y(o, {
196
+ open: a,
197
+ onOpenChange: l,
198
+ children: [/* @__PURE__ */ v("div", {
199
+ className: "mt-2 px-3",
200
+ children: /* @__PURE__ */ v(c, {
201
+ asChild: !0,
202
+ children: /* @__PURE__ */ y("button", {
203
+ type: "button",
204
+ className: "flex w-full items-center justify-between px-3 py-2.5",
205
+ children: [/* @__PURE__ */ v("span", {
206
+ className: "text-sm font-normal text-basalt-muted-foreground",
207
+ children: t
208
+ }), /* @__PURE__ */ v("span", {
209
+ className: "flex h-7 w-7 shrink-0 items-center justify-center",
210
+ children: /* @__PURE__ */ v(g, {
211
+ className: e("h-4 w-4 text-basalt-muted-foreground transition-transform duration-200", n, !a && "rotate-180"),
212
+ strokeWidth: 1.5
213
+ })
214
+ })]
215
+ })
216
+ })
217
+ }), /* @__PURE__ */ v(s, {
218
+ unstyled: !0,
219
+ children: /* @__PURE__ */ v("div", {
220
+ className: "flex flex-col gap-0.5 px-3",
221
+ children: i
222
+ })
223
+ })]
224
+ });
225
+ }
226
+ function P({ className: t, ...n }) {
227
+ return /* @__PURE__ */ v("div", {
228
+ className: e("px-4 py-3", t),
229
+ ...n
230
+ });
231
+ }
232
+ function F({ name: t, email: n, avatar: r, action: i, className: a }) {
233
+ return /* @__PURE__ */ y("div", {
234
+ className: e("flex items-center gap-3", a),
235
+ children: [
236
+ r,
237
+ /* @__PURE__ */ y("div", {
238
+ className: "min-w-0 flex-1",
239
+ children: [/* @__PURE__ */ v("p", {
240
+ className: "truncate text-sm font-medium text-basalt-foreground",
241
+ children: t
242
+ }), n ? /* @__PURE__ */ v("p", {
243
+ className: "truncate text-xs text-basalt-muted-foreground",
244
+ children: n
245
+ }) : null]
246
+ }),
247
+ i
248
+ ]
249
+ });
250
+ }
251
+ function I({ className: t, ...n }) {
252
+ return /* @__PURE__ */ v("div", {
253
+ className: e("min-h-0 flex-1 overflow-y-auto rounded-[16px] bg-basalt-card p-3 text-basalt-card-foreground shadow-sm ring-1 ring-basalt-border/40 md:rounded-basalt-island md:p-5", t),
254
+ ...n
255
+ });
256
+ }
257
+ //#endregion
258
+ export { I as ContentIsland, E as Sidebar, P as SidebarFooter, N as SidebarGroup, D as SidebarHeader, M as SidebarIconItem, j as SidebarItem, k as SidebarNav, A as SidebarPartition, C as SidebarProvider, O as SidebarSearch, F as SidebarUser, S as useSidebar };
259
+
260
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","names":[],"sources":["../../src/components/sidebar.tsx"],"sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { ChevronUp, Search } from \"lucide-react\";\nimport {\n\ttype ButtonHTMLAttributes,\n\tcreateContext,\n\ttype HTMLAttributes,\n\ttype ReactNode,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n\tuseCallback,\n\tuseContext,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"./collapsible\";\nimport { Dialog, DialogOverlay, DialogPortal } from \"./dialog\";\nimport { OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\nimport { SkeletonLine } from \"./skeleton-line\";\n\nexport type SidebarSide = \"left\" | \"right\";\n\ntype SidebarContextValue = {\n\tcollapsed: boolean;\n\tsetCollapsed: (next: boolean) => void;\n\tside: SidebarSide;\n\tloading: boolean;\n\tpeek: boolean;\n\tpeeking: boolean;\n\tsetPeeking: (next: boolean) => void;\n\toverlay: boolean;\n\twidth: number;\n\tsetWidth: (next: number) => void;\n\tlastFocusRef: RefObject<HTMLElement | null>;\n};\n\nconst SidebarContext = createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar() {\n\tconst context = useContext(SidebarContext);\n\tif (!context) {\n\t\tthrow new Error(\"useSidebar must be used within SidebarProvider\");\n\t}\n\treturn context;\n}\n\nexport type SidebarProviderProps = {\n\t/**\n\t * The controlled collapsed state.\n\t */\n\tcollapsed?: boolean;\n\t/**\n\t * The uncontrolled initial collapsed state.\n\t * @default false\n\t */\n\tdefaultCollapsed?: boolean;\n\t/**\n\t * Called when the collapsed state changes.\n\t */\n\tonCollapsedChange?: (collapsed: boolean) => void;\n\t/**\n\t * Which edge the sidebar occupies.\n\t * @default left\n\t */\n\tside?: SidebarSide;\n\t/**\n\t * Replace the nav with a loading skeleton.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Expand the collapsed rail on hover.\n\t * @default false\n\t */\n\tpeek?: boolean;\n\t/**\n\t * Render as an overlay instead of in-flow chrome.\n\t * @default false\n\t */\n\toverlay?: boolean;\n\t/**\n\t * Expanded width in pixels.\n\t * @default 260\n\t */\n\tdefaultWidth?: number;\n\t/**\n\t * Sidebar chrome and page content.\n\t */\n\tchildren: ReactNode;\n};\n\nexport function SidebarProvider({\n\tcollapsed,\n\tdefaultCollapsed = false,\n\tonCollapsedChange,\n\tside = \"left\",\n\tloading = false,\n\tpeek = false,\n\toverlay = false,\n\tdefaultWidth = 260,\n\tchildren,\n}: SidebarProviderProps) {\n\tconst [uncontrolled, setUncontrolled] = useState(defaultCollapsed);\n\tconst [peeking, setPeeking] = useState(false);\n\tconst [width, setWidthState] = useState(() => clampSidebarWidth(defaultWidth));\n\tconst setWidth = useCallback((next: number) => {\n\t\tsetWidthState(clampSidebarWidth(next));\n\t}, []);\n\tconst lastFocusRef = useRef<HTMLElement | null>(null);\n\tconst prevCollapsed = useRef(collapsed ?? defaultCollapsed);\n\tconst prevOverlay = useRef(overlay);\n\tconst resolved = collapsed ?? uncontrolled;\n\tuseLayoutEffect(() => {\n\t\tif (\n\t\t\toverlay &&\n\t\t\t!resolved &&\n\t\t\t(prevCollapsed.current || !prevOverlay.current) &&\n\t\t\tdocument.activeElement instanceof HTMLElement\n\t\t) {\n\t\t\tlastFocusRef.current = document.activeElement;\n\t\t}\n\t\tprevCollapsed.current = resolved;\n\t\tprevOverlay.current = overlay;\n\t});\n\tconst setCollapsed = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!next && document.activeElement instanceof HTMLElement) {\n\t\t\t\tlastFocusRef.current = document.activeElement;\n\t\t\t}\n\t\t\tif (collapsed === undefined) {\n\t\t\t\tsetUncontrolled(next);\n\t\t\t}\n\t\t\tonCollapsedChange?.(next);\n\t\t},\n\t\t[collapsed, onCollapsedChange],\n\t);\n\treturn (\n\t\t<SidebarContext.Provider\n\t\t\tvalue={{\n\t\t\t\tcollapsed: resolved,\n\t\t\t\tsetCollapsed,\n\t\t\t\tside,\n\t\t\t\tloading,\n\t\t\t\tpeek,\n\t\t\t\tpeeking,\n\t\t\t\tsetPeeking,\n\t\t\t\toverlay,\n\t\t\t\twidth,\n\t\t\t\tsetWidth,\n\t\t\t\tlastFocusRef,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</SidebarContext.Provider>\n\t);\n}\n\nexport type SidebarProps = HTMLAttributes<HTMLElement> & {\n\t/**\n\t * Collapse the rail when no provider is present.\n\t * @default false\n\t */\n\tcollapsed?: boolean;\n};\n\nfunction clampSidebarWidth(next: number) {\n\treturn Math.min(400, Math.max(180, next));\n}\n\nfunction SidebarResize({\n\tside,\n\twidth,\n\tonWidth,\n}: {\n\tside: SidebarSide;\n\twidth: number;\n\tonWidth: (next: number) => void;\n}) {\n\tconst onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tevent.preventDefault();\n\t\tevent.currentTarget.setPointerCapture(event.pointerId);\n\t\tconst startX = event.clientX;\n\t\tconst startWidth = width;\n\t\tconst target = event.currentTarget;\n\t\tconst onMove = (move: PointerEvent) => {\n\t\t\tconst delta = side === \"right\" ? startX - move.clientX : move.clientX - startX;\n\t\t\tonWidth(clampSidebarWidth(startWidth + delta));\n\t\t};\n\t\tconst onUp = () => {\n\t\t\ttarget.removeEventListener(\"pointermove\", onMove);\n\t\t\ttarget.removeEventListener(\"pointerup\", onUp);\n\t\t\ttarget.removeEventListener(\"pointercancel\", onUp);\n\t\t};\n\t\ttarget.addEventListener(\"pointermove\", onMove);\n\t\ttarget.addEventListener(\"pointerup\", onUp);\n\t\ttarget.addEventListener(\"pointercancel\", onUp);\n\t};\n\treturn (\n\t\t<div\n\t\t\trole=\"separator\"\n\t\t\taria-orientation=\"vertical\"\n\t\t\taria-valuenow={width}\n\t\t\taria-valuemin={180}\n\t\t\taria-valuemax={400}\n\t\t\taria-label=\"Resize sidebar\"\n\t\t\ttabIndex={0}\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute top-0 h-full w-1 cursor-col-resize bg-transparent\",\n\t\t\t\tside === \"right\" ? \"left-0\" : \"right-0\",\n\t\t\t)}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonKeyDown={(event) => {\n\t\t\t\tif (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst dir = event.key === \"ArrowRight\" ? 1 : -1;\n\t\t\t\tconst delta = side === \"right\" ? -dir * 8 : dir * 8;\n\t\t\t\tonWidth(clampSidebarWidth(width + delta));\n\t\t\t}}\n\t\t/>\n\t);\n}\n\nexport function Sidebar({\n\tcollapsed: collapsedProp,\n\tclassName,\n\tchildren,\n\tonMouseEnter,\n\tonMouseLeave,\n\tstyle,\n\t...props\n}: SidebarProps) {\n\tconst context = useContext(SidebarContext);\n\tconst collapsed = context\n\t\t? context.collapsed && !(context.peek && context.peeking)\n\t\t: (collapsedProp ?? false);\n\tconst side = context?.side ?? \"left\";\n\tconst overlay = context?.overlay ?? false;\n\tconst width = context?.width ?? 260;\n\tconst body = context?.loading ? (\n\t\t<div className=\"flex flex-col gap-2 p-3\" role=\"status\" aria-live=\"polite\">\n\t\t\t<SkeletonLine />\n\t\t\t<SkeletonLine />\n\t\t\t<SkeletonLine />\n\t\t</div>\n\t) : (\n\t\tchildren\n\t);\n\tconst resize =\n\t\tcontext && !collapsed ? (\n\t\t\t<SidebarResize side={side} width={context.width} onWidth={context.setWidth} />\n\t\t) : null;\n\tconst frameClass = cn(\n\t\t\"relative flex h-screen shrink-0 flex-col bg-basalt-background text-sm text-basalt-foreground\",\n\t\tOVERLAY_MOTION,\n\t\tclassName,\n\t);\n\tif (overlay && context) {\n\t\treturn (\n\t\t\t<Dialog open={!context.collapsed} onOpenChange={(open) => context.setCollapsed(!open)}>\n\t\t\t\t<DialogPortal>\n\t\t\t\t\t<DialogOverlay />\n\t\t\t\t\t<DialogPrimitive.Content\n\t\t\t\t\t\taria-label=\"Sidebar\"\n\t\t\t\t\t\tdata-overlay=\"\"\n\t\t\t\t\t\tdata-side={side}\n\t\t\t\t\t\taria-busy={context.loading || undefined}\n\t\t\t\t\t\tonMouseEnter={onMouseEnter}\n\t\t\t\t\t\tonMouseLeave={onMouseLeave}\n\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tnode &&\n\t\t\t\t\t\t\t\tdocument.activeElement instanceof HTMLElement &&\n\t\t\t\t\t\t\t\t!node.contains(document.activeElement)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcontext.lastFocusRef.current = document.activeElement;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonOpenAutoFocus={(event) => {\n\t\t\t\t\t\t\tconst from = \"relatedTarget\" in event ? event.relatedTarget : null;\n\t\t\t\t\t\t\tif (from instanceof HTMLElement) {\n\t\t\t\t\t\t\t\tcontext.lastFocusRef.current = from;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonCloseAutoFocus={(event) => {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tcontext.lastFocusRef.current?.focus();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tframeClass,\n\t\t\t\t\t\t\tOVERLAY_LAYER,\n\t\t\t\t\t\t\t\"fixed inset-y-0 overflow-hidden shadow-md\",\n\t\t\t\t\t\t\tside === \"right\" ? \"right-0\" : \"left-0\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ width, ...style }}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t{body}\n\t\t\t\t\t\t{resize}\n\t\t\t\t\t</DialogPrimitive.Content>\n\t\t\t\t</DialogPortal>\n\t\t\t</Dialog>\n\t\t);\n\t}\n\treturn (\n\t\t<aside\n\t\t\tdata-collapsed={collapsed ? \"\" : undefined}\n\t\t\tdata-side={side}\n\t\t\taria-busy={context?.loading || undefined}\n\t\t\tonMouseEnter={(event) => {\n\t\t\t\tif (context?.peek && context.collapsed) {\n\t\t\t\t\tcontext.setPeeking(true);\n\t\t\t\t}\n\t\t\t\tonMouseEnter?.(event);\n\t\t\t}}\n\t\t\tonMouseLeave={(event) => {\n\t\t\t\tif (context?.peek) {\n\t\t\t\t\tcontext.setPeeking(false);\n\t\t\t\t}\n\t\t\t\tonMouseLeave?.(event);\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\tframeClass,\n\t\t\t\t\"sticky top-0 transition-all duration-300 ease-in-out\",\n\t\t\t\tside === \"right\" ? \"order-last\" : undefined,\n\t\t\t\tcollapsed ? \"w-[68px] overflow-y-hidden\" : \"overflow-hidden\",\n\t\t\t)}\n\t\t\tstyle={!collapsed ? { width, ...style } : style}\n\t\t\t{...props}\n\t\t>\n\t\t\t{body}\n\t\t\t{resize}\n\t\t</aside>\n\t);\n}\n\nexport function SidebarHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n\treturn <div className={cn(\"flex h-14 shrink-0 items-center px-3\", className)} {...props} />;\n}\n\nexport function SidebarSearch({\n\tshortcut = \"⌘K\",\n\tclassName,\n\tchildren,\n\t...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { shortcut?: string }) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full cursor-pointer items-center gap-3 rounded-lg bg-basalt-secondary px-3 py-1.5 transition-colors hover:bg-basalt-accent\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Search className=\"h-4 w-4 text-basalt-muted-foreground\" strokeWidth={1.5} />\n\t\t\t<span className=\"flex-1 text-left text-sm text-basalt-muted-foreground\">{children}</span>\n\t\t\t<kbd className=\"pointer-events-none hidden rounded-sm border border-basalt-border bg-basalt-card px-1.5 py-0.5 text-[10px] font-medium text-basalt-muted-foreground sm:inline-block\">\n\t\t\t\t{shortcut}\n\t\t\t</kbd>\n\t\t</button>\n\t);\n}\n\nexport function SidebarNav({ className, ...props }: HTMLAttributes<HTMLElement>) {\n\treturn (\n\t\t<nav className={cn(\"flex min-h-0 flex-1 flex-col overflow-y-auto\", className)} {...props} />\n\t);\n}\n\nexport function SidebarPartition({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n\treturn (\n\t\t<p\n\t\t\tclassName={cn(\n\t\t\t\t\"px-6 pt-3 pb-1 text-[11px] font-medium tracking-[0.14em] text-basalt-muted-foreground uppercase\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport type SidebarItemProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n\t/**\n\t * Mark the item as the current page.\n\t * @default false\n\t */\n\tactive?: boolean;\n};\n\nexport function SidebarItem({ active = false, className, ...props }: SidebarItemProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-normal transition-colors\",\n\t\t\t\tactive\n\t\t\t\t\t? \"bg-basalt-accent text-basalt-foreground\"\n\t\t\t\t\t: \"text-basalt-muted-foreground hover:bg-basalt-accent hover:text-basalt-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport function SidebarIconItem({\n\tactive = false,\n\tclassName,\n\t...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { active?: boolean }) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-10 w-10 items-center justify-center rounded-lg transition-colors\",\n\t\t\t\tactive\n\t\t\t\t\t? \"bg-basalt-accent text-basalt-foreground\"\n\t\t\t\t\t: \"text-basalt-muted-foreground hover:bg-basalt-accent hover:text-basalt-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport function SidebarGroup({\n\tlabel,\n\tdefaultOpen = true,\n\tchildren,\n}: {\n\tlabel: ReactNode;\n\tdefaultOpen?: boolean;\n\tchildren: ReactNode;\n}) {\n\tconst [open, setOpen] = useState(defaultOpen);\n\treturn (\n\t\t<Collapsible open={open} onOpenChange={setOpen}>\n\t\t\t<div className=\"mt-2 px-3\">\n\t\t\t\t<CollapsibleTrigger asChild>\n\t\t\t\t\t<button type=\"button\" className=\"flex w-full items-center justify-between px-3 py-2.5\">\n\t\t\t\t\t\t<span className=\"text-sm font-normal text-basalt-muted-foreground\">{label}</span>\n\t\t\t\t\t\t<span className=\"flex h-7 w-7 shrink-0 items-center justify-center\">\n\t\t\t\t\t\t\t<ChevronUp\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"h-4 w-4 text-basalt-muted-foreground transition-transform duration-200\",\n\t\t\t\t\t\t\t\t\tOVERLAY_MOTION,\n\t\t\t\t\t\t\t\t\t!open && \"rotate-180\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</button>\n\t\t\t\t</CollapsibleTrigger>\n\t\t\t</div>\n\t\t\t<CollapsibleContent unstyled>\n\t\t\t\t<div className=\"flex flex-col gap-0.5 px-3\">{children}</div>\n\t\t\t</CollapsibleContent>\n\t\t</Collapsible>\n\t);\n}\n\nexport function SidebarFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n\treturn <div className={cn(\"px-4 py-3\", className)} {...props} />;\n}\n\nexport function SidebarUser({\n\tname,\n\temail,\n\tavatar,\n\taction,\n\tclassName,\n}: {\n\tname: ReactNode;\n\temail?: ReactNode;\n\tavatar?: ReactNode;\n\taction?: ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-3\", className)}>\n\t\t\t{avatar}\n\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t<p className=\"truncate text-sm font-medium text-basalt-foreground\">{name}</p>\n\t\t\t\t{email ? <p className=\"truncate text-xs text-basalt-muted-foreground\">{email}</p> : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\nexport function ContentIsland({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"min-h-0 flex-1 overflow-y-auto rounded-[16px] bg-basalt-card p-3 text-basalt-card-foreground shadow-sm ring-1 ring-basalt-border/40 md:rounded-basalt-island md:p-5\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { HTMLAttributes } from "react";
2
+ export declare function SkeletonLine({ className, minWidth, maxWidth, height, style, ...props }: HTMLAttributes<HTMLDivElement> & {
3
+ minWidth?: number;
4
+ maxWidth?: number;
5
+ height?: number;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region src/components/skeleton-line.tsx
5
+ function n({ className: n, minWidth: r = 30, maxWidth: i = 100, height: a, style: o, ...s }) {
6
+ let c = {
7
+ width: `${(Math.min(r, i) + Math.max(r, i)) / 2}%`,
8
+ ...a === void 0 ? {} : { height: a },
9
+ ...o
10
+ };
11
+ return /* @__PURE__ */ t("div", {
12
+ className: e("relative h-2 overflow-hidden rounded-sm bg-basalt-muted", n),
13
+ style: c,
14
+ "aria-hidden": "true",
15
+ ...s,
16
+ children: /* @__PURE__ */ t("span", { className: "pointer-events-none absolute inset-0 animate-basalt-shimmer bg-gradient-to-r from-transparent via-black/10 to-transparent motion-reduce:animate-none" })
17
+ });
18
+ }
19
+ //#endregion
20
+ export { n as SkeletonLine };
21
+
22
+ //# sourceMappingURL=skeleton-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-line.js","names":[],"sources":["../../src/components/skeleton-line.tsx"],"sourcesContent":["import type { CSSProperties, HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport function SkeletonLine({\n\tclassName,\n\tminWidth = 30,\n\tmaxWidth = 100,\n\theight,\n\tstyle,\n\t...props\n}: HTMLAttributes<HTMLDivElement> & {\n\tminWidth?: number;\n\tmaxWidth?: number;\n\theight?: number;\n}) {\n\tconst low = Math.min(minWidth, maxWidth);\n\tconst high = Math.max(minWidth, maxWidth);\n\tconst width = (low + high) / 2;\n\tconst lineStyle: CSSProperties = {\n\t\twidth: `${width}%`,\n\t\t...(height !== undefined ? { height } : {}),\n\t\t...style,\n\t};\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative h-2 overflow-hidden rounded-sm bg-basalt-muted\", className)}\n\t\t\tstyle={lineStyle}\n\t\t\taria-hidden=\"true\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute inset-0 animate-basalt-shimmer bg-gradient-to-r from-transparent via-black/10 to-transparent motion-reduce:animate-none\" />\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;AAGA,SAAgB,EAAa,EAC5B,cACA,cAAW,IACX,cAAW,KACX,WACA,UACA,GAAG,KAKD;CAIF,IAAM,IAA2B;EAChC,OAAO,IAJI,KAAK,IAAI,GAAU,CAEhB,IADF,KAAK,IAAI,GAAU,CACX,KAAQ,EAEZ;EAChB,GAAI,MAAW,KAAA,IAAyB,CAAC,IAAd,EAAE,UAAO;EACpC,GAAG;CACJ;CACA,OACC,kBAAC,OAAD;EACC,WAAW,EAAG,2DAA2D,CAAS;EAClF,OAAO;EACP,eAAY;EACZ,GAAI;EAEJ,UAAA,kBAAC,QAAD,EAAM,WAAU,uJAAwJ,CAAA;CACpK,CAAA;AAEP"}
@@ -0,0 +1,3 @@
1
+ import * as SliderPrimitive from "@radix-ui/react-slider";
2
+ import * as React from "react";
3
+ export declare const Slider: React.ForwardRefExoticComponent<Omit<SliderPrimitive.SliderProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { FOCUS_RING as t } from "./overlay.js";
4
+ import * as n from "react";
5
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
+ import * as a from "@radix-ui/react-slider";
7
+ //#region src/components/slider.tsx
8
+ var o = n.forwardRef(({ className: n, ...o }, s) => /* @__PURE__ */ i(a.Root, {
9
+ ref: s,
10
+ className: e("relative flex w-full touch-none select-none items-center", n),
11
+ ...o,
12
+ children: [/* @__PURE__ */ r(a.Track, {
13
+ className: "relative h-2 w-full grow overflow-hidden rounded-full bg-basalt-muted",
14
+ children: /* @__PURE__ */ r(a.Range, { className: "absolute h-full bg-basalt-primary" })
15
+ }), /* @__PURE__ */ r(a.Thumb, { className: e("block h-4 w-4 rounded-full border border-basalt-primary bg-basalt-background shadow", t) })]
16
+ }));
17
+ o.displayName = a.Root.displayName;
18
+ //#endregion
19
+ export { o as Slider };
20
+
21
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","names":[],"sources":["../../src/components/slider.tsx"],"sourcesContent":["import * as SliderPrimitive from \"@radix-ui/react-slider\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { FOCUS_RING } from \"./overlay\";\n\nexport const Slider = React.forwardRef<\n\tReact.ElementRef<typeof SliderPrimitive.Root>,\n\tReact.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n\t<SliderPrimitive.Root\n\t\tref={ref}\n\t\tclassName={cn(\"relative flex w-full touch-none select-none items-center\", className)}\n\t\t{...props}\n\t>\n\t\t<SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-basalt-muted\">\n\t\t\t<SliderPrimitive.Range className=\"absolute h-full bg-basalt-primary\" />\n\t\t</SliderPrimitive.Track>\n\t\t<SliderPrimitive.Thumb\n\t\t\tclassName={cn(\n\t\t\t\t\"block h-4 w-4 rounded-full border border-basalt-primary bg-basalt-background shadow\",\n\t\t\t\tFOCUS_RING,\n\t\t\t)}\n\t\t/>\n\t</SliderPrimitive.Root>\n));\nSlider.displayName = SliderPrimitive.Root.displayName;\n"],"mappings":";;;;;;;AAKA,IAAa,IAAS,EAAM,YAGzB,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAgB,MAAjB;CACM;CACL,WAAW,EAAG,4DAA4D,CAAS;CACnF,GAAI;CAHL,UAAA,CAKC,kBAAC,EAAgB,OAAjB;EAAuB,WAAU;EAChC,UAAA,kBAAC,EAAgB,OAAjB,EAAuB,WAAU,oCAAqC,CAAA;CAChD,CAAA,GACvB,kBAAC,EAAgB,OAAjB,EACC,WAAW,EACV,uFACA,CACD,EACA,CAAA,CACoB;AACtB,CAAA,CAAA;AACD,EAAO,cAAc,EAAgB,KAAK"}
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ export interface StatStripItem {
3
+ /** The visible label for this statistic. */
4
+ label: React.ReactNode;
5
+ /** The visible value for this statistic. */
6
+ value: React.ReactNode;
7
+ }
8
+ export interface StatStripProps extends Omit<React.HTMLAttributes<HTMLDListElement>, "children" | "className"> {
9
+ /** Additional classes for the definition list. */
10
+ className?: string;
11
+ /** The labelled values shown in the strip. */
12
+ items: readonly StatStripItem[];
13
+ /**
14
+ * Replace each value with a skeleton while keeping labels visible.
15
+ * @default false
16
+ */
17
+ loading?: boolean;
18
+ }
19
+ export declare const StatStrip: React.ForwardRefExoticComponent<StatStripProps & React.RefAttributes<HTMLDListElement>>;
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { SkeletonLine as t } from "./skeleton-line.js";
4
+ import * as n from "react";
5
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
+ //#region src/components/stat-strip.tsx
7
+ var a = n.forwardRef(({ "aria-busy": n, className: a, items: o, loading: s = !1, ...c }, l) => /* @__PURE__ */ r("dl", {
8
+ ref: l,
9
+ className: e("grid grid-cols-2 gap-3 md:grid-cols-4", a),
10
+ ...c,
11
+ "aria-busy": s ? !0 : n,
12
+ children: o.map((e, n) => /* @__PURE__ */ i("div", {
13
+ className: "rounded-basalt-lg bg-basalt-muted p-4 ring-1 ring-basalt-border",
14
+ children: [/* @__PURE__ */ r("dt", {
15
+ className: "text-sm font-medium text-basalt-muted-foreground",
16
+ children: e.label
17
+ }), /* @__PURE__ */ r("dd", {
18
+ className: "mt-1 text-lg font-medium tabular-nums text-basalt-foreground",
19
+ children: s ? /* @__PURE__ */ r(t, {}) : e.value
20
+ })]
21
+ }, n))
22
+ }));
23
+ a.displayName = "StatStrip";
24
+ //#endregion
25
+ export { a as StatStrip };
26
+
27
+ //# sourceMappingURL=stat-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-strip.js","names":[],"sources":["../../src/components/stat-strip.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { SkeletonLine } from \"./skeleton-line\";\n\nexport interface StatStripItem {\n\t/** The visible label for this statistic. */\n\tlabel: React.ReactNode;\n\t/** The visible value for this statistic. */\n\tvalue: React.ReactNode;\n}\n\nexport interface StatStripProps\n\textends Omit<React.HTMLAttributes<HTMLDListElement>, \"children\" | \"className\"> {\n\t/** Additional classes for the definition list. */\n\tclassName?: string;\n\t/** The labelled values shown in the strip. */\n\titems: readonly StatStripItem[];\n\t/**\n\t * Replace each value with a skeleton while keeping labels visible.\n\t * @default false\n\t */\n\tloading?: boolean;\n}\n\nexport const StatStrip = React.forwardRef<HTMLDListElement, StatStripProps>(\n\t({ \"aria-busy\": ariaBusy, className, items, loading = false, ...props }, ref) => {\n\t\treturn (\n\t\t\t<dl\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"grid grid-cols-2 gap-3 md:grid-cols-4\", className)}\n\t\t\t\t{...props}\n\t\t\t\taria-busy={loading ? true : ariaBusy}\n\t\t\t>\n\t\t\t\t{items.map((item, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName=\"rounded-basalt-lg bg-basalt-muted p-4 ring-1 ring-basalt-border\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<dt className=\"text-sm font-medium text-basalt-muted-foreground\">{item.label}</dt>\n\t\t\t\t\t\t<dd className=\"mt-1 text-lg font-medium tabular-nums text-basalt-foreground\">\n\t\t\t\t\t\t\t{loading ? <SkeletonLine /> : item.value}\n\t\t\t\t\t\t</dd>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</dl>\n\t\t);\n\t},\n);\nStatStrip.displayName = \"StatStrip\";\n"],"mappings":";;;;;;AAwBA,IAAa,IAAY,EAAM,YAC7B,EAAE,aAAa,GAAU,cAAW,UAAO,aAAU,IAAO,GAAG,KAAS,MAEvE,kBAAC,MAAD;CACM;CACL,WAAW,EAAG,yCAAyC,CAAS;CAChE,GAAI;CACJ,aAAW,IAAU,KAAO;CAE3B,UAAA,EAAM,KAAK,GAAM,MACjB,kBAAC,OAAD;EAEC,WAAU;EAFX,UAAA,CAIC,kBAAC,MAAD;GAAI,WAAU;GAAoD,UAAA,EAAK;EAAU,CAAA,GACjF,kBAAC,MAAD;GAAI,WAAU;GACZ,UAAA,IAAU,kBAAC,GAAD,CAAe,CAAA,IAAI,EAAK;EAChC,CAAA,CACA;CAPC,GAAA,CAOD,CACL;AACE,CAAA,CAGP;AACA,EAAU,cAAc"}
@@ -0,0 +1,85 @@
1
+ import * as SwitchPrimitives from "@radix-ui/react-switch";
2
+ import * as React from "react";
3
+ export type SwitchProps = Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>, "checked"> & {
4
+ /**
5
+ * The controlled checked state of the switch.
6
+ */
7
+ checked?: boolean;
8
+ /**
9
+ * The visual size of the switch.
10
+ * @default default
11
+ */
12
+ size?: "default" | "sm";
13
+ };
14
+ export type SwitchGroupProps = Omit<React.ComponentPropsWithoutRef<"fieldset">, "onChange" | "defaultValue" | "disabled"> & {
15
+ /**
16
+ * The controlled selected values.
17
+ */
18
+ value?: string[];
19
+ /**
20
+ * The initially selected values.
21
+ */
22
+ defaultValue?: string[];
23
+ /**
24
+ * Called when the selected values change.
25
+ */
26
+ onValueChange?: (value: string[]) => void;
27
+ /**
28
+ * Marks the group invalid and shows alert copy.
29
+ */
30
+ error?: React.ReactNode;
31
+ /**
32
+ * Disable every item in the group.
33
+ * @default false
34
+ */
35
+ disabled?: boolean;
36
+ };
37
+ export type SwitchLegendProps = React.ComponentPropsWithoutRef<"legend">;
38
+ export type SwitchItemProps = Omit<SwitchProps, "checked" | "defaultChecked" | "onCheckedChange" | "value"> & {
39
+ /**
40
+ * The value stored in the group when this item is on.
41
+ */
42
+ value: string;
43
+ };
44
+ export declare const Switch: React.ForwardRefExoticComponent<Omit<Omit<SwitchPrimitives.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref">, "checked"> & {
45
+ /**
46
+ * The controlled checked state of the switch.
47
+ */
48
+ checked?: boolean;
49
+ /**
50
+ * The visual size of the switch.
51
+ * @default default
52
+ */
53
+ size?: "default" | "sm";
54
+ } & React.RefAttributes<HTMLButtonElement>> & {
55
+ Group: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.FieldsetHTMLAttributes<HTMLFieldSetElement>, HTMLFieldSetElement>, "ref">, "defaultValue" | "disabled" | "onChange"> & {
56
+ /**
57
+ * The controlled selected values.
58
+ */
59
+ value?: string[];
60
+ /**
61
+ * The initially selected values.
62
+ */
63
+ defaultValue?: string[];
64
+ /**
65
+ * Called when the selected values change.
66
+ */
67
+ onValueChange?: (value: string[]) => void;
68
+ /**
69
+ * Marks the group invalid and shows alert copy.
70
+ */
71
+ error?: React.ReactNode;
72
+ /**
73
+ * Disable every item in the group.
74
+ * @default false
75
+ */
76
+ disabled?: boolean;
77
+ } & React.RefAttributes<HTMLFieldSetElement>>;
78
+ Legend: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLLegendElement>, HTMLLegendElement>, "ref"> & React.RefAttributes<HTMLLegendElement>>;
79
+ Item: React.ForwardRefExoticComponent<Omit<SwitchProps, "checked" | "defaultChecked" | "onCheckedChange" | "value"> & {
80
+ /**
81
+ * The value stored in the group when this item is on.
82
+ */
83
+ value: string;
84
+ } & React.RefAttributes<HTMLButtonElement>>;
85
+ };
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { FOCUS_RING as t } from "./overlay.js";
4
+ import * as n from "react";
5
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
+ import * as a from "@radix-ui/react-switch";
7
+ //#region src/components/switch.tsx
8
+ var o = n.createContext(null);
9
+ function s(e, t, n) {
10
+ return n ? e.includes(t) ? e : [...e, t] : e.filter((e) => e !== t);
11
+ }
12
+ var c = n.forwardRef(({ className: n, size: i = "default", ...o }, s) => /* @__PURE__ */ r(a.Root, {
13
+ className: e("peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors data-[state=checked]:bg-basalt-primary data-[state=unchecked]:bg-basalt-input disabled:cursor-not-allowed disabled:opacity-50", t, i === "sm" ? "h-4 w-7" : "h-6 w-11", n),
14
+ ...o,
15
+ ref: s,
16
+ children: /* @__PURE__ */ r(a.Thumb, { className: e("pointer-events-none block rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=unchecked]:translate-x-0", i === "sm" ? "h-3 w-3 data-[state=checked]:translate-x-3" : "h-5 w-5 data-[state=checked]:translate-x-5") })
17
+ }));
18
+ c.displayName = a.Root.displayName;
19
+ var l = n.forwardRef(({ className: t, value: a, defaultValue: s, onValueChange: c, error: l, disabled: u = !1, children: d, "aria-describedby": f, "aria-invalid": p, ...m }, h) => {
20
+ let g = n.useId(), _ = n.useRef(null), [v, y] = n.useState(s ?? []), b = a ?? v, x = !!l, S = `${g}-error`, C = [x ? S : null, f].filter(Boolean).join(" ") || void 0, w = n.useCallback((e) => {
21
+ a === void 0 && y(e), c?.(e);
22
+ }, [c, a]), T = n.useCallback((e) => {
23
+ _.current = e, typeof h == "function" ? h(e) : h && (h.current = e);
24
+ }, [h]);
25
+ return n.useEffect(() => {
26
+ let e = _.current?.form;
27
+ if (!e || a !== void 0) return;
28
+ let t = (e) => {
29
+ queueMicrotask(() => {
30
+ e.defaultPrevented || y(s ?? []);
31
+ });
32
+ };
33
+ return e.addEventListener("reset", t), () => e.removeEventListener("reset", t);
34
+ }, [s, a]), /* @__PURE__ */ r(o.Provider, {
35
+ value: {
36
+ value: b,
37
+ setValue: w,
38
+ disabled: u,
39
+ invalid: x
40
+ },
41
+ children: /* @__PURE__ */ i("fieldset", {
42
+ ref: T,
43
+ ...m,
44
+ disabled: u,
45
+ "aria-invalid": x ? !0 : p,
46
+ "aria-describedby": C,
47
+ className: e("flex flex-col gap-2", t),
48
+ children: [d, x ? /* @__PURE__ */ r("p", {
49
+ id: S,
50
+ className: "text-xs text-basalt-destructive",
51
+ role: "alert",
52
+ children: l
53
+ }) : null]
54
+ })
55
+ });
56
+ });
57
+ l.displayName = "Switch.Group";
58
+ var u = n.forwardRef(({ className: t, ...n }, i) => /* @__PURE__ */ r("legend", {
59
+ ref: i,
60
+ className: e("text-sm font-medium text-basalt-foreground", t),
61
+ ...n
62
+ }));
63
+ u.displayName = "Switch.Legend";
64
+ var d = n.forwardRef(({ className: e, value: t, children: a, disabled: l, size: u, id: d, ...f }, p) => {
65
+ let m = n.useContext(o), h = m != null, g = n.useId(), _ = d ?? g, v = /* @__PURE__ */ r(c, {
66
+ ref: p,
67
+ ...f,
68
+ id: _,
69
+ value: t,
70
+ size: u,
71
+ checked: h ? m.value.includes(t) : void 0,
72
+ disabled: l || m?.disabled,
73
+ "aria-invalid": m?.invalid || void 0,
74
+ className: e,
75
+ onCheckedChange: (e) => {
76
+ h && m.setValue(s(m.value, t, e));
77
+ }
78
+ });
79
+ return a == null ? v : /* @__PURE__ */ i("label", {
80
+ htmlFor: _,
81
+ className: "flex items-center gap-2 text-sm text-basalt-foreground",
82
+ children: [v, a]
83
+ });
84
+ });
85
+ d.displayName = "Switch.Item";
86
+ var f = Object.assign(c, {
87
+ Group: l,
88
+ Legend: u,
89
+ Item: d
90
+ });
91
+ //#endregion
92
+ export { f as Switch };
93
+
94
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","names":[],"sources":["../../src/components/switch.tsx"],"sourcesContent":["import * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { FOCUS_RING } from \"./overlay\";\n\ntype SwitchGroupContextValue = {\n\tvalue: string[];\n\tsetValue: (next: string[]) => void;\n\tdisabled: boolean;\n\tinvalid: boolean;\n};\n\nconst SwitchGroupContext = React.createContext<SwitchGroupContextValue | null>(null);\n\nfunction nextSwitchGroupValue(current: string[], itemValue: string, checked: boolean): string[] {\n\tif (checked) {\n\t\treturn current.includes(itemValue) ? current : [...current, itemValue];\n\t}\n\treturn current.filter((entry) => entry !== itemValue);\n}\n\nexport type SwitchProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>,\n\t\"checked\"\n> & {\n\t/**\n\t * The controlled checked state of the switch.\n\t */\n\tchecked?: boolean;\n\t/**\n\t * The visual size of the switch.\n\t * @default default\n\t */\n\tsize?: \"default\" | \"sm\";\n};\n\nexport type SwitchGroupProps = Omit<\n\tReact.ComponentPropsWithoutRef<\"fieldset\">,\n\t\"onChange\" | \"defaultValue\" | \"disabled\"\n> & {\n\t/**\n\t * The controlled selected values.\n\t */\n\tvalue?: string[];\n\t/**\n\t * The initially selected values.\n\t */\n\tdefaultValue?: string[];\n\t/**\n\t * Called when the selected values change.\n\t */\n\tonValueChange?: (value: string[]) => void;\n\t/**\n\t * Marks the group invalid and shows alert copy.\n\t */\n\terror?: React.ReactNode;\n\t/**\n\t * Disable every item in the group.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport type SwitchLegendProps = React.ComponentPropsWithoutRef<\"legend\">;\n\nexport type SwitchItemProps = Omit<\n\tSwitchProps,\n\t\"checked\" | \"defaultChecked\" | \"onCheckedChange\" | \"value\"\n> & {\n\t/**\n\t * The value stored in the group when this item is on.\n\t */\n\tvalue: string;\n};\n\nconst SwitchRoot = React.forwardRef<React.ElementRef<typeof SwitchPrimitives.Root>, SwitchProps>(\n\t({ className, size = \"default\", ...props }, ref) => (\n\t\t<SwitchPrimitives.Root\n\t\t\tclassName={cn(\n\t\t\t\t\"peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors data-[state=checked]:bg-basalt-primary data-[state=unchecked]:bg-basalt-input disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tFOCUS_RING,\n\t\t\t\tsize === \"sm\" ? \"h-4 w-7\" : \"h-6 w-11\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t>\n\t\t\t<SwitchPrimitives.Thumb\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none block rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=unchecked]:translate-x-0\",\n\t\t\t\t\tsize === \"sm\"\n\t\t\t\t\t\t? \"h-3 w-3 data-[state=checked]:translate-x-3\"\n\t\t\t\t\t\t: \"h-5 w-5 data-[state=checked]:translate-x-5\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</SwitchPrimitives.Root>\n\t),\n);\nSwitchRoot.displayName = SwitchPrimitives.Root.displayName;\n\nconst SwitchGroup = React.forwardRef<HTMLFieldSetElement, SwitchGroupProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\terror,\n\t\t\tdisabled = false,\n\t\t\tchildren,\n\t\t\t\"aria-describedby\": describedBy,\n\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst generatedId = React.useId();\n\t\tconst nodeRef = React.useRef<HTMLFieldSetElement | null>(null);\n\t\tconst [uncontrolled, setUncontrolled] = React.useState(defaultValue ?? []);\n\t\tconst current = value ?? uncontrolled;\n\t\tconst invalid = Boolean(error);\n\t\tconst errorId = `${generatedId}-error`;\n\t\tconst mergedDescribedBy =\n\t\t\t[invalid ? errorId : null, describedBy].filter(Boolean).join(\" \") || undefined;\n\t\tconst setValue = React.useCallback(\n\t\t\t(next: string[]) => {\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tsetUncontrolled(next);\n\t\t\t\t}\n\t\t\t\tonValueChange?.(next);\n\t\t\t},\n\t\t\t[onValueChange, value],\n\t\t);\n\t\tconst setRefs = React.useCallback(\n\t\t\t(node: HTMLFieldSetElement | null) => {\n\t\t\t\tnodeRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref) {\n\t\t\t\t\tref.current = node;\n\t\t\t\t}\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\t\tReact.useEffect(() => {\n\t\t\tconst form = nodeRef.current?.form;\n\t\t\tif (!form || value !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst onReset = (event: Event) => {\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetUncontrolled(defaultValue ?? []);\n\t\t\t\t});\n\t\t\t};\n\t\t\tform.addEventListener(\"reset\", onReset);\n\t\t\treturn () => form.removeEventListener(\"reset\", onReset);\n\t\t}, [defaultValue, value]);\n\t\treturn (\n\t\t\t<SwitchGroupContext.Provider value={{ value: current, setValue, disabled, invalid }}>\n\t\t\t\t<fieldset\n\t\t\t\t\tref={setRefs}\n\t\t\t\t\t{...props}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\taria-invalid={invalid ? true : ariaInvalid}\n\t\t\t\t\taria-describedby={mergedDescribedBy}\n\t\t\t\t\tclassName={cn(\"flex flex-col gap-2\", className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{invalid ? (\n\t\t\t\t\t\t<p id={errorId} className=\"text-xs text-basalt-destructive\" role=\"alert\">\n\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</fieldset>\n\t\t\t</SwitchGroupContext.Provider>\n\t\t);\n\t},\n);\nSwitchGroup.displayName = \"Switch.Group\";\n\nconst SwitchLegend = React.forwardRef<HTMLLegendElement, SwitchLegendProps>(\n\t({ className, ...props }, ref) => (\n\t\t<legend\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-sm font-medium text-basalt-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nSwitchLegend.displayName = \"Switch.Legend\";\n\nconst SwitchItem = React.forwardRef<\n\tReact.ElementRef<typeof SwitchPrimitives.Root>,\n\tSwitchItemProps\n>(({ className, value, children, disabled, size, id, ...props }, ref) => {\n\tconst group = React.useContext(SwitchGroupContext);\n\tconst grouped = group != null;\n\tconst generatedId = React.useId();\n\tconst controlId = id ?? generatedId;\n\tconst box = (\n\t\t<SwitchRoot\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t\tid={controlId}\n\t\t\tvalue={value}\n\t\t\tsize={size}\n\t\t\tchecked={grouped ? group.value.includes(value) : undefined}\n\t\t\tdisabled={disabled || group?.disabled}\n\t\t\taria-invalid={group?.invalid || undefined}\n\t\t\tclassName={className}\n\t\t\tonCheckedChange={(next) => {\n\t\t\t\tif (grouped) {\n\t\t\t\t\tgroup.setValue(nextSwitchGroupValue(group.value, value, next));\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t);\n\tif (children == null) {\n\t\treturn box;\n\t}\n\treturn (\n\t\t<label htmlFor={controlId} className=\"flex items-center gap-2 text-sm text-basalt-foreground\">\n\t\t\t{box}\n\t\t\t{children}\n\t\t</label>\n\t);\n});\nSwitchItem.displayName = \"Switch.Item\";\n\nexport const Switch = Object.assign(SwitchRoot, {\n\tGroup: SwitchGroup,\n\tLegend: SwitchLegend,\n\tItem: SwitchItem,\n});\n"],"mappings":"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"}