bigbullui logobigbullui
Componentdata

Order Card

Order status card with step dots and item summary.

Preview

Live Preview
Premium Headphones
25%

Premium Headphones

$299$399

Jordan Daisy

Product Designer

AvailableRemote
The Future of Design Systems

The Future of Design Systems

Alex Rivera8 min read
Oc
t 14

Tech Conference 2026

21:00
Berlin Arena
Invoice #INV-2026-0987draft
Date: 2026-09-15Due: 2026-10-15
ItemQtyPrice
Design Services1$150
Development Hours5$100
SubtotalNaN
Tax (10%)NaN
TotalNaN
THERMAL RECEIPT#SSQL96
Design Consultation$150
Development Hours$200
Total$385.00
Thank you for your purchase!
Premium Headphones
1
Phone Case
2
Subtotal$377.00
Tax$30.16
Total$407.16
Color
Size
Order #102938Processing
Design Services1x
Development5x
VIP

LOYALTY TIER

$100

Jordan Daisy

Happy Birthday!

J

Jordan Daisy

Product Designer

UX

Badge: EMP-8942

Wedding Reception

Please confirm your attendance

Installation

Tokens guide →

Add to your project via CLI (zero dependencies, code you own):

npx bigbullui add order-card

Or install the full npm package:

npm install bigbullui

Usage

import { OrderCard } from "@/components/ui/order-card";

<OrderCard />

Source code

order-card.tsx

Zero dependencies (only React + utils). Copy and paste directly into your project:

"use client";

import * as React from "react";
import { cn } from "./lib/utils";

export interface OrderCardProps {
  orderId: string;
  status: "Processing" | "Shipped" | "Delivered" | "Cancelled";
  progress?: number;
  items?: { label: string; qty: number }[];
  className?: string;
}

const ProgressBar = "order-progress-bar";
const StatusEnter = "order-status-enter";

export function OrderCard({
  orderId,
  status = "Processing",
  progress = 0,
  items,
  className,
}: OrderCardProps) {
  return (
    <div
      className={cn(
        "rounded-lg border border-foreground bg-card text-card-foreground p-6 transition-all duration-300 hover:translate-y-1 hover:shadow-lg motion-reduce:transition-none motion-reduce:translate-y-0 motion-reduce:shadow-none",
        className
      )}
    >
      <div className="flex items-baseline justify-between mb-4">
        <span className="font-mono text-sm uppercase tracking-widest">Order {orderId}</span>
        <span className={cn(
          "px-2 py-0.5 rounded text-xs font-mono uppercase tracking-wider",
          status === "Processing" && "bg-amber-500 text-amber-100",
          status === "Shipped" && "bg-green-500 text-green-100",
          status === "Delivered" && "bg-emerald-500 text-emerald-100",
          status === "Cancelled" && "bg-destructive text-destructive-foreground",
          StatusEnter
        )}>
          {status}
        </span>
      </div>

      {/* Progress bar */}
      {progress > 0 && progress < 1 && (
        <div className="w-full bg-secondary/20 rounded-h-full h-2 mb-3 overflow-hidden">
          <div
            className={cn(
              "h-full bg-accent rounded-h-full transition-width duration-500",
              ProgressBar,
              `w-${Math.min(progress * 100, 100)}%`
            )}
          />
        </div>
      )}

      {/* Items list */}
      {items && items.length > 0 && (
        <div className="space-y-2 text-sm">
          {items.map((it, i) => (
            <div key={i} className="flex items-baseline justify-between">
              <span className="font-medium">{it.label}</span>
              <span className="font-mono text-muted-foreground">{it.qty}x</span>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

Props

PropTypeDescription
orderIdstringOrder identifier (required).
status"Processing" | "Shipped" | "Delivered" | "Cancelled"Order status (required).
progressnumberFulfilment progress 0-100.