Compare commits

...

270 Commits

Author SHA1 Message Date
Daniel Roe
c532a6f930 chore: bump to 0.1.9 2025-04-08 08:48:39 -07:00
Daniel Roe
6bbcb40c9e chore: bump to 0.1.8 2025-04-08 08:14:48 -07:00
Daniel Roe
befda895b9 build: bump vue-sfc-transformer 2025-04-07 19:25:13 -07: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
Benjamin Canac
cc7bdf9247 chore(release): v3.0.0-beta.4 2025-03-12 14:15:31 +01:00
renovate[bot]
8cbf6d2d58 chore(deps): update all non-major dependencies (v3) (#3521)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-12 14:10:05 +01:00
renovate[bot]
881f977fe4 chore(deps): update tailwindcss to ^4.0.13 (v3) (#3526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-12 13:55:27 +01:00
Romain Hamel
6e03d9c6ef feat(Form): global errors (#3482)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-11 14:50:36 +01:00
Benjamin Canac
5ecd2271ca fix(vue): prevent calling useHead in colors 2025-03-11 10:36:13 +01:00
Benjamin Canac
556ebb0b36 playground-vue: add logo 2025-03-11 09:59:36 +01:00
Benjamin Canac
3a56e3cf45 chore(deps): update @nuxt/ui-pro 2025-03-11 09:59:36 +01:00
renovate[bot]
34dfe7d4b3 chore(deps): update all non-major dependencies (v3) (#3518)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-11 09:59:17 +01:00
GU Yiling
54468ca0f2 docs(figma): improve figma to code section (#3520) 2025-03-11 09:58:13 +01:00
Alex
a9c8eb3f60 feat(useLocale): handle generic messages (#3100)
Co-authored-by: hywax <me@hywax.space>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-10 18:37:28 +01:00
Eugen Istoc
04fc367568 docs(migration): fix typo (#3516) 2025-03-10 15:49:22 +01:00
Eugen Istoc
2b4e88d727 docs(migration): describe useToast and useOverlay (#3509)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-10 14:08:57 +01:00
Benjamin Canac
c713f3015d chore(deps): add vue / vue-router as dependencies 2025-03-10 12:42:56 +01:00
Benjamin Canac
0a603e41f9 chore(Pagination): remove vue-router import 2025-03-10 12:34:40 +01:00
renovate[bot]
8329fedd1a chore(deps): lock file maintenance (v3) (#3508)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 11:53:10 +01:00
renovate[bot]
e289db874d chore(deps): update all non-major dependencies (v3) (#3502)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 11:24:02 +01:00
Benjamin Canac
cbc5675e04 chore(vitest): improve config to ignore docs .c12 2025-03-10 11:14:41 +01:00
Benjamin Canac
66686d2d2a chore(deps): remove happy-dom resolution 2025-03-10 11:13:56 +01:00
Benjamin Canac
e67906aa0b chore(renovate): ignore vaul-vue 2025-03-10 10:59:42 +01:00
renovate[bot]
20fb8252f7 chore(deps): update vueuse monorepo to v13 (v3) (major) (#3512)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 10:47:48 +01:00
Iván Máximiliano, Lo Giudice
97c8098d4a fix(Form): input blur validation on submit (#3504) 2025-03-09 13:56:03 +01:00
Benjamin Canac
fbc3200ec5 chore(deps): update @nuxt/ui-pro 2025-03-09 13:00:33 +01:00
Benjamin Canac
243f981ff4 docs(app): add missing cache-key on mdc 2025-03-09 12:30:49 +01:00
renovate[bot]
9979a1c818 chore(deps): update nuxt framework to ^3.16.0 (v3) (#3484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
Co-authored-by: Pooya Parsa <pooya@pi0.io>
2025-03-09 12:28:54 +01:00
renovate[bot]
619bf0d7c9 chore(deps): update all non-major dependencies (v3) (#3497)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-08 23:13:20 +01:00
Benjamin Canac
21dbf01888 fix(Button): missing import
Related to nuxt/ui#3417
2025-03-08 22:48:53 +01:00
renovate[bot]
a208dedaea chore(deps): update dependency tailwind-variants to v1 (v3) (#3499)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-08 19:40:23 +01:00
Benjamin Canac
6120a15a99 chore(LinkBase): update types for nuxt@3.16 2025-03-08 15:42:25 +01:00
renovate[bot]
b1552e447d chore(deps): update all non-major dependencies (v3) (#3489)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-08 12:48:04 +01:00
Benjamin Canac
36ec141c16 docs(installation): improve continuous releases section 2025-03-08 12:21:17 +01:00
Benjamin Canac
7940f5c0aa chore(templates): add tsdoc on ui app config key 2025-03-07 18:33:48 +01:00
Iván Máximiliano, Lo Giudice
cfe9b2ecf3 feat(Input/Textarea): allow null value in model (#3415) 2025-03-07 18:17:30 +01:00
Benjamin Canac
ed7710a890 docs(deps): update @nuxt/ui-pro 2025-03-07 18:08:29 +01:00
Benjamin Canac
83725ac048 chore(release): v3.0.0-beta.3 2025-03-07 15:38:35 +01:00
renovate[bot]
af2f8987a3 chore(deps): update all non-major dependencies (v3) (#3473)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-07 14:56:42 +01:00
renovate[bot]
f6250f979a chore(deps): update tailwindcss to ^4.0.12 (v3) (#3480)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-07 14:41:55 +01:00
Benjamin Canac
87ecee6308 docs(components): move group class on card 2025-03-07 14:29:53 +01:00
Benjamin Canac
476408f6e5 docs(SupportedLanguages): add he mapping and comments 2025-03-07 14:26:13 +01:00
Benjamin Canac
e016fdea18 docs(deps): update shiki-transformer-color-highlight 2025-03-06 17:47:36 +01:00
Benjamin Canac
d9a6218524 docs(app): dont filter components on framework in search 2025-03-06 17:33:43 +01:00
Benjamin Canac
2ae338e8a5 docs: improve marketing
Co-Authored-By: Sébastien Chopin <atinux@gmail.com>
2025-03-06 17:07:15 +01:00
Benjamin Canac
a6f93ca1ce docs(nuxt.config): add redirect 2025-03-06 16:58:47 +01:00
Benjamin Canac
63266d366d docs(Header): improve logo based on route 2025-03-06 16:58:38 +01:00
Benjamin Canac
5671618c9a docs(components): remove useless div around stars 2025-03-06 16:38:01 +01:00
Benjamin Canac
60497174a3 docs(deps): update @nuxt/ui-pro 2025-03-06 16:04:59 +01:00
renovate[bot]
704abf7917 chore(deps): update tailwindcss to ^4.0.11 (v3) (#3468)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-06 14:38:57 +01:00
renovate[bot]
a1de006055 chore(deps): update all non-major dependencies (v3) (#3442)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-06 14:38:18 +01:00
Sébastien Chopin
4f51d19e2b docs: add landing page (#3448)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-06 12:50:22 +01:00
Benjamin Canac
196ffbc989 docs(app): display components in search 2025-03-06 11:58:30 +01:00
Jakub Andrzejewski
a6f58cba14 docs(migration): improve changed components section (#3449)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-06 11:42:16 +01:00
renovate[bot]
977fed0122 chore(deps): update tailwindcss to ^4.0.10 (v3) (#3460)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-05 19:51:44 +01:00
Benjamin Canac
bd2d4848d2 feat(Button): handle active state
Resolves #3417
2025-03-05 18:52:58 +01:00
Benjamin Canac
e3ce1f7a41 docs(theme): fix duplicate blocks 2025-03-05 14:31:27 +01:00
Benjamin Canac
08f092fd15 playground(table): add select event 2025-03-04 16:22:23 +01:00
renovate[bot]
3f7df7be9b chore(deps): update dependency ohash to v2 (v3) (#3362)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-03-04 16:18:54 +01:00
Benjamin Canac
99e531d8df feat(Table): add loading slot
Resolves #3444
2025-03-04 14:11:29 +01:00
Benjamin Canac
a47c5ff466 fix(Pagination): add missing slots
Resolves #3441
2025-03-04 13:57:51 +01:00
Benjamin Canac
60b7e2d69e fix(InputMenu/SelectMenu): proxy required in root props 2025-03-04 12:59:01 +01:00
Benjamin Canac
01fa230eae fix(InputMenu): wrong required in multiple mode
Resolves #2741
2025-03-04 12:54:39 +01:00
Benjamin Canac
e823022b19 fix(Pagination): wrong next link
Resolves #3008
2025-03-04 12:08:43 +01:00
Benjamin Canac
25e503bc83 chore(components): improve tsdoc 2025-03-04 11:58:31 +01:00
Hessam A. Cheraghi
629c54261a docs(calendar): other calendar systems (#3447) 2025-03-04 10:41:00 +01:00
Romain Hamel
fb4e05c65f chore(components): add @IconifyIcon tag on icon properties (#3445) 2025-03-04 10:40:13 +01:00
Benjamin Canac
ccbd89c908 fix(templates): prevent overriding existing colors
Resolves #3426
2025-03-03 19:34:30 +01:00
Benjamin Canac
145fce1b30 docs(migration): invalid classes 2025-03-03 18:40:57 +01:00
Benjamin Canac
52a92c658f docs(migration): add ui pro components table 2025-03-03 18:39:57 +01:00
Benjamin Canac
557dca9a22 docs(migration): add page 2025-03-03 17:59:10 +01:00
Benjamin Canac
bd23cf3e9d docs(deps): update @nuxt/ui-pro 2025-03-03 17:17:00 +01:00
Benjamin Canac
4514171a3f docs(theme): fix config section 2025-03-03 16:56:57 +01:00
Sébastien Chopin
d76f9c4fe4 docs(pricing): update testimonials 2025-03-03 16:41:36 +01:00
Benjamin Canac
62f71f3fbc docs(getting-started): improve 2025-03-03 15:36:36 +01:00
Benjamin Canac
6daa8f1e31 docs(getting-started): update for beta 2025-03-03 12:33:04 +01:00
Benjamin Canac
5783d0d931 docs(getting-started): remove Radix Vue mention 2025-03-03 12:32:38 +01:00
renovate[bot]
58568c642d chore(deps): lock file maintenance (v3) (#3435)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 12:05:13 +01:00
renovate[bot]
02329c78c2 chore(deps): update all non-major dependencies (v3) (#3423)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 11:50:53 +01:00
Hugo Richard
9f241de1b5 docs: update raycast extension link (#3431) 2025-03-02 10:35:14 +01:00
Eugen Istoc
7f420d9bec docs(modal/slideover): update close method in tips to use emit('close') (#3421) 2025-03-01 11:08:09 +01:00
Sébastien Chopin
80b701d270 docs(template): add link to vue templates and add starter 2025-03-01 09:42:41 +01:00
Sébastien Chopin
21175c8c59 docs(pro): improve responsive for screenshots marquee 2025-02-28 23:27:07 +01:00
Benjamin Canac
dd708da235 docs: update badges 2025-02-28 19:12:35 +01:00
Sébastien Chopin
f1758ef9d0 docs(template): Add flex-1 on screenshots 2025-02-28 18:57:53 +01:00
Sébastien Chopin
0d1fccc3c5 docs(pro): animate screenshots on landing page 2025-02-28 18:31:48 +01:00
Benjamin Canac
6446130b5d docs(tree): wrong reka-ui link 2025-02-28 17:32:22 +01:00
425 changed files with 17573 additions and 10671 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 [v3 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,7 +37,7 @@ body:
id: version
attributes:
label: Version
placeholder: v3.0.0-alpha.x
placeholder: v3.0.0
validations:
required: true
- type: textarea

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 [v3 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 [v3 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

@@ -50,16 +50,164 @@ 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
run: pnpx pkg-pr-new publish --compact --no-template --pnpm
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

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

View File

@@ -1,5 +1,102 @@
# Changelog
## [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
* **Form:** global errors ([#3482](https://github.com/nuxt/ui/issues/3482)) ([6e03d9c](https://github.com/nuxt/ui/commit/6e03d9c6efc8f4cfc306813e733d7d3e03706323))
* **Input/Textarea:** allow `null` value in model ([#3415](https://github.com/nuxt/ui/issues/3415)) ([cfe9b2e](https://github.com/nuxt/ui/commit/cfe9b2ecf34827bc11a5281a069988ab96030047))
* **useLocale:** handle generic messages ([#3100](https://github.com/nuxt/ui/issues/3100)) ([a9c8eb3](https://github.com/nuxt/ui/commit/a9c8eb3f60a10d1a71632991c9db594716b0fba1))
### Bug Fixes
* **Button:** missing import ([21dbf01](https://github.com/nuxt/ui/commit/21dbf01888a161a9d8ac6eb0d957c1342f6cc30d)), closes [nuxt/ui#3417](https://github.com/nuxt/ui/issues/3417)
* **Form:** input blur validation on submit ([#3504](https://github.com/nuxt/ui/issues/3504)) ([97c8098](https://github.com/nuxt/ui/commit/97c8098d4a35c392719ae179d36aa008d6f8f78a))
* **vue:** prevent calling `useHead` in colors ([5ecd227](https://github.com/nuxt/ui/commit/5ecd2271ca86087cb805548397d75c38763ad412))
## [3.0.0-beta.3](https://github.com/nuxt/ui/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-03-07)
### Features
* **Button:** handle `active` state ([bd2d484](https://github.com/nuxt/ui/commit/bd2d4848d246a3d5930f8059913f5a1a0abe29fd)), closes [#3417](https://github.com/nuxt/ui/issues/3417)
* **Table:** add `loading` slot ([99e531d](https://github.com/nuxt/ui/commit/99e531d8dfb7954322b7ab7feda3d8814c6d8d02)), closes [#3444](https://github.com/nuxt/ui/issues/3444)
### Bug Fixes
* **InputMenu/SelectMenu:** proxy `required` in root props ([60b7e2d](https://github.com/nuxt/ui/commit/60b7e2d69e80afa7e221855dcec46479d0ca5c6c))
* **InputMenu:** wrong `required` in multiple mode ([01fa230](https://github.com/nuxt/ui/commit/01fa230eae4b6623c5fd71cc218d114d9f6f0f25)), closes [#2741](https://github.com/nuxt/ui/issues/2741)
* **Pagination:** add missing slots ([a47c5ff](https://github.com/nuxt/ui/commit/a47c5ff46616eafee3158cb9801183965f5f9874)), closes [#3441](https://github.com/nuxt/ui/issues/3441)
* **Pagination:** wrong next link ([e823022](https://github.com/nuxt/ui/commit/e823022b19bb172d2e5fabb9144b4a4286a25a5f)), closes [#3008](https://github.com/nuxt/ui/issues/3008)
* **templates:** prevent overriding existing colors ([ccbd89c](https://github.com/nuxt/ui/commit/ccbd89c908fe8af54c7d723dd12da5b7f3906c8f)), closes [#3426](https://github.com/nuxt/ui/issues/3426)
## [3.0.0-beta.2](https://github.com/nuxt/ui/compare/v3.0.0-beta.1...v3.0.0-beta.2) (2025-02-28)
### Bug Fixes

View File

@@ -11,31 +11,31 @@
[![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.
## 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 +51,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 +98,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 +130,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

@@ -6,9 +6,6 @@ export default defineBuildConfig({
'./src/unplugin',
'./src/vite'
],
rollup: {
emitCJS: true
},
replace: {
'process.env.DEV': 'false'
},

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

@@ -33,7 +33,7 @@ const component = ({ name, primitive, pro, prose, content }) => {
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 { tv } from '../utils/tv'
const appConfig${camelName} = _appConfig as AppConfig & { ${key}: { ${prose ? 'prose: { ' : ''}${camelName}: Partial<typeof theme> } }${prose ? ' }' : ''}
@@ -76,7 +76,7 @@ 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 { tv } from '../utils/tv'
const appConfig${camelName} = _appConfig as AppConfig & { ${key}: { ${prose ? 'prose: { ' : ''}${camelName}: Partial<typeof theme> } }${prose ? ' }' : ''}

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 },
@@ -61,7 +51,7 @@ provide('navigation', mappedNavigation)
<NuxtLoadingIndicator color="var(--ui-primary)" :height="2" />
<template v-if="!route.path.startsWith('/examples')">
<!-- <Banner /> -->
<Banner />
<Header :links="links" />
</template>
@@ -75,7 +65,7 @@ provide('navigation', mappedNavigation)
<ClientOnly>
<LazyUContentSearch
v-model:search-term="searchTerm"
:links="searchLinks"
:files="files"
:groups="[{
id: 'framework',
@@ -95,5 +85,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 */
</style>

View File

@@ -2,6 +2,7 @@
@import "@nuxt/ui-pro";
@source "../../../content";
@source "../../../node_modules/.c12";
@theme static {
--container-8xl: 90rem;

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-(--ui-border) rounded-[calc(var(--ui-radius)*1.5)] hover:bg-(--ui-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-(--ui-radius);
}
}
.carbon-text {
@apply text-sm text-(--ui-text-muted) transition-colors text-center text-pretty flex pt-2;
}
.carbon-poweredby {
@apply block text-xs text-center text-(--ui-text-muted) pt-2;
}
&:hover {
.carbon-text {
@apply text-(--ui-text);
}
}
}
</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

@@ -1,7 +1,9 @@
<script setup lang="ts">
const route = useRoute()
const links = [{
label: 'Figma',
to: '/figma'
label: 'Team',
to: '/team'
}, {
label: 'Roadmap',
to: '/roadmap'
@@ -16,7 +18,7 @@ const links = [{
</script>
<template>
<USeparator icon="i-simple-icons-nuxtdotjs" class="h-px" />
<USeparator :icon="route.path === '/' ? undefined : 'i-simple-icons-nuxtdotjs'" class="h-px" />
<UFooter>
<template #left>

View File

@@ -22,22 +22,38 @@ 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">
<LogoPro class="w-auto h-6 shrink-0 ui-pro-only" />
<Logo class="w-auto h-6 shrink-0 ui-only" />
<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>
<LogoPro class="w-auto h-6 shrink-0 ui-pro-only" />
<Logo class="w-auto h-6 shrink-0 ui-only" />
</template>
</NuxtLink>
<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"
>
@@ -69,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"
@@ -78,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" />

View File

@@ -0,0 +1,95 @@
<script setup lang="ts">
import { kebabCase } from 'scule'
interface Star {
x: number
y: number
size: number
twinkleDelay: number
id: string
}
const props = withDefaults(defineProps<{
starCount?: number
color?: string
size?: { min: number, max: number }
speed?: 'slow' | 'normal' | 'fast'
isIndex?: boolean
}>(), {
starCount: 50,
color: 'var(--ui-primary)',
size: () => ({
min: 1,
max: 3
}),
speed: 'normal',
isIndex: false
})
const route = useRoute()
// Generate random stars
const generateStars = (count: number): Star[] => {
return Array.from({ length: count }, () => {
const x = Math.floor(Math.random() * 100)
const y = Math.floor(Math.random() * 100)
const size = Math.random() * (props.size.max - props.size.min) + props.size.min
const twinkleDelay = Math.random() * 5
return { x, y, size, twinkleDelay, id: Math.random().toString(36).substring(2, 9) }
})
}
// Generate all stars
const stars = useState<Star[]>(`${kebabCase(route.path)}-sky`, () => generateStars(props.starCount))
// Compute twinkle animation duration based on speed
const twinkleDuration = computed(() => {
const speedMap: Record<string, string> = {
slow: '4s',
normal: '2s',
fast: '1s'
}
return speedMap[props.speed]
})
</script>
<template>
<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>
<style scoped>
.star {
width: var(--star-size);
height: var(--star-size);
background-color: var(--star-color);
border-radius: 50%;
animation: twinkle var(--twinkle-duration) ease-in-out infinite;
animation-delay: var(--twinkle-delay);
will-change: opacity;
}
@keyframes twinkle {
0%, 100% {
opacity: 0.2;
}
50% {
opacity: 1;
}
}
</style>

File diff suppressed because one or more lines are too long

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 */
@@ -209,11 +212,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>
@@ -346,7 +359,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>

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'
@@ -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>

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { upperFirst, camelCase } from 'scule'
import { upperFirst, camelCase, kebabCase } from 'scule'
import type { ComponentMeta } from 'vue-component-meta'
import * as theme from '#build/ui'
import * as themePro from '#build/ui-pro'
@@ -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" />
<MDC v-if="prop.description" :value="prop.description" class="text-(--ui-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

@@ -1,17 +1,20 @@
<script setup lang="ts">
import { kebabCase } from 'scule'
import type { PropertyMeta } from 'vue-component-meta'
const props = defineProps<{
prop: PropertyMeta
}>()
const route = useRoute()
const links = computed(() => props.prop.tags?.filter((tag: any) => tag.name === 'link'))
</script>
<template>
<ProseUl v-if="links?.length">
<ProseLi v-for="link in links" :key="link.name">
<MDC :value="link.text ?? ''" class="my-1" />
<ProseLi v-for="(link, index) in links" :key="index">
<MDC :value="link.text ?? ''" class="my-1" :cache-key="`${kebabCase(route.path)}-${prop.name}-link-${index}`" />
</ProseLi>
</ProseUl>
</template>

View File

@@ -1,4 +1,5 @@
<script setup lang="ts">
import { kebabCase } from 'scule'
import type { PropertyMeta } from 'vue-component-meta'
const props = defineProps<{
@@ -6,6 +7,8 @@ const props = defineProps<{
ignore?: string[]
}>()
const route = useRoute()
function getSchemaProps(schema: PropertyMeta['schema']): any {
if (!schema || typeof schema === 'string' || !schema.schema) {
return []
@@ -40,7 +43,7 @@ const schemaProps = computed(() => {
<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" />
<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`" />
</ProseLi>
</ProseUl>
</ProseCollapsible>

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { upperFirst, camelCase } from 'scule'
import { upperFirst, camelCase, kebabCase } from 'scule'
const props = defineProps<{
prose?: boolean
@@ -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" />
<MDC v-if="slot.description" :value="slot.description" class="text-(--ui-text-toned) mt-1" :cache-key="`${kebabCase(route.path)}-${slot.name}-description`" />
</ProseTd>
</ProseTr>
</ProseTbody>

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { murmurHash } from 'ohash'
import { hash } from 'ohash'
const props = defineProps<{
type: string
@@ -23,7 +23,7 @@ const type = computed(() => {
return type
})
const { data: ast } = await useAsyncData(`hightlight-inline-code-${murmurHash(type.value)}`, () => parseMarkdown(`\`${type.value}\`{lang="ts-type"}`))
const { data: ast } = await useAsyncData(`hightlight-inline-code-${hash(type.value).slice(0, 10)}`, () => parseMarkdown(`\`${type.value}\`{lang="ts-type"}`))
</script>
<template>

View File

@@ -9,21 +9,26 @@ const props = withDefaults(defineProps<{
function getEmojiFlag(locale: string): string {
const languageToCountry: Record<string, string> = {
ar: 'sa',
bn: 'bd',
cs: 'cz',
da: 'dk',
el: 'gr',
et: 'ee',
en: 'gb',
hi: 'in',
ja: 'jp',
km: 'kh',
ko: 'kr',
nb: 'no',
sv: 'se',
uk: 'ua',
vi: 'vn'
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
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
km: 'kh', // Khmer -> Cambodia
ko: 'kr', // Korean -> South Korea
nb: 'no', // Norwegian Bokmål -> Norway
sv: 'se', // Swedish -> Sweden
uk: 'ua', // Ukrainian -> Ukraine
ur: 'pk', // Urdu -> Pakistan
vi: 'vn' // Vietnamese -> Vietnam
}
const baseLanguage = locale.split('-')[0]?.toLowerCase() || locale

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'

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,7 +18,7 @@ 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>

View File

@@ -0,0 +1,33 @@
<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',
slot: 'colors' as const,
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

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

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [{
import type { BreadcrumbItem } from '@nuxt/ui'
const items: BreadcrumbItem[] = [{
label: 'Home',
to: '/'
}, {

View File

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

View File

@@ -0,0 +1,9 @@
<script lang="ts" setup>
import { CalendarDate, HebrewCalendar } from '@internationalized/date'
const hebrewDate = shallowRef(new CalendarDate(new HebrewCalendar(), 5781, 1, 1))
</script>
<template>
<UCalendar v-model="hebrewDate" />
</template>

View File

@@ -11,7 +11,7 @@ const groups = [{
label: 'Billing',
icon: 'i-lucide-credit-card',
kbds: ['meta', 'B'],
slot: 'billing'
slot: 'billing' as const
},
{
label: 'Notifications',
@@ -25,7 +25,7 @@ const groups = [{
}, {
id: 'users',
label: 'Users',
slot: 'users',
slot: 'users' as const,
items: [
{
label: 'Benjamin Canac',

View File

@@ -2,6 +2,7 @@
const searchTerm = ref('')
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'command-palette-users',
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,5 +1,6 @@
<script setup lang="ts">
const { data: users } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'command-palette-users',
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

@@ -3,6 +3,7 @@ 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

@@ -11,7 +11,7 @@ const items = [
level: 2
},
{
id: '/getting-started#reka-ui-radix-vue',
id: '/getting-started#reka-ui',
label: 'Reka UI',
level: 3
},

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
}, {

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { ContextMenuItem } from '@nuxt/ui'
const items: ContextMenuItem[][] = [
[
{
label: 'View',

View File

@@ -1,7 +1,9 @@
<script setup lang="ts">
import type { ContextMenuItem } from '@nuxt/ui'
const loading = ref(true)
const items = [{
const items: ContextMenuItem[] = [{
label: 'Refresh the Page',
slot: 'refresh'
}, {

View File

@@ -2,6 +2,7 @@
const searchTerm = ref('')
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'command-palette-users',
params: { q: searchTerm },
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

@@ -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>

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

@@ -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,11 +1,14 @@
<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 }[]) => {
return data?.map(user => ({
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -13,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"
@@ -22,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,12 +1,15 @@
<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 }[]) => {
return data?.map(user => ({
label: user.name,
email: user.email,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -14,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"
@@ -25,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>

View File

@@ -1,15 +1,18 @@
<script setup lang="ts">
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
})
@@ -18,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"
@@ -28,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

@@ -2,6 +2,7 @@
const searchTerm = ref('')
const { data: users, status } = await useFetch('https://jsonplaceholder.typicode.com/users', {
key: 'command-palette-users',
params: { q: searchTerm },
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,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>

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

@@ -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

@@ -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,11 +1,14 @@
<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 }[]) => {
return data?.map(user => ({
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -13,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"
@@ -23,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,12 +1,15 @@
<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 }[]) => {
return data?.map(user => ({
label: user.name,
email: user.email,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -14,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"
@@ -25,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>

View File

@@ -1,15 +1,18 @@
<script setup lang="ts">
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
})
@@ -18,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"
@@ -29,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,11 +1,14 @@
<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 }[]) => {
return data?.map(user => ({
label: user.name,
value: String(user.id),
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
})) || []
}))
},
lazy: true
})
@@ -17,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

@@ -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,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { StepperItem } from '@nuxt/ui'
const items: StepperItem[] = [
{
slot: 'address',
title: 'Address',

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,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { StepperItem } from '@nuxt/ui'
const items: StepperItem[] = [
{
slot: 'address',
title: 'Address',

View File

@@ -97,10 +97,11 @@ function getHeader(column: Column<Payment>, label: string) {
const isSorted = column.getIsSorted()
return h(UDropdownMenu, {
content: {
'content': {
align: 'start'
},
items: [{
'aria-label': 'Actions dropdown',
'items': [{
label: 'Asc',
type: 'checkbox',
icon: 'i-lucide-arrow-up-narrow-wide',
@@ -126,11 +127,12 @@ function getHeader(column: Column<Payment>, label: string) {
}
}]
}, () => h(UButton, {
color: 'neutral',
variant: 'ghost',
'color': 'neutral',
'variant': 'ghost',
label,
icon: isSorted ? (isSorted === 'asc' ? 'i-lucide-arrow-up-narrow-wide' : 'i-lucide-arrow-down-wide-narrow') : 'i-lucide-arrow-up-down',
class: '-mx-2.5 data-[state=open]:bg-(--ui-bg-elevated)'
'icon': isSorted ? (isSorted === 'asc' ? 'i-lucide-arrow-up-narrow-wide' : 'i-lucide-arrow-down-wide-narrow') : 'i-lucide-arrow-up-down',
'class': '-mx-2.5 data-[state=open]:bg-(--ui-bg-elevated)',
'aria-label': `Sort by ${isSorted === 'asc' ? 'descending' : 'ascending'}`
}))
}

View File

@@ -145,12 +145,12 @@ const columns: TableColumn<Payment>[] = [{
header: ({ table }) => h(UCheckbox, {
'modelValue': table.getIsSomePageRowsSelected() ? 'indeterminate' : table.getIsAllPageRowsSelected(),
'onUpdate:modelValue': (value: boolean | 'indeterminate') => table.toggleAllPageRowsSelected(!!value),
'ariaLabel': 'Select all'
'aria-label': 'Select all'
}),
cell: ({ row }) => h(UCheckbox, {
'modelValue': row.getIsSelected(),
'onUpdate:modelValue': (value: boolean | 'indeterminate') => row.toggleSelected(!!value),
'ariaLabel': 'Select row'
'aria-label': 'Select row'
}),
enableSorting: false,
enableHiding: false
@@ -242,15 +242,17 @@ const columns: TableColumn<Payment>[] = [{
}]
return h('div', { class: 'text-right' }, h(UDropdownMenu, {
content: {
'content': {
align: 'end'
},
items
items,
'aria-label': 'Actions dropdown'
}, () => h(UButton, {
icon: 'i-lucide-ellipsis-vertical',
color: 'neutral',
variant: 'ghost',
class: 'ml-auto'
'icon': 'i-lucide-ellipsis-vertical',
'color': 'neutral',
'variant': 'ghost',
'class': 'ml-auto',
'aria-label': 'Actions dropdown'
})))
}
}]
@@ -294,6 +296,7 @@ function randomize() {
variant="outline"
trailing-icon="i-lucide-chevron-down"
class="ml-auto"
aria-label="Columns select dropdown"
/>
</UDropdownMenu>
</div>

View File

@@ -13,10 +13,11 @@ type User = {
}
const { data, status } = await useFetch<User[]>('https://jsonplaceholder.typicode.com/users', {
key: 'table-users',
transform: (data) => {
return data?.map(user => ({
...user,
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}` }
avatar: { src: `https://i.pravatar.cc/120?img=${user.id}`, alt: `${user.name} avatar` }
})) || []
},
lazy: true

View File

@@ -97,15 +97,17 @@ const columns: TableColumn<Payment>[] = [{
id: 'actions',
cell: ({ row }) => {
return h('div', { class: 'text-right' }, h(UDropdownMenu, {
content: {
'content': {
align: 'end'
},
items: getRowItems(row)
'items': getRowItems(row),
'aria-label': 'Actions dropdown'
}, () => h(UButton, {
icon: 'i-lucide-ellipsis-vertical',
color: 'neutral',
variant: 'ghost',
class: 'ml-auto'
'icon': 'i-lucide-ellipsis-vertical',
'color': 'neutral',
'variant': 'ghost',
'class': 'ml-auto',
'aria-label': 'Actions dropdown'
})))
}
}]

View File

@@ -48,14 +48,15 @@ const data = ref<Payment[]>([{
const columns: TableColumn<Payment>[] = [{
id: 'expand',
cell: ({ row }) => h(UButton, {
color: 'neutral',
variant: 'ghost',
icon: 'i-lucide-chevron-down',
square: true,
ui: {
'color': 'neutral',
'variant': 'ghost',
'icon': 'i-lucide-chevron-down',
'square': true,
'aria-label': 'Expand',
'ui': {
leadingIcon: ['transition-transform', row.getIsExpanded() ? 'duration-200 rotate-180' : '']
},
onClick: () => row.toggleExpanded()
'onClick': () => row.toggleExpanded()
})
}, {
accessorKey: 'id',

View File

@@ -50,12 +50,12 @@ const columns: TableColumn<Payment>[] = [{
header: ({ table }) => h(UCheckbox, {
'modelValue': table.getIsSomePageRowsSelected() ? 'indeterminate' : table.getIsAllPageRowsSelected(),
'onUpdate:modelValue': (value: boolean | 'indeterminate') => table.toggleAllPageRowsSelected(!!value),
'ariaLabel': 'Select all'
'aria-label': 'Select all'
}),
cell: ({ row }) => h(UCheckbox, {
'modelValue': row.getIsSelected(),
'onUpdate:modelValue': (value: boolean | 'indeterminate') => row.toggleSelected(!!value),
'ariaLabel': 'Select row'
'aria-label': 'Select row'
})
}, {
accessorKey: 'date',

View File

@@ -50,12 +50,12 @@ const columns: TableColumn<Payment>[] = [{
header: ({ table }) => h(UCheckbox, {
'modelValue': table.getIsSomePageRowsSelected() ? 'indeterminate' : table.getIsAllPageRowsSelected(),
'onUpdate:modelValue': (value: boolean | 'indeterminate') => table.toggleAllPageRowsSelected(!!value),
'ariaLabel': 'Select all'
'aria-label': 'Select all'
}),
cell: ({ row }) => h(UCheckbox, {
'modelValue': row.getIsSelected(),
'onUpdate:modelValue': (value: boolean | 'indeterminate') => row.toggleSelected(!!value),
'ariaLabel': 'Select row'
'aria-label': 'Select row'
})
}, {
accessorKey: 'date',

View File

@@ -95,7 +95,7 @@ function getDropdownActions(user: User): DropdownMenuItem[][] {
<UTable :data="data" :columns="columns" class="flex-1">
<template #name-cell="{ row }">
<div class="flex items-center gap-3">
<UAvatar :src="`https://i.pravatar.cc/120?img=${row.original.id}`" size="lg" />
<UAvatar :src="`https://i.pravatar.cc/120?img=${row.original.id}`" size="lg" :alt="`${row.original.name} avatar`" />
<div>
<p class="font-medium text-(--ui-text-highlighted)">
{{ row.original.name }}
@@ -108,7 +108,7 @@ function getDropdownActions(user: User): DropdownMenuItem[][] {
</template>
<template #action-cell="{ row }">
<UDropdownMenu :items="getDropdownActions(row.original)">
<UButton icon="i-lucide-ellipsis-vertical" color="neutral" variant="ghost" />
<UButton icon="i-lucide-ellipsis-vertical" color="neutral" variant="ghost" aria-label="Actions" />
</UDropdownMenu>
</template>
</UTable>

View File

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

View File

@@ -1,18 +1,20 @@
<script setup lang="ts">
import type { TabsItem } from '@nuxt/ui'
const items = [
{
label: 'Account',
description: 'Make changes to your account here. Click save when you\'re done.',
icon: 'i-lucide-user',
slot: 'account'
slot: 'account' as const
},
{
label: 'Password',
description: 'Change your password here. After saving, you\'ll be logged out.',
icon: 'i-lucide-lock',
slot: 'password'
slot: 'password' as const
}
]
] satisfies TabsItem[]
const state = reactive({
name: 'Benjamin Canac',

View File

@@ -1,5 +1,7 @@
<script setup lang="ts">
const items = [
import type { TabsItem } from '@nuxt/ui'
const items: TabsItem[] = [
{
label: 'Account'
},

View File

@@ -1,10 +1,10 @@
<script setup lang="ts">
import type { TreeItem } from '@nuxt/ui'
const items: TreeItem[] = [
const items = [
{
label: 'app/',
slot: 'app',
slot: 'app' as const,
defaultExpanded: true,
children: [{
label: 'composables/',
@@ -24,7 +24,7 @@ const items: TreeItem[] = [
},
{ label: 'app.vue', icon: 'i-vscode-icons-file-type-vue' },
{ label: 'nuxt.config.ts', icon: 'i-vscode-icons-file-type-nuxt' }
]
] satisfies TreeItem[]
</script>
<template>

View File

@@ -25,7 +25,7 @@ const items: TreeItem[] = [
{ label: 'nuxt.config.ts', icon: 'i-vscode-icons-file-type-nuxt' }
]
const value = ref(items[items.length - 1])
const value = ref()
</script>
<template>

View File

@@ -0,0 +1,139 @@
<script setup lang="ts">
const props = withDefaults(defineProps<{
contributors?: {
username: string
}[]
level?: number
max?: number
paused?: boolean
}>(), {
level: 0,
max: 4,
paused: false
})
const contributors = computed(() => props.contributors?.slice(0, 5) ?? [])
const el = ref(null)
const { width } = useElementSize(el)
</script>
<template>
<div
class="isolate rounded-full relative circle w-full aspect-[1/1] p-8 sm:p-12 md:p-14 lg:p-10 xl:p-16 before:absolute before:inset-px before:bg-(--ui-bg) before:rounded-full z-(--level)"
:class="{ 'animation-paused': paused }"
:style="{
'--duration': `${((level + 1) * 8)}s`,
'--level': level + 1
}"
>
<HomeContributors
v-if="(level + 1) < max"
:max="max"
:level="level + 1"
:contributors="props.contributors?.slice(5) ?? []"
:paused="paused"
/>
<div
ref="el"
class="avatars absolute inset-0 grid"
:style="{
'--total': contributors.length,
'--offset': `${width / 2}px`
}"
>
<UTooltip
v-for="(contributor, index) in contributors"
:key="contributor.username"
:text="contributor.username"
:delay-duration="0"
>
<NuxtLink
:to="`https://github.com/${contributor.username}`"
:aria-label="contributor.username"
target="_blank"
class="avatar flex absolute top-1/2 left-1/2"
tabindex="-1"
:style="{
'--index': index + 1
}"
>
<img
width="56"
height="56"
:src="`https://ipx.nuxt.com/s_56x56/gh_avatar/${contributor.username}`"
:srcset="`https://ipx.nuxt.com/s_112x112/gh_avatar/${contributor.username} 2x`"
:alt="contributor.username"
class="ring-2 ring-(--ui-border) lg:hover:ring-(--ui-border-inverted) transition rounded-full size-7"
loading="lazy"
>
</NuxtLink>
</UTooltip>
</div>
</div>
</template>
<style scoped>
.circle:after {
--start: 0deg;
--end: 360deg;
--border-color: var(--ui-border);
--highlight-color: var(--ui-color-neutral-400);
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: -1px;
opacity: 1;
border-radius: 9999px;
z-index: -1;
background: var(--border-color);
@supports (background: paint(houdini)) {
background: linear-gradient(var(--angle), var(--border-color), var(--border-color), var(--border-color), var(--border-color), var(--highlight-color));
animation: var(--duration) rotate linear infinite;
}
}
.dark .circle:after {
--highlight-color: var(--color-white);
}
.animation-paused.circle:after,
.animation-paused .avatars {
animation-play-state: paused;
}
.avatars {
--start: calc(var(--level) * 36deg);
--end: calc(360deg + (var(--level) * 36deg));
transform: rotate(var(--angle));
animation: calc(var(--duration) + 60s) rotate linear infinite;
}
.avatar {
--deg: calc(var(--index) * (360deg / var(--total)));
--transformX: calc(cos(var(--deg)) * var(--offset));
--transformY: calc(sin(var(--deg)) * var(--offset));
transform: translate(calc(-50% + var(--transformX)), calc(-50% + var(--transformY))) rotate(calc(360deg - var(--angle)));
}
@keyframes rotate {
from {
--angle: var(--start);
}
to {
--angle: var(--end);
}
}
@property --angle {
syntax: '<angle>';
initial-value: 0deg;
inherits: true;
}
</style>

View File

@@ -3,7 +3,7 @@ withDefaults(defineProps<{
title: string
description: string
component: string
module: string
module?: string
}>(), {
module: ''
})

View File

@@ -3,8 +3,8 @@ withDefaults(defineProps<{
title: string
description: string
headline: string
framework: string
module: string
framework?: string
module?: string
}>(), {
framework: 'nuxt',
module: ''

View File

@@ -81,7 +81,6 @@ function setBlackAsPrimary(value: boolean) {
<div class="grid grid-cols-3 gap-1 -mx-2">
<ThemePickerButton
chip="primary"
label="Black"
:selected="appConfig.theme.blackAsPrimary"
@click="setBlackAsPrimary(true)"
@@ -90,6 +89,7 @@ function setBlackAsPrimary(value: boolean) {
<span class="inline-block w-2 h-2 rounded-full bg-black dark:bg-white" />
</template>
</ThemePickerButton>
<ThemePickerButton
v-for="color in primaryColors"
:key="color"
@@ -111,7 +111,7 @@ function setBlackAsPrimary(value: boolean) {
v-for="color in neutralColors"
:key="color"
:label="color"
:chip="color"
:chip="color === 'neutral' ? 'old-neutral' : color"
:selected="neutral === color"
@click="neutral = color"
/>

View File

@@ -5,6 +5,10 @@ defineProps<{
chip?: string
selected?: boolean
}>()
const slots = defineSlots<{
leading: () => any
}>()
</script>
<template>
@@ -17,7 +21,7 @@ defineProps<{
class="capitalize ring-(--ui-border) rounded-[calc(var(--ui-radius))] text-[11px]"
:class="[selected ? 'bg-(--ui-bg-elevated)' : 'hover:bg-(--ui-bg-elevated)/50']"
>
<template v-if="chip" #leading>
<template v-if="chip || !!slots.leading" #leading>
<slot name="leading">
<span
class="inline-block size-2 rounded-full"

View File

@@ -37,6 +37,10 @@ export const useContentNavigation = (navigation: Ref<ContentNavigationItem[] | u
return {
...item,
children: item.children?.filter((child: any) => {
if (child.path.startsWith('/components')) {
return true
}
if (child.framework && child.framework !== framework.value) {
return false
}

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