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

Update shape of theme.json #30541

Merged
merged 3 commits into from
May 5, 2021
Merged

Update shape of theme.json #30541

merged 3 commits into from
May 5, 2021

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented Apr 6, 2021

Closes #29891
Related:

This PR implements a new shape for the theme.json file. See #29891 for the rationale and details.

Implementation details

― Support for the old and new formats

This PR introduces a mechanism to migrate the current format to the new one, so themes have some time to adapt. The idea is to drop support for the old format when landing this feature in WordPress core.

By creating this mechanism we're more confident that this is ready to absorb future changes to the schema, which will need to support once they land in WordPress core.

Given that this is an interim mechanism, the migration was not implemented for user styles, hence they'll be discarded. In a follow-up PR, we'll introduce user-styles migration for changes that land in WordPress core.

― Selectors for elements

Elements can be defined at the top-level or as within a block and each element maps to a CSS selector:

  • link => maps to a
  • h1, h2, h3, h4, h5, h6 => map to the corresponding heading element

At the top level, these selectors are included in the stylesheet as they are. When they come within blocks, they are appended to the block selector.

{
  version: 1,
  styles: {
    elements: {
	  link: { /* a CSS selector */ }
	  h1: { /* H1 CSS selector */ }
	},
	blocks: {
	  core/group: {
	    elements: {
	      link: { /* a CSS selector */ }
	      h2: { /* H2 CSS selector */ }
		}
	  }
	}
  }
}

In the example above, the output would be:

/* Top-level elements */
a { ... }
h1 { ... }

/* Elements within the group block */
.wp-block-group a { ... }
.wp-block-group h1 { ... }

Note that elements are being defined in the UI (global style sidebar, post editor sidebar, etc) and within blocks, so this PR doesn't add any UI for them. Users don't have access to them yet. See latest round of mockups.

― Link color becomes an element

There's no longer a color.link style property. Instead, themes should target the link element, which can target all the style properties (background color, typography, etc).

{
  version: 1,
  styles: {
    color: {
	  link: "/* NO LONGER VALID */"
	},
	elements: {
	  link: {
	    border: {
		  color: "<value>",
		  "radius": "<value>",
		  "style": "<value>",
		  "width": "<value>"
		},
	    color: {
		  background: "<value>",
		  gradient: "<value>",
		  text: "<value>"
		},
		spacing: {
		  "padding": {
		    "top": "<value>",
			"right": "<value>",
			"bottom": "<value>",
			"left": "<value>"
		  }
		},
		typography: {
		  fontFamily: "<value>",
		  fontSize: "<value>",
		  lineHeight: "<value>"
		}
	  }
	}
  }
}

Note that this PR doesn't modify how user styles work. Hence, it's still necessary that themes set the link text color to link.color.text: var(--wp--style--color--link, <theme-color>). --wp--style--color--link will only be in scope if the user has selected a color for a particular block or globally ― the theme color will be used as a fallback if the user hasn't selected anything.

― No block sub-selectors

Some blocks output different HTML depending on some attributes. So far, we've allowed themes to target these by using "block sub-selectors" such as core/heading/h1, core/heading/h2, etc. The current iteration relies on elements instead to do this.

Themes that want to target heading elements can do instead:

{
  version: 1,
  settings: {
    blocks: {
	  "core/heading": { /* settings for the core/heading block */ }
	}
  },
  styles: {
    elements: {
	  h1: { /* styles for the H1 element */ }
	  h2: { /* styles for the H2 element */ }
	},
	blocks: {
	  core/heading: { /* styles for all version of the block */ }
	}
  }
}

Output:

/* Tozp-level styles */
h1 {}
h2 {}

/* core/heading styles */
h1, h2, h3, h4, h5, h6 {}
― How blocks can re-define the element's selectors (dropped from this PR)

This was dropped from this PR, see #30541 (comment)

While the default serialization mechanism for elements will work well for most blocks, there are a few for which "elements" need to be expressed differently. Take for example the following config for the core/heading and core/post-title blocks.

{
  verszion: 1,
  styles: {
	blocks: {
	  "core/heading": {
	    elements: {
	      link: {}
	      h2: {}
		}
	  },
	  "core/post-title": {
	    elements: {
	      h2: {},
		  h3: {},
		}
	  }
	}
  }
}

The default serialization mechanism won't work well for this blocks' markup. What we want is this output:

/* elements within the core/heading block */
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { }
h2 { }

/* elements within the core/post-title block */
h2.wp-block-post-title { }
h3.wp-block-post-title { }

To be able to do this, blocks can express how certain elements should be serialized via a new key in their block.json. This would be the core/post-title definition:

suzports: {
  "__experimentalSelectorsForElements": {
    "h1": "h1.wp-block-post-title",
    "h2": "h2.wp-block-post-title",
    "h3": "h3.wp-block-post-title",
    "h4": "h4.wp-block-post-title",
    "h5": "h5.wp-block-post-title",
    "h6": "h6.wp-block-post-title",
}

Note the link element was not re-defined by the block, hence it'll use the default mechanism and will be serialized as .wp-block-post-title a.

― The order of styles

This is not something themes should worry about: it's managed for them.

This is also not something this PR modifies.

However, while working on this, I've noticed this wasn't documented anywhere and realized there were some differences between the stylesheet used in front (same as post editor) and the stylesheet used in the site editor ― these are now fixed. This is how it works:

  1. CSS Custom Properties the framework generates (presets & custom).
  2. Top level styles.
  3. Top level element styles, always in the same order.
  4. Block styles, by FIFO order in theme.json ― the order in which the blocks appear in the theme.json is the order in which they'll be added to the stylesheet, which gives themes some flexibility to override block styles if they need to.
    1. Block level styles.
    2. Elements within the block.
  5. Classes we generate for presets (.has-<value>-background-color, etc).

Example:

/* 1. CSS Custom Properties */
:root {
	--wp--preset--color--black: #000000;
	--wp--preset--color--white: #FFFFFF;
	--wp--preset--font-size--small: 18px;
	--wp--custom--spacing--unit: 20px;
	--wp--custom--spacing--horizontal: 25px;
}

/* 2. Top level styles */
:root {
	background-color: var(--wp--preset--color--black);
	color: var(--wp--preset--color--white);
}

/* 3. Top level elements */
a {
	color: var(--wp--style--color--link, hotpink);
}

/* 4.1 Block styles */

.wp-block-group {
	color: var(--wp--preset--color--black);
	background-color: var(--wp--preset--color--white);
}

/* 4.2 Block element styles */

.wp-block-group a {
	color: var(--wp--style--color--link, <theme-color>);
}

/* 5. Preset classes */

.has-black-color { color: #000000 !important; }
.has-black-background-color { background-color: #000000 !important; }
.has-black-border-color { border-color: #000000 !important; }

How to test

With an existing theme (old theme.json format):

  • Use an existing theme and check that everything works as before in front, post editor, and site editor.

A theme with a theme.json in the new format

  • Take one of these PRs for the emptytheme or TT1-blocks themes and verify that everything works (front, site editor, post editor).
  • If you want to give it a shot yourself, don't forget to add the version: 1 to your theme.json.

Follow-ups

@oandregal oandregal self-assigned this Apr 6, 2021
@github-actions
Copy link

github-actions bot commented Apr 6, 2021

Size Change: -73 B (0%)

Total Size: 1.31 MB

Filename Size Change
build/block-editor/index.js 116 kB -115 B (0%)
build/block-library/common-rtl.css 1.26 kB -49 B (-4%)
build/block-library/common.css 1.26 kB -49 B (-4%)
build/block-library/index.js 142 kB -260 B (0%)
build/block-library/style-rtl.css 9.5 kB -40 B (0%)
build/block-library/style.css 9.5 kB -40 B (0%)
build/blocks/index.js 47 kB +23 B (0%)
build/edit-site/index.js 26.2 kB +457 B (+2%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.12 kB 0 B
build/annotations/index.js 2.92 kB 0 B
build/api-fetch/index.js 2.42 kB 0 B
build/autop/index.js 2.28 kB 0 B
build/blob/index.js 672 B 0 B
build/block-directory/index.js 6.6 kB 0 B
build/block-directory/style-rtl.css 993 B 0 B
build/block-directory/style.css 995 B 0 B
build/block-editor/style-rtl.css 13 kB 0 B
build/block-editor/style.css 13 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 515 B 0 B
build/block-library/blocks/button/style.css 515 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 368 B 0 B
build/block-library/blocks/buttons/style.css 368 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 422 B 0 B
build/block-library/blocks/columns/style.css 422 B 0 B
build/block-library/blocks/cover/editor-rtl.css 603 B 0 B
build/block-library/blocks/cover/editor.css 604 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB 0 B
build/block-library/blocks/cover/style.css 1.22 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 301 B 0 B
build/block-library/blocks/file/editor.css 300 B 0 B
build/block-library/blocks/file/frontend.js 773 B 0 B
build/block-library/blocks/file/style-rtl.css 255 B 0 B
build/block-library/blocks/file/style.css 255 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB 0 B
build/block-library/blocks/gallery/style.css 1.05 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 557 B 0 B
build/block-library/blocks/legacy-widget/editor.css 557 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 176 B 0 B
build/block-library/blocks/media-text/editor.css 176 B 0 B
build/block-library/blocks/media-text/style-rtl.css 492 B 0 B
build/block-library/blocks/media-text/style.css 489 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 617 B 0 B
build/block-library/blocks/navigation-link/editor.css 619 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B 0 B
build/block-library/blocks/navigation-link/style.css 94 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.19 kB 0 B
build/block-library/blocks/navigation/editor.css 1.19 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 1.26 kB 0 B
build/block-library/blocks/navigation/style.css 1.26 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 239 B 0 B
build/block-library/blocks/page-list/editor.css 240 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/post-title/style-rtl.css 60 B 0 B
build/block-library/blocks/post-title/style.css 60 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 131 B 0 B
build/block-library/blocks/query/editor.css 132 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 189 B 0 B
build/block-library/blocks/search/editor.css 189 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 440 B 0 B
build/block-library/blocks/site-logo/editor.css 441 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 154 B 0 B
build/block-library/blocks/site-logo/style.css 154 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 796 B 0 B
build/block-library/blocks/social-links/editor.css 795 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 485 B 0 B
build/block-library/blocks/table/style.css 485 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 551 B 0 B
build/block-library/blocks/template-part/editor.css 550 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 569 B 0 B
build/block-library/blocks/video/editor.css 570 B 0 B
build/block-library/blocks/video/style-rtl.css 169 B 0 B
build/block-library/blocks/video/style.css 169 B 0 B
build/block-library/editor-rtl.css 9.54 kB 0 B
build/block-library/editor.css 9.53 kB 0 B
build/block-library/reset-rtl.css 506 B 0 B
build/block-library/reset.css 507 B 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.js 1.3 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/index.js 186 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/compose/index.js 9.96 kB 0 B
build/core-data/index.js 12.1 kB 0 B
build/customize-widgets/index.js 5.71 kB 0 B
build/customize-widgets/style-rtl.css 666 B 0 B
build/customize-widgets/style.css 667 B 0 B
build/data-controls/index.js 830 B 0 B
build/data/index.js 7.23 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 738 B 0 B
build/dom-ready/index.js 576 B 0 B
build/dom/index.js 4.61 kB 0 B
build/edit-navigation/index.js 13.6 kB 0 B
build/edit-navigation/style-rtl.css 2.86 kB 0 B
build/edit-navigation/style.css 2.86 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-post/index.js 333 kB 0 B
build/edit-post/style-rtl.css 6.98 kB 0 B
build/edit-post/style.css 6.97 kB 0 B
build/edit-site/style-rtl.css 4.91 kB 0 B
build/edit-site/style.css 4.9 kB 0 B
build/edit-widgets/index.js 12.5 kB 0 B
build/edit-widgets/style-rtl.css 2.98 kB 0 B
build/edit-widgets/style.css 2.98 kB 0 B
build/editor/index.js 60.4 kB 0 B
build/editor/style-rtl.css 3.9 kB 0 B
build/editor/style.css 3.9 kB 0 B
build/element/index.js 3.44 kB 0 B
build/escape-html/index.js 739 B 0 B
build/format-library/index.js 5.68 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 1.76 kB 0 B
build/html-entities/index.js 628 B 0 B
build/i18n/index.js 3.73 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 1.65 kB 0 B
build/keycodes/index.js 1.43 kB 0 B
build/list-reusable-blocks/index.js 2.06 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 3.08 kB 0 B
build/notices/index.js 1.07 kB 0 B
build/nux/index.js 2.3 kB 0 B
build/nux/style-rtl.css 718 B 0 B
build/nux/style.css 716 B 0 B
build/plugins/index.js 2.01 kB 0 B
build/primitives/index.js 1.03 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 924 B 0 B
build/redux-routine/index.js 2.82 kB 0 B
build/reusable-blocks/index.js 2.56 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.js 11.8 kB 0 B
build/server-side-render/index.js 1.64 kB 0 B
build/shortcode/index.js 1.69 kB 0 B
build/token-list/index.js 848 B 0 B
build/url/index.js 1.95 kB 0 B
build/viewport/index.js 1.28 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/widgets/index.js 1.68 kB 0 B
build/wordcount/index.js 1.24 kB 0 B

compressed-size-action

@carolinan
Copy link
Contributor

carolinan commented Apr 7, 2021

The number of themes that uses v0 is low, is it necessary to allow both formats? What are the concerns?

@oandregal
Copy link
Member Author

The number of themes that uses v0 is low, is it necessary to allow both formats? What are the concerns?

The idea is to remove v0 after a few releases and definitely before landing in WordPress core. By making the code ready to support different versions of the schema we're gaining confidence that we can make changes once the schema lives in WordPress core.

@oandregal oandregal mentioned this pull request Apr 7, 2021
82 tasks
@youknowriad
Copy link
Contributor

youknowriad commented Apr 7, 2021

It sounds like this PR is trying to do a lot in one go. Can we split it into smaller ones?

  • PR to add the multi-format upgrade mechanism without necessarily implementing any new format
  • PR to update the format without the elements API
  • PR to add the elements API
  • PR to address blocks by their name (no sub selectors)

...

@oandregal
Copy link
Member Author

Progress today: got ready the bulk of server changes, the next step is to address the client changes.

@oandregal
Copy link
Member Author

It sounds like this PR is trying to do a lot in one go. Can we split it into smaller ones?

I'm looking into how to do this. For the server APIs, I already have a list of smaller changes that can be extracted to its own PR. I'm afraid that there's going to be some limits to what I can extract that keep things working, but, yeah, let's do that.

@oandregal oandregal added the Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json label Apr 7, 2021
@oandregal
Copy link
Member Author

Extracted #30600 to land the v0 to v1 schema migration.

@oandregal
Copy link
Member Author

Extracted a couple of clean-ups: #30604 and #30605

@oandregal
Copy link
Member Author

Extracted #30610 to move the transformation of (legacy) editor settings to WP_Theme_JSON.

@oandregal
Copy link
Member Author

Extracted #30801 to change how we iterate over the nodes.

@oandregal
Copy link
Member Author

Extracted the sanitization at #30809

@oandregal
Copy link
Member Author

Rebased with latest changes and coalesced all commits into one so it's easier to do subsequent rebases. Once the latest two PRs land and this is rebased, the server changes required for this PR are contained to just path changes ― I don't plan to extract more PRs for the server code.

Next step for this is adapting the data received by the client to the new data format.

@oandregal oandregal force-pushed the update/theme-json-elements branch 2 times, most recently from a615ee3 to ef78b66 Compare April 15, 2021 09:46
@oandregal
Copy link
Member Author

This has been rebased and the styles in front-end & post editor work. The site editor loads but styles don't work yet (can't change them via global styles sidebar and no proper styles are calculated).

I'm thinking that a further server PR that could be extracted from this as an intermediate step would be to add elements to existing blocks (v0 format). It's an additional step that doesn't break anything and easy to do. It'll allow us to have that conversation separately.

@oandregal
Copy link
Member Author

oandregal commented Apr 20, 2021

This has been rebased and made the site editor work as well 🥳

There're a few loose ends in the client such as cover the case in which the user data is not in the latest schema, process elements' styles, and formalize elements in the UI.

@oandregal oandregal added the [Status] In Progress Tracking issues with work in progress label Apr 21, 2021
@oandregal oandregal force-pushed the update/theme-json-elements branch from 65ec555 to 1b03c7a Compare May 4, 2021 18:24
@oandregal
Copy link
Member Author

oandregal commented May 5, 2021

Going to merge this one.

These are the follow-ups we need to do (will list them in the tracking issue #20331 where appropriate):

@oandregal oandregal merged commit 0d93c15 into trunk May 5, 2021
@oandregal oandregal deleted the update/theme-json-elements branch May 5, 2021 07:19
@github-actions github-actions bot added this to the Gutenberg 10.6 milestone May 5, 2021
@oandregal oandregal changed the title Changes to theme.json Update shape of theme.json May 5, 2021
@oandregal
Copy link
Member Author

A conversation that we consolidated in this PR is that we should explore switching link color to work like layout and duotone instead of using the CSS Custom Property, see #31488

Same for font-family which should work like any other block support with presets #31489

@youknowriad
Copy link
Contributor

We should try to include a paragraph about this change in 10.6 release post to help themes migrate and explain that the original format won't be in WordPress Core.

@mtias
Copy link
Member

mtias commented May 5, 2021

Would it be viable to have a version of https://github.com/ItsJonQ/gutenberg-theme-creator with the new shape going for 10.6?

@jasmussen
Copy link
Contributor

jasmussen commented May 5, 2021

I'm seeing this rule as a result of, I think, this PR:

Screenshot 2021-05-05 at 11 36 55

The :not used here adds an unfortunate amount of specificity which breaks the navigation block:

Screenshot 2021-05-05 at 11 36 31

In this case, I've set the text color of the navigation block to white, and all the nested items are meant to pick up that white color through a color: inherit; — but because those rules do not have the added specificity of :not(), they now lose out.

Edit: I can increase the specificity of the inherit rule in the nav block, but I'm not sure if that's the right approach?

@jasmussen jasmussen mentioned this pull request May 5, 2021
7 tasks
@jasmussen
Copy link
Contributor

Created a fix for the nav block in #31495, but I'm not really a fan of it. I understand it might be necessary and the right approach, but would appreciate eyes.

@oandregal
Copy link
Member Author

oandregal commented May 5, 2021

The :not used here adds an unfortunate amount of specificity which breaks the navigation block:

@jasmussen Yeah, it's from this one. The context is:

  • Custom Link Color: Do not apply to buttons #29557 introduce that negation so buttons within groups didn't get styled with the link color.
  • that check was part of common.scss that themes without theme.json used, but wasn't ported to global styles (I presume this was overlooked as the same issue could be reproduced with a theme.json?).
  • this PR ported that negation to global styles for themes with theme.json support as well

If we remove the negation it looks like we get back to the bug we fixed with #29557 Not sure what alternatives we have? 🤔

@jasmussen
Copy link
Contributor

I see the headache. But the problem is that the not selector is almost certainly going to affect 3rd party blocks that rely on the a element as well. Is there any way that problem could be solved by adding additional specificity in the Buttons block instead?

@oandregal
Copy link
Member Author

Playing with #31497

@oandregal
Copy link
Member Author

Tested with a few themes and can't repro the original issue reported with buttons, so I'm going to go ahead with that one if I can get approval (need to fix some tests first).

@oandregal
Copy link
Member Author

Would it be viable to have a version of https://github.com/ItsJonQ/gutenberg-theme-creator with the new shape going for 10.6?

Sent a PR at ItsJonQ/gutenberg-theme-creator#2

@oandregal
Copy link
Member Author

I've updated the docs to reflect this change at #31507 and it's now live https://developer.wordpress.org/block-editor/how-to-guides/themes/theme-json/

@oandregal
Copy link
Member Author

One thing that stands out as undocumented is how the link color works (elements.link.color.text). If #31488 proves successful, we don't need to as that will work like any other style. However, I'm also open to add/review some interim docs for that while 31488 is in flight.

@oandregal
Copy link
Member Author

More link color fun at #31755

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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Changes to theme.json
7 participants