参考手册Workspace 包参考

theme 主题系统

多色彩方案主题管理,支持亮色/暗色模式和 6 种预设配色

本页是 01MVP 模板的 Workspace 包参考,适合在需要查看导出、源码入口和扩展点时使用。若你正在按功能启用或改造模板,先看 UI 与主题

这是什么

@01mvp/theme 是主题色彩方案管理工具,一键切换整个网站的配色风格。基于 shadcn/ui 的 CSS 变量体系实现,兼容 next-themes。

能做什么

  • 亮色 / 暗色模式切换
  • 6 种预设配色方案(Default、Claude、Cosmic Night 等)
  • 用户选择主题后自动保存到浏览器(localStorage)
  • 防闪烁脚本(getThemeScript),避免页面加载时闪一下默认主题

大概原理

主题系统通过 CSS 变量(如 --primary--background)控制全局颜色。每种配色方案是一组 CSS 变量的不同取值。切换主题时,系统在 <html> 标签上添加/移除对应的 CSS 类名,浏览器自动重新计算所有使用这些变量的元素颜色。

核心类型

主题模式(ThemeMode)

"light" | "dark" -- 亮色或暗色模式。

配色方案(ColorScheme)

"default" | "claude" | "cosmic-night" | "modern-minimal" | "ocean-breeze" | "perplexity"

主题状态(ThemeState)

Prop

Type

配色方案配置(ColorSchemeConfig)

每种配色方案的元信息:

Prop

Type

可用配色方案

方案主色调CSS 类名
Default#343434 (灰色)
Claude#b45309 (暖橙)theme-claude
Cosmic Night#7c3aed (深紫)theme-cosmic-night
Modern Minimal#6366f1 (靛蓝)theme-modern-minimal
Ocean Breeze#10b981 (青绿)theme-ocean-breeze
Perplexity#0d9488 (青蓝)theme-perplexity

引入 CSS 主题文件

/* 在全局样式中按需引入需要的主题 */
@import "@01mvp/theme/themes/default.css";
@import "@01mvp/theme/themes/claude.css";
@import "@01mvp/theme/themes/perplexity.css";

快速使用

import { initializeTheme, applyTheme, saveTheme } from "@01mvp/theme";

const state = initializeTheme("light", "default");

// 切换暗色模式
applyTheme("dark", state.colorScheme);
saveTheme({ mode: "dark", colorScheme: state.colorScheme });

// 切换配色方案
applyTheme("light", "claude");
saveTheme({ mode: "light", colorScheme: "claude" });

防止主题闪烁(FOUC)

页面加载时,如果 JS 还没执行完就先显示了默认主题,然后才切换成用户保存的主题,就会出现"闪一下"的现象。用 getThemeScript() 生成一段内联脚本放在 <head> 里,可以在 JS 加载前就应用正确的主题。

// 在 layout.tsx 的 <head> 中使用
import { getThemeScript } from "@01mvp/theme";

<head>
  <script dangerouslySetInnerHTML={{ __html: getThemeScript() }} />
</head>

API 参考

  • initializeTheme(defaultMode?, defaultColorScheme?) -- 初始化主题,读取 localStorage 并应用
  • applyTheme(mode, colorScheme) -- 在 <html> 上设置主题类名
  • saveTheme(state) -- 保存主题到 localStorage
  • getStoredTheme() -- 读取已保存的主题

类型

type ThemeMode = "light" | "dark";
type ColorScheme = "default" | "claude" | "cosmic-night"
  | "modern-minimal" | "ocean-breeze" | "perplexity";
interface ThemeState { mode: ThemeMode; colorScheme: ColorScheme; }