- From: Justin Fagnani via GitHub <sysbot+gh@w3.org>
- Date: Fri, 16 Oct 2020 18:46:08 +0000
- To: public-css-archive@w3.org
justinfagnani has just created a new issue for https://github.com/w3c/csswg-drafts:
== Multiple stylesheets per file ==
With [Cascading Stylesheet Module scripts](https://github.com/w3c/webcomponents/blob/gh-pages/proposals/css-modules-v1-explainer.md) on the horizon we will soon have the ability to import CSSStyleSheets directly into JS, like so:
```js
import sheet from './styles.css' assert {type: 'css' };
```
## Problem
The semantics here are fine for unbundled apps, but bundling becomes tricky. If you have two .css files in an app, you can't just combine them. ie:
```js
import sheet1 from './styles1.css' assert {type: 'css' };
import sheet2 from './styles2.css' assert {type: 'css' };
```
Is not compatible with:
```js
import sheet from './styles1and2.css' assert {type: 'css' };
```
The current workaround is to compile CSS into JS modules, which defeats some of the performance benefit of having the browser directly load and parse CSS.
Web Bundles _might_ solve this problem generically for multiple file types, though its future on multiple browsers seems unclear right now.
## Proposal: `@sheet`
To fix this and allow bundling of CSS, could we introduce an at-rule that contains an entire style sheet as its contents?
For example, there could be a `@sheet` rule which allows files to contain named stylesheets:
styles1and2.css:
```css
@sheet sheet1 {
:host {
display: block;
background: red;
}
}
@sheet sheet2 {
p {
color: blue;
}
}
```
These could be imported separately from JS:
```js
import {sheet1, sheet1} from './styles1and2.css' assert {type: 'css' };
```
And also be available on the main style sheet:
```js
import styles, {sheet1, sheet1} from './styles1and2.css' assert {type: 'css' };
styles.sheet1 === sheet1;
```
## Relation to existing approaches
The proposal is most obviously relevant to code that manages CSSStyleSheets in JS - ie, users of [Constructible StyleSheets](https://wicg.github.io/construct-stylesheets/) and the API currently named adoptedStyleSheets.
It would also be useful as a bridge to userland CSS loaders that do bundling and scoping via selector rewriting. By standardizing bundling, scoping could be done with client-side utilities:
```js
import {sheet1, sheet1} from './styles.css' assert {type: 'css' };
// doesn't yet exist, but a utility that re-writes class selectors and returns
// an object with a .sheet property and properties for each class
import {scopeSheet} from 'css-module-utilities';
const scopedSheet1 = scopeSheet(sheet1);
const scopedSheet2 = scopeSheet(sheet2);
document.adoptedStyleSheets.push(scopedSheet1.sheet, scopedSheet2.sheet);
document.append(`<div class="${scopedSheet1.fooClass}"></div>`);
document.append(`<div class="${scopedSheet2.barClass}"></div>`);
```
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/5629 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Friday, 16 October 2020 18:46:10 UTC