menu

styled-components

Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress!

Channels
Chat
view-forward
# All channels
view-forward
# General
view-forward
# Help
view-forward
# jest
view-forward
# Off Topic
view-forward
# Website
view-forward
Team

Announcing support for the css prop! 🎉

November 26, 2018 at 8:39am

Announcing support for the css prop! 🎉

November 26, 2018 at 8:39am
Excited to announce that styled-components now has native support for the css prop!
const MyButton = () => (
<button
css={`
color: papayawhip;
background: palevioletred;
`}
>
Click me!
</button>
)
Simply upgrade to the latest Babel plugin version and you're ready to css and roll 💃🏼
Let us know what you think! 💜
Show previous messages

November 27, 2018 at 1:37pm
Once I have a better idea and am less "in the fog" about it, I either convert them or start using the standard styled-components API. Does that make sense?
  • reply
  • like
Really nice! But I don't totally understand when and when not to use it. Can we replace our current e.g. styled.div const with this as it just converts to the "old" style? It seems to be as powerfull as we need. (prop theme support and media querries?)
Or should we use this just for a quick testing purpose?
Also what does it do if we pass the css prop to a already declared styled component? Will it shallow or deep merge those styles?
Are there any performance issues when using this?
No, there's no performance issues, it will work perfectly fine!
The styles are merged as CSS merges them, the last one wins. These two are equivalent:
const Box = styled.div`
color: blue;
`
<Box css="color: red;" />
// is the same as
const Box = styled.div`
color: blue;
`
const StyledBox = styled(Box)`
color: red;
`
<StyledBox />
In fact, the Babel plugin converts the first on to the second one under the hood, so what you're actually running in the browser is the second one!
like-fill
1
  • reply
  • like
I hope that helps 👍
  • reply
  • like
Congratulations for this feature! 🎉🎨
I have one issue so far, it would be great to only pass the theme instead of all the props when using the object style form :
`<div css={theme => /* use the theme */} />`
instead of
`<div css={({ theme }) => /* use the theme */} />`
Passing the whole props object doesn't make much sense in this context because all the props are already available in the component.
Also this would be consistent with emotion v10 API which provide the theme object only.
I also started a small experiment around styled-system and the css prop : https://codesandbox.io/s/jl31x0kq93
With this API I'm not sure if I'll use "styled" anymore because my building blocks are often more elaborated than a single node.
like-fill
1
  • reply
  • like
Would the css prop be possible to use in an unejected create-react-app? I'm asking as we can't add .babelrc to CRA.
like-fill
1
  • reply
  • like
not yet, but very soon! See this PR, which adds Babel macro support and should be merged soon: https://github.com/styled-components/babel-plugin-styled-components/pull/181
like-fill
3
  • reply
  • like
Wow , thank you!
like-fill
1
  • reply
  • like
What's the recommend way to reuse css in this case ? Should i just import normal string or a css file ? How about less, sass ?
  • reply
  • like

November 28, 2018 at 7:44pm
Can I use it in react-native?
  • reply
  • like

November 29, 2018 at 9:11am
Yep!
  • reply
  • like
reuse components, not CSS
like-fill
2
  • reply
  • like
This is a really helpful edition!
  • reply
  • like
It's a pragmatic advice. That means we rather duplicate components with same css props rather than reusing css ?
Edited
  • reply
  • like

December 1, 2018 at 4:09pm
I just set up the macro with create-react-app, and it works until I try to use the css prop. Is this working? Or am I missing something?
  • reply
  • like
Does anyone else have a problem where only template strings work for the css prop? (Double quotes don't seem to work. Strange.)
  • reply
  • like

December 2, 2018 at 5:35pm
Does anyone else have a problem where only template strings work for the css prop? (Double quotes don't seem to work. Strange.)
That sounds like a bug, those should work! Can you submit an issue with your code here: https://github.com/styled-components/babel-plugin-styled-compnonents? Thank you!
  • reply
  • like
I just set up the macro with create-react-app, and it works until I try to use the css prop. Is this working? Or am I missing something?
  • reply
  • like
It's a pragmatic advice. That means we rather duplicate components with same css props rather than reusing css ?
No, don't duplicate them, reuse them!
const Row = (props) => <div {...props} css="display: flex; flex-direction: row;" />
Then use that <Row /> component throughout your app. That's always been the way to go, no matter if you use the css prop or the styled.x API!
  • reply
  • like
Sweeeeet
  • reply
  • like

December 4, 2018 at 8:20pm
It has occurred to me that with the css prop we can now write our string interpolations using state values in addition to props. What do you think about writing styled components in that way?
  • reply
  • like

December 14, 2018 at 4:29am
How can I use this feature with TypsScript?
css prop on the normal html element causes type error:
Type '{ css: string; }' has no properties in common with type 'DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>'
like-fill
1
  • reply
  • like
like-fill
2
  • reply
  • like
Thanks! That’s exactly what I’ve been looking for!
like-fill
2
  • reply
  • like

January 11, 2019 at 10:11pm
FYI, here is how I implemented the solution to Typescript + css prop on element:
import { Interpolation } from 'styled-components';
import { Theme } from './lib/theme';
declare module 'react' {
interface DOMAttributes<T> {
css?: Interpolation<Theme>;
}
}
const Foo = () => <div css="color: pink;">Woot</div>;
like-fill
2
  • reply
  • like

January 12, 2019 at 5:30am
Should the Babel plugin update have been a major breaking version bump, perhaps? It seems very presumptuous to assume that nobody had any existing props called css anywhere in their app. The Babel plugin would start hijacking those if you installed with e.g. ^1.0.0, wouldn't it?
Edited
  • reply
  • like
Show more messages