Skip to content

Image: Add upload progress indicator with cancel button and a11y announcements#75110

Closed
adamsilverstein wants to merge 16 commits intotrunkfrom
74363-progress-indicator-2
Closed

Image: Add upload progress indicator with cancel button and a11y announcements#75110
adamsilverstein wants to merge 16 commits intotrunkfrom
74363-progress-indicator-2

Conversation

@adamsilverstein
Copy link
Copy Markdown
Member

@adamsilverstein adamsilverstein commented Jan 31, 2026

What?

Closes #74363

Part of client side media.

Replace the plain <Spinner /> shown during image uploads with a rich progress overlay that displays:

  • A <ProgressBar> showing upload/processing completion
  • The current operation label (e.g. "Uploading…", "Resizing…", "Compressing…")
  • A numeric percentage
  • A Cancel button to abort the upload
  • Batch progress: "Image x of y" when uploading multiple images simultaneously
  • Thumbnail progress: "Generating subsize x of y" during client-side thumbnail generation

Also adds screen reader announcements via wp.a11y.speak for upload start, completion, and errors — with batch-aware announcements that say "Uploading N images…" once instead of N separate announcements.

Why?

The Image block previously showed only a spinner during uploads with no progress feedback, no way to cancel, and no screen reader support. With the addition of client-side media processing (resize, rotate, transcode, thumbnail generation), uploads can take significantly longer and go through multiple stages — making progress feedback essential.

When uploading multiple images at once, each block previously showed an identical generic overlay with no indication of batch context. Now each overlay shows its position in the batch ("Image 3 of 5"), and screen readers hear a single batch announcement instead of N duplicates.

How?

Upload overlay & progress

  • UploadingOverlay component (uploading-overlay.js): Renders the progress overlay with ProgressBar, operation label, percentage, and cancel button. Retrieves upload state from the @wordpress/upload-media store via getItemByBlobUrl.
  • useUploadAnnouncer hook (use-upload-announcer.js): Announces upload start (polite), completion (polite), and errors (assertive) via wp.a11y.speak.
  • getItemByBlobUrl selector (private-selectors.ts): Private selector in @wordpress/upload-media that finds a queue item by its blob URL.
  • Styles (editor.scss): Overlay positioned absolutely over the image with semi-transparent background, centered content.

Batch progress (multi-image uploads)

  • batchSize / batchIndex on QueueItem: Each item stores its 1-based position and total count from the originating batch. Computed via a pre-validation pass in addItems() so only valid files are counted.
  • Overlay label: Shows "Image x of y" when batchSize > 1.
  • Screen reader: First item in the batch announces "Uploading N images…"; subsequent items skip the start announcement. Completion is announced once with "N images uploaded successfully."

Thumbnail generation progress

  • thumbnailCount on QueueItem: Set in generateThumbnails() to the total number of sideload items created (subsizes + scaled version).
  • getChildItemCount selector: Counts remaining child sideload items for a parent.
  • Overlay label: Shows "Generating subsize x of y" derived from thumbnailCount - remainingChildren + 1.

Accessibility improvements

  • role="status" on the overlay makes it a live region for automatic screen reader announcements
  • aria-busy on the image element during upload signals in-progress state
  • Descriptive aria-label="Upload progress" on the ProgressBar
  • Focus is restored to the block wrapper when the overlay unmounts (e.g. Cancel button had focus)

Testing Instructions

  1. Open a new post
  2. Insert an Image block
  3. Upload a large image (or any image if client-side media processing is enabled)
  4. Verify the progress overlay appears showing:
    • A progress bar
    • Operation label (e.g. "Uploading…")
    • Percentage (e.g. "42%")
    • A "Cancel" button
  5. Wait for upload to complete — verify the overlay disappears
  6. Repeat and click "Cancel" during upload — verify the upload is cancelled and the block resets

Multi-image batch upload

  1. Insert 5 Image blocks (or a Gallery block)
  2. Drag 5 images at once
  3. Verify each overlay shows "Image x of 5" (each with its own index)
  4. With a screen reader, verify "Uploading 5 images…" is announced once (not 5 times)
  5. After all complete, verify "5 images uploaded successfully." is announced once

Thumbnail generation progress

  1. Enable client-side media processing (if available)
  2. Upload a large image
  3. During thumbnail generation, verify the overlay shows "Generating subsize 1 of 4" → "Generating subsize 2 of 4" etc.

Testing Instructions for Keyboard

  1. Insert an Image block and tab to the upload input
  2. Upload an image using keyboard
  3. Verify the cancel button is focusable via Tab during upload
  4. Press Enter/Space on Cancel to abort the upload
  5. After upload completes and the overlay disappears, verify focus returns to a logical location (the image block or its toolbar)

Accessibility Testing Plan

This section addresses the needs-accessibility-feedback label. The following tests should be performed across multiple screen readers.

Screen Readers to Test

  • VoiceOver (macOS Safari and/or Chrome)
  • NVDA (Windows, Firefox and/or Chrome)
  • JAWS (Windows, Chrome) — if available

1. Upload Start Announcement

  • Upload a single image and verify the screen reader announces "Uploading [filename]…" (or "Uploading image…" if filename is unavailable)
  • Upload multiple images and verify a single "Uploading N images…" announcement (no per-item duplicates)
  • Confirm the announcement uses polite priority (does not interrupt current speech)

2. Upload Completion Announcement

  • Wait for a single upload to complete and verify "[filename] uploaded successfully." is announced
  • Wait for a batch upload to complete and verify "N images uploaded successfully." is announced once
  • Confirm the announcement uses polite priority
  • Confirm no announcement is made if the upload was cancelled

3. Error Announcement

  • Trigger an upload error (e.g., upload a file exceeding the server size limit, or disconnect network mid-upload)
  • Verify "Upload failed: [error message]" is announced
  • Confirm the error announcement uses assertive priority (interrupts current speech)

4. Cancel Button

  • During an upload, use Tab to navigate to the Cancel button
  • Verify the button is announced as "Cancel, button" (or equivalent)
  • Activate the button with Enter or Space and verify the upload is cancelled
  • Verify the cancellation announcement ("Upload cancelled by user") is spoken

5. Progress Bar Semantics

  • Navigate to the progress bar during upload and verify it is announced as a progress element with a value (e.g., "Upload progress, 42%, progress bar")
  • Verify the progress bar has the accessible name "Upload progress"

6. Operation Label Changes

  • During a multi-stage upload (e.g., with client-side processing enabled), verify that stage changes (Uploading → Resizing → Compressing → Generating thumbnails) are perceivable via role="status" live region
  • During thumbnail generation, verify "Generating subsize x of y" updates are announced

7. Focus Management

  • Verify focus is not unexpectedly moved when the overlay appears
  • After upload completes and the overlay disappears, verify focus returns to the block wrapper (not lost to document body)
  • Verify aria-busy is set on the image element during upload and removed after completion

8. Multiple Image Uploads

  • Upload 3+ images simultaneously (e.g., drag multiple files into Image blocks or a Gallery block)
  • Verify each overlay shows "Image x of y" with the correct index
  • Verify announcements are coherent: one "Uploading N images…" at start, one "N images uploaded successfully." at end
  • Verify each overlay independently shows the correct progress for its respective upload

9. Visual Accessibility

  • Verify color contrast of the overlay text ($gray-700 on white/near-white background) meets WCAG AA (4.5:1 ratio)
  • Test with Windows High Contrast Mode — verify the overlay and progress bar remain visible and usable
  • Test with prefers-reduced-motion: reduce — verify the progress bar does not animate (or uses a reduced animation)

Screenshots or screencast

Before - Plain spinner, no progress info

screencast.2026-02-28.16-56-52.mp4

After:

Single

upload.with.progress.mp4

Multiple

multi.upload.mp4

@adamsilverstein adamsilverstein added [Type] Enhancement A suggestion for improvement. [Feature] Client Side Media Media processing in the browser with WASM labels Jan 31, 2026
@github-project-automation github-project-automation bot moved this to 🔎 Needs Review in WordPress 7.0 Editor Tasks Jan 31, 2026
@github-actions github-actions bot added the [Package] Block library /packages/block-library label Jan 31, 2026
@adamsilverstein adamsilverstein changed the title Add progress indicator 2 Add progress indicator Jan 31, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 31, 2026

Size Change: +4.13 kB (+0.05%)

Total Size: 7.74 MB

Filename Size Change
build/scripts/block-library/index.min.js 319 kB +1.86 kB (+0.59%)
build/scripts/upload-media/index.min.js 8.04 kB +164 B (+2.08%)
build/styles/block-library/editor-rtl.css 12.7 kB +155 B (+1.24%)
build/styles/block-library/editor-rtl.min.css 10.5 kB +149 B (+1.45%)
build/styles/block-library/editor.css 12.7 kB +154 B (+1.23%)
build/styles/block-library/editor.min.css 10.5 kB +152 B (+1.47%)
build/styles/block-library/gallery/editor-rtl.css 1.72 kB +201 B (+13.21%) ⚠️
build/styles/block-library/gallery/editor-rtl.min.css 803 B +188 B (+30.57%) 🚨
build/styles/block-library/gallery/editor.css 1.72 kB +200 B (+13.15%) ⚠️
build/styles/block-library/gallery/editor.min.css 806 B +190 B (+30.84%) 🚨
build/styles/block-library/image/editor-rtl.css 1.83 kB +186 B (+11.31%) ⚠️
build/styles/block-library/image/editor-rtl.min.css 953 B +171 B (+21.87%) 🚨
build/styles/block-library/image/editor.css 1.83 kB +185 B (+11.26%) ⚠️
build/styles/block-library/image/editor.min.css 953 B +173 B (+22.18%) 🚨
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 617 B
build/modules/block-library/accordion/view.min.js 595 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 2.64 kB
build/modules/block-library/navigation/view.min.js 1.14 kB
build/modules/block-library/playlist/view.min.js 10.9 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 946 B
build/modules/boot/index.min.js 16.9 kB
build/modules/connectors/index.min.js 2.05 kB
build/modules/core-abilities/index.min.js 892 B
build/modules/edit-site-init/index.min.js 1.4 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.6 kB
build/modules/interactivity/index.min.js 15.1 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 13.7 kB
build/modules/route/index.min.js 25.2 kB
build/modules/vips/loader.min.js 127 B
build/modules/vips/worker.min.js 4.56 MB
build/modules/workflow/index.min.js 19.9 kB
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/annotations/index.min.js 2.39 kB
build/scripts/api-fetch/index.min.js 2.83 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/base-styles/index.min.js 98 B
build/scripts/blob/index.min.js 631 B
build/scripts/block-directory/index.min.js 8.03 kB
build/scripts/block-editor/index.min.js 338 kB
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/blocks/index.min.js 56.8 kB
build/scripts/commands/index.min.js 21 kB
build/scripts/components/index.min.js 265 kB
build/scripts/compose/index.min.js 11.1 kB
build/scripts/core-commands/index.min.js 4.31 kB
build/scripts/core-data/index.min.js 30.3 kB
build/scripts/customize-widgets/index.min.js 12.3 kB
build/scripts/data-controls/index.min.js 795 B
build/scripts/data/index.min.js 9.65 kB
build/scripts/date/index.min.js 23.6 kB
build/scripts/deprecated/index.min.js 756 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/dom/index.min.js 5 kB
build/scripts/edit-post/index.min.js 16.4 kB
build/scripts/edit-site/index.min.js 261 kB
build/scripts/edit-widgets/index.min.js 19.9 kB
build/scripts/editor/index.min.js 410 kB
build/scripts/element/index.min.js 5.2 kB
build/scripts/escape-html/index.min.js 587 B
build/scripts/format-library/index.min.js 10.7 kB
build/scripts/hooks/index.min.js 1.83 kB
build/scripts/html-entities/index.min.js 494 B
build/scripts/i18n/index.min.js 2.46 kB
build/scripts/is-shallow-equal/index.min.js 572 B
build/scripts/keyboard-shortcuts/index.min.js 1.57 kB
build/scripts/keycodes/index.min.js 1.56 kB
build/scripts/list-reusable-blocks/index.min.js 2.44 kB
build/scripts/media-utils/index.min.js 77.3 kB
build/scripts/notices/index.min.js 1.9 kB
build/scripts/nux/index.min.js 1.89 kB
build/scripts/patterns/index.min.js 7.98 kB
build/scripts/plugins/index.min.js 2.15 kB
build/scripts/preferences-persistence/index.min.js 2.15 kB
build/scripts/preferences/index.min.js 3.3 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.62 kB
build/scripts/private-apis/index.min.js 1.1 kB
build/scripts/react-i18n/index.min.js 833 B
build/scripts/redux-routine/index.min.js 3.37 kB
build/scripts/reusable-blocks/index.min.js 3.1 kB
build/scripts/rich-text/index.min.js 14 kB
build/scripts/router/index.min.js 5.96 kB
build/scripts/server-side-render/index.min.js 1.91 kB
build/scripts/shortcode/index.min.js 1.59 kB
build/scripts/style-engine/index.min.js 2.36 kB
build/scripts/sync/index.min.js 38.1 kB
build/scripts/theme/index.min.js 22 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 918 B
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43.3 kB
build/scripts/vendors/react-jsx-runtime.min.js 667 B
build/scripts/vendors/react.min.js 2.77 kB
build/scripts/viewport/index.min.js 1.21 kB
build/scripts/warning/index.min.js 454 B
build/scripts/widgets/index.min.js 7.8 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/base-styles/admin-schemes-rtl.css 1.71 kB
build/styles/base-styles/admin-schemes-rtl.min.css 775 B
build/styles/base-styles/admin-schemes.css 1.71 kB
build/styles/base-styles/admin-schemes.min.css 775 B
build/styles/block-directory/style-rtl.css 1.96 kB
build/styles/block-directory/style-rtl.min.css 1.05 kB
build/styles/block-directory/style.css 1.97 kB
build/styles/block-directory/style.min.css 1.05 kB
build/styles/block-editor/content-rtl.css 5.44 kB
build/styles/block-editor/content-rtl.min.css 4.02 kB
build/styles/block-editor/content.css 5.45 kB
build/styles/block-editor/content.min.css 4.01 kB
build/styles/block-editor/default-editor-styles-rtl.css 697 B
build/styles/block-editor/default-editor-styles-rtl.min.css 224 B
build/styles/block-editor/default-editor-styles.css 697 B
build/styles/block-editor/default-editor-styles.min.css 224 B
build/styles/block-editor/style-rtl.css 18.4 kB
build/styles/block-editor/style-rtl.min.css 15.7 kB
build/styles/block-editor/style.css 18.4 kB
build/styles/block-editor/style.min.css 15.7 kB
build/styles/block-library/accordion-heading/style-rtl.css 346 B
build/styles/block-library/accordion-heading/style-rtl.min.css 325 B
build/styles/block-library/accordion-heading/style.css 346 B
build/styles/block-library/accordion-heading/style.min.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 239 B
build/styles/block-library/accordion-item/style-rtl.min.css 180 B
build/styles/block-library/accordion-item/style.css 238 B
build/styles/block-library/accordion-item/style.min.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 110 B
build/styles/block-library/accordion-panel/style-rtl.min.css 99 B
build/styles/block-library/accordion-panel/style.css 110 B
build/styles/block-library/accordion-panel/style.min.css 99 B
build/styles/block-library/accordion/style-rtl.css 69 B
build/styles/block-library/accordion/style-rtl.min.css 62 B
build/styles/block-library/accordion/style.css 69 B
build/styles/block-library/accordion/style.min.css 62 B
build/styles/block-library/archives/style-rtl.css 101 B
build/styles/block-library/archives/style-rtl.min.css 90 B
build/styles/block-library/archives/style.css 101 B
build/styles/block-library/archives/style.min.css 90 B
build/styles/block-library/audio/editor-rtl.css 166 B
build/styles/block-library/audio/editor-rtl.min.css 149 B
build/styles/block-library/audio/editor.css 166 B
build/styles/block-library/audio/editor.min.css 151 B
build/styles/block-library/audio/style-rtl.css 945 B
build/styles/block-library/audio/style-rtl.min.css 132 B
build/styles/block-library/audio/style.css 945 B
build/styles/block-library/audio/style.min.css 132 B
build/styles/block-library/audio/theme-rtl.css 967 B
build/styles/block-library/audio/theme-rtl.min.css 134 B
build/styles/block-library/audio/theme.css 967 B
build/styles/block-library/audio/theme.min.css 134 B
build/styles/block-library/avatar/editor-rtl.css 127 B
build/styles/block-library/avatar/editor-rtl.min.css 115 B
build/styles/block-library/avatar/editor.css 127 B
build/styles/block-library/avatar/editor.min.css 115 B
build/styles/block-library/avatar/style-rtl.css 117 B
build/styles/block-library/avatar/style-rtl.min.css 104 B
build/styles/block-library/avatar/style.css 117 B
build/styles/block-library/avatar/style.min.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 233 B
build/styles/block-library/breadcrumbs/style-rtl.min.css 203 B
build/styles/block-library/breadcrumbs/style.css 233 B
build/styles/block-library/breadcrumbs/style.min.css 203 B
build/styles/block-library/button/editor-rtl.css 306 B
build/styles/block-library/button/editor-rtl.min.css 265 B
build/styles/block-library/button/editor.css 317 B
build/styles/block-library/button/editor.min.css 265 B
build/styles/block-library/button/style-rtl.css 651 B
build/styles/block-library/button/style-rtl.min.css 596 B
build/styles/block-library/button/style.css 662 B
build/styles/block-library/button/style.min.css 596 B
build/styles/block-library/buttons/editor-rtl.css 391 B
build/styles/block-library/buttons/editor-rtl.min.css 291 B
build/styles/block-library/buttons/editor.css 391 B
build/styles/block-library/buttons/editor.min.css 291 B
build/styles/block-library/buttons/style-rtl.css 452 B
build/styles/block-library/buttons/style-rtl.min.css 349 B
build/styles/block-library/buttons/style.css 453 B
build/styles/block-library/buttons/style.min.css 349 B
build/styles/block-library/calendar/style-rtl.css 271 B
build/styles/block-library/calendar/style-rtl.min.css 239 B
build/styles/block-library/calendar/style.css 271 B
build/styles/block-library/calendar/style.min.css 239 B
build/styles/block-library/categories/editor-rtl.css 171 B
build/styles/block-library/categories/editor-rtl.min.css 132 B
build/styles/block-library/categories/editor.css 170 B
build/styles/block-library/categories/editor.min.css 131 B
build/styles/block-library/categories/style-rtl.css 226 B
build/styles/block-library/categories/style-rtl.min.css 169 B
build/styles/block-library/categories/style.css 235 B
build/styles/block-library/categories/style.min.css 169 B
build/styles/block-library/classic-rtl.css 363 B
build/styles/block-library/classic-rtl.min.css 321 B
build/styles/block-library/classic.css 363 B
build/styles/block-library/classic.min.css 321 B
build/styles/block-library/code/editor-rtl.css 59 B
build/styles/block-library/code/editor-rtl.min.css 53 B
build/styles/block-library/code/editor.css 59 B
build/styles/block-library/code/editor.min.css 53 B
build/styles/block-library/code/style-rtl.css 158 B
build/styles/block-library/code/style-rtl.min.css 139 B
build/styles/block-library/code/style.css 179 B
build/styles/block-library/code/style.min.css 139 B
build/styles/block-library/code/theme-rtl.css 135 B
build/styles/block-library/code/theme-rtl.min.css 122 B
build/styles/block-library/code/theme.css 135 B
build/styles/block-library/code/theme.min.css 122 B
build/styles/block-library/columns/editor-rtl.css 119 B
build/styles/block-library/columns/editor-rtl.min.css 108 B
build/styles/block-library/columns/editor.css 119 B
build/styles/block-library/columns/editor.min.css 108 B
build/styles/block-library/columns/style-rtl.css 1.3 kB
build/styles/block-library/columns/style-rtl.min.css 421 B
build/styles/block-library/columns/style.css 1.3 kB
build/styles/block-library/columns/style.min.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 136 B
build/styles/block-library/comment-author-avatar/editor-rtl.min.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 136 B
build/styles/block-library/comment-author-avatar/editor.min.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 79 B
build/styles/block-library/comment-author-name/style-rtl.min.css 72 B
build/styles/block-library/comment-author-name/style.css 79 B
build/styles/block-library/comment-author-name/style.min.css 72 B
build/styles/block-library/comment-content/style-rtl.css 137 B
build/styles/block-library/comment-content/style-rtl.min.css 120 B
build/styles/block-library/comment-content/style.css 137 B
build/styles/block-library/comment-content/style.min.css 120 B
build/styles/block-library/comment-date/style-rtl.css 72 B
build/styles/block-library/comment-date/style-rtl.min.css 65 B
build/styles/block-library/comment-date/style.css 72 B
build/styles/block-library/comment-date/style.min.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 77 B
build/styles/block-library/comment-edit-link/style-rtl.min.css 70 B
build/styles/block-library/comment-edit-link/style.css 77 B
build/styles/block-library/comment-edit-link/style.min.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 78 B
build/styles/block-library/comment-reply-link/style-rtl.min.css 71 B
build/styles/block-library/comment-reply-link/style.css 78 B
build/styles/block-library/comment-reply-link/style.min.css 71 B
build/styles/block-library/comment-template/style-rtl.css 213 B
build/styles/block-library/comment-template/style-rtl.min.css 191 B
build/styles/block-library/comment-template/style.css 213 B
build/styles/block-library/comment-template/style.min.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 135 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.min.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 144 B
build/styles/block-library/comments-pagination-numbers/editor.min.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 184 B
build/styles/block-library/comments-pagination/editor-rtl.min.css 168 B
build/styles/block-library/comments-pagination/editor.css 184 B
build/styles/block-library/comments-pagination/editor.min.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 224 B
build/styles/block-library/comments-pagination/style-rtl.min.css 201 B
build/styles/block-library/comments-pagination/style.css 236 B
build/styles/block-library/comments-pagination/style.min.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 83 B
build/styles/block-library/comments-title/editor-rtl.min.css 75 B
build/styles/block-library/comments-title/editor.css 83 B
build/styles/block-library/comments-title/editor.min.css 75 B
build/styles/block-library/comments/editor-rtl.css 968 B
build/styles/block-library/comments/editor-rtl.min.css 842 B
build/styles/block-library/comments/editor.css 968 B
build/styles/block-library/comments/editor.min.css 842 B
build/styles/block-library/comments/style-rtl.css 754 B
build/styles/block-library/comments/style-rtl.min.css 637 B
build/styles/block-library/comments/style.css 752 B
build/styles/block-library/comments/style.min.css 637 B
build/styles/block-library/common-rtl.css 2.48 kB
build/styles/block-library/common-rtl.min.css 1.12 kB
build/styles/block-library/common.css 2.5 kB
build/styles/block-library/common.min.css 1.12 kB
build/styles/block-library/cover/editor-rtl.css 1.05 kB
build/styles/block-library/cover/editor-rtl.min.css 631 B
build/styles/block-library/cover/editor.css 1.05 kB
build/styles/block-library/cover/editor.min.css 631 B
build/styles/block-library/cover/style-rtl.css 2.5 kB
build/styles/block-library/cover/style-rtl.min.css 1.82 kB
build/styles/block-library/cover/style.css 2.51 kB
build/styles/block-library/cover/style.min.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 72 B
build/styles/block-library/details/editor-rtl.min.css 65 B
build/styles/block-library/details/editor.css 72 B
build/styles/block-library/details/editor.min.css 65 B
build/styles/block-library/details/style-rtl.css 97 B
build/styles/block-library/details/style-rtl.min.css 86 B
build/styles/block-library/details/style.css 97 B
build/styles/block-library/details/style.min.css 86 B
build/styles/block-library/editor-elements-rtl.css 117 B
build/styles/block-library/editor-elements-rtl.min.css 75 B
build/styles/block-library/editor-elements.css 117 B
build/styles/block-library/editor-elements.min.css 75 B
build/styles/block-library/elements-rtl.css 84 B
build/styles/block-library/elements-rtl.min.css 54 B
build/styles/block-library/elements.css 84 B
build/styles/block-library/elements.min.css 54 B
build/styles/block-library/embed/editor-rtl.css 391 B
build/styles/block-library/embed/editor-rtl.min.css 331 B
build/styles/block-library/embed/editor.css 390 B
build/styles/block-library/embed/editor.min.css 331 B
build/styles/block-library/embed/style-rtl.css 1.29 kB
build/styles/block-library/embed/style-rtl.min.css 448 B
build/styles/block-library/embed/style.css 1.29 kB
build/styles/block-library/embed/style.min.css 448 B
build/styles/block-library/embed/theme-rtl.css 967 B
build/styles/block-library/embed/theme-rtl.min.css 133 B
build/styles/block-library/embed/theme.css 967 B
build/styles/block-library/embed/theme.min.css 133 B
build/styles/block-library/file/editor-rtl.css 352 B
build/styles/block-library/file/editor-rtl.min.css 324 B
build/styles/block-library/file/editor.css 353 B
build/styles/block-library/file/editor.min.css 324 B
build/styles/block-library/file/style-rtl.css 318 B
build/styles/block-library/file/style-rtl.min.css 278 B
build/styles/block-library/file/style.css 331 B
build/styles/block-library/file/style.min.css 278 B
build/styles/block-library/footnotes/style-rtl.css 220 B
build/styles/block-library/footnotes/style-rtl.min.css 198 B
build/styles/block-library/footnotes/style.css 219 B
build/styles/block-library/footnotes/style.min.css 197 B
build/styles/block-library/form-input/editor-rtl.css 286 B
build/styles/block-library/form-input/editor-rtl.min.css 265 B
build/styles/block-library/form-input/editor.css 285 B
build/styles/block-library/form-input/editor.min.css 264 B
build/styles/block-library/form-input/style-rtl.css 467 B
build/styles/block-library/form-input/style-rtl.min.css 366 B
build/styles/block-library/form-input/style.css 467 B
build/styles/block-library/form-input/style.min.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 368 B
build/styles/block-library/form-submission-notification/editor-rtl.min.css 344 B
build/styles/block-library/form-submission-notification/editor.css 368 B
build/styles/block-library/form-submission-notification/editor.min.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 77 B
build/styles/block-library/form-submit-button/style-rtl.min.css 69 B
build/styles/block-library/form-submit-button/style.css 77 B
build/styles/block-library/form-submit-button/style.min.css 69 B
build/styles/block-library/freeform/editor-rtl.css 1.12 kB
build/styles/block-library/freeform/editor-rtl.min.css 288 B
build/styles/block-library/freeform/editor.css 1.12 kB
build/styles/block-library/freeform/editor.min.css 288 B
build/styles/block-library/gallery/style-rtl.css 2.84 kB
build/styles/block-library/gallery/style-rtl.min.css 1.84 kB
build/styles/block-library/gallery/style.css 2.84 kB
build/styles/block-library/gallery/style.min.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 941 B
build/styles/block-library/gallery/theme-rtl.min.css 108 B
build/styles/block-library/gallery/theme.css 941 B
build/styles/block-library/gallery/theme.min.css 108 B
build/styles/block-library/group/editor-rtl.css 772 B
build/styles/block-library/group/editor-rtl.min.css 335 B
build/styles/block-library/group/editor.css 772 B
build/styles/block-library/group/editor.min.css 335 B
build/styles/block-library/group/style-rtl.css 120 B
build/styles/block-library/group/style-rtl.min.css 103 B
build/styles/block-library/group/style.css 120 B
build/styles/block-library/group/style.min.css 103 B
build/styles/block-library/group/theme-rtl.css 468 B
build/styles/block-library/group/theme-rtl.min.css 79 B
build/styles/block-library/group/theme.css 468 B
build/styles/block-library/group/theme.min.css 79 B
build/styles/block-library/heading/style-rtl.css 604 B
build/styles/block-library/heading/style-rtl.min.css 205 B
build/styles/block-library/heading/style.css 604 B
build/styles/block-library/heading/style.min.css 205 B
build/styles/block-library/html/editor-rtl.css 1.29 kB
build/styles/block-library/html/editor-rtl.min.css 464 B
build/styles/block-library/html/editor.css 1.3 kB
build/styles/block-library/html/editor.min.css 464 B
build/styles/block-library/icon/editor-rtl.css 776 B
build/styles/block-library/icon/editor-rtl.min.css 377 B
build/styles/block-library/icon/editor.css 776 B
build/styles/block-library/icon/editor.min.css 377 B
build/styles/block-library/icon/style-rtl.css 218 B
build/styles/block-library/icon/style-rtl.min.css 154 B
build/styles/block-library/icon/style.css 218 B
build/styles/block-library/icon/style.min.css 154 B
build/styles/block-library/image/style-rtl.css 2.92 kB
build/styles/block-library/image/style-rtl.min.css 1.86 kB
build/styles/block-library/image/style.css 2.92 kB
build/styles/block-library/image/style.min.css 1.85 kB
build/styles/block-library/image/theme-rtl.css 971 B
build/styles/block-library/image/theme-rtl.min.css 137 B
build/styles/block-library/image/theme.css 971 B
build/styles/block-library/image/theme.min.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 394 B
build/styles/block-library/latest-comments/style-rtl.min.css 355 B
build/styles/block-library/latest-comments/style.css 394 B
build/styles/block-library/latest-comments/style.min.css 354 B
build/styles/block-library/latest-posts/editor-rtl.css 154 B
build/styles/block-library/latest-posts/editor-rtl.min.css 139 B
build/styles/block-library/latest-posts/editor.css 153 B
build/styles/block-library/latest-posts/editor.min.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 1.36 kB
build/styles/block-library/latest-posts/style-rtl.min.css 520 B
build/styles/block-library/latest-posts/style.css 1.37 kB
build/styles/block-library/latest-posts/style.min.css 520 B
build/styles/block-library/list/style-rtl.css 498 B
build/styles/block-library/list/style-rtl.min.css 107 B
build/styles/block-library/list/style.css 498 B
build/styles/block-library/list/style.min.css 107 B
build/styles/block-library/loginout/style-rtl.css 68 B
build/styles/block-library/loginout/style-rtl.min.css 61 B
build/styles/block-library/loginout/style.css 68 B
build/styles/block-library/loginout/style.min.css 61 B
build/styles/block-library/math/editor-rtl.css 491 B
build/styles/block-library/math/editor-rtl.min.css 105 B
build/styles/block-library/math/editor.css 502 B
build/styles/block-library/math/editor.min.css 105 B
build/styles/block-library/math/style-rtl.css 70 B
build/styles/block-library/math/style-rtl.min.css 61 B
build/styles/block-library/math/style.css 70 B
build/styles/block-library/math/style.min.css 61 B
build/styles/block-library/media-text/editor-rtl.css 389 B
build/styles/block-library/media-text/editor-rtl.min.css 321 B
build/styles/block-library/media-text/editor.css 389 B
build/styles/block-library/media-text/editor.min.css 320 B
build/styles/block-library/media-text/style-rtl.css 873 B
build/styles/block-library/media-text/style-rtl.min.css 552 B
build/styles/block-library/media-text/style.css 901 B
build/styles/block-library/media-text/style.min.css 550 B
build/styles/block-library/more/editor-rtl.css 796 B
build/styles/block-library/more/editor-rtl.min.css 393 B
build/styles/block-library/more/editor.css 798 B
build/styles/block-library/more/editor.min.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 1.28 kB
build/styles/block-library/navigation-link/editor-rtl.min.css 710 B
build/styles/block-library/navigation-link/editor.css 1.27 kB
build/styles/block-library/navigation-link/editor.min.css 713 B
build/styles/block-library/navigation-link/style-rtl.css 579 B
build/styles/block-library/navigation-link/style-rtl.min.css 190 B
build/styles/block-library/navigation-link/style.css 579 B
build/styles/block-library/navigation-link/style.min.css 188 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 260 B
build/styles/block-library/navigation-overlay-close/style-rtl.min.css 237 B
build/styles/block-library/navigation-overlay-close/style.css 260 B
build/styles/block-library/navigation-overlay-close/style.min.css 237 B
build/styles/block-library/navigation-submenu/editor-rtl.css 1.12 kB
build/styles/block-library/navigation-submenu/editor-rtl.min.css 295 B
build/styles/block-library/navigation-submenu/editor.css 1.12 kB
build/styles/block-library/navigation-submenu/editor.min.css 294 B
build/styles/block-library/navigation/editor-rtl.css 3.28 kB
build/styles/block-library/navigation/editor-rtl.min.css 2.28 kB
build/styles/block-library/navigation/editor.css 3.29 kB
build/styles/block-library/navigation/editor.min.css 2.28 kB
build/styles/block-library/navigation/style-rtl.css 3.59 kB
build/styles/block-library/navigation/style-rtl.min.css 2.52 kB
build/styles/block-library/navigation/style.css 3.59 kB
build/styles/block-library/navigation/style.min.css 2.5 kB
build/styles/block-library/nextpage/editor-rtl.css 799 B
build/styles/block-library/nextpage/editor-rtl.min.css 392 B
build/styles/block-library/nextpage/editor.css 800 B
build/styles/block-library/nextpage/editor.min.css 392 B
build/styles/block-library/page-list/editor-rtl.css 1.18 kB
build/styles/block-library/page-list/editor-rtl.min.css 356 B
build/styles/block-library/page-list/editor.css 1.18 kB
build/styles/block-library/page-list/editor.min.css 356 B
build/styles/block-library/page-list/style-rtl.css 207 B
build/styles/block-library/page-list/style-rtl.min.css 192 B
build/styles/block-library/page-list/style.css 207 B
build/styles/block-library/page-list/style.min.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 315 B
build/styles/block-library/paragraph/editor-rtl.min.css 292 B
build/styles/block-library/paragraph/editor.css 314 B
build/styles/block-library/paragraph/editor.min.css 292 B
build/styles/block-library/paragraph/style-rtl.css 746 B
build/styles/block-library/paragraph/style-rtl.min.css 341 B
build/styles/block-library/paragraph/style.css 752 B
build/styles/block-library/paragraph/style.min.css 340 B
build/styles/block-library/playlist-track/style-rtl.css 453 B
build/styles/block-library/playlist-track/style-rtl.min.css 420 B
build/styles/block-library/playlist-track/style.css 453 B
build/styles/block-library/playlist-track/style.min.css 420 B
build/styles/block-library/playlist/editor-rtl.css 120 B
build/styles/block-library/playlist/editor-rtl.min.css 112 B
build/styles/block-library/playlist/editor.css 120 B
build/styles/block-library/playlist/editor.min.css 112 B
build/styles/block-library/playlist/style-rtl.css 1.52 kB
build/styles/block-library/playlist/style-rtl.min.css 1.42 kB
build/styles/block-library/playlist/style.css 1.52 kB
build/styles/block-library/playlist/style.min.css 1.42 kB
build/styles/block-library/post-author-biography/style-rtl.css 81 B
build/styles/block-library/post-author-biography/style-rtl.min.css 74 B
build/styles/block-library/post-author-biography/style.css 81 B
build/styles/block-library/post-author-biography/style.min.css 74 B
build/styles/block-library/post-author-name/style-rtl.css 76 B
build/styles/block-library/post-author-name/style-rtl.min.css 69 B
build/styles/block-library/post-author-name/style.css 76 B
build/styles/block-library/post-author-name/style.min.css 69 B
build/styles/block-library/post-author/editor-rtl.css 490 B
build/styles/block-library/post-author/editor-rtl.min.css 104 B
build/styles/block-library/post-author/editor.css 490 B
build/styles/block-library/post-author/editor.min.css 104 B
build/styles/block-library/post-author/style-rtl.css 213 B
build/styles/block-library/post-author/style-rtl.min.css 188 B
build/styles/block-library/post-author/style.css 214 B
build/styles/block-library/post-author/style.min.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 79 B
build/styles/block-library/post-comments-count/style-rtl.min.css 72 B
build/styles/block-library/post-comments-count/style.css 79 B
build/styles/block-library/post-comments-count/style.min.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 104 B
build/styles/block-library/post-comments-form/editor-rtl.min.css 96 B
build/styles/block-library/post-comments-form/editor.css 104 B
build/styles/block-library/post-comments-form/editor.min.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 585 B
build/styles/block-library/post-comments-form/style-rtl.min.css 525 B
build/styles/block-library/post-comments-form/style.css 584 B
build/styles/block-library/post-comments-form/style.min.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 78 B
build/styles/block-library/post-comments-link/style-rtl.min.css 71 B
build/styles/block-library/post-comments-link/style.css 78 B
build/styles/block-library/post-comments-link/style.min.css 71 B
build/styles/block-library/post-content/style-rtl.css 68 B
build/styles/block-library/post-content/style-rtl.min.css 61 B
build/styles/block-library/post-content/style.css 68 B
build/styles/block-library/post-content/style.min.css 61 B
build/styles/block-library/post-date/style-rtl.css 69 B
build/styles/block-library/post-date/style-rtl.min.css 62 B
build/styles/block-library/post-date/style.css 69 B
build/styles/block-library/post-date/style.min.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 78 B
build/styles/block-library/post-excerpt/editor-rtl.min.css 71 B
build/styles/block-library/post-excerpt/editor.css 78 B
build/styles/block-library/post-excerpt/editor.min.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 171 B
build/styles/block-library/post-excerpt/style-rtl.min.css 155 B
build/styles/block-library/post-excerpt/style.css 171 B
build/styles/block-library/post-excerpt/style.min.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 1.14 kB
build/styles/block-library/post-featured-image/editor-rtl.min.css 719 B
build/styles/block-library/post-featured-image/editor.css 1.14 kB
build/styles/block-library/post-featured-image/editor.min.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 392 B
build/styles/block-library/post-featured-image/style-rtl.min.css 347 B
build/styles/block-library/post-featured-image/style.css 392 B
build/styles/block-library/post-featured-image/style.min.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 234 B
build/styles/block-library/post-navigation-link/style-rtl.min.css 215 B
build/styles/block-library/post-navigation-link/style.css 245 B
build/styles/block-library/post-navigation-link/style.min.css 214 B
build/styles/block-library/post-template/style-rtl.css 1.25 kB
build/styles/block-library/post-template/style-rtl.min.css 414 B
build/styles/block-library/post-template/style.css 1.25 kB
build/styles/block-library/post-template/style.min.css 414 B
build/styles/block-library/post-terms/style-rtl.css 108 B
build/styles/block-library/post-terms/style-rtl.min.css 96 B
build/styles/block-library/post-terms/style.css 108 B
build/styles/block-library/post-terms/style.min.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 77 B
build/styles/block-library/post-time-to-read/style-rtl.min.css 70 B
build/styles/block-library/post-time-to-read/style.css 77 B
build/styles/block-library/post-time-to-read/style.min.css 70 B
build/styles/block-library/post-title/style-rtl.css 175 B
build/styles/block-library/post-title/style-rtl.min.css 162 B
build/styles/block-library/post-title/style.css 175 B
build/styles/block-library/post-title/style.min.css 162 B
build/styles/block-library/preformatted/style-rtl.css 511 B
build/styles/block-library/preformatted/style-rtl.min.css 125 B
build/styles/block-library/preformatted/style.css 511 B
build/styles/block-library/preformatted/style.min.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 146 B
build/styles/block-library/pullquote/editor-rtl.min.css 133 B
build/styles/block-library/pullquote/editor.css 146 B
build/styles/block-library/pullquote/editor.min.css 133 B
build/styles/block-library/pullquote/style-rtl.css 765 B
build/styles/block-library/pullquote/style-rtl.min.css 365 B
build/styles/block-library/pullquote/style.css 764 B
build/styles/block-library/pullquote/style.min.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 195 B
build/styles/block-library/pullquote/theme-rtl.min.css 176 B
build/styles/block-library/pullquote/theme.css 195 B
build/styles/block-library/pullquote/theme.min.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 134 B
build/styles/block-library/query-pagination-numbers/editor-rtl.min.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 144 B
build/styles/block-library/query-pagination-numbers/editor.min.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 168 B
build/styles/block-library/query-pagination/editor-rtl.min.css 154 B
build/styles/block-library/query-pagination/editor.css 168 B
build/styles/block-library/query-pagination/editor.min.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 254 B
build/styles/block-library/query-pagination/style-rtl.min.css 237 B
build/styles/block-library/query-pagination/style.css 265 B
build/styles/block-library/query-pagination/style.min.css 237 B
build/styles/block-library/query-title/style-rtl.css 71 B
build/styles/block-library/query-title/style-rtl.min.css 64 B
build/styles/block-library/query-title/style.css 71 B
build/styles/block-library/query-title/style.min.css 64 B
build/styles/block-library/query-total/style-rtl.css 71 B
build/styles/block-library/query-total/style-rtl.min.css 64 B
build/styles/block-library/query-total/style.css 71 B
build/styles/block-library/query-total/style.min.css 64 B
build/styles/block-library/query/editor-rtl.css 1.28 kB
build/styles/block-library/query/editor-rtl.min.css 438 B
build/styles/block-library/query/editor.css 1.28 kB
build/styles/block-library/query/editor.min.css 438 B
build/styles/block-library/quote/style-rtl.css 255 B
build/styles/block-library/quote/style-rtl.min.css 238 B
build/styles/block-library/quote/style.css 256 B
build/styles/block-library/quote/style.min.css 238 B
build/styles/block-library/quote/theme-rtl.css 253 B
build/styles/block-library/quote/theme-rtl.min.css 233 B
build/styles/block-library/quote/theme.css 254 B
build/styles/block-library/quote/theme.min.css 236 B
build/styles/block-library/read-more/style-rtl.css 146 B
build/styles/block-library/read-more/style-rtl.min.css 131 B
build/styles/block-library/read-more/style.css 146 B
build/styles/block-library/read-more/style.min.css 131 B
build/styles/block-library/reset-rtl.css 936 B
build/styles/block-library/reset-rtl.min.css 467 B
build/styles/block-library/reset.css 936 B
build/styles/block-library/reset.min.css 467 B
build/styles/block-library/rss/editor-rtl.css 144 B
build/styles/block-library/rss/editor-rtl.min.css 126 B
build/styles/block-library/rss/editor.css 144 B
build/styles/block-library/rss/editor.min.css 126 B
build/styles/block-library/rss/style-rtl.css 1.11 kB
build/styles/block-library/rss/style-rtl.min.css 284 B
build/styles/block-library/rss/style.css 1.12 kB
build/styles/block-library/rss/style.min.css 283 B
build/styles/block-library/search/editor-rtl.css 217 B
build/styles/block-library/search/editor-rtl.min.css 199 B
build/styles/block-library/search/editor.css 217 B
build/styles/block-library/search/editor.min.css 199 B
build/styles/block-library/search/style-rtl.css 1.1 kB
build/styles/block-library/search/style-rtl.min.css 665 B
build/styles/block-library/search/style.css 1.1 kB
build/styles/block-library/search/style.min.css 666 B
build/styles/block-library/search/theme-rtl.css 130 B
build/styles/block-library/search/theme-rtl.min.css 113 B
build/styles/block-library/search/theme.css 130 B
build/styles/block-library/search/theme.min.css 113 B
build/styles/block-library/separator/editor-rtl.css 106 B
build/styles/block-library/separator/editor-rtl.min.css 100 B
build/styles/block-library/separator/editor.css 106 B
build/styles/block-library/separator/editor.min.css 100 B
build/styles/block-library/separator/style-rtl.css 284 B
build/styles/block-library/separator/style-rtl.min.css 248 B
build/styles/block-library/separator/style.css 297 B
build/styles/block-library/separator/style.min.css 248 B
build/styles/block-library/separator/theme-rtl.css 226 B
build/styles/block-library/separator/theme-rtl.min.css 195 B
build/styles/block-library/separator/theme.css 226 B
build/styles/block-library/separator/theme.min.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 1.1 kB
build/styles/block-library/shortcode/editor-rtl.min.css 286 B
build/styles/block-library/shortcode/editor.css 1.1 kB
build/styles/block-library/shortcode/editor.min.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 1.12 kB
build/styles/block-library/site-logo/editor-rtl.min.css 696 B
build/styles/block-library/site-logo/editor.css 1.12 kB
build/styles/block-library/site-logo/editor.min.css 692 B
build/styles/block-library/site-logo/style-rtl.css 239 B
build/styles/block-library/site-logo/style-rtl.min.css 218 B
build/styles/block-library/site-logo/style.css 238 B
build/styles/block-library/site-logo/style.min.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 94 B
build/styles/block-library/site-tagline/editor-rtl.min.css 87 B
build/styles/block-library/site-tagline/editor.css 94 B
build/styles/block-library/site-tagline/editor.min.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 72 B
build/styles/block-library/site-tagline/style-rtl.min.css 65 B
build/styles/block-library/site-tagline/style.css 72 B
build/styles/block-library/site-tagline/style.min.css 65 B
build/styles/block-library/site-title/editor-rtl.css 93 B
build/styles/block-library/site-title/editor-rtl.min.css 85 B
build/styles/block-library/site-title/editor.css 93 B
build/styles/block-library/site-title/editor.min.css 85 B
build/styles/block-library/site-title/style-rtl.css 153 B
build/styles/block-library/site-title/style-rtl.min.css 143 B
build/styles/block-library/site-title/style.css 153 B
build/styles/block-library/site-title/style.min.css 143 B
build/styles/block-library/social-link/editor-rtl.css 346 B
build/styles/block-library/social-link/editor-rtl.min.css 314 B
build/styles/block-library/social-link/editor.css 348 B
build/styles/block-library/social-link/editor.min.css 314 B
build/styles/block-library/social-links/editor-rtl.css 737 B
build/styles/block-library/social-links/editor-rtl.min.css 339 B
build/styles/block-library/social-links/editor.css 738 B
build/styles/block-library/social-links/editor.min.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.57 kB
build/styles/block-library/social-links/style-rtl.min.css 1.51 kB
build/styles/block-library/social-links/style.css 1.57 kB
build/styles/block-library/social-links/style.min.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 774 B
build/styles/block-library/spacer/editor-rtl.min.css 346 B
build/styles/block-library/spacer/editor.css 774 B
build/styles/block-library/spacer/editor.min.css 346 B
build/styles/block-library/spacer/style-rtl.css 55 B
build/styles/block-library/spacer/style-rtl.min.css 48 B
build/styles/block-library/spacer/style.css 55 B
build/styles/block-library/spacer/style.min.css 48 B
build/styles/block-library/style-rtl.css 21.5 kB
build/styles/block-library/style-rtl.min.css 18 kB
build/styles/block-library/style.css 21.7 kB
build/styles/block-library/style.min.css 18 kB
build/styles/block-library/tab-panel/style-rtl.css 75 B
build/styles/block-library/tab-panel/style-rtl.min.css 64 B
build/styles/block-library/tab-panel/style.css 75 B
build/styles/block-library/tab-panel/style.min.css 64 B
build/styles/block-library/tab/style-rtl.css 233 B
build/styles/block-library/tab/style-rtl.min.css 210 B
build/styles/block-library/tab/style.css 233 B
build/styles/block-library/tab/style.min.css 210 B
build/styles/block-library/table-of-contents/style-rtl.css 89 B
build/styles/block-library/table-of-contents/style-rtl.min.css 83 B
build/styles/block-library/table-of-contents/style.css 89 B
build/styles/block-library/table-of-contents/style.min.css 83 B
build/styles/block-library/table/editor-rtl.css 1.25 kB
build/styles/block-library/table/editor-rtl.min.css 394 B
build/styles/block-library/table/editor.css 1.25 kB
build/styles/block-library/table/editor.min.css 394 B
build/styles/block-library/table/style-rtl.css 1.06 kB
build/styles/block-library/table/style-rtl.min.css 641 B
build/styles/block-library/table/style.css 1.06 kB
build/styles/block-library/table/style.min.css 640 B
build/styles/block-library/table/theme-rtl.css 985 B
build/styles/block-library/table/theme-rtl.min.css 152 B
build/styles/block-library/table/theme.css 985 B
build/styles/block-library/table/theme.min.css 152 B
build/styles/block-library/tabs-menu-item/editor-rtl.css 168 B
build/styles/block-library/tabs-menu-item/editor-rtl.min.css 155 B
build/styles/block-library/tabs-menu-item/editor.css 168 B
build/styles/block-library/tabs-menu-item/editor.min.css 155 B
build/styles/block-library/tabs-menu-item/style-rtl.css 367 B
build/styles/block-library/tabs-menu-item/style-rtl.min.css 337 B
build/styles/block-library/tabs-menu-item/style.css 367 B
build/styles/block-library/tabs-menu-item/style.min.css 337 B
build/styles/block-library/tabs-menu/editor-rtl.css 116 B
build/styles/block-library/tabs-menu/editor-rtl.min.css 104 B
build/styles/block-library/tabs-menu/editor.css 116 B
build/styles/block-library/tabs-menu/editor.min.css 104 B
build/styles/block-library/tabs-menu/style-rtl.css 135 B
build/styles/block-library/tabs-menu/style-rtl.min.css 111 B
build/styles/block-library/tabs-menu/style.css 135 B
build/styles/block-library/tabs-menu/style.min.css 111 B
build/styles/block-library/tabs/style-rtl.css 95 B
build/styles/block-library/tabs/style-rtl.min.css 84 B
build/styles/block-library/tabs/style.css 95 B
build/styles/block-library/tabs/style.min.css 84 B
build/styles/block-library/tag-cloud/style-rtl.css 283 B
build/styles/block-library/tag-cloud/style-rtl.min.css 248 B
build/styles/block-library/tag-cloud/style.css 283 B
build/styles/block-library/tag-cloud/style.min.css 248 B
build/styles/block-library/template-part/editor-rtl.css 1.2 kB
build/styles/block-library/template-part/editor-rtl.min.css 368 B
build/styles/block-library/template-part/editor.css 1.2 kB
build/styles/block-library/template-part/editor.min.css 368 B
build/styles/block-library/template-part/theme-rtl.css 492 B
build/styles/block-library/template-part/theme-rtl.min.css 113 B
build/styles/block-library/template-part/theme.css 492 B
build/styles/block-library/template-part/theme.min.css 113 B
build/styles/block-library/term-count/style-rtl.css 70 B
build/styles/block-library/term-count/style-rtl.min.css 63 B
build/styles/block-library/term-count/style.css 70 B
build/styles/block-library/term-count/style.min.css 63 B
build/styles/block-library/term-description/style-rtl.css 138 B
build/styles/block-library/term-description/style-rtl.min.css 126 B
build/styles/block-library/term-description/style.css 138 B
build/styles/block-library/term-description/style.min.css 126 B
build/styles/block-library/term-name/style-rtl.css 69 B
build/styles/block-library/term-name/style-rtl.min.css 62 B
build/styles/block-library/term-name/style.css 69 B
build/styles/block-library/term-name/style.min.css 62 B
build/styles/block-library/term-template/editor-rtl.css 267 B
build/styles/block-library/term-template/editor-rtl.min.css 225 B
build/styles/block-library/term-template/editor.css 267 B
build/styles/block-library/term-template/editor.min.css 225 B
build/styles/block-library/term-template/style-rtl.css 124 B
build/styles/block-library/term-template/style-rtl.min.css 114 B
build/styles/block-library/term-template/style.css 124 B
build/styles/block-library/term-template/style.min.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 481 B
build/styles/block-library/text-columns/editor-rtl.min.css 95 B
build/styles/block-library/text-columns/editor.css 481 B
build/styles/block-library/text-columns/editor.min.css 95 B
build/styles/block-library/text-columns/style-rtl.css 177 B
build/styles/block-library/text-columns/style-rtl.min.css 165 B
build/styles/block-library/text-columns/style.css 177 B
build/styles/block-library/text-columns/style.min.css 165 B
build/styles/block-library/theme-rtl.css 1.59 kB
build/styles/block-library/theme-rtl.min.css 715 B
build/styles/block-library/theme.css 1.6 kB
build/styles/block-library/theme.min.css 719 B
build/styles/block-library/verse/style-rtl.css 155 B
build/styles/block-library/verse/style-rtl.min.css 137 B
build/styles/block-library/verse/style.css 155 B
build/styles/block-library/verse/style.min.css 137 B
build/styles/block-library/video/editor-rtl.css 825 B
build/styles/block-library/video/editor-rtl.min.css 415 B
build/styles/block-library/video/editor.css 826 B
build/styles/block-library/video/editor.min.css 416 B
build/styles/block-library/video/style-rtl.css 1.02 kB
build/styles/block-library/video/style-rtl.min.css 202 B
build/styles/block-library/video/style.css 1.02 kB
build/styles/block-library/video/style.min.css 202 B
build/styles/block-library/video/theme-rtl.css 967 B
build/styles/block-library/video/theme-rtl.min.css 134 B
build/styles/block-library/video/theme.css 967 B
build/styles/block-library/video/theme.min.css 134 B
build/styles/commands/style-rtl.css 2.06 kB
build/styles/commands/style-rtl.min.css 1.16 kB
build/styles/commands/style.css 2.05 kB
build/styles/commands/style.min.css 1.16 kB
build/styles/components/style-rtl.css 17 kB
build/styles/components/style-rtl.min.css 13.8 kB
build/styles/components/style.css 17.1 kB
build/styles/components/style.min.css 13.8 kB
build/styles/customize-widgets/style-rtl.css 2.35 kB
build/styles/customize-widgets/style-rtl.min.css 1.44 kB
build/styles/customize-widgets/style.css 2.35 kB
build/styles/customize-widgets/style.min.css 1.44 kB
build/styles/edit-post/classic-rtl.css 1.29 kB
build/styles/edit-post/classic-rtl.min.css 426 B
build/styles/edit-post/classic.css 1.31 kB
build/styles/edit-post/classic.min.css 427 B
build/styles/edit-post/style-rtl.css 4.02 kB
build/styles/edit-post/style-rtl.min.css 2.7 kB
build/styles/edit-post/style.css 4.03 kB
build/styles/edit-post/style.min.css 2.7 kB
build/styles/edit-site/style-rtl.css 20.9 kB
build/styles/edit-site/style-rtl.min.css 17 kB
build/styles/edit-site/style.css 20.9 kB
build/styles/edit-site/style.min.css 17 kB
build/styles/edit-widgets/style-rtl.css 5.34 kB
build/styles/edit-widgets/style-rtl.min.css 4 kB
build/styles/edit-widgets/style.css 5.34 kB
build/styles/edit-widgets/style.min.css 4.01 kB
build/styles/editor/style-rtl.css 26.6 kB
build/styles/editor/style-rtl.min.css 22.5 kB
build/styles/editor/style.css 26.7 kB
build/styles/editor/style.min.css 22.5 kB
build/styles/format-library/style-rtl.css 735 B
build/styles/format-library/style-rtl.min.css 326 B
build/styles/format-library/style.css 746 B
build/styles/format-library/style.min.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.07 kB
build/styles/list-reusable-blocks/style-rtl.min.css 250 B
build/styles/list-reusable-blocks/style.css 1.07 kB
build/styles/list-reusable-blocks/style.min.css 249 B
build/styles/media-utils/style-rtl.css 2.08 kB
build/styles/media-utils/style-rtl.min.css 1.17 kB
build/styles/media-utils/style.css 2.08 kB
build/styles/media-utils/style.min.css 1.17 kB
build/styles/nux/style-rtl.css 1.48 kB
build/styles/nux/style-rtl.min.css 622 B
build/styles/nux/style.css 1.5 kB
build/styles/nux/style.min.css 618 B
build/styles/patterns/style-rtl.css 1.46 kB
build/styles/patterns/style-rtl.min.css 611 B
build/styles/patterns/style.css 1.46 kB
build/styles/patterns/style.min.css 611 B
build/styles/preferences/style-rtl.css 1.26 kB
build/styles/preferences/style-rtl.min.css 415 B
build/styles/preferences/style.css 1.26 kB
build/styles/preferences/style.min.css 415 B
build/styles/reusable-blocks/style-rtl.css 1.11 kB
build/styles/reusable-blocks/style-rtl.min.css 275 B
build/styles/reusable-blocks/style.css 1.11 kB
build/styles/reusable-blocks/style.min.css 275 B
build/styles/widgets/style-rtl.css 2.04 kB
build/styles/widgets/style-rtl.min.css 1.15 kB
build/styles/widgets/style.css 2.04 kB
build/styles/widgets/style.min.css 1.15 kB

compressed-size-action

@adamsilverstein adamsilverstein marked this pull request as draft January 31, 2026 14:45
@adamsilverstein adamsilverstein changed the title Add progress indicator Image: Add upload progress indicator with cancel button and a11y announcements Feb 24, 2026
@adamsilverstein adamsilverstein force-pushed the 74363-progress-indicator-2 branch from f2c4b61 to 450d7ad Compare February 24, 2026 14:31
@adamsilverstein adamsilverstein self-assigned this Feb 28, 2026
@joedolson joedolson added the Needs Accessibility Feedback Need input from accessibility label Mar 3, 2026
@joedolson
Copy link
Copy Markdown
Contributor

Adding needs accessibility feedback - this should get reviewed for accessibility needs before merge. The description is sound and makes sense, but ensuring that it's been tested with a variety of different screen readers is important, to make sure everything is announced as expected.

@joedolson joedolson self-requested a review March 3, 2026 16:12
@adamsilverstein adamsilverstein marked this pull request as ready for review March 17, 2026 19:30
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 17, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: adamsilverstein <[email protected]>
Co-authored-by: ciampo <[email protected]>
Co-authored-by: joedolson <[email protected]>
Co-authored-by: andrewserong <[email protected]>
Co-authored-by: swissspidy <[email protected]>
Co-authored-by: jasmussen <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@adamsilverstein
Copy link
Copy Markdown
Member Author

Thanks @joedolson - appreciate any feedback/testing here. I can start with some basic manual testing with Voice over and capture a screen session when I get back to working on this. Ideally we could write e2e tests for this to validate the announcements we want happen as expected.

Some other things I want to review/test:

  • What happens when I upload 3 or 10 images at once? Ideally there is a single progress indicator saying something more like "Processing image x of y" instead of numerous duplicates of the single upload progress indicator.
  • Can we provide more granular progress for single image uplaods, eg "generating subsizes x of y"?
  • After Track progress during media uploads #75099 can we provide any additional details?

@adamsilverstein adamsilverstein force-pushed the 74363-progress-indicator-2 branch from 0ae6c4f to 6755f94 Compare March 17, 2026 21:28
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 17, 2026

Flaky tests detected in 0efa9a1.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/23818942617
📝 Reported issues:

@adamsilverstein adamsilverstein requested review from andrewserong and swissspidy and removed request for ajitbohra and fabiankaegy March 26, 2026 20:48
@adamsilverstein adamsilverstein added Needs Testing Needs further testing to be confirmed. Needs Design Feedback Needs general design feedback. and removed [Package] Block library /packages/block-library labels Mar 26, 2026
Expand test coverage beyond getOperationLabel to include:
- UploadingOverlay rendering, accessibility, progress display,
  batch labels, thumbnail progress, cancel behavior, and
  attachmentId fallback lookup
- useUploadAnnouncer start/completion/error announcements,
  batch handling, and deduplication
@jasmussen
Copy link
Copy Markdown
Contributor

Thanks for the work.

I have to ask what I expect will be a dumb question, but bear with me, I mean it in good faith and we will find a solution regardless.

Do we need the label to be visible? The progressbar implies what's happening, and more easily scales to tiny images, e.g. what happens if you upload a 10x10px image? And similarly, do we need the "Cancel" button? I would expect deleting the image cancels it.

Copy link
Copy Markdown
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👋 Passing by and leaving a review more from the UI and general API point of view.

My main observation is that this PR basically implements an "inline, non-modal dialog" — which is such a niche edge case, that we don't really have an existing built-in component to use.

At the same time, it's lacking some important accessibility features, such as correct focus management

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not necessarily blocking (since there are existing private actions/selectors), but why are we introducing private actions/selectors? What's the reason why they can't be public?

Comment on lines +22 to +34
jest.mock( '@wordpress/components', () => {
const actual = jest.requireActual( '@wordpress/element' );
return {
ProgressBar: ( { value, ...props } ) =>
actual.createElement( 'div', {
role: 'progressbar',
'aria-valuenow': value,
...props,
} ),
Button: ( { children, __next40pxDefaultSize, variant, ...props } ) =>
actual.createElement( 'button', props, children ),
};
} );
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the reason for mocking @wordpress/components here? It feels to me like it partially defeats the purpose of the tests, since those components are effectively what end users are going to interact with

export default function UploadingOverlay( { url, attachmentId, onCancel } ) {
const overlayRef = useRef();

// When the overlay unmounts, return focus to the block wrapper if focus
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should handle focus also when mounting, ie. when the overlay is opened, focus should be moved to the overlay. Probably the overlay container is a better choice than the cancel button — which means that the container likely needs to have tabindex="-1" so that it be focused programmatically (and some visual indication of focus, too).

Thinking about it, we should actually consider using useFocusOnMount + useFocusReturn from @wordpress/compose to handle initial and final focus.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Show a single progress overlay at the gallery level when multiple
images are uploaded simultaneously, instead of individual overlays
on each image. The overlay tracks "Processing image X of Y" based
on top-level upload completion count, filtering out child sideload
items. Individual images remain dimmed during upload and become
fully visible as each completes.
@adamsilverstein
Copy link
Copy Markdown
Member Author

Thanks for the review and feedback @ciampo! I will review and address.

Use a stable notice ID for gallery image upload errors so batch
cancellation deduplicates into a single snackbar. Remove silent
cancel mode so image blocks properly clean up their state (clear
blob URLs, reset attributes) when cancelled.
The useUploadAnnouncer hook already handles screen reader
announcements via speak(). The role=status live region would
cause excessive announcements on every percentage change.
aria-busy indicates a region is being updated, so it belongs on
the container figure rather than the img element itself.
useLayoutEffect runs synchronously before DOM repaint, ensuring
the overlay element is still connected when checking active focus.
With useEffect the element may already be disconnected and focus
silently lost to document.body.
Replace manual useLayoutEffect focus logic with the standard
WordPress compose hooks. Focus moves to the first tabbable
element (Cancel button) on mount and returns to the previously
focused element on unmount.
Provide screen reader context by including the filename in the
cancel button's aria-label when available, e.g. "Cancel upload
of photo.jpg". Falls back to "Cancel upload" when no filename.
Pressing Escape while the overlay is focused cancels the upload,
matching the Cancel button behavior. Event propagation is stopped
to prevent side-effects in the block editor. The overlay container
uses role=group with an aria-label for accessibility.
Remove the 0.95 alpha transparency to guarantee 4.6:1 contrast
ratio for gray-700 text on the overlay, ensuring text legibility.
@adamsilverstein
Copy link
Copy Markdown
Member Author

@jasmussen thanks for reviewing - check out the latest screencasts at the top, I made some changes already before seeing your feedback.

Do we need the label to be visible? The progress bar implies what's happening, and more easily scales to tiny images, e.g. what happens if you upload a 10x10px image?

by label do you mean the words that show up "uploading image" "generating subsize 2 of 10" etc? so maybe just show the progress bar, without text? I like that better. Then maybe simplify the progress bar to more of a loader bar ( component where the bar moves back and forth).

I guess I was trying to provide more information to the user about what was happening during the processing and uploading. Looking at what I built, however it feels too noisy - most users don't care about these details. So i'm fine removing them. Do you think there is value in keeping them somewhere (tooltip?)?

For accessibility, I assume we should still announce the progress (uploading image 3 of 10) to make sure screen reader users know what is happening.

And similarly, do we need the "Cancel" button? I would expect deleting the image cancels it.

A cancel button feels like a natural enhancement to me, especially in the case of a batch - eg. dragging a bunch of images into the editor. say i drop 15 images onto the editor then realize its in the wrong spot or i did the wrong images, this gives me an easy way to cancel the upload before it completes. Why do you question the cancel button, do you find it confusing or obtrusive?

I didn't even think about canceling an upload by deleting an image! I see how that works now from a user perspective, especially for a single image. When testing this I noticed it actually doesn't trigger a cancel of client side media processing so although the deleting action removes the image, it still winds up being processed and uploaded in the background. That feels like a bug so I'll work on fixing that.

…olders

When an image upload fails or is cancelled inside a gallery, remove
the block entirely rather than clearing its attributes, which would
leave an empty gray placeholder box.
Document why the mock is necessary: the real package has a deep
dependency chain that fails in this isolated test environment.
Clarify the actual root cause: the @wordpress/data mock doesn't
provide combineReducers/createSelector needed by the rich-text
store that components imports. Verified by testing without the
mock — the dependency chain fails at rich-text store init.
The tests required mocking @wordpress/components due to the
@wordpress/data mock breaking the dependency chain, which limits
their value for testing real user interactions. Upload overlay
behavior is better suited for E2E testing.
Add e2e tests that verify the upload progress overlay appears during
image uploads and can be cancelled. Uses page.route() to hold the
media REST API request in-flight, giving time to assert overlay
visibility.

Gallery batch overlay tests are written but skipped because the
gallery overlay depends on the upload-media store, which requires
client-side media processing (SharedArrayBuffer / cross-origin
isolation) not reliably available in the e2e environment.

Also fix filename prop fallback on UploadingOverlay when sideloading
without a temporaryURL.
@jasmussen
Copy link
Copy Markdown
Contributor

jasmussen commented Apr 1, 2026

so maybe just show the progress bar, without text? I like that better. Then maybe simplify the progress bar to more of a loader bar ( component where the bar moves back and forth).

Exactly that, yes.

I guess I was trying to provide more information to the user about what was happening during the processing and uploading. Looking at what I built, however it feels too noisy - most users don't care about these details. So i'm fine removing them. Do you think there is value in keeping them somewhere (tooltip?)?

Your instinct and motivation is not wrong, but it is exactly the balance to strike after testing it in the PR. In general I try to look for established patterns in similar/adjacent software, finding precedence. For uploading, I do appreciate progressbars (and we can make them tiny so they fit any size image), and I appreciate verbose information if something fails. But it's rare that I personally find a need for more than that.

For me the context is drag 10 images into a part of the page, then maybe start writing something else below, while it's working, so even a snackbar might be noisy. That's also context for a question on this:

For accessibility, I assume we should still announce the progress (uploading image 3 of 10) to make sure screen reader users know what is happening.

Not sure if you mean also visibly, or entirely invisibly, and wherever this lands I'll help support what gets decided as necessary. But if it's noisy/interruptive to me, while I go about my multi-tasking workflow, would it not also get noisy (literally) for a screen reader user?

A cancel button feels like a natural enhancement to me, especially in the case of a batch - eg. dragging a bunch of images into the editor. say i drop 15 images onto the editor then realize its in the wrong spot or i did the wrong images, this gives me an easy way to cancel the upload before it completes. Why do you question the cancel button, do you find it confusing or obtrusive?

I recently switched to Proton Drive, from Google Photos. This had me upload tens of thousands of images using the browser. This is obviously a sensitive flow where serious things can go wrong, so I appreciated verbose information and upload status, in a tray that sat in the corner during upload:

image

It would even detect if I had already uploaded a particular file, skipping duplicates, etc. And there was a "Cancel all" button as well.

I doubt people will be uploading that many images to WordPress, but if they do I'd expect them to do it inside the media library itself, and I'd probably suggest a similar tray for status indication as Proton Drive offers, as an enhancement. For a gallery where images are likely to upload quickly, I just don't think you'll have time to click the cancel button on an image that's uploaded before it's too late.

A "cancel all" could potentially sit as an action on a snackbar:

image

But for individual images, it's not clear you'd engage with it a lot. And it's a fair bit of UI overhead to get this right. If possible I'd recommend maybe exploring it as a separate/followup PR. If it continues to feel critical to the experience, we can get it right: we'd want to fint the right button type, perhaps an X icon so it scales to as small an image as possible, and perhaps it appears on button-hover/focus. Or, as noted, cancelling through deleting.

I didn't even think about canceling an upload by deleting an image! I see how that works now from a user perspective, especially for a single image. When testing this I noticed it actually doesn't trigger a cancel of client side media processing so although the deleting action removes the image, it still winds up being processed and uploaded in the background. That feels like a bug so I'll work on fixing that.

Nice!

Note, none of this is strongly felt. I'm happy to veer the course we need to. I'm approaching each of these improvements as individual features, and always questioning whether something earns its click-through. Nice work.

Copy link
Copy Markdown
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for addressing the feedback! Here are few more notes.

I tested briefly, and when I press the "Cancel" button or press the Escape key, the UI updates, but the upload continues in the background, and the block updates with the new image, despite canceling the process. We should fix it and add tests?

Also, this new UI doesn't seem to apply when more than one image is dragged / uploaded — is that expected? Could it be confusing for the end user?

Finally, the progress bar doesn't seem to take the whole width of the overlay, or at least, is not horizontally centered:

Image

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seems to be a lot of common code between this file and packages/block-library/src/image/uploading-overlay.js, can we maybe refactor to a common component to avoid duplication?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point, I'll try.

onCancel,
filename,
} ) {
const focusOnMountRef = useFocusOnMount( 'firstElement' );
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

firstElement currently focuses the "cancel" button, which could cause end users to inadvertently cancel the upload. Focusing the overlayRef feels like a safer option to me.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the discussion above, I'm going to remove the cancel button and feature entirely, other than deleting the image during an upload. I'll make sure that does actually cancel the upload!

@adamsilverstein
Copy link
Copy Markdown
Member Author

Also, this new UI doesn't seem to apply when more than one image is dragged / uploaded — is that expected? Could it be confusing for the end user?

No, thats a recent regression, fixing.

Finally, the progress bar doesn't seem to take the whole width of the overlay, or at least, is not horizontally centered:

Right! fixing.

@adamsilverstein
Copy link
Copy Markdown
Member Author

a loader bar ( component where the bar moves back and forth).

Exactly that, yes.

got it!

Your instinct and motivation is not wrong, but it is exactly the balance to strike after testing it in the PR. In general I try to look for established patterns in similar/adjacent software, finding precedence. For uploading, I do appreciate progressbars (and we can make them tiny so they fit any size image), and I appreciate verbose information if something fails. But it's rare that I personally find a need for more than that.

I think thats probably the most critical part actually, showing a contextual error when there is a problem. I agree most of the progress details will be noise for most users.

For accessibility, I assume we should still announce the progress (uploading image 3 of 10) to make sure screen reader users know what is happening.

Not sure if you mean also visibly, or entirely invisibly, and wherever this lands I'll help support what gets decided as necessary. But if it's noisy/interruptive to me, while I go about my multi-tasking workflow, would it not also get noisy (literally) for a screen reader user?

Good point, I'm not exactly sure what should be announced when uploading 10 images. What would you suggest @joedolson - would we just announce uploading start and finish? what is the appropriate way to announce this?

A "cancel all" could potentially sit as an action on a snackbar:

But for individual images, it's not clear you'd engage with it a lot. And it's a fair bit of UI overhead to get this right. If possible I'd recommend maybe exploring it as a separate/followup PR. If it continues to feel critical to the experience, we can get it right: we'd want to fint the right button type, perhaps an X icon so it scales to as small an image as possible, and perhaps it appears on button-hover/focus. Or, as noted, cancelling through deleting.

I'm going to remove the cancel button entirely (although the deleting action will still cancel the upload as you pointed out.

Note, none of this is strongly felt. I'm happy to veer the course we need to. I'm approaching each of these improvements as individual features, and always questioning whether something earns its click-through. Nice work.

I really appreciate your feedback and insights here and generally trust your intuition on the design.

@adamsilverstein
Copy link
Copy Markdown
Member Author

After reviewing the feedback here and removing the cancel button and progress labels, I realized this PR isn't doing much or really helping. I'm going to close as "not planned" and leave the upload spinners for now. The code will stand as prior work should someone want to try adding this later. Perhaps it is more appropriate to add in the media library as @jasmussen mentioned where a user might try to upload hundreds or thousands of images at once.

@adamsilverstein
Copy link
Copy Markdown
Member Author

I didn't even think about canceling an upload by deleting an image! I see how that works now from a user perspective, especially for a single image. When testing this I noticed it actually doesn't trigger a cancel of client side media processing so although the deleting action removes the image, it still winds up being processed and uploaded in the background. That feels like a bug so I'll work on fixing that.

I'm going to leave this as is because I realized the user could delete an image then undo that delete action. if we cancel the upload this would lead to a broken image or partial upload.

@andrewserong
Copy link
Copy Markdown
Contributor

Perhaps it is more appropriate to add in the media library as @jasmussen mentioned where a user might try to upload hundreds or thousands of images at once.

Yes, that sounds good to me. For what it's worth, we've started exploring this idea generally in the experimental media modal that now has an uploading state footer that can be expanded to show further details (as of #76228). Here's how that's looking:

image

Once the client-side media work has progressed a bit further, it'd be good to integrate it into that popover (I'll be able to help there), and this could also form the basis of proposing it (or something like it) in the media library proper.

Good explorations here, and I'm sure this'll be helpful to revisit further down the track!

@adamsilverstein
Copy link
Copy Markdown
Member Author

I am exploring high level tracking (Uploading file x of y) in the Post panel in #74362, matching what we show in the media library.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Client Side Media Media processing in the browser with WASM Needs Accessibility Feedback Need input from accessibility Needs Design Feedback Needs general design feedback. Needs Testing Needs further testing to be confirmed. [Package] Block library /packages/block-library [Type] Enhancement A suggestion for improvement.

Projects

Development

Successfully merging this pull request may close these issues.

Images: Implement upload progress UI

6 participants