@tulip-systems/core 0.6.1 → 0.7.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 (523) hide show
  1. package/LICENSE +662 -0
  2. package/dist/components/client.d.mts +19 -3
  3. package/dist/components/client.mjs +18 -2
  4. package/dist/components/editor/components/menu-nodes.client.mjs +1 -1
  5. package/dist/components/editor/components/menu-nodes.client.mjs.map +1 -1
  6. package/dist/components/editor/components/menu.client.mjs +3 -3
  7. package/dist/components/editor/components/menu.client.mjs.map +1 -1
  8. package/dist/components/emails/forget-password-email.mjs +6 -6
  9. package/dist/components/emails/forget-password-email.mjs.map +1 -1
  10. package/dist/components/header/back-button.client.mjs +2 -2
  11. package/dist/components/header/back-button.client.mjs.map +1 -1
  12. package/dist/components/header/bottom-bar.client.mjs +2 -2
  13. package/dist/components/header/bottom-bar.client.mjs.map +1 -1
  14. package/dist/components/header/breadcrumbs.client.mjs +1 -1
  15. package/dist/components/header/breadcrumbs.client.mjs.map +1 -1
  16. package/dist/components/header/header.client.mjs +1 -1
  17. package/dist/components/header/header.client.mjs.map +1 -1
  18. package/dist/components/layouts/empty-page.mjs +2 -2
  19. package/dist/components/layouts/empty-page.mjs.map +1 -1
  20. package/dist/components/layouts/error-page.mjs +3 -3
  21. package/dist/components/layouts/error-page.mjs.map +1 -1
  22. package/dist/components/layouts/providers.client.d.mts.map +1 -1
  23. package/dist/components/layouts/providers.client.mjs +3 -2
  24. package/dist/components/layouts/providers.client.mjs.map +1 -1
  25. package/dist/components/layouts/root-loading.mjs +2 -2
  26. package/dist/components/layouts/root-loading.mjs.map +1 -1
  27. package/dist/components/layouts/tab-layout.mjs +1 -1
  28. package/dist/components/layouts/tab-layout.mjs.map +1 -1
  29. package/dist/components/lists/data-list.mjs +1 -1
  30. package/dist/components/lists/data-list.mjs.map +1 -1
  31. package/dist/components/lists/data-stack.mjs +1 -1
  32. package/dist/components/lists/data-stack.mjs.map +1 -1
  33. package/dist/components/navigation/admin-sidebar-header.client.mjs +3 -3
  34. package/dist/components/navigation/admin-sidebar-header.client.mjs.map +1 -1
  35. package/dist/components/navigation/admin-sidebar-skeleton.mjs +1 -1
  36. package/dist/components/navigation/admin-sidebar-skeleton.mjs.map +1 -1
  37. package/dist/components/ui/accordion.client.d.mts +26 -0
  38. package/dist/components/ui/accordion.client.d.mts.map +1 -0
  39. package/dist/components/ui/accordion.client.mjs +58 -0
  40. package/dist/components/ui/accordion.client.mjs.map +1 -0
  41. package/dist/components/ui/alert-dialog.client.d.mts +61 -0
  42. package/dist/components/ui/alert-dialog.client.d.mts.map +1 -0
  43. package/dist/components/ui/alert-dialog.client.mjs +104 -0
  44. package/dist/components/ui/alert-dialog.client.mjs.map +1 -0
  45. package/dist/components/ui/alert.d.mts +5 -1
  46. package/dist/components/ui/alert.d.mts.map +1 -1
  47. package/dist/components/ui/alert.mjs +13 -6
  48. package/dist/components/ui/alert.mjs.map +1 -1
  49. package/dist/components/ui/aspect-ratio.client.d.mts +10 -0
  50. package/dist/components/ui/aspect-ratio.client.d.mts.map +1 -0
  51. package/dist/components/ui/aspect-ratio.client.mjs +16 -0
  52. package/dist/components/ui/aspect-ratio.client.mjs.map +1 -0
  53. package/dist/components/ui/avatar.client.d.mts +21 -6
  54. package/dist/components/ui/avatar.client.d.mts.map +1 -1
  55. package/dist/components/ui/avatar.client.mjs +31 -9
  56. package/dist/components/ui/avatar.client.mjs.map +1 -1
  57. package/dist/components/ui/badge.d.mts +1 -1
  58. package/dist/components/ui/badge.d.mts.map +1 -1
  59. package/dist/components/ui/badge.mjs +11 -8
  60. package/dist/components/ui/badge.mjs.map +1 -1
  61. package/dist/components/ui/breadcrumb.d.mts +3 -1
  62. package/dist/components/ui/breadcrumb.d.mts.map +1 -1
  63. package/dist/components/ui/breadcrumb.mjs +7 -7
  64. package/dist/components/ui/breadcrumb.mjs.map +1 -1
  65. package/dist/components/ui/button-group.d.mts +29 -0
  66. package/dist/components/ui/button-group.d.mts.map +1 -0
  67. package/dist/components/ui/button-group.mjs +41 -0
  68. package/dist/components/ui/button-group.mjs.map +1 -0
  69. package/dist/components/ui/button.d.mts +1 -1
  70. package/dist/components/ui/button.d.mts.map +1 -1
  71. package/dist/components/ui/button.mjs +19 -13
  72. package/dist/components/ui/button.mjs.map +1 -1
  73. package/dist/components/ui/{calendar.d.mts → calendar.client.d.mts} +7 -4
  74. package/dist/components/ui/calendar.client.d.mts.map +1 -0
  75. package/dist/components/ui/{calendar.mjs → calendar.client.mjs} +22 -19
  76. package/dist/components/ui/calendar.client.mjs.map +1 -0
  77. package/dist/components/ui/card.d.mts +9 -2
  78. package/dist/components/ui/card.d.mts.map +1 -1
  79. package/dist/components/ui/card.mjs +15 -7
  80. package/dist/components/ui/card.mjs.map +1 -1
  81. package/dist/components/ui/{carousel.d.mts → carousel.client.d.mts} +12 -3
  82. package/dist/components/ui/carousel.client.d.mts.map +1 -0
  83. package/dist/components/ui/{carousel.mjs → carousel.client.mjs} +10 -10
  84. package/dist/components/ui/carousel.client.mjs.map +1 -0
  85. package/dist/components/ui/chart.client.d.mts.map +1 -1
  86. package/dist/components/ui/chart.client.mjs +11 -11
  87. package/dist/components/ui/chart.client.mjs.map +1 -1
  88. package/dist/components/ui/checkbox.client.d.mts +12 -0
  89. package/dist/components/ui/checkbox.client.d.mts.map +1 -0
  90. package/dist/components/ui/checkbox.client.mjs +24 -0
  91. package/dist/components/ui/checkbox.client.mjs.map +1 -0
  92. package/dist/components/ui/collapsible.client.d.mts +6 -6
  93. package/dist/components/ui/collapsible.client.d.mts.map +1 -1
  94. package/dist/components/ui/collapsible.client.mjs +6 -6
  95. package/dist/components/ui/collapsible.client.mjs.map +1 -1
  96. package/dist/components/ui/combobox-dropdown.client.d.mts +1 -1
  97. package/dist/components/ui/combobox-dropdown.client.mjs +2 -2
  98. package/dist/components/ui/combobox-dropdown.client.mjs.map +1 -1
  99. package/dist/components/ui/combobox.client.mjs +4 -4
  100. package/dist/components/ui/combobox.client.mjs.map +1 -1
  101. package/dist/components/ui/{command.d.mts → command.client.d.mts} +8 -2
  102. package/dist/components/ui/command.client.d.mts.map +1 -0
  103. package/dist/components/ui/command.client.mjs +91 -0
  104. package/dist/components/ui/command.client.mjs.map +1 -0
  105. package/dist/components/ui/context-menu.client.d.mts +86 -0
  106. package/dist/components/ui/context-menu.client.d.mts.map +1 -0
  107. package/dist/components/ui/context-menu.client.mjs +128 -0
  108. package/dist/components/ui/context-menu.client.mjs.map +1 -0
  109. package/dist/components/ui/date-picker.client.mjs +2 -2
  110. package/dist/components/ui/date-picker.client.mjs.map +1 -1
  111. package/dist/components/ui/dialog.client.d.mts +19 -12
  112. package/dist/components/ui/dialog.client.d.mts.map +1 -1
  113. package/dist/components/ui/dialog.client.mjs +40 -29
  114. package/dist/components/ui/dialog.client.mjs.map +1 -1
  115. package/dist/components/ui/drawer.client.d.mts.map +1 -1
  116. package/dist/components/ui/drawer.client.mjs +5 -5
  117. package/dist/components/ui/drawer.client.mjs.map +1 -1
  118. package/dist/components/ui/dropdown-menu.client.d.mts +85 -0
  119. package/dist/components/ui/dropdown-menu.client.d.mts.map +1 -0
  120. package/dist/components/ui/dropdown-menu.client.mjs +131 -0
  121. package/dist/components/ui/dropdown-menu.client.mjs.map +1 -0
  122. package/dist/components/ui/empty.d.mts +36 -0
  123. package/dist/components/ui/empty.d.mts.map +1 -0
  124. package/dist/components/ui/empty.mjs +62 -0
  125. package/dist/components/ui/empty.mjs.map +1 -0
  126. package/dist/components/ui/field.client.d.mts +65 -0
  127. package/dist/components/ui/field.client.d.mts.map +1 -0
  128. package/dist/components/ui/field.client.mjs +114 -0
  129. package/dist/components/ui/field.client.mjs.map +1 -0
  130. package/dist/components/ui/form.client.d.mts +3 -4
  131. package/dist/components/ui/form.client.d.mts.map +1 -1
  132. package/dist/components/ui/form.client.mjs +4 -4
  133. package/dist/components/ui/form.client.mjs.map +1 -1
  134. package/dist/components/ui/hover-card.client.d.mts +6 -6
  135. package/dist/components/ui/hover-card.client.d.mts.map +1 -1
  136. package/dist/components/ui/hover-card.client.mjs +14 -11
  137. package/dist/components/ui/hover-card.client.mjs.map +1 -1
  138. package/dist/components/ui/{input-date-time.d.mts → input-date-time.client.d.mts} +3 -3
  139. package/dist/components/ui/input-date-time.client.d.mts.map +1 -0
  140. package/dist/components/ui/{input-date-time.mjs → input-date-time.client.mjs} +4 -2
  141. package/dist/components/ui/input-date-time.client.mjs.map +1 -0
  142. package/dist/components/ui/input-date.d.mts +1 -1
  143. package/dist/components/ui/input-date.d.mts.map +1 -1
  144. package/dist/components/ui/input-date.mjs.map +1 -1
  145. package/dist/components/ui/input-group.client.d.mts +59 -0
  146. package/dist/components/ui/input-group.client.d.mts.map +1 -0
  147. package/dist/components/ui/input-group.client.mjs +106 -0
  148. package/dist/components/ui/input-group.client.mjs.map +1 -0
  149. package/dist/components/ui/input-recipient.mjs +11 -11
  150. package/dist/components/ui/input-recipient.mjs.map +1 -1
  151. package/dist/components/ui/input-time.d.mts +1 -1
  152. package/dist/components/ui/input-time.d.mts.map +1 -1
  153. package/dist/components/ui/input-time.mjs.map +1 -1
  154. package/dist/components/ui/input.d.mts.map +1 -1
  155. package/dist/components/ui/input.mjs +1 -1
  156. package/dist/components/ui/input.mjs.map +1 -1
  157. package/dist/components/ui/item.d.mts +63 -0
  158. package/dist/components/ui/item.d.mts.map +1 -0
  159. package/dist/components/ui/item.mjs +119 -0
  160. package/dist/components/ui/item.mjs.map +1 -0
  161. package/dist/components/ui/kbd.d.mts +14 -0
  162. package/dist/components/ui/kbd.d.mts.map +1 -0
  163. package/dist/components/ui/kbd.mjs +22 -0
  164. package/dist/components/ui/kbd.mjs.map +1 -0
  165. package/dist/components/ui/label.d.mts +4 -4
  166. package/dist/components/ui/label.d.mts.map +1 -1
  167. package/dist/components/ui/label.mjs +5 -5
  168. package/dist/components/ui/label.mjs.map +1 -1
  169. package/dist/components/ui/loader.d.mts +7 -0
  170. package/dist/components/ui/loader.d.mts.map +1 -0
  171. package/dist/components/ui/loader.mjs +63 -0
  172. package/dist/components/ui/loader.mjs.map +1 -0
  173. package/dist/components/ui/navigation-menu.d.mts +11 -11
  174. package/dist/components/ui/navigation-menu.d.mts.map +1 -1
  175. package/dist/components/ui/navigation-menu.mjs +18 -20
  176. package/dist/components/ui/navigation-menu.mjs.map +1 -1
  177. package/dist/components/ui/pagination.d.mts +8 -2
  178. package/dist/components/ui/pagination.d.mts.map +1 -1
  179. package/dist/components/ui/pagination.mjs +29 -21
  180. package/dist/components/ui/pagination.mjs.map +1 -1
  181. package/dist/components/ui/popover.client.d.mts +35 -0
  182. package/dist/components/ui/popover.client.d.mts.map +1 -0
  183. package/dist/components/ui/popover.client.mjs +59 -0
  184. package/dist/components/ui/popover.client.mjs.map +1 -0
  185. package/dist/components/ui/progress.client.d.mts +4 -4
  186. package/dist/components/ui/progress.client.d.mts.map +1 -1
  187. package/dist/components/ui/progress.client.mjs +7 -7
  188. package/dist/components/ui/progress.client.mjs.map +1 -1
  189. package/dist/components/ui/radio-group.d.mts +5 -5
  190. package/dist/components/ui/radio-group.d.mts.map +1 -1
  191. package/dist/components/ui/radio-group.mjs +10 -11
  192. package/dist/components/ui/radio-group.mjs.map +1 -1
  193. package/dist/components/ui/resizable.client.d.mts +3 -4
  194. package/dist/components/ui/resizable.client.d.mts.map +1 -1
  195. package/dist/components/ui/resizable.client.mjs +5 -9
  196. package/dist/components/ui/resizable.client.mjs.map +1 -1
  197. package/dist/components/ui/scroll-area.d.mts +5 -5
  198. package/dist/components/ui/scroll-area.d.mts.map +1 -1
  199. package/dist/components/ui/scroll-area.mjs +12 -11
  200. package/dist/components/ui/scroll-area.mjs.map +1 -1
  201. package/dist/components/ui/select.client.d.mts +18 -13
  202. package/dist/components/ui/select.client.d.mts.map +1 -1
  203. package/dist/components/ui/select.client.mjs +37 -32
  204. package/dist/components/ui/select.client.mjs.map +1 -1
  205. package/dist/components/ui/separator.d.mts +4 -4
  206. package/dist/components/ui/separator.d.mts.map +1 -1
  207. package/dist/components/ui/separator.mjs +6 -6
  208. package/dist/components/ui/separator.mjs.map +1 -1
  209. package/dist/components/ui/sheet.client.d.mts +9 -7
  210. package/dist/components/ui/sheet.client.d.mts.map +1 -1
  211. package/dist/components/ui/sheet.client.mjs +30 -20
  212. package/dist/components/ui/sheet.client.mjs.map +1 -1
  213. package/dist/components/ui/sidebar.client.mjs +28 -28
  214. package/dist/components/ui/sidebar.client.mjs.map +1 -1
  215. package/dist/components/ui/skeleton.mjs +1 -1
  216. package/dist/components/ui/skeleton.mjs.map +1 -1
  217. package/dist/components/ui/slider.d.mts +4 -4
  218. package/dist/components/ui/slider.d.mts.map +1 -1
  219. package/dist/components/ui/slider.mjs +11 -11
  220. package/dist/components/ui/slider.mjs.map +1 -1
  221. package/dist/components/ui/spinner.d.mts +10 -0
  222. package/dist/components/ui/spinner.d.mts.map +1 -0
  223. package/dist/components/ui/spinner.mjs +9 -55
  224. package/dist/components/ui/spinner.mjs.map +1 -1
  225. package/dist/components/ui/switch.client.d.mts +15 -0
  226. package/dist/components/ui/switch.client.d.mts.map +1 -0
  227. package/dist/components/ui/switch.client.mjs +23 -0
  228. package/dist/components/ui/switch.client.mjs.map +1 -0
  229. package/dist/components/ui/tabs.client.d.mts +31 -0
  230. package/dist/components/ui/tabs.client.d.mts.map +1 -0
  231. package/dist/components/ui/tabs.client.mjs +49 -0
  232. package/dist/components/ui/tabs.client.mjs.map +1 -0
  233. package/dist/components/ui/textarea.d.mts.map +1 -1
  234. package/dist/components/ui/textarea.mjs +1 -1
  235. package/dist/components/ui/textarea.mjs.map +1 -1
  236. package/dist/components/ui/toggle-group.client.d.mts +11 -6
  237. package/dist/components/ui/toggle-group.client.d.mts.map +1 -1
  238. package/dist/components/ui/toggle-group.client.mjs +20 -12
  239. package/dist/components/ui/toggle-group.client.mjs.map +1 -1
  240. package/dist/components/ui/{toggle.d.mts → toggle.client.d.mts} +6 -6
  241. package/dist/components/ui/toggle.client.d.mts.map +1 -0
  242. package/dist/components/ui/toggle.client.mjs +40 -0
  243. package/dist/components/ui/toggle.client.mjs.map +1 -0
  244. package/dist/components/ui/tooltip.client.d.mts +7 -7
  245. package/dist/components/ui/tooltip.client.d.mts.map +1 -1
  246. package/dist/components/ui/tooltip.client.mjs +10 -10
  247. package/dist/components/ui/tooltip.client.mjs.map +1 -1
  248. package/dist/components.d.mts +12 -20
  249. package/dist/components.mjs +12 -20
  250. package/dist/inline-edit/client.d.mts +2 -2
  251. package/dist/lib/hooks/use-indicator.d.mts.map +1 -1
  252. package/dist/lib/hooks/use-indicator.mjs.map +1 -1
  253. package/dist/modules/auth/components/auth-layout.server.mjs +2 -2
  254. package/dist/modules/auth/components/auth-layout.server.mjs.map +1 -1
  255. package/dist/modules/auth/components/create-first-user-page.client.mjs +3 -3
  256. package/dist/modules/auth/components/create-first-user-page.client.mjs.map +1 -1
  257. package/dist/modules/auth/components/forget-password-page.client.mjs +1 -1
  258. package/dist/modules/auth/components/forget-password-page.client.mjs.map +1 -1
  259. package/dist/modules/auth/components/login-page.client.mjs +5 -5
  260. package/dist/modules/auth/components/login-page.client.mjs.map +1 -1
  261. package/dist/modules/auth/components/reset-password-page.client.mjs +5 -5
  262. package/dist/modules/auth/components/reset-password-page.client.mjs.map +1 -1
  263. package/dist/modules/commands/components/alert-dialog-command.client.d.mts +9 -9
  264. package/dist/modules/commands/components/alert-dialog-command.client.d.mts.map +1 -1
  265. package/dist/modules/commands/components/alert-dialog-command.client.mjs +3 -3
  266. package/dist/modules/commands/components/alert-dialog-command.client.mjs.map +1 -1
  267. package/dist/modules/commands/components/click-command.client.mjs +2 -2
  268. package/dist/modules/commands/components/click-command.client.mjs.map +1 -1
  269. package/dist/modules/commands/components/dialog-command.client.d.mts +8 -8
  270. package/dist/modules/commands/components/dialog-command.client.d.mts.map +1 -1
  271. package/dist/modules/commands/components/dialog-command.client.mjs +2 -2
  272. package/dist/modules/commands/components/dialog-command.client.mjs.map +1 -1
  273. package/dist/modules/commands/components/dropdown-command.client.mjs +2 -2
  274. package/dist/modules/commands/components/dropdown-command.client.mjs.map +1 -1
  275. package/dist/modules/commands/components/empty-command.client.mjs +2 -2
  276. package/dist/modules/commands/components/empty-command.client.mjs.map +1 -1
  277. package/dist/modules/commands/components/form-dialog-command.client.d.mts +11 -9
  278. package/dist/modules/commands/components/form-dialog-command.client.d.mts.map +1 -1
  279. package/dist/modules/commands/components/form-dialog-command.client.mjs +8 -6
  280. package/dist/modules/commands/components/form-dialog-command.client.mjs.map +1 -1
  281. package/dist/modules/commands/menus/context-menu.client.d.mts +3 -3
  282. package/dist/modules/commands/menus/context-menu.client.d.mts.map +1 -1
  283. package/dist/modules/commands/menus/context-menu.client.mjs +1 -1
  284. package/dist/modules/commands/menus/context-menu.client.mjs.map +1 -1
  285. package/dist/modules/commands/menus/dropdown-menu.client.mjs +2 -2
  286. package/dist/modules/commands/menus/dropdown-menu.client.mjs.map +1 -1
  287. package/dist/modules/commands/menus/floating-menu.client.mjs +2 -2
  288. package/dist/modules/commands/menus/floating-menu.client.mjs.map +1 -1
  289. package/dist/modules/commands/utils/archive-command.client.mjs +1 -1
  290. package/dist/modules/commands/utils/archive-command.client.mjs.map +1 -1
  291. package/dist/modules/commands/utils/delete-command.client.mjs +1 -1
  292. package/dist/modules/commands/utils/delete-command.client.mjs.map +1 -1
  293. package/dist/modules/data-tables/components/cell/select.client.mjs +1 -1
  294. package/dist/modules/data-tables/components/cell/select.client.mjs.map +1 -1
  295. package/dist/modules/data-tables/components/column-header.mjs +5 -5
  296. package/dist/modules/data-tables/components/column-header.mjs.map +1 -1
  297. package/dist/modules/data-tables/components/filters/combobox.client.mjs +6 -6
  298. package/dist/modules/data-tables/components/filters/combobox.client.mjs.map +1 -1
  299. package/dist/modules/data-tables/components/filters/slider.client.mjs +2 -2
  300. package/dist/modules/data-tables/components/filters/slider.client.mjs.map +1 -1
  301. package/dist/modules/data-tables/components/header.mjs +1 -1
  302. package/dist/modules/data-tables/components/header.mjs.map +1 -1
  303. package/dist/modules/data-tables/components/skeleton.mjs +2 -2
  304. package/dist/modules/data-tables/components/skeleton.mjs.map +1 -1
  305. package/dist/modules/data-tables/components/table.mjs +3 -3
  306. package/dist/modules/data-tables/components/table.mjs.map +1 -1
  307. package/dist/modules/data-tables/components/toolbar.mjs +1 -1
  308. package/dist/modules/data-tables/components/toolbar.mjs.map +1 -1
  309. package/dist/modules/data-tables/strategies/pagination/components.mjs +3 -3
  310. package/dist/modules/data-tables/strategies/pagination/components.mjs.map +1 -1
  311. package/dist/modules/data-tables/tables/inline-table/components/cells/common.mjs +1 -1
  312. package/dist/modules/data-tables/tables/inline-table/components/cells/common.mjs.map +1 -1
  313. package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.mjs +1 -1
  314. package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.mjs.map +1 -1
  315. package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.mjs +1 -1
  316. package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.mjs.map +1 -1
  317. package/dist/modules/inline-edit/components/date-input.client.mjs +3 -3
  318. package/dist/modules/inline-edit/components/date-input.client.mjs.map +1 -1
  319. package/dist/modules/inline-edit/components/date-picker.client.mjs +2 -2
  320. package/dist/modules/inline-edit/components/date-picker.client.mjs.map +1 -1
  321. package/dist/modules/inline-edit/components/date-time.client.d.mts +1 -1
  322. package/dist/modules/inline-edit/components/date-time.client.mjs +1 -1
  323. package/dist/modules/inline-edit/components/date-time.client.mjs.map +1 -1
  324. package/dist/modules/inline-edit/components/input-toggle.client.mjs +2 -2
  325. package/dist/modules/inline-edit/components/input-toggle.client.mjs.map +1 -1
  326. package/dist/modules/inline-edit/components/input.client.mjs +3 -3
  327. package/dist/modules/inline-edit/components/input.client.mjs.map +1 -1
  328. package/dist/modules/inline-edit/components/select.client.d.mts +8 -11
  329. package/dist/modules/inline-edit/components/select.client.d.mts.map +1 -1
  330. package/dist/modules/inline-edit/components/select.client.mjs.map +1 -1
  331. package/dist/modules/inline-edit/components/switch.client.d.mts +3 -2
  332. package/dist/modules/inline-edit/components/switch.client.d.mts.map +1 -1
  333. package/dist/modules/inline-edit/components/switch.client.mjs +1 -1
  334. package/dist/modules/inline-edit/components/switch.client.mjs.map +1 -1
  335. package/dist/modules/inline-edit/components/toggle.client.mjs +1 -1
  336. package/dist/modules/inline-edit/components/toggle.client.mjs.map +1 -1
  337. package/dist/modules/inline-edit/lib/variants.d.mts +1 -1
  338. package/dist/modules/inline-edit/lib/variants.mjs +1 -1
  339. package/dist/modules/inline-edit/lib/variants.mjs.map +1 -1
  340. package/dist/modules/storage/components/dropzone.client.mjs +8 -8
  341. package/dist/modules/storage/components/dropzone.client.mjs.map +1 -1
  342. package/dist/modules/storage/components/image-grid.client.mjs +5 -5
  343. package/dist/modules/storage/components/image-grid.client.mjs.map +1 -1
  344. package/dist/modules/storage/components/upload-zone.client.mjs +1 -1
  345. package/dist/modules/storage/components/upload-zone.client.mjs.map +1 -1
  346. package/dist/modules/storage/lib/router.server.d.mts +11 -11
  347. package/dist/modules/storage/lib/service.server.d.mts +9 -9
  348. package/dist/modules/storage/lib/validators.d.mts +7 -7
  349. package/package.json +6 -31
  350. package/src/components/editor/components/menu-nodes.client.tsx +1 -1
  351. package/src/components/editor/components/menu.client.tsx +3 -3
  352. package/src/components/emails/forget-password-email.tsx +6 -6
  353. package/src/components/entry.client.ts +16 -0
  354. package/src/components/entry.ts +6 -14
  355. package/src/components/header/back-button.client.tsx +2 -2
  356. package/src/components/header/bottom-bar.client.tsx +2 -2
  357. package/src/components/header/breadcrumbs.client.tsx +1 -1
  358. package/src/components/header/header.client.tsx +1 -1
  359. package/src/components/layouts/empty-page.tsx +2 -2
  360. package/src/components/layouts/error-page.tsx +3 -3
  361. package/src/components/layouts/providers.client.tsx +8 -5
  362. package/src/components/layouts/root-loading.tsx +2 -2
  363. package/src/components/layouts/tab-layout.tsx +1 -1
  364. package/src/components/lists/data-list.tsx +1 -1
  365. package/src/components/lists/data-stack.tsx +1 -1
  366. package/src/components/navigation/admin-sidebar-header.client.tsx +3 -3
  367. package/src/components/navigation/admin-sidebar-skeleton.tsx +1 -1
  368. package/src/components/ui/accordion.client.tsx +83 -0
  369. package/src/components/ui/alert-dialog.client.tsx +181 -0
  370. package/src/components/ui/alert.tsx +15 -7
  371. package/src/components/ui/aspect-ratio.client.tsx +9 -0
  372. package/src/components/ui/avatar.client.tsx +61 -6
  373. package/src/components/ui/badge.tsx +17 -11
  374. package/src/components/ui/breadcrumb.tsx +9 -10
  375. package/src/components/ui/button-group.tsx +78 -0
  376. package/src/components/ui/button.tsx +26 -16
  377. package/src/components/ui/{calendar.tsx → calendar.client.tsx} +27 -20
  378. package/src/components/ui/card.tsx +41 -8
  379. package/src/components/ui/{carousel.tsx → carousel.client.tsx} +12 -12
  380. package/src/components/ui/chart.client.tsx +105 -103
  381. package/src/components/ui/checkbox.client.tsx +28 -0
  382. package/src/components/ui/collapsible.client.tsx +2 -2
  383. package/src/components/ui/combobox-dropdown.client.tsx +2 -2
  384. package/src/components/ui/combobox.client.tsx +6 -6
  385. package/src/components/ui/command.client.tsx +179 -0
  386. package/src/components/ui/{context-menu.tsx → context-menu.client.tsx} +86 -64
  387. package/src/components/ui/date-picker.client.tsx +2 -2
  388. package/src/components/ui/dialog.client.tsx +43 -20
  389. package/src/components/ui/drawer.client.tsx +13 -15
  390. package/src/components/ui/{dropdown-menu.tsx → dropdown-menu.client.tsx} +45 -24
  391. package/src/components/ui/empty.tsx +93 -0
  392. package/src/components/ui/field.client.tsx +224 -0
  393. package/src/components/ui/form.client.tsx +4 -4
  394. package/src/components/ui/hover-card.client.tsx +14 -13
  395. package/src/components/ui/{input-date-time.tsx → input-date-time.client.tsx} +6 -1
  396. package/src/components/ui/input-date.tsx +1 -1
  397. package/src/components/ui/input-group.client.tsx +191 -0
  398. package/src/components/ui/input-recipient.tsx +12 -12
  399. package/src/components/ui/input-time.tsx +1 -1
  400. package/src/components/ui/input.tsx +2 -4
  401. package/src/components/ui/item.tsx +182 -0
  402. package/src/components/ui/kbd.tsx +26 -0
  403. package/src/components/ui/label.tsx +2 -3
  404. package/src/components/ui/loader.tsx +51 -0
  405. package/src/components/ui/navigation-menu.tsx +14 -17
  406. package/src/components/ui/pagination.tsx +31 -26
  407. package/src/components/ui/popover.client.tsx +73 -0
  408. package/src/components/ui/progress.client.tsx +6 -4
  409. package/src/components/ui/radio-group.tsx +5 -7
  410. package/src/components/ui/resizable.client.tsx +9 -19
  411. package/src/components/ui/scroll-area.tsx +5 -7
  412. package/src/components/ui/select.client.tsx +40 -22
  413. package/src/components/ui/separator.tsx +3 -4
  414. package/src/components/ui/sheet.client.tsx +19 -18
  415. package/src/components/ui/sidebar.client.tsx +27 -27
  416. package/src/components/ui/skeleton.tsx +1 -1
  417. package/src/components/ui/slider.tsx +5 -10
  418. package/src/components/ui/spinner.tsx +12 -48
  419. package/src/components/ui/switch.client.tsx +32 -0
  420. package/src/components/ui/tabs.client.tsx +79 -0
  421. package/src/components/ui/textarea.tsx +1 -2
  422. package/src/components/ui/toggle-group.client.tsx +26 -10
  423. package/src/components/ui/toggle.client.tsx +44 -0
  424. package/src/components/ui/tooltip.client.tsx +4 -9
  425. package/src/lib/hooks/use-indicator.tsx +4 -7
  426. package/src/modules/auth/components/auth-layout.server.tsx +2 -2
  427. package/src/modules/auth/components/create-first-user-page.client.tsx +4 -4
  428. package/src/modules/auth/components/forget-password-page.client.tsx +1 -1
  429. package/src/modules/auth/components/login-page.client.tsx +6 -6
  430. package/src/modules/auth/components/reset-password-page.client.tsx +7 -7
  431. package/src/modules/commands/components/alert-dialog-command.client.tsx +20 -16
  432. package/src/modules/commands/components/click-command.client.tsx +2 -2
  433. package/src/modules/commands/components/dialog-command.client.tsx +11 -10
  434. package/src/modules/commands/components/dropdown-command.client.tsx +2 -2
  435. package/src/modules/commands/components/empty-command.client.tsx +2 -2
  436. package/src/modules/commands/components/form-dialog-command.client.tsx +29 -13
  437. package/src/modules/commands/menus/context-menu.client.tsx +3 -4
  438. package/src/modules/commands/menus/dropdown-menu.client.tsx +2 -2
  439. package/src/modules/commands/menus/floating-menu.client.tsx +2 -2
  440. package/src/modules/commands/utils/archive-command.client.tsx +1 -1
  441. package/src/modules/commands/utils/delete-command.client.tsx +1 -1
  442. package/src/modules/data-tables/components/cell/select.client.tsx +1 -1
  443. package/src/modules/data-tables/components/column-header.tsx +5 -5
  444. package/src/modules/data-tables/components/filters/combobox.client.tsx +6 -6
  445. package/src/modules/data-tables/components/filters/slider.client.tsx +2 -2
  446. package/src/modules/data-tables/components/header.tsx +1 -1
  447. package/src/modules/data-tables/components/skeleton.tsx +2 -2
  448. package/src/modules/data-tables/components/table.tsx +3 -3
  449. package/src/modules/data-tables/components/toolbar.tsx +1 -1
  450. package/src/modules/data-tables/strategies/pagination/components.tsx +3 -3
  451. package/src/modules/data-tables/tables/inline-table/components/cells/common.tsx +1 -1
  452. package/src/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.tsx +1 -1
  453. package/src/modules/data-tables/tables/inline-table/components/cells/read-only.tsx +1 -1
  454. package/src/modules/inline-edit/components/date-input.client.tsx +3 -3
  455. package/src/modules/inline-edit/components/date-picker.client.tsx +2 -2
  456. package/src/modules/inline-edit/components/date-time.client.tsx +1 -1
  457. package/src/modules/inline-edit/components/input-toggle.client.tsx +2 -2
  458. package/src/modules/inline-edit/components/input.client.tsx +3 -3
  459. package/src/modules/inline-edit/components/select.client.tsx +6 -20
  460. package/src/modules/inline-edit/components/switch.client.tsx +3 -3
  461. package/src/modules/inline-edit/components/toggle.client.tsx +1 -1
  462. package/src/modules/inline-edit/lib/variants.ts +1 -1
  463. package/src/modules/storage/components/dropzone.client.tsx +8 -8
  464. package/src/modules/storage/components/image-grid.client.tsx +5 -5
  465. package/src/modules/storage/components/upload-zone.client.tsx +1 -1
  466. package/src/styles.css +1 -3
  467. package/dist/components/ui/accordion.d.mts +0 -25
  468. package/dist/components/ui/accordion.d.mts.map +0 -1
  469. package/dist/components/ui/accordion.mjs +0 -46
  470. package/dist/components/ui/accordion.mjs.map +0 -1
  471. package/dist/components/ui/alert-dialog.d.mts +0 -43
  472. package/dist/components/ui/alert-dialog.d.mts.map +0 -1
  473. package/dist/components/ui/alert-dialog.mjs +0 -84
  474. package/dist/components/ui/alert-dialog.mjs.map +0 -1
  475. package/dist/components/ui/aspect-ratio.d.mts +0 -8
  476. package/dist/components/ui/aspect-ratio.d.mts.map +0 -1
  477. package/dist/components/ui/aspect-ratio.mjs +0 -16
  478. package/dist/components/ui/aspect-ratio.mjs.map +0 -1
  479. package/dist/components/ui/calendar.d.mts.map +0 -1
  480. package/dist/components/ui/calendar.mjs.map +0 -1
  481. package/dist/components/ui/carousel.d.mts.map +0 -1
  482. package/dist/components/ui/carousel.mjs.map +0 -1
  483. package/dist/components/ui/checkbox.d.mts +0 -12
  484. package/dist/components/ui/checkbox.d.mts.map +0 -1
  485. package/dist/components/ui/checkbox.mjs +0 -24
  486. package/dist/components/ui/checkbox.mjs.map +0 -1
  487. package/dist/components/ui/command.d.mts.map +0 -1
  488. package/dist/components/ui/command.mjs +0 -88
  489. package/dist/components/ui/command.mjs.map +0 -1
  490. package/dist/components/ui/context-menu.d.mts +0 -77
  491. package/dist/components/ui/context-menu.d.mts.map +0 -1
  492. package/dist/components/ui/context-menu.mjs +0 -125
  493. package/dist/components/ui/context-menu.mjs.map +0 -1
  494. package/dist/components/ui/dropdown-menu.d.mts +0 -78
  495. package/dist/components/ui/dropdown-menu.d.mts.map +0 -1
  496. package/dist/components/ui/dropdown-menu.mjs +0 -126
  497. package/dist/components/ui/dropdown-menu.mjs.map +0 -1
  498. package/dist/components/ui/input-date-time.d.mts.map +0 -1
  499. package/dist/components/ui/input-date-time.mjs.map +0 -1
  500. package/dist/components/ui/popover.d.mts +0 -23
  501. package/dist/components/ui/popover.d.mts.map +0 -1
  502. package/dist/components/ui/popover.mjs +0 -38
  503. package/dist/components/ui/popover.mjs.map +0 -1
  504. package/dist/components/ui/switch.d.mts +0 -12
  505. package/dist/components/ui/switch.d.mts.map +0 -1
  506. package/dist/components/ui/switch.mjs +0 -22
  507. package/dist/components/ui/switch.mjs.map +0 -1
  508. package/dist/components/ui/tabs.d.mts +0 -24
  509. package/dist/components/ui/tabs.d.mts.map +0 -1
  510. package/dist/components/ui/tabs.mjs +0 -39
  511. package/dist/components/ui/tabs.mjs.map +0 -1
  512. package/dist/components/ui/toggle.d.mts.map +0 -1
  513. package/dist/components/ui/toggle.mjs +0 -40
  514. package/dist/components/ui/toggle.mjs.map +0 -1
  515. package/src/components/ui/accordion.tsx +0 -63
  516. package/src/components/ui/alert-dialog.tsx +0 -133
  517. package/src/components/ui/aspect-ratio.tsx +0 -9
  518. package/src/components/ui/checkbox.tsx +0 -29
  519. package/src/components/ui/command.tsx +0 -154
  520. package/src/components/ui/popover.tsx +0 -42
  521. package/src/components/ui/switch.tsx +0 -28
  522. package/src/components/ui/tabs.tsx +0 -54
  523. package/src/components/ui/toggle.tsx +0 -46
@@ -0,0 +1,106 @@
1
+ "use client";
2
+
3
+ import { cn } from "../../lib/utils/cn.mjs";
4
+ import { Button } from "./button.mjs";
5
+ import { Input } from "./input.mjs";
6
+ import { Textarea } from "./textarea.mjs";
7
+ import { DateInput } from "./input-date.mjs";
8
+ import { DateTimeInput } from "./input-date-time.client.mjs";
9
+ import { TimeInput } from "./input-time.mjs";
10
+ import { jsx } from "react/jsx-runtime";
11
+ import { cva } from "class-variance-authority";
12
+
13
+ //#region src/components/ui/input-group.client.tsx
14
+ function InputGroup({ className, ...props }) {
15
+ return /* @__PURE__ */ jsx("div", {
16
+ "data-slot": "input-group",
17
+ role: "group",
18
+ className: cn("group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input outline-none transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-start]]:h-auto has-[>textarea]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:flex-col has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot][aria-invalid=true]]:border-destructive has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>input]:pl-1.5", className),
19
+ ...props
20
+ });
21
+ }
22
+ const inputGroupAddonVariants = cva("text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none", {
23
+ variants: { align: {
24
+ "inline-start": "pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem] order-first",
25
+ "inline-end": "pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem] order-last",
26
+ "block-start": "px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start",
27
+ "block-end": "px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start"
28
+ } },
29
+ defaultVariants: { align: "inline-start" }
30
+ });
31
+ function InputGroupAddon({ className, align = "inline-start", ...props }) {
32
+ return /* @__PURE__ */ jsx("div", {
33
+ role: "group",
34
+ "data-slot": "input-group-addon",
35
+ "data-align": align,
36
+ className: cn(inputGroupAddonVariants({ align }), className),
37
+ onClick: (e) => {
38
+ if (e.target.closest("button")) return;
39
+ e.currentTarget.parentElement?.querySelector("input")?.focus();
40
+ },
41
+ ...props
42
+ });
43
+ }
44
+ const inputGroupButtonVariants = cva("gap-2 text-sm flex items-center shadow-none", {
45
+ variants: { size: {
46
+ xs: "h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
47
+ sm: "",
48
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0",
49
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0"
50
+ } },
51
+ defaultVariants: { size: "xs" }
52
+ });
53
+ function InputGroupButton({ className, type = "button", variant = "ghost", size = "xs", ...props }) {
54
+ return /* @__PURE__ */ jsx(Button, {
55
+ type,
56
+ "data-size": size,
57
+ variant,
58
+ className: cn(inputGroupButtonVariants({ size }), className),
59
+ ...props
60
+ });
61
+ }
62
+ function InputGroupText({ className, ...props }) {
63
+ return /* @__PURE__ */ jsx("span", {
64
+ className: cn("flex items-center gap-2 text-muted-foreground text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none", className),
65
+ ...props
66
+ });
67
+ }
68
+ function InputGroupInput({ className, ...props }) {
69
+ return /* @__PURE__ */ jsx(Input, {
70
+ "data-slot": "input-group-control",
71
+ className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
72
+ ...props
73
+ });
74
+ }
75
+ function InputGroupTextarea({ className, ...props }) {
76
+ return /* @__PURE__ */ jsx(Textarea, {
77
+ "data-slot": "input-group-control",
78
+ className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
79
+ ...props
80
+ });
81
+ }
82
+ function InputGroupTimeInput({ className, ...props }) {
83
+ return /* @__PURE__ */ jsx(TimeInput, {
84
+ "data-slot": "input-group-control",
85
+ className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
86
+ ...props
87
+ });
88
+ }
89
+ function InputGroupDateInput({ className, ...props }) {
90
+ return /* @__PURE__ */ jsx(DateInput, {
91
+ "data-slot": "input-group-control",
92
+ className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
93
+ ...props
94
+ });
95
+ }
96
+ function InputGroupDateTimeInput({ className, ...props }) {
97
+ return /* @__PURE__ */ jsx(DateTimeInput, {
98
+ "data-slot": "input-group-control",
99
+ className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
100
+ ...props
101
+ });
102
+ }
103
+
104
+ //#endregion
105
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupDateInput, InputGroupDateTimeInput, InputGroupInput, InputGroupText, InputGroupTextarea, InputGroupTimeInput };
106
+ //# sourceMappingURL=input-group.client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group.client.mjs","names":[],"sources":["../../../src/components/ui/input-group.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { DateInput, type DateInputProps } from \"./input-date\";\nimport { DateTimeInput, type DateTimeInputProps } from \"./input-date-time.client\";\nimport { TimeInput, type TimeInputProps } from \"./input-time\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: The div element is used to group the input and its addons together, and the role=\"group\" attribute is added for accessibility purposes.\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input outline-none transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-start]]:h-auto has-[>textarea]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:flex-col has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot][aria-invalid=true]]:border-destructive has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n \"inline-start\": \"pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem] order-first\",\n \"inline-end\": \"pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem] order-last\",\n \"block-start\":\n \"px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start\",\n \"block-end\":\n \"px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: The div element is used as an addon to the input group, and it is not intended to be interactive on its own. The onClick handler is added to allow users to focus the associated input when they click on the addon, but it does not require keyboard interaction as it is not a standalone interactive element.\n // biome-ignore lint/a11y/useSemanticElements: The div element is used as an addon to the input group, and it is not intended to be interactive on its own. The role=\"group\" attribute is added for accessibility purposes to indicate that this element is part of a group of related elements.\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\"gap-2 text-sm flex items-center shadow-none\", {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n});\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-muted-foreground text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTimeInput({ className, ...props }: TimeInputProps) {\n return (\n <TimeInput\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupDateInput({ className, ...props }: DateInputProps) {\n return (\n <DateInput\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupDateTimeInput({ className, ...props }: DateTimeInputProps) {\n return (\n <DateTimeInput\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n InputGroupTimeInput,\n InputGroupDateInput,\n InputGroupDateTimeInput,\n};\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QAEE,oBAAC;EACC,aAAU;EACV,MAAK;EACL,WAAW,GACT,ylCACA,UACD;EACD,GAAI;GACJ;;AAIN,MAAM,0BAA0B,IAC9B,2PACA;CACE,UAAU,EACR,OAAO;EACL,gBAAgB;EAChB,cAAc;EACd,eACE;EACF,aACE;EACH,EACF;CACD,iBAAiB,EACf,OAAO,gBACR;CACF,CACF;AAED,SAAS,gBAAgB,EACvB,WACA,QAAQ,gBACR,GAAG,SAC0E;AAC7E,QAGE,oBAAC;EACC,MAAK;EACL,aAAU;EACV,cAAY;EACZ,WAAW,GAAG,wBAAwB,EAAE,OAAO,CAAC,EAAE,UAAU;EAC5D,UAAU,MAAM;AACd,OAAK,EAAE,OAAuB,QAAQ,SAAS,CAC7C;AAEF,KAAE,cAAc,eAAe,cAAc,QAAQ,EAAE,OAAO;;EAEhE,GAAI;GACJ;;AAIN,MAAM,2BAA2B,IAAI,+CAA+C;CAClF,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,WAAW;EACX,WAAW;EACZ,EACF;CACD,iBAAiB,EACf,MAAM,MACP;CACF,CAAC;AAEF,SAAS,iBAAiB,EACxB,WACA,OAAO,UACP,UAAU,SACV,OAAO,MACP,GAAG,SAE4C;AAC/C,QACE,oBAAC;EACO;EACN,aAAW;EACF;EACT,WAAW,GAAG,yBAAyB,EAAE,MAAM,CAAC,EAAE,UAAU;EAC5D,GAAI;GACJ;;AAIN,SAAS,eAAe,EAAE,WAAW,GAAG,SAAuC;AAC7E,QACE,oBAAC;EACC,WAAW,GACT,0HACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAwC;AAC/E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAA2C;AACrF,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,qMACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,oBAAoB,EAAE,WAAW,GAAG,SAAyB;AACpE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,oBAAoB,EAAE,WAAW,GAAG,SAAyB;AACpE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,wBAAwB,EAAE,WAAW,GAAG,SAA6B;AAC5E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { cn } from "../../lib/utils/cn.mjs";
4
4
  import { Button } from "./button.mjs";
5
- import { Popover, PopoverContent, PopoverTrigger } from "./popover.mjs";
5
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.client.mjs";
6
6
  import { X } from "lucide-react";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import * as React$1 from "react";
@@ -112,12 +112,12 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
112
112
  asChild: true,
113
113
  children: /* @__PURE__ */ jsxs("div", {
114
114
  ref: containerRef,
115
- className: cn("border-input bg-background ring-offset-background flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border px-3 py-2 text-base transition-colors md:text-sm", "focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]", disabled && "cursor-not-allowed opacity-50", className),
115
+ className: cn("flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border border-input bg-background px-3 py-2 text-base ring-offset-background transition-colors md:text-sm", "focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50", disabled && "cursor-not-allowed opacity-50", className),
116
116
  onClick: () => {
117
117
  if (!disabled) inputRef.current?.focus();
118
118
  },
119
119
  children: [selectedContacts.map((contact) => /* @__PURE__ */ jsxs("div", {
120
- className: "border-border bg-accent/50 flex items-center gap-2 rounded-full border px-2 py-0.5",
120
+ className: "flex items-center gap-2 rounded-full border border-border bg-accent/50 px-2 py-0.5",
121
121
  children: [/* @__PURE__ */ jsx("span", {
122
122
  className: "text-xs",
123
123
  children: contact.email
@@ -125,7 +125,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
125
125
  type: "button",
126
126
  variant: "ghost",
127
127
  size: "icon",
128
- className: "hover:bg-destructive/20 h-4 w-4 rounded-full p-0",
128
+ className: "h-4 w-4 rounded-full p-0 hover:bg-destructive/20",
129
129
  onClick: (e) => {
130
130
  e.stopPropagation();
131
131
  handleRemove(contact.email);
@@ -147,7 +147,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
147
147
  onKeyDown: handleKeyDown,
148
148
  placeholder: value.length === 0 ? placeholder : "",
149
149
  disabled,
150
- className: "placeholder:text-muted-foreground min-w-30 flex-1 bg-transparent outline-none placeholder:text-sm disabled:cursor-not-allowed"
150
+ className: "min-w-30 flex-1 bg-transparent outline-none placeholder:text-muted-foreground placeholder:text-sm disabled:cursor-not-allowed"
151
151
  })]
152
152
  })
153
153
  }), /* @__PURE__ */ jsx(PopoverContent, {
@@ -158,14 +158,14 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
158
158
  children: /* @__PURE__ */ jsx("div", {
159
159
  className: "max-h-75 overflow-y-auto p-1",
160
160
  children: filteredContacts.length === 0 && inputValue ? /* @__PURE__ */ jsxs("div", {
161
- className: "text-muted-foreground px-2 py-2",
161
+ className: "px-2 py-2 text-muted-foreground",
162
162
  children: [/* @__PURE__ */ jsx("div", {
163
163
  className: "mb-2 text-xs",
164
164
  children: "Geen contacten gevonden."
165
165
  }), isValidEmail(inputValue.trim()) && /* @__PURE__ */ jsxs("button", {
166
166
  type: "button",
167
167
  onClick: handleAddManualEmail,
168
- className: "hover:bg-accent w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors",
168
+ className: "w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent",
169
169
  children: [/* @__PURE__ */ jsx("span", {
170
170
  className: "font-medium",
171
171
  children: "Voeg toe: "
@@ -175,7 +175,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
175
175
  })]
176
176
  })]
177
177
  }) : filteredContacts.length === 0 ? /* @__PURE__ */ jsx("div", {
178
- className: "text-muted-foreground py-6 text-center text-xs",
178
+ className: "py-6 text-center text-muted-foreground text-xs",
179
179
  children: "Geen contacten gevonden."
180
180
  }) : /* @__PURE__ */ jsxs(Fragment, { children: [filteredContacts.map((contact, index) => /* @__PURE__ */ jsx("button", {
181
181
  ref: (el) => {
@@ -183,11 +183,11 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
183
183
  },
184
184
  type: "button",
185
185
  onClick: () => handleSelect(contact),
186
- className: cn("outline-hidden hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs transition-colors", highlightedIndex === index && "bg-accent"),
186
+ className: cn("flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-hidden transition-colors hover:bg-accent", highlightedIndex === index && "bg-accent"),
187
187
  children: /* @__PURE__ */ jsxs("div", {
188
188
  className: "flex flex-col items-start",
189
189
  children: [/* @__PURE__ */ jsx("span", {
190
- className: "text-xs font-medium",
190
+ className: "font-medium text-xs",
191
191
  children: contact.name
192
192
  }), /* @__PURE__ */ jsx("span", {
193
193
  className: "text-muted-foreground text-xs",
@@ -199,7 +199,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
199
199
  children: /* @__PURE__ */ jsxs("button", {
200
200
  type: "button",
201
201
  onClick: handleAddManualEmail,
202
- className: "hover:bg-accent w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors",
202
+ className: "w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent",
203
203
  children: [/* @__PURE__ */ jsx("span", {
204
204
  className: "font-medium",
205
205
  children: "Voeg toe: "
@@ -1 +1 @@
1
- {"version":3,"file":"input-recipient.mjs","names":["React"],"sources":["../../../src/components/ui/input-recipient.tsx"],"sourcesContent":["\"use client\";\n\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils/cn\";\n\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport type Contact = {\n id: string;\n email: string;\n name: string;\n};\n\ninterface RecipientInputProps {\n contacts: Contact[];\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n// Simpele email validatie\nconst isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n};\n\nexport function RecipientInput({\n contacts,\n value,\n onChange,\n placeholder = \"Kies een ontvanger...\",\n disabled = false,\n className,\n}: RecipientInputProps) {\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\n const selectedContacts = React.useMemo(() => {\n return value\n .map((email) => {\n const contact = contacts.find((c) => c.email === email);\n return contact || { id: email, email, name: email };\n })\n .filter(Boolean) as Contact[];\n }, [value, contacts]);\n\n const availableContacts = React.useMemo(() => {\n return contacts.filter((contact) => !value.includes(contact.email));\n }, [contacts, value]);\n\n const filteredContacts = React.useMemo(() => {\n if (!inputValue || !inputValue.trim()) return availableContacts;\n const search = inputValue.toLowerCase().trim();\n return availableContacts.filter(\n (contact) =>\n contact.email.toLowerCase().includes(search) || contact.name.toLowerCase().includes(search),\n );\n }, [availableContacts, inputValue]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We only want to reset the highlighted index when the filtered contacts change\n React.useEffect(() => {\n setHighlightedIndex(0);\n }, [filteredContacts]);\n\n React.useEffect(() => {\n if (open && highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n behavior: \"smooth\",\n });\n }\n }, [highlightedIndex, open]);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [open]);\n\n const handleSelect = (contact: Contact) => {\n onChange([...value, contact.email]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleAddManualEmail = () => {\n const trimmedEmail = inputValue.trim();\n\n if (!trimmedEmail) return;\n\n if (!isValidEmail(trimmedEmail)) {\n toast.error(\"Ongeldig email adres\");\n return;\n }\n\n if (value.includes(trimmedEmail)) {\n toast.error(\"Email is al toegevoegd\");\n setInputValue(\"\");\n return;\n }\n\n onChange([...value, trimmedEmail]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleRemove = (email: string) => {\n onChange(value.filter((v) => v !== email));\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n } else {\n setHighlightedIndex((prev) => (prev < filteredContacts.length - 1 ? prev + 1 : prev));\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (open) {\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (open && filteredContacts[highlightedIndex]) {\n // Selecteer contact uit lijst\n handleSelect(filteredContacts[highlightedIndex]);\n } else if (inputValue.trim()) {\n // Voeg handmatig ingevoerde email toe\n handleAddManualEmail();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"Backspace\" && !inputValue && value.length > 0) {\n e.preventDefault();\n const lastEmail = value[value.length - 1];\n if (lastEmail) {\n handleRemove(lastEmail);\n }\n }\n };\n\n return (\n <Popover open={open}>\n <PopoverTrigger asChild>\n {/** biome-ignore lint/a11y/useKeyWithClickEvents: This is needed */}\n {/** biome-ignore lint/a11y/noStaticElementInteractions: This is needed */}\n <div\n ref={containerRef}\n className={cn(\n \"border-input bg-background ring-offset-background flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border px-3 py-2 text-base transition-colors md:text-sm\",\n \"focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.focus();\n }\n }}\n >\n {selectedContacts.map((contact) => (\n <div\n key={contact.id}\n className=\"border-border bg-accent/50 flex items-center gap-2 rounded-full border px-2 py-0.5\"\n >\n <span className=\"text-xs\">{contact.email}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"hover:bg-destructive/20 h-4 w-4 rounded-full p-0\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(contact.email);\n }}\n disabled={disabled}\n >\n <X className=\"h-3 w-3\" />\n <span className=\"sr-only\">Verwijder {contact.email}</span>\n </Button>\n </div>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (e.target.value) {\n setOpen(true);\n }\n }}\n onKeyDown={handleKeyDown}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className=\"placeholder:text-muted-foreground min-w-30 flex-1 bg-transparent outline-none placeholder:text-sm disabled:cursor-not-allowed\"\n />\n </div>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-full p-0\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n style={{\n width: containerRef.current?.offsetWidth || \"auto\",\n }}\n >\n <div className=\"max-h-75 overflow-y-auto p-1\">\n {filteredContacts.length === 0 && inputValue ? (\n <div className=\"text-muted-foreground px-2 py-2\">\n <div className=\"mb-2 text-xs\">Geen contacten gevonden.</div>\n {isValidEmail(inputValue.trim()) && (\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"hover:bg-accent w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n )}\n </div>\n ) : filteredContacts.length === 0 ? (\n <div className=\"text-muted-foreground py-6 text-center text-xs\">\n Geen contacten gevonden.\n </div>\n ) : (\n <>\n {filteredContacts.map((contact, index) => (\n <button\n key={contact.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n onClick={() => handleSelect(contact)}\n className={cn(\n \"outline-hidden hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs transition-colors\",\n highlightedIndex === index && \"bg-accent\",\n )}\n >\n <div className=\"flex flex-col items-start\">\n <span className=\"text-xs font-medium\">{contact.name}</span>\n <span className=\"text-muted-foreground text-xs\">{contact.email}</span>\n </div>\n </button>\n ))}\n {inputValue && isValidEmail(inputValue.trim()) && (\n <div className=\"mt-1 border-t pt-1\">\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"hover:bg-accent w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"input-recipient.mjs","names":["React"],"sources":["../../../src/components/ui/input-recipient.tsx"],"sourcesContent":["\"use client\";\n\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils/cn\";\n\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover.client\";\n\nexport type Contact = {\n id: string;\n email: string;\n name: string;\n};\n\ninterface RecipientInputProps {\n contacts: Contact[];\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n// Simpele email validatie\nconst isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n};\n\nexport function RecipientInput({\n contacts,\n value,\n onChange,\n placeholder = \"Kies een ontvanger...\",\n disabled = false,\n className,\n}: RecipientInputProps) {\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\n const selectedContacts = React.useMemo(() => {\n return value\n .map((email) => {\n const contact = contacts.find((c) => c.email === email);\n return contact || { id: email, email, name: email };\n })\n .filter(Boolean) as Contact[];\n }, [value, contacts]);\n\n const availableContacts = React.useMemo(() => {\n return contacts.filter((contact) => !value.includes(contact.email));\n }, [contacts, value]);\n\n const filteredContacts = React.useMemo(() => {\n if (!inputValue || !inputValue.trim()) return availableContacts;\n const search = inputValue.toLowerCase().trim();\n return availableContacts.filter(\n (contact) =>\n contact.email.toLowerCase().includes(search) || contact.name.toLowerCase().includes(search),\n );\n }, [availableContacts, inputValue]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We only want to reset the highlighted index when the filtered contacts change\n React.useEffect(() => {\n setHighlightedIndex(0);\n }, [filteredContacts]);\n\n React.useEffect(() => {\n if (open && highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n behavior: \"smooth\",\n });\n }\n }, [highlightedIndex, open]);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [open]);\n\n const handleSelect = (contact: Contact) => {\n onChange([...value, contact.email]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleAddManualEmail = () => {\n const trimmedEmail = inputValue.trim();\n\n if (!trimmedEmail) return;\n\n if (!isValidEmail(trimmedEmail)) {\n toast.error(\"Ongeldig email adres\");\n return;\n }\n\n if (value.includes(trimmedEmail)) {\n toast.error(\"Email is al toegevoegd\");\n setInputValue(\"\");\n return;\n }\n\n onChange([...value, trimmedEmail]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleRemove = (email: string) => {\n onChange(value.filter((v) => v !== email));\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n } else {\n setHighlightedIndex((prev) => (prev < filteredContacts.length - 1 ? prev + 1 : prev));\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (open) {\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (open && filteredContacts[highlightedIndex]) {\n // Selecteer contact uit lijst\n handleSelect(filteredContacts[highlightedIndex]);\n } else if (inputValue.trim()) {\n // Voeg handmatig ingevoerde email toe\n handleAddManualEmail();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"Backspace\" && !inputValue && value.length > 0) {\n e.preventDefault();\n const lastEmail = value[value.length - 1];\n if (lastEmail) {\n handleRemove(lastEmail);\n }\n }\n };\n\n return (\n <Popover open={open}>\n <PopoverTrigger asChild>\n {/** biome-ignore lint/a11y/useKeyWithClickEvents: This is needed */}\n {/** biome-ignore lint/a11y/noStaticElementInteractions: This is needed */}\n <div\n ref={containerRef}\n className={cn(\n \"flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border border-input bg-background px-3 py-2 text-base ring-offset-background transition-colors md:text-sm\",\n \"focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.focus();\n }\n }}\n >\n {selectedContacts.map((contact) => (\n <div\n key={contact.id}\n className=\"flex items-center gap-2 rounded-full border border-border bg-accent/50 px-2 py-0.5\"\n >\n <span className=\"text-xs\">{contact.email}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-4 w-4 rounded-full p-0 hover:bg-destructive/20\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(contact.email);\n }}\n disabled={disabled}\n >\n <X className=\"h-3 w-3\" />\n <span className=\"sr-only\">Verwijder {contact.email}</span>\n </Button>\n </div>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (e.target.value) {\n setOpen(true);\n }\n }}\n onKeyDown={handleKeyDown}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className=\"min-w-30 flex-1 bg-transparent outline-none placeholder:text-muted-foreground placeholder:text-sm disabled:cursor-not-allowed\"\n />\n </div>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-full p-0\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n style={{\n width: containerRef.current?.offsetWidth || \"auto\",\n }}\n >\n <div className=\"max-h-75 overflow-y-auto p-1\">\n {filteredContacts.length === 0 && inputValue ? (\n <div className=\"px-2 py-2 text-muted-foreground\">\n <div className=\"mb-2 text-xs\">Geen contacten gevonden.</div>\n {isValidEmail(inputValue.trim()) && (\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n )}\n </div>\n ) : filteredContacts.length === 0 ? (\n <div className=\"py-6 text-center text-muted-foreground text-xs\">\n Geen contacten gevonden.\n </div>\n ) : (\n <>\n {filteredContacts.map((contact, index) => (\n <button\n key={contact.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n onClick={() => handleSelect(contact)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-hidden transition-colors hover:bg-accent\",\n highlightedIndex === index && \"bg-accent\",\n )}\n >\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium text-xs\">{contact.name}</span>\n <span className=\"text-muted-foreground text-xs\">{contact.email}</span>\n </div>\n </button>\n ))}\n {inputValue && isValidEmail(inputValue.trim()) && (\n <div className=\"mt-1 border-t pt-1\">\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;;;;;;AA0BA,MAAM,gBAAgB,UAA2B;AAE/C,QADmB,6BACD,KAAK,MAAM;;AAG/B,SAAgB,eAAe,EAC7B,UACA,OACA,UACA,cAAc,yBACd,WAAW,OACX,aACsB;CACtB,MAAM,CAAC,MAAM,WAAWA,QAAM,SAAS,MAAM;CAC7C,MAAM,CAAC,YAAY,iBAAiBA,QAAM,SAAS,GAAG;CACtD,MAAM,CAAC,kBAAkB,uBAAuBA,QAAM,SAAS,EAAE;CACjE,MAAM,WAAWA,QAAM,OAAyB,KAAK;CACrD,MAAM,eAAeA,QAAM,OAAuB,KAAK;CACvD,MAAM,WAAWA,QAAM,OAAqC,EAAE,CAAC;CAE/D,MAAM,mBAAmBA,QAAM,cAAc;AAC3C,SAAO,MACJ,KAAK,UAAU;AAEd,UADgB,SAAS,MAAM,MAAM,EAAE,UAAU,MAAM,IACrC;IAAE,IAAI;IAAO;IAAO,MAAM;IAAO;IACnD,CACD,OAAO,QAAQ;IACjB,CAAC,OAAO,SAAS,CAAC;CAErB,MAAM,oBAAoBA,QAAM,cAAc;AAC5C,SAAO,SAAS,QAAQ,YAAY,CAAC,MAAM,SAAS,QAAQ,MAAM,CAAC;IAClE,CAAC,UAAU,MAAM,CAAC;CAErB,MAAM,mBAAmBA,QAAM,cAAc;AAC3C,MAAI,CAAC,cAAc,CAAC,WAAW,MAAM,CAAE,QAAO;EAC9C,MAAM,SAAS,WAAW,aAAa,CAAC,MAAM;AAC9C,SAAO,kBAAkB,QACtB,YACC,QAAQ,MAAM,aAAa,CAAC,SAAS,OAAO,IAAI,QAAQ,KAAK,aAAa,CAAC,SAAS,OAAO,CAC9F;IACA,CAAC,mBAAmB,WAAW,CAAC;AAGnC,SAAM,gBAAgB;AACpB,sBAAoB,EAAE;IACrB,CAAC,iBAAiB,CAAC;AAEtB,SAAM,gBAAgB;AACpB,MAAI,QAAQ,oBAAoB,KAAK,SAAS,QAAQ,kBACpD,UAAS,QAAQ,mBAAmB,eAAe;GACjD,OAAO;GACP,UAAU;GACX,CAAC;IAEH,CAAC,kBAAkB,KAAK,CAAC;AAE5B,SAAM,gBAAgB;EACpB,MAAM,sBAAsB,UAAsB;AAChD,OAAI,aAAa,WAAW,CAAC,aAAa,QAAQ,SAAS,MAAM,OAAe,CAC9E,SAAQ,MAAM;;AAIlB,MAAI,MAAM;AACR,YAAS,iBAAiB,aAAa,mBAAmB;AAC1D,gBAAa;AACX,aAAS,oBAAoB,aAAa,mBAAmB;;;IAGhE,CAAC,KAAK,CAAC;CAEV,MAAM,gBAAgB,YAAqB;AACzC,WAAS,CAAC,GAAG,OAAO,QAAQ,MAAM,CAAC;AACnC,gBAAc,GAAG;AACjB,UAAQ,MAAM;AACd,sBAAoB,EAAE;AACtB,WAAS,SAAS,OAAO;;CAG3B,MAAM,6BAA6B;EACjC,MAAM,eAAe,WAAW,MAAM;AAEtC,MAAI,CAAC,aAAc;AAEnB,MAAI,CAAC,aAAa,aAAa,EAAE;AAC/B,SAAM,MAAM,uBAAuB;AACnC;;AAGF,MAAI,MAAM,SAAS,aAAa,EAAE;AAChC,SAAM,MAAM,yBAAyB;AACrC,iBAAc,GAAG;AACjB;;AAGF,WAAS,CAAC,GAAG,OAAO,aAAa,CAAC;AAClC,gBAAc,GAAG;AACjB,UAAQ,MAAM;AACd,sBAAoB,EAAE;AACtB,WAAS,SAAS,OAAO;;CAG3B,MAAM,gBAAgB,UAAkB;AACtC,WAAS,MAAM,QAAQ,MAAM,MAAM,MAAM,CAAC;AAC1C,WAAS,SAAS,OAAO;;CAG3B,MAAM,iBAAiB,MAA6C;AAClE,MAAI,EAAE,QAAQ,aAAa;AACzB,KAAE,gBAAgB;AAClB,OAAI,CAAC,KACH,SAAQ,KAAK;OAEb,sBAAqB,SAAU,OAAO,iBAAiB,SAAS,IAAI,OAAO,IAAI,KAAM;aAE9E,EAAE,QAAQ,WAAW;AAC9B,KAAE,gBAAgB;AAClB,OAAI,KACF,sBAAqB,SAAU,OAAO,IAAI,OAAO,IAAI,KAAM;aAEpD,EAAE,QAAQ,SAAS;AAC5B,KAAE,gBAAgB;AAClB,OAAI,QAAQ,iBAAiB,kBAE3B,cAAa,iBAAiB,kBAAkB;YACvC,WAAW,MAAM,CAE1B,uBAAsB;aAEf,EAAE,QAAQ,UAAU;AAC7B,KAAE,gBAAgB;AAClB,WAAQ,MAAM;aACL,EAAE,QAAQ,eAAe,CAAC,cAAc,MAAM,SAAS,GAAG;AACnE,KAAE,gBAAgB;GAClB,MAAM,YAAY,MAAM,MAAM,SAAS;AACvC,OAAI,UACF,cAAa,UAAU;;;AAK7B,QACE,qBAAC;EAAc;aACb,oBAAC;GAAe;aAGd,qBAAC;IACC,KAAK;IACL,WAAW,GACT,yKACA,8EACA,YAAY,iCACZ,UACD;IACD,eAAe;AACb,SAAI,CAAC,SACH,UAAS,SAAS,OAAO;;eAI5B,iBAAiB,KAAK,YACrB,qBAAC;KAEC,WAAU;gBAEV,oBAAC;MAAK,WAAU;gBAAW,QAAQ;OAAa,EAChD,qBAAC;MACC,MAAK;MACL,SAAQ;MACR,MAAK;MACL,WAAU;MACV,UAAU,MAAM;AACd,SAAE,iBAAiB;AACnB,oBAAa,QAAQ,MAAM;;MAEnB;iBAEV,oBAAC,KAAE,WAAU,YAAY,EACzB,qBAAC;OAAK,WAAU;kBAAU,cAAW,QAAQ;QAAa;OACnD;OAjBJ,QAAQ,GAkBT,CACN,EACF,oBAAC;KACC,KAAK;KACL,MAAK;KACL,OAAO;KACP,WAAW,MAAM;AACf,oBAAc,EAAE,OAAO,MAAM;AAC7B,UAAI,EAAE,OAAO,MACX,SAAQ,KAAK;;KAGjB,WAAW;KACX,aAAa,MAAM,WAAW,IAAI,cAAc;KACtC;KACV,WAAU;MACV;KACE;IACS,EACjB,oBAAC;GACC,WAAU;GACV,OAAM;GACN,kBAAkB,MAAM,EAAE,gBAAgB;GAC1C,OAAO,EACL,OAAO,aAAa,SAAS,eAAe,QAC7C;aAED,oBAAC;IAAI,WAAU;cACZ,iBAAiB,WAAW,KAAK,aAChC,qBAAC;KAAI,WAAU;gBACb,oBAAC;MAAI,WAAU;gBAAe;OAA8B,EAC3D,aAAa,WAAW,MAAM,CAAC,IAC9B,qBAAC;MACC,MAAK;MACL,SAAS;MACT,WAAU;iBAEV,oBAAC;OAAK,WAAU;iBAAc;QAAiB,EAC/C,oBAAC;OAAK,WAAU;iBAAyB,WAAW,MAAM;QAAQ;OAC3D;MAEP,GACJ,iBAAiB,WAAW,IAC9B,oBAAC;KAAI,WAAU;eAAiD;MAE1D,GAEN,4CACG,iBAAiB,KAAK,SAAS,UAC9B,oBAAC;KAEC,MAAM,OAAO;AACX,eAAS,QAAQ,SAAS;;KAE5B,MAAK;KACL,eAAe,aAAa,QAAQ;KACpC,WAAW,GACT,kHACA,qBAAqB,SAAS,YAC/B;eAED,qBAAC;MAAI,WAAU;iBACb,oBAAC;OAAK,WAAU;iBAAuB,QAAQ;QAAY,EAC3D,oBAAC;OAAK,WAAU;iBAAiC,QAAQ;QAAa;OAClE;OAdD,QAAQ,GAeN,CACT,EACD,cAAc,aAAa,WAAW,MAAM,CAAC,IAC5C,oBAAC;KAAI,WAAU;eACb,qBAAC;MACC,MAAK;MACL,SAAS;MACT,WAAU;iBAEV,oBAAC;OAAK,WAAU;iBAAc;QAAiB,EAC/C,oBAAC;OAAK,WAAU;iBAAyB,WAAW,MAAM;QAAQ;OAC3D;MACL,IAEP;KAED;IACS;GACT"}
@@ -10,5 +10,5 @@ declare function TimeInput({
10
10
  ...props
11
11
  }: TimeInputProps): react_jsx_runtime0.JSX.Element;
12
12
  //#endregion
13
- export { TimeInput };
13
+ export { TimeInput, TimeInputProps };
14
14
  //# sourceMappingURL=input-time.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-time.d.mts","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"mappings":";;;;;;KAMK,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,cAAA;AAAA,iBAEjB,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"input-time.d.mts","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"mappings":";;;;;;KAMY,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,cAAA;AAAA,iBAExB,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"input-time.mjs","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils/cn\";\nimport { Input } from \"./input\";\n\n/**\n * TimeInput\n */\ntype TimeInputProps = Omit<React.ComponentProps<\"input\">, \"type\">;\n\nexport function TimeInput({ className, ...props }: TimeInputProps) {\n return (\n <Input\n {...props}\n type=\"time\"\n className={cn(\n \"appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n />\n );\n}\n"],"mappings":";;;;;AAQA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAAyB;AACjE,QACE,oBAAC;EACC,GAAI;EACJ,MAAK;EACL,WAAW,GACT,wHACA,UACD;GACD"}
1
+ {"version":3,"file":"input-time.mjs","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils/cn\";\nimport { Input } from \"./input\";\n\n/**\n * TimeInput\n */\nexport type TimeInputProps = Omit<React.ComponentProps<\"input\">, \"type\">;\n\nexport function TimeInput({ className, ...props }: TimeInputProps) {\n return (\n <Input\n {...props}\n type=\"time\"\n className={cn(\n \"appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n />\n );\n}\n"],"mappings":";;;;;AAQA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAAyB;AACjE,QACE,oBAAC;EACC,GAAI;EACJ,MAAK;EACL,WAAW,GACT,wHACA,UACD;GACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.mts","names":[],"sources":["../../../src/components/ui/input.tsx"],"mappings":";;;;iBAIS,KAAA,CAAA;EAAQ,SAAA;EAAW,IAAA;EAAA,GAAS;AAAA,GAAS,OAAA,CAAM,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"input.d.mts","names":[],"sources":["../../../src/components/ui/input.tsx"],"mappings":";;;;iBAGS,KAAA,CAAA;EAAQ,SAAA;EAAW,IAAA;EAAA,GAAS;AAAA,GAAS,OAAA,CAAM,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -6,7 +6,7 @@ function Input({ className, type, ...props }) {
6
6
  return /* @__PURE__ */ jsx("input", {
7
7
  type,
8
8
  "data-slot": "input",
9
- className: cn("border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base outline-none transition-[color,box-shadow] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className),
9
+ className: cn("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80", "[&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none", className),
10
10
  ...props
11
11
  });
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"input.mjs","names":[],"sources":["../../../src/components/ui/input.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base outline-none transition-[color,box-shadow] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n"],"mappings":";;;;AAIA,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;AAC3E,QACE,oBAAC;EACO;EACN,aAAU;EACV,WAAW,GACT,kbACA,iFACA,0GACA,UACD;EACD,GAAI;GACJ"}
1
+ {"version":3,"file":"input.mjs","names":[],"sources":["../../../src/components/ui/input.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80\",\n \"[&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n"],"mappings":";;;;AAGA,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;AAC3E,QACE,oBAAC;EACO;EACN,aAAU;EACV,WAAW,GACT,+oBACA,wGACA,UACD;EACD,GAAI;GACJ"}
@@ -0,0 +1,63 @@
1
+ import { Separator } from "./separator.mjs";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { VariantProps } from "class-variance-authority";
4
+ import * as React$1 from "react";
5
+ import * as class_variance_authority_types0 from "class-variance-authority/types";
6
+
7
+ //#region src/components/ui/item.d.ts
8
+ declare function ItemGroup({
9
+ className,
10
+ ...props
11
+ }: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
12
+ declare function ItemSeparator({
13
+ className,
14
+ ...props
15
+ }: React$1.ComponentProps<typeof Separator>): react_jsx_runtime0.JSX.Element;
16
+ declare const itemVariants: (props?: ({
17
+ variant?: "default" | "outline" | "muted" | null | undefined;
18
+ size?: "default" | "xs" | "sm" | null | undefined;
19
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
20
+ declare function Item({
21
+ className,
22
+ variant,
23
+ size,
24
+ asChild,
25
+ ...props
26
+ }: React$1.ComponentProps<"div"> & VariantProps<typeof itemVariants> & {
27
+ asChild?: boolean;
28
+ }): react_jsx_runtime0.JSX.Element;
29
+ declare const itemMediaVariants: (props?: ({
30
+ variant?: "default" | "image" | "icon" | null | undefined;
31
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
32
+ declare function ItemMedia({
33
+ className,
34
+ variant,
35
+ ...props
36
+ }: React$1.ComponentProps<"div"> & VariantProps<typeof itemMediaVariants>): react_jsx_runtime0.JSX.Element;
37
+ declare function ItemContent({
38
+ className,
39
+ ...props
40
+ }: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
41
+ declare function ItemTitle({
42
+ className,
43
+ ...props
44
+ }: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
45
+ declare function ItemDescription({
46
+ className,
47
+ ...props
48
+ }: React$1.ComponentProps<"p">): react_jsx_runtime0.JSX.Element;
49
+ declare function ItemActions({
50
+ className,
51
+ ...props
52
+ }: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
53
+ declare function ItemHeader({
54
+ className,
55
+ ...props
56
+ }: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
57
+ declare function ItemFooter({
58
+ className,
59
+ ...props
60
+ }: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
61
+ //#endregion
62
+ export { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle };
63
+ //# sourceMappingURL=item.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item.d.mts","names":[],"sources":["../../../src/components/ui/item.tsx"],"mappings":";;;;;;;iBAMS,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAe9D,aAAA,CAAA;EAAgB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,QAAsB,SAAA,IAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAWhF,YAAA,GAAY,KAAA;;;IAoBjB,+BAAA,CAAA,SAAA;AAAA,iBAEQ,IAAA,CAAA;EACP,SAAA;EACA,OAAA;EACA,IAAA;EACA,OAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA,UAAwB,YAAA,QAAoB,YAAA;EAAkB,OAAA;AAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAapF,iBAAA,GAAiB,KAAA;;IAetB,+BAAA,CAAA,SAAA;AAAA,iBAEQ,SAAA,CAAA;EACP,SAAA;EACA,OAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA,UAAwB,YAAA,QAAoB,iBAAA,IAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAW9D,WAAA,CAAA;EAAc,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAahE,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAa9D,eAAA,CAAA;EAAkB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,QAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAalE,WAAA,CAAA;EAAc,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAMhE,UAAA,CAAA;EAAa,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAU/D,UAAA,CAAA;EAAa,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,119 @@
1
+ import { cn } from "../../lib/utils/cn.mjs";
2
+ import { Separator as Separator$1 } from "./separator.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
5
+ import { Slot } from "radix-ui";
6
+
7
+ //#region src/components/ui/item.tsx
8
+ function ItemGroup({ className, ...props }) {
9
+ return /* @__PURE__ */ jsx("div", {
10
+ role: "list",
11
+ "data-slot": "item-group",
12
+ className: cn("group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2", className),
13
+ ...props
14
+ });
15
+ }
16
+ function ItemSeparator({ className, ...props }) {
17
+ return /* @__PURE__ */ jsx(Separator$1, {
18
+ "data-slot": "item-separator",
19
+ orientation: "horizontal",
20
+ className: cn("my-2", className),
21
+ ...props
22
+ });
23
+ }
24
+ const itemVariants = cva("[a]:hover:bg-muted rounded-lg border text-sm group/item flex w-full flex-wrap items-center transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors", {
25
+ variants: {
26
+ variant: {
27
+ default: "border-transparent",
28
+ outline: "border-border",
29
+ muted: "bg-muted/50 border-transparent"
30
+ },
31
+ size: {
32
+ default: "gap-2.5 px-3 py-2.5",
33
+ sm: "gap-2.5 px-3 py-2.5",
34
+ xs: "gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0"
35
+ }
36
+ },
37
+ defaultVariants: {
38
+ variant: "default",
39
+ size: "default"
40
+ }
41
+ });
42
+ function Item({ className, variant = "default", size = "default", asChild = false, ...props }) {
43
+ return /* @__PURE__ */ jsx(asChild ? Slot.Root : "div", {
44
+ "data-slot": "item",
45
+ "data-variant": variant,
46
+ "data-size": size,
47
+ className: cn(itemVariants({
48
+ variant,
49
+ size,
50
+ className
51
+ })),
52
+ ...props
53
+ });
54
+ }
55
+ const itemMediaVariants = cva("gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start flex shrink-0 items-center justify-center [&_svg]:pointer-events-none", {
56
+ variants: { variant: {
57
+ default: "bg-transparent",
58
+ icon: "[&_svg:not([class*='size-'])]:size-4",
59
+ image: "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover"
60
+ } },
61
+ defaultVariants: { variant: "default" }
62
+ });
63
+ function ItemMedia({ className, variant = "default", ...props }) {
64
+ return /* @__PURE__ */ jsx("div", {
65
+ "data-slot": "item-media",
66
+ "data-variant": variant,
67
+ className: cn(itemMediaVariants({
68
+ variant,
69
+ className
70
+ })),
71
+ ...props
72
+ });
73
+ }
74
+ function ItemContent({ className, ...props }) {
75
+ return /* @__PURE__ */ jsx("div", {
76
+ "data-slot": "item-content",
77
+ className: cn("flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none", className),
78
+ ...props
79
+ });
80
+ }
81
+ function ItemTitle({ className, ...props }) {
82
+ return /* @__PURE__ */ jsx("div", {
83
+ "data-slot": "item-title",
84
+ className: cn("line-clamp-1 flex w-fit items-center gap-2 font-medium text-sm leading-snug underline-offset-4", className),
85
+ ...props
86
+ });
87
+ }
88
+ function ItemDescription({ className, ...props }) {
89
+ return /* @__PURE__ */ jsx("p", {
90
+ "data-slot": "item-description",
91
+ className: cn("line-clamp-2 text-left font-normal text-muted-foreground text-sm leading-normal group-data-[size=xs]/item:text-xs [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", className),
92
+ ...props
93
+ });
94
+ }
95
+ function ItemActions({ className, ...props }) {
96
+ return /* @__PURE__ */ jsx("div", {
97
+ "data-slot": "item-actions",
98
+ className: cn("flex items-center gap-2", className),
99
+ ...props
100
+ });
101
+ }
102
+ function ItemHeader({ className, ...props }) {
103
+ return /* @__PURE__ */ jsx("div", {
104
+ "data-slot": "item-header",
105
+ className: cn("flex basis-full items-center justify-between gap-2", className),
106
+ ...props
107
+ });
108
+ }
109
+ function ItemFooter({ className, ...props }) {
110
+ return /* @__PURE__ */ jsx("div", {
111
+ "data-slot": "item-footer",
112
+ className: cn("flex basis-full items-center justify-between gap-2", className),
113
+ ...props
114
+ });
115
+ }
116
+
117
+ //#endregion
118
+ export { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle };
119
+ //# sourceMappingURL=item.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item.mjs","names":["Separator"],"sources":["../../../src/components/ui/item.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils/cn\";\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: The list role is used to group items together, but the div element is used for styling purposes.\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n );\n}\n\nconst itemVariants = cva(\n \"[a]:hover:bg-muted rounded-lg border text-sm group/item flex w-full flex-wrap items-center transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"bg-muted/50 border-transparent\",\n },\n size: {\n default: \"gap-2.5 px-3 py-2.5\",\n sm: \"gap-2.5 px-3 py-2.5\",\n xs: \"gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\";\n return (\n <Comp\n data-slot=\"item\"\n data-variant={variant}\n data-size={size}\n className={cn(itemVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nconst itemMediaVariants = cva(\n \"gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start flex shrink-0 items-center justify-center [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n );\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 font-medium text-sm leading-snug underline-offset-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left font-normal text-muted-foreground text-sm leading-normal group-data-[size=xs]/item:text-xs [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"item-actions\" className={cn(\"flex items-center gap-2\", className)} {...props} />\n );\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\"flex basis-full items-center justify-between gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\"flex basis-full items-center justify-between gap-2\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n};\n"],"mappings":";;;;;;;AAMA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;AACvE,QAEE,oBAAC;EACC,MAAK;EACL,aAAU;EACV,WAAW,GACT,mGACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,cAAc,EAAE,WAAW,GAAG,SAAiD;AACtF,QACE,oBAACA;EACC,aAAU;EACV,aAAY;EACZ,WAAW,GAAG,QAAQ,UAAU;EAChC,GAAI;GACJ;;AAIN,MAAM,eAAe,IACnB,8OACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACD,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF;AAED,SAAS,KAAK,EACZ,WACA,UAAU,WACV,OAAO,WACP,UAAU,OACV,GAAG,SACuF;AAE1F,QACE,oBAFW,UAAU,KAAK,OAAO;EAG/B,aAAU;EACV,gBAAc;EACd,aAAW;EACX,WAAW,GAAG,aAAa;GAAE;GAAS;GAAM;GAAW,CAAC,CAAC;EACzD,GAAI;GACJ;;AAIN,MAAM,oBAAoB,IACxB,kMACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;EACN,OACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAED,SAAS,UAAU,EACjB,WACA,UAAU,WACV,GAAG,SACoE;AACvE,QACE,oBAAC;EACC,aAAU;EACV,gBAAc;EACd,WAAW,GAAG,kBAAkB;GAAE;GAAS;GAAW,CAAC,CAAC;EACxD,GAAI;GACJ;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,qGACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;AACvE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,kGACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAoC;AAC3E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,uLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAAC;EAAI,aAAU;EAAe,WAAW,GAAG,2BAA2B,UAAU;EAAE,GAAI;GAAS;;AAIpG,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GAAG,sDAAsD,UAAU;EAC9E,GAAI;GACJ;;AAIN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GAAG,sDAAsD,UAAU;EAC9E,GAAI;GACJ"}
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+
3
+ //#region src/components/ui/kbd.d.ts
4
+ declare function Kbd({
5
+ className,
6
+ ...props
7
+ }: React.ComponentProps<"kbd">): react_jsx_runtime0.JSX.Element;
8
+ declare function KbdGroup({
9
+ className,
10
+ ...props
11
+ }: React.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
12
+ //#endregion
13
+ export { Kbd, KbdGroup };
14
+ //# sourceMappingURL=kbd.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.d.mts","names":[],"sources":["../../../src/components/ui/kbd.tsx"],"mappings":";;;iBAES,GAAA,CAAA;EAAM,SAAA;EAAA,GAAc;AAAA,GAAS,KAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAaxD,QAAA,CAAA;EAAW,SAAA;EAAA,GAAc;AAAA,GAAS,KAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,22 @@
1
+ import { cn } from "../../lib/utils/cn.mjs";
2
+ import { jsx } from "react/jsx-runtime";
3
+
4
+ //#region src/components/ui/kbd.tsx
5
+ function Kbd({ className, ...props }) {
6
+ return /* @__PURE__ */ jsx("kbd", {
7
+ "data-slot": "kbd",
8
+ className: cn("pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm bg-muted in-data-[slot=tooltip-content]:bg-background/20 px-1 font-medium font-sans in-data-[slot=tooltip-content]:text-background text-muted-foreground text-xs dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3", className),
9
+ ...props
10
+ });
11
+ }
12
+ function KbdGroup({ className, ...props }) {
13
+ return /* @__PURE__ */ jsx("kbd", {
14
+ "data-slot": "kbd-group",
15
+ className: cn("inline-flex items-center gap-1", className),
16
+ ...props
17
+ });
18
+ }
19
+
20
+ //#endregion
21
+ export { Kbd, KbdGroup };
22
+ //# sourceMappingURL=kbd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.mjs","names":[],"sources":["../../../src/components/ui/kbd.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils/cn\";\n\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm bg-muted in-data-[slot=tooltip-content]:bg-background/20 px-1 font-medium font-sans in-data-[slot=tooltip-content]:text-background text-muted-foreground text-xs dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <kbd\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nexport { Kbd, KbdGroup };\n"],"mappings":";;;;AAEA,SAAS,IAAI,EAAE,WAAW,GAAG,SAAsC;AACjE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,yWACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;AACtE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GAAG,kCAAkC,UAAU;EAC1D,GAAI;GACJ"}
@@ -1,12 +1,12 @@
1
1
  import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { Label } from "radix-ui";
2
3
  import * as React$1 from "react";
3
- import * as LabelPrimitive from "@radix-ui/react-label";
4
4
 
5
5
  //#region src/components/ui/label.d.ts
6
- declare function Label({
6
+ declare function Label$1({
7
7
  className,
8
8
  ...props
9
- }: React$1.ComponentProps<typeof LabelPrimitive.Root>): react_jsx_runtime0.JSX.Element;
9
+ }: React$1.ComponentProps<typeof Label.Root>): react_jsx_runtime0.JSX.Element;
10
10
  //#endregion
11
- export { Label };
11
+ export { Label$1 as Label };
12
12
  //# sourceMappingURL=label.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"label.d.mts","names":[],"sources":["../../../src/components/ui/label.tsx"],"mappings":";;;;;iBAOS,KAAA,CAAA;EAAQ,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,QAAsB,cAAA,CAAe,IAAA,IAAK,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"label.d.mts","names":[],"sources":["../../../src/components/ui/label.tsx"],"mappings":";;;;;iBAMS,OAAA,CAAA;EAAQ,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,QAAsB,KAAA,CAAe,IAAA,IAAK,kBAAA,CAAA,GAAA,CAAA,OAAA"}