Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modal: add exit animation #65203

Merged
merged 14 commits into from
Sep 18, 2024
Merged

Modal: add exit animation #65203

merged 14 commits into from
Sep 18, 2024

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Sep 10, 2024

What?

Follow-up to #64580

Add an exit animation to the Modal component.

Why?

For a better sense of polish.

How?

By adding an additional CSS animation, and waiting for it to end before invoking the onRequestClose callback prop, which consumers of Modal use to conditionally render the component.

Testing Instructions

  • Test the Modal component in Storybook and across the editor
  • Make sure that the component continues to work as expected when opened and closed (including being removed from the DOM, and managing focus correctly)
  • Make sure the component animates when being closed

Screenshots or screencast

Kapture.2024-09-10.at.15.07.07.mp4

@ciampo ciampo self-assigned this Sep 10, 2024
@ciampo ciampo force-pushed the feat/modal-exit-animation branch from 514bc9b to 5d04a1b Compare September 10, 2024 13:34
@ciampo ciampo added [Type] Enhancement A suggestion for improvement. [Package] Components /packages/components labels Sep 10, 2024
Copy link

github-actions bot commented Sep 10, 2024

Size Change: +544 B (+0.03%)

Total Size: 1.77 MB

Filename Size Change
build/components/index.min.js 225 kB +305 B (+0.14%)
build/components/style-rtl.css 12.3 kB +120 B (+0.98%)
build/components/style.css 12.3 kB +119 B (+0.98%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.16 kB
build-module/block-library/query/view.min.js 743 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 3 kB
build-module/interactivity/debug.min.js 16.4 kB
build-module/interactivity/index.min.js 13.2 kB
build/a11y/index.min.js 952 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.11 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.65 kB
build/block-editor/content.css 4.64 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/index.min.js 258 kB
build/block-editor/style-rtl.css 16 kB
build/block-editor/style.css 16 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 228 B
build/block-library/blocks/comments-pagination/editor.css 217 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 832 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 631 B
build/block-library/blocks/cover/editor-rtl.css 641 B
build/block-library/blocks/cover/editor.css 642 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 357 B
build/block-library/blocks/form-input/style.css 357 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 946 B
build/block-library/blocks/gallery/editor.css 951 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 785 B
build/block-library/blocks/image/editor.css 787 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.65 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 179 B
build/block-library/blocks/latest-posts/editor.css 179 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 558 B
build/block-library/blocks/media-text/style.css 556 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 644 B
build/block-library/blocks/navigation-link/editor.css 645 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.19 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-content/style-rtl.css 79 B
build/block-library/blocks/post-content/style.css 79 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 162 B
build/block-library/blocks/post-title/style.css 162 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 757 B
build/block-library/blocks/social-links/editor.css 756 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 396 B
build/block-library/blocks/video/editor.css 397 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 219 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.9 kB
build/block-library/style.css 14.9 kB
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.3 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.82 kB
build/core-data/index.min.js 73.4 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.98 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 13.6 kB
build/edit-post/style-rtl.css 2.54 kB
build/edit-post/style.css 2.54 kB
build/edit-site/index.min.js 217 kB
build/edit-site/posts-rtl.css 7.3 kB
build/edit-site/posts.css 7.3 kB
build/edit-site/style-rtl.css 12.6 kB
build/edit-site/style.css 12.6 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.19 kB
build/edit-widgets/style.css 4.19 kB
build/editor/index.min.js 102 kB
build/editor/style-rtl.css 9.33 kB
build/editor/style.css 9.34 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.11 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.18 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 3.2 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.61 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.34 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 1.01 kB
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@ciampo ciampo force-pushed the feat/modal-exit-animation branch from 5d04a1b to 799f002 Compare September 10, 2024 13:49
@ciampo ciampo mentioned this pull request Sep 10, 2024
@ciampo ciampo marked this pull request as ready for review September 10, 2024 13:51
@ciampo ciampo requested review from mtias and a team September 10, 2024 13:51
Copy link

github-actions bot commented Sep 10, 2024

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: tyxla <tyxla@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: jsnajdr <jsnajdr@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@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 added Needs Design Feedback Needs general design feedback. Needs Design Needs design efforts. labels Sep 10, 2024
@ciampo ciampo force-pushed the feat/modal-exit-animation branch from 799f002 to 25c95c3 Compare September 10, 2024 13:53
@ciampo
Copy link
Contributor Author

ciampo commented Sep 10, 2024

@WordPress/gutenberg-design For now, I've reversed the enter animation, and only "softened" the scale transform a bit. Happy to hear your feedback on this one.

@jameskoster
Copy link
Contributor

This makes such a big difference 😍

Here are the specs for the outro animation I saw @nick-a8c share elsewhere:

Modal | Outro

Scale: 1 → 0.9
Duration: 200ms
(1, 0, 0.2, 1)

-- --

Opacity: 1 → 0
Duration: 80ms
Linear
Delay: 80ms

Is there a way to apply the exit animation when Cancel buttons are clicked? Or to set up the component so that consumers can reference the close function that triggers the animation and apply that to Cancel buttons? Hopefully that makes sense 😅

@ciampo ciampo force-pushed the feat/modal-exit-animation branch from 25c95c3 to 011e4e1 Compare September 10, 2024 16:32
@ciampo
Copy link
Contributor Author

ciampo commented Sep 10, 2024

Exit animation spec updated.

Is there a way to apply the exit animation when Cancel buttons are clicked?

Unfortunately no, and that's because of how Modal's APIs are designed.

In particular, the way the modal is shown/hidden expects the consumer of Modal to conditionally render the whole component:

{ isModalOpen ? <Modal {...} /> : null }

Because of this, Modal doesn't have control over playing an exit animation, it gets suddenly removed from the React tree by its consumers.

The way to overcome this limitation would be to add something like an open prop, which means that consumers of the component wouldn't need to conditionally render the component:

<Modal open={ isModalOpen } />

This way, the Modal component is always rendered by React, and it could have full control over its exit animation.

Or to set up the component so that consumers can reference the close function that triggers the animation and apply that to Cancel buttons? Hopefully that makes sense 😅

I see what you're suggesting, but that would be a poor (and brittle) way of implementing it.

I understand that having the exit animation play only for certain interactions is not great, and in fact my personal advice is to keep Modal without an exit animation for the time being 😞 .

The correct way is the one illustrated above, which I believe can't be done without introducing a breaking change to the existing version of Modal. In that case, the easiest way forward would be to work on a new version of the component (likely named Dialog) which would support the open prop and, therefore, exit animations.

(cc @WordPress/gutenberg-components )

Copy link

github-actions bot commented Sep 10, 2024

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

@jameskoster
Copy link
Contributor

jameskoster commented Sep 11, 2024

in fact my personal advice is to keep Modal without an exit animation for the time being 😞 .

Because of the inconsistent exit animations? It's a shame, but I don't know if it needs to block what is otherwise a nice improvement.

Is it worth opening an issue the discuss the new component?

@ciampo
Copy link
Contributor Author

ciampo commented Sep 11, 2024

in fact my personal advice is to keep Modal without an exit animation for the time being 😞 .

Because of the inconsistent exit animations? It's a shame, but I don't know if it needs to block what is otherwise a nice improvement.

Having an inconsistent behavior (sometimes animated, sometimes not animated) could hurt the UX, giving the impression that things are not working as expected.

Is it worth opening an issue the discuss the new component?

I left a comment in the original Dialog component discussion. Although I'm sure it wouldn't be much of an issue to implement, if kept into account (and if we use ariakit, it would be even easier to implement)

Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

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

This tests great, and the code looks good. 👍

I've left some minor suggestions, and I mostly prefer if the animation changes could be in their own PR. That's mostly because we're deprecating an animation, but also because it's a good change to split as an atomic commit.

FWIW I'd be good to ship this regardless, as it's a great piece of polish 🚀

packages/base-styles/_animations.scss Show resolved Hide resolved
packages/components/src/guide/test/index.tsx Outdated Show resolved Hide resolved
packages/components/src/modal/index.tsx Outdated Show resolved Hide resolved
packages/components/src/modal/style.scss Outdated Show resolved Hide resolved
packages/base-styles/_animations.scss Outdated Show resolved Hide resolved
packages/components/src/modal/index.tsx Outdated Show resolved Hide resolved
@ciampo ciampo force-pushed the feat/modal-exit-animation branch 2 times, most recently from ba25974 to f1b1a30 Compare September 17, 2024 09:20
Copy link
Member

@jsnajdr jsnajdr left a comment

Choose a reason for hiding this comment

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

Works great. I like how the hook API uses patterns very similar to useFloating 🙂

packages/components/src/modal/use-modal-exit-animation.ts Outdated Show resolved Hide resolved
const frameEl = frameRef.current;

if ( ! frameEl ) {
closeModalReject();
Copy link
Member

Choose a reason for hiding this comment

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

I think that rejecting is too harsh 🙂 This will most likely happen when the programmer who uses the hook makes a mistake and doesn't pass the ref to an element. Or if the element is mounted conditionally or with some delay. Then we should print a console warning ("you're using the hook wrong"), but it shouldn't prevent the modal from closing at all.

Copy link
Contributor Author

@ciampo ciampo Sep 18, 2024

Choose a reason for hiding this comment

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

I changed from rejecting to warning + resolving. Let me know in case this wasn't what you had in mind

Copy link
Member

Choose a reason for hiding this comment

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

Yes, that's what I had in mind. If we don't have any element to animate, it's bad and probably there's some bug somewhere, but it's not a reason to abort closing the modal.

@ciampo ciampo force-pushed the feat/modal-exit-animation branch from 0ab921d to d774215 Compare September 18, 2024 12:41
@ciampo ciampo enabled auto-merge (squash) September 18, 2024 13:04
@ciampo ciampo merged commit 4e7e9f7 into trunk Sep 18, 2024
62 checks passed
@ciampo ciampo deleted the feat/modal-exit-animation branch September 18, 2024 13:24
@github-actions github-actions bot added this to the Gutenberg 19.3 milestone Sep 18, 2024
@rmorse
Copy link
Contributor

rmorse commented Nov 11, 2024

@ciampo
Is there a way to opt out of this animation? I think there can be reasons for not closing a modal on onRequestClose.

I have some situations where I don't want the modal to close (there is a dialog that asks if the user wants to save changes) and the animation makes it quite jarring.

chrome_trIu209da6.mp4

@rmorse
Copy link
Contributor

rmorse commented Nov 11, 2024

To clarify my thoughts a bit on this after testing some more:

  • I wouldn't want to opt out, I'd like to keep the animation, but only when we know the modal is going to be closed
  • Ultimately we control the visibility of the modal through external state, I think the naming of the prop onRequestClose also implies that its not guaranteed to close

@ciampo
Copy link
Contributor Author

ciampo commented Nov 26, 2024

Hey @rmorse , thank you for your feedback — it's all very sensible.

Unfortunately, the current implementation of the component doesn't allow for fine-grain control on the exit animation (as explained more in detail above); the
onRequestClose callback fires when the exit animation has already played (I also agree with you that the name of the callback prop is misleading!).

I can't think of many alternatives beyond exposing a prop to disable animations on the Modal altogether (cc @WordPress/gutenberg-components and @WordPress/gutenberg-design )

Moving to a completely new paradigm (ie. creating a new version of the component), like explained above, will allow us to change the API surface and introduce more granular animation behavior.

@jasmussen
Copy link
Contributor

Coming at this from mostly a design system angle, I'm trying to understand the particular use case, which is a modal that contains a save/update button that both closes the modal, and takes you to a different URL that requires you to save your document because it's outside the editor. That's from viewing the video example (thank you for providing!)—Is that right?

I think I need to more fully understand the motivation for the particular design, because I feel like I'm missing some very important nuance. Just at a glance, it seems like if that is the desired flow, the update button should also save the document before navigating elsewhere, avoiding the confirm firing. Or something else entirely.

Animation on components in general will obviously be disabled if the user has set the reduce-motion flag on their respective operating systems. But beyond that, it's not clear to me that it's actually good for the set as a whole, to allow disabling animation on individual components. To put it differently, before we add that prop, we should understand very well what the reason for adding it should be.

@jsnajdr
Copy link
Member

jsnajdr commented Nov 27, 2024

ave/update button that both closes the modal, and takes you to a different URL that requires you to save your document because it's outside the editor.

After watching the video closely, I see something different: the modal has an "Update" button that saves the changes done in the modal and closes the modal. And there's also the Close (x) button that closes the modal without saving. The browser window.confirm() popup doesn't belong to the edited post, but only to the edited info in the modal. That looks like a valid UI.

What strikes me as odd is not the animation itself, but that the modal closes before the confirm() popup appears and re-opens after I don't confirm the close. That's very unusual. The modal should remain open while we're asking for confirmation. It should be possible to intercept and delay the closing by hooking into onRequestClose.

@ciampo
Copy link
Contributor Author

ciampo commented Dec 4, 2024

What strikes me as odd is not the animation itself, but that the modal closes before the confirm() popup appears and re-opens after I don't confirm the close. That's very unusual.

The <Modal /> closes before the confirm() popup appears because the exit animation is played before firing the onRequestClose callback — but yeah, I'm surprised that it appears again after canceling the confirm() dialog.

The modal should remain open while we're asking for confirmation. It should be possible to intercept and delay the closing by hooking into onRequestClose.

@jsnajdr do you have a way to achieve this functionality with the current set of constraints (see this comment) ?

@rmorse , would you be able to open a PR with a test Storybook example (this file) for the <Modal /> component so that we can look into your usecase a bit better?

@rmorse
Copy link
Contributor

rmorse commented Dec 4, 2024

@jasmussen the modal + confirmation dialogue doesn't lead you anywhere else, you stay the on the same page - I like to think of it as editing an external resource that is not connected to the specific page, but some elements on the page are connected to it... so we provide a modal for editing so you don't need to leave the editor.

The confirm dialog is really just a lazy implemenation that will be replaced by a custom element in the future - but as we're used to seeing it when navigating away from a page (with unsaved changes) I can see how it looks like that.

If you press "cancel" on the confirm, then you are represented with the modal and your unsaved changes, you can then "cancel" to close without saving the modal or "save" to save the contents (but it doesn't close the modal)

@ciampo will do - I'll try to get a PR up for this in the next few days - I think the issue will be easy to replicate and doesn't require adding a confirm dialogue, the only thing that needs to happen is that onRequestClose doesn't close the modal - if I recall correctly, the fade out animation plays no matter what happens at this point, essentially.

Thanks for looking into this! I thought I was going to have duplicate yet another WP component into my project and hack at it 😅

@ciampo
Copy link
Contributor Author

ciampo commented Dec 4, 2024

Thanks for looking into this!

I can't promise we'll find a working solution, but we can at least look into it.

I thought I was going to have duplicate yet another WP component into my project and hack at it 😅

That's unfortunate to hear. As someone who spends the majority of their time working on the @wordpress/components package, I'd be curious to see if we @WordPress/gutenberg-components can be of help. Hacks and overrides introduce technical debt and can really hinder a project. Maybe we can find solutions / workarounds for your issues.

@mirka
Copy link
Member

mirka commented Dec 5, 2024

Here is a backward compatible way I can think of to allow preventing a close request: #67635

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs Design Feedback Needs general design feedback. Needs Design Needs design efforts. [Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants