@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,12 +1,13 @@
1
1
  <script lang="ts">
2
2
  import { tv } from 'tailwind-variants'
3
- import type { ComboboxRootProps, ComboboxRootEmits, ComboboxItemProps } from 'radix-vue'
3
+ import type { ListboxRootProps, ListboxRootEmits } from 'reka-ui'
4
4
  import type { FuseResult } from 'fuse.js'
5
5
  import type { AppConfig } from '@nuxt/schema'
6
6
  import type { UseFuseOptions } from '@vueuse/integrations/useFuse'
7
7
  import _appConfig from '#build/app.config'
8
8
  import theme from '#build/ui/command-palette'
9
9
  import type { UseComponentIconsProps } from '../composables/useComponentIcons'
10
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
10
11
  import type { AvatarProps, ButtonProps, ChipProps, KbdProps, InputProps } from '../types'
11
12
  import type { DynamicSlots, PartialString } from '../types/utils'
12
13
 
@@ -14,7 +15,7 @@ const appConfig = _appConfig as AppConfig & { ui: { commandPalette: Partial<type
14
15
 
15
16
  const commandPalette = tv({ extend: tv(theme), ...(appConfig.ui?.commandPalette || {}) })
16
17
 
17
- export interface CommandPaletteItem extends Pick<ComboboxItemProps, 'disabled'> {
18
+ export interface CommandPaletteItem {
18
19
  prefix?: string
19
20
  label?: string
20
21
  suffix?: string
@@ -22,8 +23,11 @@ export interface CommandPaletteItem extends Pick<ComboboxItemProps, 'disabled'>
22
23
  avatar?: AvatarProps
23
24
  chip?: ChipProps
24
25
  kbds?: KbdProps['value'][] | KbdProps[]
26
+ active?: boolean
27
+ loading?: boolean
28
+ disabled?: boolean
25
29
  slot?: string
26
- select?(e?: Event): void
30
+ onSelect?(e?: Event): void
27
31
  }
28
32
 
29
33
  export interface CommandPaletteGroup<T> {
@@ -32,18 +36,18 @@ export interface CommandPaletteGroup<T> {
32
36
  slot?: string
33
37
  items?: T[]
34
38
  /**
35
- * Wether to filter group items with [useFuse](https://vueuse.org/integrations/useFuse).
36
- * When `false`, items will not be filtered which is useful for custom filtering (useAsyncData, useFetch, etc.).
37
- * @defaultValue true
39
+ * Whether to filter group items with [useFuse](https://vueuse.org/integrations/useFuse).
40
+ * When `true`, items will not be filtered which is useful for custom filtering (useAsyncData, useFetch, etc.).
41
+ * @defaultValue false
38
42
  */
39
- filter?: boolean
43
+ ignoreFilter?: boolean
40
44
  /** Filter group items after the search happened. */
41
45
  postFilter?: (searchTerm: string, items: T[]) => T[]
42
46
  /** The icon displayed when an item is highlighted. */
43
47
  highlightedIcon?: string
44
48
  }
45
49
 
46
- export interface CommandPaletteProps<G, T> extends Pick<ComboboxRootProps, 'multiple' | 'disabled' | 'modelValue' | 'defaultValue' | 'selectedValue' | 'resetSearchTermOnBlur'>, Pick<UseComponentIconsProps, 'loading' | 'loadingIcon'> {
50
+ export interface CommandPaletteProps<G, T> extends Pick<ListboxRootProps, 'multiple' | 'disabled' | 'modelValue' | 'defaultValue' | 'highlightOnHover'>, Pick<UseComponentIconsProps, 'loading' | 'loadingIcon'> {
47
51
  /**
48
52
  * The element or component this component should render as.
49
53
  * @defaultValue 'div'
@@ -65,8 +69,8 @@ export interface CommandPaletteProps<G, T> extends Pick<ComboboxRootProps, 'mult
65
69
  */
66
70
  placeholder?: InputProps['placeholder']
67
71
  /**
68
- * Display a close button in the input (useful when inside a `UModal`).
69
- * `{ size: 'md', color: 'gray', variant: 'ghost' }`{lang="ts-type"}
72
+ * Display a close button in the input (useful when inside a Modal for example).
73
+ * `{ size: 'md', color: 'neutral', variant: 'ghost' }`{lang="ts-type"}
70
74
  * @defaultValue false
71
75
  */
72
76
  close?: ButtonProps | boolean
@@ -78,14 +82,29 @@ export interface CommandPaletteProps<G, T> extends Pick<ComboboxRootProps, 'mult
78
82
  groups?: G[]
79
83
  /**
80
84
  * Options for [useFuse](https://vueuse.org/integrations/useFuse).
81
- * @defaultValue { ignoreLocation: true, threshold: 0.1, keys: ['label', 'suffix'], resultLimit: 12, matchAllWhenSearchEmpty: true }
85
+ * @defaultValue {
86
+ fuseOptions: {
87
+ ignoreLocation: true,
88
+ threshold: 0.1,
89
+ keys: ['label', 'suffix']
90
+ },
91
+ resultLimit: 12,
92
+ matchAllWhenSearchEmpty: true
93
+ }
82
94
  */
83
95
  fuse?: UseFuseOptions<T>
96
+ /**
97
+ * The key used to get the label from the item.
98
+ * @defaultValue 'label'
99
+ */
100
+ labelKey?: string
84
101
  class?: any
85
102
  ui?: PartialString<typeof commandPalette.slots>
86
103
  }
87
104
 
88
- export type CommandPaletteEmits<T> = ComboboxRootEmits<T>
105
+ export type CommandPaletteEmits<T> = ListboxRootEmits<T> & {
106
+ 'update:open': [value: boolean]
107
+ }
89
108
 
90
109
  type SlotProps<T> = (props: { item: T, index: number }) => any
91
110
 
@@ -97,34 +116,41 @@ export type CommandPaletteSlots<G extends { slot?: string }, T extends { slot?:
97
116
  'item-label': SlotProps<T>
98
117
  'item-trailing': SlotProps<T>
99
118
  } & DynamicSlots<G, SlotProps<T>> & DynamicSlots<T, SlotProps<T>>
119
+
120
+ extendDevtoolsMeta({ example: 'CommandPaletteExample', ignoreProps: ['groups'] })
100
121
  </script>
101
122
 
102
123
  <script setup lang="ts" generic="G extends CommandPaletteGroup<T>, T extends CommandPaletteItem">
103
124
  import { computed } from 'vue'
104
- import { ComboboxRoot, ComboboxInput, ComboboxPortal, ComboboxContent, ComboboxEmpty, ComboboxViewport, ComboboxGroup, ComboboxLabel, ComboboxItem, ComboboxItemIndicator, useForwardProps, useForwardPropsEmits } from 'radix-vue'
125
+ import { ListboxRoot, ListboxFilter, ListboxContent, ListboxGroup, ListboxGroupLabel, ListboxItem, ListboxItemIndicator, useForwardProps, useForwardPropsEmits } from 'reka-ui'
105
126
  import { defu } from 'defu'
106
127
  import { reactivePick } from '@vueuse/core'
107
128
  import { useFuse } from '@vueuse/integrations/useFuse'
108
129
  import { useAppConfig } from '#imports'
130
+ import { useLocale } from '../composables/useLocale'
131
+ import { omit, get } from '../utils'
132
+ import { highlight } from '../utils/fuse'
109
133
  import UIcon from './Icon.vue'
110
134
  import UAvatar from './Avatar.vue'
135
+ import UButton from './Button.vue'
111
136
  import UChip from './Chip.vue'
112
137
  import UKbd from './Kbd.vue'
113
138
  import UInput from './Input.vue'
114
- import { omit } from '../utils'
115
- import { highlight } from '../utils/fuse'
116
139
 
117
140
  const props = withDefaults(defineProps<CommandPaletteProps<G, T>>(), {
118
141
  modelValue: '',
119
- placeholder: 'Type a command or search...'
142
+ placeholder: 'Type a command or search...',
143
+ labelKey: 'label'
120
144
  })
121
145
  const emits = defineEmits<CommandPaletteEmits<T>>()
122
146
  const slots = defineSlots<CommandPaletteSlots<G, T>>()
123
147
 
124
148
  const searchTerm = defineModel<string>('searchTerm', { default: '' })
125
149
 
150
+ const { t } = useLocale()
126
151
  const appConfig = useAppConfig()
127
- const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'disabled', 'multiple', 'modelValue', 'defaultValue', 'selectedValue', 'resetSearchTermOnBlur'), emits)
152
+
153
+ const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'disabled', 'multiple', 'modelValue', 'defaultValue', 'highlightOnHover'), emits)
128
154
  const inputProps = useForwardProps(reactivePick(props, 'loading', 'loadingIcon', 'placeholder'))
129
155
 
130
156
  // eslint-disable-next-line vue/no-dupe-keys
@@ -134,7 +160,7 @@ const fuse = computed(() => defu({}, props.fuse, {
134
160
  fuseOptions: {
135
161
  ignoreLocation: true,
136
162
  threshold: 0.1,
137
- keys: ['label', 'suffix']
163
+ keys: [props.labelKey, 'suffix']
138
164
  },
139
165
  resultLimit: 12,
140
166
  matchAllWhenSearchEmpty: true
@@ -146,7 +172,7 @@ const items = computed(() => props.groups?.filter((group) => {
146
172
  return false
147
173
  }
148
174
 
149
- if (group.filter === false) {
175
+ if (group.ignoreFilter) {
150
176
  return false
151
177
  }
152
178
 
@@ -165,8 +191,8 @@ function getGroupWithItems(group: G, items: (T & { matches?: FuseResult<T>['matc
165
191
  items: items.slice(0, fuse.value.resultLimit).map((item) => {
166
192
  return {
167
193
  ...item,
168
- labelHtml: highlight<T>(item, searchTerm.value, 'label'),
169
- suffixHtml: highlight<T>(item, searchTerm.value, undefined, ['label'])
194
+ labelHtml: highlight<T>(item, searchTerm.value, props.labelKey),
195
+ suffixHtml: highlight<T>(item, searchTerm.value, undefined, [props.labelKey])
170
196
  }
171
197
  })
172
198
  }
@@ -180,7 +206,7 @@ const groups = computed(() => {
180
206
  }
181
207
 
182
208
  acc[item.group] ||= []
183
- acc[item.group].push({ ...item, matches })
209
+ acc[item.group]?.push({ ...item, matches })
184
210
 
185
211
  return acc
186
212
  }, {} as Record<string, (T & { matches?: FuseResult<T>['matches'] })[]>)
@@ -194,21 +220,22 @@ const groups = computed(() => {
194
220
  return getGroupWithItems(group, items)
195
221
  }).filter(group => !!group)
196
222
 
197
- const nonFuseGroups = props.groups?.filter(group => group.filter === false && group.items?.length).map((group) => {
198
- return getGroupWithItems(group, group.items || [])
199
- }) || []
223
+ const nonFuseGroups = props.groups
224
+ ?.map((group, index) => ({ ...group, index }))
225
+ ?.filter(group => group.ignoreFilter && group.items?.length)
226
+ ?.map(group => ({ ...getGroupWithItems(group, group.items || []), index: group.index })) || []
200
227
 
201
- return [
202
- ...fuseGroups,
203
- ...nonFuseGroups
204
- ]
228
+ return nonFuseGroups.reduce((acc, group) => {
229
+ acc.splice(group.index, 0, group)
230
+ return acc
231
+ }, [...fuseGroups])
205
232
  })
206
233
  </script>
207
234
 
208
235
  <!-- eslint-disable vue/no-v-html -->
209
236
  <template>
210
- <ComboboxRoot v-bind="rootProps" v-model:search-term="searchTerm" open :class="ui.root({ class: [props.class, props.ui?.root] })">
211
- <ComboboxInput as-child>
237
+ <ListboxRoot v-bind="rootProps" :class="ui.root({ class: [props.class, props.ui?.root] })">
238
+ <ListboxFilter v-model="searchTerm" as-child>
212
239
  <UInput
213
240
  variant="none"
214
241
  autofocus
@@ -223,9 +250,9 @@ const groups = computed(() => {
223
250
  v-if="close"
224
251
  :icon="closeIcon || appConfig.ui.icons.close"
225
252
  size="md"
226
- color="gray"
253
+ color="neutral"
227
254
  variant="ghost"
228
- aria-label="Close"
255
+ :aria-label="t('commandPalette.close')"
229
256
  v-bind="typeof close === 'object' ? close : undefined"
230
257
  :class="ui.close({ class: props.ui?.close })"
231
258
  @click="emits('update:open', false)"
@@ -233,71 +260,70 @@ const groups = computed(() => {
233
260
  </slot>
234
261
  </template>
235
262
  </UInput>
236
- </ComboboxInput>
237
-
238
- <ComboboxPortal disabled>
239
- <ComboboxContent :class="ui.content({ class: props.ui?.content })" :dismissable="false">
240
- <ComboboxEmpty :class="ui.empty({ class: props.ui?.empty })">
241
- <slot name="empty" :search-term="searchTerm">
242
- {{ searchTerm ? `No results for ${searchTerm}` : 'No results' }}
243
- </slot>
244
- </ComboboxEmpty>
245
-
246
- <ComboboxViewport :class="ui.viewport({ class: props.ui?.viewport })">
247
- <ComboboxGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
248
- <ComboboxLabel v-if="group.label" :class="ui.label({ class: props.ui?.label })">
249
- {{ group.label }}
250
- </ComboboxLabel>
251
-
252
- <ComboboxItem
253
- v-for="(item, index) in group.items"
254
- :key="`group-${groupIndex}-${index}`"
255
- :value="omit(item, ['matches' as any, 'group' as any, 'select', 'labelHtml', 'suffixHtml'])"
256
- :disabled="item.disabled"
257
- :class="ui.item({ class: props.ui?.item })"
258
- @select="item.select"
259
- >
260
- <slot :name="item.slot || group.slot || 'item'" :item="item" :index="index">
261
- <slot :name="item.slot ? `${item.slot}-leading` : group.slot ? `${group.slot}-leading` : `item-leading`" :item="item" :index="index">
262
- <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 })" />
263
- <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon })" />
264
- <UChip
265
- v-else-if="item.chip"
266
- :size="((props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()) as ChipProps['size'])"
267
- inset
268
- standalone
269
- v-bind="item.chip"
270
- :class="ui.itemLeadingChip({ class: props.ui?.itemLeadingChip })"
271
- />
272
- </slot>
273
-
274
- <span v-if="item.label || !!slots[item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`]" :class="ui.itemLabel({ class: props.ui?.itemLabel })">
275
- <slot :name="item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`" :item="item" :index="index">
276
- <span v-if="item.prefix" :class="ui.itemLabelPrefix({ class: props.ui?.itemLabelPrefix })">{{ item.prefix }}</span>
263
+ </ListboxFilter>
264
+
265
+ <ListboxContent :class="ui.content({ class: props.ui?.content })">
266
+ <div v-if="groups?.length" :class="ui.viewport({ class: props.ui?.viewport })">
267
+ <ListboxGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
268
+ <ListboxGroupLabel v-if="get(group, props.labelKey as string)" :class="ui.label({ class: props.ui?.label })">
269
+ {{ get(group, props.labelKey as string) }}
270
+ </ListboxGroupLabel>
271
+
272
+ <ListboxItem
273
+ v-for="(item, index) in group.items"
274
+ :key="`group-${groupIndex}-${index}`"
275
+ :value="omit(item, ['matches' as any, 'group' as any, 'onSelect', 'labelHtml', 'suffixHtml'])"
276
+ :disabled="item.disabled"
277
+ :class="ui.item({ class: props.ui?.item, active: item.active })"
278
+ @select="item.onSelect"
279
+ >
280
+ <slot :name="item.slot || group.slot || 'item'" :item="item" :index="index">
281
+ <slot :name="item.slot ? `${item.slot}-leading` : group.slot ? `${group.slot}-leading` : `item-leading`" :item="item" :index="index">
282
+ <UIcon v-if="item.loading" :name="loadingIcon || appConfig.ui.icons.loading" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon, loading: true })" />
283
+ <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: props.ui?.itemLeadingIcon, active: item.active })" />
284
+ <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, active: item.active })" />
285
+ <UChip
286
+ v-else-if="item.chip"
287
+ :size="((props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()) as ChipProps['size'])"
288
+ inset
289
+ standalone
290
+ v-bind="item.chip"
291
+ :class="ui.itemLeadingChip({ class: props.ui?.itemLeadingChip, active: item.active })"
292
+ />
293
+ </slot>
277
294
 
278
- <span :class="ui.itemLabelBase({ class: props.ui?.itemLabelBase })" v-html="item.labelHtml || item.label" />
295
+ <span v-if="item.labelHtml || get(item, props.labelKey as string) || !!slots[item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`]" :class="ui.itemLabel({ class: props.ui?.itemLabel, active: item.active })">
296
+ <slot :name="item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`" :item="item" :index="index">
297
+ <span v-if="item.prefix" :class="ui.itemLabelPrefix({ class: props.ui?.itemLabelPrefix })">{{ item.prefix }}</span>
279
298
 
280
- <span :class="ui.itemLabelSuffix({ class: props.ui?.itemLabelSuffix })" v-html="item.suffixHtml || item.suffix" />
281
- </slot>
282
- </span>
299
+ <span :class="ui.itemLabelBase({ class: props.ui?.itemLabelBase, active: item.active })" v-html="item.labelHtml || get(item, props.labelKey as string)" />
283
300
 
284
- <span :class="ui.itemTrailing({ class: props.ui?.itemTrailing })">
285
- <slot :name="item.slot ? `${item.slot}-trailing` : group.slot ? `${group.slot}-trailing` : `item-trailing`" :item="item" :index="index">
286
- <span v-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: props.ui?.itemTrailingKbds })">
287
- <UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="((props.ui?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()) as KbdProps['size'])" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
288
- </span>
289
- <UIcon v-else-if="group.highlightedIcon" :name="group.highlightedIcon" :class="ui.itemTrailingHighlightedIcon({ class: props.ui?.itemTrailingHighlightedIcon })" />
290
- </slot>
301
+ <span :class="ui.itemLabelSuffix({ class: props.ui?.itemLabelSuffix, active: item.active })" v-html="item.suffixHtml || item.suffix" />
302
+ </slot>
303
+ </span>
304
+
305
+ <span :class="ui.itemTrailing({ class: props.ui?.itemTrailing })">
306
+ <slot :name="item.slot ? `${item.slot}-trailing` : group.slot ? `${group.slot}-trailing` : `item-trailing`" :item="item" :index="index">
307
+ <span v-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: props.ui?.itemTrailingKbds })">
308
+ <UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="((props.ui?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()) as KbdProps['size'])" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
309
+ </span>
310
+ <UIcon v-else-if="group.highlightedIcon" :name="group.highlightedIcon" :class="ui.itemTrailingHighlightedIcon({ class: props.ui?.itemTrailingHighlightedIcon })" />
311
+ </slot>
291
312
 
292
- <ComboboxItemIndicator as-child>
293
- <UIcon :name="selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: props.ui?.itemTrailingIcon })" />
294
- </ComboboxItemIndicator>
295
- </span>
296
- </slot>
297
- </ComboboxItem>
298
- </ComboboxGroup>
299
- </ComboboxViewport>
300
- </ComboboxContent>
301
- </ComboboxPortal>
302
- </ComboboxRoot>
313
+ <ListboxItemIndicator as-child>
314
+ <UIcon :name="selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: props.ui?.itemTrailingIcon })" />
315
+ </ListboxItemIndicator>
316
+ </span>
317
+ </slot>
318
+ </ListboxItem>
319
+ </ListboxGroup>
320
+ </div>
321
+
322
+ <div v-else :class="ui.empty({ class: props.ui?.empty })">
323
+ <slot name="empty" :search-term="searchTerm">
324
+ {{ searchTerm ? t('commandPalette.noMatch', { searchTerm }) : t('commandPalette.noData') }}
325
+ </slot>
326
+ </div>
327
+ </ListboxContent>
328
+ </ListboxRoot>
303
329
  </template>
@@ -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/container'
6
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
6
7
 
7
8
  const appConfig = _appConfig as AppConfig & { ui: { container: Partial<typeof theme> } }
8
9
 
@@ -20,10 +21,12 @@ export interface ContainerProps {
20
21
  export interface ContainerSlots {
21
22
  default(props?: {}): any
22
23
  }
24
+
25
+ extendDevtoolsMeta({ example: 'ContainerExample' })
23
26
  </script>
24
27
 
25
28
  <script setup lang="ts">
26
- import { Primitive } from 'radix-vue'
29
+ import { Primitive } from 'reka-ui'
27
30
 
28
31
  const props = defineProps<ContainerProps>()
29
32
  defineSlots<ContainerSlots>()
@@ -1,19 +1,23 @@
1
1
  <script lang="ts">
2
2
  import { tv, type VariantProps } from 'tailwind-variants'
3
- import type { ContextMenuRootProps, ContextMenuRootEmits, ContextMenuContentProps, ContextMenuTriggerProps, ContextMenuItemProps } from 'radix-vue'
3
+ import type { ContextMenuRootProps, ContextMenuRootEmits, ContextMenuContentProps } 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/context-menu'
7
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
7
8
  import type { AvatarProps, KbdProps, LinkProps } from '../types'
8
- import type { DynamicSlots } from '../types/utils'
9
+ import type { DynamicSlots, PartialString } from '../types/utils'
9
10
 
10
11
  const appConfig = _appConfig as AppConfig & { ui: { contextMenu: Partial<typeof theme> } }
11
12
 
12
13
  const contextMenu = tv({ extend: tv(theme), ...(appConfig.ui?.contextMenu || {}) })
13
14
 
14
- export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'>, Pick<ContextMenuItemProps, 'disabled'> {
15
+ type ContextMenuVariants = VariantProps<typeof contextMenu>
16
+
17
+ export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
15
18
  label?: string
16
19
  icon?: string
20
+ color?: ContextMenuVariants['color']
17
21
  avatar?: AvatarProps
18
22
  content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'>
19
23
  kbds?: KbdProps['value'][] | KbdProps[]
@@ -21,19 +25,31 @@ export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custo
21
25
  * The item type.
22
26
  * @defaultValue 'link'
23
27
  */
24
- type?: 'label' | 'separator' | 'link'
28
+ type?: 'label' | 'separator' | 'link' | 'checkbox'
25
29
  slot?: string
30
+ loading?: boolean
31
+ disabled?: boolean
32
+ checked?: boolean
26
33
  open?: boolean
27
34
  defaultOpen?: boolean
28
35
  children?: ContextMenuItem[] | ContextMenuItem[][]
29
- select?(e: Event): void
36
+ onSelect?(e: Event): void
37
+ onUpdateChecked?(checked: boolean): void
30
38
  }
31
39
 
32
- type ContextMenuVariants = VariantProps<typeof contextMenu>
33
-
34
- export interface ContextMenuProps<T> extends Omit<ContextMenuRootProps, 'dir'>, Pick<ContextMenuTriggerProps, 'disabled'> {
40
+ export interface ContextMenuProps<T> extends Omit<ContextMenuRootProps, 'dir'> {
35
41
  size?: ContextMenuVariants['size']
36
42
  items?: T[] | T[][]
43
+ /**
44
+ * The icon displayed when an item is checked.
45
+ * @defaultValue appConfig.ui.icons.check
46
+ */
47
+ checkedIcon?: string
48
+ /**
49
+ * The icon displayed when an item is loading.
50
+ * @defaultValue appConfig.ui.icons.loading
51
+ */
52
+ loadingIcon?: string
37
53
  /** The content of the menu. */
38
54
  content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'>
39
55
  /**
@@ -41,8 +57,14 @@ export interface ContextMenuProps<T> extends Omit<ContextMenuRootProps, 'dir'>,
41
57
  * @defaultValue true
42
58
  */
43
59
  portal?: boolean
60
+ /**
61
+ * The key used to get the label from the item.
62
+ * @defaultValue 'label'
63
+ */
64
+ labelKey?: string
65
+ disabled?: boolean
44
66
  class?: any
45
- ui?: Partial<typeof contextMenu.slots>
67
+ ui?: PartialString<typeof contextMenu.slots>
46
68
  }
47
69
 
48
70
  export interface ContextMenuEmits extends ContextMenuRootEmits {}
@@ -56,18 +78,80 @@ export type ContextMenuSlots<T extends { slot?: string }> = {
56
78
  'item-label': SlotProps<T>
57
79
  'item-trailing': SlotProps<T>
58
80
  } & DynamicSlots<T, SlotProps<T>>
81
+
82
+ extendDevtoolsMeta({
83
+ example: 'ContextMenuExample',
84
+ ignoreProps: ['items'],
85
+ defaultProps: {
86
+ items: [
87
+ [{
88
+ label: 'My account',
89
+ avatar: {
90
+ src: 'https://avatars.githubusercontent.com/u/739984?v=4'
91
+ }
92
+ }],
93
+ [{
94
+ label: 'Appearance',
95
+ children: [{
96
+ label: 'System',
97
+ icon: 'i-lucide-monitor'
98
+ }, {
99
+ label: 'Light',
100
+ icon: 'i-lucide-sun'
101
+ }, {
102
+ label: 'Dark',
103
+ icon: 'i-lucide-moon'
104
+ }]
105
+ }],
106
+ [{
107
+ label: 'Show Sidebar',
108
+ kbds: ['meta', 'S']
109
+ }, {
110
+ label: 'Show Toolbar',
111
+ kbds: ['shift', 'meta', 'D']
112
+ }, {
113
+ label: 'Collapse Pinned Tabs',
114
+ disabled: true
115
+ }], [{
116
+ label: 'Refresh the Page'
117
+ }, {
118
+ label: 'Clear Cookies and Refresh'
119
+ }, {
120
+ label: 'Clear Cache and Refresh'
121
+ }, {
122
+ type: 'separator'
123
+ }, {
124
+ label: 'Developer',
125
+ children: [[{
126
+ label: 'View Source',
127
+ kbds: ['option', 'meta', 'U']
128
+ }, {
129
+ label: 'Developer Tools',
130
+ kbds: ['option', 'meta', 'I']
131
+ }], [{
132
+ label: 'Inspect Elements',
133
+ kbds: ['option', 'meta', 'C']
134
+ }], [{
135
+ label: 'JavaScript Console',
136
+ kbds: ['option', 'meta', 'J']
137
+ }]]
138
+ }]
139
+ ]
140
+ }
141
+ })
59
142
  </script>
60
143
 
61
144
  <script setup lang="ts" generic="T extends ContextMenuItem">
62
145
  import { computed, toRef } from 'vue'
63
- import { ContextMenuRoot, ContextMenuTrigger, useForwardPropsEmits } from 'radix-vue'
146
+ import { ContextMenuRoot, ContextMenuTrigger, useForwardPropsEmits } from 'reka-ui'
64
147
  import { reactivePick } from '@vueuse/core'
65
- import UContextMenuContent from './ContextMenuContent.vue'
66
148
  import { omit } from '../utils'
149
+ import UContextMenuContent from './ContextMenuContent.vue'
67
150
 
68
151
  const props = withDefaults(defineProps<ContextMenuProps<T>>(), {
69
152
  portal: true,
70
- modal: true
153
+ modal: true,
154
+ labelKey: 'label'
71
155
  })
72
156
  const emits = defineEmits<ContextMenuEmits>()
73
157
  const slots = defineSlots<ContextMenuSlots<T>>()
@@ -83,17 +167,20 @@ const ui = computed(() => contextMenu({
83
167
 
84
168
  <template>
85
169
  <ContextMenuRoot v-bind="rootProps">
86
- <ContextMenuTrigger v-if="!!slots.default" as-child :disabled="disabled">
170
+ <ContextMenuTrigger v-if="!!slots.default" as-child :disabled="disabled" :class="props.class">
87
171
  <slot />
88
172
  </ContextMenuTrigger>
89
173
 
90
174
  <UContextMenuContent
91
- :class="ui.content({ class: [props.class, props.ui?.content] })"
175
+ :class="ui.content({ class: [!slots.default && props.class, props.ui?.content] })"
92
176
  :ui="ui"
93
177
  :ui-override="props.ui"
94
178
  v-bind="contentProps"
95
179
  :items="items"
96
180
  :portal="portal"
181
+ :label-key="labelKey"
182
+ :checked-icon="checkedIcon"
183
+ :loading-icon="loadingIcon"
97
184
  >
98
185
  <template v-for="(_, name) in proxySlots" #[name]="slotData: any">
99
186
  <slot :name="name" v-bind="slotData" />