@chbphone55/classnames

A simple and small JavaScript utility for joining class names together

Usage no npm install needed!

<script type="module">
  import chbphone55Classnames from 'https://cdn.skypack.dev/@chbphone55/classnames';
</script>

README

classnames

Dependency Status Maintainability Rating Known Vulnerabilities npm version downloads

A simple and small JavaScript utility for joining class names together. Made for use with frameworks like React, but can be used how you see fit.

Installation:

npm i @chbphone55/classnames
# or
yarn add @chbphone55/classnames

Usage:

First let's import it

// Node
const { classNames } = require('@chbphone55/classnames');

// ESM
import { classNames } from '@chbphone55/classnames';

Now let's use it

/* STRINGS */
classNames('loading-indicator', 'red-bg');
// => 'loading-indicator red-bg'

/* OBJECTS, falsey values cause extra spaces */
classNames({ animated: 'truthy value', 'inactive-bg': false });
// => 'animated '

/* OBJECTS & STRINGS */
classNames('loading-indicator', { animated: true });
// => 'loading-indicator animated'

/* ARRAYS (recursively flattened) */
classNames(['activated', { nested: true }]);
// => 'activated nested'

/*
  All other types will be ignored but will cause extra spaces
  if they are either, falsey object (null) or not an object/string/array
*/
classNames('test', undefined);
// => 'test '

classNames(null, 'test');
// => ' test'

/* Multiple of same value will not be removed as there is no need */
classNames('test', 'test', 'test');
// => 'test test test'

NOTE: extra spaces will not affect use with DOM elements (includes framework elements like React)

What about using it in React.js?

You simply pass the call to classNames() as the value for the attribute className={}

/* REACT CLASS COMPONENT */
class MyComponent extends React.Component {
  render() {
    const { className } = this.props;
    return <div className={classNames('test', className)}></div>;
  }
}

/* REACT FUNCTION COMPONENT */
function MyComponent({ className }) {
  return <div className={classNames('test', className)}></div>;
}

License

MIT Copyright © 2018 Christopher Brown

Influenced by Jed Watson's classnames