@omnifyjp/ui 0.5.3 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/README.md +3 -6
  2. package/dist/chunk-2C2HRGM7.js +51 -0
  3. package/dist/chunk-2C2HRGM7.js.map +1 -0
  4. package/dist/chunk-2TUWDXAC.js +196 -0
  5. package/dist/chunk-2TUWDXAC.js.map +1 -0
  6. package/dist/chunk-34ARZSNP.js +63 -0
  7. package/dist/chunk-34ARZSNP.js.map +1 -0
  8. package/dist/chunk-35DNN46W.js +13 -0
  9. package/dist/chunk-35DNN46W.js.map +1 -0
  10. package/dist/chunk-35U6QG4P.js +116 -0
  11. package/dist/chunk-35U6QG4P.js.map +1 -0
  12. package/dist/chunk-3EOHW4QN.js +35 -0
  13. package/dist/chunk-3EOHW4QN.js.map +1 -0
  14. package/dist/chunk-3VU56V66.js +41 -0
  15. package/dist/chunk-3VU56V66.js.map +1 -0
  16. package/dist/chunk-55E7D2HR.js +99 -0
  17. package/dist/chunk-55E7D2HR.js.map +1 -0
  18. package/dist/chunk-67YUL2ZS.js +53 -0
  19. package/dist/chunk-67YUL2ZS.js.map +1 -0
  20. package/dist/chunk-6DIDQ4TB.js +131 -0
  21. package/dist/chunk-6DIDQ4TB.js.map +1 -0
  22. package/dist/chunk-6GWVQB3Q.js +155 -0
  23. package/dist/chunk-6GWVQB3Q.js.map +1 -0
  24. package/dist/chunk-75WZR6HF.js +44 -0
  25. package/dist/chunk-75WZR6HF.js.map +1 -0
  26. package/dist/chunk-7IRLBU2I.js +114 -0
  27. package/dist/chunk-7IRLBU2I.js.map +1 -0
  28. package/dist/chunk-7RMTPT6O.js +99 -0
  29. package/dist/chunk-7RMTPT6O.js.map +1 -0
  30. package/dist/chunk-7XH3MGBR.js +128 -0
  31. package/dist/chunk-7XH3MGBR.js.map +1 -0
  32. package/dist/chunk-A3BB5ZOC.js +77 -0
  33. package/dist/chunk-A3BB5ZOC.js.map +1 -0
  34. package/dist/chunk-BAQWGQJG.js +106 -0
  35. package/dist/chunk-BAQWGQJG.js.map +1 -0
  36. package/dist/chunk-BRSM3SZP.js +46 -0
  37. package/dist/chunk-BRSM3SZP.js.map +1 -0
  38. package/dist/chunk-C34KSTWA.js +43 -0
  39. package/dist/chunk-C34KSTWA.js.map +1 -0
  40. package/dist/chunk-C5NZAOA7.js +54 -0
  41. package/dist/chunk-C5NZAOA7.js.map +1 -0
  42. package/dist/chunk-CUZR4JWM.js +23 -0
  43. package/dist/chunk-CUZR4JWM.js.map +1 -0
  44. package/dist/chunk-DGPY4WP3.js +11 -0
  45. package/dist/chunk-DGPY4WP3.js.map +1 -0
  46. package/dist/chunk-EWBCV7VA.js +65 -0
  47. package/dist/chunk-EWBCV7VA.js.map +1 -0
  48. package/dist/chunk-F2ZJLKDP.js +119 -0
  49. package/dist/chunk-F2ZJLKDP.js.map +1 -0
  50. package/dist/chunk-FLWMT4DB.js +66 -0
  51. package/dist/chunk-FLWMT4DB.js.map +1 -0
  52. package/dist/chunk-FRKG7JQY.js +48 -0
  53. package/dist/chunk-FRKG7JQY.js.map +1 -0
  54. package/dist/chunk-G7HTZBUR.js +187 -0
  55. package/dist/chunk-G7HTZBUR.js.map +1 -0
  56. package/dist/chunk-IAWKX5W4.js +219 -0
  57. package/dist/chunk-IAWKX5W4.js.map +1 -0
  58. package/dist/chunk-INLM7UJC.js +238 -0
  59. package/dist/chunk-INLM7UJC.js.map +1 -0
  60. package/dist/chunk-JAJMM32I.js +18 -0
  61. package/dist/chunk-JAJMM32I.js.map +1 -0
  62. package/dist/chunk-JJSVA3TH.js +61 -0
  63. package/dist/chunk-JJSVA3TH.js.map +1 -0
  64. package/dist/chunk-JLTBUACL.js +121 -0
  65. package/dist/chunk-JLTBUACL.js.map +1 -0
  66. package/dist/chunk-JRU2QX7T.js +38 -0
  67. package/dist/chunk-JRU2QX7T.js.map +1 -0
  68. package/dist/chunk-JXGRW2MR.js +17 -0
  69. package/dist/chunk-JXGRW2MR.js.map +1 -0
  70. package/dist/chunk-LMT327XH.js +56 -0
  71. package/dist/chunk-LMT327XH.js.map +1 -0
  72. package/dist/chunk-LTTNCAAA.js +138 -0
  73. package/dist/chunk-LTTNCAAA.js.map +1 -0
  74. package/dist/chunk-MJLFJPUG.js +143 -0
  75. package/dist/chunk-MJLFJPUG.js.map +1 -0
  76. package/dist/chunk-MZ2P566X.js +65 -0
  77. package/dist/chunk-MZ2P566X.js.map +1 -0
  78. package/dist/chunk-N47H4MHX.js +41 -0
  79. package/dist/chunk-N47H4MHX.js.map +1 -0
  80. package/dist/chunk-NNJTKHCE.js +160 -0
  81. package/dist/chunk-NNJTKHCE.js.map +1 -0
  82. package/dist/chunk-NPL2R5LD.js +171 -0
  83. package/dist/chunk-NPL2R5LD.js.map +1 -0
  84. package/dist/chunk-NU56GKGM.js +44 -0
  85. package/dist/chunk-NU56GKGM.js.map +1 -0
  86. package/dist/chunk-P3M5TZD2.js +24 -0
  87. package/dist/chunk-P3M5TZD2.js.map +1 -0
  88. package/dist/chunk-PGWNOZDX.js +28 -0
  89. package/dist/chunk-PGWNOZDX.js.map +1 -0
  90. package/dist/chunk-QB3UWRZH.js +92 -0
  91. package/dist/chunk-QB3UWRZH.js.map +1 -0
  92. package/dist/chunk-R2CDE5DO.js +33 -0
  93. package/dist/chunk-R2CDE5DO.js.map +1 -0
  94. package/dist/chunk-RQNZDWY3.js +65 -0
  95. package/dist/chunk-RQNZDWY3.js.map +1 -0
  96. package/dist/chunk-S6PDRGR5.js +109 -0
  97. package/dist/chunk-S6PDRGR5.js.map +1 -0
  98. package/dist/chunk-TGYQ3AKH.js +95 -0
  99. package/dist/chunk-TGYQ3AKH.js.map +1 -0
  100. package/dist/chunk-TJMK2KBE.js +112 -0
  101. package/dist/chunk-TJMK2KBE.js.map +1 -0
  102. package/dist/chunk-USIHM7FV.js +211 -0
  103. package/dist/chunk-USIHM7FV.js.map +1 -0
  104. package/dist/chunk-VVYSAGB3.js +104 -0
  105. package/dist/chunk-VVYSAGB3.js.map +1 -0
  106. package/dist/chunk-WD5KZE25.js +25 -0
  107. package/dist/chunk-WD5KZE25.js.map +1 -0
  108. package/dist/chunk-WL4ZO2H3.js +33 -0
  109. package/dist/chunk-WL4ZO2H3.js.map +1 -0
  110. package/dist/chunk-WRCHR4AK.js +23 -0
  111. package/dist/chunk-WRCHR4AK.js.map +1 -0
  112. package/dist/chunk-WS6E7HBT.js +39 -0
  113. package/dist/chunk-WS6E7HBT.js.map +1 -0
  114. package/dist/chunk-XOJJBNDX.js +33 -0
  115. package/dist/chunk-XOJJBNDX.js.map +1 -0
  116. package/dist/chunk-YBMEQZX7.js +164 -0
  117. package/dist/chunk-YBMEQZX7.js.map +1 -0
  118. package/dist/chunk-Z2QAABLM.js +86 -0
  119. package/dist/chunk-Z2QAABLM.js.map +1 -0
  120. package/dist/chunk-ZHEKDP5X.js +41 -0
  121. package/dist/chunk-ZHEKDP5X.js.map +1 -0
  122. package/dist/chunk-ZPMXRW2A.js +63 -0
  123. package/dist/chunk-ZPMXRW2A.js.map +1 -0
  124. package/dist/chunk-ZYEGBF7G.js +25 -0
  125. package/dist/chunk-ZYEGBF7G.js.map +1 -0
  126. package/dist/components/accordion.d.ts +37 -0
  127. package/dist/components/accordion.js +4 -0
  128. package/dist/components/accordion.js.map +1 -0
  129. package/dist/components/alert-dialog.d.ts +56 -0
  130. package/dist/components/alert-dialog.js +5 -0
  131. package/dist/components/alert-dialog.js.map +1 -0
  132. package/dist/components/alert.d.ts +68 -0
  133. package/dist/components/alert.js +4 -0
  134. package/dist/components/alert.js.map +1 -0
  135. package/dist/components/aspect-ratio.d.ts +23 -0
  136. package/dist/components/aspect-ratio.js +3 -0
  137. package/dist/components/aspect-ratio.js.map +1 -0
  138. package/dist/components/avatar.d.ts +48 -0
  139. package/dist/components/avatar.js +4 -0
  140. package/dist/components/avatar.js.map +1 -0
  141. package/dist/components/badge.d.ts +52 -0
  142. package/dist/components/badge.js +4 -0
  143. package/dist/components/badge.js.map +1 -0
  144. package/dist/components/breadcrumb.d.ts +50 -0
  145. package/dist/components/breadcrumb.js +4 -0
  146. package/dist/components/breadcrumb.js.map +1 -0
  147. package/dist/components/button.d.ts +81 -0
  148. package/dist/components/button.js +4 -0
  149. package/dist/components/button.js.map +1 -0
  150. package/dist/components/calendar-category-badge.d.ts +24 -0
  151. package/dist/components/calendar-category-badge.js +5 -0
  152. package/dist/components/calendar-category-badge.js.map +1 -0
  153. package/dist/components/calendar-event-chip.d.ts +41 -0
  154. package/dist/components/calendar-event-chip.js +30 -0
  155. package/dist/components/calendar-event-chip.js.map +1 -0
  156. package/dist/components/calendar-event-sheet.d.ts +68 -0
  157. package/dist/components/calendar-event-sheet.js +83 -0
  158. package/dist/components/calendar-event-sheet.js.map +1 -0
  159. package/dist/components/calendar-mini.d.ts +65 -0
  160. package/dist/components/calendar-mini.js +93 -0
  161. package/dist/components/calendar-mini.js.map +1 -0
  162. package/dist/components/calendar-toolbar.d.ts +58 -0
  163. package/dist/components/calendar-toolbar.js +54 -0
  164. package/dist/components/calendar-toolbar.js.map +1 -0
  165. package/dist/components/calendar.d.ts +19 -0
  166. package/dist/components/calendar.js +5 -0
  167. package/dist/components/calendar.js.map +1 -0
  168. package/dist/components/card.d.ts +43 -0
  169. package/dist/components/card.js +4 -0
  170. package/dist/components/card.js.map +1 -0
  171. package/dist/components/carousel.d.ts +53 -0
  172. package/dist/components/carousel.js +5 -0
  173. package/dist/components/carousel.js.map +1 -0
  174. package/dist/components/chart.d.ts +125 -0
  175. package/dist/components/chart.js +239 -0
  176. package/dist/components/chart.js.map +1 -0
  177. package/dist/components/checkbox.d.ts +24 -0
  178. package/dist/components/checkbox.js +4 -0
  179. package/dist/components/checkbox.js.map +1 -0
  180. package/dist/components/collapsible.d.ts +28 -0
  181. package/dist/components/collapsible.js +3 -0
  182. package/dist/components/collapsible.js.map +1 -0
  183. package/dist/components/color-picker.d.ts +35 -0
  184. package/dist/components/color-picker.js +7 -0
  185. package/dist/components/color-picker.js.map +1 -0
  186. package/dist/components/combobox.d.ts +98 -0
  187. package/dist/components/combobox.js +8 -0
  188. package/dist/components/combobox.js.map +1 -0
  189. package/dist/components/command.d.ts +63 -0
  190. package/dist/components/command.js +5 -0
  191. package/dist/components/command.js.map +1 -0
  192. package/dist/components/context-menu.d.ts +70 -0
  193. package/dist/components/context-menu.js +4 -0
  194. package/dist/components/context-menu.js.map +1 -0
  195. package/dist/components/date-picker.d.ts +71 -0
  196. package/dist/components/date-picker.js +90 -0
  197. package/dist/components/date-picker.js.map +1 -0
  198. package/dist/components/dialog.d.ts +58 -0
  199. package/dist/components/dialog.js +4 -0
  200. package/dist/components/dialog.js.map +1 -0
  201. package/dist/components/drawer.d.ts +60 -0
  202. package/dist/components/drawer.js +4 -0
  203. package/dist/components/drawer.js.map +1 -0
  204. package/dist/components/dropdown-menu.d.ts +76 -0
  205. package/dist/components/dropdown-menu.js +4 -0
  206. package/dist/components/dropdown-menu.js.map +1 -0
  207. package/dist/components/file-upload.d.ts +44 -0
  208. package/dist/components/file-upload.js +5 -0
  209. package/dist/components/file-upload.js.map +1 -0
  210. package/dist/components/form.d.ts +67 -0
  211. package/dist/components/form.js +111 -0
  212. package/dist/components/form.js.map +1 -0
  213. package/dist/components/hover-card.d.ts +43 -0
  214. package/dist/components/hover-card.js +4 -0
  215. package/dist/components/hover-card.js.map +1 -0
  216. package/dist/components/input-otp.d.ts +38 -0
  217. package/dist/components/input-otp.js +4 -0
  218. package/dist/components/input-otp.js.map +1 -0
  219. package/dist/components/input.d.ts +38 -0
  220. package/dist/components/input.js +4 -0
  221. package/dist/components/input.js.map +1 -0
  222. package/dist/components/label.d.ts +20 -0
  223. package/dist/components/label.js +4 -0
  224. package/dist/components/label.js.map +1 -0
  225. package/dist/components/menubar.d.ts +82 -0
  226. package/dist/components/menubar.js +4 -0
  227. package/dist/components/menubar.js.map +1 -0
  228. package/dist/components/navigation-menu.d.ts +64 -0
  229. package/dist/components/navigation-menu.js +4 -0
  230. package/dist/components/navigation-menu.js.map +1 -0
  231. package/dist/components/pagination.d.ts +59 -0
  232. package/dist/components/pagination.js +5 -0
  233. package/dist/components/pagination.js.map +1 -0
  234. package/dist/components/password-input.d.ts +32 -0
  235. package/dist/components/password-input.js +5 -0
  236. package/dist/components/password-input.js.map +1 -0
  237. package/dist/components/permission-grid.d.ts +67 -0
  238. package/dist/components/permission-grid.js +5 -0
  239. package/dist/components/permission-grid.js.map +1 -0
  240. package/dist/components/popover.d.ts +37 -0
  241. package/dist/components/popover.js +4 -0
  242. package/dist/components/popover.js.map +1 -0
  243. package/dist/components/progress.d.ts +20 -0
  244. package/dist/components/progress.js +4 -0
  245. package/dist/components/progress.js.map +1 -0
  246. package/dist/components/radio-group.d.ts +38 -0
  247. package/dist/components/radio-group.js +4 -0
  248. package/dist/components/radio-group.js.map +1 -0
  249. package/dist/components/rating.d.ts +35 -0
  250. package/dist/components/rating.js +4 -0
  251. package/dist/components/rating.js.map +1 -0
  252. package/dist/components/resizable.d.ts +36 -0
  253. package/dist/components/resizable.js +4 -0
  254. package/dist/components/resizable.js.map +1 -0
  255. package/dist/components/scope-tree.d.ts +78 -0
  256. package/dist/components/scope-tree.js +5 -0
  257. package/dist/components/scope-tree.js.map +1 -0
  258. package/dist/components/scope-type-badge.d.ts +35 -0
  259. package/dist/components/scope-type-badge.js +5 -0
  260. package/dist/components/scope-type-badge.js.map +1 -0
  261. package/dist/components/scroll-area.d.ts +29 -0
  262. package/dist/components/scroll-area.js +4 -0
  263. package/dist/components/scroll-area.js.map +1 -0
  264. package/dist/components/select.d.ts +52 -0
  265. package/dist/components/select.js +4 -0
  266. package/dist/components/select.js.map +1 -0
  267. package/dist/components/separator.d.ts +24 -0
  268. package/dist/components/separator.js +4 -0
  269. package/dist/components/separator.js.map +1 -0
  270. package/dist/components/sheet.d.ts +51 -0
  271. package/dist/components/sheet.js +4 -0
  272. package/dist/components/sheet.js.map +1 -0
  273. package/dist/components/skeleton.d.ts +25 -0
  274. package/dist/components/skeleton.js +4 -0
  275. package/dist/components/skeleton.js.map +1 -0
  276. package/dist/components/slider.d.ts +24 -0
  277. package/dist/components/slider.js +4 -0
  278. package/dist/components/slider.js.map +1 -0
  279. package/dist/components/slug-input.d.ts +50 -0
  280. package/dist/components/slug-input.js +6 -0
  281. package/dist/components/slug-input.js.map +1 -0
  282. package/dist/components/sonner.d.ts +22 -0
  283. package/dist/components/sonner.js +3 -0
  284. package/dist/components/sonner.js.map +1 -0
  285. package/dist/components/stage-type-badge.d.ts +30 -0
  286. package/dist/components/stage-type-badge.js +5 -0
  287. package/dist/components/stage-type-badge.js.map +1 -0
  288. package/dist/components/switch.d.ts +26 -0
  289. package/dist/components/switch.js +4 -0
  290. package/dist/components/switch.js.map +1 -0
  291. package/dist/components/table.d.ts +57 -0
  292. package/dist/components/table.js +4 -0
  293. package/dist/components/table.js.map +1 -0
  294. package/dist/components/tabs.d.ts +39 -0
  295. package/dist/components/tabs.js +4 -0
  296. package/dist/components/tabs.js.map +1 -0
  297. package/dist/components/tag-input.d.ts +40 -0
  298. package/dist/components/tag-input.js +5 -0
  299. package/dist/components/tag-input.js.map +1 -0
  300. package/dist/components/textarea.d.ts +21 -0
  301. package/dist/components/textarea.js +4 -0
  302. package/dist/components/textarea.js.map +1 -0
  303. package/dist/components/time-picker.d.ts +57 -0
  304. package/dist/components/time-picker.js +8 -0
  305. package/dist/components/time-picker.js.map +1 -0
  306. package/dist/components/toggle-group.d.ts +45 -0
  307. package/dist/components/toggle-group.js +5 -0
  308. package/dist/components/toggle-group.js.map +1 -0
  309. package/dist/components/toggle.d.ts +31 -0
  310. package/dist/components/toggle.js +4 -0
  311. package/dist/components/toggle.js.map +1 -0
  312. package/dist/components/tooltip.d.ts +34 -0
  313. package/dist/components/tooltip.js +4 -0
  314. package/dist/components/tooltip.js.map +1 -0
  315. package/dist/components/workflow-category-badge.d.ts +32 -0
  316. package/dist/components/workflow-category-badge.js +5 -0
  317. package/dist/components/workflow-category-badge.js.map +1 -0
  318. package/dist/components/workflow-diagram.d.ts +63 -0
  319. package/dist/components/workflow-diagram.js +5 -0
  320. package/dist/components/workflow-diagram.js.map +1 -0
  321. package/dist/components/workflow-status-badge.d.ts +30 -0
  322. package/dist/components/workflow-status-badge.js +5 -0
  323. package/dist/components/workflow-status-badge.js.map +1 -0
  324. package/dist/components/workflow-stepper.d.ts +52 -0
  325. package/dist/components/workflow-stepper.js +4 -0
  326. package/dist/components/workflow-stepper.js.map +1 -0
  327. package/dist/hooks/use-mobile.d.ts +3 -3
  328. package/dist/hooks/use-mobile.js +1 -1
  329. package/dist/hooks/use-mobile.js.map +1 -1
  330. package/dist/index.d.ts +98 -16
  331. package/dist/index.js +62 -13
  332. package/dist/lib/types.d.ts +84 -1
  333. package/dist/lib/types.js +1 -1
  334. package/dist/lib/types.js.map +1 -1
  335. package/dist/lib/utils.d.ts +5 -1
  336. package/dist/lib/utils.js +1 -1
  337. package/dist/lib/utils.js.map +1 -1
  338. package/package.json +68 -31
  339. package/src/styles/fonts.css +0 -0
  340. package/src/styles/index.css +3 -1
  341. package/src/styles/tailwind.css +4 -0
  342. package/src/styles/theme.css +461 -0
  343. package/dist/chunk-2GN4WIOV.js +0 -240
  344. package/dist/chunk-2GN4WIOV.js.map +0 -1
  345. package/dist/chunk-5BL4VFRJ.js +0 -57
  346. package/dist/chunk-5BL4VFRJ.js.map +0 -1
  347. package/dist/chunk-735JNJJO.js +0 -27
  348. package/dist/chunk-735JNJJO.js.map +0 -1
  349. package/dist/chunk-EJEVW4RO.js +0 -49
  350. package/dist/chunk-EJEVW4RO.js.map +0 -1
  351. package/dist/chunk-FVOQZTHE.js +0 -191
  352. package/dist/chunk-FVOQZTHE.js.map +0 -1
  353. package/dist/chunk-ITXOZ4IR.js +0 -85
  354. package/dist/chunk-ITXOZ4IR.js.map +0 -1
  355. package/dist/chunk-NVPNMQSR.js +0 -30
  356. package/dist/chunk-NVPNMQSR.js.map +0 -1
  357. package/dist/chunk-O25D7DCP.js +0 -72
  358. package/dist/chunk-O25D7DCP.js.map +0 -1
  359. package/dist/chunk-O2ADW2GC.js +0 -224
  360. package/dist/chunk-O2ADW2GC.js.map +0 -1
  361. package/dist/chunk-OY3PSPA5.js +0 -661
  362. package/dist/chunk-OY3PSPA5.js.map +0 -1
  363. package/dist/chunk-UASABUQA.js +0 -39
  364. package/dist/chunk-UASABUQA.js.map +0 -1
  365. package/dist/chunk-UR2QLIS2.js +0 -93
  366. package/dist/chunk-UR2QLIS2.js.map +0 -1
  367. package/dist/chunk-XDXGUPCR.js +0 -123
  368. package/dist/chunk-XDXGUPCR.js.map +0 -1
  369. package/dist/components/AppShell.d.ts +0 -27
  370. package/dist/components/AppShell.js +0 -13
  371. package/dist/components/AppShell.js.map +0 -1
  372. package/dist/components/Header.d.ts +0 -11
  373. package/dist/components/Header.js +0 -9
  374. package/dist/components/Header.js.map +0 -1
  375. package/dist/components/LanguageSelector.d.ts +0 -11
  376. package/dist/components/LanguageSelector.js +0 -5
  377. package/dist/components/LanguageSelector.js.map +0 -1
  378. package/dist/components/OrganizationSelector.d.ts +0 -8
  379. package/dist/components/OrganizationSelector.js +0 -4
  380. package/dist/components/OrganizationSelector.js.map +0 -1
  381. package/dist/components/OrganizationSetupModal.d.ts +0 -5
  382. package/dist/components/OrganizationSetupModal.js +0 -4
  383. package/dist/components/OrganizationSetupModal.js.map +0 -1
  384. package/dist/components/PageContainer.d.ts +0 -105
  385. package/dist/components/PageContainer.js +0 -3
  386. package/dist/components/PageContainer.js.map +0 -1
  387. package/dist/components/ServiceMenu.d.ts +0 -11
  388. package/dist/components/ServiceMenu.js +0 -3
  389. package/dist/components/ServiceMenu.js.map +0 -1
  390. package/dist/components/Sidebar.d.ts +0 -11
  391. package/dist/components/Sidebar.js +0 -5
  392. package/dist/components/Sidebar.js.map +0 -1
  393. package/dist/contexts/LanguageContext.d.ts +0 -17
  394. package/dist/contexts/LanguageContext.js +0 -4
  395. package/dist/contexts/LanguageContext.js.map +0 -1
  396. package/dist/contexts/OrganizationContext.d.ts +0 -28
  397. package/dist/contexts/OrganizationContext.js +0 -3
  398. package/dist/contexts/OrganizationContext.js.map +0 -1
  399. package/dist/contexts/ThemeContext.d.ts +0 -14
  400. package/dist/contexts/ThemeContext.js +0 -3
  401. package/dist/contexts/ThemeContext.js.map +0 -1
  402. package/dist/hooks/useDateFormat.d.ts +0 -28
  403. package/dist/hooks/useDateFormat.js +0 -4
  404. package/dist/hooks/useDateFormat.js.map +0 -1
  405. package/dist/i18n.d.ts +0 -38
  406. package/dist/i18n.js +0 -3
  407. package/dist/i18n.js.map +0 -1
  408. package/dist/types.d.ts +0 -91
  409. package/dist/types.js +0 -3
  410. package/dist/types.js.map +0 -1
@@ -0,0 +1,109 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ function Table({ className, ...props }) {
5
+ return /* @__PURE__ */ jsx(
6
+ "div",
7
+ {
8
+ "data-slot": "table-container",
9
+ className: "relative w-full overflow-x-auto",
10
+ children: /* @__PURE__ */ jsx(
11
+ "table",
12
+ {
13
+ "data-slot": "table",
14
+ className: cn("w-full caption-bottom text-sm", className),
15
+ ...props
16
+ }
17
+ )
18
+ }
19
+ );
20
+ }
21
+ function TableHeader({ className, ...props }) {
22
+ return /* @__PURE__ */ jsx(
23
+ "thead",
24
+ {
25
+ "data-slot": "table-header",
26
+ className: cn("[&_tr]:border-b", className),
27
+ ...props
28
+ }
29
+ );
30
+ }
31
+ function TableBody({ className, ...props }) {
32
+ return /* @__PURE__ */ jsx(
33
+ "tbody",
34
+ {
35
+ "data-slot": "table-body",
36
+ className: cn("[&_tr:last-child]:border-0", className),
37
+ ...props
38
+ }
39
+ );
40
+ }
41
+ function TableFooter({ className, ...props }) {
42
+ return /* @__PURE__ */ jsx(
43
+ "tfoot",
44
+ {
45
+ "data-slot": "table-footer",
46
+ className: cn(
47
+ "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0",
48
+ className
49
+ ),
50
+ ...props
51
+ }
52
+ );
53
+ }
54
+ function TableRow({ className, ...props }) {
55
+ return /* @__PURE__ */ jsx(
56
+ "tr",
57
+ {
58
+ "data-slot": "table-row",
59
+ className: cn(
60
+ "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
61
+ className
62
+ ),
63
+ ...props
64
+ }
65
+ );
66
+ }
67
+ function TableHead({ className, ...props }) {
68
+ return /* @__PURE__ */ jsx(
69
+ "th",
70
+ {
71
+ "data-slot": "table-head",
72
+ className: cn(
73
+ "text-foreground h-table-head px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
74
+ className
75
+ ),
76
+ ...props
77
+ }
78
+ );
79
+ }
80
+ function TableCell({ className, ...props }) {
81
+ return /* @__PURE__ */ jsx(
82
+ "td",
83
+ {
84
+ "data-slot": "table-cell",
85
+ className: cn(
86
+ "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
87
+ className
88
+ ),
89
+ ...props
90
+ }
91
+ );
92
+ }
93
+ function TableCaption({
94
+ className,
95
+ ...props
96
+ }) {
97
+ return /* @__PURE__ */ jsx(
98
+ "caption",
99
+ {
100
+ "data-slot": "table-caption",
101
+ className: cn("text-muted-foreground mt-4 text-sm", className),
102
+ ...props
103
+ }
104
+ );
105
+ }
106
+
107
+ export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
108
+ //# sourceMappingURL=chunk-S6PDRGR5.js.map
109
+ //# sourceMappingURL=chunk-S6PDRGR5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/table.tsx"],"names":[],"mappings":";;;AAyCA,SAAS,KAAA,CAAM,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AACrE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAU,iCAAA;AAAA,MAEV,QAAA,kBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAU,OAAA;AAAA,UACV,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,UACvD,GAAG;AAAA;AAAA;AACN;AAAA,GACF;AAEJ;AAGA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MACzC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,MACpD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,yDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACrE,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,6EAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACtE,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,4JAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACtE,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,YAAA,CAAa;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoC;AAClC,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC5D,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-S6PDRGR5.js","sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Data table component with header, body, footer, row, head, cell, and caption sub-components.\n *\n * Renders inside a horizontally scrollable container. Uses density tokens for\n * consistent header height (`h-table-head`) and cell padding.\n *\n * @example\n * ```tsx\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>Name</TableHead>\n * <TableHead>Email</TableHead>\n * <TableHead>Role</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>Alice</TableCell>\n * <TableCell>alice@example.com</TableCell>\n * <TableCell>Admin</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Bob</TableCell>\n * <TableCell>bob@example.com</TableCell>\n * <TableCell>Member</TableCell>\n * </TableRow>\n * </TableBody>\n * <TableFooter>\n * <TableRow>\n * <TableCell colSpan={3}>2 users total</TableCell>\n * </TableRow>\n * </TableFooter>\n * <TableCaption>A list of team members.</TableCaption>\n * </Table>\n * ```\n */\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\n/** Table header container. Groups `TableRow` elements for column headings. */\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n );\n}\n\n/** Table body container. Groups `TableRow` elements for data rows. */\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\n/** Table footer container. Renders with a muted background and top border. */\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Table row with hover highlight and selected state support via `data-state=\"selected\"`. */\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Table head cell. Renders as a `<th>` with density-based height (`h-table-head`). */\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground h-table-head px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Table data cell. Renders as a `<td>` with consistent padding and alignment. */\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Table caption displayed below the table in muted text. */\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};"]}
@@ -0,0 +1,95 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ var alertVariants = cva(
6
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
7
+ {
8
+ variants: {
9
+ variant: {
10
+ // Bordered card style — color applied via compoundVariants
11
+ default: "",
12
+ // Legacy — maps to default + destructive color (backward compatible)
13
+ destructive: "",
14
+ // Filled background style — color applied via compoundVariants
15
+ soft: ""
16
+ },
17
+ color: {
18
+ primary: "",
19
+ destructive: "",
20
+ success: "",
21
+ warning: "",
22
+ info: ""
23
+ }
24
+ },
25
+ compoundVariants: [
26
+ // ── Default (bordered) × color ──
27
+ { variant: "default", color: "primary", className: "bg-card text-card-foreground" },
28
+ { variant: "default", color: "destructive", className: "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90" },
29
+ { variant: "default", color: "success", className: "text-success bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-success/90" },
30
+ { variant: "default", color: "warning", className: "text-warning bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-warning/90" },
31
+ { variant: "default", color: "info", className: "text-info bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-info/90" },
32
+ // ── Legacy destructive variant (backward compat) ──
33
+ { variant: "destructive", className: "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90" },
34
+ // ── Soft (filled bg) × color ──
35
+ { variant: "soft", color: "primary", className: "bg-primary/10 text-primary border-primary/20 [&>svg]:text-current *:data-[slot=alert-description]:text-primary/90" },
36
+ { variant: "soft", color: "destructive", className: "bg-destructive/10 text-destructive border-destructive/20 [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90" },
37
+ { variant: "soft", color: "success", className: "bg-success/10 text-success border-success/20 [&>svg]:text-current *:data-[slot=alert-description]:text-success/90" },
38
+ { variant: "soft", color: "warning", className: "bg-warning/10 text-warning border-warning/20 [&>svg]:text-current *:data-[slot=alert-description]:text-warning/90" },
39
+ { variant: "soft", color: "info", className: "bg-info/10 text-info border-info/20 [&>svg]:text-current *:data-[slot=alert-description]:text-info/90" }
40
+ ],
41
+ defaultVariants: {
42
+ variant: "default",
43
+ color: "primary"
44
+ }
45
+ }
46
+ );
47
+ function Alert({
48
+ className,
49
+ variant,
50
+ color,
51
+ ...props
52
+ }) {
53
+ return /* @__PURE__ */ jsx(
54
+ "div",
55
+ {
56
+ "data-slot": "alert",
57
+ role: "alert",
58
+ className: cn(alertVariants({ variant, color }), className),
59
+ ...props
60
+ }
61
+ );
62
+ }
63
+ function AlertTitle({ className, ...props }) {
64
+ return /* @__PURE__ */ jsx(
65
+ "div",
66
+ {
67
+ "data-slot": "alert-title",
68
+ className: cn(
69
+ "col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",
70
+ className
71
+ ),
72
+ ...props
73
+ }
74
+ );
75
+ }
76
+ function AlertDescription({
77
+ className,
78
+ ...props
79
+ }) {
80
+ return /* @__PURE__ */ jsx(
81
+ "div",
82
+ {
83
+ "data-slot": "alert-description",
84
+ className: cn(
85
+ "text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",
86
+ className
87
+ ),
88
+ ...props
89
+ }
90
+ );
91
+ }
92
+
93
+ export { Alert, AlertDescription, AlertTitle };
94
+ //# sourceMappingURL=chunk-TGYQ3AKH.js.map
95
+ //# sourceMappingURL=chunk-TGYQ3AKH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/alert.tsx"],"names":[],"mappings":"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","file":"chunk-TGYQ3AKH.js","sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\nimport type { UIColor } from \"../lib/types\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n // Bordered card style — color applied via compoundVariants\n default: \"\",\n // Legacy — maps to default + destructive color (backward compatible)\n destructive: \"\",\n // Filled background style — color applied via compoundVariants\n soft: \"\",\n },\n color: {\n primary: \"\",\n destructive: \"\",\n success: \"\",\n warning: \"\",\n info: \"\",\n },\n },\n compoundVariants: [\n // ── Default (bordered) × color ──\n { variant: \"default\", color: \"primary\", className: \"bg-card text-card-foreground\" },\n { variant: \"default\", color: \"destructive\", className: \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\" },\n { variant: \"default\", color: \"success\", className: \"text-success bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-success/90\" },\n { variant: \"default\", color: \"warning\", className: \"text-warning bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-warning/90\" },\n { variant: \"default\", color: \"info\", className: \"text-info bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-info/90\" },\n\n // ── Legacy destructive variant (backward compat) ──\n { variant: \"destructive\", className: \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\" },\n\n // ── Soft (filled bg) × color ──\n { variant: \"soft\", color: \"primary\", className: \"bg-primary/10 text-primary border-primary/20 [&>svg]:text-current *:data-[slot=alert-description]:text-primary/90\" },\n { variant: \"soft\", color: \"destructive\", className: \"bg-destructive/10 text-destructive border-destructive/20 [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\" },\n { variant: \"soft\", color: \"success\", className: \"bg-success/10 text-success border-success/20 [&>svg]:text-current *:data-[slot=alert-description]:text-success/90\" },\n { variant: \"soft\", color: \"warning\", className: \"bg-warning/10 text-warning border-warning/20 [&>svg]:text-current *:data-[slot=alert-description]:text-warning/90\" },\n { variant: \"soft\", color: \"info\", className: \"bg-info/10 text-info border-info/20 [&>svg]:text-current *:data-[slot=alert-description]:text-info/90\" },\n ],\n defaultVariants: {\n variant: \"default\",\n color: \"primary\",\n },\n },\n);\n\ninterface AlertProps\n extends React.ComponentProps<\"div\">,\n Omit<VariantProps<typeof alertVariants>, \"color\"> {\n /**\n * Semantic color intent.\n *\n * @default \"primary\"\n * @example\n * ```tsx\n * <Alert color=\"success\">Operation completed</Alert>\n * <Alert color=\"warning\">Check your input</Alert>\n * <Alert variant=\"soft\" color=\"info\">Tip</Alert>\n * ```\n */\n color?: UIColor;\n}\n\n/**\n * Static alert banner for displaying important messages.\n *\n * Supports semantic colors via `color` prop and two visual styles: `default` (bordered)\n * and `soft` (filled background). All existing `variant=\"destructive\"` usage continues to work.\n *\n * @example\n * ```tsx\n * // Default (bordered)\n * <Alert>\n * <InfoIcon className=\"size-4\" />\n * <AlertTitle>Heads up!</AlertTitle>\n * <AlertDescription>You can add components using the CLI.</AlertDescription>\n * </Alert>\n *\n * // Semantic colors\n * <Alert color=\"success\">\n * <CheckIcon className=\"size-4\" />\n * <AlertTitle>Success</AlertTitle>\n * <AlertDescription>Changes saved successfully.</AlertDescription>\n * </Alert>\n *\n * // Soft variant (filled background)\n * <Alert variant=\"soft\" color=\"warning\">\n * <AlertTriangleIcon className=\"size-4\" />\n * <AlertTitle>Warning</AlertTitle>\n * <AlertDescription>This action cannot be undone.</AlertDescription>\n * </Alert>\n *\n * // Legacy (still works)\n * <Alert variant=\"destructive\">\n * <AlertCircleIcon className=\"size-4\" />\n * <AlertTitle>Error</AlertTitle>\n * <AlertDescription>Session expired.</AlertDescription>\n * </Alert>\n * ```\n */\nfunction Alert({\n className,\n variant,\n color,\n ...props\n}: AlertProps) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant, color }), className)}\n {...props}\n />\n );\n}\n\n/** Bold title text within an Alert. Rendered in the second grid column when an icon is present. */\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Descriptive body text within an Alert, rendered below the title. */\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription };\n"]}
@@ -0,0 +1,112 @@
1
+ import { Checkbox } from './chunk-WL4ZO2H3.js';
2
+ import { cn } from './chunk-DGPY4WP3.js';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ var defaultLabels = {
6
+ moduleHeader: "Module",
7
+ selectAll: "Select All"
8
+ };
9
+ function buildPermissionId(moduleKey, permissionKey) {
10
+ return `${moduleKey}:${permissionKey}`;
11
+ }
12
+ function collectColumns(modules) {
13
+ const seen = /* @__PURE__ */ new Set();
14
+ const columns = [];
15
+ for (const mod of modules) {
16
+ for (const perm of mod.permissions) {
17
+ if (!seen.has(perm.key)) {
18
+ seen.add(perm.key);
19
+ columns.push(perm.key);
20
+ }
21
+ }
22
+ }
23
+ return columns;
24
+ }
25
+ function getColumnLabel(modules, key) {
26
+ for (const mod of modules) {
27
+ const perm = mod.permissions.find((p) => p.key === key);
28
+ if (perm) return perm.label;
29
+ }
30
+ return key;
31
+ }
32
+ function PermissionGrid({
33
+ modules,
34
+ selectedIds,
35
+ onChange,
36
+ readOnly = false,
37
+ labels: labelOverrides
38
+ }) {
39
+ const labels = { ...defaultLabels, ...labelOverrides };
40
+ const columns = collectColumns(modules);
41
+ const togglePermission = (permId) => {
42
+ if (readOnly || !onChange) return;
43
+ if (selectedIds.includes(permId)) {
44
+ onChange(selectedIds.filter((id) => id !== permId));
45
+ } else {
46
+ onChange([...selectedIds, permId]);
47
+ }
48
+ };
49
+ const toggleModule = (mod) => {
50
+ if (readOnly || !onChange) return;
51
+ const modulePermIds = mod.permissions.map((p) => buildPermissionId(mod.key, p.key));
52
+ const allSelected = modulePermIds.every((id) => selectedIds.includes(id));
53
+ if (allSelected) {
54
+ onChange(selectedIds.filter((id) => !modulePermIds.includes(id)));
55
+ } else {
56
+ const newIds = /* @__PURE__ */ new Set([...selectedIds, ...modulePermIds]);
57
+ onChange(Array.from(newIds));
58
+ }
59
+ };
60
+ const isModuleAllSelected = (mod) => {
61
+ const modulePermIds = mod.permissions.map((p) => buildPermissionId(mod.key, p.key));
62
+ return modulePermIds.length > 0 && modulePermIds.every((id) => selectedIds.includes(id));
63
+ };
64
+ return /* @__PURE__ */ jsx("div", { className: "border border-border rounded-lg overflow-hidden", children: /* @__PURE__ */ jsxs("table", { className: "w-full", children: [
65
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "bg-muted/50", children: [
66
+ /* @__PURE__ */ jsx("th", { className: "text-left text-xs font-medium text-muted-foreground uppercase tracking-wider px-4 h-table-head", children: labels.moduleHeader }),
67
+ columns.map((colKey) => /* @__PURE__ */ jsx(
68
+ "th",
69
+ {
70
+ className: "text-center text-xs font-medium text-muted-foreground uppercase tracking-wider px-2 h-table-head w-20",
71
+ children: getColumnLabel(modules, colKey)
72
+ },
73
+ colKey
74
+ )),
75
+ !readOnly && /* @__PURE__ */ jsx("th", { className: "text-center text-xs font-medium text-muted-foreground uppercase tracking-wider px-2 h-table-head w-20", children: labels.selectAll })
76
+ ] }) }),
77
+ /* @__PURE__ */ jsx("tbody", { children: modules.map((mod, idx) => {
78
+ const modPermKeys = new Set(mod.permissions.map((p) => p.key));
79
+ return /* @__PURE__ */ jsxs("tr", { className: cn(idx % 2 === 0 ? "bg-background" : "bg-muted/20"), children: [
80
+ /* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-sm font-medium", children: mod.label }),
81
+ columns.map((colKey) => {
82
+ if (!modPermKeys.has(colKey)) {
83
+ return /* @__PURE__ */ jsx("td", { className: "text-center px-2 py-3", children: /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }) }, colKey);
84
+ }
85
+ const permId = buildPermissionId(mod.key, colKey);
86
+ const checked = selectedIds.includes(permId);
87
+ return /* @__PURE__ */ jsx("td", { className: "text-center px-2 py-3", children: /* @__PURE__ */ jsx(
88
+ Checkbox,
89
+ {
90
+ checked,
91
+ onCheckedChange: () => togglePermission(permId),
92
+ disabled: readOnly,
93
+ className: "mx-auto"
94
+ }
95
+ ) }, colKey);
96
+ }),
97
+ !readOnly && /* @__PURE__ */ jsx("td", { className: "text-center px-2 py-3", children: /* @__PURE__ */ jsx(
98
+ Checkbox,
99
+ {
100
+ checked: isModuleAllSelected(mod),
101
+ onCheckedChange: () => toggleModule(mod),
102
+ className: "mx-auto"
103
+ }
104
+ ) })
105
+ ] }, mod.key);
106
+ }) })
107
+ ] }) });
108
+ }
109
+
110
+ export { PermissionGrid, buildPermissionId };
111
+ //# sourceMappingURL=chunk-TJMK2KBE.js.map
112
+ //# sourceMappingURL=chunk-TJMK2KBE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/permission-grid.tsx"],"names":[],"mappings":"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","file":"chunk-TJMK2KBE.js","sourcesContent":["import { Checkbox } from './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"]}
@@ -0,0 +1,211 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import * as ContextMenuPrimitive from '@radix-ui/react-context-menu';
3
+ import { ChevronRightIcon, CheckIcon, CircleIcon } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function ContextMenu({
7
+ ...props
8
+ }) {
9
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Root, { "data-slot": "context-menu", ...props });
10
+ }
11
+ function ContextMenuTrigger({
12
+ ...props
13
+ }) {
14
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Trigger, { "data-slot": "context-menu-trigger", ...props });
15
+ }
16
+ function ContextMenuGroup({
17
+ ...props
18
+ }) {
19
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Group, { "data-slot": "context-menu-group", ...props });
20
+ }
21
+ function ContextMenuPortal({
22
+ ...props
23
+ }) {
24
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { "data-slot": "context-menu-portal", ...props });
25
+ }
26
+ function ContextMenuSub({
27
+ ...props
28
+ }) {
29
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Sub, { "data-slot": "context-menu-sub", ...props });
30
+ }
31
+ function ContextMenuRadioGroup({
32
+ ...props
33
+ }) {
34
+ return /* @__PURE__ */ jsx(
35
+ ContextMenuPrimitive.RadioGroup,
36
+ {
37
+ "data-slot": "context-menu-radio-group",
38
+ ...props
39
+ }
40
+ );
41
+ }
42
+ function ContextMenuSubTrigger({
43
+ className,
44
+ inset,
45
+ children,
46
+ ...props
47
+ }) {
48
+ return /* @__PURE__ */ jsxs(
49
+ ContextMenuPrimitive.SubTrigger,
50
+ {
51
+ "data-slot": "context-menu-sub-trigger",
52
+ "data-inset": inset,
53
+ className: cn(
54
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
55
+ className
56
+ ),
57
+ ...props,
58
+ children: [
59
+ children,
60
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto" })
61
+ ]
62
+ }
63
+ );
64
+ }
65
+ function ContextMenuSubContent({
66
+ className,
67
+ ...props
68
+ }) {
69
+ return /* @__PURE__ */ jsx(
70
+ ContextMenuPrimitive.SubContent,
71
+ {
72
+ "data-slot": "context-menu-sub-content",
73
+ className: cn(
74
+ "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 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
75
+ className
76
+ ),
77
+ ...props
78
+ }
79
+ );
80
+ }
81
+ function ContextMenuContent({
82
+ className,
83
+ ...props
84
+ }) {
85
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
86
+ ContextMenuPrimitive.Content,
87
+ {
88
+ "data-slot": "context-menu-content",
89
+ className: cn(
90
+ "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 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
91
+ className
92
+ ),
93
+ ...props
94
+ }
95
+ ) });
96
+ }
97
+ function ContextMenuItem({
98
+ className,
99
+ inset,
100
+ variant = "default",
101
+ ...props
102
+ }) {
103
+ return /* @__PURE__ */ jsx(
104
+ ContextMenuPrimitive.Item,
105
+ {
106
+ "data-slot": "context-menu-item",
107
+ "data-inset": inset,
108
+ "data-variant": variant,
109
+ className: cn(
110
+ "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
111
+ className
112
+ ),
113
+ ...props
114
+ }
115
+ );
116
+ }
117
+ function ContextMenuCheckboxItem({
118
+ className,
119
+ children,
120
+ checked,
121
+ ...props
122
+ }) {
123
+ return /* @__PURE__ */ jsxs(
124
+ ContextMenuPrimitive.CheckboxItem,
125
+ {
126
+ "data-slot": "context-menu-checkbox-item",
127
+ className: cn(
128
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
129
+ className
130
+ ),
131
+ checked,
132
+ ...props,
133
+ children: [
134
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) }) }),
135
+ children
136
+ ]
137
+ }
138
+ );
139
+ }
140
+ function ContextMenuRadioItem({
141
+ className,
142
+ children,
143
+ ...props
144
+ }) {
145
+ return /* @__PURE__ */ jsxs(
146
+ ContextMenuPrimitive.RadioItem,
147
+ {
148
+ "data-slot": "context-menu-radio-item",
149
+ className: cn(
150
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
151
+ className
152
+ ),
153
+ ...props,
154
+ children: [
155
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current" }) }) }),
156
+ children
157
+ ]
158
+ }
159
+ );
160
+ }
161
+ function ContextMenuLabel({
162
+ className,
163
+ inset,
164
+ ...props
165
+ }) {
166
+ return /* @__PURE__ */ jsx(
167
+ ContextMenuPrimitive.Label,
168
+ {
169
+ "data-slot": "context-menu-label",
170
+ "data-inset": inset,
171
+ className: cn(
172
+ "text-foreground px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
173
+ className
174
+ ),
175
+ ...props
176
+ }
177
+ );
178
+ }
179
+ function ContextMenuSeparator({
180
+ className,
181
+ ...props
182
+ }) {
183
+ return /* @__PURE__ */ jsx(
184
+ ContextMenuPrimitive.Separator,
185
+ {
186
+ "data-slot": "context-menu-separator",
187
+ className: cn("bg-border -mx-1 my-1 h-px", className),
188
+ ...props
189
+ }
190
+ );
191
+ }
192
+ function ContextMenuShortcut({
193
+ className,
194
+ ...props
195
+ }) {
196
+ return /* @__PURE__ */ jsx(
197
+ "span",
198
+ {
199
+ "data-slot": "context-menu-shortcut",
200
+ className: cn(
201
+ "text-muted-foreground ml-auto text-xs tracking-widest",
202
+ className
203
+ ),
204
+ ...props
205
+ }
206
+ );
207
+ }
208
+
209
+ export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger };
210
+ //# sourceMappingURL=chunk-USIHM7FV.js.map
211
+ //# sourceMappingURL=chunk-USIHM7FV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/context-menu.tsx"],"names":[],"mappings":"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","file":"chunk-USIHM7FV.js","sourcesContent":["import * as React from \"react\";\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Right-click context menu built on Radix UI ContextMenu.\n *\n * Displays a menu of actions when the user right-clicks (or long-presses)\n * on the trigger area. Supports items, checkbox items, radio items,\n * sub-menus, separators, labels, and shortcuts.\n *\n * @example\n * ```tsx\n * <ContextMenu>\n * <ContextMenuTrigger className=\"flex h-40 w-64 items-center justify-center rounded-md border border-dashed\">\n * Right click here\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuItem>\n * Copy\n * <ContextMenuShortcut>Ctrl+C</ContextMenuShortcut>\n * </ContextMenuItem>\n * <ContextMenuItem>\n * Paste\n * <ContextMenuShortcut>Ctrl+V</ContextMenuShortcut>\n * </ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuItem variant=\"destructive\">Delete</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n * ```\n */\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n}\n\n/** Area that opens the context menu on right-click. */\nfunction ContextMenuTrigger({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />\n );\n}\n\n/** Groups related context menu items together for accessibility. */\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n );\n}\n\n/** Portal that renders context menu content outside the DOM hierarchy. */\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n );\n}\n\n/** Container for a nested sub-menu within the context menu. */\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />;\n}\n\n/** Container for radio context menu items where only one can be selected at a time. */\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n );\n}\n\n/** Menu item that opens a sub-menu on hover. Displays a chevron indicator. */\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n );\n}\n\n/** Floating container for sub-menu items. */\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\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 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Floating container for context menu items, positioned at the cursor location. */\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\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 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n}\n\n/** Actionable menu item. Set `variant=\"destructive\"` for dangerous actions, `inset` for left-padding alignment. */\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Menu item with a checkbox indicator for toggling options. */\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n}\n\n/** Menu item with a radio indicator for single-selection groups. */\nfunction ContextMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n}\n\n/** Non-interactive label used to title a group of menu items. */\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"text-foreground px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Visual divider between groups of menu items. */\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\n/** Keyboard shortcut hint displayed at the end of a menu item. */\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n};"]}