kind: frontend_style name: 前端样式体系:Tailwind CSS + CSS 变量主题 + ECharts 图表主题 category: frontend_style scope: - '**' source_files: - frontend/tailwind.config.ts - frontend/postcss.config.js - frontend/src/index.css - frontend/public/theme-boot.js - frontend/src/hooks/useDarkMode.ts - frontend/src/lib/theme-store.ts - frontend/src/lib/chart-theme.ts - frontend/package.json


1. 采用的系统与方法

Vibe-Trading 的前端(frontend/)采用 Vite + React + TypeScript 工程,样式体系以 Tailwind CSS v3 为核心原子化框架,通过 PostCSS + Autoprefixer 构建。深色模式使用 Tailwind 的 darkMode: "class" 策略,由 <html> 上的 .dark 类控制。

2. 关键文件

文件 作用
frontend/tailwind.config.ts Tailwind 配置,定义 darkMode、colors/fontFamily/borderRadius 扩展及 typography 插件
frontend/postcss.config.js PostCSS 管线(tailwindcss → autoprefixer)
frontend/src/index.css 全局样式入口,声明全部 CSS 变量(light/dark)、base 层样式、滚动条、RTL 镜像、动画
frontend/public/theme-boot.js 首屏无闪烁脚本,在 HTML 加载时立即设置 documentElement.classList 为 dark/light,避免 FOUC
frontend/src/hooks/useDarkMode.ts React Hook,维护 qa-theme 本地存储、监听系统偏好变化、同步 .dark 类并广播主题变更
frontend/src/lib/theme-store.ts 单例主题 store,通过 useSyncExternalStore 暴露 isDarkTheme/subscribeTheme/publishThemeChange
frontend/src/lib/chart-theme.ts 将 CSS 变量读入 ECharts 主题对象,支持中英文 K 线涨跌色反转(中国红涨绿跌)
frontend/package.json 依赖声明(tailwindcss、autoprefixer、echarts、i18next、lucide-react、sonner、zustand 等)

3. 架构与设计约定

主题切换流程

  1. public/theme-boot.js 在 <head> 中执行,读取 localStorage["qa-theme"],若未保存则回退到 prefers-color-scheme,立即给 <html> 加上或移除 .dark 类并设置 colorScheme。
  2. React 启动后 useDarkMode hook 初始化状态,后续切换时写入 qa-theme、更新 DOM 类名,并调用 publishThemeChange() 通知订阅者。
  3. theme-store.ts 提供跨组件的主题订阅能力,ECharts、代码高亮等需要响应主题变化的第三方库通过 subscribeTheme 重新渲染。

颜色与语义层

图表主题

组件样式约定

4. 约定与约束