diff --git a/.changeset/curvy-timers-decide.md b/.changeset/curvy-timers-decide.md new file mode 100644 index 000000000..c0049b9b2 --- /dev/null +++ b/.changeset/curvy-timers-decide.md @@ -0,0 +1,6 @@ +--- +'@emotion/styled-base': major +'@emotion/styled': major +--- + +Remove support for deprecated `innerRef` prop diff --git a/.changeset/two-baboons-mate.md b/.changeset/two-baboons-mate.md new file mode 100644 index 000000000..87ff37858 --- /dev/null +++ b/.changeset/two-baboons-mate.md @@ -0,0 +1,11 @@ +--- +'@emotion/core': major +'emotion-theming': major +'@emotion/native': major +'@emotion/primitives-core': major +'@emotion/primitives': major +'@emotion/styled-base': major +'@emotion/styled': major +--- + +Use hooks internally for improved bundle size and a better tree in React DevTools diff --git a/.github/ISSUE_TEMPLATE/--documentation-issue.md b/.github/ISSUE_TEMPLATE/--documentation-issue.md index f6287ec84..18b401494 100644 --- a/.github/ISSUE_TEMPLATE/--documentation-issue.md +++ b/.github/ISSUE_TEMPLATE/--documentation-issue.md @@ -24,6 +24,6 @@ assignees: '' diff --git a/.github/ISSUE_TEMPLATE/--feature-request.md b/.github/ISSUE_TEMPLATE/--feature-request.md index a7369d6b7..1e5662df3 100644 --- a/.github/ISSUE_TEMPLATE/--feature-request.md +++ b/.github/ISSUE_TEMPLATE/--feature-request.md @@ -6,7 +6,6 @@ labels: feature request, needs triage assignees: '' --- - **The problem** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index eeb8e591b..9c0e1e1d9 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,22 +15,27 @@ merge of your pull request! --> + **What**: + **Why**: + **How**: + **Checklist**: + + - [ ] Documentation - [ ] Tests - [ ] Code complete - [ ] Changeset - diff --git a/docs/css-prop.mdx b/docs/css-prop.mdx index d3abce3ed..a1ebe2504 100644 --- a/docs/css-prop.mdx +++ b/docs/css-prop.mdx @@ -13,11 +13,11 @@ There are 2 ways to get started with the `css` prop. Both methods result in the same compiled code. After adding the preset or setting the pragma as a comment, compiled jsx code will use emotion's `jsx` function instead of `React.createElement`. - -| | Input | Output | + +| | Input | Output | | ------ | -------------------------- | --------------------------------------------------- | | Before | `` | `React.createElement('img', { src: 'avatar.png' })` | -| After | `` | `jsx('img', { src: 'avatar.png' })` | +| After | `` | `jsx('img', { src: 'avatar.png' })` | #### Babel Preset diff --git a/package.json b/package.json index 4516471b9..e50824d27 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,8 @@ "release": "yarn build && changeset publish" }, "resolutions": { - "**/react": "16.8.1", - "**/react-dom": "16.8.1", + "**/react": "16.11.0", + "**/react-dom": "16.11.0", "**/browserslist": "^3.2.8", "**/graphql-type-json": "0.2.4" }, @@ -174,10 +174,10 @@ "@manypkg/cli": "^0.5.2", "@mdx-js/mdx": "^1.1.0", "@mdx-js/react": "^1.0.27", - "@testing-library/react": "^8.0.2", + "@testing-library/react": "^9.3.2", "@types/jest": "^23.0.2", "@types/node": "^10.11.4", - "@types/react": "^16.8.20", + "@types/react": "^16.9.11", "babel-check-duplicated-nodes": "^1.0.0", "babel-core": "^6.26.3", "babel-eslint": "^8.2.3", @@ -236,9 +236,9 @@ "puppeteer": "^1.6.0", "raf": "^3.4.0", "razzle": "^2.4.0", - "react": "^16.5.2", + "react": "^16.11.0", "react-art": "^16.5.2", - "react-dom": "^16.5.2", + "react-dom": "^16.11.0", "react-helmet": "^5.2.0", "react-icons": "^2.2.7", "react-live": "1.10.0", @@ -247,7 +247,7 @@ "react-primitives": "^0.7.0", "react-router-dom": "^4.2.2", "react-scripts": "1.1.5", - "react-test-renderer": "^16.3.2", + "react-test-renderer": "16.8.6", "stylis": "3.5.4", "stylis-rule-sheet": "^0.0.10", "svg-tag-names": "^1.1.1", diff --git a/packages/core/__tests__/class-names.js b/packages/core/__tests__/class-names.js index 09da3122c..ef9ca1c9c 100644 --- a/packages/core/__tests__/class-names.js +++ b/packages/core/__tests__/class-names.js @@ -35,7 +35,6 @@ it('should get the theme', () => { ) - expect(tree.toJSON()).toMatchSnapshot() }) diff --git a/packages/core/__tests__/css.js b/packages/core/__tests__/css.js index 467bf3fba..37986765b 100644 --- a/packages/core/__tests__/css.js +++ b/packages/core/__tests__/css.js @@ -50,7 +50,6 @@ test('theming with the css prop', () => {
({ color: theme.primary })} /> ) - expect(tree.toJSON()).toMatchSnapshot() }) diff --git a/packages/core/__tests__/global-insertion-after-others.js b/packages/core/__tests__/global-insertion-after-others.js new file mode 100644 index 000000000..b87819d6d --- /dev/null +++ b/packages/core/__tests__/global-insertion-after-others.js @@ -0,0 +1,33 @@ +/** @jsx jsx */ +import { jsx, Global } from '@emotion/core' +import { render } from '@testing-library/react' + +let getDataAttributes = () => + Array.from(document.querySelectorAll('style[data-emotion]'), x => + x.getAttribute('data-emotion') + ) + +test('Global style element insertion after insertion of other styles', () => { + let Comp = ({ second }) => ( +
+
+ {second && ( + + )} +
+ ) + let { rerender } = render() + expect(getDataAttributes()).toEqual(['css']) + rerender() + expect(getDataAttributes()).toEqual(['css-global', 'css']) +}) diff --git a/packages/core/package.json b/packages/core/package.json index 95978bd8c..aac085d56 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -27,17 +27,17 @@ "@emotion/utils": "0.11.2" }, "peerDependencies": { - "react": ">=16.3.0" + "react": ">=16.8.0" }, "devDependencies": { "@emotion/styled": "^11.0.0-next.1", - "@types/react": "^16.8.20", + "@types/react": "^16.9.11", "dtslint": "^0.3.0", "emotion": "^11.0.0-next.0", "emotion-server": "^11.0.0-next.0", "emotion-theming": "^11.0.0-next.1", "html-tag-names": "^1.1.2", - "react": "^16.5.2", + "react": "^16.11.0", "svg-tag-names": "^1.1.1" }, "repository": "https://github.com/emotion-js/emotion/tree/master/packages/core", diff --git a/packages/core/src/class-names.js b/packages/core/src/class-names.js index e99313b4d..5e66a2cd3 100644 --- a/packages/core/src/class-names.js +++ b/packages/core/src/class-names.js @@ -1,5 +1,6 @@ // @flow import * as React from 'react' +import { useContext } from 'react' import { getRegisteredStyles, insertStyles } from '@emotion/utils' import { serializeStyles } from '@emotion/serialize' import { withEmotionCache, ThemeContext } from './context' @@ -71,65 +72,63 @@ function merge( type Props = { children: ({ - css: (...args: Array) => string, + css: (...args: any) => string, cx: (...args: Array) => string, theme: Object }) => React.Node } -export const ClassNames = withEmotionCache((props, context) => { - return ( - - {theme => { - let rules = '' - let serializedHashes = '' - let hasRendered = false +export const ClassNames: React.AbstractComponent = withEmotionCache( + (props, cache) => { + let rules = '' + let serializedHashes = '' + let hasRendered = false - let css = (...args: Array) => { - if (hasRendered && process.env.NODE_ENV !== 'production') { - throw new Error('css can only be used during render') - } - let serialized = serializeStyles(args, context.registered) - if (isBrowser) { - insertStyles(context, serialized, false) - } else { - let res = insertStyles(context, serialized, false) - if (res !== undefined) { - rules += res - } - } - if (!isBrowser) { - serializedHashes += ` ${serialized.name}` - } - return `${context.key}-${serialized.name}` - } - let cx = (...args: Array) => { - if (hasRendered && process.env.NODE_ENV !== 'production') { - throw new Error('cx can only be used during render') - } - return merge(context.registered, css, classnames(args)) - } - let content = { css, cx, theme } - let ele = props.children(content) - hasRendered = true - if (!isBrowser && rules.length !== 0) { - return ( - -