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

[Mobile] - Spacer block - Add initial support for spacing presets #47258

Merged
merged 6 commits into from
Feb 23, 2023

Conversation

geriux
Copy link
Member

@geriux geriux commented Jan 18, 2023

Related PRs:

Closes #44234

What?

This PR adds parsing support for preset values for the Spacer block.

Why?

The idea is to support parsing/rendering these presets values before the Web editor lands these changes. If the Web editor adds these changes first, the mobile editor would not be able to render the block with these attributes.

Note: This PR does not add the functionality to set a spacing preset value, for now, it will only have the units picker. In the future, we should add this new picker as the Web editor will add it later on.

How?

First, we are passing the spacing values coming from the theme. This will enable getting the spacing values set in the Spacer block.

We are adding a custom save.native.js file, which is the same one that will be added in the web PR. This is needed to be able to read the style properties correctly. Once the web PR lands, we can remove this native implementation of the save.js file.

For the Spacer block, we are now checking for available spacing sizes from the theme, which will be used for the getCustomValueFromPreset util that will return the correct value if it exists.

These will be stored in the presetValues object that is now being passed to the Controls component, I decided to pass these values so we avoid having to get them in that component as well.

If a Spacer block has a spacing variable that doesn't exist in the current theme, it will use the default pixel value.

This PR also adds some integration tests for cases with a Spacer block with spacing preset values with and without theme data.

Testing Instructions

Case 1 - Adding a Spacer block with existing spacing preset values in the theme

Precondition: Use a theme with spacing values, Masu, Twenty Twenty-Three.

Example Spacer code:

<!-- wp:spacer {"height":"var:preset|spacing|70","style":{"spacing":{"margin":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}}} -->
<div style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

Note: Make sure the spacing value e.g. --wp--preset--spacing--70 exists in your current theme.

  • Open the editor in the WordPress app
  • Go to the HTML editing mode
  • Pase the snippet from above
  • Expect the Spacer block to render correctly
  • Open the block settings
  • Expect the height value of the Spacer block to not be the default value: 100

Case 2 - Adding a Spacer block with non-existing spacing preset values in the theme

Precondition: Use a theme with spacing values, Masu, Twenty Twenty-Three.

Example Spacer code:

<!-- wp:spacer {"height":"var:preset|spacing|110"} -->
<div style="height:var(--wp--preset--spacing--110)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

Note: Make sure the spacing value e.g. --wp--preset--spacing--110 does not exist in your current theme.

  • Open the editor in the WordPress app
  • Go to the HTML editing mode
  • Pase the snippet from above
  • Expect the Spacer block to render correctly
  • Open the block settings
  • Expect to see the default height value: 100

Testing Instructions for Keyboard

N/A

Screenshots or screencast

Case 1 - Before Case 1 - After
Case 2

@geriux geriux added [Status] In Progress Tracking issues with work in progress Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) labels Jan 18, 2023
@github-actions
Copy link

github-actions bot commented Jan 18, 2023

Size Change: +101 B (0%)

Total Size: 1.33 MB

Filename Size Change
build/block-editor/index.min.js 195 kB +88 B (0%)
build/data/index.min.js 8.58 kB +11 B (0%)
build/editor/index.min.js 45.7 kB +2 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/style-rtl.css 14.4 kB
build/block-editor/style.css 14.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 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 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 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 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-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 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 265 B
build/block-library/blocks/file/style.css 265 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 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 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
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 376 B
build/block-library/blocks/page-list/editor.css 376 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 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 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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 282 B
build/block-library/blocks/post-template/style.css 282 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-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 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 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 463 B
build/block-library/blocks/query/editor.css 463 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 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 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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 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 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 200 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.7 kB
build/block-library/style.css 12.7 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51 kB
build/components/index.min.js 207 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.2 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.8 kB
build/edit-post/style-rtl.css 7.53 kB
build/edit-post/style.css 7.52 kB
build/edit-site/index.min.js 65.2 kB
build/edit-site/style-rtl.css 9.96 kB
build/edit-site/style.css 9.95 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.55 kB
build/edit-widgets/style.css 4.55 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.27 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 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.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 940 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@geriux geriux removed the [Status] In Progress Tracking issues with work in progress label Jan 24, 2023
@geriux geriux marked this pull request as ready for review January 24, 2023 10:59
@geriux geriux removed the request for review from ajitbohra January 24, 2023 10:59
Copy link
Member

@dcalhoun dcalhoun 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 the great walk through of the code and changes in the description. Very helpful!

From testing on iOS and Android with both the Twenty Twenty-Three and Masu themes, I noticed a couple things.

First, it appears the CSS unit parser fails to parse complex, nested CSS functions. E.g. the 70 preset from Twenty Twenty-Three is clamp(5rem, 5.25rem + ((1vw - 0.48rem) * 9.096), 8rem). The spacer appears to always fallback to the default 100px value. The nested parentheses seem to "trip up" the parser.

Updating the block syntax to use a simpler spacing preset resolves the issue. In the example below, the first block falls back to default value, the second block uses the spacing preset.

Example Spacer Blocks
<!-- wp:spacer {"height":"var:preset|spacing|70","style":{"spacing":{"margin":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}}} -->
<div style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

<!-- wp:spacer {"height":"var:preset|spacing|30","style":{"spacing":{"margin":{"top":"var:preset|spacing|30","bottom":"var:preset|spacing|30"}}}} -->
<div style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);height:var(--wp--preset--spacing--30)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

Second, the native block save unexpectedly swaps the height value in style from a CSS custom property value to the block attribute syntax. This results in the blocks containing invalid syntax after saving the post in the native editor.

Example Diff
diff --git a/spacer-blocks.html b/spacer-blocks.html
index 5695c405..6a0b0721 100644
--- a/spacer-blocks.html
+++ b/spacer-blocks.html
@@ -1,11 +1,11 @@
<!-- wp:spacer {"height":"var:preset|spacing|70","style":{"spacing":{"margin":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}}} -->
-<div style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div>
+<div style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var:preset|spacing|70" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

<!-- wp:spacer {"height":"var:preset|spacing|30","style":{"spacing":{"margin":{"top":"var:preset|spacing|30","bottom":"var:preset|spacing|30"}}}} -->
-<div style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);height:var(--wp--preset--spacing--30)" aria-hidden="true" class="wp-block-spacer"></div>
+<div style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);height:var:preset|spacing|30" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

<!-- wp:spacer {"height":"var:preset|spacing|110"} -->
-<div style="height:var(--wp--preset--spacing--110)" aria-hidden="true" class="wp-block-spacer"></div>
+<div style="height:var:preset|spacing|110" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->
\ No newline at end of file

Are you able to replicate these two issues?

Gerardo added 2 commits February 1, 2023 15:45
… splitting by math symbols, this would break for complex values like nested math expressions. Now it will split the string by every number value with a unit, that way it will match all values and convert them to pixel values, to then trigger the math calculation. It will also take into account math expressions wrapped within CSS expressions and take into account this cases.
@geriux geriux requested a review from ellatrix as a code owner February 1, 2023 14:57
@geriux geriux removed the request for review from ellatrix February 1, 2023 14:57
@github-actions
Copy link

github-actions bot commented Feb 1, 2023

Flaky tests detected in 391625a.
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/4254997932
📝 Reported issues:

@geriux
Copy link
Member Author

geriux commented Feb 1, 2023

@dcalhoun Thank you for testing and I'm sorry for taking a bit to go back to this PR 😅

First, it appears the CSS unit parser fails to parse complex, nested CSS functions. E.g. the 70 preset from Twenty Twenty-Three is clamp(5rem, 5.25rem + ((1vw - 0.48rem) * 9.096), 8rem). The spacer appears to always fallback to the default 100px value. The nested parentheses seem to "trip up" the parser.

Nice catch! You are right, complex values with nested values caused an error within the parser so it would take the default value.

I've updated it in 16155cc

That change updates the evalMathExpression function, before it was splitting by math symbols but this breaks complex values like nested math expressions e.g. clamp(5rem, 5.25rem + ((1vw - 0.48rem) * 9.096), 8rem). Now it will split the string by every number value with a unit, that way it will match all values and convert them to pixel values, to then trigger the math calculation. It will also take into account math expressions wrapped within CSS expressions and take into account cases like the one mentioned above.

Let me know what you think of that approach, unit tests pass correctly so I don't expect any regressions, I've tested the font size picker and it's working as expected.

Second, the native block save unexpectedly swaps the height value in style from a CSS custom property value to the block attribute syntax. This results in the blocks containing invalid syntax after saving the post in the native editor.

Interesting, I've tried to paste the example HTML code, and save the post and the content doesn't change. What are the exact steps to reproduce? Let me know.

Thanks again!

@dcalhoun
Copy link
Member

dcalhoun commented Feb 2, 2023

Interesting, I've tried to paste the example HTML code, and save the post and the content doesn't change. What are the exact steps to reproduce? Let me know.

Thanks for requesting the reproduction steps. It made me realize the nuance of my experience after exploring it again.

It appears the issue I described — swapping of the style height CSS custom property value to be the block attribute syntax — only surfaces when opening the post in the web editor. It appears to not relate to saving the post in the mobile editor. It also only occurs when opening the post in Gutenberg v15.0.1. Opening the post in the web editor using this branch does not create the issue.

  1. Create a post with the example content, in either the mobile or web editor.
    <!-- wp:spacer {"height":"var:preset|spacing|70","style":{"spacing":{"margin":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}}} -->
    <div style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div>
    <!-- /wp:spacer -->
    
    <!-- wp:spacer {"height":"var:preset|spacing|30","style":{"spacing":{"margin":{"top":"var:preset|spacing|30","bottom":"var:preset|spacing|30"}}}} -->
    <div style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);height:var(--wp--preset--spacing--30)" aria-hidden="true" class="wp-block-spacer"></div>
    <!-- /wp:spacer -->
    
    <!-- wp:spacer {"height":"var:preset|spacing|110"} -->
    <div style="height:var(--wp--preset--spacing--110)" aria-hidden="true" class="wp-block-spacer"></div>
    <!-- /wp:spacer -->
  2. Save the post.
  3. Re-open the same post in the web editor and switch to "Code editor."
  4. Note the height value within the style attribute is the block attribute syntax, not a CSS custom property.

However, I noticed while using this branch to test the web editor the console displays invalid block warnings. The invalid block warnings appear directly related to the original issue I described. I am unsure what the desired outcome in the web editor is — if the warnings are an issue or expected.

Block validation: Expected attribute style of value margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var:preset|spacing|70, saw margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);height:var(--wp--preset--spacing--70).

Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

The code appears to be function as expected. I wanted to await your response to my previous comment regarding the web editor before providing an approval. Let me know what you think.

Comment on lines 123 to 127
for ( const unit of cssUnitsBits ) {
// The following regex matches numbers that have a following unit
// E.g. 5.25rem, 1vw
const regex = /\d+\.?\d*[a-zA-Z]+|\.\d+[a-zA-Z]+/g;
cssUnit = cssUnit.replace( regex, ( foundUnit ) => {
Copy link
Member

Choose a reason for hiding this comment

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

Let me know what you think of [the updated evalMathExpression] approach, unit tests pass correctly so I don't expect any regressions, I've tested the font size picker and it's working as expected.

I reviewed 16155cc and the changes make sense to me. 👍🏻

The only thing that gave me pause was the change from for loop to String.prototype.replace, namely because the remainder of the function continues to rely upon a for loop. It isn't a big deal, it just feels a bit odd to mix the functional and imperative coding paradigms in the same function.

WDYT? It is fine with me to keep the code as-is. I merely wanted to seek your thoughts.

Copy link
Member Author

Choose a reason for hiding this comment

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

Since it's been a bit since I did this change, I'll review this code and let you know.

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 reviewing the code I brought back the usage of the for loop in 391625a

It also added a fix for the issue you mentioned in this comment. Now we should support nested calc() usages like clamp(2.625rem, calc(2.625rem + ((1vw - 0.48rem) * 8.4135)), 3.25rem) which is the current value for the H2 tag for the Twenty Twenty-Three theme.

@dcalhoun
Copy link
Member

Semi-related: I noticed that the failed CSS unit parsing occurs for the Twenty Twenty-Three h2 font size style as well when using WordPress 21.7 app. My impression is that will also be resolved with the proposed changes.

I do not plan to create a new issue to track the font size issue, but let me know if you would prefer me create an issue.

@geriux
Copy link
Member Author

geriux commented Feb 23, 2023

Hey @dcalhoun 👋

Thank you for sharing the steps!

The idea of this PR is to support posts created from the Web Editor when they release the functionality to add Spacing presets to the Spacer block.

Testing the web editor without their changes will display block warnings or invalid formats because in this branch or in the production version they don't have this new functionality.

So for this PR specifically, we should focus on testing if adding the snippets from the PR description works correctly and don't break the editor. So we can ship this and have it for at least two app versions, then the web team can ship their changes on the next WordPress version and the app will be ready for this new format coming from the web.

Since we don't support the spacing tool, the mobile editor will continue to create the simple format for the Spacer block and won't break the web editor.

I'd say this is an experiment by shipping it before the web editor does to avoid having to work with feature flags like we've done before for the Quote or List blocks.

Let me know if you have any doubts or concerns about it, thanks!

@dcalhoun
Copy link
Member

Testing the web editor without their changes will display block warnings or invalid formats because in this branch or in the production version they don't have this new functionality.

That makes sense. Thank you for expressing that in this way. I also verified that understanding by merging #44002 into this branch and validating the web editor does function as expected without block validation warnings.

Let me know if you have any doubts or concerns about it, thanks!

You have addressed all my concerns. Thank you!

…ted calc(). It also brings back the usage of the for loop to keep consistency instead of using replace directly from the string.
@geriux geriux requested a review from dcalhoun February 23, 2023 17:06
Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

🚀 Thank you! I tested the changes on an iPhone 14 simulator and Samsung Galaxy S20 5G FE.

@geriux geriux removed the Mobile App - Automation Label used to initiate Mobile App PR Automation label Feb 23, 2023
@geriux geriux merged commit 8ed68ea into trunk Feb 23, 2023
@geriux geriux deleted the rnmobile/add-spacer-presets-support branch February 23, 2023 17:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add presets support to the native mobile editor Spacer block
2 participants