@omnifyjp/ui 0.5.3 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/README.md +3 -6
  2. package/dist/chunk-2C2HRGM7.js +51 -0
  3. package/dist/chunk-2C2HRGM7.js.map +1 -0
  4. package/dist/chunk-2TUWDXAC.js +196 -0
  5. package/dist/chunk-2TUWDXAC.js.map +1 -0
  6. package/dist/chunk-34ARZSNP.js +63 -0
  7. package/dist/chunk-34ARZSNP.js.map +1 -0
  8. package/dist/chunk-35DNN46W.js +13 -0
  9. package/dist/chunk-35DNN46W.js.map +1 -0
  10. package/dist/chunk-35U6QG4P.js +116 -0
  11. package/dist/chunk-35U6QG4P.js.map +1 -0
  12. package/dist/chunk-3EOHW4QN.js +35 -0
  13. package/dist/chunk-3EOHW4QN.js.map +1 -0
  14. package/dist/chunk-3VU56V66.js +41 -0
  15. package/dist/chunk-3VU56V66.js.map +1 -0
  16. package/dist/chunk-55E7D2HR.js +99 -0
  17. package/dist/chunk-55E7D2HR.js.map +1 -0
  18. package/dist/chunk-67YUL2ZS.js +53 -0
  19. package/dist/chunk-67YUL2ZS.js.map +1 -0
  20. package/dist/chunk-6DIDQ4TB.js +131 -0
  21. package/dist/chunk-6DIDQ4TB.js.map +1 -0
  22. package/dist/chunk-6GWVQB3Q.js +155 -0
  23. package/dist/chunk-6GWVQB3Q.js.map +1 -0
  24. package/dist/chunk-75WZR6HF.js +44 -0
  25. package/dist/chunk-75WZR6HF.js.map +1 -0
  26. package/dist/chunk-7IRLBU2I.js +114 -0
  27. package/dist/chunk-7IRLBU2I.js.map +1 -0
  28. package/dist/chunk-7RMTPT6O.js +99 -0
  29. package/dist/chunk-7RMTPT6O.js.map +1 -0
  30. package/dist/chunk-7XH3MGBR.js +128 -0
  31. package/dist/chunk-7XH3MGBR.js.map +1 -0
  32. package/dist/chunk-A3BB5ZOC.js +77 -0
  33. package/dist/chunk-A3BB5ZOC.js.map +1 -0
  34. package/dist/chunk-BAQWGQJG.js +106 -0
  35. package/dist/chunk-BAQWGQJG.js.map +1 -0
  36. package/dist/chunk-BRSM3SZP.js +46 -0
  37. package/dist/chunk-BRSM3SZP.js.map +1 -0
  38. package/dist/chunk-C34KSTWA.js +43 -0
  39. package/dist/chunk-C34KSTWA.js.map +1 -0
  40. package/dist/chunk-C5NZAOA7.js +54 -0
  41. package/dist/chunk-C5NZAOA7.js.map +1 -0
  42. package/dist/chunk-CUZR4JWM.js +23 -0
  43. package/dist/chunk-CUZR4JWM.js.map +1 -0
  44. package/dist/chunk-DGPY4WP3.js +11 -0
  45. package/dist/chunk-DGPY4WP3.js.map +1 -0
  46. package/dist/chunk-EWBCV7VA.js +65 -0
  47. package/dist/chunk-EWBCV7VA.js.map +1 -0
  48. package/dist/chunk-F2ZJLKDP.js +119 -0
  49. package/dist/chunk-F2ZJLKDP.js.map +1 -0
  50. package/dist/chunk-FLWMT4DB.js +66 -0
  51. package/dist/chunk-FLWMT4DB.js.map +1 -0
  52. package/dist/chunk-FRKG7JQY.js +48 -0
  53. package/dist/chunk-FRKG7JQY.js.map +1 -0
  54. package/dist/chunk-G7HTZBUR.js +187 -0
  55. package/dist/chunk-G7HTZBUR.js.map +1 -0
  56. package/dist/chunk-IAWKX5W4.js +219 -0
  57. package/dist/chunk-IAWKX5W4.js.map +1 -0
  58. package/dist/chunk-INLM7UJC.js +238 -0
  59. package/dist/chunk-INLM7UJC.js.map +1 -0
  60. package/dist/chunk-JAJMM32I.js +18 -0
  61. package/dist/chunk-JAJMM32I.js.map +1 -0
  62. package/dist/chunk-JJSVA3TH.js +61 -0
  63. package/dist/chunk-JJSVA3TH.js.map +1 -0
  64. package/dist/chunk-JLTBUACL.js +121 -0
  65. package/dist/chunk-JLTBUACL.js.map +1 -0
  66. package/dist/chunk-JRU2QX7T.js +38 -0
  67. package/dist/chunk-JRU2QX7T.js.map +1 -0
  68. package/dist/chunk-JXGRW2MR.js +17 -0
  69. package/dist/chunk-JXGRW2MR.js.map +1 -0
  70. package/dist/chunk-LMT327XH.js +56 -0
  71. package/dist/chunk-LMT327XH.js.map +1 -0
  72. package/dist/chunk-LTTNCAAA.js +138 -0
  73. package/dist/chunk-LTTNCAAA.js.map +1 -0
  74. package/dist/chunk-MJLFJPUG.js +143 -0
  75. package/dist/chunk-MJLFJPUG.js.map +1 -0
  76. package/dist/chunk-MZ2P566X.js +65 -0
  77. package/dist/chunk-MZ2P566X.js.map +1 -0
  78. package/dist/chunk-N47H4MHX.js +41 -0
  79. package/dist/chunk-N47H4MHX.js.map +1 -0
  80. package/dist/chunk-NNJTKHCE.js +160 -0
  81. package/dist/chunk-NNJTKHCE.js.map +1 -0
  82. package/dist/chunk-NPL2R5LD.js +171 -0
  83. package/dist/chunk-NPL2R5LD.js.map +1 -0
  84. package/dist/chunk-NU56GKGM.js +44 -0
  85. package/dist/chunk-NU56GKGM.js.map +1 -0
  86. package/dist/chunk-P3M5TZD2.js +24 -0
  87. package/dist/chunk-P3M5TZD2.js.map +1 -0
  88. package/dist/chunk-PGWNOZDX.js +28 -0
  89. package/dist/chunk-PGWNOZDX.js.map +1 -0
  90. package/dist/chunk-QB3UWRZH.js +92 -0
  91. package/dist/chunk-QB3UWRZH.js.map +1 -0
  92. package/dist/chunk-R2CDE5DO.js +33 -0
  93. package/dist/chunk-R2CDE5DO.js.map +1 -0
  94. package/dist/chunk-RQNZDWY3.js +65 -0
  95. package/dist/chunk-RQNZDWY3.js.map +1 -0
  96. package/dist/chunk-S6PDRGR5.js +109 -0
  97. package/dist/chunk-S6PDRGR5.js.map +1 -0
  98. package/dist/chunk-TGYQ3AKH.js +95 -0
  99. package/dist/chunk-TGYQ3AKH.js.map +1 -0
  100. package/dist/chunk-TJMK2KBE.js +112 -0
  101. package/dist/chunk-TJMK2KBE.js.map +1 -0
  102. package/dist/chunk-USIHM7FV.js +211 -0
  103. package/dist/chunk-USIHM7FV.js.map +1 -0
  104. package/dist/chunk-VVYSAGB3.js +104 -0
  105. package/dist/chunk-VVYSAGB3.js.map +1 -0
  106. package/dist/chunk-WD5KZE25.js +25 -0
  107. package/dist/chunk-WD5KZE25.js.map +1 -0
  108. package/dist/chunk-WL4ZO2H3.js +33 -0
  109. package/dist/chunk-WL4ZO2H3.js.map +1 -0
  110. package/dist/chunk-WRCHR4AK.js +23 -0
  111. package/dist/chunk-WRCHR4AK.js.map +1 -0
  112. package/dist/chunk-WS6E7HBT.js +39 -0
  113. package/dist/chunk-WS6E7HBT.js.map +1 -0
  114. package/dist/chunk-XOJJBNDX.js +33 -0
  115. package/dist/chunk-XOJJBNDX.js.map +1 -0
  116. package/dist/chunk-YBMEQZX7.js +164 -0
  117. package/dist/chunk-YBMEQZX7.js.map +1 -0
  118. package/dist/chunk-Z2QAABLM.js +86 -0
  119. package/dist/chunk-Z2QAABLM.js.map +1 -0
  120. package/dist/chunk-ZHEKDP5X.js +41 -0
  121. package/dist/chunk-ZHEKDP5X.js.map +1 -0
  122. package/dist/chunk-ZPMXRW2A.js +63 -0
  123. package/dist/chunk-ZPMXRW2A.js.map +1 -0
  124. package/dist/chunk-ZYEGBF7G.js +25 -0
  125. package/dist/chunk-ZYEGBF7G.js.map +1 -0
  126. package/dist/components/accordion.d.ts +37 -0
  127. package/dist/components/accordion.js +4 -0
  128. package/dist/components/accordion.js.map +1 -0
  129. package/dist/components/alert-dialog.d.ts +56 -0
  130. package/dist/components/alert-dialog.js +5 -0
  131. package/dist/components/alert-dialog.js.map +1 -0
  132. package/dist/components/alert.d.ts +68 -0
  133. package/dist/components/alert.js +4 -0
  134. package/dist/components/alert.js.map +1 -0
  135. package/dist/components/aspect-ratio.d.ts +23 -0
  136. package/dist/components/aspect-ratio.js +3 -0
  137. package/dist/components/aspect-ratio.js.map +1 -0
  138. package/dist/components/avatar.d.ts +48 -0
  139. package/dist/components/avatar.js +4 -0
  140. package/dist/components/avatar.js.map +1 -0
  141. package/dist/components/badge.d.ts +52 -0
  142. package/dist/components/badge.js +4 -0
  143. package/dist/components/badge.js.map +1 -0
  144. package/dist/components/breadcrumb.d.ts +50 -0
  145. package/dist/components/breadcrumb.js +4 -0
  146. package/dist/components/breadcrumb.js.map +1 -0
  147. package/dist/components/button.d.ts +81 -0
  148. package/dist/components/button.js +4 -0
  149. package/dist/components/button.js.map +1 -0
  150. package/dist/components/calendar-category-badge.d.ts +24 -0
  151. package/dist/components/calendar-category-badge.js +5 -0
  152. package/dist/components/calendar-category-badge.js.map +1 -0
  153. package/dist/components/calendar-event-chip.d.ts +41 -0
  154. package/dist/components/calendar-event-chip.js +30 -0
  155. package/dist/components/calendar-event-chip.js.map +1 -0
  156. package/dist/components/calendar-event-sheet.d.ts +68 -0
  157. package/dist/components/calendar-event-sheet.js +83 -0
  158. package/dist/components/calendar-event-sheet.js.map +1 -0
  159. package/dist/components/calendar-mini.d.ts +65 -0
  160. package/dist/components/calendar-mini.js +93 -0
  161. package/dist/components/calendar-mini.js.map +1 -0
  162. package/dist/components/calendar-toolbar.d.ts +58 -0
  163. package/dist/components/calendar-toolbar.js +54 -0
  164. package/dist/components/calendar-toolbar.js.map +1 -0
  165. package/dist/components/calendar.d.ts +19 -0
  166. package/dist/components/calendar.js +5 -0
  167. package/dist/components/calendar.js.map +1 -0
  168. package/dist/components/card.d.ts +43 -0
  169. package/dist/components/card.js +4 -0
  170. package/dist/components/card.js.map +1 -0
  171. package/dist/components/carousel.d.ts +53 -0
  172. package/dist/components/carousel.js +5 -0
  173. package/dist/components/carousel.js.map +1 -0
  174. package/dist/components/chart.d.ts +125 -0
  175. package/dist/components/chart.js +239 -0
  176. package/dist/components/chart.js.map +1 -0
  177. package/dist/components/checkbox.d.ts +24 -0
  178. package/dist/components/checkbox.js +4 -0
  179. package/dist/components/checkbox.js.map +1 -0
  180. package/dist/components/collapsible.d.ts +28 -0
  181. package/dist/components/collapsible.js +3 -0
  182. package/dist/components/collapsible.js.map +1 -0
  183. package/dist/components/color-picker.d.ts +35 -0
  184. package/dist/components/color-picker.js +7 -0
  185. package/dist/components/color-picker.js.map +1 -0
  186. package/dist/components/combobox.d.ts +98 -0
  187. package/dist/components/combobox.js +8 -0
  188. package/dist/components/combobox.js.map +1 -0
  189. package/dist/components/command.d.ts +63 -0
  190. package/dist/components/command.js +5 -0
  191. package/dist/components/command.js.map +1 -0
  192. package/dist/components/context-menu.d.ts +70 -0
  193. package/dist/components/context-menu.js +4 -0
  194. package/dist/components/context-menu.js.map +1 -0
  195. package/dist/components/date-picker.d.ts +71 -0
  196. package/dist/components/date-picker.js +90 -0
  197. package/dist/components/date-picker.js.map +1 -0
  198. package/dist/components/dialog.d.ts +58 -0
  199. package/dist/components/dialog.js +4 -0
  200. package/dist/components/dialog.js.map +1 -0
  201. package/dist/components/drawer.d.ts +60 -0
  202. package/dist/components/drawer.js +4 -0
  203. package/dist/components/drawer.js.map +1 -0
  204. package/dist/components/dropdown-menu.d.ts +76 -0
  205. package/dist/components/dropdown-menu.js +4 -0
  206. package/dist/components/dropdown-menu.js.map +1 -0
  207. package/dist/components/file-upload.d.ts +44 -0
  208. package/dist/components/file-upload.js +5 -0
  209. package/dist/components/file-upload.js.map +1 -0
  210. package/dist/components/form.d.ts +67 -0
  211. package/dist/components/form.js +111 -0
  212. package/dist/components/form.js.map +1 -0
  213. package/dist/components/hover-card.d.ts +43 -0
  214. package/dist/components/hover-card.js +4 -0
  215. package/dist/components/hover-card.js.map +1 -0
  216. package/dist/components/input-otp.d.ts +38 -0
  217. package/dist/components/input-otp.js +4 -0
  218. package/dist/components/input-otp.js.map +1 -0
  219. package/dist/components/input.d.ts +38 -0
  220. package/dist/components/input.js +4 -0
  221. package/dist/components/input.js.map +1 -0
  222. package/dist/components/label.d.ts +20 -0
  223. package/dist/components/label.js +4 -0
  224. package/dist/components/label.js.map +1 -0
  225. package/dist/components/menubar.d.ts +82 -0
  226. package/dist/components/menubar.js +4 -0
  227. package/dist/components/menubar.js.map +1 -0
  228. package/dist/components/navigation-menu.d.ts +64 -0
  229. package/dist/components/navigation-menu.js +4 -0
  230. package/dist/components/navigation-menu.js.map +1 -0
  231. package/dist/components/pagination.d.ts +59 -0
  232. package/dist/components/pagination.js +5 -0
  233. package/dist/components/pagination.js.map +1 -0
  234. package/dist/components/password-input.d.ts +32 -0
  235. package/dist/components/password-input.js +5 -0
  236. package/dist/components/password-input.js.map +1 -0
  237. package/dist/components/permission-grid.d.ts +67 -0
  238. package/dist/components/permission-grid.js +5 -0
  239. package/dist/components/permission-grid.js.map +1 -0
  240. package/dist/components/popover.d.ts +37 -0
  241. package/dist/components/popover.js +4 -0
  242. package/dist/components/popover.js.map +1 -0
  243. package/dist/components/progress.d.ts +20 -0
  244. package/dist/components/progress.js +4 -0
  245. package/dist/components/progress.js.map +1 -0
  246. package/dist/components/radio-group.d.ts +38 -0
  247. package/dist/components/radio-group.js +4 -0
  248. package/dist/components/radio-group.js.map +1 -0
  249. package/dist/components/rating.d.ts +35 -0
  250. package/dist/components/rating.js +4 -0
  251. package/dist/components/rating.js.map +1 -0
  252. package/dist/components/resizable.d.ts +36 -0
  253. package/dist/components/resizable.js +4 -0
  254. package/dist/components/resizable.js.map +1 -0
  255. package/dist/components/scope-tree.d.ts +78 -0
  256. package/dist/components/scope-tree.js +5 -0
  257. package/dist/components/scope-tree.js.map +1 -0
  258. package/dist/components/scope-type-badge.d.ts +35 -0
  259. package/dist/components/scope-type-badge.js +5 -0
  260. package/dist/components/scope-type-badge.js.map +1 -0
  261. package/dist/components/scroll-area.d.ts +29 -0
  262. package/dist/components/scroll-area.js +4 -0
  263. package/dist/components/scroll-area.js.map +1 -0
  264. package/dist/components/select.d.ts +52 -0
  265. package/dist/components/select.js +4 -0
  266. package/dist/components/select.js.map +1 -0
  267. package/dist/components/separator.d.ts +24 -0
  268. package/dist/components/separator.js +4 -0
  269. package/dist/components/separator.js.map +1 -0
  270. package/dist/components/sheet.d.ts +51 -0
  271. package/dist/components/sheet.js +4 -0
  272. package/dist/components/sheet.js.map +1 -0
  273. package/dist/components/skeleton.d.ts +25 -0
  274. package/dist/components/skeleton.js +4 -0
  275. package/dist/components/skeleton.js.map +1 -0
  276. package/dist/components/slider.d.ts +24 -0
  277. package/dist/components/slider.js +4 -0
  278. package/dist/components/slider.js.map +1 -0
  279. package/dist/components/slug-input.d.ts +50 -0
  280. package/dist/components/slug-input.js +6 -0
  281. package/dist/components/slug-input.js.map +1 -0
  282. package/dist/components/sonner.d.ts +22 -0
  283. package/dist/components/sonner.js +3 -0
  284. package/dist/components/sonner.js.map +1 -0
  285. package/dist/components/stage-type-badge.d.ts +30 -0
  286. package/dist/components/stage-type-badge.js +5 -0
  287. package/dist/components/stage-type-badge.js.map +1 -0
  288. package/dist/components/switch.d.ts +26 -0
  289. package/dist/components/switch.js +4 -0
  290. package/dist/components/switch.js.map +1 -0
  291. package/dist/components/table.d.ts +57 -0
  292. package/dist/components/table.js +4 -0
  293. package/dist/components/table.js.map +1 -0
  294. package/dist/components/tabs.d.ts +39 -0
  295. package/dist/components/tabs.js +4 -0
  296. package/dist/components/tabs.js.map +1 -0
  297. package/dist/components/tag-input.d.ts +40 -0
  298. package/dist/components/tag-input.js +5 -0
  299. package/dist/components/tag-input.js.map +1 -0
  300. package/dist/components/textarea.d.ts +21 -0
  301. package/dist/components/textarea.js +4 -0
  302. package/dist/components/textarea.js.map +1 -0
  303. package/dist/components/time-picker.d.ts +57 -0
  304. package/dist/components/time-picker.js +8 -0
  305. package/dist/components/time-picker.js.map +1 -0
  306. package/dist/components/toggle-group.d.ts +45 -0
  307. package/dist/components/toggle-group.js +5 -0
  308. package/dist/components/toggle-group.js.map +1 -0
  309. package/dist/components/toggle.d.ts +31 -0
  310. package/dist/components/toggle.js +4 -0
  311. package/dist/components/toggle.js.map +1 -0
  312. package/dist/components/tooltip.d.ts +34 -0
  313. package/dist/components/tooltip.js +4 -0
  314. package/dist/components/tooltip.js.map +1 -0
  315. package/dist/components/workflow-category-badge.d.ts +32 -0
  316. package/dist/components/workflow-category-badge.js +5 -0
  317. package/dist/components/workflow-category-badge.js.map +1 -0
  318. package/dist/components/workflow-diagram.d.ts +63 -0
  319. package/dist/components/workflow-diagram.js +5 -0
  320. package/dist/components/workflow-diagram.js.map +1 -0
  321. package/dist/components/workflow-status-badge.d.ts +30 -0
  322. package/dist/components/workflow-status-badge.js +5 -0
  323. package/dist/components/workflow-status-badge.js.map +1 -0
  324. package/dist/components/workflow-stepper.d.ts +52 -0
  325. package/dist/components/workflow-stepper.js +4 -0
  326. package/dist/components/workflow-stepper.js.map +1 -0
  327. package/dist/hooks/use-mobile.d.ts +3 -3
  328. package/dist/hooks/use-mobile.js +1 -1
  329. package/dist/hooks/use-mobile.js.map +1 -1
  330. package/dist/index.d.ts +98 -16
  331. package/dist/index.js +62 -13
  332. package/dist/lib/types.d.ts +84 -1
  333. package/dist/lib/types.js +1 -1
  334. package/dist/lib/types.js.map +1 -1
  335. package/dist/lib/utils.d.ts +5 -1
  336. package/dist/lib/utils.js +1 -1
  337. package/dist/lib/utils.js.map +1 -1
  338. package/package.json +68 -31
  339. package/src/styles/fonts.css +0 -0
  340. package/src/styles/index.css +3 -1
  341. package/src/styles/tailwind.css +4 -0
  342. package/src/styles/theme.css +461 -0
  343. package/dist/chunk-2GN4WIOV.js +0 -240
  344. package/dist/chunk-2GN4WIOV.js.map +0 -1
  345. package/dist/chunk-5BL4VFRJ.js +0 -57
  346. package/dist/chunk-5BL4VFRJ.js.map +0 -1
  347. package/dist/chunk-735JNJJO.js +0 -27
  348. package/dist/chunk-735JNJJO.js.map +0 -1
  349. package/dist/chunk-EJEVW4RO.js +0 -49
  350. package/dist/chunk-EJEVW4RO.js.map +0 -1
  351. package/dist/chunk-FVOQZTHE.js +0 -191
  352. package/dist/chunk-FVOQZTHE.js.map +0 -1
  353. package/dist/chunk-ITXOZ4IR.js +0 -85
  354. package/dist/chunk-ITXOZ4IR.js.map +0 -1
  355. package/dist/chunk-NVPNMQSR.js +0 -30
  356. package/dist/chunk-NVPNMQSR.js.map +0 -1
  357. package/dist/chunk-O25D7DCP.js +0 -72
  358. package/dist/chunk-O25D7DCP.js.map +0 -1
  359. package/dist/chunk-O2ADW2GC.js +0 -224
  360. package/dist/chunk-O2ADW2GC.js.map +0 -1
  361. package/dist/chunk-OY3PSPA5.js +0 -661
  362. package/dist/chunk-OY3PSPA5.js.map +0 -1
  363. package/dist/chunk-UASABUQA.js +0 -39
  364. package/dist/chunk-UASABUQA.js.map +0 -1
  365. package/dist/chunk-UR2QLIS2.js +0 -93
  366. package/dist/chunk-UR2QLIS2.js.map +0 -1
  367. package/dist/chunk-XDXGUPCR.js +0 -123
  368. package/dist/chunk-XDXGUPCR.js.map +0 -1
  369. package/dist/components/AppShell.d.ts +0 -27
  370. package/dist/components/AppShell.js +0 -13
  371. package/dist/components/AppShell.js.map +0 -1
  372. package/dist/components/Header.d.ts +0 -11
  373. package/dist/components/Header.js +0 -9
  374. package/dist/components/Header.js.map +0 -1
  375. package/dist/components/LanguageSelector.d.ts +0 -11
  376. package/dist/components/LanguageSelector.js +0 -5
  377. package/dist/components/LanguageSelector.js.map +0 -1
  378. package/dist/components/OrganizationSelector.d.ts +0 -8
  379. package/dist/components/OrganizationSelector.js +0 -4
  380. package/dist/components/OrganizationSelector.js.map +0 -1
  381. package/dist/components/OrganizationSetupModal.d.ts +0 -5
  382. package/dist/components/OrganizationSetupModal.js +0 -4
  383. package/dist/components/OrganizationSetupModal.js.map +0 -1
  384. package/dist/components/PageContainer.d.ts +0 -105
  385. package/dist/components/PageContainer.js +0 -3
  386. package/dist/components/PageContainer.js.map +0 -1
  387. package/dist/components/ServiceMenu.d.ts +0 -11
  388. package/dist/components/ServiceMenu.js +0 -3
  389. package/dist/components/ServiceMenu.js.map +0 -1
  390. package/dist/components/Sidebar.d.ts +0 -11
  391. package/dist/components/Sidebar.js +0 -5
  392. package/dist/components/Sidebar.js.map +0 -1
  393. package/dist/contexts/LanguageContext.d.ts +0 -17
  394. package/dist/contexts/LanguageContext.js +0 -4
  395. package/dist/contexts/LanguageContext.js.map +0 -1
  396. package/dist/contexts/OrganizationContext.d.ts +0 -28
  397. package/dist/contexts/OrganizationContext.js +0 -3
  398. package/dist/contexts/OrganizationContext.js.map +0 -1
  399. package/dist/contexts/ThemeContext.d.ts +0 -14
  400. package/dist/contexts/ThemeContext.js +0 -3
  401. package/dist/contexts/ThemeContext.js.map +0 -1
  402. package/dist/hooks/useDateFormat.d.ts +0 -28
  403. package/dist/hooks/useDateFormat.js +0 -4
  404. package/dist/hooks/useDateFormat.js.map +0 -1
  405. package/dist/i18n.d.ts +0 -38
  406. package/dist/i18n.js +0 -3
  407. package/dist/i18n.js.map +0 -1
  408. package/dist/types.d.ts +0 -91
  409. package/dist/types.js +0 -3
  410. package/dist/types.js.map +0 -1
@@ -0,0 +1,114 @@
1
+ import { buttonVariants } from './chunk-55E7D2HR.js';
2
+ import { cn } from './chunk-DGPY4WP3.js';
3
+ import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function Pagination({ className, ...props }) {
7
+ return /* @__PURE__ */ jsx(
8
+ "nav",
9
+ {
10
+ role: "navigation",
11
+ "aria-label": "pagination",
12
+ "data-slot": "pagination",
13
+ className: cn("mx-auto flex w-full justify-center", className),
14
+ ...props
15
+ }
16
+ );
17
+ }
18
+ function PaginationContent({
19
+ className,
20
+ ...props
21
+ }) {
22
+ return /* @__PURE__ */ jsx(
23
+ "ul",
24
+ {
25
+ "data-slot": "pagination-content",
26
+ className: cn("flex flex-row items-center gap-1", className),
27
+ ...props
28
+ }
29
+ );
30
+ }
31
+ function PaginationItem({ ...props }) {
32
+ return /* @__PURE__ */ jsx("li", { "data-slot": "pagination-item", ...props });
33
+ }
34
+ function PaginationLink({
35
+ className,
36
+ isActive,
37
+ size = "icon",
38
+ ...props
39
+ }) {
40
+ return /* @__PURE__ */ jsx(
41
+ "a",
42
+ {
43
+ "aria-current": isActive ? "page" : void 0,
44
+ "data-slot": "pagination-link",
45
+ "data-active": isActive,
46
+ className: cn(
47
+ buttonVariants({
48
+ variant: isActive ? "outline" : "ghost",
49
+ size
50
+ }),
51
+ className
52
+ ),
53
+ ...props
54
+ }
55
+ );
56
+ }
57
+ function PaginationPrevious({
58
+ className,
59
+ ...props
60
+ }) {
61
+ return /* @__PURE__ */ jsxs(
62
+ PaginationLink,
63
+ {
64
+ "aria-label": "Go to previous page",
65
+ size: "default",
66
+ className: cn("gap-1 px-2.5 sm:pl-2.5", className),
67
+ ...props,
68
+ children: [
69
+ /* @__PURE__ */ jsx(ChevronLeftIcon, {}),
70
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:block", children: "Previous" })
71
+ ]
72
+ }
73
+ );
74
+ }
75
+ function PaginationNext({
76
+ className,
77
+ ...props
78
+ }) {
79
+ return /* @__PURE__ */ jsxs(
80
+ PaginationLink,
81
+ {
82
+ "aria-label": "Go to next page",
83
+ size: "default",
84
+ className: cn("gap-1 px-2.5 sm:pr-2.5", className),
85
+ ...props,
86
+ children: [
87
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:block", children: "Next" }),
88
+ /* @__PURE__ */ jsx(ChevronRightIcon, {})
89
+ ]
90
+ }
91
+ );
92
+ }
93
+ function PaginationEllipsis({
94
+ className,
95
+ ...props
96
+ }) {
97
+ return /* @__PURE__ */ jsxs(
98
+ "span",
99
+ {
100
+ "aria-hidden": true,
101
+ "data-slot": "pagination-ellipsis",
102
+ className: cn("flex size-9 items-center justify-center", className),
103
+ ...props,
104
+ children: [
105
+ /* @__PURE__ */ jsx(MoreHorizontalIcon, { className: "size-4" }),
106
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "More pages" })
107
+ ]
108
+ }
109
+ );
110
+ }
111
+
112
+ export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious };
113
+ //# sourceMappingURL=chunk-7IRLBU2I.js.map
114
+ //# sourceMappingURL=chunk-7IRLBU2I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/pagination.tsx"],"names":[],"mappings":"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","file":"chunk-7IRLBU2I.js","sourcesContent":["import * as React from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button, buttonVariants } from \"./button\";\n\n/**\n * Page navigation component with numbered links, previous/next buttons, and ellipsis indicators.\n *\n * Renders as a `<nav>` with `aria-label=\"pagination\"` for accessibility.\n * Compose with `PaginationContent`, `PaginationItem`, `PaginationLink`,\n * `PaginationPrevious`, `PaginationNext`, and `PaginationEllipsis`.\n *\n * @example\n * ```tsx\n * <Pagination>\n * <PaginationContent>\n * <PaginationItem>\n * <PaginationPrevious href=\"#\" />\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\" isActive>1</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\">2</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationEllipsis />\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\">10</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationNext href=\"#\" />\n * </PaginationItem>\n * </PaginationContent>\n * </Pagination>\n * ```\n */\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\n/** Flex container for pagination items. Renders as a `<ul>`. */\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** List item wrapper for a single pagination element. */\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n /** When true, renders the link with an `outline` variant and `aria-current=\"page\"`. */\n isActive?: boolean;\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">;\n\n/** Styled pagination link using button variants. Supports `isActive` for the current page. */\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className,\n )}\n {...props}\n />\n );\n}\n\n/** \"Previous\" pagination link with a left chevron icon. */\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n );\n}\n\n/** \"Next\" pagination link with a right chevron icon. */\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n );\n}\n\n/** Ellipsis indicator for omitted page numbers. Renders a `MoreHorizontal` icon with screen-reader text. */\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n"]}
@@ -0,0 +1,99 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { ChevronRight, MoreHorizontal } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function Breadcrumb({ ...props }) {
7
+ return /* @__PURE__ */ jsx("nav", { "aria-label": "breadcrumb", "data-slot": "breadcrumb", ...props });
8
+ }
9
+ function BreadcrumbList({ className, ...props }) {
10
+ return /* @__PURE__ */ jsx(
11
+ "ol",
12
+ {
13
+ "data-slot": "breadcrumb-list",
14
+ className: cn(
15
+ "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
16
+ className
17
+ ),
18
+ ...props
19
+ }
20
+ );
21
+ }
22
+ function BreadcrumbItem({ className, ...props }) {
23
+ return /* @__PURE__ */ jsx(
24
+ "li",
25
+ {
26
+ "data-slot": "breadcrumb-item",
27
+ className: cn("inline-flex items-center gap-1.5", className),
28
+ ...props
29
+ }
30
+ );
31
+ }
32
+ function BreadcrumbLink({
33
+ asChild,
34
+ className,
35
+ ...props
36
+ }) {
37
+ const Comp = asChild ? Slot : "a";
38
+ return /* @__PURE__ */ jsx(
39
+ Comp,
40
+ {
41
+ "data-slot": "breadcrumb-link",
42
+ className: cn("hover:text-foreground transition-colors", className),
43
+ ...props
44
+ }
45
+ );
46
+ }
47
+ function BreadcrumbPage({ className, ...props }) {
48
+ return /* @__PURE__ */ jsx(
49
+ "span",
50
+ {
51
+ "data-slot": "breadcrumb-page",
52
+ role: "link",
53
+ "aria-disabled": "true",
54
+ "aria-current": "page",
55
+ className: cn("text-foreground font-normal", className),
56
+ ...props
57
+ }
58
+ );
59
+ }
60
+ function BreadcrumbSeparator({
61
+ children,
62
+ className,
63
+ ...props
64
+ }) {
65
+ return /* @__PURE__ */ jsx(
66
+ "li",
67
+ {
68
+ "data-slot": "breadcrumb-separator",
69
+ role: "presentation",
70
+ "aria-hidden": "true",
71
+ className: cn("[&>svg]:size-3.5", className),
72
+ ...props,
73
+ children: children ?? /* @__PURE__ */ jsx(ChevronRight, {})
74
+ }
75
+ );
76
+ }
77
+ function BreadcrumbEllipsis({
78
+ className,
79
+ ...props
80
+ }) {
81
+ return /* @__PURE__ */ jsxs(
82
+ "span",
83
+ {
84
+ "data-slot": "breadcrumb-ellipsis",
85
+ role: "presentation",
86
+ "aria-hidden": "true",
87
+ className: cn("flex size-9 items-center justify-center", className),
88
+ ...props,
89
+ children: [
90
+ /* @__PURE__ */ jsx(MoreHorizontal, { className: "size-4" }),
91
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "More" })
92
+ ]
93
+ }
94
+ );
95
+ }
96
+
97
+ export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator };
98
+ //# sourceMappingURL=chunk-7RMTPT6O.js.map
99
+ //# sourceMappingURL=chunk-7RMTPT6O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/breadcrumb.tsx"],"names":[],"mappings":";;;;;AAgCA,SAAS,UAAA,CAAW,EAAE,GAAG,KAAA,EAAM,EAAgC;AAC7D,EAAA,2BAAQ,KAAA,EAAA,EAAI,YAAA,EAAW,cAAa,WAAA,EAAU,YAAA,EAAc,GAAG,KAAA,EAAO,CAAA;AACxE;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,0FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,MAC1D,GAAG;AAAA;AAAA,GACN;AAEJ;AAOA,SAAS,cAAA,CAAe;AAAA,EACtB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,GAAA;AAE9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiC;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,eAAA,EAAc,MAAA;AAAA,MACd,cAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACrD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,sBAAA;AAAA,MACV,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,SAAS,CAAA;AAAA,MAC1C,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,QAAA,wBAAa,YAAA,EAAA,EAAa;AAAA;AAAA,GAC7B;AAEJ;AAGA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,WAAU,QAAA,EAAS,CAAA;AAAA,wBACnC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,MAAA,EAAI;AAAA;AAAA;AAAA,GAChC;AAEJ","file":"chunk-7RMTPT6O.js","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Navigation breadcrumb trail showing the current page hierarchy.\n *\n * Renders as a `<nav>` with `aria-label=\"breadcrumb\"` for accessibility.\n * Use `BreadcrumbSeparator` between items (defaults to a chevron icon)\n * and `BreadcrumbEllipsis` for collapsed intermediate items.\n *\n * @example\n * ```tsx\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/\">Home</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/projects\">Projects</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Current Project</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n * ```\n */\nfunction Breadcrumb({ ...props }: React.ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\n/** Ordered list container for breadcrumb items. Handles wrapping and spacing. */\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Individual breadcrumb list item wrapping a link or page indicator. */\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Clickable breadcrumb link. Set `asChild` to render a custom element (e.g., React Router `Link`).\n *\n * @param asChild - When true, renders the child element instead of an `<a>` tag.\n */\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n />\n );\n}\n\n/** Non-interactive breadcrumb label for the current page. Rendered with `aria-current=\"page\"`. */\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n );\n}\n\n/** Visual separator between breadcrumb items. Defaults to a `ChevronRight` icon; pass custom children to override. */\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\n/** Ellipsis indicator for collapsed breadcrumb items. Renders a `MoreHorizontal` icon with screen-reader text. */\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n"]}
@@ -0,0 +1,128 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import { Drawer as Drawer$1 } from 'vaul';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ function Drawer({
6
+ ...props
7
+ }) {
8
+ return /* @__PURE__ */ jsx(Drawer$1.Root, { "data-slot": "drawer", ...props });
9
+ }
10
+ function DrawerTrigger({
11
+ ...props
12
+ }) {
13
+ return /* @__PURE__ */ jsx(Drawer$1.Trigger, { "data-slot": "drawer-trigger", ...props });
14
+ }
15
+ function DrawerPortal({
16
+ ...props
17
+ }) {
18
+ return /* @__PURE__ */ jsx(Drawer$1.Portal, { "data-slot": "drawer-portal", ...props });
19
+ }
20
+ function DrawerClose({
21
+ ...props
22
+ }) {
23
+ return /* @__PURE__ */ jsx(Drawer$1.Close, { "data-slot": "drawer-close", ...props });
24
+ }
25
+ function DrawerOverlay({
26
+ className,
27
+ ...props
28
+ }) {
29
+ return /* @__PURE__ */ jsx(
30
+ Drawer$1.Overlay,
31
+ {
32
+ "data-slot": "drawer-overlay",
33
+ className: cn(
34
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
35
+ className
36
+ ),
37
+ ...props
38
+ }
39
+ );
40
+ }
41
+ function DrawerContent({
42
+ className,
43
+ children,
44
+ ...props
45
+ }) {
46
+ return /* @__PURE__ */ jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [
47
+ /* @__PURE__ */ jsx(DrawerOverlay, {}),
48
+ /* @__PURE__ */ jsxs(
49
+ Drawer$1.Content,
50
+ {
51
+ "data-slot": "drawer-content",
52
+ className: cn(
53
+ "group/drawer-content bg-background fixed z-50 flex h-auto flex-col",
54
+ "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b",
55
+ "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t",
56
+ "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm",
57
+ "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm",
58
+ className
59
+ ),
60
+ ...props,
61
+ children: [
62
+ /* @__PURE__ */ jsx("div", { className: "bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" }),
63
+ children
64
+ ]
65
+ }
66
+ )
67
+ ] });
68
+ }
69
+ function DrawerHeader({ className, ...props }) {
70
+ return /* @__PURE__ */ jsx(
71
+ "div",
72
+ {
73
+ "data-slot": "drawer-header",
74
+ className: cn("flex flex-col gap-1.5 p-6", className),
75
+ ...props
76
+ }
77
+ );
78
+ }
79
+ function DrawerBody({ className, ...props }) {
80
+ return /* @__PURE__ */ jsx(
81
+ "div",
82
+ {
83
+ "data-slot": "drawer-body",
84
+ className: cn("flex-1 overflow-y-auto px-6 py-4", className),
85
+ ...props
86
+ }
87
+ );
88
+ }
89
+ function DrawerFooter({ className, ...props }) {
90
+ return /* @__PURE__ */ jsx(
91
+ "div",
92
+ {
93
+ "data-slot": "drawer-footer",
94
+ className: cn("mt-auto flex flex-col gap-2 p-6", className),
95
+ ...props
96
+ }
97
+ );
98
+ }
99
+ function DrawerTitle({
100
+ className,
101
+ ...props
102
+ }) {
103
+ return /* @__PURE__ */ jsx(
104
+ Drawer$1.Title,
105
+ {
106
+ "data-slot": "drawer-title",
107
+ className: cn("text-foreground font-semibold", className),
108
+ ...props
109
+ }
110
+ );
111
+ }
112
+ function DrawerDescription({
113
+ className,
114
+ ...props
115
+ }) {
116
+ return /* @__PURE__ */ jsx(
117
+ Drawer$1.Description,
118
+ {
119
+ "data-slot": "drawer-description",
120
+ className: cn("text-muted-foreground text-sm", className),
121
+ ...props
122
+ }
123
+ );
124
+ }
125
+
126
+ export { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger };
127
+ //# sourceMappingURL=chunk-7XH3MGBR.js.map
128
+ //# sourceMappingURL=chunk-7XH3MGBR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/drawer.tsx"],"names":["DrawerPrimitive"],"mappings":"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","file":"chunk-7XH3MGBR.js","sourcesContent":["import * as React from \"react\";\nimport { Drawer as DrawerPrimitive } from \"vaul\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Swipeable drawer component built on Vaul.\n *\n * Slides from any edge of the screen and can be dismissed by swiping.\n * Set the `direction` prop on the root to control direction (`\"top\"`, `\"bottom\"`,\n * `\"left\"`, `\"right\"`). Always wrap content in `DrawerBody` for proper scrolling.\n *\n * @example\n * ```tsx\n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerTrigger asChild>\n * <Button variant=\"outline\">Open Drawer</Button>\n * </DrawerTrigger>\n * <DrawerContent>\n * <DrawerHeader>\n * <DrawerTitle>Task Details</DrawerTitle>\n * <DrawerDescription>\n * View and edit task information.\n * </DrawerDescription>\n * </DrawerHeader>\n * <DrawerBody>\n * <p>Scrollable content goes here.</p>\n * </DrawerBody>\n * <DrawerFooter>\n * <Button>Save</Button>\n * <DrawerClose asChild>\n * <Button variant=\"outline\">Cancel</Button>\n * </DrawerClose>\n * </DrawerFooter>\n * </DrawerContent>\n * </Drawer>\n * ```\n */\nfunction Drawer({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />;\n}\n\n/** Element that opens the drawer when clicked. Use `asChild` to merge into your own button. */\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />;\n}\n\n/** Portal that renders drawer content outside the DOM hierarchy. */\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />;\n}\n\n/** Button that closes the drawer. Use `asChild` to merge into your own button. */\nfunction DrawerClose({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />;\n}\n\n/** Semi-transparent backdrop rendered behind the drawer panel. */\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Drawer content panel that slides in from the configured direction. Includes a drag handle for bottom drawers. */\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content bg-background fixed z-50 flex h-auto flex-col\",\n \"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n \"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n \"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n \"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n className,\n )}\n {...props}\n >\n <div className=\"bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\n/** Container for DrawerTitle and DrawerDescription at the top of the drawer. */\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\"flex flex-col gap-1.5 p-6\", className)}\n {...props}\n />\n );\n}\n\n/** Scrollable body area for drawer content. Always wrap main content in this component. */\nfunction DrawerBody({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-body\"\n className={cn(\"flex-1 overflow-y-auto px-6 py-4\", className)}\n {...props}\n />\n );\n}\n\n/** Container for action buttons at the bottom of the drawer. Pushed to the bottom via `mt-auto`. */\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-6\", className)}\n {...props}\n />\n );\n}\n\n/** Accessible title rendered inside DrawerHeader. */\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n );\n}\n\n/** Accessible description rendered inside DrawerHeader below the title. */\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerBody,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n};"]}
@@ -0,0 +1,77 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { cva } from 'class-variance-authority';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var badgeVariants = cva(
7
+ "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ // Solid — color applied via compoundVariants
12
+ default: "",
13
+ // Legacy — maps to solid + destructive color (backward compatible)
14
+ destructive: "",
15
+ // Color-independent
16
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
17
+ // Color-aware — applied via compoundVariants
18
+ outline: "",
19
+ soft: ""
20
+ },
21
+ color: {
22
+ primary: "",
23
+ destructive: "",
24
+ success: "",
25
+ warning: "",
26
+ info: ""
27
+ }
28
+ },
29
+ compoundVariants: [
30
+ // ── Solid (default variant) × color ──
31
+ { variant: "default", color: "primary", className: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90" },
32
+ { variant: "default", color: "destructive", className: "border-transparent bg-destructive text-destructive-foreground [a&]:hover:bg-destructive/90" },
33
+ { variant: "default", color: "success", className: "border-transparent bg-success text-success-foreground [a&]:hover:bg-success/90" },
34
+ { variant: "default", color: "warning", className: "border-transparent bg-warning text-warning-foreground [a&]:hover:bg-warning/90" },
35
+ { variant: "default", color: "info", className: "border-transparent bg-info text-info-foreground [a&]:hover:bg-info/90" },
36
+ // ── Legacy destructive variant (backward compat) ──
37
+ { variant: "destructive", className: "border-transparent bg-destructive text-destructive-foreground [a&]:hover:bg-destructive/90" },
38
+ // ── Outline × color ──
39
+ { variant: "outline", color: "primary", className: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground" },
40
+ { variant: "outline", color: "destructive", className: "border-destructive/50 text-destructive [a&]:hover:bg-destructive/10" },
41
+ { variant: "outline", color: "success", className: "border-success/50 text-success [a&]:hover:bg-success/10" },
42
+ { variant: "outline", color: "warning", className: "border-warning/50 text-warning [a&]:hover:bg-warning/10" },
43
+ { variant: "outline", color: "info", className: "border-info/50 text-info [a&]:hover:bg-info/10" },
44
+ // ── Soft × color ──
45
+ { variant: "soft", color: "primary", className: "border-transparent bg-primary/10 text-primary [a&]:hover:bg-primary/20" },
46
+ { variant: "soft", color: "destructive", className: "border-transparent bg-destructive/10 text-destructive [a&]:hover:bg-destructive/20" },
47
+ { variant: "soft", color: "success", className: "border-transparent bg-success/10 text-success [a&]:hover:bg-success/20" },
48
+ { variant: "soft", color: "warning", className: "border-transparent bg-warning/10 text-warning [a&]:hover:bg-warning/20" },
49
+ { variant: "soft", color: "info", className: "border-transparent bg-info/10 text-info [a&]:hover:bg-info/20" }
50
+ ],
51
+ defaultVariants: {
52
+ variant: "default",
53
+ color: "primary"
54
+ }
55
+ }
56
+ );
57
+ function Badge({
58
+ className,
59
+ variant,
60
+ color,
61
+ asChild = false,
62
+ ...props
63
+ }) {
64
+ const Comp = asChild ? Slot : "span";
65
+ return /* @__PURE__ */ jsx(
66
+ Comp,
67
+ {
68
+ "data-slot": "badge",
69
+ className: cn(badgeVariants({ variant, color }), className),
70
+ ...props
71
+ }
72
+ );
73
+ }
74
+
75
+ export { Badge, badgeVariants };
76
+ //# sourceMappingURL=chunk-A3BB5ZOC.js.map
77
+ //# sourceMappingURL=chunk-A3BB5ZOC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/badge.tsx"],"names":[],"mappings":"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","file":"chunk-A3BB5ZOC.js","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\nimport type { UIColor } from \"../lib/types\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n // Solid — color applied via compoundVariants\n default: \"\",\n // Legacy — maps to solid + destructive color (backward compatible)\n destructive: \"\",\n // Color-independent\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n // Color-aware — applied via compoundVariants\n outline: \"\",\n soft: \"\",\n },\n color: {\n primary: \"\",\n destructive: \"\",\n success: \"\",\n warning: \"\",\n info: \"\",\n },\n },\n compoundVariants: [\n // ── Solid (default variant) × color ──\n { variant: \"default\", color: \"primary\", className: \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\" },\n { variant: \"default\", color: \"destructive\", className: \"border-transparent bg-destructive text-destructive-foreground [a&]:hover:bg-destructive/90\" },\n { variant: \"default\", color: \"success\", className: \"border-transparent bg-success text-success-foreground [a&]:hover:bg-success/90\" },\n { variant: \"default\", color: \"warning\", className: \"border-transparent bg-warning text-warning-foreground [a&]:hover:bg-warning/90\" },\n { variant: \"default\", color: \"info\", className: \"border-transparent bg-info text-info-foreground [a&]:hover:bg-info/90\" },\n\n // ── Legacy destructive variant (backward compat) ──\n { variant: \"destructive\", className: \"border-transparent bg-destructive text-destructive-foreground [a&]:hover:bg-destructive/90\" },\n\n // ── Outline × color ──\n { variant: \"outline\", color: \"primary\", className: \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\" },\n { variant: \"outline\", color: \"destructive\", className: \"border-destructive/50 text-destructive [a&]:hover:bg-destructive/10\" },\n { variant: \"outline\", color: \"success\", className: \"border-success/50 text-success [a&]:hover:bg-success/10\" },\n { variant: \"outline\", color: \"warning\", className: \"border-warning/50 text-warning [a&]:hover:bg-warning/10\" },\n { variant: \"outline\", color: \"info\", className: \"border-info/50 text-info [a&]:hover:bg-info/10\" },\n\n // ── Soft × color ──\n { variant: \"soft\", color: \"primary\", className: \"border-transparent bg-primary/10 text-primary [a&]:hover:bg-primary/20\" },\n { variant: \"soft\", color: \"destructive\", className: \"border-transparent bg-destructive/10 text-destructive [a&]:hover:bg-destructive/20\" },\n { variant: \"soft\", color: \"success\", className: \"border-transparent bg-success/10 text-success [a&]:hover:bg-success/20\" },\n { variant: \"soft\", color: \"warning\", className: \"border-transparent bg-warning/10 text-warning [a&]:hover:bg-warning/20\" },\n { variant: \"soft\", color: \"info\", className: \"border-transparent bg-info/10 text-info [a&]:hover:bg-info/20\" },\n ],\n defaultVariants: {\n variant: \"default\",\n color: \"primary\",\n },\n },\n);\n\ninterface BadgeProps\n extends React.ComponentProps<\"span\">,\n Omit<VariantProps<typeof badgeVariants>, \"color\"> {\n /**\n * Semantic color intent.\n *\n * @default \"primary\"\n * @example\n * ```tsx\n * <Badge color=\"success\">Done</Badge>\n * <Badge color=\"warning\">Pending</Badge>\n * <Badge variant=\"soft\" color=\"destructive\">Failed</Badge>\n * ```\n */\n color?: UIColor;\n /** Render as a child component using Radix Slot. @default false */\n asChild?: boolean;\n}\n\n/**\n * Inline status descriptor with semantic colors and visual variants.\n *\n * @example\n * ```tsx\n * // Solid (default)\n * <Badge>New</Badge>\n * <Badge color=\"success\">Done</Badge>\n * <Badge color=\"warning\">Pending</Badge>\n *\n * // Soft (light tinted background)\n * <Badge variant=\"soft\" color=\"success\">Approved</Badge>\n * <Badge variant=\"soft\" color=\"destructive\">Rejected</Badge>\n *\n * // Outline\n * <Badge variant=\"outline\">v1.0.0</Badge>\n * <Badge variant=\"outline\" color=\"info\">Beta</Badge>\n *\n * // Legacy (still works)\n * <Badge variant=\"destructive\">Error</Badge>\n * <Badge variant=\"secondary\">Draft</Badge>\n * ```\n */\nfunction Badge({\n className,\n variant,\n color,\n asChild = false,\n ...props\n}: BadgeProps) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant, color }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\nexport type { BadgeProps };\n"]}
@@ -0,0 +1,106 @@
1
+ import { Badge } from './chunk-A3BB5ZOC.js';
2
+ import { cn } from './chunk-DGPY4WP3.js';
3
+ import { useState } from 'react';
4
+ import { ChevronRight, MapPin, GitBranch, Building2, Globe } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var DEFAULT_ICON_MAP = {
8
+ global: Globe,
9
+ organization: Building2,
10
+ branch: GitBranch,
11
+ location: MapPin
12
+ };
13
+ function getIcon(type, iconMap) {
14
+ if (iconMap?.[type]) return iconMap[type];
15
+ return DEFAULT_ICON_MAP[type] ?? Globe;
16
+ }
17
+ function ScopeTree({
18
+ nodes,
19
+ selectedScope,
20
+ onSelect,
21
+ defaultExpandDepth = 1,
22
+ iconMap
23
+ }) {
24
+ return /* @__PURE__ */ jsx("div", { className: "space-y-1", children: nodes.map((node) => /* @__PURE__ */ jsx(
25
+ ScopeTreeNodeItem,
26
+ {
27
+ node,
28
+ selectedScope,
29
+ onSelect,
30
+ depth: 0,
31
+ defaultExpandDepth,
32
+ iconMap
33
+ },
34
+ `${node.type}-${node.id}`
35
+ )) });
36
+ }
37
+ function ScopeTreeNodeItem({
38
+ node,
39
+ selectedScope,
40
+ onSelect,
41
+ depth,
42
+ defaultExpandDepth,
43
+ iconMap
44
+ }) {
45
+ const [open, setOpen] = useState(depth < defaultExpandDepth);
46
+ const Icon = getIcon(node.type, iconMap);
47
+ const isSelected = selectedScope?.type === node.type && selectedScope?.id === node.id;
48
+ const children = node.children ?? [];
49
+ const hasChildren = children.length > 0;
50
+ const paddingLeft = depth * 16;
51
+ return /* @__PURE__ */ jsxs("div", { children: [
52
+ /* @__PURE__ */ jsxs(
53
+ "button",
54
+ {
55
+ type: "button",
56
+ className: cn(
57
+ "w-full flex items-center gap-2 px-3 py-2 rounded-md text-sm transition-colors text-left",
58
+ isSelected ? "bg-accent text-accent-foreground font-medium" : "hover:bg-accent/50 text-foreground"
59
+ ),
60
+ style: { paddingLeft: `${paddingLeft + 12}px` },
61
+ onClick: () => {
62
+ onSelect?.({ type: node.type, id: node.id });
63
+ if (hasChildren) setOpen((prev) => !prev);
64
+ },
65
+ children: [
66
+ hasChildren ? /* @__PURE__ */ jsx(
67
+ ChevronRight,
68
+ {
69
+ className: cn(
70
+ "w-4 h-4 shrink-0 transition-transform",
71
+ open && "rotate-90"
72
+ )
73
+ }
74
+ ) : /* @__PURE__ */ jsx("span", { className: "w-4" }),
75
+ /* @__PURE__ */ jsx(Icon, { className: "w-4 h-4 shrink-0 text-muted-foreground" }),
76
+ /* @__PURE__ */ jsx("span", { className: "truncate flex-1", children: node.name }),
77
+ node.badges?.map((badge, i) => /* @__PURE__ */ jsx(
78
+ Badge,
79
+ {
80
+ variant: "outline",
81
+ className: cn("text-[10px] px-1 py-0", badge.className),
82
+ children: badge.label
83
+ },
84
+ i
85
+ ))
86
+ ]
87
+ }
88
+ ),
89
+ open && hasChildren && /* @__PURE__ */ jsx("div", { children: children.map((child) => /* @__PURE__ */ jsx(
90
+ ScopeTreeNodeItem,
91
+ {
92
+ node: child,
93
+ selectedScope,
94
+ onSelect,
95
+ depth: depth + 1,
96
+ defaultExpandDepth,
97
+ iconMap
98
+ },
99
+ `${child.type}-${child.id}`
100
+ )) })
101
+ ] });
102
+ }
103
+
104
+ export { ScopeTree };
105
+ //# sourceMappingURL=chunk-BAQWGQJG.js.map
106
+ //# sourceMappingURL=chunk-BAQWGQJG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/scope-tree.tsx"],"names":[],"mappings":"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","file":"chunk-BAQWGQJG.js","sourcesContent":["import { useState } from 'react';\nimport { ChevronRight, Globe, Building2, GitBranch, MapPin, type LucideIcon } from 'lucide-react';\nimport { Badge } from './badge';\nimport { cn } from '../lib/utils';\n\n/** A small badge displayed next to a tree node name. */\nexport interface ScopeTreeBadge {\n /** Badge display text. */\n label: string;\n /** Optional className to style this badge. */\n className?: string;\n}\n\n/** A node in the scope tree hierarchy. */\nexport interface ScopeTreeNode {\n /** Unique identifier for this node, or `null` for root/global nodes. */\n id: string | null;\n /** Display name of this scope. */\n name: string;\n /** Scope type key (e.g. \"global\", \"organization\", \"branch\", \"location\"). Determines the icon. */\n type: string;\n /** Optional child nodes for nested hierarchy. */\n children?: ScopeTreeNode[];\n /** Optional badges displayed next to the node name. */\n badges?: ScopeTreeBadge[];\n}\n\n/** Represents the currently selected scope in the tree. */\nexport interface ScopeTreeSelectedScope {\n /** The scope type key of the selected node. */\n type: string;\n /** The ID of the selected node, or `null` for root/global nodes. */\n id: string | null;\n}\n\n/** Localizable labels for the scope tree. Currently reserved for future extensibility. */\nexport interface ScopeTreeLabels {\n /** No labels are required by default; provided for future extensibility. */\n [key: string]: string;\n}\n\nexport interface ScopeTreeProps {\n /** Tree data: an array of root-level scope nodes. */\n nodes: ScopeTreeNode[];\n /** The currently selected scope (type + id). Used for highlighting. */\n selectedScope?: ScopeTreeSelectedScope;\n /** Callback when a node is clicked. */\n onSelect?: (scope: ScopeTreeSelectedScope) => void;\n /** Localizable labels. Currently reserved for future extensibility. */\n labels?: Partial<ScopeTreeLabels>;\n /** Default expansion depth. Nodes at depth < this value start expanded. Defaults to `1`. */\n defaultExpandDepth?: number;\n /** Custom icon map keyed by scope type. Falls back to built-in icons for global/organization/branch/location. */\n iconMap?: Record<string, LucideIcon>;\n}\n\nconst DEFAULT_ICON_MAP: Record<string, LucideIcon> = {\n global: Globe,\n organization: Building2,\n branch: GitBranch,\n location: MapPin,\n};\n\nfunction getIcon(type: string, iconMap?: Record<string, LucideIcon>): LucideIcon {\n if (iconMap?.[type]) return iconMap[type];\n return DEFAULT_ICON_MAP[type] ?? Globe;\n}\n\n/**\n * Hierarchical tree view for selecting organizational scopes (e.g. global,\n * organization, branch, location). Nodes are expandable/collapsible with\n * chevron icons. Each node type has a dedicated icon. Supports custom icons\n * via `iconMap` and optional badges on nodes.\n *\n * @example\n * ```tsx\n * const nodes: ScopeTreeNode[] = [\n * {\n * id: null, name: \"Global\", type: \"global\",\n * children: [\n * { id: \"org-1\", name: \"Acme Corp\", type: \"organization\", children: [\n * { id: \"br-1\", name: \"Tokyo HQ\", type: \"branch\" },\n * ]},\n * ],\n * },\n * ];\n *\n * <ScopeTree\n * nodes={nodes}\n * selectedScope={{ type: \"branch\", id: \"br-1\" }}\n * onSelect={(scope) => setSelected(scope)}\n * />\n * ```\n */\nexport function ScopeTree({\n nodes,\n selectedScope,\n onSelect,\n defaultExpandDepth = 1,\n iconMap,\n}: ScopeTreeProps) {\n return (\n <div className=\"space-y-1\">\n {nodes.map(node => (\n <ScopeTreeNodeItem\n key={`${node.type}-${node.id}`}\n node={node}\n selectedScope={selectedScope}\n onSelect={onSelect}\n depth={0}\n defaultExpandDepth={defaultExpandDepth}\n iconMap={iconMap}\n />\n ))}\n </div>\n );\n}\n\ninterface ScopeTreeNodeItemProps {\n node: ScopeTreeNode;\n selectedScope?: ScopeTreeSelectedScope;\n onSelect?: (scope: ScopeTreeSelectedScope) => void;\n depth: number;\n defaultExpandDepth: number;\n iconMap?: Record<string, LucideIcon>;\n}\n\nfunction ScopeTreeNodeItem({\n node,\n selectedScope,\n onSelect,\n depth,\n defaultExpandDepth,\n iconMap,\n}: ScopeTreeNodeItemProps) {\n const [open, setOpen] = useState(depth < defaultExpandDepth);\n const Icon = getIcon(node.type, iconMap);\n const isSelected =\n selectedScope?.type === node.type && selectedScope?.id === node.id;\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n const paddingLeft = depth * 16;\n\n return (\n <div>\n <button\n type=\"button\"\n className={cn(\n 'w-full flex items-center gap-2 px-3 py-2 rounded-md text-sm transition-colors text-left',\n isSelected\n ? 'bg-accent text-accent-foreground font-medium'\n : 'hover:bg-accent/50 text-foreground',\n )}\n style={{ paddingLeft: `${paddingLeft + 12}px` }}\n onClick={() => {\n onSelect?.({ type: node.type, id: node.id });\n if (hasChildren) setOpen(prev => !prev);\n }}\n >\n {hasChildren ? (\n <ChevronRight\n className={cn(\n 'w-4 h-4 shrink-0 transition-transform',\n open && 'rotate-90',\n )}\n />\n ) : (\n <span className=\"w-4\" />\n )}\n <Icon className=\"w-4 h-4 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1\">{node.name}</span>\n {node.badges?.map((badge, i) => (\n <Badge\n key={i}\n variant=\"outline\"\n className={cn('text-[10px] px-1 py-0', badge.className)}\n >\n {badge.label}\n </Badge>\n ))}\n </button>\n {open && hasChildren && (\n <div>\n {children.map(child => (\n <ScopeTreeNodeItem\n key={`${child.type}-${child.id}`}\n node={child}\n selectedScope={selectedScope}\n onSelect={onSelect}\n depth={depth + 1}\n defaultExpandDepth={defaultExpandDepth}\n iconMap={iconMap}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}