VectorMotion
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://www.vectormotion.dev/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

On this page

Free block

Need this in production?

Unlock install commands, source access, commercial use, and AI prompts for all VectorMotion blocks.