Skip to content
Back to skills

1389 Shadcn 97864de1

ASecurity

| No | Category | Guideline | Description | Do | Don't | Code Good | Code Bad | Severity | Docs URL | |----|------------|-...

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
designgoreactperformance

Works with

  • cli

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 1389-shadcn_97864de1 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1389 Shadcn 97864de1?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1389 Shadcn 97864de1
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1389-shadcn-97864de1/badge)](https://www.skillsdirectory.com/skills/tools-only-1389-shadcn-97864de1)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
---
trigger: always_on
---

| No | Category   | Guideline                        | Description                                      | Do                                                                 | Don't                                                        | Code Good                                                                 | Code Bad                                                                 | Severity   | Docs URL                                                                 |
|----|------------|----------------------------------|--------------------------------------------------|--------------------------------------------------------------------|--------------------------------------------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------|------------|-------------------------------------------------------------------------|
| 1  | Setup      | Use CLI for installation         | Install components via shadcn CLI for proper setup | npx shadcn@latest add component-name                              | Manual copy-paste from docs                                 | npx shadcn@latest add button                                              | Copy component code manually                                              | High       | [shadcn CLI](https://ui.shadcn.com/docs/cli)                            |
| 2  | Setup      | Initialize project properly      | Run init command to set up components.json and globals.css | npx shadcn@latest init before adding components                   | Skip init and add components directly                         | npx shadcn@latest init                                                    | npx shadcn@latest add button (without init)                               | High       | [shadcn Installation](https://ui.shadcn.com/docs/installation)          |
| 3  | Setup      | Configure path aliases           | Set up proper import aliases in tsconfig and components.json | Use @/components/ui path aliases                                  | Relative imports like ../../components                        | import { Button } from "@/components/ui/button"                           | import { Button } from "../../components/ui/button"                       | Medium     | [shadcn Installation](https://ui.shadcn.com/docs/installation)          |
| 4  | Theming    | Use CSS variables for colors     | Define colors as CSS variables in globals.css for theming | CSS variables in :root and .dark                                  | Hardcoded color values in components                         | bg-primary text-primary-foreground                                        | bg-blue-500 text-white                                                   | High       | [shadcn Theming](https://ui.shadcn.com/docs/theming)                    |
| 5  | Theming    | Follow naming convention         | Use semantic color names with foreground pattern | primary/primary-foreground secondary/secondary-foreground         | Generic color names                                         | --primary --primary-foreground                                            | --blue --light-blue                                                      | Medium     | [shadcn Theming](https://ui.shadcn.com/docs/theming)                    |
| 6  | Theming    | Support dark mode                | Include .dark class styles for all custom CSS | Define both :root and .dark color schemes                         | Only light mode colors                                      | .dark { --background: 240 10% 3.9%; }                                     | No .dark class styles                                                     | High       | [shadcn Dark Mode](https://ui.shadcn.com/docs/dark-mode)                |
| 7  | Components | Use component variants           | Leverage cva variants for consistent styling | Use variant prop for different styles                             | Inline conditional classes                                   | <Button variant="destructive">                                            | <Button className={isError ? "bg-red-500" : "bg-blue-500"}>                | Medium     | [shadcn Button](https://ui.shadcn.com/docs/components/button)           |
| 8  | Components | Compose with className           | Add custom classes via className prop for overrides | Extend with className for one-off customizations                  | Modify component source directly                            | <Button className="w-full">                                               | Edit button.tsx to add w-full                                             | Medium     | [shadcn Button](https://ui.shadcn.com/docs/components/button)           |
| 9  | Components | Use size variants consistently   | Apply size prop for consistent sizing across components | size="sm" size="lg" for sizing                                     | Mix size classes inconsistently                              | <Button size="lg">                                                       | <Button className="text-lg px-8 py-4">                                     | Medium     | [shadcn Button](https://ui.shadcn.com/docs/components/button)           |
| 10 | Components | Prefer compound components       | Use provided sub-components for complex UI | Card + CardHeader + CardContent pattern                           | Single component with many props                             | <Card><CardHeader><CardTitle>                                             | <Card title="x" content="y" footer="z">                                   | Medium     | [shadcn Card](https://ui.shadcn.com/docs/components/card)               |
| 11 | Dialog     | Use Dialog for modal content     | Dialog component for overlay modal windows | Dialog for confirmations forms details                            | Alert for modal content                                      | <Dialog><DialogContent>                                                   | <Alert> styled as modal                                                   | High       | [shadcn Dialog](https://ui.shadcn.com/docs/components/dialog)           |
| 12 | Dialog     | Handle dialog state properly     | Use open and onOpenChange for controlled dialogs | Controlled state with useState                                    | Uncontrolled with default open only                          | <Dialog open={open} onOpenChange={setOpen}>                               | <Dialog defaultOpen={true}>                                               | Medium     | [shadcn Dialog](https://ui.shadcn.com/docs/components/dialog)           |
| 13 | Dialog     | Include proper dialog structure  | Use DialogHeader DialogTitle DialogDescription | Complete semantic structure                                       | Missing title or description                                 | <DialogHeader><DialogTitle><DialogDescription>                            | <DialogContent><p>Content</p></DialogContent>                             | High       | [shadcn Dialog](https://ui.shadcn.com/docs/components/dialog)           |
| 14 | Sheet      | Use Sheet for side panels        | Sheet component for slide-out panels and drawers | Sheet for navigation filters settings                             | Dialog for side content                                      | <Sheet side="right">                                                      | <Dialog> with slide animation                                              | Medium     | [shadcn Sheet](https://ui.shadcn.com/docs/components/sheet)             |
| 15 | Sheet      | Specify sheet side               | Set side prop for sheet slide direction | Explicit side="left" or side="right"                               | Default side without consideration                           | <Sheet><SheetContent side="left">                                         | <Sheet><SheetContent>                                                     | Low        | [shadcn Sheet](https://ui.shadcn.com/docs/components/sheet)             |
| 16 | Form       | Use Form with react-hook-form    | Integrate Form component with react-hook-form for validation | useForm + Form + FormField pattern                                 | Custom form handling without Form                            | <Form {...form}><FormField control={form.control}>                         | <form onSubmit={handleSubmit}>                                            | High       | [shadcn Form](https://ui.shadcn.com/docs/components/form)               |
| 17 | Form       | Use FormField for inputs         | Wrap inputs in FormField for proper labeling and errors | FormField + FormItem + FormLabel + FormControl                    | Input without FormField wrapper                              | <FormField><FormItem><FormLabel><FormControl><Input>                      | <Input onChange={...}>                                                    | High       | [shadcn Form](https://ui.shadcn.com/docs/components/form)               |
| 18 | Form       | Display form messages            | Use FormMessage for validation error display | FormMessage after FormControl                                      | Custom error text without FormMessage                        | <FormControl><Input/></FormControl><FormMessage/>                         | <Input/>{error && <span>{error}</span>}                                   | Medium     | [shadcn Form](https://ui.shadcn.com/docs/components/form)               |
| 19 | Form       | Use Zod for validation           | Define form schema with Zod for type-safe validation | zodResolver with form schema                                       | Manual validation logic                                      | zodResolver(formSchema)                                                   | validate: (values) => { if (!values.email) }                              | Medium     | [shadcn Form](https://ui.shadcn.com/docs/components/form)               |
| 20 | Select     | Use Select for dropdowns         | Select component for option selection | Select for choosing from list                                     | Native select element                                        | <Select><SelectTrigger><SelectContent>                                    | <select><option>                                                          | Medium     | [shadcn Select](https://ui.shadcn.com/docs/components/select)           |
| 21 | Select     | Structure Select properly        | Include Trigger Value Content and Items | Complete Select structure                                         | Missing SelectValue or SelectContent                         | <SelectTrigger><SelectValue/></SelectTrigger><SelectContent><SelectItem>  | <Select><option>                                                          | High       | [shadcn Select](https://ui.shadcn.com/docs/components/select)           |
| 22 | Command    | Use Command for search           | Command component for searchable lists and palettes | Command for command palette search                                | Input with custom dropdown                                   | <Command><CommandInput><CommandList>                                      | <Input><div className="dropdown">                                         | Medium     | [shadcn Command](https://ui.shadcn.com/docs/components/command)         |
| 23 | Command    | Group command items              | Use CommandGroup for categorized items | CommandGroup with heading for sections                            | Flat list without grouping                                   | <CommandGroup heading="Suggestions"><CommandItem>                         | <CommandItem> without groups                                              | Low        | [shadcn Command](https://ui.shadcn.com/docs/components/command)         |
| 24 | Table      | Use Table for data display       | Table component for structured data | Table for tabular data display                                    | Div grid for table-like layouts                              | <Table><TableHeader><TableBody><TableRow>                                 | <div className="grid">                                                    | Medium     | [shadcn Table](https://ui.shadcn.com/docs/components/table)             |
| 25 | Table      | Include proper table structure   | Use TableHeader TableBody TableRow TableCell | Semantic table structure                                          | Missing thead or tbody                                       | <TableHeader><TableRow><TableHead>                                        | <Table><TableRow> without header                                          | High       | [shadcn Table](https://ui.shadcn.com/docs/components/table)             |
| 26 | DataTable  | Use DataTable for complex tables | Combine Table with TanStack Table for features | DataTable pattern for sorting filtering pagination                 | Custom table implementation                                  | useReactTable + Table components                                          | Custom sort filter pagination logic                                       | Medium     | [shadcn DataTable](https://ui.shadcn.com/docs/components/data-table)    |
| 27 | Tabs       | Use Tabs for content switching   | Tabs component for tabbed interfaces | Tabs for related content sections                                 | Custom tab implementation                                    | <Tabs><TabsList><TabsTrigger><TabsContent>                                | <div onClick={() => setTab(...)}                                          | Medium     | [shadcn Tabs](https://ui.shadcn.com/docs/components/tabs)               |
| 28 | Tabs       | Set default tab value            | Specify defaultValue for initial tab | defaultValue on Tabs component                                    | No default leaving first tab                                 | <Tabs defaultValue="account">                                             | <Tabs> without defaultValue                                               | Low        | [shadcn Tabs](https://ui.shadcn.com/docs/components/tabs)               |
| 29 | Accordion  | Use Accordion for collapsible    | Accordion for expandable content sections | Accordion for FAQ settings panels                                  | Custom collapse implementation                               | <Accordion><AccordionItem><AccordionTrigger>                              | <div onClick={() => setOpen(!open)}>                                      | Medium     | [shadcn Accordion](https://ui.shadcn.com/docs/components/accordion)     |
| 30 | Accordion  | Choose accordion type            | Use type="single" or type="multiple" appropriately | type="single" for one open type="multiple" for many               | Default type without consideration                           | <Accordion type="single" collapsible>                                     | <Accordion> without type                                                  | Low        | [shadcn Accordion](https://ui.shadcn.com/docs/components/accordion)     |
| 31 | Toast      | Use Sonner for toasts            | Sonner integration for toast notifications | toast() from sonner for notifications                              | Custom toast implementation                                  | toast("Event created")                                                    | setShowToast(true)                                                        | Medium     | [shadcn Sonner](https://ui.shadcn.com/docs/components/sonner)           |
| 32 | Toast      | Add Toaster to layout            | Include Toaster component in root layout | <Toaster /> in app layout                                          | Toaster in individual pages                                  | app/layout.tsx: <Toaster />                                               | page.tsx: <Toaster />                                                     | High       | [shadcn Sonner](https://ui.shadcn.com/docs/components/sonner)           |
| 33 | Toast      | Use toast variants               | Apply toast.success toast.error for context | Semantic toast methods                                             | Generic toast for all messages                               | toast.success("Saved!") toast.error("Failed")                              | toast("Saved!") toast("Failed")                                           | Medium     | [shadcn Sonner](https://ui.shadcn.com/docs/components/sonner)           |
| 34 | Popover    | Use Popover for floating content | Popover for dropdown menus and floating panels | Popover for contextual actions                                     | Absolute positioned divs                                     | <Popover><PopoverTrigger><PopoverContent>                                 | <div className="relative"><div className="absolute">                      | Medium     | [shadcn Popover](https://ui.shadcn.com/docs/components/popover)         |
| 35 | Popover    | Handle popover alignment         | Use align and side props for positioning | Explicit alignment configuration                                   | Default alignment for all                                    | <PopoverContent align="start" side="bottom">                              | <PopoverContent>                                                          | Low        | [shadcn Popover](https://ui.shadcn.com/docs/components/popover)         |
| 36 | DropdownMenu| Use DropdownMenu for actions    | DropdownMenu for action lists and context menus | DropdownMenu for user menu actions                                 | Popover for action lists                                      | <DropdownMenu><DropdownMenuTrigger><DropdownMenuContent>                  | <Popover> for menu actions                                                 | Medium     | [shadcn DropdownMenu](https://ui.shadcn.com/docs/components/dropdown-menu) |
| 37 | DropdownMenu| Group menu items                 | Use DropdownMenuGroup and DropdownMenuSeparator | Organized menu with separators                                     | Flat list of items                                           | <DropdownMenuGroup><DropdownMenuItem><DropdownMenuSeparator>              | <DropdownMenuItem> without organization                                   | Low        | [shadcn DropdownMenu](https://ui.shadcn.com/docs/components/dropdown-menu) |
| 38 | Tooltip    | Use Tooltip for hints            | Tooltip for icon buttons and truncated text | Tooltip for additional context                                     | Title attribute for tooltips                                 | <Tooltip><TooltipTrigger><TooltipContent>                                 | <button title="Delete">                                                   | Medium     | [shadcn Tooltip](https://ui.shadcn.com/docs/components/tooltip)         |
| 39 | Tooltip    | Add TooltipProvider              | Wrap app or section in TooltipProvider | TooltipProvider at app level                                       | TooltipProvider per tooltip                                   | <TooltipProvider><App/></TooltipProvider>                                  | <Tooltip><TooltipProvider>                                                | High       | [shadcn Tooltip](https://ui.shadcn.com/docs/components/tooltip)         |
| 40 | Skeleton   | Use Skeleton for loading         | Skeleton component for loading placeholders | Skeleton matching content layout                                   | Spinner for content loading                                  | <Skeleton className="h-4 w-[200px]"/>                                     | <Spinner/> for card loading                                               | Medium     | [shadcn Skeleton](https://ui.shadcn.com/docs/components/skeleton)       |
| 41 | Skeleton   | Match skeleton dimensions        | Size skeleton to match loaded content | Skeleton same size as expected content                             | Generic skeleton size                                         | <Skeleton className="h-12 w-12 rounded-full"/>                            | <Skeleton/> without sizing                                                 | Medium     | [shadcn Skeleton](https://ui.shadcn.com/docs/components/skeleton)       |
| 42 | AlertDialog| Use AlertDialog for confirms    | AlertDialog for destructive action confirmation | AlertDialog for delete confirmations                               | Dialog for confirmations                                     | <AlertDialog><AlertDialogTrigger><AlertDialogContent>                     | <Dialog> for delete confirmation                                           | High       | [shadcn AlertDialog](https://ui.shadcn.com/docs/components/alert-dialog) |
| 43 | AlertDialog| Include action buttons          | Use AlertDialogAction and AlertDialogCancel | Standard confirm/cancel pattern                                    | Custom buttons in AlertDialog                                | <AlertDialogCancel>Cancel</AlertDialogCancel><AlertDialogAction>          | <Button>Cancel</Button><Button>Confirm</Button>                           | Medium     | [shadcn AlertDialog](https://ui.shadcn.com/docs/components/alert-dialog) |
| 44 | Sidebar    | Use Sidebar for navigation       | Sidebar component for app navigation | Sidebar for main app navigation                                    | Custom sidebar implementation                                | <SidebarProvider><Sidebar><SidebarContent>                                | <div className="w-64 fixed">                                              | Medium     | [shadcn Sidebar](https://ui.shadcn.com/docs/components/sidebar)         |
| 45 | Sidebar    | Wrap in SidebarProvider          | Use SidebarProvider for sidebar state management | SidebarProvider at layout level                                    | Sidebar without provider                                     | <SidebarProvider><Sidebar></SidebarProvider>                              | <Sidebar> without provider                                                | High       | [shadcn Sidebar](https://ui.shadcn.com/docs/components/sidebar)         |
| 46 | Sidebar    | Use SidebarTrigger               | Include SidebarTrigger for mobile toggle | SidebarTrigger for responsive toggle                               | Custom toggle button                                         | <SidebarTrigger/>                                                         | <Button onClick={() => toggleSidebar()}>                                  | Medium     | [shadcn Sidebar](https://ui.shadcn.com/docs/components/sidebar)         |
| 47 | Chart      | Use Chart for data viz           | Chart component with Recharts integration | Chart component for dashboards                                     | Direct Recharts without wrapper                              | <ChartContainer config={chartConfig}>                                     | <ResponsiveContainer><BarChart>                                           | Medium     | [shadcn Chart](https://ui.shadcn.com/docs/components/chart)             |
| 48 | Chart      | Define chart config              | Create chartConfig for consistent theming | chartConfig with color definitions                                 | Inline colors in charts                                       | { desktop: { label: "Desktop", color: "#2563eb" } }                       | <Bar fill="#2563eb"/>                                                     | Medium     | [shadcn Chart](https://ui.shadcn.com/docs/components/chart)             |
| 49 | Chart      | Use ChartTooltip                 | Apply ChartTooltip for interactive charts | ChartTooltip with ChartTooltipContent                              | Recharts Tooltip directly                                    | <ChartTooltip content={<ChartTooltipContent/>}/>                          | <Tooltip/> from recharts                                                  | Low        | [shadcn Chart](https://ui.shadcn.com/docs/components/chart)             |
| 50 | Blocks     | Use blocks for scaffolding       | Start from shadcn blocks for common layouts | npx shadcn@latest add dashboard-01                                 | Build dashboard from scratch                                 | npx shadcn@latest add login-01                                            | Custom login page from scratch                                            | Medium     | [shadcn Blocks](https://ui.shadcn.com/blocks)                           |
| 51 | Blocks     | Customize block components       | Modify copied block code to fit needs | Edit block files after installation                                | Use blocks without modification                               | Customize dashboard-01 layout                                             | Use dashboard-01 as-is                                                    | Low        | [shadcn Blocks](https://ui.shadcn.com/blocks)                           |
| 52 | A11y       | Use semantic components          | Shadcn components have built-in ARIA | Rely on component accessibility                                    | Override ARIA attributes                                     | <Button> has button role                                                  | <div role="button">                                                       | High       | [shadcn Button](https://ui.shadcn.com/docs/components/button)           |
| 53 | A11y       | Maintain focus management        | Dialog Sheet handle focus automatically | Let components manage focus                                        | Custom focus handling                                         | <Dialog> traps focus                                                      | document.querySelector().focus()                                           | High       | [shadcn Dialog](https://ui.shadcn.com/docs/components/dialog)           |
| 54 | A11y       | Provide labels                   | Use FormLabel and aria-label appropriately | FormLabel for form inputs                                          | Placeholder as only label                                     | <FormLabel>Email</FormLabel><Input/>                                       | <Input placeholder="Email"/>                                               | High       | [shadcn Form](https://ui.shadcn.com/docs/components/form)               |
| 55 | Performance| Import components individually  | Import only needed components | Named imports from component files                                 | Import all from index                                        | import { Button } from "@/components/ui/button"                           | import { Button Card Dialog } from "@/components/ui"                       | Medium     | -                                                                      |
| 56 | Performance| Lazy load dialogs                | Dynamic import for heavy dialog content | React.lazy for dialog content                                     | Import all dialogs upfront                                   | const HeavyContent = lazy(() => import('./Heavy'))                        | import HeavyContent from './Heavy'                                        | Medium     | -                                                                      |
| 57 | Customization| Extend variants with cva       | Add new variants using class-variance-authority | Extend buttonVariants for new styles                               | Inline classes for variants                                  | variants: { size: { xl: "h-14 px-8" } }                                   | className="h-14 px-8"                                                     | Medium     | [shadcn Button](https://ui.shadcn.com/docs/components/button)           |
| 58 | Customization| Create custom components       | Build new components following shadcn patterns | Use cn() and cva for custom components                             | Different patterns for custom                                 | const Custom = ({ className }) => <div className={cn("base", className)}> | const Custom = ({ style }) => <div style={style}>                         | Medium     | -                                                                      |
| 59 | Patterns   | Use asChild for composition      | asChild prop for component composition | Slot pattern with asChild                                         | Wrapper divs for composition                                 | <Button asChild><Link href="/">                                           | <Button><Link href="/"></Link></Button>                                    | Medium     | [shadcn Button](https://ui.shadcn.com/docs/components/button)           |
| 60 | Patterns   | Combine with React Hook Form     | Form + useForm for complete forms | RHF Controller with shadcn inputs                                  | Custom form state management                                 | <FormField control={form.control} name="email">                           | <Input value={email} onChange={(e) => setEmail(e.target.value)}           | High       | [shadcn Form](https://ui.shadcn.com/docs/components/form)               |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.