Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cxs-css/cxs
fast af css-in-js in 0.7kb
https://github.com/cxs-css/cxs
Last synced: 15 days ago
JSON representation
fast af css-in-js in 0.7kb
- Host: GitHub
- URL: https://github.com/cxs-css/cxs
- Owner: cxs-css
- License: mit
- Created: 2016-06-29T03:44:29.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2022-12-08T17:15:43.000Z (almost 2 years ago)
- Last Synced: 2024-07-31T02:20:28.265Z (4 months ago)
- Language: JavaScript
- Homepage:
- Size: 1.33 MB
- Stars: 1,194
- Watchers: 8
- Forks: 68
- Open Issues: 44
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-list - cxs - in-js in 0.7kb | cxs-css | 1172 | (JavaScript)
README
# cxs
fast af css-in-js in 0.7kb
[![Build Status][b]](https://travis-ci.org/cxs-css/cxs)
[![Coverage][cov]](https://codecov.io/github/cxs-css/cxs)
[![js-standard-style][std]](http://standardjs.com/)
[![0.7kb gzip][kb]](https://github.com/siddharthkp/bundlesize)[b]: https://img.shields.io/travis/jxnblk/cxs/master.svg?style=flat-square
[std]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square
[kb]: https://img.shields.io/badge/gzip-0.7%20kb-brightgreen.svg?style=flat-square
[cov]: https://img.shields.io/codecov/c/github/jxnblk/cxs.svg?style=flat-square```js
const className = cxs({ color: 'tomato' })
```cxs is a minimal css-in-js solution that uses an atomic css approach to maximize performance and deduplication
## Features
- 0.7 KB
- Zero dependencies
- High performance
- Style encapsulation
- Deduplicates repeated styles
- Dead-code elimination
- Framework independent
- Media queries
- Pseudoclasses
- Nesting
- No CSS files
- No tagged template literals
- Optional [React component](#react-components) API## Install
```sh
npm install cxs
```## Usage
cxs works with any framework, but this example uses React for demonstration purposes.
```js
import React from 'react'
import cxs from 'cxs'const Box = (props) => {
return (
)
}const className = cxs({
padding: '32px',
backgroundColor: 'tomato'
})export default Box
```### Pseudoclasses
```js
const className = cxs({
color: 'tomato',
':hover': {
color: 'black'
}
})
```### Media Queries
```js
const className = cxs({
fontSize: '32px',
'@media screen and (min-width: 40em)': {
fontSize: '48px'
}
})
```### Child Selectors
```js
const className = cxs({
color: 'black',
' > a': {
color: 'tomato'
}
})
```### Static/Server-Side Rendering
For Node.js environments, use the `css()` method to return the static CSS string *after* rendering a view.
```js
import React from 'react'
import ReactDOMServer from 'react-dom/server'
import cxs from 'cxs'
import App from './App'const html = ReactDOMServer.renderToString()
const css = cxs.css()const doc = `
${css}
${html}
`// Reset the cache for the next render
cxs.reset()
```Note: cxs does not currently have a mechanism for rehydrating styles on the client, so use with caution in universal JavaScript applications.
## React Components
cxs also has an alternative higher order component API for creating styled React components, similar to the [styled-components][sc] API.
```js
import cxs from 'cxs/component'const Heading = cxs('h1')({
margin: 0,
fontSize: '32px',
lineHeight: 1.25
})
```### Extending components
To extend a cxs component, pass it to the component creator function.
```js
const Button = cxs('button')({
color: 'white',
backgroundColor: 'blue'
})const TomatoButton = cxs(Button)({
backgroundColor: 'tomato'
})
```### Other components
Any component can be passed to cxs to add styles.
```js
import { Link } from 'react-router'const MyLink = cxs(Link)({
color: 'tomato'
})
```Note: components must accept `className` as a prop to work with cxs.
### Functional styles
cxs components can also handle dynamic styling based on props by passing a function as an argument
```js
const Heading = cxs('h1')(props => ({
color: props.color
}))
```#### Removing style props
To remove style props from the rendered HTML element,
use the [`prop-types`][pt] package to define `propTypes` on a component.
cxs/component will remove any prop that matches a key from the `propTypes` object.```js
import cxs from 'cxs/component'
import PropTypes from 'prop-types'const Heading = cxs('h2')(props => ({
fontSize: props.big ? '48px' : '32px'
}))Heading.propTypes = {
big: PropTypes.bool
}
```### styled-system
Style utility functions, like those in [styled-system][s2], can be used with cxs/component.
```js
import cxs from 'cxs/component'
import {
space,
color
} from 'styled-system'const Heading = cxs('h2')(space, color)
```### Theming
Theming is supported with the `` component.
```jsx
import React from 'react'
import ThemeProvider from 'cxs/ThemeProvider'
import theme from './theme'const App = props => (
Hello
)
``````jsx
import cxs from 'cxs/component'const Heading = cxs('h2')(props => ({
fontSize: props.theme.fontSizes[4] + 'px',
color: props.theme.blue
}))
```## API
### `cxs(...styles)`
Accepts styles objects or functions that return style objects and returns a className string.
### `cxs.css()`
Returns the rendered CSS string for static and server-side rendering.
### `cxs.reset()`
Resets the cache for server-side rendering
### `cxs.prefix(val)`
Updates the default class name prefix with the value passed to this function.
### `cxs/component`
A [styled-components][sc]-like API for creating React components with cxs.
---
### Vendor prefixes
cxs **does not** handle vendor prefixing to keep the module size at a minimum.
### Previous Versions
For previous versions of cxs, see the [v3 branch][v3] or [v4 branch][v4]
[sc]: https://www.styled-components.com (styled-components)
[pt]: https://www.npmjs.com/package/prop-types[s2]: https://github.com/jxnblk/styled-system
[v3]: https://github.com/cxs-css/cxs/tree/v3
[v4]: https://github.com/cxs-css/cxs/tree/v4[MIT License](LICENSE.md)