ant-design/components/config-provider/context.ts

313 lines
11 KiB
TypeScript
Raw Normal View History

import * as React from 'react';
import type { WarningContextProps } from '../_util/warning';
import type { ShowWaveEffect } from '../_util/wave/interface';
import type { AlertProps } from '../alert';
import type { BadgeProps } from '../badge';
import type { ButtonProps } from '../button';
import type { CardProps } from '../card';
import type { CollapseProps } from '../collapse';
import type { DrawerProps } from '../drawer';
import type { FlexProps } from '../flex/interface';
import type { FloatButtonGroupProps } from '../float-button/interface';
2024-01-26 13:53:52 +08:00
import type { FormProps } from '../form/Form';
import type { InputProps, TextAreaProps } from '../input';
import type { ListItemProps } from '../list';
import type { Locale } from '../locale';
import type { MenuProps } from '../menu';
import type { ModalProps } from '../modal';
import type { ArgsProps } from '../notification/interface';
2024-01-26 13:53:52 +08:00
import type { PaginationProps } from '../pagination';
import type { SelectProps } from '../select';
import type { SpaceProps } from '../space';
import type { TableProps } from '../table';
import type { TabsProps } from '../tabs';
import type { TagProps } from '../tag';
import type { AliasToken, MappingAlgorithm, OverrideToken } from '../theme/interface';
import type { TourProps } from '../tour/interface';
import type { TransferProps } from '../transfer';
import type { InputNumberProps } from '../input-number';
import type { TreeSelectProps } from '../tree-select';
import type { DatePickerProps, RangePickerProps } from '../date-picker';
import type { TimePickerProps } from '../time-picker';
import type { CascaderProps } from '../cascader';
import type { MentionsProps } from '../mentions';
import type { RenderEmptyHandler } from './defaultRenderEmpty';
export const defaultIconPrefixCls = 'anticon';
2021-09-01 10:56:50 +08:00
export interface Theme {
primaryColor?: string;
infoColor?: string;
successColor?: string;
processingColor?: string;
errorColor?: string;
warningColor?: string;
}
export interface CSPConfig {
nonce?: string;
}
export type DirectionType = 'ltr' | 'rtl' | undefined;
type ComponentsConfig = {
[key in keyof OverrideToken]?: OverrideToken[key] & {
algorithm?: boolean | MappingAlgorithm | MappingAlgorithm[];
};
};
export interface ThemeConfig {
2024-03-26 23:01:04 +08:00
/**
* @descCN Design Token
* @descEN Modify Design Token.
*/
token?: Partial<AliasToken>;
2024-03-26 23:01:04 +08:00
/**
* @descCN Component Token Alias Token
* @descEN Modify Component Token and Alias Token applied to components.
*/
components?: ComponentsConfig;
2024-03-26 23:01:04 +08:00
/**
* @descCN Seed Token Map Token
* @descEN Modify the algorithms of theme.
* @default defaultAlgorithm
*/
algorithm?: MappingAlgorithm | MappingAlgorithm[];
2024-03-26 23:01:04 +08:00
/**
* @descCN `ConfigProvider`
* @descEN Whether to inherit the theme configured in the outer layer `ConfigProvider`.
* @default true
*/
inherit?: boolean;
/**
2024-03-26 23:01:04 +08:00
* @descCN `hashed` antd `false`
* @descEN Whether to enable the `hashed` attribute. If there is only one version of antd in your application, you can set `false` to reduce the bundle size.
* @default true
2024-04-24 22:32:50 +08:00
* @since 5.0.0
*/
hashed?: boolean;
/**
2024-03-26 23:01:04 +08:00
* @descCN `cssVar` CSS
* @descEN Enable CSS variable mode through `cssVar` configuration, This configuration will be inherited.
* @default false
* @since 5.12.0
*/
cssVar?:
| {
/**
2024-03-26 23:01:04 +08:00
* @descCN css
* @descEN Prefix for css variable.
* @default ant
*/
prefix?: string;
/**
2024-03-26 23:01:04 +08:00
* @descCN key react@18
* @descEN Unique key for theme, should be set manually < react@18.
*/
key?: string;
}
| boolean;
}
export interface ComponentStyleConfig {
className?: string;
style?: React.CSSProperties;
}
export interface TableConfig extends ComponentStyleConfig {
expandable?: {
expandIcon?: NonNullable<TableProps['expandable']>['expandIcon'];
};
}
export interface ImageConfig extends ComponentStyleConfig {
preview?: Partial<Record<'closeIcon', React.ReactNode>>;
}
export type CollapseConfig = ComponentStyleConfig & Pick<CollapseProps, 'expandIcon'>;
export type MenuConfig = ComponentStyleConfig & Pick<MenuProps, 'expandIcon'>;
export type TourConfig = Pick<TourProps, 'closeIcon'>;
export type ModalConfig = ComponentStyleConfig &
Pick<ModalProps, 'classNames' | 'styles' | 'closeIcon' | 'closable'>;
export type TabsConfig = ComponentStyleConfig &
Pick<TabsProps, 'indicator' | 'indicatorSize' | 'more' | 'moreIcon' | 'addIcon' | 'removeIcon'>;
export type AlertConfig = ComponentStyleConfig & Pick<AlertProps, 'closable' | 'closeIcon'>;
2024-01-26 13:53:52 +08:00
export type BadgeConfig = ComponentStyleConfig & Pick<BadgeProps, 'classNames' | 'styles'>;
export type InputConfig = ComponentStyleConfig &
Pick<InputProps, 'autoComplete' | 'classNames' | 'styles' | 'allowClear' | 'variant'>;
export type TextAreaConfig = ComponentStyleConfig &
Pick<TextAreaProps, 'autoComplete' | 'classNames' | 'styles' | 'allowClear' | 'variant'>;
export type ButtonConfig = ComponentStyleConfig &
Pick<ButtonProps, 'classNames' | 'styles' | 'autoInsertSpace'>;
export type NotificationConfig = ComponentStyleConfig & Pick<ArgsProps, 'closeIcon'>;
export type TagConfig = ComponentStyleConfig & Pick<TagProps, 'closeIcon' | 'closable'>;
export type CardConfig = ComponentStyleConfig & Pick<CardProps, 'classNames' | 'styles'>;
export type DrawerConfig = ComponentStyleConfig &
Pick<DrawerProps, 'classNames' | 'styles' | 'closeIcon' | 'closable'>;
2024-01-26 13:53:52 +08:00
export type FlexConfig = ComponentStyleConfig & Pick<FlexProps, 'vertical'>;
export type TransferConfig = ComponentStyleConfig & Pick<TransferProps, 'selectionsIcon'>;
export type FormConfig = ComponentStyleConfig &
Pick<FormProps, 'requiredMark' | 'colon' | 'scrollToFirstError' | 'validateMessages' | 'variant'>;
export type FloatButtonGroupConfig = Pick<FloatButtonGroupProps, 'closeIcon'>;
export type PaginationConfig = ComponentStyleConfig & Pick<PaginationProps, 'showSizeChanger'>;
export type SelectConfig = ComponentStyleConfig & Pick<SelectProps, 'showSearch' | 'variant'>;
2024-02-28 13:29:43 +08:00
export type SpaceConfig = ComponentStyleConfig & Pick<SpaceProps, 'size' | 'classNames' | 'styles'>;
export type InputNumberConfig = ComponentStyleConfig & Pick<InputNumberProps, 'variant'>;
export type CascaderConfig = ComponentStyleConfig & Pick<CascaderProps, 'variant'>;
export type TreeSelectConfig = ComponentStyleConfig & Pick<TreeSelectProps, 'variant'>;
export type DatePickerConfig = ComponentStyleConfig & Pick<DatePickerProps, 'variant'>;
export type RangePickerConfig = ComponentStyleConfig & Pick<RangePickerProps, 'variant'>;
export type TimePickerConfig = ComponentStyleConfig & Pick<TimePickerProps, 'variant'>;
export type MentionsConfig = ComponentStyleConfig & Pick<MentionsProps, 'variant'>;
export type PopupOverflow = 'viewport' | 'scroll';
export interface ListConfig extends ComponentStyleConfig {
item?: Pick<ListItemProps, 'classNames' | 'styles'>;
}
export const Variants = ['outlined', 'borderless', 'filled'] as const;
export type Variant = (typeof Variants)[number];
export interface WaveConfig {
2024-03-26 23:01:04 +08:00
/**
* @descCN `false`
* @descEN Whether to use wave effect. If it needs to close, set to `false`.
* @default true
*/
disabled?: boolean;
2024-03-26 23:01:04 +08:00
/**
* @descCN
* @descEN Customized wave effect.
*/
showEffect?: ShowWaveEffect;
}
export interface ConfigConsumerProps {
getTargetContainer?: () => HTMLElement;
getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement;
rootPrefixCls?: string;
2022-02-27 22:17:17 +08:00
iconPrefixCls: string;
getPrefixCls: (suffixCls?: string, customizePrefixCls?: string) => string;
renderEmpty?: RenderEmptyHandler;
2024-03-26 23:01:04 +08:00
/**
* @descCN [Content Security Policy](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP) 配置。
* @descEN Set the [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) config.
*/
csp?: CSPConfig;
/** @deprecated Please use `{ button: { autoInsertSpace: boolean }}` instead */
autoInsertSpaceInButton?: boolean;
variant?: Variant;
input?: InputConfig;
textArea?: TextAreaConfig;
inputNumber?: InputNumberConfig;
pagination?: PaginationConfig;
locale?: Locale;
direction?: DirectionType;
space?: SpaceConfig;
virtual?: boolean;
popupMatchSelectWidth?: boolean;
popupOverflow?: PopupOverflow;
form?: FormConfig;
theme?: ThemeConfig;
select?: SelectConfig;
alert?: AlertConfig;
anchor?: ComponentStyleConfig;
button?: ButtonConfig;
divider?: ComponentStyleConfig;
drawer?: DrawerConfig;
calendar?: ComponentStyleConfig;
carousel?: ComponentStyleConfig;
cascader?: CascaderConfig;
treeSelect?: TreeSelectConfig;
collapse?: CollapseConfig;
floatButtonGroup?: FloatButtonGroupConfig;
typography?: ComponentStyleConfig;
skeleton?: ComponentStyleConfig;
spin?: ComponentStyleConfig;
segmented?: ComponentStyleConfig;
steps?: ComponentStyleConfig;
statistic?: ComponentStyleConfig;
image?: ImageConfig;
layout?: ComponentStyleConfig;
list?: ListConfig;
mentions?: MentionsConfig;
modal?: ModalConfig;
progress?: ComponentStyleConfig;
result?: ComponentStyleConfig;
slider?: ComponentStyleConfig;
breadcrumb?: ComponentStyleConfig;
menu?: MenuConfig;
checkbox?: ComponentStyleConfig;
descriptions?: ComponentStyleConfig;
empty?: ComponentStyleConfig;
badge?: BadgeConfig;
radio?: ComponentStyleConfig;
rate?: ComponentStyleConfig;
switch?: ComponentStyleConfig;
transfer?: TransferConfig;
avatar?: ComponentStyleConfig;
message?: ComponentStyleConfig;
tag?: TagConfig;
table?: TableConfig;
card?: CardConfig;
tabs?: TabsConfig;
timeline?: ComponentStyleConfig;
timePicker?: TimePickerConfig;
tour?: TourConfig;
upload?: ComponentStyleConfig;
notification?: NotificationConfig;
tree?: ComponentStyleConfig;
colorPicker?: ComponentStyleConfig;
datePicker?: DatePickerConfig;
rangePicker?: RangePickerConfig;
dropdown?: ComponentStyleConfig;
flex?: FlexConfig;
wave?: WaveConfig;
warning?: WarningContextProps;
}
const defaultGetPrefixCls = (suffixCls?: string, customizePrefixCls?: string) => {
if (customizePrefixCls) {
return customizePrefixCls;
}
return suffixCls ? `ant-${suffixCls}` : 'ant';
};
2022-11-29 19:48:53 +08:00
// zombieJ: 🚨 Do not pass `defaultRenderEmpty` here since it will cause circular dependency.
2019-10-30 16:28:28 +08:00
export const ConfigContext = React.createContext<ConfigConsumerProps>({
// We provide a default function for Context without provider
getPrefixCls: defaultGetPrefixCls,
iconPrefixCls: defaultIconPrefixCls,
});
export const { Consumer: ConfigConsumer } = ConfigContext;