0.4.0 • Published 9 years ago

bluecore-classnames v0.4.0

Weekly downloads
3
License
ISC
Repository
github
Last release
9 years ago

bluecore-classnames

Utility to build BEM class names for React components.

Example

import React from 'react';
import {cx, ClassNames} from 'bluecore-classnames';

@ClassNames
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {hovered: true};
  }

  render() {
    return (
      <div className={cx('base')}>
        <div className={cx('inner')}>
          <div className={cx('first', ['active'])}>
          <div className>={cx('second', {hovered: this.state.hovered})}</div>
        </div>
      </div>
    );
  }
}

export default MyComponent

Will be transformed into

div className: 'base',
  div className: 'base_inner',
    div className: 'base_inner_first base_inner_first--active'
    div className: 'base_inner_second base_inner_second--hovered'

It can be very helpfull if you're using less or sass.

If you're using coffeescript:

React = require 'react'
{div} = React.DOM
{cx, ClassNames} = require 'bluecore-classnames/index.coffee'

class MyComponent extends ClassNames React.Component
  constructor: (props) ->
    super props
    @state = hovered: true

  _render: ->
    div className: cx('base'),
      div className: cx('inner'),
        div className: cx('first', ['active'])
        div className: cx('second', hovered: @state.hovered)

module.exports = MyComponent

How to use

!!! To use es6 decorators you need to compile your code with babel compiler with stage-1 preset enabled.

Just apply ClassNames decorator to your React class. To apply decorator to coffeescript class like in the example, you need to rename render method to _render.

ClassNames decorator accept className in format

className: ?<String>, additional className
element: <String>, name of your element
modifiers: ?<[String] || Object>, where object key is modifier name

cx has the following declaration:

cx(element: <String>, modifiers: ?<Array, Object>)

Also you can set default values for compiler:

import {Compiler} from 'bluecore-classnames';
Compiler.setDefaults({
  isStrict: false,
  elementDelimeter: '-',
  modifierDelimeter: '__'
});

If decorator found classNames with <string> type it treats them as usual classNames.

import {Compiler} from 'bluecore-classnames';
Compiler.setDefaults({isStrict: false});

will make compiler to treat string classNames as element, so code below will work too:

<div className={'base'}>
  <div className={'inner'}>
    <div className={cx('first', ['active'])}>
    <div className>={cx('second', {hovered: this.state.hovered})}</div>
  </div>
</div>

or you can pass config directly to decorator:

@ClassNames({isStrict: false})
class MyComponent extends React.Component {
  ...
}

License: MIT

0.4.0

9 years ago

0.3.7

9 years ago

0.3.6

10 years ago

0.3.5

10 years ago

0.3.4

10 years ago

0.3.3

10 years ago

0.3.2

10 years ago

0.3.1

10 years ago

0.3.0

10 years ago

0.2.1

10 years ago

0.2.0

10 years ago

0.1.5

10 years ago

0.1.4

10 years ago

0.1.3

10 years ago

0.1.2

10 years ago

0.1.1

10 years ago

0.1.0

10 years ago