Components Overview
ShadPanel includes a comprehensive library of 50+ pre-built, customizable components to build powerful admin panels quickly.
Component Categories
🎨 UI Components
Base components from shadcn/ui, fully configured and ready to use:
Component Categories:
- Form Elements: Button, Input, Label, Select, Checkbox, Switch, Textarea
- Layout: Card, Separator, Tabs, Sheet, Sidebar
- Overlays: Dialog, Dropdown Menu, Popover, Tooltip
- Feedback: Alert, Badge, Skeleton
- Navigation: Breadcrumb
- Data Display: Calendar, Table
📝 Form Builder
Declarative form system inspired by Filament PHP, with automatic validation:
Main Component:
Form- Wrapper with state management
Field Components:
FormInput- Text, email, password, number inputsFormTextarea- Multi-line text inputFormSelect- Dropdown selectionFormCheckbox- Boolean toggleFormToggle- Switch toggleFormTagsInput- Multi-tag inputFormDatePicker- Date selectionFormDateTimePicker- Date and time selectionFormFileUpload- File uploadFormKeyValue- Key-value pairsFormMarkdownEditor- Markdown editingFormRichEditor- Rich text editing
Layout Components:
FormGrid- Responsive grid layoutFormSection- Section with title and descriptionFormFieldset- Grouped fieldsFormGroup- Field groupingFormTabs- Tabbed formsFormPlaceholder- Empty state placeholder
📊 Data Tables
Powerful data tables with built-in features:
Main Component:
Table- Declarative data table
Column Types:
TableTextColumn- Text display with sorting/filteringTableImageColumn- Image displayTableSelectColumn- Row selection checkboxesTableActionsColumn- Row action menu
Actions:
TableAction- Individual row actions
Built-in Features:
- ✅ Sorting (ascending/descending)
- ✅ Global search
- ✅ Column filtering
- ✅ Pagination
- ✅ Row selection
- ✅ Bulk actions
- ✅ Column visibility toggle
Component Naming Convention
ShadPanel uses prefixed naming to avoid conflicts:
Form Components → Form*
All form components are prefixed with Form:
import {
Form,
FormInput,
FormSelect,
FormSection
} from '@/components/ui'Why?
- Prevents conflicts with native HTML elements (
<input>,<select>) - Clear distinction from other UI components
- Better autocomplete and IntelliSense
Table Components → Table*
All table components are prefixed with Table:
import {
Table,
TableTextColumn,
TableAction
} from '@/components/ui'Why?
- No conflicts with native
<table>element - Consistent with shadcn/ui Table component
- Clear intent for data table features
Import Patterns
Centralized Imports
All components can be imported from @/components/ui:
import {
Button,
Card,
Form,
FormInput,
Table,
TableTextColumn
} from '@/components/ui'Individual Imports
Or import individually for tree-shaking:
import { Button } from '@/components/ui/button'
import { Form } from '@/components/ui/form-builder'
import { Table } from '@/components/ui/data-table'Component Features
TypeScript First
All components are fully typed with TypeScript:
import { Form, FormInput } from '@/components/ui'
interface FormData {
email: string
name: string
}
export default function MyForm() {
return (
<Form<FormData>
initialValues={{ email: '', name: '' }}
onSubmit={(values) => {
// values is typed as FormData
console.log(values.email, values.name)
}}
>
<FormInput accessor="email" label="Email" />
<FormInput accessor="name" label="Name" />
</Form>
)
}Accessibility
All components follow accessibility best practices:
- ✅ ARIA attributes
- ✅ Keyboard navigation
- ✅ Screen reader support
- ✅ Focus management
- ✅ Semantic HTML
Customizable
Components accept className and support customization:
<Button className="bg-blue-500 hover:bg-blue-600">
Custom Button
</Button>
<Form className="max-w-2xl mx-auto">
{/* Form fields */}
</Form>Dark Mode Ready
All components support dark mode out of the box:
// Automatically adapts to theme
<Card className="bg-card text-card-foreground">
{/* Content */}
</Card>Quick Examples
Simple Form
import { Form, FormInput, FormSelect } from '@/components/ui'
import { Button } from '@/components/ui/button'
export default function UserForm() {
return (
<Form
initialValues={{ name: '', role: 'user' }}
onSubmit={(values) => console.log(values)}
>
<FormInput accessor="name" label="Name" required />
<FormSelect
accessor="role"
label="Role"
options={[
{ label: 'User', value: 'user' },
{ label: 'Admin', value: 'admin' },
]}
/>
<Button type="submit">Submit</Button>
</Form>
)
}Simple Table
import { Table, TableTextColumn, TableActionsColumn, TableAction } from '@/components/ui'
import { Edit, Trash } from 'lucide-react'
export default function UsersTable({ users }) {
return (
<Table data={users}>
<TableTextColumn accessor="name" header="Name" sortable />
<TableTextColumn accessor="email" header="Email" searchable />
<TableActionsColumn>
<TableAction icon={Edit} label="Edit" onClick={(row) => {}} />
<TableAction icon={Trash} label="Delete" onClick={(row) => {}} />
</TableActionsColumn>
</Table>
)
}UI Components
import { Button } from '@/components/ui/button'
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
export default function Dashboard() {
return (
<Card>
<CardHeader>
<CardTitle>
Dashboard
<Badge className="ml-2">New</Badge>
</CardTitle>
</CardHeader>
<CardContent>
<Button>Get Started</Button>
</CardContent>
</Card>
)
}Component Philosophy
Composition Over Configuration
Components are designed to be composed together:
<Form>
<FormSection title="Personal Info">
<FormGrid columns={2}>
<FormInput accessor="firstName" label="First Name" />
<FormInput accessor="lastName" label="Last Name" />
</FormGrid>
</FormSection>
</Form>Sensible Defaults
Components work with minimal configuration:
// Just data and columns - sorting, filtering, pagination included
<Table data={users}>
<TableTextColumn accessor="name" header="Name" />
<TableTextColumn accessor="email" header="Email" />
</Table>Progressive Enhancement
Add features as needed:
// Start simple
<FormInput accessor="email" label="Email" />
// Add validation
<FormInput accessor="email" label="Email" required type="email" />
// Add more features
<FormInput
accessor="email"
label="Email"
required
type="email"
placeholder="you@example.com"
helperText="We'll never share your email"
pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"
/>Next Steps
Explore the component library in depth:
- Form Builder Guide - Build powerful forms
- Data Table Guide - Create data tables
- API Reference - Component props and methods