diff --git a/docs/app/components/content/ComponentApi.vue b/docs/app/components/content/ComponentApi.vue
deleted file mode 100644
index 20d9ab50..00000000
--- a/docs/app/components/content/ComponentApi.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
-
diff --git a/docs/app/components/content/ComponentEvents.vue b/docs/app/components/content/ComponentEvents.vue
index 4f061951..66c98346 100644
--- a/docs/app/components/content/ComponentEvents.vue
+++ b/docs/app/components/content/ComponentEvents.vue
@@ -1,15 +1,12 @@
@@ -25,7 +22,7 @@ const meta: ComputedRef = computed(() => componentMeta.value.meta
-
+
{{ event.name }}
diff --git a/docs/app/components/content/ComponentProps.vue b/docs/app/components/content/ComponentProps.vue
index df07f345..a1edd69b 100644
--- a/docs/app/components/content/ComponentProps.vue
+++ b/docs/app/components/content/ComponentProps.vue
@@ -9,22 +9,18 @@ const camelName = camelCase(route.params.slug[route.params.slug.length - 1])
const name = `U${upperFirst(camelName)}`
const componentTheme = theme[camelName]
-const componentMeta = await useComponentMeta(name as any)
+const meta = await fetchComponentMeta(name as any)
-const meta: ComputedRef = computed(() => {
- const meta = componentMeta.value.meta
-
- if (meta.props?.length) {
- meta.props = meta.props.map((prop) => {
- prop.default = prop.default ?? componentTheme.defaultVariants?.[prop.name]
- return prop
- })
+const metaProps: ComputedRef = computed(() => {
+ if (!meta?.meta?.props?.length) {
+ return []
}
- return meta
+ return meta.meta.props.map((prop) => {
+ prop.default = prop.default ?? componentTheme?.defaultVariants?.[prop.name]
+ return prop
+ })
})
-
-console.log('meta.value', meta.value)
@@ -43,9 +39,9 @@ console.log('meta.value', meta.value)
-
+
-
+
{{ prop.name }}
diff --git a/docs/app/components/content/ComponentSlots.vue b/docs/app/components/content/ComponentSlots.vue
index a9d2c20f..c87987f3 100644
--- a/docs/app/components/content/ComponentSlots.vue
+++ b/docs/app/components/content/ComponentSlots.vue
@@ -1,15 +1,12 @@
@@ -25,9 +22,9 @@ const meta: ComputedRef = computed(() => componentMeta.value.meta
-
+
-
+
{{ slot.name }}
diff --git a/docs/app/composables/fetchComponentMeta.ts b/docs/app/composables/fetchComponentMeta.ts
new file mode 100644
index 00000000..c61cb622
--- /dev/null
+++ b/docs/app/composables/fetchComponentMeta.ts
@@ -0,0 +1,32 @@
+import type { ComponentMeta } from 'vue-component-meta'
+
+const useComponentsMetaState = () => useState('components-meta', () => ({}))
+
+export async function fetchComponentMeta(name: string): Promise<{ meta: ComponentMeta }> {
+ const state = useComponentsMetaState()
+
+ if (state.value[name]?.then) {
+ await state.value[name]
+ return state.value[name]
+ }
+ if (state.value[name]) {
+ return state.value[name]
+ }
+
+ // Store promise to avoid multiple calls
+
+ // add to nitro prerender
+ if (import.meta.server) {
+ const event = useRequestEvent()
+ event.node.res.setHeader(
+ 'x-nitro-prerender',
+ [event.node.res.getHeader('x-nitro-prerender'), `/api/component-meta/${name}.json`].filter(Boolean).join(',')
+ )
+ }
+ state.value[name] = $fetch(`/api/component-meta/${name}.json`).then((meta) => {
+ state.value[name] = meta
+ })
+
+ await state.value[name]
+ return state.value[name]
+}
diff --git a/docs/content/2.components/0.app.md b/docs/content/2.components/0.app.md
index 4d3ba1a2..9bed0234 100644
--- a/docs/content/2.components/0.app.md
+++ b/docs/content/2.components/0.app.md
@@ -11,4 +11,12 @@ links:
## Examples
-:component-api
+## API
+
+### Props
+
+:component-props
+
+### Slots
+
+:component-slots
diff --git a/docs/content/2.components/avatar-group.md b/docs/content/2.components/avatar-group.md
index acd65b47..a9be4278 100644
--- a/docs/content/2.components/avatar-group.md
+++ b/docs/content/2.components/avatar-group.md
@@ -21,10 +21,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/avatar.md b/docs/content/2.components/avatar.md
index 9457e5be..70b7d0da 100644
--- a/docs/content/2.components/avatar.md
+++ b/docs/content/2.components/avatar.md
@@ -19,14 +19,6 @@ links:
:component-props
-### Slots
-
-:component-slots
-
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/badge.md b/docs/content/2.components/badge.md
index 113d9063..1e87cdad 100644
--- a/docs/content/2.components/badge.md
+++ b/docs/content/2.components/badge.md
@@ -20,10 +20,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/breadcrumb.md b/docs/content/2.components/breadcrumb.md
index e25401eb..2ae0bf28 100644
--- a/docs/content/2.components/breadcrumb.md
+++ b/docs/content/2.components/breadcrumb.md
@@ -21,10 +21,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/button-group.md b/docs/content/2.components/button-group.md
index 19d3b8ce..af8a6a57 100644
--- a/docs/content/2.components/button-group.md
+++ b/docs/content/2.components/button-group.md
@@ -21,10 +21,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/button.md b/docs/content/2.components/button.md
index 21d4630b..3effecb1 100644
--- a/docs/content/2.components/button.md
+++ b/docs/content/2.components/button.md
@@ -20,10 +20,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/chip.md b/docs/content/2.components/chip.md
index b3e08624..804eb96b 100644
--- a/docs/content/2.components/chip.md
+++ b/docs/content/2.components/chip.md
@@ -20,10 +20,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/container.md b/docs/content/2.components/container.md
index b3277b99..e74c0bc9 100644
--- a/docs/content/2.components/container.md
+++ b/docs/content/2.components/container.md
@@ -20,10 +20,6 @@ links:
:component-slots
-### Events
-
-:component-events
-
## Theme
:component-theme
diff --git a/docs/content/2.components/dropdown-menu.md b/docs/content/2.components/dropdown-menu.md
index 082a3a11..1f6f9890 100644
--- a/docs/content/2.components/dropdown-menu.md
+++ b/docs/content/2.components/dropdown-menu.md
@@ -1,4 +1,5 @@
---
+title: DropdownMenu
description: Display a list of actions in a dropdown menu.
links:
- label: Radix Vue
diff --git a/docs/content/2.components/form-field.md b/docs/content/2.components/form-field.md
index 341a12e6..67e54cef 100644
--- a/docs/content/2.components/form-field.md
+++ b/docs/content/2.components/form-field.md
@@ -1,5 +1,5 @@
---
-title: FormGroup
+title: FormField
description: Display a label and additional informations around a form element.
links:
- label: GitHub
@@ -7,260 +7,6 @@ links:
to: https://github.com/nuxt/ui/blob/dev/src/runtime/components/FormGroup.vue
---
-
-## Usage
-
-Use the FormGroup component around an [Input](/components/input), [Textarea](/components/textarea), [Select](/components/select) or a [SelectMenu](/components/select-menu) with a `label`. The `