Toolbox Component
The Toolbox component provides a palette of available components and fields that can be added to the canvas. It organizes field types into categories and allows for easy drag-and-drop functionality.
Features
- Categorized Components: Fields organized by type and function
- Drag-and-Drop Support: Easy addition of components to the canvas
- Search Functionality: Quick search for specific field types
- Custom Components: Support for custom field types
- Responsive Design: Adapts to different screen sizes
Basic Usage
import { Toolbox } from '@repo/view-builder/toolbox/Toolbox';
import { SchemaProvider } from '@repo/view-builder/hooks/useSchemaState';
function MyToolbox() {
return (
<SchemaProvider>
<Toolbox />
</SchemaProvider>
);
}
Field Categories
The toolbox organizes fields into the following categories:
- Basic Fields: Text, Number, Checkbox, Date, etc.
- Advanced Fields: Rich Text, File Upload, Rating, etc.
- Layout Components: Sections, Tabs, Dividers, etc.
- Custom Fields: User-defined field types
Component Structure
Each component in the toolbox includes:
- Icon: Visual representation of the field type
- Label: Name of the field type
- Description: Brief explanation of the field’s purpose
- Drag Handle: Element for dragging the field to the canvas
Customization
You can customize the toolbox appearance and behavior:
<Toolbox
theme="dark"
showDescriptions={true}
categories={['basic', 'advanced', 'layout']}
searchEnabled={true}
/>
Adding Custom Field Types
You can extend the toolbox with custom field types:
import { Toolbox } from '@repo/view-builder/toolbox/Toolbox';
const customFieldTypes = [
{
type: 'signature',
label: 'Signature Field',
category: 'advanced',
icon: 'pen',
description: 'Field for capturing signatures',
defaultProps: {
required: false,
width: 300,
height: 150
}
},
{
type: 'rating',
label: 'Rating Field',
category: 'advanced',
icon: 'star',
description: 'Field for capturing ratings',
defaultProps: {
required: false,
maxRating: 5
}
}
];
function CustomToolbox() {
return <Toolbox customFieldTypes={customFieldTypes} />;
}
Integration with Canvas
The toolbox works seamlessly with the Canvas component:
import { DragDropCanvas } from '@repo/view-builder/canvas/DragDropCanvas';
import { Toolbox } from '@repo/view-builder/toolbox/Toolbox';
import { SchemaProvider } from '@repo/view-builder/hooks/useSchemaState';
function BuilderInterface() {
return (
<SchemaProvider>
<div className="grid grid-cols-4 gap-4">
<div className="col-span-1">
<Toolbox />
</div>
<div className="col-span-3">
<DragDropCanvas />
</div>
</div>
</SchemaProvider>
);
}
Advanced Usage
Field Templates
You can provide predefined field templates:
import { Toolbox } from '@repo/view-builder/toolbox/Toolbox';
const fieldTemplates = {
emailField: {
type: 'string',
label: 'Email Address',
required: true,
validation: {
pattern: '^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$',
message: 'Please enter a valid email address'
}
},
phoneField: {
type: 'string',
label: 'Phone Number',
required: true,
validation: {
pattern: '^\\+?[0-9]{10,15}$',
message: 'Please enter a valid phone number'
}
}
};
function TemplatedToolbox() {
return <Toolbox fieldTemplates={fieldTemplates} />;
}
Category Customization
You can customize the categories displayed in the toolbox:
import { Toolbox } from '@repo/view-builder/toolbox/Toolbox';
const customCategories = [
{
id: 'personal',
label: 'Personal Information',
icon: 'user',
fields: ['name', 'email', 'phone', 'address']
},
{
id: 'payment',
label: 'Payment Information',
icon: 'credit-card',
fields: ['cardNumber', 'expiryDate', 'cvv', 'billingAddress']
}
];
function CategorizedToolbox() {
return <Toolbox categories={customCategories} />;
}