File Upload

Styled file upload zones with drag-and-drop, file lists, thumbnail previews, progress indicators, and neumorphic variants.

This component requires softui.js for interactive behavior.

Default

Click to upload or drag and drop
PNG, JPG, PDF up to 10MB
<div class="sui-file-upload" data-sui-upload="list">
  <input type="file" multiple>
  <div class="sui-file-upload-icon">
    <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
  </div>
  <div class="sui-file-upload-text"><strong>Click to upload</strong> or drag and drop</div>
  <div class="sui-file-upload-hint">PNG, JPG, PDF up to 10MB</div>
</div>

With File List

Click to upload or drag and drop
PNG, JPG, PDF up to 10MB
<div class="sui-file-upload" data-sui-upload="list">
  <input type="file" multiple>
  <div class="sui-file-upload-icon">
    <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
  </div>
  <div class="sui-file-upload-text"><strong>Click to upload</strong> or drag and drop</div>
  <div class="sui-file-upload-hint">PNG, JPG, PDF up to 10MB</div>
</div>

<!-- File list is auto-generated by softui.js -->
<!-- Each file item: -->
<div class="sui-file-list">
  <div class="sui-file-item">
    <div class="sui-file-item-icon">
      <svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
    </div>
    <div class="sui-file-item-info">
      <div class="sui-file-item-name">project-proposal.pdf</div>
      <div class="sui-file-item-size">2.4 MB</div>
    </div>
    <button class="sui-file-item-remove" aria-label="Remove">&times;</button>
  </div>
</div>

With Progress

Click to upload or drag and drop
Files will show simulated upload progress
<div class="sui-file-upload" data-sui-upload="progress">
  <input type="file" multiple>
  <div class="sui-file-upload-icon">
    <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
  </div>
  <div class="sui-file-upload-text"><strong>Click to upload</strong> or drag and drop</div>
  <div class="sui-file-upload-hint">PNG, JPG, PDF up to 10MB</div>
</div>

<!-- Progress list is auto-generated by softui.js -->
<!-- Each file item with progress: -->
<div class="sui-file-list">
  <div class="sui-file-item">
    <div class="sui-file-item-icon">
      <svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
    </div>
    <div class="sui-file-item-info sui-file-item-progress">
      <div style="display:flex;justify-content:space-between;align-items:center;">
        <div class="sui-file-item-name">report.pdf</div>
        <span class="sui-file-item-status sui-file-item-status-uploading">68%</span>
      </div>
      <div class="sui-progress sui-progress-sm">
        <div class="sui-progress-bar sui-progress-primary" style="width:68%;"></div>
      </div>
    </div>
    <button class="sui-file-item-remove" aria-label="Remove">&times;</button>
  </div>
</div>

<!-- Status variants: -->
<span class="sui-file-item-status sui-file-item-status-uploading">68%</span>
<span class="sui-file-item-status sui-file-item-status-complete">&#10003;</span>
<span class="sui-file-item-status sui-file-item-status-error">&#10005;</span>

With Preview

Upload images or drag and drop
PNG, JPG, WebP up to 5MB
<div class="sui-file-upload" data-sui-upload="preview">
  <input type="file" multiple accept="image/*">
  <div class="sui-file-upload-icon">
    <svg viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
  </div>
  <div class="sui-file-upload-text"><strong>Upload images</strong> or drag and drop</div>
  <div class="sui-file-upload-hint">PNG, JPG, WebP up to 5MB</div>
</div>

<!-- Preview grid is auto-generated by softui.js -->
<!-- Each preview item: -->
<div class="sui-file-preview-grid">
  <div class="sui-file-preview-item">
    <img src="path/to/image.jpg" alt="Preview">
    <button class="sui-file-preview-item-remove" aria-label="Remove">&times;</button>
  </div>
</div>

Compact

Choose a file or drag it here
<div class="sui-file-upload sui-file-upload-compact" data-sui-upload="list">
  <input type="file">
  <div class="sui-file-upload-icon">
    <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
  </div>
  <div class="sui-file-upload-text"><strong>Choose a file</strong> or drag it here</div>
</div>

Inset

Click to upload or drag and drop
PNG, JPG, PDF up to 10MB
<div class="sui-file-upload sui-file-upload-inset" data-sui-upload="list">
  <input type="file" multiple>
  <div class="sui-file-upload-icon">
    <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
  </div>
  <div class="sui-file-upload-text"><strong>Click to upload</strong> or drag and drop</div>
  <div class="sui-file-upload-hint">PNG, JPG, PDF up to 10MB</div>
</div>

Delete this item?

This action cannot be undone. This will permanently delete the item and remove all associated data.