01MVP 标识01MVP
包文档UI 与工具theme 主题系统

theme 主题系统

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

@mono/theme

多色彩方案主题管理系统,基于 shadcn/ui CSS 变量体系。支持亮色/暗色模式切换和 6 种预设配色方案,适配 next-themes。

特性

  • 6 种精选配色方案(Default、Claude、Cosmic Night、Modern Minimal、Ocean Breeze、Perplexity)
  • 亮色/暗色双模式
  • localStorage 持久化
  • FOUC 防闪脚本
  • 零依赖,纯 TypeScript
  • shadcn/ui 兼容的 CSS 变量

快速开始

安装

// package.json
{
  "dependencies": {
    "@mono/theme": "workspace:*"
  }
}

基本使用

import {
  initializeTheme,
  applyTheme,
  saveTheme,
  getThemeScript,
} from "@mono/theme";

// 在 <head> 中初始化主题(防止闪烁)
const state = initializeTheme("light", "default");

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

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

防止 FOUC(Flash of Unstyled Content)

在 Next.js 的 layout.tsx 中添加内联脚本:

import { getThemeScript } from "@mono/theme";

export default function RootLayout({ children }) {
  return (
    <html>
      <head>
        <script
          dangerouslySetInnerHTML={{ __html: getThemeScript() }}
        />
      </head>
      <body>{children}</body>
    </html>
  );
}

可用配色方案

方案主色调类名
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 主题文件

每个配色方案有独立的 CSS 文件,包含完整的 shadcn/ui CSS 变量(oklch 色彩空间):

/* 在全局样式中引入需要的主题 */
@import "@mono/theme/themes/default.css";
@import "@mono/theme/themes/claude.css";
@import "@mono/theme/themes/cosmic-night.css";
@import "@mono/theme/themes/modern-minimal.css";
@import "@mono/theme/themes/ocean-breeze.css";
@import "@mono/theme/themes/perplexity.css";

API 参考

initializeTheme(defaultMode?, defaultColorScheme?, storageKey?)

初始化主题,读取 localStorage 并应用。返回当前 ThemeState。

applyTheme(mode, colorScheme)

将主题类应用到 document.documentElement

saveTheme(state, storageKey?)

将主题状态保存到 localStorage。

getStoredTheme(storageKey?)

从 localStorage 读取已保存的主题状态。

getThemeScript(storageKey?, defaultMode?, defaultColorScheme?)

生成用于内联 <script> 的 JavaScript 代码,防止页面加载时的主题闪烁。

isValidMode(value) / isValidColorScheme(value)

类型守卫函数,用于验证输入值。

类型

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