# 聊天前端 UI 修复计划(3 项)
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development or superpowers:executing-plans to implement task-by-task.
**Goal:** 修复 3 个 UI 问题:(1) 项目管理抽屉内的「+新建项目」入口不可见 → 强化可见性与渲染鲁棒性;(2) 顶栏标题文本迁移到侧边栏品牌名下方;(3) 折叠侧边栏后折叠按钮遮挡 logo。
**Architecture:** 纯前端改动,仅涉及 `src/genesis/server/static/chat.html`(HTML 结构 + 内嵌 CSS + 内嵌 JS)。无后端、无 schema、无新依赖。
**Tech Stack:** 原生 HTML/CSS/JS(内嵌于 chat.html,无构建步骤、无前端测试框架);校验用 `node --check` + 浏览器手动核对。
## 根因说明(问题 1)
代码层 `renderDrawerList()`(启动与 `openProjectDrawer → loadDrawerForm` 末尾均调用)确实会渲染「+新建项目」首项,且无 CSS 隐藏它、所有 `pf-*` 字段元素齐全。因此「看不到」是**可发现性问题**:该项与普通项目项外观几乎一致、位于左侧窄列易被忽略;同时若将来 `loadDrawerForm` 抛错会跳过 `renderDrawerList`,导致整列空白。
修复策略:**保留设计已有入口、不另增按钮**(遵循用户「不用再新增」的偏好),仅 (a) 给该项专属样式使其醒目,(b) 加固 `openProjectDrawer` 保证列表必现。
---
## File Structure
- Modify: `src/genesis/server/static/chat.html`
- HTML:删除 header `
`;侧边栏 `.brand-name` 增加副标题;抽屉「+新建项目」项加 `di-create` 类。
- CSS:新增 `.brand-sub`、`.drawer-item.di-create` 及其 hover;折叠态 `#sidebar-toggle` / `#session-list` 规则。
- JS:`renderDrawerList` 首项加 `di-create` 类;`openProjectDrawer` 加固。
- Docs: 本计划文档。
---
### Task 1: 让「+新建项目」可见且必现
**Files:** `src/genesis/server/static/chat.html`
**Interfaces:** Consumes `renderDrawerList`、`openProjectDrawer`、`loadDrawerForm`、`guardDrawerDirty`、`drawerSelected`。
**Produces:** 抽屉左侧顶部始终显示一个虚线蓝底、加粗的「+ 新建项目」项;即使 `loadDrawerForm` 异常也不影响该列表渲染。
- [ ] **Step 1: 写失败验收(手动)**
浏览器打开(scripts/serve.py --fake)→ 顶栏项目下拉 → 点「+ 项目管理(打开抽屉)」→ 抽屉左侧列表**顶部**应有一个明显区别于项目项的「+ 新建项目」项,点击进入空白新建表单。
- [ ] **Step 2: 实现 — renderDrawerList 首项加 di-create 类**
替换(656-658):
```javascript
let html = '
'
+ '+新建项目
';
```
为:
```javascript
let html = ''
+ '+新建项目
';
```
- [ ] **Step 3: 实现 — openProjectDrawer 加固**
替换(589-593):
```javascript
function openProjectDrawer(projectName) {
drawerOpen = true;
toggleProjectSwitcher(false);
drawer.classList.add('open');
loadDrawerForm(projectName === undefined ? drawerSelected : projectName);
}
```
为:
```javascript
function openProjectDrawer(projectName) {
drawerOpen = true;
toggleProjectSwitcher(false);
drawer.classList.add('open');
const sel = (projectName === undefined || projectName === null) ? drawerSelected : projectName;
try { loadDrawerForm(sel); } catch (e) { console.error(e); }
renderDrawerList(); // 始终渲染左侧列表(含 +新建项目)
}
```
- [ ] **Step 4: 实现 — CSS 强化 di-create**
在 `.drawer-item .di-new { color: var(--blue); }` 之后插入:
```css
.drawer-item.di-create {
border: 1px dashed var(--blue-100); background: var(--blue-50);
color: var(--blue-dark); font-weight: 700; justify-content: center; gap: 4px;
}
.drawer-item.di-create:hover { background: var(--blue-100); border-color: var(--blue); }
```
- [ ] **Step 5: 校验**
Run: `node --check`(抽取