<< All versions

Skill v1.0.1

currentAutomated scan100/100
madappgang/claude-code/shadcn-ui

3 files

──Details
PublishedSeptember 29, 2026 at 09:05 PM
Content Hashsha256:cda524334cf468a8...
Git SHA6097ad4643f2
Bump Typepatch
Compare with v1.0.0
──Files
Files (1 file, 26.5 KB)
SKILL.md26.5 KBactive
SKILL.md · 933 lines · 26.5 KB

version: "1.0.1" name: shadcn-ui description: Use when implementing UI components with shadcn/ui. Covers component installation, configuration with Vite/TanStack Router, CLI commands, and integration with Tailwind CSS. updated: 2026-01-20 keywords: shadcn, ui-components, tailwind, react, radix-ui, component-library


shadcn/ui Component Library

shadcn/ui is a collection of beautifully-designed, accessible components and a code distribution platform. It is built with TypeScript, Tailwind CSS, and Radix UI primitives. It supports multiple frameworks including Next.js, Vite, Remix, Astro, and more. Open Source. Open Code. AI-Ready. It also comes with a command-line tool to install and manage components and a registry system to publish and distribute code.

Key Principles

  • Open Code: Components are copied into your project, not installed as dependencies
  • Composition: Build complex UIs by composing simple components
  • Distribution: CLI and registry system for easy component management
  • Beautiful Defaults: Production-ready styling out of the box
  • AI-Ready: Designed to work well with AI assistants

Quick Reference

CLI Commands

bash
# Initialize shadcn/ui in your project
npx shadcn@latest init
# Add a component
npx shadcn@latest add button
# Add multiple components
npx shadcn@latest add button card dialog
# Add all components
npx shadcn@latest add --all
# Update components
npx shadcn@latest diff
# List available components
npx shadcn@latest add

Configuration (components.json)

json
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "tailwind.config.js",
"css": "src/index.css",
"baseColor": "neutral",
"cssVariables": true
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
}
}

Documentation Index

Overview

TopicURLDescription
Introductionhttps://ui.shadcn.com/docsCore principles and getting started
CLIhttps://ui.shadcn.com/docs/cliCommand-line tool reference
components.jsonhttps://ui.shadcn.com/docs/components-jsonConfiguration file documentation
Theminghttps://ui.shadcn.com/docs/themingColors, typography, design tokens
Changeloghttps://ui.shadcn.com/docs/changelogRelease notes and version history
Abouthttps://ui.shadcn.com/docs/aboutCredits and project information

Installation by Framework

FrameworkURLNotes
Vitehttps://ui.shadcn.com/docs/installation/viteRecommended for this plugin
TanStack Routerhttps://ui.shadcn.com/docs/installation/tanstack-routerWorks with TanStack ecosystem
TanStack Starthttps://ui.shadcn.com/docs/installation/tanstackFull-stack TanStack framework
Next.jshttps://ui.shadcn.com/docs/installation/nextApp Router and Pages Router
Remixhttps://ui.shadcn.com/docs/installation/remixRemix framework
Astrohttps://ui.shadcn.com/docs/installation/astroAstro framework
React Routerhttps://ui.shadcn.com/docs/installation/react-routerReact Router v7+
Laravelhttps://ui.shadcn.com/docs/installation/laravelLaravel Inertia
Gatsbyhttps://ui.shadcn.com/docs/installation/gatsbyGatsby framework
Manualhttps://ui.shadcn.com/docs/installation/manualWithout CLI

Installation Instructions

TanStack Router (Recommended)

The fastest way to get started with shadcn/ui and TanStack Router:

bash
# Create new project with shadcn/ui pre-configured
npx create-tsrouter-app@latest my-app --template file-router --tailwind --add-ons shadcn

Then add components:

bash
npx shadcn@latest add button

Usage in routes:

tsx
// src/routes/index.tsx
import { createFileRoute } from "@tanstack/react-router"
import { Button } from "@/components/ui/button"
export const Route = createFileRoute("/")({
component: App,
})
function App() {
return (
<div>
<Button>Click me</Button>
</div>
)
}

Vite Installation

Step 1: Create project

bash
npm create vite@latest
# Select: React + TypeScript

Step 2: Add Tailwind CSS

bash
npm install tailwindcss @tailwindcss/vite

Replace src/index.css:

css
@import "tailwindcss";

Step 3: Configure TypeScript paths

Edit tsconfig.json:

json
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
],
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

Edit tsconfig.app.json:

json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

Step 4: Configure Vite

bash
npm install -D @types/node

Edit vite.config.ts:

typescript
import path from "path"
import tailwindcss from "@tailwindcss/vite"
import react from "@vitejs/plugin-react"
import { defineConfig } from "vite"
export default defineConfig({
plugins: [react(), tailwindcss()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
})

Step 5: Initialize shadcn/ui

bash
npx shadcn@latest init
# Select: Neutral as base color

Step 6: Add components

bash
npx shadcn@latest add button

Usage:

tsx
// src/App.tsx
import { Button } from "@/components/ui/button"
function App() {
return (
<div className="flex min-h-svh flex-col items-center justify-center">
<Button>Click me</Button>
</div>
)
}
export default App

Manual Installation (Without CLI)

Step 1: Add Tailwind CSS

Follow the Tailwind CSS installation guide.

Step 2: Add dependencies

bash
npm install class-variance-authority clsx tailwind-merge lucide-react tw-animate-css

Step 3: Configure path aliases

In tsconfig.json:

json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./*"]
}
}
}

Step 4: Configure styles

Create src/styles/globals.css:

css
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--radius: 0.625rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.145 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.145 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.985 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.637 0.237 25.331);
--border: oklch(0.269 0 0);
--input: oklch(0.269 0 0);
--ring: oklch(0.439 0 0);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(0.269 0 0);
--sidebar-ring: oklch(0.439 0 0);
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}

Step 5: Add cn() helper

Create lib/utils.ts:

typescript
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}

Step 6: Create components.json

json
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/styles/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

Step 7: Add components

bash
npx shadcn@latest add button

Components Reference

Form & Input Components

ComponentURLDescription
Formhttps://ui.shadcn.com/docs/components/formReact Hook Form + Zod validation
Fieldhttps://ui.shadcn.com/docs/components/fieldForm field with label and error
Buttonhttps://ui.shadcn.com/docs/components/buttonMultiple variants (default, destructive, outline, secondary, ghost, link)
Button Grouphttps://ui.shadcn.com/docs/components/button-groupGroup multiple buttons
Inputhttps://ui.shadcn.com/docs/components/inputText input
Input Grouphttps://ui.shadcn.com/docs/components/input-groupInput with prefix/suffix
Input OTPhttps://ui.shadcn.com/docs/components/input-otpOne-time password input
Textareahttps://ui.shadcn.com/docs/components/textareaMulti-line text input
Checkboxhttps://ui.shadcn.com/docs/components/checkboxCheckbox input
Radio Grouphttps://ui.shadcn.com/docs/components/radio-groupRadio button group
Selecthttps://ui.shadcn.com/docs/components/selectSelect dropdown
Switchhttps://ui.shadcn.com/docs/components/switchToggle switch
Sliderhttps://ui.shadcn.com/docs/components/sliderSlider input
Calendarhttps://ui.shadcn.com/docs/components/calendarDate selection
Date Pickerhttps://ui.shadcn.com/docs/components/date-pickerInput + calendar
Comboboxhttps://ui.shadcn.com/docs/components/comboboxSearchable select with autocomplete
Labelhttps://ui.shadcn.com/docs/components/labelForm label

Layout & Navigation Components

ComponentURLDescription
Accordionhttps://ui.shadcn.com/docs/components/accordionCollapsible sections
Breadcrumbhttps://ui.shadcn.com/docs/components/breadcrumbNavigation breadcrumbs
Navigation Menuhttps://ui.shadcn.com/docs/components/navigation-menuAccessible nav with dropdowns
Sidebarhttps://ui.shadcn.com/docs/components/sidebarCollapsible app sidebar
Tabshttps://ui.shadcn.com/docs/components/tabsTabbed interface
Separatorhttps://ui.shadcn.com/docs/components/separatorVisual divider
Scroll Areahttps://ui.shadcn.com/docs/components/scroll-areaCustom scrollable area
Resizablehttps://ui.shadcn.com/docs/components/resizableResizable panel layout

Overlay & Dialog Components

ComponentURLDescription
Dialoghttps://ui.shadcn.com/docs/components/dialogModal dialog
Alert Dialoghttps://ui.shadcn.com/docs/components/alert-dialogConfirmation prompts
Sheethttps://ui.shadcn.com/docs/components/sheetSlide-out panel (drawer)
Drawerhttps://ui.shadcn.com/docs/components/drawerMobile-friendly drawer (Vaul)
Popoverhttps://ui.shadcn.com/docs/components/popoverFloating popover
Tooltiphttps://ui.shadcn.com/docs/components/tooltipAdditional context on hover
Hover Cardhttps://ui.shadcn.com/docs/components/hover-cardCard on hover
Context Menuhttps://ui.shadcn.com/docs/components/context-menuRight-click menu
Dropdown Menuhttps://ui.shadcn.com/docs/components/dropdown-menuDropdown menu
Menubarhttps://ui.shadcn.com/docs/components/menubarHorizontal menubar
Commandhttps://ui.shadcn.com/docs/components/commandCommand palette (cmdk)

Feedback & Status Components

ComponentURLDescription
Alerthttps://ui.shadcn.com/docs/components/alertMessages and notifications
Toasthttps://ui.shadcn.com/docs/components/toastToast notifications (Sonner)
Progresshttps://ui.shadcn.com/docs/components/progressProgress bar
Spinnerhttps://ui.shadcn.com/docs/components/spinnerLoading spinner
Skeletonhttps://ui.shadcn.com/docs/components/skeletonLoading placeholder
Badgehttps://ui.shadcn.com/docs/components/badgeLabels and status indicators
Emptyhttps://ui.shadcn.com/docs/components/emptyEmpty state

Display & Media Components

ComponentURLDescription
Avatarhttps://ui.shadcn.com/docs/components/avatarUser profile images
Cardhttps://ui.shadcn.com/docs/components/cardCard container
Tablehttps://ui.shadcn.com/docs/components/tableData display table
Data Tablehttps://ui.shadcn.com/docs/components/data-tableAdvanced table with TanStack Table
Charthttps://ui.shadcn.com/docs/components/chartCharts (Recharts)
Carouselhttps://ui.shadcn.com/docs/components/carouselCarousel (Embla)
Aspect Ratiohttps://ui.shadcn.com/docs/components/aspect-ratioMaintains aspect ratio
Typographyhttps://ui.shadcn.com/docs/components/typographyTypography styles
Itemhttps://ui.shadcn.com/docs/components/itemGeneric list item
Kbdhttps://ui.shadcn.com/docs/components/kbdKeyboard shortcut display

Miscellaneous Components

ComponentURLDescription
Collapsiblehttps://ui.shadcn.com/docs/components/collapsibleCollapsible container
Togglehttps://ui.shadcn.com/docs/components/toggleToggle button
Toggle Grouphttps://ui.shadcn.com/docs/components/toggle-groupGroup of toggles
Paginationhttps://ui.shadcn.com/docs/components/paginationPagination controls

Dark Mode Setup

FrameworkURL
Overviewhttps://ui.shadcn.com/docs/dark-mode
Vitehttps://ui.shadcn.com/docs/dark-mode/vite
Next.jshttps://ui.shadcn.com/docs/dark-mode/next
Astrohttps://ui.shadcn.com/docs/dark-mode/astro
Remixhttps://ui.shadcn.com/docs/dark-mode/remix

Forms Integration

TopicURLDescription
Overviewhttps://ui.shadcn.com/docs/formsForms guide
React Hook Formhttps://ui.shadcn.com/docs/forms/react-hook-formRecommended for this plugin
TanStack Formhttps://ui.shadcn.com/docs/forms/tanstack-formAlternative form library
Next.js Server Actionshttps://ui.shadcn.com/docs/forms/nextServer-side forms

Advanced Topics

TopicURLDescription
Monorepohttps://ui.shadcn.com/docs/monorepoMonorepo setup
React 19https://ui.shadcn.com/docs/react-19React 19 support
Tailwind CSS v4https://ui.shadcn.com/docs/tailwind-v4Tailwind v4 setup
JavaScripthttps://ui.shadcn.com/docs/javascriptNon-TypeScript usage
Figmahttps://ui.shadcn.com/docs/figmaDesign resources
v0https://ui.shadcn.com/docs/v0AI UI generation

MCP Server Integration

shadcn/ui provides an MCP (Model Context Protocol) server for AI integrations:

URL: https://ui.shadcn.com/docs/mcp

Features:

  • Browse components from registries
  • Search components by name or description
  • Install components using natural language
  • Works with Claude Code, Cursor, VS Code, Codex

Setup for Claude Code:

json
{
"mcpServers": {
"shadcn": {
"command": "npx",
"args": ["-y", "shadcn@canary", "mcp"]
}
}
}

Registry System

TopicURLDescription
Overviewhttps://ui.shadcn.com/docs/registryCreating registries
Getting Startedhttps://ui.shadcn.com/docs/registry/getting-startedSetup guide
Exampleshttps://ui.shadcn.com/docs/registry/examplesExample registries
FAQhttps://ui.shadcn.com/docs/registry/faqCommon questions
Authenticationhttps://ui.shadcn.com/docs/registry/authenticationAuth for registries
Registry MCPhttps://ui.shadcn.com/docs/registry/mcpMCP integration

Registry Schemas

SchemaURL
Registry Indexhttps://ui.shadcn.com/schema/registry.json
Registry Itemhttps://ui.shadcn.com/schema/registry-item.json

Common Patterns

Installing Components for a Feature

bash
# Authentication flow
npx shadcn@latest add button input form label card
# Dashboard layout
npx shadcn@latest add sidebar navigation-menu breadcrumb avatar dropdown-menu
# Data display
npx shadcn@latest add table data-table pagination skeleton
# Forms
npx shadcn@latest add form field input select checkbox radio-group switch calendar date-picker combobox
# Feedback
npx shadcn@latest add alert toast dialog alert-dialog

File Structure After Installation

src/
├── components/
│ └── ui/
│ ├── button.tsx
│ ├── card.tsx
│ ├── dialog.tsx
│ └── ...
├── lib/
│ └── utils.ts # cn() utility function
└── index.css # Tailwind + CSS variables

The cn() Utility

typescript
// lib/utils.ts
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
// Usage
<Button className={cn("w-full", isLoading && "opacity-50")} />

Button Variants

tsx
<Button variant="default">Default</Button>
<Button variant="destructive">Destructive</Button>
<Button variant="outline">Outline</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="link">Link</Button>
<Button size="default">Default</Button>
<Button size="sm">Small</Button>
<Button size="lg">Large</Button>
<Button size="icon"><IconName /></Button>

Form with React Hook Form + Zod

tsx
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import * as z from "zod"
import { Button } from "@/components/ui/button"
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"
import { Input } from "@/components/ui/input"
const formSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
})
export function LoginForm() {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: { email: "", password: "" },
})
function onSubmit(values: z.infer<typeof formSchema>) {
console.log(values)
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input placeholder="email@example.com" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<FormLabel>Password</FormLabel>
<FormControl>
<Input type="password" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Submit</Button>
</form>
</Form>
)
}

Data Table with TanStack Table

tsx
import { DataTable } from "@/components/ui/data-table"
import { ColumnDef } from "@tanstack/react-table"
type User = {
id: string
name: string
email: string
}
const columns: ColumnDef<User>[] = [
{ accessorKey: "name", header: "Name" },
{ accessorKey: "email", header: "Email" },
]
export function UsersTable({ data }: { data: User[] }) {
return <DataTable columns={columns} data={data} />
}

Theming

CSS Variables

css
/* index.css */
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 0 0% 3.9%;
--card: 0 0% 100%;
--card-foreground: 0 0% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 0 0% 3.9%;
--primary: 0 0% 9%;
--primary-foreground: 0 0% 98%;
--secondary: 0 0% 96.1%;
--secondary-foreground: 0 0% 9%;
--muted: 0 0% 96.1%;
--muted-foreground: 0 0% 45.1%;
--accent: 0 0% 96.1%;
--accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 89.8%;
--input: 0 0% 89.8%;
--ring: 0 0% 3.9%;
--radius: 0.5rem;
}
.dark {
--background: 0 0% 3.9%;
--foreground: 0 0% 98%;
/* ... dark mode values */
}
}

Using Theme Colors

tsx
// In components
<div className="bg-background text-foreground" />
<div className="bg-primary text-primary-foreground" />
<div className="bg-secondary text-secondary-foreground" />
<div className="bg-muted text-muted-foreground" />
<div className="bg-accent text-accent-foreground" />
<div className="bg-destructive text-destructive-foreground" />
<div className="border-border" />
<div className="ring-ring" />

Best Practices

1. Component Organization

src/components/
├── ui/ # shadcn/ui components (don't modify directly)
│ ├── button.tsx
│ └── ...
├── forms/ # Form-specific compositions
│ ├── login-form.tsx
│ └── ...
├── layout/ # Layout components
│ ├── header.tsx
│ └── sidebar.tsx
└── features/ # Feature-specific components
└── dashboard/

2. Extending Components

tsx
// components/ui/button.tsx is the base
// Create variants in your own components:
import { Button } from "@/components/ui/button"
export function LoadingButton({ loading, children, ...props }) {
return (
<Button disabled={loading} {...props}>
{loading ? <Spinner className="mr-2" /> : null}
{children}
</Button>
)
}

3. Consistent Spacing

tsx
// Use Tailwind's spacing scale
<div className="space-y-4"> {/* 1rem gap */}
<Card className="p-6"> {/* 1.5rem padding */}
<CardHeader className="pb-4"> {/* 1rem bottom padding */}
<CardContent className="pt-0">
</Card>
</div>

4. Responsive Design

tsx
<Dialog>
<DialogContent className="sm:max-w-[425px]">
{/* Mobile: full width, Desktop: max 425px */}
</DialogContent>
</Dialog>
<Sheet side="left" className="w-[300px] sm:w-[400px]">
{/* Responsive sidebar width */}
</Sheet>

Integration with This Plugin

This skill complements other frontend plugin skills:

  • react-patterns: React 19 patterns work with shadcn/ui components
  • tanstack-router: Type-safe routing with shadcn/ui layouts
  • tanstack-query: Data fetching for Data Tables and forms
  • api-integration: API types for form validation schemas
  • tooling-setup: Vite + Tailwind setup for shadcn/ui

Recommended Installation Order

  1. Set up Vite + React + TypeScript + Tailwind (tooling-setup skill)
  2. Initialize shadcn/ui: npx shadcn@latest init
  3. Install base components: npx shadcn@latest add button card
  4. Set up TanStack Router (tanstack-router skill)
  5. Add form components as needed

Troubleshooting

Common Issues

"Cannot find module '@/components/ui/button'"

  • Check tsconfig.json paths alias matches components.json aliases

Components look unstyled

  • Ensure Tailwind CSS is properly configured
  • Check that index.css imports are correct
  • Verify CSS variables are defined in :root

Dark mode not working

  • Add dark class to <html> element
  • Use a theme provider (next-themes for Next.js)

TypeScript errors with form components

  • Install @hookform/resolvers and zod
  • Ensure react-hook-form is installed
← v1.0.0All versions