@emotion/styled
Version:
styled API for emotion
84 lines (71 loc) • 2.23 kB
JavaScript
// @flow
import type {
ElementType,
StatelessFunctionalComponent,
AbstractComponent
} from 'react'
import isPropValid from '@emotion/is-prop-valid'
export type Interpolations = Array<any>
export type StyledElementType<Props> =
| string
| AbstractComponent<{ ...Props, className: string }, mixed>
export type StyledOptions = {
label?: string,
shouldForwardProp?: string => boolean,
target?: string
}
export type StyledComponent<Props> = StatelessFunctionalComponent<Props> & {
defaultProps: any,
toString: () => string,
withComponent: (
nextTag: StyledElementType<Props>,
nextOptions?: StyledOptions
) => StyledComponent<Props>
}
export type PrivateStyledComponent<Props> = StyledComponent<Props> & {
__emotion_real: StyledComponent<Props>,
__emotion_base: any,
__emotion_styles: any,
__emotion_forwardProp: any
}
const testOmitPropsOnStringTag = isPropValid
const testOmitPropsOnComponent = (key: string) => key !== 'theme'
export const getDefaultShouldForwardProp = (tag: ElementType) =>
typeof tag === 'string' &&
// 96 is one less than the char code
// for "a" so this is checking that
// it's a lowercase character
tag.charCodeAt(0) > 96
? testOmitPropsOnStringTag
: testOmitPropsOnComponent
export const composeShouldForwardProps = (
tag: PrivateStyledComponent<any>,
options: StyledOptions | void,
isReal: boolean
) => {
let shouldForwardProp
if (options) {
const optionsShouldForwardProp = options.shouldForwardProp
shouldForwardProp =
tag.__emotion_forwardProp && optionsShouldForwardProp
? (propName: string) =>
tag.__emotion_forwardProp(propName) &&
optionsShouldForwardProp(propName)
: optionsShouldForwardProp
}
if (typeof shouldForwardProp !== 'function' && isReal) {
shouldForwardProp = tag.__emotion_forwardProp
}
return shouldForwardProp
}
export type CreateStyledComponent = <Props>(
...args: Interpolations
) => StyledComponent<Props>
export type CreateStyled = {
<Props>(
tag: StyledElementType<Props>,
options?: StyledOptions
): (...args: Interpolations) => StyledComponent<Props>,
[key: string]: CreateStyledComponent,
bind: () => CreateStyled
}