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

FontSizePicker: Replace SCSS with Emotion + components #44483

Merged
merged 5 commits into from
Sep 29, 2022

Conversation

noisysocks
Copy link
Member

@noisysocks noisysocks commented Sep 27, 2022

What?

Updates FontSizePicker to use Emotion + G2 components instead of SCSS.

Why?

One step closer to all of @wordpress/components using this styling system. Plus I'm about to make some changes to this component so nice to get the house in order first.

How?

I put The Black Parade on and got to work.

Testing Instructions

  1. Listen to emo music. (Do not skip this step.)
  2. npm run storybook:dev
  3. Everything in the FontSizePicker story should look and work the same as it does in wordpress.github.io/gutenberg.

@noisysocks noisysocks added [Type] Code Quality Issues or PRs that relate to code quality [Package] Components /packages/components labels Sep 27, 2022
@noisysocks noisysocks requested review from mirka and ciampo September 27, 2022 05:18
`;

// 280px is the sidebar width.
// TODO: Remove this, @wordpress/components shouldn't care what a "sidebar" is.
Copy link
Member Author

Choose a reason for hiding this comment

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

Didn't want to change the UI in this PR so will do this later.

@github-actions
Copy link

github-actions bot commented Sep 27, 2022

Size Change: -293 B (0%)

Total Size: 1.26 MB

Filename Size Change
build/block-editor/index.min.js 167 kB +3 B (0%)
build/block-library/blocks/post-terms/style-rtl.css 96 B +23 B (+32%) 🚨
build/block-library/blocks/post-terms/style.css 96 B +23 B (+32%) 🚨
build/block-library/index.min.js 191 kB -1 B (0%)
build/block-library/style-rtl.css 12.2 kB +8 B (0%)
build/block-library/style.css 12.2 kB +8 B (0%)
build/blocks/index.min.js 49.8 kB +18 B (0%)
build/components/index.min.js 199 kB +115 B (0%)
build/components/style-rtl.css 11.2 kB -244 B (-2%)
build/components/style.css 11.2 kB -245 B (-2%)
build/list-reusable-blocks/index.min.js 1.74 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.09 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 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 84 B
build/block-library/blocks/avatar/style.css 84 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 482 B
build/block-library/blocks/button/editor.css 482 B
build/block-library/blocks/button/style-rtl.css 523 B
build/block-library/blocks/button/style.css 523 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 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 187 B
build/block-library/blocks/comment-template/style.css 185 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 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/editor-rtl.css 605 B
build/block-library/blocks/cover/editor.css 607 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.55 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 126 B
build/block-library/blocks/embed/theme.css 126 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 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 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 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 384 B
build/block-library/blocks/group/editor.css 384 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 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 884 B
build/block-library/blocks/image/editor.css 882 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 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 213 B
build/block-library/blocks/latest-posts/editor.css 212 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 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 705 B
build/block-library/blocks/navigation-link/editor.css 703 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 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation-submenu/view.min.js 423 B
build/block-library/blocks/navigation/editor-rtl.css 2 kB
build/block-library/blocks/navigation/editor.css 2.01 kB
build/block-library/blocks/navigation/style-rtl.css 2.17 kB
build/block-library/blocks/navigation/style.css 2.16 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 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 317 B
build/block-library/blocks/paragraph/editor.css 317 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 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 493 B
build/block-library/blocks/post-comments-form/style.css 493 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 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 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 315 B
build/block-library/blocks/post-featured-image/style.css 315 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-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 282 B
build/block-library/blocks/query-pagination/style.css 278 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 439 B
build/block-library/blocks/query/editor.css 439 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 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 488 B
build/block-library/blocks/site-logo/editor.css 488 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 84 B
build/block-library/blocks/site-title/editor.css 84 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 322 B
build/block-library/blocks/spacer/editor.css 322 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 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 190 B
build/block-library/blocks/table/theme.css 190 B
build/block-library/blocks/tag-cloud/style-rtl.css 239 B
build/block-library/blocks/tag-cloud/style.css 239 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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 678 B
build/block-library/blocks/video/editor.css 681 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.02 kB
build/block-library/common.css 1.02 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.2 kB
build/block-library/editor.css 11.2 kB
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 719 B
build/block-library/theme.css 722 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/compose/index.min.js 12.5 kB
build/core-data/index.min.js 15.5 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.08 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.7 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.99 kB
build/edit-navigation/style.css 4 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 31.1 kB
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/index.min.js 57.6 kB
build/edit-site/style-rtl.css 8.36 kB
build/edit-site/style.css 8.34 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.34 kB
build/edit-widgets/style.css 4.34 kB
build/editor/index.min.js 41.6 kB
build/editor/style-rtl.css 3.62 kB
build/editor/style.css 3.61 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/experiments/index.min.js 868 B
build/format-library/index.min.js 6.77 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.83 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 963 B
build/nux/index.min.js 2.06 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 1.58 kB
build/react-i18n/index.min.js 696 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.74 kB
build/reusable-blocks/index.min.js 2.21 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.61 kB
build/shortcode/index.min.js 1.53 kB
build/style-engine/index.min.js 1.46 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 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 268 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.19 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@noisysocks noisysocks changed the title Replace SCSS with Emotion + components FontSizePicker: Replace SCSS with Emotion + components Sep 27, 2022
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 all the work in tackling the FontSizePicker refactor to TypeScript @noisysocks 🙇

I am likely missing some context regarding the goals for the FontSizePicker styling so take all the questions below with a grain of salt 🧂

Is there a reason we are favouring styled components here over dynamic classes?

Would it be better if the styles were responsible for applying a bottom margin or not rather than conditionally wrapping components?

Click for a quick and dirty example
diff --git a/packages/components/src/font-size-picker/index.tsx b/packages/components/src/font-size-picker/index.tsx
index 6172a1a695..c3673339ad 100644
--- a/packages/components/src/font-size-picker/index.tsx
+++ b/packages/components/src/font-size-picker/index.tsx
@@ -1,7 +1,7 @@
 /**
  * External dependencies
  */
-import type { ReactNode, ForwardedRef } from 'react';
+import type { ForwardedRef } from 'react';
 
 /**
  * WordPress dependencies
@@ -20,6 +20,7 @@ import { Flex, FlexItem } from '../flex';
 import { default as UnitControl, useCustomUnits } from '../unit-control';
 import CustomSelectControl from '../custom-select-control';
 import { VisuallyHidden } from '../visually-hidden';
+import { useCx } from '../utils/hooks/use-cx';
 import {
 	ToggleGroupControl,
 	ToggleGroupControlOption,
@@ -31,6 +32,7 @@ import {
 	isSimpleCssValue,
 	CUSTOM_FONT_SIZE,
 } from './utils';
+import { VStack } from '../v-stack';
 import { HStack } from '../h-stack';
 import type {
 	FontSizePickerProps,
@@ -41,24 +43,11 @@ import {
 	Container,
 	HeaderHint,
 	HeaderLabel,
-	Controls,
+	controls,
 	ResetButton,
 } from './styles';
 import { Spacer } from '../spacer';
 
-const MaybeMarginBottom = ( {
-	__nextHasNoMarginBottom,
-	children,
-}: {
-	__nextHasNoMarginBottom: boolean;
-	children: ReactNode;
-} ) =>
-	__nextHasNoMarginBottom ? (
-		<>{ children }</>
-	) : (
-		<Spacer marginBottom={ 6 }>{ children }</Spacer>
-	);
-
 const UnforwardedFontSizePicker = (
 	props: FontSizePickerProps,
 	ref: ForwardedRef< any >
@@ -83,6 +72,14 @@ const UnforwardedFontSizePicker = (
 		} );
 	}
 
+	const cx = useCx();
+	const controlsClassName = useMemo( () => {
+		return cx(
+			controls( __nextHasNoMarginBottom ),
+			'components-font-size-picker__controls'
+		);
+	}, [ cx, __nextHasNoMarginBottom ] );
+
 	const hasUnits = [ typeof value, typeof fontSizes?.[ 0 ]?.size ].includes(
 		'string'
 	);
@@ -199,149 +196,132 @@ const UnforwardedFontSizePicker = (
 					) }
 				</HStack>
 			</Spacer>
-			<MaybeMarginBottom
-				__nextHasNoMarginBottom={ __nextHasNoMarginBottom }
-			>
-				<Controls
-					className="components-font-size-picker__controls"
-					spacing={ 6 }
-				>
-					{ !! fontSizes.length &&
-						shouldUseSelectControl &&
-						! showCustomValueControl && (
-							<CustomSelectControl
-								__nextUnconstrainedWidth
-								className="components-font-size-picker__select"
-								label={ __( 'Font size' ) }
-								hideLabelFromVision
-								describedBy={ currentFontSizeSR }
-								options={ options as FontSizeSelectOption[] }
-								value={ (
-									options as FontSizeSelectOption[]
-								 ).find(
-									( option ) =>
-										option.key === selectedOption.slug
-								) }
-								onChange={ ( {
-									selectedItem,
-								}: {
-									selectedItem: FontSizeSelectOption;
-								} ) => {
-									onChange?.(
-										hasUnits
-											? selectedItem.size
-											: Number( selectedItem.size )
-									);
-									if (
-										selectedItem.key === CUSTOM_FONT_SIZE
-									) {
-										setShowCustomValueControl( true );
-									}
-								} }
-								size={ size }
-							/>
-						) }
-					{ ! shouldUseSelectControl && ! showCustomValueControl && (
-						<ToggleGroupControl
-							__nextHasNoMarginBottom
+			<VStack className={ controlsClassName } spacing={ 6 }>
+				{ !! fontSizes.length &&
+					shouldUseSelectControl &&
+					! showCustomValueControl && (
+						<CustomSelectControl
+							__nextUnconstrainedWidth
+							className="components-font-size-picker__select"
 							label={ __( 'Font size' ) }
 							hideLabelFromVision
-							value={ value }
-							onChange={ ( newValue ) => {
+							describedBy={ currentFontSizeSR }
+							options={ options as FontSizeSelectOption[] }
+							value={ ( options as FontSizeSelectOption[] ).find(
+								( option ) => option.key === selectedOption.slug
+							) }
+							onChange={ ( {
+								selectedItem,
+							}: {
+								selectedItem: FontSizeSelectOption;
+							} ) => {
 								onChange?.(
-									hasUnits ? newValue : Number( newValue )
+									hasUnits
+										? selectedItem.size
+										: Number( selectedItem.size )
 								);
+								if ( selectedItem.key === CUSTOM_FONT_SIZE ) {
+									setShowCustomValueControl( true );
+								}
 							} }
-							isBlock
 							size={ size }
-						>
-							{ ( options as FontSizeToggleGroupOption[] ).map(
-								( option ) => (
-									<ToggleGroupControlOption
-										key={ option.key }
-										value={ option.value }
-										label={ option.label }
-										aria-label={ option.name }
-										showTooltip={ true }
-									/>
-								)
-							) }
-						</ToggleGroupControl>
+						/>
 					) }
-					{ ! withSlider &&
-						! disableCustomFontSizes &&
-						showCustomValueControl && (
-							<Flex
-								justify="space-between"
-								className="components-font-size-picker__custom-size-control"
-							>
+				{ ! shouldUseSelectControl && ! showCustomValueControl && (
+					<ToggleGroupControl
+						__nextHasNoMarginBottom
+						label={ __( 'Font size' ) }
+						hideLabelFromVision
+						value={ value }
+						onChange={ ( newValue ) => {
+							onChange?.(
+								hasUnits ? newValue : Number( newValue )
+							);
+						} }
+						isBlock
+						size={ size }
+					>
+						{ ( options as FontSizeToggleGroupOption[] ).map(
+							( option ) => (
+								<ToggleGroupControlOption
+									key={ option.key }
+									value={ option.value }
+									label={ option.label }
+									aria-label={ option.name }
+									showTooltip={ true }
+								/>
+							)
+						) }
+					</ToggleGroupControl>
+				) }
+				{ ! withSlider &&
+					! disableCustomFontSizes &&
+					showCustomValueControl && (
+						<Flex
+							justify="space-between"
+							className="components-font-size-picker__custom-size-control"
+						>
+							<FlexItem isBlock>
+								<UnitControl
+									label={ __( 'Custom' ) }
+									labelPosition="top"
+									hideLabelFromVision
+									value={ value }
+									onChange={ ( nextSize ) => {
+										if (
+											! nextSize ||
+											0 === parseFloat( nextSize )
+										) {
+											onChange?.( undefined );
+										} else {
+											onChange?.(
+												hasUnits
+													? nextSize
+													: parseInt( nextSize, 10 )
+											);
+										}
+									} }
+									size={ size }
+									units={ hasUnits ? units : [] }
+								/>
+							</FlexItem>
+							{ withReset && (
 								<FlexItem isBlock>
-									<UnitControl
-										label={ __( 'Custom' ) }
-										labelPosition="top"
-										hideLabelFromVision
-										value={ value }
-										onChange={ ( nextSize ) => {
-											if (
-												! nextSize ||
-												0 === parseFloat( nextSize )
-											) {
-												onChange?.( undefined );
-											} else {
-												onChange?.(
-													hasUnits
-														? nextSize
-														: parseInt(
-																nextSize,
-																10
-														  )
-												);
-											}
+									<ResetButton
+										className="components-color-palette__clear"
+										disabled={ value === undefined }
+										onClick={ () => {
+											onChange?.( undefined );
 										} }
+										isSmall
+										variant="secondary"
 										size={ size }
-										units={ hasUnits ? units : [] }
-									/>
+									>
+										{ __( 'Reset' ) }
+									</ResetButton>
 								</FlexItem>
-								{ withReset && (
-									<FlexItem isBlock>
-										<ResetButton
-											className="components-color-palette__clear"
-											disabled={ value === undefined }
-											onClick={ () => {
-												onChange?.( undefined );
-											} }
-											isSmall
-											variant="secondary"
-											size={ size }
-										>
-											{ __( 'Reset' ) }
-										</ResetButton>
-									</FlexItem>
-								) }
-							</Flex>
-						) }
-					{ withSlider && (
-						<RangeControl
-							__nextHasNoMarginBottom
-							className="components-font-size-picker__custom-input"
-							label={ __( 'Custom Size' ) }
-							value={
-								isPixelValue && noUnitsValue
-									? Number( noUnitsValue )
-									: undefined
-							}
-							initialPosition={ fallbackFontSize }
-							onChange={ ( newValue ) => {
-								onChange?.(
-									hasUnits ? newValue + 'px' : newValue
-								);
-							} }
-							min={ 12 }
-							max={ 100 }
-						/>
+							) }
+						</Flex>
 					) }
-				</Controls>
-			</MaybeMarginBottom>
+				{ withSlider && (
+					<RangeControl
+						__nextHasNoMarginBottom
+						className="components-font-size-picker__custom-input"
+						label={ __( 'Custom Size' ) }
+						value={
+							isPixelValue && noUnitsValue
+								? Number( noUnitsValue )
+								: undefined
+						}
+						initialPosition={ fallbackFontSize }
+						onChange={ ( newValue ) => {
+							onChange?.( hasUnits ? newValue + 'px' : newValue );
+						} }
+						min={ 12 }
+						max={ 100 }
+					/>
+				) }
+			</VStack>
 		</Container>
 	);
 };
diff --git a/packages/components/src/font-size-picker/styles.ts b/packages/components/src/font-size-picker/styles.ts
index 5354d78844..a80e8c396a 100644
--- a/packages/components/src/font-size-picker/styles.ts
+++ b/packages/components/src/font-size-picker/styles.ts
@@ -2,6 +2,7 @@
  * External dependencies
  */
 import styled from '@emotion/styled';
+import { css } from '@emotion/react';
 
 /**
  * Internal dependencies
@@ -10,7 +11,6 @@ import BaseControl from '../base-control';
 import Button from '../button';
 import { space } from '../ui/utils/space';
 import { COLORS } from '../utils';
-import { VStack } from '../v-stack';
 import type { FontSizePickerProps } from './types';
 
 export const Container = styled.fieldset`
@@ -30,8 +30,9 @@ export const HeaderHint = styled.span`
 
 // 280px is the sidebar width.
 // TODO: Remove this, @wordpress/components shouldn't care what a "sidebar" is.
-export const Controls = styled( VStack )`
+export const controls = ( hasNoMarginBottom?: boolean ) => css`
 	max-width: calc( 280px - ${ space( 4 ) } * 2 );
+	margin-bottom: ${ hasNoMarginBottom ? 0 : space( 6 ) };
 `;
 
 export const ResetButton = styled( Button )< {

I'm sure @ciampo or @mirka would have a more informed opinion on this.

EDIT from @ciampo: adding lena's correct GitHub handle

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

As also written in an inline comment, the fact that we don't pass __nextHasNoMarginBottom anymore down to child components, and instead we rely on layout specific to this component means that, if we ever change the margin bottom on ToggleGroupControl or RangeControl, those new margins won't be reflected in FontSizePicker. I would, therefore, personally prefer an approach for this PR that doesn't refactor the DOM structure / layout strategy of the component (or that at least forwards __nextHasNoMarginBottom down to children components)

Would it be better if the styles were responsible for applying a bottom margin or not rather than conditionally wrapping components?

I believe this was Lena's approach, but I'm personally not opposed to using classnames as an alternative.

I also spotted 2 differences compared to trunk:

  1. When size='__unstable-large', the Reset button on trunk still looks shorter, while on this PR it matches the input's height. I may remember incorrectly, but I think this was on purpose (as we haven't yet introduced new size presets to Button)
trunk this PR
Screenshot 2022-09-27 at 14 26 29 Screenshot 2022-09-27 at 14 26 42
  1. The custom font size slider should be full width, while it's not in this PR
trunk this PR
Screenshot 2022-09-27 at 14 27 21 Screenshot 2022-09-27 at 14 27 14

packages/components/src/font-size-picker/index.tsx Outdated Show resolved Hide resolved
packages/components/src/font-size-picker/index.tsx Outdated Show resolved Hide resolved
@noisysocks
Copy link
Member Author

Is there a reason we are favouring styled components here over dynamic classes?

They both achieve the same result and in fact the styled() API uses useCx internally. We have examples of both approaches within Gutenberg. I don't think we have guidance one way or another so it comes down to developer preference. I personally prefer using styled() as I find the cx boilerplate to be distracting. I like it when code reads like English and it's tough to do that when there's a bunch of cxs littered throughout the "sentence".

Would it be better if the styles were responsible for applying a bottom margin or not rather than conditionally wrapping components?

I wanted to use Spacer, VStack, etc. as much as possible because it's nice when we can implement new components using existing components and not write any CSS at all.

As also written in an inline comment, the fact that we don't pass __nextHasNoMarginBottom anymore down to child components, and instead we rely on layout specific to this component means that, if we ever change the margin bottom on ToggleGroupControl or RangeControl, those new margins won't be reflected in FontSizePicker.

When __nextHasNoMarginBottom is set, changing the margin-bottom on ToggleGroupControl or RangeControl won't have an affect on FontSizePicker anyway because those components will be in a VStack which ignores margins.

But yeah ok I'll change this back so that the margin comes from ToggleGroupControl and RangeControl when __nextHasNoMarginBottom is not set 👍

When size='__unstable-large', the Reset button on trunk still looks shorter, while on this PR it matches the input's height. I may remember incorrectly, but I think this was on purpose (as we haven't yet introduced new size presets to Button)

I noticed that the Reset button has a custom height so thought that I may as well make this custom height respect __unstable-large so that it looks less weird. Happy to not do this if you prefer. We won't use the Reset button after #44180 so it's of no real consequence either way.

The custom font size slider should be full width, while it's not in this PR

Good catch, will look into that 👍

@noisysocks
Copy link
Member Author

OK try that @ciampo. I couldn't confirm that that second issue is fixed using the snapshot tests. For some reason they pass locally for me even though I know there should be an error (the Reset button height).

Base automatically changed from add/types-to-font-size-picker to trunk September 28, 2022 06:44
@noisysocks noisysocks force-pushed the update/font-size-picker-to-use-emotion branch from 35d7b32 to 331f1f7 Compare September 28, 2022 06:47
@noisysocks noisysocks self-assigned this Sep 28, 2022
Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

I wanted to use Spacer, VStack, etc. as much as possible because it's nice when we can implement new components using existing components and not write any CSS at all.

I definitely see your point and you're right in saying that we should aim for using our layout components instead of writing custom CSS — in this case, though, I'd rather keep the "layout logic" as on trunk to keep this PR focus on the Emotion refactor, and also because most of the "legacy layout" should go away soon anyway, as we remove __nextHasNoMarginBottom and force all components not to have an outer margin bottom out of the box.

I noticed that the Reset button has a custom height so thought that I may as well make this custom height respect __unstable-large so that it looks less weird. Happy to not do this if you prefer. We won't use the Reset button after #44180 so it's of no real consequence either way.

I also think that it looks weird, but my preference would be to keep the height of Reset button the same as on trunk (i.e. always 30px regardless of the size prop). We can always tackle it separately in the future and keep this PR focused on the refactor to Emotion (cc @mirka )

Finally, while testing changes from this PR I realized that HeaderLabel currently doesn't support RTL languages as expected (the hint should be rendered to the left of "Size") — although this is also an issue on trunk and can definitely be improved in a follow-up PR, if you prefer so.

Screenshot 2022-09-28 at 09 54 46


In short: we can merge once the Reset button height is adjusted to how it currently is on trunk (and once the Black Parade is over)

@noisysocks
Copy link
Member Author

Sounds good! I made the Reset button 30px again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants