# shadcn-skills > Installation, components, blocks, forms, theming, and MCP guidance for shadcn/ui in modern Next.js projects using pnpm - Author: gocallum - Repository: gocallum/nextjs16-agent-skills - Version: 20260122002750 - Stars: 15 - Forks: 0 - Last Updated: 2026-02-07 - Source: https://github.com/gocallum/nextjs16-agent-skills - Web: https://mule.run/skillshub/@@gocallum/nextjs16-agent-skills~shadcn-skills:20260122002750 --- --- title: "shadcn/ui Skills for Next.js 16" description: "Installation, components, blocks, forms, theming, and MCP guidance for shadcn/ui in modern Next.js projects using pnpm" keywords: ["shadcn", "ui", "Next.js", "pnpm", "blocks", "sonner", "forms", "dark-mode", "mcp"] --- # shadcn/ui Skills **Status:** Next.js 16 ready **Package Manager:** pnpm (required) **Official Docs:** - [Installation (Next.js)](https://ui.shadcn.com/docs/installation/next) - [Components](https://ui.shadcn.com/docs/components) - [Blocks](https://ui.shadcn.com/blocks) - [Sonner (toast replacement)](https://ui.shadcn.com/docs/components/sonner) - [Forms](https://ui.shadcn.com/docs/components/form) - [Dark Mode (Next.js)](https://ui.shadcn.com/docs/dark-mode/next) - [MCP Server](https://ui.shadcn.com/docs/mcp) - [LLM Guidelines](https://ui.shadcn.com/llms.txt) --- ## Table of Contents 1. [Installation & Setup](#installation--setup) 2. [Project Configuration (Next.js 16)](#project-configuration-nextjs-16) 3. [Components & Usage](#components--usage) 4. [Blocks](#blocks) 5. [Forms](#forms) 6. [Sonner (Toast Replacement)](#sonner-toast-replacement) 7. [Dark Mode](#dark-mode) 8. [MCP Integration](#mcp-integration) 9. [Best Practices](#best-practices) --- ## Installation & Setup - Use pnpm for all commands. - Scaffold shadcn/ui in an existing Next.js 16 app: ```bash pnpm dlx shadcn@latest init ``` - Accept prompts for **Next.js** + **TypeScript**. - CLI creates `components.json` and installs required deps (Tailwind, class utilities). - Add components when needed (keeps bundle small): ```bash pnpm dlx shadcn@latest add button card input textarea select # add blocks or utilities on demand ``` - After adding components, run: ```bash pnpm lint && pnpm test # if configured pnpm dev # verify styles render ``` --- ## Project Configuration (Next.js 16) - Tailwind is required. Ensure `tailwind.config.(ts|js)` includes shadcn paths: ```ts // tailwind.config.ts import type { Config } from "tailwindcss" import { fontFamily } from "tailwindcss/defaultTheme" const config: Config = { darkMode: ["class"], content: [ "./app/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}", ], theme: { extend: { fontFamily: { sans: ["var(--font-sans)", ...fontFamily.sans], }, }, }, plugins: [require("tailwindcss-animate")], } export default config ``` - Use App Router and Server Components by default; mark client files with `"use client"`. - Keep `globals.css` with CSS variables from shadcn init; do not remove the color tokens. --- ## Components & Usage - Components live in `components/ui`. Import directly: ```tsx import { Button } from "@/components/ui/button" export function CTA() { return } ``` - Many components support `asChild` to compose with links: ```tsx ``` - Keep icons in `components/ui/icons` or use `lucide-react` (installed during init). - Reference component docs for props and accessibility expectations. --- ## Blocks - Blocks are higher-level page sections from [ui.shadcn.com/blocks](https://ui.shadcn.com/blocks). - Add a block via CLI (preferred to avoid copy/paste drift): ```bash pnpm dlx shadcn@latest add blocks/application-shells/sidebar-02 ``` - Blocks follow the same theming and Tailwind tokens as core components; adjust spacing/tokens instead of rewriting styles. - Keep blocks in `components/blocks/*` to avoid mixing with low-level UI primitives. --- ## Forms - Use the provided Form primitives with `react-hook-form` + `@hookform/resolvers/zod`: ```tsx "use client" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { 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 schema = z.object({ email: z.string().email(), name: z.string().min(2), }) export function ProfileForm() { const form = useForm>({ resolver: zodResolver(schema), defaultValues: { email: "", name: "" }, }) return (
( Email )} /> ) } ``` - Keep validation schemas colocated; surface errors via `FormMessage`. --- ## Sonner (Toast Replacement) - `toast` is **deprecated**; use Sonner. - Add the Sonner component via CLI: ```bash pnpm dlx shadcn@latest add sonner ``` - Mount once in your root layout or top-level provider: ```tsx import { Toaster } from "@/components/ui/sonner" import { toast } from "sonner" export function RootProviders({ children }: { children: React.ReactNode }) { return ( <> {children} ) } // usage toast.success("Profile saved") ``` - Keep Sonner provider outside `app/(marketing)` vs `app/(dashboard)` duplication to avoid multiple toasters. --- ## Dark Mode - Use class-based theming with `next-themes`. - Example provider (`components/theme-provider.tsx`): ```tsx "use client" import { ThemeProvider as NextThemesProvider } from "next-themes" export function ThemeProvider({ children }: { children: React.ReactNode }) { return ( {children} ) } ``` - Wrap the App Router layout: ```tsx // app/layout.tsx import { ThemeProvider } from "@/components/theme-provider" export default function RootLayout({ children }: { children: React.ReactNode }) { return ( {children} ) } ``` - Keep `suppressHydrationWarning` on `` to avoid mismatches when switching themes. --- ## MCP Integration - shadcn/ui ships an MCP server (see [docs](https://ui.shadcn.com/docs/mcp)) so agents can browse/add components and blocks safely. - Register the server in your MCP client config, pointing at your project root where `components.json` lives. - Prefer MCP-driven adds over manual copy/paste to keep component versions consistent with the catalog. --- ## Best Practices 1. **Stay modular:** Add only the components/blocks you need; trim unused files to keep bundles small. 2. **Respect tokens:** Do not hardcode colors; use the CSS variables set up by init. 3. **Accessibility:** Keep aria labels, roles, and keyboard interactions from the upstream examples. 4. **Typography:** Use CSS variables + `next/font` to load fonts; wire them into `--font-sans` in `globals.css`. 5. **LLM usage:** Follow [llms.txt](https://ui.shadcn.com/llms.txt) when generating code; prefer pnpm commands and Sonner over legacy toast.