Releases

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).

v5.0.0-beta.8

  • 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

v5.0.0-beta.6

  • 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)

v5.0.0-beta.5

  • 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

v5.0.0-beta.4

v4.3.2

Fix usage of the "css" prop with the styled-components babel macro (relevant to CRA 2.x users), by @jamesknelson (see #2633)

v5.0.0-beta.3

Fixes the "stream" module not getting properly DCE'd for browser build targets

v5.0.0-beta.2

Fixes HMR (#2623)

v5.0.0-beta.1

fix inconsistency between client & server that breaks rehydration (#2621)

v5.0.0-alpha.2

  • Remove deprecated object-form attrs functionality
  • Internal refactor to remove some unnecessary code

v4.3.1

  • Revert #2586; breaks rehydration in dev for certain runtimes like next.js

We'll explore reintroducing it in v5 but better safe than sorry.

v4.3.0

  • 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)

v4.2.1

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)

v4.2.0

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)

v4.1.3

Under the hood code cleanup of the Babel macro, by @lucleray (see #2286)

v4.1.2

  • 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)

v4.1.1

  • Put back the try/catch guard around a part of the flattener that sometimes receives undetectable SFCs (fixes an errant hard error in an edge case)

v4.1.0

  • 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)

v4.0.3

  • 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)

v4.0.2

  • Handle an edge case where an at-rule was being supplied to the self-reference stylis plugin at an incorrect context setting, by @probablyup (see #2114)

v4.0.1

  • Add suppressMultiMountWarning prop to disable warning on multiple cgs mount, by @imbhargav5 (see #2107)

  • Fix self-reference replacement edge cases, by @probablyup (see #2109)

v4.0.0

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.

New stuff

  • 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>

Breaking changes

  • 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)

Developer experience improvements

  • 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)

Misc

  • 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

v3.4.10

  • Added a few iframe attributes to the valid attribute list: allow, allowUserMedia, allowPaymentRequest, by @asoltys (see #2083 and #2085)

v4.0.0-beta.11

Blog postMigration instructions

npm install --save [email protected]
  • Add warning when component is not a styled component and cannot be referred via component selector, by @egdbear (see #2070)

  • Fix how ampersand is handled in self-referential selector combinations, e.g. & + & (see #2071)

  • Add babel macro for full-featured interop with create react app v2+, by @lucleray (see #2032)

    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)

v4.0.0-beta.10

Blog postMigration instructions

npm install --save [email protected]
  • Add support for as to be used with attrs for better polymorphism, by @imbhargav5 (see #2055)

  • Fix withTheme HOC to use a theme defined in defaultProps of the wrapped component, by @theboyWhoCriedWoolf (see #2033)

  • 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
  • Revert change to use React.PureComponent; the ecosystem just isn't ready yet.

v4.0.0-beta.9

Blog postMigration instructions

npm install --save [email protected]

v4.0.0-beta.8

Blog postMigration instructions

npm install --save [email protected]
  • Inline and optimize the static hoisting functionality to avoid a bundler bug and shed a bit of package weight, by @probablyup (see #2021)

v3.4.9

Remove the injectGlobal warning; it's not actionable since the replacement API is in v4 only, so why say anything?

v4.0.0-beta.7

Blog postMigration instructions

npm install --save [email protected]
  • Revise createGlobalStyle HMR back to the original PR code without using componentDidMount, by @probablyup (see #2017)

  • Some light refactoring to further reduce object allocations, by @probablyup (see #2016)

v3.4.8

Fix the injectGlobal deprecation message being improperly guarded for production

v3.4.7

  • Add warning for the upcoming removal of the injectGlobal API in v4.0, by @rainboxx (see #1867)

  • Backport from v4: 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)