@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,187 @@
1
+ import { Button } from './chunk-55E7D2HR.js';
2
+ import { cn } from './chunk-DGPY4WP3.js';
3
+ import * as React from 'react';
4
+ import { Upload, X, FileImage, FileVideo, FileText, File } from 'lucide-react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function FileUpload({
8
+ value = [],
9
+ onChange,
10
+ accept,
11
+ multiple = false,
12
+ maxSize = 10 * 1024 * 1024,
13
+ // 10MB default
14
+ maxFiles,
15
+ disabled,
16
+ className,
17
+ showPreview = true
18
+ }) {
19
+ const inputRef = React.useRef(null);
20
+ const [dragActive, setDragActive] = React.useState(false);
21
+ const [error, setError] = React.useState("");
22
+ const handleDrag = (e) => {
23
+ e.preventDefault();
24
+ e.stopPropagation();
25
+ if (e.type === "dragenter" || e.type === "dragover") {
26
+ setDragActive(true);
27
+ } else if (e.type === "dragleave") {
28
+ setDragActive(false);
29
+ }
30
+ };
31
+ const validateFiles = (files) => {
32
+ setError("");
33
+ if (maxFiles && value.length + files.length > maxFiles) {
34
+ return {
35
+ valid: [],
36
+ error: `Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn t\u1ED1i \u0111a ${maxFiles} file`
37
+ };
38
+ }
39
+ const oversizedFiles = files.filter((file) => file.size > maxSize);
40
+ if (oversizedFiles.length > 0) {
41
+ return {
42
+ valid: [],
43
+ error: `File v\u01B0\u1EE3t qu\xE1 dung l\u01B0\u1EE3ng cho ph\xE9p (${Math.round(maxSize / 1024 / 1024)}MB)`
44
+ };
45
+ }
46
+ return { valid: files };
47
+ };
48
+ const handleDrop = (e) => {
49
+ e.preventDefault();
50
+ e.stopPropagation();
51
+ setDragActive(false);
52
+ if (disabled) return;
53
+ const droppedFiles = Array.from(e.dataTransfer.files);
54
+ const { valid, error: error2 } = validateFiles(droppedFiles);
55
+ if (error2) {
56
+ setError(error2);
57
+ return;
58
+ }
59
+ onChange?.([...value, ...valid]);
60
+ };
61
+ const handleChange = (e) => {
62
+ if (disabled) return;
63
+ const selectedFiles = Array.from(e.target.files || []);
64
+ const { valid, error: error2 } = validateFiles(selectedFiles);
65
+ if (error2) {
66
+ setError(error2);
67
+ return;
68
+ }
69
+ onChange?.([...value, ...valid]);
70
+ if (inputRef.current) {
71
+ inputRef.current.value = "";
72
+ }
73
+ };
74
+ const handleRemove = (index) => {
75
+ onChange?.(value.filter((_, i) => i !== index));
76
+ };
77
+ const getFileIcon = (file) => {
78
+ if (file.type.startsWith("image/")) return FileImage;
79
+ if (file.type.startsWith("video/")) return FileVideo;
80
+ if (file.type.startsWith("text/")) return FileText;
81
+ return File;
82
+ };
83
+ const formatFileSize = (bytes) => {
84
+ if (bytes === 0) return "0 Bytes";
85
+ const k = 1024;
86
+ const sizes = ["Bytes", "KB", "MB", "GB"];
87
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
88
+ return Math.round(bytes / Math.pow(k, i) * 100) / 100 + " " + sizes[i];
89
+ };
90
+ return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
91
+ /* @__PURE__ */ jsx(
92
+ "input",
93
+ {
94
+ ref: inputRef,
95
+ type: "file",
96
+ accept,
97
+ multiple,
98
+ onChange: handleChange,
99
+ disabled,
100
+ className: "hidden"
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsxs(
104
+ "div",
105
+ {
106
+ onDragEnter: handleDrag,
107
+ onDragLeave: handleDrag,
108
+ onDragOver: handleDrag,
109
+ onDrop: handleDrop,
110
+ onClick: () => !disabled && inputRef.current?.click(),
111
+ className: cn(
112
+ "relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors",
113
+ dragActive ? "border-primary bg-primary/5" : "border-border hover:border-border/80",
114
+ disabled && "opacity-50 cursor-not-allowed",
115
+ error && "border-destructive"
116
+ ),
117
+ children: [
118
+ /* @__PURE__ */ jsx(Upload, { className: "mx-auto h-12 w-12 text-muted-foreground mb-4" }),
119
+ /* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground mb-2", children: [
120
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-primary", children: "Nh\u1EA5p \u0111\u1EC3 ch\u1ECDn file" }),
121
+ " ",
122
+ "ho\u1EB7c k\xE9o th\u1EA3 file v\xE0o \u0111\xE2y"
123
+ ] }),
124
+ /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
125
+ accept && /* @__PURE__ */ jsxs("div", { children: [
126
+ "\u0110\u1ECBnh d\u1EA1ng: ",
127
+ accept
128
+ ] }),
129
+ /* @__PURE__ */ jsxs("div", { children: [
130
+ "Dung l\u01B0\u1EE3ng t\u1ED1i \u0111a: ",
131
+ Math.round(maxSize / 1024 / 1024),
132
+ "MB"
133
+ ] }),
134
+ maxFiles && /* @__PURE__ */ jsxs("div", { children: [
135
+ "S\u1ED1 l\u01B0\u1EE3ng t\u1ED1i \u0111a: ",
136
+ maxFiles,
137
+ " file"
138
+ ] })
139
+ ] })
140
+ ]
141
+ }
142
+ ),
143
+ error && /* @__PURE__ */ jsx("div", { className: "mt-2 text-sm text-destructive", children: error }),
144
+ showPreview && value.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-4 space-y-2", children: value.map((file, index) => {
145
+ const FileIcon = getFileIcon(file);
146
+ const isImage = file.type.startsWith("image/");
147
+ const previewUrl = isImage ? URL.createObjectURL(file) : null;
148
+ return /* @__PURE__ */ jsxs(
149
+ "div",
150
+ {
151
+ className: "flex items-center gap-3 p-3 border rounded-lg bg-muted",
152
+ children: [
153
+ previewUrl ? /* @__PURE__ */ jsx(
154
+ "img",
155
+ {
156
+ src: previewUrl,
157
+ alt: file.name,
158
+ className: "w-10 h-10 rounded object-cover"
159
+ }
160
+ ) : /* @__PURE__ */ jsx("div", { className: "w-10 h-10 rounded bg-muted flex items-center justify-center", children: /* @__PURE__ */ jsx(FileIcon, { className: "w-5 h-5 text-muted-foreground" }) }),
161
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
162
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium truncate", children: file.name }),
163
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: formatFileSize(file.size) })
164
+ ] }),
165
+ /* @__PURE__ */ jsx(
166
+ Button,
167
+ {
168
+ type: "button",
169
+ variant: "ghost",
170
+ size: "sm",
171
+ onClick: () => handleRemove(index),
172
+ disabled,
173
+ className: "flex-shrink-0",
174
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
175
+ }
176
+ )
177
+ ]
178
+ },
179
+ `${file.name}-${index}`
180
+ );
181
+ }) })
182
+ ] });
183
+ }
184
+
185
+ export { FileUpload };
186
+ //# sourceMappingURL=chunk-G7HTZBUR.js.map
187
+ //# sourceMappingURL=chunk-G7HTZBUR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/file-upload.tsx"],"names":["error"],"mappings":"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","file":"chunk-G7HTZBUR.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"]}
@@ -0,0 +1,219 @@
1
+ import { cn } from './chunk-DGPY4WP3.js';
2
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
3
+ import { CheckIcon, CircleIcon, ChevronRightIcon } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function DropdownMenu({
7
+ ...props
8
+ }) {
9
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
10
+ }
11
+ function DropdownMenuPortal({
12
+ ...props
13
+ }) {
14
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
15
+ }
16
+ function DropdownMenuTrigger({
17
+ ...props
18
+ }) {
19
+ return /* @__PURE__ */ jsx(
20
+ DropdownMenuPrimitive.Trigger,
21
+ {
22
+ "data-slot": "dropdown-menu-trigger",
23
+ ...props
24
+ }
25
+ );
26
+ }
27
+ function DropdownMenuContent({
28
+ className,
29
+ sideOffset = 4,
30
+ ...props
31
+ }) {
32
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
33
+ DropdownMenuPrimitive.Content,
34
+ {
35
+ "data-slot": "dropdown-menu-content",
36
+ sideOffset,
37
+ className: cn(
38
+ "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-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
39
+ className
40
+ ),
41
+ ...props
42
+ }
43
+ ) });
44
+ }
45
+ function DropdownMenuGroup({
46
+ ...props
47
+ }) {
48
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
49
+ }
50
+ function DropdownMenuItem({
51
+ className,
52
+ inset,
53
+ variant = "default",
54
+ ...props
55
+ }) {
56
+ return /* @__PURE__ */ jsx(
57
+ DropdownMenuPrimitive.Item,
58
+ {
59
+ "data-slot": "dropdown-menu-item",
60
+ "data-inset": inset,
61
+ "data-variant": variant,
62
+ className: cn(
63
+ "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-[var(--density-menu-item-py)] 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",
64
+ className
65
+ ),
66
+ ...props
67
+ }
68
+ );
69
+ }
70
+ function DropdownMenuCheckboxItem({
71
+ className,
72
+ children,
73
+ checked,
74
+ ...props
75
+ }) {
76
+ return /* @__PURE__ */ jsxs(
77
+ DropdownMenuPrimitive.CheckboxItem,
78
+ {
79
+ "data-slot": "dropdown-menu-checkbox-item",
80
+ className: cn(
81
+ "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",
82
+ className
83
+ ),
84
+ checked,
85
+ ...props,
86
+ children: [
87
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) }) }),
88
+ children
89
+ ]
90
+ }
91
+ );
92
+ }
93
+ function DropdownMenuRadioGroup({
94
+ ...props
95
+ }) {
96
+ return /* @__PURE__ */ jsx(
97
+ DropdownMenuPrimitive.RadioGroup,
98
+ {
99
+ "data-slot": "dropdown-menu-radio-group",
100
+ ...props
101
+ }
102
+ );
103
+ }
104
+ function DropdownMenuRadioItem({
105
+ className,
106
+ children,
107
+ ...props
108
+ }) {
109
+ return /* @__PURE__ */ jsxs(
110
+ DropdownMenuPrimitive.RadioItem,
111
+ {
112
+ "data-slot": "dropdown-menu-radio-item",
113
+ className: cn(
114
+ "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",
115
+ className
116
+ ),
117
+ ...props,
118
+ children: [
119
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current" }) }) }),
120
+ children
121
+ ]
122
+ }
123
+ );
124
+ }
125
+ function DropdownMenuLabel({
126
+ className,
127
+ inset,
128
+ ...props
129
+ }) {
130
+ return /* @__PURE__ */ jsx(
131
+ DropdownMenuPrimitive.Label,
132
+ {
133
+ "data-slot": "dropdown-menu-label",
134
+ "data-inset": inset,
135
+ className: cn(
136
+ "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
137
+ className
138
+ ),
139
+ ...props
140
+ }
141
+ );
142
+ }
143
+ function DropdownMenuSeparator({
144
+ className,
145
+ ...props
146
+ }) {
147
+ return /* @__PURE__ */ jsx(
148
+ DropdownMenuPrimitive.Separator,
149
+ {
150
+ "data-slot": "dropdown-menu-separator",
151
+ className: cn("bg-border -mx-1 my-1 h-px", className),
152
+ ...props
153
+ }
154
+ );
155
+ }
156
+ function DropdownMenuShortcut({
157
+ className,
158
+ ...props
159
+ }) {
160
+ return /* @__PURE__ */ jsx(
161
+ "span",
162
+ {
163
+ "data-slot": "dropdown-menu-shortcut",
164
+ className: cn(
165
+ "text-muted-foreground ml-auto text-xs tracking-widest",
166
+ className
167
+ ),
168
+ ...props
169
+ }
170
+ );
171
+ }
172
+ function DropdownMenuSub({
173
+ ...props
174
+ }) {
175
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
176
+ }
177
+ function DropdownMenuSubTrigger({
178
+ className,
179
+ inset,
180
+ children,
181
+ ...props
182
+ }) {
183
+ return /* @__PURE__ */ jsxs(
184
+ DropdownMenuPrimitive.SubTrigger,
185
+ {
186
+ "data-slot": "dropdown-menu-sub-trigger",
187
+ "data-inset": inset,
188
+ className: cn(
189
+ "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",
190
+ className
191
+ ),
192
+ ...props,
193
+ children: [
194
+ children,
195
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto size-4" })
196
+ ]
197
+ }
198
+ );
199
+ }
200
+ function DropdownMenuSubContent({
201
+ className,
202
+ ...props
203
+ }) {
204
+ return /* @__PURE__ */ jsx(
205
+ DropdownMenuPrimitive.SubContent,
206
+ {
207
+ "data-slot": "dropdown-menu-sub-content",
208
+ className: cn(
209
+ "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-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
210
+ className
211
+ ),
212
+ ...props
213
+ }
214
+ );
215
+ }
216
+
217
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger };
218
+ //# sourceMappingURL=chunk-IAWKX5W4.js.map
219
+ //# sourceMappingURL=chunk-IAWKX5W4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/dropdown-menu.tsx"],"names":[],"mappings":"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","file":"chunk-IAWKX5W4.js","sourcesContent":["import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Dropdown menu component built on Radix UI DropdownMenu.\n *\n * Displays a menu of actions or options triggered by a button click.\n * Supports items, checkbox items, radio items, sub-menus, separators,\n * labels, shortcuts, and destructive variants.\n *\n * @example\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">Actions</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuLabel>My Account</DropdownMenuLabel>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem>\n * <UserIcon className=\"size-4\" />\n * Profile\n * <DropdownMenuShortcut>Ctrl+P</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * <DropdownMenuItem>\n * <SettingsIcon className=\"size-4\" />\n * Settings\n * </DropdownMenuItem>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem variant=\"destructive\">\n * <TrashIcon className=\"size-4\" />\n * Delete\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n */\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\n/** Portal that renders dropdown content outside the DOM hierarchy. */\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\n/** Element that opens the dropdown menu when clicked. Use `asChild` to merge into your own button. */\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\n/** Floating container for menu items, positioned relative to the trigger. */\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\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 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\n/** Groups related menu items together for accessibility. */\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\n/** Actionable menu item. Set `variant=\"destructive\"` for dangerous actions, `inset` for left-padding alignment. */\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-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-[var(--density-menu-item-py)] 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 DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-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 <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\n/** Container for radio menu items where only one can be selected at a time. */\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\n/** Menu item with a radio indicator for single-selection groups. */\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-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 <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\n/** Non-interactive label used to title a group of menu items. */\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"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 DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-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 DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Container for a nested sub-menu within the dropdown. */\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\n/** Menu item that opens a sub-menu on hover. Displays a chevron indicator. */\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-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\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\n/** Floating container for sub-menu items. */\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-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-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};"]}