# 暗色模式模块 ## 概述 追光AI支持浅色/暗色双主题模式,通过 ThemeProvider + CSS 变量驱动,用户偏好自动持久化到 localStorage,整体遵循 Tailwind CSS `class` 策略。 ## 架构 ``` ThemeProvider (Context) ├── 读取 localStorage 初始主题 ├── 监听系统 prefers-color-scheme 变化 ├── 在 上切换 "dark" class └── 提供 toggle/setTheme 方法给子孙组件 ``` --- ## 核心组件 ### ThemeProvider - **文件**: `src/components/ThemeProvider.tsx` - **位置**: 根 layout.tsx 包裹 - **功能**: - `theme` state: `"light"` | `"dark"` | `"system"` - `toggleTheme()` — 在 light/dark 间切换 - `setTheme(mode)` — 设置为指定模式 - 自动监听 `prefers-color-scheme` 媒体查询(`system` 模式时) - 持久化到 `localStorage("zhuiguang-theme")` ### Header 主题切换按钮 - **文件**: `src/components/layout/Header.tsx` - 太阳 ☀️ / 月亮 🌙 图标切换 - 点击调用 `toggleTheme()` - 动画过渡效果 --- ## CSS 变量系统 ### globals.css 暗色变量 ```css :root { /* 浅色主题变量 (默认) */ --background: 0 0% 100%; --foreground: 222 47% 11%; /* ... */ } .dark { /* 暗色主题变量覆盖 */ --background: 222 47% 11%; --foreground: 210 40% 98%; /* ... */ } ``` - 使用 HSL 变量,Tailwind 通过 `hsl(var(--xxx))` 引用 - shadcn/ui 组件自动适配暗色模式(基于 `.dark` class) --- ## 组件适配(14个文件已更新) 以下组件已适配暗色模式: | 组件 | 适配内容 | |------|----------| | Header | 主题切换按钮、导航栏背景色 | | Footer | 页脚背景色、文字色、分隔线 | | HeroBanner | Canvas 粒子颜色随主题切换 | | HomePageClient | 卡片背景、文字颜色 | | ToolsContent | 搜索框、筛选侧边栏、卡片 | | SkillsPageClient | 技能卡片、分类标签 | | 社区相关组件 | ForumBoard/ForumTopicCard/ForumEditor | | 通知组件 | NotificationBell/NotificationCenter | | 用户中心 | 积分卡片、等级进度条 | | 工具详情 | 信息面板、推荐列表 | | 技能详情 | 评测卡片、详情面板 | | 后台管理 | 管理面板所有表格/表单 | --- ## 设计规范 ### 浅色主题 - 背景: `bg-white` / `bg-muted/50` - 卡片: `bg-white/80` (毛玻璃) / `bg-white/60` (卡片) - 边框: `border-border/40` - 阴影: `shadow-sm` ### 暗色主题 - 背景: `bg-background` (HSL 222 47% 11%) - 卡片: `bg-card` (HSL 222 47% 13-15%) - 边框: `border-border` (HSL 215 20% 25%) - 阴影: `shadow-md` (更明显的阴影) ### 颜色规范(双主题通用) - 文字: 浅色 `-600/-700` | 暗色 `-300/-200` - 背景: 浅色 `-50` | 暗色 `-900/-950` - 边框: 浅色 `-200/60` | 暗色 `-700/60` --- ## 技术实现要点 ### 闪烁防护 - ThemeProvider 在 `useEffect` 中初始化,避免 SSR 时的主题闪烁 - `` 上通过内联 script 在 hydration 前设置 class(防止白屏闪烁) ### 系统主题跟随 - `matchMedia('(prefers-color-scheme: dark)')` 监听 - 用户手动设置后覆盖系统偏好 - "system" 模式时动态跟随 ### 持久化策略 - 存储键: `zhuiguang-theme` - 值: `"light"` | `"dark"` - 优先级: localStorage > 系统偏好 > 默认 light