Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ddneat/stylebuddy

🐻 Generate encapsulated css inline styles which are extremely configurable.
https://github.com/ddneat/stylebuddy

at-rules class-selectors client-side-rendering css encapsulation id-selectors inline-styles json media-queries parser preprocessor pseudo-selectors react selector server-side-rendering simple tag-selectors transform transpile vendor-prefix

Last synced: about 2 months ago
JSON representation

🐻 Generate encapsulated css inline styles which are extremely configurable.

Awesome Lists containing this project

README

        

# Stylebuddy 🐻

__Generate CSS from JSON without any additional dependencies:__

- Supports at-rules like `media queries`
- Supports pseudo selectors like `:hover`, `:focus`, `:before`, etc.
- Supports selectors by tag, class and id (e.g.: `body,`, `.components`, `#component`)
- Supports vendor prefixes like `-webkit-transition`, `display: -moz-box`, etc.
- Can be used for server side rendering
- Converts camel case property names to hyphen notation
- No dependencies
- Tiny (2kb, about 860bytes uglified and gzipped)

## Contents

- [Usage](#usage)
- [Basic Example](#basic-example)
- [API Description](#api)
- [Configuration](#configuration)
- [Stylesheet Config](#stylesheet-config)
- [Tag Selector](#tag-selector)
- [Id Selector](#id-selector)
- [Vendor Prefixes](#vendor-prefixes)
- [Flexible Stylesheet](#flexible-stylesheet)

## Usage

```console
npm install --save stylebuddy
```

## Basic Example

```javascript
import stylebuddy from 'stylebuddy';

const desktop = '@media screen and (min-width:720px)';

const input = {
component: {
background: '#ccc',
':hover': {
background: '#777'
},
[desktop]: {
fontSize: 20,
':hover': {
background: '#333'
}
}
}
};

const styleSheet = stylebuddy.create();
const styles = styleSheet.add(input);
const css = styleSheet.render();
// ._component_2513881194{background:#ccc;}.component_2513881194:hover ...

const styleNode = document.createElement('style');
document.head.appendChild(styleNode);
styleNode.textContent = css;

console.log(styles.component);
// ._component_2513881194
```

## API

### `create([, config])`

Returns a new instance of the styleSheet API. The optional config merges with the default values and will be used for the current styleSheet instance.

### `styleSheet.add(styles[, config])`

Returns an object with the generated style identifiers. The passed config will be merged with the styleSheet config.

### `styleSheet.render()`

Returns the CSS string of the current styleSheet instance.

## Configuration

```javascript
const DEFAULT_CONFIG = {
prefix: '.', // e.g.: enforce css classes
delimiter: '_',
salt: '',
hashSelector: false,
appendHash: true,
};
```

## Stylesheet Config

```javascript
import stylebuddy from 'stylebuddy';

const styleSheetConfig = {
delimiter: '___',
appendHash: false
};

const styles = {
components: {
background: '#ccc'
}
};

const styleSheet = stylebuddy.create(styleSheetConfig);
styleSheet.add(styles);
const css = styleSheet.render();
// .___components{background:#ccc;}
```

## Tag Selector

```javascript
import stylebuddy from 'stylebuddy';

const tagSelector = {
body: {
background: '#ccc'
}
};

const styleSheet = stylebuddy.create();
styleSheet.add(tagSelector, { delimiter: '', prefix: '', appendHash: false });
const css = styleSheet.render();
// body{background:#ccc;}
```

## Id Selector

```javascript
import stylebuddy from 'stylebuddy';

const idSelector = {
component: {
background: '#333'
}
};

const styleSheet = stylebuddy.create();
styleSheet.add(idSelector, { prefix: '#', appendHash: false });
const css = styleSheet.render();
// #_component{background:#333;}
```

## Vendor Prefixes

```javascript
import stylebuddy from 'stylebuddy';

const input = {
component: {
WebkitTransition: '200ms all linear',
display: ['-webkit-box', '-moz-box']
}
};

const styleSheet = stylebuddy.create();
const styles = styleSheet.add(input);
const css = styleSheet.render();
// ._component_2513881194{-webkit-transition:200ms all linear;display:-webkit-box;display:-moz-box;}
```

## Flexible Stylesheet

```javascript
import stylebuddy from 'stylebuddy';

const tagSelectors = {
body: {
background: '#ccc'
}
};

const classSelectors = {
components: {
background: '#999'
}
};

const idSelectors = {
component: {
background: '#333'
}
};

const styleSheetConfig = {
appendHash: false
};

const styleSheet = stylebuddy.create(styleSheetConfig);

styleSheet.add(tagSelectors, { prefix: '', delimiter: '' });
styleSheet.add(classSelectors, { delimiter: '___' });
styleSheet.add(idSelectors, { prefix: '#' });

const css = styleSheet.render();
// body{background:#ccc;}.___components{background:#999;}#_component{background:#333;}

const styleNode = document.createElement('style');
document.head.appendChild(styleNode);
styleNode.textContent = css;
```