Translates CSS classes to a JavaScript file so that you can use typed definitions of styling classes in React / Vue.js etc. It includes support for BEM / ITCSS / BEMIT syntax.
Why?
- Useful for IntelliSense lookup of CSS classes in your JavaScript.
- Type safety. Ensures you only use CSS classes that are available (avoid typos / using deprecated classes etc.)
- Rolls BEM
modifiersintoblockandelementstrings e.g.my-block--large { ... }becomesMyBlock.$large === 'my-block my-block--large'.
BEM example (style.css):
.my-button { /* ... */ } .my-button--primary { /* ... */ } .my-button__link { /* ... */ } .my-button__link--bold { /* ... */ } .my-button__fancy-icon { /* ... */ }
Outputs style.css.js (and a .css.json variant too alongside unmodified input CSS):
module.exports = { MyButton: { $primary: 'my-button my-button--primary', link: { $bold: 'my-button__link my-button__link--bold', toString: function () { return 'my-button__link' } }, fancyIcon: 'my-button__fancy-icon', toString: function () { return 'my-button' } }, Grid: { item: 'grid__item', toString: function () { return 'grid' } } }
Usage
Command line example:
postcss --use postcss-bem-to-js ./style.css --config postcss.config.json
And the postcss.config.json:
{
"postcss-bem-to-js": {
"prefixMap": {
"ln-o-": "o",
"ln-c-": "c",
"ln-u-": "u"
},
"replace": {
"@": "_",
"\\/": "of",
"*": "_x"
}
}
}Config: replace
A map defining how to replace certain text/symbols in CSS with JavaScript variable naming friendly equivalents e.g.
{ replace: { '@': '_', '\\/': 'of', '*': '_x' } }
With this button@wide becomes button_wide, grid-1/2 becomes item1of2, and spacing*2 becomes spacing_x2.
Config: prefix map
You can also configure the plugin to accept a prefixMap to map namespaced (e.g. BEMIT) style naming to some other prefix e.g.
{ prefixMap: { 'o-ns-': 'o', 'c-ns-': 'c', 'u-ns-': 'u' } }
Converts o-ns-foo to oFoo
