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

Block spacing: block-level axial gap block support #37736

Merged
merged 10 commits into from
Mar 22, 2022

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Jan 6, 2022

Resolves #34529

Description

I'm not 100% sure whether this is the right approach. For individual block supports it seems to do the job. Just throwing it out there for now.

How has this been tested?

Using TwentyTwentyTwo, or another block based theme with blockGap support enabled in theme.json.

In social-links/block.json, switch the value of "supports.spacing.blockGap" from true to [ "vertical", "horizontal" ]

With axial

i-have-friends.mp4

Without

i-have-friends-2.mp4

You can test with any appropriate block that supports blockGap, for example Navigation. Make sure to enable the support in the block.json file as described above.

Example editor code with blockGap as string value
<!-- wp:heading {"level":3} -->
<h3 id="column">Column</h3>
<!-- /wp:heading -->

<!-- wp:columns {"style":{"spacing":{"blockGap":"167px"}}} -->
<div class="wp-block-columns"><!-- wp:column {"style":{"color":{"background":"#fee5d3"}}} -->
<div class="wp-block-column has-background" style="background-color:#fee5d3"><!-- wp:paragraph -->
<p>one</p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->

<!-- wp:column {"style":{"color":{"background":"#fee5d3"}}} -->
<div class="wp-block-column has-background" style="background-color:#fee5d3"><!-- wp:paragraph -->
<p>two</p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->

<!-- wp:column {"style":{"color":{"background":"#fee5d3"}}} -->
<div class="wp-block-column has-background" style="background-color:#fee5d3"><!-- wp:paragraph -->
<p>three</p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->

<!-- wp:column {"style":{"color":{"background":"#fee5d3"}}} -->
<div class="wp-block-column has-background" style="background-color:#fee5d3"><!-- wp:paragraph -->
<p>four</p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->

<!-- wp:column {"style":{"color":{"background":"#fee5d3"}}} -->
<div class="wp-block-column has-background" style="background-color:#fee5d3"><!-- wp:paragraph -->
<p>five</p>
<!-- /wp:paragraph --></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->

<!-- wp:heading -->
<h2 id="group">Group</h2>
<!-- /wp:heading -->

<!-- wp:group {"style":{"color":{"background":"#fcdddd"}}} -->
<div class="wp-block-group has-background" style="background-color:#fcdddd"><!-- wp:paragraph -->
<p>I'm inside a group!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>I'm inside a group!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>I'm inside a group!</p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

<!-- wp:heading {"level":3} -->
<h3 id="navigation">Navigation</h3>
<!-- /wp:heading -->

<!-- wp:navigation {"ref":129,"style":{"spacing":{"blockGap":"22"}}} /-->

<!-- wp:heading {"level":3} -->
<h3 id="social-icons">Social icons</h3>
<!-- /wp:heading -->

<!-- wp:social-links {"style":{"spacing":{"blockGap":"4em"}}} -->
<ul class="wp-block-social-links"><!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /-->

<!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /-->

<!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /-->

<!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /-->

<!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /--></ul>
<!-- /wp:social-links -->
  

The above code uses strings values for "blockGap".

When toggling them they should covert to the style object {"style":{"spacing":{"blockGap":{"top":"1.13em","left":"1.13em"}}}}.

Point being, we should handle both string and object values seamlessly for backwards compatibility.

Types of changes

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@ramonjd ramonjd self-assigned this Jan 6, 2022
@ramonjd ramonjd added the [Status] In Progress Tracking issues with work in progress label Jan 6, 2022
@github-actions
Copy link

github-actions bot commented Jan 6, 2022

Size Change: +243 B (0%)

Total Size: 1.21 MB

Filename Size Change
build/block-editor/index.min.js 146 kB +230 B (0%)
build/block-library/index.min.js 169 kB +13 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15.1 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 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 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 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 406 B
build/block-library/blocks/columns/style.css 406 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-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
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 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 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 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 493 B
build/block-library/blocks/media-text/style.css 490 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 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 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-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 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 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 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 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 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 201 B
build/block-library/blocks/quote/style.css 201 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 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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/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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 9.98 kB
build/block-library/editor.css 9.98 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.2 kB
build/block-library/style.css 11.2 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.8 kB
build/components/index.min.js 218 kB
build/components/style-rtl.css 15.6 kB
build/components/style.css 15.6 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 14.3 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.19 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.1 kB
build/edit-navigation/style-rtl.css 4.04 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.8 kB
build/edit-post/style-rtl.css 7.07 kB
build/edit-post/style.css 7.07 kB
build/edit-site/index.min.js 45 kB
build/edit-site/style-rtl.css 7.58 kB
build/edit-site/style.css 7.56 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.39 kB
build/edit-widgets/style.css 4.39 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@ramonjd
Copy link
Member Author

ramonjd commented Jan 7, 2022

Just jotting down notes.

I have an open question about what to do with block-level theme.json properties.

The gap value is currently available only at the top level and assigned to a CSS VAR in PROPERTIES_METADATA.

We're turning on blockGap support in individual blocks – see Columns Block for example – so I would imagine theme authors might want a way to control things at the block level in theme.json as well.

Put another way:

Should this toggle spacing block supports for an individual block?

"settings": {
    "blocks": {
        "core/social-links": {
            "spacing": {
                "blockGap": true
            }
        }
    }
},

Should this determine the default value of block spacing for an individual block?

"styles": {
    "blocks": {
        "core/social-links": {
            "spacing": {
                "blockGap": "20px"
            }
        }
    }
}

Also, even if we do allow global styles for blockgap, they're being overwritten by the CSS generated by layout.php support

Screen Shot 2022-01-07 at 11 51 03 am

@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from 44a7a4f to 5a9bbcb Compare January 25, 2022 02:23
@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from 5a9bbcb to 994102a Compare February 10, 2022 03:36
@ramonjd ramonjd added [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi [Type] Enhancement A suggestion for improvement. labels Feb 10, 2022
@ramonjd ramonjd marked this pull request as ready for review February 10, 2022 04:04
@ramonjd ramonjd requested review from scruffian, andrewserong and glendaviesnz and removed request for mkaz, ajitbohra, ellatrix and tellthemachines February 10, 2022 04:05
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.

This is testing really well for me, @ramonjd, thanks so much for persevering with axial support!

Just left an optional comment about possibly moving some of the logic to a separate function to tighten thing up a little bit.

Overall I think this is a really clever approach — opting in to axial support for those blocks that use flex layout, where the gap value is used in the shorthand syntax, so concatenating the separate values together works nicely. This sounds like the kind of thing that we'd want to support long-term to me, but it might be worth confidence checking with other folks, too, that we're happy to rely on a (potential) implementation detail of the layout support? CC: @youknowriad in case there are any concerns there.

I really like the idea of starting out with this only supporting axial controls at the individual block level, and the global styles UI controls appear to be unaffected.

Tested with the social links, navigation, and columns blocks on a few different browsers, and using the TT2 theme.

The only really small issue I noticed (and I think this is to do with the BoxControl component's axial control support, rather than this PR) is that it doesn't say mixed when there's differing values (unlike, say, padding on the group block), but I don't think that's a blocker:

Kapture 2022-02-11 at 17 02 31

Otherwise, this is looking really good to me!

packages/block-editor/src/hooks/gap.js Outdated Show resolved Hide resolved
@@ -28,7 +28,7 @@
}
},
"spacing": {
"blockGap": true,
"blockGap": [ "vertical", "horizontal" ],
Copy link
Contributor

Choose a reason for hiding this comment

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

Just a note that I think this is a deceptively powerful feature (by which I mean, very cool feature!) — because vertical spacing only affects the columns block on mobile viewports, this means that it creates a nice ability to be able to control desktop versus mobile spacing, without having to consider viewport widths directly 👍

Copy link
Contributor

Choose a reason for hiding this comment

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

Which formats do we support here and what do they mean?

Copy link
Member Author

Choose a reason for hiding this comment

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

Which formats do we support here and what do they mean?

I'm not clear what you mean here. Was it in relation to the above comment, or the formats of "blockGap" in theme.json (string|array)?

because vertical spacing only affects the columns block on mobile viewports, this means that it creates a nice ability to be able to control desktop versus mobile spacing, without having to consider viewport widths directly

This comment makes me think of a recent conversation on how blockGap effects margin-top via the layout abstraction. Namely, how can we reconcile the need for zero margins in a world where "blockGap" has a value in theme.json.

#37344

if ( typeof next === 'object' ) {
const row = next?.top || 0;
const column = next?.left || 0;
newValue = row === column ? row : `${ row } ${ column }`;
Copy link
Contributor

Choose a reason for hiding this comment

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

Why are we storing the value as a concatenated string, shouldn't we store the next object as is like we do in other kind of properties (padding, margin...)? Is it because we only allow two sides? if that's the case should we instead use a { vertical, horizontal } instead if { top, left } is not good enough?

Copy link
Member Author

@ramonjd ramonjd Feb 14, 2022

Choose a reason for hiding this comment

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

It was out of convenience to use the CSS shorthand; mainly so I didn't have to alter the layout implemention.

There might have been other reasons, but I can't recall them. I'll revisit and confirm. 👍

I guess it might be better in the long run if the values were separate in case we want to use the values independently. Though ultimately the approach wasn't right, it's where we were trying to go with #35454, which added separate CSS vars for row and column.

We could do a check for is_array( $gap_value ) and, in that case, declare separate row-gap and column-gap values here.

Definitely worth another look, thanks for nudge.

if that's the case should we instead use a { vertical, horizontal } instead if { top, left } is not good enough?

{ top, left } should be good enough for our purposes for now.

The top, right, bottom, left prop names are baked into the Axial Input Controls in the BoxControl component anyway.

Copy link
Member Author

Choose a reason for hiding this comment

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

Definitely worth another look, thanks for nudge.

Actually, definitely worth doing now that I've looked a little more closely. We need to support "blockGap": [ "vertical", "horizontal" ], and "blockGap": [ "vertical" ], for example.

There is no "doh!" emoji 😆

Copy link
Member Author

Choose a reason for hiding this comment

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

Why are we storing the value as a concatenated string, shouldn't we store the next object as is like we do in other kind of properties (padding, margin...)?

523d9be is a very rough first stab at it.

I'm yet to address the question of the style model. It's made a smidge easier given that we're not adding gap inline CSS to block containers.

But if we have to match the CSS properties, I think we'd need to use the longhand properties.

	setAttributes( {
		style: {
			...style,
			spacing: {
				...style?.spacing,
                                 rowGap: next?.top || 0,
                                 columnGap: next?.left || 0,
			},
		},
	} );

Which probably means changing a whole bunch of other references.

@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from 994102a to 523d9be Compare February 15, 2022 02:14
@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from 523d9be to 7de1819 Compare February 16, 2022 04:51
const column = blockGapBoxControlValue?.left || defaultValue;

return row === column ? row : `${ row } ${ column }`;
}
Copy link
Member Author

Choose a reason for hiding this comment

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

Here I was wondering whether we should be returning the full definition so that we can isolate row and column values where only one is set, e.g.,

// row and column is set or is the same
return `gap: 10px 10px;`;

// only row is set
return  `row-gap: 10px;`;

// only column is set
return  `column-gap: 10px;`;

That way, if a block ever has to inherit either row/column we're not overwriting it.

Just typing out loud...

Copy link
Contributor

Choose a reason for hiding this comment

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

That would be a nice feature, though if we do it here we should do it on the server-side too 🙂

Copy link
Member Author

Choose a reason for hiding this comment

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

After some further tinkering I probably need to put more thought into this.

I'm picturing a future where theme.json authors could add something like this.

"spacing": {
    "blockGap": {
         "row": "0.5em",
         "column": "2em"
     }
}

and blocks would then inherit or use these values as defaults.

Currently "blockGap" accept a string, which can be really anything, including the shorthand value of "0.5em 2em" so it might take some more cogitating to make things backwards compatible.

Copy link
Contributor

Choose a reason for hiding this comment

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

Sure, we don't need it for this PR; better to work out the details as a future enhancement.

lib/block-supports/layout.php Outdated Show resolved Hide resolved
packages/block-editor/src/hooks/gap.js Outdated Show resolved Hide resolved
@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from 2bcb42b to bb2612f Compare March 14, 2022 22:42
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.

Code looks good and functionality is working well 🚢 Just some minor questions/comments below. Also:

We're turning on blockGap support in individual blocks – see #37436 for example – so I would imagine theme authors might want a way to control things at the block level in theme.json as well.

This would make sense. We don't necessarily want to be using the same gap for something small and inline like Social Icons as we would e.g. for Columns, so themes should be able to set this.

Also, even if we do allow global styles for blockgap, they're being overwritten by the CSS generated by layout.php support

Could we somehow write the global style value to the --wp--style--block-gap variable? Or else perhaps the editor default should be at a lower level.

In any case, that can be addressed as a separate PR 🙂

packages/block-editor/src/hooks/gap.js Show resolved Hide resolved
const column = blockGapBoxControlValue?.left || defaultValue;

return row === column ? row : `${ row } ${ column }`;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

That would be a nice feature, though if we do it here we should do it on the server-side too 🙂

packages/block-editor/src/hooks/gap.js Show resolved Hide resolved
@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from bb2612f to 75ade72 Compare March 16, 2022 23:21
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.

Thanks for persevering with this feature @ramonjd! This is testing well for me in the editor and on the front-end! 🎉 Since it looks like the blockGap isn't currently functional in Global Styles, would it be worth us removing / hiding the control there for the time being? (The fact that it doesn't currently do anything isn't because of this PR, of course)

I like the approach to concatenating the row and column values into the gap value for those blocks where we opt-in to the axial controls 👍. It's otherwise working really nicely for me!

@ramonjd
Copy link
Member Author

ramonjd commented Mar 21, 2022

Thanks for taking this for another spin @andrewserong 🙇

would it be worth us removing / hiding the control there for the time being? (The fact that it doesn't currently do anything isn't because of this PR, of course)

Just so I know we're talking about the same thing 😄 Do you mean for blocks?

Screen Shot 2022-03-21 at 3 28 09 pm

This isn't having any effect for me either, and I've never noticed it before. So I totally agree! 😆

It's turned off for ROOT_BLOCK_SUPPORTS as well, so I don't see any harm in removing it from the dimensions panel.

I'll throw up a PR.

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.

LGTM, thanks for opening up the follow-up PR to remove the controls from the dimensions panel in global styles!

I suppose to make it neater before landing, we could remove the changes to packages/edit-site/src/components/global-styles/dimensions-panel.js?

ramonjd added 10 commits March 22, 2022 10:16
… object. We're using the `top` and `left` properties of the BoxControl next value to represent row and column values.

Reverting some block.json changes.
Ensuring that we cater for blockGap string values.

Reverting some block.json changes.
Ensuring that we cater for blockGap string values.
Adding tests.
…tests

Added comment to explain how we build and pass the boxcontrol component value.
…n theoretically be something like "24px 54px" or some other manifestation of the shorthand value.
@ramonjd ramonjd force-pushed the try/block-split-axial-gap-support branch from 0af1085 to b618d4e Compare March 21, 2022 23:18
@ramonjd ramonjd merged commit ce74a0d into trunk Mar 22, 2022
@ramonjd ramonjd deleted the try/block-split-axial-gap-support branch March 22, 2022 00:11
@github-actions github-actions bot added this to the Gutenberg 12.9 milestone Mar 22, 2022
jostnes pushed a commit to jostnes/gutenberg that referenced this pull request Mar 23, 2022
* Initial commit: splitting the gap value to allow for axial gap values

* Checking for object. Now passing complete object to box control.

* Providing a default value for split gap values, where one is `undefined`.

* This is the first commit that switches the blockGap over to use to an object. We're using the `top` and `left` properties of the BoxControl next value to represent row and column values.

Reverting some block.json changes.
Ensuring that we cater for blockGap string values.

Reverting some block.json changes.
Ensuring that we cater for blockGap string values.
Adding tests.

* margin-top should take a single value

* null coalescing operator (??) is not present in PHP

* Checking for gap array items before using them.

* Using `--wp--style--block-gap` as the fallback for split values

* Returning null instead of the argument in getGapCSSValue and updated tests
Added comment to explain how we build and pass the boxcontrol component value.

* Rolling back using the gap CSS var as a fallback since the CSS var can theoretically be something like "24px 54px" or some other manifestation of the shorthand value.
@priethor priethor removed the [Status] In Progress Tracking issues with work in progress label Mar 28, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi [Type] Enhancement A suggestion for improvement.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

Design Tools: Enhance Block Gap control to support axial configuration
5 participants