Vector Motion
E-Commerce

Active Users Card - Real-time Traffic Analytics

Track active users, concurrent visitors, and real-time traffic patterns. Monitor user engagement and session activity on your e-commerce platform.

Active Users Card

The Active Users Card Track real-time active user activity.

Preview

Installation

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

Active Users Card
'use client';import React from "react";import { Users, Activity } 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 TimeData {  time: string;  users: number;  [key: string]: any;}interface ActiveUsersCardProps {  className?: string;  title?: string;  description?: string;  currentValue?: string;  valueDescription?: string;  timeData?: TimeData[];}const DEFAULT_TIME_DATA: TimeData[] = [  { time: "12PM", users: 1200 },  { time: "1PM", users: 1450 },  { time: "2PM", users: 1680 },  { time: "3PM", users: 1920 },  { time: "Now", users: 2150 },];const DEFAULT_TITLE = "Active Users";const DEFAULT_DESCRIPTION = "Real-time Activity";const DEFAULT_CURRENT_VALUE = "2,150";const DEFAULT_VALUE_DESCRIPTION = "Users online now";export const ActiveUsersCard: React.FC<ActiveUsersCardProps> = ({  className = "",  title = DEFAULT_TITLE,  description = DEFAULT_DESCRIPTION,  currentValue = DEFAULT_CURRENT_VALUE,  valueDescription = DEFAULT_VALUE_DESCRIPTION,  timeData = DEFAULT_TIME_DATA,}) => {  const isInteractive = true;  const index = 23;  const maxUsers = Math.max(...timeData.map((d) => d.users));  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">          <Users 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-1">          <div className="text-3xl font-bold text-foreground">            {currentValue}          </div>          <Activity className="h-5 w-5 text-emerald-500 animate-pulse" />        </div>        <p className="text-sm text-muted-foreground mb-4">{valueDescription}</p>        <div className="flex items-end justify-between h-32 gap-2">          {timeData.map((item, idx) => {            const height = (item.users / maxUsers) * 100;            return (              <div                key={idx}                className="flex-1 flex flex-col items-center gap-2"              >                <motion.div                  initial={{ height: 0 }}                  animate={{ height: `${height}%` }}                  transition={{ duration: 0.8, delay: idx * 0.1 }}                  className="w-full bg-gradient-to-t from-purple-500 to-purple-400 rounded-t-lg relative"                >                  <div className="absolute -top-6 left-1/2 -translate-x-1/2 text-xs font-medium text-foreground">                    {(item.users / 1000).toFixed(1)}K                  </div>                </motion.div>                <span className="text-xs text-muted-foreground">                  {item.time}                </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