Utility for creating BEM class names. CSS Modules support.
Block, Element, Modifier
Elements is a child of Block. Modifiers refer of to Block or Element.
block-name
__element-name
_modifier-name or _modifier-key _modifier-value
mix-name
<label class="input">
  <span class="input__label"></span>
  <input class="input__field input__field_disabled input__field_size_large" />
</label>import { createBem } from "@mukhindev/create-bem";
// BEM-block (function)
const bem = createBem("input");bem(element, modifier(s), mix(es)) return class names in BEM-style:
bem(); // input
bem("label"); // input__label
bem("label", "active"); // input__label input__label_active
bem("label", ["active", "large"]); // input__label input__label_active input__label_large
bem("label", { color: "red", large: false, active: true }); // input__label input__label_color_red input__label_active
bem("", { color: "red", large: false, active: true }); // input input_color_red input_active
bem("", "", "main-page"); // input main-page
bem("label", { color: "red" }, "main-page"); // input__label input__label_color_red main-pageThe second argument to createBem is the object created by the CSS module:
import { createBem } from "@mukhindev/create-bem";
import classes from "./style.module.css";
const bem = createBem("input", classes);
bem("label", "active"); // _input__label_{hash} _input__label_active_{hash}If the css selector is undefined or empty, CSS modules ignore class generation. Utility createBem also ignores this selector:
bem("message", "", "mix"); // "mix"If you find problems, check how your CSS selectors are hashed. Hashed names should be converted like this:
input -> _input_{hash}
input__label -> _input__label_{hash}
Often the modifier is separated by --. The third argument to createBem is options:
const bem = createBem("input", undefined, { modifierKeyDivider: "--" });Default options:
                             ↓
elementDivider: "__" // input__field_size_large
                                        ↓                          ↓
modifierKeyDivider: "_" //  input__field_size_large or input__field_active
                                              ↓
modifierValueDivider: "_" // input__field_size_large