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 theme.json: split global block selector into root and defaults #28533

Merged
merged 4 commits into from
Jan 28, 2021

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented Jan 27, 2021

This PR continues the work started at #28110 to update the shape of theme.json according to #28163 It splits the existing global block selector in two:

  • root => to address the site root
  • defaults => to address all blocks at once

Before this change, the settings under the global block selector would have two functions: serve as default values for the other blocks and actually set the "global" block:

{
  "settings": {
    "global": { ... },
    "core/paragraph": { ... }
  },
  "styles": {
    "global": { ... },
    "core/paragraph": { ... }
  }
}

After this change, the default values should be declared under the defaults block selector and the root only contains settings & styles for the block that represents the root of the site:

{
  "settings": {
    "defaults": { ... }, // The settings here serve as defaults that any block can overwrite
    "root": { ... }, // Settings specific to the root block
    "core/paragraph": { ... } // Settings specific to the paragraph block
  },
  "styles": { // The styles section can't have the `*` selector.
    "root": { ... },
    "core/paragraph": { ... }
  }
}

See updated documentation for more details.

How to test

@github-actions
Copy link

github-actions bot commented Jan 27, 2021

Size Change: -1.79 kB (0%)

Total Size: 1.37 MB

Filename Size Change
build/a11y/index.js 1.14 kB +1 B (0%)
build/annotations/index.js 3.77 kB -1 B (0%)
build/api-fetch/index.js 3.4 kB -1 B (0%)
build/block-directory/index.js 9.07 kB -3 B (0%)
build/block-editor/index.js 123 kB +26 B (0%)
build/block-library/index.js 143 kB +28 B (0%)
build/block-serialization-default-parser/index.js 1.88 kB +1 B (0%)
build/blocks/index.js 48.3 kB +3 B (0%)
build/components/index.js 275 kB +4 B (0%)
build/compose/index.js 11.2 kB +13 B (0%)
build/core-data/index.js 16.8 kB +1.59 kB (+10%) ⚠️
build/data/index.js 8.8 kB -162 B (-2%)
build/date/index.js 31.8 kB -1 B (0%)
build/deprecated/index.js 768 B -1 B (0%)
build/edit-navigation/index.js 11.1 kB +22 B (0%)
build/edit-post/index.js 306 kB +30 B (0%)
build/edit-site/index.js 24.1 kB +45 B (0%)
build/edit-widgets/index.js 20 kB -3.44 kB (-15%) 👏
build/editor/index.js 41.8 kB +11 B (0%)
build/format-library/index.js 6.76 kB -3 B (0%)
build/i18n/index.js 3.57 kB +1 B (0%)
build/keyboard-shortcuts/index.js 2.54 kB -1 B (0%)
build/list-reusable-blocks/index.js 3.15 kB +10 B (0%)
build/media-utils/index.js 5.33 kB +16 B (0%)
build/notices/index.js 1.85 kB +1 B (0%)
build/nux/index.js 3.41 kB -1 B (0%)
build/plugins/index.js 2.54 kB +9 B (0%)
build/primitives/index.js 1.42 kB -1 B (0%)
build/priority-queue/index.js 790 B +1 B (0%)
build/redux-routine/index.js 2.84 kB -2 B (0%)
build/rich-text/index.js 13.4 kB -1 B (0%)
build/server-side-render/index.js 2.77 kB +11 B (0%)
build/url/index.js 3.02 kB -1 B (0%)
build/wordcount/index.js 1.22 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/style-rtl.css 1.01 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/style-rtl.css 11.9 kB 0 B
build/block-editor/style.css 11.9 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 103 B 0 B
build/block-library/blocks/audio/style.css 103 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 453 B 0 B
build/block-library/blocks/button/style.css 451 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 227 B 0 B
build/block-library/blocks/buttons/editor.css 227 B 0 B
build/block-library/blocks/buttons/style-rtl.css 297 B 0 B
build/block-library/blocks/buttons/style.css 297 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 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/editor-rtl.css 392 B 0 B
build/block-library/blocks/cover/editor.css 393 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.25 kB 0 B
build/block-library/blocks/cover/style.css 1.25 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 375 B 0 B
build/block-library/blocks/embed/style.css 375 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 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 679 B 0 B
build/block-library/blocks/gallery/editor.css 679 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/group/editor-rtl.css 318 B 0 B
build/block-library/blocks/group/editor.css 317 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 477 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 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/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 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 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 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 392 B 0 B
build/block-library/blocks/navigation-link/editor.css 394 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 704 B 0 B
build/block-library/blocks/navigation-link/style.css 702 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.38 kB 0 B
build/block-library/blocks/navigation/editor.css 1.37 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 171 B 0 B
build/block-library/blocks/navigation/style.css 171 B 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/paragraph/editor-rtl.css 109 B 0 B
build/block-library/blocks/paragraph/editor.css 109 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 273 B 0 B
build/block-library/blocks/paragraph/style.css 273 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 249 B 0 B
build/block-library/blocks/post-comments-form/style.css 249 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-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/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 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 316 B 0 B
build/block-library/blocks/pullquote/style.css 316 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 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/editor-rtl.css 159 B 0 B
build/block-library/blocks/query/editor.css 160 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 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 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 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 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 504 B 0 B
build/block-library/blocks/shortcode/editor.css 504 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 117 B 0 B
build/block-library/blocks/site-logo/style.css 117 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 711 B 0 B
build/block-library/blocks/social-links/editor.css 712 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB 0 B
build/block-library/blocks/social-links/style.css 1.37 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 302 B 0 B
build/block-library/blocks/spacer/editor.css 302 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/subhead/editor-rtl.css 99 B 0 B
build/block-library/blocks/subhead/editor.css 99 B 0 B
build/block-library/blocks/subhead/style-rtl.css 80 B 0 B
build/block-library/blocks/subhead/style.css 80 B 0 B
build/block-library/blocks/table/editor-rtl.css 489 B 0 B
build/block-library/blocks/table/editor.css 489 B 0 B
build/block-library/blocks/table/style-rtl.css 386 B 0 B
build/block-library/blocks/table/style.css 386 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 680 B 0 B
build/block-library/blocks/template-part/editor.css 679 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/editor-rtl.css 62 B 0 B
build/block-library/blocks/verse/editor.css 62 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 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 193 B 0 B
build/block-library/blocks/video/style.css 193 B 0 B
build/block-library/common-rtl.css 1.01 kB 0 B
build/block-library/common.css 1.01 kB 0 B
build/block-library/editor-rtl.css 9.06 kB 0 B
build/block-library/editor.css 9.05 kB 0 B
build/block-library/style-rtl.css 8.61 kB 0 B
build/block-library/style.css 8.61 kB 0 B
build/block-library/theme-rtl.css 748 B 0 B
build/block-library/theme.css 748 B 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/data-controls/index.js 830 B 0 B
build/dom-ready/index.js 571 B 0 B
build/dom/index.js 4.93 kB 0 B
build/edit-navigation/style-rtl.css 938 B 0 B
build/edit-navigation/style.css 944 B 0 B
build/edit-post/style-rtl.css 6.53 kB 0 B
build/edit-post/style.css 6.52 kB 0 B
build/edit-site/style-rtl.css 4.04 kB 0 B
build/edit-site/style.css 4.04 kB 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 543 B 0 B
build/editor/editor-styles.css 545 B 0 B
build/editor/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/element/index.js 4.62 kB 0 B
build/escape-html/index.js 735 B 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 2.27 kB 0 B
build/html-entities/index.js 623 B 0 B
build/is-shallow-equal/index.js 699 B 0 B
build/keycodes/index.js 1.93 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/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/reusable-blocks/index.js 2.92 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/viewport/index.js 1.86 kB 0 B
build/warning/index.js 1.14 kB 0 B

compressed-size-action

@oandregal oandregal requested a review from a team January 27, 2021 22:19
@carolinan
Copy link
Contributor

carolinan commented Jan 28, 2021

I think the use of * here is confusing, it is not immediately clear what this symbol represents.
Consider using something more descriptive.

We want FSE to be easy to work with also for beginners, and the switch from plain CSS to a JSON format is not so easy to wrap your head around in the first place.
What I means is, when I see this symbol I don't immediately connect that this is referring to/ may be referring to the universal (All the blocks) selector in CSS.

@@ -197,7 +197,7 @@ export default function GlobalStylesSidebar( {
>
<TabPanel
tabs={ [
{ name: 'global', title: __( 'Global' ) },
{ name: 'root', title: __( 'Root' ) },
Copy link
Contributor

Choose a reason for hiding this comment

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

Similarly, exposing the term "Root" to non technical end users in the sidebar may be confusing.

Copy link
Member

Choose a reason for hiding this comment

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

+100

Copy link
Member Author

Choose a reason for hiding this comment

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

The idea we discussed in #28163 is that we have a lot of things that use the name "global", so it losses its meaning and has created confusion when talking about this. The intent is to walk away from to global to a different name as to bring some clarity in conversations:

  • global sidebar vs block sidebar
  • the typography panel of the root block in the global sidebar
  • the color panel of the paragraph block in the block sidebar
  • etc

I'm not particularly attached to the root name. Happy to hear options. site could work, although it has different connotations to me (your whole site opposed to a particular "block").

@gziolo
Copy link
Member

gziolo commented Jan 28, 2021

I echo the concern about naming. I have no idea what is the difference between * and root in the first place. Should it be maybe blocks or all rather than *?

@oandregal oandregal added this to the Gutenberg 9.9 milestone Jan 28, 2021
@youknowriad
Copy link
Contributor

I echo the concern about naming. I have no idea what is the difference between * and root in the first place.

If we take CSS as analogy, The difference is the difference between the * and the :root selectors. One applies to all blocks, one applies to the root/site block.

@mtias
Copy link
Member

mtias commented Jan 28, 2021

I tried to read through the conversations between root and * but I'm still a bit confused. Styles that apply globally across blocks (text color, links, type scale, etc) are essentially equivalent to "root" attributes (that is, to Site attributes). I see no point really in discriminating them.

What the style system describes can be reduced to: block attributes, variable styles, settings. These are always attached to a root. By default, that root is the site, so "site" is always the implicit key of the theme.json object. Further down the tree, each template part (or perhaps each semantic template part) can be a more specific provider.

I feel I'm missing something in this representation :)

@oandregal
Copy link
Member Author

oandregal commented Jan 28, 2021

Thinking on this, perhaps defaults is a better encapsulation of the meaning we originally assigned to * in #28163. I actually like it more now. It clearly signals that is not "a block" but only serves as defaults or fallbacks in case the blocks don't define their own. I already pushed this change, it's now quite easy to do.

@oandregal oandregal changed the title Update theme.json: split global block selector into root and * Update theme.json: split global block selector into root and defaults Jan 28, 2021
@oandregal
Copy link
Member Author

I think it'd be beneficial to explain a bit more the rationale to split "root" and "defaults". The first thing to note is that defaults don't have block styles, defaults only have settings. The second point is that by splitting them, we make a couple of use cases a lot easier to implement via theme.json:

  • disable a setting for all blocks but enable it for the root block
  • enable a setting for all blocks but disable it for the root block

For example, how would we implement "only enable link color for the root block".

Before this change, we need to set that in every block:

{
  "settings": {
    "global": {
      "color": {
        "link": true, // enable it for global, so now all blocks need to overwrite this to false
      }
    },
    "core/paragraph": {
      "color": {
        "link": false,
      }
    },
    "core/group": {
      "color": {
        "link": false,
      }
    },
    "core/columns": {
      "color": {
        "link": false,
      }
    },
    // ...
   // We need to set every block to false.
  // ...
  }
}

With this change, we only need to set defaults and root:

{
  "settings": {
    "defaults": {
      "color": {
        "link": false, // all blocks have this by default
      }
    },
    "root": {
      "color": {
        "link": true, // the root block chooses to overwrite it
      }
    }
  }
}

@aristath
Copy link
Member

I do like defaults a lot more than *, it makes more sense.
I agree that the term Root will maybe not be that clear for non-technical people, but that can easily be changed at any time since we're talking about the title and not the name. The name can be root (which makes sense for technical folx) regardless of what the string presented in the sidebar (the title) is.
With that in mind, I don't think that the Root term should be a blocker for this PR at this stage. It can go in as-is now and if we see that users find it confusing we change it to something better 👍

Copy link
Member

@aristath aristath left a comment

Choose a reason for hiding this comment

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

LGTM 👍
Tested and confirmed

@oandregal
Copy link
Member Author

oandregal commented Jan 28, 2021

@carolinan @gziolo @mtias Does the current setup address your concerns? I think Ari's comment summed up the situation nicely. In short:

  1. Have a defaults and a root selector in the theme.json as block selectors => this is the key of this PR and what needs to be agreed upon.

  2. At the UI level, the labels we use don't need to be final in this PR, they can be changed later => I'm fine either shipping as it is and iterate if people feel strongly against "Root" or keeping the "Global" label for now.

Ideally, we'll merge this PR before the end of the day (in ~5h), so it can be part of 9.9 (so we batch all theme.json changes in one release). Potentially also of WordPress 5.7 if the other things are ready #27506

@gziolo
Copy link
Member

gziolo commented Jan 28, 2021

I'm fine with whatever is easier to follow for theme developers 😃 It definitely it's better now!

@carolinan
Copy link
Contributor

I prefer default over *.
I have assumed that styles under root would change for example, the body background color. I am a little confused over "root block".

@mtias
Copy link
Member

mtias commented Jan 28, 2021

I see now where the difference is coming from. For me the root (or scope) is always the implicit key of the entire global style object we are dealing with. For example:

{ // implicit site root
   "styles": {},
   "settings": {},
   "blocks": {}
}

Because I think of every global styles object as something that defines a styling context and is composable. In this example site = index = root, since I guess we'd want the flexibility of specifying different settings for something like a page template vs the main index template:

// :root = body
"site": {
   "styles": {},
   "settings": {},
   "blocks": {}
}

// :root = body.page
"page": {
   ...site   /* inherits the configuration of the site and overrides specific parts */
   "styles": {},
   "settings": {},
   "blocks": {}
}

// :root = .template-part-header
"template-header": {
   ... // inherits from whatever main template contains it
   "styles": {},
   "settings": {},
   "blocks": {}
}

One scenario the above doesn't cover is a different configuration for "template-header" if it's used in "page" vs when it's used in "index", but I'm sure we can find a way to express that ("index:template-heder" and "page:template-header"). Or we might prefer to always declare sub-contexts within the "blocks" object as just "core/template-part". That's more of a detail.

I haven't been using the latest iterations in depth on a theme, so take my feedback as just my impression on the overall appearance of the system.

@oandregal
Copy link
Member Author

oandregal commented Jan 28, 2021

I just commented with Matías what he shared. There're some ideas there that we need to explore deeper as per #20331 In particular, how to express nested contexts and different templates. That topic can change our vision on how to use theme.json as the need to include other theme metadata already has. Hence, it seems premature to land this format in core for 5.7.

So, this is what I'd like to do: merge this PR in Gutenberg 9.9 and continue iterating on the plugin.

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.

6 participants