원클릭으로
shadcn-components
// Add and use shadcn/ui components. Use when building UI, adding new components, or styling pages with shadcn.
// Add and use shadcn/ui components. Use when building UI, adding new components, or styling pages with shadcn.
Generate TypeScript API client from Swagger/Go comments. Use when updating API endpoints, adding new routes, or regenerating the frontend API client after backend changes.
Manage database migrations and Better Auth schema. Use when adding tables, modifying schema, running migrations, or resetting the database.
Generate full-stack features. Backend = hand-written bounded-context aggregates (DDD); frontend = FSD slices with HydrationBoundary. Use when creating new features, adding CRUD operations, or scaffolding new pages.
Access local technical documentation before searching the internet. Use FIRST when researching any tech stack question.
Create and manage authentication pages with server-side session handling. Use when adding login, register, or protected pages WITHOUT flicker/skeleton.
Server-Side + Client-Side Data Fetching with Orval + TanStack Query HydrationBoundary Pattern. ALWAYS use Orval - NEVER manual fetch()!
| name | shadcn-components |
| description | Add and use shadcn/ui components. Use when building UI, adding new components, or styling pages with shadcn. |
| allowed-tools | Read, Edit, Write, Bash, Glob |
This project uses shadcn/ui with the neutral theme and all components pre-installed.
All components are in frontend/src/shared/ui/:
card - Card container with header, content, footerseparator - Visual divideraspect-ratio - Maintain aspect ratiosscroll-area - Custom scrollbarsresizable - Resizable panelsbutton - Buttons with variantsinput - Text inputtextarea - Multi-line inputlabel - Form labelscheckbox - Checkboxesradio-group - Radio buttonsselect - Dropdown selectswitch - Toggle switchslider - Range sliderform - Form with validationinput-otp - OTP inputalert - Alert messagesalert-dialog - Confirmation dialogsdialog - Modal dialogsdrawer - Slide-out drawersheet - Side sheetsonner - Toast notificationsprogress - Progress barskeleton - Loading skeletonspinner - Loading spinnertabs - Tab navigationnavigation-menu - Main navigationmenubar - Menu barbreadcrumb - Breadcrumb navpagination - Page navigationsidebar - App sidebartable - Data tablesavatar - User avatarsbadge - Status badgescalendar - Date picker calendarchart - Charts (recharts)carousel - Image carouseldropdown-menu - Dropdown menuscontext-menu - Right-click menupopover - Popoverstooltip - Tooltipshover-card - Hover cardscommand - Command paletteaccordion - Collapsible sectionscollapsible - Toggle contenttoggle - Toggle buttontoggle-group - Button groupimport { Button } from "@shared/ui/button"
<Button>Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="destructive">Destructive</Button>
<Button variant="link">Link</Button>
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "@shared/ui/card"
<Card>
<CardHeader>
<CardTitle>Title</CardTitle>
<CardDescription>Description</CardDescription>
</CardHeader>
<CardContent>
Content here
</CardContent>
<CardFooter>
<Button>Action</Button>
</CardFooter>
</Card>
import { Input } from "@shared/ui/input"
import { Label } from "@shared/ui/label"
<div className="space-y-2">
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" placeholder="name@example.com" />
</div>
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@shared/ui/dialog"
<Dialog>
<DialogTrigger asChild>
<Button>Open Dialog</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Dialog Title</DialogTitle>
<DialogDescription>Dialog description here.</DialogDescription>
</DialogHeader>
<p>Dialog content</p>
</DialogContent>
</Dialog>
import { toast } from "sonner"
toast.success("Success message")
toast.error("Error message")
toast.info("Info message")
Components automatically support dark mode via ThemeProvider.
Use ModeToggle from Header Widget:
import { Header } from "@widgets/header"
// ModeToggle is integrated in the Header
<Header user={session.user} />
If a component is missing (unlikely, all are installed):
bunx shadcn@latest add [component-name]
Components use Tailwind CSS classes. Customize with className:
<Button className="w-full mt-4">Full Width Button</Button>
Use cn() utility for conditional classes:
import { cn } from "@shared/lib"
<div className={cn("p-4", isActive && "bg-primary")}>