主题化系统
主题系统
相关源文件
本章引用的主要源码文件:
web/.prettierignoreweb/.prettierrcweb/package-lock.jsonweb/package.jsonweb/src/app.tsxweb/src/assets/svg/next-login-bg.svgweb/src/components/ui/badge.tsxweb/src/components/ui/button.tsxweb/src/components/ui/radio-group.tsxweb/src/components/ui/radio.tsxweb/src/components/ui/segmented.tsxweb/src/constants/common.tsweb/src/locales/config.tsweb/src/pages/datasets/dataset-card.tsxweb/src/pages/home/applications.tsxweb/src/pages/home/banner.tsxweb/src/pages/home/datasets.tsxweb/src/pages/home/index.tsxweb/src/pages/login-next/bg.tsxweb/src/pages/login-next/card.tsxweb/src/pages/login-next/index.lessweb/src/pages/login-next/index.tsxweb/tailwind.config.jsweb/tailwind.css
目的与范围
本文档描述了 RAGFlow 的前端主题系统,该系统通过 CSS 自定义属性(CSS 变量)与 Tailwind CSS 集成,提供深色/浅色模式支持。该系统通过语义化颜色令牌系统和基于 React 的主题管理,使整个应用能够实现一致、可主题化的用户界面。
该系统专为支持 RAG 操作所需的高密度数据视图而设计,例如可视化智能体画布、文档解析配置和多语言聊天界面。
架构总览
主题系统由三层组成:定义颜色值的 CSS 自定义属性、将这些属性映射到工具类的 Tailwind CSS 配置,以及管理主题状态的 React 上下文提供者。
系统流程图
主题生命周期的"自然语言空间"到"代码实体空间"映射。
来源: web/tailwind.css:5-135, web/tailwind.config.js:5-184, web/src/app.tsx:89-94, web/src/constants/common.ts:208-212
CSS 自定义属性系统
RAGFlow 将所有主题颜色定义为两个根级作用域中的 CSS 自定义属性::root 用于浅色模式,.dark 用于深色模式。该系统采用基于选择器的方法,将 dark 类添加到 document.documentElement 后,所有变量都会切换到深色模式值 web/tailwind.config.js:6-6。
变量作用域策略
主题系统在 web/tailwind.css:5-216 中定义变量:
:root {
/* 浅色模式变量 */
--background: 0 0% 100%;
--bg-base: #ffffff;
--text-primary: 22 22 24;
}
.dark {
/* 深色模式变量 */
--background: rgba(11, 10, 18, 1);
--bg-base: #ffffff;
--text-primary: 246 246 247;
}
变量根据用途使用不同的格式:
- RGB 元组(例如
22 22 24):用于需要通过rgb(var(--text-primary) / <alpha-value>)支持 Alpha 通道的颜色web/tailwind.config.js:81-83。 - 十六进制值(例如
#ffffff):用于纯色web/tailwind.css:94-94。 - HSL 元组(例如
0 0% 100%):用于标准 Radix UI 组件使用的基于 HSL 的颜色web/tailwind.css:7-34。 - RGBA 值(例如
rgba(230, 227, 246, 0.15)):用于具有固定不透明度的颜色web/tailwind.css:38-42。
来源: web/tailwind.css:5-135, web/tailwind.css:137-216, web/tailwind.config.js:75-114
语义化颜色令牌类别
系统将颜色组织成语义类别,以确保在 DatasetCard 和 Applications 列表等功能之间保持一致 web/src/pages/datasets/dataset-card.tsx:16-55。
| 类别 | 用途 | 示例变量 |
|---|---|---|
| 背景 | 表面颜色 | --bg-base, --bg-card, --bg-component, --bg-canvas, --bg-list |
| 文本 | 排版颜色 | --text-primary, --text-secondary, --text-disabled, --text-input-tip |
| 边框 | 边框和轮廓颜色 | --border-default, --border-accent, --border-button |
| 强调色 | 主要品牌颜色 | --accent-primary, --bg-accent |
| 状态 | 状态指示器 | --state-success, --state-warning, --state-error |
| 团队 | 角色颜色 | --team-group, --team-member, --team-department |
来源: web/tailwind.css:91-135, web/tailwind.config.js:70-121
Tailwind CSS 配置
Tailwind 配置通过引用 CSS 自定义属性的自定义颜色映射来扩展默认主题。
颜色映射结构
在 web/tailwind.config.js:29-184 中,颜色定义支持动态透明度:
- 直接变量引用:
background: 'var(--background)',
'text-disabled': 'var(--text-disabled)',
- 带 Alpha 支持的 RGB:
'text-primary': {
DEFAULT: 'rgb(var(--text-primary) / <alpha-value>)',
},
- 固定不透明度修饰符:
'accent-primary': {
DEFAULT: 'rgb(var(--accent-primary) / <alpha-value>)',
5: 'rgba(var(--accent-primary) / 0.05)',
},
来源: web/tailwind.config.js:33-184
扩展主题配置
该配置通过自定义屏幕断点扩展了 Tailwind 的默认主题,以支持应用的响应式布局和高分辨率智能体画布 web/src/app.tsx:26-34。
自定义屏幕断点包括 3xl: 1780px 和 4xl: 1980px,用于超宽显示器 web/tailwind.config.js:26-27。
来源: web/tailwind.config.js:20-32, web/src/app.tsx:26-34
主题提供者实现
ThemeProvider 在 web/src/app.tsx 的 RootProvider 中初始化。它默认使用 ThemeEnum.Dark,并将用户偏好持久化到 localStorage 中,键为 ragflow-ui-theme web/src/app.tsx:89-94。
与组件库的集成
RAGFlow 使用了多个必须遵循主题状态的 UI 库:
- Radix UI:用于
Accordion、Dialog和Select等基础组件。这些组件使用tailwind.css中定义的 HSL 变量web/package.json:41-66。 - Ant Design:使用了
@ant-design/icons等组件以及@antv/g2的图表web/package.json:32-34。 - Sonner:Toast 通知系统在
Root中配置,并遵循主题web/src/app.tsx:71-71。
来源: web/src/app.tsx:89-94, web/package.json:31-68
组件中的主题应用
组件通过使用 Tailwind 工具类来应用主题样式。对于像 Datasets 列表这样的复杂导航元素,主题确保激活状态和图标保持一致。
组件主题示例
在 web/src/pages/home/datasets.tsx:28-59 中,DatasetCard 和标题使用了语义类:
<h2 className="leading-8 text-2xl font-semibold mb-2.5">
<HomeIcon imgClass="me-2.5" name="datasets" width={24} />
{t('header.dataset')}
</h2>
文本颜色通常默认为 foreground,它映射到 var(--colors-text-neutral-strong) web/tailwind.config.js:38-38,该值根据根 HTML 类在浅色和深色值之间切换 web/tailwind.css:53-198。
按钮变体系统
使用 class-variance-authority(CVA)在 web/src/components/ui/button.tsx:9-120 中定义的 buttonVariants 展示了不同 UI 变体如何利用语义化令牌:
- default:使用
bg-text-primary和text-bg-baseweb/src/components/ui/button.tsx:21-21。 - secondary:使用
bg-bg-cardweb/src/components/ui/button.tsx:24-27。 - destructive:使用
bg-state-errorweb/src/components/ui/button.tsx:40-42。 - outline:使用
text-text-secondary、bg-bg-input和border-border-buttonweb/src/components/ui/button.tsx:47-50。
来源: web/src/components/ui/button.tsx:9-120, web/tailwind.config.js:81-83, web/tailwind.css:104-133
专用主题组件
某些组件如 Segmented 实现了特定的激活状态和过渡主题逻辑。
Segmented 组件为其容器使用 bg-bg-card,为激活项使用 bg-bg-base,确保在浅色和深色模式下都具有高对比度 web/src/pages/home/applications.tsx:76-83。
来源: web/src/pages/home/applications.tsx:76-83, web/src/components/ui/segmented.tsx:1-208
包依赖
主题系统依赖以下关键包 web/package.json:31-139:
tailwindcss@^3:核心工具优先的 CSS 框架web/package.json:187-187。next-themes@^0.4.6:主题管理的抽象层web/package.json:99-99。class-variance-authority@^0.7.1:用于创建可主题化组件变体的工具web/package.json:79-79。tailwind-merge@^2.6.1:用于解决 Tailwind 类冲突的工具web/package.json:129-129。lucide-react@^1.7.0:用于主题化导航和按钮的图标集web/package.json:97-97。
来源: web/package.json:79-187