docs: 更新 README.md 和新增 CLAUDE.md

- README: 补充功能列表、前端命令、更新项目结构
- CLAUDE.md: 添加项目架构、构建命令、设计决策文档

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-06 21:10:04 +08:00
parent edbf78f236
commit 393c472b2d
2 changed files with 166 additions and 8 deletions
+107
View File
@@ -0,0 +1,107 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目概述
Halo 暗色模式插件 — 为 Halo 2.25 后台管理面板提供深色/浅色模式切换。不修改 Halo 核心代码,完全通过插件机制实现。
**核心技术栈**:Java 21(后端插件骨架)、Vue 3 + TypeScript(前端 UI)、OKLCH 色彩空间(CSS 变量体系)、Gradle(构建)
## 常用命令
```bash
# 后端 — 启用插件并启动 Halo 开发服务器
./gradlew haloServer
# 后端 — 构建插件 JAR(产物在 build/libs/
./gradlew build
# 前端 — 进入 ui/ 开发
cd ui && pnpm install
# 前端 — 开发模式(watch 构建)
pnpm dev
# 前端 — 生产构建
pnpm build
# 前端 — 类型检查
pnpm type-check
# 前端 — Lintoxlint + eslint
pnpm lint
# 前端 — 格式化
pnpm prettier
# 前端 — 单元测试
pnpm test:unit
# 后端 — 仅运行 Java 测试
./gradlew test
```
## 架构概览
```
halo-dark-mode-plugin/
├── 后端 (Java/Gradle) ← 插件骨架,极简
│ ├── DarkModePlugin.java ← 继承 BasePlugin,仅 start()/stop()
│ └── plugin.yaml ← 插件清单(声明式元数据 + 版本约束)
├── 前端 (Vue 3 / TypeScript) ← 核心实现
│ ├── index.ts ← definePlugin() 入口,注册路由+组件
│ ├── composables/
│ │ ├── useDarkMode.ts ← 单例状态管理(light/dark/auto + localStorage 持久化)
│ │ └── useSystemPreference.ts ← matchMedia 系统偏好监听
│ ├── components/
│ │ └── ThemeToggle.vue ← 侧边栏切换按钮
│ ├── views/
│ │ └── SettingsView.vue ← 设置页面(浅色/深色/跟随系统 三选一)
│ └── styles/
│ ├── variables.css ← 40+ CSS 变量(:root 浅色 + [data-halo-theme="dark"] 深色)
│ └── overrides/ ← 按区域分层覆盖(layout/components/forms/editor/scrollbar/utilities
└── 构建链
└── processUiResources ← Gradle task: ui/dist/ → resources/main/ui/
```
## 关键设计决策
### 主题切换机制
- **触发方式**`document.documentElement` 上设置/移除 `data-halo-theme="dark"` 属性
- **CSS 变量体系**:所有颜色通过 `--halo-*` 前缀的 CSS 自定义属性控制,一个语义变量对应一个视觉属性
- **颜色空间**:全部使用 OKLCH(感知均匀,暗色模式天然适配,Chrome 111+/Firefox 113+/Safari 15.4+
- **暗色配色策略**:用亮度层次区分背景(越"高"的层越亮),中性色含微量蓝色调,强调色略降饱和
### 状态管理
- `useDarkMode()` 是**模块级单例** — 所有组件共享同一份 `theme` ref 和 `isDark` computed
- 三个主题模式:`light` / `dark` / `auto`(跟随系统)
- 持久化:`localStorage` key `halo-dark-mode-theme`,默认 `auto`
- FOUC 防护:插件 bundle 顶部同步执行脚本,DOM 渲染前设置 `data-halo-theme`
### 前端入口
- `definePlugin()``@halo-dev/ui-shared` 导入(非 `@halo-dev/console-shared`,那是旧版 plugin-starter 的源)
- 路由使用 `() => import(...)` 懒加载
- 构建使用 `@halo-dev/ui-plugin-bundler-kit``viteConfig()` 包装器
### 覆盖策略
三级渐进覆盖:
1. **CSS 变量注入**~80% 场景)— 通过 `--halo-*` 变量重定义 Tailwind 颜色语义
2. **选择器覆盖**~17% 场景)— `[data-halo-theme="dark"]` 前缀高特异性选择器
3. **组件穿透**~3% 场景)— FormKit/编辑器等第三方组件的自有 CSS 变量接口
### 后端
后端极简 — `DarkModePlugin extends BasePlugin` 仅含 `start()`/`stop()` 生命周期钩子。所有核心逻辑在前端。插件不依赖后端 Setting API。
## 项目文档
- `设计文档.md` — 完整的技术设计(架构图、CSS 变量清单、调色板、组件覆盖策略、实现阶段划分、测试策略)
- `调查文档.md` — 技术调查(create-halo-plugin vs plugin-starter 差异、dev-skills、Halo 插件机制)
- `README.md` — 用户向 README
+59 -8
View File
@@ -1,10 +1,17 @@
# dark-mode # dark-mode
dark-mode - Halo 插件 Halo 2.25 暗色模式插件 — 为 Halo 后台管理面板提供深色/浅色模式切换,支持跟随系统、手动切换和偏好记忆。
## 简介 ## 功能
这是一个基于 Halo 的插件项目。 - ☀️/🌙 **三种模式**:浅色、深色、跟随系统
- 💾 **偏好持久化**:自动记忆用户选择(localStorage),刷新不丢失
- 🖥️ **系统偏好跟随**:切换系统外观时自动响应
-**瞬间切换**CSS 变量瞬时生效,无可见闪烁
- 🧩 **侧边栏注入**:切换按钮自动出现在侧边栏底部(UserProfileBanner 上方)
- ⚙️ **设置页面**:提供详细的模式选择界面(菜单 → 偏好设置 → 深色模式)
- 🎨 **OKLCH 色彩空间**:感知均匀,暗色模式天然适配,WCAG AA 对比度保证
- 📦 **零后端依赖**:纯前端实现,不需要后端 API
## 开发环境 ## 开发环境
@@ -12,12 +19,13 @@ dark-mode - Halo 插件
- Node.js 18+ - Node.js 18+
- pnpm - pnpm
## 开发 ## 快速开始
```bash ```bash
# 启用插件 # 启用插件并启动 Halo 开发服务器
./gradlew haloServer ./gradlew haloServer
# 开发前端
# 前端开发(watch 模式)
cd ui cd ui
pnpm install pnpm install
pnpm dev pnpm dev
@@ -26,11 +34,54 @@ pnpm dev
## 构建 ## 构建
```bash ```bash
# 完整构建(后端 + 前端)
./gradlew build ./gradlew build
``` ```
构建完成后,可以在 `build/libs` 目录找到插件 jar 文件 构建完成后,插件 JAR 文件位于 `build/libs/`,可直接在 Halo 后台安装
## 前端命令
```bash
cd ui
pnpm dev # 开发构建(watch
pnpm build # 生产构建
pnpm type-check # TypeScript 类型检查
pnpm lint # Lintoxlint + eslint
pnpm prettier # 代码格式化
pnpm test:unit # 单元测试
```
## 项目结构
```
├── build.gradle # 根构建(BOM 2.25.0, DevTools 0.8.0
├── settings.gradle # 包含 :ui 子项目
├── src/
│ └── main/
│ ├── java/run/halo/darkmode/
│ │ └── DarkModePlugin.java # 插件主类(极简骨架)
│ └── resources/
│ └── plugin.yaml # 插件清单
└── ui/
└── src/
├── index.ts # definePlugin 入口
├── injector.ts # ThemeToggle 侧边栏注入器
├── composables/
│ ├── useDarkMode.ts # 核心状态管理(模块级单例)
│ └── useSystemPreference.ts # 系统偏好监听
├── components/
│ └── ThemeToggle.vue # 侧边栏切换按钮
├── views/
│ └── SettingsView.vue # 设置页面
└── styles/
├── index.css # 样式入口
├── variables.css # 40+ CSS 变量(浅色 + 深色)
└── overrides/ # 组件覆盖样式
```
## 许可证 ## 许可证
[GPL-3.0](./LICENSE) © LHY [GPL-3.0](./LICENSE) © LHY