shadcn-svelte · vercel-labs — Claude Code skill: what it does, how to install
Pre-built definitions and implementations of 36 shadcn components for json-render apps. Built on Svelte 5 and Tailwind CSS.
npx skills add vercel-labs/json-render --skill shadcn-svelte -a claude-codeWhat shadcn-svelte does
This skill guides coding agents in assembling UI catalogs and rendering specs for json-render applications. It includes 36 pre-built components spanning layout primitives, navigation, overlays, and form elements. Form controls support custom validation via checks alongside granular timing through validateOn.
The library splits responsibilities across two entry points. Server environments use @json-render/shadcn-svelte/catalog because it carries no Svelte runtime dependencies. Client renders load matching implementations from @json-render/shadcn-svelte into defineRegistry. You should select only the components needed rather than spreading the entire catalogue.
A key detail to remember: these implementations rely on bundled primitives rather than local files inside your $lib/components/ui/ directory. Your project must also have Tailwind CSS installed and configured.
What it helps with
- Configure a json-render component catalog for Svelte 5 applications
- Render server-driven UI specs using JsonUIProvider and Renderer
- Isolate catalog schemas from Svelte dependencies for server-side prompt generation
- Set up input validation rules using checks and validateOn
Example prompts for the agent
- Define a json-render catalog with Card, Stack, and Button using @json-render/shadcn-svelte
- Set up a login form with Input validation triggering on blur
- Render a json-render spec using JsonUIProvider and Renderer in Svelte 5
How to install shadcn-svelte
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill shadcn-svelte -a claude-code2Manually: put the files in place
~/.claude/skills/shadcn-svelte/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/shadcn-svelte/
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill shadcn-svelte -a codex2Manually: put the files in place
.agents/skills/shadcn-svelte/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill shadcn-svelte -a cursor2Manually: put the files in place
.cursor/skills/shadcn-svelte/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install vercel-labs/json-render shadcn-svelte2Manually: put the files in place
.github/skills/shadcn-svelte/SKILL.md1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill shadcn-svelte -a gemini-cli2Platform CLI
gemini skills install https://github.com/vercel-labs/json-render --path skills/shadcn-svelteManually: put the files in place
.devin/skills/shadcn-svelte/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill shadcn-svelte -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set20
The whole set →Other versions of shadcn-svelte
Similar
Questions about shadcn-svelte
How to install shadcn-svelte in Claude Code?
Run npx skills add vercel-labs/json-render --skill shadcn-svelte -a claude-code in your terminal.
What does the shadcn-svelte skill do?
It teaches coding agents how to declare catalogs and render UI trees with 36 shadcn components in Svelte 5.
Why are there two separate entry points?
The @json-render/shadcn-svelte/catalog path excludes Svelte dependencies for safe server-side use. The root package provides the actual Svelte 5 component implementations.
Source text
SKILL.md · Apache-2.0
---
name: shadcn-svelte
description: Pre-built shadcn-svelte components for json-render Svelte apps. Use when working with @json-render/shadcn-svelte, adding standard UI components to a Svelte catalog, or building Svelte web UIs with shadcn-svelte + Tailwind CSS components.
---
# @json-render/shadcn-svelte
Pre-built shadcn-svelte component definitions and implementations for json-render. Provides 36 components built on Svelte 5 + Tailwind CSS.
## Two Entry Points
| Entry Point | Exports | Use For |
|-------------|---------|---------|
| `@json-render/shadcn-svelte/catalog` | `shadcnComponentDefinitions` | Catalog schemas (no Svelte dependency, safe for server) |
| `@json-render/shadcn-svelte` | `shadcnComponents`, `shadcnComponentDefinitions` | Svelte implementations + catalog schemas |
## Usage Pattern
Pick the components you need from the standard definitions. Do not spread all definitions -- explicitly select what your app uses:
```typescript
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/svelte/schema";
import { shadcnComponentDefinitions } from "@json-render/shadcn-svelte/catalog";
import { defineRegistry } from "@json-render/svelte";
import { shadcnComponents } from "@json-render/shadcn-svelte";
// Catalog: pick definitions
const catalog = defineCatalog(schema, {
components: {
Card: shadcnComponentDefinitions.Card,
Stack: shadcnComponentDefinitions.Stack,
Heading: shadcnComponentDefinitions.Heading,
Button: shadcnComponentDefinitions.Button,
Input: shadcnComponentDefinitions.Input,
},
actions: {},
});
// Registry: pick matching implementations
const { registry } = defineRegistry(catalog, {
components: {
Card: shadcnComponents.Card,
Stack: shadcnComponents.Stack,
Heading: shadcnComponents.Heading,
Button: shadcnComponents.Button,
Input: shadcnComponents.Input,
},
});
```
Then render in your Svelte component:
```svelte
<script lang="ts">
import { Renderer, JsonUIProvider } from "@json-render/svelte";
export let spec;
export let registry;
</script>
<JsonUIProvider initialState={spec?.state ?? {}}>
<Renderer {spec} {registry} />
</JsonUIProvider>
```
## Available Components
### Layout
- **Card** - Container with optional title, description, maxWidth, centered
- **Stack** - Flex container with direction, gap, align, justify
- **Grid** - Grid layout with columns (number) and gap
- **Separator** - Visual divider with orientation
### Navigation
- **Tabs** - Tabbed navigation with tabs array, defaultValue, value
- **Accordion** - Collapsible sections with items array and type (single/multiple)
- **Collapsible** - Single collapsible section with title
- **Pagination** - Page navigation with totalPages and page
### Overlay
- **Dialog** - Modal dialog with title, description, openPath
- **Drawer** - Bottom drawer with title, description, openPath
- **Tooltip** - Hover tooltip with content and text
- **Popover** - Click-triggered popover with trigger and content
- **DropdownMenu** - Dropdown with label and items array
### Content
- **Heading** - Heading text with level (h1-h4)
- **Text** - Paragraph with variant (body, caption, muted, lead, code)
- **Image** - Image with alt, width, height
- **Avatar** - User avatar with src, name, size
- **Badge** - Status badge with text and variant (default, secondary, destructive, outline)
- **Alert** - Alert banner with title, message, type (success, warning, info, error)
- **Carousel** - Scrollable carousel with items array
- **Table** - Data table with columns (string[]) and rows (string[][])
### Feedback
- **Progress** - Progress bar with value, max, label
- **Skeleton** - Loading placeholder with width, height, rounded
- **Spinner** - Loading spinner with size and label
### Input
- **Button** - Button with label, variant (primary, secondary, danger), disabled
- **Link** - Anchor link with label and href
- **Input** - Text input with label, name, type, placeholder, value, checks
- **Textarea** - Multi-line input with label, name, placeholder, rows, value, checks
- **Select** - Dropdown select with label, name, options (string[]), value, checks
- **Checkbox** - Checkbox with label, name, checked, checks, validateOn
- **Radio** - Radio group with label, name, options (string[]), value, checks, validateOn
- **Switch** - Toggle switch with label, name, checked, checks, validateOn
- **Slider** - Range slider with label, min, max, step, value
- **Toggle** - Toggle button with label, pressed, variant
- **ToggleGroup** - Group of toggles with items, type, value
- **ButtonGroup** - Button group with buttons array and selected
## Validation Timing (`validateOn`)
All form components support `validateOn` to control when validation runs:
- `"change"` -- validate on every input change (default for Select, Checkbox, Radio, Switch)
- `"blur"` -- validate when field loses focus (default for Input, Textarea)
- `"submit"` -- validate only on form submission
## Important Notes
- The `/catalog` entry point has no Svelte dependency -- use it for server-side prompt generation
- Components use Tailwind CSS classes -- your app must have Tailwind configured
- Component implementations use bundled shadcn-svelte primitives (not your app's `$lib/components/ui/`)
- All form inputs support `checks` for validation (type + message pairs) and `validateOn` for timing
- Events: inputs emit `change`/`submit`/`focus`/`blur`; buttons emit `press`; selects emit `change`/`select`
© vercel-labs · Apache-2.0 · vercel-labs/json-render