Updating styled components is usually as simple as npm install
. Only major versions have the potential to introduce breaking changes (noted in the following release notes).
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.12...v6.1.13
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.11...v6.1.12
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.10...v6.1.11
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.9...v6.1.10
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.8...v6.1.9
Revert adding peerDependencies
from v6.1.7; apparently some package managers have differing behaviors around peerDependenciesMeta[package].optional
which is causing issues. Will revisit at a later date if possible.
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.7...v6.1.8
chore: add all missing peer dependency statements by @quantizor in https://github.com/styled-components/styled-components/pull/4243
NOTE: this change may cause some installed dependency duplication until this NPM bug is addressed but yarn and pnpm have correct behavior. Bun also has a similar bug.
Overall these changes ensure that styled-components is specifying a known working version of all utilized libraries, while instructing the client package manager that higher semver-compliant versions are permissible and should work, assuming the relevant libraries are compliant in practice.
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.6...v6.1.7
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.5...v6.1.6
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.4...v6.1.5
attrs
to provide a custom theme
prop to child components by @quantizor in https://github.com/styled-components/styled-components/pull/4242Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.3...v6.1.4
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.2...v6.1.3
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.1...v6.1.2
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.1.0...v6.1.1
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.9...v6.1.0
fix bundling to not hardcode window
(should fix some testing use cases that were incorrectly assuming a server environment when JSDOM and similar are in use)
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.8...v6.0.9
toStyleSheet
function by @krudos in https://github.com/styled-components/styled-components/pull/4124StyleSheetManager
updating context on every render by @keeganstreet in https://github.com/styled-components/styled-components/pull/4159JSX.IntrinsicElements
for the supported element list by @RJWadley in https://github.com/styled-components/styled-components/pull/4149StyleFunction
, Interpolation
by @bcole808 in https://github.com/styled-components/styled-components/pull/4140CSSProperties
, CSSObject
, CSSPseudos
and CSSKeyframes
by @takurinton in https://github.com/styled-components/styled-components/pull/4117Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.7...v6.0.8
exactOptionalPropertyTypes
check by @aspirisen in https://github.com/styled-components/styled-components/pull/3993Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.6...v6.0.7
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.5...v6.0.6
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.4...v6.0.5
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.3...v6.0.4
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.2...v6.0.3
displayName
in production to save bytes, it's already present in the static className if you're using the babel plugin or equivalentflatMap
and at
with ES5-compliant variantsFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.1...v6.0.2
Fixed an issue where a dev-time warning was being triggered too eagerly.
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0...v6.0.1
yarn add styled-components
Migration guide → https://styled-components.com/docs/faqs#what-do-i-need-to-do-to-migrate-to-v6
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v5.3.7...v6.0.0
yarn add styled-components
Migration guide → https://styled-components.com/docs/faqs#what-do-i-need-to-do-to-migrate-to-v6
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-rc.5..v6.0.0-rc.6
yarn add styled-components
enableVendorPrefixes
needs to be enabled based on prop usageMigration guide → https://styled-components.com/docs/faqs#what-do-i-need-to-do-to-migrate-to-v6
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-rc.3..v6.0.0-rc.5
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-rc.2...v6.0.0-rc.3
Removed use of the useDebugValue
hook to rectify older React support.
Full Changelog: https://github.com/styled-components/styled-components/compare/v5.3.10...v5.3.11
yarn add styled-components
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-rc.1...v6.0.0-rc.2
yarn add styled-components
@layer
rule supportstylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-rc.0...v6.0.0-rc.1
yarn add styled-components@beta
@layer
rule support (https://github.com/thysultan/stylis/pull/313)stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.15...v6.0.0-rc.0
yarn add styled-components@beta
css
prop typings by @ahutchings in https://github.com/styled-components/styled-components/pull/3982stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.14...v6.0.0-beta.15
Full Changelog: https://github.com/styled-components/styled-components/compare/v5.3.9...v5.3.10
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLStyleSheetManager
disableVendorPrefixes
with enableVendorPrefixes
proptsx
<StyleSheetManager enableVendorPrefixes>
{/* your React tree and ThemeProvider goes here */}
</StyleSheetManager>
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.13...v6.0.0-beta.14
Full Changelog: https://github.com/styled-components/styled-components/compare/v5.3.8...v5.3.9
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.11...v6.0.0-beta.12
yarn add styled-components@beta
React.ComponentProps<typeof MyStyledComponent>
supportstylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.11...v6.0.0-beta.12
fix(constants): rework process env guard
Full Changelog: https://github.com/styled-components/styled-components/compare/v5.3.7-fixed...v5.3.8
fix: (React Native) passing testID as attrs property by @ku8ar (see #3857)
fix: prevent crash when process.env is not defined by Suhas R (see #3957)
Add support for the translate
attribute as a valid prop by @ay4toh5i (see #3619)
remove Ukraine message; it's now out of date and the message has been received
yarn add styled-components@beta
props.theme
in interpolations when using attrs
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.10...v6.0.0-beta.11
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.9...v6.0.0-beta.10
yarn add styled-components@beta
<use>
to domElements by @shanpriyan in https://github.com/styled-components/styled-components/pull/3901stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.8...v6.0.0-beta.9
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.7...v6.0.0-beta.8
yarn add styled-components@beta
withComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadstylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.6...v6.0.0-beta.7
yarn add styled-components@beta
@container
CSS support)stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.5...v6.0.0-beta.6
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.4...v6.0.0-beta.5
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.3...v6.0.0-beta.4
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.2...v6.0.0-beta.3
$as
and $forwardedAs
will be removed in the next major version, use the unprefixed props insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v5.3.5...v5.3.6
yarn add styled-components@beta
shouldForwardProp
for more advanced scenariosweb | native
) in the genericstylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.1...v6.0.0-beta.2
yarn add styled-components@beta
stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-beta.0...v6.0.0-beta.1
yarn add styled-components@beta
git.io
within error message by @SukkaW in https://github.com/styled-components/styled-components/pull/3733stylis
v4 (if using stylis-plugin-rtl
you'll need to upgrade to the newer version)@types/styled-components
in the past, you'll want to remove it$as
and $forwardedAs
props (use as
or forwardedAs
)$
prefix) for stuff you don't want to be passed to child component / HTMLwithComponent
API (87f511a228e5b13b1ff70a416409e0705e5bf456); use "as" prop insteadFull Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-alpha.5...v6.0.0-beta.0
styled-components/macros
babel-plugin-styled-components
(required for macros)Updated sandbox for alpha: https://codesandbox.io/s/styled-components-v6-alpha-sandbox-05bod1?file=/src/App.tsx
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-alpha.4...v6.0.0-alpha.5
CSSProp
(this is in definitely typed but wasn't exposed by us)Recommended styled-components.d.ts
setup for your project:
// create styled-components.d.ts in your project source
// if it isn't being picked up, check tsconfig compilerOptions.types
import type { CSSProp } from 'styled-components';
import Theme from './theme';
type ThemeType = typeof Theme;
declare module 'styled-components' {
export interface DefaultTheme extends ThemeType {}
}
declare module 'react' {
interface DOMAttributes<T> {
css?: CSSProp;
}
}
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-alpha.2...v6.0.0-alpha.4
Added "types" package.json fields for TS type acquistion.
Full Changelog: https://github.com/styled-components/styled-components/compare/v6.0.0-alpha.1...v6.0.0-alpha.2
Fixed the TS declarations not getting emitted correctly by rollup.
Full Changelog: https://github.com/styled-components/styled-components/compare/.v6.0.0-alpha.0...v6.0.0-alpha.1
After an epic amount of refactoring, I'm pleased to announce the first alpha of styled-components v6!
Highlights:
Full Changelog: https://github.com/styled-components/styled-components/compare/v5.2.0...v6.0.0-alpha.0
Full Changelog: https://github.com/styled-components/styled-components/compare/v5.3.1...v5.3.3
Fix forced server-side mode not triggering global styles (See #3566)
Fix SSR collisions caused by insufficient hash inputs and reordering of groups on the client, which is a regression in v5.2.0 (See #3563)
Fix dynamic creation React warning for React v18, backported to v5 by @lynndylanhurley (See #3564)
Add missing typeof window check when checking for duplicate instances of styled-components (See #3553)
Prevent ServerStyleSheet from emitting empty style tags, which would cause issues in IE11 (See #3555)
Support css tagged templates inside style objects, by @roginfarrer and @dvingo (See #3469)
For React Native based components, pass testID
down to the native component if specified for an easier time testing. (see #3365)
Enable users of the babel macro to customize the styled-components import with importModuleName
(see #3422)
[fix] COMPLEX_SELECTOR_PREFIX.includes wasn't transpiled (see #3397)
Make sure StyleSheetManager
renders all styles in iframe / child windows (see #3159) thanks @eramdam!
Rework how components self-reference in extension scenarios (see #3236); should fix a bunch of subtle bugs around patterns like & + &
Fix keyframes
not receiving a modified stylis instance when using something like stylis-plugin-rtl
(see #3239)
Big performance gain for components using style objects (see #3239)
We no longer emit dynamic classNames for empty rulesets, so some className churn may occur in snapshots
Preallocate global style placement to ensure cGS is consistently inserted at the top of the stylesheet; note that this is done in runtime order so, if you have multiple cGS that have overlapping styles, ensure they're defined in code in the sequence you would want them injected (see #3239)
Add "engines" to package.json (currently set to Node 10, the oldest supported LTS distribution) (see #3201) thanks @MichaelDeBoey!
Finally, special thanks to @willheslam for testing and some last minute fixes on this release!
We are planning to release 5.2 on September 2/3, please help us test!
yarn add styled-components@test
Preallocate global style placement to ensure cGS is consistently inserted at the top of the stylesheet; note that this is done in runtime order so, if you have multiple cGS that have overlapping styles, ensure they're defined in code in the sequence you would want them injected (see #3239)
NOTE: This is a behavioral change and might require adjustment in your codebase if you have many createGlobalStyle
components in use. We do not think it will affect the majority of projects other than fix existing bugs.
createGlobalStyle
is now React.StrictMode
compliant
Make sure StyleSheetManager
renders all styles in iframe / child windows (see #3159) thanks @eramdam!
Rework how components self-reference in extension scenarios (see #3236); should fix a bunch of subtle bugs around patterns like & + &
Fix keyframes
not receiving a modified stylis instance when using something like stylis-plugin-rtl
(see #3239)
Big performance gain for components using style objects (see #3239)
We no longer emit dynamic classNames for empty rulesets, so some className churn may occur in snapshots
Add "engines" to package.json (currently set to Node 10, the oldest supported LTS distribution) (see #3201) thanks @MichaelDeBoey!
shouldForwardProp
API for native and primitive platforms, which was previously missing in [v5.1.0] (see #3093)
This has been released under a patch bump instead of a minor, since it's only been missing from Native-support.Add shouldForwardProp
API (almost the same as emotion's, just a slightly different usage pattern); https://github.com/styled-components/styled-components/pull/3006
Sometimes when composing multiple higher-order components together, it's possible to get into scenarios when multiple layers consume props by the same name. In the past we've introduced various workarounds for popular props like "as"
but this power-user API allows for more granular customization of what props are passed down to descendant component children when using the styled()
HOC wrapper.
When combined with other APIs like .attrs()
this becomes a very powerful constellation of abilities.
Here's how you use it:
const Comp = styled('div').withConfig({
shouldForwardProp: (prop, defaultValidatorFn) => !['filterThis'].includes(prop),
})`
color: red;
`;
render(<Comp filterThis="abc" passThru="def" />);
# Renders: <div className="[generated]" passThru="def"></div>
The second argument defaultValidatorFn
is what we use internally to validate props based on known HTML attributes. It's provided so you can filter exactly what props you don't wish to pass and then fall-back to the default filtering mechanism if desired.
Other methods on the styled
HOC like .attrs
can be chained after withConfig()
, and before opening your template literal:
const Comp = styled('div').withConfig({
shouldForwardProp: (prop, defaultValidatorFn) => !['filterThis'].includes(prop),
}).attrs({ className: 'foo' })`
color: red;
`;
render(<Comp filterThis="abc" passThru="def" />);
# Renders: <div className="[generated] foo" passThru="def"></div>
Thanks @stevesims and all that contributed!
Add "transient props" API; https://github.com/styled-components/styled-components/pull/3052
Think of transient props as a lightweight, but complementary API to shouldForwardProp
. Because styled-components allows any kind of prop to be used for styling (a trait shared by most CSS-in-JS libraries, but not the third party library ecosystem in general), adding a filter for every possible prop you might use can get cumbersome.
Transient props are a new pattern to pass props that are explicitly consumed only by styled components and are not meant to be passed down to deeper component layers. Here's how you use them:
const Comp = styled.div`
color: ${props => props.$fg || 'black'};
`;
render(<Comp $fg="red">I'm red!</Comp>);
Note the dollar sign ($
) prefix on the prop; this marks it as transient and styled-components knows not to add it to the rendered DOM element or pass it further down the component hierarchy.
Added useTheme hook to named exports for react native (#2982)
Performance enhancements
Added some helpful new dev-time warnings for antipatterns
@import
inside createGlobalStyle
and what to do instead (#2997)It's finally here!!! 🚀See the migrating to v5 FAQ page for easy upgrade instructions!
...and much more all, with no breaking changes!
NOTE: At this time we recommend not using @import
inside of createGlobalStyle
. We're working on better behavior for this functionality but it just doesn't really work at the moment and it's better if you just embed these imports in your HTML index file, etc.
StyleSheetManager
enhancements
<StyleSheetManager stylisPlugins={[]}>...</StyleSheetManager>
disableVendorPrefixes
removes autoprefixing if you don't need legacy browser support; <StyleSheetManager disableVendorPrefixes>...</StyleSheetManager>
disableCSSOMInjection
forces using the slower injection mode if other integrations in your runtime environment can't parse CSSOM-injected styles; <StyleSheetManager disableCSSOMInjection>...</StyleSheetManager>
Removed the "subfunction" attrs syntax that was deprecated in v4
styled.div.attrs({ role: p => p.onClick ? 'button' : '' })`
color: red;
`
becomes
styled.div.attrs(p => ({ role: p.onClick ? 'button' : '' }))`
color: red;
`
Update css-to-react-native to v3.0.0 (#2811); the one breaking change noted is that unitless line height is no longer allowed when setting font properties
disallow /ad/i in generated class names (#2837); this change primarily helps to avoid some overly aggressive ad blockers that will mangle generated classnames containing the substring "ad"
if you use styled-components from CDN, in v5 the "react-is" dependency was added (make sure you add this to your project)
This should be the last RC before general v5 release in a week or two!
NOTE: If you've been testing this stylisPlugins
functionality with the stylis-rtl
plugin, please switch from stylis-rtl
to stylis-plugin-rtl
.
Note: we've switched from canary
to v5
as the target branch for the new release. It's basically the same, but fixed up so it'll merge cleanly onto master.
Changes from rc.1:
Changes from rc.0:
mixin-deep
so it is transpiled consistently for IEWe're almost there! After several months of work (thank you beta testers!) this is the first v5 release candidate build.
Overall v5 changes:
Major performance and bundle size improvements over v4, see the announcement blog for more details!
StyleSheetManager
enhancements
<StyleSheetManager stylisPlugins={[]}>...</StyleSheetManager>
disableVendorPrefixes
removes autoprefixing if you don't need legacy browser support; <StyleSheetManager disableVendorPrefixes>...</StyleSheetManager>
disableCSSOMInjection
forces using the slower injection mode if other integrations in your runtime environment can't parse CSSOM-injected styles; <StyleSheetManager disableCSSOMInjection>...</StyleSheetManager>
Removed the "subfunction" attrs syntax that was deprecated in v4
styled.div.attrs({ role: p => p.onClick ? 'button' : '' })`
color: red;
`
becomes
styled.div.attrs(p => ({ role: p.onClick ? 'button' : '' }))`
color: red;
`
Changes since the last beta:
disallow /ad/i in generated class names (#2837); this change primarily helps to avoid some overly aggressive ad blockers that will mangle generated classnames containing the substring "ad"
Update css-to-react-native to v3.0.0 (#2811); the one breaking change noted is that unitless line height is no longer allowed when setting font properties
replace merge-anything with mixin-deep (#2838); saving bytes, this is used when merging defaultProps
for extended styled components
shard createGlobalStyle by runtime instance (#2824); cGS is implemented such that it's really meant to be used as a singleton, but it's not uncommon for people to have multiple instances of the same cGS component on the page at once. This change ensures that as instances and mounted and removed the existing global styles don't get removed as well
memoize theme (#2820); a minor performance tweak when ThemeProvider
is given a reference-equal theme prop
make ThemeProvider error straightforward (#2787); more obvious messaging that the theme
prop is required when using ThemeProvider
Fix styled-components
's react-native
import for React Native Web, by @fiberjw (see #2797)
Remove dev-time warning if referencing a theme prop without an outer ThemeProvider
, the check for it isn't smart enough to handle cases with "or" or ternary fallbacks and creates undesirable noise in various third party integrations
useTheme()
hook (https://github.com/styled-components/styled-components/pull/2765)This is the last minor release before v5, please start using the beta and give us feedback!
This is a minor release not a patch release due to this change: #2738. Apologies if this causes some code churn in your projects, it was a long-standing bug that needed fixing.
Fix to use ownerDocument
instead of global document
, by @yamachig (see #2721)
Backport fix for SSR classname mismatches in development mode for some environments like next.js (see #2701)
Fix attrs not properly taking precedence over props
Backport fix where classnames are composed in the wrong order if custom class names are passed in (see #2760)
Fix add check for style tag detached - sheet in the style tag is null in this case, by @newying61 (see #2707)
add lightweight dev warning when theme is consumed but not provided (#2655)
fix component selectors + css prop usage (#2656)
5.0.0-beta.7 was unpublished due to a build error
remove the concept of foldedComponentIds (#2652); fixes an issue where if a folded component itself is used later in the component tree than the folding result it could lead to specificity clashes
bump too many classes warning back up to 200 (7af8e12bc32e44ea977e3e9fa6d45b6fdfd3a4e2)
revise & simplify how we determine the theme, fix createGlobalStyle
HMR and behavior around defaultProps.theme (#2647)
switched from stylis to @emotion/stylis (#2640); mostly a bundle size win and a minor performance boost
removed "stylisOptions" prop from StyleSheetManager
, but reimplemented the ability to remove vendor prefixes as "disableVendorPrefixes"
disable ComponentStyle staticness in non-production modes (#2634); should help fix some cases where className mismatches happen in runtimes like next.js dev mode
lower the threshold for the "too many classes" warning to 50 (#2622); the previous limit was 200, probably much too high
Fix babel macro with updated babel-plugin-styled-components (https://github.com/styled-components/styled-components/pull/2635)
Fix backward-compat issue with a way of doing SSR in v4 (https://github.com/styled-components/styled-components/pull/2639)
We'll explore reintroducing it in v5 but better safe than sorry.
Make it possible to initialize SC_ATTR
and SC_DISABLE_SPEEDY
via REACT_APP_*
.env variables for easier integration with CRA applications (see #2501)
Fix components being folded inappropriately when an interim HOC is present (see #2586)
Fix theme
prop for styled native components, also fixes theme
in
defaultProps
for them (see #2576)
Add "forwardedAs" prop to allow deeply passing a different "as" prop value to underlying components
when using styled()
as a higher-order component (see #2580)
Implement defaultProps folding (see #2597)
Major thanks to our wonderful contributors!
Remove className usage checker dev utility due to excessive false-positive noise in certain runtime environments like next.js and the related warning suppression prop (see #2563).
Attach displayName to forwardRef function as described in React docs (see #2508).
Compatibility with react-native-web 0.11 (see #2453).
Add stack trace to .attrs warning (see #2486).
Fix functions as values for object literals. (see 2489)
Remove validation in Babel macro, by @mAAdhaTTah (see #2427)
Thanks to our amazing contributors for leading the charge on this big minor release! Awesome perf stuff in there and QOL changes in preparation for v5.
Reduced GC pressure when using component selector styles. (see #2424).
Add svg tag marker
to domElements.js (see #2389)
Make the GlobalStyleComponent
created by createGlobalStyle
call the base constructor with props
(see #2321).
Move to Mono repository structure with lerna @imbhargav5 (see #2326)
Expose StyleSheetContext
and StyleSheetConsumer
for you fancy babes doing wild stuff
Filter suppressClassNameWarning
to not to pass down to the wrapped components @taneba (see #2365)
Fix an edge case where React would break streaming inside <textarea>
elements, which have special child behavior and aren't a suitable place to inject a style tag (see #2413)
Under the hood code cleanup of the Babel macro, by @lucleray (see #2286)
Fix function-form attrs to receive the full execution context (including theme) (see #2210)
Adjust innerRef
deprecation warning to not be fired if wrapping a custom component, since that underlying component may not be on forwardRef yet and actually using the prop (see #2211)
Expose the ThemeConsumer
and ThemeContext
exports for the native and primitives entries (see #2217)
Remove createGlobalStyle
multimount warning; Concurrent and Strict modes intentionally render the same component multiple times, which causes this warning to be triggered always even when usage is correct in the application (see #2216)
Folded components are now targetable via component selector as in v3 if you used the old .extend
API (see #2239)
Don't treat uppercased strings as tag-like components and don't filter out props from them (see #2225)
Performance optimization for fully static (no function interpolation) styled-components by avoiding using ThemeConsumer
since it isn't necessary, by @mxstbr (see #2166)
Allow disabling "speedy" mode via global SC_DISABLE_SPEEDY
variable, by @devrelm (see #2185)
To make use of this, you can either set SC_DISABLE_SPEEDY
in your app's entry file or use something like webpack.DefinePlugin
to do it at build time:
webpack.DefinePlugin({
SC_DISABLE_SPEEDY: true,
});
Attrs can now be passed a function (see #2200); thanks @oliverlaz for providing an early PoC PR for this!
e.g.:
styled.div.attrs(props => ({ 'aria-title': props.title }))``;
Fix the warnTooManyClasses
dev helper not being totally dead code eliminated in production (see #2200)
Deprecate functions as object keys for object-form attrs (see #2200)
e.g.:
styled.div.attrs({ 'aria-title': props => props.title })``; // bad
styled.div.attrs(props => ({ 'aria-title': props.title }))``; // good
Support for this will be removed in styled-components v5. The primary impetus behind this change is to eliminate confusion around basic functions vs styled-components vs React components provided as values in the object-form attrs constructor, each of which has different handling behaviors. The single outer function to receive the props and then return a props object is conceptually simpler.
The standalone CDN build is now UMD-compliant and can be used with RequireJS, etc.
Add pixels to unitless numbers when object interpolation is used, by @Fer0x (see #2173)
Trying to interpolate a non-styled component into CSS is now a hard error, rather than a warning (see #2173)
Interpolating a styled component into a string now returns the static component selector (emotion cross-compat)
import styled from 'styled-components';
const Comp = styled.div`
color: red;
`;
`${Comp}`; // .sc-hash
Add suppressClassNameWarning
prop to disable warning when wrapping a React component with styled()
and the className
isn't used, by @Fer0x (see #2156)
Expose ThemeContext to enable static contextType support for React 16.6, by @imbhargav5 (see #2152)
Filter out invalid HTML attributes from attrs
, by @Fer0x (see #2133)
Add warning if an attrs
prop is a function that returns an element, by @timswalling (see #2162)
Add suppressMultiMountWarning prop to disable warning on multiple cgs mount, by @imbhargav5 (see #2107)
Fix self-reference replacement edge cases, by @probablyup (see #2109)
This is a rollup of the highlights of beta 0-11 for convenience. See the migration guide for easy updating steps and the beta announcement blog for our summary of v4's changes, thought process, etc.
Add babel macro for full-featured interop with create react app v2+, by @lucleray (see #2032)
Expose ThemeConsumer
component, context consumer render prop component from the React.createContext
API if people are interested in using it rather than / in addition to the withTheme
HOC, by @probablyup
Add createGlobalStyle
that returns a component which, when mounting, will apply global styles. This is a replacement for the injectGlobal
API. It can be updated, replaced, removed, etc like any normal component and the global scope will update accordingly, by @JamieDixon @marionebl, @yjimk, and @imbhargav5 (see #1416)
const GlobalStyles = createGlobalStyle`
html {
color: 'red';
}
`;
// then put it in your React tree somewhere:
// <GlobalStyles />
Added a first-class API for rendering polymorphism via "as" prop. In most cases, this new prop will replace your need to use the .withComponent
API. It allows you to control what underlying element or component is rendered at runtime, while not messing with the styles, by @probablyup (see #1962)
import { Link } from 'react-router'
const Component = styled.div`
color: red;
`
// Examples
<Component>Hello world!</Component>
<Component as="span">Hello world!</Component>
<Component as={Link} to="home">Hello world!</Component>
Fix how ampersand is handled in self-referential selector combinations, e.g. & + &
(see #2071)
Remove deprecated consolidateStreamedStyles
API, by @probablyup (see #1906)
Remove deprecated jsnext:main
entry point from package.json, by @probablyup (see #1907)
Remove deprecated .extend
API, by @probablyup (see #1908)
Migrate to new context API, by @alexandernanberg (see #1894)
Remove TS typings; they are now to be found in DefinitelyTyped, by @probablyup. See https://github.com/styled-components/styled-components/issues/1778 for more information.
Add new data-styled-version
attribute to generated <style>
tags to allow multiple versions of styled-components to function on the page at once without clobbering each other, by @probablyup
It's still highly recommended to use aliasing via your bundler to dedupe libraries like styled-components and react.
[Breaking change] Refactor keyframes
helper, by @fer0x (see #1930).
Keyframes is now implemented in a "lazy" manner: its styles will be injected with the render phase of components using them.
keyframes
no longer returns an animation name, instead it returns an object which has method .getName()
for the purpose of getting the animation name.
Migrate to use new React.forwardRef
API, by @probablyup; note that this removes the innerRef
API since it is no longer needed.
Implement styled()
wrapper folding. In a nutshell, when you nest styled wrappers (e.g. styled(styled.div)
) the components are now folded such that only one is mounted that contains the merged styles of its ancestors. This is conceptually equivalent to the removed "extend" functionality, but without many of the downsides -- and it's automatic, by @probablyup (see #1962)
Add warning when component is not a styled component and cannot be referred via component selector, by @egdbear (see #2070)
When using CRA v2, import styled components from styled-components/macro
instead to gain all the benefits of our babel plugin.
Add a warning when wrapping a React component with styled()
and the className
isn't used (meaning styling isn't applied), by @Fer0x (see #2073)
Tweak the styled components base component naming to look nicer in DevTools, by @probablyup (see #2012)
Beef up the error message that sometimes occurs when multiple versions of styled components are used together and the StyleSheet instance can't be found, by @probablyup (see #2012)
Add enzymeFind
test utility to easily grab instances of a styled-component from enyzme mounted testing scenarios, by @probablyup (see #2049)
import { mount } from 'enzyme';
import React from 'react';
import styled from 'styled-components';
import { enzymeFind } from 'styled-components/test-utils';
const Thing = styled.div`
color: red;
`;
const wrapper = mount(
<div>
<Thing isCool />
</div>
);
const thing = enzymeFind(wrapper, Thing);
// expect(thing.props()).toHaveProperty('isCool') etc
Inline and optimize the static hoisting functionality to avoid a bundler bug and shed a bit of package weight, by @probablyup (see #2021