返回 slidev
unocss.ts
根目录 / packages / slidev / node / setups / unocss.ts
1 import type { ResolvedSlidevOptions, UnoSetup } from '@slidev/types'
2 import type { Theme } from '@unocss/preset-uno'
3 import type { VitePluginConfig } from 'unocss/vite'
4 import { existsSync } from 'node:fs'
5 import { readFile } from 'node:fs/promises'
6 import { resolve } from 'pathe'
7 import { mergeConfigs, presetIcons } from 'unocss'
8 import { loadSetups } from '../setups/load'
9 import { loadModule } from '../utils'
10
11 export default async function setupUnocss(
12 { clientRoot, roots, data, utils }: ResolvedSlidevOptions,
13 ) {
14 function loadFileConfigs(root: string) {
15 return [
16 resolve(root, 'uno.config.ts'),
17 resolve(root, 'unocss.config.ts'),
18 ].map(async (i) => {
19 if (!existsSync(i))
20 return undefined
21 const loaded = await loadModule(i) as VitePluginConfig | { default: VitePluginConfig }
22 return 'default' in loaded ? loaded.default : loaded
23 })
24 }
25
26 const configs = [
27 {
28 presets: [
29 presetIcons({
30 collectionsNodeResolvePath: utils.iconsResolvePath,
31 collections: {
32 slidev: {
33 logo: () => readFile(resolve(clientRoot, 'assets/logo.svg'), 'utf-8'),
34 },
35 },
36 }),
37 ],
38 safelist: await loadModule(resolve(clientRoot, '.generated/unocss-tokens.ts')),
39 } satisfies VitePluginConfig,
40 (await loadModule<{ default: VitePluginConfig }>(resolve(clientRoot, 'uno.config.ts'))).default,
41 ...await loadSetups<UnoSetup>(roots, 'unocss.ts', [], loadFileConfigs),
42 ].filter(Boolean) as VitePluginConfig<Theme>[]
43
44 const config = mergeConfigs(configs)
45
46 config.theme ||= {}
47 config.theme.fontFamily ||= {}
48 config.theme.fontFamily.sans ||= data.config.fonts.sans.join(',')
49 config.theme.fontFamily.mono ||= data.config.fonts.mono.join(',')
50 config.theme.fontFamily.serif ||= data.config.fonts.serif.join(',')
51
52 return config
53 }
54
54 lines TYPESCRIPT