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

Extract a ColorPanel component as a reusable component between Global Styles and Block Inspector #48893

Merged
merged 21 commits into from
Mar 27, 2023

Conversation

youknowriad
Copy link
Contributor

@youknowriad youknowriad commented Mar 7, 2023

Related to #37064 and #47348 and similar to #47356, #48636 and #48070

What?

A year ago now, I've opened a discussion in #37064 that proposes unifying the components that are used in the block inspector and global styles. The idea is that we'd have components that look like this:

function SomePanel( { value, onChange, inheritedValue } ) {

}

That component would render a panel used to edit a given style (say "typography" or "colors"), the value has a well specified prop (that is mapped over the "style" object of a block or a global style "node" ). The idea is that we could use that exact same panel in both places, the only difference is a wrapper that map the "value" to the right place:

  • block attributes for the block inspector
  • theme.json (global styles) for the global styles UI

Recently we realized this vision for the TypographyPanel, BorderPanel and DimensionsPanel and the current PR does the exact same thing for the ColorPanel and uses the new UI component for both inspector controls and global styles.

ColorPanel is the last panel to migrate but also probably the most complex one, unfortunately this PR turns out to be a bit big, and it's unclear whether we can split it into smaller PRs.

Since the goal of this PR is also to bring parity with Global Styles, It ended up including a new feature: You can now set "hover" colors for links within the block inspector.

To do

  • Figure out what to do with "heading" and "button" element colors and whether we want to add support for these to block "local" styles as well as "global styles".
  • Cleanup the styles of the components: Right now I've reused some classnames from other components. Ideally we'd find a way to use ItemGroup and Item and find a way to compose these components within PanelTools and PanelToolsItem. This would allow us to remove a bunch of CSS and classnames but I haven't found a decent way to do that. Maybe someone familiar with these PanelTools component could help here.
  • Test properly that there's no unexpected differences in behavior between this PR and trunk. (especially regarding the preset colors...)

Testing Instructions

  • you can test the "color" panels in global styles and ensure that they still work as expected.
  • you can also test the "color" panels in the block inspector.

@youknowriad youknowriad added [Type] Code Quality Issues or PRs that relate to code quality [Type] Feature New feature to highlight in changelogs. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Feature] Colors Color management labels Mar 7, 2023
@youknowriad youknowriad self-assigned this Mar 7, 2023
)
);
}

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 was surprised that I had to make changes to this file to make the "hover" colors styles work in the frontend. I thought they'd just work since we support them for Global Styles. I guess I'll have to do similar changes for heading and button elements which makes me think that there's probably a better way to avoid all this logic and rely on some existing code (style engine or whatever)

Copy link
Contributor

Choose a reason for hiding this comment

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

The style engine is currently naive about the selector to use, so it takes a style object and passes back styles using the selector it's given. This created a fairly clean separation between block supports and the style engine, while containing scope for the style engine project.

Perhaps, a bit like the typography block support, we could have a function in elements.php that is responsible for dealing with each of the potential element selectors, and then calls the style engine. At the moment that's this function, but it could probably be extended to deal with potential future elements. And we could then use that function in both global styles and at the block level.

For the moment, though, inlining an additional call to the style engine like this sounds good to me!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Maybe the style engine had two methods. The current naive one and what that takes a full "style" object and generate everything including selectors.

Copy link
Contributor

Choose a reason for hiding this comment

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

that takes a full "style" object and generate everything including selectors.

Good point — it'd be worth exploring!

@@ -163,7 +163,6 @@ export function BorderPanel( props ) {
<StylesBorderPanel
as={ BordersInspectorControl }
panelId={ clientId }
name={ name }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

These were just leftovers.

@@ -6,45 +6,20 @@ import { useState, useEffect } from '@wordpress/element';
/**
* Internal dependencies
*/
import ColorGradientSettingsDropdown from '../components/colors-gradients/dropdown';
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Unfortunately, I can't remove the old components as they're exposed and used in several core and third party blocks.

? props.attributes.style?.elements?.link?.[ ':hover' ]
: undefined,
selector: `.editor-styles-wrapper .${ blockElementsContainerIdentifier } ${ ELEMENTS.link }:hover`,
},
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Same as https://github.com/WordPress/gutenberg/pull/48893/files#r1128026980 Feels like this should be somehow part of style engine or whatever.

@github-actions
Copy link

github-actions bot commented Mar 7, 2023

Size Change: +971 B (0%)

Total Size: 1.34 MB

Filename Size Change
build/block-editor/index.min.js 200 kB +2.61 kB (+1%)
build/block-editor/style-rtl.css 14.5 kB +8 B (0%)
build/block-editor/style.css 14.5 kB +6 B (0%)
build/block-library/blocks/categories/editor-rtl.css 113 B +29 B (+35%) 🚨
build/block-library/blocks/categories/editor.css 112 B +29 B (+35%) 🚨
build/block-library/blocks/categories/style-rtl.css 124 B +24 B (+24%) 🚨
build/block-library/blocks/categories/style.css 124 B +24 B (+24%) 🚨
build/block-library/blocks/navigation/style-rtl.css 2.22 kB +6 B (0%)
build/block-library/blocks/navigation/style.css 2.21 kB +7 B (0%)
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B +2 B (0%)
build/block-library/blocks/post-featured-image/editor.css 586 B +2 B (0%)
build/block-library/blocks/post-template/style-rtl.css 281 B -1 B (0%)
build/block-library/blocks/post-template/style.css 281 B -1 B (0%)
build/block-library/editor-rtl.css 11.6 kB +9 B (0%)
build/block-library/editor.css 11.6 kB +8 B (0%)
build/block-library/index.min.js 202 kB +647 B (0%)
build/block-library/style-rtl.css 12.7 kB +13 B (0%)
build/block-library/style.css 12.7 kB +12 B (0%)
build/blocks/index.min.js 51.1 kB +4 B (0%)
build/components/style-rtl.css 11.7 kB +4 B (0%)
build/components/style.css 11.8 kB +4 B (0%)
build/edit-site/index.min.js 62.9 kB -2.3 kB (-4%)
build/edit-site/style-rtl.css 10.1 kB -83 B (-1%)
build/edit-site/style.css 10.1 kB -85 B (-1%)
build/plugins/index.min.js 1.94 kB -10 B (-1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.6 kB
build/block-library/blocks/cover/style.css 1.59 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 265 B
build/block-library/blocks/file/style.css 265 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 463 B
build/block-library/blocks/query/editor.css 463 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/index.min.js 208 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.62 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.8 kB
build/edit-post/style-rtl.css 7.59 kB
build/edit-post/style.css 7.58 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/index.min.js 45.8 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 937 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Mar 7, 2023

Flaky tests detected in efebb78.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4499088360
📝 Reported issues:

@youknowriad
Copy link
Contributor Author

I've added the "headings" and "buttons" colors to the color panel component. I noticed a problem though, for a reason that I can't explain, the "heading" and "button" buttons are not showing up. If I remove them from the "DEFAULT_CONTROLS", I can start adding them from the more menu but if they're made default controls, they are not shown at all. I think it's a bug in ToolsPanel component but I really don't understand it. Maybe @aaronrobertshaw or @ciampo would know.

@aaronrobertshaw
Copy link
Contributor

Thanks for tackling the colors panel @youknowriad, it's always been rather convoluted. When this PR is ready for final reviews it might help to have a bit of a breakdown around the new approach, what changes were made and why etc.

I noticed a problem though, for a reason that I can't explain, the "heading" and "button" buttons are not showing up

The hasElement function passed via the hasValue prop doesn't return a boolean as the hasValue prop requires. Tweaking that, makes the button and heading elements show up for me. I haven't had a chance to do any thorough testing yet but at first blush, it appears to work ok.

One possibility to guard against this might be to update the ToolsPanelItem to check for the item's property rather than the property !== undefined.

In addition, there were a couple of missing styles and props for the global styles panel.

I've taken the liberty to push a couple of commits to address these. Please feel free to revert or change anything you'd like to improve.

I can give this PR a closer look later this evening or early next week.

Nice work so far!

Screen.Recording.2023-03-10.at.11.30.19.am.mp4

@youknowriad
Copy link
Contributor Author

I've rebased the PR and added the new caption element. This is getting very close and I'd appreciate some reviews here. Thank you ❤️

@jasmussen
Copy link
Contributor

Nice work. Taking this for a spin just to compare with trunk, I'm focusing mostly on Global Styles → Colors. Text appears the same. Buttons appears the same. Headings appears the same.

headings after

It's coming into clarity that the text/heading hierarchy on this page is not that considered. The tabs for heading background are also awkwardly indented. So there are some larger design tweaks we can do, separately.

I think I'm missing something, though, because for links I see hover both in this PR and in trunk:

links after

I'm also seeing "Elements" in the main GS panel, instead of "Color" as Aaron appears to see. Did I test the PR right?

Screenshot 2023-03-21 at 13 06 04

@youknowriad
Copy link
Contributor Author

@jasmussen yeah I think there's something missing in your tests, are you sure everything built properly and all?

@jasmussen
Copy link
Contributor

Oh, I found it. In some testing I had deactivated the gb plugin. My apologies, as you were.

Here it's working:

status

Generally looking good. It's okay that these don't also have the palette picker drilldown, so long as the Palette option already exists. In fact on a separate note, we should only have the palette visible in GS > Colors, not in GS > Blocks > [Blockname] > Color:

Screenshot 2023-03-21 at 13 20 39

Two small glitches. Visible in the GIF, occasionally I could get the flyout to open in an awkward place. It seemed to be when clicking on or about the swatch inside the itemgroup:

Screenshot 2023-03-21 at 13 18 57

Not sure if that's from this branch or general.

Otherwise, this separator:
Screenshot 2023-03-21 at 13 19 05

Either it should go edge to edge left and right, or it should just be removed. Both would be fine.

@andrewserong
Copy link
Contributor

Either it should go edge to edge left and right, or it should just be removed. Both would be fine.

I noticed the separator, too. Looks like it might be unintentional for it to be there in global styles?

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.

Great work here so far! Aside from what Joen mentioned above, it's testing quite well for me. It took me a little while to find the h1 through h6 controls for adjusting colors for each of the different headings, but once I did, I really liked how compact it looks seeing them all lined up in the one list 👍

image


Just looking into some of the e2e failures, and it looks like the style variations test failures are because of losing the aria-label on the background color button elements.

Here's the visual difference between the two panels in trunk vs this PR

Trunk This PR
image image

And here's the difference in markup for the buttons

Trunk:

image

This PR (missing aria-label):

image

The test is currently looking for the text Colors background styles, but perhaps this could be updated to Background since there's no aria-label now? Or should we look at restoring the aria-label?

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Thanks for the continued effort here @youknowriad 👍

Ok. I've addressed all the issues I think aside the popover one.

I've given this another test.

All but one of the issues I raised in my last review has been resolved.

❓ Reset all now clears heading, button, caption etc styles. It doesn't however reset link hover colours correctly in either the block inspector or global styles.
✅ Contrast checker now displays when making a poor contrast selection and clears appropriately.
✅ The diagonal slash through empty color indicator is now shown correctly
✅ Incorrectly positioned color popover is appearing on trunk for me and not introduced in this PR.

Block Inspector Global Styles
Screen.Recording.2023-03-24.at.10.45.25.am.mp4
Screen.Recording.2023-03-24.at.10.47.31.am.mp4

@youknowriad
Copy link
Contributor Author

❓ Reset all now clears heading, button, caption etc styles. It doesn't however reset link hover colours correctly in either the block inspector or global styles.

Oh yeah, forgot about that one, thanks. It should be a quick fix.

@youknowriad
Copy link
Contributor Author

The link hover reset is fixed now.

@ciampo
Copy link
Contributor

ciampo commented Mar 24, 2023

Opened #49349 to track the Popover glitch

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.

Just took this for another spin, and it's looking in quite good shape! I only found one real issue, which looks like it should be a fairly simple fix 🤞

✅ Disable settings.color.heading works correctly
✅ Disable settings.color.button works correctly
✅ Disable settings.color.caption works correctly
✅ ContrastChecker now behaves as on trunk (it's a little flaky, but doesn't appear to be any flakier than on trunk)
✅ Setting / resetting individual color controls / reset all at the block level appears to work
✅ Setting / resetting individual color controls / reset all at the elements level in global styles appears to be working
✅ Setting / resetting individual color controls / reset all at the block level in global styles appears to be working
❓ The only real issue I encountered was with the color indicator not displaying gradient color for Background when set. This appears to be because TwentyTwentyThree theme sets a background color, so when a gradient is set, both values exist, and the background color is preferenced in this PR for the indicator over the gradient color. On trunk, I think it's the other way around.

Other than that, after reading through the code again, and with the known issue with the popover, I think this PR's looking in good shape! It's a challenging one to review given the size of the change, so it'd probably be good to get another approving review before landing it, just in case I've missed anything.

Also, there's probably an opportunity to consolidate or split out some of the logic in the ColorPanel component in follow-ups, as it's quite a long component. My main note there is that it might be good to see if we can improve the readability to make it easier to make subsequent changes.

For now, though, great work on all the consolidation efforts here, and for the persistence across each of these components and panels! ✨

lib/theme.json Outdated Show resolved Hide resolved
)
);
}

Copy link
Contributor

Choose a reason for hiding this comment

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

The style engine is currently naive about the selector to use, so it takes a style object and passes back styles using the selector it's given. This created a fairly clean separation between block supports and the style engine, while containing scope for the style engine project.

Perhaps, a bit like the typography block support, we could have a function in elements.php that is responsible for dealing with each of the potential element selectors, and then calls the style engine. At the moment that's this function, but it could probably be extended to deal with potential future elements. And we could then use that function in both global styles and at the block level.

For the moment, though, inlining an additional call to the style engine like this sounds good to me!

@@ -86,13 +86,13 @@ test.describe( 'Global styles variations', () => {

await expect(
page.locator(
'role=button[name="Colors background styles"i] >> data-testid=background-color-indicator'
'role=button[name="Background"i] >> .component-color-indicator'
Copy link
Member

Choose a reason for hiding this comment

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

Why do we have to use class name selectors here? Could we use role selectors or data-testid instead?

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 was expecting this comment :)

I preferred classnames for two reasons here:

  • First one, I don't like data-test-ids attributes when they linger on production code. I think we should avoid changes in production code that are only meant for testing. One potential solution would be to strip these in non test builds but not sure how to do that.
  • Second one is that the change in the structure of the component (more generic) means we can't specifically say that a particular indicator is "background" or other "text" unless we add extra props and extra complexity that I was not happy to add for test purposes.

Copy link
Member

Choose a reason for hiding this comment

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

Let's not start a conversation here about whether data-testid is a best practice in tests. We already have best practices guidelines committed to the repo, as well as all the tooling recommendations in the community (testing-library, playwright, etc), so I would expect us to follow them here :). You are more than welcome to open an issue or discussion and we can discuss further and rethink our best practices there!

Second one is that the change in the structure of the component (more generic) means we can't specifically say that a particular indicator is "background" or other "text" unless we add extra props and extra complexity that I was not happy to add for test purposes.

I'm afraid that I don't follow, could you provide me an example code of what you mean here?

Copy link
Contributor Author

@youknowriad youknowriad Mar 27, 2023

Choose a reason for hiding this comment

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

We pass an array of colors to the indicators component and we don't specificy which color is which. So there's no way I can say which indicator is background or text here.

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 wanted to open a PR to update the data test id best practice and I don't see it mentioned anywhere. Did I miss anything? Also, it seems it's the only place where it was used. So I guess now there's nothing to change for this?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This UI is the same UI we already had in the block inspector so I don't expect the UI to be completely inaccessible, that said a small bug is possible. I can reproduce the fact that the focus doesn't seem to jump within the popover when clicked. That said the label is there because buttons use the text content as label when there's no aria-label and I believe the text in these buttons is good enough to avoid aria-labels.

I'll look at the focus issue.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That was a bug in the TabPanel component that should be fixed with this PR #49368

Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks, appreciate the quick fix. I've merged that PR.

That said the label is there because buttons use the text content as label when there's no aria-label and I believe the text in these buttons is good enough to avoid aria-labels.

Accessibility is at least a bit better now that the popover content can be focused to check what the current color is.

It doesn't necessarily need an aria-label, I was thinking more along the lines of some extra hidden text (<VisuallyHidden>(current color: #FFF)<VisuallyHidden>). At the moment it'd be a bit of a frustrating process to determine which colors are used for each element if a user can't see them.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@talldan Yeah, I think that could be a nice addition, but the only labelled item is the whole button, so we need to generate a long description, something like:

<VisuallyHidden>
text color is #FFF, background color is #000, hover text color is #333 and background hover color is #666
</VisuallyHidden>

It needs to also understand gradients. So not a small addition.

Copy link
Contributor

Choose a reason for hiding this comment

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

Good point about gradients 😬

@youknowriad
Copy link
Contributor Author

The only real issue I encountered was with the color indicator not displaying gradient color for Background when set. This appears to be because TwentyTwentyThree theme sets a background color, so when a gradient is set, both values exist, and the background color is preferenced in this PR for the indicator over the gradient color. On trunk, I think it's the other way around.

Right! I actually was able to reproduce this issue on trunk too, it's fixed now on this branch.

@youknowriad
Copy link
Contributor Author

Thanks for the reviews folks, I'm going to merge this PR as I plan to work on small changes on top of it.

I'm happy to adapt in follow-up PRs if needed. I really appreciated the reviews as always.

style: cleanEmptyObject( updatedStyle ),
textColor: textColorSlug,
backgroundColor: backgroundColorSlug,
gradient: gradientSlug,
Copy link
Contributor

Choose a reason for hiding this comment

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

Are we purposely setting all the attributes at once in order to clean out any non-applicable ones, even if the block doesn't support those attributes? Asking because the question arose in #53941.

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 think that's the case but to be honest, it's an old PR so no precise memories at the moment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Colors Color management Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Type] Code Quality Issues or PRs that relate to code quality [Type] Feature New feature to highlight in changelogs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants