@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,10 +1,13 @@
1
1
  <script lang="ts">
2
- import { tv, type VariantProps } from 'tailwind-variants'
2
+ import type { VariantProps } 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/button'
6
6
  import type { LinkProps } from './Link.vue'
7
7
  import type { UseComponentIconsProps } from '../composables/useComponentIcons'
8
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
9
+ import { tv } from '../utils/tv'
10
+ import type { AvatarProps } from '../types'
8
11
  import type { PartialString } from '../types/utils'
9
12
 
10
13
  const appConfig = _appConfig as AppConfig & { ui: { button: Partial<typeof theme> } }
@@ -22,10 +25,16 @@ export interface ButtonProps extends UseComponentIconsProps, Omit<LinkProps, 'ra
22
25
  square?: boolean
23
26
  /** Render the button full width. */
24
27
  block?: boolean
28
+ /** Set loading state automatically based on the `@click` promise state */
29
+ loadingAuto?: boolean
30
+ onClick?: ((event: MouseEvent) => void | Promise<void>) | Array<((event: MouseEvent) => void | Promise<void>)>
25
31
  class?: any
26
32
  ui?: PartialString<typeof button.slots>
27
33
  }
28
34
 
35
+ // Injects props to use as default in the devtools playground.
36
+ extendDevtoolsMeta<ButtonProps>({ defaultProps: { label: 'Click me!' } })
37
+
29
38
  export interface ButtonSlots {
30
39
  leading(props?: {}): any
31
40
  default(props?: {}): any
@@ -34,13 +43,16 @@ export interface ButtonSlots {
34
43
  </script>
35
44
 
36
45
  <script setup lang="ts">
37
- import { computed } from 'vue'
38
- import { useForwardProps } from 'radix-vue'
46
+ import { type Ref, computed, ref, inject } from 'vue'
47
+ import { useForwardProps } from 'reka-ui'
39
48
  import { useComponentIcons } from '../composables/useComponentIcons'
40
49
  import { useButtonGroup } from '../composables/useButtonGroup'
50
+ import { formLoadingInjectionKey } from '../composables/useFormField'
51
+ import { omit } from '../utils'
52
+ import { pickLinkProps } from '../utils/link'
41
53
  import UIcon from './Icon.vue'
54
+ import UAvatar from './Avatar.vue'
42
55
  import ULink from './Link.vue'
43
- import { pickLinkProps } from '../utils/link'
44
56
 
45
57
  const props = defineProps<ButtonProps>()
46
58
  const slots = defineSlots<ButtonSlots>()
@@ -48,13 +60,33 @@ const slots = defineSlots<ButtonSlots>()
48
60
  const linkProps = useForwardProps(pickLinkProps(props))
49
61
 
50
62
  const { orientation, size: buttonSize } = useButtonGroup<ButtonProps>(props)
51
- const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(props)
63
+
64
+ const loadingAutoState = ref(false)
65
+ const formLoading = inject<Ref<boolean> | undefined>(formLoadingInjectionKey, undefined)
66
+
67
+ async function onClickWrapper(event: MouseEvent) {
68
+ loadingAutoState.value = true
69
+ const callbacks = Array.isArray(props.onClick) ? props.onClick : [props.onClick]
70
+ try {
71
+ await Promise.all(callbacks.map(fn => fn?.(event)))
72
+ } finally {
73
+ loadingAutoState.value = false
74
+ }
75
+ }
76
+
77
+ const isLoading = computed(() => {
78
+ return props.loading || (props.loadingAuto && (loadingAutoState.value || (formLoading?.value && props.type === 'submit')))
79
+ })
80
+
81
+ const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(
82
+ computed(() => ({ ...props, loading: isLoading.value }))
83
+ )
52
84
 
53
85
  const ui = computed(() => button({
54
86
  color: props.color,
55
87
  variant: props.variant,
56
88
  size: buttonSize.value,
57
- loading: props.loading,
89
+ loading: isLoading.value,
58
90
  block: props.block,
59
91
  square: props.square || (!slots.default && !props.label),
60
92
  leading: isLeading.value,
@@ -64,9 +96,17 @@ const ui = computed(() => button({
64
96
  </script>
65
97
 
66
98
  <template>
67
- <ULink :type="type" :disabled="disabled || loading" :class="ui.base({ class: props.class })" v-bind="linkProps" raw>
99
+ <ULink
100
+ :type="type"
101
+ :disabled="disabled || isLoading"
102
+ :class="ui.base({ class: [props.class, props.ui?.base] })"
103
+ v-bind="omit(linkProps, ['type', 'disabled'])"
104
+ raw
105
+ @click="onClickWrapper"
106
+ >
68
107
  <slot name="leading">
69
108
  <UIcon v-if="isLeading && leadingIconName" :name="leadingIconName" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
109
+ <UAvatar v-else-if="!!avatar" :size="((props.ui?.leadingAvatarSize || ui.leadingAvatarSize()) as AvatarProps['size'])" v-bind="avatar" :class="ui.leadingAvatar({ class: props.ui?.leadingAvatar })" />
70
110
  </slot>
71
111
 
72
112
  <slot>
@@ -1,8 +1,10 @@
1
1
  <script lang="ts">
2
- import { tv, type VariantProps } from 'tailwind-variants'
2
+ import type { VariantProps } 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/button-group'
6
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
7
+ import { tv } from '../utils/tv'
6
8
 
7
9
  const appConfig = _appConfig as AppConfig & { ui: { buttonGroup: Partial<typeof theme> } }
8
10
 
@@ -28,11 +30,13 @@ export interface ButtonGroupProps {
28
30
  export interface ButtonGroupSlots {
29
31
  default(props?: {}): any
30
32
  }
33
+
34
+ extendDevtoolsMeta({ example: 'ButtonGroupExample' })
31
35
  </script>
32
36
 
33
37
  <script setup lang="ts">
34
38
  import { provide, computed } from 'vue'
35
- import { Primitive } from 'radix-vue'
39
+ import { Primitive } from 'reka-ui'
36
40
  import { buttonGroupInjectionKey } from '../composables/useButtonGroup'
37
41
 
38
42
  const props = withDefaults(defineProps<ButtonGroupProps>(), {
@@ -47,7 +51,7 @@ provide(buttonGroupInjectionKey, computed(() => ({
47
51
  </script>
48
52
 
49
53
  <template>
50
- <Primitive :as="as" :class="buttonGroup({ orientation })">
54
+ <Primitive :as="as" :class="buttonGroup({ orientation, class: props.class })">
51
55
  <slot />
52
56
  </Primitive>
53
57
  </template>
@@ -0,0 +1,191 @@
1
+ <script lang="ts">
2
+ import type { VariantProps } from 'tailwind-variants'
3
+ import type { CalendarRootProps, CalendarRootEmits, RangeCalendarRootEmits, DateRange, CalendarCellTriggerProps } from 'reka-ui'
4
+ import type { DateValue } from '@internationalized/date'
5
+ import type { AppConfig } from '@nuxt/schema'
6
+ import _appConfig from '#build/app.config'
7
+ import theme from '#build/ui/calendar'
8
+ import { tv } from '../utils/tv'
9
+
10
+ const appConfig = _appConfig as AppConfig & { ui: { calendar: Partial<typeof theme> } }
11
+
12
+ const calendar = tv({ extend: tv(theme), ...(appConfig.ui?.calendar || {}) })
13
+
14
+ type CalendarVariants = VariantProps<typeof calendar>
15
+
16
+ type CalendarModelValue<R extends boolean = false, M extends boolean = false> = R extends true
17
+ ? DateRange
18
+ : M extends true
19
+ ? DateValue[]
20
+ : DateValue
21
+
22
+ export interface CalendarProps<R extends boolean, M extends boolean> extends Omit<CalendarRootProps, 'as' | 'asChild' | 'modelValue' | 'defaultValue' | 'dir' | 'locale' | 'calendarLabel' | 'multiple'> {
23
+ /**
24
+ * The element or component this component should render as.
25
+ * @defaultValue 'div'
26
+ */
27
+ as?: any
28
+ /**
29
+ * The icon to use for the next year control.
30
+ * @defaultValue appConfig.ui.icons.chevronDoubleRight
31
+ */
32
+ nextYearIcon?: string
33
+ /**
34
+ * The icon to use for the next month control.
35
+ * @defaultValue appConfig.ui.icons.chevronRight
36
+ */
37
+ nextMonthIcon?: string
38
+ /**
39
+ * The icon to use for the previous year control.
40
+ * @defaultValue appConfig.ui.icons.chevronDoubleLeft
41
+ */
42
+ prevYearIcon?: string
43
+ /**
44
+ * The icon to use for the previous month control.
45
+ * @defaultValue appConfig.ui.icons.chevronLeft
46
+ */
47
+ prevMonthIcon?: string
48
+ color?: CalendarVariants['color']
49
+ size?: CalendarVariants['size']
50
+ /** Whether or not a range of dates can be selected */
51
+ range?: R & boolean
52
+ /** Whether or not multiple dates can be selected */
53
+ multiple?: M & boolean
54
+ /** Show month controls */
55
+ monthControls?: boolean
56
+ /** Show year controls */
57
+ yearControls?: boolean
58
+ defaultValue?: CalendarModelValue<R, M>
59
+ modelValue?: CalendarModelValue<R, M>
60
+ class?: any
61
+ ui?: Partial<typeof calendar.slots>
62
+ }
63
+
64
+ export interface CalendarEmits<R extends boolean, M extends boolean> extends Omit<CalendarRootEmits & RangeCalendarRootEmits, 'update:modelValue'> {
65
+ 'update:modelValue': [date: CalendarModelValue<R, M>]
66
+ }
67
+
68
+ export interface CalendarSlots {
69
+ 'heading': (props: { value: string }) => any
70
+ 'day': (props: Pick<CalendarCellTriggerProps, 'day'>) => any
71
+ 'week-day': (props: { day: string }) => any
72
+ }
73
+ </script>
74
+
75
+ <script setup lang="ts" generic="R extends boolean = false, M extends boolean = false">
76
+ import { computed } from 'vue'
77
+ import { useForwardPropsEmits } from 'reka-ui'
78
+ import { Calendar as SingleCalendar, RangeCalendar } from 'reka-ui/namespaced'
79
+ import { reactiveOmit } from '@vueuse/core'
80
+ import { useLocale } from '../composables/useLocale'
81
+ import UButton from './Button.vue'
82
+
83
+ const props = withDefaults(defineProps<CalendarProps<R, M>>(), {
84
+ fixedWeeks: true,
85
+ monthControls: true,
86
+ yearControls: true
87
+ })
88
+ const emits = defineEmits<CalendarEmits<R, M>>()
89
+ defineSlots<CalendarSlots>()
90
+
91
+ const { code: locale, dir, t } = useLocale()
92
+
93
+ const rootProps = useForwardPropsEmits(reactiveOmit(props, 'range', 'modelValue', 'defaultValue', 'color', 'size', 'monthControls', 'yearControls', 'class', 'ui'), emits)
94
+
95
+ const nextYearIcon = computed(() => props.nextYearIcon || (dir.value === 'rtl' ? appConfig.ui.icons.chevronDoubleLeft : appConfig.ui.icons.chevronDoubleRight))
96
+ const nextMonthIcon = computed(() => props.nextMonthIcon || (dir.value === 'rtl' ? appConfig.ui.icons.chevronLeft : appConfig.ui.icons.chevronRight))
97
+ const prevYearIcon = computed(() => props.prevYearIcon || (dir.value === 'rtl' ? appConfig.ui.icons.chevronDoubleRight : appConfig.ui.icons.chevronDoubleLeft))
98
+ const prevMonthIcon = computed(() => props.prevMonthIcon || (dir.value === 'rtl' ? appConfig.ui.icons.chevronRight : appConfig.ui.icons.chevronLeft))
99
+
100
+ const ui = computed(() => calendar({
101
+ color: props.color,
102
+ size: props.size
103
+ }))
104
+
105
+ function paginateYear(date: DateValue, sign: -1 | 1) {
106
+ if (sign === -1) {
107
+ return date.subtract({ years: 1 })
108
+ }
109
+
110
+ return date.add({ years: 1 })
111
+ }
112
+
113
+ const Calendar = computed(() => props.range ? RangeCalendar : SingleCalendar)
114
+ </script>
115
+
116
+ <template>
117
+ <Calendar.Root
118
+ v-slot="{ weekDays, grid }"
119
+ v-bind="rootProps"
120
+ :model-value="(modelValue as CalendarModelValue<true & false>)"
121
+ :default-value="(defaultValue as CalendarModelValue<true & false>)"
122
+ :locale="locale"
123
+ :dir="dir"
124
+ :class="ui.root({ class: [props.class, props.ui?.root] })"
125
+ >
126
+ <Calendar.Header :class="ui.header({ class: props.ui?.header })">
127
+ <Calendar.Prev v-if="props.yearControls" :prev-page="(date: DateValue) => paginateYear(date, -1)" :aria-label="t('calendar.prevYear')" as-child>
128
+ <UButton :icon="prevYearIcon" :size="props.size" color="neutral" variant="ghost" />
129
+ </Calendar.Prev>
130
+ <Calendar.Prev v-if="props.monthControls" :aria-label="t('calendar.prevMonth')" as-child>
131
+ <UButton :icon="prevMonthIcon" :size="props.size" color="neutral" variant="ghost" />
132
+ </Calendar.Prev>
133
+ <Calendar.Heading v-slot="{ headingValue }" :class="ui.heading({ class: props.ui?.heading })">
134
+ <slot name="heading" :value="headingValue">
135
+ {{ headingValue }}
136
+ </slot>
137
+ </Calendar.Heading>
138
+ <Calendar.Next v-if="props.monthControls" :aria-label="t('calendar.nextMonth')" as-child>
139
+ <UButton :icon="nextMonthIcon" :size="props.size" color="neutral" variant="ghost" />
140
+ </Calendar.Next>
141
+ <Calendar.Next v-if="props.yearControls" :next-page="(date: DateValue) => paginateYear(date, 1)" :aria-label="t('calendar.nextYear')" as-child>
142
+ <UButton :icon="nextYearIcon" :size="props.size" color="neutral" variant="ghost" />
143
+ </Calendar.Next>
144
+ </Calendar.Header>
145
+ <div :class="ui.body({ class: props.ui?.body })">
146
+ <Calendar.Grid
147
+ v-for="month in grid"
148
+ :key="month.value.toString()"
149
+ :class="ui.grid({ class: props.ui?.grid })"
150
+ >
151
+ <Calendar.GridHead>
152
+ <Calendar.GridRow :class="ui.gridWeekDaysRow({ class: props.ui?.gridWeekDaysRow })">
153
+ <Calendar.HeadCell
154
+ v-for="day in weekDays"
155
+ :key="day"
156
+ :class="ui.headCell({ class: props.ui?.headCell })"
157
+ >
158
+ <slot name="week-day" :day="day">
159
+ {{ day }}
160
+ </slot>
161
+ </Calendar.HeadCell>
162
+ </Calendar.GridRow>
163
+ </Calendar.GridHead>
164
+ <Calendar.GridBody :class="ui.gridBody({ class: props.ui?.gridBody })">
165
+ <Calendar.GridRow
166
+ v-for="(weekDates, index) in month.rows"
167
+ :key="`weekDate-${index}`"
168
+ :class="ui.gridRow({ class: props.ui?.gridRow })"
169
+ >
170
+ <Calendar.Cell
171
+ v-for="weekDate in weekDates"
172
+ :key="weekDate.toString()"
173
+ :date="weekDate"
174
+ :class="ui.cell({ class: props.ui?.cell })"
175
+ >
176
+ <Calendar.CellTrigger
177
+ :day="weekDate"
178
+ :month="month.value"
179
+ :class="ui.cellTrigger({ class: props.ui?.cellTrigger })"
180
+ >
181
+ <slot name="day" :day="weekDate">
182
+ {{ weekDate.day }}
183
+ </slot>
184
+ </Calendar.CellTrigger>
185
+ </Calendar.Cell>
186
+ </Calendar.GridRow>
187
+ </Calendar.GridBody>
188
+ </Calendar.Grid>
189
+ </div>
190
+ </Calendar.Root>
191
+ </template>
@@ -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/card'
5
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
6
+ import { tv } from '../utils/tv'
6
7
 
7
8
  const appConfig = _appConfig as AppConfig & { ui: { card: Partial<typeof theme> } }
8
9
 
@@ -23,10 +24,12 @@ export interface CardSlots {
23
24
  default(props?: {}): any
24
25
  footer(props?: {}): any
25
26
  }
27
+
28
+ extendDevtoolsMeta({ example: 'CardExample' })
26
29
  </script>
27
30
 
28
31
  <script setup lang="ts">
29
- import { Primitive } from 'radix-vue'
32
+ import { Primitive } from 'reka-ui'
30
33
 
31
34
  const props = defineProps<CardProps>()
32
35
  const slots = defineSlots<CardSlots>()
@@ -0,0 +1,323 @@
1
+ <script lang="ts">
2
+ import type { VariantProps } from 'tailwind-variants'
3
+ import type { AppConfig } from '@nuxt/schema'
4
+ import type { AcceptableValue } from 'reka-ui'
5
+ import type { EmblaCarouselType, EmblaOptionsType, EmblaPluginType } from 'embla-carousel'
6
+ import type { AutoplayOptionsType } from 'embla-carousel-autoplay'
7
+ import type { AutoScrollOptionsType } from 'embla-carousel-auto-scroll'
8
+ import type { AutoHeightOptionsType } from 'embla-carousel-auto-height'
9
+ import type { ClassNamesOptionsType } from 'embla-carousel-class-names'
10
+ import type { FadeOptionsType } from 'embla-carousel-fade'
11
+ import type { WheelGesturesPluginOptions } from 'embla-carousel-wheel-gestures'
12
+ import _appConfig from '#build/app.config'
13
+ import theme from '#build/ui/carousel'
14
+ import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
15
+ import { tv } from '../utils/tv'
16
+ import type { ButtonProps } from '../types'
17
+ import type { PartialString } from '../types/utils'
18
+
19
+ const appConfig = _appConfig as AppConfig & { ui: { carousel: Partial<typeof theme> } }
20
+
21
+ const carousel = tv({ extend: tv(theme), ...(appConfig.ui?.carousel || {}) })
22
+
23
+ type CarouselVariants = VariantProps<typeof carousel>
24
+
25
+ export interface CarouselProps<T> extends Omit<EmblaOptionsType, 'axis' | 'container' | 'slides' | 'direction'> {
26
+ /**
27
+ * The element or component this component should render as.
28
+ * @defaultValue 'div'
29
+ */
30
+ as?: any
31
+ /**
32
+ * Configure the prev button when arrows are enabled.
33
+ * @defaultValue { size: 'md', color: 'neutral', variant: 'link' }
34
+ */
35
+ prev?: ButtonProps
36
+ /**
37
+ * The icon displayed in the prev button.
38
+ * @defaultValue appConfig.ui.icons.arrowLeft
39
+ */
40
+ prevIcon?: string
41
+ /**
42
+ * Configure the next button when arrows are enabled.
43
+ * @defaultValue { size: 'md', color: 'neutral', variant: 'link' }
44
+ */
45
+ next?: ButtonProps
46
+ /**
47
+ * The icon displayed in the next button.
48
+ * @defaultValue appConfig.ui.icons.arrowRight
49
+ */
50
+ nextIcon?: string
51
+ /**
52
+ * Display prev and next buttons to scroll the carousel.
53
+ * @defaultValue false
54
+ */
55
+ arrows?: boolean
56
+ /**
57
+ * Display dots to scroll to a specific slide.
58
+ * @defaultValue false
59
+ */
60
+ dots?: boolean
61
+ orientation?: CarouselVariants['orientation']
62
+ items?: T[]
63
+ /**
64
+ * Enable Autoplay plugin
65
+ * @link https://www.embla-carousel.com/plugins/autoplay/
66
+ */
67
+ autoplay?: boolean | AutoplayOptionsType
68
+ /**
69
+ * Enable Auto Scroll plugin
70
+ * @link https://www.embla-carousel.com/plugins/auto-scroll/
71
+ */
72
+ autoScroll?: boolean | AutoScrollOptionsType
73
+ /**
74
+ * Enable Auto Height plugin
75
+ * @link https://www.embla-carousel.com/plugins/auto-height/
76
+ */
77
+ autoHeight?: boolean | AutoHeightOptionsType
78
+ /**
79
+ * Enable Class Names plugin
80
+ * @link https://www.embla-carousel.com/plugins/class-names/
81
+ */
82
+ classNames?: boolean | ClassNamesOptionsType
83
+ /**
84
+ * Enable Fade plugin
85
+ * @link https://www.embla-carousel.com/plugins/fade/
86
+ */
87
+ fade?: boolean | FadeOptionsType
88
+ /**
89
+ * Enable Wheel Gestures plugin
90
+ * @link https://www.embla-carousel.com/plugins/wheel-gestures/
91
+ */
92
+ wheelGestures?: boolean | WheelGesturesPluginOptions
93
+ class?: any
94
+ ui?: PartialString<typeof carousel.slots>
95
+ }
96
+
97
+ export type CarouselSlots<T> = {
98
+ default(props: { item: T, index: number }): any
99
+ }
100
+
101
+ extendDevtoolsMeta({ example: 'CarouselExample' })
102
+ </script>
103
+
104
+ <script setup lang="ts" generic="T extends AcceptableValue">
105
+ import { computed, ref, watch, onMounted } from 'vue'
106
+ import useEmblaCarousel from 'embla-carousel-vue'
107
+ import { Primitive, useForwardProps } from 'reka-ui'
108
+ import { reactivePick, computedAsync } from '@vueuse/core'
109
+ import { useAppConfig } from '#imports'
110
+ import { useLocale } from '../composables/useLocale'
111
+ import UButton from './Button.vue'
112
+
113
+ const props = withDefaults(defineProps<CarouselProps<T>>(), {
114
+ orientation: 'horizontal',
115
+ arrows: false,
116
+ dots: false,
117
+ // Embla Options
118
+ active: true,
119
+ align: 'center',
120
+ breakpoints: () => ({}),
121
+ containScroll: 'trimSnaps',
122
+ dragFree: false,
123
+ dragThreshold: 10,
124
+ duration: 25,
125
+ inViewThreshold: 0,
126
+ loop: false,
127
+ skipSnaps: false,
128
+ slidesToScroll: 1,
129
+ startIndex: 0,
130
+ watchDrag: true,
131
+ watchResize: true,
132
+ watchSlides: true,
133
+ watchFocus: true,
134
+ // Embla Plugins
135
+ autoplay: false,
136
+ autoScroll: false,
137
+ autoHeight: false,
138
+ classNames: false,
139
+ fade: false,
140
+ wheelGestures: false
141
+ })
142
+ defineSlots<CarouselSlots<T>>()
143
+
144
+ const appConfig = useAppConfig()
145
+ const { dir, t } = useLocale()
146
+ const rootProps = useForwardProps(reactivePick(props, 'active', 'align', 'breakpoints', 'containScroll', 'dragFree', 'dragThreshold', 'duration', 'inViewThreshold', 'loop', 'skipSnaps', 'slidesToScroll', 'startIndex', 'watchDrag', 'watchResize', 'watchSlides', 'watchFocus'))
147
+
148
+ const prevIcon = computed(() => props.prevIcon || (dir.value === 'rtl' ? appConfig.ui.icons.arrowRight : appConfig.ui.icons.arrowLeft))
149
+ const nextIcon = computed(() => props.nextIcon || (dir.value === 'rtl' ? appConfig.ui.icons.arrowLeft : appConfig.ui.icons.arrowRight))
150
+
151
+ const ui = computed(() => carousel({
152
+ orientation: props.orientation
153
+ }))
154
+
155
+ const options = computed<EmblaOptionsType>(() => ({
156
+ ...(props.fade ? { align: 'center', containScroll: false } : {}),
157
+ ...rootProps.value,
158
+ axis: props.orientation === 'horizontal' ? 'x' : 'y',
159
+ direction: dir.value === 'rtl' ? 'rtl' : 'ltr'
160
+ }))
161
+
162
+ const plugins = computedAsync<EmblaPluginType[]>(async () => {
163
+ const plugins = []
164
+
165
+ if (props.autoplay) {
166
+ const AutoplayPlugin = await import('embla-carousel-autoplay').then(r => r.default)
167
+ plugins.push(AutoplayPlugin(typeof props.autoplay === 'boolean' ? {} : props.autoplay))
168
+ }
169
+
170
+ if (props.autoScroll) {
171
+ const AutoScrollPlugin = await import('embla-carousel-auto-scroll').then(r => r.default)
172
+ plugins.push(AutoScrollPlugin(typeof props.autoScroll === 'boolean' ? {} : props.autoScroll))
173
+ }
174
+
175
+ if (props.autoHeight) {
176
+ const AutoHeightPlugin = await import('embla-carousel-auto-height').then(r => r.default)
177
+ plugins.push(AutoHeightPlugin(typeof props.autoHeight === 'boolean' ? {} : props.autoHeight))
178
+ }
179
+
180
+ if (props.classNames) {
181
+ const ClassNamesPlugin = await import('embla-carousel-class-names').then(r => r.default)
182
+ plugins.push(ClassNamesPlugin(typeof props.classNames === 'boolean' ? {} : props.classNames))
183
+ }
184
+
185
+ if (props.fade) {
186
+ const FadePlugin = await import('embla-carousel-fade').then(r => r.default)
187
+ plugins.push(FadePlugin(typeof props.fade === 'boolean' ? {} : props.fade))
188
+ }
189
+
190
+ if (props.wheelGestures) {
191
+ const { WheelGesturesPlugin } = await import('embla-carousel-wheel-gestures')
192
+ plugins.push(WheelGesturesPlugin(typeof props.wheelGestures === 'boolean' ? {} : props.wheelGestures))
193
+ }
194
+
195
+ return plugins
196
+ })
197
+
198
+ const [emblaRef, emblaApi] = useEmblaCarousel(options.value, plugins.value)
199
+
200
+ watch([options, plugins], () => {
201
+ emblaApi.value?.reInit(options.value, plugins.value)
202
+ })
203
+
204
+ function scrollPrev() {
205
+ emblaApi.value?.scrollPrev()
206
+ }
207
+ function scrollNext() {
208
+ emblaApi.value?.scrollNext()
209
+ }
210
+ function scrollTo(index: number) {
211
+ emblaApi.value?.scrollTo(index)
212
+ }
213
+
214
+ function onKeyDown(event: KeyboardEvent) {
215
+ const prevKey = props.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft'
216
+ const nextKey = props.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight'
217
+
218
+ if (event.key === prevKey) {
219
+ event.preventDefault()
220
+ scrollPrev()
221
+
222
+ return
223
+ }
224
+
225
+ if (event.key === nextKey) {
226
+ event.preventDefault()
227
+ scrollNext()
228
+ }
229
+ }
230
+
231
+ const canScrollNext = ref(false)
232
+ const canScrollPrev = ref(false)
233
+ const selectedIndex = ref<number>(0)
234
+ const scrollSnaps = ref<number[]>([])
235
+
236
+ function onInit(api: EmblaCarouselType) {
237
+ scrollSnaps.value = api?.scrollSnapList() || []
238
+ }
239
+ function onSelect(api: EmblaCarouselType) {
240
+ canScrollNext.value = api?.canScrollNext() || false
241
+ canScrollPrev.value = api?.canScrollPrev() || false
242
+ selectedIndex.value = api?.selectedScrollSnap() || 0
243
+ }
244
+
245
+ onMounted(() => {
246
+ if (!emblaApi.value) {
247
+ return
248
+ }
249
+
250
+ emblaApi.value?.on('init', onInit)
251
+ emblaApi.value?.on('init', onSelect)
252
+ emblaApi.value?.on('reInit', onInit)
253
+ emblaApi.value?.on('reInit', onSelect)
254
+ emblaApi.value?.on('select', onSelect)
255
+ })
256
+
257
+ defineExpose({
258
+ emblaRef,
259
+ emblaApi
260
+ })
261
+ </script>
262
+
263
+ <template>
264
+ <Primitive
265
+ :as="as"
266
+ role="region"
267
+ aria-roledescription="carousel"
268
+ tabindex="0"
269
+ :class="ui.root({ class: [props.class, props.ui?.root] })"
270
+ @keydown="onKeyDown"
271
+ >
272
+ <div ref="emblaRef" :class="ui.viewport({ class: props.ui?.viewport })">
273
+ <div :class="ui.container({ class: props.ui?.container })">
274
+ <div
275
+ v-for="(item, index) in items"
276
+ :key="index"
277
+ role="group"
278
+ aria-roledescription="slide"
279
+ :class="ui.item({ class: props.ui?.item })"
280
+ >
281
+ <slot :item="item" :index="index" />
282
+ </div>
283
+ </div>
284
+ </div>
285
+
286
+ <div v-if="arrows || dots" :class="ui.controls({ class: props.ui?.controls })">
287
+ <div v-if="arrows" :class="ui.arrows({ class: props.ui?.arrows })">
288
+ <UButton
289
+ :disabled="!canScrollPrev"
290
+ :icon="prevIcon"
291
+ size="md"
292
+ color="neutral"
293
+ variant="outline"
294
+ :aria-label="t('carousel.prev')"
295
+ v-bind="typeof prev === 'object' ? prev : undefined"
296
+ :class="ui.prev({ class: props.ui?.prev })"
297
+ @click="scrollPrev"
298
+ />
299
+ <UButton
300
+ :disabled="!canScrollNext"
301
+ :icon="nextIcon"
302
+ size="md"
303
+ color="neutral"
304
+ variant="outline"
305
+ :aria-label="t('carousel.next')"
306
+ v-bind="typeof next === 'object' ? next : undefined"
307
+ :class="ui.next({ class: props.ui?.next })"
308
+ @click="scrollNext"
309
+ />
310
+ </div>
311
+
312
+ <div v-if="dots" :class="ui.dots({ class: props.ui?.dots })">
313
+ <template v-for="(_, index) in scrollSnaps" :key="index">
314
+ <button
315
+ :aria-label="t('carousel.goto', { slide: index + 1 })"
316
+ :class="ui.dot({ class: props.ui?.dot, active: selectedIndex === index })"
317
+ @click="scrollTo(index)"
318
+ />
319
+ </template>
320
+ </div>
321
+ </div>
322
+ </Primitive>
323
+ </template>