@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:
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:
<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
1---2name: shadcn-svelte3description: 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.4---5
6# @json-render/shadcn-svelte
7
8Pre-built shadcn-svelte component definitions and implementations for json-render. Provides 36 components built on Svelte 5 + Tailwind CSS.
9
10## Two Entry Points
11
12| Entry Point | Exports | Use For |
13|-------------|---------|---------|
14| `@json-render/shadcn-svelte/catalog` | `shadcnComponentDefinitions` | Catalog schemas (no Svelte dependency, safe for server) |
15| `@json-render/shadcn-svelte` | `shadcnComponents`, `shadcnComponentDefinitions` | Svelte implementations + catalog schemas |
16
17## Usage Pattern
18
19Pick the components you need from the standard definitions. Do not spread all definitions -- explicitly select what your app uses:
20
21```typescript
22import { defineCatalog } from "@json-render/core";
23import { schema } from "@json-render/svelte/schema";
24import { shadcnComponentDefinitions } from "@json-render/shadcn-svelte/catalog";
25import { defineRegistry } from "@json-render/svelte";
26import { shadcnComponents } from "@json-render/shadcn-svelte";
27
28// Catalog: pick definitions
29const catalog = defineCatalog(schema, {
30 components: {
31 Card: shadcnComponentDefinitions.Card,
32 Stack: shadcnComponentDefinitions.Stack,
33 Heading: shadcnComponentDefinitions.Heading,
34 Button: shadcnComponentDefinitions.Button,
35 Input: shadcnComponentDefinitions.Input,
36 },
37 actions: {},
38});
39
40// Registry: pick matching implementations
41const { registry } = defineRegistry(catalog, {
42 components: {
43 Card: shadcnComponents.Card,
44 Stack: shadcnComponents.Stack,
45 Heading: shadcnComponents.Heading,
46 Button: shadcnComponents.Button,
47 Input: shadcnComponents.Input,
48 },
49});
50```
51
52Then render in your Svelte component:
53
54```svelte
55<script lang="ts">
56 import { Renderer, JsonUIProvider } from "@json-render/svelte";
57
58 export let spec;
59 export let registry;
60</script>
61
62<JsonUIProvider initialState={spec?.state ?? {}}>
63 <Renderer {spec} {registry} />
64</JsonUIProvider>
65```
66
67## Available Components
68
69### Layout
70- **Card** - Container with optional title, description, maxWidth, centered
71- **Stack** - Flex container with direction, gap, align, justify
72- **Grid** - Grid layout with columns (number) and gap
73- **Separator** - Visual divider with orientation
74
75### Navigation
76- **Tabs** - Tabbed navigation with tabs array, defaultValue, value
77- **Accordion** - Collapsible sections with items array and type (single/multiple)
78- **Collapsible** - Single collapsible section with title
79- **Pagination** - Page navigation with totalPages and page
80
81### Overlay
82- **Dialog** - Modal dialog with title, description, openPath
83- **Drawer** - Bottom drawer with title, description, openPath
84- **Tooltip** - Hover tooltip with content and text
85- **Popover** - Click-triggered popover with trigger and content
86- **DropdownMenu** - Dropdown with label and items array
87
88### Content
89- **Heading** - Heading text with level (h1-h4)
90- **Text** - Paragraph with variant (body, caption, muted, lead, code)
91- **Image** - Image with alt, width, height
92- **Avatar** - User avatar with src, name, size
93- **Badge** - Status badge with text and variant (default, secondary, destructive, outline)
94- **Alert** - Alert banner with title, message, type (success, warning, info, error)
95- **Carousel** - Scrollable carousel with items array
96- **Table** - Data table with columns (string[]) and rows (string[][])
97
98### Feedback
99- **Progress** - Progress bar with value, max, label
100- **Skeleton** - Loading placeholder with width, height, rounded
101- **Spinner** - Loading spinner with size and label
102
103### Input
104- **Button** - Button with label, variant (primary, secondary, danger), disabled
105- **Link** - Anchor link with label and href
106- **Input** - Text input with label, name, type, placeholder, value, checks
107- **Textarea** - Multi-line input with label, name, placeholder, rows, value, checks
108- **Select** - Dropdown select with label, name, options (string[]), value, checks
109- **Checkbox** - Checkbox with label, name, checked, checks, validateOn
110- **Radio** - Radio group with label, name, options (string[]), value, checks, validateOn
111- **Switch** - Toggle switch with label, name, checked, checks, validateOn
112- **Slider** - Range slider with label, min, max, step, value
113- **Toggle** - Toggle button with label, pressed, variant
114- **ToggleGroup** - Group of toggles with items, type, value
115- **ButtonGroup** - Button group with buttons array and selected
116
117## Validation Timing (`validateOn`)
118
119All form components support `validateOn` to control when validation runs:
120- `"change"` -- validate on every input change (default for Select, Checkbox, Radio, Switch)
121- `"blur"` -- validate when field loses focus (default for Input, Textarea)
122- `"submit"` -- validate only on form submission
123
124## Important Notes
125
126- The `/catalog` entry point has no Svelte dependency -- use it for server-side prompt generation
127- Components use Tailwind CSS classes -- your app must have Tailwind configured
128- Component implementations use bundled shadcn-svelte primitives (not your app's `$lib/components/ui/`)
129- All form inputs support `checks` for validation (type + message pairs) and `validateOn` for timing
130- Events: inputs emit `change`/`submit`/`focus`/`blur`; buttons emit `press`; selects emit `change`/`select`