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

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 styled-[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 styled-[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 styled-[email protected]

v4.0.0-beta.8

Blog postMigration instructions

npm install --save styled-[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 styled-[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)

v4.0.0-beta.6

Blog postMigration instructions

npm install --save styled-[email protected]
  • Fix a bug introduced from some refactoring that went into beta.5 around usage of keyframes with multiple interpolations, by @probablyup (see #2013)

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

v4.0.0-beta.5

Blog postMigration instructions

npm install --save styled-[email protected]

v4.0.0-beta.4

Blog postMigration instructions

npm install --save styled-[email protected]

Note: this beta has a lot of internal changes. If you notice anything funky, please let us know. All tests are passing, etc.

  • Use PureComponent instead of Component for the StyledComponent base class, by @probablyup

  • Internal refactoring to simplify the codebase and make it more readily DCE-able, by @probablyup

v4.0.0-beta.3

Blog postMigration instructions

npm install --save styled-[email protected]
  • Fix an issue when streaming with very large amounts of output where sometimes styles might not make it to the client, by @probablyup (see #1996)

  • Fix the createGlobalStyle multiusage warning having false positives, by @probablyup (see #1993)

v3.4.6

Fixed an issue when streaming with very large amounts of output where sometimes styles might not make it to the client, by @probablyup (see #1997)

v4.0.0-beta.2

Blog postMigration instructions

npm install --save styled-[email protected]
  • Expose ThemeConsumer component, the "consumer" render prop component from the React.createContext API if people are interested in using it rather than / in addition to the withTheme HOC, @probablyup

  • Remove "no tags" experiment, by @probablyup (see #1987); if you are using the babel plugin, please make sure it's fully updated

  • Fixed an issue with createGlobalStyle when the component was composed in multiple places and render of the subsequent component instance happened before unmount of the original; previously we removed styles immediately upon unmount of any instance without checking how many copies were still alive, by @probablyup (see #1989)

v4.0.0-beta.1

Blog postMigration instructions

npm install --save styled-[email protected]
  • Fixed an issue where createGlobalStyle was clobbering the very next style to be applied during rehydration in production mode, by @probablyup (see #1976)

  • Removed some unused code, by @probablyup (see #1976)

  • Switched createGlobalStyle to be a PureComponent, by @probablyup (see #1976)

v4.0.0-beta.0

The first beta of v4 is here! 👏🥂

Blog postMigration instructions

npm install --save styled-[email protected]

There's a ton of new and exciting things in v4, along with breaking changes. See the full list below:

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

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

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

A note for preact users: if you are doing the preact-compat aliasing, it won't work with this beta because they haven't implemented React.createContext in preact-compat yet.

v3.4.5

  • Tone down the dev warnings for deprecated APIs (they were console.error, now console.warn), by @probablyup

v3.4.4

Fix warning function not having a production fallback, by @mitoyarzun (see #1938)

v3.4.3

  • Add warning for the upcoming removal of the extend API in v4.0, by @probablyup (see #1909)

  • Throw Error if a React component was mistakenly interpolated within styles, by @imbhargav5 (see #1883)

  • Fix the primitives build, by @probablyup (see 24f097)

v3.4.2

  • Fix a regression from #1843 that breaks deferred injection and duplicates rules, by @kitten (see #1892)

  • [TS] Fix missing generic type arguments in .d.ts, by @PzYon (see #1886)

v3.4.1

  • Fixed a bug in typings where isStyledComponent was defined using an undefined variable, by @MayhemYDG (see #1876)

  • Add error system, by @probablyup (see #1881)

  • Fix "stream" module not being properly eliminated by rollup, by @probablyup

v3.4.0

  • Add first-class support for functions that return objects, by @acjay (see #1820)

    const Comp = styled.div((({ color }) => ({
      color,
    }))
    
  • Add support for the prop variants used by Preact (autofocus, class, for), by @probablyup (see #1823)

  • Various performance improvements, by @probablyup (see #1843)

  • [TS] Revert #1798, by @Igorbek (see #1840)

  • [Internal] Add benchmarking suite, by @mxstbr (see #1833)

v3.3.3

  • Fixed a regression when extending a styled(StyledComponent) introduced in 3.3.0, by @probablyup (see #1819)

  • Adjust how displayName is generated when not using Babel to properly preserve a displayName passed via withConfig, by @probablyup (see #1755)

  • [TS] Fix props being removed when indexed types are passed to WithOptionalTheme, by @devrelm (see #1806)

  • [TS] Allow TypeScript 2.9.1 to accept tagged template type argument, by @Igorbek (see #1798)

  • Add ref documentation for React.createRef(), by @julmot (see #1792)

v3.3.2

Lots of 🔥fixes in this release! As always, thank you contributors for your hard work 🙇


  • Allow non-plain objects as ThemeProvider themes, by @phyllisstein (see #1780)

  • [internal] Upgrade flow-bin to latest, by @halvves (see #1748)

  • [internal] Update various CI bits, by @probablyup (see #1769)

  • Reimplement SSR stream handling as a transform stream rather than a second-order readable stream, by @probablyup (see #1768)

  • Allow React Component as attr, by @valerybugakov (see #1751)

  • Added pointer events to valid attributes check, by @plankguy (see #1790)

Note: v3.3.1 was skipped due to a bad deploy.

v2.4.1

db30d2c [v2] Make TypeScript definition compatible with TS 2.9.1 - ported from #1773

v3.3.0

The team is very excited to release v3.3.0, containing a number of important bugfixes and quality of life improvements to the library! This will probably be the last feature release before v4.0 (roadmap) this summer.

Thank you so much to all the people who contributed. styled-components is nothing without its community ❤️

  • Fix off-by-one error in insertRuleHelpers.js, by @migueloller (see #1749)

  • Add first-class support for objects, by @mxstbr (see #1732)

    const Component = styled.div({
      color: 'blue'
    })
    
  • Fix typo in console warning about multiple instances, by @lucianbuzzo (see #1730)

  • Make the multiple instance warning criteria a little more strict to avoid badgering people running unit tests, by @probablyup (see #1693)

  • Fix React.createRef() values for innerRef being ignored in React Native, by @simonbuchan (see #1718)

  • Hoist non-react static properties on wrapped classes, by @probablyup (see #1750)

  • Support attributes prefixed by x-, by @mlecoq (see #1753)