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

Grid interactivity: Allow blocks to be positioned in manual mode using drag and drop #61025

Merged
merged 31 commits into from
Jun 25, 2024

Conversation

noisysocks
Copy link
Member

@noisysocks noisysocks commented Apr 24, 2024

This PR adds the ability to explicitly position a grid item by dragging and dropping it to a cell.

In order to allow more precise manipulation of the grid, when switching to manual mode all grid items are fixed in place. They can then be moved around with drag and drop, with the block movers (in any direction) or by changing the values of column and row in the Dimensions sidebar.

Positioning a grid item is done by setting the style.layout.columnStart and style.layout.rowStart attributes. These were added in #59483.

The drag and drop mechanism works by having a DropZone in each of the GridVisualizer's cells. There's some trickery here to work around the fact thatGridVisualizer needs pointer-events: none so that you can interact with the blocks that are underneath the visualiser. Pointer events are disabled on the cells until the user begins to drag a block, at which point we enable pointer events so that the drop zones work as expected.

Steps for testing:

  1. In Gutenberg > Experiments, enable "Grid interactivity"
  2. Add a Grid block to a post or template and add a few items inside it.
  3. Set the Grid to Manual mode; adjust Columns and Rows as desired.
  4. Try dragging and dropping items from one cell to another.
movingblocks.mp4

Note that if a block is too big for a particular cell and there are not enough empty adjacent cells to fit it, the drop zone won't appear.

Also note that in this configuration it's possible to expand a grid item in a way that causes it to overlap with adjacent blocks (because all blocks in this mode have fixed column and row starts). This doesn't feel ideal.

Copy link

github-actions bot commented Apr 24, 2024

Size Change: +3.39 kB (+0.19%)

Total Size: 1.76 MB

Filename Size Change
build/block-directory/index.min.js 7.31 kB +6 B (+0.08%)
build/block-directory/style-rtl.css 1.01 kB -9 B (-0.88%)
build/block-directory/style.css 1.01 kB -10 B (-0.98%)
build/block-editor/index.min.js 265 kB +2.28 kB (+0.87%)
build/block-editor/style-rtl.css 15.6 kB +81 B (+0.52%)
build/block-editor/style.css 15.6 kB +81 B (+0.52%)
build/block-library/blocks/audio/style-rtl.css 132 B +7 B (+5.6%) 🔍
build/block-library/blocks/audio/style.css 132 B +7 B (+5.6%) 🔍
build/block-library/blocks/audio/theme-rtl.css 134 B +8 B (+6.35%) 🔍
build/block-library/blocks/audio/theme.css 134 B +8 B (+6.35%) 🔍
build/block-library/blocks/embed/style-rtl.css 419 B +8 B (+1.95%)
build/block-library/blocks/embed/style.css 419 B +8 B (+1.95%)
build/block-library/blocks/embed/theme-rtl.css 133 B +7 B (+5.56%) 🔍
build/block-library/blocks/embed/theme.css 133 B +7 B (+5.56%) 🔍
build/block-library/blocks/image/style-rtl.css 1.54 kB +26 B (+1.71%)
build/block-library/blocks/image/style.css 1.54 kB +25 B (+1.65%)
build/block-library/blocks/media-text/style-rtl.css 516 B +10 B (+1.98%)
build/block-library/blocks/media-text/style.css 515 B +11 B (+2.18%)
build/block-library/blocks/navigation/style-rtl.css 2.26 kB +10 B (+0.44%)
build/block-library/blocks/navigation/style.css 2.25 kB +9 B (+0.4%)
build/block-library/blocks/search/style-rtl.css 672 B -12 B (-1.75%)
build/block-library/blocks/search/style.css 671 B -12 B (-1.76%)
build/block-library/blocks/table/theme-rtl.css 152 B +7 B (+4.83%) 🔍
build/block-library/blocks/table/theme.css 152 B +7 B (+4.83%) 🔍
build/block-library/blocks/video/style-rtl.css 192 B +6 B (+3.23%)
build/block-library/blocks/video/style.css 192 B +6 B (+3.23%)
build/block-library/blocks/video/theme-rtl.css 134 B +8 B (+6.35%) 🔍
build/block-library/blocks/video/theme.css 134 B +8 B (+6.35%) 🔍
build/block-library/common-rtl.css 1.1 kB -11 B (-0.99%)
build/block-library/common.css 1.1 kB -10 B (-0.9%)
build/block-library/index.min.js 219 kB -16 B (-0.01%)
build/block-library/reset-rtl.css 472 B +2 B (+0.43%)
build/block-library/reset.css 472 B +2 B (+0.43%)
build/block-library/style-rtl.css 14.6 kB +3 B (+0.02%)
build/block-library/style.css 14.6 kB +1 B (+0.01%)
build/block-library/theme-rtl.css 702 B +4 B (+0.57%)
build/block-library/theme.css 707 B +4 B (+0.57%)
build/blocks/index.min.js 52.2 kB +21 B (+0.04%)
build/commands/index.min.js 15.2 kB +3 B (+0.02%)
build/components/index.min.js 223 kB -139 B (-0.06%)
build/components/style-rtl.css 12.1 kB +85 B (+0.71%)
build/components/style.css 12.1 kB +85 B (+0.71%)
build/core-commands/index.min.js 2.75 kB +6 B (+0.22%)
build/core-data/index.min.js 72.6 kB +78 B (+0.11%)
build/customize-widgets/index.min.js 10.9 kB +5 B (+0.05%)
build/customize-widgets/style-rtl.css 1.35 kB -8 B (-0.59%)
build/customize-widgets/style.css 1.35 kB -9 B (-0.66%)
build/data/index.min.js 8.99 kB +6 B (+0.07%)
build/edit-post/index.min.js 12.5 kB +63 B (+0.51%)
build/edit-site/index.min.js 208 kB +204 B (+0.1%)
build/edit-site/style-rtl.css 11.8 kB +32 B (+0.27%)
build/edit-site/style.css 11.8 kB +36 B (+0.31%)
build/edit-widgets/index.min.js 17.6 kB +5 B (+0.03%)
build/edit-widgets/style-rtl.css 4.18 kB -7 B (-0.17%)
build/edit-widgets/style.css 4.18 kB -7 B (-0.17%)
build/editor/index.min.js 98.2 kB +224 B (+0.23%)
build/editor/style-rtl.css 9.19 kB -34 B (-0.37%)
build/editor/style.css 9.18 kB -35 B (-0.38%)
build/format-library/index.min.js 8.1 kB +6 B (+0.07%)
build/interactivity/debug.min.js 16.5 kB +21 B (+0.13%)
build/interactivity/index.min.js 13.4 kB +21 B (+0.16%)
build/patterns/index.min.js 7.34 kB +115 B (+1.59%)
build/preferences/index.min.js 2.9 kB +6 B (+0.21%)
build/private-apis/index.min.js 1.01 kB +15 B (+1.51%)
build/reusable-blocks/index.min.js 2.73 kB +8 B (+0.29%)
build/router/index.min.js 1.96 kB +6 B (+0.31%)
build/token-list/index.min.js 581 B +2 B (+0.35%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 951 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.31 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-editor/content-rtl.css 4.57 kB
build/block-editor/content.css 4.57 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 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 149 B
build/block-library/blocks/audio/editor.css 151 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 310 B
build/block-library/blocks/button/editor.css 310 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 336 B
build/block-library/blocks/buttons/editor.css 336 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 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 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-content/style-rtl.css 90 B
build/block-library/blocks/comment-content/style.css 90 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 221 B
build/block-library/blocks/comments-pagination/editor.css 211 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 668 B
build/block-library/blocks/cover/editor.css 669 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 314 B
build/block-library/blocks/embed/editor.css 314 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 342 B
build/block-library/blocks/form-input/style.css 342 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 958 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.71 kB
build/block-library/blocks/gallery/style.css 1.71 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 402 B
build/block-library/blocks/group/editor.css 402 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 890 B
build/block-library/blocks/image/editor.css 889 B
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.54 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 204 B
build/block-library/blocks/latest-posts/editor.css 204 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 104 B
build/block-library/blocks/list/style.css 104 B
build/block-library/blocks/media-text/editor-rtl.css 304 B
build/block-library/blocks/media-text/editor.css 303 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 663 B
build/block-library/blocks/navigation-link/editor.css 664 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.2 kB
build/block-library/blocks/navigation/editor.css 2.21 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/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 506 B
build/block-library/blocks/post-comments-form/style.css 506 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-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 141 B
build/block-library/blocks/post-excerpt/style.css 141 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 341 B
build/block-library/blocks/post-featured-image/style.css 341 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 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 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 220 B
build/block-library/blocks/query-pagination/editor.css 208 B
build/block-library/blocks/query-pagination/style-rtl.css 287 B
build/block-library/blocks/query-pagination/style.css 283 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 502 B
build/block-library/blocks/query/editor.css 502 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 221 B
build/block-library/blocks/quote/theme.css 225 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 183 B
build/block-library/blocks/search/editor.css 183 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-title/editor-rtl.css 123 B
build/block-library/blocks/site-title/editor.css 123 B
build/block-library/blocks/site-title/style-rtl.css 71 B
build/block-library/blocks/site-title/style.css 71 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 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.5 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/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/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 393 B
build/block-library/blocks/template-part/editor.css 393 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 108 B
build/block-library/blocks/term-description/style.css 108 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 553 B
build/block-library/blocks/video/editor.css 554 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12 kB
build/block-library/editor.css 11.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/compose/index.min.js 12.9 kB
build/data-controls/index.min.js 641 B
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.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-site/posts-rtl.css 6.35 kB
build/edit-site/posts.css 6.35 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 494 B
build/format-library/style.css 493 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/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.68 kB
build/interactivity/navigation.min.js 1.16 kB
build/interactivity/query.min.js 742 B
build/interactivity/router.min.js 2.8 kB
build/interactivity/search.min.js 615 B
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.17 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.3 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.58 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
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/style-rtl.css 715 B
build/preferences/style.css 715 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 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/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 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.01 kB
build/url/index.min.js 3.85 kB
build/vendors/react-dom.min.js 42.8 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 2.65 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

@tellthemachines
Copy link
Contributor

This is a promising start!

Can we show the column/row start in the child layout panel for each block?

After dragging and dropping a few blocks on an existing Grid, selecting the Grid block triggers an Uncaught TypeError: Cannot destructure property 'columnStart' of '(intermediate value)' as it is undefined.

Also should we disable dragging into an empty grid area altogether for auto grids? It's not working too well (I tried to drop a single span block into an empty place and it turned into a 3-col block 😅)

@tellthemachines
Copy link
Contributor

Oh, just noticed something else: we might want to add an explicit default grid-template-rows for manual grids, otherwise when we set it to manual it collapses in on itself because the generated auto rows have 0 height:

Screenshot 2024-04-30 at 9 40 29 AM Screenshot 2024-04-30 at 9 41 55 AM

@noisysocks noisysocks mentioned this pull request Apr 30, 2024
37 tasks
@tellthemachines tellthemachines force-pushed the try/completely-manual-grid-mode branch from 006dc77 to 37ff369 Compare June 14, 2024 03:24
Copy link

github-actions bot commented Jun 14, 2024

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

@tellthemachines
Copy link
Contributor

I've rebased and fixed a few things on this PR so it's in roughly testable form. From playing around with it, I think the biggest thing it's missing is the ability to drop into any place on a manual grid when the grid isn't selected. Currently, dropping into the grid from outside it will only show the in-between placeholder, so the item ends up falling into the first available space on the grid:

grid-drop.mov

The other thing that I'm not sure about is if we hijack the existing manual mode for this, how to still make available the existing manual mode. #60941 might help somewhat, but we also need to provide back compat and make sure the change isn't confusing for folks using the current grid controls.

Additional feedback and ideas are very welcome here!

@noisysocks
Copy link
Member Author

noisysocks commented Jun 17, 2024

I've rebased and fixed a few things on this PR so it's in roughly testable form. From playing around with it, I think the biggest thing it's missing is the ability to drop into any place on a manual grid when the grid isn't selected.

Good point. I think it would make sense if GridVisualizer appears when you're dragging over the grid block.

Currently, dropping into the grid from outside it will only show the in-between placeholder, so the item ends up falling into the first available space on the grid:

Do the in-between placeholders make sense when the grid is in manual mode? I suppose they would work okay if we implement the functionality where columnStart and rowStart are automatically shuffled around when the block order is changed e.g. when you re-order a block in the list view.

The other thing that I'm not sure about is if we hijack the existing manual mode for this, how to still make available the existing manual mode. #60941 might help somewhat, but we also need to provide back compat and make sure the change isn't confusing for folks using the current grid controls.

Yep good flag. I think it makes sense to do that in tandem with this.

@tellthemachines tellthemachines self-assigned this Jun 18, 2024
@tellthemachines
Copy link
Contributor

OK I've updated this PR so that when grid items are moved around inside the grid, the markup is correspondingly reordered. This works whether the items are dragged and dropped, moved with the block movers or their row/column start values are updated in the sidebar.

The code is pretty messy, but it seems to be working as expected.

moving-blocks-around.mp4

Points of friction I noticed:

  • block toolbar jumping around when moving blocks with the mover means you can't really move more than one position at a time without stopping and relocating the buttons
  • particularly when moving with the mover or via the sidebar controls, blocks going under/over other blocks with no warning can be confusing

Still to be addressed, probably in follow-up PRs (this changeset is already pretty big)

  • Show inserter in empty cells so we can add blocks to any position in the grid
  • Allow dragging blocks from outside into the grid
  • Resizing positioned blocks should re-position them according to the direction they were resized in

Any testing and feedback much appreciated!


return {
canMove: canMoveBlocks( clientIds, _rootClientId ),
rootClientId: _rootClientId,
isFirst: firstIndex === 0,
isLast: lastIndex === blockOrder.length - 1,
orientation: getBlockListSettings( _rootClientId )?.orientation,
// TODO: Doesn't feel great to couple BlockMover and grid layouts.
// TODO: Can we use useLayout() instead?
isManualGrid: layout.type === 'grid' && !! layout.columnCount,
Copy link
Contributor

Choose a reason for hiding this comment

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

Can we disable block movers here without referring to layout at all?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yeah, I can't really think of an alternative approach.

Maybe if we had a more flexible way of disabling moving than the existing locking APIs. Then we could have the layout block-supports call an API to lock moving. But I don't think it's worth adding that just for this feature.

Should we use useLayout though instead of reading the attributes directly? I can't remember what benefit useLayout provides, if any.

Copy link
Contributor

Choose a reason for hiding this comment

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

useLayout doesn't return the correct layout type here; it only ever returns "default" in my testing. I don't think this component has access to the context from BlockListItems, which is what useLayout returns.
If it did work, the benefit would be accessing the parent layout type through context instead of a selector.

select( blockEditorStore ).getBlockRootClientId( panelId )
);
const { moveBlocksToPosition } = useDispatch( blockEditorStore );
const getBlocksBeforeCurrentCell = useGetBlocksBeforeCurrentCell(
Copy link
Contributor

Choose a reason for hiding this comment

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

Welp, had to add a bunch of hooks here to be able to move the blocks in the markup order 😅
Not sure if there's a better way of doing this. A possible alternative would be not exposing these controls in the sidebar at all (which would mean keyboard manipulation would depend exclusively on the block movers, maybe not ideal)

@tellthemachines tellthemachines marked this pull request as ready for review June 20, 2024 05:44
Copy link

github-actions bot commented Jun 20, 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: noisysocks <noisysocks@git.wordpress.org>
Co-authored-by: tellthemachines <isabel_brison@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>

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

@tellthemachines tellthemachines added [Type] Feature New feature to highlight in changelogs. [Type] Experimental Experimental feature or API. labels Jun 20, 2024
@tellthemachines
Copy link
Contributor

Update: I've started an experiment in #62777 to track manual/auto mode with a new attribute, so we can leverage both minimumColumnWidth and columnCount to make responsive grids in either mode.

…ell for clarity, and split up ChildLayoutControl
Comment on lines +35 to +37
const columnCountNumber = parseInt( columnCount, 10 );
const rowStartNumber = parseInt( rowStart, 10 );
const columnStartNumber = parseInt( columnStart, 10 );
Copy link
Member Author

Choose a reason for hiding this comment

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

We have a lot of parseInt in this PR. Is it necessary? Can't we guarantee that the attributes are numbers?

Copy link
Contributor

Choose a reason for hiding this comment

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

When the values are coming in straight from the controls they're always strings, so this has to happen at some point.

Copy link
Member Author

Choose a reason for hiding this comment

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

Might be good to do an audit of this after this PR merges. Ideally we only should cast string → int once at the boundary. The less future maintainers have to think about what the data type might be, the better.

@@ -1,2 +1,4 @@
export { GridVisualizer } from './grid-visualizer';
export { GridItemResizer } from './grid-item-resizer';
export { GridItemMovers } from './grid-item-movers';
export { useGridLayoutSync } from './use-grid-layout-sync';
Copy link
Member Author

Choose a reason for hiding this comment

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

As a follow-up PR I definitely think we should rename the folder from grid-visualizer to something like grid since components like this one have nothing to do with visualisation.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes! Let's do that as a follow-up in its own PR, to avoid complicating reviews of actual code changes 😅

packages/block-editor/src/components/block-mover/index.js Outdated Show resolved Hide resolved
@noisysocks
Copy link
Member Author

This is looking good. I refactored GridVisualizer and useGetBlocksBeforeCurrentCell a little to make things (I think) more readable.

I'd like to take one more look at useGridSync then I think we can merge.

We should probably also do a last round of testing.

Co-authored-by: Robert Anderson <robert@noisysocks.com>
Comment on lines +270 to 274
__unstableDisableDropZone ||
isDropZoneDisabled ||
( layout?.columnCount && window.__experimentalEnableGridInteractivity )
? null
: blockDropZoneRef,
Copy link
Member Author

@noisysocks noisysocks Jun 25, 2024

Choose a reason for hiding this comment

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

Bit difficult to understand what's going on here. Might be good to split the logic preceding the ? into a variable e.g. isDropZoneEnabled.

@noisysocks
Copy link
Member Author

OK I'm happy with the code 👍 Let's do a final test 😀

@noisysocks
Copy link
Member Author

Only small issue I'm noticing is that this help text doesn't change when you switch between Auto and Manual mode:

Screenshot 2024-06-25 at 12 58 30

Other than that I think we're okay to merge. The new features seem relatively functional when the experiment is turned on (we'll obviously iterate) and nothing seems to be different when the experiment is turned off.

@andrewserong
Copy link
Contributor

Just took this for a spin, and it's looking very cool!

I found one other difference when the experiment is switched off. With this PR applied, the columns input field stretches across horizontally, rather than including a range control. Is that intentional?

Before

image

After

image

In terms of the experiment itself, I found I could sometimes unintentionally wind up with overlapping rows if I played around with moving grid items. Using the movers, I could get into a situation where the top row is fixed in the top row's position, and then I go to move the bottom row up, thinking that it'll nudge everything else to be beneath it. The result winds up being overlapping items instead of things moving out of the way. Not a blocker at all since it's part of the experiment, but just thought I'd share in case it's something to look into. It's a bit difficult to explain, so let me know if you'd like any extra info, and I'll see if I can explain it better.

The following video may not be very useful, it's mostly me getting a bit confused while using the movers 😅

2024-06-25.13.09.09.mp4

Definitely not a blocker to landing, once the help text is fixed up!

import { store as blockEditorStore } from '../../store';
import { GridRect } from './utils';

export function useGridLayoutSync( { clientId: gridClientId } ) {
Copy link
Member Author

Choose a reason for hiding this comment

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

Thinking out loud, it might make sense to trigger all of this logic from the control that toggles between Manual and Auto. That way we're not abusing useEffect.

Can change this later. Just something to think about

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah that would be worth looking into!

@tellthemachines
Copy link
Contributor

Thanks for testing @andrewserong!

With this PR applied, the columns input field stretches across horizontally, rather than including a range control. Is that intentional?

I don't think it's fully intentional as much as a side-effect of adding the Rows input when in Manual mode. I'm not sure if we should keep the range control when only Columns is present and remove it when we have Columns and Rows? In any case, we should probably revert the change at least when the experiment is disabled.

Using the movers, I could get into a situation where the top row is fixed in the top row's position, and then I go to move the bottom row up, thinking that it'll nudge everything else to be beneath it. The result winds up being overlapping items instead of things moving out of the way.

This is deliberate 😅 following @jasmussen's request above to allow overlapping blocks. It can be a bit disconcerting if both blocks are exactly the same size, and maybe there's something we can do visually signal there's a hidden block, but the goal is to be able to put blocks on top of other blocks in manual mode!

@tellthemachines tellthemachines enabled auto-merge (squash) June 25, 2024 05:59
Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

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

Everything's working OK in testing now, let's get this in!

@noisysocks noisysocks changed the title Grid interactivity: Experiment with all blocks having a column start and row start when grid is in manual mode Grid interactivity experiment: Allow blocks to be positioned in manual mode using drag and drop Jun 25, 2024
@noisysocks noisysocks changed the title Grid interactivity experiment: Allow blocks to be positioned in manual mode using drag and drop Grid interactivity: Allow blocks to be positioned in manual mode using drag and drop Jun 25, 2024
@tellthemachines tellthemachines merged commit e1fdffe into trunk Jun 25, 2024
62 checks passed
@tellthemachines tellthemachines deleted the try/completely-manual-grid-mode branch June 25, 2024 06:29
@github-actions github-actions bot added this to the Gutenberg 18.7 milestone Jun 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Layout Layout block support, its UI controls, and style output. [Type] Experimental Experimental feature or API.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants