Vector Motion
E-Commerce

SKU Analytics Card - Product Variant Analysis

Analyze SKU-level performance and variant sales. Track product variations and inventory by SKU.

SKU Analytics Card

The SKU Analytics Card Analyze SKU-level performance and insights.

Preview

Installation

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

SKU Analytics Card
'use client';import React from "react";import { BarChart2, TrendingUp } 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 Sku {  sku: string;  name: string;  velocity: "fast" | "medium" | "slow";  sales: number;  margin: number;  [key: string]: any;}interface SkuAnalyticsCardProps {  className?: string;  title?: string;  description?: string;  totalSKUs?: string;  avgMargin?: string;  skus?: Sku[];}const DEFAULT_TITLE = "SKU Analytics";const DEFAULT_DESCRIPTION = "SKU Insights";const DEFAULT_TOTAL_SKUS = "1,247";const DEFAULT_AVG_MARGIN = "42%";const DEFAULT_SKUS: Sku[] = [  {    sku: "WH-001",    name: "Wireless Headphones",    velocity: "fast",    sales: 342,    margin: 45,  },  {    sku: "SW-205",    name: "Smart Watch",    velocity: "medium",    sales: 198,    margin: 38,  },  {    sku: "PC-103",    name: "Phone Case",    velocity: "slow",    sales: 89,    margin: 52,  },];export const SkuAnalyticsCard: React.FC<SkuAnalyticsCardProps> = ({  className = "",  title = DEFAULT_TITLE,  description = DEFAULT_DESCRIPTION,  totalSKUs = DEFAULT_TOTAL_SKUS,  avgMargin = DEFAULT_AVG_MARGIN,  skus = DEFAULT_SKUS,}) => {  const isInteractive = true;  const index = 17;  const getVelocityColor = (velocity: string) => {    if (velocity === "fast") return "text-emerald-500";    if (velocity === "medium") return "text-amber-500";    return "text-muted-foreground";  };  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">          <BarChart2 className="h-5 w-5 text-blue-500" />        </div>      </div>      <div className="relative z-10 flex-1">        <div className="grid grid-cols-2 gap-3 mb-4">          <div>            <div className="text-xs text-muted-foreground mb-1">Total SKUs</div>            <div className="text-2xl font-bold text-foreground">              {totalSKUs}            </div>          </div>          <div>            <div className="text-xs text-muted-foreground mb-1">Avg Margin</div>            <div className="text-2xl font-bold text-emerald-500">              {avgMargin}            </div>          </div>        </div>        <div className="space-y-3">          {skus.map((sku, idx) => (            <motion.div              key={idx}              initial={{ opacity: 0, x: -10 }}              animate={{ opacity: 1, x: 0 }}              transition={{ duration: 0.4, delay: idx * 0.1 }}              className="bg-muted rounded-lg p-3"            >              <div className="flex justify-between items-start mb-2">                <div>                  <div className="text-xs font-mono text-muted-foreground">                    {sku.sku}                  </div>                  <div className="text-sm font-medium text-foreground">                    {sku.name}                  </div>                </div>                <span                  className={`text-xs font-bold uppercase ${getVelocityColor(sku.velocity)}`}                >                  {sku.velocity}                </span>              </div>              <div className="flex justify-between text-xs">                <span className="text-muted-foreground">                  Sales:{" "}                  <span className="font-medium text-foreground">                    {sku.sales}                  </span>                </span>                <span className="text-muted-foreground">                  Margin:{" "}                  <span className="font-medium text-emerald-500">                    {sku.margin}%                  </span>                </span>              </div>            </motion.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