# jss-compose

> JSS plugin for classes composition

Latest version **5.0.0** (published 2017-09-30) · MIT license · 0 weekly downloads

## Install

```sh
npm install jss-compose
pnpm add jss-compose
yarn add jss-compose
bun add jss-compose
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 5.0.0 |
| Published | 2017-09-30 |
| First published | 2016-09-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 1 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Pavel Davydov |
| Maintainers | kof, typical000 |
| Keywords | cssinnjs, css-in-js, css in js, jss, plugin, compose, composition |

## Links

- npm: https://www.npmjs.com/package/jss-compose
- Repository: https://github.com/cssinjs/jss-compose
- Homepage: https://github.com/cssinjs/jss-compose#readme
- Issues: https://github.com/cssinjs/jss-compose/issues
- npm.io page: https://npm.io/package/jss-compose

## Dependencies (1)

- [warning](https://npm.io/package/warning.md) ^3.0.0

## Alternatives

- [style-dictionary](https://npm.io/package/style-dictionary.md) — 2.0M weekly downloads
- [postcss-merge-idents](https://npm.io/package/postcss-merge-idents.md) — 1.7M weekly downloads
- [@fontsource/noto-sans](https://npm.io/package/@fontsource/noto-sans.md) — 93.0K weekly downloads
- [uglifycss](https://npm.io/package/uglifycss.md) — 71.6K weekly downloads
- [mat4-interpolate](https://npm.io/package/mat4-interpolate.md) — 23.3K weekly downloads

## Recent versions

- 5.0.0 (latest) — 2017-09-30
- 4.0.0 — 2017-06-20
- 3.0.1 — 2017-04-10
- 3.0.0 — 2017-04-10
- 2.1.0 — 2017-03-21
- 2.0.1 — 2017-02-27
- 2.0.0 — 2016-12-08
- 1.1.0 — 2016-09-30
- 1.0.1 — 2016-09-27
- 1.0.0 — 2016-09-25

## README

# JSS plugin for classes composition

This plugin allows you to use CSS frameworks and legacy code together with JSS as well as reuse Rules more granularly.

Make sure you read [how to use
plugins](https://github.com/cssinjs/jss/blob/master/docs/setup.md#setup-with-plugins)
in general.

[![Gitter](https://badges.gitter.im/JoinChat.svg)](https://gitter.im/cssinjs/lobby)

## Compose with global classes.

To combine JSS with CSS framework like [Material Design Lite](https://getmdl.io/) or [Bootstrap](http://getbootstrap.com/) and others.

```javascript
const styles = {
  button: {
    // Using space separated class names.
    composes: 'btn btn-primary',
    color: 'red'
  }
  buttonActive: {
    // Using an array of class names.
    composes: ['btn', 'btn-primary'],
    color: 'blue'
  }
}
```
Compiles to:

```css
.button-123456 {
  color: red;
}
.buttonActive-123456 {
  color: blue;
}
```

When you use it:

```javascript
<button className={classes.button}>Button</button>
<button className={classes.buttonActive}>Active Button</button>
```
It renders to:
```html
<button class="button-123456 btn">Button</button>
<button class="button-123456 btn btn-primary">Active Button</button>
```

## Compose with local classes.

Manage element states without rules duplication.
To reference a local rule, prefix the rule name with `$` symbol.

```javascript
const styles = {
  button: {
    color: 'black'
  },

  // You can chain compositions
  buttonActive: {
    composes: '$button',
    color: 'red'
  },
  buttonActiveDisabled: {
    composes: '$buttonActive',
    opacity: 0.5
  },

  // Or use arrays
  disabled: {
    opacity: 0.5
  },
  active: {
    color: 'red'
  },
  buttonDisabled: {
    composes: ['$button', '$active', '$disabled']
  }
}
```

Compiles to:

```css
.button-123456 {
  color: black;
}
.buttonActive-123456 {
  color: red;
}
.buttonActiveDisabled-123456 {
  opacity: 0.5;
}
.disabled-123456 {
  opacity: 0.5;
}
.active-123456 {
  color: red;
}
/* Rule `buttonDisabled` is not compiled to CSS, because it has no own properties. */
```

When you use it:

```javascript
<button className={classes.buttonActiveDisabled}>Active Disabled Button</button>
<button className={classes.buttonDisabled}>Disabled Button with active state</button>
```
It renders to:
```html
<button class="button-123456 buttonActive-123456">Active Disabled Button</button>
<button class="buttonDisabled-123456 button-123456 active-123456 disabled-123456">Disabled Button with active state</button>
```

## Mix global and local classes.

You can compose both local and global classes at the same time.

```javascript
const styles = {
  active: {
    color: 'red'
  },
  button: {
    composes: ['$active', 'btn', 'btn-primary'],
    color: 'blue'
  }
}
```

Compiles to:

```css
.active-123456 {
  color: red;
}
.button-123456 {
  color: blue;
}
```

When you use it:

```javascript
<button className={classes.button}>Button</button>
```
It renders to:
```html
<button class="button-123456 active-123456 btn btn-primary">Button</button>
```

## Caveats

- Doesn't work within [global Style Sheets](https://github.com/cssinjs/jss-global).
- Does not work inside of [nested rules](https://github.com/cssinjs/jss-nested).
- When composing local rules, they need to be defined first. Otherwise you get wrong css selector order and specificity.

## Issues

File a bug against [cssinjs/jss prefixed with \[jss-compose\]](https://github.com/cssinjs/jss/issues/new?title=[jss-compose]%20).

## Run tests

```bash
npm i
npm test
```

## License

MIT

---
_Source: https://npm.io/package/jss-compose · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
