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 Supports: Switch dimensions inspector controls slot to bubble virtually #34725

Merged
merged 16 commits into from
Oct 8, 2021

Conversation

aaronrobertshaw
Copy link
Contributor

@aaronrobertshaw aaronrobertshaw commented Sep 10, 2021

Related:

Description

Updates the Dimensions InspectorControls slot group to bubble virtually.

  • Adds wrapper to Slot that retrieves ToolsPanelContext and passes that through fillProps
  • Removes unused header prop from BlockSupportToolsPanel
  • Updates the InspectorControls fills to render via a function. This allows recreation of ToolsPanelContext provider.
  • Added new styles to ToolsPanel component to handle injected div by the virtual bubbling Slot.

Note: The virtually bubbling slot requires a non-functional component to apply refs to. So far I haven't found a way around this div. As a result, this PR updates the ToolsPanel styling such that it will follow the same CSS grid layout as the panel itself.

It appears this switch to virtual bubbling will also resolve a recently discovered bug with support controls which are only enabled via block specific settings within theme.json. See #34766

How has this been tested?

  1. Edit a post, add a group block and select it.
  2. Confirm that the Dimensions panel is correctly displayed in the Inspector Controls.
  3. Test that editing the padding field and resetting/toggling it via the tools panel menu works as expected.
  4. Opt into margin support via the group block.json file.
  5. Enable the margin support UI via a block specific context within your theme.json
"settings": {
   ...
   "spacing": {
	"customMargin": false,
	"customPadding": false,
	"units": [ "px", "em", "rem", "vh", "vw", "%" ]
   },
    ...
    "blocks": {
        "core/group": {
		"spacing": {
			"customMargin": true,
			"customPadding": true
			}
		},
  1. Reload editor and confirm both margin and padding support controls are present, display correctly and work as expected.

Types of changes

Enhancement. Bug fix.

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).

@aaronrobertshaw aaronrobertshaw added [Feature] Block API API that allows to express the block paradigm. [Package] Block editor /packages/block-editor [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi labels Sep 10, 2021
@aaronrobertshaw aaronrobertshaw self-assigned this Sep 10, 2021
@github-actions
Copy link

github-actions bot commented Sep 10, 2021

Size Change: +5.47 kB (+1%)

Total Size: 1.07 MB

Filename Size Change
build/api-fetch/index.min.js 2.21 kB +20 B (+1%)
build/block-directory/index.min.js 6.2 kB +4 B (0%)
build/block-editor/index.min.js 134 kB +726 B (+1%)
build/block-editor/style-rtl.css 13.9 kB +89 B (+1%)
build/block-editor/style.css 13.9 kB +89 B (+1%)
build/block-library/blocks/gallery/editor-rtl.css 977 B -6 B (-1%)
build/block-library/blocks/gallery/editor.css 982 B -6 B (-1%)
build/block-library/blocks/gallery/style-rtl.css 1.6 kB +1 B (0%)
build/block-library/blocks/gallery/style.css 1.59 kB -1 B (0%)
build/block-library/blocks/navigation/style-rtl.css 1.62 kB +137 B (+9%) 🔍
build/block-library/blocks/navigation/style.css 1.61 kB +141 B (+10%) ⚠️
build/block-library/blocks/post-content/editor-rtl.css 0 B -138 B (removed) 🏆
build/block-library/blocks/post-content/editor.css 0 B -138 B (removed) 🏆
build/block-library/blocks/post-featured-image/style-rtl.css 146 B +3 B (+2%)
build/block-library/blocks/post-featured-image/style.css 146 B +3 B (+2%)
build/block-library/blocks/post-template/style-rtl.css 391 B +13 B (+3%)
build/block-library/blocks/post-template/style.css 392 B +13 B (+3%)
build/block-library/editor-rtl.css 9.72 kB -41 B (0%)
build/block-library/editor.css 9.71 kB -40 B (0%)
build/block-library/index.min.js 146 kB -1.22 kB (-1%)
build/block-library/reset-rtl.css 536 B +9 B (+2%)
build/block-library/reset.css 536 B +9 B (+2%)
build/block-library/style-rtl.css 10.4 kB +151 B (+1%)
build/block-library/style.css 10.4 kB +153 B (+1%)
build/blocks/index.min.js 45.7 kB -1.27 kB (-3%)
build/components/index.min.js 214 kB +4.28 kB (+2%)
build/components/style-rtl.css 15.9 kB +76 B (0%)
build/components/style.css 15.9 kB +76 B (0%)
build/core-data/index.min.js 12.4 kB +53 B (0%)
build/customize-widgets/index.min.js 11.2 kB +64 B (+1%)
build/edit-navigation/index.min.js 15.3 kB -132 B (-1%)
build/edit-navigation/style-rtl.css 3.74 kB +43 B (+1%)
build/edit-navigation/style.css 3.74 kB +48 B (+1%)
build/edit-post/index.min.js 29.2 kB +250 B (+1%)
build/edit-post/style-rtl.css 7.19 kB +12 B (0%)
build/edit-post/style.css 7.18 kB +11 B (0%)
build/edit-site/index.min.js 29 kB +1.29 kB (+5%) 🔍
build/edit-site/style-rtl.css 5.43 kB +215 B (+4%)
build/edit-site/style.css 5.43 kB +219 B (+4%)
build/edit-widgets/index.min.js 15.7 kB -317 B (-2%)
build/edit-widgets/style-rtl.css 4.1 kB +10 B (0%)
build/edit-widgets/style.css 4.1 kB +9 B (0%)
build/editor/index.min.js 37.5 kB +115 B (0%)
build/editor/style.css 3.75 kB +1 B (0%)
build/format-library/index.min.js 5.93 kB +592 B (+11%) ⚠️
build/format-library/style-rtl.css 571 B -97 B (-15%) 👏
build/format-library/style.css 571 B -99 B (-15%) 👏
build/media-utils/index.min.js 2.92 kB +40 B (+1%)
build/widgets/index.min.js 7.11 kB +3 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
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-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 58 B
build/block-library/blocks/audio/editor.css 58 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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 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 322 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/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/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 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 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 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 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 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 488 B
build/block-library/blocks/media-text/style.css 485 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 568 B
build/block-library/blocks/navigation-link/editor.css 570 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 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/view.min.js 2.74 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 198 B
build/block-library/blocks/page-list/style.css 198 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/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 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 398 B
build/block-library/blocks/post-featured-image/editor.css 398 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-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 60 B
build/block-library/blocks/post-title/style.css 60 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 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 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-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 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 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 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 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 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 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 853 B
build/block-library/common.css 849 B
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/compose/index.min.js 10.3 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.45 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/editor/style-rtl.css 3.76 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.28 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.5 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@aaronrobertshaw aaronrobertshaw force-pushed the add/virtual-bubbling-for-block-support-slots branch from 94115c2 to 94f444c Compare September 13, 2021 07:52
@@ -10,7 +10,7 @@ import { useDispatch, useSelect } from '@wordpress/data';
import { store as blockEditorStore } from '../../store';
import { cleanEmptyObject } from '../../hooks/utils';

export default function BlockSupportToolsPanel( { children, label, header } ) {
export default function BlockSupportToolsPanel( { children, label } ) {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

The header prop is no longer used. I missed this when separating the ToolsPanel changes from those adding the ToolsPanel and Dimensions slot in #34157

@aaronrobertshaw aaronrobertshaw marked this pull request as ready for review September 13, 2021 08:02
@aaronrobertshaw aaronrobertshaw marked this pull request as draft September 13, 2021 11:35
@aaronrobertshaw
Copy link
Contributor Author

Reverted the earlier attempt to move the ToolsPanel inside the slot since of course it would create a new panel for each set of fills. 🤦‍♂️

@ramonjd
Copy link
Member

ramonjd commented Sep 14, 2021

Here's what I'm seeing:

Screen Shot 2021-09-14 at 12 22 07 pm

I tested the following:

✅ Padding support controls work as expected in the block editor and frontend when enabling it at the theme.json block level
✅ Similarly, margin support controls work as expected in the block editor and frontend when enabling it at the theme.json block level
✅ Disabling margin/padding at the theme.json block level disables and overrides root level settings.
✅ Multiple Group blocks spacing values are applied and saved as expected
✅ Combining Group and Cover blocks, each with spacing controls enabled at the theme.json block level (with this branch rebased on top of trunk): spacing values are applied and saved as expected
✅ Checked for regressions in site editor just to make sure. Controls appears as expected for the blocks in question.

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.

This tests well for me.

I don't have any specific comments on the approach, other than it does fix the bug in #34766 and the controls appear and function as expected.

Looks good in Chrome, FF and Safari.

I think it might need a quick rebase. There seems to have been updates to npm packages.

@aaronrobertshaw aaronrobertshaw force-pushed the add/virtual-bubbling-for-block-support-slots branch from 21e6769 to 090c908 Compare September 14, 2021 04:32
@aaronrobertshaw
Copy link
Contributor Author

I've rebased this and given it another test.

Through that, I've found another side effect for the changes in this PR. The order of the controls added to the slot changes as they are toggled on and off. This isn't ideal but could be addressed separately in a follow up so that the fix for block specific settings lands.

Before After
DimensionsControlsOrder DimensionsControlsOrder2

There has also been talk of allowing consumers to control the order of the controls injected into these panels. Could this be addressed as part of a broader effort to add that?

@aaronrobertshaw aaronrobertshaw force-pushed the add/virtual-bubbling-for-block-support-slots branch 2 times, most recently from 761f2c9 to 959ed4b Compare September 15, 2021 04:14
@aaronrobertshaw aaronrobertshaw force-pushed the add/virtual-bubbling-for-block-support-slots branch from 959ed4b to 6abb295 Compare September 17, 2021 06:06
@@ -31,7 +32,12 @@ export default function InspectorControlsSlot( {
if ( label ) {
return (
<BlockSupportToolsPanel group={ group } label={ label }>
<Slot { ...props } bubblesVirtually={ bubblesVirtually } />
<BlockSupportSlotContainer
Copy link
Member

Choose a reason for hiding this comment

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

Does BlockSupportSlotContainer exist only to collocate the context hook with the Slot?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

At this point in time that's correct. I didn't find a better option given the tools panel context isn't created until the ToolsPanel is within the BlockSupportToolsPanel component.

With the current approach, there is also an issue with maintaining the order of rendered items in the panel when they are injected from multiple places. I'm definitely open to suggestions on improving this.

Another option I was planning to explore but expect some issues with was, to see if I could set up ref forwarding for the BlockSupportToolsPanel and pass it through the as prop to the virtual bubbling Slot. The idea being that the BlockSupportToolsPanel then passes the slot's ref on to a wrapping div and then creates the ToolsPanel with the fills inside that. The goal being the slot no longer introduces a div inside the ToolsPanel and there would no longer be a need to manually pass the ToolsPanelContext through the slot.

As I mentioned, I'm probably missing something with that idea. Let me know if there are any fatal flaws with it.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I haven't had much luck trying to find a working solution to avoid this or the fact the virtual bubbling slot introduces a div when it would be preferential to avoid that inside the ToolsPanel.

One problem I ran into was that the virtual bubbling slots do not appear to accept a function as a child as per the normal slot component.

Slot also accepts optional children function prop, which takes fills as a param. It allows to perform additional processing and wrap fills conditionally.

The docs do not appear to make any distinction here. @gziolo or @youknowriad can you confirm if this is an issue with the docs or whether the virtual bubbling slot component should also offer that?

While exploring this, it looked like it might be possible to leverage the fills retrieved within the inspector controls slot and do something with them from there but that felt like the wrong path to go down. As things stand now, this PR gets the block support tools panel and slots functional. We can iterate on this in follow up PRs.

@gziolo
Copy link
Member

gziolo commented Sep 17, 2021

Note: The virtually bubbling slot requires a non-functional component to apply refs to. So far I haven't found a way around this div. As a result, this PR updates the ToolsPanel styling such that it will follow the same CSS grid layout as the panel itself.

Yes, I think that might be a limitation of this approach.

Through that, I've found another side effect for the changes in this PR. The order of the controls added to the slot changes as they are toggled on and off. This isn't ideal but could be addressed separately in a follow up so that the fix for block specific settings lands.

The best way to approach fills is to move all logic that decides whether a fill should be rendered should be inside it. This way fill will always be rendered by React, even when completely empty, and once it has content again it will show up in the same place. A good example in PinnedItems fill:

<PinnedItems scope={ scope }>
{ isPinned && (
<ComplementaryAreaToggle
scope={ scope }
identifier={ identifier }
isPressed={
isActive && ( ! showIconLabels || isLarge )
}
aria-expanded={ isActive }
label={ title }
icon={ showIconLabels ? check : icon }
showTooltip={ ! showIconLabels }
variant={ showIconLabels ? 'tertiary' : undefined }
/>
) }
</PinnedItems>

We had a similar issue with pinned plugins in the header as reported in #28546.

By the way, getting the order of fills is hard as documented in #29287. Ideally, all fills should always be registered in the same order for the given slot and they should always remain in the React tree if you want to ensure the order remains the same.

@aaronrobertshaw
Copy link
Contributor Author

The best way to approach fills is to move all logic that decides whether a fill should be rendered should be inside it

If I understand you correctly, this is what the ToolsPanelItems do. They check within the ToolsPanelContext to see if they've been toggled on for display or not. That check determines whether the item render itself or not.

they should always remain in the React tree if you want to ensure the order remains the same.

I believe this is the root of the problem. The ToolsPanelItems will return null instead of rendering anything when the item has been toggled off via the panel's menu.

Thanks for the PinnedItems example, I'll take a look and see what I can take from it. 👍

@gziolo
Copy link
Member

gziolo commented Sep 17, 2021

The best way to approach fills is to move all logic that decides whether a fill should be rendered should be inside it

If I understand you correctly, this is what the ToolsPanelItems do. They check within the ToolsPanelContext to see if they've been toggled on for display or not. That check determines whether the item render itself or not.

I did some more digging and my initial try would be to move ! isPaddingDisabled check (I assumed you can change it's value through UI) to a different place in:

<InspectorControls __experimentalGroup="dimensions">
{ ! isPaddingDisabled && (
<ToolsPanelItem
hasValue={ () => hasPaddingValue( props ) }
label={ __( 'Padding' ) }
onDeselect={ () => resetPadding( props ) }
resetAllFilter={ createResetAllFilter( 'padding' ) }
isShownByDefault={ defaultSpacingControls?.padding }
panelId={ props.clientId }
>
<PaddingEdit { ...props } />
</ToolsPanelItem>
) }

You can try making panelId prop dependent on it:

panelId={ ! isPaddingDisabled ? props.clientId : null }

or render PaddingEdit conditionally:

{ ! isPaddingDisabled && <PaddingEdit { ...props } /> }

The same would apply to other panels.

Creating the ToolsPanel for block supports around the slot resulted in the slot adding an extra div within the ToolsPanel breaking its layout. This div is needed for the slot's ref to be applied allowing virtual bubbling.  This change effectively moves the ToolsPanel inside that. It also avoids needing to retrieve ToolsPanelContext and recreating the context provider.
@aaronrobertshaw aaronrobertshaw force-pushed the add/virtual-bubbling-for-block-support-slots branch from 7bc3639 to 84ba3b8 Compare September 24, 2021 04:52
Copy link
Contributor

@ciampo ciampo 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 for taking the previous feedback into account and moving away from introducing more hardcoded classnames to ToolsPanel.

I've focused my attention on the component itself, and left a few more comments that resulted from the latest changes.

packages/components/src/tools-panel/types.ts Show resolved Hide resolved
packages/components/src/tools-panel/tools-panel/README.md Outdated Show resolved Hide resolved
packages/components/src/tools-panel/tools-panel/README.md Outdated Show resolved Hide resolved
packages/components/src/tools-panel/tools-panel/hook.ts Outdated Show resolved Hide resolved
packages/components/src/tools-panel/tools-panel/hook.ts Outdated Show resolved Hide resolved
packages/components/src/tools-panel/styles.ts Show resolved Hide resolved
@gziolo
Copy link
Member

gziolo commented Oct 4, 2021

I'm not sure there's a way around the order issue. When the new one gets rendered, the Fill that was already rendered (createPortal) won't get reinfected into the portal (createPortal call not called), meaning the newly added Fill will appear later even if in the tree of elements it's before.

Should we use a placeholder HTML element for the fill instead in SlotFill API that doesn't have a visual representation, like <script /> or <template />? The challenge would be to introduce a formal API method that counts the real number of fills rendered in that scenario.

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

All of my feedback on the ToolsPanel iteself has been addressed, thank you!

Should we use a placeholder HTML element for the fill instead in SlotFill API that doesn't have a visual representation, like <script /> or ? The challenge would be to introduce a formal API method that counts the real number of fills rendered in that scenario.

This definitely sounds like an interesting suggestion, I'll let @aaronrobertshaw look into it, and more in general other reviewers to also have a final look at this PR

@aaronrobertshaw
Copy link
Contributor Author

aaronrobertshaw commented Oct 7, 2021

All the requested changes to date have been completed. I believe this is ready for a final review.

The current list of future follow-ups includes:

Work is already underway for both of these.

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Great job tackling all the feedback and thank you so much for working on the follow-up PRs!


if ( ! isShown ) {
return null;
return shouldRenderPlaceholder ? (
<View { ...toolsPanelItemProps } ref={ forwardedRef } />
Copy link
Contributor

Choose a reason for hiding this comment

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

I wonder if we should force a aria-hidden="true" on this element to make sure it's ignored by assistive technology — not sure if it matters since it's an empty div 🤷

Copy link
Member

Choose a reason for hiding this comment

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

I think it makes a difference for visual items like pictures or icons.

@aaronrobertshaw aaronrobertshaw merged commit 27cf944 into trunk Oct 8, 2021
@aaronrobertshaw aaronrobertshaw deleted the add/virtual-bubbling-for-block-support-slots branch October 8, 2021 04:36
@github-actions github-actions bot added this to the Gutenberg 11.8 milestone Oct 8, 2021
@ramonjd ramonjd mentioned this pull request Oct 20, 2021
7 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Block API API that allows to express the block paradigm. [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi [Package] Block editor /packages/block-editor
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants