@hyunsdev/ui 0.1.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 (340) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +89 -0
  3. package/SKILL.md +38 -0
  4. package/dist/WindowContext-DybYtZJa.d.ts +50 -0
  5. package/dist/_styles-BbTx89aX.d.ts +3 -0
  6. package/dist/chunk-23KUNTRD.js +49 -0
  7. package/dist/chunk-23KUNTRD.js.map +1 -0
  8. package/dist/chunk-3RTSANKB.js +51 -0
  9. package/dist/chunk-3RTSANKB.js.map +1 -0
  10. package/dist/chunk-4QIWBOF4.js +129 -0
  11. package/dist/chunk-4QIWBOF4.js.map +1 -0
  12. package/dist/chunk-5JCWC7IU.js +293 -0
  13. package/dist/chunk-5JCWC7IU.js.map +1 -0
  14. package/dist/chunk-6ANDNGHD.js +33 -0
  15. package/dist/chunk-6ANDNGHD.js.map +1 -0
  16. package/dist/chunk-7W7QZHEZ.js +42 -0
  17. package/dist/chunk-7W7QZHEZ.js.map +1 -0
  18. package/dist/chunk-BHO4WT2N.js +51 -0
  19. package/dist/chunk-BHO4WT2N.js.map +1 -0
  20. package/dist/chunk-BI3KKBIC.js +11 -0
  21. package/dist/chunk-BI3KKBIC.js.map +1 -0
  22. package/dist/chunk-D3SP7GL3.js +55 -0
  23. package/dist/chunk-D3SP7GL3.js.map +1 -0
  24. package/dist/chunk-D7W4RSQX.js +115 -0
  25. package/dist/chunk-D7W4RSQX.js.map +1 -0
  26. package/dist/chunk-DN2AEEA2.js +11 -0
  27. package/dist/chunk-DN2AEEA2.js.map +1 -0
  28. package/dist/chunk-ETTKFCO6.js +84 -0
  29. package/dist/chunk-ETTKFCO6.js.map +1 -0
  30. package/dist/chunk-GJT7TDBS.js +66 -0
  31. package/dist/chunk-GJT7TDBS.js.map +1 -0
  32. package/dist/chunk-HZT6RQYZ.js +109 -0
  33. package/dist/chunk-HZT6RQYZ.js.map +1 -0
  34. package/dist/chunk-JB2QZV7K.js +60 -0
  35. package/dist/chunk-JB2QZV7K.js.map +1 -0
  36. package/dist/chunk-KJJB2PVC.js +21 -0
  37. package/dist/chunk-KJJB2PVC.js.map +1 -0
  38. package/dist/chunk-NE3IVPMO.js +31 -0
  39. package/dist/chunk-NE3IVPMO.js.map +1 -0
  40. package/dist/chunk-O2BG2KSY.js +23 -0
  41. package/dist/chunk-O2BG2KSY.js.map +1 -0
  42. package/dist/chunk-OUFGNJ3V.js +1726 -0
  43. package/dist/chunk-OUFGNJ3V.js.map +1 -0
  44. package/dist/chunk-PLZMCJSL.js +351 -0
  45. package/dist/chunk-PLZMCJSL.js.map +1 -0
  46. package/dist/chunk-POG5DZBT.js +104 -0
  47. package/dist/chunk-POG5DZBT.js.map +1 -0
  48. package/dist/chunk-SECZM6JE.js +170 -0
  49. package/dist/chunk-SECZM6JE.js.map +1 -0
  50. package/dist/chunk-T64WPXSC.js +48 -0
  51. package/dist/chunk-T64WPXSC.js.map +1 -0
  52. package/dist/chunk-TU5CYBB4.js +90 -0
  53. package/dist/chunk-TU5CYBB4.js.map +1 -0
  54. package/dist/chunk-UVAI2U6X.js +153 -0
  55. package/dist/chunk-UVAI2U6X.js.map +1 -0
  56. package/dist/chunk-UXCBLYG6.js +142 -0
  57. package/dist/chunk-UXCBLYG6.js.map +1 -0
  58. package/dist/chunk-VUR4MQMH.js +53 -0
  59. package/dist/chunk-VUR4MQMH.js.map +1 -0
  60. package/dist/chunk-WIEKNG4S.js +26 -0
  61. package/dist/chunk-WIEKNG4S.js.map +1 -0
  62. package/dist/chunk-WIZ4OLOB.js +23 -0
  63. package/dist/chunk-WIZ4OLOB.js.map +1 -0
  64. package/dist/chunk-WJRJBMFN.js +21 -0
  65. package/dist/chunk-WJRJBMFN.js.map +1 -0
  66. package/dist/chunk-YUPLJP3F.js +33 -0
  67. package/dist/chunk-YUPLJP3F.js.map +1 -0
  68. package/dist/chunk-Z7ITPSUF.js +184 -0
  69. package/dist/chunk-Z7ITPSUF.js.map +1 -0
  70. package/dist/chunk-ZC76ALSI.js +75 -0
  71. package/dist/chunk-ZC76ALSI.js.map +1 -0
  72. package/dist/code-block-core-xkE94Rk5.d.ts +30 -0
  73. package/dist/components/accordion.d.ts +9 -0
  74. package/dist/components/accordion.js +98 -0
  75. package/dist/components/accordion.js.map +1 -0
  76. package/dist/components/alert-dialog.d.ts +26 -0
  77. package/dist/components/alert-dialog.js +341 -0
  78. package/dist/components/alert-dialog.js.map +1 -0
  79. package/dist/components/alert.d.ts +13 -0
  80. package/dist/components/alert.js +76 -0
  81. package/dist/components/alert.js.map +1 -0
  82. package/dist/components/aspect-ratio.d.ts +6 -0
  83. package/dist/components/aspect-ratio.js +12 -0
  84. package/dist/components/aspect-ratio.js.map +1 -0
  85. package/dist/components/avatar.d.ts +13 -0
  86. package/dist/components/avatar.js +19 -0
  87. package/dist/components/avatar.js.map +1 -0
  88. package/dist/components/badge.d.ts +12 -0
  89. package/dist/components/badge.js +11 -0
  90. package/dist/components/badge.js.map +1 -0
  91. package/dist/components/breadcrumb.d.ts +13 -0
  92. package/dist/components/breadcrumb.js +102 -0
  93. package/dist/components/breadcrumb.js.map +1 -0
  94. package/dist/components/button-group.d.ts +16 -0
  95. package/dist/components/button-group.js +15 -0
  96. package/dist/components/button-group.js.map +1 -0
  97. package/dist/components/button.d.ts +14 -0
  98. package/dist/components/button.js +11 -0
  99. package/dist/components/button.js.map +1 -0
  100. package/dist/components/calendar.d.ts +14 -0
  101. package/dist/components/calendar.js +13 -0
  102. package/dist/components/calendar.js.map +1 -0
  103. package/dist/components/card.d.ts +13 -0
  104. package/dist/components/card.js +21 -0
  105. package/dist/components/card.js.map +1 -0
  106. package/dist/components/carousel.d.ts +32 -0
  107. package/dist/components/carousel.js +196 -0
  108. package/dist/components/carousel.js.map +1 -0
  109. package/dist/components/chart.d.ts +46 -0
  110. package/dist/components/chart.js +254 -0
  111. package/dist/components/chart.js.map +1 -0
  112. package/dist/components/checkbox.d.ts +6 -0
  113. package/dist/components/checkbox.js +41 -0
  114. package/dist/components/checkbox.js.map +1 -0
  115. package/dist/components/code-block-core.d.ts +3 -0
  116. package/dist/components/code-block-core.js +13 -0
  117. package/dist/components/code-block-core.js.map +1 -0
  118. package/dist/components/code-block-custom.d.ts +20 -0
  119. package/dist/components/code-block-custom.js +16 -0
  120. package/dist/components/code-block-custom.js.map +1 -0
  121. package/dist/components/code-block-shiki.d.ts +13 -0
  122. package/dist/components/code-block-shiki.js +15 -0
  123. package/dist/components/code-block-shiki.js.map +1 -0
  124. package/dist/components/code-block.d.ts +5 -0
  125. package/dist/components/code-block.js +14 -0
  126. package/dist/components/code-block.js.map +1 -0
  127. package/dist/components/collapsible.d.ts +8 -0
  128. package/dist/components/collapsible.js +24 -0
  129. package/dist/components/collapsible.js.map +1 -0
  130. package/dist/components/collection.d.ts +63 -0
  131. package/dist/components/collection.js +598 -0
  132. package/dist/components/collection.js.map +1 -0
  133. package/dist/components/color-dot.d.ts +19 -0
  134. package/dist/components/color-dot.js +41 -0
  135. package/dist/components/color-dot.js.map +1 -0
  136. package/dist/components/color-picker.d.ts +12 -0
  137. package/dist/components/color-picker.js +142 -0
  138. package/dist/components/color-picker.js.map +1 -0
  139. package/dist/components/combobox.d.ts +74 -0
  140. package/dist/components/combobox.js +610 -0
  141. package/dist/components/combobox.js.map +1 -0
  142. package/dist/components/command.d.ts +21 -0
  143. package/dist/components/command.js +31 -0
  144. package/dist/components/command.js.map +1 -0
  145. package/dist/components/date-picker.d.ts +43 -0
  146. package/dist/components/date-picker.js +235 -0
  147. package/dist/components/date-picker.js.map +1 -0
  148. package/dist/components/dialog.d.ts +25 -0
  149. package/dist/components/dialog.js +31 -0
  150. package/dist/components/dialog.js.map +1 -0
  151. package/dist/components/drawer.d.ts +15 -0
  152. package/dist/components/drawer.js +124 -0
  153. package/dist/components/drawer.js.map +1 -0
  154. package/dist/components/dropdown-menu.d.ts +34 -0
  155. package/dist/components/dropdown-menu.js +248 -0
  156. package/dist/components/dropdown-menu.js.map +1 -0
  157. package/dist/components/empty.d.ts +15 -0
  158. package/dist/components/empty.js +104 -0
  159. package/dist/components/empty.js.map +1 -0
  160. package/dist/components/field.d.ts +29 -0
  161. package/dist/components/field.js +214 -0
  162. package/dist/components/field.js.map +1 -0
  163. package/dist/components/format-bytes.d.ts +12 -0
  164. package/dist/components/format-bytes.js +30 -0
  165. package/dist/components/format-bytes.js.map +1 -0
  166. package/dist/components/format-number.d.ts +12 -0
  167. package/dist/components/format-number.js +30 -0
  168. package/dist/components/format-number.js.map +1 -0
  169. package/dist/components/gauge.d.ts +11 -0
  170. package/dist/components/gauge.js +82 -0
  171. package/dist/components/gauge.js.map +1 -0
  172. package/dist/components/hover-card.d.ts +8 -0
  173. package/dist/components/hover-card.js +45 -0
  174. package/dist/components/hover-card.js.map +1 -0
  175. package/dist/components/input-group.d.ts +24 -0
  176. package/dist/components/input-group.js +23 -0
  177. package/dist/components/input-group.js.map +1 -0
  178. package/dist/components/input-otp.d.ts +20 -0
  179. package/dist/components/input-otp.js +95 -0
  180. package/dist/components/input-otp.js.map +1 -0
  181. package/dist/components/input.d.ts +9 -0
  182. package/dist/components/input.js +9 -0
  183. package/dist/components/input.js.map +1 -0
  184. package/dist/components/item.d.ts +27 -0
  185. package/dist/components/item.js +182 -0
  186. package/dist/components/item.js.map +1 -0
  187. package/dist/components/kbd.d.ts +6 -0
  188. package/dist/components/kbd.js +34 -0
  189. package/dist/components/kbd.js.map +1 -0
  190. package/dist/components/label.d.ts +6 -0
  191. package/dist/components/label.js +9 -0
  192. package/dist/components/label.js.map +1 -0
  193. package/dist/components/loading-bar.d.ts +8 -0
  194. package/dist/components/loading-bar.js +127 -0
  195. package/dist/components/loading-bar.js.map +1 -0
  196. package/dist/components/loading-dots.d.ts +5 -0
  197. package/dist/components/loading-dots.js +45 -0
  198. package/dist/components/loading-dots.js.map +1 -0
  199. package/dist/components/main-provider.d.ts +7 -0
  200. package/dist/components/main-provider.js +12 -0
  201. package/dist/components/main-provider.js.map +1 -0
  202. package/dist/components/mark.d.ts +11 -0
  203. package/dist/components/mark.js +44 -0
  204. package/dist/components/mark.js.map +1 -0
  205. package/dist/components/pagination.d.ts +21 -0
  206. package/dist/components/pagination.js +114 -0
  207. package/dist/components/pagination.js.map +1 -0
  208. package/dist/components/popover.d.ts +12 -0
  209. package/dist/components/popover.js +22 -0
  210. package/dist/components/popover.js.map +1 -0
  211. package/dist/components/prev-next-navigation.d.ts +15 -0
  212. package/dist/components/prev-next-navigation.js +85 -0
  213. package/dist/components/prev-next-navigation.js.map +1 -0
  214. package/dist/components/progress.d.ts +6 -0
  215. package/dist/components/progress.js +38 -0
  216. package/dist/components/progress.js.map +1 -0
  217. package/dist/components/radio-group.d.ts +7 -0
  218. package/dist/components/radio-group.js +57 -0
  219. package/dist/components/radio-group.js.map +1 -0
  220. package/dist/components/relative-time.d.ts +16 -0
  221. package/dist/components/relative-time.js +75 -0
  222. package/dist/components/relative-time.js.map +1 -0
  223. package/dist/components/resizable.d.ts +10 -0
  224. package/dist/components/resizable.js +45 -0
  225. package/dist/components/resizable.js.map +1 -0
  226. package/dist/components/scroll-area.d.ts +7 -0
  227. package/dist/components/scroll-area.js +11 -0
  228. package/dist/components/scroll-area.js.map +1 -0
  229. package/dist/components/select.d.ts +20 -0
  230. package/dist/components/select.js +189 -0
  231. package/dist/components/select.js.map +1 -0
  232. package/dist/components/separator.d.ts +6 -0
  233. package/dist/components/separator.js +9 -0
  234. package/dist/components/separator.js.map +1 -0
  235. package/dist/components/sheet.d.ts +16 -0
  236. package/dist/components/sheet.js +25 -0
  237. package/dist/components/sheet.js.map +1 -0
  238. package/dist/components/show-more.d.ts +15 -0
  239. package/dist/components/show-more.js +79 -0
  240. package/dist/components/show-more.js.map +1 -0
  241. package/dist/components/skeleton.d.ts +5 -0
  242. package/dist/components/skeleton.js +8 -0
  243. package/dist/components/skeleton.js.map +1 -0
  244. package/dist/components/slider.d.ts +6 -0
  245. package/dist/components/slider.js +65 -0
  246. package/dist/components/slider.js.map +1 -0
  247. package/dist/components/snippet.d.ts +13 -0
  248. package/dist/components/snippet.js +135 -0
  249. package/dist/components/snippet.js.map +1 -0
  250. package/dist/components/sonner.d.ts +6 -0
  251. package/dist/components/sonner.js +10 -0
  252. package/dist/components/sonner.js.map +1 -0
  253. package/dist/components/spinner.d.ts +5 -0
  254. package/dist/components/spinner.js +8 -0
  255. package/dist/components/spinner.js.map +1 -0
  256. package/dist/components/stat.d.ts +17 -0
  257. package/dist/components/stat.js +71 -0
  258. package/dist/components/stat.js.map +1 -0
  259. package/dist/components/steps.d.ts +17 -0
  260. package/dist/components/steps.js +133 -0
  261. package/dist/components/steps.js.map +1 -0
  262. package/dist/components/switch.d.ts +8 -0
  263. package/dist/components/switch.js +44 -0
  264. package/dist/components/switch.js.map +1 -0
  265. package/dist/components/table.d.ts +12 -0
  266. package/dist/components/table.js +101 -0
  267. package/dist/components/table.js.map +1 -0
  268. package/dist/components/tabs.d.ts +14 -0
  269. package/dist/components/tabs.js +88 -0
  270. package/dist/components/tabs.js.map +1 -0
  271. package/dist/components/textarea.d.ts +5 -0
  272. package/dist/components/textarea.js +9 -0
  273. package/dist/components/textarea.js.map +1 -0
  274. package/dist/components/theme-provider.d.ts +10 -0
  275. package/dist/components/theme-provider.js +14 -0
  276. package/dist/components/theme-provider.js.map +1 -0
  277. package/dist/components/time-picker.d.ts +17 -0
  278. package/dist/components/time-picker.js +219 -0
  279. package/dist/components/time-picker.js.map +1 -0
  280. package/dist/components/timeline.d.ts +17 -0
  281. package/dist/components/timeline.js +138 -0
  282. package/dist/components/timeline.js.map +1 -0
  283. package/dist/components/toggle-group.d.ts +14 -0
  284. package/dist/components/toggle-group.js +82 -0
  285. package/dist/components/toggle-group.js.map +1 -0
  286. package/dist/components/toggle.d.ts +12 -0
  287. package/dist/components/toggle.js +11 -0
  288. package/dist/components/toggle.js.map +1 -0
  289. package/dist/components/tooltip.d.ts +9 -0
  290. package/dist/components/tooltip.js +15 -0
  291. package/dist/components/tooltip.js.map +1 -0
  292. package/dist/components/typography.d.ts +17 -0
  293. package/dist/components/typography.js +91 -0
  294. package/dist/components/typography.js.map +1 -0
  295. package/dist/hooks/use-mobile.d.ts +3 -0
  296. package/dist/hooks/use-mobile.js +7 -0
  297. package/dist/hooks/use-mobile.js.map +1 -0
  298. package/dist/hooks/use-theme.d.ts +3 -0
  299. package/dist/hooks/use-theme.js +8 -0
  300. package/dist/hooks/use-theme.js.map +1 -0
  301. package/dist/index.d.ts +7 -0
  302. package/dist/index.js +27 -0
  303. package/dist/index.js.map +1 -0
  304. package/dist/layouts/center/index.d.ts +18 -0
  305. package/dist/layouts/center/index.js +73 -0
  306. package/dist/layouts/center/index.js.map +1 -0
  307. package/dist/layouts/chat/index.d.ts +42 -0
  308. package/dist/layouts/chat/index.js +191 -0
  309. package/dist/layouts/chat/index.js.map +1 -0
  310. package/dist/layouts/command/index.d.ts +2 -0
  311. package/dist/layouts/command/index.js +1 -0
  312. package/dist/layouts/command/index.js.map +1 -0
  313. package/dist/layouts/panel/index.d.ts +55 -0
  314. package/dist/layouts/panel/index.js +513 -0
  315. package/dist/layouts/panel/index.js.map +1 -0
  316. package/dist/layouts/presentation/index.d.ts +14 -0
  317. package/dist/layouts/presentation/index.js +100 -0
  318. package/dist/layouts/presentation/index.js.map +1 -0
  319. package/dist/layouts/site/index.d.ts +17 -0
  320. package/dist/layouts/site/index.js +82 -0
  321. package/dist/layouts/site/index.js.map +1 -0
  322. package/dist/layouts/window/index.d.ts +223 -0
  323. package/dist/layouts/window/index.js +127 -0
  324. package/dist/layouts/window/index.js.map +1 -0
  325. package/dist/layouts/workbench/index.d.ts +281 -0
  326. package/dist/layouts/workbench/index.js +2457 -0
  327. package/dist/layouts/workbench/index.js.map +1 -0
  328. package/dist/lib/format.d.ts +15 -0
  329. package/dist/lib/format.js +9 -0
  330. package/dist/lib/format.js.map +1 -0
  331. package/dist/lib/theme.d.ts +22 -0
  332. package/dist/lib/theme.js +25 -0
  333. package/dist/lib/theme.js.map +1 -0
  334. package/dist/lib/utils.d.ts +5 -0
  335. package/dist/lib/utils.js +7 -0
  336. package/dist/lib/utils.js.map +1 -0
  337. package/dist/styles/fonts.css +1 -0
  338. package/dist/styles/globals.css +717 -0
  339. package/dist/styles/tokens.css +693 -0
  340. package/package.json +137 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/layouts/workbench/core/components/WorkbenchRibbonBar.tsx","../../../src/layouts/workbench/core/contexts/WorkbenchPrimarySidebarContext.tsx","../../../src/layouts/workbench/core/workbench.const.tsx","../../../src/layouts/workbench/core/components/Workbench.tsx","../../../src/layouts/workbench/core/contexts/WorkbenchSecondarySidebarContext.tsx","../../../src/layouts/workbench/core/components/WorkbenchProvider.tsx","../../../src/layouts/workbench/core/components/panel/WorkbenchContentArea.tsx","../../../src/layouts/workbench/core/components/sidebar/WorkbenchSidebar.tsx","../../../src/layouts/workbench/core/components/sidebar/WorkbenchSidebarTree.tsx","../../../src/layouts/workbench/core/hooks/useWorkbenchPrimarySidebar.tsx","../../../src/layouts/workbench/core/components/sidebar/WorkbenchPrimarySidebar.tsx","../../../src/layouts/workbench/core/hooks/useWorkbenchSecondarySidebar.tsx","../../../src/layouts/workbench/core/components/sidebar/WorkbenchSecondarySidebar.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport * as Slot from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@hyunsdev/ui/components/tooltip\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { sidedockFocusClass } from \"../../../_styles\"\nimport { WorkbenchPrimarySidebarContext } from \"../contexts/WorkbenchPrimarySidebarContext\"\n\nexport const WORKBENCH_RIBBON_BAR_WIDTH = \"52px\"\n\nconst ribbonBarButtonVariants = cva(\n cn(\n \"text-sidedock-text hover:bg-sidedock-hover-background hover:text-sidedock-text-hover active:bg-sidedock-active-background active:text-sidedock-text-active data-active:bg-sidedock-active-background data-active:text-sidedock-text-active inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent outline-hidden transition-colors disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n sidedockFocusClass,\n ),\n {\n variants: {\n size: {\n default: \"size-9 [&_svg:not([class*=size-])]:size-5\",\n sm: \"size-8 [&_svg:not([class*=size-])]:size-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n)\n\nexport function WorkbenchRibbonBar({ className, ...props }: React.ComponentProps<\"aside\">) {\n const primarySidebar = React.useContext(WorkbenchPrimarySidebarContext)\n\n return (\n <aside\n data-slot=\"workbench-ribbon-bar\"\n data-primary-sidebar-state={primarySidebar?.state}\n className={cn(\n \"bg-sidedock-background text-sidedock-text border-sidedock-border relative z-[calc(var(--layer-sidebar)+1)] flex h-svh w-(--workbench-ribbon-bar-width) shrink-0 flex-col items-center border-r data-[primary-sidebar-state=collapsed]:border-r-transparent\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchRibbonBarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"workbench-ribbon-bar-header\"\n className={cn(\"flex w-full shrink-0 flex-col items-center gap-1 p-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchRibbonBarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"workbench-ribbon-bar-content\"\n className={cn(\n \"no-scrollbar flex min-h-0 w-full flex-1 flex-col items-center gap-1 overflow-y-auto p-2\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchRibbonBarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"workbench-ribbon-bar-footer\"\n className={cn(\"flex w-full shrink-0 flex-col items-center gap-1 p-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchRibbonBarSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"separator\"\n data-slot=\"workbench-ribbon-bar-separator\"\n className={cn(\"bg-sidedock-border my-1 h-px w-8 shrink-0\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchRibbonBarButton({\n asChild = false,\n isActive = false,\n size = \"default\",\n tooltip,\n className,\n type = \"button\",\n \"aria-label\": ariaLabel,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof ribbonBarButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const tooltipProps = typeof tooltip === \"string\" ? { children: tooltip } : tooltip\n const label = ariaLabel ?? (typeof tooltip === \"string\" ? tooltip : undefined)\n\n const button = (\n <Comp\n data-slot=\"workbench-ribbon-bar-button\"\n data-active={isActive || undefined}\n aria-label={label}\n type={asChild ? undefined : type}\n className={cn(ribbonBarButtonVariants({ size }), className)}\n {...props}\n />\n )\n\n if (!tooltipProps) {\n return button\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" {...tooltipProps} />\n </Tooltip>\n )\n}\n","import React from \"react\"\n\nimport { useIsMobile } from \"@hyunsdev/ui/hooks/use-mobile\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport {\n WORKBENCH_PRIMARY_SIDEBAR_COOKIE_NAME,\n WORKBENCH_SIDEBAR_COOKIE_MAX_AGE,\n} from \"../workbench.const\"\n\nexport type WorkbenchPrimarySidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: React.Dispatch<React.SetStateAction<boolean>>\n openMobile: boolean\n setOpenMobile: React.Dispatch<React.SetStateAction<boolean>>\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nexport const WorkbenchPrimarySidebarContext =\n React.createContext<WorkbenchPrimarySidebarContextProps | null>(null)\n\nexport function WorkbenchPrimarySidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n\n const setOpen = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n (value) => {\n const nextOpen = typeof value === \"function\" ? value(open) : value\n\n if (setOpenProp) {\n setOpenProp(nextOpen)\n } else {\n _setOpen(nextOpen)\n }\n\n document.cookie = `${WORKBENCH_PRIMARY_SIDEBAR_COOKIE_NAME}=${nextOpen}; path=/; max-age=${WORKBENCH_SIDEBAR_COOKIE_MAX_AGE}`\n },\n [open, setOpenProp],\n )\n\n const toggleSidebar = React.useCallback(() => {\n if (isMobile) {\n setOpenMobile((currentOpen) => !currentOpen)\n return\n }\n\n setOpen((currentOpen) => !currentOpen)\n }, [isMobile, setOpen])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<WorkbenchPrimarySidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, openMobile, isMobile, toggleSidebar],\n )\n\n return (\n <WorkbenchPrimarySidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={style}\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidedock-background flex min-h-svh w-full\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </WorkbenchPrimarySidebarContext.Provider>\n )\n}\n\nexport function useWorkbenchPrimarySidebar() {\n const context = React.useContext(WorkbenchPrimarySidebarContext)\n\n if (!context) {\n throw new Error(\n \"useWorkbenchPrimarySidebar must be used within a WorkbenchPrimarySidebarProvider\",\n )\n }\n\n return context\n}\n","export const WORKBENCH_PRIMARY_SIDEBAR_COOKIE_NAME = \"workbench_primary_sidebar_state\"\nexport const WORKBENCH_SECONDARY_SIDEBAR_COOKIE_NAME = \"workbench_secondary_sidebar_state\"\nexport const WORKBENCH_SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nexport const WORKBENCH_SIDEBAR_MIN_WIDTH = \"250px\"\nexport const WORKBENCH_SIDEBAR_DEFAULT_WIDTH = \"270px\"\nexport const WORKBENCH_SIDEBAR_MAX_WIDTH = \"400px\"\nexport const WORKBENCH_SIDEBAR_WIDTH_MOBILE = \"400px\"\n","import type * as React from \"react\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { WORKBENCH_RIBBON_BAR_WIDTH } from \"./WorkbenchRibbonBar\"\n\ntype WorkbenchStyle = React.CSSProperties & {\n readonly \"--workbench-ribbon-bar-width\": typeof WORKBENCH_RIBBON_BAR_WIDTH\n}\n\nexport function Workbench({ className, style, ...props }: React.ComponentProps<\"div\">) {\n const workbenchStyle = {\n \"--workbench-ribbon-bar-width\": WORKBENCH_RIBBON_BAR_WIDTH,\n ...style,\n } satisfies WorkbenchStyle\n\n return (\n <div\n data-slot=\"workbench\"\n style={workbenchStyle}\n className={cn(\n \"bg-workbench-background flex min-h-svh w-full has-data-[slot=workbench-ribbon-bar]:[--workbench-ribbon-bar-offset:var(--workbench-ribbon-bar-width)]\",\n className,\n )}\n {...props}\n />\n )\n}\n","import React from \"react\"\n\nimport { useIsMobile } from \"@hyunsdev/ui/hooks/use-mobile\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport {\n WORKBENCH_SECONDARY_SIDEBAR_COOKIE_NAME,\n WORKBENCH_SIDEBAR_COOKIE_MAX_AGE,\n} from \"../workbench.const\"\n\nexport type WorkbenchSecondarySidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: React.Dispatch<React.SetStateAction<boolean>>\n openMobile: boolean\n setOpenMobile: React.Dispatch<React.SetStateAction<boolean>>\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nexport const WorkbenchSecondarySidebarContext =\n React.createContext<WorkbenchSecondarySidebarContextProps | null>(null)\n\nexport function WorkbenchSecondarySidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n\n const setOpen = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n (value) => {\n const nextOpen = typeof value === \"function\" ? value(open) : value\n\n if (setOpenProp) {\n setOpenProp(nextOpen)\n } else {\n _setOpen(nextOpen)\n }\n\n document.cookie = `${WORKBENCH_SECONDARY_SIDEBAR_COOKIE_NAME}=${nextOpen}; path=/; max-age=${WORKBENCH_SIDEBAR_COOKIE_MAX_AGE}`\n },\n [open, setOpenProp],\n )\n\n const toggleSidebar = React.useCallback(() => {\n if (isMobile) {\n setOpenMobile((currentOpen) => !currentOpen)\n return\n }\n\n setOpen((currentOpen) => !currentOpen)\n }, [isMobile, setOpen])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<WorkbenchSecondarySidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, openMobile, isMobile, toggleSidebar],\n )\n\n return (\n <WorkbenchSecondarySidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-secondary-wrapper\"\n style={style}\n className={cn(\"contents\", className)}\n {...props}\n >\n {children}\n </div>\n </WorkbenchSecondarySidebarContext.Provider>\n )\n}\n\nexport function useWorkbenchSecondarySidebar() {\n const context = React.useContext(WorkbenchSecondarySidebarContext)\n\n if (!context) {\n throw new Error(\n \"useWorkbenchSecondarySidebar must be used within a WorkbenchSecondarySidebarProvider\",\n )\n }\n\n return context\n}\n","import { WorkbenchPrimarySidebarProvider, WorkbenchSecondarySidebarProvider } from \"../contexts\"\n\nexport function WorkbenchProvider({ children }: { children: React.ReactNode }) {\n return (\n <WorkbenchPrimarySidebarProvider>\n <WorkbenchSecondarySidebarProvider>{children}</WorkbenchSecondarySidebarProvider>\n </WorkbenchPrimarySidebarProvider>\n )\n}\n","import * as React from \"react\"\n\nimport * as ResizablePrimitive from \"react-resizable-panels\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nconst WORKBENCH_CONTEXT_AREA_PANEL_MIN_SIZE = \"220px\"\nconst WORKBENCH_CONTEXT_AREA_RESIZE_TARGET_MINIMUM_SIZE = {\n coarse: 36,\n fine: 12,\n}\n\ntype WorkbenchPanelOrientation = \"horizontal\" | \"vertical\"\n\nfunction getPanelKey(child: React.ReactNode, index: number) {\n return React.isValidElement(child) && child.key != null ? child.key : index\n}\n\nexport function WorkbenchContentArea({\n className,\n children,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<\"main\"> & {\n orientation?: WorkbenchPanelOrientation\n}) {\n const panels = React.Children.toArray(children)\n const hasResizablePanels = panels.length > 1\n\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative z-[calc(var(--layer-sidebar)+1)] flex min-h-dvh min-w-0 flex-1 gap-1 rounded-lg md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n >\n {hasResizablePanels ? (\n <WorkbenchPanelGroup orientation={orientation}>{panels}</WorkbenchPanelGroup>\n ) : (\n children\n )}\n </main>\n )\n}\n\nexport function WorkbenchPanelGroup({\n className,\n children,\n orientation = \"horizontal\",\n style,\n ...props\n}: ResizablePrimitive.GroupProps & {\n orientation?: WorkbenchPanelOrientation\n}) {\n const panels = React.Children.toArray(children)\n\n return (\n <ResizablePrimitive.Group\n {...props}\n data-slot=\"workbench-panel-group\"\n orientation={orientation}\n resizeTargetMinimumSize={WORKBENCH_CONTEXT_AREA_RESIZE_TARGET_MINIMUM_SIZE}\n style={{ overflow: \"visible\", ...style }}\n className={cn(\n \"relative z-[calc(var(--layer-sidebar)+1)] flex h-full min-h-0 w-full min-w-0 flex-1 aria-[orientation=vertical]:flex-col\",\n className,\n )}\n >\n {panels.map((panel, index) => (\n <React.Fragment key={getPanelKey(panel, index)}>\n {index > 0 && <WorkbenchContextAreaRail />}\n <ResizablePrimitive.Panel\n data-slot=\"workbench-context-area-panel\"\n defaultSize={`${100 / panels.length}%`}\n minSize={WORKBENCH_CONTEXT_AREA_PANEL_MIN_SIZE}\n style={{ overflow: \"visible\" }}\n className=\"relative min-h-0 min-w-0\"\n >\n {panel}\n </ResizablePrimitive.Panel>\n </React.Fragment>\n ))}\n </ResizablePrimitive.Group>\n )\n}\n\nexport function WorkbenchContextAreaRail({\n className,\n \"aria-label\": ariaLabel = \"Resize workbench panels\",\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.Separator>) {\n return (\n <ResizablePrimitive.Separator\n {...props}\n data-slot=\"workbench-context-area-rail\"\n aria-label={ariaLabel}\n className={cn(\n \"hover:after:bg-sidedock-border focus-visible:ring-focus-ring relative isolate z-[calc(var(--layer-popover)+1)] flex w-1 cursor-col-resize touch-none items-stretch justify-center bg-transparent outline-hidden transition-colors after:absolute after:inset-y-0 after:left-1/2 after:w-px after:-translate-x-1/2 after:bg-transparent after:transition-colors focus-visible:ring-1\",\n \"aria-[orientation=horizontal]:h-1 aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:cursor-row-resize aria-[orientation=horizontal]:items-center aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:inset-y-auto aria-[orientation=horizontal]:after:top-1/2 aria-[orientation=horizontal]:after:h-px aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2\",\n className,\n )}\n />\n )\n}\n","import * as React from \"react\"\n\nimport * as Slot from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { Separator } from \"@hyunsdev/ui/components/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@hyunsdev/ui/components/sheet\"\nimport { Skeleton } from \"@hyunsdev/ui/components/skeleton\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@hyunsdev/ui/components/tooltip\"\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport {\n sidedockFocusClass,\n sidedockOutlineStrokeClass,\n sidedockShellClass,\n} from \"../../../../_styles\"\nimport {\n WORKBENCH_SIDEBAR_DEFAULT_WIDTH,\n WORKBENCH_SIDEBAR_MAX_WIDTH,\n WORKBENCH_SIDEBAR_MIN_WIDTH,\n WORKBENCH_SIDEBAR_WIDTH_MOBILE,\n} from \"../../workbench.const\"\n\nconst WORKBENCH_SIDEBAR_RESIZE_STEP = 16\nconst WORKBENCH_SIDEBAR_DRAG_THRESHOLD = 3\n\ntype WorkbenchSidebarDragState = {\n pointerId: number | null\n startX: number\n startWidth: number\n}\n\ntype WorkbenchSidebarWidthStyle = React.CSSProperties & {\n readonly \"--sidebar-width\": string\n}\n\ntype WorkbenchSidebarSkeletonStyle = React.CSSProperties & {\n readonly \"--skeleton-width\": string\n}\n\ntype WorkbenchSidebarSide = \"left\" | \"right\"\ntype WorkbenchSidebarState = \"expanded\" | \"collapsed\"\n\ntype WorkbenchSidebarVisualContextProps = {\n isMobile: boolean\n side: WorkbenchSidebarSide\n state: WorkbenchSidebarState\n}\n\ntype WorkbenchSidebarShellProps = React.ComponentProps<\"div\"> & {\n description: string\n openMobile: boolean\n setOpenMobile: React.Dispatch<React.SetStateAction<boolean>>\n side: WorkbenchSidebarSide\n state: WorkbenchSidebarState\n title: string\n toggleSidebar: () => void\n isMobile: boolean\n}\n\nconst WorkbenchSidebarVisualContext =\n React.createContext<WorkbenchSidebarVisualContextProps | null>(null)\n\nfunction useWorkbenchSidebarVisualContext() {\n const context = React.useContext(WorkbenchSidebarVisualContext)\n\n if (!context) {\n throw new Error(\"Workbench sidebar components must be used within a sidebar shell.\")\n }\n\n return context\n}\n\nfunction toPixelWidth(width: string) {\n const parsedWidth = Number.parseInt(width, 10)\n return Number.isNaN(parsedWidth) ? 0 : parsedWidth\n}\n\nconst WORKBENCH_SIDEBAR_MIN_WIDTH_PX = toPixelWidth(WORKBENCH_SIDEBAR_MIN_WIDTH)\nconst WORKBENCH_SIDEBAR_DEFAULT_WIDTH_PX = toPixelWidth(WORKBENCH_SIDEBAR_DEFAULT_WIDTH)\nconst WORKBENCH_SIDEBAR_MAX_WIDTH_PX = toPixelWidth(WORKBENCH_SIDEBAR_MAX_WIDTH)\n\nfunction clampWorkbenchSidebarWidth(width: number) {\n return Math.min(WORKBENCH_SIDEBAR_MAX_WIDTH_PX, Math.max(WORKBENCH_SIDEBAR_MIN_WIDTH_PX, width))\n}\n\nfunction SidebarRail({\n className,\n currentWidth,\n label,\n onClick,\n onKeyDown,\n onPointerDown,\n side,\n state,\n ...props\n}: React.ComponentProps<\"button\"> & {\n currentWidth: number\n label: string\n side: WorkbenchSidebarSide\n state: WorkbenchSidebarState\n}) {\n const isCollapsed = state === \"collapsed\"\n const railCursorClass = isCollapsed\n ? side === \"left\"\n ? \"cursor-e-resize\"\n : \"cursor-w-resize\"\n : side === \"left\"\n ? \"cursor-w-resize\"\n : \"cursor-e-resize\"\n const railStyle = React.useMemo<React.CSSProperties>(() => {\n const left =\n side === \"left\"\n ? isCollapsed\n ? \"var(--workbench-ribbon-bar-offset, 0px)\"\n : `calc(var(--workbench-ribbon-bar-offset, 0px) + ${currentWidth}px - 2px)`\n : isCollapsed\n ? \"100vw\"\n : `calc(100vw - ${currentWidth}px)`\n\n return { left }\n }, [currentWidth, isCollapsed, side])\n\n return (\n <button\n type=\"button\"\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label={label}\n aria-orientation=\"vertical\"\n aria-valuemax={WORKBENCH_SIDEBAR_MAX_WIDTH_PX}\n aria-valuemin={WORKBENCH_SIDEBAR_MIN_WIDTH_PX}\n aria-valuenow={currentWidth}\n tabIndex={0}\n onClick={onClick}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n title={label}\n style={railStyle}\n className={cn(\n \"hover:after:bg-sidedock-border fixed top-[var(--radius-panel)] bottom-[var(--radius-panel)] z-(--layer-popover) hidden w-4 touch-none transition-[background] ease-linear after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n railCursorClass,\n isCollapsed && \"hover:bg-sidedock-background\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarShell({\n className,\n children,\n description,\n dir,\n isMobile,\n openMobile,\n setOpenMobile,\n side,\n state,\n style,\n title,\n toggleSidebar,\n ...props\n}: WorkbenchSidebarShellProps) {\n const [sidebarWidth, setSidebarWidth] = React.useState(() =>\n clampWorkbenchSidebarWidth(WORKBENCH_SIDEBAR_DEFAULT_WIDTH_PX),\n )\n const [isResizing, setIsResizing] = React.useState(false)\n const dragStateRef = React.useRef<WorkbenchSidebarDragState>({\n pointerId: null,\n startX: 0,\n startWidth: WORKBENCH_SIDEBAR_DEFAULT_WIDTH_PX,\n })\n const didDragRef = React.useRef(false)\n\n const handleRailPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n if (event.button !== 0) {\n return\n }\n\n event.preventDefault()\n setIsResizing(true)\n didDragRef.current = false\n dragStateRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth: sidebarWidth,\n }\n\n const handlePointerMove = (pointerEvent: PointerEvent) => {\n if (pointerEvent.pointerId !== dragStateRef.current.pointerId) {\n return\n }\n\n const deltaX = pointerEvent.clientX - dragStateRef.current.startX\n const signedDeltaX = side === \"right\" ? -deltaX : deltaX\n\n if (Math.abs(signedDeltaX) >= WORKBENCH_SIDEBAR_DRAG_THRESHOLD) {\n didDragRef.current = true\n }\n\n setSidebarWidth(clampWorkbenchSidebarWidth(dragStateRef.current.startWidth + signedDeltaX))\n }\n\n const handlePointerEnd = (pointerEvent: PointerEvent) => {\n if (pointerEvent.pointerId !== dragStateRef.current.pointerId) {\n return\n }\n\n dragStateRef.current.pointerId = null\n setIsResizing(false)\n document.body.style.userSelect = \"\"\n document.body.style.cursor = \"\"\n\n window.removeEventListener(\"pointermove\", handlePointerMove)\n window.removeEventListener(\"pointerup\", handlePointerEnd)\n window.removeEventListener(\"pointercancel\", handlePointerEnd)\n }\n\n document.body.style.userSelect = \"none\"\n document.body.style.cursor = \"ew-resize\"\n\n window.addEventListener(\"pointermove\", handlePointerMove)\n window.addEventListener(\"pointerup\", handlePointerEnd)\n window.addEventListener(\"pointercancel\", handlePointerEnd)\n },\n [side, sidebarWidth],\n )\n\n const handleRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (didDragRef.current) {\n didDragRef.current = false\n event.preventDefault()\n return\n }\n\n toggleSidebar()\n },\n [toggleSidebar],\n )\n\n const handleRailKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault()\n setSidebarWidth((currentWidth) =>\n clampWorkbenchSidebarWidth(\n currentWidth +\n (side === \"right\" ? WORKBENCH_SIDEBAR_RESIZE_STEP : -WORKBENCH_SIDEBAR_RESIZE_STEP),\n ),\n )\n return\n case \"ArrowRight\":\n event.preventDefault()\n setSidebarWidth((currentWidth) =>\n clampWorkbenchSidebarWidth(\n currentWidth +\n (side === \"right\" ? -WORKBENCH_SIDEBAR_RESIZE_STEP : WORKBENCH_SIDEBAR_RESIZE_STEP),\n ),\n )\n return\n case \"Home\":\n event.preventDefault()\n setSidebarWidth(WORKBENCH_SIDEBAR_MIN_WIDTH_PX)\n return\n case \"End\":\n event.preventDefault()\n setSidebarWidth(WORKBENCH_SIDEBAR_MAX_WIDTH_PX)\n return\n default:\n }\n },\n [side],\n )\n\n const desktopSidebarStyle = React.useMemo<WorkbenchSidebarWidthStyle>(\n () => ({\n ...style,\n \"--sidebar-width\": `${sidebarWidth}px`,\n }),\n [sidebarWidth, style],\n )\n\n const contextValue = React.useMemo<WorkbenchSidebarVisualContextProps>(\n () => ({\n isMobile,\n side,\n state,\n }),\n [isMobile, side, state],\n )\n const mobileSidebarStyle = {\n \"--sidebar-width\": WORKBENCH_SIDEBAR_WIDTH_MOBILE,\n } satisfies WorkbenchSidebarWidthStyle\n\n if (isMobile) {\n return (\n <WorkbenchSidebarVisualContext.Provider value={contextValue}>\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className={cn(sidedockShellClass, \"w-(--sidebar-width) p-0 [&>button]:hidden\")}\n style={mobileSidebarStyle}\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>{title}</SheetTitle>\n <SheetDescription>{description}</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n </WorkbenchSidebarVisualContext.Provider>\n )\n }\n\n return (\n <WorkbenchSidebarVisualContext.Provider value={contextValue}>\n <div\n className=\"group peer text-sidedock-text hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? \"offcanvas\" : undefined}\n data-variant=\"sidebar\"\n data-side={side}\n data-slot=\"sidebar\"\n style={desktopSidebarStyle}\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent\",\n isResizing\n ? \"transition-none\"\n : \"transition-[width] duration-200 ease-[cubic-bezier(0.1,0.5,0.2,1)]\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-[var(--layer-sidebar)] hidden h-svh w-(--sidebar-width) data-[side=left]:left-[var(--workbench-ribbon-bar-offset,0px)] data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--workbench-ribbon-bar-offset,0px)_-_var(--sidebar-width))] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n isResizing\n ? \"transition-none\"\n : \"transition-[left,right,width] duration-200 ease-[cubic-bezier(0.1,0.5,0.2,1)]\",\n \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className={cn(\n sidedockShellClass,\n \"group-data-[variant=floating]:ring-sidedock-border flex size-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1\",\n )}\n >\n {children}\n </div>\n </div>\n <SidebarRail\n currentWidth={sidebarWidth}\n label={`Resize ${title}`}\n onClick={handleRailClick}\n onKeyDown={handleRailKeyDown}\n onPointerDown={handleRailPointerDown}\n side={side}\n state={state}\n />\n </div>\n </WorkbenchSidebarVisualContext.Provider>\n )\n}\n\nexport function WorkbenchSidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 px-1.5 py-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 px-1.5 py-2\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidedock-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col px-1.5 py-1\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidedock-label flex h-8 shrink-0 items-center rounded-md px-1.5 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidedock-text hover:bg-sidedock-hover-background hover:text-sidedock-text-hover absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuRow({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-row\"\n data-sidebar=\"menu-row\"\n className={cn(\"group/menu-row relative flex items-center\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n cn(\n \"cursor-pointer text-sidedock-text peer/menu-button group/menu-button flex w-full min-w-0 items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm whitespace-nowrap outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-leading-action]/menu-item:pl-7 group-has-data-[sidebar=menu-trailing-action]/menu-item:pr-7 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidedock-hover-background hover:text-sidedock-text-hover active:bg-sidedock-active-background active:text-sidedock-text-active disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidedock-hover-background data-open:hover:text-sidedock-text-hover data-active:bg-sidedock-active-background data-active:font-medium data-active:text-sidedock-text-active [&_svg]:size-4 [&_svg]:shrink-0\",\n sidedockFocusClass,\n ),\n {\n variants: {\n variant: {\n default: \"\",\n outline: cn(\"bg-background-primary text-text-normal\", sidedockOutlineStrokeClass),\n },\n size: {\n default: \"h-7 text-sm\",\n sm: \"h-6 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n)\n\nexport function WorkbenchSidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n leadingVisual,\n trailingVisual,\n trailingVisualVisibility = \"always\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent> | undefined\n leadingVisual?: React.ReactNode\n trailingVisual?: React.ReactNode\n trailingVisualVisibility?: \"always\" | \"hover\"\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, side, state } = useWorkbenchSidebarVisualContext()\n const content =\n typeof children === \"string\" || typeof children === \"number\" ? (\n <span data-slot=\"sidebar-menu-button-label\" className=\"min-w-0 flex-1 truncate\">\n {children}\n </span>\n ) : (\n children\n )\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n >\n {leadingVisual ? (\n <span\n data-slot=\"sidebar-menu-button-leading-visual\"\n className=\"flex shrink-0 items-center justify-center\"\n >\n {leadingVisual}\n </span>\n ) : null}\n <Slot.Slottable>{content}</Slot.Slottable>\n {trailingVisual ? (\n <span\n data-slot=\"sidebar-menu-button-trailing-visual\"\n className={cn(\n \"ml-auto flex shrink-0 items-center justify-center\",\n trailingVisualVisibility === \"hover\" &&\n \"invisible opacity-0 group-hover/menu-button:visible group-hover/menu-button:opacity-100 group-focus-visible/menu-button:visible group-focus-visible/menu-button:opacity-100\",\n )}\n >\n {trailingVisual}\n </span>\n ) : null}\n </Comp>\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side={side === \"left\" ? \"right\" : \"left\"}\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\ntype WorkbenchSidebarMenuActionProps = React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}\n\nfunction WorkbenchSidebarMenuActionBase({\n className,\n asChild = false,\n dataSidebar,\n dataSlot,\n showOnHover = false,\n ...props\n}: WorkbenchSidebarMenuActionProps & {\n dataSidebar: \"menu-leading-action\" | \"menu-trailing-action\"\n dataSlot: \"sidebar-menu-leading-action\" | \"sidebar-menu-trailing-action\"\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot={dataSlot}\n data-sidebar={dataSidebar}\n className={cn(\n \"text-sidedock-text hover:bg-sidedock-hover-background hover:text-sidedock-text-hover absolute top-1 flex aspect-square w-5 cursor-pointer items-center justify-center rounded-md p-0 outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n dataSidebar === \"menu-leading-action\"\n ? \"group-focus-within/menu-row:text-sidedock-text-hover group-hover/menu-row:text-sidedock-text-hover left-1\"\n : \"peer-hover/menu-button:text-sidedock-text-hover right-1\",\n showOnHover &&\n \"peer-data-active/menu-button:text-sidedock-text-active group-focus-within/menu-row:opacity-100 group-hover/menu-row:opacity-100 aria-expanded:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuLeadingAction(props: WorkbenchSidebarMenuActionProps) {\n return (\n <WorkbenchSidebarMenuActionBase\n dataSidebar=\"menu-leading-action\"\n dataSlot=\"sidebar-menu-leading-action\"\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuTrailingAction(props: WorkbenchSidebarMenuActionProps) {\n return (\n <WorkbenchSidebarMenuActionBase\n dataSidebar=\"menu-trailing-action\"\n dataSlot=\"sidebar-menu-trailing-action\"\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidedock-text peer-hover/menu-button:text-sidedock-text-hover peer-data-active/menu-button:text-sidedock-text-active pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n const skeletonStyle = {\n \"--skeleton-width\": width,\n } satisfies WorkbenchSidebarSkeletonStyle\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-1.5\", className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={skeletonStyle}\n />\n </div>\n )\n}\n\nexport function WorkbenchSidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidedock-border ml-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l py-0.5 pl-1 group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nexport function WorkbenchSidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidedock-text hover:bg-sidedock-hover-background hover:text-sidedock-text-hover active:bg-sidedock-active-background active:text-sidedock-text-active data-active:bg-sidedock-active-background data-active:text-sidedock-text-active [&>svg]:text-sidedock-text-active flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-1.5 outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n sidedockFocusClass,\n className,\n )}\n {...props}\n />\n )\n}\n","import * as React from \"react\"\n\nimport {\n closestCenter,\n DndContext,\n DragOverlay,\n type CollisionDetection,\n type CollisionDescriptor,\n type DragEndEvent,\n type DragMoveEvent,\n type DragOverEvent,\n type DragStartEvent,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport { SortableContext, useSortable, verticalListSortingStrategy } from \"@dnd-kit/sortable\"\nimport { ChevronRightIcon } from \"lucide-react\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport {\n WorkbenchSidebarMenu,\n WorkbenchSidebarMenuButton,\n WorkbenchSidebarMenuItem,\n WorkbenchSidebarMenuLeadingAction,\n WorkbenchSidebarMenuRow,\n WorkbenchSidebarMenuTrailingAction,\n} from \"./WorkbenchSidebar\"\n\nconst DEFAULT_TREE_INDENT_WIDTH = 16\nconst DEFAULT_TREE_MAX_DEPTH = 8\nconst TREE_DROP_EDGE_RATIO = 0.28\nconst TREE_DROP_EDGE_MIN_HEIGHT = 6\nconst TREE_DROP_EDGE_MAX_HEIGHT = 12\n\nexport type WorkbenchSidebarTreeMovePlacement = \"before\" | \"after\" | \"inside\"\n\nexport type WorkbenchSidebarTreeItemState<TData = unknown> = {\n item: WorkbenchSidebarTreeItem<TData>\n itemId: string\n parentId: string | null\n index: number\n depth: number\n isDisabled: boolean\n isDragging: boolean\n isDropTarget: boolean\n isExpanded: boolean\n isExpandable: boolean\n isFocused: boolean\n isSelected: boolean\n}\n\nexport type WorkbenchSidebarTreeItem<TData = unknown> = {\n id: string\n label: React.ReactNode\n children?: WorkbenchSidebarTreeItem<TData>[]\n disabled?: boolean\n draggable?: boolean\n selectable?: boolean\n leadingVisual?: React.ReactNode | WorkbenchSidebarTreeVisual<TData>\n trailingVisual?: React.ReactNode | WorkbenchSidebarTreeVisual<TData>\n tooltip?: string | undefined\n data?: TData\n}\n\nexport type WorkbenchSidebarTreeItemEvent<TData = unknown> = {\n item: WorkbenchSidebarTreeItem<TData>\n itemId: string\n parentId: string | null\n index: number\n depth: number\n expandedIds: string[]\n selectedId: string | null\n originalEvent?: React.MouseEvent | React.KeyboardEvent | undefined\n}\n\nexport type WorkbenchSidebarTreeExpandedEvent<TData = unknown> =\n WorkbenchSidebarTreeItemEvent<TData> & {\n expanded: boolean\n }\n\nexport type WorkbenchSidebarTreeMoveEvent<TData = unknown> = {\n item: WorkbenchSidebarTreeItem<TData>\n itemId: string\n fromParentId: string | null\n toParentId: string | null\n fromIndex: number\n toIndex: number\n depth: number\n placement: WorkbenchSidebarTreeMovePlacement\n nextItems: WorkbenchSidebarTreeItem<TData>[]\n}\n\nexport type WorkbenchSidebarTreeRenderItemProps<TData = unknown> = {\n state: WorkbenchSidebarTreeItemState<TData>\n rowProps: React.ComponentProps<\"div\">\n buttonProps: WorkbenchSidebarTreeButtonProps\n disclosureProps: WorkbenchSidebarTreeButtonProps & {\n visible: boolean\n }\n leadingVisual: React.ReactNode\n trailingVisual: React.ReactNode\n}\n\nexport type WorkbenchSidebarTreeProviderProps<TData = unknown> = {\n items: WorkbenchSidebarTreeItem<TData>[]\n children: React.ReactNode\n selectedId?: string | null | undefined\n defaultSelectedId?: string | null | undefined\n expandedIds?: Iterable<string> | undefined\n defaultExpandedIds?: Iterable<string> | undefined\n reorderable?: boolean | undefined\n maxDepth?: number | undefined\n indentWidth?: number | undefined\n canDrop?: ((event: WorkbenchSidebarTreeMoveEvent<TData>) => boolean) | undefined\n onItemClick?: ((event: WorkbenchSidebarTreeItemEvent<TData>) => void) | undefined\n onItemSelect?: ((event: WorkbenchSidebarTreeItemEvent<TData>) => void) | undefined\n onSelectedIdChange?:\n | ((selectedId: string | null, event: WorkbenchSidebarTreeItemEvent<TData>) => void)\n | undefined\n onItemExpandedChange?: ((event: WorkbenchSidebarTreeExpandedEvent<TData>) => void) | undefined\n onExpandedIdsChange?:\n | ((expandedIds: string[], event: WorkbenchSidebarTreeExpandedEvent<TData>) => void)\n | undefined\n onMove?: ((event: WorkbenchSidebarTreeMoveEvent<TData>) => void) | undefined\n}\n\nexport type WorkbenchSidebarTreeProps<TData = unknown> = Omit<\n WorkbenchSidebarTreeProviderProps<TData>,\n \"children\"\n> &\n Omit<React.ComponentProps<\"ul\">, \"onSelect\"> & {\n renderItem?: WorkbenchSidebarTreeRenderItem<TData> | undefined\n }\n\nexport type WorkbenchSidebarTreeFlattenedItem<TData = unknown> = {\n item: WorkbenchSidebarTreeItem<TData>\n id: string\n parentId: string | null\n index: number\n depth: number\n ancestorIds: string[]\n childrenCount: number\n}\n\ntype ProjectedMove<TData = unknown> = WorkbenchSidebarTreeMoveEvent<TData> & {\n overId: string\n indicatorId: string\n}\n\ntype WorkbenchSidebarTreeItemRect = Pick<DOMRect, \"top\" | \"bottom\" | \"height\">\n\ntype BivariantCallback<TParameter, TResult> = {\n bivarianceHack(parameter: TParameter): TResult\n}[\"bivarianceHack\"]\n\ntype WorkbenchSidebarTreeVisual<TData> = BivariantCallback<\n WorkbenchSidebarTreeItemState<TData>,\n React.ReactNode\n>\n\ntype WorkbenchSidebarTreeRenderItem<TData> = BivariantCallback<\n WorkbenchSidebarTreeRenderItemProps<TData>,\n React.ReactNode\n>\n\nexport type WorkbenchSidebarTreeDataAttributes = {\n [key: `data-${string}`]: string | number | boolean | undefined\n}\n\nexport type WorkbenchSidebarTreeButtonProps = React.ComponentProps<\"button\"> &\n WorkbenchSidebarTreeDataAttributes\n\nexport type WorkbenchSidebarTreeContextValue<TData = unknown> = {\n items: WorkbenchSidebarTreeItem<TData>[]\n flattenedItems: WorkbenchSidebarTreeFlattenedItem<TData>[]\n itemMap: Map<string, WorkbenchSidebarTreeFlattenedItem<TData>>\n selectedId: string | null\n expandedIdSet: Set<string>\n expandedIds: string[]\n focusedId: string | null\n activeId: string | null\n overId: string | null\n projectedMove: ProjectedMove<TData> | null\n dragOverlayWidth: number | null\n reorderable: boolean\n indentWidth: number\n maxDepth: number\n registerItemButton: (itemId: string, node: HTMLButtonElement | null) => void\n registerItemNode: (itemId: string, node: HTMLElement | null) => void\n focusItem: (itemId: string | null) => void\n getItemState: (itemId: string) => WorkbenchSidebarTreeItemState<TData>\n getItemEvent: (\n itemId: string,\n originalEvent?: React.MouseEvent | React.KeyboardEvent,\n ) => WorkbenchSidebarTreeItemEvent<TData>\n selectItem: (itemId: string, originalEvent?: React.MouseEvent | React.KeyboardEvent) => void\n toggleItemExpanded: (\n itemId: string,\n originalEvent?: React.MouseEvent | React.KeyboardEvent,\n ) => void\n setItemExpanded: (\n itemId: string,\n expanded: boolean,\n originalEvent?: React.MouseEvent | React.KeyboardEvent,\n ) => void\n handleItemClick: (itemId: string, originalEvent: React.MouseEvent | React.KeyboardEvent) => void\n handleItemKeyDown: (itemId: string, event: React.KeyboardEvent<HTMLButtonElement>) => void\n}\n\nconst WorkbenchSidebarTreeContext =\n React.createContext<WorkbenchSidebarTreeContextValue<unknown> | null>(null)\n\ntype WorkbenchSidebarTreeHookEvent = React.MouseEvent | React.KeyboardEvent\n\ntype WorkbenchSidebarTreeHookValue<TData = unknown> = WorkbenchSidebarTreeContextValue<TData>\n\ntype WorkbenchSidebarTreeItemHookValue<TData = unknown> = WorkbenchSidebarTreeItemState<TData> & {\n readonly select: (event?: WorkbenchSidebarTreeHookEvent) => void\n readonly toggleExpanded: (event?: WorkbenchSidebarTreeHookEvent) => void\n readonly expand: (event?: WorkbenchSidebarTreeHookEvent) => void\n readonly collapse: (event?: WorkbenchSidebarTreeHookEvent) => void\n readonly focus: () => void\n}\n\nfunction useWorkbenchSidebarTreeContext() {\n const context = React.useContext(WorkbenchSidebarTreeContext)\n\n if (!context) {\n throw new Error(\"WorkbenchSidebarTree hooks must be used within WorkbenchSidebarTreeProvider.\")\n }\n\n return context\n}\n\nexport function useWorkbenchSidebarTree<TData = unknown>(): WorkbenchSidebarTreeHookValue<TData>\nexport function useWorkbenchSidebarTree(): WorkbenchSidebarTreeHookValue<unknown> {\n return useWorkbenchSidebarTreeContext()\n}\n\nexport function useWorkbenchSidebarTreeItem<TData = unknown>(\n itemId: string,\n): WorkbenchSidebarTreeItemHookValue<TData>\nexport function useWorkbenchSidebarTreeItem(\n itemId: string,\n): WorkbenchSidebarTreeItemHookValue<unknown> {\n const tree = useWorkbenchSidebarTreeContext()\n const state = tree.getItemState(itemId)\n\n return {\n ...state,\n select: (event?: React.MouseEvent | React.KeyboardEvent) => tree.selectItem(itemId, event),\n toggleExpanded: (event?: React.MouseEvent | React.KeyboardEvent) =>\n tree.toggleItemExpanded(itemId, event),\n expand: (event?: React.MouseEvent | React.KeyboardEvent) =>\n tree.setItemExpanded(itemId, true, event),\n collapse: (event?: React.MouseEvent | React.KeyboardEvent) =>\n tree.setItemExpanded(itemId, false, event),\n focus: () => tree.focusItem(itemId),\n }\n}\n\nfunction resolveIterableIds(ids: Iterable<string> | undefined, fallback: Iterable<string> = []) {\n return Array.from(ids ?? fallback)\n}\n\nfunction resolveSet(ids: Iterable<string> | undefined, fallback: Iterable<string> = []) {\n return new Set(resolveIterableIds(ids, fallback))\n}\n\nfunction flattenTree<TData>(\n items: WorkbenchSidebarTreeItem<TData>[],\n expandedIdSet: Set<string>,\n options: {\n includeCollapsedChildren?: boolean\n parentId?: string | null\n depth?: number\n ancestorIds?: string[]\n } = {},\n) {\n const { includeCollapsedChildren = false, parentId = null, depth = 0, ancestorIds = [] } = options\n const flattenedItems: WorkbenchSidebarTreeFlattenedItem<TData>[] = []\n\n items.forEach((item, index) => {\n const children = item.children ?? []\n const flattenedItem: WorkbenchSidebarTreeFlattenedItem<TData> = {\n item,\n id: item.id,\n parentId,\n index,\n depth,\n ancestorIds,\n childrenCount: children.length,\n }\n\n flattenedItems.push(flattenedItem)\n\n if (children.length && (includeCollapsedChildren || expandedIdSet.has(item.id))) {\n flattenedItems.push(\n ...flattenTree(children, expandedIdSet, {\n includeCollapsedChildren,\n parentId: item.id,\n depth: depth + 1,\n ancestorIds: [...ancestorIds, item.id],\n }),\n )\n }\n })\n\n return flattenedItems\n}\n\nfunction createItemMap<TData>(flattenedItems: WorkbenchSidebarTreeFlattenedItem<TData>[]) {\n return new Map(flattenedItems.map((item) => [item.id, item]))\n}\n\nfunction cloneItemsWithoutItem<TData>(\n items: WorkbenchSidebarTreeItem<TData>[],\n itemId: string,\n): {\n items: WorkbenchSidebarTreeItem<TData>[]\n removedItem: WorkbenchSidebarTreeItem<TData> | null\n} {\n let removedItem: WorkbenchSidebarTreeItem<TData> | null = null\n\n const nextItems = items.reduce<WorkbenchSidebarTreeItem<TData>[]>((result, item) => {\n if (item.id === itemId) {\n removedItem = item\n return result\n }\n\n if (item.children?.length) {\n const childResult = cloneItemsWithoutItem(item.children, itemId)\n\n if (childResult.removedItem) {\n removedItem = childResult.removedItem\n result.push({\n ...item,\n children: childResult.items,\n })\n return result\n }\n }\n\n result.push(item)\n return result\n }, [])\n\n return {\n items: nextItems,\n removedItem,\n }\n}\n\nfunction insertItemAtParent<TData>(\n items: WorkbenchSidebarTreeItem<TData>[],\n itemToInsert: WorkbenchSidebarTreeItem<TData>,\n parentId: string | null,\n index: number,\n): WorkbenchSidebarTreeItem<TData>[] {\n if (!parentId) {\n const nextItems = [...items]\n nextItems.splice(Math.max(0, Math.min(index, nextItems.length)), 0, itemToInsert)\n return nextItems\n }\n\n return items.map((item) => {\n if (item.id === parentId) {\n const children = [...(item.children ?? [])]\n children.splice(Math.max(0, Math.min(index, children.length)), 0, itemToInsert)\n\n return {\n ...item,\n children,\n }\n }\n\n if (!item.children?.length) {\n return item\n }\n\n return {\n ...item,\n children: insertItemAtParent(item.children, itemToInsert, parentId, index),\n }\n })\n}\n\nfunction countChildrenBeforeIndex<TData>(\n items: WorkbenchSidebarTreeFlattenedItem<TData>[],\n parentId: string | null,\n visibleIndex: number,\n) {\n return items.slice(0, visibleIndex).filter((item) => item.parentId === parentId).length\n}\n\nfunction getChildrenCount<TData>(\n items: WorkbenchSidebarTreeItem<TData>[],\n parentId: string | null,\n): number {\n if (!parentId) {\n return items.length\n }\n\n for (const item of items) {\n if (item.id === parentId) {\n return item.children?.length ?? 0\n }\n\n if (item.children?.length) {\n const childCount = getChildrenCount(item.children, parentId)\n\n if (childCount > 0) {\n return childCount\n }\n }\n }\n\n return 0\n}\n\nfunction clampDepth(depth: number, minDepth: number, maxDepth: number) {\n return Math.max(minDepth, Math.min(depth, maxDepth))\n}\n\nfunction getParentIdForDepth<TData>(\n items: WorkbenchSidebarTreeFlattenedItem<TData>[],\n targetIndex: number,\n depth: number,\n) {\n if (depth <= 0) {\n return null\n }\n\n for (let index = targetIndex - 1; index >= 0; index -= 1) {\n const item = items[index]\n\n if (item?.depth === depth - 1) {\n return item.id\n }\n }\n\n return null\n}\n\nconst treeCollisionDetection: CollisionDetection = (args) => {\n const { pointerCoordinates } = args\n\n if (!pointerCoordinates) {\n return closestCenter(args)\n }\n\n const collisions: CollisionDescriptor[] = []\n\n for (const droppableContainer of args.droppableContainers) {\n if (droppableContainer.disabled) {\n continue\n }\n\n const rect = args.droppableRects.get(droppableContainer.id)\n\n if (!rect) {\n continue\n }\n\n const centerY = rect.top + rect.height / 2\n const pointerIsWithinY = pointerCoordinates.y >= rect.top && pointerCoordinates.y <= rect.bottom\n const verticalDistance = pointerIsWithinY\n ? 0\n : Math.min(\n Math.abs(pointerCoordinates.y - rect.top),\n Math.abs(pointerCoordinates.y - rect.bottom),\n )\n const horizontalDistance =\n pointerCoordinates.x < rect.left\n ? rect.left - pointerCoordinates.x\n : Math.max(0, pointerCoordinates.x - rect.right)\n\n collisions.push({\n id: droppableContainer.id,\n data: {\n droppableContainer,\n value:\n verticalDistance * 1000 +\n Math.abs(pointerCoordinates.y - centerY) +\n horizontalDistance * 0.01,\n },\n })\n }\n\n return collisions.sort((a, b) => a.data.value - b.data.value)\n}\n\nfunction getEventClientCoordinates(event: Event) {\n if (event instanceof MouseEvent) {\n return {\n x: event.clientX,\n y: event.clientY,\n }\n }\n\n if (typeof TouchEvent === \"undefined\" || !(event instanceof TouchEvent)) {\n return null\n }\n\n const touch = event.touches[0] ?? event.changedTouches[0]\n\n if (!touch) {\n return null\n }\n\n return {\n x: touch.clientX,\n y: touch.clientY,\n }\n}\n\nfunction getItemRectCenter(rect: WorkbenchSidebarTreeItemRect | null | undefined) {\n if (!rect) {\n return null\n }\n\n return {\n y: rect.top + rect.height / 2,\n }\n}\n\nfunction getDropEdgeHeight(rect: WorkbenchSidebarTreeItemRect) {\n return Math.min(\n TREE_DROP_EDGE_MAX_HEIGHT,\n Math.max(TREE_DROP_EDGE_MIN_HEIGHT, rect.height * TREE_DROP_EDGE_RATIO),\n )\n}\n\nfunction getItemMaxDescendantDepthOffset<TData>(item: WorkbenchSidebarTreeItem<TData>): number {\n if (!item.children?.length) {\n return 0\n }\n\n return item.children.reduce(\n (maxDepthOffset, child) => Math.max(maxDepthOffset, 1 + getItemMaxDescendantDepthOffset(child)),\n 0,\n )\n}\n\nfunction getIndexAfterVisibleSubtree<TData>(\n flattenedItems: WorkbenchSidebarTreeFlattenedItem<TData>[],\n itemIndex: number,\n) {\n const item = flattenedItems[itemIndex]\n\n if (!item) {\n return itemIndex\n }\n\n let nextIndex = itemIndex + 1\n\n while (nextIndex < flattenedItems.length) {\n const nextItem = flattenedItems[nextIndex]\n\n if (!nextItem || nextItem.depth <= item.depth) {\n break\n }\n\n nextIndex += 1\n }\n\n return nextIndex\n}\n\nfunction getPointerPlacement<TData>({\n activeItem,\n activeMaxDepth,\n dragOffset,\n indentWidth,\n overItem,\n overItemRect,\n pointerY,\n}: {\n activeItem: WorkbenchSidebarTreeFlattenedItem<TData>\n activeMaxDepth: number\n dragOffset: number\n indentWidth: number\n overItem: WorkbenchSidebarTreeFlattenedItem<TData>\n overItemRect?: WorkbenchSidebarTreeItemRect | null | undefined\n pointerY?: number | null | undefined\n}): WorkbenchSidebarTreeMovePlacement {\n if (!overItemRect || pointerY === null || pointerY === undefined) {\n return \"after\"\n }\n\n const edgeHeight = getDropEdgeHeight(overItemRect)\n\n if (pointerY <= overItemRect.top + edgeHeight) {\n return \"before\"\n }\n\n if (pointerY >= overItemRect.bottom - edgeHeight) {\n return \"after\"\n }\n\n const projectedDepth = activeItem.depth + Math.round(dragOffset / indentWidth)\n\n if (projectedDepth > overItem.depth && overItem.depth + 1 <= activeMaxDepth) {\n return \"inside\"\n }\n\n const center = getItemRectCenter(overItemRect)\n\n return center && pointerY < center.y ? \"before\" : \"after\"\n}\n\nfunction createMoveEvent<TData>({\n activeId,\n depth,\n flattenedItemsWithoutActive,\n items,\n originalItemMap,\n placement,\n targetIndex,\n toParentId,\n}: {\n activeId: string\n depth: number\n flattenedItemsWithoutActive: WorkbenchSidebarTreeFlattenedItem<TData>[]\n items: WorkbenchSidebarTreeItem<TData>[]\n originalItemMap: Map<string, WorkbenchSidebarTreeFlattenedItem<TData>>\n placement: WorkbenchSidebarTreeMovePlacement\n targetIndex: number\n toParentId: string | null\n}): WorkbenchSidebarTreeMoveEvent<TData> | null {\n const activeItem = originalItemMap.get(activeId)\n\n if (!activeItem) {\n return null\n }\n\n const { items: itemsWithoutActive, removedItem } = cloneItemsWithoutItem(items, activeId)\n\n if (!removedItem) {\n return null\n }\n\n const toIndex =\n placement === \"inside\"\n ? getChildrenCount(itemsWithoutActive, toParentId)\n : countChildrenBeforeIndex(flattenedItemsWithoutActive, toParentId, targetIndex)\n const nextItems = insertItemAtParent(itemsWithoutActive, removedItem, toParentId, toIndex)\n\n return {\n item: removedItem,\n itemId: activeId,\n fromParentId: activeItem.parentId,\n toParentId,\n fromIndex: activeItem.index,\n toIndex,\n depth,\n placement,\n nextItems,\n }\n}\n\nfunction getProjectedMove<TData>({\n activeId,\n canDrop,\n dragOffset,\n flattenedItems,\n indentWidth,\n items,\n maxDepth,\n overId,\n overItemRect,\n pointerY,\n}: {\n activeId: string | null\n canDrop?: ((event: WorkbenchSidebarTreeMoveEvent<TData>) => boolean) | undefined\n dragOffset: number\n flattenedItems: WorkbenchSidebarTreeFlattenedItem<TData>[]\n indentWidth: number\n items: WorkbenchSidebarTreeItem<TData>[]\n maxDepth: number\n overId: string | null\n overItemRect?: WorkbenchSidebarTreeItemRect | null | undefined\n pointerY?: number | null | undefined\n}): ProjectedMove<TData> | null {\n if (!activeId || !overId || activeId === overId) {\n return null\n }\n\n const originalItemMap = createItemMap(flattenedItems)\n const activeItem = originalItemMap.get(activeId)\n const overItem = originalItemMap.get(overId)\n\n if (!activeItem || !overItem || activeItem.item.disabled || activeItem.item.draggable === false) {\n return null\n }\n\n if (overItem.ancestorIds.includes(activeId)) {\n return null\n }\n\n const flattenedItemsWithoutActive = flattenedItems.filter(\n (item) => item.id !== activeId && !item.ancestorIds.includes(activeId),\n )\n const overIndex = flattenedItemsWithoutActive.findIndex((item) => item.id === overId)\n\n if (overIndex < 0) {\n return null\n }\n\n const activeDescendantDepthOffset = getItemMaxDescendantDepthOffset(activeItem.item)\n const activeMaxDepth = maxDepth - 1 - activeDescendantDepthOffset\n\n if (activeMaxDepth < 0) {\n return null\n }\n\n const offsetDepth = Math.round(dragOffset / indentWidth)\n const unclampedDepth = activeItem.depth + offsetDepth\n const pointerPlacement = getPointerPlacement({\n activeItem,\n activeMaxDepth,\n dragOffset,\n indentWidth,\n overItem,\n overItemRect,\n pointerY,\n })\n const placement = pointerPlacement\n let targetIndex =\n placement === \"after\"\n ? getIndexAfterVisibleSubtree(flattenedItemsWithoutActive, overIndex)\n : overIndex\n let depth = overItem.depth + 1\n let toParentId: string | null = overId\n\n if (placement === \"inside\") {\n if (overItem.item.disabled || depth > activeMaxDepth) {\n return null\n }\n\n targetIndex = overIndex + 1\n } else {\n const previousItem = flattenedItemsWithoutActive[targetIndex - 1]\n const nextItem = flattenedItemsWithoutActive[targetIndex]\n const maxDepthForPosition =\n placement === \"after\" ? overItem.depth : (previousItem?.depth ?? -1) + 1\n const maxProjectedDepth = Math.min(activeMaxDepth, maxDepthForPosition)\n const minProjectedDepth = nextItem ? nextItem.depth : 0\n\n if (minProjectedDepth > maxProjectedDepth) {\n return null\n }\n\n depth = clampDepth(unclampedDepth, minProjectedDepth, maxProjectedDepth)\n toParentId = getParentIdForDepth(flattenedItemsWithoutActive, targetIndex, depth)\n }\n\n const parentItem = toParentId ? originalItemMap.get(toParentId) : null\n\n if (parentItem?.item.disabled) {\n return null\n }\n\n const moveEvent = createMoveEvent({\n activeId,\n depth,\n flattenedItemsWithoutActive,\n items,\n originalItemMap,\n placement,\n targetIndex,\n toParentId,\n })\n\n if (!moveEvent || canDrop?.(moveEvent) === false) {\n return null\n }\n\n if (\n moveEvent.fromParentId === moveEvent.toParentId &&\n moveEvent.fromIndex === moveEvent.toIndex\n ) {\n return null\n }\n\n const indicatorId =\n placement === \"after\"\n ? (flattenedItemsWithoutActive[Math.max(0, targetIndex - 1)]?.id ?? overId)\n : overId\n\n return {\n ...moveEvent,\n indicatorId,\n overId,\n }\n}\n\nfunction moveItemWithKeyboard<TData>({\n activeId,\n canDrop,\n direction,\n expandedIdSet,\n items,\n maxDepth,\n}: {\n activeId: string\n canDrop?: ((event: WorkbenchSidebarTreeMoveEvent<TData>) => boolean) | undefined\n direction: \"up\" | \"down\" | \"left\" | \"right\"\n expandedIdSet: Set<string>\n items: WorkbenchSidebarTreeItem<TData>[]\n maxDepth: number\n}) {\n const flattenedItems = flattenTree(items, expandedIdSet)\n const itemMap = createItemMap(flattenedItems)\n const activeItem = itemMap.get(activeId)\n\n if (!activeItem || activeItem.item.disabled || activeItem.item.draggable === false) {\n return null\n }\n\n const flattenedItemsWithoutActive = flattenedItems.filter(\n (item) => item.id !== activeId && !item.ancestorIds.includes(activeId),\n )\n const activeIndex = flattenedItems.findIndex((item) => item.id === activeId)\n const currentIndex = flattenedItemsWithoutActive.findIndex((item) => item.id === activeId)\n const originalItemMap = createItemMap(flattenedItems)\n const { depth: activeDepth } = activeItem\n const activeMaxDepth = maxDepth - 1 - getItemMaxDescendantDepthOffset(activeItem.item)\n\n let targetIndex = -1\n let depth = activeDepth\n let toParentId = activeItem.parentId\n let placement: WorkbenchSidebarTreeMovePlacement = \"after\"\n\n if (direction === \"up\") {\n const previousIndex = Math.max(0, activeIndex - 1)\n const previousItem = flattenedItems[previousIndex]\n\n if (\n !previousItem ||\n previousItem.id === activeId ||\n previousItem.ancestorIds.includes(activeId)\n ) {\n return null\n }\n\n targetIndex = flattenedItemsWithoutActive.findIndex((item) => item.id === previousItem.id)\n depth = Math.min(activeItem.depth, previousItem.depth)\n toParentId = getParentIdForDepth(flattenedItemsWithoutActive, targetIndex, depth)\n placement = \"before\"\n }\n\n if (direction === \"down\") {\n const nextItem = flattenedItems\n .slice(activeIndex + 1)\n .find((item) => item.id !== activeId && !item.ancestorIds.includes(activeId))\n\n if (!nextItem) {\n return null\n }\n\n const nextIndex = flattenedItemsWithoutActive.findIndex((item) => item.id === nextItem.id)\n targetIndex = nextIndex + 1\n depth = Math.min(activeItem.depth, nextItem.depth)\n toParentId = getParentIdForDepth(flattenedItemsWithoutActive, targetIndex, depth)\n placement = \"after\"\n }\n\n if (direction === \"left\") {\n if (!activeItem.parentId) {\n return null\n }\n\n const parentItem = itemMap.get(activeItem.parentId)\n\n if (!parentItem) {\n return null\n }\n\n targetIndex =\n flattenedItemsWithoutActive.findIndex((item) => item.id === parentItem.id) +\n parentItem.childrenCount\n depth = parentItem.depth\n toParentId = parentItem.parentId\n placement = \"after\"\n }\n\n if (direction === \"right\") {\n const previousItem =\n flattenedItemsWithoutActive[\n currentIndex >= 0 ? currentIndex - 1 : Math.max(0, activeIndex - 1)\n ]\n\n if (!previousItem || previousItem.item.disabled || previousItem.depth + 1 > activeMaxDepth) {\n return null\n }\n\n targetIndex = flattenedItemsWithoutActive.findIndex((item) => item.id === previousItem.id) + 1\n depth = previousItem.depth + 1\n toParentId = previousItem.id\n placement = \"inside\"\n }\n\n if (targetIndex < 0) {\n return null\n }\n\n const parentItem = toParentId ? itemMap.get(toParentId) : null\n\n if (parentItem?.item.disabled) {\n return null\n }\n\n const moveEvent = createMoveEvent({\n activeId,\n depth,\n flattenedItemsWithoutActive,\n items,\n originalItemMap,\n placement,\n targetIndex,\n toParentId,\n })\n\n if (!moveEvent || canDrop?.(moveEvent) === false) {\n return null\n }\n\n return moveEvent\n}\n\nfunction resolveVisual<TData>(\n visual:\n | React.ReactNode\n | ((state: WorkbenchSidebarTreeItemState<TData>) => React.ReactNode)\n | undefined,\n state: WorkbenchSidebarTreeItemState<TData>,\n) {\n return typeof visual === \"function\" ? visual(state) : visual\n}\n\nexport function WorkbenchSidebarTreeProvider<TData = unknown>({\n children,\n items,\n selectedId: selectedIdProp,\n defaultSelectedId = null,\n expandedIds: expandedIdsProp,\n defaultExpandedIds = [],\n reorderable = false,\n maxDepth = DEFAULT_TREE_MAX_DEPTH,\n indentWidth = DEFAULT_TREE_INDENT_WIDTH,\n canDrop,\n onItemClick,\n onItemSelect,\n onSelectedIdChange,\n onItemExpandedChange,\n onExpandedIdsChange,\n onMove,\n}: WorkbenchSidebarTreeProviderProps<TData>) {\n const [uncontrolledSelectedId, setUncontrolledSelectedId] = React.useState<string | null>(\n defaultSelectedId,\n )\n const [uncontrolledExpandedIds, setUncontrolledExpandedIds] = React.useState<string[]>(() =>\n resolveIterableIds(defaultExpandedIds),\n )\n const [focusedId, setFocusedId] = React.useState<string | null>(null)\n const [activeId, setActiveId] = React.useState<string | null>(null)\n const [overId, setOverId] = React.useState<string | null>(null)\n const [dragOffset, setDragOffset] = React.useState(0)\n const [dragPointerY, setDragPointerY] = React.useState<number | null>(null)\n const [dragOverlayWidth, setDragOverlayWidth] = React.useState<number | null>(null)\n const itemButtonRefs = React.useRef(new Map<string, HTMLButtonElement>())\n const itemNodeRefs = React.useRef(new Map<string, HTMLElement>())\n const dragStartPointerRef = React.useRef<{ x: number; y: number } | null>(null)\n const selectedId = selectedIdProp === undefined ? uncontrolledSelectedId : selectedIdProp\n const expandedIdSet = React.useMemo(\n () => resolveSet(expandedIdsProp, uncontrolledExpandedIds),\n [expandedIdsProp, uncontrolledExpandedIds],\n )\n const expandedIds = React.useMemo(() => Array.from(expandedIdSet), [expandedIdSet])\n const flattenedItems = React.useMemo(\n () => flattenTree(items, expandedIdSet),\n [expandedIdSet, items],\n )\n const itemMap = React.useMemo(() => createItemMap(flattenedItems), [flattenedItems])\n const projectedMove = React.useMemo(\n () =>\n getProjectedMove({\n activeId,\n canDrop,\n dragOffset,\n flattenedItems,\n indentWidth,\n items,\n maxDepth,\n overId,\n overItemRect: overId ? itemNodeRefs.current.get(overId)?.getBoundingClientRect() : null,\n pointerY: dragPointerY,\n }),\n [\n activeId,\n canDrop,\n dragOffset,\n dragPointerY,\n flattenedItems,\n indentWidth,\n items,\n maxDepth,\n overId,\n ],\n )\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 6,\n },\n }),\n )\n\n React.useEffect(() => {\n if (focusedId && itemMap.has(focusedId)) {\n return\n }\n\n setFocusedId(\n selectedId && itemMap.has(selectedId) ? selectedId : (flattenedItems[0]?.id ?? null),\n )\n }, [flattenedItems, focusedId, itemMap, selectedId])\n\n const registerItemButton = React.useCallback((itemId: string, node: HTMLButtonElement | null) => {\n if (node) {\n itemButtonRefs.current.set(itemId, node)\n return\n }\n\n itemButtonRefs.current.delete(itemId)\n }, [])\n\n const registerItemNode = React.useCallback((itemId: string, node: HTMLElement | null) => {\n if (node) {\n itemNodeRefs.current.set(itemId, node)\n return\n }\n\n itemNodeRefs.current.delete(itemId)\n }, [])\n\n const focusItem = React.useCallback((itemId: string | null) => {\n if (!itemId) {\n return\n }\n\n setFocusedId(itemId)\n itemButtonRefs.current.get(itemId)?.focus()\n }, [])\n\n const getItemState = React.useCallback(\n (itemId: string): WorkbenchSidebarTreeItemState<TData> => {\n const flattenedItem = itemMap.get(itemId)\n\n if (!flattenedItem) {\n throw new Error(`WorkbenchSidebarTree item \"${itemId}\" was not found.`)\n }\n\n return {\n item: flattenedItem.item,\n itemId,\n parentId: flattenedItem.parentId,\n index: flattenedItem.index,\n depth: flattenedItem.depth,\n isDisabled: flattenedItem.item.disabled === true,\n isDragging: activeId === itemId,\n isDropTarget: projectedMove?.overId === itemId,\n isExpanded: expandedIdSet.has(itemId),\n isExpandable: flattenedItem.childrenCount > 0,\n isFocused: focusedId === itemId,\n isSelected: selectedId === itemId,\n }\n },\n [activeId, expandedIdSet, focusedId, itemMap, projectedMove?.overId, selectedId],\n )\n\n const getItemEvent = React.useCallback(\n (\n itemId: string,\n originalEvent?: React.MouseEvent | React.KeyboardEvent,\n ): WorkbenchSidebarTreeItemEvent<TData> => {\n const flattenedItem = itemMap.get(itemId)\n\n if (!flattenedItem) {\n throw new Error(`WorkbenchSidebarTree item \"${itemId}\" was not found.`)\n }\n\n return {\n item: flattenedItem.item,\n itemId,\n parentId: flattenedItem.parentId,\n index: flattenedItem.index,\n depth: flattenedItem.depth,\n expandedIds,\n selectedId,\n originalEvent,\n }\n },\n [expandedIds, itemMap, selectedId],\n )\n\n const setItemExpanded = React.useCallback(\n (itemId: string, expanded: boolean, originalEvent?: React.MouseEvent | React.KeyboardEvent) => {\n const flattenedItem = itemMap.get(itemId)\n\n if (!flattenedItem || flattenedItem.item.disabled) {\n return\n }\n\n if (!flattenedItem.childrenCount && !expanded) {\n return\n }\n\n const nextExpandedIdSet = new Set(expandedIdSet)\n\n if (expanded) {\n nextExpandedIdSet.add(itemId)\n } else {\n nextExpandedIdSet.delete(itemId)\n }\n\n const nextExpandedIds = Array.from(nextExpandedIdSet)\n const itemEvent = getItemEvent(itemId, originalEvent)\n const expandedEvent: WorkbenchSidebarTreeExpandedEvent<TData> = {\n ...itemEvent,\n expanded,\n expandedIds: nextExpandedIds,\n }\n\n if (expandedIdsProp === undefined) {\n setUncontrolledExpandedIds(nextExpandedIds)\n }\n\n onItemExpandedChange?.(expandedEvent)\n onExpandedIdsChange?.(nextExpandedIds, expandedEvent)\n },\n [\n expandedIdSet,\n expandedIdsProp,\n getItemEvent,\n itemMap,\n onExpandedIdsChange,\n onItemExpandedChange,\n ],\n )\n\n const toggleItemExpanded = React.useCallback(\n (itemId: string, originalEvent?: React.MouseEvent | React.KeyboardEvent) => {\n setItemExpanded(itemId, !expandedIdSet.has(itemId), originalEvent)\n },\n [expandedIdSet, setItemExpanded],\n )\n\n const selectItem = React.useCallback(\n (itemId: string, originalEvent?: React.MouseEvent | React.KeyboardEvent) => {\n const flattenedItem = itemMap.get(itemId)\n\n if (\n !flattenedItem ||\n flattenedItem.item.disabled ||\n flattenedItem.item.selectable === false\n ) {\n return\n }\n\n const itemEvent = getItemEvent(itemId, originalEvent)\n\n if (selectedIdProp === undefined) {\n setUncontrolledSelectedId(itemId)\n }\n\n onItemSelect?.(itemEvent)\n onSelectedIdChange?.(itemId, itemEvent)\n },\n [getItemEvent, itemMap, onItemSelect, onSelectedIdChange, selectedIdProp],\n )\n\n const handleItemClick = React.useCallback(\n (itemId: string, originalEvent: React.MouseEvent | React.KeyboardEvent) => {\n const flattenedItem = itemMap.get(itemId)\n\n if (!flattenedItem || flattenedItem.item.disabled) {\n return\n }\n\n setFocusedId(itemId)\n onItemClick?.(getItemEvent(itemId, originalEvent))\n selectItem(itemId, originalEvent)\n },\n [getItemEvent, itemMap, onItemClick, selectItem],\n )\n\n const commitKeyboardMove = React.useCallback(\n (itemId: string, direction: \"up\" | \"down\" | \"left\" | \"right\") => {\n const moveEvent = moveItemWithKeyboard({\n activeId: itemId,\n canDrop,\n direction,\n expandedIdSet,\n items,\n maxDepth,\n })\n\n if (!moveEvent) {\n return\n }\n\n if (direction === \"right\") {\n const parentId = moveEvent.toParentId\n\n if (parentId) {\n setItemExpanded(parentId, true)\n }\n }\n\n onMove?.(moveEvent)\n },\n [canDrop, expandedIdSet, items, maxDepth, onMove, setItemExpanded],\n )\n\n const handleItemKeyDown = React.useCallback(\n (itemId: string, event: React.KeyboardEvent<HTMLButtonElement>) => {\n const currentIndex = flattenedItems.findIndex((item) => item.id === itemId)\n const currentItem = itemMap.get(itemId)\n\n if (!currentItem || currentIndex < 0) {\n return\n }\n\n if (event.altKey && reorderable) {\n const keyboardDirectionByKey: Record<string, \"up\" | \"down\" | \"left\" | \"right\" | undefined> =\n {\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n ArrowLeft: \"left\",\n ArrowRight: \"right\",\n }\n const direction = keyboardDirectionByKey[event.key]\n\n if (direction) {\n event.preventDefault()\n commitKeyboardMove(itemId, direction)\n }\n\n return\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault()\n focusItem(flattenedItems[currentIndex + 1]?.id ?? itemId)\n return\n case \"ArrowUp\":\n event.preventDefault()\n focusItem(flattenedItems[currentIndex - 1]?.id ?? itemId)\n return\n case \"ArrowRight\":\n if (currentItem.childrenCount && !expandedIdSet.has(itemId)) {\n event.preventDefault()\n setItemExpanded(itemId, true, event)\n return\n }\n\n if (currentItem.childrenCount) {\n event.preventDefault()\n focusItem(flattenedItems[currentIndex + 1]?.id ?? itemId)\n }\n return\n case \"ArrowLeft\":\n if (currentItem.childrenCount && expandedIdSet.has(itemId)) {\n event.preventDefault()\n setItemExpanded(itemId, false, event)\n return\n }\n\n if (currentItem.parentId) {\n event.preventDefault()\n focusItem(currentItem.parentId)\n }\n return\n case \"Home\":\n event.preventDefault()\n focusItem(flattenedItems[0]?.id ?? itemId)\n return\n case \"End\":\n event.preventDefault()\n focusItem(flattenedItems.at(-1)?.id ?? itemId)\n return\n case \"Enter\":\n case \" \":\n event.preventDefault()\n handleItemClick(itemId, event)\n return\n default:\n }\n },\n [\n commitKeyboardMove,\n expandedIdSet,\n flattenedItems,\n focusItem,\n handleItemClick,\n itemMap,\n reorderable,\n setItemExpanded,\n ],\n )\n\n const handleDragStart = React.useCallback(\n (event: DragStartEvent) => {\n const itemId = String(event.active.id)\n const flattenedItem = itemMap.get(itemId)\n\n if (!flattenedItem || flattenedItem.item.disabled || flattenedItem.item.draggable === false) {\n return\n }\n\n setActiveId(itemId)\n setOverId(itemId)\n setDragOffset(0)\n const itemRect = itemNodeRefs.current.get(itemId)?.getBoundingClientRect()\n const itemCenter = getItemRectCenter(itemRect)\n const startPointer = getEventClientCoordinates(event.activatorEvent)\n\n dragStartPointerRef.current = startPointer ?? (itemCenter ? { x: 0, y: itemCenter.y } : null)\n setDragPointerY(dragStartPointerRef.current?.y ?? null)\n setDragOverlayWidth(itemRect?.width ?? null)\n },\n [itemMap],\n )\n\n const handleDragMove = React.useCallback((event: DragMoveEvent) => {\n setDragOffset(event.delta.x)\n setDragPointerY(\n dragStartPointerRef.current ? dragStartPointerRef.current.y + event.delta.y : null,\n )\n }, [])\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n setOverId(event.over ? String(event.over.id) : null)\n setDragPointerY(\n dragStartPointerRef.current ? dragStartPointerRef.current.y + event.delta.y : null,\n )\n }, [])\n\n const handleDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const nextOverId = event.over ? String(event.over.id) : null\n const nextProjectedMove = getProjectedMove({\n activeId: String(event.active.id),\n canDrop,\n dragOffset: event.delta.x,\n flattenedItems,\n indentWidth,\n items,\n maxDepth,\n overId: nextOverId,\n overItemRect:\n event.over?.rect ??\n (nextOverId ? itemNodeRefs.current.get(nextOverId)?.getBoundingClientRect() : null),\n pointerY: dragStartPointerRef.current\n ? dragStartPointerRef.current.y + event.delta.y\n : null,\n })\n\n setActiveId(null)\n setOverId(null)\n setDragOffset(0)\n setDragPointerY(null)\n setDragOverlayWidth(null)\n dragStartPointerRef.current = null\n\n if (!nextProjectedMove) {\n return\n }\n\n const { overId, indicatorId, ...moveEvent } = nextProjectedMove\n void overId\n void indicatorId\n\n if (moveEvent.placement === \"inside\" && moveEvent.toParentId) {\n setItemExpanded(moveEvent.toParentId, true)\n }\n\n onMove?.(moveEvent)\n },\n [canDrop, flattenedItems, indentWidth, items, maxDepth, onMove, setItemExpanded],\n )\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n setOverId(null)\n setDragOffset(0)\n setDragPointerY(null)\n setDragOverlayWidth(null)\n dragStartPointerRef.current = null\n }, [])\n\n const contextValue = React.useMemo<WorkbenchSidebarTreeContextValue<TData>>(\n () => ({\n items,\n flattenedItems,\n itemMap,\n selectedId,\n expandedIdSet,\n expandedIds,\n focusedId,\n activeId,\n overId,\n projectedMove,\n dragOverlayWidth,\n reorderable,\n indentWidth,\n maxDepth,\n registerItemButton,\n registerItemNode,\n focusItem,\n getItemState,\n getItemEvent,\n selectItem,\n toggleItemExpanded,\n setItemExpanded,\n handleItemClick,\n handleItemKeyDown,\n }),\n [\n activeId,\n dragOverlayWidth,\n expandedIdSet,\n expandedIds,\n flattenedItems,\n focusItem,\n focusedId,\n getItemEvent,\n getItemState,\n handleItemClick,\n handleItemKeyDown,\n indentWidth,\n itemMap,\n items,\n maxDepth,\n overId,\n projectedMove,\n registerItemButton,\n registerItemNode,\n reorderable,\n selectItem,\n selectedId,\n setItemExpanded,\n toggleItemExpanded,\n ],\n )\n\n const content = (\n <WorkbenchSidebarTreeContext.Provider value={contextValue}>\n {children}\n </WorkbenchSidebarTreeContext.Provider>\n )\n\n if (!reorderable) {\n return content\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={treeCollisionDetection}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n {content}\n </DndContext>\n )\n}\n\nexport function WorkbenchSidebarTree<TData = unknown>({\n items,\n selectedId,\n defaultSelectedId,\n expandedIds,\n defaultExpandedIds,\n reorderable,\n maxDepth,\n indentWidth,\n canDrop,\n onItemClick,\n onItemSelect,\n onSelectedIdChange,\n onItemExpandedChange,\n onExpandedIdsChange,\n onMove,\n renderItem,\n className,\n ...props\n}: WorkbenchSidebarTreeProps<TData>) {\n return (\n <WorkbenchSidebarTreeProvider\n items={items}\n selectedId={selectedId}\n defaultSelectedId={defaultSelectedId}\n expandedIds={expandedIds}\n defaultExpandedIds={defaultExpandedIds}\n reorderable={reorderable}\n maxDepth={maxDepth}\n indentWidth={indentWidth}\n canDrop={canDrop}\n onItemClick={onItemClick}\n onItemSelect={onItemSelect}\n onSelectedIdChange={onSelectedIdChange}\n onItemExpandedChange={onItemExpandedChange}\n onExpandedIdsChange={onExpandedIdsChange}\n onMove={onMove}\n >\n <WorkbenchSidebarTreeItems className={className} renderItem={renderItem} {...props} />\n </WorkbenchSidebarTreeProvider>\n )\n}\n\nfunction WorkbenchSidebarTreeItems<TData = unknown>({\n className,\n renderItem,\n ...props\n}: Omit<React.ComponentProps<\"ul\">, \"onSelect\"> & {\n renderItem?: WorkbenchSidebarTreeRenderItem<TData> | undefined\n}) {\n const tree = useWorkbenchSidebarTreeContext()\n const itemIds = React.useMemo(\n () => tree.flattenedItems.map((item) => item.id),\n [tree.flattenedItems],\n )\n\n return (\n <>\n <SortableContext items={itemIds} strategy={verticalListSortingStrategy}>\n <WorkbenchSidebarMenu\n role=\"tree\"\n data-slot=\"workbench-sidebar-tree\"\n data-sidebar=\"tree\"\n className={cn(\"gap-0.5\", className)}\n {...props}\n >\n {tree.flattenedItems.map((item) => (\n <WorkbenchSidebarTreeRow key={item.id} itemId={item.id} renderItem={renderItem} />\n ))}\n </WorkbenchSidebarMenu>\n </SortableContext>\n {tree.reorderable ? <WorkbenchSidebarTreeDragOverlay renderItem={renderItem} /> : null}\n </>\n )\n}\n\nfunction WorkbenchSidebarTreeItemContent<TData = unknown>({\n buttonProps,\n disclosureProps,\n leadingVisual,\n renderItem,\n rowProps,\n state,\n trailingVisual,\n}: WorkbenchSidebarTreeRenderItemProps<TData> & {\n renderItem?: WorkbenchSidebarTreeRenderItem<TData> | undefined\n}) {\n const hasCustomTrailingAction = Boolean(trailingVisual)\n const defaultNode = (\n <WorkbenchSidebarMenuRow {...rowProps}>\n {disclosureProps.visible ? (\n <WorkbenchSidebarMenuLeadingAction {...disclosureProps}>\n <ChevronRightIcon className=\"transition-transform duration-150 ease-out\" />\n </WorkbenchSidebarMenuLeadingAction>\n ) : null}\n\n <WorkbenchSidebarMenuButton\n {...buttonProps}\n isActive={state.isSelected}\n tooltip={state.item.tooltip}\n leadingVisual={leadingVisual}\n trailingVisual={!hasCustomTrailingAction ? null : undefined}\n trailingVisualVisibility=\"hover\"\n >\n {state.item.label}\n </WorkbenchSidebarMenuButton>\n\n {hasCustomTrailingAction ? (\n <WorkbenchSidebarMenuTrailingAction\n type=\"button\"\n showOnHover\n onClick={(event) => event.stopPropagation()}\n >\n {trailingVisual}\n </WorkbenchSidebarMenuTrailingAction>\n ) : null}\n </WorkbenchSidebarMenuRow>\n )\n\n return renderItem\n ? renderItem({\n state,\n rowProps,\n buttonProps,\n disclosureProps,\n leadingVisual,\n trailingVisual,\n })\n : defaultNode\n}\n\nfunction WorkbenchSidebarTreeDragOverlay<TData = unknown>({\n renderItem,\n}: {\n renderItem?: WorkbenchSidebarTreeRenderItem<TData> | undefined\n}) {\n const tree = useWorkbenchSidebarTreeContext()\n\n if (!tree.activeId || !tree.itemMap.has(tree.activeId)) {\n return <DragOverlay dropAnimation={null}>{null}</DragOverlay>\n }\n\n const state = tree.getItemState(tree.activeId)\n const leadingVisual = resolveVisual(state.item.leadingVisual, state)\n const trailingVisual = resolveVisual(state.item.trailingVisual, state)\n const rowProps: React.ComponentProps<\"div\"> = {\n style: {\n marginLeft: `${state.depth * tree.indentWidth}px`,\n },\n }\n const buttonProps: WorkbenchSidebarTreeButtonProps = {\n type: \"button\",\n tabIndex: -1,\n role: \"treeitem\",\n \"aria-level\": state.depth + 1,\n \"aria-selected\": state.isSelected,\n \"aria-expanded\": state.isExpandable ? state.isExpanded : undefined,\n \"aria-disabled\": state.isDisabled || undefined,\n \"data-workbench-sidebar-tree-item-id\": state.itemId,\n \"data-tree-item-id\": state.itemId,\n \"data-drag-overlay\": true,\n \"data-selected\": state.isSelected || undefined,\n \"data-expanded\": state.isExpanded || undefined,\n className:\n \"cursor-grabbing bg-sidedock-hover-background text-sidedock-text-hover shadow-lg ring-1 ring-sidedock-border\",\n }\n const disclosureProps: WorkbenchSidebarTreeButtonProps & { visible: boolean } = {\n type: \"button\",\n visible: state.isExpandable,\n \"aria-label\": state.isExpanded\n ? `Collapse ${String(state.item.label)}`\n : `Expand ${String(state.item.label)}`,\n \"aria-expanded\": state.isExpanded,\n tabIndex: -1,\n className:\n \"data-[expanded=true]:bg-transparent data-[expanded=true]:[&>svg]:rotate-90 data-[expanded=false]:[&>svg]:rotate-0\",\n \"data-expanded\": state.isExpanded,\n onClick: (event) => event.stopPropagation(),\n }\n\n return (\n <DragOverlay dropAnimation={null}>\n <div\n data-slot=\"workbench-sidebar-tree-drag-overlay\"\n className=\"pointer-events-none opacity-[0.85]\"\n style={{\n width: tree.dragOverlayWidth ?? undefined,\n }}\n >\n <WorkbenchSidebarTreeItemContent\n state={state}\n rowProps={rowProps}\n buttonProps={buttonProps}\n disclosureProps={disclosureProps}\n leadingVisual={leadingVisual}\n trailingVisual={trailingVisual}\n renderItem={renderItem}\n />\n </div>\n </DragOverlay>\n )\n}\n\nfunction WorkbenchSidebarTreeRow<TData = unknown>({\n itemId,\n renderItem,\n}: {\n itemId: string\n renderItem?: WorkbenchSidebarTreeRenderItem<TData> | undefined\n}) {\n const tree = useWorkbenchSidebarTreeContext()\n const state = tree.getItemState(itemId)\n const { attributes, listeners, setNodeRef, isDragging, isSorting } = useSortable({\n id: itemId,\n disabled: !tree.reorderable || state.isDisabled || state.item.draggable === false,\n })\n const isTabbable =\n tree.focusedId === itemId ||\n (!tree.focusedId && (state.isSelected || tree.flattenedItems[0]?.id === itemId))\n const leadingVisual = resolveVisual(state.item.leadingVisual, state)\n const trailingVisual = resolveVisual(state.item.trailingVisual, state)\n const isInsideDropTarget =\n tree.projectedMove?.placement === \"inside\" && tree.projectedMove.overId === itemId\n const showDropIndicator = tree.projectedMove?.indicatorId === itemId && !isInsideDropTarget\n const projectedDepth = showDropIndicator ? tree.projectedMove?.depth : state.depth\n const dropIndicatorPlacement = tree.projectedMove?.placement ?? \"after\"\n const { registerItemNode } = tree\n const setItemNodeRef = React.useCallback(\n (node: HTMLElement | null) => {\n setNodeRef(node)\n registerItemNode(itemId, node)\n },\n [itemId, registerItemNode, setNodeRef],\n )\n const rowProps: React.ComponentProps<\"div\"> = {\n style: {\n marginLeft: `${state.depth * tree.indentWidth}px`,\n },\n }\n const buttonProps: WorkbenchSidebarTreeButtonProps = {\n ...attributes,\n ...listeners,\n type: \"button\",\n disabled: state.isDisabled,\n tabIndex: isTabbable ? 0 : -1,\n role: \"treeitem\",\n \"aria-level\": state.depth + 1,\n \"aria-selected\": state.isSelected,\n \"aria-expanded\": state.isExpandable ? state.isExpanded : undefined,\n \"aria-disabled\": state.isDisabled || undefined,\n \"data-workbench-sidebar-tree-item-id\": itemId,\n \"data-tree-item-id\": itemId,\n \"data-selected\": state.isSelected || undefined,\n \"data-expanded\": state.isExpanded || undefined,\n \"data-dragging\": isDragging || undefined,\n \"data-drop-inside\": isInsideDropTarget || undefined,\n className: cn(\n !state.isExpandable && \"pl-7\",\n isDragging && \"opacity-40\",\n state.isDropTarget && \"bg-sidedock-hover-background text-sidedock-text-hover\",\n isInsideDropTarget &&\n \"bg-sidedock-active-background text-sidedock-text-active ring-sidedock-border ring-1\",\n ),\n onClick: (event) => tree.handleItemClick(itemId, event),\n onFocus: () => tree.focusItem(itemId),\n onKeyDown: (event) => tree.handleItemKeyDown(itemId, event),\n ref: (node) => tree.registerItemButton(itemId, node),\n }\n const disclosureProps: WorkbenchSidebarTreeButtonProps & { visible: boolean } = {\n type: \"button\",\n visible: state.isExpandable,\n \"aria-label\": state.isExpanded\n ? `Collapse ${String(state.item.label)}`\n : `Expand ${String(state.item.label)}`,\n \"aria-expanded\": state.isExpanded,\n tabIndex: -1,\n className:\n \"data-[expanded=true]:bg-transparent data-[expanded=true]:[&>svg]:rotate-90 data-[expanded=false]:[&>svg]:rotate-0\",\n \"data-expanded\": state.isExpanded,\n onClick: (event) => {\n event.stopPropagation()\n tree.toggleItemExpanded(itemId, event)\n },\n }\n return (\n <WorkbenchSidebarMenuItem\n ref={setItemNodeRef}\n data-slot=\"workbench-sidebar-tree-item\"\n data-tree-item-id={itemId}\n data-depth={state.depth}\n data-dragging={isDragging || undefined}\n data-drop-inside={isInsideDropTarget || undefined}\n data-sorting={isSorting || undefined}\n >\n {state.depth > 0\n ? Array.from({ length: state.depth }, (_, depthIndex) => (\n <span\n key={depthIndex}\n aria-hidden=\"true\"\n data-slot=\"workbench-sidebar-tree-depth-line\"\n className=\"border-sidedock-border pointer-events-none absolute inset-y-0 z-0 border-l\"\n style={{\n left: `${8 + depthIndex * tree.indentWidth}px`,\n }}\n />\n ))\n : null}\n {showDropIndicator ? (\n <div\n data-slot=\"workbench-sidebar-tree-drop-indicator\"\n data-placement={dropIndicatorPlacement}\n className={cn(\n \"bg-sidedock-text-active pointer-events-none absolute right-1 left-1 z-[1] h-0.5 rounded-full\",\n dropIndicatorPlacement === \"before\" ? \"-top-px\" : \"-bottom-px\",\n )}\n style={{\n left: `${8 + (projectedDepth ?? state.depth) * tree.indentWidth}px`,\n }}\n />\n ) : null}\n <WorkbenchSidebarTreeItemContent\n state={state}\n rowProps={rowProps}\n buttonProps={buttonProps}\n disclosureProps={disclosureProps}\n leadingVisual={leadingVisual}\n trailingVisual={trailingVisual}\n renderItem={renderItem}\n />\n </WorkbenchSidebarMenuItem>\n )\n}\n","import React from \"react\"\n\nimport { WorkbenchPrimarySidebarContext } from \"../contexts/WorkbenchPrimarySidebarContext\"\n\nexport function useWorkbenchPrimarySidebar() {\n const context = React.useContext(WorkbenchPrimarySidebarContext)\n\n if (!context) {\n throw new Error(\n \"useWorkbenchPrimarySidebar must be used within a WorkbenchPrimarySidebarProvider\",\n )\n }\n\n return context\n}\n","import { WorkbenchSidebarShell } from \"./WorkbenchSidebar\"\nimport { useWorkbenchPrimarySidebar } from \"../../hooks/useWorkbenchPrimarySidebar\"\n\nexport function WorkbenchPrimarySidebar(props: React.ComponentProps<\"div\">) {\n const { isMobile, openMobile, setOpenMobile, state, toggleSidebar } = useWorkbenchPrimarySidebar()\n\n return (\n <WorkbenchSidebarShell\n {...props}\n description=\"Displays the primary workbench sidebar on mobile.\"\n isMobile={isMobile}\n openMobile={openMobile}\n setOpenMobile={setOpenMobile}\n side=\"left\"\n state={state}\n title=\"Primary Sidebar\"\n toggleSidebar={toggleSidebar}\n />\n )\n}\n","import React from \"react\"\n\nimport { WorkbenchSecondarySidebarContext } from \"../contexts/WorkbenchSecondarySidebarContext\"\n\nexport function useWorkbenchSecondarySidebar() {\n const context = React.useContext(WorkbenchSecondarySidebarContext)\n\n if (!context) {\n throw new Error(\n \"useWorkbenchSecondarySidebar must be used within a WorkbenchSecondarySidebarProvider\",\n )\n }\n\n return context\n}\n","import { WorkbenchSidebarShell } from \"./WorkbenchSidebar\"\nimport { useWorkbenchSecondarySidebar } from \"../../hooks/useWorkbenchSecondarySidebar\"\n\nexport function WorkbenchSecondarySidebar(props: React.ComponentProps<\"div\">) {\n const { isMobile, openMobile, setOpenMobile, state, toggleSidebar } =\n useWorkbenchSecondarySidebar()\n\n return (\n <WorkbenchSidebarShell\n {...props}\n description=\"Displays the secondary workbench sidebar on mobile.\"\n isMobile={isMobile}\n openMobile={openMobile}\n setOpenMobile={setOpenMobile}\n side=\"right\"\n state={state}\n title=\"Secondary Sidebar\"\n toggleSidebar={toggleSidebar}\n />\n )\n}\n"],"mappings":"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","names":["React","jsx","jsx","React","jsx","React","jsx","React","jsx","jsxs","React","Slot","cva","jsx","jsxs","cva","React","Fragment","jsx","jsxs","parentItem","overId","React","useWorkbenchPrimarySidebar","React","jsx","useWorkbenchPrimarySidebar","React","useWorkbenchSecondarySidebar","React","jsx","useWorkbenchSecondarySidebar"]}
@@ -0,0 +1,15 @@
1
+ type FormatNumberValue = number | bigint;
2
+ type FormatNumberOptions = Intl.NumberFormatOptions & {
3
+ locale?: Intl.LocalesArgument;
4
+ };
5
+ type FormatBytesUnitSystem = "binary" | "decimal";
6
+ type FormatBytesOptions = {
7
+ locale?: Intl.LocalesArgument;
8
+ unitSystem?: FormatBytesUnitSystem;
9
+ minimumFractionDigits?: number;
10
+ maximumFractionDigits?: number;
11
+ };
12
+ declare function formatNumber(value: FormatNumberValue | null | undefined, { locale, ...options }?: FormatNumberOptions): string | null;
13
+ declare function formatBytes(value: number | null | undefined, options?: FormatBytesOptions): string | null;
14
+
15
+ export { type FormatBytesOptions, type FormatBytesUnitSystem, type FormatNumberOptions, type FormatNumberValue, formatBytes, formatNumber };
@@ -0,0 +1,9 @@
1
+ import {
2
+ formatBytes,
3
+ formatNumber
4
+ } from "../chunk-7W7QZHEZ.js";
5
+ export {
6
+ formatBytes,
7
+ formatNumber
8
+ };
9
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,22 @@
1
+ type ThemeMode = "light" | "dark" | "system";
2
+ type ResolvedTheme = Exclude<ThemeMode, "system">;
3
+ declare const ACCENT_PRESETS: readonly ["default", "blue", "green", "yellow", "pink", "orange", "purple"];
4
+ type AccentPreset = (typeof ACCENT_PRESETS)[number];
5
+ interface ThemeContextValue {
6
+ theme: ThemeMode;
7
+ resolvedTheme: ResolvedTheme;
8
+ accentPreset: AccentPreset;
9
+ setTheme: (theme: ThemeMode) => void;
10
+ setAccentPreset: (accentPreset: AccentPreset) => void;
11
+ }
12
+ declare const DEFAULT_ACCENT_PRESET: AccentPreset;
13
+ declare const THEME_STORAGE_KEY = "theme";
14
+ declare const ACCENT_PRESET_STORAGE_KEY = "accent-preset";
15
+ declare function isThemeMode(value: string | null | undefined): value is ThemeMode;
16
+ declare function isAccentPreset(value: string | null | undefined): value is AccentPreset;
17
+ declare function normalizeStoredTheme(value: string | null | undefined): ThemeMode | null;
18
+ declare function normalizeStoredAccentPreset(value: string | null | undefined): AccentPreset | null;
19
+ declare function resolveThemeMode(theme: ThemeMode, prefersDark: boolean): ResolvedTheme;
20
+ declare function getThemeInitScript(defaultTheme?: ThemeMode): string;
21
+
22
+ export { ACCENT_PRESETS, ACCENT_PRESET_STORAGE_KEY, type AccentPreset, DEFAULT_ACCENT_PRESET, type ResolvedTheme, THEME_STORAGE_KEY, type ThemeContextValue, type ThemeMode, getThemeInitScript, isAccentPreset, isThemeMode, normalizeStoredAccentPreset, normalizeStoredTheme, resolveThemeMode };
@@ -0,0 +1,25 @@
1
+ import {
2
+ ACCENT_PRESETS,
3
+ ACCENT_PRESET_STORAGE_KEY,
4
+ DEFAULT_ACCENT_PRESET,
5
+ THEME_STORAGE_KEY,
6
+ getThemeInitScript,
7
+ isAccentPreset,
8
+ isThemeMode,
9
+ normalizeStoredAccentPreset,
10
+ normalizeStoredTheme,
11
+ resolveThemeMode
12
+ } from "../chunk-3RTSANKB.js";
13
+ export {
14
+ ACCENT_PRESETS,
15
+ ACCENT_PRESET_STORAGE_KEY,
16
+ DEFAULT_ACCENT_PRESET,
17
+ THEME_STORAGE_KEY,
18
+ getThemeInitScript,
19
+ isAccentPreset,
20
+ isThemeMode,
21
+ normalizeStoredAccentPreset,
22
+ normalizeStoredTheme,
23
+ resolveThemeMode
24
+ };
25
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ import { ClassValue } from 'clsx';
2
+
3
+ declare function cn(...inputs: ClassValue[]): string;
4
+
5
+ export { cn };
@@ -0,0 +1,7 @@
1
+ import {
2
+ cn
3
+ } from "../chunk-DN2AEEA2.js";
4
+ export {
5
+ cn
6
+ };
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ @import "@fontsource-variable/inter";