Spaces:
Sleeping
Sleeping
| # PostCSS Cascade Layers [<img src="https://postcss.github.io/postcss/logo.svg" alt="PostCSS Logo" width="90" height="90" align="right">][postcss] | |
| [<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/postcss-cascade-layers.svg" height="20">][npm-url] [<img alt="CSS Standard Status" src="https://cssdb.org/images/badges/cascade-layers.svg" height="20">][css-url] [<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/workflows/test/badge.svg" height="20">][cli-url] [<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord] | |
| [PostCSS Cascade Layers] lets you use `@layer` following the [Cascade Layers Specification]. For more information on layers, checkout [A Complete Guide to CSS Cascade Layers] by Miriam Suzanne. | |
| ```pcss | |
| target { | |
| color: purple; | |
| } | |
| @layer { | |
| target { | |
| color: green; | |
| } | |
| } | |
| /* becomes */ | |
| target:not(#\#) { | |
| color: purple; | |
| } | |
| target { | |
| color: green; | |
| } | |
| ``` | |
| ## How it works | |
| [PostCSS Cascade Layers] creates "layers" of specificity. | |
| It applies extra specificity on all your styles based on : | |
| - the most specific selector found | |
| - the order in which layers are defined | |
| ```css | |
| @layer A, B; | |
| @layer B { | |
| .a-less-specific-selector { | |
| /* styles */ | |
| } | |
| } | |
| @layer A { | |
| #something #very-specific { | |
| /* styles */ | |
| } | |
| } | |
| @layer C { | |
| .a-less-specific-selector { | |
| /* styles */ | |
| } | |
| } | |
| ``` | |
| most specific selector : | |
| - `#something #very-specific` | |
| - `[2, 0, 0]` | |
| - `2 + 1` -> `3` to ensure there is no overlap | |
| the order in which layers are defined : | |
| - `A` | |
| - `B` | |
| - `C` | |
| | layer | previous adjustment | specificity adjustment | selector | | |
| | ------ | ------ | ----------- | --- | | |
| | `A` | `0` | `0 + 0 = 0` | N/A | | |
| | `B` | `0` | `0 + 3 = 3` | `:not(#/#):not(#/#):not(#/#)` | | |
| | `C` | `3` | `3 + 3 = 6` | `:not(#/#):not(#/#):not(#/#):not(#/#):not(#/#):not(#/#)` | | |
| This approach lets more important (later) layers always override less important (earlier) layers.<br> | |
| And layers have enough room internally so that each selector works and overrides as expected. | |
| More layers with more specificity will cause longer `:not(...)` selectors to be generated. | |
| ⚠️ For this to work the plugin needs to analyze your entire stylesheet at once.<br> | |
| If you have different assets that are unaware of each other it will not work correctly as the analysis will be incorrect. | |
| ## Usage | |
| Add [PostCSS Cascade Layers] to your project: | |
| ```bash | |
| npm install postcss @csstools/postcss-cascade-layers --save-dev | |
| ``` | |
| Use it as a [PostCSS] plugin: | |
| ```js | |
| const postcss = require('postcss'); | |
| const postcssCascadeLayers = require('@csstools/postcss-cascade-layers'); | |
| postcss([ | |
| postcssCascadeLayers(/* pluginOptions */) | |
| ]).process(YOUR_CSS /*, processOptions */); | |
| ``` | |
| [PostCSS Cascade Layers] runs in all Node environments, with special | |
| instructions for: | |
| | [Node](INSTALL.md#node) | [PostCSS CLI](INSTALL.md#postcss-cli) | [Webpack](INSTALL.md#webpack) | [Create React App](INSTALL.md#create-react-app) | [Gulp](INSTALL.md#gulp) | [Grunt](INSTALL.md#grunt) | | |
| | --- | --- | --- | --- | --- | --- | | |
| ## Options | |
| ### onRevertLayerKeyword | |
| The `onRevertLayerKeyword` option enables warnings if `revert-layer` is used. | |
| Transforming `revert-layer` for older browsers is not possible in this plugin. | |
| Defaults to `warn` | |
| ```js | |
| postcssCascadeLayers({ onRevertLayerKeyword: 'warn' }) // 'warn' | false | |
| ``` | |
| ```pcss | |
| /* [postcss-cascade-layers]: handling "revert-layer" is unsupported by this plugin and will cause style differences between browser versions. */ | |
| @layer { | |
| .foo { | |
| color: revert-layer; | |
| } | |
| } | |
| ``` | |
| ### onConditionalRulesChangingLayerOrder | |
| The `onConditionalRulesChangingLayerOrder` option enables warnings if layers are declared in multiple different orders in conditional rules. | |
| Transforming these layers correctly for older browsers is not possible in this plugin. | |
| Defaults to `warn` | |
| ```js | |
| postcssCascadeLayers({ onConditionalRulesChangingLayerOrder: 'warn' }) // 'warn' | false | |
| ``` | |
| ```pcss | |
| /* [postcss-cascade-layers]: handling different layer orders in conditional rules is unsupported by this plugin and will cause style differences between browser versions. */ | |
| @media (min-width: 10px) { | |
| @layer B { | |
| .foo { | |
| color: red; | |
| } | |
| } | |
| } | |
| @layer A { | |
| .foo { | |
| color: pink; | |
| } | |
| } | |
| @layer B { | |
| .foo { | |
| color: red; | |
| } | |
| } | |
| ``` | |
| ### onImportLayerRule | |
| The `@import` at-rule can also be used with cascade layers, specifically to create a new layer like so: | |
| ```css | |
| @import 'theme.css' layer(utilities); | |
| ``` | |
| If your CSS uses `@import` with layers, you will also need the [postcss-import] plugin. This plugin alone will not handle the `@import` at-rule. | |
| This plugin will warn you when it detects that [postcss-import] did not transform`@import` at-rules. | |
| ```js | |
| postcssCascadeLayers({ onImportLayerRule: 'warn' }) // 'warn' | false | |
| ``` | |
| ### Contributors | |
| The contributors to this plugin were [Olu Niyi-Awosusi] and [Sana Javed] from [Oddbird] and Romain Menke. | |
| [cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test | |
| [css-url]: https://cssdb.org/#cascade-layers | |
| [discord]: https://discord.gg/bUadyRwkJS | |
| [npm-url]: https://www.npmjs.com/package/@csstools/postcss-cascade-layers | |
| [Gulp PostCSS]: https://github.com/postcss/gulp-postcss | |
| [Grunt PostCSS]: https://github.com/nDmitry/grunt-postcss | |
| [PostCSS]: https://github.com/postcss/postcss | |
| [PostCSS Loader]: https://github.com/postcss/postcss-loader | |
| [PostCSS Cascade Layers]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-cascade-layers | |
| [Cascade Layers Specification]: https://www.w3.org/TR/css-cascade-5/#layering | |
| [A Complete Guide to CSS Cascade Layers]: https://css-tricks.com/css-cascade-layers/ | |
| [Olu Niyi-Awosusi]: https://github.com/oluoluoxenfree | |
| [Sana Javed]: https://github.com/sanajaved7 | |
| [Oddbird]: https://github.com/oddbird | |
| [postcss-import]: https://github.com/postcss/postcss-import | |