Skip to content

UI: Add AlertDialog primitive#76847

Merged
ciampo merged 25 commits intotrunkfrom
feat/ui-confirm-dialog-enhancements
Mar 27, 2026
Merged

UI: Add AlertDialog primitive#76847
ciampo merged 25 commits intotrunkfrom
feat/ui-confirm-dialog-enhancements

Conversation

@ciampo
Copy link
Copy Markdown
Contributor

@ciampo ciampo commented Mar 26, 2026

Prerequisite for #76837

What?

Add a new AlertDialog compound component to @wordpress/ui, built on top of Base UI's AlertDialog. Also fixes Dialog.Action disabled/loading prop forwarding.

Why?

Provides a standardized alert dialog pattern for common confirm/cancel flows — including destructive and irreversible actions — so consumers don't need to compose Dialog from scratch for these use cases.

An alert dialog requires a user response to proceed. It uses role="alertdialog", is always modal, and blocks backdrop click dismissal to ensure the user makes an explicit choice.

How?

AlertDialog wraps Base UI's AlertDialog.Root and exposes a compound API: AlertDialog.Root, AlertDialog.Trigger, and AlertDialog.Popup.

Implementation details

Component structure

  • Root — wraps Base UI's AlertDialog.Root, manages AlertDialogContext (intent).
  • Popup — renders Dialog.Popup with a header (title), body (children), and footer (cancel + confirm actions).
  • Trigger — thin wrapper over Dialog.Trigger.
  • context.tsx — provides AlertDialogContext with the current intent.

Intent system

The intent prop on Root controls styling:

default irreversible
ARIA role alertdialog alertdialog
Escape key Dismisses Dismisses
Backdrop click Blocked Blocked
Cancel / Confirm buttons Dismisses Dismisses
Confirm button style Standard Error/danger coloring

loading prop (async confirm flows)

AlertDialog.Popup accepts a loading prop that shows a spinner on the confirm button and disables both buttons. When loading is provided, the confirm button renders as a plain Button (instead of Dialog.Action) so clicking it doesn't auto-close — this avoids a race condition where _Dialog.Close's close handler fires before the consumer's onClick.

Important: Passing loading — even as false — opts into manual-close mode. The consumer is responsible for closing the dialog via open={false}. Omit the prop entirely for the default auto-close-on-confirm behavior. This contract is encoded in tests and documented in the prop's JSDoc.

All async flow logic is consumer-side:

  1. Use controlled mode (open / onOpenChange)
  2. Prevent closing in onOpenChange while loading
  3. Pass loading to AlertDialog.Popup
  4. Set open={false} when the operation completes

Dialog.Action disabled/loading fix

Dialog.Action wraps Base UI's Dialog.Close, which defaults disabled to false internally. This caused its useButton to set aria-disabled="false", overriding Button's own aria-disabled derived from loading. Fixed by extracting disabled and loading, resolving them (disabled ?? loading), and forwarding correctly to both Dialog.Close and Button.

Testing Instructions

Storybook

  1. Run npm run storybook:dev
  2. Navigate to Design System / Components / AlertDialog
  3. Verify the following stories:
    • Default — dialog blocks backdrop click; Escape key and buttons dismiss
    • Irreversible — same dismissal behavior; confirm button has danger styling
    • AsyncConfirm — confirm button shows spinner, both buttons disabled during the 2s simulated operation; dialog closes on completion
    • MenuTrigger — alert dialog triggered from a menu item
    • Controlled — dialog controlled via external state

Unit tests

npm run test:unit -- packages/ui/src/dialog/test/index.test.tsx packages/ui/src/alert-dialog/test/index.test.tsx

Testing Instructions for Keyboard

  1. Open any AlertDialog story
  2. Tab to the trigger button and press Enter to open the dialog
  3. Verify focus moves into the dialog
  4. Press Escape — dialog should close
  5. Tab between Cancel and Confirm buttons, press Enter on each to verify they close the dialog
  6. Open the AsyncConfirm story, trigger the dialog, click Confirm, and verify both buttons are disabled during the loading state

Use of AI Tools

Cursor + Claude Opus 4.6. All code was reviewed and validated by the author.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 26, 2026

Size Change: -5 B (0%)

Total Size: 7.73 MB

Filename Size Change
build/scripts/compose/index.min.js 11.1 kB -5 B (-0.05%)
ℹ️ 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-library/index.min.js 317 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/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/upload-media/index.min.js 7.88 kB
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43.2 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/editor-rtl.css 12.5 kB
build/styles/block-library/editor-rtl.min.css 10.3 kB
build/styles/block-library/editor.css 12.5 kB
build/styles/block-library/editor.min.css 10.3 kB
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/editor-rtl.css 1.52 kB
build/styles/block-library/gallery/editor-rtl.min.css 615 B
build/styles/block-library/gallery/editor.css 1.52 kB
build/styles/block-library/gallery/editor.min.css 616 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 753 B
build/styles/block-library/icon/editor-rtl.min.css 353 B
build/styles/block-library/icon/editor.css 753 B
build/styles/block-library/icon/editor.min.css 353 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/editor-rtl.css 1.63 kB
build/styles/block-library/image/editor-rtl.min.css 763 B
build/styles/block-library/image/editor.css 1.62 kB
build/styles/block-library/image/editor.min.css 763 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.58 kB
build/styles/block-library/navigation/style-rtl.min.css 2.51 kB
build/styles/block-library/navigation/style.css 3.58 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.1 kB
build/styles/edit-site/style.css 20.9 kB
build/styles/edit-site/style.min.css 17.1 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.6 kB
build/styles/editor/style.min.css 22.4 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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I realized that when our Button is disabled while focusable, clicking it still triggers the :active pseudo-state, which causes the focus ring to become transparent, which could give the false impression that the button is interactive.

If we agree with this change, I can move it to a separate PR (and investigate whether the same fix should be applied to @wordpress/components)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think the change is consistent with how we're currently using these styles (i.e. to indicate an active interaction). Although... I'm not really sure I fully understand why we do that in the first place?

Copy link
Copy Markdown
Contributor Author

@ciampo ciampo Mar 27, 2026

Choose a reason for hiding this comment

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

Removing the focus ring when the button is :active (ie. it's being pressed down during a click) is an additional visual confirmation (especially for keyboard users) that the "click" happened.

With the recent async worklow-related fixes, it actually looks like we don't need the fix anymore, since the :active state is (correcly) not triggered anymore while the Button is loading.

@ciampo ciampo self-assigned this Mar 26, 2026
@ciampo ciampo added the [Type] Enhancement A suggestion for improvement. label Mar 26, 2026
@ciampo ciampo marked this pull request as ready for review March 26, 2026 18:24
@ciampo ciampo requested a review from a team as a code owner March 26, 2026 18:24
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 26, 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: ciampo <mciampini@git.wordpress.org>
Co-authored-by: aduth <aduth@git.wordpress.org>

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

@ciampo ciampo requested a review from a team March 26, 2026 18:25
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 26, 2026

Flaky tests detected in 3256925.
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/23656209594
📝 Reported issues:

@aduth
Copy link
Copy Markdown
Member

aduth commented Mar 26, 2026

Regarding whether Escape should be blocked in the irreversible intent: I wonder if it could be reasonably inferred the "Escape" should be equated as "Cancel". My understanding of blocking something like a click on the backdrop is that it's easy to do that accidentally and not reasonably associated with confirming or canceling.

Edit: I also see this behavior described in the WAI Alert Dialog pattern example (emphasis mine)

Activating the "no" button or pressing escape closes the dialog.

Copy link
Copy Markdown
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

It's looking good 👍 I think the main things for me at this point are figuring out how we want to proceed on handling Escape, and making sure the async behavior is working correctly.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think the change is consistent with how we're currently using these styles (i.e. to indicate an active interaction). Although... I'm not really sure I fully understand why we do that in the first place?

@ciampo ciampo force-pushed the feat/ui-confirm-dialog-enhancements branch 2 times, most recently from e27765c to ca56e56 Compare March 27, 2026 10:31
@ciampo
Copy link
Copy Markdown
Contributor Author

ciampo commented Mar 27, 2026

@aduth all feedback should have been addressed:

  • the Escape key now always dismisses the dialog;
  • the async flow (and the dedicated inner workings) have been fixed, and unit tests added

@ciampo ciampo requested a review from aduth March 27, 2026 10:58
Copy link
Copy Markdown
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

Couple minor comments, but LGTM overall 👍

Comment on lines +202 to +210
onConfirm={ () => {
setIsLoading( true );
new Promise< void >( ( resolve ) =>
setTimeout( resolve, 2000 )
).then( () => {
setIsLoading( false );
setIsOpen( false );
} );
} }
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

For the story example, we never call args.onOpenChange when confirming. Not sure it really matters except for completeness or if someone were following this example in a component abstraction of an async confirmation dialog that exposes an onOpenChange. Maybe we'd call it somewhere in this promise flow? Or as a useEffect after initial mount with open as its dependency?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

onOpenChange should fire for dialog-initiated closes (Escape, backdrop click, cancel button), and is not expected to fire when confirming since the consumer (ie. the storybook example) is controlling the open state (setIsOpen(false)).

Calling onOpenChange in the promise (or in a useEffect) would, IMO, set the wrong expectation about how onOpenChange is expected to work.

I did add an additional log of the onConfirm callback, though

return (
<Dialog.Popup
ref={ ref }
role={ intent === 'irreversible' ? 'alertdialog' : 'dialog' }
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Trying to follow the spec and related examples, I don't fully understand why we wouldn't just want to apply alertdialog statically for all cases? I gather we may be associating something about "urgency" or how much it "requires a response", though all of these dialogs expect a response. And nothing I can see in the alertdialog examples or spec say anything about severity of an action or click-outside behaviors.

Copy link
Copy Markdown
Contributor Author

@ciampo ciampo Mar 27, 2026

Choose a reason for hiding this comment

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

I guess we started with the legacy ConfirmDialog from @wordpress/components in mind, and we saw ConfirmDialog as a convenient higher-level version of Dialog.

Then we started adding the differentiation for the irreversible variant:

  • we made it harder to dismiss, hence the logic around the Escape key (recently reverted) and the pointer clicks on the backrdop (still applied)
  • we made it an official alertdialog, while keeping the default variant a simple dialog

I remember also explicitly discussing these differences as the reason for having a custom implementation on top of our Dialog, rather than building on top of base ui's AlertDialog.

If we're ok to always (regardless of the variant):

  • assign the alertdialog role;
  • allow the Escape key dismissal;
  • disallow the click outside dismissal;

then we should just rename our component AlertDialog and build it on top of base ui's AlertDialog — which I'd be totally fine with.

@aduth should I go ahead with the refactor?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

That's a bit more extensive rethink than I expected to prompt with my question 😅 Though it's definitely an interesting proposition. I guess the main deviation there is standardizing the behavior of clicking outside. But the alignment to BaseUI is appealing.

I'm not sure I fully understand the relation between AlertDialog and Dialog in BaseUI, how much it builds on each other, how much that leaves for us to reimplement (i.e. how big a refactor).

If it's a big refactor, we could optionally do a few steps to move in that direction, like renaming ConfirmDialog to AlertDialog and/or always assigning the role.

Personally, I think I'd be okay with this refactor, including the implications on disallowing click outside dismissal regardless of intent. But it could be good to get some more buy-in from other folks as well.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I tried the refactor (can be always undone), it was quite simple and didn't involve any public API changes (apart from the component name): 2d37d04

ciampo added 10 commits March 27, 2026 15:51
The ConfirmDialog was authored against an older Dialog version that had
a `title` prop on `Dialog.Root` and a `Dialog.Heading` subcomponent.
The current Dialog uses `Dialog.Title` (with children) and has no
`title` prop on Root.

- Thread `title` through `ConfirmDialogContext` instead of passing it
  to `Dialog.Root`.
- Replace `<Dialog.Heading />` with `<Dialog.Title>{ title }</Dialog.Title>`.
- Define `title` directly on `RootProps` instead of picking it from
  `DialogRootProps`.
- Fix invalid `wpds` i18n text domain.

Made-with: Cursor
- Swap runtime `react` imports for `@wordpress/element`.
- Sort imports (externals, then @wordpress/*, then internal).
- Use `import type` for type-only imports.
- Move Storybook file to `stories/index.story.tsx`.
- Update story title to `Design System/Components/ConfirmDialog`.
- Fix `waitFor` blocks to use single assertions (lint rule).
- Add JSDoc to Trigger component.
- Export `ConfirmDialog` namespace from the package index.

Made-with: Cursor
- Add `role="alertdialog"` to the popup for `irreversible` intent,
  `role="dialog"` for `default`.
- Block Escape key dismissal for `irreversible` intent (previously
  only backdrop click was blocked).
- Block backdrop click for `default` intent too — confirm dialogs
  should always require an explicit action.
- Extract `getIntentConfig()` helper in context.tsx to centralize
  intent-dependent behavior (role, blocked dismiss reasons).
- Update JSDoc and story descriptions to reflect the new behavior.

Made-with: Cursor
Add a `loading` prop to `ConfirmDialog.Popup` that shows a spinner on
the confirm button and disables both buttons. All async flow logic
(controlled open state, preventing close during loading, closing on
completion) is handled by the consumer.

Pass `disabled` alongside `loading` to `Dialog.Action` to align
`_Dialog.Close`'s internal `useButton` with the desired disabled state.

Made-with: Cursor
The title is only consumed by Popup (to render Dialog.Title), so it
belongs there as a direct prop rather than traversing through context.
This simplifies the data flow and removes title from
ConfirmDialogContext.

Made-with: Cursor
ciampo added 12 commits March 27, 2026 15:51
The default (non-irreversible) variant should allow dismissing via
backdrop click, matching the original behavior. Only the irreversible
intent blocks all implicit dismissals.

Made-with: Cursor
Dialog.Action wraps Base UI's Dialog.Close, which defaults
`disabled` to `false` internally. This caused its `useButton` to
set `aria-disabled="false"`, overriding Button's own `aria-disabled`
derived from the `loading` prop.

Extract `disabled` and `loading`, resolve them the same way Button
does (`disabled ?? loading`), and pass the result to Dialog.Close.
Forward `loading` directly to Button for the spinner CSS class.

Made-with: Cursor
Now that Dialog.Action properly resolves disabled from loading,
the explicit `disabled={loading || undefined}` workaround and its
explanatory comment are no longer needed.

Made-with: Cursor
Expand the `loading` JSDoc to explicitly state that passing the prop
(even as `false`) opts into manual-close mode. Add a regression test
encoding this contract so future contributors don't accidentally
change the `loading !== undefined` check.

Made-with: Cursor
@ciampo ciampo force-pushed the feat/ui-confirm-dialog-enhancements branch from 943524a to 2d5026b Compare March 27, 2026 15:31
@ciampo ciampo changed the title UI: Add ConfirmDialog primitive UI: Add AlertDialog primitive Mar 27, 2026
Copy link
Copy Markdown
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

LGTM 👍 I think I like the AlertDialog name a lot more. Not only in how it aligns to BaseUI, but also in the alertdialog role semantics.

@ciampo ciampo merged commit d7b0103 into trunk Mar 27, 2026
41 checks passed
@ciampo ciampo deleted the feat/ui-confirm-dialog-enhancements branch March 27, 2026 17:13
@github-actions github-actions bot added this to the Gutenberg 22.9 milestone Mar 27, 2026
adamsilverstein pushed a commit that referenced this pull request Mar 31, 2026
* initlal version

* ConfirmDialog: Fix Dialog API incompatibilities

The ConfirmDialog was authored against an older Dialog version that had
a `title` prop on `Dialog.Root` and a `Dialog.Heading` subcomponent.
The current Dialog uses `Dialog.Title` (with children) and has no
`title` prop on Root.

- Thread `title` through `ConfirmDialogContext` instead of passing it
  to `Dialog.Root`.
- Replace `<Dialog.Heading />` with `<Dialog.Title>{ title }</Dialog.Title>`.
- Define `title` directly on `RootProps` instead of picking it from
  `DialogRootProps`.
- Fix invalid `wpds` i18n text domain.

Made-with: Cursor

* ConfirmDialog: Adapt to @wordpress/ui package conventions

- Swap runtime `react` imports for `@wordpress/element`.
- Sort imports (externals, then @wordpress/*, then internal).
- Use `import type` for type-only imports.
- Move Storybook file to `stories/index.story.tsx`.
- Update story title to `Design System/Components/ConfirmDialog`.
- Fix `waitFor` blocks to use single assertions (lint rule).
- Add JSDoc to Trigger component.
- Export `ConfirmDialog` namespace from the package index.

Made-with: Cursor

* ConfirmDialog: Add CHANGELOG entry

Made-with: Cursor

* Dialog: Remove ConfirmDialog story now covered by dedicated component

Made-with: Cursor

* ConfirmDialog: Tighten irreversible intent behavior

- Add `role="alertdialog"` to the popup for `irreversible` intent,
  `role="dialog"` for `default`.
- Block Escape key dismissal for `irreversible` intent (previously
  only backdrop click was blocked).
- Block backdrop click for `default` intent too — confirm dialogs
  should always require an explicit action.
- Extract `getIntentConfig()` helper in context.tsx to centralize
  intent-dependent behavior (role, blocked dismiss reasons).
- Update JSDoc and story descriptions to reflect the new behavior.

Made-with: Cursor

* ConfirmDialog: Add `loading` prop for async confirm flows

Add a `loading` prop to `ConfirmDialog.Popup` that shows a spinner on
the confirm button and disables both buttons. All async flow logic
(controlled open state, preventing close during loading, closing on
completion) is handled by the consumer.

Pass `disabled` alongside `loading` to `Dialog.Action` to align
`_Dialog.Close`'s internal `useButton` with the desired disabled state.

Made-with: Cursor

* ConfirmDialog: Add CHANGELOG entries for enhancements

Made-with: Cursor

* ConfirmDialog: Move title prop from Root to Popup

The title is only consumed by Popup (to render Dialog.Title), so it
belongs there as a direct prop rather than traversing through context.
This simplifies the data flow and removes title from
ConfirmDialogContext.

Made-with: Cursor

* format css

* ConfirmDialog: Restore backdrop click dismissal for default intent

The default (non-irreversible) variant should allow dismissing via
backdrop click, matching the original behavior. Only the irreversible
intent blocks all implicit dismissals.

Made-with: Cursor

* Dialog: Fix Action disabled/loading forwarding to Button

Dialog.Action wraps Base UI's Dialog.Close, which defaults
`disabled` to `false` internally. This caused its `useButton` to
set `aria-disabled="false"`, overriding Button's own `aria-disabled`
derived from the `loading` prop.

Extract `disabled` and `loading`, resolve them the same way Button
does (`disabled ?? loading`), and pass the result to Dialog.Close.
Forward `loading` directly to Button for the spinner CSS class.

Made-with: Cursor

* ConfirmDialog: Remove disabled workaround on confirm action

Now that Dialog.Action properly resolves disabled from loading,
the explicit `disabled={loading || undefined}` workaround and its
explanatory comment are no longer needed.

Made-with: Cursor

* Remove superflous CHANGELOG entries

* Update CHANGELOG PR reference

* Allow Escape key to dismiss the irreversible variant, cleanup getIntentConfig

* Remove hardcoded domain from Storybook docs URL

* CHANGELOG

* Try to fix async confirm workflow

* Better approach to async confirm work

* Add async flow unit test

* ConfirmDialog: Clarify loading prop manual-close contract

Expand the `loading` JSDoc to explicitly state that passing the prop
(even as `false`) opts into manual-close mode. Add a regression test
encoding this contract so future contributors don't accidentally
change the `loading !== undefined` check.

Made-with: Cursor

* Log "onConfirm" action

* Refactor to use base ui's AlertDialog, rename to AlertDialog

* format
@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 31, 2026

  • the Escape key now always dismisses the dialog

Yay, I like this too 🎉

ObliviousHarmony pushed a commit that referenced this pull request Apr 1, 2026
* initlal version

* ConfirmDialog: Fix Dialog API incompatibilities

The ConfirmDialog was authored against an older Dialog version that had
a `title` prop on `Dialog.Root` and a `Dialog.Heading` subcomponent.
The current Dialog uses `Dialog.Title` (with children) and has no
`title` prop on Root.

- Thread `title` through `ConfirmDialogContext` instead of passing it
  to `Dialog.Root`.
- Replace `<Dialog.Heading />` with `<Dialog.Title>{ title }</Dialog.Title>`.
- Define `title` directly on `RootProps` instead of picking it from
  `DialogRootProps`.
- Fix invalid `wpds` i18n text domain.

Made-with: Cursor

* ConfirmDialog: Adapt to @wordpress/ui package conventions

- Swap runtime `react` imports for `@wordpress/element`.
- Sort imports (externals, then @wordpress/*, then internal).
- Use `import type` for type-only imports.
- Move Storybook file to `stories/index.story.tsx`.
- Update story title to `Design System/Components/ConfirmDialog`.
- Fix `waitFor` blocks to use single assertions (lint rule).
- Add JSDoc to Trigger component.
- Export `ConfirmDialog` namespace from the package index.

Made-with: Cursor

* ConfirmDialog: Add CHANGELOG entry

Made-with: Cursor

* Dialog: Remove ConfirmDialog story now covered by dedicated component

Made-with: Cursor

* ConfirmDialog: Tighten irreversible intent behavior

- Add `role="alertdialog"` to the popup for `irreversible` intent,
  `role="dialog"` for `default`.
- Block Escape key dismissal for `irreversible` intent (previously
  only backdrop click was blocked).
- Block backdrop click for `default` intent too — confirm dialogs
  should always require an explicit action.
- Extract `getIntentConfig()` helper in context.tsx to centralize
  intent-dependent behavior (role, blocked dismiss reasons).
- Update JSDoc and story descriptions to reflect the new behavior.

Made-with: Cursor

* ConfirmDialog: Add `loading` prop for async confirm flows

Add a `loading` prop to `ConfirmDialog.Popup` that shows a spinner on
the confirm button and disables both buttons. All async flow logic
(controlled open state, preventing close during loading, closing on
completion) is handled by the consumer.

Pass `disabled` alongside `loading` to `Dialog.Action` to align
`_Dialog.Close`'s internal `useButton` with the desired disabled state.

Made-with: Cursor

* ConfirmDialog: Add CHANGELOG entries for enhancements

Made-with: Cursor

* ConfirmDialog: Move title prop from Root to Popup

The title is only consumed by Popup (to render Dialog.Title), so it
belongs there as a direct prop rather than traversing through context.
This simplifies the data flow and removes title from
ConfirmDialogContext.

Made-with: Cursor

* format css

* ConfirmDialog: Restore backdrop click dismissal for default intent

The default (non-irreversible) variant should allow dismissing via
backdrop click, matching the original behavior. Only the irreversible
intent blocks all implicit dismissals.

Made-with: Cursor

* Dialog: Fix Action disabled/loading forwarding to Button

Dialog.Action wraps Base UI's Dialog.Close, which defaults
`disabled` to `false` internally. This caused its `useButton` to
set `aria-disabled="false"`, overriding Button's own `aria-disabled`
derived from the `loading` prop.

Extract `disabled` and `loading`, resolve them the same way Button
does (`disabled ?? loading`), and pass the result to Dialog.Close.
Forward `loading` directly to Button for the spinner CSS class.

Made-with: Cursor

* ConfirmDialog: Remove disabled workaround on confirm action

Now that Dialog.Action properly resolves disabled from loading,
the explicit `disabled={loading || undefined}` workaround and its
explanatory comment are no longer needed.

Made-with: Cursor

* Remove superflous CHANGELOG entries

* Update CHANGELOG PR reference

* Allow Escape key to dismiss the irreversible variant, cleanup getIntentConfig

* Remove hardcoded domain from Storybook docs URL

* CHANGELOG

* Try to fix async confirm workflow

* Better approach to async confirm work

* Add async flow unit test

* ConfirmDialog: Clarify loading prop manual-close contract

Expand the `loading` JSDoc to explicitly state that passing the prop
(even as `false`) opts into manual-close mode. Add a regression test
encoding this contract so future contributors don't accidentally
change the `loading !== undefined` check.

Made-with: Cursor

* Log "onConfirm" action

* Refactor to use base ui's AlertDialog, rename to AlertDialog

* format
adamsilverstein pushed a commit that referenced this pull request Apr 7, 2026
* initlal version

* ConfirmDialog: Fix Dialog API incompatibilities

The ConfirmDialog was authored against an older Dialog version that had
a `title` prop on `Dialog.Root` and a `Dialog.Heading` subcomponent.
The current Dialog uses `Dialog.Title` (with children) and has no
`title` prop on Root.

- Thread `title` through `ConfirmDialogContext` instead of passing it
  to `Dialog.Root`.
- Replace `<Dialog.Heading />` with `<Dialog.Title>{ title }</Dialog.Title>`.
- Define `title` directly on `RootProps` instead of picking it from
  `DialogRootProps`.
- Fix invalid `wpds` i18n text domain.

Made-with: Cursor

* ConfirmDialog: Adapt to @wordpress/ui package conventions

- Swap runtime `react` imports for `@wordpress/element`.
- Sort imports (externals, then @wordpress/*, then internal).
- Use `import type` for type-only imports.
- Move Storybook file to `stories/index.story.tsx`.
- Update story title to `Design System/Components/ConfirmDialog`.
- Fix `waitFor` blocks to use single assertions (lint rule).
- Add JSDoc to Trigger component.
- Export `ConfirmDialog` namespace from the package index.

Made-with: Cursor

* ConfirmDialog: Add CHANGELOG entry

Made-with: Cursor

* Dialog: Remove ConfirmDialog story now covered by dedicated component

Made-with: Cursor

* ConfirmDialog: Tighten irreversible intent behavior

- Add `role="alertdialog"` to the popup for `irreversible` intent,
  `role="dialog"` for `default`.
- Block Escape key dismissal for `irreversible` intent (previously
  only backdrop click was blocked).
- Block backdrop click for `default` intent too — confirm dialogs
  should always require an explicit action.
- Extract `getIntentConfig()` helper in context.tsx to centralize
  intent-dependent behavior (role, blocked dismiss reasons).
- Update JSDoc and story descriptions to reflect the new behavior.

Made-with: Cursor

* ConfirmDialog: Add `loading` prop for async confirm flows

Add a `loading` prop to `ConfirmDialog.Popup` that shows a spinner on
the confirm button and disables both buttons. All async flow logic
(controlled open state, preventing close during loading, closing on
completion) is handled by the consumer.

Pass `disabled` alongside `loading` to `Dialog.Action` to align
`_Dialog.Close`'s internal `useButton` with the desired disabled state.

Made-with: Cursor

* ConfirmDialog: Add CHANGELOG entries for enhancements

Made-with: Cursor

* ConfirmDialog: Move title prop from Root to Popup

The title is only consumed by Popup (to render Dialog.Title), so it
belongs there as a direct prop rather than traversing through context.
This simplifies the data flow and removes title from
ConfirmDialogContext.

Made-with: Cursor

* format css

* ConfirmDialog: Restore backdrop click dismissal for default intent

The default (non-irreversible) variant should allow dismissing via
backdrop click, matching the original behavior. Only the irreversible
intent blocks all implicit dismissals.

Made-with: Cursor

* Dialog: Fix Action disabled/loading forwarding to Button

Dialog.Action wraps Base UI's Dialog.Close, which defaults
`disabled` to `false` internally. This caused its `useButton` to
set `aria-disabled="false"`, overriding Button's own `aria-disabled`
derived from the `loading` prop.

Extract `disabled` and `loading`, resolve them the same way Button
does (`disabled ?? loading`), and pass the result to Dialog.Close.
Forward `loading` directly to Button for the spinner CSS class.

Made-with: Cursor

* ConfirmDialog: Remove disabled workaround on confirm action

Now that Dialog.Action properly resolves disabled from loading,
the explicit `disabled={loading || undefined}` workaround and its
explanatory comment are no longer needed.

Made-with: Cursor

* Remove superflous CHANGELOG entries

* Update CHANGELOG PR reference

* Allow Escape key to dismiss the irreversible variant, cleanup getIntentConfig

* Remove hardcoded domain from Storybook docs URL

* CHANGELOG

* Try to fix async confirm workflow

* Better approach to async confirm work

* Add async flow unit test

* ConfirmDialog: Clarify loading prop manual-close contract

Expand the `loading` JSDoc to explicitly state that passing the prop
(even as `false`) opts into manual-close mode. Add a regression test
encoding this contract so future contributors don't accidentally
change the `loading !== undefined` check.

Made-with: Cursor

* Log "onConfirm" action

* Refactor to use base ui's AlertDialog, rename to AlertDialog

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

Labels

[Package] UI /packages/ui [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants