Page Inspect
Internal Links
14
External Links
15
Images
5
Headings
7
Page Content
Title:styled-components
Description:CSS for the <Component> Age
HTML Size:997 KB
Markdown Size:6 KB
Fetched At:November 17, 2025
Page Structure
h1CSS for the <Component> Age
h2Styling your way with speed, strong typing, and flexibility.
h1Getting started
h2Installation
h2Your first styled component
h3Continue on the next page
h2Documentation
Markdown Content
styled-components
DocumentationShowcaseEcosystemReleases
DocumentationShowcaseEcosystemReleases
# CSS for the `<Component>` Age
## Styling your way with speed, strong typing, and flexibility.
GitHubDocumentation
const Button \= styled.a<{ $primary?: boolean; }\>\`
--accent-color: white;
/\* This renders the buttons above... Edit me! \*/
background: transparent;
border-radius: 3px;
border: 1px solid var(--accent-color);
color: var(--accent-color);
display: inline-block;
margin: 0.5rem 1rem;
padding: 0.5rem 0;
transition: all 200ms ease-in-out;
width: 11rem;
&:hover {
filter: brightness(0.85);
}
&:active {
filter: brightness(1);
}
/\* The GitHub button is a primary button
\* edit this to target it specifically! \*/
${props \=> props.$primary && css\`
background: var(\--accent\-color);
color: black;
\`}
\`
const Button = styled.a<{ $primary?: boolean; }>\` --accent-color: white; /\* This renders the buttons above... Edit me! \*/ background: transparent; border-radius: 3px; border: 1px solid var(--accent-color); color: var(--accent-color); display: inline-block; margin: 0.5rem 1rem; padding: 0.5rem 0; transition: all 200ms ease-in-out; width: 11rem; &:hover { filter: brightness(0.85); } &:active { filter: brightness(1); } /\* The GitHub button is a primary button \* edit this to target it specifically! \*/ ${props => props.$primary && css\` background: var(--accent-color); color: black; \`} \`
Used by folks at
To create beautiful websites like these
Zillow
The Internet Movie Database
Gizmodo
Spotify
Wish
Target
Discover more
# Getting started
## Installation
To download styled-components run:
npm install styled-components
That's all you need to do, you are now ready to use it in your app! (yep, no build step needed 👌)
**Note**
It's recommended (but not required) to also use the styled-components Babel plugin if you can. It offers many benefits like more legible class names, server-side rendering compatibility, smaller bundles, and more.
## Your first styled component
Let's say you want to create a simple and reusable `<Button />` component that you can use throughout your application. There should be a normal version and a big and `primary` version for the important buttons. This is what it should look like when rendered: (this is a live example, click on them!)
Normal button
Primary button
First, let's import styled-components and create a `styled.button`:
import styled from 'styled-components'
const Button \= styled.button\`\`
This `Button` variable here is now a React component that you can use like any other React component! This unusual backtick syntax is a new JavaScript feature called a tagged template literal.
You know how you can call functions with parenthesis? (`myFunc()`) Well, now you can also call functions with backticks! (learn more about tagged template literals)
If you render our lovely component now (just like any other component: `<Button />`) this is what you get:
I'm a <Button />!
It renders a button! That's not a very nice button though 😕 we can do better than this, let's give it a bit of styling and tickle out the hidden beauty within!
const Button \= styled.button\`
background: transparent;
border-radius: 3px;
border: 2px solid #BF4F74;
color: #BF4F74;
margin: 0 1em;
padding: 0.25em 1em;
\`
I'm a styled <Button />
As you can see, styled-components lets you write actual CSS in your JavaScript. This means you can use all the features of CSS you use and love, including (but by far not limited to) media queries, all pseudo-selectors, nesting, etc.
The last step is that we need to define what a primary button looks like. To do that we also import `{ css }` from `styled-components` and interpolate a function into our template literal, which gets passed the props of our component:
import styled, { css } from 'styled-components'
const Button \= styled.button<{ $primary?: boolean; }\>\`
background: transparent;
border-radius: 3px;
border: 2px solid #BF4F74;
color: '#BF4F74';
margin: 0 1em;
padding: 0.25em 1em;
${props \=>
props.$primary &&
css\`
background: '#BF4F74';
color: white;
\`};
\`
Here we're saying that when the `$primary` property is set we want to add some more `css` to our component, in this case change the background and color.
That's all, we're done! Take a look at our finished component:
``const Button = styled.button<{ $primary?: boolean; }>` background: transparent; border-radius: 3px; border: 2px solid #BF4F74; color: #BF4F74; margin: 0.5em 1em; padding: 0.25em 1em; ${props => props.$primary && css` background: #BF4F74; color: white; `} `; const Container = styled.div` text-align: center; ` render( <Container> <Button>Normal Button</Button> <Button $primary>Primary Button</Button> </Container> ); const Button = styled.button<{ $primary?: boolean; }>` background: transparent; border-radius: 3px; border: 2px solid #BF4F74; color: #BF4F74; margin: 0.5em 1em; padding: 0.25em 1em; ${props => props.$primary && css` background: #BF4F74; color: white; `} `; const Container = styled.div` text-align: center; ` render( <Container> <Button>Normal Button</Button> <Button $primary>Primary Button</Button> </Container> );``
Normal ButtonPrimary Button
Nice 😍 That's a live updating editor too, so play around with it a bit to get a feel for what it's like to work with styled-components! Once you're ready, dive into the documentation to learn about all the cool things styled-components can do for you:
### Continue on the next page
## Documentation
Hosted on ▲ Vercel
Made with by @glenmaddern, @mxstbr, @\_philpl, @probablyup, @imbhargav5 and contributors.
#BlackLivesMatter ✊🏿 Support the Equal Justice Initiative