You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.9 KiB
110 lines
3.9 KiB
/* eslint-disable no-redeclare */
|
|
|
|
import { useStyleRegister } from '../../_util/cssinjs';
|
|
import type { CSSInterpolation } from '../../_util/cssinjs';
|
|
import { genCommonStyle, genLinkStyle } from '../../_style';
|
|
import type { UseComponentStyleResult } from '../internal';
|
|
import { mergeToken, statisticToken, useToken } from '../internal';
|
|
import type { ComponentTokenMap, GlobalToken } from '../interface';
|
|
import useConfigInject from 'ant-design-vue/es/config-provider/hooks/useConfigInject';
|
|
import type { Ref } from 'vue';
|
|
import { computed } from 'vue';
|
|
|
|
export type OverrideTokenWithoutDerivative = ComponentTokenMap;
|
|
export type OverrideComponent = keyof OverrideTokenWithoutDerivative;
|
|
export type GlobalTokenWithComponent<ComponentName extends OverrideComponent> = GlobalToken &
|
|
ComponentTokenMap[ComponentName];
|
|
|
|
export interface StyleInfo<ComponentName extends OverrideComponent> {
|
|
hashId: string;
|
|
prefixCls: string;
|
|
rootPrefixCls: string;
|
|
iconPrefixCls: string;
|
|
overrideComponentToken: ComponentTokenMap[ComponentName];
|
|
}
|
|
|
|
export type TokenWithCommonCls<T> = T & {
|
|
/** Wrap component class with `.` prefix */
|
|
componentCls: string;
|
|
/** Origin prefix which do not have `.` prefix */
|
|
prefixCls: string;
|
|
/** Wrap icon class with `.` prefix */
|
|
iconCls: string;
|
|
/** Wrap ant prefixCls class with `.` prefix */
|
|
antCls: string;
|
|
};
|
|
export type FullToken<ComponentName extends OverrideComponent> = TokenWithCommonCls<
|
|
GlobalTokenWithComponent<ComponentName>
|
|
>;
|
|
|
|
export default function genComponentStyleHook<ComponentName extends OverrideComponent>(
|
|
component: ComponentName,
|
|
styleFn: (token: FullToken<ComponentName>, info: StyleInfo<ComponentName>) => CSSInterpolation,
|
|
getDefaultToken?:
|
|
| OverrideTokenWithoutDerivative[ComponentName]
|
|
| ((token: GlobalToken) => OverrideTokenWithoutDerivative[ComponentName]),
|
|
) {
|
|
return (prefixCls: Ref<string>): UseComponentStyleResult => {
|
|
const [theme, token, hashId] = useToken();
|
|
const { rootPrefixCls, iconPrefixCls } = useConfigInject('', {});
|
|
const sharedInfo = computed(() => {
|
|
return {
|
|
theme: theme.value,
|
|
token: token.value,
|
|
hashId: hashId.value,
|
|
path: ['Shared', rootPrefixCls.value],
|
|
};
|
|
});
|
|
// Generate style for all a tags in antd component.
|
|
useStyleRegister(sharedInfo, () => [
|
|
{
|
|
// Link
|
|
'&': genLinkStyle(token.value),
|
|
},
|
|
]);
|
|
const componentInfo = computed(() => {
|
|
return {
|
|
theme: theme.value,
|
|
token: token.value,
|
|
hashId: hashId.value,
|
|
path: [component, prefixCls.value, iconPrefixCls.value],
|
|
};
|
|
});
|
|
return [
|
|
useStyleRegister(componentInfo, () => {
|
|
const { token: proxyToken, flush } = statisticToken(token.value);
|
|
|
|
const defaultComponentToken =
|
|
typeof getDefaultToken === 'function'
|
|
? (getDefaultToken as any)(proxyToken)
|
|
: getDefaultToken;
|
|
const mergedComponentToken = { ...defaultComponentToken, ...token.value[component] };
|
|
|
|
const componentCls = `.${prefixCls.value}`;
|
|
const mergedToken = mergeToken<
|
|
TokenWithCommonCls<GlobalTokenWithComponent<OverrideComponent>>
|
|
>(
|
|
proxyToken,
|
|
{
|
|
componentCls,
|
|
prefixCls: prefixCls.value,
|
|
iconCls: `.${iconPrefixCls.value}`,
|
|
antCls: `.${rootPrefixCls.value}`,
|
|
},
|
|
mergedComponentToken,
|
|
);
|
|
const styleInterpolation = styleFn(mergedToken as unknown as FullToken<ComponentName>, {
|
|
hashId: hashId.value,
|
|
prefixCls: prefixCls.value,
|
|
rootPrefixCls: rootPrefixCls.value,
|
|
iconPrefixCls: iconPrefixCls.value,
|
|
overrideComponentToken: token.value[component],
|
|
});
|
|
flush(component, mergedComponentToken);
|
|
return [genCommonStyle(token.value, prefixCls.value), styleInterpolation];
|
|
}),
|
|
hashId,
|
|
];
|
|
};
|
|
}
|