Issue 178 - ShaoClean/Alune GitHub Wiki

Issue #178:PR/MR 页面布局与审阅层级

背景与方案

原详情把远端、返回/切换、标题、分支、操作和内容标签纵向堆叠,Diff 与讨论的可用高度不足。本次复用 Alune 的 Geist 字体、主题 token、图标与 @alune/ui 控件,收紧辅助信息,并保持 API、权限与 Review 语义。

  1. 列表优先展示标题,编号/作者/分支为次级信息,状态及更新时间独立对齐;标题进入详情,右侧箭头在浏览器打开。
  2. 详情头部分为返回与请求切换、请求信息、辅助与合并操作三组;辅助按钮和合并按钮之间使用细分隔线,关闭入口放入“更多审阅操作”,保留原有确认流程。
  3. 内容标签使用独立底色与选中态;概览、讨论独立滚动,文件列表与 Diff 各自滚动,取消主 Diff 的固定高度上限。
  4. 根据实际面板宽度使用 container queries;窄面板将导航和操作移到信息上方,标题最多两行。分支保留完整 title 提示,并优先保留目标分支;长路径可换行,窄面板文件列表位于 Diff 上方。
  5. 访问设置默认折叠,认证错误、失效关联、未知平台或从令牌管理返回时展开。令牌选择、远端、分页、草稿隔离与 API 请求语义保持原有实现。

范围仅为 5 个 PR/MR 前端文件及已有 fixture 的长内容开关;未混入同时存在的工作区列表、标签页或全局样式改动。基线中的右侧检查器在 PR/MR 视图不可启用;本次保持此行为。

验收标准

  • 列表标题、状态、作者、分支、更新时间和外部入口可区分。
  • 详情导航、信息、操作三组清晰,主操作可见。
  • 内容导航与工具区分离,选中状态明确。
  • 桌面头部保持紧凑,Diff 与讨论获得主要可用高度。
  • 文件列表与 Diff 独立滚动。
  • 深浅主题和文字状态正常,保留共享控件与焦点样式。
  • 390px、900px 和常规桌面下无页面横向溢出;长标题两行、长分支省略并可查看完整内容、路径换行。
  • 返回、请求切换、刷新、分页、认证、草稿、代码评论、合并/关闭确认取消流程可用。
  • 构建与回归检查通过,实际结果及前后截图已记录。

验证记录

环境:macOS arm64,Node.js 25.5.0,独立 worktree,生产 Vite 构建,Ego Lite Chromium。日期为 2026-10-02。

检查 结果
npx turbo build --filter=web --filter=server;最终 npm run build -w web 通过;保留已有大 chunk 提示
npm test -w web 233 项通过,包括 6 项 PR/MR 单元测试。首次与共享包构建同时启动时因 dist 尚未生成失败;依赖构建完成后重跑全量通过
node --test apps/web/tests/pull-requests.integration.cjs 最终 4 项通过;真实 Nest/SQLite/临时 Git/SSH,托管响应模拟;覆盖 GitHub、GitLab、自建 GitLab、令牌、分页、错误恢复及 Review 写入
Prettier、git diff --check、commitlint 通过
GitHub Actions(提交 33e8090) push 与 PR 共 24 项检查全部通过:commitlint、web/server/ssh-client/ui/desktop 单元测试,macOS/Linux/Windows 本地 Git 与网络代理测试。PR run:37004548263
1500 × 791 常规视口 头部约 71px,内容 510px/详情 620px,约 82%;并非所有尺寸的固定要求
900 × 850 与 390 × 850,深浅主题 无页面横向溢出;390px 长标题实测 48px(两行),目标分支 development 完整显示
长内容 fixture 31 文件、长标题/分支、额外 160 行 Diff;列表 scrollTop 300 时 Diff 为 0,随后 Diff 滚到 700 时列表仍为 300
UI 流程 请求 #98/#94 切换、草稿/空描述、列表第二页 #76、刷新、返回、标签切换、GitLab 临时令牌认证及讨论回复通过
评论与操作 新行 11 单行选择,Shift 扩展至 12;填写正文后切至概览再返回,正文及选区保留;模拟多行评论成功显示;合并与关闭弹窗打开并取消
真实 GitHub 只读 ShaoClean/Alune PR #177 列表、详情、13 个文件 Diff、评论读取均 HTTP 200,实际页面渲染通过
真实 GitLab 只读 gitlab-org/cli MR !3992 列表、详情、4 个文件 Diff 均 HTTP 200,实际页面渲染通过;匿名 discussions 返回 401,认证讨论由 fixture 覆盖

长内容复验:运行 node apps/web/tests/pull-requests-fixture.cjs,向输出的 controlUrl POST {"layoutStress":true},刷新详情;POST {"layoutStress":false} 恢复普通数据。此控制端点仅在测试 fixture 中存在。

前后截图

下列截图使用隔离仓库;本机路径为临时测试目录。前后截图来自同一基线与相同 fixture。基线截图为匿名读取,最终 fixture 配置测试令牌,因此合并按钮可用性不同,这不是布局修改造成的权限变化。

列表

修改前:

Alune PR/MR 列表修改前

修改后:

Alune PR/MR 列表修改后

Diff

修改前:

Alune PR/MR 详情修改前

修改后,浅色与深色:

Alune PR/MR 浅色详情

Alune PR/MR 深色详情

窄面板与长内容

Alune 390px 长标题与独立滚动

Alune 900px 深色长内容

真实平台只读

Alune 读取真实 GitHub PR

Alune 读取真实 GitLab MR

边界与回退

未执行真实平台评论、合并或关闭;未验证真实私有仓库的凭据场景、GitLab 认证讨论或 Windows/Linux 原生桌面。此次无 API、数据迁移、服务生命周期或持久化格式变更。代码回退通过撤销本 PR;Wiki 为独立历史,需单独回退。

关联:UI 规范、#98、#122、#130。