diff --git a/packages/benchmarks/package.json b/packages/benchmarks/package.json index b03a79aa2..0fe2db01e 100644 --- a/packages/benchmarks/package.json +++ b/packages/benchmarks/package.json @@ -20,7 +20,7 @@ "react-native-web": "0.17.7", "styled-components": "workspace:*", "styled-components-v5": "npm:styled-components@5.3.9", - "styled-components-v6": "npm:styled-components@latest", + "styled-components-v6": "npm:styled-components@6.1.12", "styled-jsx": "5.1.2", "styletron-engine-atomic": "1.6.2", "styletron-react": "6.1.1" diff --git a/packages/benchmarks/src/implementations/styled-components-v5/View.js b/packages/benchmarks/src/implementations/styled-components-v5/View.js index 324c8f129..9488a168f 100644 --- a/packages/benchmarks/src/implementations/styled-components-v5/View.js +++ b/packages/benchmarks/src/implementations/styled-components-v5/View.js @@ -1,6 +1,6 @@ import styled from 'styled-components-v5'; -const View = styled.div` +export default styled.div` align-items: stretch; border-width: 0; border-style: solid; @@ -15,5 +15,3 @@ const View = styled.div` min-height: 0; min-width: 0; `; - -export default View; diff --git a/packages/benchmarks/src/implementations/styled-components-v6/View.js b/packages/benchmarks/src/implementations/styled-components-v6/View.js index 51e0d011e..32f7aa864 100644 --- a/packages/benchmarks/src/implementations/styled-components-v6/View.js +++ b/packages/benchmarks/src/implementations/styled-components-v6/View.js @@ -1,6 +1,6 @@ import styled from 'styled-components-v6'; -const View = styled.div` +export default styled.div` align-items: stretch; border-width: 0; border-style: solid; @@ -15,5 +15,3 @@ const View = styled.div` min-height: 0; min-width: 0; `; - -export default View; diff --git a/packages/benchmarks/src/implementations/styled-components/Box.js b/packages/benchmarks/src/implementations/styled-components/Box.js index cf544bcbe..f405debee 100644 --- a/packages/benchmarks/src/implementations/styled-components/Box.js +++ b/packages/benchmarks/src/implementations/styled-components/Box.js @@ -1,4 +1,4 @@ -import styled, { css } from 'styled-components'; +import styled from 'styled-components'; import View from './View'; const getColor = color => { @@ -20,14 +20,12 @@ const getColor = color => { } }; -export default styled(View).attrs(p => ({ style: { backgroundColor: getColor(p.color) } }))` +const Box = styled(View)` align-self: flex-start; flex-direction: ${props => (props.layout === 'column' ? 'column' : 'row')}; padding: ${props => (props.outer ? '4px' : '0')}; - ${props => - props.fixed && - css` - height: 6px; - width: 6px; - `} + ${props => props.fixed && 'height:6px;'} ${props => + props.fixed && 'width:6px;'} background-color: ${props => getColor(props.color)}; `; + +export default Box; diff --git a/packages/benchmarks/src/implementations/styled-components/Dot.js b/packages/benchmarks/src/implementations/styled-components/Dot.js index 769b8156d..fb7e205e9 100644 --- a/packages/benchmarks/src/implementations/styled-components/Dot.js +++ b/packages/benchmarks/src/implementations/styled-components/Dot.js @@ -1,16 +1,7 @@ import styled from 'styled-components'; import View from './View'; -export default styled(View).attrs(p => ({ - style: { - borderBottomColor: p.color, - marginLeft: `${p.x}px`, - marginTop: `${p.y}px`, - borderRightWidth: `${p.size / 2}px`, - borderBottomWidth: `${p.size / 2}px`, - borderLeftWidth: `${p.size / 2}px`, - }, -}))` +const Dot = styled(View).attrs(p => ({ style: { borderBottomColor: p.color } }))` position: absolute; cursor: pointer; width: 0; @@ -19,4 +10,11 @@ export default styled(View).attrs(p => ({ border-style: solid; border-top-width: 0; transform: translate(50%, 50%); + margin-left: ${props => `${props.x}px`}; + margin-top: ${props => `${props.y}px`}; + border-right-width: ${props => `${props.size / 2}px`}; + border-bottom-width: ${props => `${props.size / 2}px`}; + border-left-width: ${props => `${props.size / 2}px`}; `; + +export default Dot; diff --git a/packages/benchmarks/src/index.js b/packages/benchmarks/src/index.js index ddef58a1b..198525d99 100644 --- a/packages/benchmarks/src/index.js +++ b/packages/benchmarks/src/index.js @@ -32,14 +32,14 @@ const tests = { 'Mount deep tree': createTestBlock(components => ({ benchmarkType: 'mount', Component: Tree, - getComponentProps: () => ({ breadth: 2, components, depth: 7, id: 0, wrap: 1 }), + getComponentProps: ({ cycle }) => ({ breadth: 2, components, depth: 7, id: cycle, wrap: 1 }), Provider: components.Provider, sampleCount: 500, })), 'Mount wide tree': createTestBlock(components => ({ benchmarkType: 'mount', Component: Tree, - getComponentProps: () => ({ breadth: 6, components, depth: 3, id: 0, wrap: 2 }), + getComponentProps: ({ cycle }) => ({ breadth: 6, components, depth: 3, id: cycle, wrap: 2 }), Provider: components.Provider, sampleCount: 500, })), diff --git a/packages/styled-components/package.json b/packages/styled-components/package.json index 27baad400..8f5aae920 100644 --- a/packages/styled-components/package.json +++ b/packages/styled-components/package.json @@ -1,6 +1,6 @@ { "name": "styled-components", - "version": "6.1.12", + "version": "6.1.13", "description": "CSS for the Age. Style components your way with speed, strong typing, and flexibility.", "types": "dist/index.d.ts", "main": "dist/styled-components.cjs.js", diff --git a/packages/styled-components/src/constructors/styled.tsx b/packages/styled-components/src/constructors/styled.tsx index 275d08236..9dd12f253 100644 --- a/packages/styled-components/src/constructors/styled.tsx +++ b/packages/styled-components/src/constructors/styled.tsx @@ -1,4 +1,4 @@ -import { ComponentPropsWithRef } from 'react'; +import * as React from 'react'; import createStyledComponent from '../models/StyledComponent'; import { BaseObject, KnownTarget, WebTarget } from '../types'; import domElements, { SupportedHTMLElements } from '../utils/domElements'; @@ -10,11 +10,11 @@ const baseStyled = & InjectedProps : InjectedProps + Target extends KnownTarget ? React.ComponentPropsWithRef & InjectedProps : InjectedProps >(createStyledComponent, tag); const styled = baseStyled as typeof baseStyled & { - [E in SupportedHTMLElements]: StyledInstance<'web', E, JSX.IntrinsicElements[E]>; + [E in SupportedHTMLElements]: StyledInstance<'web', E, React.JSX.IntrinsicElements[E]>; }; // Shorthands for all valid HTML Elements diff --git a/packages/styled-components/src/constructors/test/createGlobalStyle.ssr.test.tsx b/packages/styled-components/src/constructors/test/createGlobalStyle.ssr.test.tsx index 84363037d..fb31b7b35 100644 --- a/packages/styled-components/src/constructors/test/createGlobalStyle.ssr.test.tsx +++ b/packages/styled-components/src/constructors/test/createGlobalStyle.ssr.test.tsx @@ -12,7 +12,7 @@ describe(`createGlobalStyle`, () => { function setup() { return { - renderToString(comp: JSX.Element) { + renderToString(comp: React.JSX.Element) { return ReactDOMServer.renderToString(comp); }, }; diff --git a/packages/styled-components/src/constructors/test/createGlobalStyle.test.tsx b/packages/styled-components/src/constructors/test/createGlobalStyle.test.tsx index 2bca8ff52..d4b0b321b 100644 --- a/packages/styled-components/src/constructors/test/createGlobalStyle.test.tsx +++ b/packages/styled-components/src/constructors/test/createGlobalStyle.test.tsx @@ -19,7 +19,7 @@ describe(`createGlobalStyle`, () => { return { container, - render(comp: JSX.Element) { + render(comp: React.JSX.Element) { ReactDOM.render(comp, container); }, cleanup() { diff --git a/packages/styled-components/src/hoc/withTheme.tsx b/packages/styled-components/src/hoc/withTheme.tsx index 469302fe8..cb4f404d6 100644 --- a/packages/styled-components/src/hoc/withTheme.tsx +++ b/packages/styled-components/src/hoc/withTheme.tsx @@ -6,7 +6,7 @@ import getComponentName from '../utils/getComponentName'; import hoist from '../utils/hoist'; export default function withTheme(Component: T) { - const WithTheme = React.forwardRef>( + const WithTheme = React.forwardRef>( (props, ref) => { const theme = React.useContext(ThemeContext); const themeProp = determineTheme(props, theme, Component.defaultProps); diff --git a/packages/styled-components/src/models/ServerStyleSheet.tsx b/packages/styled-components/src/models/ServerStyleSheet.tsx index e1639afb1..06265d6bc 100644 --- a/packages/styled-components/src/models/ServerStyleSheet.tsx +++ b/packages/styled-components/src/models/ServerStyleSheet.tsx @@ -35,7 +35,7 @@ export default class ServerStyleSheet { return ``; }; - collectStyles(children: any): JSX.Element { + collectStyles(children: any): React.JSX.Element { if (this.sealed) { throw styledError(2); } diff --git a/packages/styled-components/src/models/StyleSheetManager.tsx b/packages/styled-components/src/models/StyleSheetManager.tsx index 095f3cbf0..72f9821fb 100644 --- a/packages/styled-components/src/models/StyleSheetManager.tsx +++ b/packages/styled-components/src/models/StyleSheetManager.tsx @@ -2,7 +2,7 @@ import React, { useContext, useEffect, useMemo, useState } from 'react'; import shallowequal from 'shallowequal'; import type stylis from 'stylis'; import StyleSheet from '../sheet'; -import { ShouldForwardProp, Stringifier } from '../types'; +import { InsertionTarget, ShouldForwardProp, Stringifier } from '../types'; import createStylisInstance from '../utils/stylis'; export const mainSheet: StyleSheet = new StyleSheet(); @@ -75,10 +75,10 @@ export type IStyleSheetManager = React.PropsWithChildren<{ /** * Provide an alternate DOM node to host generated styles; useful for iframes. */ - target?: undefined | HTMLElement; + target?: undefined | InsertionTarget; }>; -export function StyleSheetManager(props: IStyleSheetManager): JSX.Element { +export function StyleSheetManager(props: IStyleSheetManager): React.JSX.Element { const [plugins, setPlugins] = useState(props.stylisPlugins); const { styleSheet } = useStyleSheetContext(); diff --git a/packages/styled-components/src/models/ThemeProvider.tsx b/packages/styled-components/src/models/ThemeProvider.tsx index 50e318e4d..ce638e147 100644 --- a/packages/styled-components/src/models/ThemeProvider.tsx +++ b/packages/styled-components/src/models/ThemeProvider.tsx @@ -86,7 +86,7 @@ export function useTheme(): DefaultTheme { /** * Provide a theme to an entire react component tree via context */ -export default function ThemeProvider(props: Props): JSX.Element | null { +export default function ThemeProvider(props: Props): React.JSX.Element | null { const outerTheme = React.useContext(ThemeContext); const themeContext = useMemo( () => mergeTheme(props.theme, outerTheme), diff --git a/packages/styled-components/src/sheet/Sheet.ts b/packages/styled-components/src/sheet/Sheet.ts index db3d82d23..579454ff7 100644 --- a/packages/styled-components/src/sheet/Sheet.ts +++ b/packages/styled-components/src/sheet/Sheet.ts @@ -1,4 +1,5 @@ import { DISABLE_SPEEDY, IS_BROWSER } from '../constants'; +import { InsertionTarget } from '../types'; import { EMPTY_OBJECT } from '../utils/empties'; import { setToString } from '../utils/setToString'; import { makeGroupedTag } from './GroupedTag'; @@ -12,7 +13,7 @@ let SHOULD_REHYDRATE = IS_BROWSER; type SheetConstructorArgs = { isServer?: boolean; useCSSOMInjection?: boolean; - target?: HTMLElement | undefined; + target?: InsertionTarget | undefined; }; type GlobalStylesAllocationMap = { diff --git a/packages/styled-components/src/sheet/Tag.ts b/packages/styled-components/src/sheet/Tag.ts index 4e7739c68..10e1ba19e 100644 --- a/packages/styled-components/src/sheet/Tag.ts +++ b/packages/styled-components/src/sheet/Tag.ts @@ -1,3 +1,4 @@ +import { InsertionTarget } from '../types'; import { getSheet, makeStyleTag } from './dom'; import { SheetOptions, Tag } from './types'; @@ -19,7 +20,7 @@ export const CSSOMTag = class CSSOMTag implements Tag { length: number; - constructor(target?: HTMLElement | undefined) { + constructor(target?: InsertionTarget | undefined) { this.element = makeStyleTag(target); // Avoid Edge bug where empty style elements don't create sheets @@ -62,7 +63,7 @@ export const TextTag = class TextTag implements Tag { nodes: NodeListOf; length: number; - constructor(target?: HTMLElement | undefined) { + constructor(target?: InsertionTarget | undefined) { this.element = makeStyleTag(target); this.nodes = this.element.childNodes; this.length = 0; @@ -100,7 +101,7 @@ export const VirtualTag = class VirtualTag implements Tag { length: number; - constructor(_target?: HTMLElement | undefined) { + constructor(_target?: InsertionTarget | undefined) { this.rules = []; this.length = 0; } diff --git a/packages/styled-components/src/sheet/dom.ts b/packages/styled-components/src/sheet/dom.ts index 5e32ea6ac..8c3af4940 100644 --- a/packages/styled-components/src/sheet/dom.ts +++ b/packages/styled-components/src/sheet/dom.ts @@ -1,16 +1,17 @@ import { SC_ATTR, SC_ATTR_ACTIVE, SC_ATTR_VERSION, SC_VERSION } from '../constants'; +import { InsertionTarget } from '../types'; import styledError from '../utils/error'; import getNonce from '../utils/nonce'; /** Find last style element if any inside target */ -const findLastStyleTag = (target: HTMLElement): void | HTMLStyleElement => { +const findLastStyleTag = (target: InsertionTarget): void | HTMLStyleElement => { const arr = Array.from(target.querySelectorAll(`style[${SC_ATTR}]`)); return arr[arr.length - 1]; }; /** Create a style element inside `target` or after the last */ -export const makeStyleTag = (target?: HTMLElement | undefined): HTMLStyleElement => { +export const makeStyleTag = (target?: InsertionTarget | undefined): HTMLStyleElement => { const head = document.head; const parent = target || head; const style = document.createElement('style'); diff --git a/packages/styled-components/src/sheet/types.ts b/packages/styled-components/src/sheet/types.ts index a4d1791c5..65b870457 100644 --- a/packages/styled-components/src/sheet/types.ts +++ b/packages/styled-components/src/sheet/types.ts @@ -1,3 +1,5 @@ +import { InsertionTarget } from '../types'; + /** CSSStyleSheet-like Tag abstraction for CSS rules */ export interface Tag { insertRule(index: number, rule: string): boolean; @@ -18,7 +20,7 @@ export interface GroupedTag { export type SheetOptions = { isServer: boolean; - target?: HTMLElement | undefined; + target?: InsertionTarget | undefined; useCSSOMInjection: boolean; }; diff --git a/packages/styled-components/src/test/props.test.tsx b/packages/styled-components/src/test/props.test.tsx index 43253cd72..1543108bd 100644 --- a/packages/styled-components/src/test/props.test.tsx +++ b/packages/styled-components/src/test/props.test.tsx @@ -127,7 +127,7 @@ describe('props', () => { }); it('allows custom prop filtering for components', () => { - const InnerComp = (props: JSX.IntrinsicElements['div']) =>
; + const InnerComp = (props: React.JSX.IntrinsicElements['div']) =>
; const Comp = styled(InnerComp).withConfig({ shouldForwardProp: prop => !['filterThis'].includes(prop), })<{ filterThis: string; passThru: string }>` @@ -184,7 +184,7 @@ describe('props', () => { }); it('should filter out props when using "as" to a custom component', () => { - const AsComp = (props: JSX.IntrinsicElements['div']) =>
; + const AsComp = (props: React.JSX.IntrinsicElements['div']) =>
; const Comp = styled('div').withConfig({ shouldForwardProp: prop => !['filterThis'].includes(prop), })<{ filterThis: string; passThru: string }>` @@ -202,7 +202,7 @@ describe('props', () => { }); it('can set computed styles based on props that are being filtered out', () => { - const AsComp = (props: JSX.IntrinsicElements['div']) =>
; + const AsComp = (props: React.JSX.IntrinsicElements['div']) =>
; const Comp = styled('div').withConfig({ shouldForwardProp: prop => !['filterThis'].includes(prop), })<{ filterThis: string; passThru: string }>` diff --git a/packages/styled-components/src/test/ssr.test.tsx b/packages/styled-components/src/test/ssr.test.tsx index adfa4216e..39cd87fb9 100644 --- a/packages/styled-components/src/test/ssr.test.tsx +++ b/packages/styled-components/src/test/ssr.test.tsx @@ -306,7 +306,7 @@ describe('ssr', () => { }); it('should handle errors while streaming', () => { - function ExplodingComponent(): JSX.Element { + function ExplodingComponent(): React.JSX.Element { throw new Error('ahhh'); } diff --git a/packages/styled-components/src/test/types.tsx b/packages/styled-components/src/test/types.tsx index 2e9d2b994..79703fc85 100644 --- a/packages/styled-components/src/test/types.tsx +++ b/packages/styled-components/src/test/types.tsx @@ -309,7 +309,7 @@ const StyledDiv = styled.div``; const CustomComponent = (({ ...props }) => { return ; -}) as IStyledComponent<'web', JSX.IntrinsicElements['div']>; +}) as IStyledComponent<'web', React.JSX.IntrinsicElements['div']>; const StyledCustomComponent = styled(CustomComponent)``; diff --git a/packages/styled-components/src/types.ts b/packages/styled-components/src/types.ts index d3f276482..091e25de6 100644 --- a/packages/styled-components/src/types.ts +++ b/packages/styled-components/src/types.ts @@ -217,7 +217,7 @@ export interface PolymorphicComponent | void = void, >( props: PolymorphicComponentProps - ): JSX.Element; + ): React.JSX.Element; } export interface IStyledComponentBase @@ -321,3 +321,5 @@ export type CSSProp = Interpolation; export type NoInfer = [T][T extends any ? 0 : never]; export type Substitute = FastOmit & B; + +export type InsertionTarget = HTMLElement | ShadowRoot; diff --git a/yarn.lock b/yarn.lock index e4d635dd0..0786cb247 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1728,15 +1728,6 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:1.2.1": - version: 1.2.1 - resolution: "@emotion/is-prop-valid@npm:1.2.1" - dependencies: - "@emotion/memoize": "npm:^0.8.1" - checksum: 7c2aabdf0ca9986ca25abc9dae711348308cf18d418d64ffa4c8ffd2114806c47f2e06ba8ee769f38ec67d65bd59ec73f34d94023e81baa1c43510ac86ccd5e6 - languageName: node - linkType: hard - "@emotion/is-prop-valid@npm:1.2.2, @emotion/is-prop-valid@npm:^1.1.0, @emotion/is-prop-valid@npm:^1.2.2": version: 1.2.2 resolution: "@emotion/is-prop-valid@npm:1.2.2" @@ -2693,7 +2684,7 @@ __metadata: style-loader: "npm:3.3.4" styled-components: "workspace:*" styled-components-v5: "npm:styled-components@5.3.9" - styled-components-v6: "npm:styled-components@latest" + styled-components-v6: "npm:styled-components@6.1.12" styled-jsx: "npm:5.1.2" styletron-engine-atomic: "npm:1.6.2" styletron-react: "npm:6.1.1" @@ -3014,13 +3005,6 @@ __metadata: languageName: node linkType: hard -"@types/stylis@npm:4.2.0": - version: 4.2.0 - resolution: "@types/stylis@npm:4.2.0" - checksum: c76c13e76ca485f598a13984cfb5e07bb88a851da5bee213587424a5f101f182c74f4f92d633cebf9abcec40ccebb645d600d184b7e4b42793e3eeca8729b110 - languageName: node - linkType: hard - "@types/stylis@npm:4.2.5": version: 4.2.5 resolution: "@types/stylis@npm:4.2.5" @@ -4659,13 +4643,6 @@ __metadata: languageName: node linkType: hard -"csstype@npm:3.1.2": - version: 3.1.2 - resolution: "csstype@npm:3.1.2" - checksum: 32c038af259897c807ac738d9eab16b3d86747c72b09d5c740978e06f067f9b7b1737e1b75e407c7ab1fe1543dc95f20e202b4786aeb1b8d3bdf5d5ce655e6c6 - languageName: node - linkType: hard - "csstype@npm:3.1.3, csstype@npm:^3.0.0, csstype@npm:^3.0.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -7809,7 +7786,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.4, nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.4, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -8480,17 +8457,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.31": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" - dependencies: - nanoid: "npm:^3.3.6" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 748b82e6e5fc34034dcf2ae88ea3d11fd09f69b6c50ecdd3b4a875cfc7cdca435c958b211e2cb52355422ab6fccb7d8f2f2923161d7a1b281029e4a913d59acf - languageName: node - linkType: hard - "postcss@npm:8.4.38, postcss@npm:^8.4.33": version: 8.4.38 resolution: "postcss@npm:8.4.38" @@ -9889,27 +9855,7 @@ __metadata: languageName: node linkType: hard -"styled-components-v6@npm:styled-components@latest": - version: 6.1.9 - resolution: "styled-components@npm:6.1.9" - dependencies: - "@emotion/is-prop-valid": "npm:1.2.1" - "@emotion/unitless": "npm:0.8.1" - "@types/stylis": "npm:4.2.0" - css-to-react-native: "npm:3.2.0" - csstype: "npm:3.1.2" - postcss: "npm:8.4.31" - shallowequal: "npm:1.1.0" - stylis: "npm:4.3.1" - tslib: "npm:2.5.0" - peerDependencies: - react: ">= 16.8.0" - react-dom: ">= 16.8.0" - checksum: e5298859675f954424af45e7e1261980f86ca01188509e0af330cabe869533e6ce04aa63a4f94cbdc66ba1b834da247e54bb0ee05b5d2d57d906f0a45388763f - languageName: node - linkType: hard - -"styled-components@workspace:*, styled-components@workspace:packages/styled-components": +"styled-components-v6@npm:styled-components@6.1.12, styled-components@workspace:*, styled-components@workspace:packages/styled-components": version: 0.0.0-use.local resolution: "styled-components@workspace:packages/styled-components" dependencies: @@ -10056,13 +10002,6 @@ __metadata: languageName: node linkType: hard -"stylis@npm:4.3.1": - version: 4.3.1 - resolution: "stylis@npm:4.3.1" - checksum: 33e8ebd2bfa5f0bd0215f718dc2d3be896e1d00c5bcaeb9a4ae03cf239db6867af9eee230f57229bf1c29499357073ba3e6b547484ba1db2f5de1e8be7d4eee9 - languageName: node - linkType: hard - "stylis@npm:4.3.2": version: 4.3.2 resolution: "stylis@npm:4.3.2" @@ -10287,13 +10226,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.5.0": - version: 2.5.0 - resolution: "tslib@npm:2.5.0" - checksum: e32fc99cc730dd514e53c44e668d76016e738f0bcc726aad5dbd2d335cf19b87a95a9b1e4f0a9993e370f1d702b5e471cdd4acabcac428a3099d496b9af2021e - languageName: node - linkType: hard - "tslib@npm:2.6.2, tslib@npm:^2.0.1, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2"