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

Font manager #46332

Closed
wants to merge 23 commits into from
Closed

Font manager #46332

wants to merge 23 commits into from

Conversation

matiasbenedetto
Copy link
Contributor

@matiasbenedetto matiasbenedetto commented Dec 6, 2022

What?

Gutenberg font manager.
⚠️ this is a draft

Why?

Refer to this issue: #45271

How?

The font manager shows the fonts bundled in the theme and lists fonts that can be added to the global settings.

The fonts are downloaded to the upload (/wp-content/uploads/fonts/<active-theme-slug>/) folder when the user saves the global settings changes.

To-do list:

Testing Instructions

  • Go to the global styles panel
  • Use the typography settings as in the video

Testing Instructions for Keyboard

Screenshots or screencast

2022-12-06.11-25-43.mp4

@jasmussen
Copy link
Contributor

Took this for a quick spin, here's a GIF showing the Global Styles > Typography flow:

status

Very cool, lots to like here, thank you for the effort!

#45271 goes a bit further in terms of creating "font sets" to help define what's hiding behind the "Primary" item in the dropdown, mainly so that you won't have to manually go into every single block and change its font, but can simply change out a set instead. It seems okay to explore this separately, with the bulk of the actual management work being the first focus.

But one challenge we have is that we probably can't add Google Fonts to the core offering. I believe there are some GDPR issues that block this. So it would be good to consider whether that can be a point of extensibility instead. Perhaps the "Create Block Theme" plugin, or other plugins, can hook into this slot and offer Google Fonts or otherwise. What do you think?

As far as uploading fonts, this is definitely the main offering, and #45271 puts that in a modal. Doesn't have to be, we can start in the inspector as you have here, but if we're able to get a bit closer in terms of the design, that'd be nice.

Let me know if this was helpful, and thanks for the work!

@matiasbenedetto
Copy link
Contributor Author

matiasbenedetto commented Dec 7, 2022

Thanks for the review @jasmussen !

But one challenge we have is that we probably can't add Google Fonts to the core offering. I believe there are some GDPR issues that block this. So it would be good to consider whether that can be a point of extensibility instead. Perhaps the "Create Block Theme" plugin, or other plugins, can hook into this slot and offer Google Fonts or otherwise. What do you think?

I think the approach we use in this PR and in the Create Block Theme plugin is GDPR-compliant.

The list of fonts is a static JSON file stored in the repo. It is a subset of the data obtained from Google Fonts API. We are not fetching this data from Google fonts API dynamically from WordPress. It is requested one time and added to the repo. For example, in Create Block Theme plugin, we automatically and periodically check and update this file using a github action. In this PR I added a smaller chunk of fonts because is a proof of concept.

This file contains a list of font families and the links to the font asset files in .ttf format, for example: http://fonts.gstatic.com/s/piazzolla/v25/N0b52SlTPu5rIkWIZjVKKtYtfxYqZ4RJBFzFfYUjkSDdlqZgy7JxwXLy1AHfAAy5.ttf.

These URLs are used to download the font assets to generate the previews in the editor panel while browsing the "Google Fonts" section. When the user adds a font face and saves, the PHP downloads the font assets to /wp-content/uploads/fonts/<active-theme-slug>/. After this, the fonts are served by WordPress as any static asset. Only the admin users browsing the "add Google Fonts" section of the admin/editor need to make requests to Google servers to get the assets. End-users and admin users that don't browse this section will never make requests to Google servers.

What do you think?

@jasmussen
Copy link
Contributor

jasmussen commented Dec 7, 2022

What do you think?

What I think entirely personally, is that Google Fonts is one of the best resources for web-design to arrive, and I would love access to it in my design tool.

I mention this mainly because my assumption is that it's a complete non-starter to have this be part of the core offering, as I recall Google Fonts specifically having been problematic in the past, with GDPR just being one aspect. I would be delighted to be wrong, but before we assume that we are able to, it might be useful to get a wider look at the feasibility. @aristath or perhaps @Mamaduka do you recall core conversations around Google Fonts as a resource? Would you know anyone else to inquire? I understand the font files are copied over, not linked, but nevertheless. Thanks!

@Mamaduka
Copy link
Member

Mamaduka commented Dec 7, 2022

@jasmussen, Ari will probably have more details on this one. This is the only thing that comes to my mind (also authored by @aristath) https://make.wordpress.org/themes/2020/09/25/new-package-to-allow-locally-hosting-webfonts/.

@hellofromtonya might know the general status of Webfonts API.

@github-actions
Copy link

github-actions bot commented Dec 8, 2022

Size Change: +24.4 kB (+2%)

Total Size: 1.39 MB

Filename Size Change
build/block-editor/index.min.js 201 kB +95 B (0%)
build/blocks/index.min.js 51.1 kB +12 B (0%)
build/edit-site/index.min.js 89.1 kB +24.3 kB (+37%) 🚨
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.17 kB
build/block-editor/content.css 4.17 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15.1 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 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.6 kB
build/block-library/blocks/cover/style.css 1.59 kB
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 281 B
build/block-library/blocks/post-template/style.css 281 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 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 756 B
build/block-library/blocks/site-logo/editor.css 756 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 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.8 kB
build/block-library/editor.css 11.8 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 204 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/commands/index.min.js 14.8 kB
build/commands/style-rtl.css 789 B
build/commands/style.css 786 B
build/components/index.min.js 210 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 718 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.76 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.2 kB
build/edit-post/style-rtl.css 7.84 kB
build/edit-post/style.css 7.83 kB
build/edit-site/style-rtl.css 10.2 kB
build/edit-site/style.css 10.2 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@jasmussen
Copy link
Contributor

Just to follow up here, I had an informal chat with a couple of others, and especially since there hasn't been any further feedback on this particular thread, let's move forward in this manner:

  • Because the Google connection is purely for copying over the fonts, let's include Google Fonts support, especially as all the fonts served there are open source.
  • The key point is: all fonts must be served locally, and not from Google's servers.
  • As followups, it would be valuable for anyone working on webfonts API (@aristath @hellofromtonya or others, forgive me if I'm wrong, I'm not into the details) to look at web vitals and performance, to make sure we're serving the fonts in the most optimized way possible.
    • Reduced character sets when possible
    • Looking at how fonts get enqueued and served, i.e. only when used
    • Giving up-front information about font file-sizes when picking weights

How does that sound?

@spacedmonkey
Copy link
Member

Please add php unit tests and phpdocs. Any change to the REST API will not be merged without these in place 😄

@TimothyBJacobs
Copy link
Member

This may be too early feedback, in which case feel free to disregard :) But I wonder if we should be storing the downloaded font files on a site-wide basis keyed by a hash of the download URL, instead of per-theme. I'm thinking it would be unfortunate if a user ends up with 10 different copies of the same highly popular Google Font from trying out different themes or even in a multisite setup where many themes may be active across the network.

@annezazu annezazu mentioned this pull request Dec 13, 2022
57 tasks
@jasmussen
Copy link
Contributor

I'm aware you're not looking for feedback quite yet, but just randomly tried the branch and got htis error:

Screenshot 2022-12-23 at 12 10 40

@matiasbenedetto
Copy link
Contributor Author

Continuing with the implementation: I added the modal and removal of the fonts assets.

2022-12-28.12-34-49.mp4

@matiasbenedetto
Copy link
Contributor Author

Added a transition to make the removing and restoring available fonts clearer for the user:

2022-12-28.16-08-55.mp4

@jasmussen
Copy link
Contributor

jasmussen commented Dec 29, 2022

Nice to see this progress! Thank you for the energy here, this is going to be a big one.

Many of the existing mockups circle around the concept of font pairings, that is, being able to create a preset pairing of two fonts denoted primary and secondary, to replace headings and body text respectively. At the moment we have only a single default, this one:

default

The change to primary and secondary, I picture, would replace that option and add another, so in just a few clicks you can customize headings and everything else across your site:

Active font set defines default fonts

At this state of the branch, it seems like the above might be something we need to follow up on separately, what do you think?


One other aspect this branch has made clear, is the intricacies of how to add fonts. Until variable fonts are more common, you don't just add a single font, it's always a matter of adding font variants. In doing so, the sequential waterfall flow of the styles sidebar does offer a relatively clear stepped mapping: Fonts → Pick family → Pick weights. In order to land this feature, I think we can lean into that, and I created some fresh mockups to embrace that.

Basic font management

Managing font weights

This would be a replacement for the following 3 steps:

font families

  • By reducing to two steps, just showing all installed fonts in an itemgroup on the first Typography page, we simplify the flow.
  • By using checkboxes instead of circle plusses and checkmarks, we can reduce the need for tooltips.

Upload fonts

Uploading fonts

  • Much the same as what you have in the branch, but with some small layout improvements to the controls.

Add from Google Fonts

Add Google Fonts

To hopefully make it easier to land this branch, this mockup keeps the Google font flow inside the style inspector. Pick font, check the box next to the font weights, save. Notice how the whole card becomes a single clickable button, though, making it more ergonomic to drill-down.

I do think there's room for exploring this management happening in a stepped modal at some point in the future, but it's clear from testing this branch that it's not a 1:1 translation and it needs careful thought. But just to illustrate why it could make sense, it simply offers more room to browse available fonts:

Add Google Fonts, modal

It might be especially important once we're able to tackle variable width fonts, where the configuration of each is likely going to add some challenges on its own. So something to keep in mind, but probably to follow up on.

Nice work! Let me know if these notes resonate 🙏

A few smaller notes

Button and modal titles should use sentence-case, with capital first letters only for proper nouns. So although these mockups eliminate some of the following examples, just to highlight them as important details, it would be "Upload local font" instead of "Upload Local Font", and "6 font families" instead of "6 Font Families", etc.

Screenshot 2022-12-29 at 12 06 27

When using icons, they should always be 24x24, never smaller. The chevron here is 15x15:

Screenshot 2022-12-29 at 12 06 01

The tooltip here is a bit hard to grok, by the way, which is one of the reasons I think a checkbox could work better.

@matiasbenedetto
Copy link
Contributor Author

matiasbenedetto commented Jan 9, 2023

Hi, @jasmussen thanks again for your great feedback! Sorry for not getting back to you sooner, but the new year holidays and some personal issues got me off for a few days. I would like to share a few comments and questions about the mockups.

About the installed font list:

  1. Considering there is no technical limit around the number of fonts a user can install, could this list grow too long?
  2. More importantly, I think the mockup looks more 'tidy' than the current implementation in this branch, but I think it has an important downside: the font's lack of pre-visualization. Could we combine the two options' strong points (tidiness and previsualization) into one?
  3. Could we move this list into the modal so we can display the list of installed fonts with their previsualization?

image

About the modal for Google fonts:
I like the idea, It seems to provide a smoother user experience, and implementing it won't be a big change. We can explore that in this branch.
image

I think we lack a way to move back from the variants list to the families list. Could add to the mockup a UI element to navigate back?
image

About the list of fonts with the checkbox:
It seems handy at first glance, but it has a practical inconsistency. Let's say the user uploaded two variants of the same font using the local font uploader. If the user unselects one font variant and saves the changes, all the data about the font (font face definition and asset) will be deleted, so there will be no way to show the font variant as unselected after the user saves the changes. The result would be an inconsistent list before and after saving.

A workaround for this could be to persist the list of fonts differently, but that would add a new layer of complexity to the current global styles/settings architecture, and It doesn't seem to be clear when a font face should be completely removed from the list.

Another related issue is when all the font faces are unselected. Currently, the font family definition is removed when all font variants are removed. What would happen with the font family using the checkboxes as in the mockup? when should the font family be removed from the list?

To avoid these problems, I implemented the remove button, which deletes the variants from the list, so the list looks equal before and after saving the changes.

About the save button in the modal:
There is a button to save in the modal but I think this can be problematic in a few ways. The font changes are part of the global styles and we already have a button to save the global styles. If we add this button we will be duplicating the same functionality. Apart from that, when one clicks the save button for the global styles it gets this menu to confirm the saving action. I think that clicking "Save" in the modal but confirming in the header could be confusing.

image

Maybe we can remove this button and apply the changes when the user toggles the selection of the variant. For saving the changes we can continue using the header "Save" button as with the rest of the global styles.

image

@richtabor
Copy link
Member

Considering there is no technical limit around the number of fonts a user can install, could this list grow too long?

Chiming in here - I don't think the list could be too long. We could perhaps consider following up with a UI notice if there are a lot of font families loaded, to help guide users away from having too many.

...when should the font family be removed from the list?

I'd say when there are no active (checked) font variations loading from that particular font family. We could update the "12 styles" label to reflect the number of active/total styles 2/12 styles if they're not all active.

We could also consider a control to remove all variants from a font family (instead of having to check all {x} variants, to remove a font family.

Maybe we can remove this button and apply the changes when the user toggles the selection of the variant. For saving the changes we can continue using the header "Save" button as with the rest of the global styles.

Are there any other modal dialogs that don't have a save button, requiring the "Save" primary button up top? The editor preferences modal does not have a save button, although those settings are established as soon as you toggle.

It's logical we should tie into the existing Global Styles saving, although confirming the modal settings is important. I'd appreciate @jameskoster's point of view.

@jameskoster
Copy link
Contributor

To avoid any confusion with actual saving we've used "Apply" as a button label in other areas like the Lock Status modal for blocks, and the Push-to-global-styles flow. That could work here? "Done" is another option.

@jasmussen
Copy link
Contributor

Considering there is no technical limit around the number of fonts a user can install, could this list grow too long?

Potentially, but this seems a bridge to cross when we get to it, especially since it should show family names, not individual weights here. We are already in some places warning that too many fonts can have a performance impact, perhaps that can be expanded if need be.

More importantly, I think the mockup looks more 'tidy' than the current implementation in this branch, but I think it has an important downside: the font's lack of pre-visualization. Could we combine the two options' strong points (tidiness and previsualization) into one?

It sounds like you're referring to this part of the mockup:

Screenshot 2023-01-16 at 09 05 00

We could maybe do something like this?

Managing font weights

Could we move this list into the modal so we can display the list of installed fonts with their previsualization?

I'm waffling on the modal. Also per the feedback by Rich and Jay, it's a tricky needle to thread, even if I agree that "Apply" can work. I do appreciate that the modal offers more overview for previewing.

Since the branch is already managing a lot of this in-sidebar, perhaps we can start there, and keep a PR putting it into a modal as a separate exploration?

@priethor priethor added [Type] Feature New feature to highlight in changelogs. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Jan 19, 2023
@annezazu
Copy link
Contributor

@matiasbenedetto is this still an active PR? Asking in light of checking in on Phase 2 items and trying to get a sense of where work is being done, especially with these very recently refreshed designs.

@jasmussen
Copy link
Contributor

👋 just for awareness, I updated mockups in #45271, which I hope should be easier to implement, and be close to what's here. Let me know how I can help!

@matiasbenedetto
Copy link
Contributor Author

matiasbenedetto commented Apr 21, 2023

@matiasbenedetto is this still an active PR? Asking in light of checking in on Phase 2 items and trying to get a sense of where work is being done, especially with these very recently refreshed designs.

I haven't been working on the UI for the last couple of months.
We would need to implement this #47420 to persist the font data and move this work forward, I guess.

I will try to take a look at the data work to know if I can contribute to that.

@github-actions
Copy link

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

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

@oandregal oandregal mentioned this pull request May 5, 2023
@matiasbenedetto matiasbenedetto mentioned this pull request May 24, 2023
@matiasbenedetto matiasbenedetto mentioned this pull request Sep 5, 2023
@matiasbenedetto
Copy link
Contributor Author

This was an experiment used to kickstart the development of Font Library. Closing it now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Type] Feature New feature to highlight in changelogs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants