WordPress / gutenberg

The Block Editor project for WordPress and beyond. Plugin is available from the official repository.
https://wordpress.org/gutenberg/
Other
10.16k stars 4.05k forks source link

Consider allowing themes to enqueue stylesheets in theme.json #26902

Open kjellr opened 3 years ago

kjellr commented 3 years ago

If all of the add_theme_support() options from https://github.com/WordPress/gutenberg/issues/26901 are incorporated into theme.json, the only things a theme must include in a functions.php file are its stylesheets.

For the sake of discussion, would it be possible (and a good idea) to allow block-based themes to define their front-end and editor stylesheets directly from within theme.json?

scruffian commented 3 years ago

Will themes still need style sheets?

kjellr commented 3 years ago

Many themes will still have stylesheets for things like transition and animations, etc. Global Styles won't cover all of those use cases.

But at a baseline, they'll need a style.css to house the standard DocBloc. WP won't currently recognize a theme without one. (I guess this could be changed. 😄)

scruffian commented 3 years ago

In which case can we just always enqueue style.css without needing a line in functions.php? Other stylesheets could be @imported into style.css...

kjellr commented 3 years ago

Yeah, currently, @imported stylesheets aren't loaded into the editor at all, so that would need to be changed. I filed https://github.com/WordPress/gutenberg/issues/26963 to discuss that point.

jorgefilipecosta commented 3 years ago

The issue with imported stylesheets is that a plugin would have no way to not enqueue a specific stylesheet.

jorgefilipecosta commented 3 years ago

But at a baseline, they'll need a style.css to house the standard DocBloc. WP won't currently recognize a theme without one. (I guess this could be changed. 😄)

I think we should allow the docblock to come from theme.json in order to allow a theme without any CSS and just with a theme.json file.

jorgefilipecosta commented 3 years ago

I think it would be a good idea to allow theme.json to load external stylesheets. I imagine something like:

styles: {
    "$handle": {
        "src": "/assets/alignments-front.css",
        "ver": (optional contrary to wp_enqueue_style defaults to the theme version instead of the core version WordPress version, we know that on theme.json we are in theme code and the theme version is more important).
        "media": (optional same as wp_enqueue_style media)
    }
}

Styles loaded in this way would behave exactly like the styles added in PHP, and plugins could interact with them in the same way.

cc: @mtias, @youknowriad

youknowriad commented 3 years ago

I don't know if this is a good idea, I need to think about it more but what I know is that the capabilities of theme.json are growing constantly and IMO before thinking of adding new features, let's make sure what we already have works perfectly. (For instance, do we really want to show all global styles UI like we have now, or do we want it to be controlled by the theme?)

oandregal commented 3 years ago

I'd say the theme.json model (configs per block/context) is at odds with loading stylesheets that don't match those elements. I'd also refrain from trying to do this at the moment.

A different approach that was mentioned https://github.com/WordPress/gutenberg/issues/26901 is whether we can/should do some things automatically (like enqueueing block styles, etc) if a theme has a theme.json. I think this could be good to explore to understand the trade-offs better.

oandregal commented 3 years ago

Cross-referencing this convo https://github.com/WordPress/theme-experiments/pull/81#discussion_r523098646 TLDR: if we want to remove the stylesheets, we have to update the logic for what WordPress core & WordPress theme directory considers a minimum theme.

jorgefilipecosta commented 3 years ago

For instance, do we really want to show all global styles UI like we have now, or do we want it to be controlled by the theme?

Hi @youknowriad,

The UI controls are already controlled by the theme right now.

Themes can control all these settings at the global level and at the block level, e.g., a theme can disable all these settings at the global level but enable for specific blocks or the contrary. There is no difference between enabling/disabling at the global styles or block level. E.g., if a theme disables line height for a paragraph, it will stop being available in the paragraph block inspector and in the global styles paragraph panel.

Would you recommend a change in the API's we have to disable UI elements from the user, or is there anything you think is missing?

youknowriad commented 3 years ago

How do I do that now?

overclokk commented 3 years ago

@import inside a stylesheet should never being used.

oandregal commented 2 years ago

I learned that we have an issue with dynamic styles. It affects both the ergonomics of theme authors and the iframe work: https://github.com/WordPress/gutenberg/issues/18571

In talking to @ellatrix about this, a system along the lines of @jorgefilipecosta proposal above could help address all these issues:

I was initially thinking that we could use a similar method as of the block.json for blocks: just having a stylesheets key to declare a handle. But it sounds like allowing to declare the styles to be enqueued solves more issues.

ellatrix commented 11 months ago

Would be cool to do this.