222 lines
9.5 KiB
TypeScript
222 lines
9.5 KiB
TypeScript
// uno.config.ts
|
||
import { defineConfig, presetMini, presetWind3, transformerDirectives, transformerVariantGroup } from 'unocss';
|
||
import { presetExtra } from 'unocss-preset-extra';
|
||
|
||
// ==================== 语义化文字颜色 / Semantic Text Colors ====================
|
||
// 用途:正文、标题等文字内容(推荐用于文本)
|
||
// Usage: Body text, headings, etc. (Recommended for text)
|
||
const textColors = {
|
||
// 自定义语义化文字色 / Custom semantic text colors
|
||
't-primary': 'var(--text-primary)', // text-t-primary - 主要文字
|
||
't-secondary': 'var(--text-secondary)', // text-t-secondary - 次要文字
|
||
't-tertiary': 'var(--bg-6)', // text-t-tertiary - 三级说明/提示文字
|
||
't-disabled': 'var(--text-disabled)', // text-t-disabled - 禁用文字
|
||
};
|
||
|
||
// ==================== 语义状态色 / Semantic State Colors ====================
|
||
// 用途:状态提示、按钮、标签等
|
||
// Usage: Status indicators, buttons, tags, etc.
|
||
const semanticColors = {
|
||
primary: 'var(--primary)', // bg-primary, text-primary, border-primary
|
||
success: 'var(--success)', // bg-success, text-success
|
||
warning: 'var(--warning)', // bg-warning, text-warning
|
||
danger: 'var(--danger)', // bg-danger, text-danger
|
||
info: 'var(--info)', // bg-info, text-info
|
||
};
|
||
|
||
// ==================== 背景色系统 / Background Color System ====================
|
||
// 用途:背景、容器等布局元素
|
||
// Usage: Backgrounds, containers, layout elements
|
||
// ⚠️ 数字键同时支持 bg-* 和 border-* (如: bg-1, border-1)
|
||
// Numeric keys support bg-* and border-* simultaneously
|
||
// 📝 text-1 到 text-4 通过自定义规则支持,指向 Arco 的 --color-text-*
|
||
// text-1 to text-4 are supported via custom rules, pointing to Arco's --color-text-*
|
||
const backgroundColors = {
|
||
base: 'var(--bg-base)', // bg-base, border-base - 主背景
|
||
1: 'var(--bg-1)', // bg-1, border-1 - 次级背景
|
||
2: 'var(--bg-2)', // bg-2, border-2 - 三级背景
|
||
3: 'var(--bg-3)', // bg-3, border-3 - 边框/分隔
|
||
4: 'var(--bg-4)', // bg-4, border-4
|
||
5: 'var(--bg-5)', // bg-5, border-5
|
||
6: 'var(--bg-6)', // bg-6, border-6
|
||
8: 'var(--bg-8)', // bg-8, border-8
|
||
9: 'var(--bg-9)', // bg-9, border-9
|
||
10: 'var(--bg-10)', // bg-10, border-10
|
||
hover: 'var(--bg-hover)', // bg-hover - 悬停背景
|
||
active: 'var(--bg-active)', // bg-active - 激活背景
|
||
};
|
||
|
||
// ==================== 边框颜色 / Border Colors ====================
|
||
const borderColors = {
|
||
'b-base': 'var(--border-base)', // border-b-base - 基础边框
|
||
'b-light': 'var(--border-light)', // border-b-light - 浅色边框
|
||
'b-1': 'var(--bg-3)', // border-b-1 - 基于 bg-3
|
||
'b-2': 'var(--bg-4)', // border-b-2 - 基于 bg-4
|
||
'b-3': 'var(--bg-5)', // border-b-3 - 基于 bg-5
|
||
};
|
||
|
||
// ==================== 品牌色 / Brand Colors ====================
|
||
const brandColors = {
|
||
brand: 'var(--brand)',
|
||
'brand-light': 'var(--brand-light)',
|
||
'brand-hover': 'var(--brand-hover)',
|
||
};
|
||
|
||
// ==================== AOU 品牌色系 / AOU Brand Colors ====================
|
||
const aouColors = {
|
||
aou: {
|
||
1: 'var(--aou-1)',
|
||
2: 'var(--aou-2)',
|
||
3: 'var(--aou-3)',
|
||
4: 'var(--aou-4)',
|
||
5: 'var(--aou-5)',
|
||
6: 'var(--aou-6)',
|
||
7: 'var(--aou-7)',
|
||
8: 'var(--aou-8)',
|
||
9: 'var(--aou-9)',
|
||
10: 'var(--aou-10)',
|
||
},
|
||
};
|
||
|
||
// ==================== UI 组件专用颜色 / UI Component Specific Colors ====================
|
||
const componentColors = {
|
||
'message-user': 'var(--message-user-bg)',
|
||
'message-tips': 'var(--message-tips-bg)',
|
||
'workspace-btn': 'var(--workspace-btn-bg)',
|
||
};
|
||
|
||
// ==================== 特殊颜色 / Special Colors ====================
|
||
const specialColors = {
|
||
fill: 'var(--fill)',
|
||
inverse: 'var(--inverse)',
|
||
};
|
||
|
||
export default defineConfig({
|
||
presets: [presetMini(), presetExtra(), presetWind3()],
|
||
transformers: [transformerVariantGroup(), transformerDirectives({ enforce: 'pre' })],
|
||
content: {
|
||
pipeline: {
|
||
// Use RegExp instead of glob strings so patterns match against absolute
|
||
// module IDs regardless of the Vite root directory. electron-vite sets
|
||
// the renderer root to packages/desktop/src/renderer/, which causes glob patterns like
|
||
// 'packages/desktop/src/**/*.tsx' to resolve to the wrong nested path.
|
||
include: [/\.[jt]sx?($|\?)/, /\.vue($|\?)/, /\.css($|\?)/],
|
||
exclude: [/[\\/]node_modules[\\/]/, /\.html($|\?)/],
|
||
},
|
||
},
|
||
// 自定义规则 / Custom rules
|
||
rules: [
|
||
// Arco Design 官方文字颜色 text-1 到 text-4
|
||
// Arco Design official text colors: text-1, text-2, text-3, text-4
|
||
[/^text-([1-4])$/, ([, d]: RegExpExecArray) => ({ color: `var(--color-text-${d})` })],
|
||
|
||
// Arco Design 官方填充色 fill-1 到 fill-4
|
||
// Arco Design official fill colors: bg-fill-1, bg-fill-2, bg-fill-3, bg-fill-4
|
||
[/^bg-fill-([1-4])$/, ([, d]: RegExpExecArray) => ({ 'background-color': `var(--color-fill-${d})` })],
|
||
|
||
// Arco Design 官方边框色 border-1 到 border-4 (使用 border-arco-* 避免和项目自定义冲突)
|
||
// Arco Design official border colors: border-arco-1, border-arco-2, border-arco-3, border-arco-4
|
||
[/^border-arco-([1-4])$/, ([, d]: RegExpExecArray) => ({ 'border-color': `var(--color-border-${d})` })],
|
||
|
||
// Arco Design 官方浅色系 primary/success/warning/danger/link-light-1 到 -light-4
|
||
// Arco Design light variants: bg-primary-light-1, bg-success-light-1, etc.
|
||
[
|
||
/^bg-(primary|success|warning|danger|link)-light-([1-4])$/,
|
||
([, color, d]: RegExpExecArray) => ({ 'background-color': `var(--color-${color}-light-${d})` }),
|
||
],
|
||
|
||
// Arco Design 官方色阶 primary/success/warning/danger 1-9
|
||
// Arco Design color levels: bg-primary-1, text-primary-1, border-primary-1, etc.
|
||
[
|
||
/^(bg|text|border)-(primary|success|warning|danger)-([1-9])$/,
|
||
([, prefix, color, d]: RegExpExecArray) => {
|
||
const prop = prefix === 'bg' ? 'background-color' : prefix === 'text' ? 'color' : 'border-color';
|
||
return { [prop]: `rgb(var(--${color}-${d}))` };
|
||
},
|
||
],
|
||
|
||
// Arco Design 官方白色和黑色
|
||
// Arco Design white and black: bg-color-white, text-color-white, bg-color-black, text-color-black
|
||
['bg-color-white', { 'background-color': 'var(--color-white)' }],
|
||
['text-color-white', { color: 'var(--color-white)' }],
|
||
['bg-color-black', { 'background-color': 'var(--color-black)' }],
|
||
['text-color-black', { color: 'var(--color-black)' }],
|
||
|
||
// Arco Design 对话框/弹出层专用背景色
|
||
// Arco Design popup/dialog background color: bg-popup
|
||
['bg-popup', { 'background-color': 'var(--color-bg-popup)' }],
|
||
|
||
// 项目自定义颜色 / Project custom colors
|
||
['bg-dialog-fill-0', { 'background-color': 'var(--dialog-fill-0)' }],
|
||
['text-0', { color: 'var(--text-0)' }],
|
||
['text-white', { color: 'var(--text-white)' }],
|
||
['bg-fill-0', { 'background-color': 'var(--fill-0)' }],
|
||
['bg-fill-white-to-black', { 'background-color': 'var(--fill-white-to-black)' }],
|
||
['border-special', { 'border-color': 'var(--border-special)' }],
|
||
|
||
// Wiggle animation for attention indicators (e.g. pending permission badge)
|
||
// Shakes briefly then pauses — 3s cycle, active in first ~20%
|
||
['animate-wiggle', { animation: 'wiggle 3s ease-in-out infinite' }],
|
||
],
|
||
// Preflights - Global base styles 全局基础样式
|
||
preflights: [
|
||
{
|
||
getCSS: () => `
|
||
* {
|
||
/* Set default text color to follow theme 所有元素默认使用主题文字颜色 */
|
||
color: inherit;
|
||
}
|
||
/*
|
||
* 边框基线(对齐 Tailwind Preflight):所有元素默认 border-width:0 + border-style:solid
|
||
* + border-color:transparent。
|
||
*
|
||
* 两个问题一起治:
|
||
* 1) 幽灵框:UnoCSS 的 \`border-solid\` 把四边都设 solid,而单边工具类(border-l/border-b…)
|
||
* 只设自己那条边的宽度,其余三边回退到 CSS 初始 medium(≈1.5px) 并因 solid 显形,画出整框。
|
||
* 宽度基线归零后,单边类只画它自己那条线。
|
||
* 2) 黑边:很多元素只写了 \`border\`/\`border-b\` 却没写颜色类(或写了无效的颜色类),其
|
||
* border-color 回退到 CSS 初始值 \`currentColor\`(=文字色=深)。以前 border-style 初始为
|
||
* none 不显形;一旦全局设 solid 就全变黑线。把颜色基线设为 transparent:没显式指定颜色的
|
||
* 边框保持不可见(与改动前一致),显式 border-base 等仍正常显示。
|
||
*/
|
||
*,
|
||
::before,
|
||
::after {
|
||
border-width: 0;
|
||
border-style: solid;
|
||
border-color: transparent;
|
||
}
|
||
@keyframes wiggle {
|
||
0%, 20%, 100% { transform: rotate(0deg); }
|
||
4% { transform: rotate(8deg); }
|
||
8% { transform: rotate(-8deg); }
|
||
12% { transform: rotate(6deg); }
|
||
16% { transform: rotate(-4deg); }
|
||
}
|
||
`,
|
||
},
|
||
],
|
||
// 基础配置
|
||
shortcuts: {
|
||
'flex-center': 'flex items-center justify-center',
|
||
},
|
||
theme: {
|
||
colors: {
|
||
// 合并所有颜色配置 Merge all color configurations
|
||
...textColors,
|
||
...semanticColors,
|
||
...backgroundColors,
|
||
...borderColors,
|
||
...brandColors,
|
||
...aouColors,
|
||
...componentColors,
|
||
...specialColors,
|
||
},
|
||
fontFamily: {
|
||
// Unified monospace stack for all code views (source, code blocks, editors)
|
||
// 所有代码视图(原文、代码块、编辑器)统一的等宽字体栈
|
||
mono: 'ui-monospace, "SF Mono", SFMono-Regular, Menlo, "Cascadia Code", "Roboto Mono", Consolas, "Liberation Mono", monospace',
|
||
},
|
||
},
|
||
});
|