|
1 | 1 | import { createMakeStyles, type CSSObject, type Css, type Cx } from 'tss-react' |
2 | 2 | import { useTheme, type Theme } from '@mui/material' |
3 | 3 |
|
4 | | -// Note: type refinement, see https://github.com/garronej/tss-react/issues/128 |
5 | | -export const { makeStyles } = createMakeStyles({ useTheme }) as any as { |
6 | | - makeStyles: <Params = void, RuleNameSubsetReferencedInNestedSelectors extends string = never>(params?: { |
7 | | - name?: string | Record<string, unknown> |
8 | | - uniqId?: string |
9 | | - }) => <RuleName extends string>( |
10 | | - cssObjectByRuleNameOrGetCssObjectByRuleName: |
11 | | - | Record<RuleName, CSSObject> |
12 | | - | (( |
13 | | - theme: Theme, |
14 | | - params: Params, |
15 | | - classes: Record<RuleNameSubsetReferencedInNestedSelectors, string>, |
16 | | - ) => Record<RuleNameSubsetReferencedInNestedSelectors | RuleName, CSSObject>), |
17 | | - ) => <StyleOverrides extends { classes?: { [key in string]?: string | undefined } }>( |
| 4 | +const { makeStyles: baseMakeStyles } = createMakeStyles({ useTheme }) |
| 5 | + |
| 6 | +type MakeStylesOptions = { |
| 7 | + name?: string | Record<string, unknown> |
| 8 | + uniqId?: string |
| 9 | +} |
| 10 | + |
| 11 | +type StyleRules = Record<string, CSSObject | { [key: string]: unknown }> |
| 12 | +// ^ conceal the complaint like `position: string` not satisfy `position: CSSProperties['position']` |
| 13 | + |
| 14 | +type NestedSelectorClasses<RuleNameSubsetReferencedInNestedSelectors extends string> = Record< |
| 15 | + RuleNameSubsetReferencedInNestedSelectors, |
| 16 | + string |
| 17 | +> |
| 18 | + |
| 19 | +type StyleOverrides = { |
| 20 | + classes?: { [key in string]?: string | undefined } |
| 21 | +} |
| 22 | + |
| 23 | +type EmptyStyleOverrides = { |
| 24 | + classes?: Record<never, never> |
| 25 | +} |
| 26 | + |
| 27 | +type StyleClassNames<Styles extends StyleRules> = { |
| 28 | + [Key in keyof Styles]: string |
| 29 | +} |
| 30 | + |
| 31 | +type ExtraClassKeys<Overrides extends StyleOverrides> = |
| 32 | + Overrides extends { classes?: infer Classes } ? Extract<keyof NonNullable<Classes>, string> : never |
| 33 | + |
| 34 | +type OverrideClassNames<ExtraKeys extends string, BaseKeys extends PropertyKey> = |
| 35 | + string extends ExtraKeys ? Record<string, string> |
| 36 | + : { [Key in Exclude<ExtraKeys, BaseKeys>]: string } |
| 37 | + |
| 38 | +type MakeStylesResult<Styles extends StyleRules, Overrides extends StyleOverrides> = { |
| 39 | + classes: StyleClassNames<Styles> & OverrideClassNames<ExtraClassKeys<Overrides>, keyof Styles> |
| 40 | + theme: Theme |
| 41 | + css: Css |
| 42 | + cx: Cx |
| 43 | +} |
| 44 | + |
| 45 | +type GetCssObjectByRuleName<Params, RuleNameSubsetReferencedInNestedSelectors extends string> = ( |
| 46 | + theme: Theme, |
| 47 | + params: Params, |
| 48 | + classes: NestedSelectorClasses<RuleNameSubsetReferencedInNestedSelectors>, |
| 49 | +) => StyleRules |
| 50 | + |
| 51 | +export interface UseStyles<Params, Styles extends StyleRules> { |
| 52 | + (params: Params): MakeStylesResult<Styles, EmptyStyleOverrides> |
| 53 | + <Overrides extends StyleOverrides>( |
18 | 54 | params: Params, |
19 | | - styleOverrides?: { |
20 | | - props: StyleOverrides |
| 55 | + styleOverrides: { |
| 56 | + props: Overrides |
21 | 57 | ownerState?: Record<string, unknown> |
22 | 58 | }, |
23 | | - ) => { |
24 | | - classes: StyleOverrides extends { classes?: { [key in infer ExtraKeys]?: string | undefined } } ? |
25 | | - Record<string extends ExtraKeys ? RuleName : ExtraKeys | RuleName, string> |
26 | | - : Record<RuleName, string> |
27 | | - theme: Theme |
28 | | - css: Css |
29 | | - cx: Cx |
30 | | - } |
| 59 | + ): MakeStylesResult<Styles, Overrides> |
| 60 | +} |
| 61 | + |
| 62 | +interface MakeStylesHook<Params, RuleNameSubsetReferencedInNestedSelectors extends string> { |
| 63 | + <Styles extends StyleRules>(cssObjectByRuleName: Styles): UseStyles<Params, Styles> |
| 64 | + <T extends GetCssObjectByRuleName<Params, RuleNameSubsetReferencedInNestedSelectors>>( |
| 65 | + getCssObjectByRuleName: T, |
| 66 | + ): UseStyles<Params, ReturnType<T>> |
| 67 | +} |
| 68 | + |
| 69 | +// Note: type refinement, see https://github.com/garronej/tss-react/issues/128 |
| 70 | +export function makeStyles<Params = void, RuleNameSubsetReferencedInNestedSelectors extends string = never>( |
| 71 | + params?: MakeStylesOptions, |
| 72 | +): MakeStylesHook<Params, RuleNameSubsetReferencedInNestedSelectors> { |
| 73 | + return baseMakeStyles(params) as unknown as MakeStylesHook<Params, RuleNameSubsetReferencedInNestedSelectors> |
31 | 74 | } |
0 commit comments