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: Experimenting with drag and drop to set column start and row start #59490

Draft
wants to merge 36 commits into
base: trunk
Choose a base branch
from

Conversation

noisysocks
Copy link
Member

@noisysocks noisysocks commented Mar 1, 2024

This PR has morphed into more of an exploration of a few different ideas. I'll split the production-ready parts out into separate PRs when ready.

What?

In #59052 I added a new Grid interactivity experiment and the ability to set the column and row span of a grid item using a resizable box.

This PR builds off of that work and adds the ability to explicitly position a grid item by dragging and dropping it to a cell.

Why?

Part of #57478.

How?

Positioning a grid item is done by setting the style.layout.columnStart and style.layout.rowStart attributes. These are added in #59483, which this PR is stacked onto.

If a grid item has a columnStart and rowStart then it is considered pinned. This is indicated in the block toolbar using a toggle button. Unpinning a grid item resets columnStart and rowStart and will result in the grid item once again being positioned automatically by the grid container.

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.

Testing Instructions

  1. Enable the Grid interactivity experiment
  2. Insert a Grid block and add some children to it
  3. Experiment with drag and drop to set the child's position and using the resize handles to set the child's span

Screenshots or screencast

Kapture.2024-03-01.at.14.06.56.mp4

@noisysocks noisysocks added [Type] Experimental Experimental feature or API. [Feature] Layout Layout block support, its UI controls, and style output. labels Mar 1, 2024
@noisysocks noisysocks self-assigned this Mar 1, 2024
@noisysocks noisysocks requested a review from SaxonF March 1, 2024 04:42
Copy link

github-actions bot commented Mar 1, 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: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: tellthemachines <isabel_brison@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: SaxonF <saxonafletcher@git.wordpress.org>
Co-authored-by: richtabor <richtabor@git.wordpress.org>
Co-authored-by: paaljoachim <paaljoachim@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.

Copy link

github-actions bot commented Mar 1, 2024

Size Change: -1.12 kB (0%)

Total Size: 1.75 MB

Filename Size Change
build/block-editor/content-rtl.css 4.51 kB +9 B (0%)
build/block-editor/content.css 4.5 kB +9 B (0%)
build/block-editor/index.min.js 259 kB +3.68 kB (+1%)
build/block-editor/style-rtl.css 15.7 kB +73 B (0%)
build/block-editor/style.css 15.6 kB +73 B (0%)
build/block-library/blocks/gallery/editor-rtl.css 956 B +9 B (+1%)
build/block-library/blocks/gallery/editor.css 960 B +8 B (+1%)
build/block-library/editor-rtl.css 12.4 kB +6 B (0%)
build/block-library/editor.css 12.4 kB +8 B (0%)
build/block-library/index.min.js 218 kB -11 B (0%)
build/blocks/index.min.js 51.6 kB +12 B (0%)
build/components/index.min.js 222 kB -154 B (0%)
build/components/style-rtl.css 11.9 kB +43 B (0%)
build/components/style.css 11.9 kB +48 B (0%)
build/edit-post/classic-rtl.css 578 B -1 B (0%)
build/edit-post/classic.css 578 B -1 B (0%)
build/edit-post/index.min.js 18.2 kB -5.66 kB (-24%) 🎉
build/edit-post/style-rtl.css 4.24 kB -1.26 kB (-23%) 🎉
build/edit-post/style.css 4.23 kB -1.27 kB (-23%) 🎉
build/edit-site/index.min.js 225 kB -5.08 kB (-2%)
build/edit-site/style-rtl.css 13.9 kB -1.13 kB (-8%)
build/edit-site/style.css 13.9 kB -1.13 kB (-8%)
build/edit-widgets/index.min.js 17.9 kB +185 B (+1%)
build/editor/index.min.js 77.9 kB +7.38 kB (+10%) ⚠️
build/editor/style-rtl.css 6.94 kB +1.45 kB (+26%) 🚨
build/editor/style.css 6.94 kB +1.46 kB (+27%) 🚨
build/patterns/index.min.js 6.47 kB +89 B (+1%)
build/preferences-persistence/index.min.js 2.06 kB +8 B (0%)
build/preferences/index.min.js 2.85 kB +26 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.27 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/default-editor-styles-rtl.css 395 B
build/block-editor/default-editor-styles.css 395 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 133 B
build/block-library/blocks/audio/theme.css 133 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 415 B
build/block-library/blocks/button/editor.css 414 B
build/block-library/blocks/button/style-rtl.css 627 B
build/block-library/blocks/button/style.css 626 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 671 B
build/block-library/blocks/cover/editor.css 674 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 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 322 B
build/block-library/blocks/embed/editor.css 322 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 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 327 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 324 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 227 B
build/block-library/blocks/form-input/editor.css 227 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 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 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 471 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/style-rtl.css 1.72 kB
build/block-library/blocks/gallery/style.css 1.72 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 647 B
build/block-library/blocks/group/editor.css 647 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 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 878 B
build/block-library/blocks/image/editor.css 878 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 133 B
build/block-library/blocks/image/theme.css 133 B
build/block-library/blocks/image/view.min.js 1.54 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 306 B
build/block-library/blocks/media-text/editor.css 305 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 259 B
build/block-library/blocks/navigation-link/style.css 257 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 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.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.03 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/editor-rtl.css 377 B
build/block-library/blocks/page-list/editor.css 377 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-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 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 729 B
build/block-library/blocks/post-featured-image/editor.css 727 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 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/style-rtl.css 354 B
build/block-library/blocks/pullquote/style.css 353 B
build/block-library/blocks/pullquote/theme-rtl.css 174 B
build/block-library/blocks/pullquote/theme.css 174 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/view.min.js 958 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 233 B
build/block-library/blocks/quote/theme.css 235 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 690 B
build/block-library/blocks/search/style.css 689 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 478 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 239 B
build/block-library/blocks/separator/style.css 239 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 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 801 B
build/block-library/blocks/site-logo/editor.css 801 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 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.48 kB
build/block-library/blocks/social-links/style.css 1.48 kB
build/block-library/blocks/spacer/editor-rtl.css 350 B
build/block-library/blocks/spacer/editor.css 350 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 639 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/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 431 B
build/block-library/blocks/template-part/editor.css 431 B
build/block-library/blocks/template-part/theme-rtl.css 107 B
build/block-library/blocks/template-part/theme.css 107 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 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 133 B
build/block-library/blocks/video/theme.css 133 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/style-rtl.css 14.8 kB
build/block-library/style.css 14.8 kB
build/block-library/theme-rtl.css 707 B
build/block-library/theme.css 713 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/index.min.js 15.2 kB
build/commands/style-rtl.css 953 B
build/commands/style.css 951 B
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.77 kB
build/core-data/index.min.js 72.5 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.36 kB
build/customize-widgets/style.css 1.36 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 9 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-widgets/style-rtl.css 4.16 kB
build/edit-widgets/style.css 4.16 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.07 kB
build/format-library/style-rtl.css 493 B
build/format-library/style.css 492 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.2 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 13 kB
build/interactivity/navigation.min.js 1.17 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 1.36 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.3 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 851 B
build/list-reusable-blocks/style.css 851 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.57 kB
build/nux/style-rtl.css 748 B
build/nux/style.css 744 B
build/patterns/style-rtl.css 595 B
build/patterns/style.css 595 B
build/plugins/index.min.js 1.8 kB
build/preferences/style-rtl.css 710 B
build/preferences/style.css 712 B
build/primitives/index.min.js 975 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 623 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.73 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10 kB
build/router/index.min.js 1.88 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 2.03 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.23 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.17 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@noisysocks noisysocks mentioned this pull request Mar 1, 2024
19 tasks
Base automatically changed from add/grid-column-and-row-start to trunk March 14, 2024 02:05
Copy link
Member

@ramonjd ramonjd left a comment

Choose a reason for hiding this comment

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

First of all, the drag/drop and resize functionality is working like butter for me. Incredible work.

Since it's behind the experimental flag, take all my comments with a bag-load of Himalayan salt.


return (
<BlockPopoverCover
className={ classnames( 'block-editor-grid-visualizer', {
Copy link
Member

Choose a reason for hiding this comment

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

Somewhere a little z-index jig in mobile view is required as it sits over the sidebar

2024-03-15.12.09.46.mp4

Copy link
Member Author

Choose a reason for hiding this comment

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

Hm. Why is this happening? When I look in the inspector the visualiser has z-index = 30 and the list view has z-index = 10000 😕

Copy link
Member

Choose a reason for hiding this comment

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

I suspect they're in different stacking contexts? Or a new one needs to be created around the grid visualizer.

This tool is pretty handy to work it out: https://github.com/gwwar/z-context

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah they're in different stacking contexts but what's causing the issue is the popover content moving to the bottom of the DOM when the viewport is smaller than 782px:

Screenshot 2024-03-18 at 5 07 37 PM

I'm not sure what the role of components-popover__fallback-container is in popover logic, but it appears after the sidebar and is a sibling of #wpwrap so I suspect the only way to fix this with CSS would be to assign a non-negative z-index to #wpwrap. I doubt that would be free of consequences though 😅


function GridVisualizerGrid( { clientId, blockElement } ) {
const [ gridInfo, setGridInfo ] = useState( () =>
getGridInfo( blockElement )
Copy link
Member

Choose a reason for hiding this comment

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

For the new kid: this is so the visualizer matches the underlying grid when resizing the window? Works really well. Nice 🤟🏻

Feel free to ignore this opinion: "Info" sounds to me like something I'd ask for at a truck stop on my way to an obscure holiday township with no mobile reception.

Just jokes. What about 'properties'? E.g., getBlockElementGridProperties

Copy link
Member Author

Choose a reason for hiding this comment

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

It does handle window resizing but that's secondary. The primary purpose is so that we recalculate the grid lines when the grid or its children change size e.g. if the user changes the number of columns in the inspector.

I didn't want to use the words attributes or properties because I didn't want to imply that we're returning HTML attributes, React props, or CSS properties. I think a generic word like data or info is right. But idk happy to do what you say here 🤷‍♂️

Copy link
Member

Choose a reason for hiding this comment

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

All good! Just a passing comment with as much value as it cost in the first place = $0 😄

Copy link
Member Author

Choose a reason for hiding this comment

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

Good to ask clarifying questions, it means they're answered for future readers too 🙂

@noisysocks
Copy link
Member Author

noisysocks commented Mar 15, 2024

I'm working on two issues @SaxonF identified:

  • When you drag a block that has a span to the edge, empty columns are created which means that the Grid block has more columns than are set in the block settings.

    image_720

    I think the best way to fix this is to now allow blocks to be moved into a position where they overflow the grid. That is, set a max on the start input and disallow the drop zone when start > num columns - span.

  • Empty cells need a minimum width/height otherwise they're impossible to drag onto.

    image_720

    I've fixed this by adding a min-width and min-height to the drop area which can overflow the cell. That is, the cell is still 0x0 but the drop area will be at least 8x8. I've also improved the resize logic to better handle empty cells by taking into account whether we're dragging past the leading or trailing edge of a grid track.

@SaxonF
Copy link
Contributor

SaxonF commented Apr 17, 2024

I'm finding the drag and drop experience here really confusing. Aside from the error/editor freeze mentioned below, it's easy to get to a place where moving a block has unexpected results because there are pinned blocks in the grid

It occurred to me that some of the confusion stems from the fact that we don't yet show the end result of a drag/drop (like we do in list views for example). You can play with react-grid-layout to get an idea of how this would feel https://react-grid-layout.github.io/react-grid-layout/examples/0-showcase.html. Static blocks in the demo are similar to pinned items.

visualise-dragging.mp4

@tellthemachines
Copy link
Contributor

It occurred to me that some of the confusion stems from the fact that we don't yet show the end result of a drag/drop (like we do in list views for example).

Should we implement that before this grid work then? Also, in that example, the static blocks are visually distinguishable from the others. I'm not sure it would be so clear if they all looked exactly the same.

@SaxonF
Copy link
Contributor

SaxonF commented Apr 17, 2024

I'm not sure it would be so clear if they all looked exactly the same.

Yes we'd want to distinguish between them, even if that's just when starting to drag.

@tellthemachines
Copy link
Contributor

Oh, one other item worth adding to the list of follow-ups: it should be possible to drag a block from outside of the grid into a pinned position on the grid.

@noisysocks
Copy link
Member Author

It occurred to me that some of the confusion stems from the fact that we don't yet show the end result of a drag/drop (like we do in list views for example). You can play with react-grid-layout to get an idea of how this would feel https://react-grid-layout.github.io/react-grid-layout/examples/0-showcase.html. Static blocks in the demo are similar to pinned items.

This is really a drag and drop enhancement, not specific to grid. I don't think we can untangle them. I dug up #16457 which is an old exploration into doing it that was abandoned because it didn't play nicely with nested blocks.

Maybe something to think about but probably not a can of worms we want to open right now.

@noisysocks
Copy link
Member Author

and there's no immediate way of visualising which blocks are pinned unless they're selected

We should definitely do this

How should we visualise it?

@noisysocks
Copy link
Member Author

I'd also expect that pinning a block to a position after all the other blocks would reorder it in the markup as well as pinning it. This is important to get right for accessibility/usability; if visual order doesn't match markup and list view order it gets really confusing. I don't think we should merge this PR before that at least is solved

Alright I'll work on a better solution to this. My previous attempt was too naive.

@ramonjd
Copy link
Member

ramonjd commented Apr 18, 2024

Sorry if this has been covered before - on the face of it I'm finding undo seems to work for some interactions and not others.

2024-04-18.11.45.17.mp4

I think it's tied to the cell. So if I'm editing a single cell the history isn't saved. If I edit different ones it appears to work as expected

2024-04-18.11.51.48.mp4

@jasmussen
Copy link
Contributor

@noisysocks for this comment, can you use pin-small from the set? The regular pin is more about "posts".

@noisysocks noisysocks marked this pull request as draft April 19, 2024 01:02
@noisysocks
Copy link
Member Author

I got halfway through addressing this comment in b70baee. It's pretty complicated to work out when a block needs a columnStart and rowStart versus when it doesn't. We essentially need to implement some of the grid auto placement algorithm.

Instead of doing that 😅 I am thinking we should look at adding constraints. For example not allow a user to set columnStart without also setting rowStart and vice versa.

I'm also curious about creating a strong distinction between auto mode and manual mode where, in manual mode, all grid items have a columnStart and rowStart and we disable re-ordering blocks altogether. This way there's never any mixing of items that are placed manually and items that are placed automatically. This will simplify things greatly (e.g. no "pinning"), though at the cost of Grid behaving differently to other container blocks (e.g. no block movers). I'll explore this in a separate PR next week some time.

For now though @SaxonF is hounding me about wanting to see how "click or drag a cell to insert a block" feels so I'm going to work on that.

Safe to say this PR is a grabbag of a few different ideas, none of which are production ready, and so I've marked it as a draft again.

@noisysocks noisysocks changed the title Grid interactivity: Add drag and drop to set column start and row start Grid interactivity: Experimenting with drag and drop to set column start and row start Apr 19, 2024
@noisysocks
Copy link
Member Author

For now though @SaxonF is hounding me about wanting to see how "click or drag a cell to insert a block" feels so I'm going to work on that.

I've pushed a barely-usable first pass at this 😀

@SaxonF
Copy link
Contributor

SaxonF commented Apr 19, 2024

"hounding" 🤣 . Accurate though!

Agree we should re-explore everything pinned in manual (ie no pinning). When we tried last time we didn't have rows in place plus a couple of the other improvements which affected how it felt. "click or drag a cell to insert a block" will give us a more complete experience to try.

We can frame "type" as grid item position and highlight the difference between auto and manual. In auto we can even allow user to set number of columns (or auto as default) which means the only gap we'd have is being able to mix both manually placed and automatically placed items. We can look at this in future as an advanced feature.

image

@SaxonF
Copy link
Contributor

SaxonF commented Apr 19, 2024

One other note. When dragging a grid item we should add outlines to all grid items (like when you hover over them) so its clear where their boundaries are.

@tellthemachines
Copy link
Contributor

For example not allow a user to set columnStart without also setting rowStart and vice versa.

I'm also curious about creating a strong distinction between auto mode and manual mode where, in manual mode, all grid items have a columnStart and rowStart and we disable re-ordering blocks altogether.

If all grid items have a columnStart and rowStart, ensuring both are set will be much easier because column and row start fields will be pre-populated with the default values 👍

This will simplify things greatly (e.g. no "pinning"), though at the cost of Grid behaving differently to other container blocks (e.g. no block movers).

I think if we do this, it's important that the experience be consistent with other blocks, though the underlying behaviour may be different. E.g. we should make sure it's still possible to move blocks in list view, and perhaps replace the default block movers with a two-dimensional set of controls that allows to move both vertically and horizontally (this was @noisysocks' suggestion in conversation with me earlier).

Ideally we want the action of moving blocks, whether by drag and drop or keyboard, to be the same as it is for all other blocks except when these blocks move within the grid, their columnStart and rowStart attributes change.

The only unique visible behaviour is that we want to be able to drag or keyboard move one of these blocks to any empty grid cell (that might not be possible to do in list view, but it should be doable through either the block movers or the column and row start controls, apart from canvas drag and drop).

Grid is a unique form of container in that its configuration determines the exact space its children occupy, and it displays empty grid cells if there aren't enough children to fill it. It's quite different from flex in this respect, because in flex the size of the child to some extent determines the distribution of space, and unless the children are few and very small, there is no extra space within the container. I'm rambling a bit 😅 but what I'm trying to get at is that grid cells are a sort of virtual container that we could treat similarly to how empty paragraphs are treated if we wanted them to have a presence in list view. We're already kind of treating them as such with the ability to drop into any grid cell.

@SaxonF
Copy link
Contributor

SaxonF commented Apr 22, 2024

Iterating on the above. If we did make it so that in manual mode everything has a position. Based on this conversation an alternative would be adding max column setting on auto mode which would cover most scenarios

image

@fabiankaegy
Copy link
Member

fabiankaegy commented Apr 22, 2024

Hey all 👋

This is really impressive work here 😮 The way this behaves is much smoother than I would have guessed originally.

The one thing that I keep coming to here is what the responsive story is. Taking the example shown in the ticket description for example. How would one really control the order & width of various elements there without the concept of States or something similar 🤔

Would love to hear how you all are thinking about this when it comes to the grid feature. For "simple" grids the "minimum column width" serves that use-case pretty well. But I'm struggling with these more complex grids.

See this example here of a grid that is a little more complex:

CleanShot.2024-04-22.at.21.33.28.mp4

@tellthemachines
Copy link
Contributor

tellthemachines commented Apr 23, 2024

See this example here of a grid that is a little more complex

@fabiankaegy that looks like a bug in the responsive logic for grid elements spanning multiple columns. I'll look into it, thanks for flagging!

Update: I have a fix in #60976.

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.

None yet

9 participants