@prototyperco/ui 0.5.0-alpha.0 → 0.5.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 (349) hide show
  1. package/dist/components/accordion.cjs +154 -0
  2. package/dist/components/accordion.cjs.map +1 -0
  3. package/dist/components/accordion.d.cts +14 -0
  4. package/dist/components/accordion.d.ts +14 -0
  5. package/dist/components/accordion.js +127 -0
  6. package/dist/components/accordion.js.map +1 -0
  7. package/dist/components/alert-dialog.cjs +324 -0
  8. package/dist/components/alert-dialog.cjs.map +1 -0
  9. package/dist/components/alert-dialog.d.cts +30 -0
  10. package/dist/components/alert-dialog.d.ts +30 -0
  11. package/dist/components/alert-dialog.js +289 -0
  12. package/dist/components/alert-dialog.js.map +1 -0
  13. package/dist/components/alert.cjs +105 -0
  14. package/dist/components/alert.cjs.map +1 -0
  15. package/dist/components/alert.d.cts +17 -0
  16. package/dist/components/alert.d.ts +17 -0
  17. package/dist/components/alert.js +78 -0
  18. package/dist/components/alert.js.map +1 -0
  19. package/dist/components/autocomplete.cjs +512 -0
  20. package/dist/components/autocomplete.cjs.map +1 -0
  21. package/dist/components/autocomplete.d.cts +31 -0
  22. package/dist/components/autocomplete.d.ts +31 -0
  23. package/dist/components/autocomplete.js +472 -0
  24. package/dist/components/autocomplete.js.map +1 -0
  25. package/dist/components/avatar.cjs +144 -0
  26. package/dist/components/avatar.cjs.map +1 -0
  27. package/dist/components/avatar.d.cts +18 -0
  28. package/dist/components/avatar.d.ts +18 -0
  29. package/dist/components/avatar.js +115 -0
  30. package/dist/components/avatar.js.map +1 -0
  31. package/dist/components/badge.cjs +81 -0
  32. package/dist/components/badge.cjs.map +1 -0
  33. package/dist/components/badge.d.cts +13 -0
  34. package/dist/components/badge.d.ts +13 -0
  35. package/dist/components/badge.js +56 -0
  36. package/dist/components/badge.js.map +1 -0
  37. package/dist/components/breadcrumb.cjs +142 -0
  38. package/dist/components/breadcrumb.cjs.map +1 -0
  39. package/dist/components/breadcrumb.d.cts +20 -0
  40. package/dist/components/breadcrumb.d.ts +20 -0
  41. package/dist/components/breadcrumb.js +112 -0
  42. package/dist/components/breadcrumb.js.map +1 -0
  43. package/dist/components/button.cjs +145 -0
  44. package/dist/components/button.cjs.map +1 -0
  45. package/dist/components/button.d.cts +16 -0
  46. package/dist/components/button.d.ts +16 -0
  47. package/dist/components/button.js +120 -0
  48. package/dist/components/button.js.map +1 -0
  49. package/dist/components/card.cjs +141 -0
  50. package/dist/components/card.cjs.map +1 -0
  51. package/dist/components/card.d.cts +23 -0
  52. package/dist/components/card.d.ts +23 -0
  53. package/dist/components/card.js +111 -0
  54. package/dist/components/card.js.map +1 -0
  55. package/dist/components/checkbox-group.cjs +56 -0
  56. package/dist/components/checkbox-group.cjs.map +1 -0
  57. package/dist/components/checkbox-group.d.cts +8 -0
  58. package/dist/components/checkbox-group.d.ts +8 -0
  59. package/dist/components/checkbox-group.js +32 -0
  60. package/dist/components/checkbox-group.js.map +1 -0
  61. package/dist/components/checkbox.cjs +152 -0
  62. package/dist/components/checkbox.cjs.map +1 -0
  63. package/dist/components/checkbox.d.cts +12 -0
  64. package/dist/components/checkbox.d.ts +12 -0
  65. package/dist/components/checkbox.js +126 -0
  66. package/dist/components/checkbox.js.map +1 -0
  67. package/dist/components/collapsible.cjs +89 -0
  68. package/dist/components/collapsible.cjs.map +1 -0
  69. package/dist/components/collapsible.d.cts +12 -0
  70. package/dist/components/collapsible.d.ts +12 -0
  71. package/dist/components/collapsible.js +63 -0
  72. package/dist/components/collapsible.js.map +1 -0
  73. package/dist/components/color-picker.cjs +983 -0
  74. package/dist/components/color-picker.cjs.map +1 -0
  75. package/dist/components/color-picker.d.cts +41 -0
  76. package/dist/components/color-picker.d.ts +41 -0
  77. package/dist/components/color-picker.js +939 -0
  78. package/dist/components/color-picker.js.map +1 -0
  79. package/dist/components/columns.cjs +163 -0
  80. package/dist/components/columns.cjs.map +1 -0
  81. package/dist/components/columns.d.cts +16 -0
  82. package/dist/components/columns.d.ts +16 -0
  83. package/dist/components/columns.js +136 -0
  84. package/dist/components/columns.js.map +1 -0
  85. package/dist/components/combobox.cjs +633 -0
  86. package/dist/components/combobox.cjs.map +1 -0
  87. package/dist/components/combobox.d.cts +40 -0
  88. package/dist/components/combobox.d.ts +40 -0
  89. package/dist/components/combobox.js +576 -0
  90. package/dist/components/combobox.js.map +1 -0
  91. package/dist/components/command-palette.cjs +370 -0
  92. package/dist/components/command-palette.cjs.map +1 -0
  93. package/dist/components/command-palette.d.cts +42 -0
  94. package/dist/components/command-palette.d.ts +42 -0
  95. package/dist/components/command-palette.js +329 -0
  96. package/dist/components/command-palette.js.map +1 -0
  97. package/dist/components/container.cjs +80 -0
  98. package/dist/components/container.cjs.map +1 -0
  99. package/dist/components/container.d.cts +27 -0
  100. package/dist/components/container.d.ts +27 -0
  101. package/dist/components/container.js +54 -0
  102. package/dist/components/container.js.map +1 -0
  103. package/dist/components/context-menu.cjs +309 -0
  104. package/dist/components/context-menu.cjs.map +1 -0
  105. package/dist/components/context-menu.d.cts +37 -0
  106. package/dist/components/context-menu.d.ts +37 -0
  107. package/dist/components/context-menu.js +271 -0
  108. package/dist/components/context-menu.js.map +1 -0
  109. package/dist/components/dialog.cjs +319 -0
  110. package/dist/components/dialog.cjs.map +1 -0
  111. package/dist/components/dialog.d.cts +32 -0
  112. package/dist/components/dialog.d.ts +32 -0
  113. package/dist/components/dialog.js +285 -0
  114. package/dist/components/dialog.js.map +1 -0
  115. package/dist/components/drawer.cjs +185 -0
  116. package/dist/components/drawer.cjs.map +1 -0
  117. package/dist/components/drawer.d.cts +32 -0
  118. package/dist/components/drawer.d.ts +32 -0
  119. package/dist/components/drawer.js +151 -0
  120. package/dist/components/drawer.js.map +1 -0
  121. package/dist/components/field.cjs +334 -0
  122. package/dist/components/field.cjs.map +1 -0
  123. package/dist/components/field.d.cts +39 -0
  124. package/dist/components/field.d.ts +39 -0
  125. package/dist/components/field.js +299 -0
  126. package/dist/components/field.js.map +1 -0
  127. package/dist/components/fieldset.cjs +75 -0
  128. package/dist/components/fieldset.cjs.map +1 -0
  129. package/dist/components/fieldset.d.cts +12 -0
  130. package/dist/components/fieldset.d.ts +12 -0
  131. package/dist/components/fieldset.js +50 -0
  132. package/dist/components/fieldset.js.map +1 -0
  133. package/dist/components/form.cjs +52 -0
  134. package/dist/components/form.cjs.map +1 -0
  135. package/dist/components/form.d.cts +8 -0
  136. package/dist/components/form.d.ts +8 -0
  137. package/dist/components/form.js +28 -0
  138. package/dist/components/form.js.map +1 -0
  139. package/dist/components/input-group.cjs +338 -0
  140. package/dist/components/input-group.cjs.map +1 -0
  141. package/dist/components/input-group.d.cts +27 -0
  142. package/dist/components/input-group.d.ts +27 -0
  143. package/dist/components/input-group.js +307 -0
  144. package/dist/components/input-group.js.map +1 -0
  145. package/dist/components/input.cjs +63 -0
  146. package/dist/components/input.cjs.map +1 -0
  147. package/dist/components/input.d.cts +8 -0
  148. package/dist/components/input.d.ts +8 -0
  149. package/dist/components/input.js +39 -0
  150. package/dist/components/input.js.map +1 -0
  151. package/dist/components/label.cjs +54 -0
  152. package/dist/components/label.cjs.map +1 -0
  153. package/dist/components/label.d.cts +8 -0
  154. package/dist/components/label.d.ts +8 -0
  155. package/dist/components/label.js +28 -0
  156. package/dist/components/label.js.map +1 -0
  157. package/dist/components/menu.cjs +305 -0
  158. package/dist/components/menu.cjs.map +1 -0
  159. package/dist/components/menu.d.cts +37 -0
  160. package/dist/components/menu.d.ts +37 -0
  161. package/dist/components/menu.js +267 -0
  162. package/dist/components/menu.js.map +1 -0
  163. package/dist/components/menubar.cjs +503 -0
  164. package/dist/components/menubar.cjs.map +1 -0
  165. package/dist/components/menubar.d.cts +37 -0
  166. package/dist/components/menubar.d.ts +37 -0
  167. package/dist/components/menubar.js +464 -0
  168. package/dist/components/menubar.js.map +1 -0
  169. package/dist/components/meter.cjs +152 -0
  170. package/dist/components/meter.cjs.map +1 -0
  171. package/dist/components/meter.d.cts +23 -0
  172. package/dist/components/meter.d.ts +23 -0
  173. package/dist/components/meter.js +122 -0
  174. package/dist/components/meter.js.map +1 -0
  175. package/dist/components/navigation-menu.cjs +315 -0
  176. package/dist/components/navigation-menu.cjs.map +1 -0
  177. package/dist/components/navigation-menu.d.cts +22 -0
  178. package/dist/components/navigation-menu.d.ts +22 -0
  179. package/dist/components/navigation-menu.js +283 -0
  180. package/dist/components/navigation-menu.js.map +1 -0
  181. package/dist/components/number-field.cjs +217 -0
  182. package/dist/components/number-field.cjs.map +1 -0
  183. package/dist/components/number-field.d.cts +23 -0
  184. package/dist/components/number-field.d.ts +23 -0
  185. package/dist/components/number-field.js +185 -0
  186. package/dist/components/number-field.js.map +1 -0
  187. package/dist/components/popover.cjs +125 -0
  188. package/dist/components/popover.cjs.map +1 -0
  189. package/dist/components/popover.d.cts +16 -0
  190. package/dist/components/popover.d.ts +16 -0
  191. package/dist/components/popover.js +96 -0
  192. package/dist/components/popover.js.map +1 -0
  193. package/dist/components/preview-card.cjs +86 -0
  194. package/dist/components/preview-card.cjs.map +1 -0
  195. package/dist/components/preview-card.d.cts +12 -0
  196. package/dist/components/preview-card.d.ts +12 -0
  197. package/dist/components/preview-card.js +60 -0
  198. package/dist/components/preview-card.js.map +1 -0
  199. package/dist/components/progress.cjs +167 -0
  200. package/dist/components/progress.cjs.map +1 -0
  201. package/dist/components/progress.d.cts +23 -0
  202. package/dist/components/progress.d.ts +23 -0
  203. package/dist/components/progress.js +137 -0
  204. package/dist/components/progress.js.map +1 -0
  205. package/dist/components/radio-group.cjs +98 -0
  206. package/dist/components/radio-group.cjs.map +1 -0
  207. package/dist/components/radio-group.d.cts +11 -0
  208. package/dist/components/radio-group.d.ts +11 -0
  209. package/dist/components/radio-group.js +73 -0
  210. package/dist/components/radio-group.js.map +1 -0
  211. package/dist/components/resizable-panel.cjs +91 -0
  212. package/dist/components/resizable-panel.cjs.map +1 -0
  213. package/dist/components/resizable-panel.d.cts +14 -0
  214. package/dist/components/resizable-panel.d.ts +14 -0
  215. package/dist/components/resizable-panel.js +69 -0
  216. package/dist/components/resizable-panel.js.map +1 -0
  217. package/dist/components/row.cjs +94 -0
  218. package/dist/components/row.cjs.map +1 -0
  219. package/dist/components/row.d.cts +27 -0
  220. package/dist/components/row.d.ts +27 -0
  221. package/dist/components/row.js +68 -0
  222. package/dist/components/row.js.map +1 -0
  223. package/dist/components/scroll-area.cjs +96 -0
  224. package/dist/components/scroll-area.cjs.map +1 -0
  225. package/dist/components/scroll-area.d.cts +10 -0
  226. package/dist/components/scroll-area.d.ts +10 -0
  227. package/dist/components/scroll-area.js +71 -0
  228. package/dist/components/scroll-area.js.map +1 -0
  229. package/dist/components/section.cjs +104 -0
  230. package/dist/components/section.cjs.map +1 -0
  231. package/dist/components/section.d.cts +26 -0
  232. package/dist/components/section.d.ts +26 -0
  233. package/dist/components/section.js +79 -0
  234. package/dist/components/section.js.map +1 -0
  235. package/dist/components/segmented-control.cjs +117 -0
  236. package/dist/components/segmented-control.cjs.map +1 -0
  237. package/dist/components/segmented-control.d.cts +16 -0
  238. package/dist/components/segmented-control.d.ts +16 -0
  239. package/dist/components/segmented-control.js +91 -0
  240. package/dist/components/segmented-control.js.map +1 -0
  241. package/dist/components/select.cjs +273 -0
  242. package/dist/components/select.cjs.map +1 -0
  243. package/dist/components/select.d.cts +26 -0
  244. package/dist/components/select.d.ts +26 -0
  245. package/dist/components/select.js +239 -0
  246. package/dist/components/select.js.map +1 -0
  247. package/dist/components/separator.cjs +60 -0
  248. package/dist/components/separator.cjs.map +1 -0
  249. package/dist/components/separator.d.cts +8 -0
  250. package/dist/components/separator.d.ts +8 -0
  251. package/dist/components/separator.js +36 -0
  252. package/dist/components/separator.js.map +1 -0
  253. package/dist/components/skeleton.cjs +54 -0
  254. package/dist/components/skeleton.cjs.map +1 -0
  255. package/dist/components/skeleton.d.cts +8 -0
  256. package/dist/components/skeleton.d.ts +8 -0
  257. package/dist/components/skeleton.js +28 -0
  258. package/dist/components/skeleton.js.map +1 -0
  259. package/dist/components/slider.cjs +221 -0
  260. package/dist/components/slider.cjs.map +1 -0
  261. package/dist/components/slider.d.cts +16 -0
  262. package/dist/components/slider.d.ts +16 -0
  263. package/dist/components/slider.js +182 -0
  264. package/dist/components/slider.js.map +1 -0
  265. package/dist/components/spinner.cjs +97 -0
  266. package/dist/components/spinner.cjs.map +1 -0
  267. package/dist/components/spinner.d.cts +13 -0
  268. package/dist/components/spinner.d.ts +13 -0
  269. package/dist/components/spinner.js +72 -0
  270. package/dist/components/spinner.js.map +1 -0
  271. package/dist/components/switch.cjs +177 -0
  272. package/dist/components/switch.cjs.map +1 -0
  273. package/dist/components/switch.d.cts +22 -0
  274. package/dist/components/switch.d.ts +22 -0
  275. package/dist/components/switch.js +139 -0
  276. package/dist/components/switch.js.map +1 -0
  277. package/dist/components/tabs.cjs +123 -0
  278. package/dist/components/tabs.cjs.map +1 -0
  279. package/dist/components/tabs.d.cts +19 -0
  280. package/dist/components/tabs.d.ts +19 -0
  281. package/dist/components/tabs.js +95 -0
  282. package/dist/components/tabs.js.map +1 -0
  283. package/dist/components/text-field.cjs +290 -0
  284. package/dist/components/text-field.cjs.map +1 -0
  285. package/dist/components/text-field.d.cts +27 -0
  286. package/dist/components/text-field.d.ts +27 -0
  287. package/dist/components/text-field.js +262 -0
  288. package/dist/components/text-field.js.map +1 -0
  289. package/dist/components/textarea.cjs +60 -0
  290. package/dist/components/textarea.cjs.map +1 -0
  291. package/dist/components/textarea.d.cts +8 -0
  292. package/dist/components/textarea.d.ts +8 -0
  293. package/dist/components/textarea.js +34 -0
  294. package/dist/components/textarea.js.map +1 -0
  295. package/dist/components/toast.cjs +167 -0
  296. package/dist/components/toast.cjs.map +1 -0
  297. package/dist/components/toast.d.cts +28 -0
  298. package/dist/components/toast.d.ts +28 -0
  299. package/dist/components/toast.js +147 -0
  300. package/dist/components/toast.js.map +1 -0
  301. package/dist/components/toggle-group.cjs +171 -0
  302. package/dist/components/toggle-group.cjs.map +1 -0
  303. package/dist/components/toggle-group.d.cts +18 -0
  304. package/dist/components/toggle-group.d.ts +18 -0
  305. package/dist/components/toggle-group.js +136 -0
  306. package/dist/components/toggle-group.js.map +1 -0
  307. package/dist/components/toggle.cjs +92 -0
  308. package/dist/components/toggle.cjs.map +1 -0
  309. package/dist/components/toggle.d.cts +14 -0
  310. package/dist/components/toggle.d.ts +14 -0
  311. package/dist/components/toggle.js +67 -0
  312. package/dist/components/toggle.js.map +1 -0
  313. package/dist/components/toolbar.cjs +160 -0
  314. package/dist/components/toolbar.cjs.map +1 -0
  315. package/dist/components/toolbar.d.cts +14 -0
  316. package/dist/components/toolbar.d.ts +14 -0
  317. package/dist/components/toolbar.js +131 -0
  318. package/dist/components/toolbar.js.map +1 -0
  319. package/dist/components/tooltip.cjs +116 -0
  320. package/dist/components/tooltip.cjs.map +1 -0
  321. package/dist/components/tooltip.d.cts +13 -0
  322. package/dist/components/tooltip.d.ts +13 -0
  323. package/dist/components/tooltip.js +89 -0
  324. package/dist/components/tooltip.js.map +1 -0
  325. package/dist/components/tree-view.cjs +472 -0
  326. package/dist/components/tree-view.cjs.map +1 -0
  327. package/dist/components/tree-view.d.cts +33 -0
  328. package/dist/components/tree-view.d.ts +33 -0
  329. package/dist/components/tree-view.js +435 -0
  330. package/dist/components/tree-view.js.map +1 -0
  331. package/dist/index.cjs +11 -14
  332. package/dist/index.cjs.map +1 -1
  333. package/dist/index.d.cts +101 -903
  334. package/dist/index.d.ts +101 -903
  335. package/dist/index.js +4 -6
  336. package/dist/index.js.map +1 -1
  337. package/dist/lib/color-utils.cjs +315 -0
  338. package/dist/lib/color-utils.cjs.map +1 -0
  339. package/dist/lib/color-utils.d.cts +24 -0
  340. package/dist/lib/color-utils.d.ts +24 -0
  341. package/dist/lib/color-utils.js +280 -0
  342. package/dist/lib/color-utils.js.map +1 -0
  343. package/dist/lib/utils.cjs +35 -0
  344. package/dist/lib/utils.cjs.map +1 -0
  345. package/dist/lib/utils.d.cts +5 -0
  346. package/dist/lib/utils.d.ts +5 -0
  347. package/dist/lib/utils.js +10 -0
  348. package/dist/lib/utils.js.map +1 -0
  349. package/package.json +24 -5
@@ -0,0 +1,435 @@
1
+ "use client";
2
+
3
+ // src/components/tree-view.tsx
4
+ import * as React from "react";
5
+ import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible";
6
+ import { ChevronRightIcon } from "lucide-react";
7
+
8
+ // src/lib/utils.ts
9
+ import { clsx } from "clsx";
10
+ import { twMerge } from "tailwind-merge";
11
+ function cn(...inputs) {
12
+ return twMerge(clsx(inputs));
13
+ }
14
+
15
+ // src/components/tree-view.tsx
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ var TreeViewContext = React.createContext(null);
18
+ function useTreeView() {
19
+ const ctx = React.useContext(TreeViewContext);
20
+ if (!ctx)
21
+ throw new Error("TreeView components must be used within a <TreeView>");
22
+ return ctx;
23
+ }
24
+ var DepthContext = React.createContext(0);
25
+ function useControllableSet(controlledValue, onChange, defaultValue) {
26
+ const [internal, setInternal] = React.useState(defaultValue);
27
+ const isControlled = controlledValue !== void 0;
28
+ const value = isControlled ? controlledValue : internal;
29
+ const setValue = React.useCallback(
30
+ (updater) => {
31
+ if (isControlled) {
32
+ onChange?.(updater(value));
33
+ } else {
34
+ setInternal((prev) => {
35
+ const next = updater(prev);
36
+ onChange?.(next);
37
+ return next;
38
+ });
39
+ }
40
+ },
41
+ [isControlled, onChange, value]
42
+ );
43
+ return [value, setValue];
44
+ }
45
+ function TreeView({
46
+ className,
47
+ expandedKeys: controlledExpandedKeys,
48
+ onExpandedKeysChange,
49
+ defaultExpandedKeys,
50
+ defaultExpandAll = false,
51
+ children,
52
+ ...props
53
+ }) {
54
+ const itemsRef = React.useRef(/* @__PURE__ */ new Map());
55
+ const [allKeysCollected, setAllKeysCollected] = React.useState(false);
56
+ const pendingKeysRef = React.useRef(/* @__PURE__ */ new Set());
57
+ const resolvedDefault = React.useMemo(
58
+ () => defaultExpandedKeys ?? /* @__PURE__ */ new Set(),
59
+ []
60
+ );
61
+ const [expandedKeys, setExpandedKeys] = useControllableSet(
62
+ controlledExpandedKeys,
63
+ onExpandedKeysChange,
64
+ resolvedDefault
65
+ );
66
+ React.useEffect(() => {
67
+ if (defaultExpandAll && !allKeysCollected) {
68
+ setAllKeysCollected(true);
69
+ if (pendingKeysRef.current.size > 0) {
70
+ setExpandedKeys((prev) => {
71
+ const next = new Set(prev);
72
+ pendingKeysRef.current.forEach((k) => next.add(k));
73
+ return next;
74
+ });
75
+ }
76
+ }
77
+ }, [defaultExpandAll, allKeysCollected, setExpandedKeys]);
78
+ const toggle = React.useCallback(
79
+ (key) => {
80
+ setExpandedKeys((prev) => {
81
+ const next = new Set(prev);
82
+ if (next.has(key)) {
83
+ next.delete(key);
84
+ } else {
85
+ next.add(key);
86
+ }
87
+ return next;
88
+ });
89
+ },
90
+ [setExpandedKeys]
91
+ );
92
+ const expand = React.useCallback(
93
+ (key) => {
94
+ setExpandedKeys((prev) => {
95
+ if (prev.has(key)) return prev;
96
+ const next = new Set(prev);
97
+ next.add(key);
98
+ return next;
99
+ });
100
+ },
101
+ [setExpandedKeys]
102
+ );
103
+ const collapse = React.useCallback(
104
+ (key) => {
105
+ setExpandedKeys((prev) => {
106
+ if (!prev.has(key)) return prev;
107
+ const next = new Set(prev);
108
+ next.delete(key);
109
+ return next;
110
+ });
111
+ },
112
+ [setExpandedKeys]
113
+ );
114
+ const registerItem = React.useCallback(
115
+ (id, element, parentId) => {
116
+ itemsRef.current.set(id, { element, parentId });
117
+ if (defaultExpandAll && !allKeysCollected) {
118
+ pendingKeysRef.current.add(id);
119
+ }
120
+ },
121
+ [defaultExpandAll, allKeysCollected]
122
+ );
123
+ const unregisterItem = React.useCallback((id) => {
124
+ itemsRef.current.delete(id);
125
+ }, []);
126
+ const focusItem = React.useCallback((id) => {
127
+ const entry = itemsRef.current.get(id);
128
+ if (entry) {
129
+ entry.element.focus();
130
+ }
131
+ }, []);
132
+ const getParentId = React.useCallback((id) => {
133
+ const entry = itemsRef.current.get(id);
134
+ return entry?.parentId ?? null;
135
+ }, []);
136
+ const getFirstChildId = React.useCallback(
137
+ (id) => {
138
+ if (!expandedKeys.has(id)) return null;
139
+ for (const [childId, entry] of itemsRef.current) {
140
+ if (entry.parentId === id) return childId;
141
+ }
142
+ return null;
143
+ },
144
+ [expandedKeys]
145
+ );
146
+ const getVisibleItems = React.useCallback(() => {
147
+ const rootEl = rootRef.current;
148
+ if (!rootEl) return [];
149
+ const allEls = rootEl.querySelectorAll(
150
+ "[data-slot='tree-view-item'], [data-slot='tree-view-leaf']"
151
+ );
152
+ const visible = [];
153
+ allEls.forEach((el) => {
154
+ const id = el.dataset.treeId;
155
+ if (id && el.offsetParent !== null) {
156
+ visible.push(id);
157
+ }
158
+ });
159
+ return visible;
160
+ }, []);
161
+ const rootRef = React.useRef(null);
162
+ const handleKeyDown = React.useCallback(
163
+ (e) => {
164
+ const target = e.target;
165
+ const treeId = target.dataset.treeId;
166
+ if (!treeId) return;
167
+ const visible = getVisibleItems();
168
+ const currentIndex = visible.indexOf(treeId);
169
+ if (currentIndex === -1) return;
170
+ switch (e.key) {
171
+ case "ArrowDown": {
172
+ e.preventDefault();
173
+ const nextId = visible[currentIndex + 1];
174
+ if (nextId) focusItem(nextId);
175
+ break;
176
+ }
177
+ case "ArrowUp": {
178
+ e.preventDefault();
179
+ const prevId = visible[currentIndex - 1];
180
+ if (prevId) focusItem(prevId);
181
+ break;
182
+ }
183
+ case "ArrowRight": {
184
+ e.preventDefault();
185
+ const slot = target.dataset.slot;
186
+ if (slot === "tree-view-item") {
187
+ if (!expandedKeys.has(treeId)) {
188
+ expand(treeId);
189
+ } else {
190
+ const firstChild = getFirstChildId(treeId);
191
+ if (firstChild) focusItem(firstChild);
192
+ }
193
+ }
194
+ break;
195
+ }
196
+ case "ArrowLeft": {
197
+ e.preventDefault();
198
+ const slot = target.dataset.slot;
199
+ if (slot === "tree-view-item" && expandedKeys.has(treeId)) {
200
+ collapse(treeId);
201
+ } else {
202
+ const parentId = getParentId(treeId);
203
+ if (parentId) focusItem(parentId);
204
+ }
205
+ break;
206
+ }
207
+ case "Home": {
208
+ e.preventDefault();
209
+ const firstId = visible[0];
210
+ if (firstId) focusItem(firstId);
211
+ break;
212
+ }
213
+ case "End": {
214
+ e.preventDefault();
215
+ const lastId = visible[visible.length - 1];
216
+ if (lastId) focusItem(lastId);
217
+ break;
218
+ }
219
+ case "Enter":
220
+ case " ": {
221
+ e.preventDefault();
222
+ const slot = target.dataset.slot;
223
+ if (slot === "tree-view-item") {
224
+ toggle(treeId);
225
+ }
226
+ break;
227
+ }
228
+ }
229
+ },
230
+ [
231
+ expandedKeys,
232
+ expand,
233
+ collapse,
234
+ toggle,
235
+ focusItem,
236
+ getFirstChildId,
237
+ getParentId,
238
+ getVisibleItems
239
+ ]
240
+ );
241
+ const ctxValue = React.useMemo(
242
+ () => ({
243
+ expandedKeys,
244
+ toggle,
245
+ expand,
246
+ collapse,
247
+ registerItem,
248
+ unregisterItem,
249
+ focusItem,
250
+ getParentId,
251
+ getFirstChildId,
252
+ getVisibleItems
253
+ }),
254
+ [
255
+ expandedKeys,
256
+ toggle,
257
+ expand,
258
+ collapse,
259
+ registerItem,
260
+ unregisterItem,
261
+ focusItem,
262
+ getParentId,
263
+ getFirstChildId,
264
+ getVisibleItems
265
+ ]
266
+ );
267
+ return /* @__PURE__ */ jsx(TreeViewContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsx(
268
+ "div",
269
+ {
270
+ ref: rootRef,
271
+ "data-slot": "tree-view",
272
+ role: "tree",
273
+ onKeyDown: handleKeyDown,
274
+ className: cn("flex flex-col", className),
275
+ ...props,
276
+ children: /* @__PURE__ */ jsx(DepthContext.Provider, { value: 0, children })
277
+ }
278
+ ) });
279
+ }
280
+ var ItemParentContext = React.createContext(null);
281
+ var depthPadding = {
282
+ 0: "pl-0",
283
+ 1: "pl-4",
284
+ 2: "pl-8",
285
+ 3: "pl-12",
286
+ 4: "pl-16",
287
+ 5: "pl-20",
288
+ 6: "pl-24"
289
+ };
290
+ function getDepthClass(depth) {
291
+ return depthPadding[depth] ?? `pl-[${depth * 16}px]`;
292
+ }
293
+ function TreeViewItem({
294
+ className,
295
+ itemKey,
296
+ label,
297
+ depth: depthProp,
298
+ children,
299
+ ...props
300
+ }) {
301
+ const { expandedKeys, toggle, registerItem, unregisterItem } = useTreeView();
302
+ const autoDepth = React.useContext(DepthContext);
303
+ const parentId = React.useContext(ItemParentContext);
304
+ const depth = depthProp ?? autoDepth;
305
+ const isExpanded = expandedKeys.has(itemKey);
306
+ const rowRef = React.useRef(null);
307
+ React.useEffect(() => {
308
+ const el = rowRef.current;
309
+ if (el) {
310
+ registerItem(itemKey, el, parentId);
311
+ }
312
+ return () => unregisterItem(itemKey);
313
+ }, [itemKey, parentId, registerItem, unregisterItem]);
314
+ return /* @__PURE__ */ jsxs(
315
+ CollapsiblePrimitive.Root,
316
+ {
317
+ open: isExpanded,
318
+ onOpenChange: () => toggle(itemKey),
319
+ children: [
320
+ /* @__PURE__ */ jsxs(
321
+ "div",
322
+ {
323
+ ref: rowRef,
324
+ "data-slot": "tree-view-item",
325
+ "data-tree-id": itemKey,
326
+ role: "treeitem",
327
+ "aria-expanded": isExpanded,
328
+ tabIndex: -1,
329
+ onClick: () => toggle(itemKey),
330
+ className: cn(
331
+ // Layout
332
+ "flex cursor-pointer select-none items-center gap-1 rounded-md py-1 text-sm outline-none",
333
+ getDepthClass(depth),
334
+ // Transitions
335
+ "transition-[color,background-color,box-shadow] duration-150 ease-smooth",
336
+ "motion-reduce:transition-none",
337
+ // Hover & focus
338
+ "hover-only:hover:bg-surface-secondary",
339
+ "focus-visible:focus-ring",
340
+ className
341
+ ),
342
+ ...props,
343
+ children: [
344
+ /* @__PURE__ */ jsx(
345
+ ChevronRightIcon,
346
+ {
347
+ "data-slot": "tree-view-item-icon",
348
+ className: cn(
349
+ "pointer-events-none size-4 shrink-0 text-muted-foreground",
350
+ "transition-transform duration-150 ease-smooth",
351
+ "motion-reduce:transition-none",
352
+ isExpanded && "rotate-90"
353
+ )
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsx("span", { "data-slot": "tree-view-item-label", className: "truncate", children: label })
357
+ ]
358
+ }
359
+ ),
360
+ /* @__PURE__ */ jsx(ItemParentContext.Provider, { value: itemKey, children: /* @__PURE__ */ jsx(DepthContext.Provider, { value: depth + 1, children }) })
361
+ ]
362
+ }
363
+ );
364
+ }
365
+ function TreeViewLeaf({
366
+ className,
367
+ depth: depthProp,
368
+ children,
369
+ ...props
370
+ }) {
371
+ const { registerItem, unregisterItem } = useTreeView();
372
+ const autoDepth = React.useContext(DepthContext);
373
+ const parentId = React.useContext(ItemParentContext);
374
+ const depth = depthProp ?? autoDepth;
375
+ const leafRef = React.useRef(null);
376
+ const idRef = React.useRef(React.useId());
377
+ React.useEffect(() => {
378
+ const el = leafRef.current;
379
+ const id = idRef.current;
380
+ if (el) {
381
+ registerItem(id, el, parentId);
382
+ }
383
+ return () => unregisterItem(id);
384
+ }, [parentId, registerItem, unregisterItem]);
385
+ return /* @__PURE__ */ jsx(
386
+ "div",
387
+ {
388
+ ref: leafRef,
389
+ "data-slot": "tree-view-leaf",
390
+ "data-tree-id": idRef.current,
391
+ role: "treeitem",
392
+ tabIndex: -1,
393
+ className: cn(
394
+ // Layout — extra pl-5 accounts for the missing chevron
395
+ "flex select-none items-center gap-1 rounded-md py-1 pl-5 text-sm outline-none",
396
+ getDepthClass(depth),
397
+ // Transitions
398
+ "transition-[color,background-color,box-shadow] duration-150 ease-smooth",
399
+ "motion-reduce:transition-none",
400
+ // Hover & focus
401
+ "hover-only:hover:bg-surface-secondary",
402
+ "focus-visible:focus-ring",
403
+ className
404
+ ),
405
+ ...props,
406
+ children
407
+ }
408
+ );
409
+ }
410
+ function TreeViewGroup({ className, children, ...props }) {
411
+ return /* @__PURE__ */ jsx(
412
+ CollapsiblePrimitive.Panel,
413
+ {
414
+ "data-slot": "tree-view-group",
415
+ role: "group",
416
+ className: cn(
417
+ "overflow-hidden",
418
+ "h-(--collapsible-panel-height) data-ending-style:h-0 data-starting-style:h-0",
419
+ "transition-[height,opacity] duration-150 ease-smooth",
420
+ "data-ending-style:opacity-0 data-starting-style:opacity-0",
421
+ "motion-reduce:transition-none",
422
+ className
423
+ ),
424
+ ...props,
425
+ children
426
+ }
427
+ );
428
+ }
429
+ export {
430
+ TreeView,
431
+ TreeViewGroup,
432
+ TreeViewItem,
433
+ TreeViewLeaf
434
+ };
435
+ //# sourceMappingURL=tree-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/tree-view.tsx","../../src/lib/utils.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Collapsible as CollapsiblePrimitive } from \"@base-ui/react/collapsible\";\nimport { ChevronRightIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TreeViewContextValue {\n expandedKeys: Set<string>;\n toggle: (key: string) => void;\n expand: (key: string) => void;\n collapse: (key: string) => void;\n registerItem: (\n id: string,\n element: HTMLElement,\n parentId: string | null,\n ) => void;\n unregisterItem: (id: string) => void;\n focusItem: (id: string) => void;\n getParentId: (id: string) => string | null;\n getFirstChildId: (id: string) => string | null;\n getVisibleItems: () => string[];\n}\n\nconst TreeViewContext = React.createContext<TreeViewContextValue | null>(null);\n\nfunction useTreeView() {\n const ctx = React.useContext(TreeViewContext);\n if (!ctx)\n throw new Error(\"TreeView components must be used within a <TreeView>\");\n return ctx;\n}\n\nconst DepthContext = React.createContext(0);\n\n// ---------------------------------------------------------------------------\n// useControllableState\n// ---------------------------------------------------------------------------\n\nfunction useControllableSet(\n controlledValue: Set<string> | undefined,\n onChange: ((keys: Set<string>) => void) | undefined,\n defaultValue: Set<string>,\n): [Set<string>, (updater: (prev: Set<string>) => Set<string>) => void] {\n const [internal, setInternal] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internal;\n\n const setValue = React.useCallback(\n (updater: (prev: Set<string>) => Set<string>) => {\n if (isControlled) {\n onChange?.(updater(value));\n } else {\n setInternal((prev) => {\n const next = updater(prev);\n onChange?.(next);\n return next;\n });\n }\n },\n [isControlled, onChange, value],\n );\n\n return [value, setValue];\n}\n\n// ---------------------------------------------------------------------------\n// TreeView\n// ---------------------------------------------------------------------------\n\ninterface TreeViewProps extends React.ComponentProps<\"div\"> {\n /** Controlled expanded keys */\n expandedKeys?: Set<string>;\n /** Callback when expanded keys change */\n onExpandedKeysChange?: (keys: Set<string>) => void;\n /** Default expanded keys */\n defaultExpandedKeys?: Set<string>;\n /** Expand all by default */\n defaultExpandAll?: boolean;\n}\n\nfunction TreeView({\n className,\n expandedKeys: controlledExpandedKeys,\n onExpandedKeysChange,\n defaultExpandedKeys,\n defaultExpandAll = false,\n children,\n ...props\n}: TreeViewProps) {\n // Item registry: id -> { element, parentId }\n const itemsRef = React.useRef<\n Map<string, { element: HTMLElement; parentId: string | null }>\n >(new Map());\n\n // Collect all keys on first render when defaultExpandAll is true\n const [allKeysCollected, setAllKeysCollected] = React.useState(false);\n const pendingKeysRef = React.useRef<Set<string>>(new Set());\n\n const resolvedDefault = React.useMemo(\n () => defaultExpandedKeys ?? new Set<string>(),\n [],\n );\n\n const [expandedKeys, setExpandedKeys] = useControllableSet(\n controlledExpandedKeys,\n onExpandedKeysChange,\n resolvedDefault,\n );\n\n // After first render with defaultExpandAll, expand everything that registered\n React.useEffect(() => {\n if (defaultExpandAll && !allKeysCollected) {\n setAllKeysCollected(true);\n if (pendingKeysRef.current.size > 0) {\n setExpandedKeys((prev) => {\n const next = new Set(prev);\n pendingKeysRef.current.forEach((k) => next.add(k));\n return next;\n });\n }\n }\n }, [defaultExpandAll, allKeysCollected, setExpandedKeys]);\n\n const toggle = React.useCallback(\n (key: string) => {\n setExpandedKeys((prev) => {\n const next = new Set(prev);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n },\n [setExpandedKeys],\n );\n\n const expand = React.useCallback(\n (key: string) => {\n setExpandedKeys((prev) => {\n if (prev.has(key)) return prev;\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n },\n [setExpandedKeys],\n );\n\n const collapse = React.useCallback(\n (key: string) => {\n setExpandedKeys((prev) => {\n if (!prev.has(key)) return prev;\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n },\n [setExpandedKeys],\n );\n\n const registerItem = React.useCallback(\n (id: string, element: HTMLElement, parentId: string | null) => {\n itemsRef.current.set(id, { element, parentId });\n if (defaultExpandAll && !allKeysCollected) {\n pendingKeysRef.current.add(id);\n }\n },\n [defaultExpandAll, allKeysCollected],\n );\n\n const unregisterItem = React.useCallback((id: string) => {\n itemsRef.current.delete(id);\n }, []);\n\n const focusItem = React.useCallback((id: string) => {\n const entry = itemsRef.current.get(id);\n if (entry) {\n entry.element.focus();\n }\n }, []);\n\n const getParentId = React.useCallback((id: string) => {\n const entry = itemsRef.current.get(id);\n return entry?.parentId ?? null;\n }, []);\n\n const getFirstChildId = React.useCallback(\n (id: string) => {\n // Find the first registered item whose parentId matches this id\n // and which is visible (its parent is expanded)\n if (!expandedKeys.has(id)) return null;\n for (const [childId, entry] of itemsRef.current) {\n if (entry.parentId === id) return childId;\n }\n return null;\n },\n [expandedKeys],\n );\n\n const getVisibleItems = React.useCallback(() => {\n // Walk the DOM tree to get items in visual order\n const rootEl = rootRef.current;\n if (!rootEl) return [];\n const allEls = rootEl.querySelectorAll<HTMLElement>(\n \"[data-slot='tree-view-item'], [data-slot='tree-view-leaf']\",\n );\n const visible: string[] = [];\n allEls.forEach((el) => {\n const id = el.dataset.treeId;\n if (id && el.offsetParent !== null) {\n visible.push(id);\n }\n });\n return visible;\n }, []);\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n const treeId = target.dataset.treeId;\n if (!treeId) return;\n\n const visible = getVisibleItems();\n const currentIndex = visible.indexOf(treeId);\n if (currentIndex === -1) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const nextId = visible[currentIndex + 1];\n if (nextId) focusItem(nextId);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prevId = visible[currentIndex - 1];\n if (prevId) focusItem(prevId);\n break;\n }\n case \"ArrowRight\": {\n e.preventDefault();\n const slot = target.dataset.slot;\n if (slot === \"tree-view-item\") {\n if (!expandedKeys.has(treeId)) {\n expand(treeId);\n } else {\n const firstChild = getFirstChildId(treeId);\n if (firstChild) focusItem(firstChild);\n }\n }\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n const slot = target.dataset.slot;\n if (slot === \"tree-view-item\" && expandedKeys.has(treeId)) {\n collapse(treeId);\n } else {\n const parentId = getParentId(treeId);\n if (parentId) focusItem(parentId);\n }\n break;\n }\n case \"Home\": {\n e.preventDefault();\n const firstId = visible[0];\n if (firstId) focusItem(firstId);\n break;\n }\n case \"End\": {\n e.preventDefault();\n const lastId = visible[visible.length - 1];\n if (lastId) focusItem(lastId);\n break;\n }\n case \"Enter\":\n case \" \": {\n e.preventDefault();\n const slot = target.dataset.slot;\n if (slot === \"tree-view-item\") {\n toggle(treeId);\n }\n break;\n }\n }\n },\n [\n expandedKeys,\n expand,\n collapse,\n toggle,\n focusItem,\n getFirstChildId,\n getParentId,\n getVisibleItems,\n ],\n );\n\n const ctxValue = React.useMemo<TreeViewContextValue>(\n () => ({\n expandedKeys,\n toggle,\n expand,\n collapse,\n registerItem,\n unregisterItem,\n focusItem,\n getParentId,\n getFirstChildId,\n getVisibleItems,\n }),\n [\n expandedKeys,\n toggle,\n expand,\n collapse,\n registerItem,\n unregisterItem,\n focusItem,\n getParentId,\n getFirstChildId,\n getVisibleItems,\n ],\n );\n\n return (\n <TreeViewContext.Provider value={ctxValue}>\n <div\n ref={rootRef}\n data-slot=\"tree-view\"\n role=\"tree\"\n onKeyDown={handleKeyDown}\n className={cn(\"flex flex-col\", className)}\n {...props}\n >\n <DepthContext.Provider value={0}>{children}</DepthContext.Provider>\n </div>\n </TreeViewContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Item parent context (for registering children with correct parentId)\n// ---------------------------------------------------------------------------\n\nconst ItemParentContext = React.createContext<string | null>(null);\n\n// ---------------------------------------------------------------------------\n// Depth-based padding\n// ---------------------------------------------------------------------------\n\nconst depthPadding: Record<number, string> = {\n 0: \"pl-0\",\n 1: \"pl-4\",\n 2: \"pl-8\",\n 3: \"pl-12\",\n 4: \"pl-16\",\n 5: \"pl-20\",\n 6: \"pl-24\",\n};\n\nfunction getDepthClass(depth: number) {\n return depthPadding[depth] ?? `pl-[${depth * 16}px]`;\n}\n\n// ---------------------------------------------------------------------------\n// TreeViewItem\n// ---------------------------------------------------------------------------\n\ninterface TreeViewItemProps extends React.ComponentProps<\"div\"> {\n /** Unique key for this item */\n itemKey: string;\n /** Label content for the item */\n label: React.ReactNode;\n /** Depth level (auto-managed but can override) */\n depth?: number;\n}\n\nfunction TreeViewItem({\n className,\n itemKey,\n label,\n depth: depthProp,\n children,\n ...props\n}: TreeViewItemProps) {\n const { expandedKeys, toggle, registerItem, unregisterItem } = useTreeView();\n const autoDepth = React.useContext(DepthContext);\n const parentId = React.useContext(ItemParentContext);\n const depth = depthProp ?? autoDepth;\n const isExpanded = expandedKeys.has(itemKey);\n const rowRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const el = rowRef.current;\n if (el) {\n registerItem(itemKey, el, parentId);\n }\n return () => unregisterItem(itemKey);\n }, [itemKey, parentId, registerItem, unregisterItem]);\n\n return (\n <CollapsiblePrimitive.Root\n open={isExpanded}\n onOpenChange={() => toggle(itemKey)}\n >\n <div\n ref={rowRef}\n data-slot=\"tree-view-item\"\n data-tree-id={itemKey}\n role=\"treeitem\"\n aria-expanded={isExpanded}\n tabIndex={-1}\n onClick={() => toggle(itemKey)}\n className={cn(\n // Layout\n \"flex cursor-pointer select-none items-center gap-1 rounded-md py-1 text-sm outline-none\",\n getDepthClass(depth),\n // Transitions\n \"transition-[color,background-color,box-shadow] duration-150 ease-smooth\",\n \"motion-reduce:transition-none\",\n // Hover & focus\n \"hover-only:hover:bg-surface-secondary\",\n \"focus-visible:focus-ring\",\n className,\n )}\n {...props}\n >\n <ChevronRightIcon\n data-slot=\"tree-view-item-icon\"\n className={cn(\n \"pointer-events-none size-4 shrink-0 text-muted-foreground\",\n \"transition-transform duration-150 ease-smooth\",\n \"motion-reduce:transition-none\",\n isExpanded && \"rotate-90\",\n )}\n />\n <span data-slot=\"tree-view-item-label\" className=\"truncate\">\n {label}\n </span>\n </div>\n <ItemParentContext.Provider value={itemKey}>\n <DepthContext.Provider value={depth + 1}>\n {children}\n </DepthContext.Provider>\n </ItemParentContext.Provider>\n </CollapsiblePrimitive.Root>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TreeViewLeaf\n// ---------------------------------------------------------------------------\n\ninterface TreeViewLeafProps extends React.ComponentProps<\"div\"> {\n /** Depth level */\n depth?: number;\n}\n\nfunction TreeViewLeaf({\n className,\n depth: depthProp,\n children,\n ...props\n}: TreeViewLeafProps) {\n const { registerItem, unregisterItem } = useTreeView();\n const autoDepth = React.useContext(DepthContext);\n const parentId = React.useContext(ItemParentContext);\n const depth = depthProp ?? autoDepth;\n const leafRef = React.useRef<HTMLDivElement>(null);\n const idRef = React.useRef(React.useId());\n\n React.useEffect(() => {\n const el = leafRef.current;\n const id = idRef.current;\n if (el) {\n registerItem(id, el, parentId);\n }\n return () => unregisterItem(id);\n }, [parentId, registerItem, unregisterItem]);\n\n return (\n <div\n ref={leafRef}\n data-slot=\"tree-view-leaf\"\n data-tree-id={idRef.current}\n role=\"treeitem\"\n tabIndex={-1}\n className={cn(\n // Layout — extra pl-5 accounts for the missing chevron\n \"flex select-none items-center gap-1 rounded-md py-1 pl-5 text-sm outline-none\",\n getDepthClass(depth),\n // Transitions\n \"transition-[color,background-color,box-shadow] duration-150 ease-smooth\",\n \"motion-reduce:transition-none\",\n // Hover & focus\n \"hover-only:hover:bg-surface-secondary\",\n \"focus-visible:focus-ring\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TreeViewGroup\n// ---------------------------------------------------------------------------\n\ninterface TreeViewGroupProps extends React.ComponentProps<\"div\"> {}\n\nfunction TreeViewGroup({ className, children, ...props }: TreeViewGroupProps) {\n return (\n <CollapsiblePrimitive.Panel\n data-slot=\"tree-view-group\"\n role=\"group\"\n className={cn(\n \"overflow-hidden\",\n \"h-(--collapsible-panel-height) data-ending-style:h-0 data-starting-style:h-0\",\n \"transition-[height,opacity] duration-150 ease-smooth\",\n \"data-ending-style:opacity-0 data-starting-style:opacity-0\",\n \"motion-reduce:transition-none\",\n className,\n )}\n {...props}\n >\n {children}\n </CollapsiblePrimitive.Panel>\n );\n}\n\nexport { TreeView, TreeViewItem, TreeViewGroup, TreeViewLeaf };\nexport type {\n TreeViewProps,\n TreeViewItemProps,\n TreeViewGroupProps,\n TreeViewLeafProps,\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ "use client";
2
3
  var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -3860,23 +3861,23 @@ var import_drawer = require("@base-ui/react/drawer");
3860
3861
  var import_class_variance_authority7 = require("class-variance-authority");
3861
3862
  var import_jsx_runtime23 = require("react/jsx-runtime");
3862
3863
  function Drawer({ ...props }) {
3863
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.DrawerPreview.Root, { "data-slot": "drawer", ...props });
3864
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.Drawer.Root, { "data-slot": "drawer", ...props });
3864
3865
  }
3865
3866
  function DrawerTrigger({ ...props }) {
3866
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.DrawerPreview.Trigger, { "data-slot": "drawer-trigger", ...props });
3867
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.Drawer.Trigger, { "data-slot": "drawer-trigger", ...props });
3867
3868
  }
3868
3869
  function DrawerPortal({ ...props }) {
3869
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.DrawerPreview.Portal, { "data-slot": "drawer-portal", ...props });
3870
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.Drawer.Portal, { "data-slot": "drawer-portal", ...props });
3870
3871
  }
3871
3872
  function DrawerClose({ ...props }) {
3872
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.DrawerPreview.Close, { "data-slot": "drawer-close", ...props });
3873
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.Drawer.Close, { "data-slot": "drawer-close", ...props });
3873
3874
  }
3874
3875
  function DrawerOverlay({
3875
3876
  className,
3876
3877
  ...props
3877
3878
  }) {
3878
3879
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3879
- import_drawer.DrawerPreview.Backdrop,
3880
+ import_drawer.Drawer.Backdrop,
3880
3881
  {
3881
3882
  "data-slot": "drawer-overlay",
3882
3883
  className: cn(
@@ -3916,7 +3917,7 @@ function DrawerContent({
3916
3917
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(DrawerPortal, { children: [
3917
3918
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(DrawerOverlay, {}),
3918
3919
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
3919
- import_drawer.DrawerPreview.Popup,
3920
+ import_drawer.Drawer.Popup,
3920
3921
  {
3921
3922
  "data-slot": "drawer-content",
3922
3923
  "data-drawer-direction": direction,
@@ -3924,7 +3925,7 @@ function DrawerContent({
3924
3925
  ...props,
3925
3926
  children: [
3926
3927
  direction === "bottom" && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "bg-surface-tertiary mx-auto mt-4 h-1.5 w-[100px] shrink-0 rounded-full" }),
3927
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.DrawerPreview.Content, { children })
3928
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_drawer.Drawer.Content, { children })
3928
3929
  ]
3929
3930
  }
3930
3931
  )
@@ -3960,7 +3961,7 @@ function DrawerFooter({ className, ...props }) {
3960
3961
  }
3961
3962
  function DrawerTitle({ className, ...props }) {
3962
3963
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3963
- import_drawer.DrawerPreview.Title,
3964
+ import_drawer.Drawer.Title,
3964
3965
  {
3965
3966
  "data-slot": "drawer-title",
3966
3967
  className: cn("text-foreground font-medium", className),
@@ -3973,7 +3974,7 @@ function DrawerDescription({
3973
3974
  ...props
3974
3975
  }) {
3975
3976
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3976
- import_drawer.DrawerPreview.Description,
3977
+ import_drawer.Drawer.Description,
3977
3978
  {
3978
3979
  "data-slot": "drawer-description",
3979
3980
  className: cn("text-muted-foreground text-sm", className),
@@ -6125,11 +6126,7 @@ function Section({
6125
6126
  "div",
6126
6127
  {
6127
6128
  "data-slot": "section-content",
6128
- className: cn(
6129
- contentMaxWidth[maxWidth],
6130
- centered && "mx-auto",
6131
- "px-6"
6132
- ),
6129
+ className: cn(contentMaxWidth[maxWidth], centered && "mx-auto", "px-6"),
6133
6130
  children
6134
6131
  }
6135
6132
  )