klyv-ui

Upload Queue

Component

About

A floating or inline panel that tracks every file upload in progress, showing per-file progress, pause/resume/cancel/retry controls, and a byte-weighted overall percentage, collapsible to a small pill.

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds Upload Queue to your project and fits it to your theme.

Code

How Upload Queue is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

"use client";

import * as React from "react";
import UploadQueue from "@/components/ui/upload-queue";
import type { UploadQueueFile } from "@/components/ui/upload-queue";

const initialFiles: UploadQueueFile[] = [
  {
    id: "1",
    name: "Q3 board deck.pdf",
    size: 18_200_000,
    progress: 0.12,
    status: "uploading",
  },
  {
    id: "2",
    name: "product-demo-final.mp4",
    size: 202_000_000,
    progress: 0.04,
    status: "uploading",
  },
  {
    id: "3",
    name: "customer-interviews.zip",
    size: 9_600_000,
    progress: 0.31,
    status: "error",
    error: "Connection lost at 31%",
  },
  { id: "4", name: "logo@2x.png", size: 180_000, progress: 1, status: "done" },
  {
    id: "5",
    name: "pricing-sheet.xlsx",
    size: 899_000,
    progress: 0,
    status: "queued",
  },
];

export default function UploadQueueDemo() {
  const [files, setFiles] = React.useState<UploadQueueFile[]>(initialFiles);

  return (
    <div className="flex w-full items-center justify-center bg-[var(--color-canvas)] p-10 text-[var(--color-ink)]">
      <div className="w-[380px]">
        <UploadQueue
          files={files}
          label="Project uploads"
          onPause={(id: string) =>
            setFiles((prev) =>
              prev.map((f) => (f.id === id ? { ...f, status: "paused" } : f)),
            )
          }
          onResume={(id: string) =>
            setFiles((prev) =>
              prev.map((f) =>
                f.id === id ? { ...f, status: "uploading" } : f,
              ),
            )
          }
          onCancel={(id: string) =>
            setFiles((prev) => prev.filter((f) => f.id !== id))
          }
          onRetry={(id: string) =>
            setFiles((prev) =>
              prev.map((f) =>
                f.id === id
                  ? { ...f, status: "uploading", progress: 0, error: undefined }
                  : f,
              ),
            )
          }
          onClearCompleted={() =>
            setFiles((prev) => prev.filter((f) => f.status !== "done"))
          }
        />
      </div>
    </div>
  );
}

More by klyv-ui

View all
  • Gantt Chart

    Gantt Chart

    68
  • Klyv Animated Beam

    Klyv Animated Beam

    55
  • Shader Canvas

    Shader Canvas

    54
  • Pareto Chart

    Pareto Chart

    49
  • Sunburst Chart

    Sunburst Chart

    28
  • Gooey Loader

    Gooey Loader

    26
  • Fluid Canvas

    Fluid Canvas

    26
  • Morphing Text

    Morphing Text

    23