Skip to content

AnglePickerColor: migrate Emotion to style.module#73786

Merged
jsnajdr merged 5 commits into
trunkfrom
remove/emotion-ang-picker-ctrl
Dec 9, 2025
Merged

AnglePickerColor: migrate Emotion to style.module#73786
jsnajdr merged 5 commits into
trunkfrom
remove/emotion-ang-picker-ctrl

Conversation

@jsnajdr
Copy link
Copy Markdown
Member

@jsnajdr jsnajdr commented Dec 5, 2025

Migrates the AnglePickerColor component from Emotion to a style.module.scss style.

I did the migration with the following Cursor prompt:

Migrate the AnglePickerControl styles away from Emotion and put them into a style.module.scss file instead. Then use the exported mangled classnames for React elements.

When possible, don't create separate components that are just styled divs. Inline the

element directly into the usage site.

How to migrate interpolation: for local variables, just hardcode them. For the COLORS values, replace them with SCSS variables from theme-variables etc.

After reviewing the results, I had to add several additional clarifications:

  • use kebab case (circle-root etc) for class names.
  • when migrating the space( n ) helper, use the appropriate $grid-unit-X constant.
  • if the style element already has an additional class name, like components-something, verify if that class name is really used in CSS styles. Remove it if it isn't.

@jsnajdr jsnajdr self-assigned this Dec 5, 2025
@jsnajdr jsnajdr requested a review from ajitbohra as a code owner December 5, 2025 11:14
@jsnajdr jsnajdr added [Type] Code Quality Issues or PRs that relate to code quality [Package] Components /packages/components labels Dec 5, 2025
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Dec 5, 2025

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: jsnajdr <[email protected]>
Co-authored-by: mirka <[email protected]>
Co-authored-by: Mamaduka <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@jsnajdr jsnajdr force-pushed the remove/emotion-ang-picker-ctrl branch from 066b192 to f76881d Compare December 5, 2025 11:14
<div
ref={ angleCircleRef }
onMouseDown={ startDrag }
className="components-angle-picker-control__angle-circle"
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

All the components-angle-picker-control-* class names are unused, so I removed them.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We've been keeping all these for back compat, unfortunately 😅

For example:

<DayInput
key="day"
className="components-datetime__time-field components-datetime__time-field-day" // Unused, for backwards compatibility.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

OK I brought the class names back 🙂 When they are together with the module classes in one clsx call, they suddently start looking very suspicious and redundant 🙂

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Dec 5, 2025

Size Change: +566 B (+0.02%)

Total Size: 2.57 MB

Filename Size Change
build/scripts/components/index.min.js 273 kB +566 B (+0.21%)
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 549 B
build/modules/block-library/accordion/view.min.js 779 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 1.95 kB
build/modules/block-library/navigation/view.min.js 1.03 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 859 B
build/modules/boot/index.min.js 102 kB
build/modules/core-abilities/index.min.js 890 B
build/modules/edit-site-init/index.min.js 1.41 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.5 kB
build/modules/interactivity/index.min.js 14.9 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 18.8 kB
build/modules/route/index.min.js 24.6 kB
build/modules/workflow/index.min.js 36.8 kB
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/annotations/index.min.js 2.38 kB
build/scripts/api-fetch/index.min.js 2.83 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/blob/index.min.js 631 B
build/scripts/block-directory/index.min.js 8.03 kB
build/scripts/block-editor/index.min.js 314 kB
build/scripts/block-library/index.min.js 277 kB
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/blocks/index.min.js 56.4 kB
build/scripts/commands/index.min.js 19.9 kB
build/scripts/compose/index.min.js 13.9 kB
build/scripts/core-commands/index.min.js 4.13 kB
build/scripts/core-data/index.min.js 86.7 kB
build/scripts/customize-widgets/index.min.js 12.3 kB
build/scripts/data-controls/index.min.js 793 B
build/scripts/data/index.min.js 9.62 kB
build/scripts/date/index.min.js 23.6 kB
build/scripts/deprecated/index.min.js 752 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/dom/index.min.js 4.91 kB
build/scripts/edit-post/index.min.js 16.3 kB
build/scripts/edit-site/index.min.js 234 kB
build/scripts/edit-widgets/index.min.js 20 kB
build/scripts/editor/index.min.js 284 kB
build/scripts/element/index.min.js 5.19 kB
build/scripts/escape-html/index.min.js 586 B
build/scripts/format-library/index.min.js 10.8 kB
build/scripts/hooks/index.min.js 1.83 kB
build/scripts/html-entities/index.min.js 494 B
build/scripts/i18n/index.min.js 2.46 kB
build/scripts/is-shallow-equal/index.min.js 568 B
build/scripts/keyboard-shortcuts/index.min.js 1.57 kB
build/scripts/keycodes/index.min.js 1.53 kB
build/scripts/list-reusable-blocks/index.min.js 2.44 kB
build/scripts/media-utils/index.min.js 69.5 kB
build/scripts/notices/index.min.js 1.11 kB
build/scripts/nux/index.min.js 1.88 kB
build/scripts/patterns/index.min.js 7.88 kB
build/scripts/plugins/index.min.js 2.14 kB
build/scripts/preferences-persistence/index.min.js 2.15 kB
build/scripts/preferences/index.min.js 3.31 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.61 kB
build/scripts/private-apis/index.min.js 1.06 kB
build/scripts/react-i18n/index.min.js 832 B
build/scripts/react-refresh-entry/index.min.js 9.44 kB
build/scripts/react-refresh-runtime/index.min.js 3.59 kB
build/scripts/redux-routine/index.min.js 3.36 kB
build/scripts/reusable-blocks/index.min.js 2.93 kB
build/scripts/rich-text/index.min.js 12.9 kB
build/scripts/router/index.min.js 5.96 kB
build/scripts/server-side-render/index.min.js 1.91 kB
build/scripts/shortcode/index.min.js 1.58 kB
build/scripts/style-engine/index.min.js 2.33 kB
build/scripts/theme/index.min.js 20.8 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 917 B
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43 kB
build/scripts/vendors/react-jsx-runtime.min.js 691 B
build/scripts/vendors/react.min.js 4.27 kB
build/scripts/viewport/index.min.js 1.22 kB
build/scripts/warning/index.min.js 454 B
build/scripts/widgets/index.min.js 7.81 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/block-directory/style-rtl.css 1.05 kB
build/styles/block-directory/style.css 1.05 kB
build/styles/block-editor/content-rtl.css 4.8 kB
build/styles/block-editor/content.css 4.79 kB
build/styles/block-editor/default-editor-styles-rtl.css 224 B
build/styles/block-editor/default-editor-styles.css 224 B
build/styles/block-editor/style-rtl.css 16.4 kB
build/styles/block-editor/style.css 16.4 kB
build/styles/block-library/accordion-heading/style-rtl.css 325 B
build/styles/block-library/accordion-heading/style.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 180 B
build/styles/block-library/accordion-item/style.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 99 B
build/styles/block-library/accordion-panel/style.css 99 B
build/styles/block-library/accordion/style-rtl.css 62 B
build/styles/block-library/accordion/style.css 62 B
build/styles/block-library/archives/editor-rtl.css 61 B
build/styles/block-library/archives/editor.css 61 B
build/styles/block-library/archives/style-rtl.css 90 B
build/styles/block-library/archives/style.css 90 B
build/styles/block-library/audio/editor-rtl.css 149 B
build/styles/block-library/audio/editor.css 151 B
build/styles/block-library/audio/style-rtl.css 132 B
build/styles/block-library/audio/style.css 132 B
build/styles/block-library/audio/theme-rtl.css 134 B
build/styles/block-library/audio/theme.css 134 B
build/styles/block-library/avatar/editor-rtl.css 115 B
build/styles/block-library/avatar/editor.css 115 B
build/styles/block-library/avatar/style-rtl.css 104 B
build/styles/block-library/avatar/style.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 203 B
build/styles/block-library/breadcrumbs/style.css 203 B
build/styles/block-library/button/editor-rtl.css 265 B
build/styles/block-library/button/editor.css 265 B
build/styles/block-library/button/style-rtl.css 554 B
build/styles/block-library/button/style.css 554 B
build/styles/block-library/buttons/editor-rtl.css 291 B
build/styles/block-library/buttons/editor.css 291 B
build/styles/block-library/buttons/style-rtl.css 349 B
build/styles/block-library/buttons/style.css 349 B
build/styles/block-library/calendar/style-rtl.css 239 B
build/styles/block-library/calendar/style.css 239 B
build/styles/block-library/categories/editor-rtl.css 132 B
build/styles/block-library/categories/editor.css 131 B
build/styles/block-library/categories/style-rtl.css 152 B
build/styles/block-library/categories/style.css 152 B
build/styles/block-library/classic-rtl.css 321 B
build/styles/block-library/classic.css 321 B
build/styles/block-library/code/editor-rtl.css 53 B
build/styles/block-library/code/editor.css 53 B
build/styles/block-library/code/style-rtl.css 139 B
build/styles/block-library/code/style.css 139 B
build/styles/block-library/code/theme-rtl.css 122 B
build/styles/block-library/code/theme.css 122 B
build/styles/block-library/columns/editor-rtl.css 108 B
build/styles/block-library/columns/editor.css 108 B
build/styles/block-library/columns/style-rtl.css 421 B
build/styles/block-library/columns/style.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 72 B
build/styles/block-library/comment-author-name/style.css 72 B
build/styles/block-library/comment-content/style-rtl.css 120 B
build/styles/block-library/comment-content/style.css 120 B
build/styles/block-library/comment-date/style-rtl.css 65 B
build/styles/block-library/comment-date/style.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 70 B
build/styles/block-library/comment-edit-link/style.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 71 B
build/styles/block-library/comment-reply-link/style.css 71 B
build/styles/block-library/comment-template/style-rtl.css 191 B
build/styles/block-library/comment-template/style.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 168 B
build/styles/block-library/comments-pagination/editor.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 201 B
build/styles/block-library/comments-pagination/style.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 75 B
build/styles/block-library/comments-title/editor.css 75 B
build/styles/block-library/comments/editor-rtl.css 842 B
build/styles/block-library/comments/editor.css 842 B
build/styles/block-library/comments/style-rtl.css 637 B
build/styles/block-library/comments/style.css 637 B
build/styles/block-library/common-rtl.css 1.11 kB
build/styles/block-library/common.css 1.11 kB
build/styles/block-library/cover/editor-rtl.css 631 B
build/styles/block-library/cover/editor.css 631 B
build/styles/block-library/cover/style-rtl.css 1.82 kB
build/styles/block-library/cover/style.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 65 B
build/styles/block-library/details/editor.css 65 B
build/styles/block-library/details/style-rtl.css 86 B
build/styles/block-library/details/style.css 86 B
build/styles/block-library/editor-elements-rtl.css 75 B
build/styles/block-library/editor-elements.css 75 B
build/styles/block-library/editor-rtl.css 11.8 kB
build/styles/block-library/editor.css 11.8 kB
build/styles/block-library/elements-rtl.css 54 B
build/styles/block-library/elements.css 54 B
build/styles/block-library/embed/editor-rtl.css 331 B
build/styles/block-library/embed/editor.css 331 B
build/styles/block-library/embed/style-rtl.css 448 B
build/styles/block-library/embed/style.css 448 B
build/styles/block-library/embed/theme-rtl.css 133 B
build/styles/block-library/embed/theme.css 133 B
build/styles/block-library/file/editor-rtl.css 324 B
build/styles/block-library/file/editor.css 324 B
build/styles/block-library/file/style-rtl.css 278 B
build/styles/block-library/file/style.css 278 B
build/styles/block-library/footnotes/style-rtl.css 198 B
build/styles/block-library/footnotes/style.css 197 B
build/styles/block-library/form-input/editor-rtl.css 229 B
build/styles/block-library/form-input/editor.css 229 B
build/styles/block-library/form-input/style-rtl.css 366 B
build/styles/block-library/form-input/style.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 344 B
build/styles/block-library/form-submission-notification/editor.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 69 B
build/styles/block-library/form-submit-button/style.css 69 B
build/styles/block-library/freeform/editor-rtl.css 2.59 kB
build/styles/block-library/freeform/editor.css 2.59 kB
build/styles/block-library/gallery/editor-rtl.css 615 B
build/styles/block-library/gallery/editor.css 616 B
build/styles/block-library/gallery/style-rtl.css 1.84 kB
build/styles/block-library/gallery/style.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 108 B
build/styles/block-library/gallery/theme.css 108 B
build/styles/block-library/group/editor-rtl.css 335 B
build/styles/block-library/group/editor.css 335 B
build/styles/block-library/group/style-rtl.css 103 B
build/styles/block-library/group/style.css 103 B
build/styles/block-library/group/theme-rtl.css 79 B
build/styles/block-library/group/theme.css 79 B
build/styles/block-library/heading/style-rtl.css 205 B
build/styles/block-library/heading/style.css 205 B
build/styles/block-library/html/editor-rtl.css 419 B
build/styles/block-library/html/editor.css 419 B
build/styles/block-library/image/editor-rtl.css 763 B
build/styles/block-library/image/editor.css 763 B
build/styles/block-library/image/style-rtl.css 1.6 kB
build/styles/block-library/image/style.css 1.59 kB
build/styles/block-library/image/theme-rtl.css 137 B
build/styles/block-library/image/theme.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 355 B
build/styles/block-library/latest-comments/style.css 354 B
build/styles/block-library/latest-posts/editor-rtl.css 139 B
build/styles/block-library/latest-posts/editor.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 520 B
build/styles/block-library/latest-posts/style.css 520 B
build/styles/block-library/list/style-rtl.css 107 B
build/styles/block-library/list/style.css 107 B
build/styles/block-library/loginout/style-rtl.css 61 B
build/styles/block-library/loginout/style.css 61 B
build/styles/block-library/math/editor-rtl.css 105 B
build/styles/block-library/math/editor.css 105 B
build/styles/block-library/math/style-rtl.css 61 B
build/styles/block-library/math/style.css 61 B
build/styles/block-library/media-text/editor-rtl.css 321 B
build/styles/block-library/media-text/editor.css 320 B
build/styles/block-library/media-text/style-rtl.css 543 B
build/styles/block-library/media-text/style.css 542 B
build/styles/block-library/more/editor-rtl.css 393 B
build/styles/block-library/more/editor.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 645 B
build/styles/block-library/navigation-link/editor.css 647 B
build/styles/block-library/navigation-link/style-rtl.css 190 B
build/styles/block-library/navigation-link/style.css 188 B
build/styles/block-library/navigation-submenu/editor-rtl.css 295 B
build/styles/block-library/navigation-submenu/editor.css 294 B
build/styles/block-library/navigation/editor-rtl.css 2.24 kB
build/styles/block-library/navigation/editor.css 2.24 kB
build/styles/block-library/navigation/style-rtl.css 2.27 kB
build/styles/block-library/navigation/style.css 2.25 kB
build/styles/block-library/nextpage/editor-rtl.css 392 B
build/styles/block-library/nextpage/editor.css 392 B
build/styles/block-library/page-list/editor-rtl.css 356 B
build/styles/block-library/page-list/editor.css 356 B
build/styles/block-library/page-list/style-rtl.css 192 B
build/styles/block-library/page-list/style.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 251 B
build/styles/block-library/paragraph/editor.css 251 B
build/styles/block-library/paragraph/style-rtl.css 341 B
build/styles/block-library/paragraph/style.css 340 B
build/styles/block-library/post-author-biography/style-rtl.css 74 B
build/styles/block-library/post-author-biography/style.css 74 B
build/styles/block-library/post-author-name/style-rtl.css 69 B
build/styles/block-library/post-author-name/style.css 69 B
build/styles/block-library/post-author/style-rtl.css 188 B
build/styles/block-library/post-author/style.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 72 B
build/styles/block-library/post-comments-count/style.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 96 B
build/styles/block-library/post-comments-form/editor.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 525 B
build/styles/block-library/post-comments-form/style.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 71 B
build/styles/block-library/post-comments-link/style.css 71 B
build/styles/block-library/post-content/style-rtl.css 61 B
build/styles/block-library/post-content/style.css 61 B
build/styles/block-library/post-date/style-rtl.css 62 B
build/styles/block-library/post-date/style.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 71 B
build/styles/block-library/post-excerpt/editor.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 155 B
build/styles/block-library/post-excerpt/style.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 719 B
build/styles/block-library/post-featured-image/editor.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 347 B
build/styles/block-library/post-featured-image/style.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 215 B
build/styles/block-library/post-navigation-link/style.css 214 B
build/styles/block-library/post-template/style-rtl.css 414 B
build/styles/block-library/post-template/style.css 414 B
build/styles/block-library/post-terms/style-rtl.css 96 B
build/styles/block-library/post-terms/style.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 70 B
build/styles/block-library/post-time-to-read/style.css 70 B
build/styles/block-library/post-title/style-rtl.css 162 B
build/styles/block-library/post-title/style.css 162 B
build/styles/block-library/preformatted/style-rtl.css 125 B
build/styles/block-library/preformatted/style.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 133 B
build/styles/block-library/pullquote/editor.css 133 B
build/styles/block-library/pullquote/style-rtl.css 365 B
build/styles/block-library/pullquote/style.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 176 B
build/styles/block-library/pullquote/theme.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 154 B
build/styles/block-library/query-pagination/editor.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 237 B
build/styles/block-library/query-pagination/style.css 237 B
build/styles/block-library/query-title/style-rtl.css 64 B
build/styles/block-library/query-title/style.css 64 B
build/styles/block-library/query-total/style-rtl.css 64 B
build/styles/block-library/query-total/style.css 64 B
build/styles/block-library/query/editor-rtl.css 438 B
build/styles/block-library/query/editor.css 438 B
build/styles/block-library/quote/style-rtl.css 238 B
build/styles/block-library/quote/style.css 238 B
build/styles/block-library/quote/theme-rtl.css 233 B
build/styles/block-library/quote/theme.css 236 B
build/styles/block-library/read-more/style-rtl.css 131 B
build/styles/block-library/read-more/style.css 131 B
build/styles/block-library/reset-rtl.css 472 B
build/styles/block-library/reset.css 472 B
build/styles/block-library/rss/editor-rtl.css 126 B
build/styles/block-library/rss/editor.css 126 B
build/styles/block-library/rss/style-rtl.css 284 B
build/styles/block-library/rss/style.css 283 B
build/styles/block-library/search/editor-rtl.css 199 B
build/styles/block-library/search/editor.css 199 B
build/styles/block-library/search/style-rtl.css 665 B
build/styles/block-library/search/style.css 666 B
build/styles/block-library/search/theme-rtl.css 113 B
build/styles/block-library/search/theme.css 113 B
build/styles/block-library/separator/editor-rtl.css 100 B
build/styles/block-library/separator/editor.css 100 B
build/styles/block-library/separator/style-rtl.css 248 B
build/styles/block-library/separator/style.css 248 B
build/styles/block-library/separator/theme-rtl.css 195 B
build/styles/block-library/separator/theme.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 286 B
build/styles/block-library/shortcode/editor.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 773 B
build/styles/block-library/site-logo/editor.css 770 B
build/styles/block-library/site-logo/style-rtl.css 218 B
build/styles/block-library/site-logo/style.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 87 B
build/styles/block-library/site-tagline/editor.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 65 B
build/styles/block-library/site-tagline/style.css 65 B
build/styles/block-library/site-title/editor-rtl.css 85 B
build/styles/block-library/site-title/editor.css 85 B
build/styles/block-library/site-title/style-rtl.css 143 B
build/styles/block-library/site-title/style.css 143 B
build/styles/block-library/social-link/editor-rtl.css 314 B
build/styles/block-library/social-link/editor.css 314 B
build/styles/block-library/social-links/editor-rtl.css 339 B
build/styles/block-library/social-links/editor.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.51 kB
build/styles/block-library/social-links/style.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 346 B
build/styles/block-library/spacer/editor.css 346 B
build/styles/block-library/spacer/style-rtl.css 48 B
build/styles/block-library/spacer/style.css 48 B
build/styles/block-library/style-rtl.css 16.5 kB
build/styles/block-library/style.css 16.5 kB
build/styles/block-library/tab/style-rtl.css 202 B
build/styles/block-library/tab/style.css 202 B
build/styles/block-library/table-of-contents/style-rtl.css 83 B
build/styles/block-library/table-of-contents/style.css 83 B
build/styles/block-library/table/editor-rtl.css 394 B
build/styles/block-library/table/editor.css 394 B
build/styles/block-library/table/style-rtl.css 641 B
build/styles/block-library/table/style.css 640 B
build/styles/block-library/table/theme-rtl.css 152 B
build/styles/block-library/table/theme.css 152 B
build/styles/block-library/tabs/editor-rtl.css 236 B
build/styles/block-library/tabs/editor.css 236 B
build/styles/block-library/tabs/style-rtl.css 983 B
build/styles/block-library/tabs/style.css 983 B
build/styles/block-library/tag-cloud/editor-rtl.css 92 B
build/styles/block-library/tag-cloud/editor.css 92 B
build/styles/block-library/tag-cloud/style-rtl.css 248 B
build/styles/block-library/tag-cloud/style.css 248 B
build/styles/block-library/template-part/editor-rtl.css 368 B
build/styles/block-library/template-part/editor.css 368 B
build/styles/block-library/template-part/theme-rtl.css 113 B
build/styles/block-library/template-part/theme.css 113 B
build/styles/block-library/term-count/style-rtl.css 63 B
build/styles/block-library/term-count/style.css 63 B
build/styles/block-library/term-description/style-rtl.css 126 B
build/styles/block-library/term-description/style.css 126 B
build/styles/block-library/term-name/style-rtl.css 62 B
build/styles/block-library/term-name/style.css 62 B
build/styles/block-library/term-template/editor-rtl.css 225 B
build/styles/block-library/term-template/editor.css 225 B
build/styles/block-library/term-template/style-rtl.css 114 B
build/styles/block-library/term-template/style.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 95 B
build/styles/block-library/text-columns/editor.css 95 B
build/styles/block-library/text-columns/style-rtl.css 165 B
build/styles/block-library/text-columns/style.css 165 B
build/styles/block-library/theme-rtl.css 715 B
build/styles/block-library/theme.css 719 B
build/styles/block-library/verse/style-rtl.css 123 B
build/styles/block-library/verse/style.css 123 B
build/styles/block-library/video/editor-rtl.css 415 B
build/styles/block-library/video/editor.css 416 B
build/styles/block-library/video/style-rtl.css 202 B
build/styles/block-library/video/style.css 202 B
build/styles/block-library/video/theme-rtl.css 134 B
build/styles/block-library/video/theme.css 134 B
build/styles/commands/style-rtl.css 1.72 kB
build/styles/commands/style.css 1.72 kB
build/styles/components/style-rtl.css 14 kB
build/styles/components/style.css 14 kB
build/styles/customize-widgets/style-rtl.css 1.44 kB
build/styles/customize-widgets/style.css 1.44 kB
build/styles/edit-post/classic-rtl.css 426 B
build/styles/edit-post/classic.css 427 B
build/styles/edit-post/style-rtl.css 3.38 kB
build/styles/edit-post/style.css 3.38 kB
build/styles/edit-site/style-rtl.css 15.9 kB
build/styles/edit-site/style.css 15.9 kB
build/styles/edit-widgets/style-rtl.css 4.62 kB
build/styles/edit-widgets/style.css 4.62 kB
build/styles/editor/style-rtl.css 18.6 kB
build/styles/editor/style.css 18.6 kB
build/styles/format-library/style-rtl.css 326 B
build/styles/format-library/style.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.02 kB
build/styles/list-reusable-blocks/style.css 1.02 kB
build/styles/media-utils/style-rtl.css 400 B
build/styles/media-utils/style.css 400 B
build/styles/nux/style-rtl.css 622 B
build/styles/nux/style.css 618 B
build/styles/patterns/style-rtl.css 611 B
build/styles/patterns/style.css 611 B
build/styles/preferences/style-rtl.css 415 B
build/styles/preferences/style.css 415 B
build/styles/reusable-blocks/style-rtl.css 275 B
build/styles/reusable-blocks/style.css 275 B
build/styles/widgets/style-rtl.css 1.17 kB
build/styles/widgets/style.css 1.18 kB

compressed-size-action

const classes = clsx( 'components-angle-picker-control', className );

const unitText = <UnitText>°</UnitText>;
const unitText = <Text className={ styles[ 'unit-text' ] }>°</Text>;
Copy link
Copy Markdown
Member

@Mamaduka Mamaduka Dec 5, 2025

Choose a reason for hiding this comment

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

I think the default Text styles are overriding the unit text styles. The unit symbol is touching the border in this PR>

Screenshot

CleanShot 2025-12-05 at 15 31 38

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This is interesting, my Storybook displays this correctly. The margin and color styles are potentially conflicting, but in my case the .unit-text one wins:

Screenshot 2025-12-05 at 12 36 35 Screenshot 2025-12-05 at 12 36 50

Both class names have the same specificity, so it all depends on insertion order. Either Emotion inserts its PolymorphicDiv-Text styles first, or the style.module.scss inserts its styles first. Both are dynamically added <style> elements.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is the something fixable? Don’t like the idea of relying on random order.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think we could remove the Text component and the custom CSS styles, and just use InputControlSuffixWrapper for the padding. It doesn't make sense that the degree symbol is blue, it's not interactive.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Is the something fixable? Don’t like the idea of relying on random order.

When both styles used Emotion, like

const Text = styled.div`color: blue`;
const UnitText = styled(Text)`color: red`;

then Emotion guaranteed that the red color always wins. But now when the red style is not Emotion, we don't have that guarantee any more and have to implement it ourselves somehow. Let me see what we can do.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I think we could remove the Text component and the custom CSS styles, and just use InputControlSuffixWrapper for the padding

@mirka Would you mind pushing a commit that implements this? You probably know much better than me what exactly needs to be done.

We have at least one learning for further migration: if one styled component depends on another styled component, we should migrate the dependency first. That keeps the order of stylesheets.

style.module.css styles are inserted early, immediately when the using module is initialized. And Emotion styles are inserted lazily, at the moment when the component that uses them is mounted.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Done in 4203b46

We have at least one learning for further migration

And also to remove this instruction 😄

  • if the style element already has an additional class name, like components-something, verify if that class name is really used in CSS styles. Remove it if it isn't.

@mirka mirka force-pushed the remove/emotion-ang-picker-ctrl branch from 0892056 to 4203b46 Compare December 5, 2025 17:01
: [ null, unitText ];
const prefixOrSuffixProp = isRTL()
? { prefix: <InputControlPrefixWrapper>°</InputControlPrefixWrapper> }
: { suffix: <InputControlSuffixWrapper>°</InputControlSuffixWrapper> };
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

By the way, while we are here, is it really correct to use either prefix or suffix depending on RTL? I'd expect that "prefix" and "suffix" are semantic terms, something like CSS logical properties (*-start, *-end), and that the NumberControl would take care of displaying them in the right order.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for reminding me, there should be a code comment here (169ecc3). I was actually confused too and looked up the history to make sure.

The prefix and suffix slots reposition themselves "semantically" by default, but we're intentionally overriding that behavior here.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Thanks for updating the angle input. I verified that in an RTL locale the "degrees" unit is diplayed on the right side, just like in LTR. While units like "px" are moved to the left.

Copy link
Copy Markdown
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

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

🚀

@jsnajdr jsnajdr force-pushed the remove/emotion-ang-picker-ctrl branch from 12a907a to 4da6230 Compare December 9, 2025 09:18
@jsnajdr jsnajdr enabled auto-merge (squash) December 9, 2025 09:19
@jsnajdr jsnajdr merged commit f6306fc into trunk Dec 9, 2025
35 checks passed
@jsnajdr jsnajdr deleted the remove/emotion-ang-picker-ctrl branch December 9, 2025 09:58
@github-actions github-actions Bot added this to the Gutenberg 22.3 milestone Dec 9, 2025
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.
ciampo added a commit that referenced this pull request May 15, 2026
…ot (#78183)

* Draggable: Migrate clone wrapper to wp compat overlay slot

Replace the legacy body-level / element-wrapper placement and its
`z-index: 1000000000` with a portal-style migration onto the
`@wordpress/ui` compat overlay slot (#77851). When the slot is
available, the drag clone joins the slot's body-level stacking context
across all three placement modes, so an active drag automatically
shares stacking with any `@wordpress/ui` overlay opened mid-drag
without needing per-version z-index races.

Auto-enabled in WordPress environments via the slot helper's
`window.wp.components` auto-detect; standalone hosts that bundle
`@wordpress/components` directly fall back to the previous placement
until they call `useEnableWpCompatOverlaySlot()`.

`@wordpress/components` imports `getWpCompatOverlaySlot()` directly
from `@wordpress/ui`'s public exports (also promoted from internal in
this change). The `@wordpress/components` dep on `@wordpress/ui` is
transitional, scoped to the legacy-overlay migration.

Cross-document drags (e.g. dragging an element inside an iframe while
the slot is in the parent document) fall back to the previous
placement so the clone's viewport-relative geometry stays in a single
coordinate space.

The default placement mode (`appendToOwnerDocument: false`, no
`dragComponent`) previously appended the clone to the dragged
element's parent. In WP environments where the slot is now in effect,
the clone instead lives in the slot — a body-level location. In-repo
ripgrep finds no CSS or event-delegation scoping anchored to the
clone's previous in-flow parent; external consumers that relied on
that ancestry must either not opt into the slot or migrate their
scoping.

* Draggable: Storybook: render docs-page stories in iframes

The drag clone uses `position: fixed`, which Storybook's docs-page
wrappers break because they apply `transform`s that establish new
containing blocks. As a result the clone resolves against those
wrappers instead of the viewport and lands in the wrong place on
the autodocs page.

Render each Draggable story in its own iframe on the autodocs page
via `parameters.docs.story.inline: false`, which restores
viewport-relative positioning for the clone.

* Draggable: Storybook: polish cross-document fallback playground story

Three small follow-ups on the iframe regression story:

- Inject the Draggable SCSS into the iframe via Vite's `?inline`
  import (same pattern `WithGlobalCSS` uses with
  `global-basic.scss?inline`) instead of duplicating rule bodies
  in `srcDoc`. Single source of truth; future SCSS edits flow
  through automatically.
- Guard the style injection on `iframeDoc?.head` so the brief
  about:blank → srcDoc transition doesn't throw on the initial
  `useEffect` pass.
- Align the slot-presence display with the public
  `getWpCompatOverlaySlot()` API: it now returns `undefined`
  rather than `null` when no slot is registered.

* CHANGELOG: Restore entries dropped during rebase

Three Unreleased entries were inadvertently removed when the
Draggable migration commit was rebased onto trunk:

- @wordpress/components Internal: `Modal`, `Menu`, `DropdownMenu`
  motion-token adoption (#76097).
- @wordpress/components Internal: `Popover` close-button z-index
  cleanup (#78180).
- @wordpress/ui Bug Fixes: `Text` CSS-defense values for paragraph
  and heading variants (#78172).

Restore them under their original headings.

* Storybook: Fix popover-with-slotfill cross-iframe collision boundary

`Popover.Popup` stopped accepting `collisionBoundary` directly when
#78168 introduced the `Popover.Positioner` slot subcomponent. The
prop is now silently ignored on `Popup`, so the cross-iframe story's
collision avoidance regressed after the rebase onto trunk.

Route the boundary through `Popover.Positioner` (matching the
modern `Popover.Popup`'s `positioner` slot pattern) so the popup
honors the iframe's clipping edge again.

This file is `.jsx` so the type system didn't catch the silent
prop-drop.

* Draggable: Storybook: refresh AppendElementToOwnerDocument JSDoc

The story's JSDoc still described the legacy "escape ancestor
stacking context" rationale, which now contradicts the updated
`appendToOwnerDocument` JSDoc in `types.ts` for hosts that opt
into the `@wordpress/ui` compat overlay slot — where the clone
always lives in the body-level slot and the prop is a no-op.

Update the story's docblock to mirror the type-level guidance and
call out the cross-document fallback exception.

* Draggable: CHANGELOG: Call out default-mode in-flow ancestor change

The original Draggable entry covered the stacking + cross-document
fallback story, but left the load-bearing behavior change for
third-party consumers in the PR description only: in the default
placement mode (no `appendToOwnerDocument`, no `__experimentalDragComponent`),
the clone used to be a DOM descendant of the dragged element's
parent. With the slot active, it now lives at the body-level slot
regardless.

Surface that change directly in the CHANGELOG entry, including a
migration hint for consumers that scoped CSS or event delegation
on the clone's previous ancestry.

* Draggable: Add e2e regression for chip-inside-compat-slot

Lock in the structural guarantee that underpins the stacking
claim in #78183: when `@wordpress/components`'s `Draggable` runs
in a WordPress environment, the drag chip is rendered inside the
body-level `[data-wp-compat-overlay-slot]`.

That single structural assertion subsumes the visual stacking
contract — the slot creates an isolated stacking context with
`z-index: 1000000003`, so anything appended into it stacks above
any `@wordpress/components` overlay opened mid-drag (which live
outside the slot at lower `z-index`s).

Asserting structure rather than visual layering keeps the test
robust against unrelated overlay z-index churn, and avoids a
brittle `elementFromPoint`-style probe across the
parent-doc/canvas-iframe boundary.

* Storybook: Trim file-level docblocks on playground stories

Drop the file-level brain-dump JSDoc from the
`draggable-cross-document-fallback` and `popover-with-slotfill`
playground stories. The story body and any per-story copy carry
the user-facing explanation; the file-level prose was internal
reasoning that doesn't belong in the story source.

Per mirka's review on PR #78183 (empty-suggestion blocks).

* Storybook: popover-with-slotfill story: use public @wordpress/ui API

Switch the playground story to consume `Popover` from the public
`@wordpress/ui` entry point instead of reaching into
`packages/ui/src/popover`. Inline a small `IframePortal` helper
locally so the story no longer depends on
`packages/ui/src/popover/stories/utils` either (those story
utilities are not part of any public surface).

Also swap the `Slot` ref from `useRef` to a state setter so the
popup re-renders once the slot's container element mounts, which
removes a first-render race the previous `useRef` pattern had.

Per mirka's review on PR #78183.

* Storybook: draggable cross-doc story: load components styles via Storybook bundle

Swap the iframe's style injection from a `?inline` import of
`packages/components/src/draggable/style.scss` (reaching into
another package's source) to Storybook's own
`storybook/package-styles/components-ltr.lazy.scss`, which is the
canonical bundle of `@wordpress/components` styles for stories.

The injected CSS is now broader than strictly necessary (the
whole package stylesheet rather than only Draggable's rules),
but this is a debug fixture and the cost is negligible. In
exchange we drop the cross-package src reach.

Per mirka's review on PR #78183.

* Storybook: Move cross-document fallback story under "Debug fixtures"

The cross-document fallback story is strictly defensive
regression coverage and doesn't illustrate a pattern non-
maintainers would seek out. Move it under a `Debug fixtures`
sub-section in the sidebar so the main `Playground/` namespace
stays focused on intended-usage demos.

Per mirka's review on PR #78183.

* Storybook: Drop redundant `parameters.sourceLink` from playground stories

The `source-link` Storybook addon already derives the GitHub
source path from `storyData.importPath` when no explicit
`parameters.sourceLink` is provided (see
`storybook/addons/source-link/manager.ts`). For stories living
under `storybook/stories/playground/`, that fallback resolves to
the same value the explicit `sourceLink` was hard-coding, so the
declaration is pure duplication.

Per mirka's review on PR #78183 (empty-suggestion blocks
covering the `parameters: { sourceLink: ... }` literal).

* Draggable: Migrate styles from SCSS to a CSS module

Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.

* Storybook: Simplify cross-document fallback story with StyleProvider

Now that Draggable's styles ship as a CSS module routed through
`@wordpress/style-runtime`, the cross-document fallback story no
longer needs to manually `?inline`-import and inject the whole
`components-ltr` SCSS bundle into the iframe's `<head>`.

Wrap the portaled iframe content in
`<StyleProvider document={iframeDoc}>` from
`@wordpress/components` instead — `StyleProvider` calls
`registerDocument()` on the iframe document, and the style
registry replays every registered CSS module (Draggable
included) into that document. The visible behavior is
unchanged: the orange clone still tracks the cursor inside the
iframe, demonstrating the cross-document fallback.

Per mirka's review on PR #78183.

* Draggable: CHANGELOG: Move entry to Unreleased and slim it down

The Enhancements entry for this PR ended up rolled into the
already-cut `33.1.0` release section during an earlier rebase,
and had grown to a 700-character paragraph spelling out every
edge case (cross-document fallback, `appendToOwnerDocument`
semantics, in-flow ancestor migration hints).

Move it back to `## Unreleased` and trim to a two-sentence
summary in line with the surrounding entries. The dropped
detail still lives in the JSDoc, the code comments, and the PR
description's <details> blocks.

* Draggable: Trim verbose inline code comments

Sweep across the comments added by this PR, dropping
redundant duplication, narration of self-evident code, and
prose that already lives in the PR description / JSDoc:

-   Drop the duplicate compat-slot note from the
    `AppendElementToOwnerDocument` story JSDoc (the
    interaction is already described on the prop's TS
    JSDoc in `types.ts`).
-   Tighten the prop JSDoc for `appendToOwnerDocument` to a
    single short paragraph.
-   Slim the same-document-only slot guard comment in
    `Draggable.start()` (the conditional itself reads as
    "slot if same document").
-   Compact the rationale comment for
    `parameters.docs.story.inline: false` in the Draggable
    autodocs config to a single explanation.
-   Trim the structural-stacking assertion comment in the
    Playwright `draggable-blocks` spec.
-   Drop the forward-looking "can be removed on a future
    Stylelint upgrade" note from `CSS_BASELINE_2024_FUNCTIONS`.

No behavior change.

* @wordpress/ui CHANGELOG: Move #78183 entry to Unreleased

The `getWpCompatOverlaySlot()` export bullet was left inside the
already-released `## 0.13.0` section when the parallel
`@wordpress/components` entry was moved to `## Unreleased`.

* Draggable: Keep physical `left` for the invisible drag image

Mirroring this offscreen stand-in in RTL has no benefit — either side
hides it equally — so revert to the original physical property and
silence the logical-properties lint with a targeted comment.

* @wordpress/ui CHANGELOG: Trim #78183 entry

* @wordpress/ui: Restore unrelated tsconfig change

* Storybook: Drop redundant story-name overrides

* Draggable: Keep body cursor class global

The cursor flip is also triggered by external code (block-editor
keyboard drag, etc.) that toggles `is-dragging-components-draggable`
directly. Targeting the legacy class globally preserves that flow,
which a module-hashed selector silently broke.

* Draggable: Guard class arrays against the Jest CSS-module mock

`jest-preset-default`'s style mock returns `undefined` for any class,
which `classList.add()` would coerce to a literal "undefined" token.
Filter falsy entries to keep test DOM clean.

* Draggable: Address minor self-review nits

- Note why the invisible drag image bypasses the compat slot.
- Drop a redundant chip-count assertion in the e2e spec.
- Flag the SCSS-only stylelint override pattern explicitly.

* Storybook: Group compat-slot fixtures under Debug fixtures

Consolidates the manual verification stories (`WP Compat Overlay Slot`,
`Popover with SlotFill`) alongside the existing Draggable fixture.

* Draggable: Use kebab-case for CSS module class names

---

Co-authored-by: ciampo <[email protected]>
Co-authored-by: mirka <[email protected]>
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