Vector Motion
Medical

Insurance Verification Card - Patient Insurance

Monitor patient insurance verification and coverage. Track insurance status and eligibility.

Insurance Verification Card

The Insurance Verification Card Monitor insurance verification status for patient admissions.

Preview

Installation

ash npx shadcn@latest add https://vectormotion.vercel.app/registry/insurance-verification-card.json

Insurance Verification Card
'use client'import React from 'react';import { Shield, CheckCircle2, MoreHorizontal } from 'lucide-react';import { motion } from 'motion/react';import { clsx, type ClassValue } from "clsx";import { twMerge } from "tailwind-merge";import { PieChart, Pie, Cell, ResponsiveContainer } from 'recharts';function cn(...inputs: ClassValue[]) {   return twMerge(clsx(inputs));}interface VerificationData {   name: string;   value: number;   color: string;   [key: string]: any;}interface CoverageItem {   name: string;   status: 'Verified' | 'Pending';   colorClass: string;}interface InsuranceVerificationCardProps {   className?: string;   title?: string;   subtitle?: string;   verifiedCount?: number;   todayCount?: number;   data?: VerificationData[];   coverageItems?: CoverageItem[];}const DEFAULT_DATA: VerificationData[] = [   { name: 'Verified', value: 85, color: '#10b981' }, // emerald-500   { name: 'Pending', value: 15, color: '#fbbf24' },  // amber-400];const DEFAULT_COVERAGE_ITEMS: CoverageItem[] = [   { name: "Blue Cross", status: "Verified", colorClass: "text-emerald-600" },   { name: "Aetna", status: "Pending", colorClass: "text-amber-500" },];const DEFAULT_TITLE = "Coverage";const DEFAULT_SUBTITLE = "Auth Status";const DEFAULT_VERIFIED_PERCENTAGE = 85;const DEFAULT_TODAY_COUNT = 42;export const InsuranceVerificationCard: React.FC<InsuranceVerificationCardProps> = ({   className = "",   title = DEFAULT_TITLE,   subtitle = DEFAULT_SUBTITLE,   verifiedCount = DEFAULT_VERIFIED_PERCENTAGE,   todayCount = DEFAULT_TODAY_COUNT,   data = DEFAULT_DATA,   coverageItems = DEFAULT_COVERAGE_ITEMS,}) => {   const isInteractive = true;   const index = 8;   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-primary/50 hover:shadow-md" : "",            className         )}      >         <div className="p-5 flex flex-col h-full relative z-10">            <div className="mb-2 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-blue-500"></span>                     </span>                     <p className="text-sm text-muted-foreground font-medium">                        {subtitle}                     </p>                  </div>               </div>               <div className="rounded-xl bg-blue-500/10 p-2.5 text-blue-500 flex items-center justify-center ring-1 ring-blue-100 dark:ring-blue-800">                  <Shield className="h-5 w-5" />               </div>            </div>            <div className="flex-1 flex items-center gap-3">               <div className="relative h-20 w-20 flex-shrink-0">                  <ResponsiveContainer width="100%" height="100%">                     <PieChart>                        <Pie                           data={data}                           innerRadius={25}                           outerRadius={36}                           paddingAngle={4}                           dataKey="value"                           stroke="none"                        >                           {data.map((entry, index) => (                              <Cell key={`cell-${index}`} fill={entry.color} />                           ))}                        </Pie>                     </PieChart>                  </ResponsiveContainer>                  <div className="absolute inset-0 flex items-center justify-center">                     <CheckCircle2 className="h-6 w-6 text-emerald-500" />                  </div>               </div>               <div className="flex-1 space-y-2">                  <div className="bg-muted p-2 rounded-lg border border-border">                     <p className="text-[10px] text-muted-foreground uppercase font-bold">Today's List</p>                     <p className="text-xl font-bold text-foreground">{todayCount}</p>                  </div>               </div>            </div>            <div className="mt-3 space-y-1.5">               {coverageItems.map((item, i) => (                  <div key={i} className="flex justify-between items-center text-xs p-1.5 rounded hover:bg-zinc-50 dark:hover:bg-zinc-800/50 cursor-pointer">                     <span className="font-medium text-foreground">{item.name}</span>                     {item.status === 'Verified' ? (                        <span className="text-emerald-600 font-bold">Verified</span>                     ) : (                        <span className="text-amber-500 font-bold text-[10px] uppercase bg-amber-50 dark:bg-amber-900/10 px-1.5 py-0.5 rounded">Pending</span>                     )}                  </div>               ))}            </div>         </div>      </motion.div>   );};

Usage

This component is a demo card displaying medical metrics with animated visualizations and dark mode support.

Prop

Type