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

Dimensions Support: Add SlotFill to Dimensions Panel #34063

Conversation

aaronrobertshaw
Copy link
Contributor

@aaronrobertshaw aaronrobertshaw commented Aug 13, 2021

Related:

Description

  • Adds a new SlotFill component called DimensionControls
  • New component is used to allow blocks to inject controls into the Dimensions block support panel
  • ToolsPanelItem was updated to allow passing a new function through to the ToolsPanel that will allow for continued filtering when passed as an argument to the ToolsPanel's resetAll callback.

Note: This is a very rough proof of concept. If anyone has more elegant solutions, I'd be happy to implement them.

Also, I've included a readme for DimensionControls however I'm expecting we'll remove that given this would be experimental. For the time being it helps further explain the intent of this PR

Example Usage

An example of the intended usage of this change is to be able to merge the ad hoc min-height control from the Cover block into the Dimensions panel provided via block supports as they currently share the same title.

How has this been tested?

  • Ran npm run test-unit:watch packages/components/src/tools-panel/test
  • Manually via separate PR updating the Cover block to inject its min-height control into the Dimensional Panel. See further instructions there.

Types of changes

New feature.

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 [Type] Enhancement A suggestion for improvement. [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 labels Aug 13, 2021
@aaronrobertshaw aaronrobertshaw self-assigned this Aug 13, 2021
@github-actions
Copy link

github-actions bot commented Aug 13, 2021

Size Change: +106 B (0%)

Total Size: 1.04 MB

Filename Size Change
build/block-editor/index.min.js 119 kB +78 B (0%)
build/components/index.min.js 209 kB +28 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/api-fetch/index.min.js 2.19 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.21 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/style-rtl.css 13.8 kB
build/block-editor/style.css 13.8 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 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 605 B
build/block-library/blocks/button/style.css 604 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 194 B
build/block-library/blocks/columns/editor.css 193 B
build/block-library/blocks/columns/style-rtl.css 474 B
build/block-library/blocks/columns/style.css 475 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 400 B
build/block-library/blocks/embed/style.css 400 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/editor-rtl.css 707 B
build/block-library/blocks/gallery/editor.css 706 B
build/block-library/blocks/gallery/style-rtl.css 1.05 kB
build/block-library/blocks/gallery/style.css 1.05 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 93 B
build/block-library/blocks/group/theme.css 93 B
build/block-library/blocks/heading/editor-rtl.css 152 B
build/block-library/blocks/heading/editor.css 152 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 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 283 B
build/block-library/blocks/html/editor.css 284 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 63 B
build/block-library/blocks/list/style.css 63 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 474 B
build/block-library/blocks/navigation-link/editor.css 474 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/editor-rtl.css 1.69 kB
build/block-library/blocks/navigation/editor.css 1.69 kB
build/block-library/blocks/navigation/style-rtl.css 1.65 kB
build/block-library/blocks/navigation/style.css 1.64 kB
build/block-library/blocks/navigation/view.min.js 2.52 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 310 B
build/block-library/blocks/page-list/editor.css 310 B
build/block-library/blocks/page-list/style-rtl.css 242 B
build/block-library/blocks/page-list/style.css 242 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 248 B
build/block-library/blocks/paragraph/style.css 248 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-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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 361 B
build/block-library/blocks/pullquote/style.css 360 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 270 B
build/block-library/blocks/query-pagination/editor.css 262 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B
build/block-library/blocks/query-pagination/style.css 168 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 169 B
build/block-library/blocks/quote/style.css 169 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.33 kB
build/block-library/blocks/social-links/style.css 1.33 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 1.29 kB
build/block-library/common.css 1.29 kB
build/block-library/editor-rtl.css 9.87 kB
build/block-library/editor.css 9.85 kB
build/block-library/index.min.js 147 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 10.2 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 692 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 47 kB
build/components/style-rtl.css 15.7 kB
build/components/style.css 15.8 kB
build/compose/index.min.js 10.2 kB
build/core-data/index.min.js 12.3 kB
build/customize-widgets/index.min.js 11.1 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.08 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.53 kB
build/edit-navigation/index.min.js 13.6 kB
build/edit-navigation/style-rtl.css 3.19 kB
build/edit-navigation/style.css 3.19 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 28.6 kB
build/edit-post/style-rtl.css 7.23 kB
build/edit-post/style.css 7.22 kB
build/edit-site/index.min.js 26.2 kB
build/edit-site/style-rtl.css 5.07 kB
build/edit-site/style.css 5.07 kB
build/edit-widgets/index.min.js 16 kB
build/edit-widgets/style-rtl.css 4.06 kB
build/edit-widgets/style.css 4.06 kB
build/editor/index.min.js 37.5 kB
build/editor/style-rtl.css 3.92 kB
build/editor/style.css 3.91 kB
build/element/index.min.js 3.16 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.36 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 669 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.59 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.49 kB
build/keycodes/index.min.js 1.25 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/media-utils/index.min.js 2.88 kB
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.32 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.72 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 6.27 kB
build/widgets/style-rtl.css 1.05 kB
build/widgets/style.css 1.05 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@youknowriad
Copy link
Contributor

I've been thinking about this a bit and right now for controls in the toolbar, we do something like:

<BlockControls group="inline">{something}</BlockControls>

This puts the added control into the "inline" section of the block controls. I wonder if we could be able to have a very similar API for the block authors. This would make adoption and devx better.

<InspectorControls group="dimensions">{something}</InspectorControls>

I know @gziolo has also thought about this previously.

@gziolo
Copy link
Member

gziolo commented Aug 13, 2021

@youknowriad you read my mind. It's something I was talking about with @jasmussen in the context of absorbing the parent inspector controls as a follow-up for #33955. My initial idea was to have the following groups:

  • parent (new feature)
  • default (for the legacy features that exist in 3rd party blocks, but may also be a place for Block Styles picker and Block Transformation picker)
  • block (whatever the block defines that is specific to it)
  • advanced (it's basically InspectorAdvancedControls)

Now, there is a question about what we do about Global Styles UI. If that should be a single group or we should have more groups, for example:

  • default
  • layout
  • typography
  • border
  • color
  • dimensions

@gziolo
Copy link
Member

gziolo commented Aug 13, 2021

I started #34069 to explore groups for the inspector controls slot.

@youknowriad
Copy link
Contributor

I think Slots for Inspectors need to be aware of the normalized panels we're introducing (dimensions, typography...) like this PR does, and yeah ideally also handle the menu to hide/show and reset these controls automatically.

@aaronrobertshaw
Copy link
Contributor Author

Thanks @gziolo for putting together the grouped InspectorControls in #34069. 🚀

I've rebased this PR onto that one, added a dimensions group, and made some other tweaks to the dimensions block support hook. It's working well for me.

Are there any concerns over the general approach to providing the grouped InspectorControls, perhaps relating to the absorption of parent controls, that might delay this all landing?

@@ -6,11 +6,15 @@ import { createSlotFill } from '@wordpress/components';
const InspectorControlsDefault = createSlotFill( 'InspectorControls' );
const InspectorControlsBlock = createSlotFill( 'InspectorControlsBlock' );
const InspectorControlsAdvanced = createSlotFill( 'InspectorAdvancedControls' );
const InspectorControlsDimensions = createSlotFill(
'InspectorDimensionsControls'
);

const groups = {
default: InspectorControlsDefault,
block: InspectorControlsBlock,
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not sure "block" group for the inspector controls make sense.

Copy link
Member

@gziolo gziolo Aug 16, 2021

Choose a reason for hiding this comment

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

It comes from the parent PR that I opened. The reasoning is that block would contain all controls specific only to the particular block. Image is a great example here:

Screen Shot 2021-08-16 at 10 40 52

I also don't feel strong about that and we can use default for those controls as well.

@youknowriad
Copy link
Contributor

I think this is going in the right direction. Looking at the example usage in #34065 I have a few questions/notes. Basically the API is something like this:

<InspectorControls group="nameOfGroup">
    <ToolsPanelItem label="something" {...someProps} />
    <ToolsPanelItem label="something2" {...someProps2} />
    <ToolsPanelItem label="something3" {...someProps3} />
</InspectorControls>

Now correct me if I'm wrong but here are my assumptions:

  • When using <InspectorControls group="nameOfGroup">, it means a ToolsPanel is automatically rendered and all its items are added using ToolsPanelItem (looking at the code now, it's not really the case it's the opposite: only the dimensions panel includes a slot and its items are hardcoded instead of using the Fill)
  • When using <InspectorControls group="nameOfGroup">, all of its children must be ToolbarPanelItem (like BlockControls children must be ToolbarItem instances)
  • The default and advance <InspectorControls> groups allow any children and not just ToolbarPanelItem for backward compatibility? (similar to how the default BlockControls work)

I also feel we should add some documentation and update existing examples in our markdowns to rely on these APIs (could be follow-ups)

@youknowriad
Copy link
Contributor

I was also wondering about the naming of ToolsPanelItem. I'm not great with names but wondering if there's a better name to be used there.

@aaronrobertshaw
Copy link
Contributor Author

When using , it means a ToolsPanel is automatically rendered and all its items are added using ToolsPanelItem (looking at the code now, it’s not really the case it’s the opposite: only the dimensions panel includes a slot and its items are hardcoded instead of using the Fill)

My understanding or assumption was that the slot was just a place for us to insert whatever was needed into the block support’s panel.

Are you advocating that we move the dimensions slot to inside the InspectorControls then have it create the ToolsPanel there as well as the resetAll callback etc?

I’m not clear on how that would work. It feels like it's complicating how the block support hooks generate their panels further. Is there a way we can address the API and devx concerns while keeping this clearer?

Would it be better to keep all that block support related functionality within the appropriate block support’s hook?

When using , all of its children must be ToolbarPanelItem (like BlockControls children must be ToolbarItem instances)

We currently have the ability to add whatever we want within a ToolsPanel and not every child of that panel has to appear in the panel’s menu. An example of this could be a contrast checker as they currently appear beside font and background color controls but don’t need an item in the panel’s menu.

The default and advance groups allow any children and not just ToolbarPanelItem for backward compatibility? (similar to how the default BlockControls work)

At this stage, we wouldn’t have any backwards compatibility concerns around the use of the slot for block support panels. Are you seeing that we might in future and we want to restrict the type of items that can be added via the slot?

I also feel we should add some documentation and update existing examples in our markdowns to rely on these APIs (could be follow-ups)

Definitely. I’m happy to add the new groups and update the other block supports as well as the docs once we settle on an approach here.

I was also wondering about the naming of ToolsPanelItem. I’m not great with names but wondering if there’s a better name to be used there.

There was a bit of discussion around the naming of the ToolsPanel and its components. I do not have strong opinions on the name.

If you have new suggestions, the sooner we rename it the better. No better options have gained any traction to date though.

@youknowriad
Copy link
Contributor

Are you advocating that we move the dimensions slot to inside the InspectorControls then have it create the ToolsPanel there as well as the resetAll callback etc?

I'm actually advocating for making <InspectorControls.Slot group="something"> a generic "panel" that also supports the hiding/showing of its controls. I think this means rendering ToolsPanel inside it but by default don't render any control directly.

The controls should stay in the hooks but should use <InspectorControls group="something"> themselves to add the "built-in" controls (padding, margin,...) to the slot. That way the hook and adhoc controls added by third-party blocks work the same way and have nothing hard-coded in the slot directly.

This maps exactly how <BlockControls.Slot group="something"> works because it renders and ToolbarGroup (equivalent to ToolsPanel)

@youknowriad
Copy link
Contributor

To be honest my suggestion doesn't change much, it just makes it easier to add new Slots like that. "dimension" is nothing more than a new "group". Basically the only difference between both is whether we do this:

<ToolsPanel label="Dimensions">
     <InspectorControls.Slot group="dimensions" />
</ToolsPanel>

or just

<InspectorControls.Slot group="dimensions" />

and have the Slot component render the ToolsPanel automatically like we do for BlockControls.
In the end it doesn't change anything in terms of API but it would avoid us to have to do this:

<ToolsPanel label="Dimensions">
     <InspectorControls.Slot group="dimensions" />
</ToolsPanel>
<ToolsPanel label="Typography">
     <InspectorControls.Slot group="dimensions" />
</ToolsPanel>
// ...

I don't feel that strongly about it though. So your call.

@andrewserong
Copy link
Contributor

This might just be a style preference, but with the question about where to place the <InspectorControls.Slot group="dimensions" /> line, one of the things I like about it being added as the last child of the <ToolsPanel> is that it's quite explicit in the block support's hook that the support's panel items will always come first and take precedence over those added via the slot. So there's a slight hierarchical difference between the 'canonical' items provided by the support, and those provided by something (e.g. a plugin) extending that support.

That sounds good to me, so I think I'd lean toward how it's implemented in this PR. However, I also see an argument for generalising so that the concept of extending the panel is more about the panel rather than intrinsically extending the concept of the particular block support. Would it work to go with the current approach and revisit in a follow-up if it looks like we need to make it more generic?

@aaronrobertshaw
Copy link
Contributor Author

I'm actually advocating for making <InspectorControls.Slot group="something"> a generic "panel" that also supports the hiding/showing of its controls. I think this means rendering ToolsPanel inside it but by default don't render any control directly.

Ok, this sounds like what I was trying to convey in my question. That panel has to be created in the slot but only for certain groups. The group's slot then has to be added to the InspectorControls somewhere. If that isn't via the dimensions support's hook, then we need to move it to the InspectorControls' fill itself correct?

The controls should stay in the hooks but should use themselves to add the “built-in” controls (padding, margin,…) to the slot.

Understood.

This maps exactly how <BlockControls.Slot group=“something”> works because it renders and ToolbarGroup (equivalent to ToolsPanel)

My confusion is over how the ToolsPanel created by the slot would handle the "reset all" functionality.

To be able to perform a "reset all" for these group slots' panels, I imagine we could get the currently selected block from the store and create a generic resetAll function there using the concept of a resetAllFilter introduced here.

I feel like it would be good though for individual block supports to be able to control that behaviour themselves. Maybe resetting focus to a specific control after reset or something. Block support provided styles have already overlapped some block styles, so could there be the possibility that the reset all function might want to restore a block style selection?

Perhaps, with the image block the user selects the rounded block style, then decides to adjust the border-radius explicitly. They decide to reset the explicit radius. Could we down the road want to restore the block style selection there to rounded?

The additional handling for retrieving block props, that are already available within the block support hook, creating the callbacks etc seem to make this diverge from the example of the BlockControls where ToolbarGroup is just a simple wrapper. We would also only be doing this for some of the InspectorControls groups and not others.

As you elude to, the normal use of this from a third-party dev's perspective doesn't really change.

<InspectorControls group="dimensions">
    <MyControl />
</InspectorControls>

My view when first approaching this was for the SlotFill to provide a means of adding to a block supports panel rather than replace it.

The little bit of extra duplication seems like a small trade-off for increased flexibility for each of the block supports.
In addition, this keeps each of the InspectorControls group slots rendering the same way. Does that make it easier to maintain and reason about in the evolving world of block supports?

@aaronrobertshaw
Copy link
Contributor Author

Thanks for adding to the discussion @andrewserong, you make some good points 👍

So there's a slight hierarchical difference between the 'canonical' items provided by the support, and those provided by something (e.g. a plugin) extending that support.

Interesting point. Having consistency around the order of at least the block support "built in" controls sounds important.

That sounds good to me, so I think I'd lean toward how it's implemented in this PR. However, I also see an argument for generalising so that the concept of extending the panel is more about the panel rather than intrinsically extending the concept of the particular block support.

This is the key question. Do we change block supports to not provide their own panel but only add to one provided by the inspector controls?

Would it work to go with the current approach and revisit in a follow-up if it looks like we need to make it more generic?

This would allow us to move forward. The change being discussed doesn't alter how new controls are added so I don't think there's any blocker to iterating on it in the near future if needed.

@youknowriad
Copy link
Contributor

take precedence over those added via the slot

I'm not sure I agree with this, I think all items including the hooks one should be added via the slot. There are filter priorities to handle order if needed. The reason is simple, in previous occasions we had situations where third-party items want to force their controls to be top in the list (cc @retrofox as he refactored the "styles" in the inspector controls to do exactly that). I wouldn't be surprised if a core block needs this personally.

@retrofox
Copy link
Contributor

retrofox commented Aug 18, 2021

take precedence over those added via the slot

...The reason is simple, in previous occasions we had situations where third-party items want to force their controls to be top in the list (cc @retrofox as he refactored the "styles" in the inspector controls to do exactly that).

Correct. It's a pity we haven't merged the PR, yet. 🤦 My bad

@andrewserong
Copy link
Contributor

The reason is simple, in previous occasions we had situations where third-party items want to force their controls to be top in the list

Thanks for clarifying @youknowriad, that makes good sense to me 👍

@aaronrobertshaw
Copy link
Contributor Author

I've drafted a new PR wrapping the block support group slots in a generic ToolsPanel and updating the dimensions hook accordingly. #34157

If everyone is happy with the approach in that, I'm happy to close this one in favour of #34157.

@gziolo
Copy link
Member

gziolo commented Aug 19, 2021

Just letting you know that applied some breaking changes to #34069 and therefore to the base branch used here. The only important change is that group was marked as experimental based on the feedback received, so it's now __experimentalGroup.

This will allow for ad hoc controls to be injected by blocks into the dimensions block support panel.
@aaronrobertshaw aaronrobertshaw force-pushed the try/slot-fill-for-dimensions-panel branch from 6c0813e to cc7e089 Compare August 20, 2021 02:21
@aaronrobertshaw aaronrobertshaw force-pushed the try/slot-fill-for-dimensions-panel branch from cc7e089 to 3386a7d Compare August 20, 2021 02:29
@aaronrobertshaw
Copy link
Contributor Author

Closing in favour of #34157

@paaljoachim
Copy link
Contributor

paaljoachim commented Aug 20, 2021

I will add a comment here.
I worry as I mentioned in I believe my first comment early in relation to the Dimensions panel in another PR. That one will have multiple panels open with features one is using and one is not able to close the panels, but the features one use will always stay open. Justin touched upon something similar in his article here:
https://wptavern.com/gutenberg-11-3-introduces-dimensions-panel-adds-button-padding-support-and-speeds-up-the-inserter

"The current downsides are twofold. Once choosing to display margin or padding controls, the panel itself cannot be collapsed. This exacerbates the very problem that the new feature attempts to solve — decluttering the sidebar interface. For me, at least, I always want quick access to spacing controls. However, I do not always need them shown."

I like to close the panels as it declutters the sidebar. Which means not replacing the open/close arrow with the 3 dot contextual menu, but instead adding the contextual menu inside the panel.

@jasmussen
Copy link
Contributor

The new tools panel is due for polish in the 5.9 phase. One thing we could look at next is to remember controls you've added or removed from the ellipsis menu, so you can tailor your own experience. We can also revisit the decision to have the checkmark singularly clear and remove. Together these could address the need for occasional-but-not-always spacing controls.

The tools panel will coexist with the collapsible panel. It's primarily meant to replace inspector panels that today start out opened: the ones that even if you close them to reduce noise in the moment are reopened as soon as you deselect and select the block again.

Simplifying and reducing noise in the inspector is a high priority, and the primary goal for #27331 to solve. The tools panel is only one ingredient. Simplified color swatches, consistent reused panels, and simplified heuristics for control layouts are key aspects that still need to land.

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 [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants