Skip to content

Files and uploads

People add files by choosing them or by dropping them on the page, and they keep working while the upload runs. The file lands where it was dropped, opens in place and is shared at an access level stated in words.

What carries it

Metalworks Maribor

NameSizeModified
Signed contracts12 files25 Sep
Work permits8 files23 Sep
cv-ana-kovac.pdf412 KB24 Sep
offer-metalworks-maribor.docx88 KB22 Sep
passport-scan.jpg2.1 MB21 Sep

A file belongs to one record: a Drive folder, a row on a board or an email. The same parts run an upload wherever files are accepted.

Upload button
Secondary button in the toolbar; picks several files at once
Drop target
Tints the whole folder while files are above it
--nav-fill-active
Upload tray
One panel for all running uploads, bottom right
--elevation-3
Preview
A dialog with the file, Download and Open in a new tab
Share dialog
The access level and the people who hold it

Adding a file

Offer both ways in: the Upload button, and a drop anywhere on the folder or on the email being written.

Dragging a Drive item onto a folder moves it, and the folder row lights as the target.

A file too large for its place is refused before it starts: Files up to 25 MB. That one is too large.

While it uploads

The tray reports all uploads in one place and keeps running after the person leaves the folder. One line sums the queue over a green bar that fills as the bytes arrive.

Each file keeps its own row with its name, its percent and Cancel. A failed file keeps its row, says what went wrong and offers Retry.

Metalworks Maribor

Uploading 3 files

46%
40%
Upload failed. Check your connection and try again.
Tray width
320 px, or the window minus 32 px
Tray position
16 px from the right edge, 24 px on windows 1024 px and wider, and above the phone's bottom bar
--space-4, --space-6
Tray corner
12 px
--radius-xl
Progress bar
38 by 19 px, green while running, red on failure
--success, --error

Opening, saving and sharing

A click opens the file where it lives: a document in the editor, an image or a PDF in the preview. A format the browser cannot show says so and offers Download and Open in a new tab.

Documents save as you type, so there is no Save button to forget.

Share names the access in plain words. Private: only you and the people you grant access. Team: every signed in member can view. Public link: anyone with the link can view. A person added by name is a Viewer or an Editor.

Empty, slow and failed

On a slow connection the percent keeps moving, and nothing covers the screen while a file travels.

A failure names the cause and the next step: Upload failed. Check your connection and try again. A refusal names the reason: Upload was refused. You may not have access to save here.

Nepal welders, October

Nothing here yet

Upload files or add a folder.

Drops and progress

Permitted

  • A drop target that names the result

    Drop files to upload, shown only while files are above it.

  • A menu command beside each drag

    Move reaches the same folders from the keyboard.

Not permitted

  • A dialog that blocks the page during an upload

    The person loses the task they came for.

  • Two progress displays for one upload

    The tray is the one place that reports an upload.

NextPrinting and export

Files and uploads

Adding files to Drive, a board cell or an email, following their upload, opening them in place and sharing them at a stated access level.

  • Kind: pattern
  • Page: https://design.werklist.com/patterns/files
  • Version: 2.1.2

When to use it

  • Any screen that accepts a file: a Drive folder, a file cell on a board, an email being written, a public application form.
  • Moving items between Drive folders by drag, with Move in the item menu as the keyboard path.

When not to use it

  • A progress dialog that blocks the page. The tray reports progress while the page stays in use.
  • A second progress display beside the tray.

Rules

  • A file lands where it was dropped or chosen.
  • Uploads continue when the screen that started them closes.
  • Drive accepts files up to 50 GB. Attachments on a board or an email are up to 25 MB.
  • A file that is too large is refused before it starts, with the limit in the sentence.
  • Every drag has a menu equivalent.
  • The tray is the one place that reports an upload.
  • Documents save as you type, with no Save button.

Anatomy

  • Upload button: secondary button, 36 px, in the toolbar; opens the file picker for several files at once (--surface-control)
  • Drop target: covers the folder or the email being written; radius 16 px; fill only, no border; the sentence Drop files to upload at 14/20 weight 500, centered (--nav-fill-active, --radius-2xl, --type-product-body, --brand-ink)
  • Upload tray: fixed at the bottom right, 16 px from the right edge, 24 px on windows 1024 px and wider, and above the phone's bottom bar; 320 px wide, or the window minus 32 px; radius 12 px; padding 12 px (--surface-1, --elevation-3, --radius-xl, --space-3, --layer-toast)
  • Progress bar: 38 by 19 px (30 by 15 px collapsed), radius 5 px, fill inset 1.5 px; a green gradient while running, the error fill on failure (--success, --success-deep, --error, --surface-control)
  • Summary line: 13/18 weight 500; percent and size 12/16 in tabular digits (--type-product-dense, --type-product-caption)
  • File row: status glyph 20 px; name 12/16, cut in the middle so the extension stays in view; percent in tabular digits; a 24 px glyph button, 44 px to touch on touch screens (--type-product-caption, --text, --text-muted)
  • Collapsed tray: one row with the bar and the summary, radius 12 px (--radius-xl)

States

  • Drag over: The drop target tint and sentence appear, and leave when the files leave or drop (--nav-fill-active)
  • Item dragged over a folder: The folder row takes the hover fill and full ink (--glass-fill-hover, --text)
  • Queued: A row with the name and 0 percent (--text-muted)
  • Uploading: The bar fills with the total percent; each row shows its own percent and Cancel (--success)
  • Done: A check glyph; the rows clear once every upload has finished (--success-ink)
  • Failed: The bar takes the error fill; the row keeps the reason and Retry (--error, --error-ink)
  • Refused before start: The row shows the limit sentence, and nothing is sent (--error-ink)
  • Collapsed: One row with the bar and the summary; a click expands it (--radius-xl)

Keyboard

  • Tab: Reaches Upload, then Collapse in the tray, then each row's Cancel, Retry or Dismiss
  • Enter or Space on Upload: Opens the file picker
  • Enter on an item: Opens the file in the editor or the preview
  • Escape: Closes the preview, the share dialog or the move dialog and returns focus to the item

Accessibility

  • The summary line is announced when an upload starts, finishes or fails, not at each percent.
  • Each file row is a progress bar named with the file name.
  • The drop target is hidden from screen readers. The Upload button and Move are the accessible paths.
  • Cancel, Retry and Dismiss carry the file name in their names, such as Cancel upload of cv-ana-kovac.pdf.
  • Tray controls are 44 px to touch on touch screens.

Content

  • Summary: Uploading 3 files, 2 files uploaded, 1 file failed.
  • Drop target: Drop files to upload.
  • Limit: Files up to 25 MB. That one is too large. The sentence names the limit of the place the file was dropped.
  • Failure: Upload failed. Check your connection and try again. Refusal: Upload was refused. You may not have access to save here. Cancel: Upload canceled.
  • Empty folder: Nothing here yet. Upload files or add a folder.
  • Share levels: Private, only you and people you grant access; Team, every signed in member can view; Public link, anyone with the link can view. People: Viewer, Editor.

Tokens

  • --nav-fill-active
  • --brand-ink
  • --surface-1
  • --surface-control
  • --elevation-3
  • --radius-xl
  • --radius-2xl
  • --success
  • --success-deep
  • --success-ink
  • --error
  • --error-ink
  • --text
  • --text-muted
  • --type-product-body
  • --type-product-dense
  • --type-product-caption
  • --space-3
  • --space-4
  • --space-6
  • --layer-toast
  • --focus-ring

JSON

{
  "title": "Files and uploads",
  "path": "/patterns/files",
  "url": "https://design.werklist.com/patterns/files",
  "text": "https://design.werklist.com/agent/patterns/files",
  "summary": "How people add a file, follow its upload, open it and share it, in Drive, on a board and in email.",
  "version": "2.1.2",
  "kind": "pattern",
  "name": "Files and uploads",
  "purpose": "Adding files to Drive, a board cell or an email, following their upload, opening them in place and sharing them at a stated access level.",
  "use": [
    "Any screen that accepts a file: a Drive folder, a file cell on a board, an email being written, a public application form.",
    "Moving items between Drive folders by drag, with Move in the item menu as the keyboard path."
  ],
  "avoid": [
    "A progress dialog that blocks the page. The tray reports progress while the page stays in use.",
    "A second progress display beside the tray."
  ],
  "anatomy": [
    {
      "part": "Upload button",
      "measure": "secondary button, 36 px, in the toolbar; opens the file picker for several files at once",
      "token": "--surface-control"
    },
    {
      "part": "Drop target",
      "measure": "covers the folder or the email being written; radius 16 px; fill only, no border; the sentence Drop files to upload at 14/20 weight 500, centered",
      "token": "--nav-fill-active, --radius-2xl, --type-product-body, --brand-ink"
    },
    {
      "part": "Upload tray",
      "measure": "fixed at the bottom right, 16 px from the right edge, 24 px on windows 1024 px and wider, and above the phone's bottom bar; 320 px wide, or the window minus 32 px; radius 12 px; padding 12 px",
      "token": "--surface-1, --elevation-3, --radius-xl, --space-3, --layer-toast"
    },
    {
      "part": "Progress bar",
      "measure": "38 by 19 px (30 by 15 px collapsed), radius 5 px, fill inset 1.5 px; a green gradient while running, the error fill on failure",
      "token": "--success, --success-deep, --error, --surface-control"
    },
    {
      "part": "Summary line",
      "measure": "13/18 weight 500; percent and size 12/16 in tabular digits",
      "token": "--type-product-dense, --type-product-caption"
    },
    {
      "part": "File row",
      "measure": "status glyph 20 px; name 12/16, cut in the middle so the extension stays in view; percent in tabular digits; a 24 px glyph button, 44 px to touch on touch screens",
      "token": "--type-product-caption, --text, --text-muted"
    },
    {
      "part": "Collapsed tray",
      "measure": "one row with the bar and the summary, radius 12 px",
      "token": "--radius-xl"
    }
  ],
  "states": [
    {
      "name": "Drag over",
      "change": "The drop target tint and sentence appear, and leave when the files leave or drop",
      "tokens": [
        "--nav-fill-active"
      ]
    },
    {
      "name": "Item dragged over a folder",
      "change": "The folder row takes the hover fill and full ink",
      "tokens": [
        "--glass-fill-hover",
        "--text"
      ]
    },
    {
      "name": "Queued",
      "change": "A row with the name and 0 percent",
      "tokens": [
        "--text-muted"
      ]
    },
    {
      "name": "Uploading",
      "change": "The bar fills with the total percent; each row shows its own percent and Cancel",
      "tokens": [
        "--success"
      ]
    },
    {
      "name": "Done",
      "change": "A check glyph; the rows clear once every upload has finished",
      "tokens": [
        "--success-ink"
      ]
    },
    {
      "name": "Failed",
      "change": "The bar takes the error fill; the row keeps the reason and Retry",
      "tokens": [
        "--error",
        "--error-ink"
      ]
    },
    {
      "name": "Refused before start",
      "change": "The row shows the limit sentence, and nothing is sent",
      "tokens": [
        "--error-ink"
      ]
    },
    {
      "name": "Collapsed",
      "change": "One row with the bar and the summary; a click expands it",
      "tokens": [
        "--radius-xl"
      ]
    }
  ],
  "keys": [
    {
      "key": "Tab",
      "action": "Reaches Upload, then Collapse in the tray, then each row's Cancel, Retry or Dismiss"
    },
    {
      "key": "Enter or Space on Upload",
      "action": "Opens the file picker"
    },
    {
      "key": "Enter on an item",
      "action": "Opens the file in the editor or the preview"
    },
    {
      "key": "Escape",
      "action": "Closes the preview, the share dialog or the move dialog and returns focus to the item"
    }
  ],
  "accessibility": [
    "The summary line is announced when an upload starts, finishes or fails, not at each percent.",
    "Each file row is a progress bar named with the file name.",
    "The drop target is hidden from screen readers. The Upload button and Move are the accessible paths.",
    "Cancel, Retry and Dismiss carry the file name in their names, such as Cancel upload of cv-ana-kovac.pdf.",
    "Tray controls are 44 px to touch on touch screens."
  ],
  "content": [
    "Summary: Uploading 3 files, 2 files uploaded, 1 file failed.",
    "Drop target: Drop files to upload.",
    "Limit: Files up to 25 MB. That one is too large. The sentence names the limit of the place the file was dropped.",
    "Failure: Upload failed. Check your connection and try again. Refusal: Upload was refused. You may not have access to save here. Cancel: Upload canceled.",
    "Empty folder: Nothing here yet. Upload files or add a folder.",
    "Share levels: Private, only you and people you grant access; Team, every signed in member can view; Public link, anyone with the link can view. People: Viewer, Editor."
  ],
  "rules": [
    "A file lands where it was dropped or chosen.",
    "Uploads continue when the screen that started them closes.",
    "Drive accepts files up to 50 GB. Attachments on a board or an email are up to 25 MB.",
    "A file that is too large is refused before it starts, with the limit in the sentence.",
    "Every drag has a menu equivalent.",
    "The tray is the one place that reports an upload.",
    "Documents save as you type, with no Save button."
  ],
  "tokens": [
    "--nav-fill-active",
    "--brand-ink",
    "--surface-1",
    "--surface-control",
    "--elevation-3",
    "--radius-xl",
    "--radius-2xl",
    "--success",
    "--success-deep",
    "--success-ink",
    "--error",
    "--error-ink",
    "--text",
    "--text-muted",
    "--type-product-body",
    "--type-product-dense",
    "--type-product-caption",
    "--space-3",
    "--space-4",
    "--space-6",
    "--layer-toast",
    "--focus-ring"
  ]
}

Raw file: https://design.werklist.com/agent/patterns/files