1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import * as React from 'react';
|
7 |
|
8 | export type IntrinsicElementsKeys = keyof JSX.IntrinsicElements;
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | type Defaultize<P, D> = P extends any
|
15 | ? string extends keyof P
|
16 | ? P
|
17 | : Pick<P, Exclude<keyof P, keyof D>> &
|
18 | Partial<Pick<P, Extract<keyof P, keyof D>>> &
|
19 | Partial<Pick<D, Exclude<keyof D, keyof P>>>
|
20 | : never;
|
21 |
|
22 | type ReactDefaultizedProps<C, P> = C extends { defaultProps: infer D }
|
23 | ? Defaultize<P, D>
|
24 | : P;
|
25 |
|
26 | type MakeAttrsOptional<
|
27 | C extends string | React.ComponentType<any>,
|
28 | O extends object,
|
29 | A extends keyof any
|
30 | > = Omit<
|
31 | ReactDefaultizedProps<
|
32 | C,
|
33 | React.ComponentPropsWithRef<
|
34 | C extends IntrinsicElementsKeys | React.ComponentType<any> ? C : never
|
35 | >
|
36 | > &
|
37 | O,
|
38 | A
|
39 | > &
|
40 | Partial<
|
41 | Pick<
|
42 | React.ComponentPropsWithRef<
|
43 | C extends IntrinsicElementsKeys | React.ComponentType<any> ? C : never
|
44 | > &
|
45 | O,
|
46 | A
|
47 | >
|
48 | >;
|
49 |
|
50 | export type StyledComponentProps<
|
51 |
|
52 | C extends keyof string | React.ComponentType<any>,
|
53 |
|
54 | O extends object,
|
55 |
|
56 | A extends keyof any
|
57 | > =
|
58 |
|
59 | O extends object
|
60 | ? MakeAttrsOptional<C, O, A> & WithChildrenIfReactComponentClass<C>
|
61 | : never;
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 | type WithChildrenIfReactComponentClass<
|
68 | C extends keyof string | React.ComponentType<any>
|
69 | > = C extends React.ComponentClass<any>
|
70 | ? { children?: React.ReactNode | undefined }
|
71 | : {};
|
72 |
|
73 | type StyledComponentPropsWithAs<
|
74 | C extends keyof string | React.ComponentType<any>,
|
75 | O extends object,
|
76 | A extends keyof any
|
77 | > = StyledComponentProps<C, O, A> & { as?: C | undefined };
|
78 |
|
79 |
|
80 | type ForwardRefExoticBase<P> = Pick<
|
81 | React.ForwardRefExoticComponent<P>,
|
82 | keyof React.ForwardRefExoticComponent<any>
|
83 | >;
|
84 |
|
85 | export interface StyledComponent<
|
86 | C extends keyof JSX.IntrinsicElements | React.ComponentType<any>,
|
87 | O extends object = {},
|
88 | A extends keyof any = never
|
89 | > extends ForwardRefExoticBase<StyledComponentProps<C, O, A>> {
|
90 |
|
91 | (props: StyledComponentProps<C, O, A> & { as?: never }): React.ReactElement<
|
92 | StyledComponentProps<C, O, A>
|
93 | >;
|
94 | <AsC extends string | React.ComponentType<any> = C>(
|
95 | props: StyledComponentPropsWithAs<AsC, O, A>,
|
96 | ): React.ReactElement<StyledComponentPropsWithAs<AsC, O, A>>;
|
97 |
|
98 | withComponent<WithC extends string | React.ComponentType<any>>(
|
99 | component: WithC,
|
100 | ): StyledComponent<WithC, O>;
|
101 | }
|
102 |
|
103 | export type StyledComponentPropsWithRef<
|
104 | C extends string | React.ComponentType<any>
|
105 | > = React.ComponentPropsWithRef<C>;
|
106 |
|
107 | type Attrs<P, A extends Partial<P>> = ((props: P) => A) | A;
|
108 |
|
109 | export interface StyledFunction<
|
110 | C extends string | React.ComponentType<any>,
|
111 | O extends object = {},
|
112 | A extends keyof any = never
|
113 | > {
|
114 | (...rest: any[]): StyledComponent<C, O, A>;
|
115 | // tslint:disable-next-line:no-unnecessary-generics
|
116 | <U extends object>(...rest: any[]): StyledComponent<C, O & U, A>;
|
117 |
|
118 | attrs<
|
119 | U extends object,
|
120 | NewA extends Partial<StyledComponentPropsWithRef<C> & U> & {
|
121 | [others: string]: any;
|
122 | } = Partial<StyledComponentPropsWithRef<C> & U>
|
123 | >(
|
124 | provideProps: Attrs<
|
125 | ReactDefaultizedProps<C, React.ComponentPropsWithRef<C>> & U,
|
126 | NewA
|
127 | >,
|
128 | ): StyledFunction<C, O & NewA, A | keyof NewA>;
|
129 | }
|
130 |
|
131 | export type StyledTags = {
|
132 | readonly [TTag in IntrinsicElementsKeys]: StyledFunction<TTag>;
|
133 | };
|
134 |
|
135 | export interface StyledOptions {
|
136 | allowAs?: boolean | undefined;
|
137 | }
|
138 |
|
139 | export type mapper<TInner, TOuter> = (input: TInner) => TOuter;
|
140 |
|
141 | export interface CreateStyled extends StyledTags {
|
142 | <C extends IntrinsicElementsKeys | React.ComponentType<any>>(
|
143 | component: C,
|
144 | options?: StyledOptions,
|
145 | ): StyledFunction<C>;
|
146 |
|
147 | <
|
148 | C extends IntrinsicElementsKeys | React.ComponentType<any>,
|
149 | OtherProps extends object
|
150 | >(
|
151 | component: C,
|
152 | options?: StyledOptions | undefined,
|
153 | ): StyledFunction<C, OtherProps>;
|
154 | }
|
155 |
|
156 | declare const styled: CreateStyled;
|
157 |
|
158 | export function css(template: TemplateStringsArray, ...args: any[]): string;
|
159 |
|
160 | export function stylesheet(
|
161 | template: TemplateStringsArray,
|
162 | ...args: any[]
|
163 | ): Record<string, string>;
|
164 |
|
165 | export default styled;
|