UploadKit
SDK@uploadkitdev/react

UploadTimeline

A GitHub/Linear-style vertical timeline where each file gets a status node with inline progress.

A vertical timeline with status dots and inline progress bars for each file. Nodes slide in from the left as files are added. The status dot pulses while uploading, shows a checkmark on success, or an X on error.

Design inspiration: GitHub PR timeline, Linear activity feed, Vercel deployment log.

motion is an optional peerDependency. Without it, transitions use CSS. pnpm add motion for spring slide-in entrances and smooth progress bar fills.

Drop files or click to upload

GitHub · Linear — activity timeline

Basic usage

import { UploadTimeline } from '@uploadkitdev/react';

export default function Page() {
  return (
    <UploadTimeline
      route="documentUploader"
      accept={['application/pdf', 'image/*']}
      maxFiles={10}
      onUploadComplete={(results) => {
        console.log('Uploaded:', results.map((r) => r.url));
      }}
    />
  );
}

Props

PropTypeDefaultDescription
routestring—Required. Route name from your file router.
acceptstring[]—Accepted MIME types.
maxSizenumber—Maximum file size in bytes.
maxFilesnumber—Maximum number of files.
metadataRecord<string, unknown>—JSON-serializable metadata forwarded to the server.
onUploadComplete(results: UploadResult[]) => void—Called after all files upload successfully.
onUploadError(error: Error) => void—Called on individual file failure.
classNamestring—Additional CSS class(es).
childrenReactNode—Override the drop zone label.

UploadTimeline accepts a ref forwarded to the outer <div>.

Timeline node anatomy

Each file appears as a node on the timeline:

  ●  mountain-sunrise.jpg          ← status dot + filename
  │  2.4 MB                        ← file size
  │  ████████████░░░░  72%         ← progress bar
  │  uploading...                  ← timestamp/status text
  │

Theming

VariablePurpose
--uk-primaryUploading dot color and progress fill
--uk-borderVertical line and idle dot color
--uk-text, --uk-text-secondaryFilename, size, and timestamp colors
--uk-successSuccess dot and checkmark
--uk-errorError dot and X icon

Accessibility

  • Drop zone node is role="button" — click opens file picker
  • Keyboard accessible via Enter and Space
  • Status dots use aria-label reflecting current state
  • Progress bars have role="progressbar" with aria-valuenow
  • Respects prefers-reduced-motion — dot pulse and slide-in animations disabled

On this page