shadcn/ui for Next.js App Router - Field components, TanStack Form integration, Server/Client Components. Use when building UI with shadcn in Next.js.
View on GitHubfusengine/agents
fuse-nextjs
plugins/nextjs-expert/skills/nextjs-shadcn/SKILL.md
January 22, 2026
Select agents to install to:
npx add-skill https://github.com/fusengine/agents/blob/main/plugins/nextjs-expert/skills/nextjs-shadcn/SKILL.md -a claude-code --skill nextjs-shadcnInstallation paths:
.claude/skills/nextjs-shadcn/# shadcn/ui for Next.js
Beautiful, accessible components with TanStack Form integration.
## Installation
```bash
bunx --bun shadcn@latest init
```
### Configuration (Tailwind CSS v4)
```json
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "app/globals.css",
"baseColor": "gray",
"cssVariables": true,
"prefix": ""
},
"iconLibrary": "lucide",
"aliases": {
"components": "@/modules/cores/shadcn/components",
"utils": "@/modules/cores/lib/utils",
"ui": "@/modules/cores/shadcn/components/ui",
"lib": "@/modules/cores/lib",
"hooks": "@/modules/cores/hooks"
}
}
```
**Note:** For Tailwind CSS v4, the `config` field must be empty.
---
## Adding Components
```bash
bunx --bun shadcn@latest add button card field input
```
---
## Form with TanStack Form
```typescript
// components/ProfileForm.tsx
'use client'
import { useForm } from '@tanstack/react-form'
import { toast } from 'sonner'
import { z } from 'zod'
import { Button } from '@/modules/cores/shadcn/components/ui/button'
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from '@/modules/cores/shadcn/components/ui/card'
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from '@/modules/cores/shadcn/components/ui/field'
import { Input } from '@/modules/cores/shadcn/components/ui/input'
const formSchema = z.object({
username: z
.string()
.min(3, 'Username must be at least 3 characters.')
.max(10, 'Username must be at most 10 characters.')
.regex(/^[a-zA-Z0-9_]+$/, 'Letters, numbers, underscores only.'),
})
export function ProfileForm() {
const form = useForm({
defaultValues: { username: '' },
validators: { onSubmit: formSchema },
onSubmit: async ({ value }) => {
toast('Saved!', { description: JSON.stringify(value) })
},
})
return (
<Card className="w-fu