Compare commits

..

105 Commits
main ... v2

Author SHA1 Message Date
renovate[bot]
13be8f1c83 chore(deps): update nuxt framework to ^4.0.1 (v2) (#4561)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 11:15:33 +02:00
renovate[bot]
48f68de4ca chore(deps): update all non-major dependencies (v2) (#4558)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 10:52:30 +02:00
renovate[bot]
13bd3f3804 chore(deps): update devdependency vue-tsc to ^3.0.3 (v2) (#4559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 10:02:55 +02:00
Benjamin Canac
65735e787f chore(release): v2.22.1 2025-07-16 16:00:28 +02:00
Benjamin Canac
6b971b8e6c docs: remove nuxt-cloudflare-analytics 2025-07-16 15:43:05 +02:00
renovate[bot]
1598d8fc72 chore(deps): lock file maintenance (v2) (#4538)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-16 15:37:02 +02:00
renovate[bot]
2176e30113 chore(deps): update nuxt framework to v4 (v2) (major) (#4531)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-07-16 12:09:34 +02:00
renovate[bot]
1f3e9789fe chore(deps): update dependency zod to v4 (v2) (#4520)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 11:17:13 +02:00
renovate[bot]
b797690483 chore(deps): update all non-major dependencies (v2) (#4519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 10:23:11 +02:00
renovate[bot]
f7303d5c94 chore(deps): update nuxt framework to ^3.17.7 (v2) (#4517)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 09:59:00 +02:00
renovate[bot]
346031f279 chore(deps): lock file maintenance (v2) (#4471)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 10:54:55 +02:00
renovate[bot]
dae6d77cf2 chore(deps): update devdependency vue-tsc to ^3.0.1 (v2) (#4467)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 10:43:07 +02:00
renovate[bot]
c1d5bcc1ac chore(deps): update all non-major dependencies (v2) (#4466)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 10:29:25 +02:00
renovate[bot]
1bc44f8594 chore(deps): update devdependency vue-tsc to v3 (v2) (#4444)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 13:41:29 +02:00
renovate[bot]
9ee68d20fc chore(deps): update all non-major dependencies (v2) (#4442)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-07-02 11:33:40 +02:00
renovate[bot]
d5f50be354 chore(deps): update nuxt framework to ^3.17.6 (v2) (#4436)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 10:41:29 +02:00
renovate[bot]
03ab56c9bd chore(deps): update all non-major dependencies (v2) (#4421)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 14:58:01 +02:00
renovate[bot]
9985fd5af4 chore(deps): lock file maintenance (v2) (#4422)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 12:47:47 +02:00
renovate[bot]
fb2a835a78 chore(deps): lock file maintenance (v2) (#4388)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 12:39:24 +02:00
renovate[bot]
2d5100044b chore(deps): update all non-major dependencies (v2) (#4361)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 11:51:53 +02:00
renovate[bot]
7903d2adc2 chore(deps): update devdependency happy-dom to v18 (v2) (#4344)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 23:03:25 +02:00
renovate[bot]
cd9ee1ff99 chore(deps): lock file maintenance (v2) (#4351)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 12:17:08 +02:00
renovate[bot]
29208f1877 chore(deps): update all non-major dependencies (v2) (#4343)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 11:25:17 +02:00
renovate[bot]
f9f505b0c0 chore(deps): update all non-major dependencies (v2) (#4276)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 17:17:05 +02:00
Benjamin Canac
7361914715 chore(github): add CODEOWNERS file 2025-06-05 14:42:34 +02:00
renovate[bot]
88923bb678 chore(deps): update nuxt framework to ^3.17.5 (v2) (#4283)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 10:35:13 +02:00
renovate[bot]
212154d0d0 chore(deps): update all non-major dependencies (v2) (#4272)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 10:23:05 +02:00
renovate[bot]
b9037e166f chore(deps): update all non-major dependencies (v2) (#4174)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-05-26 12:50:56 +02:00
renovate[bot]
58fc563d63 chore(deps): update nuxt framework to ^3.17.4 (v2) (#4196)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-22 12:03:58 +02:00
renovate[bot]
11569bc7e0 chore(deps): update nuxt framework to ^3.17.3 (v2) (#4132)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 19:13:22 +02:00
renovate[bot]
1934063763 chore(deps): lock file maintenance (v2) (#4080)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 11:56:14 +02:00
renovate[bot]
b6de20104f chore(deps): update all non-major dependencies (v2) (#4126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 11:34:10 +02:00
Malik
2971a31242 fix(Badge/Button): support numeric zero as visible label (#4116) 2025-05-10 16:41:59 +02:00
renovate[bot]
30068da217 chore(deps): update all non-major dependencies (v2) (#4077)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-09 10:40:54 +02:00
Benjamin Canac
44734f717e chore(deps): update vue-tsc 2025-05-05 18:24:49 +02:00
renovate[bot]
77cc1f3670 chore(deps): update nuxt framework to ^3.17.2 (v2) (#4070)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 14:45:05 +02:00
renovate[bot]
e55a27a503 chore(deps): lock file maintenance (v2) (#4065)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 10:39:11 +02:00
renovate[bot]
45f5e628ea chore(deps): update all non-major dependencies (v2) (#4064)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 10:14:42 +02:00
renovate[bot]
e47bba9a05 chore(deps): update nuxt framework to ^3.17.1 (v2) (#4000)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-02 10:21:39 +02:00
renovate[bot]
fcbedd1244 chore(deps): update all non-major dependencies (v2) (#3999)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-28 15:02:17 +02:00
renovate[bot]
3a964d5a4b chore(deps): update all non-major dependencies (v2) (#3945)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-24 12:03:25 +02:00
Benjamin Canac
b7c9c83dfa chore(release): publish without npm tag 2025-04-23 15:28:41 +02:00
Benjamin Canac
43ee099fbe chore(github): release trigger only on v2* tags 2025-04-23 15:28:10 +02:00
Benjamin Canac
4bc9878ef4 chore(deps): update @nuxt/ui-pro 2025-04-22 21:09:33 +02:00
Benjamin Canac
bb8d7aa48e chore(github): remove version check from release 2025-04-22 19:21:13 +02:00
Benjamin Canac
8c727f21d7 chore(github): update release workflow 2025-04-22 19:11:11 +02:00
Benjamin Canac
48fabbcdeb chore(release): v2.22.0 2025-04-22 19:09:11 +02:00
Benjamin Canac
c46b952022 chore(deps): run pnpm approve-builds 2025-04-22 19:03:36 +02:00
kyyy
c0e14d006e fix(Table): checkbox still emit @select event (#3269)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-22 17:01:44 +02:00
renovate[bot]
a58efd23aa chore(deps): lock file maintenance (v2) (#3940)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 11:40:38 +02:00
renovate[bot]
ec2b51b59e chore(deps): update pnpm to v10.9.0 (v2) (#3943)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 11:02:31 +02:00
renovate[bot]
e2dc287dbb chore(deps): update devdependency release-it to v19 (v2) (#3930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 11:01:58 +02:00
renovate[bot]
dbe8b34b6e chore(deps): update all non-major dependencies (v2) (#3884)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 10:43:00 +02:00
renovate[bot]
091725f940 chore(deps): lock file maintenance (v2) (#3811)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-14 11:06:16 +02:00
renovate[bot]
c21fbe5ec6 chore(deps): update all non-major dependencies (v2) (#3831)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-10 19:39:39 +02:00
renovate[bot]
cff1282f30 chore(deps): update all non-major dependencies (v2) (#3815)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-08 15:04:38 +02:00
renovate[bot]
86a7da03b1 chore(deps): update all non-major dependencies (v2) (#3797)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-05 11:23:02 +02:00
renovate[bot]
252189de0a chore(deps): update devdependency @nuxt/module-builder to v1 (v2) (#3801)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
2025-04-05 11:12:17 +02:00
renovate[bot]
4451768415 chore(deps): update all non-major dependencies (v2) (#3767)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-04 11:10:56 +02:00
renovate[bot]
8e67cab77a chore(deps): update nuxt framework to ^3.16.2 (v2) (#3766)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 21:21:48 +02:00
renovate[bot]
d113c31844 chore(deps): update devdependency vitest to ^3.1.1 (v2) (#3754)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 14:13:10 +02:00
renovate[bot]
18e4b4ff4e chore(deps): update all non-major dependencies (v2) (#3749)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 13:55:13 +02:00
renovate[bot]
1c8ec1d857 chore(deps): lock file maintenance (v2) (#3745)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 10:52:32 +02:00
renovate[bot]
d7872a149c chore(deps): update all non-major dependencies (v2) (#3701)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-28 16:43:21 +01:00
renovate[bot]
9104a4d54d chore(deps): update pnpm to v10.7.0 (v2) (#3694)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 15:36:38 +01:00
renovate[bot]
0506c0cc6a chore(deps): update dependency nuxt-component-meta to ^0.10.1 (v2) (#3676)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 10:44:45 +01:00
Benjamin Canac
2bef1e26c6 fix(Link): properly pick all aria-* & data-* attrs
Resolves https://github.com/nuxt/ui-pro/issues/494, resolves #3007
2025-03-24 18:55:27 +01:00
Benjamin Canac
02694db29c docs(home): improve padding on demo
Resolves #3420
2025-03-24 15:44:37 +01:00
Benjamin Canac
b8a7a47620 chore(deps): update and remove typescript resolution 2025-03-24 14:25:34 +01:00
Romain Hamel
bd732d3b34 chore(deps): declare form validation libraries as peerDependencies (#3668) 2025-03-24 14:17:10 +01:00
Benjamin Canac
93406d26b8 chore(deps): move @standard-schema/spec in deps + remove valibot 2025-03-24 12:50:54 +01:00
Benjamin Canac
b034a5679c chore(github): improve workflows 2025-03-24 12:39:15 +01:00
Benjamin Canac
c7b1fc32ad chore(Meter): lint 2025-03-24 12:28:16 +01:00
renovate[bot]
3b0dbfe473 chore(deps): lock file maintenance (v2) (#3661)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 11:18:04 +01:00
renovate[bot]
1454149c97 chore(deps): update all non-major dependencies (v2) (#3641)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 11:02:36 +01:00
renovate[bot]
5af04bad5f chore(deps): update all non-major dependencies (v2) (#3600)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 15:16:01 +01:00
renovate[bot]
f242c7243e chore(deps): update nuxt framework to ^3.16.1 (v2) (#3624)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-19 22:04:16 +01:00
Benjamin Canac
5a864e8d6f docs(app): add banner 2025-03-19 13:07:28 +01:00
Romain Hamel
ee373629d5 refactor(Form)!: drop explicit support for zod and valibot (#3618) 2025-03-19 11:56:32 +01:00
Benjamin Canac
63b5f2bc2f docs(home): clean
Resolves #3541
2025-03-18 15:27:47 +01:00
Benjamin Canac
4e96dcca42 fix(Table): remove type annotation in template
Resolves #3146
2025-03-18 15:26:54 +01:00
Benjamin Canac
b131b1168b docs: wrong carbon ads code 2025-03-18 10:59:33 +01:00
renovate[bot]
3c849b98a6 chore(deps): lock file maintenance (v2) (#3581)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 18:32:03 +01:00
renovate[bot]
714e0ff250 chore(deps): update all non-major dependencies (v2) (#3560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 16:08:43 +01:00
Benjamin Canac
74c77f9bac docs(nuxt.config): fix local extends
Related to https://github.com/nuxt/nuxt/issues/31311
2025-03-17 14:24:15 +01:00
Benjamin Canac
54fda9eef8 docs(home): improve links 2025-03-17 12:36:34 +01:00
Benjamin Canac
c3567a34a4 docs(installation): improve 2025-03-17 12:26:53 +01:00
Hugo Richard
d210d18a2f docs(Header): fix version dropdown (#3578) 2025-03-16 12:15:08 +01:00
Benjamin Canac
7aeecea599 docs(robots): update 2025-03-12 16:41:06 +01:00
Benjamin Canac
70e889813c docs: fix edit this page link 2025-03-12 16:41:05 +01:00
Sébastien Chopin
2b9696f4d3 docs: rename starter to ui2 2025-03-12 15:40:58 +01:00
Benjamin Canac
188184b674 chore: use ui2.nuxt.com url 2025-03-12 15:31:12 +01:00
Benjamin Canac
b0d1da8dc2 docs(nuxt.config): pull nuxt/ui-pro#v1 branch 2025-03-12 15:00:24 +01:00
Benjamin Canac
fec5f3f3ce chore(github): rename dev to v2 2025-03-12 15:00:06 +01:00
Benjamin Canac
05509b7ed1 chore(renovate): rename dev to v2 2025-03-12 14:50:54 +01:00
Benjamin Canac
88b17cd93c docs: rename dev to v2 2025-03-12 14:46:34 +01:00
renovate[bot]
0eca0fd201 chore(deps): update all non-major dependencies (dev) (#3529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-12 14:10:15 +01:00
renovate[bot]
420fcb003a chore(deps): update dependency @nuxtjs/tailwindcss to ^6.13.2 (dev) (#3519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-11 09:59:01 +01:00
renovate[bot]
f607140941 chore(deps): update devdependency happy-dom to ^17.4.3 (dev) (#3514)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 12:30:57 +01:00
renovate[bot]
40da32588d chore(deps): lock file maintenance (dev) (#3507)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 11:53:16 +01:00
renovate[bot]
264373b499 chore(deps): update all non-major dependencies (dev) (#3501)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 11:15:58 +01:00
renovate[bot]
bb70218568 chore(deps): update vueuse monorepo to v13 (dev) (major) (#3511)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 10:48:49 +01:00
renovate[bot]
402f508e7d chore(deps): update all non-major dependencies (dev) (#3495)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-08 23:13:30 +01:00
Benjamin Canac
0d69747c9d docs(deps): update @nuxt/ui-pro 2025-03-08 15:55:27 +01:00
renovate[bot]
760eb467be chore(deps): update dependency nuxt-og-image to v5 (dev) (#3490)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-08 15:54:34 +01:00
85 changed files with 5640 additions and 5167 deletions

1
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1 @@
* @benjamincanac

View File

@@ -5,7 +5,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | 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 - type: textarea
id: env id: env
attributes: attributes:

View File

@@ -5,7 +5,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | 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: dropdown - type: dropdown
id: version id: version
attributes: attributes:

View File

@@ -5,7 +5,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | 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: dropdown - type: dropdown
id: version id: version
attributes: attributes:

View File

@@ -1,15 +1,15 @@
name: ci-dev name: module
on: on:
push: push:
branches: branches:
- dev - v2
pull_request: pull_request:
branches: branches:
- dev - v2
jobs: jobs:
ci: build:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
permissions: permissions:
@@ -19,7 +19,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest] # macos-latest, windows-latest os: [ubuntu-latest] # macos-latest, windows-latest
node: [20] node: [22]
env: env:
NUXT_GITHUB_TOKEN: ${{ secrets.NUXT_GITHUB_TOKEN }} NUXT_GITHUB_TOKEN: ${{ secrets.NUXT_GITHUB_TOKEN }}

View File

@@ -1,18 +1,18 @@
name: ci-main name: release
on: on:
push: push:
branches: tags:
- main - 'v2*'
jobs: jobs:
ci: publish:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest] # macos-latest, windows-latest os: [ubuntu-latest] # macos-latest, windows-latest
node: [20] node: [22]
env: env:
NUXT_GITHUB_TOKEN: ${{ secrets.NUXT_GITHUB_TOKEN }} NUXT_GITHUB_TOKEN: ${{ secrets.NUXT_GITHUB_TOKEN }}
@@ -48,14 +48,7 @@ jobs:
- name: Test - name: Test
run: pnpm run test run run: pnpm run test run
- name: Version Check - name: Publish
id: check
uses: EndBug/version-check@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Release
if: github.event_name == 'push' && steps.check.outputs.changed == 'true'
run: ./scripts/release.sh run: ./scripts/release.sh
env: env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}

View File

@@ -1,23 +0,0 @@
name: stale
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
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

View File

@@ -1,5 +1,27 @@
# Changelog # Changelog
## [2.22.1](https://github.com/nuxt/ui/compare/v2.22.0...v2.22.1) (2025-07-16)
### Bug Fixes
* **Badge/Button:** support numeric zero as visible label ([#4116](https://github.com/nuxt/ui/issues/4116)) ([2971a31](https://github.com/nuxt/ui/commit/2971a3124299e927ddb506bb0fc61b906aa0cfeb))
## [2.22.0](https://github.com/nuxt/ui/compare/v2.21.1...v2.22.0) (2025-04-22)
### ⚠ BREAKING CHANGES
* **Form:** drop explicit support for `zod` and `valibot` (#3618)
### Bug Fixes
* **Link:** properly pick all `aria-*` & `data-*` attrs ([2bef1e2](https://github.com/nuxt/ui/commit/2bef1e26c6dfd5ee81b11f6da76e257861fc0bef)), closes [#3007](https://github.com/nuxt/ui/issues/3007)
* **Table:** checkbox still emit `[@select](https://github.com/select)` event ([#3269](https://github.com/nuxt/ui/issues/3269)) ([c0e14d0](https://github.com/nuxt/ui/commit/c0e14d006ea39965e805adbf9698f5cb95e7c965))
* **Table:** remove type annotation in template ([4e96dcc](https://github.com/nuxt/ui/commit/4e96dcca4213bbb56f1dd465ad7d47374e83bc9a)), closes [#3146](https://github.com/nuxt/ui/issues/3146)
### Code Refactoring
* **Form:** drop explicit support for `zod` and `valibot` ([#3618](https://github.com/nuxt/ui/issues/3618)) ([ee37362](https://github.com/nuxt/ui/commit/ee373629d5a9800921301dcbab309f884eaf83fb))
## [2.21.1](https://github.com/nuxt/ui/compare/v2.21.0...v2.21.1) (2025-03-08) ## [2.21.1](https://github.com/nuxt/ui/compare/v2.21.0...v2.21.1) (2025-03-08)
### Features ### Features

View File

@@ -1,4 +1,4 @@
[![nuxt-ui.png](https://volta.s3.fr-par.scw.cloud/nuxt_ui_social_card_531d133fa2.png)](https://ui.nuxt.com) [![nuxt-ui.png](https://volta.s3.fr-par.scw.cloud/nuxt_ui_social_card_531d133fa2.png)](https://ui2.nuxt.com)
# Nuxt UI # Nuxt UI
@@ -22,17 +22,32 @@ Its goal is to provide everything related to UI when building a Nuxt app. This i
- Fully typed - Fully typed
- [Figma Kit](https://www.figma.com/community/file/1436401057300493073) - [Figma Kit](https://www.figma.com/community/file/1436401057300493073)
Read more on [ui.nuxt.com](https://ui.nuxt.com) Read more on [ui2.nuxt.com](https://ui2.nuxt.com)
## Installation ## Installation
```bash ```bash
npx nuxi@latest module add ui # npm
npm install @nuxt/ui@2
# yarn
yarn add @nuxt/ui@2
# pnpm
pnpm add @nuxt/ui@2
# bun
bun add @nuxt/ui@2
```
Next, register the `@nuxt/ui` module in your `nuxt.config.ts`:
```ts
export default defineNuxtConfig({
modules: ['@nuxt/ui']
})
``` ```
## Documentation ## Documentation
Visit https://ui.nuxt.com to explore the documentation. Visit https://ui2.nuxt.com to explore the documentation.
## Credits ## Credits
@@ -49,15 +64,15 @@ Visit https://ui.nuxt.com to explore the documentation.
Thank you for considering contributing to Nuxt UI. Here are a few ways you can get involved: 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. - 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/contributing) to share your suggestions. - Suggestions: Have any thoughts to enhance Nuxt UI? We'd love to hear them! Check out the [contribution guide](https://ui2.nuxt.com/getting-started/contributing) to share your suggestions.
## Local Development ## Local Development
Follow the docs to [Set up your local development environment](https://ui.nuxt.com/getting-started/contributing#_2-local-development-setup) and contribute. Follow the docs to [Set up your local development environment](https://ui2.nuxt.com/getting-started/contributing#_2-local-development-setup) and contribute.
## License ## License
Licensed under the [MIT license](https://github.com/nuxt/ui/blob/dev/LICENSE.md). Licensed under the [MIT license](https://github.com/nuxt/ui/blob/v2/LICENSE.md).
<!-- Badges --> <!-- Badges -->
[npm-version-src]: https://img.shields.io/npm/v/@nuxt/ui/latest.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

View File

@@ -3,7 +3,7 @@
<div> <div>
<NuxtLoadingIndicator /> <NuxtLoadingIndicator />
<!-- <Banner v-if="!$route.path.startsWith('/examples')" /> --> <Banner v-if="!$route.path.startsWith('/examples')" />
<Header v-if="!$route.path.startsWith('/examples')" :links="links" /> <Header v-if="!$route.path.startsWith('/examples')" :links="links" />
@@ -91,7 +91,7 @@ useHead({
], ],
link: [ link: [
{ rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' }, { rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' },
{ rel: 'canonical', href: `https://ui.nuxt.com${withoutTrailingSlash(route.path)}` } { rel: 'canonical', href: `https://ui2.nuxt.com${withoutTrailingSlash(route.path)}` }
], ],
htmlAttrs: { htmlAttrs: {
lang: 'en' lang: 'en'

View File

@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
const id = 'nuxt-ui-banner-3' const id = 'nuxt-ui-banner-4'
const to = '/pro/pricing' const to = 'https://ui.nuxt.com'
const hideBanner = () => { const hideBanner = () => {
localStorage.setItem(id, 'true') localStorage.setItem(id, 'true')
@@ -28,8 +28,8 @@ if (import.meta.server) {
<NuxtLink <NuxtLink
v-if="to" v-if="to"
:to="to" :to="to"
target="_blank"
class="focus:outline-none" class="focus:outline-none"
aria-label="20% off on all Nuxt UI Pro products for Black Friday week"
tabindex="-1" tabindex="-1"
> >
<span class="absolute inset-0 " aria-hidden="true" /> <span class="absolute inset-0 " aria-hidden="true" />
@@ -39,8 +39,8 @@ if (import.meta.server) {
<div class="lg:flex-1 hidden lg:flex items-center" /> <div class="lg:flex-1 hidden lg:flex items-center" />
<p class="text-sm font-medium text-white dark:text-gray-900 truncate"> <p class="text-sm font-medium text-white dark:text-gray-900 truncate">
<UIcon name="i-ri-discount-percent-fill" class="size-5 align-top flex-shrink-0 pointer-events-none mr-2" /> <UIcon name="i-lucide-rocket" class="size-5 align-top flex-shrink-0 pointer-events-none mr-1.5" />
<span class="font-bold">Black Friday Week</span>: <UBadge label="20% off" color="white" class="ring-0 font-semibold" /> on all Nuxt UI Pro products from <span class="font-semibold">Nov 25</span> to <span class="font-semibold">Dec 2</span>! <span class="font-bold">Nuxt UI v3</span> is officially released!
</p> </p>
<!-- <UButton <!-- <UButton

View File

@@ -16,7 +16,7 @@
</NuxtLink> </NuxtLink>
<UDropdown <UDropdown
:items="[[{ label: $route.path.startsWith('/pro') ? `v${pkg.version.split('-')[0]}` : `v${config.version}`, class: 'text-primary-500 dark:text-primary-400' }, { label: 'v3.0.0-alpha.x', to: 'https://ui3.nuxt.dev' }]]" :items="[[{ label: $route.path.startsWith('/pro') ? `v${pkg.version.split('-')[0]}` : `v${config.version}`, class: 'text-primary-500 dark:text-primary-400' }, { label: 'v3.x', to: 'https://ui.nuxt.com' }]]"
:popper="{ strategy: 'absolute', offsetDistance: 11, placement: 'bottom-start' }" :popper="{ strategy: 'absolute', offsetDistance: 11, placement: 'bottom-start' }"
:ui="{ :ui="{
background: 'dark:bg-gray-900', background: 'dark:bg-gray-900',
@@ -50,7 +50,7 @@
<UColorModeButton class="hidden lg:inline-flex" /> <UColorModeButton class="hidden lg:inline-flex" />
<UButton <UButton
to="https://github.com/nuxt/ui/tree/dev" to="https://github.com/nuxt/ui/tree/v2"
target="_blank" target="_blank"
icon="i-simple-icons-github" icon="i-simple-icons-github"
aria-label="GitHub" aria-label="GitHub"

View File

@@ -9,7 +9,7 @@ onMounted(() => {
if (carbonads.value) { if (carbonads.value) {
const script = document.createElement('script') const script = document.createElement('script')
script.setAttribute('type', 'text/javascript') script.setAttribute('type', 'text/javascript')
script.setAttribute('src', 'https://cdn.carbonads.com/carbon.js?serve=CWYIVK3E&placement=uinuxtcom') script.setAttribute('src', 'https://cdn.carbonads.com/carbon.js?serve=CW7IC53I&placement=ui2nuxtcom')
script.setAttribute('id', '_carbonads_js') script.setAttribute('id', '_carbonads_js')
carbonads.value.appendChild(script) carbonads.value.appendChild(script)
} }

View File

@@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { sub, format, isSameDay, type Duration } from 'date-fns' import { sub, format, isSameDay } from 'date-fns'
import type { Duration } from 'date-fns'
const ranges = [ const ranges = [
{ label: 'Last 7 days', duration: { days: 7 } }, { label: 'Last 7 days', duration: { days: 7 } },

View File

@@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { object, string, nonempty, type Infer } from 'superstruct' import { object, string, nonempty } from 'superstruct'
import type { Infer } from 'superstruct'
import type { FormSubmitEvent } from '#ui/types' import type { FormSubmitEvent } from '#ui/types'
const schema = object({ const schema = object({

View File

@@ -21,7 +21,7 @@ async function onSubmit(event: FormSubmitEvent<Schema>) {
</script> </script>
<template> <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">
<UFormGroup label="Email" name="email"> <UFormGroup label="Email" name="email">
<UInput v-model="state.email" /> <UInput v-model="state.email" />
</UFormGroup> </UFormGroup>

View File

@@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { object, string, type InferType } from 'yup' import { object, string } from 'yup'
import type { InferType } from 'yup'
import type { FormSubmitEvent } from '#ui/types' import type { FormSubmitEvent } from '#ui/types'
const schema = object({ const schema = object({

View File

@@ -31,7 +31,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<ULandingGrid ref="section" class="lg:grid-cols-10 lg:gap-8 overflow-hidden p-px"> <ULandingGrid ref="section" class="lg:grid-cols-10 lg:gap-8 overflow-hidden p-1">
<div :ref="(el) => (refs[1] = el)" class="col-span-8 flex items-center animate-top"> <div :ref="(el) => (refs[1] = el)" class="col-span-8 flex items-center animate-top">
<RangeExample /> <RangeExample />
</div> </div>

View File

@@ -7,13 +7,29 @@ description: 'Learn how to install and configure Nuxt UI in your application.'
### Add to a Nuxt project ### Add to a Nuxt project
1. Add `@nuxt/ui` module to your project: 1. Install the `@nuxt/ui` dependency in your project:
```bash ::code-group
npx nuxi@latest module add ui
```bash [pnpm]
pnpm add @nuxt/ui@2
``` ```
2. Add it to the `modules` section in your `nuxt.config.ts`: ```bash [yarn]
yarn add @nuxt/ui@2
```
```bash [npm]
npm install @nuxt/ui@2
```
```bash [bun]
bun add @nuxt/ui@2
```
::
2. Register the `@nuxt/ui` module in your `nuxt.config.ts`:
```ts [nuxt.config.ts] ```ts [nuxt.config.ts]
export default defineNuxtConfig({ export default defineNuxtConfig({
@@ -29,7 +45,7 @@ That's it! You can now use all the components and composables in your Nuxt app
The Nuxt Starter template is available from the `nuxi init` command. The Nuxt Starter template is available from the `nuxi init` command.
```bash ```bash
npx nuxi@latest init -t ui npx nuxi@latest init -t ui2
``` ```
Please check [nuxt/starter](https://github.com/nuxt/starter/tree/ui) for details. Please check [nuxt/starter](https://github.com/nuxt/starter/tree/ui) for details.
@@ -94,7 +110,7 @@ You can read more about this in the [Theming](/getting-started/theming#dark-mode
## TypeScript ## TypeScript
This module is written in TypeScript and provides typings for all the components and composables. You can look at the [source code](https://github.com/nuxt/ui/tree/dev/src/runtime/types) to see all the available types. This module is written in TypeScript and provides typings for all the components and composables. You can look at the [source code](https://github.com/nuxt/ui/tree/v2/src/runtime/types) to see all the available types.
::callout{icon="i-heroicons-light-bulb" to="https://nuxt.com/docs/guide/concepts/typescript" target="_blank"} ::callout{icon="i-heroicons-light-bulb" to="https://nuxt.com/docs/guide/concepts/typescript" target="_blank"}
You can read more about TypeScript on the official Nuxt documentation. You can read more about TypeScript on the official Nuxt documentation.
@@ -230,7 +246,7 @@ You can also add the following to your `.vscode/settings.json` to enable Intelli
| `prefix` | `u` | Define the prefix of the imported components. | | `prefix` | `u` | Define the prefix of the imported components. |
| `global` | `false` | Expose components globally. | | `global` | `false` | Expose components globally. |
| `safelistColors` | `['primary']` | Force safelisting of colors to need be purged. | | `safelistColors` | `['primary']` | Force safelisting of colors to need be purged. |
| `disableGlobalStyles` | `false` | Disable [global CSS styles](https://github.com/nuxt/ui/blob/dev/src/runtime/ui.css) injected by the module. | | `disableGlobalStyles` | `false` | Disable [global CSS styles](https://github.com/nuxt/ui/blob/v2/src/runtime/ui.css) injected by the module. |
Configure options in your `nuxt.config.ts` as such: Configure options in your `nuxt.config.ts` as such:

View File

@@ -25,7 +25,7 @@ Try to change the `primary` and `gray` colors by clicking on the :u-icon{name="i
As this module uses Tailwind CSS under the hood, you can use any of the [Tailwind CSS colors](https://tailwindcss.com/docs/customizing-colors#color-palette-reference) or your own custom colors or groups, such as `brand.primary`. By default, the `primary` color is `green` and the `gray` color is `cool`. As this module uses Tailwind CSS under the hood, you can use any of the [Tailwind CSS colors](https://tailwindcss.com/docs/customizing-colors#color-palette-reference) or your own custom colors or groups, such as `brand.primary`. By default, the `primary` color is `green` and the `gray` color is `cool`.
When [using custom colors](https://tailwindcss.com/docs/customizing-colors#using-custom-colors) or [adding additional colors](https://tailwindcss.com/docs/customizing-colors#adding-additional-colors) through the `extend` key in your `tailwind.config.ts`, you'll need to make sure to define all the shades from `50` to `950` as most of them are used in the components config defined in [`ui.config/`](https://github.com/nuxt/ui/tree/dev/src/runtime/ui.config) directory. You can [generate your colors](https://tailwindcss.com/docs/customizing-colors#generating-colors) using tools such as https://uicolors.app/ for example. When [using custom colors](https://tailwindcss.com/docs/customizing-colors#using-custom-colors) or [adding additional colors](https://tailwindcss.com/docs/customizing-colors#adding-additional-colors) through the `extend` key in your `tailwind.config.ts`, you'll need to make sure to define all the shades from `50` to `950` as most of them are used in the components config defined in [`ui.config/`](https://github.com/nuxt/ui/tree/v2/src/runtime/ui.config) directory. You can [generate your colors](https://tailwindcss.com/docs/customizing-colors#generating-colors) using tools such as https://uicolors.app/ for example.
```ts [tailwind.config.ts] ```ts [tailwind.config.ts]
import type { Config } from 'tailwindcss' import type { Config } from 'tailwindcss'
@@ -118,7 +118,7 @@ export default defineAppConfig({
}) })
``` ```
The available options for each component should auto-complete, and you can review the defaults for each component using your IDE's function such as `Cmd`+`Click` (these files can be found in [`src/runtime/ui.config/`](https://github.com/nuxt/ui/tree/dev/src/runtime/ui.config)). The available options for each component should auto-complete, and you can review the defaults for each component using your IDE's function such as `Cmd`+`Click` (these files can be found in [`src/runtime/ui.config/`](https://github.com/nuxt/ui/tree/v2/src/runtime/ui.config)).
Thanks to [tailwind-merge](https://github.com/dcastil/tailwind-merge), the `app.config.ts` is smartly merged with the default config. This means you don't have to rewrite everything. Thanks to [tailwind-merge](https://github.com/dcastil/tailwind-merge), the `app.config.ts` is smartly merged with the default config. This means you don't have to rewrite everything.

View File

@@ -6,7 +6,7 @@ links:
to: 'https://headlessui.com/v1/vue/disclosure' to: 'https://headlessui.com/v1/vue/disclosure'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Accordion.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Accordion.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display an alert element to draw attention.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Alert.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Alert.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display an image that represents a resource or a group of resources
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Avatar.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Avatar.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a short text to represent a status or a category.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Badge.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Badge.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: A list of links that indicate the current page's location within a
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/Breadcrumb.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/navigation/Breadcrumb.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Create a button with icon or link capabilities.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Button.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Button.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a card for content with a header, body and footer.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/layout/Card.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/layout/Card.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display images or content in a scrollable area.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Carousel.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Carousel.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a checkbox field.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Checkbox.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Checkbox.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a chip indicator on any component.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Chip.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Chip.vue
--- ---
## Usage ## Usage

View File

@@ -7,7 +7,7 @@ links:
to: 'https://headlessui.com/v1/vue/combobox' to: 'https://headlessui.com/v1/vue/combobox'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/CommandPalette.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/navigation/CommandPalette.vue
--- ---
## Usage ## Usage
@@ -274,7 +274,7 @@ hiddenCode: true
--- ---
:: ::
::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/dev/docs/components/content/examples/CommandPaletteExampleThemeAlgolia.vue#L23" target="_blank"} ::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/v2/docs/components/content/examples/CommandPaletteExampleThemeAlgolia.vue#L23" target="_blank"}
Take a look at the component! Take a look at the component!
:: ::
@@ -290,6 +290,6 @@ hiddenCode: true
--- ---
:: ::
::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/dev/docs/components/content/examples/CommandPaletteExampleThemeRaycast.vue#L30" target="_blank"} ::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/v2/docs/components/content/examples/CommandPaletteExampleThemeRaycast.vue#L30" target="_blank"}
Take a look at the component! Take a look at the component!
:: ::

View File

@@ -3,7 +3,7 @@ description: A container lets you center and constrain the width of your content
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/layout/Container.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/layout/Container.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: Display a menu that appears on right click.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/overlays/ContextMenu.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/overlays/ContextMenu.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a separator between content.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/layout/Divider.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/layout/Divider.vue
--- ---
## Usage ## Usage

View File

@@ -6,7 +6,7 @@ links:
to: https://headlessui.com/v1/vue/menu to: https://headlessui.com/v1/vue/menu
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Dropdown.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Dropdown.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: Display a label and additional informations around a form element.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/FormGroup.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/FormGroup.vue
--- ---

View File

@@ -3,7 +3,7 @@ description: Collect and validate form data.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Form.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Form.vue
--- ---
## Usage ## Usage
@@ -14,7 +14,7 @@ It works with the [FormGroup](/components/form-group) component to display error
The form component requires two props: The form component requires two props:
- `state` - a reactive object holding the form's state. - `state` - a reactive object holding the form's state.
- `schema` - a schema object from a validation library like [Yup](https://github.com/jquense/yup), [Zod](https://github.com/colinhacks/zod), [Joi](https://github.com/hapijs/joi), [Valibot](https://github.com/fabian-hiller/valibot) or [Superstruct](https://github.com/ianstormtaylor/superstruct). - `schema` - any [Standard Schema](https://standardschema.dev/) or a schema from [Yup](https://github.com/jquense/yup), [Joi](https://github.com/hapijs/joi) or [Superstruct](https://github.com/ianstormtaylor/superstruct).
::callout{icon="i-heroicons-light-bulb"} ::callout{icon="i-heroicons-light-bulb"}
Note that **no validation library is included** by default, so ensure you **install the one you need**. Note that **no validation library is included** by default, so ensure you **install the one you need**.
@@ -190,7 +190,7 @@ hiddenCode: true
--- ---
:: ::
::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/dev/docs/components/content/examples/FormExampleElements.vue" target="_blank"} ::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/v2/docs/components/content/examples/FormExampleElements.vue" target="_blank"}
Take a look at the component! Take a look at the component!
:: ::

View File

@@ -4,7 +4,7 @@ description: Display a list of horizontal links.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/HorizontalNavigation.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/navigation/HorizontalNavigation.vue
--- ---
## Usage ## Usage

View File

@@ -7,7 +7,7 @@ links:
to: 'https://headlessui.com/v1/vue/combobox' to: 'https://headlessui.com/v1/vue/combobox'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/InputMenu.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/InputMenu.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display an input field.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Input.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Input.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: Display a keyboard key in a text block.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Kbd.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Kbd.vue
navigation: navigation:
title: 'Kbd' title: 'Kbd'
--- ---

View File

@@ -4,7 +4,7 @@ description: Render a NuxtLink but with superpowers.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Link.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Link.vue
--- ---
## Usage ## Usage
@@ -14,7 +14,7 @@ The Link component is a wrapper around [`<NuxtLink>`](https://nuxt.com/docs/api/
- `inactive-class` prop to set a class when the link is inactive, `active-class` is used when active. - `inactive-class` prop to set a class when the link is inactive, `active-class` is used when active.
- `exact` prop to style with `active-class` when the link is active and the route is exactly the same as the current route. - `exact` prop to style with `active-class` when the link is active and the route is exactly the same as the current route.
- `exact-query` and `exact-hash` props to style with `active-class` when the link is active and the query or hash is exactly the same as the current query or hash. - `exact-query` and `exact-hash` props to style with `active-class` when the link is active and the query or hash is exactly the same as the current query or hash.
- use `exact-query="partial"` to style with `active-class` when the link is active and the query partially match the current query. - use `exact-query="partial"` to style with `active-class` when the link is active and the query partially match the current query.
The incentive behind this is to provide the same API as NuxtLink back in Nuxt 2 / Vue 2. You can read more about it in the Vue Router [migration from Vue 2](https://router.vuejs.org/guide/migration/#removal-of-the-exact-prop-in-router-link) guide. The incentive behind this is to provide the same API as NuxtLink back in Nuxt 2 / Vue 2. You can read more about it in the Vue Router [migration from Vue 2](https://router.vuejs.org/guide/migration/#removal-of-the-exact-prop-in-router-link) guide.

View File

@@ -4,7 +4,7 @@ description: Display a gauge meter that fills or depletes.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Meter.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Meter.vue
--- ---
## Usage ## Usage

View File

@@ -6,7 +6,7 @@ links:
to: 'https://headlessui.com/v1/vue/dialog' to: 'https://headlessui.com/v1/vue/dialog'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/overlays/Modal.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/overlays/Modal.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a toast notification in your app.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/overlays/Notification.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/overlays/Notification.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Add a pagination to handle pages.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/Pagination.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/navigation/Pagination.vue
--- ---
## Usage ## Usage

View File

@@ -6,7 +6,7 @@ links:
to: 'https://headlessui.com/v1/vue/popover' to: 'https://headlessui.com/v1/vue/popover'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/overlays/Popover.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/overlays/Popover.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: Show a horizontal bar to indicate task progression.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/elements/Progress.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/elements/Progress.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: Display a set of radio buttons.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/RadioGroup.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/RadioGroup.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a range field
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Range.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Range.vue
--- ---
## Usage ## Usage

View File

@@ -7,7 +7,7 @@ links:
to: 'https://headlessui.com/v1/vue/listbox' to: 'https://headlessui.com/v1/vue/listbox'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/SelectMenu.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/SelectMenu.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a select field.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Select.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Select.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a placeholder while content is loading.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/layout/Skeleton.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/layout/Skeleton.vue
--- ---
## Usage ## Usage

View File

@@ -6,7 +6,7 @@ links:
to: 'https://headlessui.com/v1/vue/dialog' to: 'https://headlessui.com/v1/vue/dialog'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/overlays/Slideover.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/overlays/Slideover.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: 'Display data in a table.'
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/data/Table.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/data/Table.vue
--- ---
## Usage ## Usage
@@ -311,9 +311,9 @@ const onUpdateSelection = (selectedRows: any[]) => {
</script> </script>
<template> <template>
<UTable <UTable
v-model="selected" v-model="selected"
:rows="people" :rows="people"
@select:all="onHandleSelectAll" @select:all="onHandleSelectAll"
@update:modelValue="onUpdateSelection" @update:modelValue="onUpdateSelection"
/> />
@@ -598,7 +598,7 @@ This slot allows you to customize the checkbox appearance in the table header fo
#### Usage #### Usage
```vue ```vue
<template> <template>
<UTable v-model="selectable"> <UTable v-model="selectable">
<template #select-header="{ checked, change, indeterminate }"> <template #select-header="{ checked, change, indeterminate }">
<!-- Place your custom component here --> <!-- Place your custom component here -->
</template> </template>
@@ -620,7 +620,7 @@ This slot allows you to customize the checkbox appearance in the table header fo
<UTable> <UTable>
<!-- Header checkbox customization --> <!-- Header checkbox customization -->
<template #select-header="{ indeterminate, checked, change }"> <template #select-header="{ indeterminate, checked, change }">
<input <input
type="checkbox" type="checkbox"
:indeterminate="indeterminate" :indeterminate="indeterminate"
:checked="checked" :checked="checked"
@@ -658,7 +658,7 @@ This slot allows you to customize the checkbox appearance for each row in the ta
<UTable> <UTable>
<!-- Row checkbox customization --> <!-- Row checkbox customization -->
<template #select-data="{ checked, change }"> <template #select-data="{ checked, change }">
<input <input
type="checkbox" type="checkbox"
:checked="checked" :checked="checked"
@change="e => change(e.target.checked)" @change="e => change(e.target.checked)"
@@ -769,6 +769,6 @@ hiddenCode: true
--- ---
:: ::
::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/dev/docs/components/content/examples/TableExampleAdvanced.vue" target="_blank"} ::callout{icon="i-simple-icons-github" to="https://github.com/nuxt/ui/blob/v2/docs/components/content/examples/TableExampleAdvanced.vue" target="_blank"}
Take a look at the component! Take a look at the component!
:: ::

View File

@@ -3,7 +3,7 @@ description: A set of tab panels that are displayed one at a time.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/Tabs.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/navigation/Tabs.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display a textarea field.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Textarea.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Textarea.vue
--- ---
## Usage ## Usage

View File

@@ -6,7 +6,7 @@ links:
to: 'https://headlessui.com/v1/vue/switch' to: 'https://headlessui.com/v1/vue/switch'
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/forms/Toggle.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/forms/Toggle.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ description: Display content that appears on hover next to an element.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/overlays/Tooltip.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/overlays/Tooltip.vue
--- ---
## Usage ## Usage

View File

@@ -4,7 +4,7 @@ description: Display a list of vertical links.
links: links:
- label: GitHub - label: GitHub
icon: i-simple-icons-github icon: i-simple-icons-github
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/navigation/VerticalNavigation.vue to: https://github.com/nuxt/ui/blob/v2/src/runtime/components/navigation/VerticalNavigation.vue
--- ---
## Usage ## Usage

View File

@@ -3,7 +3,7 @@ title: '<span class="text-primary">Nuxt UI</span> Releases'
head.title: Releases head.title: Releases
description: Follow the latest releases and updates happening on the nuxt/ui repository. description: Follow the latest releases and updates happening on the nuxt/ui repository.
links: links:
- label: Get Started - label: Get started
trailingIcon: i-heroicons-arrow-right-20-solid trailingIcon: i-heroicons-arrow-right-20-solid
to: /getting-started to: /getting-started
size: md size: md

View File

@@ -3,6 +3,8 @@
<div> <div>
<NuxtLoadingIndicator /> <NuxtLoadingIndicator />
<Banner />
<Header :links="links" /> <Header :links="links" />
<UContainer> <UContainer>

View File

@@ -15,7 +15,7 @@ export default defineNuxtConfig({
] ]
: [ : [
'@nuxt/ui-pro', '@nuxt/ui-pro',
process.env.NUXT_GITHUB_TOKEN && ['github:nuxt/ui-pro/.docs#dev', { giget: { auth: process.env.NUXT_GITHUB_TOKEN } }] process.env.NUXT_GITHUB_TOKEN && ['github:nuxt/ui-pro/.docs#v1', { giget: { auth: process.env.NUXT_GITHUB_TOKEN } }]
].filter(Boolean), ].filter(Boolean),
modules: [ modules: [
@@ -26,12 +26,11 @@ export default defineNuxtConfig({
module, module,
'@nuxtjs/plausible', '@nuxtjs/plausible',
'@vueuse/nuxt', '@vueuse/nuxt',
'nuxt-component-meta', 'nuxt-component-meta'
'nuxt-cloudflare-analytics'
], ],
site: { site: {
url: 'https://ui.nuxt.com' url: 'https://ui2.nuxt.com'
}, },
content: { content: {
@@ -53,7 +52,7 @@ export default defineNuxtConfig({
prefix: '/pro', prefix: '/pro',
driver: 'github', driver: 'github',
repo: 'nuxt/ui-pro', repo: 'nuxt/ui-pro',
branch: 'dev', branch: 'v1',
dir: '.docs/content/pro', dir: '.docs/content/pro',
token: process.env.NUXT_GITHUB_TOKEN || '' token: process.env.NUXT_GITHUB_TOKEN || ''
} }
@@ -94,6 +93,11 @@ export default defineNuxtConfig({
vite: { vite: {
optimizeDeps: { optimizeDeps: {
include: ['date-fns'] include: ['date-fns']
},
server: {
fs: {
allow: process.env.NUXT_UI_PRO_PATH ? [resolve(process.env.NUXT_UI_PRO_PATH)] : undefined
}
} }
}, },
@@ -114,11 +118,6 @@ export default defineNuxtConfig({
} }
}, },
cloudflareAnalytics: {
token: '1e2b0c5e9a214f0390b9b94e043d8d4c',
scriptPath: false
},
componentMeta: { componentMeta: {
exclude: [ exclude: [
'@nuxt/content', '@nuxt/content',

View File

@@ -4,28 +4,27 @@
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@iconify-json/heroicons": "^1.2.2", "@iconify-json/heroicons": "^1.2.2",
"@iconify-json/lucide": "^1.2.28", "@iconify-json/lucide": "^1.2.57",
"@iconify-json/simple-icons": "^1.2.27", "@iconify-json/simple-icons": "^1.2.44",
"@iconify-json/vscode-icons": "^1.2.16", "@iconify-json/vscode-icons": "^1.2.23",
"@nuxt/content": "^2.13.4", "@nuxt/content": "^2.13.4",
"@nuxt/fonts": "^0.10.3", "@nuxt/fonts": "^0.11.4",
"@nuxt/image": "^1.9.0", "@nuxt/image": "^1.10.0",
"@nuxt/ui": "latest", "@nuxt/ui": "latest",
"@nuxt/ui-pro": "^1.7.0", "@nuxt/ui-pro": "https://pkg.pr.new/@nuxt/ui-pro@fdb0248",
"@nuxtjs/plausible": "^1.2.0", "@nuxtjs/plausible": "^1.2.0",
"@octokit/rest": "^21.1.1", "@octokit/rest": "^21.1.1",
"@vueuse/nuxt": "^12.8.2", "@vueuse/nuxt": "^13.5.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"joi": "^17.13.3", "joi": "^17.13.3",
"nuxt": "^3.16.0", "nuxt": "^4.0.1",
"nuxt-cloudflare-analytics": "^1.0.8", "nuxt-component-meta": "^0.12.1",
"nuxt-component-meta": "^0.10.0", "nuxt-og-image": "^5.1.9",
"nuxt-og-image": "^4.2.0", "prettier": "^3.6.2",
"prettier": "^3.5.3", "ufo": "^1.6.1",
"ufo": "^1.5.4",
"v-calendar": "^3.1.2", "v-calendar": "^3.1.2",
"valibot": "^0.42.1", "valibot": "^1.1.0",
"yup": "^1.6.1", "yup": "^1.6.1",
"zod": "^3.24.2" "zod": "^4.0.5"
} }
} }

View File

@@ -78,7 +78,7 @@ defineOgImageComponent('Docs', {
const communityLinks = computed(() => [{ const communityLinks = computed(() => [{
icon: 'i-heroicons-pencil-square', icon: 'i-heroicons-pencil-square',
label: 'Edit this page', label: 'Edit this page',
to: `https://github.com/nuxt/ui/edit/dev/docs/content/${page?.value?._file}`, to: `https://github.com/nuxt/ui/edit/v2/docs/content/${page?.value?._file}`,
target: '_blank' target: '_blank'
}, { }, {
icon: 'i-heroicons-star', icon: 'i-heroicons-star',

View File

@@ -23,9 +23,10 @@
</template> </template>
<template #links> <template #links>
<UButton label="Get Started" trailing-icon="i-heroicons-arrow-right-20-solid" size="lg" to="/getting-started/installation" /> <UButton label="Get started" size="lg" to="/getting-started/installation" />
<UButton label="Explore components" trailing-icon="i-heroicons-arrow-right-20-solid" color="gray" size="lg" to="/components/button" />
<UInput <!-- <UInput
v-model="source" v-model="source"
color="gray" color="gray"
readonly readonly
@@ -47,7 +48,7 @@
@click="copy(source)" @click="copy(source)"
/> />
</template> </template>
</UInput> </UInput> -->
</template> </template>
<ClientOnly> <ClientOnly>
@@ -192,16 +193,16 @@
</div> </div>
</ULandingHero> </ULandingHero>
<ULandingSection v-for="(section, index) in page.pro.sections" :key="index" v-bind="section" class="!pt-0"> <!-- <ULandingSection v-for="(section, index) in page.pro.sections" :key="index" v-bind="section" class="!pt-0">
<MDC <MDC
v-if="section.code" v-if="section.code"
:value="section.code" :value="section.code"
tag="pre" tag="pre"
class="prose prose-primary dark:prose-invert max-w-none" class="prose prose-primary dark:prose-invert max-w-none"
/> />
</ULandingSection> </ULandingSection> -->
<div ref="sectionRef" :style="{ '--y': `${y}px`, '--inc': `${inc}px` }" class="_screen_xl"> <!-- <div ref="sectionRef" :style="{ '--y': `${y}px`, '--inc': `${inc}px` }" class="_screen_xl">
<ULandingSection class="sticky h-screen top-0 flex !pb-16" :ui="{ container: 'flex-1 sm:gap-y-12' }"> <ULandingSection class="sticky h-screen top-0 flex !pb-16" :ui="{ container: 'flex-1 sm:gap-y-12' }">
<template #title> <template #title>
<Transition name="fade" mode="out-in"> <Transition name="fade" mode="out-in">
@@ -281,8 +282,6 @@
<template #page-body> <template #page-body>
<div class="-mt-8 prose prose-primary prose-sm dark:prose-invert max-w-none"> <div class="-mt-8 prose prose-primary prose-sm dark:prose-invert max-w-none">
<MDC :value="md" tag="div" /> <MDC :value="md" tag="div" />
<!-- <hr class="border-gray-800/10 dark:border-gray-200/10 !mt-5"> -->
</div> </div>
</template> </template>
@@ -325,7 +324,7 @@
</template> </template>
<template #links> <template #links>
<UButton label="Get Started" icon="i-heroicons-rocket-launch" size="md" /> <UButton label="Get started" icon="i-heroicons-rocket-launch" size="md" />
<UInput <UInput
model-value="npm i @nuxt/ui" model-value="npm i @nuxt/ui"
@@ -374,9 +373,9 @@
</ULandingSection> </ULandingSection>
<div class="h-[calc(var(--inc)*42)]" /> <div class="h-[calc(var(--inc)*42)]" />
</div> </div> -->
<div class="_not_screen_xl"> <!-- <div class="_not_screen_xl">
<ULandingSection> <ULandingSection>
<template #title> <template #title>
<span v-html="page.pro.landing?.title" /> <span v-html="page.pro.landing?.title" />
@@ -403,15 +402,15 @@
<source src="https://res.cloudinary.com/nuxt/video/upload/v1698923398/ui-pro/nuxt-ui-pro-docs-demo_jm6ubr.ogg" type="video/ogg"> <source src="https://res.cloudinary.com/nuxt/video/upload/v1698923398/ui-pro/nuxt-ui-pro-docs-demo_jm6ubr.ogg" type="video/ogg">
</video> </video>
</ULandingSection> </ULandingSection>
</div> </div> -->
</template> </template>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import type { ParsedContent, NavItem } from '@nuxt/content' import type { NavItem } from '@nuxt/content'
import { useElementBounding, useWindowScroll, useElementSize, breakpointsTailwind, useBreakpoints } from '@vueuse/core' import { useElementBounding, useWindowScroll, breakpointsTailwind, useBreakpoints } from '@vueuse/core'
import type { HomeProBlock } from '~/types' // import type { HomeProBlock } from '~/types'
const { data: page } = await useAsyncData('index', () => queryContent('/').findOne()) const { data: page } = await useAsyncData('index', () => queryContent('/').findOne())
const { data: module } = await useFetch<{ const { data: module } = await useFetch<{
@@ -435,321 +434,321 @@ useSeoMeta({
ogTitle: page.value.title, ogTitle: page.value.title,
description: page.value.description, description: page.value.description,
ogDescription: page.value.description, ogDescription: page.value.description,
ogImage: 'https://ui.nuxt.com/social-card.png', ogImage: 'https://ui2.nuxt.com/social-card.png',
twitterImage: 'https://ui.nuxt.com/social-card.png' twitterImage: 'https://ui2.nuxt.com/social-card.png'
}) })
const source = ref('npx nuxi@latest module add ui') // const source = ref('npx nuxi@latest module add ui')
const sectionRef = ref() const sectionRef = ref()
const demoRef = ref(null) // const demoRef = ref(null)
const start = ref(0) const start = ref(0)
const { $ui } = useNuxtApp() // const { $ui } = useNuxtApp()
const { height } = useElementSize(demoRef) // const { height } = useElementSize(demoRef)
const { top } = useElementBounding(sectionRef) const { top } = useElementBounding(sectionRef)
const { y } = useWindowScroll() const { y } = useWindowScroll()
const config = useRuntimeConfig().public const config = useRuntimeConfig().public
const { copy, copied } = useClipboard({ source }) // const { copy, copied } = useClipboard({ source })
const breakpoints = useBreakpoints(breakpointsTailwind) const breakpoints = useBreakpoints(breakpointsTailwind)
const lgAndLarger = breakpoints.greaterOrEqual('lg') const lgAndLarger = breakpoints.greaterOrEqual('lg')
const { format } = Intl.NumberFormat('en', { notation: 'compact' }) const { format } = Intl.NumberFormat('en', { notation: 'compact' })
const steps = { // const steps = {
header: 0, // header: 0,
footer: 5, // footer: 5,
landing: 10, // landing: 10,
docs: 27 // docs: 27
} // }
// Computed // Computed
const inc = computed(() => (height.value - 32 - 64 - 32 - 32) / 4) // const inc = computed(() => (height.value - 32 - 64 - 32 - 32) / 4)
const landingBlocks = computed(() => isAfterStep(steps.landing) && isBeforeStep(steps.docs) // const landingBlocks = computed(() => isAfterStep(steps.landing) && isBeforeStep(steps.docs)
? [{ // ? [{
class: 'inset-x-0 top-20 bottom-20 overflow-hidden', // class: 'inset-x-0 top-20 bottom-20 overflow-hidden',
inactive: true, // inactive: true,
children: [{ // children: [{
name: 'ULandingHero', // name: 'ULandingHero',
to: '/pro/components/landing-hero', // to: '/pro/components/landing-hero',
class: [ // class: [
'inset-4', // 'inset-4',
isAfterStep(steps.landing + 2) && '-top-[calc(var(--y)-var(--step-y)-1rem)] bottom-[calc(var(--y)-var(--step-y)+1rem)]' // isAfterStep(steps.landing + 2) && '-top-[calc(var(--y)-var(--step-y)-1rem)] bottom-[calc(var(--y)-var(--step-y)+1rem)]'
].filter(Boolean).join(' '), // ].filter(Boolean).join(' '),
style: { // style: {
'--step-y': `${getStepY(steps.landing + 2)}px` // '--step-y': `${getStepY(steps.landing + 2)}px`
}, // },
inactive: isAfterStep(steps.landing + 1), // inactive: isAfterStep(steps.landing + 1),
children: [{ // children: [{
slot: 'landing-hero', // slot: 'landing-hero',
class: 'inset-4' // class: 'inset-4'
}] // }]
}, isAfterStep(steps.landing + 2) && { // }, isAfterStep(steps.landing + 2) && {
name: 'ULandingSection', // name: 'ULandingSection',
to: '/pro/components/landing-section', // to: '/pro/components/landing-section',
class: [ // class: [
'inset-4', // 'inset-4',
isBeforeStep(steps.landing + 6) && '-top-[calc(var(--y)-var(--prev-step-y)-var(--height)-1rem)] bottom-[calc(var(--y)-var(--prev-step-y)-var(--height)+1rem)]', // isBeforeStep(steps.landing + 6) && '-top-[calc(var(--y)-var(--prev-step-y)-var(--height)-1rem)] bottom-[calc(var(--y)-var(--prev-step-y)-var(--height)+1rem)]',
isAfterStep(steps.landing + 10) && '-top-[calc(var(--y)-var(--step-y)-1rem)] bottom-[calc(var(--y)-var(--step-y)+1rem)]' // isAfterStep(steps.landing + 10) && '-top-[calc(var(--y)-var(--step-y)-1rem)] bottom-[calc(var(--y)-var(--step-y)+1rem)]'
].filter(Boolean).join(' '), // ].filter(Boolean).join(' '),
style: { // style: {
'--height': (inc.value * 4) + 'px', // '--height': (inc.value * 4) + 'px',
'--step-y': `${getStepY(steps.landing + 10)}px`, // '--step-y': `${getStepY(steps.landing + 10)}px`,
'--prev-step-y': `${getStepY(steps.landing + 2)}px` // '--prev-step-y': `${getStepY(steps.landing + 2)}px`
}, // },
inactive: isAfterStep(steps.landing + 7), // inactive: isAfterStep(steps.landing + 7),
children: [{ // children: [{
slot: 'landing-section', // slot: 'landing-section',
class: 'inset-x-4 top-16' // class: 'inset-x-4 top-16'
}, { // }, {
name: 'ULandingGrid', // name: 'ULandingGrid',
to: '/pro/components/landing-grid', // to: '/pro/components/landing-grid',
class: ['inset-x-4 bottom-4 top-48', isAfterStep(steps.landing + 8) && 'grid grid-cols-4 gap-4 p-4'].filter(Boolean).join(' '), // class: ['inset-x-4 bottom-4 top-48', isAfterStep(steps.landing + 8) && 'grid grid-cols-4 gap-4 p-4'].filter(Boolean).join(' '),
inactive: isAfterStep(steps.landing + 8), // inactive: isAfterStep(steps.landing + 8),
children: [isAfterStep(steps.landing + 9) // children: [isAfterStep(steps.landing + 9)
? { // ? {
slot: 'landing-card-1', // slot: 'landing-card-1',
class: '!relative' // class: '!relative'
} // }
: { // : {
name: 'ULandingCard', // name: 'ULandingCard',
to: '/pro/components/landing-card', // to: '/pro/components/landing-card',
class: '!relative h-full', // class: '!relative h-full',
inactive: false // inactive: false
}, isAfterStep(steps.landing + 9) // }, isAfterStep(steps.landing + 9)
? { // ? {
slot: 'landing-card-2', // slot: 'landing-card-2',
class: '!relative h-full' // class: '!relative h-full'
} // }
: { // : {
name: 'ULandingCard', // name: 'ULandingCard',
to: '/pro/components/landing-card', // to: '/pro/components/landing-card',
class: '!relative h-full', // class: '!relative h-full',
inactive: false // inactive: false
}, isAfterStep(steps.landing + 9) // }, isAfterStep(steps.landing + 9)
? { // ? {
slot: 'landing-card-3', // slot: 'landing-card-3',
class: '!relative h-full' // class: '!relative h-full'
} // }
: { // : {
name: 'ULandingCard', // name: 'ULandingCard',
to: '/pro/components/landing-card', // to: '/pro/components/landing-card',
class: '!relative h-full', // class: '!relative h-full',
inactive: false // inactive: false
}, isAfterStep(steps.landing + 9) // }, isAfterStep(steps.landing + 9)
? { // ? {
slot: 'landing-card-4', // slot: 'landing-card-4',
class: '!relative h-full' // class: '!relative h-full'
} // }
: { // : {
name: 'ULandingCard', // name: 'ULandingCard',
to: '/pro/components/landing-card', // to: '/pro/components/landing-card',
class: '!relative h-full', // class: '!relative h-full',
inactive: false // inactive: false
}] // }]
}] // }]
}, isAfterStep(steps.landing + 10) && { // }, isAfterStep(steps.landing + 10) && {
name: 'ULandingSection', // name: 'ULandingSection',
to: '/pro/components/landing-section', // to: '/pro/components/landing-section',
class: [ // class: [
'inset-4', // 'inset-4',
isBeforeStep(steps.landing + 14) && '-top-[calc(var(--y)-var(--prev-step-y)-var(--height)-1rem)] bottom-[calc(var(--y)-var(--prev-step-y)-var(--height)+1rem)]' // isBeforeStep(steps.landing + 14) && '-top-[calc(var(--y)-var(--prev-step-y)-var(--height)-1rem)] bottom-[calc(var(--y)-var(--prev-step-y)-var(--height)+1rem)]'
].filter(Boolean).join(' '), // ].filter(Boolean).join(' '),
style: { // style: {
'--height': (inc.value * 4) + 'px', // '--height': (inc.value * 4) + 'px',
'--step-y': `${getStepY(steps.landing + 18)}px`, // '--step-y': `${getStepY(steps.landing + 18)}px`,
'--prev-step-y': `${getStepY(steps.landing + 10)}px` // '--prev-step-y': `${getStepY(steps.landing + 10)}px`
}, // },
inactive: isAfterStep(steps.landing + 15), // inactive: isAfterStep(steps.landing + 15),
children: [{ // children: [{
name: 'ULandingCTA', // name: 'ULandingCTA',
class: 'inset-4', // class: 'inset-4',
inactive: isAfterStep(steps.landing + 16), // inactive: isAfterStep(steps.landing + 16),
children: [{ // children: [{
slot: 'landing-cta', // slot: 'landing-cta',
class: 'inset-0' // class: 'inset-0'
}] // }]
}] // }]
}].filter(Boolean) // }].filter(Boolean)
}] // }]
: []) // : [])
const docsBlocks = computed(() => [isAfterStep(steps.docs) && { // const docsBlocks = computed(() => [isAfterStep(steps.docs) && {
name: 'UPage', // name: 'UPage',
to: '/pro/components/page', // to: '/pro/components/page',
class: 'inset-x-0 top-20 bottom-20', // class: 'inset-x-0 top-20 bottom-20',
inactive: isAfterStep(steps.docs + 1), // inactive: isAfterStep(steps.docs + 1),
children: [isAfterStep(steps.docs + 2) // children: [isAfterStep(steps.docs + 2)
? { // ? {
name: 'UAside', // name: 'UAside',
to: '/pro/components/aside', // to: '/pro/components/aside',
class: 'left-4 inset-y-4 w-64', // class: 'left-4 inset-y-4 w-64',
inactive: isAfterStep(steps.docs + 3), // inactive: isAfterStep(steps.docs + 3),
children: [isAfterStep(steps.docs + 4) // children: [isAfterStep(steps.docs + 4)
? { // ? {
slot: 'aside-top', // slot: 'aside-top',
class: 'inset-x-4 top-4' // class: 'inset-x-4 top-4'
} // }
: { // : {
name: '#top', // name: '#top',
class: 'inset-x-4 top-4 h-9' // class: 'inset-x-4 top-4 h-9'
}, isAfterStep(steps.docs + 5) // }, isAfterStep(steps.docs + 5)
? { // ? {
name: 'UNavigationTree', // name: 'UNavigationTree',
to: '/pro/components/navigation-tree', // to: '/pro/components/navigation-tree',
class: ['inset-x-4 top-[4.25rem] bottom-4', isAfterStep(steps.docs + 6) && '!bg-transparent !border-0'].join(' '), // class: ['inset-x-4 top-[4.25rem] bottom-4', isAfterStep(steps.docs + 6) && '!bg-transparent !border-0'].join(' '),
inactive: isAfterStep(steps.docs + 6), // inactive: isAfterStep(steps.docs + 6),
children: [{ // children: [{
slot: 'aside-default', // slot: 'aside-default',
class: 'inset-0' // class: 'inset-0'
}] // }]
} // }
: { // : {
name: '#default', // name: '#default',
class: 'inset-x-4 top-[4.25rem] bottom-4' // class: 'inset-x-4 top-[4.25rem] bottom-4'
}] // }]
} // }
: { // : {
name: '#left', // name: '#left',
class: 'left-4 inset-y-4 w-64' // class: 'left-4 inset-y-4 w-64'
}, isAfterStep(steps.docs + 7) // }, isAfterStep(steps.docs + 7)
? { // ? {
name: 'UPage', // name: 'UPage',
to: '/pro/components/page', // to: '/pro/components/page',
class: 'left-72 right-4 inset-y-4', // class: 'left-72 right-4 inset-y-4',
inactive: isAfterStep(steps.docs + 8), // inactive: isAfterStep(steps.docs + 8),
children: [...(isAfterStep(steps.docs + 9) // children: [...(isAfterStep(steps.docs + 9)
? [{ // ? [{
name: 'UPageHeader', // name: 'UPageHeader',
to: '/pro/components/page-header', // to: '/pro/components/page-header',
class: 'top-4 left-4 right-72 h-32', // class: 'top-4 left-4 right-72 h-32',
inactive: isAfterStep(steps.docs + 10), // inactive: isAfterStep(steps.docs + 10),
children: [{ // children: [{
slot: 'page-header', // slot: 'page-header',
class: 'inset-4 justify-start' // class: 'inset-4 justify-start'
}] // }]
}, { // }, {
name: 'UPageBody', // name: 'UPageBody',
to: '/pro/components/page-body', // to: '/pro/components/page-body',
class: 'top-40 left-4 right-72 bottom-4 overflow-y-auto', // class: 'top-40 left-4 right-72 bottom-4 overflow-y-auto',
inactive: isAfterStep(steps.docs + 11), // inactive: isAfterStep(steps.docs + 11),
children: [{ // children: [{
slot: 'page-body', // slot: 'page-body',
class: 'inset-x-4 top-4 justify-start' // class: 'inset-x-4 top-4 justify-start'
}, isAfterStep(steps.docs + 12) // }, isAfterStep(steps.docs + 12)
? { // ? {
slot: 'content-surround', // slot: 'content-surround',
class: 'bottom-4 inset-x-4 h-28' // class: 'bottom-4 inset-x-4 h-28'
} // }
: { // : {
name: 'UContentSurround', // name: 'UContentSurround',
to: '/pro/components/content-surround', // to: '/pro/components/content-surround',
class: 'bottom-4 inset-x-4 h-28', // class: 'bottom-4 inset-x-4 h-28',
inactive: false // inactive: false
}] // }]
}] // }]
: [{ // : [{
name: '#default', // name: '#default',
class: 'left-4 right-72 inset-y-4' // class: 'left-4 right-72 inset-y-4'
}]), isAfterStep(steps.docs + 13) // }]), isAfterStep(steps.docs + 13)
? { // ? {
name: 'UContentToc', // name: 'UContentToc',
to: '/pro/components/content-toc', // to: '/pro/components/content-toc',
class: 'right-4 inset-y-4 w-64', // class: 'right-4 inset-y-4 w-64',
inactive: isAfterStep(steps.docs + 14), // inactive: isAfterStep(steps.docs + 14),
children: [{ // children: [{
slot: 'content-toc', // slot: 'content-toc',
class: 'inset-4 overflow-y-auto' // class: 'inset-4 overflow-y-auto'
}] // }]
} // }
: { // : {
name: '#right', // name: '#right',
class: 'right-4 inset-y-4 w-64' // class: 'right-4 inset-y-4 w-64'
}] // }]
} // }
: { // : {
name: '#default', // name: '#default',
class: 'left-72 right-4 inset-y-4' // class: 'left-72 right-4 inset-y-4'
}] // }]
}].filter(Boolean)) // }].filter(Boolean))
const blocks = computed(() => [isAfterStep(steps.header) && { // const blocks = computed(() => [isAfterStep(steps.header) && {
name: 'UHeader', // name: 'UHeader',
to: '/pro/components/header', // to: '/pro/components/header',
class: 'h-16 inset-x-0 top-0', // class: 'h-16 inset-x-0 top-0',
inactive: isAfterStep(steps.header + 1), // inactive: isAfterStep(steps.header + 1),
children: [isAfterStep(steps.header + 2) // children: [isAfterStep(steps.header + 2)
? { // ? {
slot: 'header-left', // slot: 'header-left',
class: 'left-4 top-4' // class: 'left-4 top-4'
} // }
: { // : {
name: '#left', // name: '#left',
class: 'left-4 inset-y-4 w-64' // class: 'left-4 inset-y-4 w-64'
}, isAfterStep(steps.header + 3) // }, isAfterStep(steps.header + 3)
? { // ? {
slot: 'header-center', // slot: 'header-center',
class: 'inset-x-72 top-5' // class: 'inset-x-72 top-5'
} // }
: { // : {
name: '#center', // name: '#center',
class: 'inset-x-72 inset-y-4' // class: 'inset-x-72 inset-y-4'
}, isAfterStep(steps.header + 4) // }, isAfterStep(steps.header + 4)
? { // ? {
slot: 'header-right', // slot: 'header-right',
class: 'right-4 top-4' // class: 'right-4 top-4'
} // }
: { // : {
name: '#right', // name: '#right',
class: 'right-4 inset-y-4 w-64' // class: 'right-4 inset-y-4 w-64'
}] // }]
}, isAfterStep(steps.footer) && { // }, isAfterStep(steps.footer) && {
name: 'UFooter', // name: 'UFooter',
to: '/pro/components/footer', // to: '/pro/components/footer',
class: 'h-16 inset-x-0 bottom-0', // class: 'h-16 inset-x-0 bottom-0',
inactive: isAfterStep(steps.footer + 1), // inactive: isAfterStep(steps.footer + 1),
children: [isAfterStep(steps.footer + 2) // children: [isAfterStep(steps.footer + 2)
? { // ? {
slot: 'footer-left', // slot: 'footer-left',
class: 'left-4 bottom-5' // class: 'left-4 bottom-5'
} // }
: { // : {
name: '#left', // name: '#left',
class: 'left-4 inset-y-4 w-64' // class: 'left-4 inset-y-4 w-64'
}, isAfterStep(steps.footer + 3) // }, isAfterStep(steps.footer + 3)
? { // ? {
slot: 'footer-center', // slot: 'footer-center',
class: 'inset-x-72 bottom-5' // class: 'inset-x-72 bottom-5'
} // }
: { // : {
name: '#center', // name: '#center',
class: 'inset-x-72 inset-y-4' // class: 'inset-x-72 inset-y-4'
}, isAfterStep(steps.footer + 4) // }, isAfterStep(steps.footer + 4)
? { // ? {
slot: 'footer-right', // slot: 'footer-right',
class: 'right-4 bottom-4' // class: 'right-4 bottom-4'
} // }
: { // : {
name: '#right', // name: '#right',
class: 'right-4 inset-y-4 w-64' // class: 'right-4 inset-y-4 w-64'
}] // }]
}, ...landingBlocks.value, ...docsBlocks.value].filter(Boolean)) // }, ...landingBlocks.value, ...docsBlocks.value].filter(Boolean))
// Methods // Methods
function isBeforeStep(i = 0) { // function isBeforeStep(i = 0) {
return y.value < (start.value + (i * inc.value)) // return y.value < (start.value + (i * inc.value))
} // }
function isAfterStep(i = 0) { // function isAfterStep(i = 0) {
return y.value >= (start.value + (i * inc.value)) // return y.value >= (start.value + (i * inc.value))
} // }
function getStepY(step: number) { // function getStepY(step: number) {
return start.value + (step * inc.value) // return start.value + (step * inc.value)
} // }
// Hooks // Hooks
@@ -761,94 +760,94 @@ onMounted(() => {
// Slots Data // Slots Data
const headerLinks = [{ // const headerLinks = [{
label: 'Documentation', // label: 'Documentation',
active: true // active: true
}, { // }, {
label: 'Playground' // label: 'Playground'
}, { // }, {
label: 'Roadmap' // label: 'Roadmap'
}, { // }, {
label: 'Pro' // label: 'Pro'
}] // }]
const navigationLinks = [{ // const navigationLinks = [{
label: 'Getting Started', // label: 'Getting Started',
children: [{ // children: [{
label: 'Introduction' // label: 'Introduction'
}, { // }, {
label: 'Installation', // label: 'Installation',
active: true // active: true
}, { // }, {
label: 'Theming' // label: 'Theming'
}, { // }, {
label: 'Shortcuts' // label: 'Shortcuts'
}, { // }, {
label: 'Examples' // label: 'Examples'
}, { // }, {
label: 'Roadmap' // label: 'Roadmap'
}] // }]
}, { // }, {
label: 'Elements', // label: 'Elements',
children: [{ // children: [{
label: 'Alert' // label: 'Alert'
}, { // }, {
label: 'Avatar' // label: 'Avatar'
}, { // }, {
label: 'Badge' // label: 'Badge'
}, { // }, {
label: 'Button' // label: 'Button'
}] // }]
}] // }]
const surround = [{ // const surround = [{
title: 'Introduction', // title: 'Introduction',
description: 'Fully styled and customizable components for Nuxt.', // description: 'Fully styled and customizable components for Nuxt.',
_path: '/' // _path: '/'
}, { // }, {
title: 'Theming', // title: 'Theming',
description: 'Learn how to customize the look and feel of the components.', // description: 'Learn how to customize the look and feel of the components.',
_path: '/' // _path: '/'
}] // }]
const md = ` // const md = `
## Edge // ## Edge
To use the latest updates pushed on the [\`dev\`](https://github.com/nuxt/ui/tree/dev) branch, you can use \`@nuxt/ui-edge\`. // To use the latest updates pushed on the [\`dev\`](https://github.com/nuxt/ui/tree/v2) branch, you can use \`@nuxt/ui-edge\`.
` // `
const toc = [{ // const toc = [{
id: 'quick-start', // id: 'quick-start',
depth: 2, // depth: 2,
text: 'Quick Start' // text: 'Quick Start'
}, { // }, {
id: 'intellisense', // id: 'intellisense',
depth: 2, // depth: 2,
text: 'IntelliSense' // text: 'IntelliSense'
}, { // }, {
id: 'options', // id: 'options',
depth: 2, // depth: 2,
text: 'Options' // text: 'Options'
}, { // }, {
id: 'edge', // id: 'edge',
depth: 2, // depth: 2,
text: 'Edge' // text: 'Edge'
}] // }]
const communityLinks = [{ // const communityLinks = [{
icon: 'i-heroicons-pencil-square', // icon: 'i-heroicons-pencil-square',
label: 'Edit this page' // label: 'Edit this page'
}, { // }, {
icon: 'i-heroicons-star', // icon: 'i-heroicons-star',
label: 'Star on GitHub', // label: 'Star on GitHub',
to: 'https://github.com/nuxt/ui', // to: 'https://github.com/nuxt/ui',
target: '_blank' // target: '_blank'
}, { // }, {
icon: 'i-heroicons-book-open', // icon: 'i-heroicons-book-open',
label: 'Nuxt documentation', // label: 'Nuxt documentation',
to: 'https://nuxt.com', // to: 'https://nuxt.com',
target: '_blank' // target: '_blank'
}] // }]
</script> </script>
<style scoped lang="postcss"> <style scoped lang="postcss">

View File

@@ -1,2 +1 @@
user-agent: * user-agent: *
disallow: /dev/*

View File

@@ -1,20 +1,29 @@
{ {
"name": "@nuxt/ui", "name": "@nuxt/ui",
"description": "A UI Library for Modern Web Apps, powered by Vue & Tailwind CSS.", "description": "A UI Library for Modern Web Apps, powered by Vue & Tailwind CSS.",
"version": "2.21.1", "version": "2.22.1",
"packageManager": "pnpm@10.6.1", "packageManager": "pnpm@10.13.1",
"repository": "nuxt/ui", "repository": {
"homepage": "https://ui.nuxt.com", "type": "git",
"url": "git+https://github.com/nuxt/ui.git"
},
"homepage": "https://ui2.nuxt.com",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"exports": { "exports": {
".": { ".": {
"import": "./dist/module.mjs", "types": "./dist/module.d.mts",
"require": "./dist/module.cjs" "import": "./dist/module.mjs"
} }
}, },
"main": "./dist/module.cjs", "typesVersions": {
"types": "./dist/types.d.ts", "*": {
".": [
"./dist/module.d.mts"
]
}
},
"main": "./dist/module.mjs",
"files": [ "files": [
"dist" "dist"
], ],
@@ -35,18 +44,19 @@
"@headlessui/tailwindcss": "^0.2.2", "@headlessui/tailwindcss": "^0.2.2",
"@headlessui/vue": "^1.7.23", "@headlessui/vue": "^1.7.23",
"@iconify-json/heroicons": "^1.2.2", "@iconify-json/heroicons": "^1.2.2",
"@nuxt/icon": "^1.10.3", "@nuxt/icon": "^1.15.0",
"@nuxt/kit": "^3.16.0", "@nuxt/kit": "^4.0.1",
"@nuxtjs/color-mode": "^3.5.2", "@nuxtjs/color-mode": "^3.5.2",
"@nuxtjs/tailwindcss": "^6.13.1", "@nuxtjs/tailwindcss": "^6.14.0",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@standard-schema/spec": "^1.0.0",
"@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.10", "@tailwindcss/forms": "^0.5.10",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@vueuse/core": "^12.8.2", "@vueuse/core": "^13.5.0",
"@vueuse/integrations": "^12.8.2", "@vueuse/integrations": "^13.5.0",
"@vueuse/math": "^12.8.2", "@vueuse/math": "^13.5.0",
"defu": "^6.1.4", "defu": "^6.1.4",
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"ohash": "^2.0.11", "ohash": "^2.0.11",
@@ -56,34 +66,53 @@
"tailwindcss": "^3.4.17" "tailwindcss": "^3.4.17"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/eslint-config": "^1.1.0", "@nuxt/eslint-config": "^1.6.0",
"@nuxt/module-builder": "^0.8.4", "@nuxt/module-builder": "^1.0.1",
"@standard-schema/spec": "^1.0.0", "@nuxt/test-utils": "^3.19.2",
"@nuxt/test-utils": "^3.17.1", "@release-it/conventional-changelog": "^10.0.1",
"@release-it/conventional-changelog": "^10.0.0",
"@vue/test-utils": "^2.4.6", "@vue/test-utils": "^2.4.6",
"eslint": "^9.22.0", "eslint": "^9.31.0",
"happy-dom": "^17.1.8", "happy-dom": "^18.0.1",
"joi": "^17.13.3", "nuxt": "^4.0.1",
"nuxt": "^3.16.0", "release-it": "^19.0.4",
"release-it": "^18.1.2", "typescript": "^5.8.3",
"superstruct": "^2.0.2", "vitest": "^3.2.4",
"typescript": "^5.6.3",
"valibot": "^0.42.1",
"valibot30": "npm:valibot@0.30.0",
"valibot31": "npm:valibot@0.31.0",
"vitest": "^3.0.8",
"vitest-environment-nuxt": "^1.0.1", "vitest-environment-nuxt": "^1.0.1",
"vue-tsc": "^2.1.10", "vue-tsc": "^3.0.3"
"yup": "^1.6.1", },
"zod": "^3.24.2" "peerDependencies": {
"joi": "^17.13.0",
"superstruct": "^2.0.0",
"valibot": "^1.0.0",
"yup": "^1.6.0",
"zod": "^3.24.0"
},
"peerDependenciesMeta": {
"joi": {
"optional": true
},
"valibot": {
"optional": true
},
"superstruct": {
"optional": true
},
"yup": {
"optional": true
},
"zod": {
"optional": true
}
}, },
"resolutions": { "resolutions": {
"@nuxt/ui": "workspace:*", "@nuxt/ui": "workspace:*",
"@nuxt/content": "2.13.2", "@nuxt/content": "2.13.2",
"@nuxtjs/mdc": "0.9.0", "@nuxtjs/mdc": "0.9.0",
"chokidar": "3.6.0", "@vueuse/core": "^13.5.0",
"vue-tsc": "2.1.10", "@vueuse/integrations": "^13.5.0",
"typescript": "5.6.3" "@vueuse/math": "^13.5.0",
"@vueuse/nuxt": "13.1.0",
"unimport": "4.1.1",
"chokidar": "3.6.0"
} }
} }

View File

@@ -9,6 +9,6 @@
}, },
"dependencies": { "dependencies": {
"@nuxt/ui": "latest", "@nuxt/ui": "latest",
"nuxt": "^3.16.0" "nuxt": "^4.0.1"
} }
} }

9418
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,10 @@
packages: packages:
- "./" - ./
- "docs" - docs
- "playground" - playground
ignoredBuiltDependencies:
- '@parcel/watcher'
- esbuild
- sharp
- vue-demi

View File

@@ -5,11 +5,7 @@
"lockFileMaintenance": { "lockFileMaintenance": {
"enabled": true "enabled": true
}, },
"ignoreDeps": [ "baseBranches": ["v2", "v3"],
"valibot30",
"valibot31"
],
"baseBranches": ["dev", "v3"],
"packageRules": [{ "packageRules": [{
"matchBaseBranches": ["v3"], "matchBaseBranches": ["v3"],
"labels": ["v3"] "labels": ["v3"]

View File

@@ -13,4 +13,4 @@ fi
# Release package # Release package
echo "Publishing @nuxt/ui" echo "Publishing @nuxt/ui"
npm publish -q --access public npm publish --access public --no-tag

View File

@@ -93,15 +93,17 @@
/> />
</td> </td>
<td v-for="(column, subIndex) in columns" :key="subIndex" :class="[ui.td.base, ui.td.padding, ui.td.color, ui.td.font, ui.td.size, column?.rowClass, row[column.key]?.class, column.key === 'select' && ui.checkbox.padding]"> <td v-for="(column, subIndex) in columns" :key="subIndex" :class="[ui.td.base, ui.td.padding, ui.td.color, ui.td.font, ui.td.size, column?.rowClass, row[column.key]?.class, column.key === 'select' && ui.checkbox.padding]">
<slot v-if="modelValue && column.key === 'select' " name="select-data" :checked="isSelected(row)" :change="(ev: boolean) => onChangeCheckbox(ev, row)"> <!-- This is a workaround: Since the @change event doesn't bubble up naturally, we need to wrap it in another element and use @click.capture.stop to simulate event bubbling behavior -->
<UCheckbox <span v-if="modelValue && column.key === 'select' " @click.capture.stop="() => {}">
:model-value="isSelected(row)" <slot name="select-data" :checked="isSelected(row)" :change="(ev: boolean) => onChangeCheckbox(ev, row)">
v-bind="ui.default.checkbox" <UCheckbox
aria-label="Select row" :model-value="isSelected(row)"
@change="onChangeCheckbox($event, row)" v-bind="ui.default.checkbox"
/> aria-label="Select row"
</slot> @change="onChangeCheckbox($event, row)"
/>
</slot>
</span>
<slot <slot
v-else v-else
:name="`${column.key}-data`" :name="`${column.key}-data`"

View File

@@ -5,7 +5,7 @@
</slot> </slot>
<slot> <slot>
<span v-if="label"> <span v-if="label !== undefined && label !== null">
{{ label }} {{ label }}
</span> </span>
</slot> </slot>

View File

@@ -5,7 +5,7 @@
</slot> </slot>
<slot> <slot>
<span v-if="label" :class="[truncate ? ui.truncate : '']"> <span v-if="label !== undefined && label !== null" :class="[truncate ? ui.truncate : '']">
{{ label }} {{ label }}
</span> </span>
</slot> </slot>

View File

@@ -33,7 +33,8 @@
<script lang="ts"> <script lang="ts">
import { isEqual, diff } from 'ohash/utils' import { isEqual, diff } from 'ohash/utils'
import { type PropType, defineComponent } from 'vue' import { defineComponent } from 'vue'
import type { PropType } from 'vue'
import { nuxtLinkProps } from '../../utils' import { nuxtLinkProps } from '../../utils'
export default defineComponent({ export default defineComponent({

View File

@@ -46,10 +46,6 @@ export default defineComponent({
UIcon UIcon
}, },
inheritAttrs: false, inheritAttrs: false,
slots: Object as SlotsType<{
indicator?: { percent: number, value: number }
label?: { percent: number, value: number }
}>,
props: { props: {
value: { value: {
type: Number, type: Number,
@@ -98,6 +94,10 @@ export default defineComponent({
default: () => ({}) default: () => ({})
} }
}, },
slots: Object as SlotsType<{
indicator?: { percent: number, value: number }
label?: { percent: number, value: number }
}>,
setup(props) { setup(props) {
const { ui, attrs } = useUI('meter', toRef(props, 'ui'), config, toRef(props, 'class')) const { ui, attrs } = useUI('meter', toRef(props, 'ui'), config, toRef(props, 'class'))

View File

@@ -5,14 +5,11 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { provide, ref, type PropType, defineComponent, onUnmounted, onMounted, readonly } from 'vue' import { provide, ref, defineComponent, onUnmounted, onMounted, readonly } from 'vue'
import type { PropType } from 'vue'
import { useEventBus } from '@vueuse/core' import { useEventBus } from '@vueuse/core'
import type { ZodSchema } from 'zod'
import type { ValidationError as JoiError, Schema as JoiSchema } from 'joi' import type { ValidationError as JoiError, Schema as JoiSchema } from 'joi'
import type { ObjectSchema as YupObjectSchema, ValidationError as YupError } from 'yup' import type { ObjectSchema as YupObjectSchema, ValidationError as YupError } from 'yup'
import type { BaseSchema as ValibotSchema30, BaseSchemaAsync as ValibotSchemaAsync30 } from 'valibot30'
import type { GenericSchema as ValibotSchema31, GenericSchemaAsync as ValibotSchemaAsync31, SafeParser as ValibotSafeParser31, SafeParserAsync as ValibotSafeParserAsync31 } from 'valibot31'
import type { GenericSchema as ValibotSchema, GenericSchemaAsync as ValibotSchemaAsync, SafeParser as ValibotSafeParser, SafeParserAsync as ValibotSafeParserAsync } from 'valibot'
import type { StandardSchemaV1 } from '@standard-schema/spec' import type { StandardSchemaV1 } from '@standard-schema/spec'
import type { Struct } from 'superstruct' import type { Struct } from 'superstruct'
import type { FormError, FormEvent, FormEventType, FormSubmitEvent, FormErrorEvent, Form, ValidateReturnSchema } from '../../types/form' import type { FormError, FormEvent, FormEventType, FormSubmitEvent, FormErrorEvent, Form, ValidateReturnSchema } from '../../types/form'
@@ -26,15 +23,10 @@ class FormException extends Error {
} }
} }
type Schema = PropType<ZodSchema> type Schema = PropType<StandardSchemaV1>
| PropType<YupObjectSchema<any>> | PropType<YupObjectSchema<any>>
| PropType<Struct<any, any>>
| PropType<JoiSchema> | PropType<JoiSchema>
| PropType<ValibotSchema30 | ValibotSchemaAsync30>
| PropType<ValibotSchema31 | ValibotSchemaAsync31>
| PropType<ValibotSafeParser31<any, any> | ValibotSafeParserAsync31<any, any>>
| PropType<ValibotSchema | ValibotSchemaAsync>
| PropType<ValibotSafeParser<any, any> | ValibotSafeParserAsync<any, any>> | PropType<Struct<any, any>>
| PropType<StandardSchemaV1>
export default defineComponent({ export default defineComponent({
props: { props: {
@@ -214,14 +206,6 @@ function isJoiError(error: any): error is JoiError {
return error.isJoi === true return error.isJoi === true
} }
function isValibotSchema(schema: any): schema is ValibotSchema30 | ValibotSchemaAsync30 | ValibotSchema31 | ValibotSchemaAsync31 | ValibotSafeParser31<any, any> | ValibotSafeParserAsync31<any, any> | ValibotSchema | ValibotSchemaAsync | ValibotSafeParser<any, any> | ValibotSafeParserAsync<any, any> {
return '_parse' in schema || '_run' in schema || (typeof schema === 'function' && 'schema' in schema)
}
function isZodSchema(schema: any): schema is ZodSchema {
return schema.parse !== undefined
}
export function isStandardSchema(schema: any): schema is StandardSchemaV1 { export function isStandardSchema(schema: any): schema is StandardSchemaV1 {
return '~standard' in schema return '~standard' in schema
} }
@@ -251,35 +235,6 @@ export async function validateStandardSchema(
} }
} }
async function validateValibotSchema(
state: any,
schema: ValibotSchema30 | ValibotSchemaAsync30 | ValibotSchema31 | ValibotSchemaAsync31 | ValibotSafeParser31<any, any> | ValibotSafeParserAsync31<any, any> | ValibotSchema | ValibotSchemaAsync | ValibotSafeParser<any, any> | ValibotSafeParserAsync<any, any>
): Promise<ValidateReturnSchema<typeof state>> {
const result = await ('_parse' in schema ? schema._parse(state) : '_run' in schema ? schema._run({ typed: false, value: state }, {}) : schema(state))
if (!result.issues || result.issues.length === 0) {
const output = ('output' in result
? result.output
: 'value' in result
? result.value
: null)
return {
errors: null,
result: output
}
}
const errors = result.issues.map(issue => ({
path: issue.path?.map(item => item.key).join('.') || '',
message: issue.message
}))
return {
errors,
result: null
}
}
async function validateJoiSchema( async function validateJoiSchema(
state: any, state: any,
schema: JoiSchema schema: JoiSchema
@@ -307,28 +262,6 @@ async function validateJoiSchema(
} }
} }
async function validateZodSchema(
state: any,
schema: ZodSchema
): Promise<ValidateReturnSchema<typeof state>> {
const result = await schema.safeParseAsync(state)
if (result.success === false) {
const errors = result.error.issues.map(issue => ({
path: issue.path.join('.'),
message: issue.message
}))
return {
errors,
result: null
}
}
return {
result: result.data,
errors: null
}
}
async function validateSuperstructSchema(state: any, schema: Struct<any, any>): Promise<ValidateReturnSchema<typeof state>> { async function validateSuperstructSchema(state: any, schema: Struct<any, any>): Promise<ValidateReturnSchema<typeof state>> {
const [err, result] = schema.validate(state) const [err, result] = schema.validate(state)
if (err) { if (err) {
@@ -379,12 +312,8 @@ async function validateYupSchema(
function parseSchema(state: any, schema: Schema): Promise<ValidateReturnSchema<typeof state>> { function parseSchema(state: any, schema: Schema): Promise<ValidateReturnSchema<typeof state>> {
if (isStandardSchema(schema)) { if (isStandardSchema(schema)) {
return validateStandardSchema(state, schema) return validateStandardSchema(state, schema)
} else if (isZodSchema(schema)) {
return validateZodSchema(state, schema)
} else if (isJoiSchema(schema)) { } else if (isJoiSchema(schema)) {
return validateJoiSchema(state, schema) return validateJoiSchema(state, schema)
} else if (isValibotSchema(schema)) {
return validateValibotSchema(state, schema)
} else if (isYupSchema(schema)) { } else if (isYupSchema(schema)) {
return validateYupSchema(state, schema) return validateYupSchema(state, schema)
} else if (isSuperStructSchema(schema)) { } else if (isSuperStructSchema(schema)) {

View File

@@ -1,4 +1,5 @@
import { ref, type Ref, onMounted, onUnmounted } from 'vue' import { ref, onMounted, onUnmounted } from 'vue'
import type { Ref } from 'vue'
export const useCarouselScroll = (el: Ref<HTMLElement>) => { export const useCarouselScroll = (el: Ref<HTMLElement>) => {
const x = ref<number>(0) const x = ref<number>(0)

View File

@@ -1,5 +1,6 @@
import { inject, ref, computed } from 'vue' import { inject, ref, computed } from 'vue'
import { type UseEventBusReturn, useDebounceFn } from '@vueuse/core' import { useDebounceFn } from '@vueuse/core'
import type { UseEventBusReturn } from '@vueuse/core'
import type { FormEvent, FormEventType, InjectedFormGroupValue } from '../types/form' import type { FormEvent, FormEventType, InjectedFormGroupValue } from '../types/form'
type InputProps = { type InputProps = {

View File

@@ -1,6 +1,5 @@
import { createSharedComposable, useActiveElement } from '@vueuse/core' import { createSharedComposable, useActiveElement } from '@vueuse/core'
import { ref, computed, onMounted } from 'vue' import { ref, computed, onMounted } from 'vue'
import type {} from '@vueuse/shared'
export const _useShortcuts = () => { export const _useShortcuts = () => {
const macOS = computed(() => import.meta.client && navigator && navigator.userAgent && navigator.userAgent.match(/Macintosh;/)) const macOS = computed(() => import.meta.client && navigator && navigator.userAgent && navigator.userAgent.match(/Macintosh;/))

View File

@@ -1,14 +1,14 @@
export type ComponentProps<T> = export type ComponentProps<T>
T extends new () => { $props: infer P } ? NonNullable<P> : = T extends new () => { $props: infer P } ? NonNullable<P>
T extends (props: infer P, ...args: any) => any ? P : : T extends (props: infer P, ...args: any) => any ? P
{} : {}
export type ComponentSlots<T> = export type ComponentSlots<T>
T extends new () => { $slots: infer S } ? NonNullable<S> : = T extends new () => { $slots: infer S } ? NonNullable<S>
T extends (props: any, ctx: { slots: infer S, attrs: any, emit: any }, ...args: any) => any ? NonNullable<S> : : T extends (props: any, ctx: { slots: infer S, attrs: any, emit: any }, ...args: any) => any ? NonNullable<S>
{} : {}
export type ComponentEmit<T> = export type ComponentEmit<T>
T extends new () => { $emit: infer E } ? NonNullable<E> : = T extends new () => { $emit: infer E } ? NonNullable<E>
T extends (props: any, ctx: { slots: any, attrs: any, emit: infer E }, ...args: any) => any ? NonNullable<E> : : T extends (props: any, ctx: { slots: any, attrs: any, emit: infer E }, ...args: any) => any ? NonNullable<E>
{} : {}

View File

@@ -18,8 +18,8 @@ export type NestedKeyOf<ObjectType extends Record<string, any>> = {
: Key : Key
}[keyof ObjectType] }[keyof ObjectType]
type DeepKey<T, Keys extends string[]> = type DeepKey<T, Keys extends string[]>
Keys extends [infer First, ...infer Rest] = Keys extends [infer First, ...infer Rest]
? First extends keyof T ? First extends keyof T
? Rest extends string[] ? Rest extends string[]
? DeepKey<T[First], Rest> ? DeepKey<T[First], Rest>

View File

@@ -127,9 +127,11 @@ export const getNuxtLinkProps = (props) => {
} }
export const getULinkProps = (props) => { export const getULinkProps = (props) => {
const keys = [...Object.keys(nuxtLinkProps), ...Object.keys(uLinkProps), 'ariaLabel', 'title'] const keys = Object.keys(props)
const ariaKeys = keys.filter(key => key.startsWith('aria-'))
const dataKeys = keys.filter(key => key.startsWith('data-'))
return keys.reduce((acc, key) => { return [...Object.keys(nuxtLinkProps), ...Object.keys(uLinkProps), ...ariaKeys, ...dataKeys].reduce((acc, key) => {
if (props[key] !== undefined) { if (props[key] !== undefined) {
acc[key] = props[key] acc[key] = props[key]
} }