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

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