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

Allow themes to enqueue custom CSS variables via theme.json #25446

Merged
merged 9 commits into from
Sep 24, 2020

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented Sep 18, 2020

Fixes #25393

This PR adds a way for themes to generate their own CSS Custom Properties via theme.json (new section settings.custom, see docs).

How to test

@oandregal oandregal self-assigned this Sep 18, 2020
@oandregal oandregal added the [Status] In Progress Tracking issues with work in progress label Sep 18, 2020
@github-actions
Copy link

github-actions bot commented Sep 18, 2020

Size Change: +1.67 kB (0%)

Total Size: 1.17 MB

Filename Size Change
build/api-fetch/index.js 3.35 kB +11 B (0%)
build/block-directory/index.js 8.53 kB +2 B (0%)
build/block-editor/index.js 128 kB -31 B (0%)
build/block-editor/style-rtl.css 11.1 kB -2 B (0%)
build/block-editor/style.css 11.1 kB -1 B
build/block-library/editor-rtl.css 8.6 kB +11 B (0%)
build/block-library/editor.css 8.6 kB +11 B (0%)
build/block-library/index.js 135 kB +302 B (0%)
build/components/index.js 167 kB +99 B (0%)
build/edit-site/index.js 20.3 kB +698 B (3%)
build/edit-site/style-rtl.css 3.51 kB +206 B (5%) 🔍
build/edit-site/style.css 3.51 kB +204 B (5%) 🔍
build/editor/index.js 45.5 kB +160 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.52 kB 0 B
build/autop/index.js 2.72 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 943 B 0 B
build/block-directory/style.css 942 B 0 B
build/block-library/style-rtl.css 7.6 kB 0 B
build/block-library/style.css 7.59 kB 0 B
build/block-library/theme-rtl.css 741 B 0 B
build/block-library/theme.css 741 B 0 B
build/block-serialization-default-parser/index.js 1.78 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 47.5 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/compose/index.js 9.42 kB 0 B
build/core-data/index.js 12 kB 0 B
build/data-controls/index.js 1.27 kB 0 B
build/data/index.js 8.43 kB 0 B
build/date/index.js 31.9 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 4.42 kB 0 B
build/edit-navigation/index.js 10.4 kB 0 B
build/edit-navigation/style-rtl.css 868 B 0 B
build/edit-navigation/style.css 871 B 0 B
build/edit-post/index.js 306 kB 0 B
build/edit-post/style-rtl.css 6.24 kB 0 B
build/edit-post/style.css 6.23 kB 0 B
build/edit-widgets/index.js 17.5 kB 0 B
build/edit-widgets/style-rtl.css 2.8 kB 0 B
build/edit-widgets/style.css 2.8 kB 0 B
build/editor/editor-styles-rtl.css 492 B 0 B
build/editor/editor-styles.css 493 B 0 B
build/editor/style-rtl.css 3.8 kB 0 B
build/editor/style.css 3.8 kB 0 B
build/element/index.js 4.45 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.49 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 1.74 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.55 kB 0 B
build/is-shallow-equal/index.js 709 B 0 B
build/keyboard-shortcuts/index.js 2.39 kB 0 B
build/keycodes/index.js 1.85 kB 0 B
build/list-reusable-blocks/index.js 3.02 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.12 kB 0 B
build/notices/index.js 1.69 kB 0 B
build/nux/index.js 3.27 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.44 kB 0 B
build/primitives/index.js 1.34 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 13.7 kB 0 B
build/server-side-render/index.js 2.61 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.24 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.74 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

@kjellr kjellr added the [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. label Sep 18, 2020
@@ -686,6 +693,7 @@ function gutenberg_experimental_global_styles_normalize_schema( $tree ) {
),
'settings' => array(
'color' => array(),
'custom' => array(),
Copy link
Member

Choose a reason for hiding this comment

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

The CSS variables are like styles e.g: one can do:

:root {
	--wp-test-var: 4;
	background-color: black;
}

Given that css variables are like styles wouldn't it make sense to set the variables together with the styles?

Copy link
Member Author

@oandregal oandregal Sep 18, 2020

Choose a reason for hiding this comment

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

Presets are also styles, though. I think it makes sense having presets & this custom thing together as they behave the same: name is generated based on the object shape, both generate CSS vars (so aren't attached to any style prop so won't do anything by themselves).


```css
:root {
--wp--theme--base-font: 16;
Copy link
Member

Choose a reason for hiding this comment

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

I think we don't need the theme prefix. The variables may not be added by the theme but for example by a plugin that filters theme.json. Also, core in the future may have default variables and it may be nece to merge core and theme variables.

Copy link
Member Author

Choose a reason for hiding this comment

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

I'm not sure I see the use cases of plugin and core. But, in the interests of having something more general, what do you think of --wp--custom--... instead?

Copy link
Member Author

Choose a reason for hiding this comment

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

Changed to --wp--custom-- in 8eba9be

Copy link
Member

Choose a reason for hiding this comment

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

Our documentation still refers --wp--theme-- should we update it?

Copy link
Member Author

Choose a reason for hiding this comment

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

Absolutely! Addressed at a3c6b25

@oandregal oandregal marked this pull request as ready for review September 18, 2020 16:15
@oandregal oandregal force-pushed the add/custom-props-theme-json branch from 1b10c40 to d2a0e7b Compare September 18, 2020 17:51
@oandregal
Copy link
Member Author

This has been rebased.

Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

From the code point of view, the implementation looks good to me 👍

Given that we are expanding the functionality of theme.json I guess it would be good to have feedback from @youknowriad and @mtias.

@@ -100,6 +100,33 @@ export default ( blockData, baseTree, userTree ) => {
);
};

const flattenTree = ( input, prefix, token ) => {
Copy link
Member

Choose a reason for hiding this comment

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

Do we need to render the custom variables on the client? There is no UI to change the custom variables, so I guess we can just keep the ones set on the server?

Copy link
Member Author

Choose a reason for hiding this comment

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

👍 I'll address in a follow-up PR.

@@ -100,6 +100,33 @@ export default ( blockData, baseTree, userTree ) => {
);
};

const flattenTree = ( input, prefix, token ) => {
let result = [];
Object.keys( input ).forEach( ( key ) => {
Copy link
Member

Choose a reason for hiding this comment

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

Minor non-blocking suggestion: I guess using reduce instead of Object.keys + forEach would simplify a little bit the code here.

@youknowriad
Copy link
Contributor

I think this is good to have. That said, I'm not sure if this feature is important enough for the first stages of theme.json.

@oandregal oandregal force-pushed the add/custom-props-theme-json branch from d2a0e7b to a3c6b25 Compare September 22, 2020 10:16
@oandregal
Copy link
Member Author

I've realized that, within the custom section, we're not transforming camelCased to kebab-case for the custom variable names and I feel we should. Going to fix that before merging this.

@oandregal oandregal merged commit d4d0830 into master Sep 24, 2020
@oandregal oandregal deleted the add/custom-props-theme-json branch September 24, 2020 11:20
@github-actions github-actions bot added this to the Gutenberg 9.1 milestone Sep 24, 2020
aristath added a commit to aristath/q that referenced this pull request Sep 24, 2020
@aristath
Copy link
Member

@nosolosw I just tested this with a test theme I've got on https://github.com/aristath/q
It works wonderfully, I can only see 1 issue: The camelCase to kebab-case conversions only work on the frontend, not the editor.

@oandregal
Copy link
Member Author

Oh, thanks for reporting @aristath! Quick fix at #25619

@oandregal oandregal changed the title Allow adding theme-only CSS variables Allow themes to enqueue custom CSS variables via theme.json Sep 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Themes Questions or issues with incorporating or styling blocks in a theme. [Status] In Progress Tracking issues with work in progress
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Should we allow creating your own CSS variables via Global Styles?
5 participants