json-schema-canvas
Version:
A React component for visually building and editing JSON Schema definitions with a modern UI
134 lines (101 loc) • 3.29 kB
Markdown
# JSON Schema Canvas
A React component for visually building and editing JSON Schema definitions with a modern UI.
## Features
- 🎨 Modern, intuitive UI built with Radix UI
- 🔄 Drag-and-drop property reordering
- 📝 Live schema preview
- ✨ Strict/Non-strict mode support
- 🎯 Enum value management
- 📋 One-click schema copying
## Installation
```bash
npm install json-schema-canvas
# or
yarn add json-schema-canvas
```
## Setup
Import the component and use it in your React application:
```js
import { SchemaBuilder } from 'json-schema-canvas';
```
### Tailwind CSS Setup
This component uses Tailwind CSS for styling. To ensure all styles are properly applied when using the component in your project, you need to configure your Tailwind setup:
1. Make sure you have Tailwind CSS installed in your project:
```bash
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
```
2. Update your `tailwind.config.js` to include the component's styles:
```js
import { tailwindContent } from 'json-schema-canvas';
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
...tailwindContent() // Add this line to include the component's styles
],
theme: {
extend: {},
},
plugins: [],
}
```
This ensures that all the Tailwind classes used by the component are included in your final CSS bundle.
## Usage
Basic usage with default settings:
```tsx
import { SchemaBuilder } from 'json-schema-canvas'
function App() {
return (
<SchemaBuilder />
)
}
```
Advanced usage with custom configuration:
```tsx
const schemaState = useSchemaState(
{
properties: [
{
name: "name",
type: "string",
required: true,
hasEnum: false
}
],
additionalProperties: false
},
true
)
return (
<SchemaBuilder
initialSchema={schemaState.schema}
initialStrictMode={schemaState.isStrictMode}
onSchemaChange={(schema) => console.log('Schema updated:', schema)}
/>
)
```
## Props
### SchemaBuilder Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| initialSchema | object | `{}` | Initial JSON Schema object to edit |
| initialStrictMode | boolean | true | Initial strict mode state |
| className | string | "flex min-h-screen bg-background p-6 gap-6 animate-fade-in" | Container class name |
| cardClassName | string | "flex-1 p-6 backdrop-blur-sm bg-opacity-50 min-w-[600px]" | Card class name |
| maxHeight | string | undefined | Maximum height of the schema editor |
| showOutput | boolean | true | Whether to show the schema output panel |
| onSchemaChange | (schema: object) => void | undefined | Callback when schema changes |
| onStrictModeChange | (isStrict: boolean) => void | undefined | Callback when strict mode changes |
### useSchemaState Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| initialSchema | object | `{ properties: [], additionalProperties: false }` | Initial schema state |
| initialStrictMode | boolean | true | Initial strict mode state |
## Development
```bash
npm install
npm run dev
```
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.