主题

深色、浅色与跟随系统主题,支持强调色与原生窗口同步。

模板有两组独立的外观控制:浅色/深色/跟随系统主题,以及强调色。两者都持久化在 主进程 settings store 中,并在渲染进程通过 CSS variables 应用,同时同步 Windows 标题栏 chrome。

出厂内容

界面文件作用
设置界面app/routes/settings/sections/AppearanceSection.tsx渲染 light/dark/system 按钮与强调色 swatches。
主题 helpersapp/utils/theme-settings.ts应用根节点 dark class、根节点 data-accent,并同步 titlebar IPC。
CSS variablesapp/styles/globals.css定义 Tailwind v4 tokens、shadcn/ui variables、dark mode 与 accent overrides。
窗口 CSSapp/styles/window.css定义标题栏、拖拽区域、窗口背景与滚动条颜色。
原生启动颜色lib/main/app.ts用浅/深背景色和 Windows titlebar colors 创建 BrowserWindow。
Settings schemalib/conveyor/schemas/app-schema.ts校验跨 IPC 的 themeaccentColor 值。

主题模式

theme 是以下值之一:

type ThemePreference = 'light' | 'dark' | 'system'

applyThemePreference() 通过 window.matchMedia('(prefers-color-scheme: dark)') 解析 system,切换根节点 dark class,并调用 window.conveyor.window.windowSetTitlebarDark(isDark)

在 Windows 上,window-set-titlebar-dark 会更新 BrowserWindow.setTitleBarOverlay,让标题栏背景与按钮颜色匹配渲染进程。 启动时,lib/main/app.ts 也会在渲染进程准备好之前通过 nativeTheme 解析已保存的 设置,避免首帧颜色不一致。

强调色

accentColor 是以下值之一:

type AccentPreference = 'default' | 'blue' | 'violet' | 'green' | 'rose' | 'amber'

default 会移除 data-accent,保留品牌主色。其他值会设置 document.documentElement.dataset.accent,从而激活 app/styles/globals.css 中的 选择器:

:root[data-accent='violet'] {
  --primary: hsl(262 83% 58%);
  --primary-foreground: hsl(0 0% 100%);
  --ring: hsl(262 83% 58%);
}

强调色层只覆盖 --primary--primary-foreground--ring,因此 --background--card--muted--destructive 等语义颜色在不同产品中保持 稳定。

Tailwind 与 shadcn/ui

项目使用 Tailwind v4 与 CSS variables:

@import 'tailwindcss';
@variant dark (&:where(.dark, .dark *));
@import 'tw-animate-css';

@theme 把应用变量映射到 Tailwind color tokens;shadcn/ui 组件则通过 bg-backgroundtext-foregroundborder-borderbg-primary 等 class 读取同一 套变量。

components.json 配置为 shadcn/ui new-york 风格、tsx: true、启用 CSS variables、neutral base color,并使用 lucide 图标库。按现有 aliases 添加组件:

pnpm dlx shadcn@latest add dialog dropdown-menu

生成的组件应放在 app/components/ui,变量继续来自 app/styles/globals.css

自定义调色板

品牌改造时:

  1. 修改 :root.dark 中的默认品牌主色。
  2. --ring 更新为同一色系,或一个有意选择的 focus color。
  3. 确保 --primary-foreground 在新主色上可读。
  4. 如果保留强调色选项,同步更新 AppearanceSection.tsx 中的 ACCENT_SWATCHES
  5. 如果添加或删除强调色,更新 app-schema.ts 中的 ACCENT_COLORSaccentColorSchema;若已有用户需要 fallback,再添加 settings-store migration。

验证

运行应用并检查:

  • Settings → Appearance 中 light、dark、system 都能切换。
  • 强调色 swatches 会更新主按钮与 focus rings。
  • 重启后仍保留 themeaccentColor
  • Windows titlebar overlay colors 匹配当前模式。
  • 托盘图标颜色仍会跟随操作系统主题。

然后运行:

pnpm lint:check && pnpm typecheck && pnpm test

相关页面

On this page