Vector Motion
E-Commerce

Daily Sales Card - Revenue Dashboard

Monitor daily sales revenue and sales trends. Track daily performance and forecast revenue with interactive charts.

Daily Sales Card

The Daily Sales Card Track real-time daily sales with hourly trends and performance metrics.

Preview

Installation

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

Daily Sales Card
'use client';import React from "react";import { TrendingUp, DollarSign } 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 SalesData {  hour: string;  sales: number;  [key: string]: any;}interface DailySalesCardProps {  className?: string;  title?: string;  description?: string;  sales?: string;  salesChange?: number;  salesData?: SalesData[];}const DEFAULT_TITLE = "Daily Sales";const DEFAULT_DESCRIPTION = "Today's Performance";const DEFAULT_SALES = "$5,100";const DEFAULT_SALES_CHANGE = 12.5;const DEFAULT_SALES_DATA: SalesData[] = [  { hour: "9AM", sales: 1200 },  { hour: "12PM", sales: 2800 },  { hour: "3PM", sales: 3500 },  { hour: "6PM", sales: 4200 },  { hour: "Now", sales: 5100 },];export const DailySalesCard: React.FC<DailySalesCardProps> = ({  className = "",  title = DEFAULT_TITLE,  description = DEFAULT_DESCRIPTION,  sales = DEFAULT_SALES,  salesChange = DEFAULT_SALES_CHANGE,  salesData = DEFAULT_SALES_DATA,}) => {  const isInteractive = true;  const index = 1;  const maxSales = Math.max(...salesData.map((d) => d.sales));  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-6 shadow-sm transition-all flex flex-col group",        isInteractive          ? "cursor-pointer hover:border-zinc-300 dark:hover:border-zinc-700"          : "",        className,      )}    >      <div className="mb-4 flex items-start justify-between relative z-10">        <div>          <h3 className="font-semibold text-lg tracking-tight text-foreground">            {title}          </h3>          {description && (            <p className="text-sm text-muted-foreground mt-1">{description}</p>          )}        </div>        <div className="rounded-full bg-zinc-100 dark:bg-zinc-800 p-2 text-foreground flex items-center justify-center">          <DollarSign className="h-5 w-5 text-emerald-500" />        </div>      </div>      <div className="relative z-10 flex-1">        <div className="text-3xl font-bold text-foreground mb-2">{sales}</div>        <div className="flex items-center gap-2 text-sm mb-4">          <TrendingUp className="h-4 w-4 text-emerald-500" />          <span className="text-emerald-500 font-medium">+{salesChange}%</span>          <span className="text-muted-foreground">vs yesterday</span>        </div>        <div className="space-y-2">          {salesData.map((item, idx) => (            <div key={idx} className="flex items-center gap-2">              <span className="text-xs text-muted-foreground w-12">                {item.hour}              </span>              <div className="flex-1 bg-zinc-100 dark:bg-zinc-800 rounded-full h-2 overflow-hidden">                <motion.div                  initial={{ width: 0 }}                  animate={{ width: `${(item.sales / maxSales) * 100}%` }}                  transition={{ duration: 1, delay: idx * 0.1 }}                  className="h-full bg-emerald-500 rounded-full"                />              </div>              <span className="text-xs font-medium text-foreground w-16 text-right">                ${item.sales.toLocaleString()}              </span>            </div>          ))}        </div>      </div>    </motion.div>  );};

Usage

This component is a data-rich dashboard card displaying e-commerce metrics with animated visualizations and dark mode support. Perfect for dashboards, landing pages, and analytics interfaces.

Prop

Type