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

Color Controls: Merge color dropdown components #40084

Merged
merged 5 commits into from
May 12, 2022

Conversation

aaronrobertshaw
Copy link
Contributor

@aaronrobertshaw aaronrobertshaw commented Apr 6, 2022

Related:

What?

In #34027, a new ToolsPanelColorDropdown component was introduced to facilitate color dropdowns being rendered within the ToolsPanel used by the color block supports slot.

As a result of further discussion, this PR looks to merge this ToolsPanelColorDropdown with the original ColorGradientSettingsDropdown.

Why?

Given the overlap, refactoring these to a single component, should reduce maintenance, highlight how color controls may need to be rendered differently in different contexts, and help ensure both cases are updated appropriately should the color control need changing.

How?

  • Updates the original ColorGradientSettingsDropdown component
  • Adds a new prop to toggle between rendering as an ItemGroup (original component) or as a ToolsPanelItem
  • Replaces use of ToolsPanelColorDropdown with the new merged ColorGradientSettingsDropdown component for the color block supports
  • Relocates the color dropdown styles from the color block supports file to live with the original component styles in packages/block-editor/src/components/colors-gradients/style.scss

Testing Instructions

  1. Load the block editor, create a new post and add both a group and cover block
  2. Select the group block and ensure that all the color controls in the sidebar still function and look correct
    (This tests the ToolsPanelItem version of the color dropdown component)
  3. Make sure to test resetting the color controls via the ToolsPanel menu
  4. Select the cover block ensuring that the color control in the Overlay sidebar panel is looking and working correctly.
    (This tests the original ItemGroup version of the color dropdown component)
  5. Save the post and double-check the frontend applies color selections.

Screenshots or screencast

ColorControls.mp4

@aaronrobertshaw aaronrobertshaw added [Type] Enhancement A suggestion for improvement. [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi labels Apr 6, 2022
@aaronrobertshaw aaronrobertshaw self-assigned this Apr 6, 2022
@github-actions
Copy link

github-actions bot commented Apr 6, 2022

Size Change: -134 B (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-editor/index.min.js 150 kB +21 B (0%)
build/block-editor/style-rtl.css 14.9 kB -76 B (-1%)
build/block-editor/style.css 14.9 kB -79 B (-1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-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 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.53 kB
build/block-library/blocks/cover/style.css 1.53 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 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 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 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 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 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-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.95 kB
build/block-library/blocks/navigation/style.css 1.94 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 395 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 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 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 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 495 B
build/block-library/blocks/post-comments-form/style.css 495 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 583 B
build/block-library/blocks/post-comments/style.css 583 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.2 kB
build/block-library/editor.css 10.3 kB
build/block-library/index.min.js 179 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/style.css 11.5 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47 kB
build/components/index.min.js 227 kB
build/components/style-rtl.css 15 kB
build/components/style.css 15 kB
build/compose/index.min.js 11.7 kB
build/core-data/index.min.js 14.6 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.98 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.2 kB
build/edit-post/style-rtl.css 7.02 kB
build/edit-post/style.css 7.02 kB
build/edit-site/index.min.js 47.5 kB
build/edit-site/style-rtl.css 7.96 kB
build/edit-site/style.css 7.95 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.41 kB
build/edit-widgets/style.css 4.4 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.67 kB
build/editor/style.css 3.67 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.1 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.16 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for following up with this one @aaronrobertshaw! It took me a little while to wrap my head around the value of the combined component, because it does introduce some additional complexity, where I found the two separate components a little easier to read in isolation.

But, I think the benefits of having a single component as the entry point to rendering the controls makes it worthwhile, and it looks like there's some further consolidation we can do to neaten things up, too, in follow-ups should we wish to do that.

It's also good to see the styles moved over from hooks/color.scss to the colors-gradients directory 👍

This LGTM, but you might want a second opinion from @youknowriad since he suggested the idea (or otherwise @ciampo always has good insights into these things!)

@aaronrobertshaw
Copy link
Contributor Author

Thanks for the review @andrewserong 👍

I think you capture the tradeoff well in your comment above. Given we appear to be leaning towards this PR's direction I've made the suggested updates to keep this moving.

@andrewserong
Copy link
Contributor

Thanks @aaronrobertshaw, from a quick skim that's looking good to me, and makes things a bit tidier. Also, on balance, this PR removes more than it adds, which is a win! 👍

image

@youknowriad
Copy link
Contributor

I'd love a quick look from @jorgefilipecosta as he was involved in the initial components here quiet a lot.

@aaronrobertshaw
Copy link
Contributor Author

Thank you everyone for the feedback and suggestions. I believe we have a consensus to proceed with this refactor.

@jorgefilipecosta Do you have any objections with this PR landing?

Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

This PR looks good, nice change @aaronrobertshaw 👍 I'm not sure if we need an optional property to allow the component to be used in two versions. I think we can just use the tools panel everywhere, so all the blocks using colors automatically get the new UI.

Currently, the cover, social links, etc, are not using the new UI. These may get solved if we address the previous point. If not we should enable the new flag on these blocks. If we really introduce the flag I think it should be experimental.

) ) }
<ColorGradientSettingsDropdown
enableAlpha={ enableAlpha }
isItemGroup={ false }
Copy link
Member

Choose a reason for hiding this comment

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

Do we really need the isItemGroup prop can we just use the new UI by default everywhere? Recently we changed the component to show the palettes in a popover everywhere without a prop and that was an even a bigger change. I guess we can just use tools panels everywhere.

@aaronrobertshaw
Copy link
Contributor Author

Thanks for taking the time to look at this @jorgefilipecosta 👍

Apologies in advance for the long reply.

I'm not sure if we need an optional property to allow the component to be used in two versions. I think we can just use the tools panel everywhere, so all the blocks using colors automatically get the new UI.

I'm not sure whether we can just use the ToolsPanel everywhere.

The ToolsPanel requires additional props and callbacks in order to function correctly and this new component version was more about keeping the same UI when within a ToolsPanel context. It's also web only.

Using the tools panel everywhere would also likely entail removing or updating the PanelColorGradientSettings and PanelColorSettings components. That might be easier for the first given it is exported as __experimental (though it's been around over 2 years). The PanelColorSettings however is a stable component and switching it to a ToolsPanel would be a breaking change.

Furthermore, I can still see some blocks wishing to add arbitrary color controls in a semantic way outside of a ToolsPanel though. For example, the Cover block has overlay and opacity controls. The overlay control would fit nicely within the color support tools panel however the opacity looks a little out of place. If this were a 3rd party block, the author might wish to keep these two related controls together in a separate panel.

Screen Shot 2022-04-27 at 3 37 36 pm

Currently, the cover, social links, etc, are not using the new UI.

We can, as you suggest, update the Cover and Social Links blocks to inject their color-related controls into the color block supports ToolsPanel. The Navigation block also uses PanelColorSettings which currently leverages the original version of the color dropdown controls. These updates would reduce or remove the use of PanelColorGradientSettings and PanelColorSettings within Gutenberg but still leaves the question of continuing to support and not breaking PanelColorSettings.

Recently we changed the component to show the palettes in a popover everywhere without a prop and that was an even a bigger change.

The difference I see here compared to updating the component to show the palette in a popover is, at that point in time there was only one type of panel the color controls were used in so they all had the same constraints. Nothing really changed for their consumers.

The conversion of the colors block support to use a tools panel was pending review and approval when the popover updates to the color controls were made. I was under the impression there was a use case for rendering them in an ItemGroup. Combining that with the issues around PanelColorSettings etc. it was decided to avoid replacing the color dropdown component but create a version that worked alongside it.


I don't feel strongly about which way we go, I'd like to clean up the code here and reduce the complexity as much as possible while we are at it.

So that said, some options to move forward could be to:

  1. Proceed with this PR
    • If so, possibly make the isItemGroup prop __experimental (the whole component is currently experimental)
    • Optionally, update Cover, Social Links & Navigation blocks to inject controls into color supports panel anyway
  2. Remove non-ToolsPanel use of color controls and find a means of deprecating or removing PanelColorSettings and PanelColorGradientSettings etc.
    • Will also require fixing native controls where ToolsPanel isn't a thing.
  3. Abandon this PR
    • Possibly move the separate ToolsPanelColorDropdown to an independent location in the block editor components
    • This fails to address the original concern where there were essentially two locations to update if the color controls UI need to change.

Thanks again for your help and guidance on this one @jorgefilipecosta 🙇

Copy link
Member

@jorgefilipecosta jorgefilipecosta 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 the detailed explanation @aaronrobertshaw.

I think this PR is a step in the good direction of unifying color components. For now, I think it would be better to have isItemGroup as experimental so that in the future, we are able to remove it.

In the future, I think it would be good to try to make PanelColorGradientSettings and PanelColorSettings use the tools panel, but we can try that in different PR's as we are not sure if it fits or not. I think we can keep the same props the components have. And by default, if we provide this experience in every block it is a good idea, on the cover the default may not be optimal but it is not too bad either following the screen @aaronrobertshaw shared.
165460066-d46d842f-ae38-4256-a57b-9826b51af6ef (1)

Regarding adding additional props to PanelColorGradientSettings to make it fit a tools panel I don't think we need that the PanelColorGradientSettings already can reset and manipulate the colors it would be a matter of inside it adapting the properties so a tools panel could be used.

These changes update the ColorGradientSettingsDropdown to render differently depending upon whether it will be representing a fixed semantic `ItemGroup` or a collection of color controls within a `ToolsPanel` e.g. for the color block supports panel.
@aaronrobertshaw aaronrobertshaw force-pushed the try/merging-color-dropdown-controls branch from 4efe4b4 to 025392f Compare May 11, 2022 04:43
@aaronrobertshaw
Copy link
Contributor Author

Thanks for giving this another look @jorgefilipecosta 🙇

I think this PR is a step in the good direction of unifying color components. For now, I think it would be better to have isItemGroup as experimental so that in the future, we are able to remove it.

✅ Done. I've made isItemGroup experimental in 025392f.

In the future, I think it would be good to try to make PanelColorGradientSettings and PanelColorSettings use the tools panel, but we can try that in different PR's as we are not sure if it fits or not.

I agree it would be nice to unify everything here to use the ToolsPanel and explore that all separately.

Regarding adding additional props to PanelColorGradientSettings to make it fit a tools panel I don't think we need that the PanelColorGradientSettings already can reset and manipulate the colors it would be a matter of inside it adapting the properties so a tools panel could be used.

When I mentioned the ToolsPanel requiring additional props and callbacks, I meant that for each color control to be wrapped in a ToolsPanelItem, the settings object representing the color control should have additional properties including; hasValue, onDeselect, and resetAllFilter. We had a similar requirement for the color block supports.

These are required for the panel to behave as per the others. The color control itself might allow for a value to be cleared but it will still be represented within the ToolsPanel menu. From there it should be able to be reset either individually (onDeselect) or via the "reset all" (resetAllFilter). The ToolsPanel would also need a callback (hasValue) to determine whether any selection has been made via the control so as to reflect that in the menu.

We could easily do all this for our uses of the PanelColorGradientSettings and PanelColorSettings however given PanelColorSettings has been exported as stable we'd still need third party devs to update their usage or the resulting panel would have a confusing/broken UX.

For now, I believe we have a consensus to land this PR and explore the rest separately. I'll aim to merge this tomorrow pending any last minute objections.

@jorgefilipecosta
Copy link
Member

Yes, the consensus is to merge this PR.

When I mentioned the ToolsPanel requiring additional props and callbacks, I meant that for each color control to be wrapped in a ToolsPanelItem, the settings object representing the color control should have additional properties including; hasValue, onDeselect, and resetAllFilter. We had a similar requirement for the color block supports.

PanelColorSettings may create all the props (hasValue, onDeselect, and resetAllFilter) based just on the color values before passing them to the ToolsPanel. So I think we can make PanelColorSettings use ToolsPanel without developers needing to pass any new prop to PanelColorSettings but that's something we can try in the future.

@aaronrobertshaw aaronrobertshaw merged commit b624d80 into trunk May 12, 2022
@aaronrobertshaw aaronrobertshaw deleted the try/merging-color-dropdown-controls branch May 12, 2022 05:27
@github-actions github-actions bot added this to the Gutenberg 13.3 milestone May 12, 2022
@aaronrobertshaw
Copy link
Contributor Author

Thanks everyone for the feedback and help getting this one merged. 🙇

PanelColorSettings may create all the props (hasValue, onDeselect, and resetAllFilter) based just on the color values before passing them to the ToolsPanel

I'm a bit at a loss as to how we'd be able to reliably create the resetAllFilter. Some colors could be used ad hoc, others from block attributes, they may or may not have named color block attributes as well that should be cleared etc. Making the panel's resetAll chain on change handlers would also hit problems.

If you have some ideas here, I'd be happy to help when the time comes to explore them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi Needs User Documentation Needs new user documentation [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants