github-actions[bot] 9adcc09204 chore: version packages (#248) пре 3 месеци
..
src a99d68c481 next (#246) пре 3 месеци
CHANGELOG.md 9adcc09204 chore: version packages (#248) пре 3 месеци
README.md 9cef4e9142 prepare v0.10 (#164) пре 4 месеци
components.json 320c935bfb shadcn (#115) пре 4 месеци
package.json 9adcc09204 chore: version packages (#248) пре 3 месеци
tsconfig.json 3201854481 external store adapter for state management (#139) пре 4 месеци
tsup.config.ts 320c935bfb shadcn (#115) пре 4 месеци

README.md

@json-render/shadcn

Pre-built shadcn/ui components for json-render. Drop-in catalog definitions and React implementations for 36 components built on Radix UI + Tailwind CSS.

Installation

npm install @json-render/shadcn @json-render/core @json-render/react zod

Quick Start

1. Create a Catalog

Import standard definitions from @json-render/shadcn/catalog and pass them to defineCatalog:

import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react/schema";
import { shadcnComponentDefinitions } from "@json-render/shadcn/catalog";

const catalog = defineCatalog(schema, {
  components: {
    // Pick the components you need
    Card: shadcnComponentDefinitions.Card,
    Stack: shadcnComponentDefinitions.Stack,
    Heading: shadcnComponentDefinitions.Heading,
    Button: shadcnComponentDefinitions.Button,
    Input: shadcnComponentDefinitions.Input,
  },
  actions: {},
});

Note: State actions (setState, pushState, removeState) are built into the React schema and handled automatically by ActionProvider. You don't need to declare them in your catalog.

2. Create a Registry

Import standard implementations from @json-render/shadcn and pass them to defineRegistry:

import { defineRegistry } from "@json-render/react";
import { shadcnComponents } from "@json-render/shadcn";

const { registry } = defineRegistry(catalog, {
  components: {
    Card: shadcnComponents.Card,
    Stack: shadcnComponents.Stack,
    Heading: shadcnComponents.Heading,
    Button: shadcnComponents.Button,
    Input: shadcnComponents.Input,
  },
});

3. Render

import { Renderer } from "@json-render/react";

function App({ spec }) {
  return <Renderer spec={spec} registry={registry} />;
}

Extending with Custom Components

Pick standard components as a base and add your own alongside them:

import { z } from "zod";

// Catalog
const catalog = defineCatalog(schema, {
  components: {
    // Standard
    Card: shadcnComponentDefinitions.Card,
    Stack: shadcnComponentDefinitions.Stack,
    Button: shadcnComponentDefinitions.Button,

    // Custom
    Metric: {
      props: z.object({
        label: z.string(),
        value: z.string(),
        trend: z.enum(["up", "down", "neutral"]).nullable(),
      }),
      description: "KPI metric display",
    },
  },
  actions: {},
});

// Registry
const { registry } = defineRegistry(catalog, {
  components: {
    // Standard
    Card: shadcnComponents.Card,
    Stack: shadcnComponents.Stack,
    Button: shadcnComponents.Button,

    // Custom
    Metric: ({ props }) => (
      <div>
        <span>{props.label}</span>
        <span>{props.value}</span>
      </div>
    ),
  },
});

Standard Components

Layout

Component Description
Card Container card with optional title and description
Stack Flex container (horizontal/vertical) with gap, alignment, justify
Grid Grid layout (1-6 columns)
Separator Visual separator line

Navigation

Component Description
Tabs Tabbed navigation
Accordion Collapsible accordion sections
Collapsible Single collapsible section with trigger
Pagination Page navigation

Overlay

Component Description
Dialog Modal dialog
Drawer Bottom drawer
Tooltip Hover tooltip
Popover Click-triggered popover
DropdownMenu Dropdown menu with selectable items

Content

Component Description
Heading Heading text (h1-h4)
Text Paragraph text with variants (body, caption, muted, lead, code)
Image Placeholder image
Avatar User avatar with fallback initials
Badge Status badge
Alert Alert banner
Carousel Horizontally scrollable carousel
Table Data table with columns and rows

Feedback

Component Description
Progress Progress bar
Skeleton Loading placeholder
Spinner Loading spinner

Input

Component Description
Button Clickable button with variants
Link Anchor link
Input Text input with label, validation, and validateOn timing
Textarea Multi-line text input with validation and validateOn
Select Dropdown select with validation and validateOn
Checkbox Checkbox input with validation and validateOn
Radio Radio button group with validation and validateOn
Switch Toggle switch with validation and validateOn
Slider Range slider
Toggle Toggle button
ToggleGroup Group of toggle buttons
ButtonGroup Group of buttons with selected state

Built-in Actions

State actions (setState, pushState, removeState, validateForm) are built into the @json-render/react schema and handled automatically by ActionProvider. They are included in prompts without needing to be declared in your catalog.

Action Description
setState Set a value at a state path
pushState Push a value onto an array in state
removeState Remove an item from an array in state
validateForm Validate all fields and write result to state

Validation Timing (validateOn)

All form components support the validateOn prop to control when validation runs:

Value Description Default For
"change" Validate on every input change Select, Checkbox, Radio, Switch
"blur" Validate when field loses focus Input, Textarea
"submit" Validate only on form submission

Exports

Entry Point Exports
@json-render/shadcn shadcnComponents
@json-render/shadcn/catalog shadcnComponentDefinitions

The /catalog entry point contains only Zod schemas (no React dependency), so it can be used in server-side code for prompt generation.