Styled Components on top of JSS.
npm install styled-jss



Styled-JSS implements a styled-primitives interface on top of JSS. Its API is similar to styled-components but thanks to the JSS core, it supports all features and plugins JSS does. For e.g. you can use full JSON Syntax inside.
Try it out on playground.
``js
import styled from 'styled-jss'
const Button = styled('button')({
fontSize: 12,
color: (props) => props.theme.textColor
})
// You can also use curried interface this way.
const div = styled('div')
const Container = div({
padding: 20
})
// Composition.
const PrimaryButton = styled(Button)({
color: 'red'
})
// Composition with unstyled React Components too.
const Button = styled(UnstyledButton)({
color: 'blue'
})
// Component Selectors.
const ButtonContainer = styled(Container)({
[& ${PrimaryButton}]: {`
color: 'green'
}
})
styled-jss has out of the box support for theme customization with the unified theming package.
`js
import styled, {ThemeProvider} from 'styled-jss'
const Button = styled('button')(({margin, theme}) => ({
margin,
color: theme.color,
backgroundColor: theme.backgroundColor,
}))
const themes = {
light: {
color: 'black',
backgroundColor: 'yellow',
},
}
const App = () => (
)
export default App
`
Example on the CodeSandbox
You can compose your style-objects and style-functions.
Let's say this is our mods.js:
`js
export const theme = ({ theme }) => ({
color: theme.colors.primary,
backgroundColor: theme.colors.secondary,
})
export const font = ({ bold }) => ({
font: {
weight: bold ? 'bold' : 'normal',
family: 'Arial',
},
})
export const size = ({ size = 'm' }) => ({
s: {
fontSize: 12,
lineHeight: 1.2,
},
m: {
fontSize: 16,
lineHeight: 1.5
}
})[size]
export const rounded = ({ rounded }) => rounded && { borderRadius: 5 }
`
Now we can mix them to our Button Component:
`js
import styled from 'styled-jss'
import {theme, font, size, rounded} from 'mods'
const Button = styled('button')(
{
border: 0,
padding: [5, 10],
display: 'inline-block',
},
theme,
font,
size,
rounded,
)
export default Button
`
And Usage:
`js
import {ThemeProvider} from 'styled-jss'
import Button from './components/Button'
const theme = {
dark: {
colors: {
primary: 'white',
secondary: 'purple'
}
}
}
export default () => (
)
`
Using base Style Sheet we can reuse classes in the render function and inside of a styled component.
`js
import { Styled, injectStyled } from 'styled-jss'
// Base styles, like a regular jss object.
const styled = Styled({
root: {
margin: 10,
'& $baseButton': {
fontSize: 16
}
},
baseButton: {
padding: 10,
'& + &': {
marginLeft: 10
}
}
})
const NormalButton = styled('button')({
composes: '$baseButton',
border: [1, 'solid', 'grey'],
color: 'black'
})
// Composition - same way.
const PrimaryButton = styled(NormalButton)({
color: 'red'
})
// One can use classes AND styled primitives.
const MyComponent = ({classes}) => (
const MyStyledComponent = injectStyled(styled)(MyComponent)
`
Styled-JSS uses jss-preset-default by default. You can require createStyled function and provide your custom JSS instance.
`js
import { create as createJss } from 'jss'
import vendorPrefixer from 'jss-vendor-prefixer'
import createStyled from 'styled-jss/createStyled'
const jss = createJss()
jss.use(vendorPrefixer())
// Create a custom Styled function, that allows to set BaseStyles.
export const Styled = createStyled(jss)
// Create a custom styled function that allows to create styled components.
const styled = Styled()
export default styled
`
`sh`
npm install --save styled-jss
Install peer dependencies react and react-dom` in your project.
MIT