@omnifyjp/ui 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/README.md +379 -133
  2. package/dist/chunk-2ZIFL2X3.js +189 -0
  3. package/dist/chunk-2ZIFL2X3.js.map +1 -0
  4. package/dist/chunk-5BL4VFRJ.js +57 -0
  5. package/dist/chunk-5BL4VFRJ.js.map +1 -0
  6. package/dist/chunk-5D3OAVOZ.js +91 -0
  7. package/dist/chunk-5D3OAVOZ.js.map +1 -0
  8. package/dist/chunk-DTM76EJD.js +235 -0
  9. package/dist/chunk-DTM76EJD.js.map +1 -0
  10. package/dist/chunk-EJEVW4RO.js +49 -0
  11. package/dist/chunk-EJEVW4RO.js.map +1 -0
  12. package/dist/chunk-JXFBHSPN.js +37 -0
  13. package/dist/chunk-JXFBHSPN.js.map +1 -0
  14. package/dist/chunk-O25D7DCP.js +72 -0
  15. package/dist/chunk-O25D7DCP.js.map +1 -0
  16. package/dist/chunk-OY3PSPA5.js +661 -0
  17. package/dist/chunk-OY3PSPA5.js.map +1 -0
  18. package/dist/chunk-SHHZRZMM.js +83 -0
  19. package/dist/chunk-SHHZRZMM.js.map +1 -0
  20. package/dist/chunk-X57K24P3.js +224 -0
  21. package/dist/chunk-X57K24P3.js.map +1 -0
  22. package/dist/chunk-XDXGUPCR.js +123 -0
  23. package/dist/chunk-XDXGUPCR.js.map +1 -0
  24. package/dist/components/AppShell.d.ts +27 -0
  25. package/dist/components/AppShell.js +11 -0
  26. package/dist/components/AppShell.js.map +1 -0
  27. package/dist/components/Header.d.ts +11 -0
  28. package/dist/components/Header.js +6 -0
  29. package/dist/components/Header.js.map +1 -0
  30. package/dist/components/OrganizationSelector.d.ts +8 -0
  31. package/dist/components/OrganizationSelector.js +4 -0
  32. package/dist/components/OrganizationSelector.js.map +1 -0
  33. package/dist/components/OrganizationSetupModal.d.ts +5 -0
  34. package/dist/components/OrganizationSetupModal.js +4 -0
  35. package/dist/components/OrganizationSetupModal.js.map +1 -0
  36. package/dist/components/PageContainer.d.ts +105 -0
  37. package/dist/components/PageContainer.js +3 -0
  38. package/dist/components/PageContainer.js.map +1 -0
  39. package/dist/components/ServiceMenu.d.ts +11 -0
  40. package/dist/components/ServiceMenu.js +3 -0
  41. package/dist/components/ServiceMenu.js.map +1 -0
  42. package/dist/components/Sidebar.d.ts +11 -0
  43. package/dist/components/Sidebar.js +5 -0
  44. package/dist/components/Sidebar.js.map +1 -0
  45. package/dist/contexts/OrganizationContext.d.ts +26 -0
  46. package/dist/contexts/OrganizationContext.js +3 -0
  47. package/dist/contexts/OrganizationContext.js.map +1 -0
  48. package/dist/contexts/ThemeContext.d.ts +14 -0
  49. package/dist/contexts/ThemeContext.js +3 -0
  50. package/dist/contexts/ThemeContext.js.map +1 -0
  51. package/dist/hooks/useDateFormat.d.ts +28 -0
  52. package/dist/hooks/useDateFormat.js +4 -0
  53. package/dist/hooks/useDateFormat.js.map +1 -0
  54. package/dist/i18n.d.ts +38 -0
  55. package/dist/i18n.js +3 -0
  56. package/dist/i18n.js.map +1 -0
  57. package/dist/index.d.ts +13 -109
  58. package/dist/index.js +11 -70
  59. package/dist/types.d.ts +89 -0
  60. package/dist/types.js +3 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +23 -70
  63. package/dist/chunk-2C2HRGM7.js +0 -51
  64. package/dist/chunk-2C2HRGM7.js.map +0 -1
  65. package/dist/chunk-2TUWDXAC.js +0 -196
  66. package/dist/chunk-2TUWDXAC.js.map +0 -1
  67. package/dist/chunk-34ARZSNP.js +0 -63
  68. package/dist/chunk-34ARZSNP.js.map +0 -1
  69. package/dist/chunk-35DNN46W.js +0 -13
  70. package/dist/chunk-35DNN46W.js.map +0 -1
  71. package/dist/chunk-35U6QG4P.js +0 -116
  72. package/dist/chunk-35U6QG4P.js.map +0 -1
  73. package/dist/chunk-36YYHIJU.js +0 -52
  74. package/dist/chunk-36YYHIJU.js.map +0 -1
  75. package/dist/chunk-3EOHW4QN.js +0 -35
  76. package/dist/chunk-3EOHW4QN.js.map +0 -1
  77. package/dist/chunk-3UPBCOS4.js +0 -39
  78. package/dist/chunk-3UPBCOS4.js.map +0 -1
  79. package/dist/chunk-3VU56V66.js +0 -41
  80. package/dist/chunk-3VU56V66.js.map +0 -1
  81. package/dist/chunk-55E7D2HR.js +0 -99
  82. package/dist/chunk-55E7D2HR.js.map +0 -1
  83. package/dist/chunk-67YUL2ZS.js +0 -53
  84. package/dist/chunk-67YUL2ZS.js.map +0 -1
  85. package/dist/chunk-6DIDQ4TB.js +0 -131
  86. package/dist/chunk-6DIDQ4TB.js.map +0 -1
  87. package/dist/chunk-6GWVQB3Q.js +0 -155
  88. package/dist/chunk-6GWVQB3Q.js.map +0 -1
  89. package/dist/chunk-75WZR6HF.js +0 -44
  90. package/dist/chunk-75WZR6HF.js.map +0 -1
  91. package/dist/chunk-7IRLBU2I.js +0 -114
  92. package/dist/chunk-7IRLBU2I.js.map +0 -1
  93. package/dist/chunk-7RMTPT6O.js +0 -99
  94. package/dist/chunk-7RMTPT6O.js.map +0 -1
  95. package/dist/chunk-7XH3MGBR.js +0 -128
  96. package/dist/chunk-7XH3MGBR.js.map +0 -1
  97. package/dist/chunk-A3BB5ZOC.js +0 -77
  98. package/dist/chunk-A3BB5ZOC.js.map +0 -1
  99. package/dist/chunk-B434PORR.js +0 -239
  100. package/dist/chunk-B434PORR.js.map +0 -1
  101. package/dist/chunk-BAQWGQJG.js +0 -106
  102. package/dist/chunk-BAQWGQJG.js.map +0 -1
  103. package/dist/chunk-BRSM3SZP.js +0 -46
  104. package/dist/chunk-BRSM3SZP.js.map +0 -1
  105. package/dist/chunk-C34KSTWA.js +0 -43
  106. package/dist/chunk-C34KSTWA.js.map +0 -1
  107. package/dist/chunk-C5NZAOA7.js +0 -54
  108. package/dist/chunk-C5NZAOA7.js.map +0 -1
  109. package/dist/chunk-CUZR4JWM.js +0 -23
  110. package/dist/chunk-CUZR4JWM.js.map +0 -1
  111. package/dist/chunk-DGPY4WP3.js +0 -11
  112. package/dist/chunk-DGPY4WP3.js.map +0 -1
  113. package/dist/chunk-EWBCV7VA.js +0 -65
  114. package/dist/chunk-EWBCV7VA.js.map +0 -1
  115. package/dist/chunk-F2ZJLKDP.js +0 -119
  116. package/dist/chunk-F2ZJLKDP.js.map +0 -1
  117. package/dist/chunk-FLWMT4DB.js +0 -66
  118. package/dist/chunk-FLWMT4DB.js.map +0 -1
  119. package/dist/chunk-FRKG7JQY.js +0 -48
  120. package/dist/chunk-FRKG7JQY.js.map +0 -1
  121. package/dist/chunk-G7HTZBUR.js +0 -187
  122. package/dist/chunk-G7HTZBUR.js.map +0 -1
  123. package/dist/chunk-HWTW64R5.js +0 -90
  124. package/dist/chunk-HWTW64R5.js.map +0 -1
  125. package/dist/chunk-IAWKX5W4.js +0 -219
  126. package/dist/chunk-IAWKX5W4.js.map +0 -1
  127. package/dist/chunk-INLM7UJC.js +0 -238
  128. package/dist/chunk-INLM7UJC.js.map +0 -1
  129. package/dist/chunk-JAJMM32I.js +0 -18
  130. package/dist/chunk-JAJMM32I.js.map +0 -1
  131. package/dist/chunk-JJSVA3TH.js +0 -61
  132. package/dist/chunk-JJSVA3TH.js.map +0 -1
  133. package/dist/chunk-JLTBUACL.js +0 -121
  134. package/dist/chunk-JLTBUACL.js.map +0 -1
  135. package/dist/chunk-JRU2QX7T.js +0 -38
  136. package/dist/chunk-JRU2QX7T.js.map +0 -1
  137. package/dist/chunk-JXGRW2MR.js +0 -17
  138. package/dist/chunk-JXGRW2MR.js.map +0 -1
  139. package/dist/chunk-KTBOZ4NE.js +0 -93
  140. package/dist/chunk-KTBOZ4NE.js.map +0 -1
  141. package/dist/chunk-LMT327XH.js +0 -56
  142. package/dist/chunk-LMT327XH.js.map +0 -1
  143. package/dist/chunk-LTTNCAAA.js +0 -138
  144. package/dist/chunk-LTTNCAAA.js.map +0 -1
  145. package/dist/chunk-LVZNNIK4.js +0 -111
  146. package/dist/chunk-LVZNNIK4.js.map +0 -1
  147. package/dist/chunk-MJLFJPUG.js +0 -143
  148. package/dist/chunk-MJLFJPUG.js.map +0 -1
  149. package/dist/chunk-MZ2P566X.js +0 -65
  150. package/dist/chunk-MZ2P566X.js.map +0 -1
  151. package/dist/chunk-N47H4MHX.js +0 -41
  152. package/dist/chunk-N47H4MHX.js.map +0 -1
  153. package/dist/chunk-NNJTKHCE.js +0 -160
  154. package/dist/chunk-NNJTKHCE.js.map +0 -1
  155. package/dist/chunk-NPL2R5LD.js +0 -171
  156. package/dist/chunk-NPL2R5LD.js.map +0 -1
  157. package/dist/chunk-NU56GKGM.js +0 -44
  158. package/dist/chunk-NU56GKGM.js.map +0 -1
  159. package/dist/chunk-P3M5TZD2.js +0 -24
  160. package/dist/chunk-P3M5TZD2.js.map +0 -1
  161. package/dist/chunk-PGWNOZDX.js +0 -28
  162. package/dist/chunk-PGWNOZDX.js.map +0 -1
  163. package/dist/chunk-QB3UWRZH.js +0 -92
  164. package/dist/chunk-QB3UWRZH.js.map +0 -1
  165. package/dist/chunk-R2CDE5DO.js +0 -33
  166. package/dist/chunk-R2CDE5DO.js.map +0 -1
  167. package/dist/chunk-RQNZDWY3.js +0 -65
  168. package/dist/chunk-RQNZDWY3.js.map +0 -1
  169. package/dist/chunk-S6PDRGR5.js +0 -109
  170. package/dist/chunk-S6PDRGR5.js.map +0 -1
  171. package/dist/chunk-TGYQ3AKH.js +0 -95
  172. package/dist/chunk-TGYQ3AKH.js.map +0 -1
  173. package/dist/chunk-THQUH6WX.js +0 -81
  174. package/dist/chunk-THQUH6WX.js.map +0 -1
  175. package/dist/chunk-TJMK2KBE.js +0 -112
  176. package/dist/chunk-TJMK2KBE.js.map +0 -1
  177. package/dist/chunk-TTH7TWVX.js +0 -30
  178. package/dist/chunk-TTH7TWVX.js.map +0 -1
  179. package/dist/chunk-USIHM7FV.js +0 -211
  180. package/dist/chunk-USIHM7FV.js.map +0 -1
  181. package/dist/chunk-VVYSAGB3.js +0 -104
  182. package/dist/chunk-VVYSAGB3.js.map +0 -1
  183. package/dist/chunk-WD5KZE25.js +0 -25
  184. package/dist/chunk-WD5KZE25.js.map +0 -1
  185. package/dist/chunk-WL4ZO2H3.js +0 -33
  186. package/dist/chunk-WL4ZO2H3.js.map +0 -1
  187. package/dist/chunk-WRCHR4AK.js +0 -23
  188. package/dist/chunk-WRCHR4AK.js.map +0 -1
  189. package/dist/chunk-XOJJBNDX.js +0 -33
  190. package/dist/chunk-XOJJBNDX.js.map +0 -1
  191. package/dist/chunk-XUVLD65E.js +0 -617
  192. package/dist/chunk-XUVLD65E.js.map +0 -1
  193. package/dist/chunk-YBMEQZX7.js +0 -164
  194. package/dist/chunk-YBMEQZX7.js.map +0 -1
  195. package/dist/chunk-Z2QAABLM.js +0 -86
  196. package/dist/chunk-Z2QAABLM.js.map +0 -1
  197. package/dist/chunk-ZHEKDP5X.js +0 -41
  198. package/dist/chunk-ZHEKDP5X.js.map +0 -1
  199. package/dist/chunk-ZPMXRW2A.js +0 -63
  200. package/dist/chunk-ZPMXRW2A.js.map +0 -1
  201. package/dist/chunk-ZYEGBF7G.js +0 -25
  202. package/dist/chunk-ZYEGBF7G.js.map +0 -1
  203. package/dist/components/accordion.d.ts +0 -37
  204. package/dist/components/accordion.js +0 -4
  205. package/dist/components/accordion.js.map +0 -1
  206. package/dist/components/alert-dialog.d.ts +0 -56
  207. package/dist/components/alert-dialog.js +0 -5
  208. package/dist/components/alert-dialog.js.map +0 -1
  209. package/dist/components/alert.d.ts +0 -68
  210. package/dist/components/alert.js +0 -4
  211. package/dist/components/alert.js.map +0 -1
  212. package/dist/components/aspect-ratio.d.ts +0 -23
  213. package/dist/components/aspect-ratio.js +0 -3
  214. package/dist/components/aspect-ratio.js.map +0 -1
  215. package/dist/components/avatar.d.ts +0 -48
  216. package/dist/components/avatar.js +0 -4
  217. package/dist/components/avatar.js.map +0 -1
  218. package/dist/components/badge.d.ts +0 -52
  219. package/dist/components/badge.js +0 -4
  220. package/dist/components/badge.js.map +0 -1
  221. package/dist/components/breadcrumb.d.ts +0 -50
  222. package/dist/components/breadcrumb.js +0 -4
  223. package/dist/components/breadcrumb.js.map +0 -1
  224. package/dist/components/button.d.ts +0 -81
  225. package/dist/components/button.js +0 -4
  226. package/dist/components/button.js.map +0 -1
  227. package/dist/components/calendar-category-badge.d.ts +0 -24
  228. package/dist/components/calendar-category-badge.js +0 -5
  229. package/dist/components/calendar-category-badge.js.map +0 -1
  230. package/dist/components/calendar-event-chip.d.ts +0 -41
  231. package/dist/components/calendar-event-chip.js +0 -4
  232. package/dist/components/calendar-event-chip.js.map +0 -1
  233. package/dist/components/calendar-event-sheet.d.ts +0 -68
  234. package/dist/components/calendar-event-sheet.js +0 -9
  235. package/dist/components/calendar-event-sheet.js.map +0 -1
  236. package/dist/components/calendar-mini.d.ts +0 -65
  237. package/dist/components/calendar-mini.js +0 -6
  238. package/dist/components/calendar-mini.js.map +0 -1
  239. package/dist/components/calendar-toolbar.d.ts +0 -58
  240. package/dist/components/calendar-toolbar.js +0 -7
  241. package/dist/components/calendar-toolbar.js.map +0 -1
  242. package/dist/components/calendar.d.ts +0 -19
  243. package/dist/components/calendar.js +0 -5
  244. package/dist/components/calendar.js.map +0 -1
  245. package/dist/components/card.d.ts +0 -43
  246. package/dist/components/card.js +0 -4
  247. package/dist/components/card.js.map +0 -1
  248. package/dist/components/carousel.d.ts +0 -53
  249. package/dist/components/carousel.js +0 -5
  250. package/dist/components/carousel.js.map +0 -1
  251. package/dist/components/chart.d.ts +0 -103
  252. package/dist/components/chart.js +0 -4
  253. package/dist/components/chart.js.map +0 -1
  254. package/dist/components/checkbox.d.ts +0 -24
  255. package/dist/components/checkbox.js +0 -4
  256. package/dist/components/checkbox.js.map +0 -1
  257. package/dist/components/collapsible.d.ts +0 -28
  258. package/dist/components/collapsible.js +0 -3
  259. package/dist/components/collapsible.js.map +0 -1
  260. package/dist/components/color-picker.d.ts +0 -35
  261. package/dist/components/color-picker.js +0 -7
  262. package/dist/components/color-picker.js.map +0 -1
  263. package/dist/components/combobox.d.ts +0 -98
  264. package/dist/components/combobox.js +0 -8
  265. package/dist/components/combobox.js.map +0 -1
  266. package/dist/components/command.d.ts +0 -63
  267. package/dist/components/command.js +0 -5
  268. package/dist/components/command.js.map +0 -1
  269. package/dist/components/context-menu.d.ts +0 -70
  270. package/dist/components/context-menu.js +0 -4
  271. package/dist/components/context-menu.js.map +0 -1
  272. package/dist/components/date-picker.d.ts +0 -71
  273. package/dist/components/date-picker.js +0 -7
  274. package/dist/components/date-picker.js.map +0 -1
  275. package/dist/components/dialog.d.ts +0 -58
  276. package/dist/components/dialog.js +0 -4
  277. package/dist/components/dialog.js.map +0 -1
  278. package/dist/components/drawer.d.ts +0 -60
  279. package/dist/components/drawer.js +0 -4
  280. package/dist/components/drawer.js.map +0 -1
  281. package/dist/components/dropdown-menu.d.ts +0 -76
  282. package/dist/components/dropdown-menu.js +0 -4
  283. package/dist/components/dropdown-menu.js.map +0 -1
  284. package/dist/components/file-upload.d.ts +0 -44
  285. package/dist/components/file-upload.js +0 -5
  286. package/dist/components/file-upload.js.map +0 -1
  287. package/dist/components/form.d.ts +0 -67
  288. package/dist/components/form.js +0 -5
  289. package/dist/components/form.js.map +0 -1
  290. package/dist/components/hover-card.d.ts +0 -43
  291. package/dist/components/hover-card.js +0 -4
  292. package/dist/components/hover-card.js.map +0 -1
  293. package/dist/components/input-otp.d.ts +0 -38
  294. package/dist/components/input-otp.js +0 -4
  295. package/dist/components/input-otp.js.map +0 -1
  296. package/dist/components/input.d.ts +0 -38
  297. package/dist/components/input.js +0 -4
  298. package/dist/components/input.js.map +0 -1
  299. package/dist/components/label.d.ts +0 -20
  300. package/dist/components/label.js +0 -4
  301. package/dist/components/label.js.map +0 -1
  302. package/dist/components/menubar.d.ts +0 -82
  303. package/dist/components/menubar.js +0 -4
  304. package/dist/components/menubar.js.map +0 -1
  305. package/dist/components/navigation-menu.d.ts +0 -64
  306. package/dist/components/navigation-menu.js +0 -4
  307. package/dist/components/navigation-menu.js.map +0 -1
  308. package/dist/components/pagination.d.ts +0 -59
  309. package/dist/components/pagination.js +0 -5
  310. package/dist/components/pagination.js.map +0 -1
  311. package/dist/components/password-input.d.ts +0 -32
  312. package/dist/components/password-input.js +0 -5
  313. package/dist/components/password-input.js.map +0 -1
  314. package/dist/components/permission-grid.d.ts +0 -67
  315. package/dist/components/permission-grid.js +0 -5
  316. package/dist/components/permission-grid.js.map +0 -1
  317. package/dist/components/popover.d.ts +0 -37
  318. package/dist/components/popover.js +0 -4
  319. package/dist/components/popover.js.map +0 -1
  320. package/dist/components/progress.d.ts +0 -20
  321. package/dist/components/progress.js +0 -4
  322. package/dist/components/progress.js.map +0 -1
  323. package/dist/components/radio-group.d.ts +0 -38
  324. package/dist/components/radio-group.js +0 -4
  325. package/dist/components/radio-group.js.map +0 -1
  326. package/dist/components/rating.d.ts +0 -35
  327. package/dist/components/rating.js +0 -4
  328. package/dist/components/rating.js.map +0 -1
  329. package/dist/components/resizable.d.ts +0 -36
  330. package/dist/components/resizable.js +0 -4
  331. package/dist/components/resizable.js.map +0 -1
  332. package/dist/components/scope-tree.d.ts +0 -78
  333. package/dist/components/scope-tree.js +0 -5
  334. package/dist/components/scope-tree.js.map +0 -1
  335. package/dist/components/scope-type-badge.d.ts +0 -35
  336. package/dist/components/scope-type-badge.js +0 -5
  337. package/dist/components/scope-type-badge.js.map +0 -1
  338. package/dist/components/scroll-area.d.ts +0 -29
  339. package/dist/components/scroll-area.js +0 -4
  340. package/dist/components/scroll-area.js.map +0 -1
  341. package/dist/components/select.d.ts +0 -52
  342. package/dist/components/select.js +0 -4
  343. package/dist/components/select.js.map +0 -1
  344. package/dist/components/separator.d.ts +0 -24
  345. package/dist/components/separator.js +0 -4
  346. package/dist/components/separator.js.map +0 -1
  347. package/dist/components/sheet.d.ts +0 -51
  348. package/dist/components/sheet.js +0 -4
  349. package/dist/components/sheet.js.map +0 -1
  350. package/dist/components/sidebar.d.ts +0 -169
  351. package/dist/components/sidebar.js +0 -11
  352. package/dist/components/sidebar.js.map +0 -1
  353. package/dist/components/skeleton.d.ts +0 -25
  354. package/dist/components/skeleton.js +0 -4
  355. package/dist/components/skeleton.js.map +0 -1
  356. package/dist/components/slider.d.ts +0 -24
  357. package/dist/components/slider.js +0 -4
  358. package/dist/components/slider.js.map +0 -1
  359. package/dist/components/slug-input.d.ts +0 -50
  360. package/dist/components/slug-input.js +0 -6
  361. package/dist/components/slug-input.js.map +0 -1
  362. package/dist/components/sonner.d.ts +0 -22
  363. package/dist/components/sonner.js +0 -3
  364. package/dist/components/sonner.js.map +0 -1
  365. package/dist/components/stage-type-badge.d.ts +0 -30
  366. package/dist/components/stage-type-badge.js +0 -5
  367. package/dist/components/stage-type-badge.js.map +0 -1
  368. package/dist/components/switch.d.ts +0 -26
  369. package/dist/components/switch.js +0 -4
  370. package/dist/components/switch.js.map +0 -1
  371. package/dist/components/table.d.ts +0 -57
  372. package/dist/components/table.js +0 -4
  373. package/dist/components/table.js.map +0 -1
  374. package/dist/components/tabs.d.ts +0 -39
  375. package/dist/components/tabs.js +0 -4
  376. package/dist/components/tabs.js.map +0 -1
  377. package/dist/components/tag-input.d.ts +0 -40
  378. package/dist/components/tag-input.js +0 -5
  379. package/dist/components/tag-input.js.map +0 -1
  380. package/dist/components/textarea.d.ts +0 -21
  381. package/dist/components/textarea.js +0 -4
  382. package/dist/components/textarea.js.map +0 -1
  383. package/dist/components/time-picker.d.ts +0 -57
  384. package/dist/components/time-picker.js +0 -8
  385. package/dist/components/time-picker.js.map +0 -1
  386. package/dist/components/toggle-group.d.ts +0 -45
  387. package/dist/components/toggle-group.js +0 -5
  388. package/dist/components/toggle-group.js.map +0 -1
  389. package/dist/components/toggle.d.ts +0 -31
  390. package/dist/components/toggle.js +0 -4
  391. package/dist/components/toggle.js.map +0 -1
  392. package/dist/components/tooltip.d.ts +0 -34
  393. package/dist/components/tooltip.js +0 -4
  394. package/dist/components/tooltip.js.map +0 -1
  395. package/dist/components/workflow-category-badge.d.ts +0 -32
  396. package/dist/components/workflow-category-badge.js +0 -5
  397. package/dist/components/workflow-category-badge.js.map +0 -1
  398. package/dist/components/workflow-diagram.d.ts +0 -63
  399. package/dist/components/workflow-diagram.js +0 -5
  400. package/dist/components/workflow-diagram.js.map +0 -1
  401. package/dist/components/workflow-status-badge.d.ts +0 -30
  402. package/dist/components/workflow-status-badge.js +0 -5
  403. package/dist/components/workflow-status-badge.js.map +0 -1
  404. package/dist/components/workflow-stepper.d.ts +0 -52
  405. package/dist/components/workflow-stepper.js +0 -4
  406. package/dist/components/workflow-stepper.js.map +0 -1
  407. package/dist/hooks/use-mobile.d.ts +0 -3
  408. package/dist/hooks/use-mobile.js +0 -3
  409. package/dist/hooks/use-mobile.js.map +0 -1
  410. package/dist/lib/utils.d.ts +0 -5
  411. package/dist/lib/utils.js +0 -3
  412. package/dist/lib/utils.js.map +0 -1
  413. package/dist/types-CBVkScfB.d.ts +0 -84
  414. package/src/styles/fonts.css +0 -0
  415. package/src/styles/index.css +0 -3
  416. package/src/styles/tailwind.css +0 -4
  417. package/src/styles/theme.css +0 -461
@@ -1,131 +0,0 @@
1
- import { ScrollArea } from './chunk-JJSVA3TH.js';
2
- import { Input } from './chunk-3VU56V66.js';
3
- import { Popover, PopoverTrigger, PopoverContent } from './chunk-C34KSTWA.js';
4
- import { Button } from './chunk-55E7D2HR.js';
5
- import { cn } from './chunk-DGPY4WP3.js';
6
- import * as React from 'react';
7
- import { Clock } from 'lucide-react';
8
- import { jsxs, jsx } from 'react/jsx-runtime';
9
-
10
- function TimePicker({
11
- value,
12
- onChange,
13
- placeholder = "Ch\u1ECDn gi\u1EDD",
14
- className,
15
- disabled,
16
- format24h = true
17
- }) {
18
- const [open, setOpen] = React.useState(false);
19
- const hours = format24h ? Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, "0")) : Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, "0"));
20
- const minutes = Array.from(
21
- { length: 60 },
22
- (_, i) => i.toString().padStart(2, "0")
23
- );
24
- const [selectedHour, selectedMinute] = value?.split(":") || ["", ""];
25
- const handleHourSelect = (hour) => {
26
- const newTime = `${hour}:${selectedMinute || "00"}`;
27
- onChange?.(newTime);
28
- };
29
- const handleMinuteSelect = (minute) => {
30
- const newTime = `${selectedHour || "00"}:${minute}`;
31
- onChange?.(newTime);
32
- setOpen(false);
33
- };
34
- return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
35
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
36
- Button,
37
- {
38
- variant: "outline",
39
- disabled,
40
- className: cn(
41
- "w-full justify-start",
42
- !value && "text-muted-foreground",
43
- className
44
- ),
45
- children: [
46
- /* @__PURE__ */ jsx(Clock, { className: "mr-2 h-4 w-4" }),
47
- value || placeholder
48
- ]
49
- }
50
- ) }),
51
- /* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsxs("div", { className: "flex", children: [
52
- /* @__PURE__ */ jsx(ScrollArea, { className: "h-60 w-20 border-r", children: /* @__PURE__ */ jsx("div", { className: "p-1", children: hours.map((hour) => /* @__PURE__ */ jsx(
53
- "button",
54
- {
55
- type: "button",
56
- onClick: () => handleHourSelect(hour),
57
- className: cn(
58
- "w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center",
59
- selectedHour === hour && "bg-primary/10 text-primary font-semibold"
60
- ),
61
- children: hour
62
- },
63
- hour
64
- )) }) }),
65
- /* @__PURE__ */ jsx(ScrollArea, { className: "h-60 w-20", children: /* @__PURE__ */ jsx("div", { className: "p-1", children: minutes.map((minute) => /* @__PURE__ */ jsx(
66
- "button",
67
- {
68
- type: "button",
69
- onClick: () => handleMinuteSelect(minute),
70
- className: cn(
71
- "w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center",
72
- selectedMinute === minute && "bg-primary/10 text-primary font-semibold"
73
- ),
74
- children: minute
75
- },
76
- minute
77
- )) }) })
78
- ] }) })
79
- ] });
80
- }
81
- function TimeInput({
82
- value = "",
83
- onChange,
84
- className,
85
- disabled
86
- }) {
87
- const [localValue, setLocalValue] = React.useState(value);
88
- const handleChange = (e) => {
89
- let input = e.target.value.replace(/\D/g, "");
90
- if (input.length >= 2) {
91
- const hours = parseInt(input.substring(0, 2));
92
- if (hours > 23) input = "23" + input.substring(2);
93
- }
94
- if (input.length >= 4) {
95
- const minutes = parseInt(input.substring(2, 4));
96
- if (minutes > 59) input = input.substring(0, 2) + "59";
97
- }
98
- if (input.length >= 2) {
99
- input = input.substring(0, 2) + ":" + input.substring(2, 4);
100
- }
101
- setLocalValue(input);
102
- };
103
- const handleBlur = () => {
104
- const parts = localValue.split(":");
105
- if (parts.length === 2 && parts[0].length === 2 && parts[1].length === 2) {
106
- onChange?.(localValue);
107
- } else {
108
- setLocalValue(value);
109
- }
110
- };
111
- return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
112
- /* @__PURE__ */ jsx(
113
- Input,
114
- {
115
- type: "text",
116
- value: localValue,
117
- onChange: handleChange,
118
- onBlur: handleBlur,
119
- placeholder: "00:00",
120
- maxLength: 5,
121
- disabled,
122
- className: cn("pr-10", className)
123
- }
124
- ),
125
- /* @__PURE__ */ jsx(Clock, { className: "absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" })
126
- ] });
127
- }
128
-
129
- export { TimeInput, TimePicker };
130
- //# sourceMappingURL=chunk-6DIDQ4TB.js.map
131
- //# sourceMappingURL=chunk-6DIDQ4TB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/time-picker.tsx"],"names":[],"mappings":"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","file":"chunk-6DIDQ4TB.js","sourcesContent":["import * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { ScrollArea } from \"./scroll-area\";\n\ninterface TimePickerProps {\n /** Currently selected time in `\"HH:mm\"` format (e.g., `\"14:30\"`). */\n value?: string;\n /** Callback fired when a time is selected. Receives a `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Placeholder text shown when no time is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the time picker is disabled. */\n disabled?: boolean;\n /** Use 24-hour format (0-23). When false, shows 12-hour (1-12). Defaults to `true`. */\n format24h?: boolean;\n}\n\n/**\n * Time picker with a scrollable hour/minute popover.\n * Opens a two-column dropdown for selecting hours and minutes.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState<string>();\n *\n * <TimePicker\n * value={time}\n * onChange={setTime}\n * placeholder=\"Select time\"\n * format24h\n * />\n * ```\n */\nexport function TimePicker({\n value,\n onChange,\n placeholder = \"Chọn giờ\",\n className,\n disabled,\n format24h = true,\n}: TimePickerProps) {\n const [open, setOpen] = React.useState(false);\n\n const hours = format24h\n ? Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, \"0\"))\n : Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, \"0\"));\n\n const minutes = Array.from({ length: 60 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n\n const [selectedHour, selectedMinute] = value?.split(\":\") || [\"\", \"\"];\n\n const handleHourSelect = (hour: string) => {\n const newTime = `${hour}:${selectedMinute || \"00\"}`;\n onChange?.(newTime);\n };\n\n const handleMinuteSelect = (minute: string) => {\n const newTime = `${selectedHour || \"00\"}:${minute}`;\n onChange?.(newTime);\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <Clock className=\"mr-2 h-4 w-4\" />\n {value || placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"flex\">\n {/* Hours */}\n <ScrollArea className=\"h-60 w-20 border-r\">\n <div className=\"p-1\">\n {hours.map((hour) => (\n <button\n key={hour}\n type=\"button\"\n onClick={() => handleHourSelect(hour)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedHour === hour && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {hour}\n </button>\n ))}\n </div>\n </ScrollArea>\n\n {/* Minutes */}\n <ScrollArea className=\"h-60 w-20\">\n <div className=\"p-1\">\n {minutes.map((minute) => (\n <button\n key={minute}\n type=\"button\"\n onClick={() => handleMinuteSelect(minute)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedMinute === minute && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {minute}\n </button>\n ))}\n </div>\n </ScrollArea>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface TimeInputProps {\n /** Current time value in `\"HH:mm\"` format. */\n value?: string;\n /** Callback fired on blur with a valid `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Additional CSS class for the input wrapper. */\n className?: string;\n /** Whether the input is disabled. */\n disabled?: boolean;\n}\n\n/**\n * Inline text input for typing a time value directly.\n * Automatically formats input as `HH:mm` and validates on blur.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState(\"09:00\");\n *\n * <TimeInput value={time} onChange={setTime} />\n * ```\n */\nexport function TimeInput({\n value = \"\",\n onChange,\n className,\n disabled,\n}: TimeInputProps) {\n const [localValue, setLocalValue] = React.useState(value);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let input = e.target.value.replace(/\\D/g, \"\"); // Remove non-digits\n\n if (input.length >= 2) {\n const hours = parseInt(input.substring(0, 2));\n if (hours > 23) input = \"23\" + input.substring(2);\n }\n\n if (input.length >= 4) {\n const minutes = parseInt(input.substring(2, 4));\n if (minutes > 59) input = input.substring(0, 2) + \"59\";\n }\n\n // Format as HH:mm\n if (input.length >= 2) {\n input = input.substring(0, 2) + \":\" + input.substring(2, 4);\n }\n\n setLocalValue(input);\n };\n\n const handleBlur = () => {\n // Validate and format\n const parts = localValue.split(\":\");\n if (parts.length === 2 && parts[0].length === 2 && parts[1].length === 2) {\n onChange?.(localValue);\n } else {\n setLocalValue(value);\n }\n };\n\n return (\n <div className=\"relative\">\n <Input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder=\"00:00\"\n maxLength={5}\n disabled={disabled}\n className={cn(\"pr-10\", className)}\n />\n <Clock className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n </div>\n );\n}\n"]}
@@ -1,155 +0,0 @@
1
- import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent } from './chunk-F2ZJLKDP.js';
2
- import { cn } from './chunk-DGPY4WP3.js';
3
- import { Command as Command$1 } from 'cmdk';
4
- import { SearchIcon } from 'lucide-react';
5
- import { jsx, jsxs } from 'react/jsx-runtime';
6
-
7
- function Command({
8
- className,
9
- ...props
10
- }) {
11
- return /* @__PURE__ */ jsx(
12
- Command$1,
13
- {
14
- "data-slot": "command",
15
- className: cn(
16
- "bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md",
17
- className
18
- ),
19
- ...props
20
- }
21
- );
22
- }
23
- function CommandDialog({
24
- title = "Command Palette",
25
- description = "Search for a command to run...",
26
- children,
27
- ...props
28
- }) {
29
- return /* @__PURE__ */ jsxs(Dialog, { ...props, children: [
30
- /* @__PURE__ */ jsxs(DialogHeader, { className: "sr-only", children: [
31
- /* @__PURE__ */ jsx(DialogTitle, { children: title }),
32
- /* @__PURE__ */ jsx(DialogDescription, { children: description })
33
- ] }),
34
- /* @__PURE__ */ jsx(DialogContent, { className: "overflow-hidden p-0", children: /* @__PURE__ */ jsx(Command, { className: "[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children }) })
35
- ] });
36
- }
37
- function CommandInput({
38
- className,
39
- ...props
40
- }) {
41
- return /* @__PURE__ */ jsxs(
42
- "div",
43
- {
44
- "data-slot": "command-input-wrapper",
45
- className: "flex h-9 items-center gap-2 border-b px-3",
46
- children: [
47
- /* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }),
48
- /* @__PURE__ */ jsx(
49
- Command$1.Input,
50
- {
51
- "data-slot": "command-input",
52
- className: cn(
53
- "placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
54
- className
55
- ),
56
- ...props
57
- }
58
- )
59
- ]
60
- }
61
- );
62
- }
63
- function CommandList({
64
- className,
65
- ...props
66
- }) {
67
- return /* @__PURE__ */ jsx(
68
- Command$1.List,
69
- {
70
- "data-slot": "command-list",
71
- className: cn(
72
- "max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",
73
- className
74
- ),
75
- ...props
76
- }
77
- );
78
- }
79
- function CommandEmpty({
80
- ...props
81
- }) {
82
- return /* @__PURE__ */ jsx(
83
- Command$1.Empty,
84
- {
85
- "data-slot": "command-empty",
86
- className: "py-6 text-center text-sm",
87
- ...props
88
- }
89
- );
90
- }
91
- function CommandGroup({
92
- className,
93
- ...props
94
- }) {
95
- return /* @__PURE__ */ jsx(
96
- Command$1.Group,
97
- {
98
- "data-slot": "command-group",
99
- className: cn(
100
- "text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
101
- className
102
- ),
103
- ...props
104
- }
105
- );
106
- }
107
- function CommandSeparator({
108
- className,
109
- ...props
110
- }) {
111
- return /* @__PURE__ */ jsx(
112
- Command$1.Separator,
113
- {
114
- "data-slot": "command-separator",
115
- className: cn("bg-border -mx-1 h-px", className),
116
- ...props
117
- }
118
- );
119
- }
120
- function CommandItem({
121
- className,
122
- ...props
123
- }) {
124
- return /* @__PURE__ */ jsx(
125
- Command$1.Item,
126
- {
127
- "data-slot": "command-item",
128
- className: cn(
129
- "data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_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=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
130
- className
131
- ),
132
- ...props
133
- }
134
- );
135
- }
136
- function CommandShortcut({
137
- className,
138
- ...props
139
- }) {
140
- return /* @__PURE__ */ jsx(
141
- "span",
142
- {
143
- "data-slot": "command-shortcut",
144
- className: cn(
145
- "text-muted-foreground ml-auto text-xs tracking-widest",
146
- className
147
- ),
148
- ...props
149
- }
150
- );
151
- }
152
-
153
- export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
154
- //# sourceMappingURL=chunk-6GWVQB3Q.js.map
155
- //# sourceMappingURL=chunk-6GWVQB3Q.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/command.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-6GWVQB3Q.js","sourcesContent":["import * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\";\n\n/**\n * Command palette component built on cmdk.\n *\n * Provides a searchable, keyboard-navigable list of commands or options.\n * Use `CommandDialog` for a modal command palette, or `Command` inline\n * for embedded search/filter interfaces like comboboxes.\n *\n * @example\n * ```tsx\n * <CommandDialog open={open} onOpenChange={setOpen}>\n * <CommandInput placeholder=\"Type a command or search...\" />\n * <CommandList>\n * <CommandEmpty>No results found.</CommandEmpty>\n * <CommandGroup heading=\"Suggestions\">\n * <CommandItem>\n * <CalendarIcon className=\"size-4\" />\n * Calendar\n * </CommandItem>\n * <CommandItem>\n * <SearchIcon className=\"size-4\" />\n * Search\n * <CommandShortcut>Ctrl+K</CommandShortcut>\n * </CommandItem>\n * </CommandGroup>\n * <CommandSeparator />\n * <CommandGroup heading=\"Settings\">\n * <CommandItem>\n * <SettingsIcon className=\"size-4\" />\n * Settings\n * </CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </CommandDialog>\n * ```\n */\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Modal wrapper that renders a Command palette inside a Dialog. Accepts optional `title` and `description` for accessibility. */\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Search input field with a magnifying glass icon for filtering command items. */\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\n/** Scrollable container for command groups and items. */\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Fallback content shown when no command items match the search query. */\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n );\n}\n\n/** Groups related command items under an optional heading. */\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Visual divider between groups of command items. */\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n );\n}\n\n/** Selectable command item that can be navigated with keyboard arrows and activated with Enter. */\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_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=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Keyboard shortcut hint displayed at the end of a command item. */\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-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 Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};"]}
@@ -1,44 +0,0 @@
1
- import { Label } from './chunk-P3M5TZD2.js';
2
- import { Input } from './chunk-3VU56V66.js';
3
- import { useEffect } from 'react';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var defaultLabels = {
7
- slug: "Slug",
8
- autoGenerated: "Auto-generated from title",
9
- placeholder: "enter-slug-here"
10
- };
11
- function generateSlug(text) {
12
- return text.toLowerCase().replace(/[àáạảãâầấậẩẫăằắặẳẵ]/g, "a").replace(/[èéẹẻẽêềếệểễ]/g, "e").replace(/[ìíịỉĩ]/g, "i").replace(/[òóọỏõôồốộổỗơờớợởỡ]/g, "o").replace(/[ùúụủũưừứựửữ]/g, "u").replace(/[ỳýỵỷỹ]/g, "y").replace(/đ/g, "d").replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
13
- }
14
- function SlugInput({
15
- title,
16
- slug,
17
- onSlugChange,
18
- disabled = false,
19
- labels: labelOverrides
20
- }) {
21
- const labels = { ...defaultLabels, ...labelOverrides };
22
- useEffect(() => {
23
- if (!disabled && title) {
24
- onSlugChange(generateSlug(title));
25
- }
26
- }, [title, disabled, onSlugChange]);
27
- return /* @__PURE__ */ jsxs("div", { children: [
28
- /* @__PURE__ */ jsx(Label, { children: labels.slug }),
29
- /* @__PURE__ */ jsx(
30
- Input,
31
- {
32
- value: slug,
33
- onChange: (e) => onSlugChange(e.target.value),
34
- placeholder: labels.placeholder,
35
- className: "h-element-sm mt-1 font-mono text-sm"
36
- }
37
- ),
38
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-1", children: labels.autoGenerated })
39
- ] });
40
- }
41
-
42
- export { SlugInput, generateSlug };
43
- //# sourceMappingURL=chunk-75WZR6HF.js.map
44
- //# sourceMappingURL=chunk-75WZR6HF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/slug-input.tsx"],"names":[],"mappings":";;;;;AA2BA,IAAM,aAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,MAAA;AAAA,EACN,aAAA,EAAe,2BAAA;AAAA,EACf,WAAA,EAAa;AACf,CAAA;AAMO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,OAAO,IAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,wBAAwB,GAAG,CAAA,CACnC,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,wBAAwB,GAAG,CAAA,CACnC,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,MAAM,GAAG,CAAA,CACjB,QAAQ,eAAA,EAAiB,EAAE,EAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,OAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACzB;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA,EAAmB;AACjB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,aAAA,EAAe,GAAG,cAAA,EAAe;AAErD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,YAAY,CAAC,CAAA;AAElC,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAO,iBAAO,IAAA,EAAK,CAAA;AAAA,oBACpB,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC5C,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,iBAAO,aAAA,EAAc;AAAA,GAAA,EAC1E,CAAA;AAEJ","file":"chunk-75WZR6HF.js","sourcesContent":["import { useEffect } from 'react';\nimport { Input } from './input';\nimport { Label } from './label';\n\n/** Customizable labels for the SlugInput component. */\nexport interface SlugInputLabels {\n /** Label text above the slug input field. */\n slug: string;\n /** Helper text below the slug input. */\n autoGenerated: string;\n /** Placeholder shown inside the slug input. */\n placeholder: string;\n}\n\nexport interface SlugInputProps {\n /** Source title string from which the slug is auto-generated. */\n title: string;\n /** Current slug value. */\n slug: string;\n /** Callback fired when the slug changes (auto-generated or manually edited). */\n onSlugChange: (slug: string) => void;\n /** Whether auto-generation from title is disabled and slug is manually editable only. */\n disabled?: boolean;\n /** Override default label strings for localization. */\n labels?: Partial<SlugInputLabels>;\n}\n\nconst defaultLabels: SlugInputLabels = {\n slug: 'Slug',\n autoGenerated: 'Auto-generated from title',\n placeholder: 'enter-slug-here',\n};\n\n/**\n * Generates a URL-friendly slug from a text string.\n * Handles Vietnamese diacritics and other special characters.\n */\nexport function generateSlug(text: string): string {\n return text\n .toLowerCase()\n .replace(/[àáạảãâầấậẩẫăằắặẳẵ]/g, 'a')\n .replace(/[èéẹẻẽêềếệểễ]/g, 'e')\n .replace(/[ìíịỉĩ]/g, 'i')\n .replace(/[òóọỏõôồốộổỗơờớợởỡ]/g, 'o')\n .replace(/[ùúụủũưừứựửữ]/g, 'u')\n .replace(/[ỳýỵỷỹ]/g, 'y')\n .replace(/đ/g, 'd')\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * URL slug input that auto-generates a slug from a title string.\n * Handles Vietnamese diacritics and special characters via `generateSlug`.\n * The slug updates automatically when the title changes (unless `disabled` is true).\n *\n * @example\n * ```tsx\n * const [title, setTitle] = useState(\"My Blog Post\");\n * const [slug, setSlug] = useState(\"\");\n *\n * <Input value={title} onChange={(e) => setTitle(e.target.value)} />\n * <SlugInput\n * title={title}\n * slug={slug}\n * onSlugChange={setSlug}\n * />\n * // slug will auto-populate as \"my-blog-post\"\n * ```\n */\nexport function SlugInput({\n title,\n slug,\n onSlugChange,\n disabled = false,\n labels: labelOverrides,\n}: SlugInputProps) {\n const labels = { ...defaultLabels, ...labelOverrides };\n\n useEffect(() => {\n if (!disabled && title) {\n onSlugChange(generateSlug(title));\n }\n }, [title, disabled, onSlugChange]);\n\n return (\n <div>\n <Label>{labels.slug}</Label>\n <Input\n value={slug}\n onChange={(e) => onSlugChange(e.target.value)}\n placeholder={labels.placeholder}\n className=\"h-element-sm mt-1 font-mono text-sm\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">{labels.autoGenerated}</p>\n </div>\n );\n}\n"]}
@@ -1,114 +0,0 @@
1
- import { buttonVariants } from './chunk-55E7D2HR.js';
2
- import { cn } from './chunk-DGPY4WP3.js';
3
- import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react';
4
- import { jsx, jsxs } from 'react/jsx-runtime';
5
-
6
- function Pagination({ className, ...props }) {
7
- return /* @__PURE__ */ jsx(
8
- "nav",
9
- {
10
- role: "navigation",
11
- "aria-label": "pagination",
12
- "data-slot": "pagination",
13
- className: cn("mx-auto flex w-full justify-center", className),
14
- ...props
15
- }
16
- );
17
- }
18
- function PaginationContent({
19
- className,
20
- ...props
21
- }) {
22
- return /* @__PURE__ */ jsx(
23
- "ul",
24
- {
25
- "data-slot": "pagination-content",
26
- className: cn("flex flex-row items-center gap-1", className),
27
- ...props
28
- }
29
- );
30
- }
31
- function PaginationItem({ ...props }) {
32
- return /* @__PURE__ */ jsx("li", { "data-slot": "pagination-item", ...props });
33
- }
34
- function PaginationLink({
35
- className,
36
- isActive,
37
- size = "icon",
38
- ...props
39
- }) {
40
- return /* @__PURE__ */ jsx(
41
- "a",
42
- {
43
- "aria-current": isActive ? "page" : void 0,
44
- "data-slot": "pagination-link",
45
- "data-active": isActive,
46
- className: cn(
47
- buttonVariants({
48
- variant: isActive ? "outline" : "ghost",
49
- size
50
- }),
51
- className
52
- ),
53
- ...props
54
- }
55
- );
56
- }
57
- function PaginationPrevious({
58
- className,
59
- ...props
60
- }) {
61
- return /* @__PURE__ */ jsxs(
62
- PaginationLink,
63
- {
64
- "aria-label": "Go to previous page",
65
- size: "default",
66
- className: cn("gap-1 px-2.5 sm:pl-2.5", className),
67
- ...props,
68
- children: [
69
- /* @__PURE__ */ jsx(ChevronLeftIcon, {}),
70
- /* @__PURE__ */ jsx("span", { className: "hidden sm:block", children: "Previous" })
71
- ]
72
- }
73
- );
74
- }
75
- function PaginationNext({
76
- className,
77
- ...props
78
- }) {
79
- return /* @__PURE__ */ jsxs(
80
- PaginationLink,
81
- {
82
- "aria-label": "Go to next page",
83
- size: "default",
84
- className: cn("gap-1 px-2.5 sm:pr-2.5", className),
85
- ...props,
86
- children: [
87
- /* @__PURE__ */ jsx("span", { className: "hidden sm:block", children: "Next" }),
88
- /* @__PURE__ */ jsx(ChevronRightIcon, {})
89
- ]
90
- }
91
- );
92
- }
93
- function PaginationEllipsis({
94
- className,
95
- ...props
96
- }) {
97
- return /* @__PURE__ */ jsxs(
98
- "span",
99
- {
100
- "aria-hidden": true,
101
- "data-slot": "pagination-ellipsis",
102
- className: cn("flex size-9 items-center justify-center", className),
103
- ...props,
104
- children: [
105
- /* @__PURE__ */ jsx(MoreHorizontalIcon, { className: "size-4" }),
106
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "More pages" })
107
- ]
108
- }
109
- );
110
- }
111
-
112
- export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious };
113
- //# sourceMappingURL=chunk-7IRLBU2I.js.map
114
- //# sourceMappingURL=chunk-7IRLBU2I.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/pagination.tsx"],"names":[],"mappings":"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","file":"chunk-7IRLBU2I.js","sourcesContent":["import * as React from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button, buttonVariants } from \"./button\";\n\n/**\n * Page navigation component with numbered links, previous/next buttons, and ellipsis indicators.\n *\n * Renders as a `<nav>` with `aria-label=\"pagination\"` for accessibility.\n * Compose with `PaginationContent`, `PaginationItem`, `PaginationLink`,\n * `PaginationPrevious`, `PaginationNext`, and `PaginationEllipsis`.\n *\n * @example\n * ```tsx\n * <Pagination>\n * <PaginationContent>\n * <PaginationItem>\n * <PaginationPrevious href=\"#\" />\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\" isActive>1</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\">2</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationEllipsis />\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\">10</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationNext href=\"#\" />\n * </PaginationItem>\n * </PaginationContent>\n * </Pagination>\n * ```\n */\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\n/** Flex container for pagination items. Renders as a `<ul>`. */\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** List item wrapper for a single pagination element. */\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n /** When true, renders the link with an `outline` variant and `aria-current=\"page\"`. */\n isActive?: boolean;\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">;\n\n/** Styled pagination link using button variants. Supports `isActive` for the current page. */\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className,\n )}\n {...props}\n />\n );\n}\n\n/** \"Previous\" pagination link with a left chevron icon. */\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n );\n}\n\n/** \"Next\" pagination link with a right chevron icon. */\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n );\n}\n\n/** Ellipsis indicator for omitted page numbers. Renders a `MoreHorizontal` icon with screen-reader text. */\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n"]}
@@ -1,99 +0,0 @@
1
- import { cn } from './chunk-DGPY4WP3.js';
2
- import { Slot } from '@radix-ui/react-slot';
3
- import { ChevronRight, MoreHorizontal } from 'lucide-react';
4
- import { jsx, jsxs } from 'react/jsx-runtime';
5
-
6
- function Breadcrumb({ ...props }) {
7
- return /* @__PURE__ */ jsx("nav", { "aria-label": "breadcrumb", "data-slot": "breadcrumb", ...props });
8
- }
9
- function BreadcrumbList({ className, ...props }) {
10
- return /* @__PURE__ */ jsx(
11
- "ol",
12
- {
13
- "data-slot": "breadcrumb-list",
14
- className: cn(
15
- "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
16
- className
17
- ),
18
- ...props
19
- }
20
- );
21
- }
22
- function BreadcrumbItem({ className, ...props }) {
23
- return /* @__PURE__ */ jsx(
24
- "li",
25
- {
26
- "data-slot": "breadcrumb-item",
27
- className: cn("inline-flex items-center gap-1.5", className),
28
- ...props
29
- }
30
- );
31
- }
32
- function BreadcrumbLink({
33
- asChild,
34
- className,
35
- ...props
36
- }) {
37
- const Comp = asChild ? Slot : "a";
38
- return /* @__PURE__ */ jsx(
39
- Comp,
40
- {
41
- "data-slot": "breadcrumb-link",
42
- className: cn("hover:text-foreground transition-colors", className),
43
- ...props
44
- }
45
- );
46
- }
47
- function BreadcrumbPage({ className, ...props }) {
48
- return /* @__PURE__ */ jsx(
49
- "span",
50
- {
51
- "data-slot": "breadcrumb-page",
52
- role: "link",
53
- "aria-disabled": "true",
54
- "aria-current": "page",
55
- className: cn("text-foreground font-normal", className),
56
- ...props
57
- }
58
- );
59
- }
60
- function BreadcrumbSeparator({
61
- children,
62
- className,
63
- ...props
64
- }) {
65
- return /* @__PURE__ */ jsx(
66
- "li",
67
- {
68
- "data-slot": "breadcrumb-separator",
69
- role: "presentation",
70
- "aria-hidden": "true",
71
- className: cn("[&>svg]:size-3.5", className),
72
- ...props,
73
- children: children ?? /* @__PURE__ */ jsx(ChevronRight, {})
74
- }
75
- );
76
- }
77
- function BreadcrumbEllipsis({
78
- className,
79
- ...props
80
- }) {
81
- return /* @__PURE__ */ jsxs(
82
- "span",
83
- {
84
- "data-slot": "breadcrumb-ellipsis",
85
- role: "presentation",
86
- "aria-hidden": "true",
87
- className: cn("flex size-9 items-center justify-center", className),
88
- ...props,
89
- children: [
90
- /* @__PURE__ */ jsx(MoreHorizontal, { className: "size-4" }),
91
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "More" })
92
- ]
93
- }
94
- );
95
- }
96
-
97
- export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator };
98
- //# sourceMappingURL=chunk-7RMTPT6O.js.map
99
- //# sourceMappingURL=chunk-7RMTPT6O.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/breadcrumb.tsx"],"names":[],"mappings":";;;;;AAgCA,SAAS,UAAA,CAAW,EAAE,GAAG,KAAA,EAAM,EAAgC;AAC7D,EAAA,2BAAQ,KAAA,EAAA,EAAI,YAAA,EAAW,cAAa,WAAA,EAAU,YAAA,EAAc,GAAG,KAAA,EAAO,CAAA;AACxE;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,0FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,MAC1D,GAAG;AAAA;AAAA,GACN;AAEJ;AAOA,SAAS,cAAA,CAAe;AAAA,EACtB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,GAAA;AAE9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiC;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,eAAA,EAAc,MAAA;AAAA,MACd,cAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACrD,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,sBAAA;AAAA,MACV,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,SAAS,CAAA;AAAA,MAC1C,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,QAAA,wBAAa,YAAA,EAAA,EAAa;AAAA;AAAA,GAC7B;AAEJ;AAGA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,WAAU,QAAA,EAAS,CAAA;AAAA,wBACnC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,MAAA,EAAI;AAAA;AAAA;AAAA,GAChC;AAEJ","file":"chunk-7RMTPT6O.js","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Navigation breadcrumb trail showing the current page hierarchy.\n *\n * Renders as a `<nav>` with `aria-label=\"breadcrumb\"` for accessibility.\n * Use `BreadcrumbSeparator` between items (defaults to a chevron icon)\n * and `BreadcrumbEllipsis` for collapsed intermediate items.\n *\n * @example\n * ```tsx\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/\">Home</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/projects\">Projects</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Current Project</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n * ```\n */\nfunction Breadcrumb({ ...props }: React.ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\n/** Ordered list container for breadcrumb items. Handles wrapping and spacing. */\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Individual breadcrumb list item wrapping a link or page indicator. */\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Clickable breadcrumb link. Set `asChild` to render a custom element (e.g., React Router `Link`).\n *\n * @param asChild - When true, renders the child element instead of an `<a>` tag.\n */\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n />\n );\n}\n\n/** Non-interactive breadcrumb label for the current page. Rendered with `aria-current=\"page\"`. */\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n );\n}\n\n/** Visual separator between breadcrumb items. Defaults to a `ChevronRight` icon; pass custom children to override. */\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\n/** Ellipsis indicator for collapsed breadcrumb items. Renders a `MoreHorizontal` icon with screen-reader text. */\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n"]}