Skip to content

Commit db740c8

Browse files
authored
feat(cssvar): Migrate cssvar features of antd v5.13.2 version (#7220)
* feat(cssinjs): update cssinjs to v1.18.1 * feat(theme): update theme dir to V5.12.5 * feat(theme&configprovider): update cssvar to v5.12.5 * feat(site): add site cssvar example * feat(cssinjs): update cssinjs to v1.81.2 * feat(theme): update theme dir to V5.13.2 * fix: component ComponentToken export * fix: cssvar in the component being loaded multiple times. * feat(button): add cssvar to the Button component.
1 parent 7ce0f11 commit db740c8

File tree

113 files changed

+7512
-324
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+7512
-324
lines changed

components/_theme/context.ts

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import type { ShallowRef, InjectionKey, ExtractPropTypes, ComputedRef } from 'vue';
2+
import {
3+
defineComponent,
4+
inject,
5+
provide,
6+
shallowRef,
7+
unref,
8+
triggerRef,
9+
watch,
10+
computed,
11+
} from 'vue';
12+
import type { Theme } from '../_util/_cssinjs';
13+
import { createTheme } from '../_util/_cssinjs';
14+
15+
import { objectType, someType } from '../_util/type';
16+
import type { AliasToken, MapToken, OverrideToken, SeedToken } from './interface';
17+
import defaultDerivative from './themes/default';
18+
import defaultSeedToken from './themes/seed';
19+
20+
export const defaultTheme = createTheme(defaultDerivative);
21+
22+
// ================================ Context =================================
23+
// To ensure snapshot stable. We disable hashed in test env.
24+
const DesignTokenContextKey: InjectionKey<ShallowRef<Partial<DesignTokenProviderProps>>> =
25+
Symbol('DesignTokenContextKey');
26+
27+
export const globalDesignTokenApi = shallowRef<DesignTokenProviderProps>();
28+
29+
export const defaultConfig = {
30+
token: defaultSeedToken,
31+
override: { override: defaultSeedToken },
32+
hashed: true,
33+
};
34+
35+
export type ComponentsToken = {
36+
[key in keyof OverrideToken]?: OverrideToken[key] & {
37+
theme?: Theme<SeedToken, MapToken>;
38+
};
39+
};
40+
export const styleProviderProps = () => ({
41+
token: objectType<AliasToken>(),
42+
theme: objectType<Theme<SeedToken, MapToken>>(),
43+
components: objectType<ComponentsToken>(),
44+
/** Just merge `token` & `override` at top to save perf */
45+
override: objectType<{ override: Partial<AliasToken> } & ComponentsToken>(),
46+
hashed: someType<string | boolean>(),
47+
cssVar: someType<{
48+
prefix?: string;
49+
key?: string;
50+
}>(),
51+
});
52+
53+
export type StyleProviderProps = Partial<ExtractPropTypes<ReturnType<typeof styleProviderProps>>>;
54+
export interface DesignTokenProviderProps {
55+
token: Partial<AliasToken>;
56+
theme?: Theme<SeedToken, MapToken>;
57+
components?: ComponentsToken;
58+
/** Just merge `token` & `override` at top to save perf */
59+
override?: { override: Partial<AliasToken> } & ComponentsToken;
60+
hashed?: string | boolean;
61+
cssVar?: {
62+
prefix?: string;
63+
key?: string;
64+
};
65+
}
66+
67+
export const useDesignTokenInject = () => {
68+
return inject(
69+
DesignTokenContextKey,
70+
computed(() => globalDesignTokenApi.value || defaultConfig),
71+
);
72+
};
73+
74+
export const useDesignTokenProvider = (props: ComputedRef<DesignTokenProviderProps>) => {
75+
const parentContext = useDesignTokenInject();
76+
const context = shallowRef<Partial<DesignTokenProviderProps>>(defaultConfig);
77+
watch(
78+
computed(() => [props.value, parentContext.value]),
79+
([propsValue, parentContextValue]) => {
80+
const mergedContext: Partial<DesignTokenProviderProps> = {
81+
...parentContextValue,
82+
};
83+
Object.keys(propsValue).forEach(key => {
84+
const value = propsValue[key];
85+
if (propsValue[key] !== undefined) {
86+
mergedContext[key] = value;
87+
}
88+
});
89+
90+
context.value = mergedContext;
91+
globalDesignTokenApi.value = unref(mergedContext as any);
92+
triggerRef(globalDesignTokenApi);
93+
},
94+
{ immediate: true, deep: true },
95+
);
96+
provide(DesignTokenContextKey, context);
97+
return context;
98+
};
99+
100+
export const DesignTokenProvider = defineComponent({
101+
props: {
102+
value: objectType<DesignTokenProviderProps>(),
103+
},
104+
setup(props, { slots }) {
105+
useDesignTokenProvider(computed(() => props.value));
106+
return () => {
107+
return slots.default?.();
108+
};
109+
},
110+
});
111+
112+
export default { useDesignTokenInject, useDesignTokenProvider, DesignTokenProvider };

components/_theme/getDesignToken.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { createTheme, getComputedToken } from '../_util/_cssinjs';
2+
import type { ThemeConfig } from '../config-provider/context';
3+
import type { AliasToken } from './interface';
4+
import defaultDerivative from './themes/default';
5+
import seedToken from './themes/seed';
6+
import formatToken from './util/alias';
7+
8+
const getDesignToken = (config?: ThemeConfig): AliasToken => {
9+
const theme = config?.algorithm ? createTheme(config.algorithm) : createTheme(defaultDerivative);
10+
const mergedToken = {
11+
...seedToken,
12+
...config?.token,
13+
};
14+
return getComputedToken(mergedToken, { override: config?.token }, theme, formatToken);
15+
};
16+
17+
export default getDesignToken;

components/_theme/index.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* eslint-disable import/prefer-default-export */
2+
import getDesignToken from './getDesignToken';
3+
import type { GlobalToken, MappingAlgorithm } from './interface';
4+
import { defaultConfig, useToken as useInternalToken } from './internal';
5+
import compactAlgorithm from './themes/compact';
6+
import darkAlgorithm from './themes/dark';
7+
import defaultAlgorithm from './themes/default';
8+
9+
// ZombieJ: We export as object to user but array in internal.
10+
// This is used to minimize the bundle size for antd package but safe to refactor as object also.
11+
// Please do not export internal `useToken` directly to avoid something export unexpected.
12+
/** Get current context Design Token. Will be different if you are using nest theme config. */
13+
function useToken() {
14+
const [theme, token, hashId] = useInternalToken();
15+
16+
return { theme, token, hashId };
17+
}
18+
19+
export type { GlobalToken, MappingAlgorithm };
20+
21+
export default {
22+
/** @private Test Usage. Do not use in production. */
23+
defaultConfig,
24+
25+
/** Default seedToken */
26+
defaultSeed: defaultConfig.token,
27+
28+
useToken,
29+
defaultAlgorithm,
30+
darkAlgorithm,
31+
compactAlgorithm,
32+
getDesignToken,
33+
};

0 commit comments

Comments
 (0)