Medical
Maternity Ward Card - Obstetrics
Monitor maternity unit operations and deliveries. Track obstetric metrics and maternal/fetal outcomes.
Maternity Ward Card
The Maternity Ward Card Track maternity ward occupancy, deliveries, and patient status.
Preview
Installation
ash npx shadcn@latest add https://vectormotion.vercel.app/registry/maternity-ward-card.json
Maternity Ward Card
'use client'import React from 'react';import { Baby, Heart, Calendar } from 'lucide-react';import { motion } from 'motion/react';import { clsx, type ClassValue } from "clsx";import { twMerge } from "tailwind-merge";function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs));}interface MaternityWardCardProps { className?: string; title?: string; subtitle?: string; birthCount?: number; todayCount?: string; laborActive?: number; inductionsScheduled?: number;}const DEFAULT_TITLE = "Maternity";const DEFAULT_SUBTITLE = "L&D Status";const DEFAULT_BIRTH_COUNT = 4;const DEFAULT_TODAY_COUNT = "+2 Today";const DEFAULT_LABOR_ACTIVE = 3;const DEFAULT_INDUCTIONS_SCHEDULED = 2;export const MaternityWardCard: React.FC<MaternityWardCardProps> = ({ className = "", title = DEFAULT_TITLE, subtitle = DEFAULT_SUBTITLE, birthCount = DEFAULT_BIRTH_COUNT, todayCount = DEFAULT_TODAY_COUNT, laborActive = DEFAULT_LABOR_ACTIVE, inductionsScheduled = DEFAULT_INDUCTIONS_SCHEDULED,}) => { const isInteractive = true; const index = 30; return ( <motion.div layoutId={isInteractive ? `card-${index}-${title}` : undefined} transition={{ duration: 0.4, ease: "easeOut" }} className={cn( "relative overflow-hidden rounded-2xl border border-border bg-card text-card-foreground shadow-sm transition-all flex flex-col h-full", isInteractive ? "hover:border-rose-300 dark:hover:border-rose-700 hover:shadow-md" : "", className )} > <div className="p-5 flex flex-col h-full relative z-10"> <div className="mb-4 flex items-start justify-between"> <div> <h3 className="font-bold text-lg text-foreground"> {title} </h3> <div className="flex items-center gap-1.5 mt-1"> <span className="relative flex h-2 w-2"> <span className="relative inline-flex rounded-full h-2 w-2 bg-rose-400"></span> </span> <p className="text-sm text-muted-foreground font-medium"> {subtitle} </p> </div> </div> <div className="rounded-xl bg-rose-500/10 p-2.5 text-rose-500 dark:text-rose-400 flex items-center justify-center ring-1 ring-rose-100 dark:ring-rose-800"> <Baby className="h-5 w-5" /> </div> </div> <div className="flex-1 flex flex-col justify-between"> <div className="flex items-center gap-3"> <div className="flex items-baseline gap-1"> <span className="text-4xl font-bold text-foreground">{birthCount}</span> <span className="text-sm text-muted-foreground">births</span> </div> <div className="h-8 w-px bg-zinc-100 dark:bg-zinc-800" /> <span className="text-xs text-emerald-500 font-bold bg-emerald-50 dark:bg-emerald-900/10 px-2 py-1 rounded-full"> {todayCount} </span> </div> <div className="space-y-2 mt-4"> <div className="flex justify-between items-center p-2 rounded-lg bg-muted"> <div className="flex items-center gap-2"> <Heart className="h-4 w-4 text-rose-400" /> <span className="text-xs font-semibold text-foreground">Labor</span> </div> <span className="text-xs font-bold text-foreground">{laborActive} Active</span> </div> <div className="flex justify-between items-center p-2 rounded-lg bg-muted"> <div className="flex items-center gap-2"> <Calendar className="h-4 w-4 text-blue-400" /> <span className="text-xs font-semibold text-foreground">Inductions</span> </div> <span className="text-xs font-bold text-foreground">{inductionsScheduled} Scheduled</span> </div> </div> </div> </div> </motion.div> );};Usage
This component is a demo card displaying medical metrics with animated visualizations and dark mode support.
Prop
Type