1.1.2 • Published 10 years ago

bem_ v1.1.2

Weekly downloads
1
License
MIT
Repository
-
Last release
10 years ago

BEM Classname

NPM version

An easy way to build BEM-like classes with amusing chain interface.

const BEMClassName = require('bem_');

// b has e (element) and m (modifier) methods
// which are chainable.
// To return the actual classname you should cast the instance to String
const b = new BEMClassName('block');

// block
String(b);

// block__button
String(b.e('button'));

// block block_red
String(b.m('red'));

// block__button block__button_red
String(b.e('button').m('red'))

// block__button block__button_red block__aside
String(b.e('button').m('red').e('aside'))

// block__button_color_red
String(b.e('button').m('color', 'red'));

With custom delimiters

const BEMClassName = require('bem_');
const b = new BEMClassName('block', {
    ELEMENT_DELIMITER: '-',
    MODIFIER_DELIMITER: '--'
});

// block-button block-button--red block-aside
String(b.e('button').m('red').e('aside'))

You can make chains of any length to build several classes:

const BEMClassName = require('bem_');
const b = new BEMClassName('block');

// block__foo block__bar block__bar_red block__baz
b.e('foo').e('bar').m('red').e('baz')

You can concat optional classes to chain:

const BEMClassName = require('bem_');
const b = new BEMClassName('block');

// block__foo block__bar block__bar_red block__baz block__baz_green custom-class or string of classes
b.e('foo').e('bar').m('red').e('baz').concat('custom-class').concat('or string of classes').m('green')

React Mixin

Mixin adds b to component`s prototype. It's a link to the new instance created for the displayName of the component.

NOTE: You should define displayName

const bemifyClassName = require('bem_/react-mixin');

React.createClass({
    displayName: 'button',

    mixins: [bemifyClassName],

    render() {
        return (
            <div className={this.b}>
                <div className={this.b.e('content')}>
                    {this.props.text}
                </div>
            </div>
        );
    }
})

NOTE: React casts the object to String during build the classname for actual DOM

It's convenient to add or skip some modifiers according to props:

React.createClass({
    displayName: 'button',

    render() {
        return (
            <div className={this.b.m(this.props.red ? 'red' : null)}>
                <button className={this.b.e('content')} />
            </div>
        );
    }
})

You can use b as a function, if you need to constuct an arbitrary block`s name. It creates a new chain.

React.createClass({
    displayName: 'button',

    render() {
        return (
            <div className={this.b.m(this.props.red ? 'red' : null)}>
                <button className={this.b.e('content')} />
                <span className={this.b('another-block')} />
            </div>
        );
    }
})

Install

$ npm install bem_

Similar projects

I've been finding similar projects, check out some of them:

I found the chain interface more brief and convenient.

1.1.2

10 years ago

1.1.1

10 years ago

1.1.0

10 years ago

1.0.2

10 years ago

1.0.1

10 years ago

1.0.0

10 years ago