# 5-9-C12 [done][bug] 文档页顶栏左上角切换侧栏按钮无效 v1

> 更新时间：2026-05-18（代码修复）
>
> 分类归属：
> - `05-editor-mainline/done`
> - 对应体验主线：`5-9 Wolai-aline continuous checklist`
>
> 关联文档：
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-9-wolai-aline-continuous-checklist-v1.md`
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-7-wolai-page-tree-main-editor-experience-restoration-v1.md`
> - `/mnt/Data1T/mnote/design/04-tree-domain/done/4-2-sidebar-pagetree-filetree-product-interaction-contract-v1.md`

## 1. 问题定义

当前 `3000` 文档页顶部左上角的 `切换侧栏` 按钮可以被点击，但点击后左侧 sidebar 没有收起，再次点击也没有重新展开的状态变化。

这不是页面树节点的展开/折叠问题，而是文档页壳层的 `sidebar shell toggle` 缺失。

## 2. 归类理由

本问题归到 `05-editor-mainline`，而不是 `04-tree-domain`，理由如下：

- 问题入口位于文档页顶栏，不在 `page_tree/file_tree` 行内交互层。
- 问题影响的是页面壳、顶栏和侧栏显隐体验，属于 `Wolai 页面树与主编辑器体验复刻` 主线。
- `04-tree-domain` 更关注树 projection、row model、selection/focus、keyboard、DnD、tree command 等合同；本文问题不在这些运行时合同里。

## 3. 真实现象

复现路径：

1. 打开 `http://127.0.0.1:3000/auth`
2. 点击 `测试账号快速登录`
3. 进入文档页后，点击顶栏左上角 `切换侧栏`
4. 观察左侧 sidebar 是否收起
5. 再点击一次，观察是否重新展开

实际结果：

- 第 1 次点击后，左侧 sidebar 仍然完整可见
- 第 2 次点击后，左侧 sidebar 仍然完整可见
- 页面 URL 不变
- 浏览器 console 未出现报错
- 关键 network 未出现与 toggle 对应的新请求

期望结果：

- 第 1 次点击应收起左侧 sidebar
- 第 2 次点击应恢复展开
- 行为应与 Wolai / 常规文档页壳的 sidebar toggle 一致

## 4. 证据

截图证据：

- 切换前：`/mnt/Data1T/mnote/tmp/hermes-tester/manual-before-toggle.png`
- 点击一次后：`/mnt/Data1T/mnote/tmp/hermes-tester/manual-after-toggle.png`
- 点击两次后：`/mnt/Data1T/mnote/tmp/hermes-tester/manual-after-second-toggle.png`

Hermes tester 首轮取证：

- `/mnt/Data1T/mnote/tmp/hermes-tester/first-run/screenshots/01-auth-entry.png`
- `/mnt/Data1T/mnote/tmp/hermes-tester/first-run/screenshots/02-after-quick-login.png`

窄范围侧栏取证：

- `/mnt/Data1T/mnote/tmp/hermes-tester/sidebar-run/01-auth.png`
- `/mnt/Data1T/mnote/tmp/hermes-tester/sidebar-run/02-after-login-before-toggle.png`

代码锚点：

- 顶栏按钮渲染位于 `/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/layout.rs:3938`
- 当前仅能找到按钮渲染与样式，未看到对应的显隐切换绑定：
  - `/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/layout.rs:3938`
  - `/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/styles.rs:1940`

## 5. 当前判断

当前更像是：

- 顶栏按钮已经进入 SSR 页面壳
- 但 `sidebar open/collapsed` 状态未接线
- 或按钮没有绑定到实际的 sidebar toggle handler

也就是说，这是一条“控件已渲染，但未驱动真实状态”的缺陷，而不是视觉误差。

## 6. 建议完成方式

完成本缺陷至少需要满足下面四条：

1. 顶栏 `切换侧栏` 按钮绑定真实的 sidebar toggle 状态
2. 第 1 次点击后 sidebar 收起
3. 第 2 次点击后 sidebar 再展开
4. 增补可回归 smoke，覆盖：
   - 登录后点击 toggle
   - 收起态存在明确 DOM/样式状态
   - 再次点击后恢复展开

建议验收同时包含：

- 代码验证：相关 Rust SSR / 前端状态接线
- 浏览器 smoke：真实点击与状态断言
- 截图复核：收起前 / 收起后 / 再展开后三张图

## 7. 流转条件

当前状态：`done`

只有在以下条件都满足后，本文才能移动到 `bugs/05-editor-mainline/done/`：

1. 真实代码已修复
2. smoke 已覆盖且通过
3. 浏览器复测确认收起/展开都生效
4. 证据路径已补齐到修复后的截图或日志

## 8. 修复记录

- [layout.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/layout.rs:67) 新增 `toggleWorkspaceSidebar`，点击后切换 shell 的 `data-mnote-sidebar-collapsed` 状态，并同步 `documentElement` 观测属性。
- [layout.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/layout.rs:6167) 全局 click handler 接入 `data-mnote-action="toggle-sidebar"`。
- [layout.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/layout.rs:7336) 顶栏菜单按钮补齐 `data-mnote-action="toggle-sidebar"`、`data-testid="wolai-sidebar-toggle"` 与 `aria-pressed`。
- [styles.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/styles.rs:224) `data-mnote-sidebar-collapsed="true"` 时隐藏 sidebar，让主编辑区占满空间。

## 9. 验证

- `cargo test --manifest-path rust/Cargo.toml -p mnote-web page_layout_sidebar_toggle_is_wired_to_shell_state -- --nocapture`
  - 结果：1 passed
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web ssr::pages::layout::tests -- --nocapture`
  - 结果：14 passed
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web ssr::styles::tests -- --nocapture`
  - 结果：7 passed

说明：本轮完成了代码接线与 SSR/CSS 合同验证；浏览器截图复核可在后续统一 smoke 中补充。
