# 10. Theme 系统（VabTheme + settings）

> 目标：让 AI 在抽取/复用 Layout 时，不会漏掉主题抽屉、事件总线与 settings 的主题变量闭包。

## 入口与组成

- 主题入口组件：`library/components/VabTheme/index.vue`
- 主题抽屉：`library/components/VabTheme/components/VabThemeDrawer.vue`
- 主题设置入口：`library/components/VabTheme/components/VabThemeSetting.vue`
- 主题状态与持久化：`src/store/modules/settings.ts`

## 关键机制

- 事件总线：通过 `library/plugins/vab.ts` 注入 `$pub/$sub/$unsub`
  - 打开抽屉：`$pub('theme')`
  - 随机换肤：`$pub('random-theme')`
- 主题应用：`useSettingsStore().updateTheme()`
  - 动态 `require(@vab/styles/variables/vab-*-variables.module.scss)`
  - 将 `vab-` 前缀变量映射到 `--el-` CSS 变量
  - 设置 `body` class（`vab-theme-*`）与背景类

## 最小依赖闭包（抽取时必须带上）

- `library/components/VabTheme/`
- `src/store/modules/settings.ts`（至少 theme/showTheme/saveTheme/resetTheme/updateTheme）
- `library/plugins/vab.ts`（提供 `$pub/$sub` 与 `$baseLoading`）
- `library/styles/variables/`（所有 `vab-*-variables.module.scss`）
- Element Plus + i18n（组件内有 `translate()` 与 el-* 组件）

## 验收点（smoke）

- 触发 `$pub('theme')` 抽屉能打开/关闭
- 保存/重置主题后，刷新页面主题能持久化且变量生效

## 常见坑

- `updateTheme()` 使用 webpack 风格的动态 `require`：迁移到非 webpack 构建（如部分 Vite 场景）需要等效实现
- 主题抽屉/设置依赖事件总线注入：未安装 `vab` 插件时会“看起来渲染了但不工作”
