# Schema Editor Composite Components
This document describes the composite component architecture for the Schema Editor feature.
## Component Hierarchy
The Schema Editor follows the Atomic Design methodology:
### Atoms (Smallest units)
- `ComponentPaletteItem` - Individual draggable component in the palette
- `ComponentTreeNode` - Individual node in the component tree
- `PropertyEditorField` - Individual property input field
### Molecules (Simple combinations)
- `ComponentPalette` - Tabbed palette of draggable components
- `ComponentTree` - Hierarchical tree view of components
- `PropertyEditor` - Form for editing component properties
- `CanvasRenderer` - Visual canvas for rendering UI components
### Organisms (Complex combinations)
- `SchemaEditorToolbar` - Top toolbar with import/export/preview actions
- `SchemaEditorSidebar` - Left sidebar containing component palette
- `SchemaEditorCanvas` - Central canvas area with component rendering
- `SchemaEditorPropertiesPanel` - Right panel with tree + property editor
- `SchemaEditorLayout` - Complete editor layout orchestrating all panels
- `EmptyCanvasState` - Empty state displayed when no components exist
- `SchemaEditorStatusBar` - Bottom status bar showing component count
- `SchemaCodeViewer` - JSON/preview viewer for schema output
### Pages (Full features)
- `SchemaEditorPage` - Complete schema editor feature with all hooks and state
## Benefits of This Architecture
### 1. Separation of Concerns
Each component has a single, clear responsibility:
- **Toolbar**: Actions (import, export, preview)
- **Sidebar**: Component palette
- **Canvas**: Visual rendering
- **Properties Panel**: Editing selected component
- **Layout**: Orchestration
### 2. Reusability
Composite components can be used independently:
```tsx
// Use just the toolbar elsewhere
// Use just the canvas
```
### 3. Testability
Each component can be tested in isolation with mock props.
### 4. Maintainability
- Each file is <150 LOC (as per project guidelines)
- Clear dependencies between components
- Easy to locate and modify specific functionality
### 5. Composability
The `SchemaEditorLayout` component orchestrates all the panels, but you could create alternative layouts:
```tsx
// Simple layout without sidebar
// Or minimal layout with just canvas
```
## Component Props Pattern
Each composite component follows a consistent prop pattern:
### Data Props
Props representing the current state (read-only):
- `components: UIComponent[]`
- `selectedId: string | null`
- `hoveredId: string | null`
### Action Props
Props for modifying state (callbacks):
- `onSelect: (id: string | null) => void`
- `onUpdate: (updates: Partial) => void`
- `onDelete: () => void`
### Drag & Drop Props
Props specifically for drag-and-drop functionality:
- `draggedOverId: string | null`
- `dropPosition: 'before' | 'after' | 'inside' | null`
- `onDragStart: (...) => void`
- `onDragOver: (...) => void`
- `onDrop: (...) => void`
## Usage Example
```tsx
import { SchemaEditorLayout } from '@/components/organisms'
import { useSchemaEditor } from '@/hooks/ui/use-schema-editor'
import { useDragDrop } from '@/hooks/ui/use-drag-drop'
function MySchemaEditor() {
const {
components,
selectedId,
// ... other state
} = useSchemaEditor()
const {
draggedOverId,
dropPosition,
// ... drag handlers
} = useDragDrop()
return (
)
}
```
## Extension Points
### Adding New Panels
Create a new organism component and add it to the layout:
```tsx
// New component
export function SchemaEditorMetricsPanel({ ... }) {
return Metrics content
}
// Add to layout
{/* existing panels */}
```
### Custom Toolbars
Create alternative toolbar components:
```tsx
export function SchemaEditorCompactToolbar({ ... }) {
// Simplified toolbar with fewer buttons
}
```
### Alternative Layouts
Create new layout compositions:
```tsx
export function SchemaEditorSplitLayout({ ... }) {
// Different arrangement of the same panels
}
```
## File Organization
```
src/components/
├── atoms/
│ ├── ComponentPaletteItem.tsx
│ ├── ComponentTreeNode.tsx
│ └── PropertyEditorField.tsx
├── molecules/
│ ├── ComponentPalette.tsx
│ ├── ComponentTree.tsx
│ ├── PropertyEditor.tsx
│ └── CanvasRenderer.tsx
├── organisms/
│ ├── SchemaEditorToolbar.tsx
│ ├── SchemaEditorSidebar.tsx
│ ├── SchemaEditorCanvas.tsx
│ ├── SchemaEditorPropertiesPanel.tsx
│ ├── SchemaEditorLayout.tsx
│ ├── EmptyCanvasState.tsx
│ ├── SchemaEditorStatusBar.tsx
│ └── SchemaCodeViewer.tsx
└── SchemaEditorPage.tsx
```
## Future Enhancements
1. **Add SchemaEditorPreviewPanel** - Live preview of the schema
2. **Add SchemaEditorHistoryPanel** - Undo/redo history
3. **Add SchemaEditorTemplatesPanel** - Pre-built component templates
4. **Create SchemaEditorMobileLayout** - Responsive mobile layout
5. **Add SchemaEditorKeyboardShortcuts** - Keyboard navigation overlay
## Related Documentation
- [Component Definitions](../lib/component-definitions.ts)
- [JSON UI Types](../types/json-ui.ts)
- [Schema Editor Hook](../hooks/ui/use-schema-editor.ts)
- [Drag Drop Hook](../hooks/ui/use-drag-drop.ts)