Vector Motion
Finance

Operating Margin Card - Operational Efficiency

Monitor operating margin and operational profitability. Track operating efficiency and cost control.

Finance Operating Margin Card

The Finance Operating Margin Card displays operating margin percentages, measuring operational efficiency and profitability.

Preview

Installation

npx shadcn@latest add https://vectormotion.vercel.app/registry/finance-operating-margin-card.json
Finance Operating Margin Card
'use client'import React from 'react';import { Activity, ArrowUpRight } from 'lucide-react';import { ResponsiveContainer, AreaChart, Area, Tooltip, XAxis, ReferenceLine } from 'recharts';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 MarginData {  month: string;  margin: number;  [key: string]: any;}interface OperatingMarginCardProps {  isInteractive?: boolean;  className?: string;  title?: string;  marginValue?: string;  marginChange?: string;  targetLabel?: string;  data?: MarginData[];}const DEFAULT_TITLE = "Operating Margin";const DEFAULT_MARGIN_VALUE = "25.0%";const DEFAULT_MARGIN_CHANGE = "+3%";const DEFAULT_TARGET_LABEL = "Target 22%";const DEFAULT_DATA: MarginData[] = [  { month: 'May', margin: 18 },  { month: 'Jun', margin: 22 },  { month: 'Jul', margin: 20 },  { month: 'Aug', margin: 24 },  { month: 'Sep', margin: 21 },  { month: 'Oct', margin: 25 },];export const OperatingMarginCard: React.FC<OperatingMarginCardProps> = ({  isInteractive = true,  className = "",  title = DEFAULT_TITLE,  marginValue = DEFAULT_MARGIN_VALUE,  marginChange = DEFAULT_MARGIN_CHANGE,  targetLabel = DEFAULT_TARGET_LABEL,  data = DEFAULT_DATA,}) => {  const index = 22;  return (    <motion.div      layoutId={isInteractive ? `card-${index}-${title}` : undefined}      transition={{ duration: 0.4, ease: "easeOut" }}      className={cn(        "relative overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-5 shadow-sm transition-all flex flex-col h-full group",        isInteractive ? "cursor-pointer hover:border-primary/50 hover:shadow-md" : "",        className      )}    >      <div className="mb-2 flex items-start justify-between relative z-10">        <div>          <h3 className="font-semibold text-lg text-foreground">            {title}          </h3>          <div className="flex items-center gap-2 mt-1">            <span className="text-2xl font-bold text-foreground">{marginValue}</span>            <span className="text-xs font-medium text-emerald-500 bg-emerald-500/10 px-1.5 py-0.5 rounded-full flex items-center gap-0.5">              <ArrowUpRight className="w-3 h-3" /> {marginChange}            </span>          </div>        </div>        <div className="rounded-lg bg-emerald-500/10 p-2 text-emerald-500">          <Activity className="h-5 w-5" />        </div>      </div>      <div className="relative z-10 flex-1 min-h-[120px]">        <div className="absolute inset-0">          <ResponsiveContainer width="100%" height="100%">            <AreaChart data={data}>              <defs>                <linearGradient id="colorMargin" x1="0" y1="0" x2="0" y2="1">                  <stop offset="5%" stopColor="#10b981" stopOpacity={0.3} />                  <stop offset="95%" stopColor="#10b981" stopOpacity={0} />                </linearGradient>              </defs>              <Tooltip                contentStyle={{ backgroundColor: 'var(--tooltip-bg)', borderRadius: '8px', border: 'none', color: 'var(--tooltip-text)', boxShadow: '0 4px 12px rgba(0,0,0,0.1)' }}                formatter={(val: number) => [`${val}%`, 'Margin']}              />              <ReferenceLine y={22} stroke="#a1a1aa" strokeDasharray="3 3" label={{ value: targetLabel, position: 'insideTopLeft', fontSize: 10, fill: '#a1a1aa' }} />              <XAxis dataKey="month" axisLine={false} tickLine={false} tick={{ fontSize: 10, fill: '#71717a' }} />              <Area                type="monotone"                dataKey="margin"                stroke="#10b981"                fillOpacity={1}                fill="url(#colorMargin)"                strokeWidth={2}                animationDuration={1500}              />            </AreaChart>          </ResponsiveContainer>        </div>      </div>    </motion.div>  );};

Props

Prop

Type