| 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 |