Skip to content

ADR-05: shadcn/ui + Tailwind CSS Selection

한국어 버전

DateAuthorRepos
2025-12-04@KubrickCodeweb

Context

The UI Component Library Question

The web platform requires a UI component library for building accessible, consistent, and maintainable interfaces. Key requirements:

  1. AI-Assisted Development: Optimized for Claude, Cursor, v0, and AI coding workflows
  2. React 19 Compatibility: Full support for latest React features
  3. Server Components: Work seamlessly with Next.js 16 App Router RSC patterns
  4. Accessibility: WCAG-compliant components out of the box
  5. Customization: Full control over styling and behavior
  6. Dark Mode: System preference detection with manual toggle

Architectural Constraints

  • BFF Pattern: Thin presentation layer; UI library should not add backend complexity
  • TypeScript: Strong typing for component props and variants
  • Tailwind CSS: Already selected for utility-first styling approach
  • Vercel Deployment: Edge-optimized bundle sizes matter

Candidates Evaluated

  1. shadcn/ui + Tailwind CSS: Copy-paste components built on Radix UI
  2. MUI (Material UI): Google's Material Design implementation
  3. Chakra UI v3: Zero-runtime CSS-in-JS with semantic tokens
  4. Ant Design v5: Enterprise-focused component library
  5. Headless UI: Tailwind Labs' unstyled accessible components

Decision

Adopt shadcn/ui with Tailwind CSS as the AI-native UI component library for maximum AI-assisted development productivity.

Core principles:

  1. AI-Ready Architecture: Open code for LLMs to read, understand, and improve
  2. Code Ownership: Copy components into project; no external runtime dependency
  3. Radix Foundation: Leverage battle-tested accessibility primitives
  4. CSS Variables Theming: OKLCH-based design tokens in globals.css
  5. Server Component First: Components compatible with RSC patterns

Options Considered

Option A: shadcn/ui + Tailwind CSS (Selected)

How It Works:

  • Components copied into project via CLI (pnpm dlx shadcn@latest add [component])
  • Built on Radix UI primitives for accessibility
  • Styled with Tailwind CSS utility classes
  • Theming via CSS variables and class-variance-authority (cva)

Pros:

  • AI-Native Stack: Vercel v0 generates exclusively shadcn/ui + Tailwind; industry-standard for AI coding
  • LLM-Optimized Styling: Tailwind's inline utilities = complete context in single file; no hidden CSS cascade
  • Full Code Ownership: Components in your repo; AI can read, understand, and modify freely
  • Radix Accessibility: WAI-ARIA compliant, keyboard navigation, screen reader tested
  • React 19 Native: First-class support; uses data-slot attributes, no deprecated APIs
  • Tailwind v4 Ready: CSS variables, @theme directive, OKLCH color support
  • RSC Compatible: Components work in Server Component patterns
  • Zero Bundle Overhead: No library runtime; only ship code you use (2.3 KB initial vs 80+ KB for MUI)

Cons:

  • Manual updates required (copy new versions selectively)
  • Fewer pre-built complex components than enterprise libraries
  • Team must understand Tailwind CSS paradigm

Option B: MUI (Material UI v6)

How It Works:

  • Install as npm dependency with Emotion CSS-in-JS
  • 50+ pre-built Material Design components
  • Theme object configuration with createTheme()

Evaluation:

  • Bundle Size: 80-90 KB gzipped core; single Button adds 91.7 KB initial JS
  • RSC Incompatible: Emotion uses React Context; all components must be Client Components
  • AI-Unfriendly: CSS-in-JS requires AI to track styles across separate runtime context
  • Material Design Lock-in: Opinionated aesthetic difficult to escape
  • Barrel Import Issues: Development performance degradation without path imports
  • Rejected: AI workflow friction; RSC incompatibility; design system lock-in

Option C: Chakra UI v3

How It Works:

  • Zero-runtime CSS-in-JS (migrated from runtime in v3)
  • Semantic tokens with automatic dark/light mode
  • Recipes system inspired by Panda CSS

Evaluation:

  • Bundle Size: ~50 KB gzipped (improved from v2)
  • v3 Breaking Changes: Major migration from v2; ecosystem still stabilizing
  • RSC: Components can be imported but hydrate as Client Components
  • next-themes Required: Dark mode moved from built-in to external
  • Rejected: Migration instability; smaller ecosystem than shadcn/ui

Option D: Ant Design v5

How It Works:

  • 60+ enterprise-focused components
  • Design tokens with @ant-design/cssinjs
  • ConfigProvider for theming and i18n

Evaluation:

  • Bundle Size: 126 KB+ for single component; ConfigProvider prevents tree-shaking
  • Enterprise Features: Pro components (ProTable, ProForm) available
  • Built-in i18n: 50+ locales out of the box
  • Opinionated Design: Strong Ant aesthetic difficult to customize
  • RSC Incompatible: CSS-in-JS architecture requires Client Components
  • Rejected: Massive bundle; limited customization; RSC incompatibility

Option E: Headless UI + Tailwind

How It Works:

  • 16 unstyled accessible components from Tailwind Labs
  • Style with Tailwind utility classes
  • Framework support for React and Vue

Evaluation:

  • Component Gap: Only 16 components vs Radix's 32+
  • Missing: Accordion, Context Menu, Toast, Slider, Tooltip, Progress
  • Less Advanced: Focus trapping and scroll locking less robust than Radix
  • Rejected: Insufficient component coverage; Radix superiority for accessibility

Implementation Details

Component Adoption

ComponentPurpose
Button, InputInitial form implementation
Card, Badge, Tooltip, AlertDashboard UI foundation
Dialog, Dropdown, TabsFilter and navigation
Scroll AreaHorizontal scroll UI
Sheet, CommandMobile navigation

Theming System

  • CSS variables defined in globals.css with OKLCH color space
  • Dark mode via next-themes with system detection
  • Type-safe variants using class-variance-authority (cva)

Radix UI Dependencies

Current primitives in use:

PackageComponent
@radix-ui/react-checkboxCheckbox
@radix-ui/react-dialogDialog, Sheet
@radix-ui/react-dropdown-menuDropdown Menu
@radix-ui/react-popoverPopover
@radix-ui/react-scroll-areaScroll Area
@radix-ui/react-tabsTabs
@radix-ui/react-toggleToggle
@radix-ui/react-tooltipTooltip

AI-Assisted Development Synergy

Why This Stack Is AI-Native

The combination of shadcn/ui + Tailwind CSS represents the emerging industry standard for AI-assisted development. This is the primary strategic reason for this technology choice.

Vercel v0 Validation

Vercel's flagship AI product v0 generates exclusively shadcn/ui + Tailwind code:

"v0 is trained on best practices for React, Tailwind and shadcn/ui. Every component v0 generates uses React, Next.js, Tailwind CSS, and shadcn/ui." — Vercel Official Blog

Teams using v0 report 3x faster design-to-implementation when their design systems are built on shadcn/ui.

Tailwind: "Ugly" for Humans, Perfect for AI

Traditional CSS requires AI to track relationships across multiple files:

Semantic CSS ChallengeTailwind SolutionAI Benefit
CSS cascade side effectsSelf-contained utilitiesNo unexpected inheritance
Separate file dependenciesInline declarationsComplete context in one file
Creative class naming neededStandard vocabularyConsistent generation
Hidden style relationshipsExplicit per-elementPredictable modifications

"TailwindCSS's utility-first philosophy is like a playground for AI. Instead of crafting intricate CSS rules from scratch, AI can tap into Tailwind's vast library of pre-defined classes." — DEV Community

"Tailwind serves as a really effective styling mechanism that AIs are actually really good at using." — Glide Blog

shadcn/ui: Designed for LLMs

From shadcn/ui's official design principles:

"AI-Ready: Open code for LLMs to read, understand, and improve." — shadcn.io

Why copy-paste works for AI:

  • Full Context Visibility: AI sees complete component source, not abstracted API
  • No Library Hallucination: No guessing props that don't exist
  • Unlimited Customization: AI can modify any line without library constraints
  • MCP Integration: Official shadcn MCP server provides real-time component specs to Claude, Cursor, VS Code

Comparison with CSS-in-JS for AI

ApproachAI Code GenerationContext Requirements
Tailwind CSSExcellent - inline, predictableSingle file
styled-componentsPoor - runtime context neededMultiple files + runtime
CSS ModulesModerate - separate filesCSS + JSX files

"CSS Modules are less AI-optimized in suggestions." — Superflex AI Blog

AI Productivity Metrics

Metricshadcn/ui + TailwindTraditional Libraries
Design-to-implementation3x faster with v0Baseline
AI suggestion accuracy95%+ for Tailwind60-70% for CSS-in-JS
Component customizationImmediate (code owned)Wrapper/override patterns
Context window efficiencySingle fileMulti-file tracking

Consequences

Positive

AI Development Productivity:

  • 3x faster design-to-implementation with AI tools (v0, Claude, Cursor)
  • Industry-standard stack for AI coding; extensive training data
  • AI can freely modify owned code without library API constraints
  • Tailwind's explicitness eliminates AI hallucination about hidden styles

Customization Freedom:

  • Full source code ownership; modify any component behavior
  • No waiting for library updates to fix issues
  • Tailwind utility classes for rapid style iteration
  • AI excels at Tailwind customization due to predictable class patterns

Bundle Efficiency:

  • 2.3 KB initial JS vs 80+ KB for MUI or 126 KB+ for Ant Design
  • Only used components are bundled; no library runtime
  • Faster First Contentful Paint (0.8s vs 1.6s with heavy libraries)

Accessibility by Default:

  • Radix UI handles ARIA attributes, focus management, keyboard navigation
  • WAI-ARIA compliant without accessibility expertise
  • Screen reader tested primitives

React 19 Alignment:

  • No deprecated forwardRef usage
  • data-slot attributes for styling hooks
  • Compatible with React Compiler optimization

Negative

Update Overhead:

  • Must manually copy updated components when upstream changes
  • No automatic security patches from npm update
  • Mitigation: Pin Radix versions; selective component updates; monitor shadcn/ui releases

Component Coverage:

  • Fewer pre-built complex components than Ant Design
  • May need to build custom components for advanced use cases
  • Mitigation: Extend with additional Radix primitives; community contributions

Team Learning:

  • Requires Tailwind CSS proficiency
  • Understanding of variant patterns with cva
  • Mitigation: Tailwind documentation; pair programming; component documentation

Bundle Size Comparison

LibraryInitial BundleNotes
shadcn/ui2.3 KBOnly copied components
Chakra UI v3~50 KBZero-runtime improvement
MUI v6~80-90 KBCore + Emotion
Ant Design v5126 KB+ConfigProvider blocks tree-shaking

Component Availability

Featureshadcn/uiMUIChakraAnt Design
Component Count40+50+30+60+
AccessibilityRadix (WCAG)WCAGWCAGWCAG
Dark Modenext-themesBuilt-innext-themesConfigProvider
i18nExternalExternalExternalBuilt-in
RSC CompatibleYesNoPartialNo

References

Internal

External

AI Development Resources

Open-source test coverage insights