react-transform-bem
v0.0.8
Published
Constructs BEM classes from block, element and modifiers attributes.
Downloads
5
Readme
react-transform-bem
A react-transform
that
constructs BEM classes from block
, element
and modifiers
attributes.
Introduction
Warning: This project is not yet production ready.
Writing BEM classes in your HTML can be a pain; instead, this transform
constructs class names for you. All you have to do is specify which DOM
elements are blocks with the block
attribute, elements with the
element
attribute and modifiers with the modifiers
attribute. These
attributes will be consumed and replaced with the className
attribute,
where all necessary class names are written.
Installation
$ npm install react-transform-bem [--save[-dev]]
Usage
The following React component...
export default () => (
<div block="person" modifiers="female">
<div element="mouth" />
<div element="hand" modifiers="right open" />
</div>
);
Becomes...
<div class="person person--female">
<div class="person__mouth"></div>
<div class="person__hand person__hand--right person__hand--open"></div>
</div>
To prevent too many class names from being generated, you won't find classes
like person--female__mouth
and especially not person--female__hand--right
;
instead, you would target person__mouth
within person--female
by writing
.person--female .person__mouth
in CSS. This increases CSS specificity only
slightly and only when a modifier is used, which is still quite maintainable.
Configuration
A common strategy is to place a
babelrc file at your project root.
Here is a default configuration for babel-plugin-react-transform
:
{
"presets": ["react", "es2015"],
"plugins": [
["react-transform", {
"transforms": [
{
"transform": "react-transform-bem",
"imports": [
"react",
"classnames",
"lodash.assign",
"lodash.compact",
"lodash.find",
"lodash.isstring"
],
"blockPrefix": "",
"elementPrefix": "__",
"modifierPrefix": "--"
}
]
}]
]
}
Options
blockPrefix
Type: String
Required: false
Default: empty
You may wish to namespace all of your BEM blocks. The blockPrefix
allows you to do this.
If you set blockPrefix
to foo-
, all of your blocks will be prefixed with foo-
(e.g., foo-block1
, foo-block2
).
elementPrefix
Type: String
Required: false
Default: __
The string that appears between a BEM block its elements (e.g., block__element
).
modifierPrefix
Type: String
Required: false
Default: --
The string that appears between a BEM block and its modifiers (e.g., block--modifier
);
also, between a BEM element and its modifiers (e.g., block__element--modifier
).