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

Allow drag and drop to create Rows and Galleries #56186

Merged
merged 15 commits into from
Jan 24, 2024
Merged

Conversation

tellthemachines
Copy link
Contributor

@tellthemachines tellthemachines commented Nov 16, 2023

What?

Implements #13202

Enhances drag and drop so that, when hovering over or around blocks in a vertical layout, dropzones appear around the sides to allow for grouping blocks horizontally into Rows.

Additionally, if an Image block is dropped beside another Image block, they will transform into a Gallery.

Is this a good addition? Feedback appreciated!

Testing Instructions

  1. Open a post and multiple blocks;
  2. Try dragging them around each other to see the lateral dropzones appear;
  3. Try dropping a block into a lateral dropzone and check that a Row is created with both blocks;
  4. Drag an image from outside into the editor and check that it can also be formed into a Row with existing blocks;
  5. Drag an Image block beside another Image block and check that they become a Gallery block;
  6. Try to break this in imaginative ways.

Todo:

  • make images dragged in from outside onto Image blocks become Galleries too (currently they just become Rows)
  • address test failures
images-to-gallery.mov

@tellthemachines tellthemachines added [Feature] Drag and Drop Drag and drop functionality when working with blocks [Type] Experimental Experimental feature or API. [Feature] Layout Layout block support, its UI controls, and style output. labels Nov 16, 2023
@tellthemachines tellthemachines self-assigned this Nov 16, 2023
Copy link

github-actions bot commented Nov 16, 2023

Size Change: +5.9 kB (0%)

Total Size: 1.7 MB

Filename Size Change
build/api-fetch/index.min.js 2.33 kB +42 B (+2%)
build/block-directory/index.min.js 7.25 kB -6 B (0%)
build/block-editor/content-rtl.css 4.42 kB +111 B (+3%)
build/block-editor/content.css 4.42 kB +112 B (+3%)
build/block-editor/index.min.js 249 kB +1.57 kB (+1%)
build/block-editor/style-rtl.css 15.4 kB +102 B (+1%)
build/block-editor/style.css 15.4 kB +105 B (+1%)
build/block-library/blocks/page-list/editor-rtl.css 377 B -24 B (-6%)
build/block-library/blocks/page-list/editor.css 377 B -24 B (-6%)
build/block-library/blocks/pullquote/style-rtl.css 354 B +19 B (+6%) 🔍
build/block-library/blocks/pullquote/style.css 354 B +19 B (+6%) 🔍
build/block-library/editor-rtl.css 12.3 kB -5 B (0%)
build/block-library/editor.css 12.3 kB -5 B (0%)
build/block-library/index.min.js 215 kB +425 B (0%)
build/block-library/style-rtl.css 14.7 kB +18 B (0%)
build/block-library/style.css 14.7 kB +22 B (0%)
build/components/index.min.js 235 kB -46 B (0%)
build/compose/index.min.js 12.6 kB -135 B (-1%)
build/data/index.min.js 8.96 kB +22 B (0%)
build/dom/index.min.js 4.69 kB +10 B (0%)
build/edit-post/index.min.js 24.9 kB -2.96 kB (-11%) 👏
build/edit-post/style-rtl.css 5.68 kB -616 B (-10%) 👏
build/edit-post/style.css 5.68 kB -612 B (-10%) 👏
build/edit-site/index.min.js 197 kB +2.14 kB (+1%)
build/edit-site/style-rtl.css 15.3 kB +253 B (+2%)
build/edit-site/style.css 15.3 kB +256 B (+2%)
build/edit-widgets/index.min.js 17.4 kB +34 B (0%)
build/edit-widgets/style-rtl.css 4.44 kB -292 B (-6%)
build/edit-widgets/style.css 4.43 kB -293 B (-6%)
build/editor/index.min.js 61.7 kB +2.66 kB (+5%) 🔍
build/editor/style-rtl.css 5.48 kB +263 B (+5%) 🔍
build/editor/style.css 5.48 kB +268 B (+5%) 🔍
build/element/index.min.js 4.88 kB +8 B (0%)
build/format-library/index.min.js 7.99 kB +8 B (0%)
build/interactivity/index.min.js 13.3 kB +783 B (+6%) 🔍
build/patterns/index.min.js 5.43 kB +68 B (+1%)
build/preferences-persistence/index.min.js 2.08 kB +5 B (0%)
build/preferences/index.min.js 2.82 kB +1.56 kB (+124%) 🆘
build/private-apis/index.min.js 1.02 kB +15 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.71 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 590 B
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 419 B
build/block-library/blocks/button/editor.css 417 B
build/block-library/blocks/button/style-rtl.css 632 B
build/block-library/blocks/button/style.css 631 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 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 124 B
build/block-library/blocks/code/theme.css 124 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 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 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 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 228 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 343 B
build/block-library/blocks/form-submission-notification/editor.css 342 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 452 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.75 kB
build/block-library/blocks/gallery/style.css 1.75 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.61 kB
build/block-library/blocks/image/style.css 1.6 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 2.02 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 671 B
build/block-library/blocks/navigation-link/editor.css 672 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 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.1 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 666 B
build/block-library/blocks/post-featured-image/editor.css 662 B
build/block-library/blocks/post-featured-image/style-rtl.css 345 B
build/block-library/blocks/post-featured-image/style.css 345 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 409 B
build/block-library/blocks/post-template/style.css 408 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 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 312 B
build/block-library/blocks/query/style.css 308 B
build/block-library/blocks/query/view.min.js 647 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 140 B
build/block-library/blocks/read-more/style.css 140 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 602 B
build/block-library/blocks/search/style.css 602 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.49 kB
build/block-library/blocks/social-links/style.css 1.49 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 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/editor-rtl.css 395 B
build/block-library/blocks/table/editor.css 395 B
build/block-library/blocks/table/style-rtl.css 646 B
build/block-library/blocks/table/style.css 645 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 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 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 191 B
build/block-library/blocks/video/style.css 191 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.6 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/components/style-rtl.css 12.1 kB
build/components/style.css 12.1 kB
build/core-commands/index.min.js 2.73 kB
build/core-data/index.min.js 72.7 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.36 kB
build/customize-widgets/style.css 1.36 kB
build/data-controls/index.min.js 651 B
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/escape-html/index.min.js 548 B
build/format-library/style-rtl.css 500 B
build/format-library/style.css 500 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/file.min.js 442 B
build/interactivity/image.min.js 2.15 kB
build/interactivity/navigation.min.js 1.23 kB
build/interactivity/query.min.js 791 B
build/interactivity/search.min.js 610 B
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.76 kB
build/keycodes/index.min.js 1.49 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2.01 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/patterns/style-rtl.css 564 B
build/patterns/style.css 564 B
build/plugins/index.min.js 1.81 kB
build/preferences/style-rtl.css 725 B
build/preferences/style.css 728 B
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 631 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/index.min.js 2.74 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.4 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.06 kB
build/token-list/index.min.js 587 B
build/url/index.min.js 3.83 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 967 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.22 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@alexstine
Copy link
Contributor

@tellthemachines Please let Accessibility Team know when this is ready for early feedback.

From personal memory, this kind of sounds like an accessibility nightmare. When I used to magnify the screen and have to drag and drop, overlapping used to be a common problem. I can just see this turning into a situation where users perform actions they do not expect. Especially on zoomed in views.

With that said, this is still draft but wanted to leave this note while it's still early.

Thanks.

@tellthemachines
Copy link
Contributor Author

That's a great point @alexstine, thanks for the reminder! I'll have a play around with this in a magnified screen and see how it works.
This is very much an experiment and one of the goals here is to uncover any potential usability issues or conflicts with existing functionality. I'm happy to get feedback at any point, but especially once I work out how to drag and drop blocks onto other blocks. I'll add the a11y feedback label to it once it's working roughly as expected!

@andrewserong
Copy link
Contributor

Very cool exploration! I wonder how far potentially unexpected behaviour could be mitigated by having a live preview of what's going to happen prior to a user letting go of the mouse button? So if a user goes to drag over a block and it'll turn it into a Row block, it shows what that'll look like before letting go. Another thing that could potentially help there is if only a particular part of the block you're dragging over activated the behaviour where it switches to a row — e.g. if you're hovering over the right edge of a paragraph block then it'll switch to Row and add to the right, but not if you're just dragging over the middle of the block.

That's just a couple of quick thoughts / first impressions, though. Great idea playing around with this one!

@tellthemachines tellthemachines added the Needs Accessibility Feedback Need input from accessibility label Nov 21, 2023
@tellthemachines
Copy link
Contributor Author

Added "Needs accessibility feedback" label as per @alexstine 's suggestion; this is an early experiment but would be great to know if there may be any major issues with the approach.

Preliminary testing on zoomed in view shows functionality is not available on over 200% due to the block toolbar not displaying the drag handle when it's attached to the top of the canvas (which is its default mode of display on small screen/high zoom level). I'm not sure if the same will happen when using a magnifying app; would love some pointers regarding common apps to test with! I have both Mac and Windows so could test on either.

@mtias
Copy link
Member

mtias commented Nov 24, 2023

Nice! I think this could make cases like "add two images side by side" a lot more intuitive to accomplish. I think how we communicate the result needs to be tweaked, though—not with an overlay on top of the entire block. I think we need some design options there.

@mtias mtias added the Needs Design Needs design efforts. label Nov 24, 2023
@tellthemachines
Copy link
Contributor Author

Note that the latest commit changes the inserter type to inbetween BUT I haven't tweaked its placement yet so it's popping up in all sorts of weird places 😅

Todo: try showing inserter to the left or right of the block being dragged over depending on current hover position.

@jasmussen
Copy link
Contributor

Catching up let me see if I can address the "Needs Design" label. Here's a mockup:

Drag and Drop

Shown in this mockup is a header layout with a site title. In the next slide, a photo is dragged on top of this site title block, as that happens, the site title gets highlighted with a 10% blue background, and a vertical blue line appears in front of the site title.

The idea here is that the site title is in a Row container, so dragging any block into it will create a horizontal layout. Dragging on the left side of the site title will show this blue drop-indicator to the left. If you drag the image to the right side of the title, it will show the drop indicator to the right.

In other words, this is a drag and drop equivalent of the "Add before" or "Add after" options, with a visual indicator created by the block you're dragging on top of. Hope that helps!

@jasmussen jasmussen removed the Needs Design Needs design efforts. label Nov 30, 2023
@tellthemachines
Copy link
Contributor Author

I've updated this draft to use the drop indicator roughly as shown in @jasmussen 's designs. I say roughly because there is a slight obstacle to this behaviour when trying to drop over blocks that aren't already in a horizontal layout: most blocks are full-width by default, so when the inserter appears on the right hand side, it's to the right of the whole element box, and if the block content doesn't stretch to full width (as it won't with small images or some headings) then the indicator can be pretty far away from the block.

I'm not sure how to deal with this as afaik there's no way of retrieving the width of just the content without changing the block style to inline.

Here's a video showing current behaviour:

dragdrop.mov

(I haven't added the 10% blue background highlight yet)

@jasmussen
Copy link
Contributor

Nice! Thank you for working on this. I'm almost certainly missing nuance, so I'm going to list out some thoughts, then you can correct me or point out the misconceptions:

  • When the container block is a horizontal flex container (such as Row), show the drop-zones left and right.
  • When the container block is a vertical flex container (such as Stack), show the drop-zones above and below
  • Similarly, when the container is a flow container (such as Group, or a Column), show the drop-zones above and below

Following that train of thought, in this case:

so when the inserter appears on the right hand side, it's to the right of the whole element box, and if the block content doesn't stretch to full width (as it won't with small images or some headings) then the indicator can be pretty far away from the block

In this case, the block is either "filling" the remaining part of a horizontal flex box, and the blue indicator all the way to the right would be correct, since that's where the block will end up.

There's another behavior too. In this GIF are a bunch of paragraphs, and an image. When I drag the image on top of a preceding paragraph, dropzones left and right are surfaced, and when I drop on a zone left, the paragraph is turned into a row, with the image on the left:

drag on top of text

In principle, that's a cool layout tool, but it's not actually what I would expect. I wouldn't expect any containers to be created as part of this effort, so if I drag an image onto a paragraph in a default flow-based post container, I would expect the dropzones to be highlighted before and after the paragraph, like this:

Drag and Drop

I realize I should've shared this instinct earlier on, apologies.

One way I was thinking about this was that we actually output these drop-zones in the DOM, before and after the block hovered. The benefit would be, presumably, that those drop-zones in the DOM would both make the space available, but it would also intrinsically place itself where it needs to be as it would be subject to the container flex or flow rules. The main problem here is the layout shift this will cause, you might enter into a loop where the block you're hovering would layout-shift and you'd no longer be hovering, but I wonder if we can be smart there, and remember which block is hovered so long as the dropzones exist, and not blur it until you're also not hovering any of the dropzones?

@tellthemachines
Copy link
Contributor Author

When I drag the image on top of a preceding paragraph, dropzones left and right are surfaced, and when I drop on a zone left, the paragraph is turned into a row, with the image on the left:
In principle, that's a cool layout tool, but it's not actually what I would expect. I wouldn't expect any containers to be created as part of this effort

Apologies if I didn't make the intent fully clear 😅 this exploration is based on the ideas in #13202 which aim to create appropriate layout containers when users try to drag blocks next to other blocks. Essentially we're trying to guess when the desired outcome is to have the two blocks side by side, and wrap them in a Row. Do you think the visual indicators from your designs could be made to work for such a case?

Regarding making the before and after dropzones visible while hovering over a block, @andrewserong has an experiment over in #56466.

@jasmussen
Copy link
Contributor

Oh, understood.

As a prototype of that this PR certainly gets close. But I will also say in testing, that this didn't feel as useful in practice as it might sound. I think there's still room for the add-before suggestion as outlined. Perhaps they can even coexist — hover top or bottom halfs, it's before/after (like Add before), hover on the left or right halves, it's convert to row and put before or after, unless it's already in a Row in which case just put before or after. Make sense?

@tellthemachines tellthemachines changed the title Try dragging blocks onto other blocks to create Rows Allow drag and drop to create Rows and Galleries Jan 12, 2024
@tellthemachines
Copy link
Contributor Author

Ok I think I've addressed all the feedback so far:

  • scrollbar flickering fixed
  • don't create duplicate Row when dropping next to an existing Row
  • smaller threshold for dragging inside a block
  • check that Gallery block exists and use whatever grouping block is default

I don't think we need to check that the blocks being grouped are groupable, since grouping blocks should allow all blocks? Unless they can't be dropped in which case we won't see a drop indicator now that #56843 is in place. Or is there any other scenario I'm missing? We're already doing a ton of checks here so would be good to avoid unnecessary ones 😅

The failing tests will have to be overhauled because they were built on the assumption that dragging around the sides of a vertical block list would activate the vertical inbetween inserters, and that behaviour has now changed. Would be good to be sure this is the desired behaviour before going ahead with that! I'd especially appreciate design feedback.

Would also be great to get accessibility feedback to make sure this isn't breaking anything! The only new behaviour here is the creation of a new wrapper block when blocks are dropped into certain positions, so I'd expect that to not be a huge deviation from the accessibility of the existing implementation, but I'm probably missing things here 😅

@andrewserong
Copy link
Contributor

I don't think we need to check that the blocks being grouped are groupable, since grouping blocks should allow all blocks?

We might still want an isGroupable check in order to ensure that we don't wrap blocks that shouldn't be allowed to be wrapped (e.g. locked blocks)? With this PR it looks possible to wrap a Group block that is locked against movement, which isn't allowed on trunk:

2024-01-17.16.26.24.mp4

Otherwise, the threshold is feeling nice to me in testing!

The main issue I ran into is this weird one when dragging a paragraph to the right of a Row block. It then wound up in a strange state where there's two instances of the one paragraph block, so they both appear to be selected at the same time, with duplicated block tools. I've never seen anything like it! Let me know if this is just an odd thing I've run into in my environment, and I can try to come up with some more detailed replication steps 😅

2024-01-17.16.30.45.mp4

@SaxonF
Copy link
Contributor

SaxonF commented Jan 18, 2024

This is working really well for me, nice one @tellthemachines !

The only feedback I have is could maybe increase the threshold ever so slightly but I think we can start with what we have here so its less intrusive and then bump it up based on feedback after release.

layout-drag.mp4

Copy link

github-actions bot commented Jan 23, 2024

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

@tellthemachines
Copy link
Contributor Author

Thanks for the reviews!

The main issue I ran into is this weird one when dragging a paragraph to the right of a Row block. It then wound up in a strange state where there's two instances of the one paragraph block, so they both appear to be selected at the same time, with duplicated block tools.

Turns out the problem was the previous logic for avoiding double-wrapped Rows. I updated to instead prevent the drop indicator from appearing beside a Row (so you should only be able to drag into the Row, not beside it) and that fixed the issue for me.

Also added the groupability check and updated the unit tests to take this new behaviour into account. I think this is ready for a final check!

@andrewserong
Copy link
Contributor

Nice, this is feeling a lot closer to me! The issue with nested groups and locked blocks appears to be resolved for me now 👍

I'm still getting a bit of weirdness when dragging to the very edge of a full-width block. An example is when dragging a heading block within the site editor in the TT4 blog home template where we've got a lot of quite tall Group blocks. It seems to flicker a bit with showing/hiding scrollbars for me:

2024-01-24.14.53.06.mp4

In case it helps debug, my OS is set to always display scrollbars. I'm wondering if the vertical drop indicator line in this case is stretching off the edge of the container, and therefore creating an additional scrollbar? I wonder if we can constrain that drop indicator line so it never (technically) goes off the edge of the screen 🤔

To distil this use case: dragging and dropping to the left or right of a long block that extends beyond the height of the viewport and might be full width.

Other than that, it looks like some of the e2e test failures might be real for test/e2e/specs/editor/blocks/paragraph.spec.js in Playwright 2 as the tests are looking for drop zones in particular?

@tellthemachines
Copy link
Contributor Author

Thanks for re-reviewing! I've fixed the e2e and added a new test for this case.

To distil this use case: dragging and dropping to the left or right of a long block that extends beyond the height of the viewport and might be full width.

That's annoying, but not specific to this branch. I can reproduce it on trunk, in the site editor, with a very long block at the edge of a Row.

Example markup:
<!-- wp:paragraph -->
<p>block</p>
<!-- /wp:paragraph -->

<!-- wp:group {"layout":{"type":"flex","flexWrap":"nowrap"}} -->
<div class="wp-block-group"><!-- wp:paragraph -->
<p>fha;sdfh;DS Hsdf hsck this shim.nsfglkdsjfg okajgf 'ojG 'OJDFG ;OSDHG 'osdhfg ;aodgh ;ksKDGH s;kd t</p>
<!-- /wp:paragraph -->

<!-- wp:cover {"overlayColor":"accent","isUserOverlayColor":true,"minHeight":2001,"minHeightUnit":"px"} -->
<div class="wp-block-cover" style="min-height:2001px"><span aria-hidden="true" class="wp-block-cover__background has-accent-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container"><!-- wp:paragraph -->
<p>hsgadgf ad</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>g adf ad</p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:cover --></div>
<!-- /wp:group -->

I think it might be a good candidate for exploring a fix for separately, especially given it's a bit of an edge case.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

That's annoying, but not specific to this branch. I can reproduce it on trunk, in the site editor, with a very long block at the edge of a Row.

Oh, great catch! Yes, I can reproduce that on trunk now, but bizarrely only in the site editor and not in the post editor for some reason 🤔

In any case, it seems this PR just makes the issue more visible since we're using the vertical drop indicator more frequently, so I agree, that sounds like a good bug for us to look into fixing separately.

This looks good to try to me!

Nice work getting this one over the line ✨

@tellthemachines
Copy link
Contributor Author

I can reproduce that on trunk now, but bizarrely only in the site editor and not in the post editor

Same! I wonder if there's some difference in how the iframe is setup between editors 🤔

Anyway, thanks for the thorough testing!

@tellthemachines tellthemachines merged commit 973d87b into trunk Jan 24, 2024
58 checks passed
@tellthemachines tellthemachines deleted the try/drag-into-row branch January 24, 2024 05:39
@github-actions github-actions bot added this to the Gutenberg 17.6 milestone Jan 24, 2024
@Mamaduka
Copy link
Member

Mamaduka commented Jan 24, 2024

Excellent work; I love the feature!

@Mamaduka
Copy link
Member

Mamaduka commented Jan 24, 2024

@tellthemachines, I just noticed that one of the tests became flaky after this got merged - #58161.

My attempt to fix it - #58208.

@t-hamano
Copy link
Contributor

t-hamano commented Feb 5, 2024

@tellthemachines

It seems that this PR causes an error to occur when dragging and dropping multiple local images into the editor.

See #58653

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Drag and Drop Drag and drop functionality when working with blocks [Feature] Layout Layout block support, its UI controls, and style output. Needs Accessibility Feedback Need input from accessibility [Type] Experimental Experimental feature or API.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants