Files
basic/uno.config.ts
T
2026-04-01 03:38:00 +08:00

147 lines
3.9 KiB
TypeScript
Executable File

import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { darkTheme, lightTheme } from '@fantastic-admin/themes'
import { entriesToCss, toArray } from '@unocss/core'
import {
defineConfig,
presetAttributify,
presetIcons,
presetTypography,
presetWind4,
transformerCompileClass,
transformerDirectives,
transformerVariantGroup,
} from 'unocss'
import { presetAnimations } from 'unocss-preset-animations'
const projectRoot = path.dirname(fileURLToPath(import.meta.url))
export default defineConfig({
content: {
pipeline: {
include: [
/\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/,
'src/**/*.{js,ts}',
path.resolve(projectRoot, 'packages/components/**/*.{vue,js,ts}'),
],
},
},
shortcuts: [
[/^flex-?(col)?-(start|end|center|baseline|stretch)-?(start|end|center|between|around|evenly|left|right)?$/, ([, col, items, justify]) => {
const cls = ['flex']
if (col === 'col') {
cls.push('flex-col')
}
if (items === 'center' && !justify) {
cls.push('items-center')
cls.push('justify-center')
}
else {
cls.push(`items-${items}`)
if (justify) {
cls.push(`justify-${justify}`)
}
}
return cls.join(' ')
}],
],
presets: [
presetWind4(),
presetAnimations(),
presetAttributify(),
presetIcons({
collectionsNodeResolvePath: projectRoot,
extraProperties: {
'display': 'inline-block',
'vertical-align': 'middle',
},
}),
presetTypography(),
{
name: 'unocss-preset-shadcn',
preflights: [
{
getCSS: () => {
const returnCss = [
toArray(':root').map(root => `${root}{color-scheme:light;${entriesToCss(Object.entries(lightTheme))}}`).join(''),
toArray('.dark').map(root => `${root}{color-scheme:dark;${entriesToCss(Object.entries(darkTheme))}}`).join(''),
]
return `
${returnCss.join('\n')}
::selection {
color: oklch(var(--primary-foreground));
background-color: oklch(var(--primary));
}
* {
border-color: oklch(var(--border));
scrollbar-color: oklch(var(--border)) transparent;
scrollbar-width: thin;
}
body {
color: oklch(var(--foreground));
background: oklch(var(--background));
}
button:not(:disabled),
[role="button"]:not(:disabled) {
cursor: pointer;
}
`
},
},
],
theme: {
colors: {
background: 'oklch(var(--background))',
foreground: 'oklch(var(--foreground))',
card: {
DEFAULT: 'oklch(var(--card))',
foreground: 'oklch(var(--card-foreground))',
},
popover: {
DEFAULT: 'oklch(var(--popover))',
foreground: 'oklch(var(--popover-foreground))',
},
primary: {
DEFAULT: 'oklch(var(--primary))',
foreground: 'oklch(var(--primary-foreground))',
},
secondary: {
DEFAULT: 'oklch(var(--secondary))',
foreground: 'oklch(var(--secondary-foreground))',
},
muted: {
DEFAULT: 'oklch(var(--muted))',
foreground: 'oklch(var(--muted-foreground))',
},
accent: {
DEFAULT: 'oklch(var(--accent))',
foreground: 'oklch(var(--accent-foreground))',
},
destructive: 'oklch(var(--destructive))',
border: 'oklch(var(--border))',
input: 'oklch(var(--input))',
ring: 'oklch(var(--ring))',
},
radius: {
xl: 'calc(var(--radius) + 4px)',
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
},
},
],
transformers: [
transformerDirectives(),
transformerVariantGroup(),
transformerCompileClass(),
],
configDeps: [
path.resolve(projectRoot, 'packages/themes/index.ts'),
],
})