Vector Motion
Finance

Tax Estimation Card - Tax Planning

Monitor tax estimates and tax liability. Track tax obligations and planning strategies.

Finance Tax Estimation Card

The Finance Tax Estimation Card provides tax liability estimates based on income and deductions, helping users plan for tax obligations.

Preview

Installation

npx shadcn@latest add https://vectormotion.vercel.app/registry/finance-tax-estimation-card.json
Finance Tax Estimation Card
'use client'import React from 'react';import { FileText, CalendarDays } from 'lucide-react';import { motion } from 'motion/react';import { clsx, type ClassValue } from "clsx"import { twMerge } from "tailwind-merge"import { ResponsiveContainer, BarChart, Bar, XAxis, Tooltip, Cell, YAxis } from 'recharts';function cn(...inputs: ClassValue[]) {  return twMerge(clsx(inputs))}interface TaxData {  name: string;  value: number;  fill: string;  [key: string]: any;}interface TaxEstimationCardProps {  isInteractive?: boolean;  className?: string;  title?: string;  paidAmount?: number;  estimatedAmount?: number;  data?: TaxData[];  nextQuarterLabel?: string;}const DEFAULT_TITLE = "Tax Estimator";const DEFAULT_PAID_AMOUNT = 18500;const DEFAULT_ESTIMATED_AMOUNT = 24000;const DEFAULT_DATA: TaxData[] = [  { name: 'Paid', value: 18500, fill: '#10b981' },  { name: 'Est.', value: 24000, fill: '#e4e4e7' },];const DEFAULT_NEXT_QUARTER_LABEL = "Next: Q3";export const TaxEstimationCard: React.FC<TaxEstimationCardProps> = ({  isInteractive = true,  className = "",  title = DEFAULT_TITLE,  paidAmount = DEFAULT_PAID_AMOUNT,  estimatedAmount = DEFAULT_ESTIMATED_AMOUNT,  data = DEFAULT_DATA,  nextQuarterLabel = DEFAULT_NEXT_QUARTER_LABEL,}) => {  const percentage = (paidAmount / estimatedAmount) * 100;  const index = 49;  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">${(estimatedAmount / 1000).toFixed(1)}k</span>            <span className="text-xs text-muted-foreground">Liability</span>          </div>        </div>        <div className="rounded-lg bg-emerald-500/10 p-2 text-emerald-500">          <FileText className="h-5 w-5" />        </div>      </div>      <div className="relative z-10 flex-1 min-h-[140px]">        <div className="absolute inset-0">          <ResponsiveContainer width="100%" height="100%">            <BarChart data={data}>              <XAxis dataKey="name" axisLine={false} tickLine={false} tick={{ fontSize: 10, fill: '#71717a' }} />              <Tooltip                cursor={{ fill: 'transparent' }}                contentStyle={{ backgroundColor: 'var(--tooltip-bg)', borderRadius: '8px', border: 'none', color: 'var(--tooltip-text)' }}                formatter={(value: number) => [`$${value.toLocaleString()}`, '']}              />              <Bar dataKey="value" radius={[4, 4, 0, 0]} barSize={40}>                {data.map((entry, index) => (                  <Cell key={`cell-${index}`} fill={entry.fill} className={index === 1 ? "fill-zinc-200 dark:fill-zinc-700" : ""} />                ))}              </Bar>            </BarChart>          </ResponsiveContainer>        </div>      </div>      <div className="z-10 mt-2 flex items-center justify-between text-xs pt-2 border-t border-border">        <div className="flex items-center gap-1.5">          <CalendarDays className="w-3.5 h-3.5 text-muted-foreground" />          <span className="text-foreground font-medium">{nextQuarterLabel}</span>        </div>        <span className="text-emerald-600 font-bold">{percentage.toFixed(0)}% Paid</span>      </div>    </motion.div>  );};

Props

Prop

Type

Usage

This component is a demo card displaying tax estimation data with animated visualizations and dark mode support.