
Vue
- 936 installs
- 15.8k repo stars
- Updated July 8, 2026
- vercel-labs/json-render
vue is the json-render Vue 3 renderer for JSON spec UIs.
About
The vue json-render skill provides a Vue 3 renderer that converts JSON specs into Vue component trees with data binding, visibility rules, and actions via @json-render/vue. Agents define component registries mapping spec types to Vue SFCs or script components then render AI-generated layouts in Vue apps. It supports the json-render pattern of declarative UI from specs shared across React, Vue, and email renderers. The skill triggers when building Vue UIs from JSON or working with @json-render/vue packages. Vue 3 renderer for json-render JSON specs. @json-render/vue component registry and data binding. Visibility rules and actions on spec-driven trees. AI-generated Vue layouts from declarative JSON. Multi-renderer json-render ecosystem for Vue targets. Render Vue 3 UIs from JSON specs with @json-render/vue component registries.
- Vue 3 renderer for json-render JSON specs.
- @json-render/vue component registry and data binding.
- Visibility rules and actions on spec-driven trees.
- AI-generated Vue layouts from declarative JSON.
- Multi-renderer json-render ecosystem for Vue targets.
Vue by the numbers
- 936 all-time installs (skills.sh)
- +23 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #391 of 2,277 Frontend Development skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
What vue says it does
Vue 3 renderer for json-render. Use when building Vue UIs from JSON specs
npx skills add https://github.com/vercel-labs/json-render --skill vueAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 936 |
|---|---|
| repo stars | ★ 15.8k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 8, 2026 |
| Repository | vercel-labs/json-render ↗ |
How do I render this JSON spec as Vue components?
Render Vue 3 UIs from JSON specs with @json-render/vue component registries.
Who is it for?
Vue 3 developers using json-render for spec-driven or AI-generated UI.
Skip if: Skip for hand-written Vue templates without JSON spec pipelines.
When should I use this skill?
User works with @json-render/vue, JSON specs in Vue, or spec-driven UI.
What you get
Vue component tree from @json-render/vue with registry and data binding.
- Vue component catalog
- Rendered JSON-driven UI
- Zod-validated spec schema
By the numbers
- Peer dependency Vue ^3.5.0
- Peer dependency zod ^4.0.0
- Installs 3 npm packages: @json-render/vue, @json-render/core, zod
Files
@json-render/vue
Vue 3 renderer that converts JSON specs into Vue component trees with data binding, visibility, and actions.
Installation
npm install @json-render/vue @json-render/core zodPeer dependencies: vue ^3.5.0 and zod ^4.0.0.
Quick Start
Create a Catalog
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/vue/schema";
import { z } from "zod";
export const catalog = defineCatalog(schema, {
components: {
Card: {
props: z.object({ title: z.string(), description: z.string().nullable() }),
description: "A card container",
},
Button: {
props: z.object({ label: z.string(), action: z.string() }),
description: "A clickable button",
},
},
actions: {},
});Define Registry with h() Render Functions
import { h } from "vue";
import { defineRegistry } from "@json-render/vue";
import { catalog } from "./catalog";
export const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) =>
h("div", { class: "card" }, [
h("h3", null, props.title),
props.description ? h("p", null, props.description) : null,
children,
]),
Button: ({ props, emit }) =>
h("button", { onClick: () => emit("press") }, props.label),
},
});Render Specs
<script setup lang="ts">
import { StateProvider, ActionProvider, Renderer } from "@json-render/vue";
import { registry } from "./registry";
const spec = { root: "card-1", elements: { /* ... */ } };
</script>
<template>
<StateProvider :initial-state="{ form: { name: '' } }">
<ActionProvider :handlers="{ submit: handleSubmit }">
<Renderer :spec="spec" :registry="registry" />
</ActionProvider>
</StateProvider>
</template>Providers
| Provider | Purpose |
|---|---|
StateProvider | Share state across components (JSON Pointer paths). Accepts initialState or store for controlled mode. |
ActionProvider | Handle actions dispatched via the event system |
VisibilityProvider | Enable conditional rendering based on state |
ValidationProvider | Form field validation |
Composables
| Composable | Purpose |
|---|---|
useStateStore() | Access state context (state as ShallowRef, get, set, update) |
useStateValue(path) | Get single value from state |
useIsVisible(condition) | Check if a visibility condition is met |
useActions() | Access action context |
useAction(binding) | Get a single action dispatch function |
useFieldValidation(path, config) | Field validation state |
useBoundProp(propValue, bindingPath) | Two-way binding for $bindState/$bindItem |
Note: useStateStore().state returns a ShallowRef<StateModel> — use state.value to access.
External Store (StateStore)
Pass a StateStore to StateProvider to wire json-render to Pinia, VueUse, or any state management:
import { createStateStore, type StateStore } from "@json-render/vue";
const store = createStateStore({ count: 0 });<StateProvider :store="store">
<Renderer :spec="spec" :registry="registry" />
</StateProvider>Dynamic Prop Expressions
Props support $state, $bindState, $cond, $template, $computed. Use { "$bindState": "/path" } on the natural value prop for two-way binding.
Visibility Conditions
{ "$state": "/user/isAdmin" }
{ "$state": "/status", "eq": "active" }
{ "$state": "/maintenance", "not": true }
[ cond1, cond2 ] // implicit ANDBuilt-in Actions
setState, pushState, removeState, and validateForm are built into the Vue schema and handled by ActionProvider:
{
"action": "setState",
"params": { "statePath": "/activeTab", "value": "settings" }
}Event System
Components use emit(event) to fire events, or on(event) for metadata (shouldPreventDefault, bound).
Streaming
useUIStream and useChatUI return Vue Refs for streaming specs from an API.
BaseComponentProps
For catalog-agnostic reusable components:
import type { BaseComponentProps } from "@json-render/vue";
const Card = ({ props, children }: BaseComponentProps<{ title?: string }>) =>
h("div", null, [props.title, children]);Key Exports
| Export | Purpose |
|---|---|
defineRegistry | Create a type-safe component registry from a catalog |
Renderer | Render a spec using a registry |
schema | Element tree schema (from @json-render/vue/schema) |
StateProvider, ActionProvider, VisibilityProvider, ValidationProvider | Context providers |
useStateStore, useStateValue, useBoundProp | State composables |
useActions, useAction | Action composables |
useFieldValidation, useIsVisible | Validation and visibility |
useUIStream, useChatUI | Streaming composables |
createStateStore | Create in-memory StateStore |
BaseComponentProps | Catalog-agnostic component props type |
Related skills
How it compares
Use vue for Vue 3 json-render pipelines; pick framework-native templates when JSON-driven rendering is not required.
FAQ
Which Vue version?
Vue 3 with @json-render/vue renderer package.
What do registries map?
JSON spec component types to Vue components with bindings.
What spec features?
Data binding, visibility conditions, and actions on component trees.
Is Vue safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.