68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
|
import * as React from 'react';
|
||
|
import { DistributiveOmit } from '@mui/types';
|
||
|
import { StyledComponentProps } from './styles';
|
||
|
|
||
|
/**
|
||
|
* A component whose root component can be controlled via a `component` prop.
|
||
|
*
|
||
|
* Adjusts valid props based on the type of `component`.
|
||
|
*/
|
||
|
export interface OverridableComponent<TypeMap extends OverridableTypeMap> {
|
||
|
// If you make any changes to this interface, please make sure to update the
|
||
|
// `OverridableComponent` type in `mui-types/index.d.ts` as well.
|
||
|
// Also, there are types in Base UI that have a similar shape to this interface
|
||
|
// (for example SelectType, OptionType, etc.).
|
||
|
<RootComponent extends React.ElementType>(
|
||
|
props: {
|
||
|
/**
|
||
|
* The component used for the root node.
|
||
|
* Either a string to use a HTML element or a component.
|
||
|
*/
|
||
|
component: RootComponent;
|
||
|
} & OverrideProps<TypeMap, RootComponent>,
|
||
|
): JSX.Element | null;
|
||
|
(props: DefaultComponentProps<TypeMap>): JSX.Element | null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Props of the component if `component={Component}` is used.
|
||
|
*/
|
||
|
// prettier-ignore
|
||
|
export type OverrideProps<
|
||
|
TypeMap extends OverridableTypeMap,
|
||
|
RootComponent extends React.ElementType
|
||
|
> = (
|
||
|
& BaseProps<TypeMap>
|
||
|
& DistributiveOmit<React.ComponentPropsWithRef<RootComponent>, keyof BaseProps<TypeMap>>
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Props if `component={Component}` is NOT used.
|
||
|
*/
|
||
|
// prettier-ignore
|
||
|
export type DefaultComponentProps<TypeMap extends OverridableTypeMap> =
|
||
|
& BaseProps<TypeMap>
|
||
|
& DistributiveOmit<React.ComponentPropsWithRef<TypeMap['defaultComponent']>, keyof BaseProps<TypeMap>>;
|
||
|
|
||
|
/**
|
||
|
* Props defined on the component (+ common material-ui props).
|
||
|
*/
|
||
|
// prettier-ignore
|
||
|
export type BaseProps<TypeMap extends OverridableTypeMap> =
|
||
|
& TypeMap['props']
|
||
|
& CommonProps;
|
||
|
|
||
|
/**
|
||
|
* Props that are valid for material-ui components.
|
||
|
*/
|
||
|
// each component declares it's classes in a separate interface for proper JSDoc.
|
||
|
export interface CommonProps extends StyledComponentProps<never> {
|
||
|
className?: string;
|
||
|
style?: React.CSSProperties;
|
||
|
}
|
||
|
|
||
|
export interface OverridableTypeMap {
|
||
|
props: {};
|
||
|
defaultComponent: React.ElementType;
|
||
|
}
|