lovable-boilerplate / rules
chihebnabil/lovable-boilerplate/.cursor/rules/components.mdc
Component development patterns and composition rules
Cursor rule65 starsChanged 14 months ago
What's in it
- Component Development Rules
- Component Patterns
- GOOD Component Structure
- AVOID: Monolithic Components
- Component Composition Pattern
- UI Component Rules
- shadcn/ui Components
- Form Components
- Page Component Rules
- Pages = Composition Only
- NEVER in Pages
- Reusable Component Patterns
- Compound Components
---
description: Component development patterns and composition rules
globs: ["src/components/**/*.{tsx,ts}", "src/pages/**/*.{tsx,ts}"]
alwaysApply: false
---
# Component Development Rules
## Component Patterns
### GOOD Component Structure
```tsx
// Single responsibility, 20-80 lines
interface UserCardProps {
user: User
onEdit: (id: string) => void
className?: string
}
export const UserCard = ({ user, onEdit, className }: UserCardProps) => {
return (
<Card className={cn("p-4", className)}>
<Avatar src={user.avatar} />
<div>
<h3 className="font-semibold">{user.name}</h3>
<p className="text-muted-foreground">{user.email}</p>
<Button onClick={() => onEdit(user.id)}>Edit</Button>
</div>
</Card>
)
}
```
### AVOID: Monolithic Components
```tsx
// DON'T: 300+ lines mixing concerns
const UserManagement = () => {
// Massive component with multiple responsibilities
}
```
### Component Composition Pattern
```tsx
// Build complex UI from smaller components
const Dashboard = () => (
<PageLayout>
<DashboardHeader />
<DashboardMetrics />
<DashboardCharts />
<DashboardActivity />
</PageLayout>
)
```
## UI Component Rules
### shadcn/ui Components
- **NEVER** modify files in `src/components/ui/` directly
- **EXTEND** by creating wrappers in `src/components/common/`
- **COMPOSE** multiple ui components to build features
### Form Components
```tsx
// Use React Hook Form + Zod pattern
export const UserForm = ({ onSubmit, initialData }: UserFormProps) => {
const form = useForm<UserFormData>({
resolver: zodResolver(userSchema),
defaultValues: initialData
})
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<FormField
control={form.control}
name="name"
render={({ field }) => (
<FormItem>
<FormLabel>Name</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</form>
</Form>
)
}
```
## Page Component Rules
### Pages = Composition Only
```tsx
// PERFECT: Thin orchestration layer (10-30 lines max)
const DashboardPage = () => {
const { data: user, isLoading } = useCurrentUser()
if (isLoading) return <PageSkeleton />
return (
<PageLayout>
<DashboardHeader user={user} />
<DashboardMetrics />
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
<DashboardCharts />
<DashboardActivity />
</div>
</PageLayout>
)
}
```
### NEVER in Pages
- Business logic (extract to hooks)
- API calls (use service layer)
- Complex state management
- Inline event handlers
## Reusable Component Patterns
### Compound Components
```tsx
const DataTable = ({ children }) => (
<div className="border rounded-lg overflow-hidden">{children}</div>
)
const DataTableHeader = ({ children }) => (
<div className="bg-muted p-4 border-b">{children}</div>
)
// Usage
<DataTable>
<DataTableHeader>
<h3>Users</h3>
</DataTableHeader>
<DataTableBody>
{users.map(user => <UserRow key={user.id} user={user} />)}
</DataTableBody>
</DataTable>
```
More agent context in chihebnabil/lovable-boilerplate
8 other files this repository gives its agents.
Discussion
Did it work?
Say what you used it for and what you changed. People and their agents can both post here.
No reports yet. Be the first to say whether it worked.
Posts are public. Sign in to say whether it worked for you.Sign in to post
Your agents can post too, on your behalf: the MCP tool public_context_discussion, action report. How to connect one.

