Compare commits

..

387 Commits

Author SHA1 Message Date
Benjamin Canac
4fad9521b2 feat(FormField): wrap error with Presence to be animated 2025-05-14 12:57:40 +02:00
Benjamin Canac
717e35f098 docs(app): improve slug page metas 2025-05-14 12:55:58 +02:00
Benjamin Canac
459a0410ab fix(FormField): use div for error and help slots 2025-05-14 12:55:58 +02:00
J-Michalek
b9adc83e78 feat(components): add ui field in items (#4060)
Co-authored-by: Jakub <jakub.michalek@freelo.io>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-13 17:40:29 +02:00
Benjamin Canac
d7a4d029b7 fix(Slider): handle generic types 2025-05-13 17:21:42 +02:00
Benjamin Canac
3c8d6cd01d fix(Input/Textarea): handle generic types
Resolves nuxt/ui-pro#887
2025-05-13 17:18:06 +02:00
Benjamin Canac
67da90a2f6 fix(Link): consistent behavior between nuxt, vue and inertia (#4134) 2025-05-13 14:45:18 +02:00
Daniele Nicosia
894e8a61b6 feat(Badge): add square prop (#4008)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-13 14:44:23 +02:00
TribeWeb
1b6ab271ea feat(CheckboxGroup): add table variant (#3997)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-13 14:28:15 +02:00
Vachmara
0dc4678c68 fix(NavigationMenu): arrow position conflict (#4137)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-13 14:02:02 +02:00
kacijan
e86dc79e51 feat(locale): add Slovenian language (#4140)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-13 12:45:52 +02:00
renovate[bot]
35997377a6 chore(deps): update nuxt framework to ^3.17.3 (v3) (#4133)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 17:17:58 +02:00
Benjamin Canac
12303a87be fix(inertia): make useAppConfig reactive
Follow-up 869c0708bd
2025-05-12 17:11:19 +02:00
renovate[bot]
f84ccddcd6 chore(deps): lock file maintenance (v3) (#4081)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: HugoRCD <hugo.richard@epitech.eu>
2025-05-12 16:42:17 +02:00
Benjamin Canac
869c0708bd fix(vue): make useAppConfig reactive
Resolves #3952

Co-Authored-By: Hugo Richard <hugo.richard@epitech.eu>
2025-05-12 15:05:25 +02:00
Benjamin Canac
c63d2f380a fix(Toaster): allow base slot override 2025-05-12 14:53:09 +02:00
Hugo Richard
92632e969e feat(Toast): add progress prop to hide progress bar (#4125)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-12 14:47:02 +02:00
renovate[bot]
f6d7994a55 chore(deps): update all non-major dependencies (v3) (#4127)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 11:56:05 +02:00
Benjamin Canac
f738f68f76 docs(navigation-menu): improve 2025-05-12 11:31:23 +02:00
Benjamin Canac
17d6803329 docs(ComponentProps): improve schema collapsible display 2025-05-12 11:31:22 +02:00
Benjamin Canac
732a67aa88 docs(app): remove banner 2025-05-12 11:31:22 +02:00
renovate[bot]
bdf129fc38 chore(deps): update tailwindcss to ^4.1.6 (v3) (#4128)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 11:18:16 +02:00
Benjamin Canac
d140acc608 feat(Slider): handle tooltip around thumbs
Resolves #1469
2025-05-10 21:53:12 +02:00
Mateusz Kalinowski
cc20a26f07 fix(ColorPicker): make thumb touch draggable (#4101)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-10 20:03:56 +02:00
Hugo Richard
983c6382d1 docs(llms): handle prose props in llms-full.txt (#4111) 2025-05-10 19:52:01 +02:00
Benjamin Canac
37eabc89bd docs(tabs): improve active item example
Resolves #4092
2025-05-10 18:11:33 +02:00
Benjamin Canac
a57844e416 fix(Stepper): use div tag for title & description
Resolves #4096
2025-05-10 17:59:27 +02:00
Benjamin Canac
2be60cddfe feat(NavigationMenu): add collapsible field in items
Resolves #3353, resolves #3911

Reverts 07e1b4f1f4
2025-05-10 17:51:49 +02:00
Norbiros
09b4699aea fix(Select): support more primitive types in value field (#4105) 2025-05-10 15:06:20 +02:00
Benjamin Canac
46c2987ebf feat(NavigationMenu): handle tooltip in items
Resolves #4050
2025-05-10 13:09:21 +02:00
Malik
f244d15b96 fix(Badge/Button): handle zero value in label correctly (#4108) 2025-05-09 19:27:00 +02:00
Benjamin Canac
aaa60c0798 chore(github): update reproduire workflow 2025-05-09 15:08:21 +02:00
Hugo Richard
5467d71cc2 docs(llms): some ::component-code not parsed in llms-full.txt (#4099)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-09 13:49:06 +02:00
renovate[bot]
941a54e5e3 chore(deps): update all non-major dependencies (v3) (#4078)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-09 10:40:46 +02:00
Benjamin Canac
655f98ffed docs(Header): update raycast extension link 2025-05-08 18:46:09 +02:00
Benjamin Canac
999a0f8467 fix(Tabs): set focus:outline-none with link variant 2025-05-07 21:20:36 +02:00
Benjamin Canac
2739939c46 chore(deps): update @nuxt/ui-pro 2025-05-07 19:37:21 +02:00
Benjamin Canac
2a241c87c3 chore(github): update reproduire workflow 2025-05-07 17:29:40 +02:00
Benjamin Canac
e6e510b848 fix(components): class should have priority over ui prop 2025-05-07 17:23:27 +02:00
Benjamin Canac
a655da1394 chore(github): add reproduire workflow 2025-05-07 15:58:36 +02:00
Benjamin Canac
3a71256d59 docs(contributions): update content url 2025-05-07 15:58:36 +02:00
Benjamin Canac
404359a6ca chore(github): improve v3 issue templates 2025-05-07 15:58:36 +02:00
Igor G
1e4e9c4708 docs(table): add grouped rows example (#4074)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-07 15:25:59 +02:00
Benjamin Canac
6f07f6bd6e docs(examples): remove key from useFetch with params watch 2025-05-07 10:52:06 +02:00
Benjamin Canac
4c1093bde4 docs(examples): add missing @vueuse/core imports 2025-05-07 10:51:46 +02:00
Benjamin Canac
7d51a9e479 fix(Calendar): wrong color for today date with neutral color
Resolves #4084

Possible regression of #3629
2025-05-06 17:36:46 +02:00
Benjamin Canac
04bdbcfc6e chore(module): remove processCSSVariables option
Not needed since https://github.com/nuxt/fonts/releases/tag/v0.11.0
2025-05-06 17:02:12 +02:00
Benjamin Canac
58aa296425 playground(vue): missing fonts 2025-05-06 16:49:36 +02:00
Benjamin Canac
d3df3bb929 fix(templates): dont write unused variants in theme files 2025-05-06 16:03:28 +02:00
Benjamin Canac
4863775e17 docs(app): fix tabs trigger width
Regression of 06e5689da8
2025-05-06 15:22:52 +02:00
Benjamin Canac
7551a85ad2 fix(CheckboxGroup): relative UCheckbox import
Resolves #4090
2025-05-06 12:15:54 +02:00
Benjamin Canac
c2bcb8e264 docs(kbd): update title to fix llms-full.txt 2025-05-06 10:45:31 +02:00
renovate[bot]
88124b85c5 chore(deps): update dependency reka-ui to ^2.2.1 (v3) (#4082)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-05 18:46:26 +02:00
Benjamin Canac
9f539c9545 chore(renovate): remove vue-tsc ignore 2025-05-05 18:25:34 +02:00
Benjamin Canac
41d4ffe5b5 chore(renovate): add group for reka-ui 2025-05-05 18:20:11 +02:00
renovate[bot]
d8a0bbe710 chore(deps): update nuxt framework to ^3.17.2 (v3) (#4079)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 18:09:35 +02:00
Benjamin Canac
06e5689da8 fix(Tabs): prevent trigger truncate without parent width
Resolves #4056
2025-05-05 15:47:27 +02:00
Benjamin Canac
67d19f582a docs(team): center cards 2025-05-05 15:01:24 +02:00
Benjamin Canac
650bc40253 docs(index): update contributors count 2025-05-05 15:01:24 +02:00
renovate[bot]
2f0f317a12 chore(deps): update devdependency vite to ^6.3.5 (v3) (#4071)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 14:55:16 +02:00
renovate[bot]
d2a26939ad chore(deps): update all non-major dependencies (v3) (#4066)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 10:14:30 +02:00
renovate[bot]
b7a8146898 chore(deps): update tailwindcss to ^4.1.5 (v3) (#4067)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 10:14:12 +02:00
Victor Bianchi
e81464a43e fix(inertia): link always render as anchor tag (#3989)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
Co-authored-by: Eugen Istoc <eugenistoc@gmail.com>
Co-authored-by: Romain Hamel <rom.hml@gmail.com>
2025-05-04 17:36:45 +02:00
Benjamin Canac
4b3d2a7b00 chore(deps): update @nuxt/ui-pro 2025-05-02 19:20:03 +02:00
Benjamin Canac
6f6fa6ae4a chore(release): v3.1.1 2025-05-02 18:28:20 +02:00
Jez McKean
c7bb6d4c4b docs(toast): fix toaster example links (#4044) 2025-05-02 18:20:10 +02:00
Daniel Jimenez Gutierrez
c23f85fe33 docs(use-overlay): typo on unMount method (#4047) 2025-05-02 18:18:47 +02:00
Benjamin Canac
591d59fe89 fix(theme): improve app config types for ui object
Resolves #3579
2025-05-02 17:06:20 +02:00
Benjamin Canac
caa3bf9c7e docs(carousel): improve thumbnails example
Resolves #4032
2025-05-02 11:58:55 +02:00
Benjamin Canac
2731011bb7 docs(nuxt.config): put back local module import 2025-05-02 11:52:43 +02:00
Benjamin Canac
aebf0b3dca fix(NavigationMenu): remove sm:w-auto from content slot
Resolves #3987

Reverts abe0859691
2025-05-02 11:48:34 +02:00
renovate[bot]
6651987dc6 chore(deps): update nuxt framework to ^3.17.1 (v3) (#4003)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-02 10:21:32 +02:00
Eugen Istoc
61aabd72e4 chore(deps): add missing vue-component-type-helpers dependency (#4043) 2025-05-01 22:57:50 +02:00
Vitor Camarotto
8dfdd63ce3 fix(Calendar): add place-items-center to grid row (#4034) 2025-05-01 19:02:06 +02:00
renovate[bot]
e6369a6746 chore(deps): update devdependency vite to v6.3.4 [security] (v3) (#4037)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-01 18:49:10 +02:00
Eugen Istoc
a4f3f6d531 feat(useOverlay): add isOpen method to check overlay state (#4041) 2025-05-01 18:48:41 +02:00
Sandro Circi
c5bdec0f64 fix(templates): put back args to watch in dev (#4033) 2025-05-01 18:47:03 +02:00
renovate[bot]
87a7828931 chore(deps): update dependency motion-v to v1 (v3) (#4004)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-30 15:48:32 +02:00
Hugo Richard
501468960b docs(templates): add portfolio template (#4031) 2025-04-30 15:33:06 +02:00
Benjamin Canac
13cd6be679 docs(command-palette): wrong reka-ui link 2025-04-29 22:46:59 +02:00
Benjamin Canac
e421ea57ec docs(pin-input): missing reka-ui link 2025-04-29 22:46:59 +02:00
Malik
799d7ae422 docs(input-number): broken reka-ui link (#4028)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-29 22:44:53 +02:00
Benjamin Canac
be9b1f659a docs(team): update grid 2025-04-29 18:16:59 +02:00
Eugen Istoc
39e29fccf1 fix(useOverlay): improve types and docs (#4012)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-29 18:09:39 +02:00
reslear
195773ec7d fix(RadioGroup): improve items value field type (#3995) 2025-04-29 18:02:38 +02:00
Benjamin Canac
d7710795df chore(github): add playground job in module workflow (#4021) 2025-04-29 17:48:09 +02:00
Benjamin Canac
53f8b34bef chore: use module workspace 2025-04-29 17:21:43 +02:00
Benjamin Canac
df83ab355e chore(deps): update vue-tsc (#4023) 2025-04-29 17:07:24 +02:00
Hugo Richard
e5df026993 fix(theme): add missing ring-offset-* utilities (#3992)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-29 16:10:53 +02:00
Benjamin Canac
6131871a0d fix(theme): use @theme inline to properly reference css variables
Resolves #4018

https://tailwindcss.com/docs/theme#referencing-other-variables
2025-04-29 14:39:08 +02:00
Alain Limoges
9543bce787 docs(form-field/switch): fix typo (#4015) 2025-04-29 14:36:40 +02:00
renovate[bot]
5e345a8a73 chore(deps): update all non-major dependencies (v3) (#4002)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 14:36:40 +02:00
Benjamin Canac
8acf3c51db fix(theme): define default shades for named tailwindcss colors
Resolves #3977
2025-04-29 14:36:31 +02:00
Benjamin Canac
f3b8b17dc5 fix(defineShortcuts): bring back meta to ctrl convert on non macos platforms
Resolves #3869, resolves #3318

Co-Authored-By: Sylvain Marroufin <marroufin.sylvain@gmail.com>
2025-04-29 14:36:31 +02:00
Daniel Roe
bc0a296f9d fix(module): support nuxt-nightly (#3996) 2025-04-29 14:36:31 +02:00
Eugen Istoc
ac4c1946ec feat(useOverlay): add closeAll method (#3984) 2025-04-29 14:36:31 +02:00
Benjamin Canac
82b5f322eb fix(theme): add missing border-bg / divide-bg utilities 2025-04-29 14:36:19 +02:00
Benjamin Canac
fb6cf708a6 chore(deps): update @nuxt/content 2025-04-24 21:35:59 +02:00
Benjamin Canac
8ab1f75e47 chore(github): revert docs trigger 2025-04-24 17:44:30 +02:00
Benjamin Canac
e9b19349ba chore(deps): update @nuxt/ui-pro 2025-04-24 16:16:57 +02:00
Benjamin Canac
b2b206e3f4 docs: update badges 2025-04-24 16:16:29 +02:00
Benjamin Canac
b779064129 docs(radio-group): add missing types on variant 2025-04-24 16:16:29 +02:00
Benjamin Canac
94155258e2 chore(github): prevent docs workflow to run on tags 2025-04-24 16:16:29 +02:00
Maxime Pauvert
c63a6dd133 chore(readme): add pro link (#3970) 2025-04-24 15:43:12 +02:00
Benjamin Canac
79833035de chore(release): v3.1.0 2025-04-24 14:29:07 +02:00
Benjamin Canac
79e7c7b729 chore(deps): update @nuxt/ui-pro 2025-04-24 13:00:11 +02:00
Benjamin Canac
bc06185282 fix(CheckboxGroup): proxy slots & ui prop 2025-04-24 12:38:44 +02:00
Guillaume REMBERT
6e27304d8c fix(Table): improve data reactivity (#3967)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-24 12:10:37 +02:00
Benjamin Canac
b4f8ac7ff7 chore(deps): update nuxt-component-meta 2025-04-24 12:10:29 +02:00
renovate[bot]
a2fa1accaa chore(deps): update all non-major dependencies (v3) (#3946)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-24 12:03:00 +02:00
kyyy
f486423381 feat(Modal/Popover/Slideover): add close:prevent event (#3958)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-23 17:38:44 +02:00
Romain Hamel
975331a7b1 docs(installation): update instructions for inertia (#3964)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-23 17:36:06 +02:00
Benjamin Canac
75e4792f7f fix(Accordion): use div instead of h3 for header tag
Resolves #3963
2025-04-23 16:12:13 +02:00
Benjamin Canac
4a969a8b9e chore(github): add release workflow on v3* tags 2025-04-23 15:31:30 +02:00
Benjamin Canac
664a8c7524 chore(deps): missing caret on motion-v 2025-04-23 13:08:23 +02:00
Benjamin Canac
fbcc3139a3 chore(Skeleton): remove aria-busy:cursor-progress class 2025-04-23 11:25:43 +02:00
Guillaume Chau
1a46394668 feat(components): add new content-top and content-bottom slots (#3886)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-23 11:02:50 +02:00
Benjamin Canac
9ca213bd33 fix(InputMenu/SelectMenu): remove valueKey string case
Resolves #3949

Regression of #3331
2025-04-23 10:22:28 +02:00
kyyy
3484832822 fix(Skeleton): improve accessibility (#3613)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 22:06:05 +02:00
andr35
80dfa88ea4 feat(Table): conditionally apply classes to tr and td (#3866)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 21:14:57 +02:00
Benjamin Canac
d710141a1b chore(deps): update nuxt-component-meta 2025-04-22 18:50:45 +02:00
Hugo Richard
d3e2a3f33a docs(checkbox-group): add og images (#3957) 2025-04-22 18:47:55 +02:00
TribeWeb
9c3d53a02d feat(CheckboxGroup): new component (#3862)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
Co-authored-by: Romain Hamel <rom.hml@gmail.com>
2025-04-22 18:03:27 +02:00
Polly
22edfd708a feat(Carousel): add select event (#3678)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 16:44:47 +02:00
Kheuval
e25aa78050 docs(table): add infinite scroll example (#3656)
Co-authored-by: Hadrien Hartstein <hadrien@emagma.fr>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 16:14:59 +02:00
Igor G
122e8ac8f4 fix(Table): pass header colspan to th (#3926) 2025-04-22 16:07:23 +02:00
Hung Chang
5fc6312ab1 docs(carousel): add thumbnails example (#3740)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 15:44:40 +02:00
Stijn Slats
83f0a24704 docs(table): add drag and drop example (#3700)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 15:31:57 +02:00
Evan Schleret
13c299533f docs(calendar): add external controls example (#3793)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 15:17:17 +02:00
Nathanaël Louison
db11db6ff1 fix(usePortal): adjust portal target resolution logic (#3954) 2025-04-22 12:05:14 +02:00
Benjamin Canac
50863635d6 fix(Alert/Toast): display actions when using slots
Fixes #3950
2025-04-21 18:25:52 +02:00
Nathanaël Louison
29fa46276d feat(App): add global portal prop (#3688)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-21 17:42:55 +02:00
Benjamin Canac
7a35baebc7 chore(templates): wrong theme keys for fill and stroke 2025-04-21 16:52:57 +02:00
Benjamin Canac
b6f6cee1a9 chore(deps): update @nuxt/ui-pro 2025-04-21 16:27:51 +02:00
Benjamin Canac
d49e0dadee feat(module): define neutral utilities (#3629)
Co-authored-by: Sébastien Chopin <atinux@gmail.com>
2025-04-21 15:20:53 +02:00
renovate[bot]
2b315fd855 chore(deps): lock file maintenance (v3) (#3941)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 11:48:01 +02:00
Romain Hamel
f42949820b fix(Form): input and output type inference (#3938)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-21 11:04:23 +02:00
renovate[bot]
d2ba99797c chore(deps): update pnpm to v10.9.0 (v3) (#3944)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 11:02:27 +02:00
renovate[bot]
fd23038b1a chore(deps): update devdependency release-it to v19 (v3) (#3931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 11:01:51 +02:00
renovate[bot]
fe3ec0c183 chore(deps): update all non-major dependencies (v3) (#3888)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 10:42:50 +02:00
Romain Hamel
1a0d7a3103 feat(Form): add attach prop to opt-out of nested form attachement (#3939) 2025-04-20 17:29:36 +02:00
Federico Mameli
c31bffad1b fix(vite): vitest skipping nuxt imports transformations (#3925) 2025-04-18 10:34:21 +02:00
Sébastien Chopin
dd8f7a77a5 docs: don't import color mode from vueuse (#3929) 2025-04-18 09:04:26 +02:00
ExXTreMe315
eb46e31ffb docs(modal): typo in programmatic emit (#3918)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-17 17:49:04 +02:00
Lo
8ea99f0c4f docs(color-mode): fix computed setter logic in ColorModeButton.vue example (#3903) 2025-04-17 17:18:26 +02:00
Hannes Küttner
f6b376110c fix(InputMenu/Select/SelectMenu): add min-w-fit to content slot (#3922) 2025-04-17 14:13:55 +02:00
Hannes Küttner
01d8dc72ad fix(components): respect transform-origin in popper content (#3919)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-17 12:05:04 +02:00
Benjamin Canac
445aac2d57 docs(templates): add chat template 2025-04-16 18:08:11 +02:00
Hugo Richard
391828a2c2 docs(llms): improve llms-full.txt content (#3848)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-16 16:55:42 +02:00
Soryn
02b6b38a56 docs: change favicon color on theme color change (#3917) 2025-04-16 16:50:23 +02:00
Danila Poyarkov
47cdc2e1d8 fix(Link): proxy download property (#3879) 2025-04-16 16:15:13 +02:00
Benjamin Canac
a7d3097f8d chore(locale): order exports 2025-04-16 16:12:44 +02:00
Benjamin Canac
7ac7aa9ba7 feat(module): define default color shades (#3916) 2025-04-16 16:10:54 +02:00
Benjamin Canac
f9737c8f40 feat(module): dynamic rounded-* utilities (#3906) 2025-04-16 15:57:32 +02:00
Benjamin Canac
4e39cc59f8 chore(deps): update @nuxt/ui-pro 2025-04-16 15:47:36 +02:00
renovate[bot]
28accc4aa0 chore(deps): lock file maintenance (v3) (#3812)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-16 10:31:03 +02:00
Sandro Circi
5d10f242bd chore(github): separate builds (#3885) 2025-04-16 10:26:10 +02:00
ElshadBeg
2d5c881639 chore(locale): rename Uyghur language code (#3908) 2025-04-16 10:25:44 +02:00
Selemon Brahanu
ad63753b5e docs(installation): improve .vscode/settings.json json (#3881)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-15 17:53:20 +02:00
Neil Richter
e5a1e26f9d fix(types): allow color identifiers with dashes (#3896) 2025-04-15 10:58:14 +02:00
Maxime Pauvert
113e2e7166 docs(form): fix typo in expose section (#3895) 2025-04-15 10:28:57 +02:00
renovate[bot]
9d4880be35 chore(deps): update tailwindcss to ^4.1.4 (v3) (#3899)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-15 10:22:42 +02:00
Sandro Circi
8dd9d08209 fix(types): improve dynamic slots (#3857) 2025-04-14 16:09:20 +02:00
Benjamin Canac
f309a46b8d chore(deps): update @nuxt/ui-pro 2025-04-14 14:13:21 +02:00
Benjamin Canac
d5bcb0da59 docs(content): improve examples 2025-04-14 12:42:07 +02:00
Benjamin Canac
0a3cc5a25d docs(SupportedLanguages): add mapping for kk 2025-04-14 11:20:37 +02:00
Benjamin Canac
52735fdd40 docs(nuxt.config): remove hub.vectorize config 2025-04-14 11:18:31 +02:00
renovate[bot]
59fd4d52e1 chore(deps): update all non-major dependencies (v3) (#3854)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-14 11:04:50 +02:00
Iván Máximiliano, Lo Giudice
8e78eb15c8 fix(Form): loses focus on submit (#3796)
Co-authored-by: Romain Hamel <rom.hml@gmail.com>
2025-04-14 11:02:27 +02:00
ElshadBeg
b7fc69baa7 feat(locale): add Uyghur language (#3878) 2025-04-14 10:48:40 +02:00
Altynbek
43153c4e91 feat(locale): add Kazakh language (#3875) 2025-04-14 10:48:14 +02:00
Romain Hamel
d059efca25 feat(unplugin): routing support for inertia (#3845)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-14 10:47:26 +02:00
Benjamin Canac
eea14155aa fix(types): handle ClassValue in ui prop
Resolves #3860
2025-04-12 18:28:44 +02:00
Benjamin Canac
4ba8503c60 chore(deps): update @nuxt/ui-pro 2025-04-12 18:28:02 +02:00
Maxime Pauvert
fdee2522bb feat(Form): export loading state (#3861) 2025-04-12 17:54:20 +02:00
Benjamin Canac
39c861a64b fix(components): refactor types after @nuxt/module-builder upgrade (#3855) 2025-04-12 17:53:03 +02:00
Jeremy Woertink
333b7e4c9b docs(components): add missing children field in items (#3846) 2025-04-11 14:46:11 +02:00
Nikolay Larsen
f42a79b5ef feat(locale): add Tajik language (#3850) 2025-04-11 14:33:52 +02:00
Hugo Richard
50012d4866 docs(components): update og images (#3859) 2025-04-11 14:26:22 +02:00
Benjamin Canac
b558b8c5aa docs(form): display theme
Resolves #3752
2025-04-10 21:55:36 +02:00
Guillaume Chau
3447a062b6 feat(Tabs): add list-leading and list-trailing slots (#3837)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-10 21:50:20 +02:00
Sukka
063a23e738 docs(prettier): load from jsdelivr.net instead of unpkg.com (#3575) 2025-04-10 20:53:45 +02:00
renovate[bot]
da0150a9ec chore(deps): update all non-major dependencies (v3) (#3830)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-10 20:45:39 +02:00
Benjamin Canac
981de8b295 docs: prepare for chat components (#3844) 2025-04-10 19:31:12 +02:00
Sandro Circi
fb4c210b41 chore: simplify theme imports in dev (#3851) 2025-04-10 15:59:04 +02:00
Sandro Circi
8c68af5e3b chore: run test suite on windows (#3479)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-10 11:41:23 +02:00
Hugo Richard
81b46ab880 docs(components): add new og images (#3824) 2025-04-09 18:39:09 +02:00
Benjamin Canac
619b6f2a0e chore(Textarea): put back styles 2025-04-09 17:38:19 +02:00
Benjamin Canac
25913188a7 docs(form): improve joi example 2025-04-09 17:30:04 +02:00
Eugen Istoc
f3098df84a feat(OverlayProvider)!: return an overlay instance from .open() (#3829) 2025-04-09 17:26:12 +02:00
Sandro Circi
3deed4c271 fix(Tree): simplify reusable template types (#3836) 2025-04-09 14:05:59 +02:00
Benjamin Canac
e6b1c238b9 docs(form): improve types 2025-04-09 12:20:38 +02:00
Benjamin Canac
626b023ddb docs(showcase): add learnvue.co 2025-04-09 12:20:38 +02:00
Benjamin Canac
4c667f75f4 chore(package): export utils 2025-04-08 17:48:43 +02:00
Daniel Roe
e04dd53046 chore(deps): bump vue-sfc-transformer (#3822) 2025-04-08 17:33:37 +02:00
Benjamin Canac
d25265c8b7 fix(CommandPalette): consistent alignement with other components 2025-04-08 17:29:02 +02:00
renovate[bot]
7d8353ffdc chore(deps): update all non-major dependencies (v3) (#3806)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-08 15:04:26 +02:00
Benjamin Canac
ba534f18b9 fix(CommandPalette): prevent hover background on disabled items 2025-04-08 15:03:29 +02:00
Benjamin Canac
864083156a feat(Select): handle onSelect field in items 2025-04-08 14:51:53 +02:00
Benjamin Canac
8435a0fe16 fix(InputMenu/SelectMenu): prevent disabled items to be selected
Resolves #3474
2025-04-08 14:43:58 +02:00
Benjamin Canac
d339dcbfb8 fix(Carousel): move arrows inside container on mobile
Resolves #3813
2025-04-08 14:25:26 +02:00
Benjamin Canac
cd7ab413f6 docs(migration): describe onClick change
Resolves #3825
2025-04-08 12:58:31 +02:00
Benjamin Canac
cea881abdc feat(InputMenu/SelectMenu): handle resetSearchTermOnSelect
Resolves #3782
2025-04-08 12:20:28 +02:00
Benjamin Canac
d227a105d8 fix(CommandPalette): increase input font size to avoid zoom 2025-04-07 18:53:30 +02:00
Benjamin Canac
f6ff157bc4 chore(Textarea): apply same styles as Input
Partial revert of cb193f1d25
2025-04-07 13:58:30 +02:00
renovate[bot]
21fbd07639 chore(deps): update all non-major dependencies (v3) (#3800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-05 11:12:58 +02:00
renovate[bot]
de234e8aeb chore(deps): update tailwindcss to ^4.1.3 (v3) (#3798)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-05 11:05:48 +02:00
Benjamin Canac
95a7707963 chore(module): improve meta 2025-04-05 10:50:19 +02:00
Benjamin Canac
24b54f6d9a chore(deps): update @nuxt/module-builder (#3799)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2025-04-05 10:42:16 +02:00
Benjamin Canac
b3e37688d9 chore(module): update metas 2025-04-04 23:22:06 +02:00
Benjamin Canac
eeba3b4049 docs(app): clean seo metas 2025-04-04 23:12:17 +02:00
How Bizarre
a0c9731f63 feat(locale): add Bulgarian language (#3783)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-04 21:42:18 +02:00
Benjamin Canac
af1bf1bbde chore(NavigationMenu): remove slots types in createReusableTemplate 2025-04-04 17:14:51 +02:00
Benjamin Canac
54a7d04217 docs(showcase): update items 2025-04-04 17:14:51 +02:00
Vachmara
dfa2113db4 docs(showcase): fix contrast on light mode (#3790) 2025-04-04 12:11:12 +02:00
Benjamin Canac
abe0859691 fix(NavigationMenu): add sm:w-auto content slot
Resolves #3788
2025-04-04 11:42:47 +02:00
renovate[bot]
cf91f3c4cf chore(deps): update all non-major dependencies (v3) (#3768)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-04 11:10:48 +02:00
renovate[bot]
175fc73e63 chore(deps): update tailwindcss to ^4.1.2 (v3) (#3787)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-04 10:12:34 +02:00
Benjamin Canac
1d459803dc fix(Stepper): ui prop override on icon and content slots
Resolves #3785
2025-04-03 14:51:07 +02:00
Robin
60e2ee9a6c docs(Header): add GitHub link in mobile menu (#3721) 2025-04-03 12:26:43 +02:00
GuiFernandes
7f1c6caa6e docs(radio-group): items only accept strings or numbers (#3781) 2025-04-03 12:21:35 +02:00
Benjamin Canac
7ac17ae7e8 docs(showcase): update 2025-04-03 12:10:54 +02:00
Sandro Circi
52a97e2df7 fix(InputMenu/SelectMenu): support arbitrary value (#3779) 2025-04-02 22:28:09 +02:00
Benjamin Canac
041989549a docs(textarea): add badge on unreleased props 2025-04-02 18:06:01 +02:00
Benjamin Canac
31c37ce1a1 docs(radio-group): add badge on unreleased props
Resolves #3765, resolves nuxt/ui-pro#952
2025-04-02 18:04:29 +02:00
renovate[bot]
74cb2c3769 chore(deps): update tailwindcss to ^4.1.1 (v3) (#3770)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-02 14:39:29 +02:00
Benjamin Canac
5025e15d14 docs(app): improve images lazy loading 2025-04-02 14:28:35 +02:00
Hugo Richard
36c24ffe5c docs: add showcase page (#3659)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-02 13:06:46 +02:00
Benjamin Canac
b3a6b861cd docs(app): improve links 2025-04-02 12:25:36 +02:00
Benjamin Canac
c21eb32c70 docs: add team page 2025-04-02 12:20:26 +02:00
Benjamin Canac
44e6ba039d docs(drawer): add responsive example
Resolves #3772
2025-04-02 10:54:53 +02:00
renovate[bot]
ef75610244 chore(deps): update nuxt framework to ^3.16.2 (v3) (#3769)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 21:22:16 +02:00
Benjamin Canac
ffafd81e1e feat(Textarea): add resize-none class with autoresize prop 2025-04-01 12:44:50 +02:00
Benjamin Canac
06414d344b feat(Textarea): add autoresize-delay prop
Resolves #3730
2025-04-01 12:38:21 +02:00
Benjamin Canac
cb193f1d25 feat(Textarea): add icon, loading, etc. props to match Input 2025-04-01 12:38:21 +02:00
Benjamin Canac
4d8179ba08 chore(Input/InputNumber/PinInput/Textarea): clean functions order 2025-04-01 12:05:57 +02:00
Benjamin Canac
ce767c8429 chore(cli): fix tv import 2025-04-01 10:36:52 +02:00
Malik
1ae5cc09cb fix(ContextMenu/DropdownMenu): handle RTL mode (#3744) 2025-03-31 23:07:40 +02:00
Benjamin Canac
9d2fed1250 fix(InputMenu): emit change on multiple item removal
Fixes #3756
2025-03-31 21:14:43 +02:00
Benjamin Canac
924515ad07 chore(README): add contribution guide
Resolves #3757
2025-03-31 17:57:12 +02:00
Romain Hamel
4d138ad671 feat(RadioGroup): add card and table variants (#3178)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-31 16:34:31 +02:00
renovate[bot]
615fcfd73b chore(deps): update all non-major dependencies (v3) (#3755)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 14:13:04 +02:00
Robin Simonklein
f5e62849c9 feat(InputNumber): add support for stepSnapping & disableWheelChange props (#3731) 2025-03-31 13:59:47 +02:00
Daniele Nicosia
f25fed58e9 fix(InputMenu/SelectMenu): correctly call onSelect events (#3735) 2025-03-31 13:58:42 +02:00
renovate[bot]
ca15bc0c75 chore(deps): update all non-major dependencies (v3) (#3722)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 13:55:40 +02:00
renovate[bot]
29f004db95 chore(deps): lock file maintenance (v3) (#3746)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 10:52:25 +02:00
Norbiros
97274f15b8 fix(ContextMenuContent/DropdownMenuContent): remove unwanted any (#3741) 2025-03-30 19:41:38 +02:00
Benjamin Canac
8471fb9fa4 docs(ThemePicker): wrong neutral color 2025-03-28 23:01:04 +01:00
Benjamin Canac
9ec159e207 chore(tsconfig): ignore playground-vue 2025-03-28 19:06:02 +01:00
Benjamin Canac
0456670dac feat(PinInput): add autofocus / autofocus-delay props
Resolves #3717
2025-03-28 19:05:10 +01:00
Benjamin Canac
f05dbd26d1 chore(release): v3.0.2 2025-03-28 16:57:21 +01:00
Benjamin Canac
9be36d328c playground(app): add title 2025-03-28 16:55:11 +01:00
renovate[bot]
4f28e1fe96 chore(deps): update all non-major dependencies (v3) (#3698)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-28 16:43:12 +01:00
Eugen Istoc
bd99c2d850 fix(useOverlay): refine open method type to infer close emit return type (#3716) 2025-03-28 16:42:48 +01:00
Benjamin Canac
23bfeb9370 fix(vue): mock nuxtApp.hooks & useRuntimeHook 2025-03-28 15:07:54 +01:00
仿生狮子
88f349d0d7 fix(Avatar): proxy $attrs to default slot (#3712) 2025-03-28 10:27:25 +01:00
Daniele Nicosia
e7e6745599 fix(types): add missing export for ButtonGroup (#3709) 2025-03-27 23:41:33 +01:00
Benjamin Canac
d2c832292a chore(deps): update @nuxt/ui-pro 2025-03-27 23:22:44 +01:00
Benjamin Canac
bc61d29cce fix(CommandPalette): use group.id as key 2025-03-27 21:32:38 +01:00
Malik
777fe4a309 playground: improve rtl (#3707) 2025-03-27 19:18:58 +01:00
Benjamin Canac
3074632523 fix(InputMenu): reset searchTerm on update:open
Resolves #3620
2025-03-27 16:27:48 +01:00
Benjamin Canac
94b6e520f5 fix(InputMenu/SelectMenu): empty search results 2025-03-27 12:18:46 +01:00
Benjamin Canac
754dd36473 docs(SupportedLanguages): reorder mapping 2025-03-27 12:16:39 +01:00
Benjamin Canac
67a52b6f4e test(Table): update snapshots 2025-03-26 17:40:36 +01:00
Benjamin Canac
2e7d4989b5 chore(github): prevent running module nuxt-ui-pro job on forks 2025-03-26 17:33:32 +01:00
Benjamin Canac
c07a79571f docs(slug): add purchase and affilitate in community links 2025-03-26 17:31:24 +01:00
Benjamin Canac
4cebdb5152 chore(deps): update @nuxt/ui-pro 2025-03-26 17:31:19 +01:00
Benjamin Canac
06dfb963be chore(CommandPalette): improve placeholder tsdoc 2025-03-26 17:31:19 +01:00
Benjamin Canac
4ebb94cd7e fix(Table): wrong condition on caption slot 2025-03-26 17:31:19 +01:00
Benjamin Canac
afff54fecd feat(Table): add empty prop 2025-03-26 17:31:18 +01:00
renovate[bot]
7ec08017e0 chore(deps): update all non-major dependencies (v3) (#3695)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 15:36:26 +01:00
Romain Hamel
3dd88bacec fix(Form): clear dirty state after submit (#3692) 2025-03-26 13:48:28 +01:00
renovate[bot]
d6d7971d44 chore(deps): update tailwindcss to ^4.0.17 (v3) (#3690)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 13:48:02 +01:00
Romain Hamel
20c33920d0 fix(FormField): add help to aria-describedby attribute (#3691) 2025-03-26 13:47:38 +01:00
Stijn Slats
a63047b79a docs(accordion): add drag and drop example (#3684)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-26 11:07:47 +01:00
renovate[bot]
f3e32ba5a2 chore(deps): update all non-major dependencies (v3) (#3667)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 10:59:21 +01:00
renovate[bot]
bd3f54aa80 chore(deps): update tailwindcss to ^4.0.16 (v3) (#3682)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 10:44:06 +01:00
Hugo Richard
9509c37af8 docs: improve lighthouse score and accessibility (#3673) 2025-03-25 16:23:35 +01:00
Benjamin Canac
df00149598 fix(Container): add w-full class 2025-03-25 16:23:05 +01:00
Bobbie Goede
f72c886d3a docs(i18n): remove next tag from @nuxtjs/i18n installation (#3675) 2025-03-25 10:07:58 +01:00
Benjamin Canac
c531d0248b fix(Link): handle aria-current like NuxtLink / RouterLink 2025-03-24 23:57:46 +01:00
Benjamin Canac
d73768b704 fix(Link): prevent active="true" binding on html 2025-03-24 23:56:28 +01:00
Sandro Circi
b9983549a4 fix(components): improve generic types (#3331)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-24 21:38:13 +01:00
Benjamin Canac
370054b20c fix(Link): proxy onClick
Resolves #3631
2025-03-24 19:08:09 +01:00
Hugo Richard
4a2b77d86c feat(Calendar): allow year and month buttons styling (#3672) 2025-03-24 19:00:28 +01:00
Benjamin Canac
ade16b76cf fix(Link): properly pick all aria-* & data-* attrs 2025-03-24 18:58:49 +01:00
Benjamin Canac
1babad4f74 chore(github): update stale to close needs reproduction 2025-03-24 16:22:22 +01:00
Benjamin Canac
8fb8dc29cf docs(nuxt.config): update vite.optimizeDeps 2025-03-24 16:22:22 +01:00
renovate[bot]
e0ec60d1b1 chore(deps): update devdependency wrangler to v4 (v3) (#3554)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 15:36:34 +01:00
Benjamin Canac
3db3058395 docs(index): improve marquees performances 2025-03-24 15:33:01 +01:00
Benjamin Canac
0095d8916b fix(NavigationMenu): add z-index on viewport
Resolves #3654
2025-03-24 15:11:47 +01:00
Sébastien Chopin
58ae62413d docs: add missing redirect 2025-03-24 14:49:05 +01:00
Benjamin Canac
1965495768 chore(deps): remove typescript resolution 2025-03-24 14:41:50 +01:00
Benjamin Canac
5465fcb61d chore(deps): update peerDependencies 2025-03-24 14:12:19 +01:00
Benjamin Canac
ef8ebaf687 chore(renovate): ignore peerDependencies 2025-03-24 14:01:57 +01:00
Benjamin Canac
1094881878 playground(deps): add zod 2025-03-24 14:01:14 +01:00
Romain Hamel
d6fd18fc4f chore(deps): declare form validation libraries as peerDependencies (#3666) 2025-03-24 13:53:35 +01:00
Benjamin Canac
e2e079f0d8 chore(github): improve module workflow 2025-03-24 12:37:04 +01:00
Benjamin Canac
cec9dadc7a chore(docs/playground): add vite.optimizeDeps 2025-03-24 12:37:04 +01:00
Vahe Sargsyan
c76f590097 feat(locale): add Armenian language (#3664) 2025-03-24 11:29:32 +01:00
renovate[bot]
4dee7c3bd3 chore(deps): lock file maintenance (v3) (#3662)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 11:26:00 +01:00
renovate[bot]
47bbe35d2a chore(deps): update all non-major dependencies (v3) (#3636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-24 11:16:11 +01:00
Benjamin Canac
60bcd4fdf0 chore(defineLocale): put back @__NO_SIDE_EFFECTS__ 2025-03-24 11:03:26 +01:00
Benjamin Canac
c231fe5f26 fix(Button): use focus:outline-none instead of focus:outline-hidden
Resolves #3658
2025-03-24 10:50:06 +01:00
Benjamin Canac
1769d5ed6e fix(Tabs): remove focus:outline-hidden class 2025-03-24 10:48:50 +01:00
Benjamin Canac
68787b26fd fix(Switch): prevent transition on focus outline 2025-03-24 10:48:03 +01:00
Benjamin Canac
f7604e565f fix(Drawer): remove fadeFromIndex prop proxy 2025-03-23 15:56:33 +01:00
Benjamin Canac
82e26655a4 fix(defineLocale/defineShortcuts): remove @__NO_SIDE_EFFECTS__ 2025-03-23 14:53:58 +01:00
Benjamin Canac
2453714136 chore(deps): move @standard-schema/spec to dependencies 2025-03-23 12:52:33 +01:00
Benjamin Canac
973f36539d chore(github): enable ui pro integration 2025-03-21 21:24:47 +01:00
Benjamin Canac
05ab54d03a chore(release): v3.0.1 2025-03-21 16:10:20 +01:00
Benjamin Canac
db83df5f5e chore(github): update integration workflow (#3643) 2025-03-21 15:59:34 +01:00
Shadow
a5168666b7 fix(Calendar): grey out days outside of displayed month (#3639) 2025-03-21 11:12:39 +01:00
renovate[bot]
f30d45c79a chore(deps): update tailwindcss to ^4.0.15 (v3) (#3638)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 22:40:18 +01:00
Benjamin Canac
31be5f656e chore(Drawer): put back shrink-0 on handle 2025-03-20 22:25:37 +01:00
Benjamin Canac
0ef5f3b77b chore(github): remove integration env 2025-03-20 22:15:05 +01:00
Benjamin Canac
a0fec4e467 docs(deps): use only one motion library 2025-03-20 22:14:14 +01:00
Benjamin Canac
f401766e26 chore(deps): update vaul-vue 2025-03-20 21:52:14 +01:00
Benjamin Canac
70f469b868 chore(github): update integration workflow 2025-03-20 17:38:09 +01:00
Benjamin Canac
f92df1f661 chore(github): update integration workflow 2025-03-20 16:59:06 +01:00
Benjamin Canac
16edbdf1f0 chore(github): update integration workflow 2025-03-20 16:45:34 +01:00
Benjamin Canac
fe0bd83d11 fix(RadioGroup): handle disabled on items
Resolves nuxt/ui-pro#911
2025-03-20 16:36:58 +01:00
Benjamin Canac
8a26de230b chore(github): update integration workflow 2025-03-20 16:29:38 +01:00
Benjamin Canac
65a6861b54 chore(github): update integration workflow 2025-03-20 16:19:22 +01:00
Sandro Circi
ecff9abc72 fix(module): handle tailwindcss import without theme(static) (#3630)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-20 15:53:57 +01:00
renovate[bot]
06bc7d3028 chore(deps): update all non-major dependencies (v3) (#3591)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 15:15:49 +01:00
Halwest Manguri
b2034ccc91 feat(locale): add Central Kurdish language (#3566)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-20 15:15:21 +01:00
Mickael Chanrion
53cf1b4c14 feat(locale): add Catalan language (#3550)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-20 15:09:43 +01:00
Mark
0229b0fd46 feat(locale): add Romanian language (#3587) 2025-03-20 15:04:52 +01:00
Ulugbek Nagmatov
302e04bd77 feat(locale): add Uzbek language (#3548)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-20 15:03:51 +01:00
Arbaz Irshad
126ba2326f feat(locale): add Urdu language (#3611) 2025-03-20 15:00:57 +01:00
Sébastien Chopin
dfc27514ec docs: add redirects from v2 structure (#3634) 2025-03-20 12:55:27 +01:00
Benjamin Canac
26321c4857 test: update snapshots 2025-03-20 12:47:15 +01:00
Benjamin Canac
5dec0e16e2 feat(components): handle events in content prop 2025-03-20 12:39:57 +01:00
Benjamin Canac
f4c417d9ef fix(Modal/Slideover/Toast): prevent unnecessary close instantiation 2025-03-20 12:14:21 +01:00
Benjamin Canac
9046b9d679 docs(Header): remove extraneous prop on navigation menu 2025-03-20 11:59:46 +01:00
Benjamin Canac
99df056cad docs(app): remove hydrate attributes on stars 2025-03-20 00:06:35 +01:00
renovate[bot]
08bebcae48 chore(deps): update nuxt framework to ^3.16.1 (v3) (#3626)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-19 22:04:37 +01:00
Norbiros
764c41a0c6 fix(ContextMenu/DropdownMenu): remove any from proxySlots (#3623) 2025-03-19 22:03:09 +01:00
Benjamin Canac
2abcc24018 chore(github): update integration workflow 2025-03-19 18:38:40 +01:00
Benjamin Canac
67f90f5f26 chore(github): update integration workflow 2025-03-19 18:06:22 +01:00
Benjamin Canac
024fccf8bb chore(github): update integration workflow 2025-03-19 17:38:16 +01:00
Benjamin Canac
edb0f0afc6 docs(app): improve stars lazy loading 2025-03-19 14:54:14 +01:00
Benjamin Canac
fd160339a6 chore(deps): update @nuxt/ui-pro 2025-03-19 12:57:51 +01:00
Benjamin Canac
2a023b9060 docs(app): improve safelist 2025-03-19 12:33:23 +01:00
Benjamin Canac
ab52830dc8 docs(Banner): allow to close 2025-03-19 12:33:23 +01:00
Romain Hamel
9a4bb34d7d refactor(Form)!: drop explicit support for zod and valibot (#3617) 2025-03-19 12:18:26 +01:00
Romain Hamel
02184b016a chore(Form): improve TSDoc (#3619) 2025-03-19 12:17:52 +01:00
Daniel Roe
57efc78a3b fix(module): mark functions used in exports as pure (#3604) 2025-03-18 14:48:28 +01:00
Benjamin Canac
dec2730aae fix(useLocale): unique symbol to use in @nuxt/ui-pro (#3603) 2025-03-18 12:09:36 +01:00
Rizwan
c8ca604bdf docs(migration): improve useOverlay section (#3601) 2025-03-18 12:04:22 +01:00
Benjamin Canac
ef86108f14 chore(components): add eol in script tag to fix syntax highlight 2025-03-18 10:52:04 +01:00
Harlan Wilton
a1caac47c5 docs: broken 404 pages (#3598) 2025-03-18 10:01:19 +01:00
renovate[bot]
fad715d8df chore(deps): lock file maintenance (v3) (#3582)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 18:32:13 +01:00
Benjamin Canac
b0d0d926ab chore(colors): put back tagPriority
Partial revert of #3589
2025-03-17 18:24:14 +01:00
Romain Hamel
a8e6b74e38 docs(installation): improve vscode recommendations (#3592)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-17 17:01:44 +01:00
renovate[bot]
177fb79cb4 chore(deps): update all non-major dependencies (v3) (#3551)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-17 16:08:26 +01:00
Benjamin Canac
175c7027a3 docs(app): put back carbon ads 2025-03-17 16:05:32 +01:00
Romain Hamel
cc504b8a4b fix(unplugin): include @compodium/examples in auto-imports paths (#3585) 2025-03-17 15:16:42 +01:00
Harlan Wilton
0897e9ef05 fix(vue): missing unhead context (#3589)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-17 15:09:02 +01:00
Benjamin Canac
6588ae8669 docs: clean badges 2025-03-17 14:25:37 +01:00
Benjamin Canac
0b41cebee4 docs(nuxt.config): fix local extends
Related to https://github.com/nuxt/nuxt/issues/31311
2025-03-17 14:24:40 +01:00
Kheuval
e80cc1592f fix(Table): allow links to be opened when @select is used (#3580) 2025-03-17 11:38:37 +01:00
Estéban
5d52af6292 docs(pro): update barbapapazes description (#3577) 2025-03-16 12:06:46 +01:00
Nils Evers
5e62493321 fix(types): add missing export for Icon (#3568) 2025-03-15 12:13:50 +01:00
Jeremy Woertink
37f8619c1a docs(migration): fix typo (#3563) 2025-03-15 12:12:34 +01:00
Benjamin Canac
5376a835f7 docs(pro): disable launch offer 2025-03-15 11:03:43 +01:00
Benjamin Canac
f2ba755ba5 chore(github): update integration workflow 2025-03-13 16:15:17 +01:00
Benjamin Canac
c8d712747f chore(github): update integration workflow 2025-03-13 16:09:00 +01:00
Benjamin Canac
816cf50b37 chore(github): update integration workflow 2025-03-13 15:59:42 +01:00
Benjamin Canac
3c60f70cab chore(github): add integration workflow 2025-03-13 15:27:09 +01:00
renovate[bot]
05758fa915 chore(deps): update tailwindcss to ^4.0.14 (v3) (#3553)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-13 14:43:05 +01:00
Maxime Pauvert
ce4b229264 chore(readme): fix npm badge (#3540) 2025-03-13 14:30:39 +01:00
Benjamin Canac
09b4e9e282 chore(vercel): put back config 2025-03-13 13:59:57 +01:00
Sébastien Chopin
50d68a636c docs: add ui pro banner 2025-03-12 18:16:15 +01:00
Sébastien Chopin
7646c95c73 docs(pro): launch offer 2025-03-12 17:05:52 +01:00
Benjamin Canac
4c30baffe0 chore(vercel): remove useless file 2025-03-12 16:19:12 +01:00
Benjamin Canac
0b411936c4 chore: use ui.nuxt.com url 2025-03-12 16:17:43 +01:00
Benjamin Canac
047582c246 chore(deps): update @nuxt/ui-pro 2025-03-12 16:17:43 +01:00
Benjamin Canac
b00f1206f6 docs: update for v3.0.0 release 2025-03-12 16:17:43 +01:00
Benjamin Canac
9ba5cfe70c chore(github): use ui.nuxt.com url in v3 2025-03-12 16:17:43 +01:00
Benjamin Canac
ee9aca33fd chore(github): use ui2.nuxt.com 2025-03-12 16:17:43 +01:00
Sébastien Chopin
8d29e50340 docs: fix og image 2025-03-12 16:09:41 +01:00
Sébastien Chopin
0ad18d0a7a docs(installation): rename template to ui 2025-03-12 15:39:52 +01:00
Benjamin Canac
4c96909020 chore(release): v3.0.0 2025-03-12 15:33:38 +01:00
Benjamin Canac
06dee66722 chore(package): update release command 2025-03-12 15:04:12 +01:00
Benjamin Canac
8494f50d98 docs: rename dev to v2 2025-03-12 15:04:05 +01:00
570 changed files with 34343 additions and 21747 deletions

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Before reporting a bug, please make sure that you have read through our [v3 documentation](https://ui3.nuxt.dev/) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue%20is%3Aopen%20sort%3Aupdated-desc%20label%3Av3).
Before reporting a bug, please make sure that you have read through our [documentation](https://ui.nuxt.com/) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue%20is%3Aopen%20sort%3Aupdated-desc%20label%3Av3).
- type: textarea
id: env
attributes:
@@ -37,14 +37,14 @@ body:
id: version
attributes:
label: Version
placeholder: v3.0.0-alpha.x
placeholder: v3.0.0
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction
description: Please provide a reproduction link using the Nuxt template https://codesandbox.io/p/devbox/nuxt-ui3-n3sxks or the Vue template https://codesandbox.io/p/devbox/nuxt-ui3-vue-4h5gqn. A minimal [reproduction is required](https://antfu.me/posts/why-reproductions-are-required) unless you are absolutely sure that the issue is obvious and the provided information is enough to understand the problem. If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a "needs reproduction" label. If no reproduction is provided we might close it.
description: Please provide a reproduction link using the Nuxt template https://codesandbox.io/p/devbox/nuxt-ui3-n3sxks or the Vue template https://codesandbox.io/p/devbox/nuxt-ui3-vue-4h5gqn. A minimal [reproduction is required](https://antfu.me/posts/why-reproductions-are-required) unless you are absolutely sure that the issue is obvious and the provided information is enough to understand the problem. If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a "needs reproduction" label. If no reproduction is provided, it will be closed automatically after a while.
placeholder: https://github.com/my/reproduction
validations:
required: true

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Before reporting a bug, please make sure that you have read through our [documentation](https://ui.nuxt.com) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
Before reporting a bug, please make sure that you have read through our [documentation](https://ui2.nuxt.com) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
- type: textarea
id: env
attributes:

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Before requesting a feature, please make sure that you have read through our [v3 documentation](https://ui3.nuxt.dev/) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue%20is%3Aopen%20sort%3Aupdated-desc%20label%3Av3).
Before requesting a feature, please make sure that you have read through our [documentation](https://ui.nuxt.com/) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue%20is%3Aopen%20sort%3Aupdated-desc%20label%3Av3).
- type: textarea
id: description
attributes:

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Before requesting a feature, please make sure that you have read through our [documentation](https://ui.nuxt.com) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
Before requesting a feature, please make sure that you have read through our [documentation](https://ui2.nuxt.com) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
- type: textarea
id: description
attributes:

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Before asking a question, please make sure that you have read through our [v3 documentation](https://ui3.nuxt.dev/) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue%20is%3Aopen%20sort%3Aupdated-desc%20label%3Av3).
Before asking a question, please make sure that you have read through our [documentation](https://ui.nuxt.com/) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue%20is%3Aopen%20sort%3Aupdated-desc%20label%3Av3).
- type: textarea
id: description
attributes:

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Before asking a question, please make sure that you have read through our [documentation](https://ui.nuxt.com) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
Before asking a question, please make sure that you have read through our [documentation](https://ui2.nuxt.com) and existing [issues](https://github.com/nuxt/ui/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
- type: textarea
id: description
attributes:

View File

@@ -0,0 +1,30 @@
Would you be able to provide a [reproduction](https://nuxt.com/docs/community/reporting-bugs/#create-a-minimal-reproduction)? 🙏
<details>
<summary>More info</summary>
### Why do I need to provide a reproduction?
Reproductions make it possible for us to triage and fix issues quickly with a relatively small team. It helps us discover the source of the problem, and also can reveal assumptions you or we might be making.
### What will happen?
If you've provided a reproduction, we'll remove the label and try to reproduce the issue. If we can, we'll mark it as a bug and prioritise it based on its severity and how many people we think it might affect.
If `needs reproduction` labeled issues don't receive any substantial activity (e.g., new comments featuring a reproduction link), they will be closed automatically after a while. That's not because we don't care! At any point, feel free to comment with a reproduction and we'll reopen it.
### How can I create a reproduction?
We have templates to create a minimal reproduction:
* **Nuxt**: https://codesandbox.io/p/devbox/nuxt-ui3-n3sxks
* **Vue**: https://codesandbox.io/p/devbox/nuxt-ui3-vue-4h5gqn
Please ensure that the reproduction is as **minimal** as possible. See more details [in our guide](https://nuxt.com/docs/community/reporting-bugs/#create-a-minimal-reproduction).
You might also find these other articles interesting and/or helpful:
- [The Importance of Reproductions](https://antfu.me/posts/why-reproductions-are-required)
- [How to Generate a Minimal, Complete, and Verifiable Example](https://stackoverflow.com/help/mcve)
</details>

View File

@@ -42,6 +42,8 @@ jobs:
- name: Build application
run: pnpm run docs:build
env:
NODE_OPTIONS: '--max-old-space-size=8192'
- name: Deploy to NuxtHub
uses: nuxt-hub/action@v1

View File

@@ -18,7 +18,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest] # macos-latest, windows-latest
os: ${{ github.event_name == 'pull_request' && fromJSON('["ubuntu-latest"]') || fromJSON('["ubuntu-latest", "windows-latest"]') }} # macos-latest
node: [22]
env:
@@ -50,16 +50,213 @@ jobs:
run: pnpm run typecheck
- name: Test
run: pnpm run test
run: pnpm run test run
- name: Test (vue)
run: pnpm run test:vue
run: pnpm run test:vue run
- name: Build
run: pnpm run build
- name: Build vue fixture
run: pnpm run test:vue:build
- name: Build playground
run: pnpm run dev:build
- name: Build playground (vue)
run: pnpm run dev:vue:build
- name: Publish
# Only publish preview package on ubuntu during PRs
if: matrix.os == 'ubuntu-latest'
run: pnpx pkg-pr-new publish --compact --no-template --pnpm
playground:
needs: build
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: ./playground
permissions:
contents: read
pull-requests: read
strategy:
matrix:
os: [ubuntu-latest] # macos-latest, windows-latest
node: [22]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Store commit SHA
run: |
echo "COMMIT_SHA=$(echo ${{ github.workflow_sha }} | cut -c1-7)" >> $GITHUB_ENV
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Install latest nuxt/ui
run: pnpm install https://pkg.pr.new/@nuxt/ui@${{ env.COMMIT_SHA }} --lockfile-only
- name: Install dependencies
run: pnpm install --ignore-workspace
- name: Prepare
run: pnpm nuxi prepare
- name: Typecheck
run: pnpm run typecheck
starter-nuxt:
needs: build
runs-on: ${{ matrix.os }}
permissions:
contents: read
pull-requests: read
strategy:
matrix:
os: [ubuntu-latest] # macos-latest, windows-latest
node: [22]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
repository: nuxtlabs/nuxt-ui-starter
- name: Store commit SHA
run: |
echo "COMMIT_SHA=$(echo ${{ github.workflow_sha }} | cut -c1-7)" >> $GITHUB_ENV
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Install latest nuxt/ui
run: pnpm install https://pkg.pr.new/@nuxt/ui@${{ env.COMMIT_SHA }} --lockfile-only
- name: Install dependencies
run: pnpm install
- name: Typecheck
run: pnpm run typecheck
- name: Build
run: pnpm run build
starter-vue:
needs: build
runs-on: ${{ matrix.os }}
permissions:
contents: read
pull-requests: read
strategy:
matrix:
os: [ubuntu-latest] # macos-latest, windows-latest
node: [22]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
repository: nuxtlabs/nuxt-ui-vue-starter
- name: Store commit SHA
run: |
echo "COMMIT_SHA=$(echo ${{ github.workflow_sha }} | cut -c1-7)" >> $GITHUB_ENV
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Install latest nuxt/ui
run: pnpm install https://pkg.pr.new/@nuxt/ui@${{ env.COMMIT_SHA }} --lockfile-only
- name: Install dependencies
run: pnpm install
- name: Typecheck
run: pnpm run typecheck
- name: Build
run: pnpm run build
nuxt-ui-pro:
needs: build
# Only run this job if not a fork PR (when push event or PR from same repo)
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: ${{ matrix.os }}
permissions:
contents: read
pull-requests: read
strategy:
matrix:
os: [ubuntu-latest] # macos-latest, windows-latest
node: [22]
env:
NUXT_UI_PRO_LICENSE: ${{ secrets.NUXT_UI_PRO_LICENSE }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
repository: nuxt/ui-pro
token: ${{ secrets.NUXT_GITHUB_TOKEN }}
- name: Store commit SHA
run: |
echo "COMMIT_SHA=$(echo ${{ github.workflow_sha }} | cut -c1-7)" >> $GITHUB_ENV
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: Install latest nuxt/ui
run: pnpm install https://pkg.pr.new/@nuxt/ui@${{ env.COMMIT_SHA }} --lockfile-only
- name: Install dependencies
run: pnpm install
- name: Prepare
run: pnpm run dev:prepare
- name: Typecheck
run: pnpm run typecheck
- name: Build
run: pnpm run build

54
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,54 @@
name: release
on:
push:
tags:
- 'v3*'
jobs:
publish:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest] # macos-latest, windows-latest
node: [22]
env:
NUXT_GITHUB_TOKEN: ${{ secrets.NUXT_GITHUB_TOKEN }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install node
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: pnpm
- name: Install dependencies
run: pnpm install
- name: Prepare
run: pnpm run dev:prepare
- name: Lint
run: pnpm run lint
- name: Typecheck
run: pnpm run typecheck
- name: Test
run: pnpm run test run
- name: Test (vue)
run: pnpm run test:vue run
- name: Publish
run: ./scripts/release.sh
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}

17
.github/workflows/reproduire.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: reproduire
on:
issues:
types: [labeled]
permissions:
issues: write
jobs:
reproduire:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: Hebilicious/reproduire@4b686ae9cbb72dad60f001d278b6e3b2ce40a9ac # v0.0.9-mp
with:
label: needs reproduction

View File

@@ -10,14 +10,16 @@ jobs:
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v9
with:
exempt-issue-labels: triage,v3
stale-issue-message: 'This issue is stale because it has been open for 30 days with no activity.'
stale-issue-label: stale
stale-pr-label: stale
days-before-stale: 30
days-before-close: -1
days-before-stale: -1 # Issues and PR will never be flagged stale automatically.
stale-issue-label: 'needs reproduction' # Label that flags an issue as stale.
only-labels: 'needs reproduction' # Only process these issues
days-before-issue-close: 7
ignore-updates: true
remove-stale-when-updated: false
close-issue-message: This issue was closed because it was open for 7 days without a reproduction.
close-issue-label: closed-by-bot
operations-per-run: 300 #default 30

1
.npmrc
View File

@@ -1,4 +1,3 @@
shamefully-hoist=true
auto-install-peers=true
ignore-workspace-root-check=true
shell-emulator=true

View File

@@ -3,6 +3,9 @@
"commitMessage": "chore(release): v${version}",
"tagName": "v${version}"
},
"npm": {
"publish": false
},
"github": {
"release": true,
"releaseName": "v${version}",

View File

@@ -1,5 +1,164 @@
# Changelog
## [3.1.1](https://github.com/nuxt/ui/compare/v3.1.0...v3.1.1) (2025-05-02)
### Features
* **useOverlay:** add `closeAll` method ([#3984](https://github.com/nuxt/ui/issues/3984)) ([ac4c194](https://github.com/nuxt/ui/commit/ac4c1946ec399aec59b4bce9d538e3ff67868abf))
* **useOverlay:** add `isOpen` method to check overlay state ([#4041](https://github.com/nuxt/ui/issues/4041)) ([a4f3f6d](https://github.com/nuxt/ui/commit/a4f3f6d531f9c0281f99085a6688d296f8f13f2f))
### Bug Fixes
* **Calendar:** add `place-items-center` to grid row ([#4034](https://github.com/nuxt/ui/issues/4034)) ([8dfdd63](https://github.com/nuxt/ui/commit/8dfdd63ce3b3a0e904f7c013c774cf9aaf46b240))
* **defineShortcuts:** bring back `meta` to `ctrl` convert on non macos platforms ([f3b8b17](https://github.com/nuxt/ui/commit/f3b8b17dc5f43936ef7ffb11c1ed7f9a5f94d0bb)), closes [#3869](https://github.com/nuxt/ui/issues/3869) [#3318](https://github.com/nuxt/ui/issues/3318)
* **module:** support `nuxt-nightly` ([#3996](https://github.com/nuxt/ui/issues/3996)) ([bc0a296](https://github.com/nuxt/ui/commit/bc0a296f9d68ca72cd991b11cd3489b63c7b13db))
* **NavigationMenu:** remove `sm:w-auto` from content slot ([aebf0b3](https://github.com/nuxt/ui/commit/aebf0b3dca50c51c093cb6abf16c4fd995fc1b39)), closes [#3987](https://github.com/nuxt/ui/issues/3987)
* **RadioGroup:** improve items `value` field type ([#3995](https://github.com/nuxt/ui/issues/3995)) ([195773e](https://github.com/nuxt/ui/commit/195773ec7dac12ccc3a0a67867751e8ca634cc04))
* **templates:** put back args to watch in dev ([#4033](https://github.com/nuxt/ui/issues/4033)) ([c5bdec0](https://github.com/nuxt/ui/commit/c5bdec0f64963ef602975270a09a1ee795cdacf9))
* **theme:** add missing `border-bg` / `divide-bg` utilities ([82b5f32](https://github.com/nuxt/ui/commit/82b5f322ebd8a08e63588122bd4ef567dcb8ba8c))
* **theme:** add missing `ring-offset-*` utilities ([#3992](https://github.com/nuxt/ui/issues/3992)) ([e5df026](https://github.com/nuxt/ui/commit/e5df0269935be59df759fe0e1378acb2b0d9014a))
* **theme:** define default shades for named tailwindcss colors ([8acf3c5](https://github.com/nuxt/ui/commit/8acf3c51db6c2f9443d04be6ba7d9f062c5cf8ab)), closes [#3977](https://github.com/nuxt/ui/issues/3977)
* **theme:** improve app config types for `ui` object ([591d59f](https://github.com/nuxt/ui/commit/591d59fe89f1d9bf016c121bf9160f73fe0a290d)), closes [#3579](https://github.com/nuxt/ui/issues/3579)
* **theme:** use `[@theme](https://github.com/theme) inline` to properly reference css variables ([6131871](https://github.com/nuxt/ui/commit/6131871a0d124c5942d60dc5dff20981e8542e51)), closes [#4018](https://github.com/nuxt/ui/issues/4018)
* **useOverlay:** improve types and docs ([#4012](https://github.com/nuxt/ui/issues/4012)) ([39e29fc](https://github.com/nuxt/ui/commit/39e29fccf1840c723a13237d65002501b2829b70))
## [3.1.0](https://github.com/nuxt/ui/compare/v3.0.2...v3.1.0) (2025-04-24)
### ⚠ BREAKING CHANGES
* **OverlayProvider:** return an overlay instance from `.open()` (#3829)
### Features
* **App:** add global `portal` prop ([#3688](https://github.com/nuxt/ui/issues/3688)) ([29fa462](https://github.com/nuxt/ui/commit/29fa46276d6bf69b5b87880c476c6f778c2820bf))
* **Carousel:** add `select` event ([#3678](https://github.com/nuxt/ui/issues/3678)) ([22edfd7](https://github.com/nuxt/ui/commit/22edfd708ae3eeadbd4ff6c830cdfd5632948286))
* **CheckboxGroup:** new component ([#3862](https://github.com/nuxt/ui/issues/3862)) ([9c3d53a](https://github.com/nuxt/ui/commit/9c3d53a02d6254f6b5c90e5fed826b8aefcdb042))
* **components:** add new `content-top` and `content-bottom` slots ([#3886](https://github.com/nuxt/ui/issues/3886)) ([1a46394](https://github.com/nuxt/ui/commit/1a463946681e152aa18372118d0fef4a7d8055a5))
* **Form:** add `attach` prop to opt-out of nested form attachement ([#3939](https://github.com/nuxt/ui/issues/3939)) ([1a0d7a3](https://github.com/nuxt/ui/commit/1a0d7a3103cf7591b019ef3ad685e2f3786ef6f2))
* **Form:** export loading state ([#3861](https://github.com/nuxt/ui/issues/3861)) ([fdee252](https://github.com/nuxt/ui/commit/fdee2522bb9d8361ff3e9fdd4aa2350be8e49b05))
* **InputMenu/SelectMenu:** handle `resetSearchTermOnSelect` ([cea881a](https://github.com/nuxt/ui/commit/cea881abdc139b39df89b503cf2ab872f4246c8f)), closes [#3782](https://github.com/nuxt/ui/issues/3782)
* **InputNumber:** add support for `stepSnapping` & `disableWheelChange` props ([#3731](https://github.com/nuxt/ui/issues/3731)) ([f5e6284](https://github.com/nuxt/ui/commit/f5e62849c9313063396ab0e3a9b7d22d98ef69bc))
* **locale:** add Bulgarian language ([#3783](https://github.com/nuxt/ui/issues/3783)) ([a0c9731](https://github.com/nuxt/ui/commit/a0c9731f634020e76aa98a9a68d673591d35e8c9))
* **locale:** add Kazakh language ([#3875](https://github.com/nuxt/ui/issues/3875)) ([43153c4](https://github.com/nuxt/ui/commit/43153c4e91034b728059e7a9bed05888e48f8890))
* **locale:** add Tajik language ([#3850](https://github.com/nuxt/ui/issues/3850)) ([f42a79b](https://github.com/nuxt/ui/commit/f42a79b5efe8dc65430a83799ebb0ee737773820))
* **locale:** add Uyghur language ([#3878](https://github.com/nuxt/ui/issues/3878)) ([b7fc69b](https://github.com/nuxt/ui/commit/b7fc69baa718ff65b3988d0fa9f143306fa8fac4))
* **Modal/Popover/Slideover:** add `close:prevent` event ([#3958](https://github.com/nuxt/ui/issues/3958)) ([f486423](https://github.com/nuxt/ui/commit/f4864233812eac0ed37e0a2d076a95c285a22c01))
* **module:** define default color shades ([#3916](https://github.com/nuxt/ui/issues/3916)) ([7ac7aa9](https://github.com/nuxt/ui/commit/7ac7aa9ba73b6aca1bc29b0de2e95c60b2700135))
* **module:** define neutral utilities ([#3629](https://github.com/nuxt/ui/issues/3629)) ([d49e0da](https://github.com/nuxt/ui/commit/d49e0dadeea2a58e05e60b2c461b29ce1d334d2b))
* **module:** dynamic `rounded-*` utilities ([#3906](https://github.com/nuxt/ui/issues/3906)) ([f9737c8](https://github.com/nuxt/ui/commit/f9737c8f401bf8bc5307674fad6defe2aeeeb907))
* **OverlayProvider:** return an overlay instance from `.open()` ([#3829](https://github.com/nuxt/ui/issues/3829)) ([f3098df](https://github.com/nuxt/ui/commit/f3098df84a3b7f58f7ccc1233bc8b45eab99ee10))
* **PinInput:** add `autofocus` / `autofocus-delay` props ([0456670](https://github.com/nuxt/ui/commit/0456670dac1153340220603c8c116e3b71f72ae7)), closes [#3717](https://github.com/nuxt/ui/issues/3717)
* **RadioGroup:** add `card` and `table` variants ([#3178](https://github.com/nuxt/ui/issues/3178)) ([4d138ad](https://github.com/nuxt/ui/commit/4d138ad6719a074f5f994006d12745ca05bec9c4))
* **Select:** handle `onSelect` field in items ([8640831](https://github.com/nuxt/ui/commit/864083156a79dfb5d0be868658b7f9fc77570178))
* **Table:** conditionally apply classes to `tr` and `td` ([#3866](https://github.com/nuxt/ui/issues/3866)) ([80dfa88](https://github.com/nuxt/ui/commit/80dfa88ea442571ee1dc673317cc7baa8cacd8a3))
* **Tabs:** add `list-leading` and `list-trailing` slots ([#3837](https://github.com/nuxt/ui/issues/3837)) ([3447a06](https://github.com/nuxt/ui/commit/3447a062b636a469089d6e9bdcfcb3dce9063ee5))
* **Textarea:** add `autoresize-delay` prop ([06414d3](https://github.com/nuxt/ui/commit/06414d344b151ad6e1a3225a9f5f1f76d58d319c)), closes [#3730](https://github.com/nuxt/ui/issues/3730)
* **Textarea:** add `icon`, `loading`, etc. props to match Input ([cb193f1](https://github.com/nuxt/ui/commit/cb193f1d25b5c73ca03dcf10864800350dd1c290))
* **Textarea:** add `resize-none` class with `autoresize` prop ([ffafd81](https://github.com/nuxt/ui/commit/ffafd81e1ed25074430668c792e5e1c6afc22bd0))
* **unplugin:** routing support for inertia ([#3845](https://github.com/nuxt/ui/issues/3845)) ([d059efc](https://github.com/nuxt/ui/commit/d059efca258da7ae5116e829189a492824ac1d87))
### Bug Fixes
* **Accordion:** use `div` instead of `h3` for header tag ([75e4792](https://github.com/nuxt/ui/commit/75e4792f7f00c55229253289c4f806f2b6fc9854)), closes [#3963](https://github.com/nuxt/ui/issues/3963)
* **Alert/Toast:** display actions when using slots ([5086363](https://github.com/nuxt/ui/commit/50863635d653c8083772046ddc5b828fba7047d0)), closes [#3950](https://github.com/nuxt/ui/issues/3950)
* **Carousel:** move arrows inside container on mobile ([d339dcb](https://github.com/nuxt/ui/commit/d339dcbfb8fe244bd198d247d8448e3ef856dfef)), closes [#3813](https://github.com/nuxt/ui/issues/3813)
* **CheckboxGroup:** proxy slots & `ui` prop ([bc06185](https://github.com/nuxt/ui/commit/bc061852822edd2dfb832a46dd6388123ec5771e))
* **CommandPalette:** consistent alignement with other components ([d25265c](https://github.com/nuxt/ui/commit/d25265c8b7d34e01af8827d9af5eccb98bf30e9e))
* **CommandPalette:** increase input font size to avoid zoom ([d227a10](https://github.com/nuxt/ui/commit/d227a105d8d409ea0753153afaecf639ddb80fed))
* **CommandPalette:** prevent hover background on disabled items ([ba534f1](https://github.com/nuxt/ui/commit/ba534f18b94383c97b2654d892ee4b8b024b3fab))
* **components:** refactor types after `@nuxt/module-builder` upgrade ([#3855](https://github.com/nuxt/ui/issues/3855)) ([39c861a](https://github.com/nuxt/ui/commit/39c861a64bbd452256ebd1a14a257b94c35855d4))
* **components:** respect `transform-origin` in popper content ([#3919](https://github.com/nuxt/ui/issues/3919)) ([01d8dc7](https://github.com/nuxt/ui/commit/01d8dc72adb0b32ad68bb4a98bf24b17f435a89c))
* **ContextMenu/DropdownMenu:** handle RTL mode ([#3744](https://github.com/nuxt/ui/issues/3744)) ([1ae5cc0](https://github.com/nuxt/ui/commit/1ae5cc09cb2eca6b6f53eb04db9dcc731b696cae))
* **ContextMenuContent/DropdownMenuContent:** remove unwanted `any` ([#3741](https://github.com/nuxt/ui/issues/3741)) ([97274f1](https://github.com/nuxt/ui/commit/97274f15b8bfe457e7e206f81b32e3febf0f875d))
* **Form:** input and output type inference ([#3938](https://github.com/nuxt/ui/issues/3938)) ([f429498](https://github.com/nuxt/ui/commit/f42949820be9be9fca41abc653dc12c033e1eeec))
* **Form:** loses focus on submit ([#3796](https://github.com/nuxt/ui/issues/3796)) ([8e78eb1](https://github.com/nuxt/ui/commit/8e78eb15c85beef1c814206c4a192d4eb00a7e86))
* **InputMenu/Select/SelectMenu:** add `min-w-fit` to `content` slot ([#3922](https://github.com/nuxt/ui/issues/3922)) ([f6b3761](https://github.com/nuxt/ui/commit/f6b376110c8bee2c41ae3137bb972aad402ebff1))
* **InputMenu/SelectMenu:** correctly call `onSelect` events ([#3735](https://github.com/nuxt/ui/issues/3735)) ([f25fed5](https://github.com/nuxt/ui/commit/f25fed58e988b304e79cdb536d544d257395cf89))
* **InputMenu/SelectMenu:** prevent `disabled` items to be selected ([8435a0f](https://github.com/nuxt/ui/commit/8435a0fe1622eb5b6863b6e4751c9d2d1be36db9)), closes [#3474](https://github.com/nuxt/ui/issues/3474)
* **InputMenu/SelectMenu:** remove `valueKey` string case ([9ca213b](https://github.com/nuxt/ui/commit/9ca213bd3340492d7503a34bd142e1f79a697050)), closes [#3949](https://github.com/nuxt/ui/issues/3949) [#3331](https://github.com/nuxt/ui/issues/3331)
* **InputMenu/SelectMenu:** support arbitrary `value` ([#3779](https://github.com/nuxt/ui/issues/3779)) ([52a97e2](https://github.com/nuxt/ui/commit/52a97e2df7903f91e3134931eb0d6bd4c528f71f))
* **InputMenu:** emit `change` on multiple item removal ([9d2fed1](https://github.com/nuxt/ui/commit/9d2fed125013e3bbfbf9435678729cd05254a5e8)), closes [#3756](https://github.com/nuxt/ui/issues/3756)
* **Link:** proxy `download` property ([#3879](https://github.com/nuxt/ui/issues/3879)) ([47cdc2e](https://github.com/nuxt/ui/commit/47cdc2e1d8cd9803ebc954ccae110d62b9a08779))
* **NavigationMenu:** add `sm:w-auto` content slot ([abe0859](https://github.com/nuxt/ui/commit/abe0859691e06564f68335bd82dcd121e976408e)), closes [#3788](https://github.com/nuxt/ui/issues/3788)
* **Skeleton:** improve accessibility ([#3613](https://github.com/nuxt/ui/issues/3613)) ([3484832](https://github.com/nuxt/ui/commit/3484832822015a224ce6fbeae5132018875557e6))
* **Stepper:** ui prop override on `icon` and `content` slots ([1d45980](https://github.com/nuxt/ui/commit/1d459803dc052a16b8966ee89c71646bf6ef1c16)), closes [#3785](https://github.com/nuxt/ui/issues/3785)
* **Table:** improve `data` reactivity ([#3967](https://github.com/nuxt/ui/issues/3967)) ([6e27304](https://github.com/nuxt/ui/commit/6e27304d8ca459a04667bac404084264a8cf58fd))
* **Table:** pass header `colspan` to `th` ([#3926](https://github.com/nuxt/ui/issues/3926)) ([122e8ac](https://github.com/nuxt/ui/commit/122e8ac8f41ba093cd350c3ce642263263f77296))
* **Tree:** simplify reusable template types ([#3836](https://github.com/nuxt/ui/issues/3836)) ([3deed4c](https://github.com/nuxt/ui/commit/3deed4c271cad4adc2a4c47d5dd02e95a14ce11a))
* **types:** allow color identifiers with dashes ([#3896](https://github.com/nuxt/ui/issues/3896)) ([e5a1e26](https://github.com/nuxt/ui/commit/e5a1e26f9db763b54caed4ca313f44d1b5fe269d))
* **types:** handle `ClassValue` in `ui` prop ([eea1415](https://github.com/nuxt/ui/commit/eea14155aa612649bc969d806ec5df4295945c70)), closes [#3860](https://github.com/nuxt/ui/issues/3860)
* **types:** improve dynamic slots ([#3857](https://github.com/nuxt/ui/issues/3857)) ([8dd9d08](https://github.com/nuxt/ui/commit/8dd9d08209e47a7d9a5654db4fb936b4cbcfc021))
* **usePortal:** adjust portal target resolution logic ([#3954](https://github.com/nuxt/ui/issues/3954)) ([db11db6](https://github.com/nuxt/ui/commit/db11db6ff1ce4b27a66aaa03f07870ba36426181))
* **vite:** vitest skipping nuxt imports transformations ([#3925](https://github.com/nuxt/ui/issues/3925)) ([c31bffa](https://github.com/nuxt/ui/commit/c31bffad1b8afeda584bca8c73bb7f790eb12a9f))
## [3.0.2](https://github.com/nuxt/ui/compare/v3.0.1...v3.0.2) (2025-03-28)
### Features
* **Calendar:** allow year and month buttons styling ([#3672](https://github.com/nuxt/ui/issues/3672)) ([4a2b77d](https://github.com/nuxt/ui/commit/4a2b77d86c28806234002340eda39de4dc78cce0))
* **locale:** add Armenian language ([#3664](https://github.com/nuxt/ui/issues/3664)) ([c76f590](https://github.com/nuxt/ui/commit/c76f5900970e3f5c451192b1207ccea04771e8b3))
* **Table:** add `empty` prop ([afff54f](https://github.com/nuxt/ui/commit/afff54fecd31497238461e0a44abd8668ed734c3))
### Bug Fixes
* **Avatar:** proxy `$attrs` to default slot ([#3712](https://github.com/nuxt/ui/issues/3712)) ([88f349d](https://github.com/nuxt/ui/commit/88f349d0d74eb1c2ce5066818731759c25a9e83e))
* **Button:** use `focus:outline-none` instead of `focus:outline-hidden` ([c231fe5](https://github.com/nuxt/ui/commit/c231fe5f26ca7614df46a7ec8a5ce7f4ec8884e7)), closes [#3658](https://github.com/nuxt/ui/issues/3658)
* **CommandPalette:** use `group.id` as key ([bc61d29](https://github.com/nuxt/ui/commit/bc61d29cce531715a6279444845f02a002a22af7))
* **components:** improve generic types ([#3331](https://github.com/nuxt/ui/issues/3331)) ([b998354](https://github.com/nuxt/ui/commit/b9983549a4b743724ea3ef99cc4a243f5ca41e53))
* **Container:** add `w-full` class ([df00149](https://github.com/nuxt/ui/commit/df001495980647cab1e67fd16154f1bc778de5e2))
* **defineLocale/defineShortcuts:** remove `@__NO_SIDE_EFFECTS__` ([82e2665](https://github.com/nuxt/ui/commit/82e26655a40782555299516f32a76046fa0dbd3a))
* **Drawer:** remove `fadeFromIndex` prop proxy ([f7604e5](https://github.com/nuxt/ui/commit/f7604e565f717001a4d4c2974cf23559a3f01c21))
* **Form:** clear dirty state after submit ([#3692](https://github.com/nuxt/ui/issues/3692)) ([3dd88ba](https://github.com/nuxt/ui/commit/3dd88bacecb2945efba8cc3cb4fe59fcbc056e9a))
* **FormField:** add `help` to `aria-describedby` attribute ([#3691](https://github.com/nuxt/ui/issues/3691)) ([20c3392](https://github.com/nuxt/ui/commit/20c33920d005332db3c83f33a8c54c7c227ce0a0))
* **InputMenu/SelectMenu:** empty search results ([94b6e52](https://github.com/nuxt/ui/commit/94b6e520f5ccf011204e953421fcc5b44b637e51))
* **InputMenu:** reset `searchTerm` on `update:open` ([3074632](https://github.com/nuxt/ui/commit/3074632523e67fa6a0ad3d9a71e5692c285bdc3a)), closes [#3620](https://github.com/nuxt/ui/issues/3620)
* **Link:** handle `aria-current` like `NuxtLink` / `RouterLink` ([c531d02](https://github.com/nuxt/ui/commit/c531d0248be7863980a1f676643c2dea8301c009))
* **Link:** prevent `active="true"` binding on html ([d73768b](https://github.com/nuxt/ui/commit/d73768b70453d60dd4186a996c1cf808b0294bf6))
* **Link:** properly pick all `aria-*` & `data-*` attrs ([ade16b7](https://github.com/nuxt/ui/commit/ade16b76cf535924a8d0f402b4d5d65cb67a55eb))
* **Link:** proxy `onClick` ([370054b](https://github.com/nuxt/ui/commit/370054b20c0201c9dba84ddfcd1e916594619b93)), closes [#3631](https://github.com/nuxt/ui/issues/3631)
* **NavigationMenu:** add `z-index` on viewport ([0095d89](https://github.com/nuxt/ui/commit/0095d8916bf361c0c89972e2f86b79850510c6a9)), closes [#3654](https://github.com/nuxt/ui/issues/3654)
* **Switch:** prevent transition on focus outline ([68787b2](https://github.com/nuxt/ui/commit/68787b26fdf2bd5f9d9e812e5bfddb19abe45d1d))
* **Table:** wrong condition on `caption` slot ([4ebb94c](https://github.com/nuxt/ui/commit/4ebb94cd7ef909b3547bce0922f75fe3ff74de4c))
* **Tabs:** remove `focus:outline-hidden` class ([1769d5e](https://github.com/nuxt/ui/commit/1769d5ed6ea46b1f7eafdc48cb6456512229f98b))
* **types:** add missing export for ButtonGroup ([#3709](https://github.com/nuxt/ui/issues/3709)) ([e7e6745](https://github.com/nuxt/ui/commit/e7e674559981177ad08be42418746060d7737df9))
* **useOverlay:** refine `open` method type to infer close emit return type ([#3716](https://github.com/nuxt/ui/issues/3716)) ([bd99c2d](https://github.com/nuxt/ui/commit/bd99c2d850d57baccc51e049c0b578a6fc6ab431))
* **vue:** mock `nuxtApp.hooks` & `useRuntimeHook` ([23bfeb9](https://github.com/nuxt/ui/commit/23bfeb937004d619187a67fb43e4c76b13d00069))
## [3.0.1](https://github.com/nuxt/ui/compare/v3.0.0...v3.0.1) (2025-03-21)
### ⚠ BREAKING CHANGES
* **Form:** drop explicit support for `zod` and `valibot` (#3617)
### Features
* **components:** handle events in `content` prop ([5dec0e1](https://github.com/nuxt/ui/commit/5dec0e16e28549b8833aaab17a87fada63d6598c))
* **locale:** add Catalan language ([#3550](https://github.com/nuxt/ui/issues/3550)) ([53cf1b4](https://github.com/nuxt/ui/commit/53cf1b4c14a2a0e076e1e77688852e6bd0a28a74))
* **locale:** add Central Kurdish language ([#3566](https://github.com/nuxt/ui/issues/3566)) ([b2034cc](https://github.com/nuxt/ui/commit/b2034ccc91eec6a2842c6f83d159e5aa6fd5f2fd))
* **locale:** add Romanian language ([#3587](https://github.com/nuxt/ui/issues/3587)) ([0229b0f](https://github.com/nuxt/ui/commit/0229b0fd4644a97db7eb3154c3c87a26634dcfbb))
* **locale:** add Urdu language ([#3611](https://github.com/nuxt/ui/issues/3611)) ([126ba23](https://github.com/nuxt/ui/commit/126ba2326f8153e155e1013db92c6ee417117610))
* **locale:** add Uzbek language ([#3548](https://github.com/nuxt/ui/issues/3548)) ([302e04b](https://github.com/nuxt/ui/commit/302e04bd77ae8b165046b264c8d23626e92f8fb5))
### Bug Fixes
* **Calendar:** grey out days outside of displayed month ([#3639](https://github.com/nuxt/ui/issues/3639)) ([a516866](https://github.com/nuxt/ui/commit/a5168666b7dff08e714d57f497737e7a670f457c))
* **ContextMenu/DropdownMenu:** remove `any` from `proxySlots` ([#3623](https://github.com/nuxt/ui/issues/3623)) ([764c41a](https://github.com/nuxt/ui/commit/764c41a0c60dd1c12d39a86af9f5f11b9e6cdc8c))
* **Modal/Slideover/Toast:** prevent unnecessary close instantiation ([f4c417d](https://github.com/nuxt/ui/commit/f4c417d9ef5409b52084bdf9d8cbccee3139709f))
* **module:** handle tailwindcss import without `theme(static)` ([#3630](https://github.com/nuxt/ui/issues/3630)) ([ecff9ab](https://github.com/nuxt/ui/commit/ecff9abc720bdda3a279d5bcfb7b477ff885f2e4))
* **module:** mark functions used in exports as pure ([#3604](https://github.com/nuxt/ui/issues/3604)) ([57efc78](https://github.com/nuxt/ui/commit/57efc78a3b3fa4a54bcd13df47d570a18fba2bc4))
* **RadioGroup:** handle `disabled` on items ([fe0bd83](https://github.com/nuxt/ui/commit/fe0bd83d11b0dfa53b58d423bc917f8e21d73444)), closes [nuxt/ui-pro#911](https://github.com/nuxt/ui-pro/issues/911)
* **Table:** allow links to be opened when [@select](https://github.com/select) is used ([#3580](https://github.com/nuxt/ui/issues/3580)) ([e80cc15](https://github.com/nuxt/ui/commit/e80cc1592fb244dd7692486a4c1ca5b1c2008112))
* **types:** add missing export for Icon ([#3568](https://github.com/nuxt/ui/issues/3568)) ([5e62493](https://github.com/nuxt/ui/commit/5e624933216db95cbfd1b8034b2eb0f13846ae55))
* **unplugin:** include `@compodium/examples` in auto-imports paths ([#3585](https://github.com/nuxt/ui/issues/3585)) ([cc504b8](https://github.com/nuxt/ui/commit/cc504b8a4b69dd76b49659d5c206ef23dcb9e475))
* **useLocale:** unique symbol to use in `@nuxt/ui-pro` ([#3603](https://github.com/nuxt/ui/issues/3603)) ([dec2730](https://github.com/nuxt/ui/commit/dec2730aaea1327434837cfa022ea04056757cbf))
* **vue:** missing unhead context ([#3589](https://github.com/nuxt/ui/issues/3589)) ([0897e9e](https://github.com/nuxt/ui/commit/0897e9ef05fbee4f021f317bb7c2d0b7007f1b75))
### Code Refactoring
* **Form:** drop explicit support for `zod` and `valibot` ([#3617](https://github.com/nuxt/ui/issues/3617)) ([9a4bb34](https://github.com/nuxt/ui/commit/9a4bb34d7d14add0a3199103f4b583e8307d1d6d))
## [3.0.0](https://github.com/nuxt/ui/compare/v3.0.0-beta.4...v3.0.0) (2025-03-12)
## [3.0.0-beta.4](https://github.com/nuxt/ui/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-03-12)
### Features

View File

@@ -11,31 +11,35 @@
[![License][license-src]][license-href]
[![Nuxt][nuxt-src]][nuxt-href]
We're thrilled to introduce Nuxt UI v3, a significant upgrade to our UI library that delivers extensive improvements and robust new capabilities. This major update harnesses the combined strengths of [Reka UI](https://reka-ui.com/), [Tailwind CSS v4](https://tailwindcss.com/), and [Tailwind Variants](https://www.tailwind-variants.org/) to offer developers an unparalleled set of tools for creating sophisticated, accessible, and highly performant user interfaces.
Nuxt UI harnesses the combined strengths of [Reka UI](https://reka-ui.com/), [Tailwind CSS](https://tailwindcss.com/), and [Tailwind Variants](https://www.tailwind-variants.org/) to offer developers an unparalleled set of tools for creating sophisticated, accessible, and highly performant user interfaces.
> [!NOTE]
> You are on the `v3` development branch, check out the [dev branch](https://github.com/nuxt/ui/tree/dev) for Nuxt UI v2.
> You are on the `v3` development branch, check out the [v2 branch](https://github.com/nuxt/ui/tree/v2) for Nuxt UI v2.
> [!TIP]
> **Looking for more components ?**
> Check out [Nuxt UI Pro](https://ui.nuxt.com/pro), a collection of premium Vue components, composables, and utilities built on top of Nuxt UI for faster and more powerful app development.
## Documentation
Visit https://ui3.nuxt.dev to explore the documentation.
Visit https://ui.nuxt.com to explore the documentation.
## Installation
```bash [pnpm]
pnpm add @nuxt/ui@next
pnpm add @nuxt/ui
```
```bash [yarn]
yarn add @nuxt/ui@next
yarn add @nuxt/ui
```
```bash [npm]
npm install @nuxt/ui@next
npm install @nuxt/ui
```
```bash [bun]
bun add @nuxt/ui@next
bun add @nuxt/ui
```
### Nuxt
@@ -51,11 +55,11 @@ export default defineNuxtConfig({
2. Import Tailwind CSS and Nuxt UI in your CSS:
```css [assets/css/main.css]
@import "tailwindcss" theme(static);
@import "tailwindcss";
@import "@nuxt/ui";
```
Learn more in the [installation guide](https://ui3.nuxt.dev/getting-started/installation/nuxt).
Learn more in the [installation guide](https://ui.nuxt.com/getting-started/installation/nuxt).
### Vue
@@ -98,11 +102,22 @@ app.mount('#app')
3. Import Tailwind CSS and Nuxt UI in your CSS:
```css [assets/main.css]
@import "tailwindcss" theme(static);
@import "tailwindcss";
@import "@nuxt/ui";
```
Learn more in the [installation guide](https://ui3.nuxt.dev/getting-started/installation/vue).
Learn more in the [installation guide](https://ui.nuxt.com/getting-started/installation/vue).
## Contribution
Thank you for considering contributing to Nuxt UI. Here are a few ways you can get involved:
- Reporting Bugs: If you come across any bugs or issues, please check out the reporting bugs guide to learn how to submit a bug report.
- Suggestions: Have any thoughts to enhance Nuxt UI? We'd love to hear them! Check out the [contribution guide](https://ui.nuxt.com/getting-started/contribution) to share your suggestions.
## Local Development
Follow the docs to [set up your local development environment](https://ui.nuxt.com/getting-started/contribution#local-development) and contribute.
## Credits
@@ -119,7 +134,7 @@ Learn more in the [installation guide](https://ui3.nuxt.dev/getting-started/inst
Licensed under the [MIT license](https://github.com/nuxt/ui/blob/v3/LICENSE.md).
<!-- Badges -->
[npm-version-src]: https://img.shields.io/npm/v/@nuxt/ui/next.svg?style=flat&colorA=18181B&colorB=28CF8D
[npm-version-src]: https://img.shields.io/npm/v/@nuxt/ui/latest.svg?style=flat&colorA=18181B&colorB=28CF8D
[npm-version-href]: https://npmjs.com/package/@nuxt/ui
[npm-downloads-src]: https://img.shields.io/npm/dm/@nuxt/ui.svg?style=flat&colorA=18181B&colorB=28CF8D

View File

@@ -7,10 +7,13 @@ export default defineBuildConfig({
'./src/vite'
],
rollup: {
emitCJS: true
},
replace: {
'process.env.DEV': 'false'
replace: {
delimiters: ['', ''],
values: {
// Used in development to import directly from theme
'process.argv.includes(\'--uiDev\')': 'false'
}
}
},
hooks: {
'mkdist:entry:options'(ctx, entry, options) {

View File

@@ -6,7 +6,7 @@
},
"dependencies": {
"citty": "^0.1.6",
"consola": "^3.4.0",
"consola": "^3.4.2",
"pathe": "^2.0.3",
"scule": "^1.3.0"
}

View File

@@ -31,13 +31,10 @@ const component = ({ name, primitive, pro, prose, content }) => {
? `
<script lang="ts">
import type { AppConfig } from '@nuxt/schema'
import _appConfig from '#build/app.config'
import theme from '#build/${path}/${prose ? 'prose/' : ''}${content ? 'content/' : ''}${kebabName}'
import { tv } from '${pro ? '#ui/utils/tv' : '../utils/tv'}'
import type { ComponentConfig } from '../types/utils'
const appConfig${camelName} = _appConfig as AppConfig & { ${key}: { ${prose ? 'prose: { ' : ''}${camelName}: Partial<typeof theme> } }${prose ? ' }' : ''}
const ${camelName} = tv({ extend: tv(theme), ...(appConfig${camelName}.${key}?.${prose ? 'prose?.' : ''}${camelName} || {}) })
type ${upperName} = ComponentConfig<typeof theme, AppConfig, ${upperName}${pro ? `, '${key}'` : ''}>
export interface ${upperName}Props {
/**
@@ -46,7 +43,7 @@ export interface ${upperName}Props {
*/
as?: any
class?: any
ui?: Partial<typeof ${camelName}.slots>
ui?: ${upperName}['slots']
}
export interface ${upperName}Slots {
@@ -55,38 +52,37 @@ export interface ${upperName}Slots {
</script>
<script setup lang="ts">
import { computed } from 'vue'
import { Primitive } from 'reka-ui'
import { useAppConfig } from '#imports'
import { tv } from '../utils/tv'
const props = defineProps<${upperName}Props>()
defineSlots<${upperName}Slots>()
const ui = ${camelName}()
const appConfig = useAppConfig() as ${upperName}['AppConfig']
const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.${camelName} || {}) })())
</script>
<template>
<Primitive :as="as" :class="ui.root({ class: [props.class, props.ui?.root] })">
<Primitive :as="as" :class="ui.root({ class: [props.ui?.root, props.class] })">
<slot />
</Primitive>
</template>
`
: `
<script lang="ts">
import type { VariantProps } from 'tailwind-variants'
import type { ${upperName}RootProps, ${upperName}RootEmits } from 'reka-ui'
import type { AppConfig } from '@nuxt/schema'
import _appConfig from '#build/app.config'
import theme from '#build/${path}/${prose ? 'prose/' : ''}${content ? 'content/' : ''}${kebabName}'
import { tv } from '${pro ? '#ui/utils/tv' : '../utils/tv'}'
import type { ComponentConfig } from '../types/utils'
const appConfig${camelName} = _appConfig as AppConfig & { ${key}: { ${prose ? 'prose: { ' : ''}${camelName}: Partial<typeof theme> } }${prose ? ' }' : ''}
const ${camelName} = tv({ extend: tv(theme), ...(appConfig${camelName}.${key}?.${prose ? 'prose?.' : ''}${camelName} || {}) })
type ${upperName}Variants = VariantProps<typeof ${camelName}>
type ${upperName} = ComponentConfig<typeof theme, AppConfig, ${upperName}${pro ? `, '${key}'` : ''}>
export interface ${upperName}Props extends Pick<${upperName}RootProps> {
class?: any
ui?: Partial<typeof ${camelName}.slots>
ui?: ${upperName}['slots']
}
export interface ${upperName}Emits extends ${upperName}RootEmits {}
@@ -95,20 +91,25 @@ export interface ${upperName}Slots {}
</script>
<script setup lang="ts">
import { computed } from 'vue'
import { ${upperName}Root, useForwardPropsEmits } from 'reka-ui'
import { reactivePick } from '@vueuse/core'
import { useAppConfig } from '#imports'
import { tv } from '../utils/tv'
const props = defineProps<${upperName}Props>()
const emits = defineEmits<${upperName}Emits>()
const slots = defineSlots<${upperName}Slots>()
const appConfig = useAppConfig() as ${upperName}['AppConfig']
const rootProps = useForwardPropsEmits(reactivePick(props), emits)
const ui = ${camelName}()
const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.${camelName} || {}) })())
</script>
<template>
<${upperName}Root v-bind="rootProps" :class="ui.root({ class: [props.class, props.ui?.root] })" />
<${upperName}Root v-bind="rootProps" :class="ui.root({ class: [props.ui?.root, props.class] })" />
</template>
`
}

View File

@@ -1,7 +1,6 @@
<script setup lang="ts">
// import { withoutTrailingSlash } from 'ufo'
import { withoutTrailingSlash } from 'ufo'
import colors from 'tailwindcss/colors'
// import { debounce } from 'perfect-debounce'
const route = useRoute()
const appConfig = useAppConfig()
@@ -12,17 +11,8 @@ const { data: files } = useLazyAsyncData('search', () => queryCollectionSearchSe
server: false
})
const searchTerm = ref('')
// watch(searchTerm, debounce((query: string) => {
// if (!query) {
// return
// }
// useTrackEvent('Search', { props: { query: `${query} - ${searchTerm.value?.commandPaletteRef.results.length} results` } })
// }, 500))
const links = useLinks()
const searchLinks = useSearchLinks()
const color = computed(() => colorMode.value === 'dark' ? (colors as any)[appConfig.ui.colors.neutral][900] : 'white')
const radius = computed(() => `:root { --ui-radius: ${appConfig.theme.radius}rem; }`)
const blackAsPrimary = computed(() => appConfig.theme.blackAsPrimary ? `:root { --ui-primary: black; } .dark { --ui-primary: white; }` : ':root {}')
@@ -33,8 +23,8 @@ useHead({
{ key: 'theme-color', name: 'theme-color', content: color }
],
link: [
{ rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' }
// { rel: 'canonical', href: `https://ui.nuxt.com${withoutTrailingSlash(route.path)}` }
// { rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' },
{ rel: 'canonical', href: `https://ui.nuxt.com${withoutTrailingSlash(route.path)}` }
],
style: [
{ innerHTML: radius, id: 'nuxt-ui-radius', tagPriority: -2 },
@@ -50,6 +40,8 @@ useServerSeoMeta({
twitterCard: 'summary_large_image'
})
useFaviconFromTheme()
const { frameworks, modules } = useSharedData()
const { mappedNavigation, filteredNavigation } = useContentNavigation(navigation)
@@ -75,7 +67,7 @@ provide('navigation', mappedNavigation)
<ClientOnly>
<LazyUContentSearch
v-model:search-term="searchTerm"
:links="searchLinks"
:files="files"
:groups="[{
id: 'framework',
@@ -95,5 +87,5 @@ provide('navigation', mappedNavigation)
</template>
<style>
/* Safelist (do not remove): [&>div]:*:my-0 [&>div]:*:w-full h-64 !px-0 !py-0 !pt-0 !pb-0 !p-0 !justify-start !min-h-96 h-136 */
/* Safelist (do not remove): [&>div]:*:my-0 [&>div]:*:w-full h-64 !px-0 !py-0 !pt-0 !pb-0 !p-0 !justify-start !justify-end !min-h-96 h-136 max-h-[341px] */
</style>

View File

@@ -1,7 +1,7 @@
@import "tailwindcss" theme(static) source("../../../..");
@import "@nuxt/ui-pro";
@source "../../../content";
@source "../../../content/**/*";
@source "../../../node_modules/.c12";
@theme static {

View File

@@ -0,0 +1,50 @@
<script setup lang="ts">
const el = ref<HTMLDivElement | null>(null)
onMounted(() => {
if (!el.value) {
return
}
const script = document.createElement('script')
script.setAttribute('type', 'text/javascript')
script.setAttribute('src', 'https://cdn.carbonads.com/carbon.js?serve=CWYIVK3E&placement=uinuxtcom')
script.setAttribute('id', '_carbonads_js')
el.value?.appendChild(script)
})
</script>
<template>
<div ref="el" class="carbon" />
</template>
<style scoped>
@reference "../assets/css/main.css";
.carbon :deep(#carbonads) {
@apply relative border border-default rounded-md hover:bg-elevated/50 w-full transition-colors min-h-[220px] p-2;
.carbon-img {
@apply flex justify-center w-full;
& > img {
@apply !max-w-full w-full rounded-sm;
}
}
.carbon-text {
@apply text-sm text-muted transition-colors text-center text-pretty flex pt-2;
}
.carbon-poweredby {
@apply block text-xs text-center text-muted pt-2;
}
&:hover {
.carbon-text {
@apply text-default;
}
}
}
</style>

View File

@@ -1,7 +1,18 @@
<template>
<UBanner icon="i-lucide-construction" :actions="[{ label: 'Go to Nuxt UI v2', to: 'https://ui.nuxt.com', trailingIcon: 'i-lucide-arrow-right' }]" :close="false">
<UBanner
id="ui3-launch"
icon="i-lucide-rocket"
:actions="[
{
label: 'Discover Nuxt UI Pro',
to: '/pro/pricing',
trailingIcon: 'i-lucide-arrow-right'
}
]"
close
>
<template #title>
You're looking at the documentation for <span class="font-semibold">Nuxt UI v3</span>!
<span class="font-semibold">Nuxt UI v3</span> is officially released.
</template>
</UBanner>
</template>

View File

@@ -0,0 +1,51 @@
<script setup lang="ts">
const endDate = new Date('2025-03-14T23:59:59Z')
const second = 1000
const minute = second * 60
const hour = minute * 60
const day = hour * 24
function getCountdown() {
const distance = Math.floor((endDate.getTime() - Date.now()))
return {
day: Math.floor(distance / day),
hour: Math.floor((distance % (day)) / (hour)),
minute: Math.floor((distance % (hour)) / (minute)),
second: Math.floor((distance % (minute)) / (second)),
distance
}
}
const countdown = ref(getCountdown())
let interval: any
if (countdown.value.distance > 0) {
onMounted(() => {
interval = setInterval(() => {
countdown.value = getCountdown()
if (countdown.value.distance <= 0) {
clearInterval(interval)
}
}, 1000)
})
}
const plural = (value: number) => (value === 1 ? '' : 's')
const double = (value: number) => (value < 10 ? `0${value}` : value)
</script>
<template>
<div>
<p class="font-semibold text-gray-900 dark:text-white text-sm mb-3">
Nuxt UI v3 launch offer ends in:
</p>
<div class="flex items-center justify-center gap-2 text-center">
<template v-for="(value, key) in countdown" :key="key">
<div v-if="key !== 'distance'" class="flex flex-col items-center gap-2">
<UBadge color="primary" class="w-14 h-14 font-bold text-2xl flex items-center justify-center tabular-nums" variant="subtle">
{{ double(value) }}
</UBadge>
<span class="text-[10px] font-semibold text-gray-900 dark:text-white tracking-wide tabular-nums uppercase">{{ key }}{{ plural(value) }}</span>
</div>
</template>
</div>
</div>
</template>

View File

@@ -2,8 +2,8 @@
const route = useRoute()
const links = [{
label: 'Figma',
to: '/figma'
label: 'Team',
to: '/team'
}, {
label: 'Roadmap',
to: '/roadmap'
@@ -22,8 +22,8 @@ const links = [{
<UFooter>
<template #left>
<NuxtLink to="https://github.com/nuxt/ui" target="_blank" class="text-sm text-(--ui-text-muted)">
Published under <span class="text-(--ui-text-highlighted)">MIT License</span>
<NuxtLink to="https://github.com/nuxt/ui" target="_blank" class="text-sm text-muted">
Published under <span class="text-highlighted">MIT License</span>
</NuxtLink>
</template>

View File

@@ -19,8 +19,8 @@ watch(framework, () => {
:content="false"
color="neutral"
:ui="{
indicator: 'bg-(--ui-bg)',
trigger: 'px-1 data-[state=active]:text-(--ui-text-highlighted)'
indicator: 'bg-default',
trigger: 'px-1 data-[state=active]:text-highlighted w-full'
}"
size="xs"
@update:model-value="(framework = $event as string)"

View File

@@ -22,14 +22,26 @@ onMounted(() => {
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
const githubLink = computed(() => {
return `https://github.com/nuxt/${value.value}`
})
const desktopLinks = computed(() => props.links.map(({ icon, ...link }) => link))
const mobileLinks = computed(() => props.links.map(link => ({ ...link, defaultOpen: link.children && route.path.startsWith(link.to as string) })))
const mobileLinks = computed(() => [
...props.links.map(link => ({ ...link, defaultOpen: link.children && route.path.startsWith(link.to as string) })),
{
label: 'Open on GitHub',
to: githubLink.value,
icon: 'i-simple-icons-github',
target: '_blank'
}
])
</script>
<template>
<UHeader :ui="{ left: 'min-w-0' }" :menu="{ shouldScaleBackground: true }">
<template #left>
<NuxtLink to="/" class="flex items-end gap-2 font-bold text-xl text-(--ui-text-highlighted) min-w-0 focus-visible:outline-(--ui-primary) shrink-0" aria-label="Nuxt UI">
<NuxtLink to="/" class="flex items-end gap-2 font-bold text-xl text-highlighted min-w-0 focus-visible:outline-primary shrink-0" aria-label="Nuxt UI">
<Logo v-if="route.path === '/'" class="w-auto h-6 shrink-0" />
<LogoPro v-else-if="route.path.startsWith('/pro')" class="w-auto h-6 shrink-0" />
<template v-else>
@@ -41,7 +53,7 @@ const mobileLinks = computed(() => props.links.map(link => ({ ...link, defaultOp
<UDropdownMenu
v-slot="{ open }"
:modal="false"
:items="[{ label: `v${config.version}`, active: true, color: 'primary', checked: true, type: 'checkbox' }, { label: module === 'ui-pro' ? 'v1.5' : 'v2.19', to: module === 'ui-pro' ? 'https://ui.nuxt.com/pro' : 'https://ui.nuxt.com' }]"
:items="[{ label: `v${config.version}`, active: true, color: 'primary', checked: true, type: 'checkbox' }, { label: module === 'ui-pro' ? 'v1.7.1' : 'v2.21.1', to: module === 'ui-pro' ? 'https://ui2.nuxt.com/pro' : 'https://ui2.nuxt.com' }]"
:ui="{ content: 'w-(--reka-dropdown-menu-trigger-width) min-w-0' }"
size="xs"
>
@@ -51,7 +63,7 @@ const mobileLinks = computed(() => props.links.map(link => ({ ...link, defaultOp
trailing-icon="i-lucide-chevron-down"
size="xs"
class="-mb-[6px] font-semibold rounded-full truncate"
:class="[open && 'bg-(--ui-primary)/15 ']"
:class="[open && 'bg-primary/15 ']"
:ui="{
trailingIcon: ['transition-transform duration-200', open ? 'rotate-180' : undefined].filter(Boolean).join(' ')
}"
@@ -73,7 +85,7 @@ const mobileLinks = computed(() => props.links.map(link => ({ ...link, defaultOp
:key="value"
color="neutral"
variant="ghost"
:to="`https://github.com/nuxt/${value}`"
:to="githubLink"
target="_blank"
icon="i-simple-icons-github"
aria-label="GitHub"
@@ -82,7 +94,7 @@ const mobileLinks = computed(() => props.links.map(link => ({ ...link, defaultOp
</template>
<template #body>
<UNavigationMenu orientation="vertical" :items="mobileLinks" class="-mx-2.5" default-open />
<UNavigationMenu orientation="vertical" :items="mobileLinks" class="-mx-2.5" />
<USeparator type="dashed" class="mt-4 mb-6" />
@@ -96,7 +108,7 @@ const mobileLinks = computed(() => props.links.map(link => ({ ...link, defaultOp
<span class="inline-flex items-center gap-0.5">
{{ link.title }}
<sup v-if="link.module === 'ui-pro'" class="text-[8px] font-medium text-(--ui-primary)">PRO</sup>
<sup v-if="link.module === 'ui-pro'" class="text-[8px] font-medium text-primary">PRO</sup>
</span>
</template>
</UContentNavigation>

View File

@@ -19,8 +19,8 @@ watch(module, () => {
:content="false"
color="neutral"
:ui="{
indicator: 'bg-(--ui-bg)',
trigger: 'px-1 data-[state=active]:text-(--ui-text-highlighted)'
indicator: 'bg-default',
trigger: 'px-1 data-[state=active]:text-highlighted w-full'
}"
size="xs"
@update:model-value="(module = $event as string)"

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import { kebabCase } from 'scule'
interface Star {
x: number
y: number
@@ -12,6 +14,7 @@ const props = withDefaults(defineProps<{
color?: string
size?: { min: number, max: number }
speed?: 'slow' | 'normal' | 'fast'
isIndex?: boolean
}>(), {
starCount: 50,
color: 'var(--ui-primary)',
@@ -19,9 +22,12 @@ const props = withDefaults(defineProps<{
min: 1,
max: 3
}),
speed: 'normal'
speed: 'normal',
isIndex: false
})
const route = useRoute()
// Generate random stars
const generateStars = (count: number): Star[] => {
return Array.from({ length: count }, () => {
@@ -35,7 +41,7 @@ const generateStars = (count: number): Star[] => {
}
// Generate all stars
const stars = ref<Star[]>(generateStars(props.starCount))
const stars = useState<Star[]>(`${kebabCase(route.path)}-sky`, () => generateStars(props.starCount))
// Compute twinkle animation duration based on speed
const twinkleDuration = computed(() => {
@@ -49,23 +55,21 @@ const twinkleDuration = computed(() => {
</script>
<template>
<div class="absolute pointer-events-none z-[-1] inset-y-0 left-4 right-4 lg:right-[50%] overflow-hidden">
<ClientOnly>
<div
v-for="star in stars"
:key="star.id"
class="star absolute"
:style="{
'left': `${star.x}%`,
'top': `${star.y}%`,
'transform': 'translate(-50%, -50%)',
'--star-size': `${star.size}px`,
'--star-color': color,
'--twinkle-delay': `${star.twinkleDelay}s`,
'--twinkle-duration': twinkleDuration
}"
/>
</ClientOnly>
<div class="absolute pointer-events-none z-[-1] overflow-hidden" :class="isIndex ? 'inset-y-0 left-4 right-4 lg:right-[50%]' : 'inset-0'">
<div
v-for="star in stars"
:key="star.id"
class="star absolute"
:style="{
'left': `${star.x}%`,
'top': `${star.y}%`,
'transform': 'translate(-50%, -50%)',
'--star-size': `${star.size}px`,
'--star-color': color,
'--twinkle-delay': `${star.twinkleDelay}s`,
'--twinkle-duration': twinkleDuration
}"
/>
</div>
</template>

View File

@@ -1,4 +1,12 @@
<script setup lang="ts">
import { kebabCase } from 'scule'
interface Star {
x: number
y: number
size: number
}
const props = withDefaults(defineProps<{
starCount?: number
color?: string
@@ -14,8 +22,10 @@ const props = withDefaults(defineProps<{
})
})
const route = useRoute()
// Generate random star positions and sizes
const generateStars = (count: number) => {
const generateStars = (count: number): Star[] => {
return Array.from({ length: count }, () => ({
x: Math.floor(Math.random() * 2000),
y: Math.floor(Math.random() * 2000),
@@ -25,52 +35,58 @@ const generateStars = (count: number) => {
}))
}
// Compute star layers with different speeds and opacities
const starLayers = computed(() => {
const speedMap = {
slow: { duration: 200, opacity: 0.5 },
normal: { duration: 150, opacity: 0.75 },
fast: { duration: 100, opacity: 1 }
}
// Define speed configurations once
const speedMap = {
slow: { duration: 200, opacity: 0.5, ratio: 0.3 },
normal: { duration: 150, opacity: 0.75, ratio: 0.3 },
fast: { duration: 100, opacity: 1, ratio: 0.4 }
}
return [
{ stars: generateStars(props.starCount), ...speedMap.fast },
{ stars: generateStars(Math.floor(props.starCount * 0.6)), ...speedMap.normal },
{ stars: generateStars(Math.floor(props.starCount * 0.3)), ...speedMap.slow }
]
// Use a more efficient approach to generate and store stars
const stars = useState<{ slow: Star[], normal: Star[], fast: Star[] }>(`${kebabCase(route.path)}-stars`, () => {
return {
slow: generateStars(Math.floor(props.starCount * speedMap.slow.ratio)),
normal: generateStars(Math.floor(props.starCount * speedMap.normal.ratio)),
fast: generateStars(Math.floor(props.starCount * speedMap.fast.ratio))
}
})
// Compute star layers with different speeds and opacities
const starLayers = computed(() => [
{ stars: stars.value.fast, ...speedMap.fast },
{ stars: stars.value.normal, ...speedMap.normal },
{ stars: stars.value.slow, ...speedMap.slow }
])
</script>
<template>
<div class="absolute pointer-events-none z-[-1] inset-y-0 inset-x-5 sm:inset-x-7 lg:inset-x-9 overflow-hidden">
<ClientOnly>
<div class="stars size-full absolute inset-x-0 top-0">
<div class="stars size-full absolute inset-x-0 top-0">
<div
v-for="(layer, index) in starLayers"
:key="index"
class="star-layer"
:style="{
'--star-duration': `${layer.duration}s`,
'--star-opacity': layer.opacity,
'--star-color': color
}"
>
<div
v-for="(layer, index) in starLayers"
:key="index"
class="star-layer"
v-for="(star, starIndex) in layer.stars"
:key="starIndex"
class="star absolute rounded-full"
:style="{
'--star-duration': `${layer.duration}s`,
'--star-opacity': layer.opacity,
'--star-color': color
left: `${star.x}px`,
top: `${star.y}px`,
width: `${star.size}px`,
height: `${star.size}px`,
backgroundColor: 'var(--star-color)',
opacity: 'var(--star-opacity)'
}"
>
<div
v-for="(star, starIndex) in layer.stars"
:key="starIndex"
class="star absolute rounded-full"
:style="{
left: `${star.x}px`,
top: `${star.y}px`,
width: `${star.size}px`,
height: `${star.size}px`,
backgroundColor: 'var(--star-color)',
opacity: 'var(--star-opacity)'
}"
/>
</div>
/>
</div>
</ClientOnly>
</div>
</div>
</template>

View File

@@ -1,5 +1,6 @@
<!-- eslint-disable no-useless-escape -->
<script setup lang="ts">
import type { ChipProps } from '@nuxt/ui'
import json5 from 'json5'
import { upperFirst, camelCase, kebabCase } from 'scule'
import { hash } from 'ohash'
@@ -53,6 +54,8 @@ const props = defineProps<{
hide?: string[]
/** List of props to externalize in script setup */
external?: string[]
/** The types of the externalized props */
externalTypes?: string[]
/** List of props to use with `v-model` */
model?: string[]
/** List of props to cast from code and selection */
@@ -150,7 +153,8 @@ const options = computed(() => {
const items = propItems.length
? propItems.map((item: any) => ({
value: item,
label: String(item)
label: String(item),
chip: key.toLowerCase().endsWith('color') ? { color: item } : undefined
}))
: prop?.type === 'boolean' || prop?.type === 'boolean | undefined'
? [{ value: true, label: 'true' }, { value: false, label: 'false' }]
@@ -209,11 +213,21 @@ ${props.slots?.default}
code += `
<script setup lang="ts">
`
for (const key of props.external) {
if (props.externalTypes?.length) {
const removeArrayBrackets = (type: string): string => type.endsWith('[]') ? removeArrayBrackets(type.slice(0, -2)) : type
const types = props.externalTypes.map(type => removeArrayBrackets(type))
code += `import type { ${types.join(', ')} } from '@nuxt/ui${props.pro ? '-pro' : ''}'
`
}
for (const [i, key] of props.external.entries()) {
const cast = props.cast?.[key]
const value = cast ? castMap[cast]!.template(componentProps[key]) : json5.stringify(componentProps[key], null, 2)?.replace(/,([ |\t\n]+[}|\]])/g, '$1')
const type = props.externalTypes?.[i] ? `<${props.externalTypes[i]}>` : ''
code += `const ${key === 'modelValue' ? 'value' : key} = ref(${value})
code += `const ${key === 'modelValue' ? 'value' : key} = ref${type}(${value})
`
}
code += `<\/script>
@@ -315,16 +329,16 @@ const { data: ast } = await useAsyncData(`component-code-${name}-${hash({ props:
<template>
<div class="my-5">
<div>
<div v-if="options.length" class="flex flex-wrap items-center gap-2.5 border border-(--ui-border-muted) border-b-0 relative rounded-t-[calc(var(--ui-radius)*1.5)] px-4 py-2.5 overflow-x-auto">
<div class="relative">
<div v-if="options.length" class="flex flex-wrap items-center gap-2.5 border border-muted border-b-0 relative rounded-t-md px-4 py-2.5 overflow-x-auto">
<template v-for="option in options" :key="option.name">
<UFormField
:label="option.label"
size="sm"
class="inline-flex ring ring-(--ui-border-accented) rounded-(--ui-radius)"
class="inline-flex ring ring-accented rounded-sm"
:ui="{
wrapper: 'bg-(--ui-bg-elevated)/50 rounded-l-(--ui-radius) flex border-r border-(--ui-border-accented)',
label: 'text-(--ui-text-muted) px-2 py-1.5',
wrapper: 'bg-elevated/50 rounded-l-sm flex border-r border-accented',
label: 'text-muted px-2 py-1.5',
container: 'mt-0'
}"
>
@@ -335,7 +349,7 @@ const { data: ast } = await useAsyncData(`component-code-${name}-${hash({ props:
value-key="value"
color="neutral"
variant="soft"
class="rounded-(--ui-radius) rounded-l-none min-w-12"
class="rounded-sm rounded-l-none min-w-12"
:class="[option.name.toLowerCase().endsWith('color') && 'pl-6']"
:ui="{ itemLeadingChip: 'size-2' }"
@update:model-value="setComponentProp(option.name, $event)"
@@ -346,7 +360,7 @@ const { data: ast } = await useAsyncData(`component-code-${name}-${hash({ props:
inset
standalone
:color="(modelValue as any)"
:size="ui.itemLeadingChipSize()"
:size="(ui.itemLeadingChipSize() as ChipProps['size'])"
class="size-2"
/>
</template>
@@ -357,14 +371,14 @@ const { data: ast } = await useAsyncData(`component-code-${name}-${hash({ props:
:model-value="getComponentProp(option.name)"
color="neutral"
variant="soft"
:ui="{ base: 'rounded-(--ui-radius) rounded-l-none min-w-12' }"
:ui="{ base: 'rounded-sm rounded-l-none min-w-12' }"
@update:model-value="setComponentProp(option.name, $event)"
/>
</UFormField>
</template>
</div>
<div v-if="component" class="flex justify-center border border-b-0 border-(--ui-border-muted) relative p-4 z-[1]" :class="[!options.length && 'rounded-t-[calc(var(--ui-radius)*1.5)]', props.class, { 'overflow-hidden': props.overflowHidden }]">
<div v-if="component" class="flex justify-center border border-b-0 border-muted relative p-4 z-[1]" :class="[!options.length && 'rounded-t-md', props.class, { 'overflow-hidden': props.overflowHidden }]">
<component :is="component" v-bind="{ ...componentProps, ...componentEvents }">
<template v-for="slot in Object.keys(slots || {})" :key="slot" #[slot]>
<slot :name="slot" mdc-unwrap="p">

View File

@@ -1,4 +1,5 @@
<script setup lang="ts">
import type { ChipProps } from '@nuxt/ui'
import { camelCase } from 'scule'
import { useElementSize } from '@vueuse/core'
import { get, set } from '#ui/utils'
@@ -149,8 +150,8 @@ const urlSearchParams = computed(() => {
<template>
<div ref="el" class="my-5">
<template v-if="preview">
<div class="border border-(--ui-border-muted) relative z-[1]" :class="[{ 'border-b-0 rounded-t-[calc(var(--ui-radius)*1.5)]': props.source, 'rounded-[calc(var(--ui-radius)*1.5)]': !props.source, 'overflow-hidden': props.overflowHidden }]">
<div v-if="props.options?.length || !!slots.options" class="flex gap-4 p-4 border-b border-(--ui-border-muted)">
<div class="border border-muted relative z-[1]" :class="[{ 'border-b-0 rounded-t-md': props.source, 'rounded-md': !props.source, 'overflow-hidden': props.overflowHidden }]">
<div v-if="props.options?.length || !!slots.options" class="flex gap-4 p-4 border-b border-muted">
<slot name="options" />
<UFormField
@@ -159,10 +160,10 @@ const urlSearchParams = computed(() => {
:label="option.label"
:name="option.name"
size="sm"
class="inline-flex ring ring-(--ui-border-accented) rounded-(--ui-radius)"
class="inline-flex ring ring-accented rounded-sm"
:ui="{
wrapper: 'bg-(--ui-bg-elevated)/50 rounded-l-(--ui-radius) flex border-r border-(--ui-border-accented)',
label: 'text-(--ui-text-muted) px-2 py-1.5',
wrapper: 'bg-elevated/50 rounded-l-sm flex border-r border-accented',
label: 'text-muted px-2 py-1.5',
container: 'mt-0'
}"
>
@@ -174,7 +175,7 @@ const urlSearchParams = computed(() => {
:value-key="option.name.toLowerCase().endsWith('color') ? 'value' : undefined"
color="neutral"
variant="soft"
class="rounded-(--ui-radius) rounded-l-none min-w-12"
class="rounded-sm rounded-l-none min-w-12"
:multiple="option.multiple"
:class="[option.name.toLowerCase().endsWith('color') && 'pl-6']"
:ui="{ itemLeadingChip: 'size-2' }"
@@ -185,7 +186,7 @@ const urlSearchParams = computed(() => {
inset
standalone
:color="(modelValue as any)"
:size="ui.itemLeadingChipSize()"
:size="(ui.itemLeadingChipSize() as ChipProps['size'])"
class="size-2"
/>
</template>
@@ -195,7 +196,7 @@ const urlSearchParams = computed(() => {
:model-value="get(optionsValues, option.name)"
color="neutral"
variant="soft"
:ui="{ base: 'rounded-(--ui-radius) rounded-l-none min-w-12' }"
:ui="{ base: 'rounded-sm rounded-l-none min-w-12' }"
@update:model-value="set(optionsValues, option.name, $event)"
/>
</UFormField>

View File

@@ -112,7 +112,7 @@ const metaProps: ComputedRef<ComponentMeta['props']> = computed(() => {
<ProseTd>
<HighlightInlineType v-if="prop.type" :type="prop.type" />
<MDC v-if="prop.description" :value="prop.description" class="text-(--ui-text-toned) mt-1" :cache-key="`${kebabCase(route.path)}-${prop.name}-description`" />
<MDC v-if="prop.description" :value="prop.description" class="text-toned mt-1" :cache-key="`${kebabCase(route.path)}-${prop.name}-description`" />
<ComponentPropsLinks v-if="prop.tags?.length" :prop="prop" />
<ComponentPropsSchema v-if="prop.schema" :prop="prop" :ignore="ignore" />

View File

@@ -38,12 +38,12 @@ const schemaProps = computed(() => {
</script>
<template>
<ProseCollapsible v-if="schemaProps?.length" class="mt-1">
<ProseCollapsible v-if="schemaProps?.length" class="mt-1 mb-0">
<ProseUl>
<ProseLi v-for="schemaProp in schemaProps" :key="schemaProp.name">
<HighlightInlineType :type="`${schemaProp.name}${schemaProp.required === false ? '?' : ''}: ${schemaProp.type}`" />
<MDC v-if="schemaProp.description" :value="schemaProp.description" class="text-(--ui-text-muted) my-1" :cache-key="`${kebabCase(route.path)}-${prop.name}-${schemaProp.name}-description`" />
<MDC v-if="schemaProp.description" :value="schemaProp.description" class="text-muted my-1" :cache-key="`${kebabCase(route.path)}-${prop.name}-${schemaProp.name}-description`" />
</ProseLi>
</ProseUl>
</ProseCollapsible>

View File

@@ -36,7 +36,7 @@ const meta = await fetchComponentMeta(name as any)
<ProseTd>
<HighlightInlineType v-if="slot.type" :type="slot.type" />
<MDC v-if="slot.description" :value="slot.description" class="text-(--ui-text-toned) mt-1" :cache-key="`${kebabCase(route.path)}-${slot.name}-description`" />
<MDC v-if="slot.description" :value="slot.description" class="text-toned mt-1" :cache-key="`${kebabCase(route.path)}-${slot.name}-description`" />
</ProseTd>
</ProseTr>
</ProseTbody>

View File

@@ -1,6 +1,6 @@
<template>
<div class="relative overflow-hidden rounded-(--ui-radius) border border-dashed border-(--ui-border-accented) opacity-75 px-4 flex items-center justify-center">
<svg class="absolute inset-0 h-full w-full stroke-(--ui-border-inverted)/10" fill="none">
<div class="relative overflow-hidden rounded-sm border border-dashed border-accented opacity-75 px-4 flex items-center justify-center">
<svg class="absolute inset-0 h-full w-full stroke-inverted/10" fill="none">
<defs>
<pattern
id="pattern-5c1e4f0e-62d5-498b-8ff0-cf77bb448c8e"

View File

@@ -11,19 +11,25 @@ function getEmojiFlag(locale: string): string {
const languageToCountry: Record<string, string> = {
ar: 'sa', // Arabic -> Saudi Arabia
bn: 'bd', // Bengali -> Bangladesh
ca: 'es', // Catalan -> Spain
ckb: 'iq', // Central Kurdish -> Iraq
cs: 'cz', // Czech -> Czech Republic (note: modern country code is actually 'cz')
da: 'dk', // Danish -> Denmark
el: 'gr', // Greek -> Greece
et: 'ee', // Estonian -> Estonia
en: 'gb', // English -> Great Britain
et: 'ee', // Estonian -> Estonia
he: 'il', // Hebrew -> Israel
hi: 'in', // Hindi -> India
hy: 'am', // Armenian -> Armenia
ja: 'jp', // Japanese -> Japan
kk: 'kz', // Kazakh -> Kazakhstan
km: 'kh', // Khmer -> Cambodia
ko: 'kr', // Korean -> South Korea
nb: 'no', // Norwegian Bokmål -> Norway
sl: 'si', // Slovenian -> Slovenia
sv: 'se', // Swedish -> Sweden
uk: 'ua', // Ukrainian -> Ukraine
ur: 'pk', // Urdu -> Pakistan
vi: 'vn' // Vietnamese -> Vietnam
}

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { AccordionItem } from '@nuxt/ui'
const items: AccordionItem[] = [
{
label: 'Icons',
icon: 'i-lucide-smile'

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { AccordionItem } from '@nuxt/ui'
const items: AccordionItem[] = [
{
label: 'Icons',
icon: 'i-lucide-smile'
@@ -18,7 +20,7 @@ const items = [
<template>
<UAccordion :items="items">
<template #content="{ item }">
<p class="pb-3.5 text-sm text-(--ui-text-muted)">
<p class="pb-3.5 text-sm text-muted">
This is the {{ item.label }} panel.
</p>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { AccordionItem } from '@nuxt/ui'
const items = [
{
label: 'Icons',
@@ -8,7 +10,7 @@ const items = [
{
label: 'Colors',
icon: 'i-lucide-swatch-book',
slot: 'colors',
slot: 'colors' as const,
content: 'Choose a primary and a neutral color from your Tailwind CSS theme.'
},
{
@@ -16,13 +18,13 @@ const items = [
icon: 'i-lucide-box',
content: 'You can customize components by using the `class` / `ui` props or in your app.config.ts.'
}
]
] satisfies AccordionItem[]
</script>
<template>
<UAccordion :items="items">
<template #colors="{ item }">
<p class="text-sm pb-3.5 text-(--ui-primary)">
<p class="text-sm pb-3.5 text-primary">
{{ item.content }}
</p>
</template>

View File

@@ -0,0 +1,32 @@
<script setup lang="ts">
import type { AccordionItem } from '@nuxt/ui'
import { useSortable } from '@vueuse/integrations/useSortable'
const items = shallowRef<AccordionItem[]>([
{
label: 'Icons',
icon: 'i-lucide-smile',
content: 'You have nothing to do, @nuxt/icon will handle it automatically.'
},
{
label: 'Colors',
icon: 'i-lucide-swatch-book',
content: 'Choose a primary and a neutral color from your Tailwind CSS theme.'
},
{
label: 'Components',
icon: 'i-lucide-box',
content: 'You can customize components by using the `class` / `ui` props or in your app.config.ts.'
}
])
const accordion = useTemplateRef<HTMLElement>('accordion')
useSortable(accordion, items, {
animation: 150
})
</script>
<template>
<UAccordion ref="accordion" :items="items" />
</template>

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { AccordionItem } from '@nuxt/ui'
const items: AccordionItem[] = [
{
label: 'Icons',
icon: 'i-lucide-smile',

View File

@@ -3,7 +3,7 @@
<ULink
to="https://github.com/benjamincanac"
target="_blank"
class="hover:ring-(--ui-primary) transition"
class="hover:ring-primary transition"
raw
>
<UAvatar
@@ -15,7 +15,7 @@
<ULink
to="https://github.com/romhml"
target="_blank"
class="hover:ring-(--ui-primary) transition"
class="hover:ring-primary transition"
raw
>
<UAvatar
@@ -27,7 +27,7 @@
<ULink
to="https://github.com/noook"
target="_blank"
class="hover:ring-(--ui-primary) transition"
class="hover:ring-primary transition"
raw
>
<UAvatar

View File

@@ -1,24 +1,35 @@
<script setup lang="ts">
const items = [{
label: 'Home',
to: '/'
}, {
slot: 'dropdown',
icon: 'i-lucide-ellipsis',
children: [{
label: 'Documentation'
}, {
label: 'Themes'
}, {
label: 'GitHub'
}]
}, {
label: 'Components',
to: '/components'
}, {
label: 'Breadcrumb',
to: '/components/breadcrumb'
}]
import type { BreadcrumbItem } from '@nuxt/ui'
const items = [
{
label: 'Home',
to: '/'
},
{
slot: 'dropdown' as const,
icon: 'i-lucide-ellipsis',
children: [
{
label: 'Documentation'
},
{
label: 'Themes'
},
{
label: 'GitHub'
}
]
},
{
label: 'Components',
to: '/components'
},
{
label: 'Breadcrumb',
to: '/components/breadcrumb'
}
] satisfies BreadcrumbItem[]
</script>
<template>

View File

@@ -1,20 +1,26 @@
<script setup lang="ts">
const items = [{
label: 'Home',
to: '/'
}, {
label: 'Components',
to: '/components'
}, {
label: 'Breadcrumb',
to: '/components/breadcrumb'
}]
import type { BreadcrumbItem } from '@nuxt/ui'
const items: BreadcrumbItem[] = [
{
label: 'Home',
to: '/'
},
{
label: 'Components',
to: '/components'
},
{
label: 'Breadcrumb',
to: '/components/breadcrumb'
}
]
</script>
<template>
<UBreadcrumb :items="items">
<template #separator>
<span class="mx-2 text-(--ui-text-muted)">/</span>
<span class="mx-2 text-muted">/</span>
</template>
</UBreadcrumb>
</template>

View File

@@ -1,21 +1,30 @@
<script setup lang="ts">
const items = [{
label: 'Team',
icon: 'i-lucide-users'
}, {
label: 'Invite users',
icon: 'i-lucide-user-plus',
children: [{
label: 'Invite by email',
icon: 'i-lucide-send-horizontal'
}, {
label: 'Invite by link',
icon: 'i-lucide-link'
}]
}, {
label: 'New team',
icon: 'i-lucide-plus'
}]
import type { DropdownMenuItem } from '@nuxt/ui'
const items: DropdownMenuItem[] = [
{
label: 'Team',
icon: 'i-lucide-users'
},
{
label: 'Invite users',
icon: 'i-lucide-user-plus',
children: [
{
label: 'Invite by email',
icon: 'i-lucide-send-horizontal'
},
{
label: 'Invite by link',
icon: 'i-lucide-link'
}
]
},
{
label: 'New team',
icon: 'i-lucide-plus'
}
]
</script>
<template>

View File

@@ -0,0 +1,21 @@
<script setup lang="ts">
import { CalendarDate } from '@internationalized/date'
const date = shallowRef(new CalendarDate(2025, 4, 2))
</script>
<template>
<div class="flex flex-col gap-4">
<UCalendar v-model="date" :month-controls="false" :year-controls="false" />
<div class="flex justify-between gap-4">
<UButton color="neutral" variant="outline" @click="date = date.subtract({ months: 1 })">
Prev
</UButton>
<UButton color="neutral" variant="outline" @click="date = date.add({ months: 1 })">
Next
</UButton>
</div>
</div>
</template>

View File

@@ -0,0 +1,58 @@
<script setup lang="ts">
const items = [
'https://picsum.photos/640/640?random=1',
'https://picsum.photos/640/640?random=2',
'https://picsum.photos/640/640?random=3',
'https://picsum.photos/640/640?random=4',
'https://picsum.photos/640/640?random=5',
'https://picsum.photos/640/640?random=6'
]
const carousel = useTemplateRef('carousel')
const activeIndex = ref(0)
function onClickPrev() {
activeIndex.value--
}
function onClickNext() {
activeIndex.value++
}
function onSelect(index: number) {
activeIndex.value = index
}
function select(index: number) {
activeIndex.value = index
carousel.value?.emblaApi?.scrollTo(index)
}
</script>
<template>
<div class="flex-1 w-full">
<UCarousel
ref="carousel"
v-slot="{ item }"
arrows
:items="items"
:prev="{ onClick: onClickPrev }"
:next="{ onClick: onClickNext }"
class="w-full max-w-xs mx-auto"
@select="onSelect"
>
<img :src="item" width="320" height="320" class="rounded-lg">
</UCarousel>
<div class="flex gap-1 justify-between pt-4 max-w-xs mx-auto">
<div
v-for="(item, index) in items"
:key="index"
class="size-11 opacity-25 hover:opacity-100 transition-opacity"
:class="{ 'opacity-100': activeIndex === index }"
@click="select(index)"
>
<img :src="item" width="44" height="44" class="rounded-lg">
</div>
</div>
</div>
</template>

View File

@@ -1,76 +1,79 @@
<script setup lang="ts">
const groups = [{
id: 'settings',
items: [
{
label: 'Profile',
icon: 'i-lucide-user',
kbds: ['meta', 'P']
},
{
label: 'Billing',
icon: 'i-lucide-credit-card',
kbds: ['meta', 'B'],
slot: 'billing'
},
{
label: 'Notifications',
icon: 'i-lucide-bell'
},
{
label: 'Security',
icon: 'i-lucide-lock'
}
]
}, {
id: 'users',
label: 'Users',
slot: 'users',
items: [
{
label: 'Benjamin Canac',
suffix: 'benjamincanac',
to: 'https://github.com/benjamincanac',
target: '_blank'
},
{
label: 'Sylvain Marroufin',
suffix: 'smarroufin',
to: 'https://github.com/smarroufin',
target: '_blank'
},
{
label: 'Sébastien Chopin',
suffix: 'atinux',
to: 'https://github.com/atinux',
target: '_blank'
},
{
label: 'Romain Hamel',
suffix: 'romhml',
to: 'https://github.com/romhml',
target: '_blank'
},
{
label: 'Haytham A. Salama',
suffix: 'Haythamasalama',
to: 'https://github.com/Haythamasalama',
target: '_blank'
},
{
label: 'Daniel Roe',
suffix: 'danielroe',
to: 'https://github.com/danielroe',
target: '_blank'
},
{
label: 'Neil Richter',
suffix: 'noook',
to: 'https://github.com/noook',
target: '_blank'
}
]
}]
const groups = [
{
id: 'settings',
items: [
{
label: 'Profile',
icon: 'i-lucide-user',
kbds: ['meta', 'P']
},
{
label: 'Billing',
icon: 'i-lucide-credit-card',
kbds: ['meta', 'B'],
slot: 'billing' as const
},
{
label: 'Notifications',
icon: 'i-lucide-bell'
},
{
label: 'Security',
icon: 'i-lucide-lock'
}
]
},
{
id: 'users',
label: 'Users',
slot: 'users' as const,
items: [
{
label: 'Benjamin Canac',
suffix: 'benjamincanac',
to: 'https://github.com/benjamincanac',
target: '_blank'
},
{
label: 'Sylvain Marroufin',
suffix: 'smarroufin',
to: 'https://github.com/smarroufin',
target: '_blank'
},
{
label: 'Sébastien Chopin',
suffix: 'atinux',
to: 'https://github.com/atinux',
target: '_blank'
},
{
label: 'Romain Hamel',
suffix: 'romhml',
to: 'https://github.com/romhml',
target: '_blank'
},
{
label: 'Haytham A. Salama',
suffix: 'Haythamasalama',
to: 'https://github.com/Haythamasalama',
target: '_blank'
},
{
label: 'Daniel Roe',
suffix: 'danielroe',
to: 'https://github.com/danielroe',
target: '_blank'
},
{
label: 'Neil Richter',
suffix: 'noook',
to: 'https://github.com/noook',
target: '_blank'
}
]
}
]
</script>
<template>

View File

@@ -1,9 +1,10 @@
<script setup lang="ts">
import { refDebounced } from '@vueuse/core'
const searchTerm = ref('')
const searchTermDebounced = refDebounced(searchTerm, 200)
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'command-palette-users',
params: { q: searchTermDebounced },
transform: (data: { id: number, name: string, email: string }[]) => {
return data?.map(user => ({ id: user.id, label: user.name, suffix: user.email, avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` } })) || []

View File

@@ -1,8 +1,10 @@
<script setup lang="ts">
import type { ContextMenuItem } from '@nuxt/ui'
const showSidebar = ref(true)
const showToolbar = ref(false)
const items = computed(() => [{
const items = computed<ContextMenuItem[]>(() => [{
label: 'View',
type: 'label' as const
}, {
@@ -33,7 +35,7 @@ const items = computed(() => [{
<template>
<UContextMenu :items="items" :ui="{ content: 'w-48' }">
<div class="flex items-center justify-center rounded-md border border-dashed border-(--ui-border-accented) text-sm aspect-video w-72">
<div class="flex items-center justify-center rounded-md border border-dashed border-accented text-sm aspect-video w-72">
Right click here
</div>
</UContextMenu>

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { ContextMenuItem } from '@nuxt/ui'
const items: ContextMenuItem[][] = [
[
{
label: 'View',
@@ -26,7 +28,7 @@ const items = [
<template>
<UContextMenu :items="items" :ui="{ content: 'w-48' }">
<div class="flex items-center justify-center rounded-md border border-dashed border-(--ui-border-accented) text-sm aspect-video w-72">
<div class="flex items-center justify-center rounded-md border border-dashed border-accented text-sm aspect-video w-72">
Right click here
</div>
</UContextMenu>

View File

@@ -1,19 +1,25 @@
<script setup lang="ts">
import type { ContextMenuItem } from '@nuxt/ui'
const loading = ref(true)
const items = [{
label: 'Refresh the Page',
slot: 'refresh'
}, {
label: 'Clear Cookies and Refresh'
}, {
label: 'Clear Cache and Refresh'
}]
const items = [
{
label: 'Refresh the Page',
slot: 'refresh' as const
},
{
label: 'Clear Cookies and Refresh'
},
{
label: 'Clear Cache and Refresh'
}
] satisfies ContextMenuItem[]
</script>
<template>
<UContextMenu :items="items" :ui="{ content: 'w-48' }">
<div class="flex items-center justify-center rounded-md border border-dashed border-(--ui-border-accented) text-sm aspect-video w-72">
<div class="flex items-center justify-center rounded-md border border-dashed border-accented text-sm aspect-video w-72">
Right click here
</div>
@@ -22,7 +28,7 @@ const items = [{
</template>
<template #refresh-trailing>
<UIcon v-if="loading" name="i-lucide-refresh-cw" class="shrink-0 size-5 text-(--ui-primary) animate-spin" />
<UIcon v-if="loading" name="i-lucide-refresh-cw" class="shrink-0 size-5 text-primary animate-spin" />
</template>
</UContextMenu>
</template>

View File

@@ -7,7 +7,7 @@ const open = ref(false)
<UButton label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up" />
<template #header>
<h2 class="text-(--ui-text-highlighted) font-semibold">
<h2 class="text-highlighted font-semibold">
Drawer non-dismissible
</h2>

View File

@@ -0,0 +1,43 @@
<script lang="ts" setup>
import { createReusableTemplate, useMediaQuery } from '@vueuse/core'
const [DefineFormTemplate, ReuseFormTemplate] = createReusableTemplate()
const isDesktop = useMediaQuery('(min-width: 768px)')
const open = ref(false)
const state = reactive({
email: undefined
})
const title = 'Edit profile'
const description = 'Make changes to your profile here. Click save when you\'re done.'
</script>
<template>
<DefineFormTemplate>
<UForm :state="state" class="space-y-4">
<UFormField label="Email" name="email" required>
<UInput v-model="state.email" placeholder="shadcn@example.com" required />
</UFormField>
<UButton label="Save changes" type="submit" />
</UForm>
</DefineFormTemplate>
<UModal v-if="isDesktop" v-model:open="open" :title="title" :description="description">
<UButton label="Edit profile" color="neutral" variant="outline" />
<template #body>
<ReuseFormTemplate />
</template>
</UModal>
<UDrawer v-else v-model:open="open" :title="title" :description="description">
<UButton label="Edit profile" color="neutral" variant="outline" />
<template #body>
<ReuseFormTemplate />
</template>
</UDrawer>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { DropdownMenuItem } from '@nuxt/ui'
const showBookmarks = ref(true)
const showHistory = ref(false)
const showDownloads = ref(false)
@@ -36,7 +38,7 @@ const items = computed(() => [{
onUpdateChecked(checked: boolean) {
showDownloads.value = checked
}
}])
}] satisfies DropdownMenuItem[])
</script>
<template>

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { DropdownMenuItem } from '@nuxt/ui'
const items: DropdownMenuItem[][] = [
[
{
label: 'View',
@@ -17,7 +19,7 @@ const items = [
[
{
label: 'Delete',
color: 'error' as const,
color: 'error',
icon: 'i-lucide-trash'
}
]
@@ -27,9 +29,5 @@ const items = [
<template>
<UDropdownMenu :items="items" :ui="{ content: 'w-48' }">
<UButton label="Open" color="neutral" variant="outline" icon="i-lucide-menu" />
<template #profile-trailing>
<UIcon name="i-lucide-badge-check" class="shrink-0 size-5 text-(--ui-primary)" />
</template>
</UDropdownMenu>
</template>

View File

@@ -1,15 +1,19 @@
<script setup lang="ts">
const items = [{
label: 'Profile',
icon: 'i-lucide-user',
slot: 'profile'
}, {
label: 'Billing',
icon: 'i-lucide-credit-card'
}, {
label: 'Settings',
icon: 'i-lucide-cog'
}]
import type { DropdownMenuItem } from '@nuxt/ui'
const items = [
{
label: 'Profile',
icon: 'i-lucide-user',
slot: 'profile' as const
}, {
label: 'Billing',
icon: 'i-lucide-credit-card'
}, {
label: 'Settings',
icon: 'i-lucide-cog'
}
] satisfies DropdownMenuItem[]
</script>
<template>
@@ -17,7 +21,7 @@ const items = [{
<UButton label="Open" color="neutral" variant="outline" icon="i-lucide-menu" />
<template #profile-trailing>
<UIcon name="i-lucide-badge-check" class="shrink-0 size-5 text-(--ui-primary)" />
<UIcon name="i-lucide-badge-check" class="shrink-0 size-5 text-primary" />
</template>
</UDropdownMenu>
</template>

View File

@@ -1,20 +1,24 @@
<script setup lang="ts">
import type { DropdownMenuItem } from '@nuxt/ui'
const open = ref(false)
defineShortcuts({
o: () => open.value = !open.value
})
const items = [{
label: 'Profile',
icon: 'i-lucide-user'
}, {
label: 'Billing',
icon: 'i-lucide-credit-card'
}, {
label: 'Settings',
icon: 'i-lucide-cog'
}]
const items: DropdownMenuItem[] = [
{
label: 'Profile',
icon: 'i-lucide-user'
}, {
label: 'Billing',
icon: 'i-lucide-credit-card'
}, {
label: 'Settings',
icon: 'i-lucide-cog'
}
]
</script>
<template>

View File

@@ -0,0 +1,47 @@
<script setup lang="ts">
import type { FormError } from '@nuxt/ui'
const state = reactive({
email: undefined,
password: undefined
})
const form = useTemplateRef('form')
const validate = (state: any): FormError[] => {
const errors = []
if (!state.email) errors.push({ name: 'email', message: 'Required' })
if (!state.password) errors.push({ name: 'password', message: 'Required' })
return errors
}
</script>
<template>
<UForm ref="form" :validate="validate" :state="state" class="space-y-4">
<UFormField
label="Email"
name="email"
:ui="{
error: 'data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]'
}"
>
<UInput v-model="state.email" />
</UFormField>
<UFormField
label="Password"
name="password"
:ui="{
error: 'data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]'
}"
>
<UInput v-model="state.password" type="password" />
</UFormField>
<div class="flex gap-2">
<UButton label="Submit" type="submit" color="neutral" />
<UButton label="Clear" color="neutral" variant="outline" @click="form?.clear()" />
</div>
</UForm>
</template>

View File

@@ -14,7 +14,7 @@ const validate = (state: any): FormError[] => {
}
const toast = useToast()
async function onSubmit(event: FormSubmitEvent<any>) {
async function onSubmit(event: FormSubmitEvent<typeof state>) {
toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })
console.log(event.data)
}

View File

@@ -30,6 +30,9 @@ const schema = z.object({
radioGroup: z.string().refine(value => value === 'option-2', {
message: 'Select Option 2'
}),
checkboxGroup: z.any().refine(values => !!values?.find((option: any) => option === 'option-2'), {
message: 'Include Option 2'
}),
slider: z.number().max(20, { message: 'Must be less than 20' }),
pin: z.string().regex(/^\d$/).array().length(5)
})
@@ -47,7 +50,7 @@ const items = [
]
const toast = useToast()
async function onSubmit(event: FormSubmitEvent<any>) {
async function onSubmit(event: FormSubmitEvent<Schema>) {
toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })
console.log(event.data)
}
@@ -101,11 +104,14 @@ async function onSubmit(event: FormSubmitEvent<any>) {
<UFormField label="Textarea" name="textarea">
<UTextarea v-model="state.textarea" class="w-full" />
</UFormField>
<UFormField name="radioGroup">
<URadioGroup v-model="state.radioGroup" legend="Radio group" :items="items" />
</UFormField>
<div class="flex gap-4">
<UFormField name="radioGroup">
<URadioGroup v-model="state.radioGroup" legend="Radio group" :items="items" />
</UFormField>
<UFormField name="checkboxGroup">
<UCheckboxGroup v-model="state.checkboxGroup" legend="Checkbox group" :items="items" />
</UFormField>
</div>
<UFormField name="pin" label="Pin Input" :error-pattern="/(pin)\..*/">
<UPinInput v-model="state.pin" />
</UFormField>

View File

@@ -15,7 +15,7 @@ const state = reactive({
})
const toast = useToast()
async function onSubmit(event: FormSubmitEvent<any>) {
async function onSubmit(event: FormSubmitEvent<typeof state>) {
toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })
console.log(event.data)
}

View File

@@ -18,7 +18,7 @@ type NestedSchema = z.output<typeof nestedSchema>
const state = reactive<Partial<Schema & NestedSchema>>({ })
const toast = useToast()
async function onSubmit(event: FormSubmitEvent<any>) {
async function onSubmit(event: FormSubmitEvent<Schema>) {
toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })
console.log(event.data)
}
@@ -39,7 +39,7 @@ async function onSubmit(event: FormSubmitEvent<any>) {
<UCheckbox v-model="state.news" name="news" label="Register to our newsletter" @update:model-value="state.email = undefined" />
</div>
<UForm v-if="state.news" :state="state" :schema="nestedSchema">
<UForm v-if="state.news" :state="state" :schema="nestedSchema" attach>
<UFormField label="Email" name="email">
<UInput v-model="state.email" placeholder="john@lennon.com" />
</UFormField>

View File

@@ -34,7 +34,7 @@ function removeItem() {
const toast = useToast()
async function onSubmit(event: FormSubmitEvent<any>) {
async function onSubmit(event: FormSubmitEvent<Schema>) {
toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })
console.log(event.data)
}
@@ -51,7 +51,14 @@ async function onSubmit(event: FormSubmitEvent<any>) {
<UInput v-model="state.customer" placeholder="Wonka Industries" />
</UFormField>
<UForm v-for="item, count in state.items" :key="count" :state="item" :schema="itemSchema" class="flex gap-2">
<UForm
v-for="item, count in state.items"
:key="count"
:state="item"
:schema="itemSchema"
attach
class="flex gap-2"
>
<UFormField :label="!count ? 'Description' : undefined" name="description">
<UInput v-model="item.description" />
</UFormField>

View File

@@ -14,7 +14,7 @@ const validate = (state: any): FormError[] => {
}
const toast = useToast()
async function onSubmit(event: FormSubmitEvent<any>) {
async function onSubmit(event: FormSubmitEvent<typeof state>) {
toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })
console.log(event.data)
}

View File

@@ -22,7 +22,7 @@ async function onSubmit(event: FormSubmitEvent<Schema>) {
</script>
<template>
<UForm :schema="v.safeParser(schema)" :state="state" class="space-y-4" @submit="onSubmit">
<UForm :schema="schema" :state="state" class="space-y-4" @submit="onSubmit">
<UFormField label="Email" name="email">
<UInput v-model="state.email" />
</UFormField>

View File

@@ -16,7 +16,7 @@ function onOpen() {
<template>
<UInputMenu
:items="countries || []"
:items="countries"
:loading="status === 'pending'"
label-key="name"
:search-input="{ icon: 'i-lucide-search' }"

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { AvatarProps } from '@nuxt/ui'
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users',
transform: (data: { id: number, name: string }[]) => {
@@ -6,7 +8,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -14,7 +16,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template>
<UInputMenu
:items="users || []"
:items="users"
:loading="status === 'pending'"
icon="i-lucide-user"
placeholder="Select user"
@@ -23,7 +25,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<UAvatar
v-if="modelValue"
v-bind="modelValue.avatar"
:size="ui.leadingAvatarSize()"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { AvatarProps } from '@nuxt/ui'
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users-email',
transform: (data: { id: number, name: string, email: string }[]) => {
@@ -7,7 +9,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
email: user.email,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -15,7 +17,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template>
<UInputMenu
:items="users || []"
:items="users"
:loading="status === 'pending'"
:filter-fields="['label', 'email']"
icon="i-lucide-user"
@@ -26,7 +28,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<UAvatar
v-if="modelValue"
v-bind="modelValue.avatar"
:size="ui.leadingAvatarSize()"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>
@@ -34,7 +36,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template #item-label="{ item }">
{{ item.label }}
<span class="text-(--ui-text-muted)">
<span class="text-muted">
{{ item.email }}
</span>
</template>

View File

@@ -1,16 +1,18 @@
<script setup lang="ts">
import { refDebounced } from '@vueuse/core'
import type { AvatarProps } from '@nuxt/ui'
const searchTerm = ref('')
const searchTermDebounced = refDebounced(searchTerm, 200)
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users',
params: { q: searchTermDebounced },
transform: (data: { id: number, name: string }[]) => {
return data?.map(user => ({
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -19,7 +21,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template>
<UInputMenu
v-model:search-term="searchTerm"
:items="users || []"
:items="users"
:loading="status === 'pending'"
ignore-filter
icon="i-lucide-user"
@@ -29,7 +31,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<UAvatar
v-if="modelValue"
v-bind="modelValue.avatar"
:size="ui.leadingAvatarSize()"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { InputMenuItem } from '@nuxt/ui'
const items = ref([
{
label: 'benjamincanac',
@@ -23,8 +25,16 @@ const items = ref([
src: 'https://github.com/noook.png',
alt: 'noook'
}
},
{
label: 'sandros94',
value: 'sandros94',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94'
}
}
])
] satisfies InputMenuItem[])
const value = ref(items.value[0])
</script>

View File

@@ -1,27 +1,30 @@
<script setup lang="ts">
import type { InputMenuItem, ChipProps } from '@nuxt/ui'
const items = ref([
{
label: 'bug',
value: 'bug',
chip: {
color: 'error' as const
color: 'error'
}
},
{
label: 'feature',
value: 'feature',
chip: {
color: 'success' as const
color: 'success'
}
},
{
label: 'enhancement',
value: 'enhancement',
chip: {
color: 'info' as const
color: 'info'
}
}
])
] satisfies InputMenuItem[])
const value = ref(items.value[0])
</script>
@@ -33,7 +36,7 @@ const value = ref(items.value[0])
v-bind="modelValue.chip"
inset
standalone
:size="ui.itemLeadingChipSize()"
:size="(ui.itemLeadingChipSize() as ChipProps['size'])"
:class="ui.itemLeadingChip()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { InputMenuItem } from '@nuxt/ui'
const items = ref([
{
label: 'Backlog',
@@ -20,7 +22,8 @@ const items = ref([
value: 'done',
icon: 'i-lucide-circle-check'
}
])
] satisfies InputMenuItem[])
const value = ref(items.value[0])
</script>

View File

@@ -15,7 +15,7 @@ const domain = ref(domains[0])
}"
>
<template #leading>
<p class="text-sm text-(--ui-text-muted)">
<p class="text-sm text-muted">
https://
</p>
</template>

View File

@@ -13,7 +13,7 @@ const maxLength = 15
<template #trailing>
<div
id="character-count"
class="text-xs text-(--ui-text-muted) tabular-nums"
class="text-xs text-muted tabular-nums"
aria-live="polite"
role="status"
>

View File

@@ -4,8 +4,8 @@ const value = ref('')
<template>
<UInput v-model="value" placeholder="" :ui="{ base: 'peer' }">
<label class="pointer-events-none absolute left-0 -top-2.5 text-(--ui-text-highlighted) text-xs font-medium px-1.5 transition-all peer-focus:-top-2.5 peer-focus:text-(--ui-text-highlighted) peer-focus:text-xs peer-focus:font-medium peer-placeholder-shown:text-sm peer-placeholder-shown:text-(--ui-text-dimmed) peer-placeholder-shown:top-1.5 peer-placeholder-shown:font-normal">
<span class="inline-flex bg-(--ui-bg) px-1">Email address</span>
<label class="pointer-events-none absolute left-0 -top-2.5 text-highlighted text-xs font-medium px-1.5 transition-all peer-focus:-top-2.5 peer-focus:text-highlighted peer-focus:text-xs peer-focus:font-medium peer-placeholder-shown:text-sm peer-placeholder-shown:text-dimmed peer-placeholder-shown:top-1.5 peer-placeholder-shown:font-normal">
<span class="inline-flex bg-default px-1">Email address</span>
</label>
</UInput>
</template>

View File

@@ -77,7 +77,7 @@ const text = computed(() => {
v-for="(req, index) in strength"
:key="index"
class="flex items-center gap-0.5"
:class="req.met ? 'text-(--ui-success)' : 'text-(--ui-text-muted)'"
:class="req.met ? 'text-success' : 'text-muted'"
>
<UIcon :name="req.met ? 'i-lucide-circle-check' : 'i-lucide-circle-x'" class="size-4 shrink-0" />

View File

@@ -13,7 +13,9 @@ const modal = overlay.create(LazyModalExample, {
})
async function open() {
const shouldIncrement = await modal.open()
const instance = modal.open()
const shouldIncrement = await instance.result
if (shouldIncrement) {
count.value++

View File

@@ -1,9 +1,11 @@
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items = [
{
label: 'Docs',
icon: 'i-lucide-book-open',
slot: 'docs',
slot: 'docs' as const,
children: [
{
label: 'Icons',
@@ -22,7 +24,7 @@ const items = [
{
label: 'Components',
icon: 'i-lucide-box',
slot: 'components',
slot: 'components' as const,
children: [
{
label: 'Link',
@@ -54,7 +56,7 @@ const items = [
label: 'GitHub',
icon: 'i-simple-icons-github'
}
]
] satisfies NavigationMenuItem[]
</script>
<template>
@@ -63,6 +65,7 @@ const items = [
class="w-full justify-center"
:ui="{
viewport: 'sm:w-(--reka-navigation-menu-viewport-width)',
content: 'sm:w-auto',
childList: 'sm:w-96',
childLinkDescription: 'text-balance line-clamp-2'
}"
@@ -74,11 +77,11 @@ const items = [
</li>
<li v-for="child in item.children" :key="child.label">
<ULink class="text-sm text-left rounded-md p-3 transition-colors hover:bg-(--ui-bg-elevated)/50">
<p class="font-medium text-(--ui-text-highlighted)">
<ULink class="text-sm text-left rounded-md p-3 transition-colors hover:bg-elevated/50">
<p class="font-medium text-highlighted">
{{ child.label }}
</p>
<p class="text-(--ui-text-muted) line-clamp-2">
<p class="text-muted line-clamp-2">
{{ child.description }}
</p>
</ULink>

View File

@@ -1,21 +1,21 @@
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items = [
{
label: 'Guide',
icon: 'i-lucide-book-open'
},
{
label: 'Composables',
icon: 'i-lucide-database'
},
{
label: 'Components',
icon: 'i-lucide-box',
slot: 'components'
slot: 'components' as const
}
]
] satisfies NavigationMenuItem[]
</script>
<template>

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [
{
label: 'Guide',
icon: 'i-lucide-book-open',

View File

@@ -40,7 +40,7 @@ const label = ref([])
multiple
placeholder="Search labels..."
:groups="[{ id: 'labels', items }]"
:ui="{ input: '[&>input]:h-8' }"
:ui="{ input: '[&>input]:h-8 [&>input]:text-sm' }"
/>
</template>
</UPopover>

View File

@@ -8,7 +8,7 @@ const open = ref(false)
<template #content>
<div class="flex items-center gap-4 mb-4">
<h2 class="text-(--ui-text-highlighted) font-semibold">
<h2 class="text-highlighted font-semibold">
Popover non-dismissible
</h2>

View File

@@ -4,8 +4,7 @@ const { data: countries, status, execute } = await useLazyFetch<{
code: string
emoji: string
}[]>('/api/countries.json', {
immediate: false,
default: () => []
immediate: false
})
function onOpen() {

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { AvatarProps } from '@nuxt/ui'
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users',
transform: (data: { id: number, name: string }[]) => {
@@ -6,7 +8,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -14,7 +16,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template>
<USelectMenu
:items="users || []"
:items="users"
:loading="status === 'pending'"
icon="i-lucide-user"
placeholder="Select user"
@@ -24,7 +26,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<UAvatar
v-if="modelValue"
v-bind="modelValue.avatar"
:size="ui.leadingAvatarSize()"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { AvatarProps } from '@nuxt/ui'
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users-email',
transform: (data: { id: number, name: string, email: string }[]) => {
@@ -7,7 +9,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
email: user.email,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -15,7 +17,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template>
<USelectMenu
:items="users || []"
:items="users"
:loading="status === 'pending'"
:filter-fields="['label', 'email']"
icon="i-lucide-user"
@@ -26,7 +28,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<UAvatar
v-if="modelValue"
v-bind="modelValue.avatar"
:size="ui.leadingAvatarSize()"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>
@@ -34,7 +36,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template #item-label="{ item }">
{{ item.label }}
<span class="text-(--ui-text-muted)">
<span class="text-muted">
{{ item.email }}
</span>
</template>

View File

@@ -1,16 +1,18 @@
<script setup lang="ts">
import { refDebounced } from '@vueuse/core'
import type { AvatarProps } from '@nuxt/ui'
const searchTerm = ref('')
const searchTermDebounced = refDebounced(searchTerm, 200)
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users',
params: { q: searchTermDebounced },
transform: (data: { id: number, name: string }[]) => {
return data?.map(user => ({
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -19,7 +21,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<template>
<USelectMenu
v-model:search-term="searchTerm"
:items="users || []"
:items="users"
:loading="status === 'pending'"
ignore-filter
icon="i-lucide-user"
@@ -30,7 +32,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
<UAvatar
v-if="modelValue"
v-bind="modelValue.avatar"
:size="ui.leadingAvatarSize()"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { SelectMenuItem } from '@nuxt/ui'
const items = ref([
{
label: 'benjamincanac',
@@ -23,8 +25,16 @@ const items = ref([
src: 'https://github.com/noook.png',
alt: 'noook'
}
},
{
label: 'sandros94',
value: 'sandros94',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94'
}
}
])
] satisfies SelectMenuItem[])
const value = ref(items.value[0])
</script>

View File

@@ -1,27 +1,29 @@
<script setup lang="ts">
import type { SelectMenuItem, ChipProps } from '@nuxt/ui'
const items = ref([
{
label: 'bug',
value: 'bug',
chip: {
color: 'error' as const
color: 'error'
}
},
{
label: 'feature',
value: 'feature',
chip: {
color: 'success' as const
color: 'success'
}
},
{
label: 'enhancement',
value: 'enhancement',
chip: {
color: 'info' as const
color: 'info'
}
}
])
] satisfies SelectMenuItem[])
const value = ref(items.value[0])
</script>
@@ -33,7 +35,7 @@ const value = ref(items.value[0])
v-bind="modelValue.chip"
inset
standalone
:size="ui.itemLeadingChipSize()"
:size="(ui.itemLeadingChipSize() as ChipProps['size'])"
:class="ui.itemLeadingChip()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { SelectMenuItem } from '@nuxt/ui'
const items = ref([
{
label: 'Backlog',
@@ -20,7 +22,7 @@ const items = ref([
value: 'done',
icon: 'i-lucide-circle-check'
}
])
] satisfies SelectMenuItem[])
const value = ref(items.value[0])
</script>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { AvatarProps } from '@nuxt/ui'
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'typicode-users',
transform: (data: { id: number, name: string }[]) => {
@@ -6,7 +8,7 @@ const { data: users, status } = await useFetch('https://jsonplaceholder.typicode
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -18,17 +20,18 @@ function getUserAvatar(value: string) {
<template>
<USelect
:items="users || []"
:items="users"
:loading="status === 'pending'"
icon="i-lucide-user"
placeholder="Select user"
class="w-48"
value-key="value"
>
<template #leading="{ modelValue, ui }">
<UAvatar
v-if="modelValue"
v-bind="getUserAvatar(modelValue as string)"
:size="ui.leadingAvatarSize()"
v-bind="getUserAvatar(modelValue)"
:size="(ui.leadingAvatarSize() as AvatarProps['size'])"
:class="ui.leadingAvatar()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { SelectItem } from '@nuxt/ui'
const items = ref([
{
label: 'benjamincanac',
@@ -23,13 +25,21 @@ const items = ref([
src: 'https://github.com/noook.png',
alt: 'noook'
}
},
{
label: 'sandros94',
value: 'sandros94',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94'
}
}
])
] satisfies SelectItem[])
const value = ref(items.value[0]?.value)
const avatar = computed(() => items.value.find(item => item.value === value.value)?.avatar)
</script>
<template>
<USelect v-model="value" :avatar="avatar" :items="items" class="w-48" />
<USelect v-model="value" :items="items" value-key="value" :avatar="avatar" class="w-48" />
</template>

View File

@@ -1,27 +1,30 @@
<script setup lang="ts">
import type { SelectItem, ChipProps } from '@nuxt/ui'
const items = ref([
{
label: 'bug',
value: 'bug',
chip: {
color: 'error' as const
color: 'error'
}
},
{
label: 'feature',
value: 'feature',
chip: {
color: 'success' as const
color: 'success'
}
},
{
label: 'enhancement',
value: 'enhancement',
chip: {
color: 'info' as const
color: 'info'
}
}
])
] satisfies SelectItem[])
const value = ref(items.value[0]?.value)
function getChip(value: string) {
@@ -30,14 +33,14 @@ function getChip(value: string) {
</script>
<template>
<USelect v-model="value" :items="items" class="w-48">
<USelect v-model="value" :items="items" value-key="value" class="w-48">
<template #leading="{ modelValue, ui }">
<UChip
v-if="modelValue"
v-bind="getChip(modelValue as string)"
v-bind="getChip(modelValue)"
inset
standalone
:size="ui.itemLeadingChipSize()"
:size="(ui.itemLeadingChipSize() as ChipProps['size'])"
:class="ui.itemLeadingChip()"
/>
</template>

View File

@@ -1,4 +1,6 @@
<script setup lang="ts">
import type { SelectItem } from '@nuxt/ui'
const items = ref([
{
label: 'Backlog',
@@ -20,12 +22,12 @@ const items = ref([
value: 'done',
icon: 'i-lucide-circle-check'
}
])
] satisfies SelectItem[])
const value = ref(items.value[0]?.value)
const icon = computed(() => items.value.find(item => item.value === value.value)?.icon)
</script>
<template>
<USelect v-model="value" :icon="icon" :items="items" class="w-48" />
<USelect v-model="value" :items="items" value-key="value" :icon="icon" class="w-48" />
</template>

View File

@@ -13,7 +13,9 @@ const slideover = overlay.create(LazySlideoverExample, {
})
async function open() {
const shouldIncrement = await slideover.open()
const instance = slideover.open()
const shouldIncrement = await instance.result
if (shouldIncrement) {
count.value++

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { StepperItem } from '@nuxt/ui'
const items: StepperItem[] = [
{
title: 'Address',
description: 'Add your address here',

View File

@@ -1,21 +1,23 @@
<script setup lang="ts">
import type { StepperItem } from '@nuxt/ui'
const items = [
{
slot: 'address',
slot: 'address' as const,
title: 'Address',
description: 'Add your address here',
icon: 'i-lucide-house'
}, {
slot: 'shipping',
slot: 'shipping' as const,
title: 'Shipping',
description: 'Set your preferred shipping method',
icon: 'i-lucide-truck'
}, {
slot: 'checkout',
slot: 'checkout' as const,
title: 'Checkout',
description: 'Confirm your order'
}
]
] satisfies StepperItem[]
</script>
<template>

View File

@@ -1,7 +1,8 @@
<script setup lang="ts">
import type { StepperItem } from '@nuxt/ui'
import { onMounted, ref } from 'vue'
const items = [
const items: StepperItem[] = [
{
title: 'Address',
description: 'Add your address here',

View File

@@ -1,17 +1,16 @@
<script setup lang="ts">
const items = [
import type { StepperItem } from '@nuxt/ui'
const items: StepperItem[] = [
{
slot: 'address',
title: 'Address',
description: 'Add your address here',
icon: 'i-lucide-house'
}, {
slot: 'shipping',
title: 'Shipping',
description: 'Set your preferred shipping method',
icon: 'i-lucide-truck'
}, {
slot: 'checkout',
title: 'Checkout',
description: 'Confirm your order'
}

Some files were not shown because too many files have changed in this diff Show More