# Component Size Guidelines All components must be under 150 lines of code (LOC). This refactor follows atomic design principles. ## Component Categories ### Atoms (< 50 LOC) Single-purpose, highly reusable components: - DataList - StatCard - ActionButton - LoadingState - EmptyState - StatusBadge - IconButton ### Molecules (50-100 LOC) Combinations of atoms for specific use cases: - SearchBar (Input + Icon) - DataCard (Card + Content + Actions) - FormField (Label + Input + Error) - FilterBar (Multiple filters) ### Organisms (100-150 LOC) Complex components combining molecules: - DataTable (with sorting, filtering, pagination) - Dashboard (multiple stat cards and charts) - FormBuilder (dynamic form generation) ## Refactoring Large Components ### Before (200+ LOC): ```typescript function ProjectDashboard() { // 50 lines of state and logic // 150 lines of JSX with embedded components return
...
} ``` ### After (< 50 LOC): ```typescript function ProjectDashboard(props) { return ( ) } ``` ## Hook Extraction Move logic out of components into hooks: ### Before: ```typescript function MyComponent() { const [items, setItems] = useState([]) const [search, setSearch] = useState('') const filtered = items.filter(i => i.name.includes(search)) const [page, setPage] = useState(1) const paginated = filtered.slice((page-1)*10, page*10) // ... more logic return
...
} ``` ### After: ```typescript function MyComponent() { const [items, setItems] = useKV('items', []) const { filtered } = useSearchFilter({ items, searchFields: ['name'] }) const { items: page } = usePagination({ items: filtered, pageSize: 10 }) return } ``` ## JSON-Driven Pages For data-heavy pages, use JSON configuration: 1. Create JSON schema in `/src/config/pages/` 2. Define data bindings and layout 3. Implement computed functions 4. Use JSONPageRenderer This reduces component size from 200+ LOC to < 50 LOC. ## Composition Over Inheritance Build complex UIs by composing simple components: ```typescript Title ``` ## Benefits 1. **Easier to Test**: Small components = simple tests 2. **Easier to Understand**: Clear, focused responsibility 3. **Easier to Reuse**: Composable building blocks 4. **Easier to Maintain**: Changes are localized 5. **Better Performance**: Smaller re-render boundaries