Updating styled components is usually as simple as npm update styled-components. Only major versions have the potential to introduce breaking changes (noted in the following release notes).
51ffa9c: Fix createGlobalStyle compatibility with React StrictMode and RSC
This fix addresses issues where global styles would disappear or behave incorrectly in React StrictMode and RSC:
queueMicrotask to coordinate with React's effect lifecycle. In StrictMode's simulated unmount/remount cycle, styles are preserved. On real unmount, styles are properly removed.useRef inside RSC guard in createGlobalStyle and unify all useContext calls to use consistent !IS_RSC ? pattern.createGlobalStyle rendered in client components would leave behind accumulated SSR-rendered inline <style data-styled-global> tags. The cleanup effect now removes these hoisted style tags when the component unmounts or re-renders with different CSS.These changes ensure createGlobalStyle works correctly with:
- React StrictMode's double-render behavior
- React 18/19's concurrent rendering features
- React 19's style hoisting with the `precedence` attribute
- React Server Components (server-defined GlobalStyles in client components)51ffa9c: Restore styled.br.
1f794b7: Add package.json "exports" field for better native ESM integration.
// (e.g., url(https://example.com)). The // in protocol URLs like https://, http://, file://, and protocol-relative URLs was incorrectly being treated as a JavaScript-style line comment.7ff7002: Fix: Line comments (//) in multiline CSS declarations no longer cause parsing errors (fixes #5613)
JS-style line comments (//) placed after multiline declarations like calc() were not being properly stripped, causing CSS parsing issues. Comments are now correctly removed anywhere in the CSS while preserving valid syntax.
Example that now works:
const Box = styled.div` max-height: calc(100px + 200px + 300px); // This comment no longer breaks parsing background-color: green; `;
7ff7002: Fix: Contain invalid CSS syntax to just the affected line
In styled-components v6, invalid CSS syntax (like unbalanced braces) could cause all subsequent styles to be ignored. This fix ensures that malformed CSS only affects the specific declaration, not subsequent valid styles.
Example that now works:
const Circle = styled.div` width: 100px; line-height: ${() => '14px}'}; // βοΈ This malformed line is dropped background-color: green; // β Now preserved (was ignored in v6) `;
createGlobalStyle to not use useLayoutEffect on the server, which was causing a warning and broken styles in v6.3.x. The check typeof React.useLayoutEffect === 'function' is not reliable for detecting server vs client environments in React 18+, so we now use the __SERVER__ build constant instead.6e4d1e7: fix: suppress false "created dynamically" warnings in React Server Components
The dynamic creation warning check now properly detects RSC environments and skips validation when IS_RSC is true. This eliminates false warnings for module-level styled components in server components, which were incorrectly flagged due to RSC's different module evaluation context. Module-level styled components in RSC files no longer trigger warnings since they cannot be created inside render functions by definition.
a4b4a6b: fix: include TypeScript declaration files in npm package
Fixed Rollup TypeScript plugin configuration to override tsconfig.json's noEmit setting, ensuring TypeScript declaration files are generated during build.
a4b4a6b: fix: resolve TypeScript error blocking type declaration emission
Fixed TypeScript error in StyledComponent when merging style attributes from attrs. Added explicit type cast to React.CSSProperties to safely merge CSS property objects. This error was preventing TypeScript declaration files from being generated during build.
28fd502: Add React Server Components (RSC) support
styled-components now automatically detects RSC environments and handles CSS delivery appropriately:
- **No `'use client'` directive required**: Components work in RSC without any wrapper or directive
- **Automatic CSS injection**: In RSC mode, styled components emit inline `<style>` tags that React 19 automatically hoists and deduplicates
- **Zero configuration**: Works out of the box with Next.js App Router and other RSC-enabled frameworks
- **Backward compatible**: Existing SSR patterns with `ServerStyleSheet` continue to work unchanged
RSC best practices:
- Prefer static styles over dynamic interpolations to avoid serialization overhead
- Use data attributes for discrete variants (e.g., `&[data-size='lg']`)
- CSS custom properties work perfectly in styled-components, can be set via inline `style`, and cascade to children:
```tsx
const Container = styled.div``;
const Button = styled.button`
background: var(--color-primary, blue);
`;
// Variables set on parent cascade to all DOM children
<Container style={{ '--color-primary': 'orchid' }}>
<Button>Inherits orchid background</Button>
</Container>;
```
- Use build-time CSS variable generation for theming since `ThemeProvider` is a no-op in RSC
Technical details:
- RSC detection via `typeof React.createContext === 'undefined'`
- `ThemeProvider` and `StyleSheetManager` become no-ops in RSC (children pass-through)
- React hooks are conditionally accessed via runtime guards
- CSS is retrieved from the StyleSheet Tag for inline delivery in RSC mode856cf06: feat: update built-in element aliases to include modern HTML and SVG elements
Added support for modern HTML and SVG elements that were previously missing:
HTML elements:
- `search` - HTML5 search element
- `slot` - Web Components slot element
- `template` - HTML template element
SVG filter elements:
- All `fe*` filter primitive elements (feBlend, feColorMatrix, feComponentTransfer, etc.)
- `clipPath`, `linearGradient`, `radialGradient` - gradient and clipping elements
- `textPath` - SVG text path element
- `switch`, `symbol`, `use` - SVG structural elements
This ensures styled-components has comprehensive coverage of all styleable HTML and SVG elements supported by modern browsers and React.418adbe: fix(types): add CSS custom properties (variables) support to style prop
CSS custom properties (CSS variables like --primary-color) are now fully supported in TypeScript without errors:
- `.attrs({ style: { '--var': 'value' } })` - CSS variables in attrs
- `<Component style={{ '--var': 'value' }} />` - CSS variables in component props
- Mixed usage with regular CSS properties works seamlesslyd0b73ac: Fix no longer existing link in console debug message
c3a5990: Update csstype dependency from 3.1.3 to 3.2.3
This updates the pinned csstype dependency from 3.1.3 to 3.2.3 to fix a type incompatibility with @types/react.
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-componentsMigration 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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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-componentsMigration 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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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-componentsenableVendorPrefixes 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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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-componentsstylis 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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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@betacss 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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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@betastylis 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 / HTMLStyleSheetManagerdisableVendorPrefixes with enableVendorPrefixes prop<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@betastylis 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@betaReact.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@betaprops.theme in interpolations when using attrsstylis 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@betastylis 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@betastylis 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@betawithComponent 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@betastylis 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@betastylis 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@betastylis 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@betashouldForwardProp 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@betastylis 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@betagit.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/macrosbabel-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)
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!
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
Refactored hashing function that is a bit faster in benchmarks (#2983)
Fixed a bitwise math issue that was causing SSR performance degradations due to how we allocate typed arrays under the hood (#2996)
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)