Package Exports
- cxs
- cxs/optimized
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (cxs) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
ϟ cxs
Functional CSS for functional UI components
cxs is a css-in-js solution to dynamically create stylesheets with a functional approach
Features
- 5.6KB gzipped
- Avoids collisions with consistently hashed classnames
- Supports pseudo-classes without JS event listeners
- Supports media queries without using
window.matchMedia - Support @keyframe rules
- Supports nested selectors - useful for styling markdown and other user-generated content
- Dedupes repeated styles
- Avoid maintaining and using custom syntax or classname DSLs from CSS frameworks and manually written CSS
- Scoped styles with a component-based architecture
- No separate CSS files to process or maintain
- Optionally extract common CSS declarations like
display: blockandfloat: left - Use JavaScript to author styles
- Objects & Object.assign
- Module imports
- Anything from npm
- Numbers and operators
- Functions
- Plus whatever you can dream up
- No fiddling with tagged template literals
npm i cxsExample Usage
// UI component example
import yo from 'yo-yo'
import cxs from 'cxs'
const Button = ({ text, onclick }) => {
// Pass a style object to cxs, which returns a string for
// adding hashed classnames to HTML.
// Numbers are converted to px values.
// Pseudo classes and @media queries work as well.
// cxs attaches a stylesheet to the head and updates
// rules with each call.
const className = cxs({
fontSize: 14,
color: 'white',
backgroundColor: '#07c',
':hover': {
backgroundColor: '#06b'
},
'@media screen and (min-width:40em)': {
fontSize: 18
}
})
// Apply the classname to your component
return yo`
<button
className=${className}
onclick=${onclick}>
${text}
</button>
`
}// For server-side rendering,
// get the CSS string after rendering a component tree
const body = view(state).toString()
const css = cxs.css
const html `<!DOCTYPE html>
<html>
<head>
<style>${css}</style>
</head>
<body>${body}</body>
</html>
`// React example
import React from 'react'
const Box = (props) => {
return (
<div {...props} className={cx} />
)
}
// Static styles can be outside of the component render function for better performance.
const cx = cxs({
boxSizing: 'border-box',
padding: 32,
borderRadius: 3,
backgroundColor: '#f6f6f6'
})
export default ButtonNote: if you ARE NOT using babel, be sure to import with require('cxs').default
API
// Returns a hashed className string and creates CSS rules for style objects
const className = cxs({ color: 'tomato' })
// An array of attached CSS rules
const rules = cxs.rules
// A CSS string of attached rules. Useful for server-side rendering
const css = cxs.css
// The threepointone/glamor StyleSheet instance
// See https://github.com/threepointone/glamor
cxs.sheetVendor prefixes
cxs does not handle vendor prefixing to keep the module size at a minimum.
To add vendor prefixes, use a prefixing module like inline-style-prefixer
import cxs from 'cxs'
import prefixer from 'inline-style-prefixer/static'
const prefixed = prefixer({
display: 'flex'
})
const cx = cxs(prefixed)Common Declaration Utilities
Cxs comes with an alternative, experimental module that attempts to extract
commonly used declarations, such as margin: 0 and display: block, into global utility rulesets.
To use the common declarations version, import the following instead of cxs.
import cxs from 'cxs/optimized'Each common utility selector follows this pattern: .cxs-<property>-<value>.
Once a utility ruleset has been registered,
cxs will not add that ruleset to the stylesheet again, unless the cxs.clear() method has been called.
Related
Other CSS-in-JS options
Compared to other, similar modules, cxs is an attempt to create a smaller and simpler API and a smaller overall module. For more customizable and robust solutions, see the following:
Browser support
IE9+, due to the following:
Array.filterArray.mapArray.reduceArray.forEach
MIT License