styled-components
Version:
Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅
209 lines (176 loc) • 5.72 kB
TypeScript
import * as React from 'react'
import {
StatelessComponent,
Component as ReactComponent,
ComponentClass,
PureComponent,
ReactElement,
RefObject,
} from 'react'
export interface ThemeProps<T> {
theme: T
}
export type ThemedStyledProps<P, T> = P & ThemeProps<T>
export type StyledProps<P> = ThemedStyledProps<P, any>
export type ThemedOuterStyledProps<P, T> = P & {
theme?: T
innerRef?:
| ((instance: any) => void)
| RefObject<HTMLElement | SVGElement | ReactComponent>
}
export type OuterStyledProps<P> = ThemedOuterStyledProps<P, any>
export type FalseyValue = undefined | null | false
export type Interpolation<P> =
| FlattenInterpolation<P>
| ReadonlyArray<
FlattenInterpolation<P> | ReadonlyArray<FlattenInterpolation<P>>
>
export type FlattenInterpolation<P> =
| InterpolationValue
| InterpolationFunction<P>
export type InterpolationValue =
| string
| number
| Styles
| FalseyValue
| StyledComponentClass<any, any>
export type SimpleInterpolation =
| InterpolationValue
| ReadonlyArray<InterpolationValue | ReadonlyArray<InterpolationValue>>
export interface Styles {
[ruleOrSelector: string]: string | number | Styles
}
export interface InterpolationFunction<P> {
(props: P): Interpolation<P>
}
type Attrs<P, A extends Partial<P>, T> = {
[K in keyof A]: ((props: ThemedStyledProps<P, T>) => A[K]) | A[K]
}
export interface StyledComponentClass<P, T, O = P>
extends ComponentClass<ThemedOuterStyledProps<O, T>> {
extend: ThemedStyledFunction<P, T, O>
withComponent<K extends keyof JSX.IntrinsicElements>(
tag: K
): StyledComponentClass<
JSX.IntrinsicElements[K],
T,
JSX.IntrinsicElements[K] & O
>
withComponent<U = {}>(
element: React.ComponentType<U>
): StyledComponentClass<U, T, U & O>
}
export interface ThemedStyledFunction<P, T, O = P> {
(
strings: TemplateStringsArray,
...interpolations: Interpolation<ThemedStyledProps<P, T>>[]
): StyledComponentClass<P, T, O>
<U>(
strings: TemplateStringsArray,
...interpolations: Interpolation<ThemedStyledProps<P & U, T>>[]
): StyledComponentClass<P & U, T, O & U>
attrs<U, A extends Partial<P & U> = {}>(
attrs: Attrs<P & U, A, T>
): ThemedStyledFunction<DiffBetween<A, P & U>, T, DiffBetween<A, O & U>>
}
export type StyledFunction<P> = ThemedStyledFunction<P, any>
type ThemedStyledComponentFactories<T> = {
[TTag in keyof JSX.IntrinsicElements]: ThemedStyledFunction<
JSX.IntrinsicElements[TTag],
T
>
}
export interface ThemedBaseStyledInterface<T>
extends ThemedStyledComponentFactories<T> {
<P, TTag extends keyof JSX.IntrinsicElements>(
tag: TTag
): ThemedStyledFunction<P, T, P & JSX.IntrinsicElements[TTag]>
<P, O>(component: StyledComponentClass<P, T, O>): ThemedStyledFunction<
P,
T,
O
>
<P extends { [prop: string]: any; theme?: T }>(
component: React.ComponentType<P>
): ThemedStyledFunction<P, T, WithOptionalTheme<P, T>>
}
export type BaseStyledInterface = ThemedBaseStyledInterface<any>
export type ThemedStyledInterface<T> = ThemedBaseStyledInterface<T>
export type StyledInterface = ThemedStyledInterface<any>
export interface ThemeProviderProps<T> {
theme?: T | ((theme: T) => T)
}
export type ThemeProviderComponent<T> = ComponentClass<ThemeProviderProps<T>>
export interface ThemedCssFunction<T> {
(
strings: TemplateStringsArray,
...interpolations: SimpleInterpolation[]
): InterpolationValue[]
<P>(
strings: TemplateStringsArray,
...interpolations: Interpolation<ThemedStyledProps<P, T>>[]
): FlattenInterpolation<ThemedStyledProps<P, T>>[]
}
// Helper type operators
type KeyofBase = keyof any
type Diff<T extends KeyofBase, U extends KeyofBase> = ({ [P in T]: P } &
{ [P in U]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>
type DiffBetween<T, U> = Pick<T, Diff<keyof T, keyof U>> &
Pick<U, Diff<keyof U, keyof T>>
type WithOptionalTheme<P extends { theme?: T }, T> = Omit<P, 'theme'> & {
theme?: T
}
export interface ThemedStyledComponentsModule<T> {
default: ThemedStyledInterface<T>
css: ThemedCssFunction<T>
keyframes(
strings: TemplateStringsArray,
...interpolations: SimpleInterpolation[]
): string
injectGlobal(
strings: TemplateStringsArray,
...interpolations: SimpleInterpolation[]
): void
withTheme<P extends { theme?: T }>(
component: React.ComponentType<P>
): ComponentClass<WithOptionalTheme<P, T>>
ThemeProvider: ThemeProviderComponent<T>
}
declare const styled: StyledInterface
export const css: ThemedCssFunction<any>
export function withTheme<P extends { theme?: T }, T>(
component: React.ComponentType<P>
): ComponentClass<WithOptionalTheme<P, T>>
export function keyframes(
strings: TemplateStringsArray,
...interpolations: SimpleInterpolation[]
): string
export function injectGlobal(
strings: TemplateStringsArray,
...interpolations: SimpleInterpolation[]
): void
export function consolidateStreamedStyles(): void
export function isStyledComponent(target: any): target is StyledComponentClass<{}, {}>
export const ThemeProvider: ThemeProviderComponent<object>
interface StylesheetComponentProps {
sheet: ServerStyleSheet
}
interface StyleSheetManagerProps {
sheet?: StyleSheet
target?: Node
}
export class StyleSheetManager extends React.Component<
StyleSheetManagerProps,
{}
> {}
export class ServerStyleSheet {
collectStyles(tree: React.ReactNode): ReactElement<StylesheetComponentProps>
getStyleTags(): string
getStyleElement(): ReactElement<{}>[]
interleaveWithNodeStream(
readableStream: NodeJS.ReadableStream
): NodeJS.ReadableStream
instance: StyleSheet
}
export default styled