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
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
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. Use when this capability is needed.4---56# UI Styling Mastery78Build beautiful, accessible interfaces with shadcn/ui components and Tailwind CSS v4.910## Core Stack1112| Layer | Tool | Role |13|-------|------|------|14| Components | shadcn/ui (Radix primitives) | Accessible, composable UI components |15| Styling | Tailwind CSS v4 | Utility-first CSS, zero runtime overhead |16| Theming | CSS Variables + next-themes | Dark mode, custom palettes |17| Icons | Lucide React | Consistent icon system |1819## Quick Start2021```bash22# Initialize shadcn/ui + Tailwind23npx shadcn@latest init2425# Add components26npx shadcn@latest add button card dialog form input table2728# Use in code29import { Button } from "@/components/ui/button"30<Button variant="default" size="lg">Click me</Button>31```3233## Reference Navigation3435- **[Component Catalog](references/shadcn-components.md)** — All shadcn/ui components with usage patterns36- **[Theming & Dark Mode](references/theming-darkmode.md)** — CSS variables, color palettes, next-themes, custom themes37- **[Tailwind Utilities](references/tailwind-utilities.md)** — Layout, spacing, typography, colors, responsive38- **[Tailwind v4 Features](references/tailwind-v4.md)** — @theme directive, CSS-first config, container queries39- **[Accessibility Patterns](references/accessibility-patterns.md)** — ARIA, keyboard nav, focus management, screen readers40- **[Responsive Design](references/responsive-design.md)** — Mobile-first, breakpoints, adaptive layouts4142## Key Patterns4344### Form with Validation45```tsx46import { useForm } from "react-hook-form"47import { zodResolver } from "@hookform/resolvers/zod"48import * as z from "zod"49import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form"50import { Input } from "@/components/ui/input"51import { Button } from "@/components/ui/button"5253const schema = z.object({54 email: z.string().email(),55 password: z.string().min(8)56})5758export function LoginForm() {59 const form = useForm({ resolver: zodResolver(schema) })60 return (61 <Form {...form}>62 <form onSubmit={form.handleSubmit(console.log)} className="space-y-6">63 <FormField control={form.control} name="email" render={({ field }) => (64 <FormItem>65 <FormLabel>Email</FormLabel>66 <FormControl><Input type="email" {...field} /></FormControl>67 <FormMessage />68 </FormItem>69 )} />70 <Button type="submit" className="w-full">Sign In</Button>71 </form>72 </Form>73 )74}75```7677### Responsive Layout with Dark Mode78```tsx79<div className="min-h-screen bg-background text-foreground">80 <div className="container mx-auto px-4 py-8">81 <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">82 <Card>83 <CardContent className="p-6">84 <h3 className="text-xl font-semibold">Content</h3>85 </CardContent>86 </Card>87 </div>88 </div>89</div>90```9192## Best Practices93941. **Utility-First**: Use Tailwind classes directly, extract components only for true repetition952. **Mobile-First**: Start with mobile styles, layer `md:`, `lg:` variants963. **Accessibility-First**: Use Radix primitives, add focus-visible states974. **CSS Variables**: Use `--variable` for consistent theming985. **Dark Mode**: Apply `dark:` variants, use semantic color names (`bg-background`)996. **Performance**: Automatic CSS purging, avoid dynamic class names100101## Related Skills102103| Skill | When to Use |104|-------|-------------|105| [frontend-design](../frontend-design/SKILL.md) | Design tokens, typography, spacing systems |106| [nextjs-turborepo](../nextjs-turborepo/SKILL.md) | Next.js styling integration |107| [ui-polish](../ui-polish/SKILL.md) | Visual refinement, polish checklist |108109---110> Converted and distributed by [TomeVault](https://tomevault.io/claim/thienty1207) — claim your Tome and manage your conversions.111<!-- tomevault:4.0:skill_md:2026-04-16 -->