Components - DrunkOnJava/MaterialMDashboard GitHub Wiki
This page documents all UI components available in Material Dashboard.
Material Dashboard uses Shadcn UI components built on top of Radix UI primitives, providing accessible and customizable components.
A versatile button component with multiple variants and sizes.
import { Button } from "@/components/ui/button"
// Variants
<Button variant="default">Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="destructive">Destructive</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="link">Link</Button>
// Sizes
<Button size="sm">Small</Button>
<Button size="default">Default</Button>
<Button size="lg">Large</Button>
<Button size="icon"><Icon /></Button>
// States
<Button disabled>Disabled</Button>
<Button loading>Loading...</Button>
Container component for grouping related content.
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "@/components/ui/card"
<Card>
<CardHeader>
<CardTitle>Card Title</CardTitle>
<CardDescription>Card description goes here</CardDescription>
</CardHeader>
<CardContent>
Card content
</CardContent>
<CardFooter>
Card footer
</CardFooter>
</Card>
Modal dialog for focused interactions.
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog"
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle>Dialog Title</DialogTitle>
<DialogDescription>Dialog description</DialogDescription>
</DialogHeader>
<div>Dialog content</div>
<DialogFooter>
<Button onClick={() => setOpen(false)}>Close</Button>
</DialogFooter>
</DialogContent>
</Dialog>
Text input with label support.
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
<div>
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" placeholder="Enter email" />
</div>
Dropdown selection component.
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
<Select value={value} onValueChange={setValue}>
<SelectTrigger>
<SelectValue placeholder="Select an option" />
</SelectTrigger>
<SelectContent>
<SelectItem value="option1">Option 1</SelectItem>
<SelectItem value="option2">Option 2</SelectItem>
</SelectContent>
</Select>
Checkbox input with label.
import { Checkbox } from "@/components/ui/checkbox"
import { Label } from "@/components/ui/label"
<div className="flex items-center space-x-2">
<Checkbox id="terms" checked={checked} onCheckedChange={setChecked} />
<Label htmlFor="terms">Accept terms and conditions</Label>
</div>
Date selection component.
import { DatePicker } from "@/components/ui/date-picker"
<DatePicker
selected={date}
onSelect={setDate}
placeholder="Pick a date"
/>
Tab navigation component.
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
<Tabs defaultValue="tab1">
<TabsList>
<TabsTrigger value="tab1">Tab 1</TabsTrigger>
<TabsTrigger value="tab2">Tab 2</TabsTrigger>
</TabsList>
<TabsContent value="tab1">Tab 1 content</TabsContent>
<TabsContent value="tab2">Tab 2 content</TabsContent>
</Tabs>
Navigation breadcrumb.
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "@/components/ui/breadcrumb"
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink href="/products">Products</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Current Page</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
Alert messages with different variants.
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
<Alert variant="default">
<AlertTitle>Default Alert</AlertTitle>
<AlertDescription>This is a default alert message.</AlertDescription>
</Alert>
<Alert variant="destructive">
<AlertTitle>Error Alert</AlertTitle>
<AlertDescription>Something went wrong!</AlertDescription>
</Alert>
Toast notifications.
import { useToast } from "@/hooks/use-toast"
import { Button } from "@/components/ui/button"
const { toast } = useToast()
<Button onClick={() => {
toast({
title: "Success!",
description: "Your action was completed successfully.",
})
}}>
Show Toast
</Button>
Status badges.
import { Badge } from "@/components/ui/badge"
<Badge>Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="destructive">Destructive</Badge>
<Badge variant="outline">Outline</Badge>
Loading placeholder components.
import { Skeleton } from "@/components/ui/skeleton"
// Text skeleton
<Skeleton className="h-4 w-[200px]" />
// Card skeleton
<Card>
<CardHeader>
<Skeleton className="h-4 w-[150px]" />
<Skeleton className="h-3 w-[250px]" />
</CardHeader>
<CardContent>
<Skeleton className="h-20 w-full" />
</CardContent>
</Card>
Progress indicators.
import { Progress } from "@/components/ui/progress"
<Progress value={progress} max={100} />
Statistical cards for metrics display.
import { StatCard } from "@/screens/Dashboard/components/StatCard"
<StatCard
title="Total Revenue"
value="$12,345"
trend="+12.5%"
trendUp={true}
icon={<DollarSign />}
/>
Data visualization components using Chart.js.
import { Line, Bar, Pie, Doughnut } from "react-chartjs-2"
// Line Chart
<Line data={lineData} options={lineOptions} />
// Bar Chart
<Bar data={barData} options={barOptions} />
// Pie Chart
<Pie data={pieData} options={pieOptions} />
Main navigation sidebar.
import { SidebarByAnima } from "@/screens/Chip/sections/SidebarByAnima"
<SidebarByAnima />
Top navigation bar.
import { TopBarByAnima } from "@/screens/Chip/sections/TopBarByAnima"
<TopBarByAnima />
Page title bar.
import { Titlebar } from "@/screens/Dashboard/components/Titlebar"
<Titlebar
title="Dashboard"
subtitle="Welcome back!"
actions={<Button>Action</Button>}
/>
Lazy-loaded images with IntersectionObserver.
import { LazyImage } from "@/components/ui/lazy-image"
<LazyImage
src="/path/to/image.jpg"
alt="Description"
placeholder="/path/to/placeholder.jpg"
className="w-full h-48 object-cover"
/>
Error handling wrapper.
import { ErrorBoundary } from "@/components/ErrorBoundary"
<ErrorBoundary>
<App />
</ErrorBoundary>
Components use the class-variance-authority
library for variant management:
const buttonVariants = cva(
"base-classes",
{
variants: {
variant: {
default: "default-classes",
secondary: "secondary-classes",
},
size: {
default: "default-size",
sm: "small-size",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
Components are designed to be composed together:
<Card>
<CardHeader>
<div className="flex justify-between items-center">
<CardTitle>Users</CardTitle>
<Badge>Active</Badge>
</div>
</CardHeader>
<CardContent>
<Table>
{/* Table content */}
</Table>
</CardContent>
<CardFooter>
<Button>View All</Button>
</CardFooter>
</Card>
All components follow accessibility best practices:
- Proper ARIA labels
- Keyboard navigation support
- Focus management
- Screen reader compatibility
Components use CSS variables for theming:
:root {
--primary: 210 40% 98%;
--primary-foreground: 222.2 47.4% 11.2%;
--secondary: 217.2 32.6% 17.5%;
--secondary-foreground: 210 40% 98%;
/* ... more variables */
}
Create custom variants:
// Custom button variant
const MyButton = ({ variant, ...props }) => {
const customVariant = variant === "brand" ? "bg-brand text-white" : buttonVariants({ variant })
return <Button className={customVariant} {...props} />
}
- Use Composition: Build complex UIs by composing smaller components
- Maintain Consistency: Use existing variants before creating new ones
- Accessibility First: Always include proper ARIA labels and keyboard support
- Responsive Design: Ensure components work on all screen sizes
- Type Safety: Use TypeScript for all component props
Explore live examples in the application:
- Development Guide - Learn development best practices
- Project Structure - Understand the codebase
- Performance Optimizations - Optimize your app