Vector Motion
E-Commerce

Inventory Turnover Card - Stock Management

Monitor inventory turnover rates and stock rotation. Track inventory efficiency and optimize stock levels.

Inventory Turnover Card

The Inventory Turnover Card Monitor stock rotation and turnover metrics.

Preview

Installation

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

Inventory Turnover Card
'use client';import React from "react";import { RefreshCw, 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 Category {  name: string;  turnover: number;  target: number;  color: string;  [key: string]: any;}interface InventoryTurnoverCardProps {  className?: string;  title?: string;  description?: string;  averageTurnover?: string;  turnoverChange?: number;  categories?: Category[];}const DEFAULT_TITLE = "Inventory Turnover";const DEFAULT_DESCRIPTION = "Stock Rotation";const DEFAULT_AVERAGE_TURNOVER = "7.9x";const DEFAULT_TURNOVER_CHANGE = 15;const DEFAULT_CATEGORIES: Category[] = [  { name: "Electronics", turnover: 8.5, target: 10, color: "bg-blue-500" },  {    name: "Accessories",    turnover: 12.3,    target: 10,    color: "bg-emerald-500",  },  { name: "Apparel", turnover: 6.2, target: 8, color: "bg-amber-500" },  { name: "Home Goods", turnover: 4.8, target: 6, color: "bg-purple-500" },];export const InventoryTurnoverCard: React.FC<InventoryTurnoverCardProps> = ({  className = "",  title = DEFAULT_TITLE,  description = DEFAULT_DESCRIPTION,  averageTurnover = DEFAULT_AVERAGE_TURNOVER,  turnoverChange = DEFAULT_TURNOVER_CHANGE,  categories = DEFAULT_CATEGORIES,}) => {  const isInteractive = true;  const index = 14;  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">          <RefreshCw className="h-5 w-5 text-purple-500" />        </div>      </div>      <div className="relative z-10 flex-1">        <div className="flex items-baseline gap-2 mb-4">          <div className="text-3xl font-bold text-foreground">            {averageTurnover}          </div>          <div className="flex items-center gap-1 text-sm">            <TrendingUp className="h-4 w-4 text-emerald-500" />            <span className="text-emerald-500 font-medium">              +{turnoverChange}%            </span>          </div>        </div>        <p className="text-sm text-muted-foreground mb-4">          Average turnover rate        </p>        <div className="space-y-3">          {categories.map((cat, idx) => (            <div key={idx}>              <div className="flex justify-between items-center mb-1">                <span className="text-sm text-foreground">{cat.name}</span>                <div className="flex items-center gap-2">                  <span className="text-sm font-bold text-foreground">                    {cat.turnover}x                  </span>                  <span className="text-xs text-muted-foreground">                    / {cat.target}x                  </span>                </div>              </div>              <div className="flex items-center gap-2">                <div className="flex-1 bg-zinc-100 dark:bg-zinc-800 rounded-full h-2 overflow-hidden">                  <motion.div                    initial={{ width: 0 }}                    animate={{                      width: `${Math.min((cat.turnover / cat.target) * 100, 100)}%`,                    }}                    transition={{ duration: 1, delay: idx * 0.1 }}                    className={`h-full ${cat.color} rounded-full`}                  />                </div>                <span                  className={`text-xs font-medium ${cat.turnover >= cat.target                      ? "text-emerald-500"                      : "text-amber-500"                    }`}                >                  {cat.turnover >= cat.target                    ? "?"                    : Math.round((cat.turnover / cat.target) * 100) + "%"}                </span>              </div>            </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