@henit/bem-class
TypeScript icon, indicating that this package has built-in type declarations

0.2.0 • Public • Published

Bem Class

A small, simple tool (without dependencies) for writing class names in BEM-syntax for DOM elements, with a simplified syntax that avoids large amounts of repetition.

Installation

npm install --save @henit/bem-class

Usage

The examples use React, but bem-class can be used with any library or framework

Example without any class library

function Button({ className, icon, variant, size, disabled, label }) {
  return (
    <button className={`button button--variant-${variant} button--size-${size} ${disabled ? 'button--disabled' : ''} ${className}`}>
      <i className={`button__icon button__icon--large iconlib-${type}`} />
      <span className="button__label">
        {label}
      </span>
    </button>
  )
}

Example with standard classname library (not made for BEM)

import classLib from 'class-library';

function Button({ className, icon, variant, size, disabled, label }) {
  const classNames = classLib(
    'button',
    `button--variant-${variant}`,
    `button--size-${size}`,
    { 'button--disabled': disabled },
    className,
  };

  return (
    <button className={classNames}>
      <i className={classLib('button__icon', 'button__icon--' + size, 'iconlib-' + type} />
      <span className="button__label">
        {label}
      </span>
    </button>
  )
}

Example with bem-class

import bemClass from '@henit/bem-class';

const cn = bemClass('button');

function Button({ className, icon, variant, size, disabled, label }) {
  return (
    <button className={cn({ variant, size, disabled }, [className])>
      <i className={cn('icon', { large }, [`iconlib-${type}`]} />
      <span className={cn('label')}>
        {label}
      </span>
    </button>
  )
}

API

The default export from bem-class is a factory function that takes the block name as argument, and returns a classname-creator function for that block:

import bemClass from '@henit/bem-class';

const cn = bemClass('button');

The block function returns a class name string ready for use in the DOM.

Three types of arguments can be sent to the created block function (i.e. cn):

When called without an element (string argument), the block function return the block (with any given modifiers/mixes).

Examples

cn() // 'button'

cn({ color: 'blue', outlined: true, disabled: false }) // 'button button--color-blue button--outlined'

cn(['save-button']) // 'button save-button'

cn({ color: 'blue' }, ['form-control', 'save-button']) // 'button button--color-blue form-control save-button'

cn('label') // 'button__label'

cn('label', { color: 'blue', outlined: true, disabled: false }) // 'button__label button__label--color-blue button__label--outlined'

cn('label', ['form-label']) // 'button__label form-label'

cn('label', { variant: 'large' }, ['form-label']) // 'button__label button__label--variant-large form-label'

And that's it!

Readme

Keywords

none

Package Sidebar

Install

npm i @henit/bem-class

Weekly Downloads

1

Version

0.2.0

License

MIT

Unpacked Size

31.6 kB

Total Files

16

Last publish

Collaborators

  • henit