Upload

Files in by drag, drop or browse, with progress you can trust.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Click to browse, or drop files onto the zone
Click to upload or drag and dropPNG, PDF or ZIP up to 10 MB
Configuration
State
Files
Hint
Click to upload or drag and dropPNG, PDF up to 10 MB
<Upload multiple accept=".png,.pdf" onUpload={fn} />
Behavior — The Engineering Contract
Prop / eventTypeNotes
onUpload(file, onProgress) => voidCalled per file; report 0–100
multiplebooleanAccept more than one file
accept / maxSizestring / numberType and size gates, checked before upload
drag / dropZone turns warm while a file hovers
removeCancels in-flight or clears a finished file

Show honest, determinate progress and keep every file removable. For a single avatar or image, a click-to-replace tile is friendlier than a full dropzone.

Anatomy
Click to upload or drag and dropPNG, PDF up to 10 MB
1DropzoneDashed target; turns warm on drag-over.
2PromptThe warm click affordance plus a hint.
3ConstraintsAccepted types and size, stated up front.
Do's and Don'ts
✓ Do
report.pdf

Show real, determinate progress so people know it is working.

✕ Don't
report.pdfUploading…

Don't hide progress behind a vague spinner. A bar is a promise.

✓ Do
PNG, PDF or ZIP · up to 10 MB

State the accepted types and size limit before anyone tries.

✕ Don't
huge-video.mov — too large

Don't upload then reject. Validate type and size before the request.

In context: Examples
A · Attachments
contract.pdf2.4 MBUploaded

File attachments in a form or message composer.

B · Bulk import
Drop a .csv to import

A wide dropzone for data imports and bulk uploads.

C · In progress
video.mp418 MB35%

Large files show live progress and a cancel affordance.

Measurements & Tokens
TokenValueRole
--up-zone-border1.5px dashed #2F2F36Resting dropzone edge
--up-over#FF7A00Drag-over border and wash
--up-bar#FF7A00Progress fill (green when done)
--up-done#1FA35CCompleted state
--up-radius12px zone · 9px rowCorners
--up-remove#EB4A4FRemove × on hover
Code
<div class="o-upload__zone">
  <CloudIcon />
  <span class="o-upload__title"><b>Click to upload</b> or drag and drop</span>
  <span class="o-upload__hint">PNG, PDF or ZIP up to 10 MB</span>
  <input type="file" multiple hidden />
</div>

<div class="o-upload__file">
  <FileIcon /> <span class="o-upload__name">report.pdf</span>
  <span class="o-upload__bar"><span style="width:45%"></span></span>
  <button class="o-upload__remove">×</button>
</div>