Skip to content

Commit 266482d

Browse files
docs(customize-theme): update docs (#6540)
* fix introduce doc * fix getting-started doc * add migration-v4 doc * fix docs * Update migration-v4.zh-CN.md * Update migration-v4.zh-CN.md * Update migration-v4.en-US.md * Update migration-v4.zh-CN.md * Update getting-started.en-US.md * Update getting-started.zh-CN.md * Update introduce.en-US.md * Update introduce.zh-CN.md * update customize-theme doc & fix migration-v4 error * update customize-theme doc * fix migration-v4 error * remove SSR & shadowDom * Update customize-theme.zh-CN.md * Update customize-theme.en-US.md --------- Co-authored-by: tangjinzhou <[email protected]>
1 parent fd8af23 commit 266482d

12 files changed

+929
-582
lines changed

plugin/md/markdownToVue.ts

+23-8
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,7 @@ export function createMarkdownToVueRenderFn(
5858
};
5959
const newContent = data.vueCode
6060
? await genComponentCode(md, data, pageData)
61-
: `
62-
<template><article class="markdown">${html}</article></template>
63-
64-
<script>
65-
export default { pageData: ${JSON.stringify(pageData)} }
66-
</script>
67-
${fetchCode(content, 'style')}
68-
`;
61+
: await genDocCode(content, pageData);
6962

7063
debug(`[render] ${file} in ${Date.now() - start}ms.`);
7164
const result = {
@@ -137,6 +130,28 @@ ${jsSourceCode}
137130
return newContent;
138131
}
139132

133+
async function genDocCode(content: string, pageData: PageData) {
134+
return `
135+
<template><article class="markdown">${pageData.html}</article></template>
136+
137+
<script>
138+
import ColorChunk from '@/components/ColorChunk';
139+
import TokenTable from '@/components/TokenTable';
140+
import ComponentTokenTable from '@/components/ComponentTokenTable';
141+
142+
export default {
143+
components: {
144+
ColorChunk,
145+
TokenTable,
146+
ComponentTokenTable
147+
},
148+
pageData: ${JSON.stringify(pageData)}
149+
}
150+
</script>
151+
${fetchCode(content, 'style')}
152+
`;
153+
}
154+
140155
const inferTitle = (frontmatter: any, content: string) => {
141156
if (frontmatter.home) {
142157
return 'Home';
+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { defineComponent, toRefs, computed } from 'vue';
2+
import type { CSSProperties, PropType } from 'vue';
3+
import { TinyColor, type ColorInput } from '@ctrl/tinycolor';
4+
import useSiteToken from '../../hooks/useSiteToken';
5+
6+
const ColorChunk = defineComponent({
7+
props: {
8+
color: {
9+
type: String as PropType<ColorInput>,
10+
default: '#000',
11+
},
12+
},
13+
setup(props, { attrs, slots }) {
14+
const SiteToken = useSiteToken();
15+
16+
const token = computed(() => SiteToken.value.token);
17+
18+
const { color } = toRefs(props);
19+
20+
const dotColor = computed(() => {
21+
const _color = new TinyColor(color.value).toHex8String();
22+
return _color.endsWith('ff') ? _color.slice(0, -2) : _color;
23+
});
24+
25+
return () => {
26+
return (
27+
<span
28+
{...attrs}
29+
style={{
30+
padding: '0.2em 0.4em',
31+
fontSize: '0.9em',
32+
background: token.value.siteMarkdownCodeBg,
33+
borderRadius: `${token.value.borderRadius}px`,
34+
fontFamily: 'monospace',
35+
...(attrs.style as CSSProperties),
36+
}}
37+
>
38+
<span
39+
style={{
40+
display: 'inline-block',
41+
width: '6px',
42+
height: '6px',
43+
borderRadius: `${token.value.borderRadiusSM}px`,
44+
marginRight: '4px',
45+
border: `1px solid ${token.value.colorSplit}`,
46+
backgroundColor: dotColor.value,
47+
}}
48+
/>
49+
{slots.default ? slots.default() : dotColor.value}
50+
</span>
51+
);
52+
};
53+
},
54+
});
55+
56+
export default ColorChunk;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
import { defineComponent, toRefs, computed } from 'vue';
2+
import type { PropType } from 'vue';
3+
import { ConfigProvider, Table } from 'ant-design-vue';
4+
import { getDesignToken } from '../antdv-token-previewer';
5+
import tokenMeta from 'ant-design-vue/es/version/token-meta.json';
6+
import tokenData from 'ant-design-vue/es/version/token.json';
7+
import { useLocale } from '../../i18n';
8+
import useSiteToken from '../../hooks/useSiteToken';
9+
import { useColumns } from '../TokenTable';
10+
import ColorChunk from '../ColorChunk';
11+
12+
const defaultToken = getDesignToken();
13+
14+
const locales = {
15+
cn: {
16+
token: 'Token 名称',
17+
description: '描述',
18+
type: '类型',
19+
value: '默认值',
20+
},
21+
en: {
22+
token: 'Token Name',
23+
description: 'Description',
24+
type: 'Type',
25+
value: 'Default Value',
26+
},
27+
};
28+
29+
interface SubTokenTableProps {
30+
defaultOpen?: boolean;
31+
title: string;
32+
tokens: string[];
33+
}
34+
35+
const SubTokenTable = defineComponent({
36+
props: {
37+
defaultOpen: {
38+
type: Boolean as PropType<SubTokenTableProps['defaultOpen']>,
39+
},
40+
title: {
41+
type: String as PropType<SubTokenTableProps['title']>,
42+
},
43+
tokens: {
44+
type: Array as PropType<SubTokenTableProps['tokens']>,
45+
},
46+
},
47+
setup(props) {
48+
const { defaultOpen, title, tokens } = toRefs(props);
49+
const [, lang] = useLocale(locales);
50+
const siteToken = useSiteToken();
51+
const token = computed(() => siteToken.value.token);
52+
const columns = useColumns();
53+
54+
return () => {
55+
if (!tokens.value.length) {
56+
return null;
57+
}
58+
59+
const data = tokens.value
60+
.sort((token1, token2) => {
61+
const hasColor1 = token1.toLowerCase().includes('color');
62+
const hasColor2 = token2.toLowerCase().includes('color');
63+
64+
if (hasColor1 && !hasColor2) {
65+
return -1;
66+
}
67+
68+
if (!hasColor1 && hasColor2) {
69+
return 1;
70+
}
71+
72+
return token1 < token2 ? -1 : 1;
73+
})
74+
.map(name => {
75+
const meta = tokenMeta[name];
76+
77+
if (!meta) {
78+
return null;
79+
}
80+
81+
return {
82+
name,
83+
desc: lang.value === 'cn' ? meta.desc : meta.descEn,
84+
type: meta.type,
85+
value: (defaultToken as any)[name],
86+
};
87+
})
88+
.filter(info => info);
89+
90+
return (
91+
// Reuse `.markdown` style
92+
<details class="markdown" open={defaultOpen.value || process.env.NODE_ENV !== 'production'}>
93+
<summary>
94+
<h3 style={{ display: 'inline' }}>{title.value}</h3>
95+
</summary>
96+
<ConfigProvider
97+
theme={{
98+
token: {
99+
borderRadius: 0,
100+
},
101+
}}
102+
>
103+
<Table
104+
size="middle"
105+
columns={columns}
106+
bordered
107+
dataSource={data}
108+
style={{ marginBottom: token.value.margin }}
109+
pagination={false}
110+
rowKey={record => record.name}
111+
v-slots={{
112+
bodyCell: ({ text, record, column }) => {
113+
if (column.key === 'type') {
114+
return (
115+
<span
116+
style={{
117+
margin: '0 1px',
118+
padding: '0.2em 0.4em',
119+
fontSize: '0.9em',
120+
background: `${token.value.siteMarkdownCodeBg}`,
121+
border: `1px solid ${token.value.colorSplit}`,
122+
borderRadius: '3px',
123+
fontFamily: 'monospace',
124+
}}
125+
>
126+
{record.type}
127+
</span>
128+
);
129+
}
130+
if (column.key === 'value') {
131+
const isColor =
132+
typeof record.value === 'string' &&
133+
(record.value.startsWith('#') || record.value.startsWith('rgb'));
134+
if (isColor) {
135+
return <ColorChunk color={record.value}>{record.value}</ColorChunk>;
136+
}
137+
return (
138+
<span>
139+
{typeof record.value !== 'string'
140+
? JSON.stringify(record.value)
141+
: record.value}
142+
</span>
143+
);
144+
}
145+
return <span>{text} </span>;
146+
},
147+
}}
148+
/>
149+
</ConfigProvider>
150+
</details>
151+
);
152+
};
153+
},
154+
});
155+
156+
export interface ComponentTokenTableProps {
157+
component: string;
158+
}
159+
160+
const ComponentTokenTable = defineComponent({
161+
props: {
162+
component: {
163+
type: String as PropType<ComponentTokenTableProps['component']>,
164+
},
165+
},
166+
setup(props) {
167+
const { component } = toRefs(props);
168+
169+
const mergedTokens = computed(() => {
170+
const globalTokenSet = new Set<string>();
171+
let componentTokens: Record<string, string> = {};
172+
173+
component.value.split(',').forEach(comp => {
174+
const { global: globalTokens = [], component: singleComponentTokens = [] } =
175+
tokenData[comp] || {};
176+
177+
globalTokens.forEach((token: string) => {
178+
globalTokenSet.add(token);
179+
});
180+
181+
componentTokens = {
182+
...componentTokens,
183+
...singleComponentTokens,
184+
};
185+
});
186+
187+
return {
188+
mergedGlobalTokens: Array.from(globalTokenSet),
189+
mergedComponentTokens: componentTokens,
190+
};
191+
});
192+
193+
return () => {
194+
return (
195+
<>
196+
{/* Component Token 先不展示 */}
197+
{/* <SubTokenTable title="Component Token" tokens={mergedComponentTokens} defaultOpen /> */}
198+
<SubTokenTable title="Global Token" tokens={mergedTokens.value.mergedGlobalTokens} />
199+
</>
200+
);
201+
};
202+
},
203+
});
204+
205+
export default ComponentTokenTable;

0 commit comments

Comments
 (0)