mirror of
https://github.com/johndoe6345789/low-code-react-app-b.git
synced 2026-04-25 14:14:57 +00:00
320 lines
6.8 KiB
TypeScript
320 lines
6.8 KiB
TypeScript
import { ComponentType } from '@/types/json-ui'
|
|
|
|
export interface ComponentDefinition {
|
|
type: ComponentType
|
|
label: string
|
|
category: 'layout' | 'input' | 'display' | 'navigation' | 'feedback' | 'data' | 'custom'
|
|
icon: string
|
|
defaultProps?: Record<string, any>
|
|
canHaveChildren?: boolean
|
|
}
|
|
|
|
export const componentDefinitions: ComponentDefinition[] = [
|
|
// Layout Components
|
|
{
|
|
type: 'div',
|
|
label: 'Container',
|
|
category: 'layout',
|
|
icon: 'Square',
|
|
canHaveChildren: true,
|
|
defaultProps: { className: 'p-4 space-y-2' }
|
|
},
|
|
{
|
|
type: 'section',
|
|
label: 'Section',
|
|
category: 'layout',
|
|
icon: 'SquaresFour',
|
|
canHaveChildren: true,
|
|
defaultProps: { className: 'space-y-4' }
|
|
},
|
|
{
|
|
type: 'Grid',
|
|
label: 'Grid',
|
|
category: 'layout',
|
|
icon: 'GridFour',
|
|
canHaveChildren: true,
|
|
defaultProps: { columns: 2, gap: 4 }
|
|
},
|
|
{
|
|
type: 'Stack',
|
|
label: 'Stack',
|
|
category: 'layout',
|
|
icon: 'Stack',
|
|
canHaveChildren: true,
|
|
defaultProps: { direction: 'vertical', gap: 2 }
|
|
},
|
|
{
|
|
type: 'Flex',
|
|
label: 'Flex',
|
|
category: 'layout',
|
|
icon: 'ArrowsOutLineHorizontal',
|
|
canHaveChildren: true,
|
|
defaultProps: { direction: 'row', gap: 2 }
|
|
},
|
|
{
|
|
type: 'Container',
|
|
label: 'Container',
|
|
category: 'layout',
|
|
icon: 'Rectangle',
|
|
canHaveChildren: true,
|
|
defaultProps: { maxWidth: 'lg' }
|
|
},
|
|
{
|
|
type: 'Card',
|
|
label: 'Card',
|
|
category: 'layout',
|
|
icon: 'Rectangle',
|
|
canHaveChildren: true,
|
|
defaultProps: { className: 'p-4' }
|
|
},
|
|
// Input Components
|
|
{
|
|
type: 'Button',
|
|
label: 'Button',
|
|
category: 'input',
|
|
icon: 'Circle',
|
|
canHaveChildren: true,
|
|
defaultProps: { children: 'Click me', variant: 'default' }
|
|
},
|
|
{
|
|
type: 'Input',
|
|
label: 'Input',
|
|
category: 'input',
|
|
icon: 'TextT',
|
|
defaultProps: { placeholder: 'Enter text...' }
|
|
},
|
|
{
|
|
type: 'TextArea',
|
|
label: 'TextArea',
|
|
category: 'input',
|
|
icon: 'TextAlignLeft',
|
|
defaultProps: { placeholder: 'Enter text...', rows: 4 }
|
|
},
|
|
{
|
|
type: 'Select',
|
|
label: 'Select',
|
|
category: 'input',
|
|
icon: 'CaretDown',
|
|
defaultProps: { placeholder: 'Choose option...' }
|
|
},
|
|
{
|
|
type: 'Checkbox',
|
|
label: 'Checkbox',
|
|
category: 'input',
|
|
icon: 'CheckSquare',
|
|
defaultProps: {}
|
|
},
|
|
{
|
|
type: 'Radio',
|
|
label: 'Radio',
|
|
category: 'input',
|
|
icon: 'Circle',
|
|
defaultProps: {}
|
|
},
|
|
{
|
|
type: 'Switch',
|
|
label: 'Switch',
|
|
category: 'input',
|
|
icon: 'ToggleLeft',
|
|
defaultProps: {}
|
|
},
|
|
{
|
|
type: 'Slider',
|
|
label: 'Slider',
|
|
category: 'input',
|
|
icon: 'SlidersHorizontal',
|
|
defaultProps: { min: 0, max: 100, value: 50 }
|
|
},
|
|
{
|
|
type: 'NumberInput',
|
|
label: 'Number Input',
|
|
category: 'input',
|
|
icon: 'NumberCircleOne',
|
|
defaultProps: { placeholder: '0', min: 0 }
|
|
},
|
|
// Display Components
|
|
{
|
|
type: 'Heading',
|
|
label: 'Heading',
|
|
category: 'display',
|
|
icon: 'TextHOne',
|
|
canHaveChildren: true,
|
|
defaultProps: { level: 1, children: 'Heading' }
|
|
},
|
|
{
|
|
type: 'Text',
|
|
label: 'Text',
|
|
category: 'display',
|
|
icon: 'Paragraph',
|
|
canHaveChildren: true,
|
|
defaultProps: { children: 'Text content' }
|
|
},
|
|
{
|
|
type: 'Badge',
|
|
label: 'Badge',
|
|
category: 'display',
|
|
icon: 'Tag',
|
|
canHaveChildren: true,
|
|
defaultProps: { children: 'Badge', variant: 'default' }
|
|
},
|
|
{
|
|
type: 'Tag',
|
|
label: 'Tag',
|
|
category: 'display',
|
|
icon: 'Tag',
|
|
canHaveChildren: true,
|
|
defaultProps: { children: 'Tag' }
|
|
},
|
|
{
|
|
type: 'Code',
|
|
label: 'Code',
|
|
category: 'display',
|
|
icon: 'Code',
|
|
canHaveChildren: true,
|
|
defaultProps: { children: 'code' }
|
|
},
|
|
{
|
|
type: 'Image',
|
|
label: 'Image',
|
|
category: 'display',
|
|
icon: 'Image',
|
|
defaultProps: { src: '', alt: 'Image' }
|
|
},
|
|
{
|
|
type: 'Avatar',
|
|
label: 'Avatar',
|
|
category: 'display',
|
|
icon: 'UserCircle',
|
|
defaultProps: { src: '', alt: 'Avatar' }
|
|
},
|
|
{
|
|
type: 'Progress',
|
|
label: 'Progress',
|
|
category: 'display',
|
|
icon: 'CircleNotch',
|
|
defaultProps: { value: 50 }
|
|
},
|
|
{
|
|
type: 'Spinner',
|
|
label: 'Spinner',
|
|
category: 'display',
|
|
icon: 'CircleNotch',
|
|
defaultProps: { size: 'md' }
|
|
},
|
|
{
|
|
type: 'Skeleton',
|
|
label: 'Skeleton',
|
|
category: 'display',
|
|
icon: 'Rectangle',
|
|
defaultProps: { className: 'h-4 w-full' }
|
|
},
|
|
{
|
|
type: 'Separator',
|
|
label: 'Separator',
|
|
category: 'display',
|
|
icon: 'Minus',
|
|
defaultProps: {}
|
|
},
|
|
// Navigation Components
|
|
{
|
|
type: 'Link',
|
|
label: 'Link',
|
|
category: 'navigation',
|
|
icon: 'Link',
|
|
canHaveChildren: true,
|
|
defaultProps: { href: '#', children: 'Link' }
|
|
},
|
|
// Feedback Components
|
|
{
|
|
type: 'Alert',
|
|
label: 'Alert',
|
|
category: 'feedback',
|
|
icon: 'Info',
|
|
canHaveChildren: true,
|
|
defaultProps: { variant: 'info', children: 'Alert message' }
|
|
},
|
|
{
|
|
type: 'InfoBox',
|
|
label: 'Info Box',
|
|
category: 'feedback',
|
|
icon: 'Info',
|
|
canHaveChildren: true,
|
|
defaultProps: { type: 'info', children: 'Information' }
|
|
},
|
|
{
|
|
type: 'EmptyState',
|
|
label: 'Empty State',
|
|
category: 'feedback',
|
|
icon: 'FolderOpen',
|
|
canHaveChildren: true,
|
|
defaultProps: { message: 'No items found' }
|
|
},
|
|
{
|
|
type: 'StatusBadge',
|
|
label: 'Status Badge',
|
|
category: 'feedback',
|
|
icon: 'Circle',
|
|
defaultProps: { status: 'active', children: 'Active' }
|
|
},
|
|
// Data Components
|
|
{
|
|
type: 'List',
|
|
label: 'List',
|
|
category: 'data',
|
|
icon: 'List',
|
|
defaultProps: { items: [], emptyMessage: 'No items' }
|
|
},
|
|
{
|
|
type: 'Table',
|
|
label: 'Table',
|
|
category: 'data',
|
|
icon: 'Table',
|
|
defaultProps: { data: [], columns: [] }
|
|
},
|
|
{
|
|
type: 'KeyValue',
|
|
label: 'Key Value',
|
|
category: 'data',
|
|
icon: 'Equals',
|
|
defaultProps: { label: 'Key', value: 'Value' }
|
|
},
|
|
{
|
|
type: 'StatCard',
|
|
label: 'Stat Card',
|
|
category: 'data',
|
|
icon: 'ChartBar',
|
|
defaultProps: { title: 'Metric', value: '0' }
|
|
},
|
|
// Custom Components
|
|
{
|
|
type: 'DataCard',
|
|
label: 'Data Card',
|
|
category: 'custom',
|
|
icon: 'ChartBar',
|
|
defaultProps: { title: 'Metric', value: '100', icon: 'TrendUp' }
|
|
},
|
|
{
|
|
type: 'SearchInput',
|
|
label: 'Search Input',
|
|
category: 'custom',
|
|
icon: 'MagnifyingGlass',
|
|
defaultProps: { placeholder: 'Search...' }
|
|
},
|
|
{
|
|
type: 'ActionBar',
|
|
label: 'Action Bar',
|
|
category: 'custom',
|
|
icon: 'Toolbox',
|
|
canHaveChildren: true,
|
|
defaultProps: { actions: [] }
|
|
},
|
|
]
|
|
|
|
export function getCategoryComponents(category: string): ComponentDefinition[] {
|
|
return componentDefinitions.filter(c => c.category === category)
|
|
}
|
|
|
|
export function getComponentDef(type: ComponentType): ComponentDefinition | undefined {
|
|
return componentDefinitions.find(c => c.type === type)
|
|
}
|