UI Styling Mastery
Build beautiful, accessible interfaces with shadcn/ui components and Tailwind CSS v4.
Core Stack
| Layer |
Tool |
Role |
| Components |
shadcn/ui (Radix primitives) |
Accessible, composable UI components |
| Styling |
Tailwind CSS v4 |
Utility-first CSS, zero runtime overhead |
| Theming |
CSS Variables + next-themes |
Dark mode, custom palettes |
| Icons |
Lucide React |
Consistent icon system |
Quick Start
# Initialize shadcn/ui + Tailwind
npx shadcn@latest init
# Add components
npx shadcn@latest add button card dialog form input table
# Use in code
import { Button } from "@/components/ui/button"
<Button variant="default" size="lg">Click me</Button>
Reference Navigation
- Component Catalog — All shadcn/ui components with usage patterns
- Theming & Dark Mode — CSS variables, color palettes, next-themes, custom themes
- Tailwind Utilities — Layout, spacing, typography, colors, responsive
- Tailwind v4 Features — @theme directive, CSS-first config, container queries
- Accessibility Patterns — ARIA, keyboard nav, focus management, screen readers
- Responsive Design — Mobile-first, breakpoints, adaptive layouts
Key Patterns
Form with Validation
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import * as z from "zod"
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
const schema = z.object({
email: z.string().email(),
password: z.string().min(8)
})
export function LoginForm() {
const form = useForm({ resolver: zodResolver(schema) })
return (
<Form {...form}>
<form className="space-y-6">
<FormField control={form.control} name="email" render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl><Input type="email" {...field} /></FormControl>
<FormMessage />
</FormItem>
)} />
<Button type="submit" className="w-full">Sign In</Button>
</form>
</Form>
)
}
Responsive Layout with Dark Mode
<div className="min-h-screen bg-background text-foreground">
<div className="container mx-auto px-4 py-8">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<Card>
<CardContent className="p-6">
<h3 className="text-xl font-semibold">Content</h3>
</CardContent>
</Card>
</div>
</div>
</div>
Best Practices
- Utility-First: Use Tailwind classes directly, extract components only for true repetition
- Mobile-First: Start with mobile styles, layer
md:, lg: variants
- Accessibility-First: Use Radix primitives, add focus-visible states
- CSS Variables: Use
--variable for consistent theming
- Dark Mode: Apply
dark: variants, use semantic color names (bg-background)
- Performance: Automatic CSS purging, avoid dynamic class names
Related Skills
1---2name: ui-styling3description: Create beautiful, accessible UIs with shadcn/ui (Radix + Tailwind), Tailwind CSS v4, theming, dark mode, responsive design, canvas design system. Use for building UI components, implementing design systems, styling, responsive layouts, dark mode, and accessibility.4license: MIT5---67# UI Styling Mastery89Build beautiful, accessible interfaces with shadcn/ui components and Tailwind CSS v4.1011## Core Stack1213| Layer | Tool | Role |14|-------|------|------|15| Components | shadcn/ui (Radix primitives) | Accessible, composable UI components |16| Styling | Tailwind CSS v4 | Utility-first CSS, zero runtime overhead |17| Theming | CSS Variables + next-themes | Dark mode, custom palettes |18| Icons | Lucide React | Consistent icon system |1920## Quick Start2122```bash23# Initialize shadcn/ui + Tailwind24npx shadcn@latest init2526# Add components27npx shadcn@latest add button card dialog form input table2829# Use in code30import { Button } from "@/components/ui/button"31<Button variant="default" size="lg">Click me</Button>32```3334## Reference Navigation3536- **[Component Catalog](references/shadcn-components.md)** — All shadcn/ui components with usage patterns37- **[Theming & Dark Mode](references/theming-darkmode.md)** — CSS variables, color palettes, next-themes, custom themes38- **[Tailwind Utilities](references/tailwind-utilities.md)** — Layout, spacing, typography, colors, responsive39- **[Tailwind v4 Features](references/tailwind-v4.md)** — @theme directive, CSS-first config, container queries40- **[Accessibility Patterns](references/accessibility-patterns.md)** — ARIA, keyboard nav, focus management, screen readers41- **[Responsive Design](references/responsive-design.md)** — Mobile-first, breakpoints, adaptive layouts4243## Key Patterns4445### Form with Validation46```tsx47import { useForm } from "react-hook-form"48import { zodResolver } from "@hookform/resolvers/zod"49import * as z from "zod"50import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form"51import { Input } from "@/components/ui/input"52import { Button } from "@/components/ui/button"5354const schema = z.object({55 email: z.string().email(),56 password: z.string().min(8)57})5859export function LoginForm() {60 const form = useForm({ resolver: zodResolver(schema) })61 return (62 <Form {...form}>63 <form onSubmit={form.handleSubmit(console.log)} className="space-y-6">64 <FormField control={form.control} name="email" render={({ field }) => (65 <FormItem>66 <FormLabel>Email</FormLabel>67 <FormControl><Input type="email" {...field} /></FormControl>68 <FormMessage />69 </FormItem>70 )} />71 <Button type="submit" className="w-full">Sign In</Button>72 </form>73 </Form>74 )75}76```7778### Responsive Layout with Dark Mode79```tsx80<div className="min-h-screen bg-background text-foreground">81 <div className="container mx-auto px-4 py-8">82 <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">83 <Card>84 <CardContent className="p-6">85 <h3 className="text-xl font-semibold">Content</h3>86 </CardContent>87 </Card>88 </div>89 </div>90</div>91```9293## Best Practices94951. **Utility-First**: Use Tailwind classes directly, extract components only for true repetition962. **Mobile-First**: Start with mobile styles, layer `md:`, `lg:` variants973. **Accessibility-First**: Use Radix primitives, add focus-visible states984. **CSS Variables**: Use `--variable` for consistent theming995. **Dark Mode**: Apply `dark:` variants, use semantic color names (`bg-background`)1006. **Performance**: Automatic CSS purging, avoid dynamic class names101102## Related Skills103104| Skill | When to Use |105|-------|-------------|106| [frontend-design](../frontend-design/SKILL.md) | Design tokens, typography, spacing systems |107| [nextjs-turborepo](../nextjs-turborepo/SKILL.md) | Next.js styling integration |108| [ui-polish](../ui-polish/SKILL.md) | Visual refinement, polish checklist |