Skip to content

Essentials

Essential UI components from shadcn/ui, a collection of re-usable components built with Radix UI and Tailwind CSS.

Button component

Storybook

Import

import { Button } from '@/ui/button'

Usage

<Button>Button</Button>

Input component

Storybook

Import

import { Input } from '@/ui/input'

Usage

<Input placeholder="Enter text..." />

Link component

Storybook

Import

import { Link } from '@/ui/link'

Usage

<Link href="/" size="default">Link</Link>

Badge component

Storybook

Import

import { Badge } from '@/ui/badge'

Usage

<Badge>Badge</Badge>

Card component

Storybook

Import

import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/ui/card'
import { Button } from '@/ui/button'

Usage

<Card>
<CardHeader>
<CardTitle>Card Title</CardTitle>
<CardDescription>
This is a card description that explains what the card is about.
</CardDescription>
</CardHeader>
<CardContent>
<p>This is the main content of the card.</p>
</CardContent>
<CardFooter>
<Button variant="outline">Cancel</Button>
<Button>Confirm</Button>
</CardFooter>
</Card>

Alert component

Storybook

Import

import { Alert, AlertTitle, AlertDescription } from '@/ui/alert'

Usage

<Alert>
<AlertTitle>Alert Title</AlertTitle>
<AlertDescription>This is a default alert.</AlertDescription>
</Alert>

Checkbox component

Storybook

Import

import { Checkbox } from '@/ui/checkbox'
import { Label } from '@/ui/label'

Usage

<div className="flex items-center space-x-2">
<Checkbox id="default" />
<Label htmlFor="default">Default checkbox</Label>
</div>

Dialog component

Storybook

Import

import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/ui/dialog'
import { Button } from '@/ui/button'

Usage

<Dialog>
<DialogTrigger asChild>
<Button variant="outline">Open Dialog</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Dialog Title</DialogTitle>
<DialogDescription>
This is a description of the dialog. You can put any content here.
</DialogDescription>
</DialogHeader>
<p className="py-4">The main content of the dialog goes here.</p>
<DialogFooter>
<Button variant="outline">Cancel</Button>
<Button>Save Changes</Button>
</DialogFooter>
</DialogContent>
</Dialog>

Label component

Storybook

Import

import { Label } from '@/ui/label'
import { Checkbox } from '@/ui/checkbox'

Usage

<div className="flex items-center space-x-2">
<Checkbox id="with-label" />
<Label htmlFor="with-label">Label with Checkbox</Label>
</div>

Tabs component

Storybook

Import

import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/ui/tabs'

Usage

<Tabs defaultValue="account">
<TabsList>
<TabsTrigger value="account">Account</TabsTrigger>
<TabsTrigger value="password">Password</TabsTrigger>
<TabsTrigger value="settings">Settings</TabsTrigger>
</TabsList>
<TabsContent value="account" className="p-4">
<h3 className="font-medium text-lg">Account</h3>
<p className="mt-2 text-muted-foreground text-sm">
Make changes to your account settings here. Click save when you're done.
</p>
</TabsContent>
<TabsContent value="password" className="p-4">
<h3 className="font-medium text-lg">Password</h3>
<p className="mt-2 text-muted-foreground text-sm">
Change your password here. After saving, you'll be logged out.
</p>
</TabsContent>
<TabsContent value="settings" className="p-4">
<h3 className="font-medium text-lg">Settings</h3>
<p className="mt-2 text-muted-foreground text-sm">
Manage your account settings and set email preferences.
</p>
</TabsContent>
</Tabs>

Typography component

Storybook

Import

import { Heading, P, Lead, Blockquote, List, Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@/ui/typography'

Usage

<div>
<Heading level={1}>Taxing Laughter: The Joke Tax Chronicles</Heading>
<Lead>
Once upon a time, in a far-off land, there was a very lazy king who
spent all day lounging on his throne. One day, his advisors came to him
with a problem: the kingdom was running out of money.
</Lead>
<Heading level={2}>The King's Plan</Heading>
<P>
The king thought long and hard, and finally came up with{" "}
<a
href="https://example.com"
className="font-medium text-primary underline underline-offset-4"
>
a brilliant plan
</a>
: he would tax the jokes in the kingdom.
</P>
<Blockquote>
"After all," he said, "everyone enjoys a good joke, so it's only fair
that they should pay for the privilege."
</Blockquote>
<Heading level={3}>The Joke Tax</Heading>
<P>
The king's subjects were not amused. They grumbled and complained, but
the king was firm:
</P>
<List>
<li>1st level of puns: 5 gold coins</li>
<li>2nd level of jokes: 10 gold coins</li>
<li>3rd level of one-liners: 20 gold coins</li>
</List>
</div>

Dropdown Menu component

Storybook

Import

import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem, DropdownMenuShortcut } from '@/ui/dropdown-menu'
import { Button } from '@/ui/button'

Usage

<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline">Open Menu</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
Profile
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Billing
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Settings
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">
Delete Account
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>

Radio Group component

Storybook

Import

import { RadioGroup, RadioGroupItem } from '@/ui/radio-group'
import { Label } from '@/ui/label'

Usage

<RadioGroup defaultValue="option1">
<div className="flex items-center gap-3">
<RadioGroupItem value="option1" id="option1" />
<Label htmlFor="option1">Option 1</Label>
</div>
<div className="flex items-center gap-3">
<RadioGroupItem value="option2" id="option2" />
<Label htmlFor="option2">Option 2</Label>
</div>
<div className="flex items-center gap-3">
<RadioGroupItem value="option3" id="option3" />
<Label htmlFor="option3">Option 3</Label>
</div>
</RadioGroup>