@nuxt/ui 3.0.0-alpha.1 → 3.0.0-alpha.10

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 (332) hide show
  1. package/.nuxt/ui/accordion.ts +20 -0
  2. package/.nuxt/ui/alert.ts +242 -0
  3. package/.nuxt/ui/avatar-group.ts +40 -0
  4. package/.nuxt/ui/avatar.ts +42 -0
  5. package/.nuxt/ui/badge.ts +194 -0
  6. package/.nuxt/ui/breadcrumb.ts +45 -0
  7. package/.nuxt/ui/button-group.ts +16 -0
  8. package/.nuxt/ui/button.ts +344 -0
  9. package/.nuxt/ui/calendar.ts +85 -0
  10. package/.nuxt/ui/card.ts +8 -0
  11. package/.nuxt/ui/carousel.ts +41 -0
  12. package/.nuxt/ui/checkbox.ts +105 -0
  13. package/.nuxt/ui/chip.ts +67 -0
  14. package/.nuxt/ui/collapsible.ts +6 -0
  15. package/.nuxt/ui/color-picker.ts +39 -0
  16. package/.nuxt/ui/command-palette.ts +50 -0
  17. package/.nuxt/ui/container.ts +3 -0
  18. package/.nuxt/ui/context-menu.ts +198 -0
  19. package/.nuxt/ui/drawer.ts +55 -0
  20. package/.nuxt/ui/dropdown-menu.ts +199 -0
  21. package/.nuxt/ui/form-field.ts +40 -0
  22. package/.nuxt/ui/form.ts +3 -0
  23. package/.nuxt/ui/index.ts +48 -0
  24. package/.nuxt/ui/input-menu.ts +410 -0
  25. package/.nuxt/ui/input-number.ts +204 -0
  26. package/.nuxt/ui/input.ts +263 -0
  27. package/.nuxt/ui/kbd.ts +19 -0
  28. package/.nuxt/ui/link.ts +15 -0
  29. package/.nuxt/ui/modal.ts +28 -0
  30. package/.nuxt/ui/navigation-menu.ts +390 -0
  31. package/.nuxt/ui/pagination.ts +8 -0
  32. package/.nuxt/ui/pin-input.ts +145 -0
  33. package/.nuxt/ui/popover.ts +6 -0
  34. package/.nuxt/ui/progress.ts +258 -0
  35. package/.nuxt/ui/radio-group.ts +112 -0
  36. package/.nuxt/ui/select-menu.ts +316 -0
  37. package/.nuxt/ui/select.ts +315 -0
  38. package/.nuxt/ui/separator.ts +143 -0
  39. package/.nuxt/ui/skeleton.ts +3 -0
  40. package/.nuxt/ui/slideover.ts +63 -0
  41. package/.nuxt/ui/slider.ts +148 -0
  42. package/.nuxt/ui/stepper.ts +180 -0
  43. package/.nuxt/ui/switch.ts +113 -0
  44. package/.nuxt/ui/table.ts +129 -0
  45. package/.nuxt/ui/tabs.ts +227 -0
  46. package/.nuxt/ui/textarea.ts +263 -0
  47. package/.nuxt/ui/toast.ts +66 -0
  48. package/.nuxt/ui/toaster.ts +75 -0
  49. package/.nuxt/ui/tooltip.ts +9 -0
  50. package/README.md +75 -54
  51. package/cli/commands/{init.mjs → make/component.mjs} +5 -5
  52. package/cli/commands/make/index.mjs +14 -0
  53. package/cli/commands/make/locale.mjs +64 -0
  54. package/cli/index.mjs +2 -2
  55. package/cli/templates.mjs +52 -7
  56. package/cli/utils.mjs +14 -0
  57. package/dist/chunks/component-meta.cjs +82802 -0
  58. package/dist/chunks/component-meta.mjs +82800 -0
  59. package/dist/client/devtools/200.html +1 -0
  60. package/dist/client/devtools/404.html +1 -0
  61. package/dist/client/devtools/_fonts/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58UfivUw4aw-SK92LTmKP0.woff2 +0 -0
  62. package/dist/client/devtools/_fonts/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58UfivUw-9uYm8d48E4.woff2 +0 -0
  63. package/dist/client/devtools/_fonts/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K6z9mXg-VNw7NHvqnp.woff2 +0 -0
  64. package/dist/client/devtools/_fonts/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6z9mXgjU0-EkYdMs3MAX.woff2 +0 -0
  65. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-7DW3w-R7n06NbhGy.woff +0 -0
  66. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDG3w-leGNfkTmsj.woff +0 -0
  67. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDW3w-ciElMF03ku.woff +0 -0
  68. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JCm3w-sB722Uoa0f.woff +0 -0
  69. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JDW3w-PBDI1JDjwV.woff +0 -0
  70. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8gCm3w-0q1hqVn09O.woff +0 -0
  71. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9XCm3w-ByvzuLy2fa.woff +0 -0
  72. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9uCm3w-5TKCIs6EEw.woff +0 -0
  73. package/dist/client/devtools/_fonts/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat_XDW3w-r2swRDGfn2.woff +0 -0
  74. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAC5thTQ-ldB60l5U8r.woff +0 -0
  75. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpthTQ-wbFKGFDrgo.woff +0 -0
  76. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpxhTQ-LLUBv5jskj.woff +0 -0
  77. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwARZthTQ-F71RdTRbNg.woff +0 -0
  78. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwA_JxhTQ-6nh65gZkc0.woff +0 -0
  79. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAfJthTQ-aMoWEJLmTt.woff +0 -0
  80. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAkJxhTQ-WMBvmLOgKm.woff +0 -0
  81. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAop1hTQ-utGC2hnWq2.woff +0 -0
  82. package/dist/client/devtools/_fonts/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxhTQ-YpyTieVa5B.woff +0 -0
  83. package/dist/client/devtools/_nuxt/B1fTd_Rf.js +1 -0
  84. package/dist/client/devtools/_nuxt/CSUxkedg.js +1 -0
  85. package/dist/client/devtools/_nuxt/CbRTGpb7.js +1 -0
  86. package/dist/client/devtools/_nuxt/YQTlxbcT.js +53 -0
  87. package/dist/client/devtools/_nuxt/builds/latest.json +1 -0
  88. package/dist/client/devtools/_nuxt/builds/meta/b3465abc-0a92-4ee7-ba6b-e5174891fcc0.json +1 -0
  89. package/dist/client/devtools/_nuxt/entry.DXXceQev.css +1 -0
  90. package/dist/client/devtools/_nuxt/error-404.BJpkZFyY.css +1 -0
  91. package/dist/client/devtools/_nuxt/error-500.D3i9VDlt.css +1 -0
  92. package/dist/client/devtools/favicon.svg +1 -0
  93. package/dist/client/devtools/index.html +1 -0
  94. package/dist/devtools/runtime/DevtoolsRenderer.vue +54 -0
  95. package/dist/devtools/runtime/examples/AvatarGroupExample.vue +7 -0
  96. package/dist/devtools/runtime/examples/ButtonGroupExample.vue +8 -0
  97. package/dist/devtools/runtime/examples/CardExample.vue +13 -0
  98. package/dist/devtools/runtime/examples/CarouselExample.vue +13 -0
  99. package/dist/devtools/runtime/examples/ChipExample.vue +5 -0
  100. package/dist/devtools/runtime/examples/CollapsibleExample.vue +8 -0
  101. package/dist/devtools/runtime/examples/CommandPaletteExample.vue +29 -0
  102. package/dist/devtools/runtime/examples/ContainerExample.vue +5 -0
  103. package/dist/devtools/runtime/examples/ContextMenuExample.vue +5 -0
  104. package/dist/devtools/runtime/examples/DrawerExample.vue +8 -0
  105. package/dist/devtools/runtime/examples/DropdownMenuExample.vue +5 -0
  106. package/dist/devtools/runtime/examples/FormExample.vue +30 -0
  107. package/dist/devtools/runtime/examples/FormFieldExample.vue +5 -0
  108. package/dist/devtools/runtime/examples/LinkExample.vue +5 -0
  109. package/dist/devtools/runtime/examples/ModalExample.vue +8 -0
  110. package/dist/devtools/runtime/examples/PopoverExample.vue +8 -0
  111. package/dist/devtools/runtime/examples/SkeletonExample.vue +3 -0
  112. package/dist/devtools/runtime/examples/SlideoverExample.vue +8 -0
  113. package/dist/devtools/runtime/examples/StepperExample.vue +44 -0
  114. package/dist/devtools/runtime/examples/ToasterExample.vue +11 -0
  115. package/dist/devtools/runtime/examples/TooltipExample.vue +5 -0
  116. package/dist/module.cjs +223 -4
  117. package/dist/module.d.cts +54 -0
  118. package/dist/module.d.mts +38 -7
  119. package/dist/module.d.ts +38 -7
  120. package/dist/module.json +2 -1
  121. package/dist/module.mjs +179 -2568
  122. package/dist/runtime/components/Accordion.vue +49 -8
  123. package/dist/runtime/components/Alert.vue +13 -6
  124. package/dist/runtime/components/App.vue +20 -7
  125. package/dist/runtime/components/Avatar.vue +33 -9
  126. package/dist/runtime/components/AvatarGroup.vue +4 -1
  127. package/dist/runtime/components/Badge.vue +34 -4
  128. package/dist/runtime/components/Breadcrumb.vue +52 -13
  129. package/dist/runtime/components/Button.vue +45 -6
  130. package/dist/runtime/components/ButtonGroup.vue +5 -2
  131. package/dist/runtime/components/Calendar.vue +190 -0
  132. package/dist/runtime/components/Card.vue +4 -1
  133. package/dist/runtime/components/Carousel.vue +322 -0
  134. package/dist/runtime/components/Checkbox.vue +28 -33
  135. package/dist/runtime/components/Chip.vue +9 -2
  136. package/dist/runtime/components/Collapsible.vue +7 -4
  137. package/dist/runtime/components/ColorPicker.vue +265 -0
  138. package/dist/runtime/components/CommandPalette.vue +122 -96
  139. package/dist/runtime/components/Container.vue +4 -1
  140. package/dist/runtime/components/ContextMenu.vue +101 -14
  141. package/dist/runtime/components/ContextMenuContent.vue +48 -18
  142. package/dist/runtime/components/Drawer.vue +22 -11
  143. package/dist/runtime/components/DropdownMenu.vue +91 -16
  144. package/dist/runtime/components/DropdownMenuContent.vue +50 -18
  145. package/dist/runtime/components/Form.vue +49 -32
  146. package/dist/runtime/components/FormField.vue +18 -6
  147. package/dist/runtime/components/Icon.vue +1 -1
  148. package/dist/runtime/components/Input.vue +15 -6
  149. package/dist/runtime/components/InputMenu.vue +152 -65
  150. package/dist/runtime/components/InputNumber.vue +192 -0
  151. package/dist/runtime/components/Kbd.vue +3 -1
  152. package/dist/runtime/components/Link.vue +71 -8
  153. package/dist/runtime/components/LinkBase.vue +10 -7
  154. package/dist/runtime/components/Modal.vue +23 -11
  155. package/dist/runtime/components/NavigationMenu.vue +170 -75
  156. package/dist/runtime/components/Pagination.vue +31 -15
  157. package/dist/runtime/components/PinInput.vue +96 -0
  158. package/dist/runtime/components/Popover.vue +26 -7
  159. package/dist/runtime/components/Progress.vue +25 -8
  160. package/dist/runtime/components/RadioGroup.vue +28 -7
  161. package/dist/runtime/components/Select.vue +79 -32
  162. package/dist/runtime/components/SelectMenu.vue +164 -80
  163. package/dist/runtime/components/Separator.vue +3 -3
  164. package/dist/runtime/components/Skeleton.vue +4 -1
  165. package/dist/runtime/components/Slideover.vue +23 -11
  166. package/dist/runtime/components/Slider.vue +3 -3
  167. package/dist/runtime/components/Stepper.vue +171 -0
  168. package/dist/runtime/components/Switch.vue +16 -16
  169. package/dist/runtime/components/Table.vue +262 -0
  170. package/dist/runtime/components/Tabs.vue +42 -15
  171. package/dist/runtime/components/Textarea.vue +9 -3
  172. package/dist/runtime/components/Toast.vue +13 -5
  173. package/dist/runtime/components/Toaster.vue +31 -16
  174. package/dist/runtime/components/Tooltip.vue +9 -6
  175. package/dist/runtime/composables/defineLocale.d.ts +9 -0
  176. package/dist/runtime/composables/defineLocale.js +4 -0
  177. package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
  178. package/dist/runtime/composables/defineShortcuts.js +2 -8
  179. package/dist/runtime/composables/extendDevtoolsMeta.d.ts +7 -0
  180. package/dist/runtime/composables/extendDevtoolsMeta.js +2 -0
  181. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  182. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  183. package/dist/runtime/composables/useComponentIcons.d.ts +3 -0
  184. package/dist/runtime/composables/useFormField.d.ts +8 -4
  185. package/dist/runtime/composables/useFormField.js +2 -1
  186. package/dist/runtime/composables/useKbd.d.ts +10 -3
  187. package/dist/runtime/composables/useKbd.js +14 -8
  188. package/dist/runtime/composables/useLocale.d.ts +4 -0
  189. package/dist/runtime/composables/useLocale.js +10 -0
  190. package/dist/runtime/composables/useModal.d.ts +2 -2
  191. package/dist/runtime/composables/useSlideover.d.ts +2 -2
  192. package/dist/runtime/composables/useToast.d.ts +2 -2
  193. package/dist/runtime/index.css +1 -1
  194. package/dist/runtime/keyframes.css +1 -0
  195. package/dist/runtime/locale/ar.d.ts +2 -0
  196. package/dist/runtime/locale/ar.js +53 -0
  197. package/dist/runtime/locale/cs.d.ts +2 -0
  198. package/dist/runtime/locale/cs.js +52 -0
  199. package/dist/runtime/locale/de.d.ts +2 -0
  200. package/dist/runtime/locale/de.js +52 -0
  201. package/dist/runtime/locale/en.d.ts +2 -0
  202. package/dist/runtime/locale/en.js +52 -0
  203. package/dist/runtime/locale/es.d.ts +2 -0
  204. package/dist/runtime/locale/es.js +52 -0
  205. package/dist/runtime/locale/fa_ir.d.ts +2 -0
  206. package/dist/runtime/locale/fa_ir.js +53 -0
  207. package/dist/runtime/locale/fr.d.ts +2 -0
  208. package/dist/runtime/locale/fr.js +52 -0
  209. package/dist/runtime/locale/index.d.ts +19 -0
  210. package/dist/runtime/locale/index.js +19 -0
  211. package/dist/runtime/locale/it.d.ts +2 -0
  212. package/dist/runtime/locale/it.js +52 -0
  213. package/dist/runtime/locale/ja.d.ts +2 -0
  214. package/dist/runtime/locale/ja.js +52 -0
  215. package/dist/runtime/locale/ko.d.ts +2 -0
  216. package/dist/runtime/locale/ko.js +52 -0
  217. package/dist/runtime/locale/nl.d.ts +2 -0
  218. package/dist/runtime/locale/nl.js +52 -0
  219. package/dist/runtime/locale/pl.d.ts +2 -0
  220. package/dist/runtime/locale/pl.js +52 -0
  221. package/dist/runtime/locale/pt.d.ts +2 -0
  222. package/dist/runtime/locale/pt.js +52 -0
  223. package/dist/runtime/locale/pt_br.d.ts +2 -0
  224. package/dist/runtime/locale/pt_br.js +52 -0
  225. package/dist/runtime/locale/ru.d.ts +2 -0
  226. package/dist/runtime/locale/ru.js +52 -0
  227. package/dist/runtime/locale/sk.d.ts +2 -0
  228. package/dist/runtime/locale/sk.js +52 -0
  229. package/dist/runtime/locale/tr.d.ts +2 -0
  230. package/dist/runtime/locale/tr.js +52 -0
  231. package/dist/runtime/locale/zh_hans.d.ts +2 -0
  232. package/dist/runtime/locale/zh_hans.js +52 -0
  233. package/dist/runtime/locale/zh_hant.d.ts +2 -0
  234. package/dist/runtime/locale/zh_hant.js +52 -0
  235. package/dist/runtime/plugins/colors.js +12 -8
  236. package/dist/runtime/types/form.d.ts +9 -2
  237. package/dist/runtime/types/index.d.ts +50 -42
  238. package/dist/runtime/types/index.js +8 -0
  239. package/dist/runtime/types/locale.d.ts +54 -0
  240. package/dist/runtime/types/utils.d.ts +8 -3
  241. package/dist/runtime/utils/form.d.ts +7 -5
  242. package/dist/runtime/utils/form.js +117 -28
  243. package/dist/runtime/utils/index.d.ts +2 -1
  244. package/dist/runtime/utils/index.js +16 -0
  245. package/dist/runtime/utils/link.d.ts +5 -3
  246. package/dist/runtime/utils/link.js +1 -1
  247. package/dist/runtime/utils/locale.d.ts +15 -0
  248. package/dist/runtime/utils/locale.js +25 -0
  249. package/dist/runtime/vue/components/Icon.vue +15 -0
  250. package/dist/runtime/vue/components/Link.vue +208 -0
  251. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  252. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  253. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  254. package/dist/runtime/vue/plugins/head.js +6 -0
  255. package/dist/runtime/vue/stubs.d.ts +15 -0
  256. package/dist/runtime/vue/stubs.js +27 -0
  257. package/dist/shared/ui.CwmIkD_Y.cjs +3269 -0
  258. package/dist/shared/ui.D_93iuwH.mjs +3262 -0
  259. package/dist/unplugin.cjs +192 -0
  260. package/dist/unplugin.d.cts +49 -0
  261. package/dist/unplugin.d.mts +49 -0
  262. package/dist/unplugin.d.ts +49 -0
  263. package/dist/unplugin.mjs +181 -0
  264. package/dist/vite.cjs +22 -0
  265. package/dist/vite.d.cts +13 -0
  266. package/dist/vite.d.mts +13 -0
  267. package/dist/vite.d.ts +13 -0
  268. package/dist/vite.mjs +20 -0
  269. package/package.json +98 -31
  270. package/vue-plugin.d.ts +5 -0
  271. package/cli/node_modules/.ignored/citty/LICENSE +0 -36
  272. package/cli/node_modules/.ignored/citty/README.md +0 -134
  273. package/cli/node_modules/.ignored/citty/dist/index.cjs +0 -475
  274. package/cli/node_modules/.ignored/citty/dist/index.d.cts +0 -80
  275. package/cli/node_modules/.ignored/citty/dist/index.d.mts +0 -80
  276. package/cli/node_modules/.ignored/citty/dist/index.d.ts +0 -80
  277. package/cli/node_modules/.ignored/citty/dist/index.mjs +0 -463
  278. package/cli/node_modules/.ignored/citty/package.json +0 -49
  279. package/cli/node_modules/.ignored/consola/LICENSE +0 -47
  280. package/cli/node_modules/.ignored/consola/README.md +0 -318
  281. package/cli/node_modules/.ignored/consola/core.d.ts +0 -1
  282. package/cli/node_modules/.ignored/consola/dist/basic.cjs +0 -32
  283. package/cli/node_modules/.ignored/consola/dist/basic.d.ts +0 -9
  284. package/cli/node_modules/.ignored/consola/dist/basic.mjs +0 -24
  285. package/cli/node_modules/.ignored/consola/dist/browser.cjs +0 -80
  286. package/cli/node_modules/.ignored/consola/dist/browser.d.ts +0 -7
  287. package/cli/node_modules/.ignored/consola/dist/browser.mjs +0 -72
  288. package/cli/node_modules/.ignored/consola/dist/chunks/prompt.cjs +0 -436
  289. package/cli/node_modules/.ignored/consola/dist/chunks/prompt.mjs +0 -429
  290. package/cli/node_modules/.ignored/consola/dist/core.cjs +0 -415
  291. package/cli/node_modules/.ignored/consola/dist/core.d.ts +0 -124
  292. package/cli/node_modules/.ignored/consola/dist/core.mjs +0 -410
  293. package/cli/node_modules/.ignored/consola/dist/index.cjs +0 -21
  294. package/cli/node_modules/.ignored/consola/dist/index.d.ts +0 -9
  295. package/cli/node_modules/.ignored/consola/dist/index.mjs +0 -8
  296. package/cli/node_modules/.ignored/consola/dist/shared/consola.06ad8a64.mjs +0 -62
  297. package/cli/node_modules/.ignored/consola/dist/shared/consola.36c0034f.mjs +0 -636
  298. package/cli/node_modules/.ignored/consola/dist/shared/consola.4bbae468.cjs +0 -645
  299. package/cli/node_modules/.ignored/consola/dist/shared/consola.deac7d5a.cjs +0 -65
  300. package/cli/node_modules/.ignored/consola/dist/utils.cjs +0 -308
  301. package/cli/node_modules/.ignored/consola/dist/utils.d.ts +0 -169
  302. package/cli/node_modules/.ignored/consola/dist/utils.mjs +0 -284
  303. package/cli/node_modules/.ignored/consola/lib/index.cjs +0 -9
  304. package/cli/node_modules/.ignored/consola/package.json +0 -101
  305. package/cli/node_modules/.ignored/consola/utils.d.ts +0 -1
  306. package/cli/node_modules/.ignored/pathe/LICENSE +0 -44
  307. package/cli/node_modules/.ignored/pathe/README.md +0 -69
  308. package/cli/node_modules/.ignored/pathe/dist/index.cjs +0 -23
  309. package/cli/node_modules/.ignored/pathe/dist/index.d.cts +0 -36
  310. package/cli/node_modules/.ignored/pathe/dist/index.d.mts +0 -36
  311. package/cli/node_modules/.ignored/pathe/dist/index.d.ts +0 -36
  312. package/cli/node_modules/.ignored/pathe/dist/index.mjs +0 -1
  313. package/cli/node_modules/.ignored/pathe/dist/shared/pathe.1f0a373c.cjs +0 -238
  314. package/cli/node_modules/.ignored/pathe/dist/shared/pathe.ff20891b.mjs +0 -221
  315. package/cli/node_modules/.ignored/pathe/dist/utils.cjs +0 -58
  316. package/cli/node_modules/.ignored/pathe/dist/utils.d.cts +0 -5
  317. package/cli/node_modules/.ignored/pathe/dist/utils.d.mts +0 -5
  318. package/cli/node_modules/.ignored/pathe/dist/utils.d.ts +0 -5
  319. package/cli/node_modules/.ignored/pathe/dist/utils.mjs +0 -54
  320. package/cli/node_modules/.ignored/pathe/package.json +0 -48
  321. package/cli/node_modules/.ignored/pathe/utils.d.ts +0 -1
  322. package/cli/node_modules/.ignored/scule/LICENSE +0 -21
  323. package/cli/node_modules/.ignored/scule/README.md +0 -149
  324. package/cli/node_modules/.ignored/scule/dist/index.cjs +0 -92
  325. package/cli/node_modules/.ignored/scule/dist/index.d.cts +0 -57
  326. package/cli/node_modules/.ignored/scule/dist/index.d.mts +0 -57
  327. package/cli/node_modules/.ignored/scule/dist/index.d.ts +0 -57
  328. package/cli/node_modules/.ignored/scule/dist/index.mjs +0 -80
  329. package/cli/node_modules/.ignored/scule/package.json +0 -43
  330. package/cli/node_modules/.package-lock.json +0 -33
  331. package/dist/runtime/types/component.d.ts +0 -17
  332. /package/dist/runtime/types/{component.js → locale.js} +0 -0
@@ -1,18 +1,19 @@
1
1
  <script lang="ts">
2
2
  import { tv, type VariantProps } from 'tailwind-variants'
3
- import type { ComboboxRootProps, ComboboxRootEmits, ComboboxContentProps, ComboboxItemProps, ComboboxArrowProps } from 'radix-vue'
3
+ import type { ComboboxRootProps, ComboboxRootEmits, ComboboxContentProps, ComboboxArrowProps, AcceptableValue } from 'reka-ui'
4
4
  import type { AppConfig } from '@nuxt/schema'
5
5
  import _appConfig from '#build/app.config'
6
6
  import theme from '#build/ui/select-menu'
7
7
  import type { UseComponentIconsProps } from '../composables/useComponentIcons'
8
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
8
9
  import type { AvatarProps, ChipProps, InputProps } from '../types'
9
- import type { AcceptableValue, ArrayOrWrapped, PartialString } from '../types/utils'
10
+ import type { PartialString, MaybeArrayOfArray, MaybeArrayOfArrayItem, SelectModelValue, SelectModelValueEmits, SelectItemKey } from '../types/utils'
10
11
 
11
12
  const appConfig = _appConfig as AppConfig & { ui: { selectMenu: Partial<typeof theme> } }
12
13
 
13
14
  const selectMenu = tv({ extend: tv(theme), ...(appConfig.ui?.selectMenu || {}) })
14
15
 
15
- export interface SelectMenuItem extends Pick<ComboboxItemProps, 'disabled'> {
16
+ export interface SelectMenuItem {
16
17
  label?: string
17
18
  icon?: string
18
19
  avatar?: AvatarProps
@@ -22,21 +23,23 @@ export interface SelectMenuItem extends Pick<ComboboxItemProps, 'disabled'> {
22
23
  * @defaultValue 'item'
23
24
  */
24
25
  type?: 'label' | 'separator' | 'item'
26
+ disabled?: boolean
27
+ onSelect?(e?: Event): void
25
28
  }
26
29
 
27
30
  type SelectMenuVariants = VariantProps<typeof selectMenu>
28
31
 
29
- export interface SelectMenuProps<T> extends Pick<ComboboxRootProps<T>, 'modelValue' | 'defaultValue' | 'selectedValue' | 'open' | 'defaultOpen' | 'searchTerm' | 'multiple' | 'disabled' | 'name' | 'resetSearchTermOnBlur'>, UseComponentIconsProps {
32
+ export interface SelectMenuProps<T extends MaybeArrayOfArrayItem<I>, I extends MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean> = MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean>, V extends SelectItemKey<T> | undefined = undefined, M extends boolean = false> extends Pick<ComboboxRootProps<T>, 'open' | 'defaultOpen' | 'disabled' | 'name' | 'resetSearchTermOnBlur' | 'highlightOnHover'>, UseComponentIconsProps {
30
33
  id?: string
31
34
  /** The placeholder text when the select is empty. */
32
35
  placeholder?: string
33
36
  /**
34
- * Wether to display the search input or not.
37
+ * Whether to display the search input or not.
38
+ * Can be an object to pass additional props to the input.
39
+ * `{ placeholder: 'Search...', variant: 'none' }`{lang="ts-type"}
35
40
  * @defaultValue true
36
41
  */
37
- search?: boolean
38
- /** The placeholder text when the search input is empty. */
39
- searchPlaceholder?: string
42
+ searchInput?: boolean | InputProps
40
43
  color?: SelectMenuVariants['color']
41
44
  variant?: SelectMenuVariants['variant']
42
45
  size?: SelectMenuVariants['size']
@@ -53,7 +56,7 @@ export interface SelectMenuProps<T> extends Pick<ComboboxRootProps<T>, 'modelVal
53
56
  selectedIcon?: string
54
57
  /**
55
58
  * The content of the menu.
56
- * @defaultValue { side: 'bottom', sideOffset: 8, position: 'popper' }
59
+ * @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8, position: 'popper' }
57
60
  */
58
61
  content?: Omit<ComboboxContentProps, 'as' | 'asChild' | 'forceMount'>
59
62
  /**
@@ -66,125 +69,179 @@ export interface SelectMenuProps<T> extends Pick<ComboboxRootProps<T>, 'modelVal
66
69
  * @defaultValue true
67
70
  */
68
71
  portal?: boolean
69
- /**
70
- * Whether to filter items or not, can be an array of fields to filter.
71
- * When `false`, items will not be filtered which is useful for custom filtering (useAsyncData, useFetch, etc.).
72
- * @defaultValue ['label']
73
- */
74
- filter?: boolean | string[]
75
72
  /**
76
73
  * When `items` is an array of objects, select the field to use as the value instead of the object itself.
77
74
  * @defaultValue undefined
78
75
  */
79
- valueKey?: keyof T
80
- items?: T[] | T[][]
76
+ valueKey?: V
77
+ /**
78
+ * When `items` is an array of objects, select the field to use as the label.
79
+ * @defaultValue 'label'
80
+ */
81
+ labelKey?: V
82
+ items?: I
83
+ /** The value of the SelectMenu when initially rendered. Use when you do not need to control the state of the SelectMenu. */
84
+ defaultValue?: SelectModelValue<T, V, M>
85
+ /** The controlled value of the SelectMenu. Can be binded-with with `v-model`. */
86
+ modelValue?: SelectModelValue<T, V, M>
87
+ /** Whether multiple options can be selected or not. */
88
+ multiple?: M & boolean
81
89
  /** Highlight the ring color like a focus state. */
82
90
  highlight?: boolean
91
+ /**
92
+ * Determines if custom user input that does not exist in options can be added.
93
+ * @defaultValue false
94
+ */
95
+ createItem?: boolean | 'always' | { position?: 'top' | 'bottom', when?: 'empty' | 'always' }
96
+ /**
97
+ * Fields to filter items by.
98
+ * @defaultValue [labelKey]
99
+ */
100
+ filterFields?: string[]
101
+ /**
102
+ * When `true`, disable the default filters, useful for custom filtering (useAsyncData, useFetch, etc.).
103
+ * @defaultValue false
104
+ */
105
+ ignoreFilter?: boolean
83
106
  class?: any
84
107
  ui?: PartialString<typeof selectMenu.slots>
85
108
  }
86
109
 
87
- export type SelectMenuEmits<T> = ComboboxRootEmits<T> & {
110
+ export type SelectMenuEmits<T, V, M extends boolean> = Omit<ComboboxRootEmits<T>, 'update:modelValue'> & {
88
111
  change: [payload: Event]
89
112
  blur: [payload: FocusEvent]
90
113
  focus: [payload: FocusEvent]
91
- }
114
+ create: [item: string]
115
+ } & SelectModelValueEmits<T, V, M>
92
116
 
93
117
  type SlotProps<T> = (props: { item: T, index: number }) => any
94
118
 
95
- export type SelectMenuSlots<T> = {
96
- 'leading'(props: { modelValue: T, open: boolean, ui: any }): any
97
- 'default'(props: { modelValue: T, open: boolean }): any
98
- 'trailing'(props: { modelValue: T, open: boolean, ui: any }): any
119
+ export interface SelectMenuSlots<T, M extends boolean> {
120
+ 'leading'(props: { modelValue?: M extends true ? T[] : T, open: boolean, ui: any }): any
121
+ 'default'(props: { modelValue?: M extends true ? T[] : T, open: boolean }): any
122
+ 'trailing'(props: { modelValue?: M extends true ? T[] : T, open: boolean, ui: any }): any
99
123
  'empty'(props: { searchTerm?: string }): any
100
124
  'item': SlotProps<T>
101
125
  'item-leading': SlotProps<T>
102
126
  'item-label': SlotProps<T>
103
127
  'item-trailing': SlotProps<T>
128
+ 'create-item-label'(props: { item: string }): any
104
129
  }
130
+
131
+ extendDevtoolsMeta({ defaultProps: { items: ['Option 1', 'Option 2', 'Option 3'] } })
105
132
  </script>
106
133
 
107
- <script setup lang="ts" generic="T extends SelectMenuItem | AcceptableValue">
108
- import { computed, toRef } from 'vue'
109
- import { ComboboxRoot, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxViewport, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, useForwardPropsEmits } from 'radix-vue'
134
+ <script setup lang="ts" generic="T extends MaybeArrayOfArrayItem<I>, I extends MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean> = MaybeArrayOfArray<SelectMenuItem | AcceptableValue | boolean>, V extends SelectItemKey<T> | undefined = undefined, M extends boolean = false">
135
+ import { computed, toRef, toRaw } from 'vue'
136
+ import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxViewport, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, useForwardPropsEmits, useFilter } from 'reka-ui'
110
137
  import { defu } from 'defu'
111
- import { reactivePick } from '@vueuse/core'
138
+ import { reactivePick, createReusableTemplate } from '@vueuse/core'
112
139
  import { useAppConfig } from '#imports'
113
140
  import { useButtonGroup } from '../composables/useButtonGroup'
114
141
  import { useComponentIcons } from '../composables/useComponentIcons'
115
142
  import { useFormField } from '../composables/useFormField'
143
+ import { useLocale } from '../composables/useLocale'
144
+ import { get, compare } from '../utils'
116
145
  import UIcon from './Icon.vue'
117
146
  import UAvatar from './Avatar.vue'
118
147
  import UChip from './Chip.vue'
119
- import { get } from '../utils'
148
+ import UInput from './Input.vue'
120
149
 
121
- const props = withDefaults(defineProps<SelectMenuProps<T>>(), {
122
- search: true,
150
+ const props = withDefaults(defineProps<SelectMenuProps<T, I, V, M>>(), {
123
151
  portal: true,
124
- autofocusDelay: 0,
125
- searchPlaceholder: 'Search...',
126
- filter: () => ['label']
152
+ searchInput: true,
153
+ labelKey: 'label' as never
127
154
  })
128
- const emits = defineEmits<SelectMenuEmits<T>>()
129
- const slots = defineSlots<SelectMenuSlots<T>>()
155
+ const emits = defineEmits<SelectMenuEmits<T, V, M>>()
156
+ const slots = defineSlots<SelectMenuSlots<T, M>>()
130
157
 
131
158
  const searchTerm = defineModel<string>('searchTerm', { default: '' })
132
159
 
160
+ const { t } = useLocale()
133
161
  const appConfig = useAppConfig()
134
- const rootProps = useForwardPropsEmits(reactivePick(props, 'modelValue', 'defaultValue', 'selectedValue', 'open', 'defaultOpen', 'multiple', 'resetSearchTermOnBlur'), emits)
135
- const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, position: 'popper' }) as ComboboxContentProps)
162
+ const { contains } = useFilter({ sensitivity: 'base' })
163
+
164
+ const rootProps = useForwardPropsEmits(reactivePick(props, 'modelValue', 'defaultValue', 'open', 'defaultOpen', 'multiple', 'resetSearchTermOnBlur', 'highlightOnHover'), emits)
165
+ const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, collisionPadding: 8, position: 'popper' }) as ComboboxContentProps)
166
+ const arrowProps = toRef(() => props.arrow as ComboboxArrowProps)
167
+ const searchInputProps = toRef(() => defu(props.searchInput, { placeholder: 'Search...', variant: 'none' }) as InputProps)
168
+
136
169
  const { emitFormBlur, emitFormInput, emitFormChange, size: formGroupSize, color, id, name, highlight, disabled } = useFormField<InputProps>(props)
137
170
  const { orientation, size: buttonGroupSize } = useButtonGroup<InputProps>(props)
138
171
  const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(toRef(() => defu(props, { trailingIcon: appConfig.ui.icons.chevronDown })))
139
172
 
140
173
  const selectSize = computed(() => buttonGroupSize.value || formGroupSize.value)
141
174
 
175
+ const [DefineCreateItemTemplate, ReuseCreateItemTemplate] = createReusableTemplate()
176
+
142
177
  const ui = computed(() => selectMenu({
143
178
  color: color.value,
144
179
  variant: props.variant,
145
180
  size: selectSize?.value,
146
181
  loading: props.loading,
147
182
  highlight: highlight.value,
148
- leading: isLeading.value || !!slots.leading,
183
+ leading: isLeading.value || !!props.avatar || !!slots.leading,
149
184
  trailing: isTrailing.value || !!slots.trailing,
150
185
  buttonGroup: orientation.value
151
186
  }))
152
187
 
153
- function displayValue(val: T, multiple?: boolean): string {
154
- if (multiple && Array.isArray(val)) {
155
- return val.map(v => displayValue(v)).join(', ')
188
+ function displayValue(value: T | T[]): string {
189
+ if (props.multiple && Array.isArray(value)) {
190
+ return value.map(v => displayValue(v)).filter(Boolean).join(', ')
156
191
  }
157
192
 
158
- if (typeof val === 'object') {
159
- return val.label
193
+ if (!props.valueKey) {
194
+ return value && (typeof value === 'object' ? get(value, props.labelKey as string) : value)
160
195
  }
161
196
 
162
- return val && String(val)
197
+ const item = items.value.find(item => compare(typeof item === 'object' ? get(item, props.valueKey as string) : item, value))
198
+ return item && (typeof item === 'object' ? get(item, props.labelKey as string) : item)
163
199
  }
164
200
 
165
- function filterFunction(items: ArrayOrWrapped<AcceptableValue>, searchTerm: string): ArrayOrWrapped<AcceptableValue> {
166
- if (props.filter === false) {
167
- return items
201
+ const groups = computed(() => props.items?.length ? (Array.isArray(props.items[0]) ? props.items : [props.items]) as SelectMenuItem[][] : [])
202
+ // eslint-disable-next-line vue/no-dupe-keys
203
+ const items = computed(() => groups.value.flatMap(group => group) as T[])
204
+
205
+ const filteredGroups = computed(() => {
206
+ if (props.ignoreFilter || !searchTerm.value) {
207
+ return groups.value
168
208
  }
169
209
 
170
- const fields = Array.isArray(props.filter) ? props.filter : ['label']
210
+ const fields = Array.isArray(props.filterFields) ? props.filterFields : [props.labelKey] as string[]
171
211
 
172
- return items.filter((item) => {
212
+ return groups.value.map(items => items.filter((item) => {
173
213
  if (typeof item !== 'object') {
174
- return String(item).search(new RegExp(searchTerm, 'i')) !== -1
214
+ return contains(item, searchTerm.value)
175
215
  }
176
216
 
177
- return fields.some((field) => {
178
- const child = get(item, field)
217
+ if (item.type && ['label', 'separator'].includes(item.type)) {
218
+ return true
219
+ }
179
220
 
180
- return child !== null && child !== undefined && String(child).search(new RegExp(searchTerm, 'i')) !== -1
181
- })
182
- }) as ArrayOrWrapped<T>
183
- }
221
+ return fields.some(field => contains(get(item, field), searchTerm.value))
222
+ })).filter(group => group.filter(item => !item.type || !['label', 'separator'].includes(item.type)).length > 0)
223
+ })
224
+ const filteredItems = computed(() => filteredGroups.value.flatMap(group => group) as T[])
184
225
 
185
- const groups = computed(() => props.items?.length ? (Array.isArray(props.items[0]) ? props.items : [props.items]) as SelectMenuItem[][] : [])
226
+ const createItem = computed(() => {
227
+ if (!props.createItem || !searchTerm.value) {
228
+ return false
229
+ }
230
+
231
+ const newItem = props.valueKey ? { [props.valueKey]: searchTerm.value } as T : searchTerm.value
232
+
233
+ if ((typeof props.createItem === 'object' && props.createItem.when === 'always') || props.createItem === 'always') {
234
+ return !filteredItems.value.find(item => compare(item, newItem, props.valueKey))
235
+ }
236
+
237
+ return !filteredItems.value.length
238
+ })
239
+ const createItemPosition = computed(() => typeof props.createItem === 'object' ? props.createItem.position : 'bottom')
186
240
 
187
241
  function onUpdate(value: any) {
242
+ if (toRaw(props.modelValue) === value) {
243
+ return
244
+ }
188
245
  // @ts-expect-error - 'target' does not exist in type 'EventInit'
189
246
  const event = new Event('change', { target: { value } })
190
247
  emits('change', event)
@@ -204,39 +261,57 @@ function onUpdateOpen(value: boolean) {
204
261
  }
205
262
  </script>
206
263
 
264
+ <!-- eslint-disable vue/no-template-shadow -->
207
265
  <template>
266
+ <DefineCreateItemTemplate>
267
+ <ComboboxGroup :class="ui.group({ class: props.ui?.group })">
268
+ <ComboboxItem
269
+ :class="ui.item({ class: props.ui?.item })"
270
+ :value="searchTerm"
271
+ @select.prevent="emits('create', searchTerm)"
272
+ >
273
+ <span :class="ui.itemLabel({ class: props.ui?.itemLabel })">
274
+ <slot name="create-item-label" :item="searchTerm">
275
+ {{ t('selectMenu.create', { label: searchTerm }) }}
276
+ </slot>
277
+ </span>
278
+ </ComboboxItem>
279
+ </ComboboxGroup>
280
+ </DefineCreateItemTemplate>
281
+
208
282
  <ComboboxRoot
209
283
  :id="id"
210
284
  v-slot="{ modelValue, open }"
211
285
  v-bind="rootProps"
212
- v-model:search-term="searchTerm"
286
+ ignore-filter
213
287
  as-child
214
288
  :name="name"
215
289
  :disabled="disabled"
216
- :display-value="() => searchTerm"
217
- :filter-function="filterFunction"
218
290
  @update:model-value="onUpdate"
219
291
  @update:open="onUpdateOpen"
220
292
  >
221
293
  <ComboboxAnchor as-child>
222
- <ComboboxTrigger :class="ui.base({ class: props.class })" tabindex="0">
223
- <span v-if="isLeading || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })">
224
- <slot name="leading" :model-value="(modelValue as T)" :open="open" :ui="ui">
225
- <UIcon v-if="leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
294
+ <ComboboxTrigger :class="ui.base({ class: [props.class, props.ui?.base] })" tabindex="0">
295
+ <span v-if="isLeading || !!avatar || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })">
296
+ <slot name="leading" :model-value="(modelValue as M extends true ? T[] : T)" :open="open" :ui="ui">
297
+ <UIcon v-if="isLeading && leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
298
+ <UAvatar v-else-if="!!avatar" :size="((props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="avatar" :class="ui.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar })" />
226
299
  </slot>
227
300
  </span>
228
301
 
229
- <slot :model-value="(modelValue as T)" :open="open">
230
- <span v-if="multiple ? modelValue?.length : modelValue !== undefined" :class="ui.value({ class: props.ui?.value })">
231
- {{ displayValue(modelValue as T, multiple) }}
232
- </span>
233
- <span v-else :class="ui.placeholder({ class: props.ui?.placeholder })">
234
- {{ placeholder ?? '&nbsp;' }}
235
- </span>
302
+ <slot :model-value="(modelValue as M extends true ? T[] : T)" :open="open">
303
+ <template v-for="displayedModelValue in [displayValue(modelValue as M extends true ? T[] : T)]" :key="displayedModelValue">
304
+ <span v-if="displayedModelValue" :class="ui.value({ class: props.ui?.value })">
305
+ {{ displayedModelValue }}
306
+ </span>
307
+ <span v-else :class="ui.placeholder({ class: props.ui?.placeholder })">
308
+ {{ placeholder ?? '&nbsp;' }}
309
+ </span>
310
+ </template>
236
311
  </slot>
237
312
 
238
313
  <span v-if="isTrailing || !!slots.trailing" :class="ui.trailing({ class: props.ui?.trailing })">
239
- <slot name="trailing" :model-value="(modelValue as T)" :open="open" :ui="ui">
314
+ <slot name="trailing" :model-value="(modelValue as M extends true ? T[] : T)" :open="open" :ui="ui">
240
315
  <UIcon v-if="trailingIconName" :name="trailingIconName" :class="ui.trailingIcon({ class: props.ui?.trailingIcon })" />
241
316
  </slot>
242
317
  </span>
@@ -245,19 +320,23 @@ function onUpdateOpen(value: boolean) {
245
320
 
246
321
  <ComboboxPortal :disabled="!portal">
247
322
  <ComboboxContent :class="ui.content({ class: props.ui?.content })" v-bind="contentProps">
248
- <ComboboxInput v-if="search" :placeholder="searchPlaceholder" :class="ui.input({ class: props.ui?.input })" autofocus autocomplete="off" />
323
+ <ComboboxInput v-if="!!searchInput" v-model="searchTerm" :display-value="() => searchTerm" as-child>
324
+ <UInput autofocus autocomplete="off" v-bind="searchInputProps" :class="ui.input({ class: props.ui?.input })" />
325
+ </ComboboxInput>
249
326
 
250
327
  <ComboboxEmpty :class="ui.empty({ class: props.ui?.empty })">
251
328
  <slot name="empty" :search-term="searchTerm">
252
- {{ searchTerm ? `No results for ${searchTerm}` : 'No results' }}
329
+ {{ searchTerm ? t('selectMenu.noMatch', { searchTerm }) : t('selectMenu.noData') }}
253
330
  </slot>
254
331
  </ComboboxEmpty>
255
332
 
256
333
  <ComboboxViewport :class="ui.viewport({ class: props.ui?.viewport })">
257
- <ComboboxGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
334
+ <ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'top'" />
335
+
336
+ <ComboboxGroup v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
258
337
  <template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
259
338
  <ComboboxLabel v-if="item?.type === 'label'" :class="ui.label({ class: props.ui?.label })">
260
- {{ item.label }}
339
+ {{ get(item, props.labelKey as string) }}
261
340
  </ComboboxLabel>
262
341
 
263
342
  <ComboboxSeparator v-else-if="item?.type === 'separator'" :class="ui.separator({ class: props.ui?.separator })" />
@@ -266,12 +345,13 @@ function onUpdateOpen(value: boolean) {
266
345
  v-else
267
346
  :class="ui.item({ class: props.ui?.item })"
268
347
  :disabled="item.disabled"
269
- :value="valueKey && typeof item === 'object' ? (item[valueKey as keyof SelectMenuItem]) as AcceptableValue : item"
348
+ :value="valueKey && typeof item === 'object' ? get(item, props.valueKey as string) : item"
349
+ @select="item.onSelect"
270
350
  >
271
351
  <slot name="item" :item="(item as T)" :index="index">
272
352
  <slot name="item-leading" :item="(item as T)" :index="index">
273
- <UAvatar v-if="item.avatar" :size="((props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar })" />
274
- <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon })" />
353
+ <UIcon v-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon })" />
354
+ <UAvatar v-else-if="item.avatar" :size="((props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar })" />
275
355
  <UChip
276
356
  v-else-if="item.chip"
277
357
  :size="((props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()) as ChipProps['size'])"
@@ -284,7 +364,7 @@ function onUpdateOpen(value: boolean) {
284
364
 
285
365
  <span :class="ui.itemLabel({ class: props.ui?.itemLabel })">
286
366
  <slot name="item-label" :item="(item as T)" :index="index">
287
- {{ displayValue(item as T) }}
367
+ {{ typeof item === 'object' ? get(item, props.labelKey as string) : item }}
288
368
  </slot>
289
369
  </span>
290
370
 
@@ -299,7 +379,11 @@ function onUpdateOpen(value: boolean) {
299
379
  </ComboboxItem>
300
380
  </template>
301
381
  </ComboboxGroup>
382
+
383
+ <ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'bottom'" />
302
384
  </ComboboxViewport>
385
+
386
+ <ComboboxArrow v-if="!!arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" />
303
387
  </ComboboxContent>
304
388
  </ComboboxPortal>
305
389
  </ComboboxRoot>
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { tv, type VariantProps } from 'tailwind-variants'
3
- import type { SeparatorProps as _SeparatorProps } from 'radix-vue'
3
+ import type { SeparatorProps as _SeparatorProps } from 'reka-ui'
4
4
  import type { AppConfig } from '@nuxt/schema'
5
5
  import _appConfig from '#build/app.config'
6
6
  import theme from '#build/ui/separator'
@@ -15,7 +15,7 @@ type SeparatorVariants = VariantProps<typeof separator>
15
15
  export interface SeparatorProps extends Pick<_SeparatorProps, 'decorative'> {
16
16
  /**
17
17
  * The element or component this component should render as.
18
- * @defaultValue `div`
18
+ * @defaultValue 'div'
19
19
  */
20
20
  as?: any
21
21
  /** Display a label in the middle. */
@@ -43,7 +43,7 @@ export interface SeparatorSlots {
43
43
 
44
44
  <script setup lang="ts">
45
45
  import { computed } from 'vue'
46
- import { Separator, useForwardProps } from 'radix-vue'
46
+ import { Separator, useForwardProps } from 'reka-ui'
47
47
  import { reactivePick } from '@vueuse/core'
48
48
  import UIcon from './Icon.vue'
49
49
  import UAvatar from './Avatar.vue'
@@ -3,6 +3,7 @@ import { tv } from 'tailwind-variants'
3
3
  import type { AppConfig } from '@nuxt/schema'
4
4
  import _appConfig from '#build/app.config'
5
5
  import theme from '#build/ui/skeleton'
6
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
6
7
 
7
8
  const appConfig = _appConfig as AppConfig & { ui: { skeleton: Partial<typeof theme> } }
8
9
 
@@ -16,10 +17,12 @@ export interface SkeletonProps {
16
17
  as?: any
17
18
  class?: any
18
19
  }
20
+
21
+ extendDevtoolsMeta({ example: 'SkeletonExample' })
19
22
  </script>
20
23
 
21
24
  <script setup lang="ts">
22
- import { Primitive } from 'radix-vue'
25
+ import { Primitive } from 'reka-ui'
23
26
 
24
27
  const props = defineProps<SkeletonProps>()
25
28
  </script>
@@ -1,9 +1,10 @@
1
1
  <script lang="ts">
2
2
  import { tv, type VariantProps } from 'tailwind-variants'
3
- import type { DialogRootProps, DialogRootEmits, DialogContentProps } from 'radix-vue'
3
+ import type { DialogRootProps, DialogRootEmits, DialogContentProps } from 'reka-ui'
4
4
  import type { AppConfig } from '@nuxt/schema'
5
5
  import _appConfig from '#build/app.config'
6
6
  import theme from '#build/ui/slideover'
7
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
7
8
  import type { ButtonProps } from '../types'
8
9
 
9
10
  const appConfig = _appConfig as AppConfig & { ui: { slideover: Partial<typeof theme> } }
@@ -35,7 +36,7 @@ export interface SlideoverProps extends DialogRootProps {
35
36
  portal?: boolean
36
37
  /**
37
38
  * Display a close button to dismiss the slideover.
38
- * `{ size: 'md', color: 'gray', variant: 'ghost' }`{lang="ts-type"}
39
+ * `{ size: 'md', color: 'neutral', variant: 'ghost' }`{lang="ts-type"}
39
40
  * @defaultValue true
40
41
  */
41
42
  close?: ButtonProps | boolean
@@ -65,13 +66,16 @@ export interface SlideoverSlots {
65
66
  body(props?: {}): any
66
67
  footer(props?: {}): any
67
68
  }
69
+
70
+ extendDevtoolsMeta({ example: 'SlideoverExample' })
68
71
  </script>
69
72
 
70
73
  <script setup lang="ts">
71
74
  import { computed, toRef } from 'vue'
72
- import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose, useForwardPropsEmits } from 'radix-vue'
75
+ import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose, useForwardPropsEmits } from 'reka-ui'
73
76
  import { reactivePick } from '@vueuse/core'
74
77
  import { useAppConfig } from '#imports'
78
+ import { useLocale } from '../composables/useLocale'
75
79
  import UButton from './Button.vue'
76
80
 
77
81
  const props = withDefaults(defineProps<SlideoverProps>(), {
@@ -85,21 +89,29 @@ const props = withDefaults(defineProps<SlideoverProps>(), {
85
89
  const emits = defineEmits<SlideoverEmits>()
86
90
  const slots = defineSlots<SlideoverSlots>()
87
91
 
92
+ const { t } = useLocale()
93
+ const appConfig = useAppConfig()
94
+
88
95
  const rootProps = useForwardPropsEmits(reactivePick(props, 'open', 'defaultOpen', 'modal'), emits)
89
96
  const contentProps = toRef(() => props.content)
90
97
  const contentEvents = computed(() => {
91
98
  if (props.preventClose) {
92
99
  return {
93
100
  pointerDownOutside: (e: Event) => e.preventDefault(),
94
- interactOutside: (e: Event) => e.preventDefault()
101
+ interactOutside: (e: Event) => e.preventDefault(),
102
+ escapeKeyDown: (e: Event) => e.preventDefault()
95
103
  }
96
104
  }
97
105
 
98
- return {}
106
+ return {
107
+ interactOutside: (e: Event) => {
108
+ if (e.target instanceof Element && e.target.closest('[data-sonner-toaster]')) {
109
+ return e.preventDefault()
110
+ }
111
+ }
112
+ }
99
113
  })
100
114
 
101
- const appConfig = useAppConfig()
102
-
103
115
  const ui = computed(() => slideover({
104
116
  transition: props.transition,
105
117
  side: props.side
@@ -108,14 +120,14 @@ const ui = computed(() => slideover({
108
120
 
109
121
  <template>
110
122
  <DialogRoot v-slot="{ open }" v-bind="rootProps">
111
- <DialogTrigger v-if="!!slots.default" as-child>
123
+ <DialogTrigger v-if="!!slots.default" as-child :class="props.class">
112
124
  <slot :open="open" />
113
125
  </DialogTrigger>
114
126
 
115
127
  <DialogPortal :disabled="!portal">
116
128
  <DialogOverlay v-if="overlay" :class="ui.overlay({ class: props.ui?.overlay })" />
117
129
 
118
- <DialogContent :data-side="side" :class="ui.content({ class: [props.class, props.ui?.content] })" v-bind="contentProps" v-on="contentEvents">
130
+ <DialogContent :data-side="side" :class="ui.content({ class: [!slots.default && props.class, props.ui?.content] })" v-bind="contentProps" v-on="contentEvents">
119
131
  <slot name="content">
120
132
  <div v-if="!!slots.header || (title || !!slots.title) || (description || !!slots.description) || (close || !!slots.close)" :class="ui.header({ class: props.ui?.header })">
121
133
  <slot name="header">
@@ -137,9 +149,9 @@ const ui = computed(() => slideover({
137
149
  v-if="close"
138
150
  :icon="closeIcon || appConfig.ui.icons.close"
139
151
  size="md"
140
- color="gray"
152
+ color="neutral"
141
153
  variant="ghost"
142
- aria-label="Close"
154
+ :aria-label="t('slideover.close')"
143
155
  v-bind="typeof close === 'object' ? close : undefined"
144
156
  :class="ui.close({ class: props.ui?.close })"
145
157
  />
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { tv, type VariantProps } from 'tailwind-variants'
3
- import type { SliderRootProps } from 'radix-vue'
3
+ import type { SliderRootProps } from 'reka-ui'
4
4
  import type { AppConfig } from '@nuxt/schema'
5
5
  import _appConfig from '#build/app.config'
6
6
  import theme from '#build/ui/slider'
@@ -14,7 +14,7 @@ type SliderVariants = VariantProps<typeof slider>
14
14
  export interface SliderProps extends Pick<SliderRootProps, 'name' | 'disabled' | 'inverted' | 'min' | 'max' | 'step' | 'minStepsBetweenThumbs'> {
15
15
  /**
16
16
  * The element or component this component should render as.
17
- * @defaultValue `div`
17
+ * @defaultValue 'div'
18
18
  */
19
19
  as?: any
20
20
  size?: SliderVariants['size']
@@ -38,7 +38,7 @@ export interface SliderEmits {
38
38
 
39
39
  <script setup lang="ts">
40
40
  import { computed } from 'vue'
41
- import { SliderRoot, SliderRange, SliderTrack, SliderThumb, useForwardPropsEmits } from 'radix-vue'
41
+ import { SliderRoot, SliderRange, SliderTrack, SliderThumb, useForwardPropsEmits } from 'reka-ui'
42
42
  import { reactivePick } from '@vueuse/core'
43
43
  import { useFormField } from '../composables/useFormField'
44
44