diff --git a/app/registry/blocks/field/Field.vue b/app/registry/blocks/field/Field.vue
new file mode 100644
index 0000000..5ff6cb4
--- /dev/null
+++ b/app/registry/blocks/field/Field.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldContent.vue b/app/registry/blocks/field/FieldContent.vue
new file mode 100644
index 0000000..70d5d7e
--- /dev/null
+++ b/app/registry/blocks/field/FieldContent.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldDescription.vue b/app/registry/blocks/field/FieldDescription.vue
new file mode 100644
index 0000000..b46304f
--- /dev/null
+++ b/app/registry/blocks/field/FieldDescription.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldError.vue b/app/registry/blocks/field/FieldError.vue
new file mode 100644
index 0000000..6d918cb
--- /dev/null
+++ b/app/registry/blocks/field/FieldError.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ {{ messages[0] }}
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldGroup.vue b/app/registry/blocks/field/FieldGroup.vue
new file mode 100644
index 0000000..1e25ab1
--- /dev/null
+++ b/app/registry/blocks/field/FieldGroup.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldLabel.vue b/app/registry/blocks/field/FieldLabel.vue
new file mode 100644
index 0000000..6f37231
--- /dev/null
+++ b/app/registry/blocks/field/FieldLabel.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldLegend.vue b/app/registry/blocks/field/FieldLegend.vue
new file mode 100644
index 0000000..11a1fad
--- /dev/null
+++ b/app/registry/blocks/field/FieldLegend.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldSeparator.vue b/app/registry/blocks/field/FieldSeparator.vue
new file mode 100644
index 0000000..5524e1f
--- /dev/null
+++ b/app/registry/blocks/field/FieldSeparator.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldSet.vue b/app/registry/blocks/field/FieldSet.vue
new file mode 100644
index 0000000..52bfee5
--- /dev/null
+++ b/app/registry/blocks/field/FieldSet.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/registry/blocks/field/FieldTitle.vue b/app/registry/blocks/field/FieldTitle.vue
new file mode 100644
index 0000000..ce620fa
--- /dev/null
+++ b/app/registry/blocks/field/FieldTitle.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/registry/blocks/field/index.ts b/app/registry/blocks/field/index.ts
new file mode 100644
index 0000000..cf2450a
--- /dev/null
+++ b/app/registry/blocks/field/index.ts
@@ -0,0 +1,10 @@
+export { default as Field } from "./Field.vue";
+export { default as FieldContent } from "./FieldContent.vue";
+export { default as FieldDescription } from "./FieldDescription.vue";
+export { default as FieldError, type FieldErrorItem } from "./FieldError.vue";
+export { default as FieldGroup } from "./FieldGroup.vue";
+export { default as FieldLabel } from "./FieldLabel.vue";
+export { default as FieldLegend } from "./FieldLegend.vue";
+export { default as FieldSeparator } from "./FieldSeparator.vue";
+export { default as FieldSet } from "./FieldSet.vue";
+export { default as FieldTitle } from "./FieldTitle.vue";
diff --git a/content/docs/2.components/18.form.md b/content/docs/2.components/18.form.md
index 6d6f15a..c8625e1 100644
--- a/content/docs/2.components/18.form.md
+++ b/content/docs/2.components/18.form.md
@@ -14,11 +14,10 @@ name: FormDemo
## Installation
-Add the shadcn-vue controls you want to compose, then add Stackhacker UI's form layer.
+Add the shadcn-vue controls you want to compose, then add Stackhacker UI's form layer. `form-field` installs the Stackhacker UI `field` primitive and `form` dependency automatically.
```bash
-npx shadcn-vue@latest add field input textarea select
-npx shadcn-vue@latest add "https://ui.stackhacker.io/r/form.json"
+npx shadcn-vue@latest add input textarea select
npx shadcn-vue@latest add "https://ui.stackhacker.io/r/form-field.json"
```
diff --git a/content/docs/2.components/19.form-field.md b/content/docs/2.components/19.form-field.md
index 110ffe8..4b0e9b8 100644
--- a/content/docs/2.components/19.form-field.md
+++ b/content/docs/2.components/19.form-field.md
@@ -13,7 +13,7 @@ name: FormFieldDemo
## Installation
```bash
-npx shadcn-vue@latest add field input
+npx shadcn-vue@latest add input
npx shadcn-vue@latest add "https://ui.stackhacker.io/r/form-field.json"
```
diff --git a/package.json b/package.json
index bf100d7..18d6fe9 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,8 @@
"shiki": "^3.23.0",
"tinyexec": "^1.1.2",
"tsx": "^4.21.0",
- "typescript": "^5.9.3"
+ "typescript": "^5.9.3",
+ "vue-tsc": "3.2.7"
},
"lint-staged": {
"*.+(ts|tsx|vue)": [
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6ffd859..b07a923 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -38,7 +38,7 @@ importers:
version: 2.2.1(magicast@0.5.2)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.33(typescript@5.9.3))
'@nuxthub/core':
specifier: ^0.10.7
- version: 0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)
+ version: 0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))
'@tailwindcss/vite':
specifier: ^4.2.4
version: 4.2.4(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
@@ -47,7 +47,7 @@ importers:
version: 14.2.1(vue@3.5.33(typescript@5.9.3))
'@vueuse/nuxt':
specifier: ^14.2.1
- version: 14.2.1(0895705a234f124fe6cc4d60018a72e6)
+ version: 14.2.1(24d76999579b197a7535c4a6e00bc63c)
ai:
specifier: ^6.0.170
version: 6.0.170(zod@4.3.6)
@@ -71,10 +71,10 @@ importers:
version: 0.554.0(vue@3.5.33(typescript@5.9.3))
nuxt:
specifier: ^4.4.4
- version: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3)
+ version: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3)
nuxt-og-image:
specifier: ^6.4.9
- version: 6.4.9(82ee8ec1fc12eec2a1ea8b8962b562de)
+ version: 6.4.9(7a285cc96e75bb83682e9a10f65d3e89)
reka-ui:
specifier: ^2.9.6
version: 2.9.6(vue@3.5.33(typescript@5.9.3))
@@ -133,6 +133,9 @@ importers:
typescript:
specifier: ^5.9.3
version: 5.9.3
+ vue-tsc:
+ specifier: 3.2.7
+ version: 3.2.7(typescript@5.9.3)
packages:
@@ -6914,6 +6917,12 @@ packages:
pinia:
optional: true
+ vue-tsc@3.2.7:
+ resolution: {integrity: sha512-zc1tL3HoQni1zGTGrwBVRQb7rGP5SWdu/m4rGB6JcnAC5MT5LFZIxF7Y+EJEnt4hGF23d60rXH7gRjHGb5KQQQ==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.0.0'
+
vue@3.5.33:
resolution: {integrity: sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==}
peerDependencies:
@@ -8252,7 +8261,7 @@ snapshots:
transitivePeerDependencies:
- magicast
- '@nuxt/nitro-server@4.4.4(0bc9a8b81088588abe76c15d5337a36b)':
+ '@nuxt/nitro-server@4.4.4(70fd0b683e40957c6cf721b656a433c6)':
dependencies:
'@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
'@nuxt/devalue': 2.0.2
@@ -8271,7 +8280,7 @@ snapshots:
klona: 2.0.6
mocked-exports: 0.1.1
nitropack: 2.13.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(oxc-parser@0.128.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(srvx@0.11.15)
- nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3)
+ nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3)
nypm: 0.6.6
ohash: 2.0.11
pathe: 2.0.3
@@ -8339,7 +8348,7 @@ snapshots:
rc9: 3.0.1
std-env: 4.1.0
- '@nuxt/vite-builder@4.4.4(73c4c6f1230a92aa0be2c20e8a16f65c)':
+ '@nuxt/vite-builder@4.4.4(3753187a1b5639c1f33be5f548422478)':
dependencies:
'@nuxt/kit': 4.4.4(magicast@0.5.2)
'@rollup/plugin-replace': 6.0.3(rollup@4.60.2)
@@ -8357,7 +8366,7 @@ snapshots:
magic-string: 0.30.21
mlly: 1.8.2
mocked-exports: 0.1.1
- nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3)
+ nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3)
nypm: 0.6.6
pathe: 2.0.3
pkg-types: 2.3.1
@@ -8368,7 +8377,7 @@ snapshots:
unenv: 2.0.0-rc.24
vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-node: 5.3.0(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
- vite-plugin-checker: 0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
+ vite-plugin-checker: 0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))
vue: 3.5.33(typescript@5.9.3)
vue-bundle-renderer: 2.2.0
optionalDependencies:
@@ -8400,7 +8409,7 @@ snapshots:
- vue-tsc
- yaml
- '@nuxthub/core@0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)':
+ '@nuxthub/core@0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))':
dependencies:
'@cloudflare/workers-types': 4.20260307.1
'@nuxt/kit': 4.4.4(magicast@0.5.2)
@@ -8422,7 +8431,7 @@ snapshots:
scule: 1.3.0
std-env: 3.10.0
tinyglobby: 0.2.16
- tsdown: 0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3)
+ tsdown: 0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))
ufo: 1.6.4
uncrypto: 0.1.3
unstorage: 1.17.5(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)
@@ -9776,13 +9785,13 @@ snapshots:
'@vueuse/metadata@14.2.1': {}
- '@vueuse/nuxt@14.2.1(0895705a234f124fe6cc4d60018a72e6)':
+ '@vueuse/nuxt@14.2.1(24d76999579b197a7535c4a6e00bc63c)':
dependencies:
'@nuxt/kit': 4.4.4(magicast@0.5.2)
'@vueuse/core': 14.2.1(vue@3.5.33(typescript@5.9.3))
'@vueuse/metadata': 14.2.1
local-pkg: 1.1.2
- nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3)
+ nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3)
vue: 3.5.33(typescript@5.9.3)
transitivePeerDependencies:
- magicast
@@ -12454,7 +12463,7 @@ snapshots:
transitivePeerDependencies:
- magicast
- nuxt-og-image@6.4.9(82ee8ec1fc12eec2a1ea8b8962b562de):
+ nuxt-og-image@6.4.9(7a285cc96e75bb83682e9a10f65d3e89):
dependencies:
'@clack/prompts': 1.3.0
'@nuxt/kit': 4.4.4(magicast@0.5.2)
@@ -12470,8 +12479,8 @@ snapshots:
magic-string: 0.30.21
magicast: 0.5.2
mocked-exports: 0.1.1
- nuxt-site-config: 4.0.8(8bd70a983877065b0fc8982f33cd9f6f)
- nuxtseo-shared: 5.1.3(7c6dd3e8b8bbc4e9eb04185bcb3e4d53)
+ nuxt-site-config: 4.0.8(6476653fdda2ee6b287b7691dacb7845)
+ nuxtseo-shared: 5.1.3(09843af268f3dcc42f6fd9f08b313f09)
nypm: 0.6.6
ofetch: 1.5.1
ohash: 2.0.11
@@ -12519,12 +12528,12 @@ snapshots:
- magicast
- vue
- nuxt-site-config@4.0.8(8bd70a983877065b0fc8982f33cd9f6f):
+ nuxt-site-config@4.0.8(6476653fdda2ee6b287b7691dacb7845):
dependencies:
'@nuxt/kit': 4.4.4(magicast@0.5.2)
h3: 1.15.11
nuxt-site-config-kit: 4.0.8(magicast@0.5.2)(vue@3.5.33(typescript@5.9.3))
- nuxtseo-shared: 5.1.3(7c6dd3e8b8bbc4e9eb04185bcb3e4d53)
+ nuxtseo-shared: 5.1.3(09843af268f3dcc42f6fd9f08b313f09)
pathe: 2.0.3
pkg-types: 2.3.1
site-config-stack: 4.0.8(vue@3.5.33(typescript@5.9.3))
@@ -12537,16 +12546,16 @@ snapshots:
- vue
- zod
- nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3):
+ nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3):
dependencies:
'@dxup/nuxt': 0.4.1(magicast@0.5.2)(typescript@5.9.3)
'@nuxt/cli': 3.35.1(@nuxt/schema@4.4.4)(cac@6.7.14)(commander@13.1.0)(magicast@0.5.2)
'@nuxt/devtools': 3.2.4(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.33(typescript@5.9.3))
'@nuxt/kit': 4.4.4(magicast@0.5.2)
- '@nuxt/nitro-server': 4.4.4(0bc9a8b81088588abe76c15d5337a36b)
+ '@nuxt/nitro-server': 4.4.4(70fd0b683e40957c6cf721b656a433c6)
'@nuxt/schema': 4.4.4
'@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.4(magicast@0.5.2))
- '@nuxt/vite-builder': 4.4.4(73c4c6f1230a92aa0be2c20e8a16f65c)
+ '@nuxt/vite-builder': 4.4.4(3753187a1b5639c1f33be5f548422478)
'@unhead/vue': 2.1.13(vue@3.5.33(typescript@5.9.3))
'@vue/shared': 3.5.33
chokidar: 5.0.0
@@ -12667,7 +12676,7 @@ snapshots:
- xml2js
- yaml
- nuxtseo-shared@5.1.3(7c6dd3e8b8bbc4e9eb04185bcb3e4d53):
+ nuxtseo-shared@5.1.3(09843af268f3dcc42f6fd9f08b313f09):
dependencies:
'@clack/prompts': 1.3.0
'@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.2)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
@@ -12676,7 +12685,7 @@ snapshots:
birpc: 4.0.0
consola: 3.4.2
defu: 6.1.7
- nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3)
+ nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3)
ofetch: 1.5.1
pathe: 2.0.3
pkg-types: 2.3.1
@@ -12686,7 +12695,7 @@ snapshots:
ufo: 1.6.4
vue: 3.5.33(typescript@5.9.3)
optionalDependencies:
- nuxt-site-config: 4.0.8(8bd70a983877065b0fc8982f33cd9f6f)
+ nuxt-site-config: 4.0.8(6476653fdda2ee6b287b7691dacb7845)
zod: 4.3.6
transitivePeerDependencies:
- magicast
@@ -13495,7 +13504,7 @@ snapshots:
glob: 13.0.6
package-json-from-dist: 1.0.1
- rolldown-plugin-dts@0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3):
+ rolldown-plugin-dts@0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)):
dependencies:
'@babel/generator': 7.29.1
'@babel/parser': 7.29.3
@@ -13508,6 +13517,7 @@ snapshots:
rolldown: 1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
optionalDependencies:
typescript: 5.9.3
+ vue-tsc: 3.2.7(typescript@5.9.3)
transitivePeerDependencies:
- oxc-resolver
@@ -14158,7 +14168,7 @@ snapshots:
'@ts-morph/common': 0.28.1
code-block-writer: 13.0.3
- tsdown@0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3):
+ tsdown@0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)):
dependencies:
ansis: 4.2.0
cac: 6.7.14
@@ -14169,7 +14179,7 @@ snapshots:
obug: 2.1.1
picomatch: 4.0.4
rolldown: 1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
- rolldown-plugin-dts: 0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3)
+ rolldown-plugin-dts: 0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))
semver: 7.7.4
tinyexec: 1.1.2
tinyglobby: 0.2.16
@@ -14496,7 +14506,7 @@ snapshots:
- tsx
- yaml
- vite-plugin-checker@0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
+ vite-plugin-checker@0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3)):
dependencies:
'@babel/code-frame': 7.29.0
chokidar: 4.0.3
@@ -14512,6 +14522,7 @@ snapshots:
eslint: 9.39.4(jiti@2.6.1)
optionator: 0.9.4
typescript: 5.9.3
+ vue-tsc: 3.2.7(typescript@5.9.3)
vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.4(magicast@0.5.2))(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
@@ -14639,6 +14650,12 @@ snapshots:
optionalDependencies:
'@vue/compiler-sfc': 3.5.34
+ vue-tsc@3.2.7(typescript@5.9.3):
+ dependencies:
+ '@volar/typescript': 2.4.28
+ '@vue/language-core': 3.2.7
+ typescript: 5.9.3
+
vue@3.5.33(typescript@5.9.3):
dependencies:
'@vue/compiler-dom': 3.5.33
diff --git a/renovate.json b/renovate.json
index cb2d3ef..5738986 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,76 +1,72 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
- "github>nuxt/renovate-config-nuxt"
+ "github>nuxt/renovate-config-nuxt",
+ ":approveMajorUpdates"
],
+ "automergeType": "pr",
+ "ignoreTests": false,
+ "platformAutomerge": false,
"packageRules": [
{
- "description": "Keep pnpm security overrides manually managed",
- "matchDepTypes": [
- "overrides"
- ],
- "enabled": false
+ "description": "Keep unclassified non-major updates individual",
+ "matchUpdateTypes": ["minor", "patch", "pin", "pinDigest", "digest", "lockFileMaintenance"],
+ "groupName": null,
+ "groupSlug": null
},
{
- "description": "Major updates require manual approval",
- "matchUpdateTypes": [
- "major"
- ],
- "dependencyDashboardApproval": true
+ "description": "Keep major updates individual",
+ "matchUpdateTypes": ["major"],
+ "groupName": null,
+ "groupSlug": null,
+ "automerge": false
},
{
- "description": "Group Nuxt ecosystem updates",
- "groupName": "nuxt ecosystem",
- "matchPackageNames": [
- "nuxt",
- "@nuxt/*",
- "@nuxthub/*",
- "@vueuse/nuxt",
- "nuxt-og-image",
- "nuxt-shiki"
- ]
+ "description": "Wait three days for npm releases",
+ "matchDatasources": ["npm"],
+ "minimumReleaseAge": "3 days",
+ "schedule": ["at any time"]
},
{
- "description": "Group shadcn and UI registry updates",
- "groupName": "shadcn ecosystem",
- "matchPackageNames": [
- "shadcn-nuxt",
- "shadcn-vue",
- "shadcn-vue-registry",
- "reka-ui",
- "@lucide/vue",
- "lucide-vue-next"
- ]
+ "description": "Automerge non-major updates after CI",
+ "matchUpdateTypes": ["minor", "patch", "pin", "pinDigest", "digest", "lockFileMaintenance"],
+ "automerge": true
},
{
- "description": "Group styling stack updates",
- "groupName": "styling stack",
- "matchPackageNames": [
- "tailwindcss",
- "@tailwindcss/vite",
- "tailwind-merge",
- "class-variance-authority",
- "clsx",
- "tw-animate-css"
- ]
+ "description": "Group Nuxt core minor and patch updates",
+ "matchUpdateTypes": ["minor", "patch"],
+ "matchPackageNames": ["nuxt"],
+ "groupName": "Nuxt core",
+ "groupSlug": "nuxt-core"
},
{
- "description": "Group build and quality tooling updates",
- "groupName": "tooling",
- "matchPackageNames": [
- "eslint",
- "typescript",
- "tsx",
- "@types/node",
- "lint-staged"
- ]
+ "description": "Group shadcn and Reka minor and patch updates",
+ "matchUpdateTypes": ["minor", "patch"],
+ "matchPackageNames": ["shadcn-nuxt", "shadcn-vue", "shadcn-vue-registry", "reka-ui"],
+ "groupName": "shadcn and Reka",
+ "groupSlug": "shadcn-reka"
},
{
- "description": "Keep AI SDK updates isolated",
- "groupName": "ai sdk",
- "matchPackageNames": [
- "ai"
- ]
+ "description": "Group Tailwind minor and patch updates",
+ "matchUpdateTypes": ["minor", "patch"],
+ "matchPackageNames": ["tailwindcss", "@tailwindcss/*"],
+ "groupName": "Tailwind",
+ "groupSlug": "tailwind"
+ },
+ {
+ "description": "Group AI SDK minor and patch updates",
+ "matchUpdateTypes": ["minor", "patch"],
+ "matchPackageNames": ["ai", "@ai-sdk/*"],
+ "groupName": "AI SDK",
+ "groupSlug": "ai-sdk"
}
- ]
+ ],
+ "vulnerabilityAlerts": {
+ "dependencyDashboardApproval": false,
+ "groupName": null,
+ "groupSlug": null,
+ "minimumReleaseAge": null,
+ "prCreation": "immediate",
+ "schedule": []
+ }
}
diff --git a/scripts/registry-build.ts b/scripts/registry-build.ts
index dbc3d54..0b41f85 100644
--- a/scripts/registry-build.ts
+++ b/scripts/registry-build.ts
@@ -1,6 +1,6 @@
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
-import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
+import { cp, mkdir, readFile, rm, rmdir, unlink, writeFile } from "node:fs/promises";
import pkg from "../package.json";
import components from "../components.json";
import { generateShadcnRegistry } from "shadcn-vue-registry";
@@ -13,6 +13,10 @@ import { x } from "tinyexec";
const cwd = resolve(__dirname, "../");
const registryPath = resolve(cwd, "./app/registry");
const outputPath = resolve(cwd, "./public/r/");
+ const fieldBlockPath = resolve(registryPath, "blocks/field");
+ const fieldUiPath = resolve(registryPath, "components/ui/field");
+ const fieldUiParentPath = resolve(registryPath, "components/ui");
+ const fieldComponentsPath = resolve(registryPath, "components");
const config = {
root: cwd,
name: pkg.name,
@@ -27,12 +31,26 @@ import { x } from "tinyexec";
const customItemNames = new Set(registryJson.items.map(item => item.name));
const itemPackageDependencies: Record = {
"chat-message": ["@lucide/vue"],
+ "field": ["@vueuse/core", "reka-ui"],
};
for (const item of registryJson.items) {
const dependencies = new Set(item.dependencies ?? []);
const registryDependencies = new Set(item.registryDependencies ?? []);
+ if (item.name === "field") {
+ await rm(fieldUiPath, { recursive: true, force: true });
+ await mkdir(fieldUiPath, { recursive: true });
+ await cp(fieldBlockPath, fieldUiPath, { recursive: true });
+
+ item.type = "registry:ui";
+ item.files = item.files.map(file => ({
+ ...file,
+ path: file.path.replace("blocks/field", "components/ui/field"),
+ type: "registry:ui",
+ }));
+ }
+
for (const dependency of itemPackageDependencies[item.name] ?? []) {
dependencies.add(dependency);
}
@@ -46,6 +64,7 @@ import { x } from "tinyexec";
if (
content.includes(`../${dependency}`)
|| content.includes(`@/components/${dependency}`)
+ || content.includes(`@/components/ui/${dependency}`)
) {
registryDependencies.add(dependency);
}
@@ -67,14 +86,20 @@ import { x } from "tinyexec";
await mkdir(outputPath, { recursive: true });
console.log(`ā Output directory created: ${outputPath}`);
- await x("shadcn-vue", ["build", "-c", registryPath, "-o", outputPath], {
- nodeOptions: {
- cwd,
- shell: true,
- },
- });
-
- await unlink(registryJsonPath);
+ try {
+ await x("shadcn-vue", ["build", "-c", registryPath, "-o", outputPath], {
+ nodeOptions: {
+ cwd,
+ shell: true,
+ },
+ });
+ }
+ finally {
+ await unlink(registryJsonPath).catch(() => {});
+ await rm(fieldUiPath, { recursive: true, force: true });
+ await rmdir(fieldUiParentPath).catch(() => {});
+ await rmdir(fieldComponentsPath).catch(() => {});
+ }
console.log("\nā Registry build complete");
console.log("Registry files available at:\n /r/registry.json\n /r/{name}.json");
diff --git a/scripts/registry-verify.ts b/scripts/registry-verify.ts
index 08ffc6d..5a048f7 100644
--- a/scripts/registry-verify.ts
+++ b/scripts/registry-verify.ts
@@ -4,8 +4,13 @@ import registryConfig from "../registry.config";
interface RegistryItem {
name: string;
+ type?: string;
dependencies?: string[];
registryDependencies?: string[];
+ files?: Array<{
+ path?: string;
+ type?: string;
+ }>;
}
interface RegistryIndex {
@@ -66,6 +71,27 @@ function assertExactValues(itemName: string, fieldName: string, actual: string[]
}
}
+function assertFieldRegistryUiOutput(item: RegistryItem) {
+ if (item.type !== "registry:ui") {
+ errors.push(`field: expected type registry:ui, received ${item.type ?? "missing"}`);
+ }
+
+ if (!item.files?.length) {
+ errors.push("field: expected registry files under components/ui/field");
+ return;
+ }
+
+ for (const file of item.files) {
+ if (file.type !== "registry:ui") {
+ errors.push(`field: expected file ${file.path ?? "missing"} type registry:ui, received ${file.type ?? "missing"}`);
+ }
+
+ if (!file.path?.startsWith("components/ui/field/")) {
+ errors.push(`field: expected file path under components/ui/field, received ${file.path ?? "missing"}`);
+ }
+ }
+}
+
const registryIndex = await readRegistryIndex();
if (registryIndex?.homepage !== expectedHomepage) {
errors.push(`registry: expected homepage ${expectedHomepage}, received ${registryIndex?.homepage ?? "missing"}`);
@@ -167,9 +193,13 @@ const expectedItems: Record = {
dependencies: [],
registryDependencies: [],
},
+ "field": {
+ dependencies: ["@vueuse/core", "reka-ui"],
+ registryDependencies: [],
+ },
"form-field": {
dependencies: [],
- registryDependencies: ["field", stackhackerDependency("form")],
+ registryDependencies: [stackhackerDependency("field"), stackhackerDependency("form")],
},
};
@@ -196,6 +226,10 @@ for (const [name, expected] of Object.entries(expectedItems)) {
assertExactValues(name, "package dependency", item.dependencies ?? [], expected.dependencies ?? []);
assertExactValues(name, "registry dependency", item.registryDependencies ?? [], expected.registryDependencies ?? []);
+
+ if (name === "field") {
+ assertFieldRegistryUiOutput(item);
+ }
}
if (errors.length > 0) {