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

Add language chooser package and component #64686

Open
wants to merge 49 commits into
base: trunk
Choose a base branch
from

Conversation

swissspidy
Copy link
Member

@swissspidy swissspidy commented Aug 21, 2024

What?

Context: https://make.wordpress.org/core/2024/05/07/merge-proposal-preferred-languages/

Adds a new LanguageChooser component for use in WordPress core (site settings, user profile, network settings, potentially even the install screen).

Update: after a lot of back and forth, this is now a new @wordpress/language-chooser package.

Core then only needs the "glue" code rendering the component and PHP implementation to make it work. I have a local POC for that already that I will be trying to push to the WordPress develop GitHub repo soon.

Then, these two PRs can be tested together to verify everything works correctly.

Why?

In the discussion it was determined that the Gutenberg repository is the best home for this new UI component as it already has proper build tooling in place to support TypeScript, Jest, etc. These are not available in core. And Gutenberg is the de facto JS monorepo for core anyway.

How?

Adds a new LanguageChooser component to @wordpress/components.

Core can then use that component & its styles to display the Preferred Languages language chooser on the settings page.

Testing Instructions

  • Tests should pass
  • Storybook should work

Typical interactions:

  • Adding and removing items from the list
  • Moving items within the list

Testing Instructions for Keyboard

All buttons, listbox, dropdowns, etc. can be interacted with using keyboard only. There are dedicated shortcuts screen reader announcements as well.

  • Home: Select first item
  • End: Select last item
  • ArrowUp: Select previous item
  • ArrowDown: Select next item
  • Alt+ArrowUp: Move selected item up
  • Alt+ArrowDown: Move selected item down
  • Backspace: Remove selected item from list
  • Alt+A: Add item from combobox to list

Screenshots or screencast

In storybook:

Screenshot 2024-08-21 at 16 48 23

Integrated into WordPress admin:

Screenshot 2024-08-23 at 12 20 58

@swissspidy swissspidy added the [Type] Enhancement A suggestion for improvement. label Aug 21, 2024
Copy link

github-actions bot commented Aug 21, 2024

Size Change: +4.15 kB (+0.23%)

Total Size: 1.77 MB

Filename Size Change
build/language-chooser/index.min.js 2.63 kB +2.63 kB (new file) 🆕
build/language-chooser/style-rtl.css 759 B +759 B (new file) 🆕
build/language-chooser/style.css 764 B +764 B (new file) 🆕
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 898 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.16 kB
build-module/block-library/query/view.min.js 743 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 2.8 kB
build-module/interactivity/debug.min.js 16.6 kB
build-module/interactivity/index.min.js 13.3 kB
build/a11y/index.min.js 949 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.11 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.65 kB
build/block-editor/content.css 4.64 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/index.min.js 257 kB
build/block-editor/style-rtl.css 16 kB
build/block-editor/style.css 16 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 228 B
build/block-library/blocks/comments-pagination/editor.css 217 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 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 832 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 631 B
build/block-library/blocks/cover/editor-rtl.css 641 B
build/block-library/blocks/cover/editor.css 642 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 357 B
build/block-library/blocks/form-input/style.css 357 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 955 B
build/block-library/blocks/gallery/editor.css 958 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 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 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 785 B
build/block-library/blocks/image/editor.css 787 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.65 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 179 B
build/block-library/blocks/latest-posts/editor.css 179 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 558 B
build/block-library/blocks/media-text/style.css 556 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 644 B
build/block-library/blocks/navigation-link/editor.css 645 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.19 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 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 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 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 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-content/style-rtl.css 79 B
build/block-library/blocks/post-content/style.css 79 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 226 B
build/block-library/blocks/post-title/style.css 226 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 206 B
build/block-library/blocks/site-title/style.css 206 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 757 B
build/block-library/blocks/social-links/editor.css 756 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 396 B
build/block-library/blocks/video/editor.css 397 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 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.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 218 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 15 kB
build/block-library/style.css 15 kB
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.3 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 224 kB
build/components/style-rtl.css 12.1 kB
build/components/style.css 12.1 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.82 kB
build/core-data/index.min.js 73.2 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.98 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 12.7 kB
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-site/index.min.js 217 kB
build/edit-site/posts-rtl.css 7.3 kB
build/edit-site/posts.css 7.3 kB
build/edit-site/style-rtl.css 12.6 kB
build/edit-site/style.css 12.6 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/editor/index.min.js 102 kB
build/editor/style-rtl.css 9.28 kB
build/editor/style.css 9.28 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.11 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.18 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 3.2 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.61 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.34 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 1.01 kB
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@swissspidy swissspidy added the No Core Sync Required Indicates that any changes do not need to be synced to WordPress Core label Aug 22, 2024
@swissspidy
Copy link
Member Author

@aaronjorbin @youknowriad What do you think about this?

This comment was marked as resolved.

@youknowriad

This comment was marked as resolved.

@youknowriad youknowriad requested review from mirka and ciampo August 22, 2024 09:27
@swissspidy

This comment was marked as resolved.

@youknowriad

This comment was marked as resolved.

@swissspidy

This comment was marked as resolved.

Moves all callbacks to the higher level. Moves all the tests too.
@tyxla tyxla requested a review from a team August 22, 2024 17:43
@swissspidy swissspidy changed the title Add language chooser package and component Add language chooser component Aug 23, 2024
@swissspidy swissspidy requested a review from tyxla September 13, 2024 13:12
tyxla
tyxla previously approved these changes Sep 17, 2024
Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

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

Thanks for the patience @swissspidy!

I spent some time testing it, and it works great! Nice work 🙌

Code also looks good 👍

I only have a minor comment on the announcements used when moving or removing active languages, but it's not a blocker.

I think if anything comes up, we can always address it as a follow-up.

Did we need a final ✅ from design?

🚀

);
} );

speak( __( 'Locale moved down' ) );
Copy link
Member

Choose a reason for hiding this comment

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

Does it make sense for these "locale moved down/up" and "locale removed" strings to contain the language we're moving up or down? In my testing with assistive technology, it's not immediately clear which locale I'm moving if I forgot which one was announced as the "selected" one previously.

@youknowriad
Copy link
Contributor

Personally, I don't think this should be in a dedicated component. It should be in the components package, we shouldn't be creating components for single UI components.

@swissspidy
Copy link
Member Author

We had this discussion already 😅

@tyxla
Copy link
Member

tyxla commented Sep 17, 2024

Personally, I don't think this should be in a dedicated component. It should be in the components package, we shouldn't be creating components for single UI components.

I kindly disagree - we don't want to make the components package a catch-all kitchen sink - new high-level and app components like this shouldn't belong together with the generic, general-purpose components in the components package.

@youknowriad
Copy link
Contributor

I kindly disagree - we don't want to make the components package a catch-all kitchen sink - new high-level and app components like this shouldn't belong together with the generic, general-purpose components in the components package.

I think the maintenance cost of 1 component = 1 package is too big. If you don't consider this one a component that is a generic UI component, we can also consider it a component that is an editor specific component and move it to where it's going to be used. Where is that? block-editor? editor?

@tyxla
Copy link
Member

tyxla commented Sep 17, 2024

I think the maintenance cost of 1 component = 1 package is too big. If you don't consider this one a component that is a generic UI component, we can also consider it a component that is an editor specific component and move it to where it's going to be used. Where is that? block-editor? editor?

I agree that 1 component = 1 package adds unneeded maintenance cost if we do it for many more components in the future, and that this is something to be mindful about. Ideally, new high-level or app components should live closer to the app code, just like block-editor, editor and other app-related packages. See my prior thoughts on that. I was OK to accept a separate package for this particular one, exactly because it doesn't belong in the editor / block-editor, or any other existing package. Also see @jsnajdr's earlier thoughts which I was fine with as a compromise to move this work forward, and we all agreed earlier in the PR to move forward with.

@youknowriad
Copy link
Contributor

@wordpress/react-i18n

That is actually a great option for me. Why was this option discarded?

@tyxla
Copy link
Member

tyxla commented Sep 18, 2024

@wordpress/react-i18n

That is actually a great option for me. Why was this option discarded?

Seems like @swissspidy didn't prefer it. I was initially OK with that option, and I see some others were in favor of it. However, the relation is thin between @wordpress/react-i18n (being React bindings for the @wordpress/i18n package) and this component (which is essentially a language picker UI). Considering this thin relationship, it made more sense for this package to live somewhere else, and a separate package sounded like the best option. With the extra Storybook stories, tests, etc. I think the decision to move it to a separate package was the best one. The best among the options we had anyway.

@youknowriad
Copy link
Contributor

youknowriad commented Sep 18, 2024

Ok, so my preference is still that this is a generic UI component personally a SortableMultiSelect that belongs to the components package. "Language" specific labels can be a "messages" prop like we have for FormTokenField component.

While I'm ok with a npm package for a component, I think a wp.languageChooser variable and API in WordPress doesn't really make sense.

Anyway, if my arguments don't convince you, happy to disagree and commit.

@jsnajdr
Copy link
Member

jsnajdr commented Sep 18, 2024

I think a wp.languageChooser variable and API in WordPress doesn't really make sense.

That's a good point, maybe we should also discuss the global variable under which the package is exposed at runtime and what policy should govern them. We have things like wp.media or wp.blocks or wp.keyboardShortcuts or even wp.blockSerializationDefaultParser. Are they all OK or do we wish that some of them were different? Should the language chooser be wp.i18n.languageChooser instead?

@ciampo
Copy link
Contributor

ciampo commented Sep 18, 2024

Ok, so my preference is still that this is a generic UI component personally a SortableMultiSelect that belongs to the components package.

I agree that this could be abstracted to such a component, but personally, I'd consider doing that only if we observe a real need for it in more than one place.

There would also be more implications if we added a new component to @wordpress/components:

  • we would likely need to have a design review, considering all ways of implementing a sortable, multi-selectable list of values, and picking the one that makes the most sense in general;
  • we'd need to abstract the code and adapt the code to the standards of the package (ie. split it into sub-components
  • since the component can't be private, we'd need to be extra sure about the design, functionality and API surface before releasing it
  • all of the above would definitely delay the addition of the language picker.

My suggestion is to pick a place for this higher-level component to exist (it's been discussed above and I don't personally have a strong opinion). And when/if there is need to abstract it to a generic component, we can create such a component in @wordpress/components package, and have the higher-level component consume it.

@tyxla
Copy link
Member

tyxla commented Sep 18, 2024

I agree that this could be abstracted to such a component, but personally, I'd consider doing that only if we observe a real need for it in more than one place.

💯

I see no further reason to delay this work. I'd suggest moving forward, and if, at some point, there's a need for the underlying UI component to be abstracted, we can consider doing it following the plan @ciampo outlined above.

@youknowriad
Copy link
Contributor

I see no further reason to delay this work. I'd suggest moving forward, and if, at some point, there's a need for the underlying UI component to be abstracted, we can consider doing it following the plan @ciampo outlined above.

Except that it would be too late and we'll be forced to support a non ideal API/package in WordPress.

Let's move forward though, I feel like I made my point.

isRemoveDisabled,
}: ActiveControlsProps ) {
return (
<ButtonGroup>
Copy link
Contributor

Choose a reason for hiding this comment

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

We're actually in the process of deprecating ButtonGroup (context), so it would be better to replace it with another component (maybe a VStack or a simple vanilla HTML element).

Copy link
Member Author

Choose a reason for hiding this comment

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

Of course it is. I just switched to it after it was recommended to use it. Guess I‘ll switch to something else now.

Copy link
Member

Choose a reason for hiding this comment

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

@swissspidy feel free to blame me for this one.

I recommended using ButtonGroup as a better alternative to an unordered list, but I did it before we decided that ButtonGroup would be deprecated.

@mtias
Copy link
Member

mtias commented Sep 24, 2024

Mmm, now I'm more confused about the rationale to not have it in components. 😀 I don't think @ciampo point about a more thorough design review should be specific to where components are placed. Is the idea that we'd be more lax on a standalone component? If the question is about not having a need to reuse it, that's applicable to it being a package in the first place.

There seems to be some fundamental disagreements on what the packages stand for that we should try—at the risk of bike-shedding—to get on the same page before pushing public APIs.

My own impression remains that this is a fine wp/component to have provided it's documented and annotated well. Alternatively, with the addition of wp/fields, is language picking something that fits there more coherently?

@ciampo
Copy link
Contributor

ciampo commented Sep 25, 2024

a more thorough design review should be specific to where components are placed. Is the idea that we'd be more lax on a standalone component?

I agree that a design review should be carried out regardless. I left specifically this feedback in my first reply, where I tagged the design group and questioned whether this is the UI/UX that we should land on for a "sortable, multiple selection" list, but no-one followed up.

There seems to be some fundamental disagreements on what the packages stand for that we should try—at the risk of bike-shedding—to get on the same page before pushing public APIs.

Agreed that we need to fund consensus around the scope of each package.

My own impression remains that this is a fine wp/component to have provided it's documented and annotated well.

We already shared many comments in this PR (including some from me, like this one and this one), but the TL;DR of my personal point of view is:

  • in the current version, this component is too app-specific (ie. languages);
  • we could look at generalizing it and then potentially add it to the components package, but that would likely be a long process (design review, API design, implementation, review)
  • we could therefore host the "language-specific" version in another package (standalone? fields? i18n?) and later extract the generic UX/UI pattern to the components package.

@tyxla tyxla dismissed their stale review October 1, 2024 15:42

Dismissing my review until we decide where to put the component.

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 part of a chat with @mtias and @youknowriad , we discussed this PR and came to the conclusion that the best path forward is:

  • To develop the component in the @worpress/components package as a generic "sortable, multi-selectable list" (name TBD)
  • Consumers of the component will be able to pass the list of items that the user will select from (either via a prop, or via subcomponents, API design TBD)
  • @youknowriad said that he has an idea on how to allow this component to be consumed via private APIs even for this specific use case (I'll let Riad expand on this)

We also felt like, before diving into implementing this component, we should have a design review (cc @WordPress/gutenberg-design ) and likely an API design review (cc @WordPress/gutenberg-components ).

@diegohaz out of curiosity, how would you implement such a UI widget with ariakit components?

@swissspidy , I understand that the many changes of direction can leave you frustrated. We're all trying to make the best decisions for the project, and sometimes there is no clear easy choice. We feel that the steps illustrated above will lead to the best outcome.

@youknowriad
Copy link
Contributor

Yes, I think the main thing is that if we limit the components package to low level components, we'll put ourselves in a position where we'll be creating smaller packages for any component that doesn't fit this kind of random threshold.

I think the distinction should be closer to: UI components without WP dependency are probably a good fit for the components package. That said, it's always good to have a discussion on a component per component basis.

For the private API approach, I think the component proposed here is meant to be used as an inline script to inject in settings pages or things like that. These pages are still "core" though so Core should be able to use the private APIs just like any other JS package. So I'm wondering if there's a way for us to create a dedicated "virtual package name" for wp-admin or the settings page where this component is going to be used and add it to the whitelist of allowed users of private APIs.

@diegohaz
Copy link
Member

diegohaz commented Oct 2, 2024

@diegohaz out of curiosity, how would you implement such a UI widget with ariakit components?

I'd use Composite for the listbox and arrow key navigation. The other interactions will likely need to be custom.

@swissspidy
Copy link
Member Author

Soooo... what's the next step here? Anyone has the bandwidth to create such a generic "sortable, multi-selectable list" component using Ariakit? And who can help with that "virtual package name" question?

@ciampo
Copy link
Contributor

ciampo commented Oct 24, 2024

I opened #66413 to discuss next steps and make progress on the components side.

And who can help with that "virtual package name" question?

It looks like this aspect is discussed as part of #66197

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
No Core Sync Required Indicates that any changes do not need to be synced to WordPress Core [Type] Enhancement A suggestion for improvement.
Projects
Status: Now
Development

Successfully merging this pull request may close these issues.