@omnifyjp/ui 1.0.2 → 2.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 (456) hide show
  1. package/dist/{chunk-TJMK2KBE.js → chunk-2BRCVWXR.js} +3 -3
  2. package/dist/chunk-2BRCVWXR.js.map +1 -0
  3. package/dist/{chunk-RQNZDWY3.js → chunk-33QLY6GI.js} +2 -2
  4. package/dist/chunk-33QLY6GI.js.map +1 -0
  5. package/dist/{chunk-NPL2R5LD.js → chunk-3V6NS4EQ.js} +5 -5
  6. package/dist/chunk-3V6NS4EQ.js.map +1 -0
  7. package/dist/{chunk-G7HTZBUR.js → chunk-47TUWE63.js} +3 -3
  8. package/dist/chunk-47TUWE63.js.map +1 -0
  9. package/dist/{chunk-75WZR6HF.js → chunk-4AGNE75K.js} +4 -4
  10. package/dist/chunk-4AGNE75K.js.map +1 -0
  11. package/dist/chunk-4NBDYSSQ.js +90 -0
  12. package/dist/chunk-4NBDYSSQ.js.map +1 -0
  13. package/dist/{chunk-FRKG7JQY.js → chunk-5AGUCELC.js} +2 -2
  14. package/dist/chunk-5AGUCELC.js.map +1 -0
  15. package/dist/{chunk-A3BB5ZOC.js → chunk-5SAUUOCN.js} +2 -2
  16. package/dist/chunk-5SAUUOCN.js.map +1 -0
  17. package/dist/{chunk-2TUWDXAC.js → chunk-5WOCEAZG.js} +3 -3
  18. package/dist/chunk-5WOCEAZG.js.map +1 -0
  19. package/dist/{chunk-2C2HRGM7.js → chunk-6W5FYOXQ.js} +3 -3
  20. package/dist/chunk-6W5FYOXQ.js.map +1 -0
  21. package/dist/{chunk-ZHEKDP5X.js → chunk-6Z6NRIQ2.js} +3 -3
  22. package/dist/chunk-6Z6NRIQ2.js.map +1 -0
  23. package/dist/{chunk-BAQWGQJG.js → chunk-7KZ7CVRN.js} +3 -3
  24. package/dist/chunk-7KZ7CVRN.js.map +1 -0
  25. package/dist/{chunk-C34KSTWA.js → chunk-7NMNLY7F.js} +2 -2
  26. package/dist/chunk-7NMNLY7F.js.map +1 -0
  27. package/dist/{chunk-55E7D2HR.js → chunk-BOV3Q2JH.js} +2 -2
  28. package/dist/chunk-BOV3Q2JH.js.map +1 -0
  29. package/dist/{chunk-34ARZSNP.js → chunk-CECQY5LL.js} +2 -2
  30. package/dist/chunk-CECQY5LL.js.map +1 -0
  31. package/dist/{chunk-JRU2QX7T.js → chunk-CLYBVDEQ.js} +2 -2
  32. package/dist/chunk-CLYBVDEQ.js.map +1 -0
  33. package/dist/{chunk-TGYQ3AKH.js → chunk-CNS3OMZ7.js} +2 -2
  34. package/dist/chunk-CNS3OMZ7.js.map +1 -0
  35. package/dist/{chunk-C5NZAOA7.js → chunk-CSYH7P6N.js} +2 -2
  36. package/dist/chunk-CSYH7P6N.js.map +1 -0
  37. package/dist/{chunk-USIHM7FV.js → chunk-DEKVLLTL.js} +2 -2
  38. package/dist/chunk-DEKVLLTL.js.map +1 -0
  39. package/dist/{chunk-Z2QAABLM.js → chunk-DXKFFJIE.js} +2 -2
  40. package/dist/chunk-DXKFFJIE.js.map +1 -0
  41. package/dist/{chunk-IAWKX5W4.js → chunk-DXZZURPN.js} +2 -2
  42. package/dist/chunk-DXZZURPN.js.map +1 -0
  43. package/dist/{chunk-XOJJBNDX.js → chunk-EAY3QSID.js} +2 -2
  44. package/dist/chunk-EAY3QSID.js.map +1 -0
  45. package/dist/{chunk-7XH3MGBR.js → chunk-EBV2XEHD.js} +5 -5
  46. package/dist/chunk-EBV2XEHD.js.map +1 -0
  47. package/dist/{chunk-P3M5TZD2.js → chunk-EYJ7TJIX.js} +2 -2
  48. package/dist/chunk-EYJ7TJIX.js.map +1 -0
  49. package/dist/{chunk-67YUL2ZS.js → chunk-FTNPOZGK.js} +2 -2
  50. package/dist/chunk-FTNPOZGK.js.map +1 -0
  51. package/dist/{chunk-JXGRW2MR.js → chunk-GR7T5QHL.js} +2 -2
  52. package/dist/chunk-GR7T5QHL.js.map +1 -0
  53. package/dist/{chunk-WS6E7HBT.js → chunk-HDTHGIQR.js} +3 -3
  54. package/dist/chunk-HDTHGIQR.js.map +1 -0
  55. package/dist/{chunk-LMT327XH.js → chunk-HEQVBUJO.js} +2 -2
  56. package/dist/chunk-HEQVBUJO.js.map +1 -0
  57. package/dist/{chunk-VVYSAGB3.js → chunk-I6PJSYBI.js} +3 -3
  58. package/dist/chunk-I6PJSYBI.js.map +1 -0
  59. package/dist/{chunk-35DNN46W.js → chunk-ITTPI2Z3.js} +3 -3
  60. package/dist/chunk-ITTPI2Z3.js.map +1 -0
  61. package/dist/{chunk-JAJMM32I.js → chunk-IXEPDTUE.js} +3 -3
  62. package/dist/chunk-IXEPDTUE.js.map +1 -0
  63. package/dist/{chunk-PGWNOZDX.js → chunk-KCUSO3CK.js} +2 -2
  64. package/dist/chunk-KCUSO3CK.js.map +1 -0
  65. package/dist/{chunk-QB3UWRZH.js → chunk-KJAXKHJ2.js} +3 -3
  66. package/dist/chunk-KJAXKHJ2.js.map +1 -0
  67. package/dist/{chunk-7IRLBU2I.js → chunk-LA4L3QIK.js} +3 -3
  68. package/dist/chunk-LA4L3QIK.js.map +1 -0
  69. package/dist/{chunk-NNJTKHCE.js → chunk-LTGCKJX7.js} +2 -2
  70. package/dist/chunk-LTGCKJX7.js.map +1 -0
  71. package/dist/{chunk-JJSVA3TH.js → chunk-LUYTKHGS.js} +2 -2
  72. package/dist/chunk-LUYTKHGS.js.map +1 -0
  73. package/dist/{chunk-6GWVQB3Q.js → chunk-MVYSUWSD.js} +3 -3
  74. package/dist/chunk-MVYSUWSD.js.map +1 -0
  75. package/dist/{chunk-YBMEQZX7.js → chunk-N5BNNKBR.js} +2 -2
  76. package/dist/chunk-N5BNNKBR.js.map +1 -0
  77. package/dist/{chunk-35U6QG4P.js → chunk-N6OUJIQD.js} +2 -2
  78. package/dist/chunk-N6OUJIQD.js.map +1 -0
  79. package/dist/{chunk-R2CDE5DO.js → chunk-NWVMNWOH.js} +2 -2
  80. package/dist/chunk-NWVMNWOH.js.map +1 -0
  81. package/dist/{chunk-NU56GKGM.js → chunk-ORTPKXBI.js} +2 -2
  82. package/dist/chunk-ORTPKXBI.js.map +1 -0
  83. package/dist/{chunk-FLWMT4DB.js → chunk-PJZ7D36X.js} +2 -2
  84. package/dist/chunk-PJZ7D36X.js.map +1 -0
  85. package/dist/{chunk-CUZR4JWM.js → chunk-PYB6RRA5.js} +3 -3
  86. package/dist/chunk-PYB6RRA5.js.map +1 -0
  87. package/dist/{chunk-BRSM3SZP.js → chunk-QGU4BRMO.js} +2 -2
  88. package/dist/chunk-QGU4BRMO.js.map +1 -0
  89. package/dist/{chunk-S6PDRGR5.js → chunk-RZZH57ZL.js} +2 -2
  90. package/dist/chunk-RZZH57ZL.js.map +1 -0
  91. package/dist/{chunk-EWBCV7VA.js → chunk-S73PGQD5.js} +2 -2
  92. package/dist/chunk-S73PGQD5.js.map +1 -0
  93. package/dist/{chunk-N47H4MHX.js → chunk-SAHHVJMQ.js} +3 -3
  94. package/dist/chunk-SAHHVJMQ.js.map +1 -0
  95. package/dist/{chunk-INLM7UJC.js → chunk-T65EBJUJ.js} +2 -2
  96. package/dist/chunk-T65EBJUJ.js.map +1 -0
  97. package/dist/{chunk-ZPMXRW2A.js → chunk-TPBRGO4D.js} +3 -3
  98. package/dist/chunk-TPBRGO4D.js.map +1 -0
  99. package/dist/{chunk-MJLFJPUG.js → chunk-V3S2AZKJ.js} +5 -5
  100. package/dist/chunk-V3S2AZKJ.js.map +1 -0
  101. package/dist/{chunk-MZ2P566X.js → chunk-VATNOBZ2.js} +3 -3
  102. package/dist/chunk-VATNOBZ2.js.map +1 -0
  103. package/dist/{chunk-JLTBUACL.js → chunk-VOLR236J.js} +2 -2
  104. package/dist/chunk-VOLR236J.js.map +1 -0
  105. package/dist/chunk-VPTIRPZW.js +75 -0
  106. package/dist/chunk-VPTIRPZW.js.map +1 -0
  107. package/dist/{chunk-WL4ZO2H3.js → chunk-W477ZR6B.js} +2 -2
  108. package/dist/chunk-W477ZR6B.js.map +1 -0
  109. package/dist/{chunk-3EOHW4QN.js → chunk-WJX6NKKF.js} +3 -3
  110. package/dist/chunk-WJX6NKKF.js.map +1 -0
  111. package/dist/{chunk-LTTNCAAA.js → chunk-XNUFKQYL.js} +3 -3
  112. package/dist/chunk-XNUFKQYL.js.map +1 -0
  113. package/dist/chunk-YN26HHZ4.js +71 -0
  114. package/dist/chunk-YN26HHZ4.js.map +1 -0
  115. package/dist/{chunk-ZYEGBF7G.js → chunk-YU23NDE4.js} +3 -3
  116. package/dist/chunk-YU23NDE4.js.map +1 -0
  117. package/dist/chunk-YU55YBID.js +144 -0
  118. package/dist/chunk-YU55YBID.js.map +1 -0
  119. package/dist/{chunk-F2ZJLKDP.js → chunk-YVCLIOMM.js} +2 -2
  120. package/dist/chunk-YVCLIOMM.js.map +1 -0
  121. package/dist/{chunk-7RMTPT6O.js → chunk-YYJVVYFS.js} +2 -2
  122. package/dist/chunk-YYJVVYFS.js.map +1 -0
  123. package/dist/chunk-ZUBW2ERW.js +70 -0
  124. package/dist/chunk-ZUBW2ERW.js.map +1 -0
  125. package/dist/components/display/accordion.js +4 -0
  126. package/dist/components/display/aspect-ratio.js +3 -0
  127. package/dist/components/display/avatar.js +4 -0
  128. package/dist/components/{badge.d.ts → display/badge.d.ts} +1 -1
  129. package/dist/components/display/badge.js +4 -0
  130. package/dist/components/display/card.js +4 -0
  131. package/dist/components/{carousel.d.ts → display/carousel.d.ts} +2 -2
  132. package/dist/components/display/carousel.js +5 -0
  133. package/dist/components/{chart.js → display/chart.js} +1 -1
  134. package/dist/components/display/chart.js.map +1 -0
  135. package/dist/components/{collapsible.js → display/collapsible.js} +1 -1
  136. package/dist/components/display/resizable.js +4 -0
  137. package/dist/components/display/scroll-area.js +4 -0
  138. package/dist/components/display/separator.js +4 -0
  139. package/dist/components/display/table.js +4 -0
  140. package/dist/components/display/toggle-group.js +5 -0
  141. package/dist/components/display/toggle.js +4 -0
  142. package/dist/components/domain/calendar/calendar-category-badge.js +5 -0
  143. package/dist/components/{calendar-event-chip.js → domain/calendar/calendar-event-chip.js} +1 -1
  144. package/dist/components/domain/calendar/calendar-event-chip.js.map +1 -0
  145. package/dist/components/{calendar-event-sheet.d.ts → domain/calendar/calendar-event-sheet.d.ts} +4 -1
  146. package/dist/components/{calendar-event-sheet.js → domain/calendar/calendar-event-sheet.js} +12 -8
  147. package/dist/components/domain/calendar/calendar-event-sheet.js.map +1 -0
  148. package/dist/components/{calendar-mini.d.ts → domain/calendar/calendar-mini.d.ts} +4 -1
  149. package/dist/components/{calendar-mini.js → domain/calendar/calendar-mini.js} +9 -5
  150. package/dist/components/domain/calendar/calendar-mini.js.map +1 -0
  151. package/dist/components/{calendar-toolbar.d.ts → domain/calendar/calendar-toolbar.d.ts} +4 -1
  152. package/dist/components/{calendar-toolbar.js → domain/calendar/calendar-toolbar.js} +10 -6
  153. package/dist/components/domain/calendar/calendar-toolbar.js.map +1 -0
  154. package/dist/components/domain/calendar/calendar.js +5 -0
  155. package/dist/components/domain/rbac/permission-grid.js +5 -0
  156. package/dist/components/domain/rbac/scope-tree.js +5 -0
  157. package/dist/components/domain/rbac/scope-type-badge.js +5 -0
  158. package/dist/components/domain/workflow/stage-type-badge.js +5 -0
  159. package/dist/components/domain/workflow/workflow-category-badge.js +5 -0
  160. package/dist/components/domain/workflow/workflow-diagram.js +5 -0
  161. package/dist/components/domain/workflow/workflow-status-badge.js +5 -0
  162. package/dist/components/domain/workflow/workflow-stepper.js +4 -0
  163. package/dist/components/{alert.d.ts → feedback/alert.d.ts} +1 -1
  164. package/dist/components/feedback/alert.js +4 -0
  165. package/dist/components/feedback/progress.js +4 -0
  166. package/dist/components/feedback/skeleton.js +4 -0
  167. package/dist/components/{button.d.ts → inputs/button.d.ts} +2 -2
  168. package/dist/components/inputs/button.js +4 -0
  169. package/dist/components/inputs/checkbox.js +4 -0
  170. package/dist/components/inputs/color-picker.js +9 -0
  171. package/dist/components/inputs/combobox.js +8 -0
  172. package/dist/components/{date-picker.d.ts → inputs/date-picker.d.ts} +2 -2
  173. package/dist/components/{date-picker.js → inputs/date-picker.js} +15 -8
  174. package/dist/components/inputs/date-picker.js.map +1 -0
  175. package/dist/components/inputs/file-upload.js +5 -0
  176. package/dist/components/{form.js → inputs/form.js} +2 -2
  177. package/dist/components/inputs/form.js.map +1 -0
  178. package/dist/components/inputs/input-otp.js +4 -0
  179. package/dist/components/inputs/input.d.ts +75 -0
  180. package/dist/components/inputs/input.js +6 -0
  181. package/dist/components/inputs/label.js +4 -0
  182. package/dist/components/{password-input.d.ts → inputs/password-input.d.ts} +2 -0
  183. package/dist/components/inputs/password-input.js +7 -0
  184. package/dist/components/inputs/radio-group.js +4 -0
  185. package/dist/components/inputs/rating.js +4 -0
  186. package/dist/components/{select.js → inputs/select.js} +2 -2
  187. package/dist/components/inputs/slider.js +4 -0
  188. package/dist/components/inputs/slug-input.js +8 -0
  189. package/dist/components/inputs/switch.js +4 -0
  190. package/dist/components/inputs/tag-input.js +5 -0
  191. package/dist/components/inputs/textarea.d.ts +67 -0
  192. package/dist/components/inputs/textarea.js +6 -0
  193. package/dist/{chunk-6DIDQ4TB.js → components/inputs/time-picker.js} +9 -7
  194. package/dist/components/inputs/time-picker.js.map +1 -0
  195. package/dist/components/inputs/translatable-field.d.ts +51 -0
  196. package/dist/components/inputs/translatable-field.js +4 -0
  197. package/dist/components/inputs/translatable-field.js.map +1 -0
  198. package/dist/components/layout/page-container.d.ts +96 -0
  199. package/dist/components/layout/page-container.js +5 -0
  200. package/dist/components/layout/page-container.js.map +1 -0
  201. package/dist/components/{breadcrumb.js → navigation/breadcrumb.js} +2 -2
  202. package/dist/components/{command.d.ts → navigation/command.d.ts} +1 -1
  203. package/dist/components/{command.js → navigation/command.js} +3 -3
  204. package/dist/components/{context-menu.js → navigation/context-menu.js} +2 -2
  205. package/dist/components/{dropdown-menu.js → navigation/dropdown-menu.js} +2 -2
  206. package/dist/components/{menubar.js → navigation/menubar.js} +2 -2
  207. package/dist/components/{navigation-menu.js → navigation/navigation-menu.js} +2 -2
  208. package/dist/components/{pagination.d.ts → navigation/pagination.d.ts} +2 -2
  209. package/dist/components/{pagination.js → navigation/pagination.js} +3 -3
  210. package/dist/components/navigation/tabs.js +4 -0
  211. package/dist/components/{alert-dialog.js → overlay/alert-dialog.js} +3 -3
  212. package/dist/components/{dialog.js → overlay/dialog.js} +2 -2
  213. package/dist/components/{drawer.js → overlay/drawer.js} +2 -2
  214. package/dist/components/{hover-card.js → overlay/hover-card.js} +2 -2
  215. package/dist/components/overlay/popover.js +4 -0
  216. package/dist/components/overlay/sheet.js +4 -0
  217. package/dist/components/overlay/sonner.js +3 -0
  218. package/dist/components/overlay/tooltip.js +4 -0
  219. package/dist/index.d.ts +84 -83
  220. package/dist/index.js +62 -60
  221. package/dist/providers/ui-provider.d.ts +96 -0
  222. package/dist/providers/ui-provider.js +3 -0
  223. package/dist/providers/ui-provider.js.map +1 -0
  224. package/package.json +13 -8
  225. package/dist/chunk-2C2HRGM7.js.map +0 -1
  226. package/dist/chunk-2TUWDXAC.js.map +0 -1
  227. package/dist/chunk-34ARZSNP.js.map +0 -1
  228. package/dist/chunk-35DNN46W.js.map +0 -1
  229. package/dist/chunk-35U6QG4P.js.map +0 -1
  230. package/dist/chunk-3EOHW4QN.js.map +0 -1
  231. package/dist/chunk-3VU56V66.js +0 -41
  232. package/dist/chunk-3VU56V66.js.map +0 -1
  233. package/dist/chunk-55E7D2HR.js.map +0 -1
  234. package/dist/chunk-67YUL2ZS.js.map +0 -1
  235. package/dist/chunk-6DIDQ4TB.js.map +0 -1
  236. package/dist/chunk-6GWVQB3Q.js.map +0 -1
  237. package/dist/chunk-75WZR6HF.js.map +0 -1
  238. package/dist/chunk-7IRLBU2I.js.map +0 -1
  239. package/dist/chunk-7RMTPT6O.js.map +0 -1
  240. package/dist/chunk-7XH3MGBR.js.map +0 -1
  241. package/dist/chunk-A3BB5ZOC.js.map +0 -1
  242. package/dist/chunk-BAQWGQJG.js.map +0 -1
  243. package/dist/chunk-BRSM3SZP.js.map +0 -1
  244. package/dist/chunk-C34KSTWA.js.map +0 -1
  245. package/dist/chunk-C5NZAOA7.js.map +0 -1
  246. package/dist/chunk-CUZR4JWM.js.map +0 -1
  247. package/dist/chunk-EWBCV7VA.js.map +0 -1
  248. package/dist/chunk-F2ZJLKDP.js.map +0 -1
  249. package/dist/chunk-FLWMT4DB.js.map +0 -1
  250. package/dist/chunk-FRKG7JQY.js.map +0 -1
  251. package/dist/chunk-G7HTZBUR.js.map +0 -1
  252. package/dist/chunk-IAWKX5W4.js.map +0 -1
  253. package/dist/chunk-INLM7UJC.js.map +0 -1
  254. package/dist/chunk-JAJMM32I.js.map +0 -1
  255. package/dist/chunk-JJSVA3TH.js.map +0 -1
  256. package/dist/chunk-JLTBUACL.js.map +0 -1
  257. package/dist/chunk-JRU2QX7T.js.map +0 -1
  258. package/dist/chunk-JXGRW2MR.js.map +0 -1
  259. package/dist/chunk-LMT327XH.js.map +0 -1
  260. package/dist/chunk-LTTNCAAA.js.map +0 -1
  261. package/dist/chunk-MJLFJPUG.js.map +0 -1
  262. package/dist/chunk-MZ2P566X.js.map +0 -1
  263. package/dist/chunk-N47H4MHX.js.map +0 -1
  264. package/dist/chunk-NNJTKHCE.js.map +0 -1
  265. package/dist/chunk-NPL2R5LD.js.map +0 -1
  266. package/dist/chunk-NU56GKGM.js.map +0 -1
  267. package/dist/chunk-P3M5TZD2.js.map +0 -1
  268. package/dist/chunk-PGWNOZDX.js.map +0 -1
  269. package/dist/chunk-QB3UWRZH.js.map +0 -1
  270. package/dist/chunk-R2CDE5DO.js.map +0 -1
  271. package/dist/chunk-RQNZDWY3.js.map +0 -1
  272. package/dist/chunk-S6PDRGR5.js.map +0 -1
  273. package/dist/chunk-TGYQ3AKH.js.map +0 -1
  274. package/dist/chunk-TJMK2KBE.js.map +0 -1
  275. package/dist/chunk-USIHM7FV.js.map +0 -1
  276. package/dist/chunk-VVYSAGB3.js.map +0 -1
  277. package/dist/chunk-WD5KZE25.js +0 -25
  278. package/dist/chunk-WD5KZE25.js.map +0 -1
  279. package/dist/chunk-WL4ZO2H3.js.map +0 -1
  280. package/dist/chunk-WS6E7HBT.js.map +0 -1
  281. package/dist/chunk-XOJJBNDX.js.map +0 -1
  282. package/dist/chunk-YBMEQZX7.js.map +0 -1
  283. package/dist/chunk-Z2QAABLM.js.map +0 -1
  284. package/dist/chunk-ZHEKDP5X.js.map +0 -1
  285. package/dist/chunk-ZPMXRW2A.js.map +0 -1
  286. package/dist/chunk-ZYEGBF7G.js.map +0 -1
  287. package/dist/components/accordion.js +0 -4
  288. package/dist/components/alert.js +0 -4
  289. package/dist/components/aspect-ratio.js +0 -3
  290. package/dist/components/avatar.js +0 -4
  291. package/dist/components/badge.js +0 -4
  292. package/dist/components/button.js +0 -4
  293. package/dist/components/calendar-category-badge.js +0 -5
  294. package/dist/components/calendar-event-chip.js.map +0 -1
  295. package/dist/components/calendar-event-sheet.js.map +0 -1
  296. package/dist/components/calendar-mini.js.map +0 -1
  297. package/dist/components/calendar-toolbar.js.map +0 -1
  298. package/dist/components/calendar.js +0 -5
  299. package/dist/components/card.js +0 -4
  300. package/dist/components/carousel.js +0 -5
  301. package/dist/components/chart.js.map +0 -1
  302. package/dist/components/checkbox.js +0 -4
  303. package/dist/components/color-picker.js +0 -7
  304. package/dist/components/combobox.js +0 -8
  305. package/dist/components/date-picker.js.map +0 -1
  306. package/dist/components/file-upload.js +0 -5
  307. package/dist/components/form.js.map +0 -1
  308. package/dist/components/input-otp.js +0 -4
  309. package/dist/components/input.d.ts +0 -38
  310. package/dist/components/input.js +0 -4
  311. package/dist/components/label.js +0 -4
  312. package/dist/components/password-input.js +0 -5
  313. package/dist/components/permission-grid.js +0 -5
  314. package/dist/components/popover.js +0 -4
  315. package/dist/components/progress.js +0 -4
  316. package/dist/components/radio-group.js +0 -4
  317. package/dist/components/rating.js +0 -4
  318. package/dist/components/resizable.js +0 -4
  319. package/dist/components/scope-tree.js +0 -5
  320. package/dist/components/scope-type-badge.js +0 -5
  321. package/dist/components/scroll-area.js +0 -4
  322. package/dist/components/separator.js +0 -4
  323. package/dist/components/sheet.js +0 -4
  324. package/dist/components/skeleton.js +0 -4
  325. package/dist/components/slider.js +0 -4
  326. package/dist/components/slug-input.js +0 -6
  327. package/dist/components/sonner.js +0 -3
  328. package/dist/components/stage-type-badge.js +0 -5
  329. package/dist/components/switch.js +0 -4
  330. package/dist/components/table.js +0 -4
  331. package/dist/components/tabs.js +0 -4
  332. package/dist/components/tag-input.js +0 -5
  333. package/dist/components/textarea.d.ts +0 -21
  334. package/dist/components/textarea.js +0 -4
  335. package/dist/components/time-picker.js +0 -8
  336. package/dist/components/time-picker.js.map +0 -1
  337. package/dist/components/toggle-group.js +0 -5
  338. package/dist/components/toggle.js +0 -4
  339. package/dist/components/tooltip.js +0 -4
  340. package/dist/components/workflow-category-badge.js +0 -5
  341. package/dist/components/workflow-diagram.js +0 -5
  342. package/dist/components/workflow-status-badge.js +0 -5
  343. package/dist/components/workflow-stepper.js +0 -4
  344. /package/dist/components/{accordion.d.ts → display/accordion.d.ts} +0 -0
  345. /package/dist/components/{accordion.js.map → display/accordion.js.map} +0 -0
  346. /package/dist/components/{aspect-ratio.d.ts → display/aspect-ratio.d.ts} +0 -0
  347. /package/dist/components/{aspect-ratio.js.map → display/aspect-ratio.js.map} +0 -0
  348. /package/dist/components/{avatar.d.ts → display/avatar.d.ts} +0 -0
  349. /package/dist/components/{avatar.js.map → display/avatar.js.map} +0 -0
  350. /package/dist/components/{badge.js.map → display/badge.js.map} +0 -0
  351. /package/dist/components/{card.d.ts → display/card.d.ts} +0 -0
  352. /package/dist/components/{card.js.map → display/card.js.map} +0 -0
  353. /package/dist/components/{carousel.js.map → display/carousel.js.map} +0 -0
  354. /package/dist/components/{chart.d.ts → display/chart.d.ts} +0 -0
  355. /package/dist/components/{collapsible.d.ts → display/collapsible.d.ts} +0 -0
  356. /package/dist/components/{collapsible.js.map → display/collapsible.js.map} +0 -0
  357. /package/dist/components/{resizable.d.ts → display/resizable.d.ts} +0 -0
  358. /package/dist/components/{resizable.js.map → display/resizable.js.map} +0 -0
  359. /package/dist/components/{scroll-area.d.ts → display/scroll-area.d.ts} +0 -0
  360. /package/dist/components/{scroll-area.js.map → display/scroll-area.js.map} +0 -0
  361. /package/dist/components/{separator.d.ts → display/separator.d.ts} +0 -0
  362. /package/dist/components/{separator.js.map → display/separator.js.map} +0 -0
  363. /package/dist/components/{table.d.ts → display/table.d.ts} +0 -0
  364. /package/dist/components/{table.js.map → display/table.js.map} +0 -0
  365. /package/dist/components/{toggle-group.d.ts → display/toggle-group.d.ts} +0 -0
  366. /package/dist/components/{toggle-group.js.map → display/toggle-group.js.map} +0 -0
  367. /package/dist/components/{toggle.d.ts → display/toggle.d.ts} +0 -0
  368. /package/dist/components/{toggle.js.map → display/toggle.js.map} +0 -0
  369. /package/dist/components/{calendar-category-badge.d.ts → domain/calendar/calendar-category-badge.d.ts} +0 -0
  370. /package/dist/components/{calendar-category-badge.js.map → domain/calendar/calendar-category-badge.js.map} +0 -0
  371. /package/dist/components/{calendar-event-chip.d.ts → domain/calendar/calendar-event-chip.d.ts} +0 -0
  372. /package/dist/components/{calendar.d.ts → domain/calendar/calendar.d.ts} +0 -0
  373. /package/dist/components/{calendar.js.map → domain/calendar/calendar.js.map} +0 -0
  374. /package/dist/components/{permission-grid.d.ts → domain/rbac/permission-grid.d.ts} +0 -0
  375. /package/dist/components/{permission-grid.js.map → domain/rbac/permission-grid.js.map} +0 -0
  376. /package/dist/components/{scope-tree.d.ts → domain/rbac/scope-tree.d.ts} +0 -0
  377. /package/dist/components/{scope-tree.js.map → domain/rbac/scope-tree.js.map} +0 -0
  378. /package/dist/components/{scope-type-badge.d.ts → domain/rbac/scope-type-badge.d.ts} +0 -0
  379. /package/dist/components/{scope-type-badge.js.map → domain/rbac/scope-type-badge.js.map} +0 -0
  380. /package/dist/components/{stage-type-badge.d.ts → domain/workflow/stage-type-badge.d.ts} +0 -0
  381. /package/dist/components/{stage-type-badge.js.map → domain/workflow/stage-type-badge.js.map} +0 -0
  382. /package/dist/components/{workflow-category-badge.d.ts → domain/workflow/workflow-category-badge.d.ts} +0 -0
  383. /package/dist/components/{workflow-category-badge.js.map → domain/workflow/workflow-category-badge.js.map} +0 -0
  384. /package/dist/components/{workflow-diagram.d.ts → domain/workflow/workflow-diagram.d.ts} +0 -0
  385. /package/dist/components/{workflow-diagram.js.map → domain/workflow/workflow-diagram.js.map} +0 -0
  386. /package/dist/components/{workflow-status-badge.d.ts → domain/workflow/workflow-status-badge.d.ts} +0 -0
  387. /package/dist/components/{workflow-status-badge.js.map → domain/workflow/workflow-status-badge.js.map} +0 -0
  388. /package/dist/components/{workflow-stepper.d.ts → domain/workflow/workflow-stepper.d.ts} +0 -0
  389. /package/dist/components/{workflow-stepper.js.map → domain/workflow/workflow-stepper.js.map} +0 -0
  390. /package/dist/components/{alert.js.map → feedback/alert.js.map} +0 -0
  391. /package/dist/components/{progress.d.ts → feedback/progress.d.ts} +0 -0
  392. /package/dist/components/{progress.js.map → feedback/progress.js.map} +0 -0
  393. /package/dist/components/{skeleton.d.ts → feedback/skeleton.d.ts} +0 -0
  394. /package/dist/components/{skeleton.js.map → feedback/skeleton.js.map} +0 -0
  395. /package/dist/components/{button.js.map → inputs/button.js.map} +0 -0
  396. /package/dist/components/{checkbox.d.ts → inputs/checkbox.d.ts} +0 -0
  397. /package/dist/components/{checkbox.js.map → inputs/checkbox.js.map} +0 -0
  398. /package/dist/components/{color-picker.d.ts → inputs/color-picker.d.ts} +0 -0
  399. /package/dist/components/{color-picker.js.map → inputs/color-picker.js.map} +0 -0
  400. /package/dist/components/{combobox.d.ts → inputs/combobox.d.ts} +0 -0
  401. /package/dist/components/{combobox.js.map → inputs/combobox.js.map} +0 -0
  402. /package/dist/components/{file-upload.d.ts → inputs/file-upload.d.ts} +0 -0
  403. /package/dist/components/{file-upload.js.map → inputs/file-upload.js.map} +0 -0
  404. /package/dist/components/{form.d.ts → inputs/form.d.ts} +0 -0
  405. /package/dist/components/{input-otp.d.ts → inputs/input-otp.d.ts} +0 -0
  406. /package/dist/components/{input-otp.js.map → inputs/input-otp.js.map} +0 -0
  407. /package/dist/components/{input.js.map → inputs/input.js.map} +0 -0
  408. /package/dist/components/{label.d.ts → inputs/label.d.ts} +0 -0
  409. /package/dist/components/{label.js.map → inputs/label.js.map} +0 -0
  410. /package/dist/components/{password-input.js.map → inputs/password-input.js.map} +0 -0
  411. /package/dist/components/{radio-group.d.ts → inputs/radio-group.d.ts} +0 -0
  412. /package/dist/components/{radio-group.js.map → inputs/radio-group.js.map} +0 -0
  413. /package/dist/components/{rating.d.ts → inputs/rating.d.ts} +0 -0
  414. /package/dist/components/{rating.js.map → inputs/rating.js.map} +0 -0
  415. /package/dist/components/{select.d.ts → inputs/select.d.ts} +0 -0
  416. /package/dist/components/{select.js.map → inputs/select.js.map} +0 -0
  417. /package/dist/components/{slider.d.ts → inputs/slider.d.ts} +0 -0
  418. /package/dist/components/{slider.js.map → inputs/slider.js.map} +0 -0
  419. /package/dist/components/{slug-input.d.ts → inputs/slug-input.d.ts} +0 -0
  420. /package/dist/components/{slug-input.js.map → inputs/slug-input.js.map} +0 -0
  421. /package/dist/components/{switch.d.ts → inputs/switch.d.ts} +0 -0
  422. /package/dist/components/{switch.js.map → inputs/switch.js.map} +0 -0
  423. /package/dist/components/{tag-input.d.ts → inputs/tag-input.d.ts} +0 -0
  424. /package/dist/components/{tag-input.js.map → inputs/tag-input.js.map} +0 -0
  425. /package/dist/components/{textarea.js.map → inputs/textarea.js.map} +0 -0
  426. /package/dist/components/{time-picker.d.ts → inputs/time-picker.d.ts} +0 -0
  427. /package/dist/components/{breadcrumb.d.ts → navigation/breadcrumb.d.ts} +0 -0
  428. /package/dist/components/{breadcrumb.js.map → navigation/breadcrumb.js.map} +0 -0
  429. /package/dist/components/{command.js.map → navigation/command.js.map} +0 -0
  430. /package/dist/components/{context-menu.d.ts → navigation/context-menu.d.ts} +0 -0
  431. /package/dist/components/{context-menu.js.map → navigation/context-menu.js.map} +0 -0
  432. /package/dist/components/{dropdown-menu.d.ts → navigation/dropdown-menu.d.ts} +0 -0
  433. /package/dist/components/{dropdown-menu.js.map → navigation/dropdown-menu.js.map} +0 -0
  434. /package/dist/components/{menubar.d.ts → navigation/menubar.d.ts} +0 -0
  435. /package/dist/components/{menubar.js.map → navigation/menubar.js.map} +0 -0
  436. /package/dist/components/{navigation-menu.d.ts → navigation/navigation-menu.d.ts} +0 -0
  437. /package/dist/components/{navigation-menu.js.map → navigation/navigation-menu.js.map} +0 -0
  438. /package/dist/components/{pagination.js.map → navigation/pagination.js.map} +0 -0
  439. /package/dist/components/{tabs.d.ts → navigation/tabs.d.ts} +0 -0
  440. /package/dist/components/{tabs.js.map → navigation/tabs.js.map} +0 -0
  441. /package/dist/components/{alert-dialog.d.ts → overlay/alert-dialog.d.ts} +0 -0
  442. /package/dist/components/{alert-dialog.js.map → overlay/alert-dialog.js.map} +0 -0
  443. /package/dist/components/{dialog.d.ts → overlay/dialog.d.ts} +0 -0
  444. /package/dist/components/{dialog.js.map → overlay/dialog.js.map} +0 -0
  445. /package/dist/components/{drawer.d.ts → overlay/drawer.d.ts} +0 -0
  446. /package/dist/components/{drawer.js.map → overlay/drawer.js.map} +0 -0
  447. /package/dist/components/{hover-card.d.ts → overlay/hover-card.d.ts} +0 -0
  448. /package/dist/components/{hover-card.js.map → overlay/hover-card.js.map} +0 -0
  449. /package/dist/components/{popover.d.ts → overlay/popover.d.ts} +0 -0
  450. /package/dist/components/{popover.js.map → overlay/popover.js.map} +0 -0
  451. /package/dist/components/{sheet.d.ts → overlay/sheet.d.ts} +0 -0
  452. /package/dist/components/{sheet.js.map → overlay/sheet.js.map} +0 -0
  453. /package/dist/components/{sonner.d.ts → overlay/sonner.d.ts} +0 -0
  454. /package/dist/components/{sonner.js.map → overlay/sonner.js.map} +0 -0
  455. /package/dist/components/{tooltip.d.ts → overlay/tooltip.d.ts} +0 -0
  456. /package/dist/components/{tooltip.js.map → overlay/tooltip.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { Checkbox } from './chunk-WL4ZO2H3.js';
1
+ import { Checkbox } from './chunk-W477ZR6B.js';
2
2
  import { cn } from './chunk-DGPY4WP3.js';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
 
@@ -108,5 +108,5 @@ function PermissionGrid({
108
108
  }
109
109
 
110
110
  export { PermissionGrid, buildPermissionId };
111
- //# sourceMappingURL=chunk-TJMK2KBE.js.map
112
- //# sourceMappingURL=chunk-TJMK2KBE.js.map
111
+ //# sourceMappingURL=chunk-2BRCVWXR.js.map
112
+ //# sourceMappingURL=chunk-2BRCVWXR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/domain/rbac/permission-grid.tsx"],"names":[],"mappings":"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","file":"chunk-2BRCVWXR.js","sourcesContent":["import { Checkbox } from '../../inputs/checkbox';\nimport { cn } from '../../../lib/utils';\n\n/** A single permission action (e.g. \"view\", \"create\", \"delete\"). */\nexport interface PermissionDefinition {\n /** Unique key for this permission (e.g. \"view\", \"create\"). Used to build `module:action` IDs. */\n key: string;\n /** Display label shown in the column header. */\n label: string;\n}\n\n/** A module (row) in the permission grid containing its available permission actions. */\nexport interface PermissionModule {\n /** Unique key for this module (e.g. \"users\", \"projects\"). Used to build `module:action` IDs. */\n key: string;\n /** Display label shown in the first column. */\n label: string;\n /** List of permission actions available for this module. */\n permissions: PermissionDefinition[];\n}\n\n/** Localizable labels for the permission grid. */\nexport interface PermissionGridLabels {\n /** Header text for the module name column. */\n moduleHeader: string;\n /** Header text for the \"Select All\" column. */\n selectAll: string;\n}\n\nexport interface PermissionGridProps {\n /** List of modules (rows) to display, each with its available permission actions. */\n modules: PermissionModule[];\n /** Currently selected permission IDs in `module:action` format (e.g. `[\"users:view\", \"users:create\"]`). */\n selectedIds: string[];\n /** Callback with the updated list of selected permission IDs when checkboxes change. */\n onChange?: (ids: string[]) => void;\n /** When true, all checkboxes are disabled and the \"Select All\" column is hidden. Defaults to `false`. */\n readOnly?: boolean;\n /** Localizable UI labels with English defaults. */\n labels?: Partial<PermissionGridLabels>;\n}\n\nconst defaultLabels: PermissionGridLabels = {\n moduleHeader: 'Module',\n selectAll: 'Select All',\n};\n\n/**\n * Builds a permission ID from module key and permission key.\n * Used internally and exposed for consumers to construct IDs.\n */\nexport function buildPermissionId(moduleKey: string, permissionKey: string): string {\n return `${moduleKey}:${permissionKey}`;\n}\n\n/**\n * Collects all unique permission keys across all modules (preserving order).\n */\nfunction collectColumns(modules: PermissionModule[]): string[] {\n const seen = new Set<string>();\n const columns: string[] = [];\n for (const mod of modules) {\n for (const perm of mod.permissions) {\n if (!seen.has(perm.key)) {\n seen.add(perm.key);\n columns.push(perm.key);\n }\n }\n }\n return columns;\n}\n\n/**\n * Gets the label for a column key from the first module that defines it.\n */\nfunction getColumnLabel(modules: PermissionModule[], key: string): string {\n for (const mod of modules) {\n const perm = mod.permissions.find(p => p.key === key);\n if (perm) return perm.label;\n }\n return key;\n}\n\n/**\n * Table-based permission matrix with modules as rows and permission actions\n * as columns. Each cell is a checkbox. Permission IDs use `module:action`\n * format (built via {@link buildPermissionId}). Includes per-row \"Select All\"\n * toggles. Supports read-only mode.\n *\n * @example\n * ```tsx\n * const modules: PermissionModule[] = [\n * { key: \"users\", label: \"Users\", permissions: [\n * { key: \"view\", label: \"View\" },\n * { key: \"create\", label: \"Create\" },\n * ]},\n * ];\n *\n * <PermissionGrid\n * modules={modules}\n * selectedIds={[\"users:view\"]}\n * onChange={(ids) => setPermissions(ids)}\n * />\n * ```\n */\nexport function PermissionGrid({\n modules,\n selectedIds,\n onChange,\n readOnly = false,\n labels: labelOverrides,\n}: PermissionGridProps) {\n const labels = { ...defaultLabels, ...labelOverrides };\n const columns = collectColumns(modules);\n\n const togglePermission = (permId: string) => {\n if (readOnly || !onChange) return;\n if (selectedIds.includes(permId)) {\n onChange(selectedIds.filter(id => id !== permId));\n } else {\n onChange([...selectedIds, permId]);\n }\n };\n\n const toggleModule = (mod: PermissionModule) => {\n if (readOnly || !onChange) return;\n const modulePermIds = mod.permissions.map(p => buildPermissionId(mod.key, p.key));\n const allSelected = modulePermIds.every(id => selectedIds.includes(id));\n\n if (allSelected) {\n onChange(selectedIds.filter(id => !modulePermIds.includes(id)));\n } else {\n const newIds = new Set([...selectedIds, ...modulePermIds]);\n onChange(Array.from(newIds));\n }\n };\n\n const isModuleAllSelected = (mod: PermissionModule): boolean => {\n const modulePermIds = mod.permissions.map(p => buildPermissionId(mod.key, p.key));\n return modulePermIds.length > 0 && modulePermIds.every(id => selectedIds.includes(id));\n };\n\n return (\n <div className=\"border border-border rounded-lg overflow-hidden\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"bg-muted/50\">\n <th className=\"text-left text-xs font-medium text-muted-foreground uppercase tracking-wider px-4 h-table-head\">\n {labels.moduleHeader}\n </th>\n {columns.map(colKey => (\n <th\n key={colKey}\n className=\"text-center text-xs font-medium text-muted-foreground uppercase tracking-wider px-2 h-table-head w-20\"\n >\n {getColumnLabel(modules, colKey)}\n </th>\n ))}\n {!readOnly && (\n <th className=\"text-center text-xs font-medium text-muted-foreground uppercase tracking-wider px-2 h-table-head w-20\">\n {labels.selectAll}\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {modules.map((mod, idx) => {\n const modPermKeys = new Set(mod.permissions.map(p => p.key));\n return (\n <tr key={mod.key} className={cn(idx % 2 === 0 ? 'bg-background' : 'bg-muted/20')}>\n <td className=\"px-4 py-3 text-sm font-medium\">{mod.label}</td>\n {columns.map(colKey => {\n if (!modPermKeys.has(colKey)) {\n return (\n <td key={colKey} className=\"text-center px-2 py-3\">\n <span className=\"text-muted-foreground\">-</span>\n </td>\n );\n }\n const permId = buildPermissionId(mod.key, colKey);\n const checked = selectedIds.includes(permId);\n return (\n <td key={colKey} className=\"text-center px-2 py-3\">\n <Checkbox\n checked={checked}\n onCheckedChange={() => togglePermission(permId)}\n disabled={readOnly}\n className=\"mx-auto\"\n />\n </td>\n );\n })}\n {!readOnly && (\n <td className=\"text-center px-2 py-3\">\n <Checkbox\n checked={isModuleAllSelected(mod)}\n onCheckedChange={() => toggleModule(mod)}\n className=\"mx-auto\"\n />\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
@@ -61,5 +61,5 @@ function InputOTPSeparator({ ...props }) {
61
61
  }
62
62
 
63
63
  export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
64
- //# sourceMappingURL=chunk-RQNZDWY3.js.map
65
- //# sourceMappingURL=chunk-RQNZDWY3.js.map
64
+ //# sourceMappingURL=chunk-33QLY6GI.js.map
65
+ //# sourceMappingURL=chunk-33QLY6GI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/input-otp.tsx"],"names":[],"mappings":";;;;;;AA2BA,SAAS,QAAA,CAAS;AAAA,EAChB,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,kBAAA,EAAoB,EAAA;AAAA,QAClB,iDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACrD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,eAAA,GAAwB,iBAAW,eAAe,CAAA;AACxD,EAAA,MAAM,EAAE,MAAM,YAAA,EAAc,QAAA,KAAa,eAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC;AAE3E,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,ogBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,YAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA2D,CAAA,EAC5E;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAGA,SAAS,iBAAA,CAAkB,EAAE,GAAG,KAAA,EAAM,EAAgC;AACpE,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,qBAAA,EAAsB,IAAA,EAAK,aAAa,GAAG,KAAA,EACxD,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb,CAAA;AAEJ","file":"chunk-33QLY6GI.js","sourcesContent":["import * as React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { MinusIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\n/**\n * One-time password input component built on the `input-otp` library.\n * Renders a segmented input for entering verification codes.\n *\n * @example\n * ```tsx\n * <InputOTP maxLength={6} value={otp} onChange={setOtp}>\n * <InputOTPGroup>\n * <InputOTPSlot index={0} />\n * <InputOTPSlot index={1} />\n * <InputOTPSlot index={2} />\n * </InputOTPGroup>\n * <InputOTPSeparator />\n * <InputOTPGroup>\n * <InputOTPSlot index={3} />\n * <InputOTPSlot index={4} />\n * <InputOTPSlot index={5} />\n * </InputOTPGroup>\n * </InputOTP>\n * ```\n */\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName,\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\n/** Groups adjacent OTP slots together visually. */\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** Individual character slot within an OTP group. */\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm bg-input-background transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n );\n}\n\n/** Visual separator (dash) between OTP groups. */\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };"]}
@@ -1,6 +1,6 @@
1
- import { Popover, PopoverTrigger, PopoverContent } from './chunk-C34KSTWA.js';
2
- import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-6GWVQB3Q.js';
3
- import { Button } from './chunk-55E7D2HR.js';
1
+ import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-MVYSUWSD.js';
2
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-7NMNLY7F.js';
3
+ import { Button } from './chunk-BOV3Q2JH.js';
4
4
  import { cn } from './chunk-DGPY4WP3.js';
5
5
  import * as React from 'react';
6
6
  import { X, ChevronsUpDown, Check } from 'lucide-react';
@@ -167,5 +167,5 @@ function MultiCombobox({
167
167
  }
168
168
 
169
169
  export { Combobox, MultiCombobox };
170
- //# sourceMappingURL=chunk-NPL2R5LD.js.map
171
- //# sourceMappingURL=chunk-NPL2R5LD.js.map
170
+ //# sourceMappingURL=chunk-3V6NS4EQ.js.map
171
+ //# sourceMappingURL=chunk-3V6NS4EQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/combobox.tsx"],"names":[],"mappings":"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","file":"chunk-3V6NS4EQ.js","sourcesContent":["import * as React from \"react\";\nimport { Check, ChevronsUpDown, X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../navigation/command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/popover\";\n\n/** A single option in the Combobox dropdown. */\nexport interface ComboboxOption {\n /** Unique value for this option. */\n value: string;\n /** Display label shown in the dropdown list. */\n label: string;\n /** Whether this option is non-selectable. */\n disabled?: boolean;\n}\n\ninterface ComboboxProps {\n /** Available options to display in the dropdown. */\n options: ComboboxOption[];\n /** Currently selected value. */\n value?: string;\n /** Callback fired when the selected value changes. */\n onChange?: (value: string) => void;\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n /** Placeholder text for the search input inside the dropdown. */\n searchPlaceholder?: string;\n /** Text shown when no options match the search query. */\n emptyText?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the combobox is disabled. */\n disabled?: boolean;\n /** Whether to show a clear button when a value is selected. */\n clearable?: boolean;\n}\n\n/**\n * Searchable single-select combobox built on cmdk and Radix Popover.\n * Combines a text search input with a selectable option list.\n *\n * @example\n * ```tsx\n * const [value, setValue] = useState(\"\");\n *\n * <Combobox\n * options={[\n * { value: \"react\", label: \"React\" },\n * { value: \"vue\", label: \"Vue\" },\n * { value: \"svelte\", label: \"Svelte\" },\n * ]}\n * value={value}\n * onChange={setValue}\n * placeholder=\"Select framework...\"\n * searchPlaceholder=\"Search...\"\n * clearable\n * />\n * ```\n */\nexport function Combobox({\n options,\n value,\n onChange,\n placeholder = \"Chọn...\",\n searchPlaceholder = \"Tìm kiếm...\",\n emptyText = \"Không tìm thấy kết quả.\",\n className,\n disabled,\n clearable = false,\n}: ComboboxProps) {\n const [open, setOpen] = React.useState(false);\n\n const selectedOption = options.find((option) => option.value === value);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.(\"\");\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\n \"w-full justify-between\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <span className=\"truncate\">\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <div className=\"flex items-center gap-1 ml-2\">\n {clearable && value && (\n <X\n className=\"h-4 w-4 opacity-50 hover:opacity-100\"\n onClick={handleClear}\n />\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[--radix-popover-trigger-width] p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{emptyText}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n onSelect={(currentValue) => {\n onChange?.(currentValue === value ? \"\" : currentValue);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option.value ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface MultiComboboxProps {\n /** Available options to display in the dropdown. */\n options: ComboboxOption[];\n /** Array of currently selected values. */\n value?: string[];\n /** Callback fired when the selection changes. */\n onChange?: (value: string[]) => void;\n /** Placeholder text shown when no values are selected. */\n placeholder?: string;\n /** Placeholder text for the search input inside the dropdown. */\n searchPlaceholder?: string;\n /** Text shown when no options match the search query. */\n emptyText?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the combobox is disabled. */\n disabled?: boolean;\n /** Maximum number of items that can be selected. */\n maxSelected?: number;\n}\n\n/**\n * Searchable multi-select combobox that allows selecting multiple values.\n * Selected items are shown as a count in the trigger button.\n *\n * @example\n * ```tsx\n * const [selected, setSelected] = useState<string[]>([]);\n *\n * <MultiCombobox\n * options={[\n * { value: \"react\", label: \"React\" },\n * { value: \"vue\", label: \"Vue\" },\n * { value: \"svelte\", label: \"Svelte\" },\n * ]}\n * value={selected}\n * onChange={setSelected}\n * placeholder=\"Select frameworks...\"\n * maxSelected={3}\n * />\n * ```\n */\nexport function MultiCombobox({\n options,\n value = [],\n onChange,\n placeholder = \"Chọn...\",\n searchPlaceholder = \"Tìm kiếm...\",\n emptyText = \"Không tìm thấy kết quả.\",\n className,\n disabled,\n maxSelected,\n}: MultiComboboxProps) {\n const [open, setOpen] = React.useState(false);\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n const handleSelect = (selectedValue: string) => {\n const newValue = value.includes(selectedValue)\n ? value.filter((v) => v !== selectedValue)\n : maxSelected && value.length >= maxSelected\n ? value\n : [...value, selectedValue];\n\n onChange?.(newValue);\n };\n\n const handleClearAll = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.([]);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\n \"w-full justify-between\",\n !value.length && \"text-muted-foreground\",\n className\n )}\n >\n <span className=\"truncate\">\n {selectedLabels.length > 0\n ? selectedLabels.length === 1\n ? selectedLabels[0]\n : `${selectedLabels.length} mục đã chọn`\n : placeholder}\n </span>\n <div className=\"flex items-center gap-1 ml-2\">\n {value.length > 0 && (\n <X\n className=\"h-4 w-4 opacity-50 hover:opacity-100\"\n onClick={handleClearAll}\n />\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[--radix-popover-trigger-width] p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{emptyText}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = value.includes(option.value);\n const isDisabled =\n option.disabled ||\n (!isSelected && maxSelected && value.length >= maxSelected);\n\n return (\n <CommandItem\n key={option.value}\n value={option.value}\n disabled={!!isDisabled}\n onSelect={() => handleSelect(option.value)}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n isSelected ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n {option.label}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Button } from './chunk-55E7D2HR.js';
1
+ import { Button } from './chunk-BOV3Q2JH.js';
2
2
  import { cn } from './chunk-DGPY4WP3.js';
3
3
  import * as React from 'react';
4
4
  import { Upload, X, FileImage, FileVideo, FileText, File } from 'lucide-react';
@@ -183,5 +183,5 @@ function FileUpload({
183
183
  }
184
184
 
185
185
  export { FileUpload };
186
- //# sourceMappingURL=chunk-G7HTZBUR.js.map
187
- //# sourceMappingURL=chunk-G7HTZBUR.js.map
186
+ //# sourceMappingURL=chunk-47TUWE63.js.map
187
+ //# sourceMappingURL=chunk-47TUWE63.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/file-upload.tsx"],"names":["error"],"mappings":"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","file":"chunk-47TUWE63.js","sourcesContent":["import * as React from \"react\";\nimport { Upload, X, File, FileImage, FileText, FileVideo } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\n\ninterface FileUploadProps {\n /** Array of currently uploaded File objects. */\n value?: File[];\n /** Callback fired when files are added or removed. */\n onChange?: (files: File[]) => void;\n /** Accepted file types (e.g., `\"image/*,.pdf\"`). Maps to the HTML `accept` attribute. */\n accept?: string;\n /** Whether multiple files can be selected at once. Defaults to `false`. */\n multiple?: boolean;\n /** Maximum file size in bytes. Defaults to 10 MB. */\n maxSize?: number;\n /** Maximum number of files allowed. */\n maxFiles?: number;\n /** Whether the upload area is disabled. */\n disabled?: boolean;\n /** Additional CSS class for the outer wrapper. */\n className?: string;\n /** Whether to show the file list with previews below the drop zone. Defaults to `true`. */\n showPreview?: boolean;\n}\n\n/**\n * File upload component with drag-and-drop support and file previews.\n * Validates file size and count, shows image thumbnails, and provides remove buttons.\n *\n * @example\n * ```tsx\n * const [files, setFiles] = useState<File[]>([]);\n *\n * <FileUpload\n * value={files}\n * onChange={setFiles}\n * accept=\"image/*,.pdf\"\n * multiple\n * maxSize={5 * 1024 * 1024}\n * maxFiles={3}\n * />\n * ```\n */\nexport function FileUpload({\n value = [],\n onChange,\n accept,\n multiple = false,\n maxSize = 10 * 1024 * 1024, // 10MB default\n maxFiles,\n disabled,\n className,\n showPreview = true,\n}: FileUploadProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [dragActive, setDragActive] = React.useState(false);\n const [error, setError] = React.useState<string>(\"\");\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.type === \"dragenter\" || e.type === \"dragover\") {\n setDragActive(true);\n } else if (e.type === \"dragleave\") {\n setDragActive(false);\n }\n };\n\n const validateFiles = (files: File[]): { valid: File[]; error?: string } => {\n setError(\"\");\n\n // Check max files\n if (maxFiles && value.length + files.length > maxFiles) {\n return {\n valid: [],\n error: `Chỉ được chọn tối đa ${maxFiles} file`,\n };\n }\n\n // Check file size\n const oversizedFiles = files.filter((file) => file.size > maxSize);\n if (oversizedFiles.length > 0) {\n return {\n valid: [],\n error: `File vượt quá dung lượng cho phép (${Math.round(maxSize / 1024 / 1024)}MB)`,\n };\n }\n\n return { valid: files };\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n\n if (disabled) return;\n\n const droppedFiles = Array.from(e.dataTransfer.files);\n const { valid, error } = validateFiles(droppedFiles);\n\n if (error) {\n setError(error);\n return;\n }\n\n onChange?.([...value, ...valid]);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n const selectedFiles = Array.from(e.target.files || []);\n const { valid, error } = validateFiles(selectedFiles);\n\n if (error) {\n setError(error);\n return;\n }\n\n onChange?.([...value, ...valid]);\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n };\n\n const handleRemove = (index: number) => {\n onChange?.(value.filter((_, i) => i !== index));\n };\n\n const getFileIcon = (file: File) => {\n if (file.type.startsWith(\"image/\")) return FileImage;\n if (file.type.startsWith(\"video/\")) return FileVideo;\n if (file.type.startsWith(\"text/\")) return FileText;\n return File;\n };\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i];\n };\n\n return (\n <div className={cn(\"w-full\", className)}>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"hidden\"\n />\n\n {/* Upload Area */}\n <div\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => !disabled && inputRef.current?.click()}\n className={cn(\n \"relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors\",\n dragActive\n ? \"border-primary bg-primary/5\"\n : \"border-border hover:border-border/80\",\n disabled && \"opacity-50 cursor-not-allowed\",\n error && \"border-destructive\"\n )}\n >\n <Upload className=\"mx-auto h-12 w-12 text-muted-foreground mb-4\" />\n <div className=\"text-sm text-muted-foreground mb-2\">\n <span className=\"font-semibold text-primary\">Nhấp để chọn file</span>\n {\" \"}hoặc kéo thả file vào đây\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {accept && <div>Định dạng: {accept}</div>}\n <div>Dung lượng tối đa: {Math.round(maxSize / 1024 / 1024)}MB</div>\n {maxFiles && <div>Số lượng tối đa: {maxFiles} file</div>}\n </div>\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"mt-2 text-sm text-destructive\">{error}</div>\n )}\n\n {/* File List */}\n {showPreview && value.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {value.map((file, index) => {\n const FileIcon = getFileIcon(file);\n const isImage = file.type.startsWith(\"image/\");\n const previewUrl = isImage ? URL.createObjectURL(file) : null;\n\n return (\n <div\n key={`${file.name}-${index}`}\n className=\"flex items-center gap-3 p-3 border rounded-lg bg-muted\"\n >\n {previewUrl ? (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"w-10 h-10 rounded object-cover\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded bg-muted flex items-center justify-center\">\n <FileIcon className=\"w-5 h-5 text-muted-foreground\" />\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">{file.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </div>\n </div>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleRemove(index)}\n disabled={disabled}\n className=\"flex-shrink-0\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { Label } from './chunk-P3M5TZD2.js';
2
- import { Input } from './chunk-3VU56V66.js';
1
+ import { Input } from './chunk-4NBDYSSQ.js';
2
+ import { Label } from './chunk-EYJ7TJIX.js';
3
3
  import { useEffect } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
@@ -40,5 +40,5 @@ function SlugInput({
40
40
  }
41
41
 
42
42
  export { SlugInput, generateSlug };
43
- //# sourceMappingURL=chunk-75WZR6HF.js.map
44
- //# sourceMappingURL=chunk-75WZR6HF.js.map
43
+ //# sourceMappingURL=chunk-4AGNE75K.js.map
44
+ //# sourceMappingURL=chunk-4AGNE75K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/slug-input.tsx"],"names":[],"mappings":";;;;;AA2BA,IAAM,aAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,MAAA;AAAA,EACN,aAAA,EAAe,2BAAA;AAAA,EACf,WAAA,EAAa;AACf,CAAA;AAMO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,OAAO,IAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,wBAAwB,GAAG,CAAA,CACnC,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,wBAAwB,GAAG,CAAA,CACnC,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,MAAM,GAAG,CAAA,CACjB,QAAQ,eAAA,EAAiB,EAAE,EAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,OAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACzB;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA,EAAmB;AACjB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,aAAA,EAAe,GAAG,cAAA,EAAe;AAErD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,YAAY,CAAC,CAAA;AAElC,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAO,iBAAO,IAAA,EAAK,CAAA;AAAA,oBACpB,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC5C,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,iBAAO,aAAA,EAAc;AAAA,GAAA,EAC1E,CAAA;AAEJ","file":"chunk-4AGNE75K.js","sourcesContent":["import { useEffect } from 'react';\nimport { Input } from './input';\nimport { Label } from './label';\n\n/** Customizable labels for the SlugInput component. */\nexport interface SlugInputLabels {\n /** Label text above the slug input field. */\n slug: string;\n /** Helper text below the slug input. */\n autoGenerated: string;\n /** Placeholder shown inside the slug input. */\n placeholder: string;\n}\n\nexport interface SlugInputProps {\n /** Source title string from which the slug is auto-generated. */\n title: string;\n /** Current slug value. */\n slug: string;\n /** Callback fired when the slug changes (auto-generated or manually edited). */\n onSlugChange: (slug: string) => void;\n /** Whether auto-generation from title is disabled and slug is manually editable only. */\n disabled?: boolean;\n /** Override default label strings for localization. */\n labels?: Partial<SlugInputLabels>;\n}\n\nconst defaultLabels: SlugInputLabels = {\n slug: 'Slug',\n autoGenerated: 'Auto-generated from title',\n placeholder: 'enter-slug-here',\n};\n\n/**\n * Generates a URL-friendly slug from a text string.\n * Handles Vietnamese diacritics and other special characters.\n */\nexport function generateSlug(text: string): string {\n return text\n .toLowerCase()\n .replace(/[àáạảãâầấậẩẫăằắặẳẵ]/g, 'a')\n .replace(/[èéẹẻẽêềếệểễ]/g, 'e')\n .replace(/[ìíịỉĩ]/g, 'i')\n .replace(/[òóọỏõôồốộổỗơờớợởỡ]/g, 'o')\n .replace(/[ùúụủũưừứựửữ]/g, 'u')\n .replace(/[ỳýỵỷỹ]/g, 'y')\n .replace(/đ/g, 'd')\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * URL slug input that auto-generates a slug from a title string.\n * Handles Vietnamese diacritics and special characters via `generateSlug`.\n * The slug updates automatically when the title changes (unless `disabled` is true).\n *\n * @example\n * ```tsx\n * const [title, setTitle] = useState(\"My Blog Post\");\n * const [slug, setSlug] = useState(\"\");\n *\n * <Input value={title} onChange={(e) => setTitle(e.target.value)} />\n * <SlugInput\n * title={title}\n * slug={slug}\n * onSlugChange={setSlug}\n * />\n * // slug will auto-populate as \"my-blog-post\"\n * ```\n */\nexport function SlugInput({\n title,\n slug,\n onSlugChange,\n disabled = false,\n labels: labelOverrides,\n}: SlugInputProps) {\n const labels = { ...defaultLabels, ...labelOverrides };\n\n useEffect(() => {\n if (!disabled && title) {\n onSlugChange(generateSlug(title));\n }\n }, [title, disabled, onSlugChange]);\n\n return (\n <div>\n <Label>{labels.slug}</Label>\n <Input\n value={slug}\n onChange={(e) => onSlugChange(e.target.value)}\n placeholder={labels.placeholder}\n className=\"h-element-sm mt-1 font-mono text-sm\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">{labels.autoGenerated}</p>\n </div>\n );\n}\n"]}
@@ -0,0 +1,90 @@
1
+ import { TranslatableField } from './chunk-YU55YBID.js';
2
+ import { useUILocales, resolveTranslatableConfig } from './chunk-VPTIRPZW.js';
3
+ import { cn } from './chunk-DGPY4WP3.js';
4
+ import * as React from 'react';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsx } from 'react/jsx-runtime';
7
+
8
+ var inputVariants = cva(
9
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex w-full min-w-0 rounded-md border bg-input-background transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 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",
10
+ {
11
+ variants: {
12
+ size: {
13
+ xs: "h-element-xs px-2 text-xs",
14
+ sm: "h-element-sm px-2.5 text-sm",
15
+ default: "h-element px-3 py-1 text-base md:text-sm",
16
+ lg: "h-element-lg px-4 text-sm",
17
+ xl: "h-element-xl px-4 text-base"
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ size: "default"
22
+ }
23
+ }
24
+ );
25
+ var Input = React.forwardRef(
26
+ (props, ref) => {
27
+ const { className, type, size, translatable, ...rest } = props;
28
+ const providerLocales = useUILocales();
29
+ if (translatable !== void 0) {
30
+ const config = resolveTranslatableConfig(translatable, providerLocales);
31
+ if (!config) {
32
+ const { value: _v, onChange: _oc, ...inputRest3 } = rest;
33
+ return /* @__PURE__ */ jsx(
34
+ "input",
35
+ {
36
+ type,
37
+ ref,
38
+ "data-slot": "input",
39
+ className: cn(inputVariants({ size, className })),
40
+ ...inputRest3
41
+ }
42
+ );
43
+ }
44
+ const { value: value2 = {}, onChange: onChange2, errors, ...inputRest2 } = rest;
45
+ return /* @__PURE__ */ jsx(
46
+ TranslatableField,
47
+ {
48
+ config,
49
+ value: value2,
50
+ onChange: onChange2 ?? (() => {
51
+ }),
52
+ errors,
53
+ children: ({ value: localeValue, onChange: localeChange, fallbackPlaceholder, hasError }) => /* @__PURE__ */ jsx(
54
+ "input",
55
+ {
56
+ type,
57
+ ref,
58
+ "data-slot": "input",
59
+ "data-translatable": true,
60
+ className: cn(inputVariants({ size, className })),
61
+ value: localeValue,
62
+ placeholder: fallbackPlaceholder ?? inputRest2.placeholder,
63
+ onChange: (e) => localeChange(e.target.value),
64
+ ...inputRest2,
65
+ "aria-invalid": hasError || inputRest2["aria-invalid"] || void 0
66
+ }
67
+ )
68
+ }
69
+ );
70
+ }
71
+ const { value, onChange, ...inputRest } = rest;
72
+ return /* @__PURE__ */ jsx(
73
+ "input",
74
+ {
75
+ type,
76
+ ref,
77
+ "data-slot": "input",
78
+ className: cn(inputVariants({ size, className })),
79
+ value,
80
+ onChange,
81
+ ...inputRest
82
+ }
83
+ );
84
+ }
85
+ );
86
+ Input.displayName = "Input";
87
+
88
+ export { Input, inputVariants };
89
+ //# sourceMappingURL=chunk-4NBDYSSQ.js.map
90
+ //# sourceMappingURL=chunk-4NBDYSSQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/input.tsx"],"names":["inputRest","value","onChange"],"mappings":"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","file":"chunk-4NBDYSSQ.js","sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\nimport { TranslatableField } from './translatable-field';\nimport { useUILocales, resolveTranslatableConfig } from '../../providers/ui-provider';\nimport type { TranslatableConfig, TranslatableValue } from '../../providers/ui-provider';\n\n// ─── Variants ─────────────────────────────────────────────────────────────────\n\nconst inputVariants = cva(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex w-full min-w-0 rounded-md border bg-input-background transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 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\",\n {\n variants: {\n size: {\n xs: \"h-element-xs px-2 text-xs\",\n sm: \"h-element-sm px-2.5 text-sm\",\n default: \"h-element px-3 py-1 text-base md:text-sm\",\n lg: \"h-element-lg px-4 text-sm\",\n xl: \"h-element-xl px-4 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype InputSize = VariantProps<typeof inputVariants>['size'];\ntype NativeInputProps = Omit<React.ComponentProps<'input'>, 'value' | 'onChange' | 'size'>;\n\ninterface StandardInputProps extends NativeInputProps {\n size?: InputSize;\n /** Translatable mode disabled (default). */\n translatable?: never;\n value?: string;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\ninterface TranslatableInputProps extends NativeInputProps {\n size?: InputSize;\n /**\n * Enable locale-switching tabs on this input.\n * - `true` — inherit UIProvider's locale config\n * - `object` — override locales/defaultLocale/fallbackLocale per field\n *\n * @example\n * ```tsx\n * // Uses UIProvider config\n * <Input translatable value={val} onChange={setVal} />\n *\n * // Custom per-field config\n * <Input\n * translatable={{ locales: { en: 'English', vi: 'Tiếng Việt' }, fallbackLocale: 'en' }}\n * value={val}\n * onChange={setVal}\n * />\n * ```\n */\n translatable: TranslatableConfig;\n value?: TranslatableValue;\n onChange?: (value: TranslatableValue) => void;\n /**\n * Per-locale validation errors. Truthy string = that locale is invalid.\n * The active locale's error is forwarded as `aria-invalid` on the input;\n * all locale tabs with errors show a red dot indicator.\n *\n * @example `{ en: 'Required', vi: 'Too long (120/100)' }`\n */\n errors?: Partial<Record<string, string>>;\n}\n\nexport type InputProps = StandardInputProps | TranslatableInputProps;\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Text input component with multiple size variants.\n * Supports translatable mode via the `translatable` prop.\n *\n * @example\n * ```tsx\n * // Standard\n * <Input placeholder=\"Enter text...\" />\n * <Input size=\"sm\" value={val} onChange={(e) => setVal(e.target.value)} />\n *\n * // Translatable — uses UIProvider's locale config\n * <Input translatable value={val} onChange={setVal} />\n *\n * // Translatable — custom config\n * <Input\n * translatable={{ locales: { en: 'English', vi: 'Tiếng Việt' }, fallbackLocale: 'en' }}\n * value={val}\n * onChange={setVal}\n * />\n * ```\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (props, ref) => {\n const { className, type, size, translatable, ...rest } = props as TranslatableInputProps & { type?: string; className?: string };\n\n const providerLocales = useUILocales();\n\n // ── Translatable mode ──────────────────────────────────────────────────\n if (translatable !== undefined) {\n const config = resolveTranslatableConfig(translatable, providerLocales);\n\n // Fallback: if no locale config available, render standard input\n if (!config) {\n const { value: _v, onChange: _oc, ...inputRest } = rest as TranslatableInputProps;\n return (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n className={cn(inputVariants({ size, className }))}\n {...(inputRest as NativeInputProps)}\n />\n );\n }\n\n const { value = {}, onChange, errors, ...inputRest } = rest as TranslatableInputProps;\n\n return (\n <TranslatableField\n config={config}\n value={value as TranslatableValue}\n onChange={onChange ?? (() => {})}\n errors={errors}\n >\n {({ value: localeValue, onChange: localeChange, fallbackPlaceholder, hasError }) => (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n data-translatable\n className={cn(inputVariants({ size, className }))}\n value={localeValue}\n placeholder={fallbackPlaceholder ?? (inputRest as React.InputHTMLAttributes<HTMLInputElement>).placeholder}\n onChange={(e) => localeChange(e.target.value)}\n {...(inputRest as React.InputHTMLAttributes<HTMLInputElement>)}\n aria-invalid={hasError || (inputRest as React.InputHTMLAttributes<HTMLInputElement>)['aria-invalid'] || undefined}\n />\n )}\n </TranslatableField>\n );\n }\n\n // ── Standard mode ──────────────────────────────────────────────────────\n const { value, onChange, ...inputRest } = rest as StandardInputProps;\n return (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n className={cn(inputVariants({ size, className }))}\n value={value}\n onChange={onChange}\n {...(inputRest as NativeInputProps)}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input, inputVariants };\n"]}
@@ -44,5 +44,5 @@ function ResizableHandle({
44
44
  }
45
45
 
46
46
  export { ResizableHandle, ResizablePanel, ResizablePanelGroup };
47
- //# sourceMappingURL=chunk-FRKG7JQY.js.map
48
- //# sourceMappingURL=chunk-FRKG7JQY.js.map
47
+ //# sourceMappingURL=chunk-5AGUCELC.js.map
48
+ //# sourceMappingURL=chunk-5AGUCELC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/display/resizable.tsx"],"names":[],"mappings":";;;;;AAyBA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+D;AAC7D,EAAA,uBACE,GAAA;AAAA,IAAoB,kBAAA,CAAA,UAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,mEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,2BAA2B,kBAAA,CAAA,KAAA,EAAnB,EAAyB,WAAA,EAAU,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAC1E;AAOA,SAAS,eAAA,CAAgB;AAAA,EACvB,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,GAAA;AAAA,IAAoB,kBAAA,CAAA,iBAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,2oBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,UAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,6EACb,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,UAAA,EAAW,CAAA,EACzC;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-5AGUCELC.js","sourcesContent":["import * as React from \"react\";\nimport { GripVerticalIcon } from \"lucide-react\";\nimport * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"../../lib/utils\";\n\n/**\n * Resizable panel layout built on `react-resizable-panels`.\n *\n * Groups multiple `ResizablePanel` components separated by `ResizableHandle` drag handles.\n * Supports horizontal (default) and vertical layouts via the `direction` prop.\n *\n * @example\n * ```tsx\n * <ResizablePanelGroup direction=\"horizontal\">\n * <ResizablePanel defaultSize={50}>\n * <div className=\"p-4\">Left panel</div>\n * </ResizablePanel>\n * <ResizableHandle withHandle />\n * <ResizablePanel defaultSize={50}>\n * <div className=\"p-4\">Right panel</div>\n * </ResizablePanel>\n * </ResizablePanelGroup>\n * ```\n */\nfunction ResizablePanelGroup({\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) {\n return (\n <ResizablePrimitive.PanelGroup\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Individual resizable panel. Use `defaultSize` (percentage) to set the initial width/height. */\nfunction ResizablePanel({\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.Panel>) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\n/**\n * Draggable handle between resizable panels.\n *\n * @param withHandle - When true, renders a visible grip icon on the handle for better discoverability.\n */\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.PanelResizeHandle\n data-slot=\"resizable-handle\"\n className={cn(\n \"bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border\">\n <GripVerticalIcon className=\"size-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n );\n}\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle };"]}
@@ -73,5 +73,5 @@ function Badge({
73
73
  }
74
74
 
75
75
  export { Badge, badgeVariants };
76
- //# sourceMappingURL=chunk-A3BB5ZOC.js.map
77
- //# sourceMappingURL=chunk-A3BB5ZOC.js.map
76
+ //# sourceMappingURL=chunk-5SAUUOCN.js.map
77
+ //# sourceMappingURL=chunk-5SAUUOCN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/display/badge.tsx"],"names":[],"mappings":"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","file":"chunk-5SAUUOCN.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"]}
@@ -1,4 +1,4 @@
1
- import { Button } from './chunk-55E7D2HR.js';
1
+ import { Button } from './chunk-BOV3Q2JH.js';
2
2
  import { cn } from './chunk-DGPY4WP3.js';
3
3
  import * as React from 'react';
4
4
  import useEmblaCarousel from 'embla-carousel-react';
@@ -192,5 +192,5 @@ function CarouselNext({
192
192
  }
193
193
 
194
194
  export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious };
195
- //# sourceMappingURL=chunk-2TUWDXAC.js.map
196
- //# sourceMappingURL=chunk-2TUWDXAC.js.map
195
+ //# sourceMappingURL=chunk-5WOCEAZG.js.map
196
+ //# sourceMappingURL=chunk-5WOCEAZG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/display/carousel.tsx"],"names":["api"],"mappings":"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","file":"chunk-5WOCEAZG.js","sourcesContent":["import * as React from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../inputs/button\";\n\ntype CarouselApi = ReturnType<typeof useEmblaCarousel>[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n /** Embla Carousel options (e.g., `{ loop: true, align: \"start\" }`). */\n opts?: CarouselOptions;\n /** Embla Carousel plugins (e.g., Autoplay, ClassNames). */\n plugins?: CarouselPlugin;\n /** Scroll axis direction. Defaults to `\"horizontal\"`. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Callback to receive the Embla API instance for external control. */\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\n/** Returns the carousel context. Must be called within a `<Carousel>` provider. */\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\n/**\n * Carousel/slider component powered by Embla Carousel.\n *\n * Provides a context for child components (`CarouselContent`, `CarouselItem`,\n * `CarouselPrevious`, `CarouselNext`). Supports horizontal/vertical orientation,\n * keyboard navigation (arrow keys), and plugin extensibility.\n *\n * @example\n * ```tsx\n * <Carousel opts={{ loop: true }}>\n * <CarouselContent>\n * <CarouselItem>Slide 1</CarouselItem>\n * <CarouselItem>Slide 2</CarouselItem>\n * <CarouselItem>Slide 3</CarouselItem>\n * </CarouselContent>\n * <CarouselPrevious />\n * <CarouselNext />\n * </Carousel>\n * ```\n */\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext],\n );\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\n/** Scrollable container for `CarouselItem` elements. Manages the overflow viewport. */\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\n/** Individual slide within the carousel. Defaults to full-width (`basis-full`). */\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Navigation button to scroll to the previous slide. Automatically disabled when at the beginning. */\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-12 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\n/** Navigation button to scroll to the next slide. Automatically disabled when at the end. */\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-12 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { Badge } from './chunk-A3BB5ZOC.js';
1
+ import { Badge } from './chunk-5SAUUOCN.js';
2
2
  import { cn } from './chunk-DGPY4WP3.js';
3
3
  import { MoreHorizontal, FileText, FileSignature, ShoppingCart, Receipt, Calendar } from 'lucide-react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -47,5 +47,5 @@ function WorkflowCategoryBadge({ category, label, className }) {
47
47
  }
48
48
 
49
49
  export { WorkflowCategoryBadge };
50
- //# sourceMappingURL=chunk-2C2HRGM7.js.map
51
- //# sourceMappingURL=chunk-2C2HRGM7.js.map
50
+ //# sourceMappingURL=chunk-6W5FYOXQ.js.map
51
+ //# sourceMappingURL=chunk-6W5FYOXQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/domain/workflow/workflow-category-badge.tsx"],"names":[],"mappings":";;;;;AA6BA,IAAM,cAAA,GAAqF;AAAA,EACzF,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,aAAA,GAAkD;AAAA,EACtD,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAmBO,SAAS,qBAAA,CAAsB,EAAE,QAAA,EAAU,KAAA,EAAO,WAAU,EAA+B;AAChG,EAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA;AACtC,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,uBACE,IAAA,CAAC,SAAM,OAAA,EAAQ,SAAA,EAAU,WAAW,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA,EAC5D,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,cAAA,EAAe,CAAA;AAAA,IAC9B,KAAA,IAAS,cAAc,QAAQ;AAAA,GAAA,EAClC,CAAA;AAEJ","file":"chunk-6W5FYOXQ.js","sourcesContent":["import {\n Calendar,\n Receipt,\n ShoppingCart,\n FileSignature,\n FileText,\n MoreHorizontal,\n} from 'lucide-react';\nimport { cn } from '../../../lib/utils';\nimport { Badge } from '../../display/badge';\n\n/** Supported workflow categories with built-in icon and color mappings. */\nexport type WorkflowCategory =\n | 'leave'\n | 'expense'\n | 'purchase'\n | 'contract'\n | 'document'\n | 'other';\n\nexport interface WorkflowCategoryBadgeProps {\n /** The category key. Determines the icon and color. */\n category: WorkflowCategory;\n /** The displayed label text. Defaults to a capitalized version of the category. */\n label?: string;\n /** Optional additional className. */\n className?: string;\n}\n\nconst categoryConfig: Record<WorkflowCategory, { icon: typeof Calendar; style: string }> = {\n leave: {\n icon: Calendar,\n style:\n 'bg-blue-50 dark:bg-blue-500/15 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-500/30',\n },\n expense: {\n icon: Receipt,\n style:\n 'bg-green-50 dark:bg-green-500/15 text-green-600 dark:text-green-400 border-green-200 dark:border-green-500/30',\n },\n purchase: {\n icon: ShoppingCart,\n style:\n 'bg-amber-50 dark:bg-amber-500/15 text-amber-600 dark:text-amber-400 border-amber-200 dark:border-amber-500/30',\n },\n contract: {\n icon: FileSignature,\n style:\n 'bg-purple-50 dark:bg-purple-500/15 text-purple-600 dark:text-purple-400 border-purple-200 dark:border-purple-500/30',\n },\n document: {\n icon: FileText,\n style:\n 'bg-cyan-50 dark:bg-cyan-500/15 text-cyan-600 dark:text-cyan-400 border-cyan-200 dark:border-cyan-500/30',\n },\n other: {\n icon: MoreHorizontal,\n style: 'bg-muted text-muted-foreground',\n },\n};\n\nconst defaultLabels: Record<WorkflowCategory, string> = {\n leave: 'Leave',\n expense: 'Expense',\n purchase: 'Purchase',\n contract: 'Contract',\n document: 'Document',\n other: 'Other',\n};\n\n/**\n * WorkflowCategoryBadge renders a badge with an icon and color for a workflow category.\n *\n * Each category has a dedicated icon and color scheme:\n * - leave: Calendar (blue)\n * - expense: Receipt (green)\n * - purchase: ShoppingCart (amber)\n * - contract: FileSignature (purple)\n * - document: FileText (cyan)\n * - other: MoreHorizontal (muted)\n *\n * @example\n * ```tsx\n * <WorkflowCategoryBadge category=\"expense\" />\n * <WorkflowCategoryBadge category=\"leave\" label=\"Annual Leave\" />\n * ```\n */\nexport function WorkflowCategoryBadge({ category, label, className }: WorkflowCategoryBadgeProps) {\n const config = categoryConfig[category];\n const Icon = config.icon;\n\n return (\n <Badge variant=\"outline\" className={cn(config.style, className)}>\n <Icon className=\"w-3 h-3 mr-1\" />\n {label ?? defaultLabels[category]}\n </Badge>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Badge } from './chunk-A3BB5ZOC.js';
1
+ import { Badge } from './chunk-5SAUUOCN.js';
2
2
  import { cn } from './chunk-DGPY4WP3.js';
3
3
  import { GitBranch, Bell, Eye, CheckCircle } from 'lucide-react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -37,5 +37,5 @@ function StageTypeBadge({ type, label, className }) {
37
37
  }
38
38
 
39
39
  export { StageTypeBadge };
40
- //# sourceMappingURL=chunk-ZHEKDP5X.js.map
41
- //# sourceMappingURL=chunk-ZHEKDP5X.js.map
40
+ //# sourceMappingURL=chunk-6Z6NRIQ2.js.map
41
+ //# sourceMappingURL=chunk-6Z6NRIQ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/domain/workflow/stage-type-badge.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,WAAA,GAA8E;AAAA,EAClF,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EACE;AAAA;AAEN,CAAA;AAEA,IAAM,aAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,YAAA,EAAc,cAAA;AAAA,EACd,WAAA,EAAa;AACf,CAAA;AAiBO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,EAAO,WAAU,EAAwB;AAC9E,EAAA,MAAM,MAAA,GAAS,YAAY,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,uBACE,IAAA,CAAC,SAAM,OAAA,EAAQ,SAAA,EAAU,WAAW,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA,EAC5D,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,cAAA,EAAe,CAAA;AAAA,IAC9B,KAAA,IAAS,cAAc,IAAI;AAAA,GAAA,EAC9B,CAAA;AAEJ","file":"chunk-6Z6NRIQ2.js","sourcesContent":["import { CheckCircle, Eye, Bell, GitBranch } from 'lucide-react';\nimport { cn } from '../../../lib/utils';\nimport { Badge } from '../../display/badge';\n\n/** Supported stage types with built-in icon and color mappings. */\nexport type StageType = 'approval' | 'review' | 'notification' | 'conditional';\n\nexport interface StageTypeBadgeProps {\n /** The stage type key. Determines the icon and color. */\n type: StageType;\n /** The displayed label text. Defaults to a capitalized version of the type. */\n label?: string;\n /** Optional additional className. */\n className?: string;\n}\n\nconst stageConfig: Record<StageType, { icon: typeof CheckCircle; style: string }> = {\n approval: {\n icon: CheckCircle,\n style:\n 'bg-green-50 dark:bg-green-500/15 text-green-600 dark:text-green-400 border-green-200 dark:border-green-500/30',\n },\n review: {\n icon: Eye,\n style:\n 'bg-blue-50 dark:bg-blue-500/15 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-500/30',\n },\n notification: {\n icon: Bell,\n style:\n 'bg-amber-50 dark:bg-amber-500/15 text-amber-600 dark:text-amber-400 border-amber-200 dark:border-amber-500/30',\n },\n conditional: {\n icon: GitBranch,\n style:\n 'bg-purple-50 dark:bg-purple-500/15 text-purple-600 dark:text-purple-400 border-purple-200 dark:border-purple-500/30',\n },\n};\n\nconst defaultLabels: Record<StageType, string> = {\n approval: 'Approval',\n review: 'Review',\n notification: 'Notification',\n conditional: 'Conditional',\n};\n\n/**\n * StageTypeBadge renders a badge with an icon and color for a workflow stage type.\n *\n * Each type has a dedicated icon and color scheme:\n * - approval: CheckCircle (green)\n * - review: Eye (blue)\n * - notification: Bell (amber)\n * - conditional: GitBranch (purple)\n *\n * @example\n * ```tsx\n * <StageTypeBadge type=\"approval\" />\n * <StageTypeBadge type=\"review\" label=\"Peer Review\" />\n * ```\n */\nexport function StageTypeBadge({ type, label, className }: StageTypeBadgeProps) {\n const config = stageConfig[type];\n const Icon = config.icon;\n\n return (\n <Badge variant=\"outline\" className={cn(config.style, className)}>\n <Icon className=\"w-3 h-3 mr-1\" />\n {label ?? defaultLabels[type]}\n </Badge>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Badge } from './chunk-A3BB5ZOC.js';
1
+ import { Badge } from './chunk-5SAUUOCN.js';
2
2
  import { cn } from './chunk-DGPY4WP3.js';
3
3
  import { useState } from 'react';
4
4
  import { ChevronRight, MapPin, GitBranch, Building2, Globe } from 'lucide-react';
@@ -102,5 +102,5 @@ function ScopeTreeNodeItem({
102
102
  }
103
103
 
104
104
  export { ScopeTree };
105
- //# sourceMappingURL=chunk-BAQWGQJG.js.map
106
- //# sourceMappingURL=chunk-BAQWGQJG.js.map
105
+ //# sourceMappingURL=chunk-7KZ7CVRN.js.map
106
+ //# sourceMappingURL=chunk-7KZ7CVRN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/domain/rbac/scope-tree.tsx"],"names":[],"mappings":"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","file":"chunk-7KZ7CVRN.js","sourcesContent":["import { useState } from 'react';\nimport { ChevronRight, Globe, Building2, GitBranch, MapPin, type LucideIcon } from 'lucide-react';\nimport { Badge } from '../../display/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"]}
@@ -39,5 +39,5 @@ function PopoverAnchor({
39
39
  }
40
40
 
41
41
  export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
42
- //# sourceMappingURL=chunk-C34KSTWA.js.map
43
- //# sourceMappingURL=chunk-C34KSTWA.js.map
42
+ //# sourceMappingURL=chunk-7NMNLY7F.js.map
43
+ //# sourceMappingURL=chunk-7NMNLY7F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/overlay/popover.tsx"],"names":[],"mappings":";;;;AA6BA,SAAS,OAAA,CAAQ;AAAA,EACf,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,2BAAyB,gBAAA,CAAA,IAAA,EAAjB,EAAsB,WAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAC/D;AAGA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,2BAAyB,gBAAA,CAAA,OAAA,EAAjB,EAAyB,WAAA,EAAU,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAC1E;AAGA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,UAAA,GAAa,CAAA;AAAA,EACb,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACE,GAAA,CAAkB,yBAAjB,EACC,QAAA,kBAAA,GAAA;AAAA,IAAkB,gBAAA,CAAA,OAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,ufAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;AAGA,SAAS,aAAA,CAAc;AAAA,EACrB,GAAG;AACL,CAAA,EAAyD;AACvD,EAAA,2BAAyB,gBAAA,CAAA,MAAA,EAAjB,EAAwB,WAAA,EAAU,gBAAA,EAAkB,GAAG,KAAA,EAAO,CAAA;AACxE","file":"chunk-7NMNLY7F.js","sourcesContent":["import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"../../lib/utils\";\n\n/**\n * Floating popover component built on Radix UI Popover.\n *\n * Displays rich content in a floating panel anchored to a trigger element.\n * Supports controlled (`open`/`onOpenChange`) and uncontrolled usage.\n * Content is portaled and positioned automatically.\n *\n * @example\n * ```tsx\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button variant=\"outline\">Open Popover</Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <div className=\"space-y-2\">\n * <h4 className=\"font-medium text-sm\">Dimensions</h4>\n * <p className=\"text-sm text-muted-foreground\">\n * Set the dimensions for the layer.\n * </p>\n * </div>\n * </PopoverContent>\n * </Popover>\n * ```\n */\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\n/** Element that toggles the popover when clicked. Use `asChild` to merge into your own button. */\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\n/** Floating content panel positioned relative to the trigger. */\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-[var(--density-popover)] shadow-md outline-hidden\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** Custom anchor element for positioning the popover content relative to a different element than the trigger. */\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };"]}
@@ -95,5 +95,5 @@ var Button = React.forwardRef(
95
95
  Button.displayName = "Button";
96
96
 
97
97
  export { Button, buttonVariants };
98
- //# sourceMappingURL=chunk-55E7D2HR.js.map
99
- //# sourceMappingURL=chunk-55E7D2HR.js.map
98
+ //# sourceMappingURL=chunk-BOV3Q2JH.js.map
99
+ //# sourceMappingURL=chunk-BOV3Q2JH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/button.tsx"],"names":[],"mappings":"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","file":"chunk-BOV3Q2JH.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 buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-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\",\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 \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n // Color-aware — applied via compoundVariants\n outline: \"\",\n soft: \"\",\n ghost: \"\",\n link: \"\",\n },\n color: {\n primary: \"\",\n destructive: \"\",\n success: \"\",\n warning: \"\",\n info: \"\",\n },\n size: {\n xs: \"h-element-xs rounded-md gap-1 px-2 text-xs has-[>svg]:px-1.5\",\n sm: \"h-element-sm rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n default: \"h-element px-4 py-2 has-[>svg]:px-3\",\n lg: \"h-element-lg rounded-md px-6 has-[>svg]:px-4\",\n xl: \"h-element-xl rounded-md px-8 text-base font-semibold has-[>svg]:px-5\",\n icon: \"size-element rounded-md\",\n },\n },\n compoundVariants: [\n // ── Solid (default variant) × color ──\n { variant: \"default\", color: \"primary\", className: \"bg-primary text-primary-foreground hover:bg-primary/90\" },\n { variant: \"default\", color: \"destructive\", className: \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\" },\n { variant: \"default\", color: \"success\", className: \"bg-success text-success-foreground hover:bg-success/90 focus-visible:ring-success/20 dark:focus-visible:ring-success/40\" },\n { variant: \"default\", color: \"warning\", className: \"bg-warning text-warning-foreground hover:bg-warning/90 focus-visible:ring-warning/20 dark:focus-visible:ring-warning/40\" },\n { variant: \"default\", color: \"info\", className: \"bg-info text-info-foreground hover:bg-info/90 focus-visible:ring-info/20 dark:focus-visible:ring-info/40\" },\n\n // ── Legacy destructive variant (backward compat) ──\n { variant: \"destructive\", className: \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\" },\n\n // ── Outline × color ──\n { variant: \"outline\", color: \"primary\", className: \"border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\" },\n { variant: \"outline\", color: \"destructive\", className: \"border border-destructive/50 text-destructive bg-background hover:bg-destructive/10 focus-visible:ring-destructive/20\" },\n { variant: \"outline\", color: \"success\", className: \"border border-success/50 text-success bg-background hover:bg-success/10 focus-visible:ring-success/20\" },\n { variant: \"outline\", color: \"warning\", className: \"border border-warning/50 text-warning bg-background hover:bg-warning/10 focus-visible:ring-warning/20\" },\n { variant: \"outline\", color: \"info\", className: \"border border-info/50 text-info bg-background hover:bg-info/10 focus-visible:ring-info/20\" },\n\n // ── Soft × color ──\n { variant: \"soft\", color: \"primary\", className: \"bg-primary/10 text-primary hover:bg-primary/20\" },\n { variant: \"soft\", color: \"destructive\", className: \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:ring-destructive/20\" },\n { variant: \"soft\", color: \"success\", className: \"bg-success/10 text-success hover:bg-success/20 focus-visible:ring-success/20\" },\n { variant: \"soft\", color: \"warning\", className: \"bg-warning/10 text-warning hover:bg-warning/20 focus-visible:ring-warning/20\" },\n { variant: \"soft\", color: \"info\", className: \"bg-info/10 text-info hover:bg-info/20 focus-visible:ring-info/20\" },\n\n // ── Ghost × color ──\n { variant: \"ghost\", color: \"primary\", className: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\" },\n { variant: \"ghost\", color: \"destructive\", className: \"text-destructive hover:bg-destructive/10\" },\n { variant: \"ghost\", color: \"success\", className: \"text-success hover:bg-success/10\" },\n { variant: \"ghost\", color: \"warning\", className: \"text-warning hover:bg-warning/10\" },\n { variant: \"ghost\", color: \"info\", className: \"text-info hover:bg-info/10\" },\n\n // ── Link × color ──\n { variant: \"link\", color: \"primary\", className: \"text-primary underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"destructive\", className: \"text-destructive underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"success\", className: \"text-success underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"warning\", className: \"text-warning underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"info\", className: \"text-info underline-offset-4 hover:underline\" },\n ],\n defaultVariants: {\n variant: \"default\",\n color: \"primary\",\n size: \"default\",\n },\n },\n);\n\ninterface ButtonProps\n extends React.ComponentProps<\"button\">,\n Omit<VariantProps<typeof buttonVariants>, \"color\"> {\n /**\n * Semantic color intent. Works with `variant` to produce the final appearance.\n *\n * | Color | Use for |\n * |-------|---------|\n * | `primary` | Main actions (default) |\n * | `destructive` | Delete, errors |\n * | `success` | Approve, confirm |\n * | `warning` | Caution, attention |\n * | `info` | Informational |\n *\n * @default \"primary\"\n * @example\n * ```tsx\n * <Button color=\"success\">Approve</Button>\n * <Button variant=\"outline\" color=\"destructive\">Reject</Button>\n * <Button variant=\"soft\" color=\"warning\">Review</Button>\n * ```\n */\n color?: UIColor;\n /**\n * Render as a child component using Radix Slot.\n * When `true`, the button merges its props onto its single child element.\n * @default false\n */\n asChild?: boolean;\n /**\n * Make the button take the full width of its container.\n * @default false\n * @example\n * ```tsx\n * <Button block>Full Width</Button>\n * <Button size=\"xl\" block>Sign In</Button>\n * ```\n */\n block?: boolean;\n}\n\n/**\n * Button component with semantic colors, visual variants, and standard sizes.\n *\n * Combines `variant` (how it looks) with `color` (what it means) for full flexibility.\n * All existing `variant=\"destructive\"` usage continues to work unchanged.\n *\n * @example\n * ```tsx\n * // Default (solid primary)\n * <Button>Save</Button>\n *\n * // Semantic colors\n * <Button color=\"success\">Approve</Button>\n * <Button color=\"destructive\">Delete</Button>\n * <Button color=\"warning\">Proceed with caution</Button>\n *\n * // Variant × Color combinations\n * <Button variant=\"outline\" color=\"destructive\">Reject</Button>\n * <Button variant=\"soft\" color=\"success\">Approved</Button>\n * <Button variant=\"ghost\" color=\"info\">Learn more</Button>\n *\n * // Legacy (still works)\n * <Button variant=\"destructive\">Delete</Button>\n *\n * // Sizes: xs (24px) | sm (28px) | default (32px) | lg (36px) | xl (44px) | icon (32x32)\n * <Button size=\"xs\">Tiny</Button>\n * <Button size=\"xl\" block>Sign In</Button>\n * <Button size=\"icon\"><PlusIcon /></Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, color, size, asChild = false, block = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, color, size }), block && \"w-full\", className)}\n {...props}\n />\n );\n },\n);\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\nexport type { ButtonProps };\n"]}
@@ -59,5 +59,5 @@ function AccordionContent({
59
59
  }
60
60
 
61
61
  export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };
62
- //# sourceMappingURL=chunk-34ARZSNP.js.map
63
- //# sourceMappingURL=chunk-34ARZSNP.js.map
62
+ //# sourceMappingURL=chunk-CECQY5LL.js.map
63
+ //# sourceMappingURL=chunk-CECQY5LL.js.map