MiHCM
layout/@mihcm/ui·v0.21.0·stable

Card

Composable container surface. Six pieces (Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter) for predictable layout.

Simple card

Notifications

You have 3 unread messages.

Check your inbox for the latest updates.

import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@mihcm/ui/Card';
 
<Card>
  <CardHeader>
    <CardTitle>Notifications</CardTitle>
    <CardDescription>You have 3 unread messages.</CardDescription>
  </CardHeader>
  <CardContent>
    <p>Check your inbox for the latest updates.</p>
  </CardContent>
</Card>;

Delete workspace

This action cannot be undone. All data in this workspace will be permanently removed.

import { Card, CardHeader, CardTitle, CardContent, CardFooter } from '@mihcm/ui/Card';
import { Button } from '@mihcm/ui/Button';
 
<Card>
  <CardHeader>
    <CardTitle>Delete workspace</CardTitle>
  </CardHeader>
  <CardContent>
    <p className="text-sm text-muted-foreground">
      This action cannot be undone. All data in this workspace will be permanently removed.
    </p>
  </CardContent>
  <CardFooter>
    <Button variant="outline">Cancel</Button>
    <Button variant="destructive">Delete</Button>
  </CardFooter>
</Card>;

Card grid

Employees

142 active

Leave requests

7 pending

Payroll

Processed for May

<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
  <Card>
    <CardHeader>
      <CardTitle>Employees</CardTitle>
      <CardDescription>142 active</CardDescription>
    </CardHeader>
  </Card>
  <Card>
    <CardHeader>
      <CardTitle>Leave requests</CardTitle>
      <CardDescription>7 pending</CardDescription>
    </CardHeader>
  </Card>
  <Card>
    <CardHeader>
      <CardTitle>Payroll</CardTitle>
      <CardDescription>Processed for May</CardDescription>
    </CardHeader>
  </Card>
</div>

Profile summary card

Use card composition with Avatar, Badge, and Button when a surface needs identity, status, metadata, and a primary action in one scan path.

Alex Kim

Alex Kim

Active

Payroll Lead - People Operations

PayrollApprovalsManager

Location

Singapore

Reports

12

SLA

98%

import {
  Card,
  CardHeader,
  CardTitle,
  CardDescription,
  CardContent,
  CardFooter,
} from '@mihcm/ui/Card';
import { Avatar, AvatarImage, AvatarFallback, AvatarStatus } from '@mihcm/ui/Avatar';
import { Badge } from '@mihcm/ui/Badge';
import { Button } from '@mihcm/ui/Button';
 
<Card className="w-full max-w-lg">
  <CardHeader className="flex-row items-start gap-4 space-y-0">
    <Avatar size="xl" className="ring-2 ring-background">
      <AvatarImage src="/people/alex-kim.svg" alt="Alex Kim" />
      <AvatarFallback>AK</AvatarFallback>
      <AvatarStatus status="online" />
    </Avatar>
    <div className="min-w-0 flex-1">
      <div className="flex flex-wrap items-center gap-2">
        <CardTitle>Alex Kim</CardTitle>
        <Badge variant="success">Active</Badge>
      </div>
      <CardDescription>Payroll Lead - People Operations</CardDescription>
    </div>
  </CardHeader>
  <CardContent>{/* token-backed metrics */}</CardContent>
  <CardFooter className="justify-between">
    <Button variant="outline">View profile</Button>
    <Button>Assign task</Button>
  </CardFooter>
</Card>;

Approval queue card

Use a list inside CardContent for queue, review, and workflow cards. Keep each row keyboard-readable and use badges for priority, not color alone.

Manager approval queue

High-priority employee requests that need a decision.

3 pending
Jane Doe

Jane Doe

Leave request - 3 days

Due today
Maya Chen

Maya Chen

Offer approval - Senior Designer

Review
Sofia Lee

Sofia Lee

Training budget - Leadership course

Review
import {
  Card,
  CardHeader,
  CardTitle,
  CardDescription,
  CardContent,
  CardFooter,
} from '@mihcm/ui/Card';
import { Avatar, AvatarImage, AvatarFallback } from '@mihcm/ui/Avatar';
import { Badge } from '@mihcm/ui/Badge';
import { Button } from '@mihcm/ui/Button';
import { StatusBadge } from '@mihcm/ui/StatusBadge';
 
<Card className="w-full max-w-2xl">
  <CardHeader>
    <div className="flex flex-wrap items-start justify-between gap-3">
      <div>
        <CardTitle>Manager approval queue</CardTitle>
        <CardDescription>High-priority employee requests that need a decision.</CardDescription>
      </div>
      <StatusBadge tone="warning">3 pending</StatusBadge>
    </div>
  </CardHeader>
  <CardContent className="space-y-3">
    {people.map((person) => (
      <div className="flex flex-col gap-3 rounded-lg border border-border bg-background p-3 sm:flex-row sm:items-center sm:justify-between">
        <div className="flex min-w-0 items-center gap-3">
          <Avatar size="md">
            <AvatarImage src={person.src} alt={person.name} />
            <AvatarFallback>{person.fallback}</AvatarFallback>
          </Avatar>
          <div className="min-w-0">
            <p className="truncate text-sm font-semibold text-foreground">{person.name}</p>
            <p className="truncate text-xs text-muted-foreground">{person.request}</p>
          </div>
        </div>
        <Button variant="outline" size="sm">
          Open
        </Button>
      </div>
    ))}
  </CardContent>
  <CardFooter>
    <Button variant="outline" fullWidth>
      Review all approvals
    </Button>
  </CardFooter>
</Card>;

Team spotlight card

Use AvatarGroup with compact metric tiles for team, campaign, or project summary cards. The same layout works in dashboards and application templates.

Payroll readiness squad

Cross-functional team preparing this month's payroll run.

Alex KimJane DoeMaya ChenSofia Lee

Owners

4 leads

Cutoff

May 24

Risk

Low

Final audit checklist is 82% complete.
import {
  Card,
  CardHeader,
  CardTitle,
  CardDescription,
  CardContent,
  CardFooter,
} from '@mihcm/ui/Card';
import { Avatar, AvatarImage, AvatarFallback } from '@mihcm/ui/Avatar';
import { AvatarGroup } from '@mihcm/ui/AvatarGroup';
import { Button } from '@mihcm/ui/Button';
 
<Card className="w-full max-w-2xl overflow-hidden">
  <CardHeader className="border-b border-border bg-muted">
    <div className="flex flex-wrap items-start justify-between gap-4">
      <div>
        <CardTitle>Payroll readiness squad</CardTitle>
        <CardDescription>Cross-functional team preparing this month's payroll run.</CardDescription>
      </div>
      <AvatarGroup max={4} size="sm">
        {/* profile avatars */}
      </AvatarGroup>
    </div>
  </CardHeader>
  <CardContent className="grid gap-4 py-5 md:grid-cols-3">
    {/* metric tiles with semantic tokens */}
  </CardContent>
  <CardFooter className="flex-col items-stretch gap-3 sm:flex-row sm:items-center sm:justify-between">
    <p className="text-sm text-muted-foreground">Final audit checklist is 82% complete.</p>
    <Button>Open checklist</Button>
  </CardFooter>
</Card>;