Components - DrunkOnJava/MaterialMDashboard GitHub Wiki

Components

This page documents all UI components available in Material Dashboard.

Component Library

Material Dashboard uses Shadcn UI components built on top of Radix UI primitives, providing accessible and customizable components.

Base UI Components

Button

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>

Card

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>

Dialog

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>

Form Components

Input

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>

Select

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

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>

DatePicker

Date selection component.

import { DatePicker } from "@/components/ui/date-picker"

<DatePicker
  selected={date}
  onSelect={setDate}
  placeholder="Pick a date"
/>

Navigation

Tabs

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>

Breadcrumb

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>

Feedback

Alert

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

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>

Badge

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 States

Skeleton

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

Progress indicators.

import { Progress } from "@/components/ui/progress"

<Progress value={progress} max={100} />

Dashboard Components

StatCard

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 />}
/>

Chart Components

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} />

Layout Components

Sidebar

Main navigation sidebar.

import { SidebarByAnima } from "@/screens/Chip/sections/SidebarByAnima"

<SidebarByAnima />

TopBar

Top navigation bar.

import { TopBarByAnima } from "@/screens/Chip/sections/TopBarByAnima"

<TopBarByAnima />

TitleBar

Page title bar.

import { Titlebar } from "@/screens/Dashboard/components/Titlebar"

<Titlebar
  title="Dashboard"
  subtitle="Welcome back!"
  actions={<Button>Action</Button>}
/>

Utility Components

LazyImage

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"
/>

ErrorBoundary

Error handling wrapper.

import { ErrorBoundary } from "@/components/ErrorBoundary"

<ErrorBoundary>
  <App />
</ErrorBoundary>

Component Patterns

Variant System

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",
    },
  }
)

Composition Pattern

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>

Accessibility

All components follow accessibility best practices:

  • Proper ARIA labels
  • Keyboard navigation support
  • Focus management
  • Screen reader compatibility

Customization

Theme Variables

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 */
}

Extending Components

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} />
}

Best Practices

  1. Use Composition: Build complex UIs by composing smaller components
  2. Maintain Consistency: Use existing variants before creating new ones
  3. Accessibility First: Always include proper ARIA labels and keyboard support
  4. Responsive Design: Ensure components work on all screen sizes
  5. Type Safety: Use TypeScript for all component props

Component Examples

Explore live examples in the application:

Next Steps

⚠️ **GitHub.com Fallback** ⚠️