Skip to content

feat(windows): 工作台布局与 Git Log 体验调整(参考 IDEA),Core 提交日期携带时区偏移 - #1013

Merged
1lck merged 20 commits into
1lck:previewfrom
frankxii:feat/ui-adjustments
Oct 1, 2026
Merged

1lck merged 20 commits into
1lck:previewfrom
frankxii:feat/ui-adjustments

Conversation

@frankxii

@frankxii frankxii commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

概述

Windows 工作台与 Git Log 一组 UI 调整(主要参考 IDEA),外加一处 Core 契约扩展,用于判断提交是否与本机同一时区。

改动点

工作台布局

  • 设置入口:从左侧活动栏底部移到标题栏搜索按钮右侧(齿轮)。settings 从 SIDEBAR_ACTIVITY_ITEM_IDS 移除,旧设置文件里的排序/隐藏条目由现有归一化逻辑清理。矩阵新增 workbench-settings-entry 行。
  • 底部面板默认通栏:TerminalWidthMode 默认值改为 full。面板位于左右两条活动栏之间,横跨侧边栏和编辑器下方;活动栏保持通高;仍可切回“编辑器宽度”。
  • 面板外观:编辑器、侧边栏、右侧工具窗、底部面板都去掉描边,只靠间隙色分隔;左侧边栏与编辑器之间的间隙改为 6px(新增 --lithe-sidebar-gap)。
  • 分隔条:去掉悬停/拖动时的蓝色高亮,水平/垂直调整光标统一为 ew-resize / ns-resize(ResizablePane、BottomPane、PaneResizeHandle、活动栏、文件导航侧栏)。这是 Windows 端有意的视觉差异:mac 的 SplitHandleView 仍保留悬停高亮;已同步更新 resizable-ui-performance-boundaries Agent Note,保留尺寸限制、无障碍和拖动生命周期约束。
  • Extensions 按钮:右上角 Extensions 按钮在扩展页处于激活状态时再次点击会关闭扩展页。

Source Control

  • 没有改动时不再显示“Working tree clean”空状态,并删除对应 i18n key。

Git Log

  • 单击预览:单击提交后在编辑区预览该提交第一个文件(按文件树显示顺序)的单文件 diff。单击或双击 Commit files 中的文件只显示该文件的 diff,不带提交说明和文件列表(MultiFileDiff.hideFileList),并复用同一个预览标签 diff://commit-file-preview。刚打开 Git Log、还没点过提交时不会自动打开 diff。预览使用独立 hook 管理 generation,并绑定仓库、选中提交和 Git Log 可见状态;取消选择、隐藏面板、切换仓库或卸载会使旧请求失效,失败只记日志。非连续多选且同一路径被多个提交修改时,保留全部匹配 diff 区段及各提交标识,不只取第一份。
  • 去掉表头:去掉 Commit / Author / Date 表头行(删除对应 i18n key)。
  • 日期列:
    • 只对与本机同一时区的提交显示相对时间:刚刚、N 分钟前、今天/昨天 + 12 小时制。其他时区或时区未知时只显示日期加时间(英文日/月/年,中文年/月/日)。
    • AM/PM 放进 i18n,中文显示“上午 / 下午”。
    • 相对时间在鼠标移入所在行时刷新(GitLogDateCell),不靠定时器刷新整张表。
    • 左对齐,字号和颜色与提交说明一致。
  • 列宽可调:作者/日期列可在每一行的列左边缘拖动调整宽度。拖动期间每帧直接写 CSS 变量、不重渲染虚拟列表;拖动结束时持久化一次到 git-log-preferences,有最小/最大宽度限制。拖动会话抽成共享的 utils/document-resize-session.ts(Run 配置列表原地 re-export,保持兼容)。
  • Commit files:去掉 A/M 状态字母;文件夹名旁显示“N 个文件”;修复文件名被末尾计数提前截断的问题;移除未使用的 git-commit-file-tree 类名。
  • 配色:Git Log 各区域统一使用 bg-background。

Core 契约(影响双端)

  • GitCommitResponse 新增 dateUtcOffsetMinutes: Option<i32>(东为正,未知时为 null)。Core 的四处提交日期参数统一为常量 GIT_COMMIT_DATE_ARGUMENT(--date=format:%Y/%m/%d %H:%M %z);parse_commit 把 %z 拆出来,date 字段格式保持 YYYY/MM/DD HH:MM 不变,mac 端解码会忽略新字段,显示不受影响。
  • 同步更新 shared/contracts/rust-core-api.md,以及 history-response-v1 / history-page-response-v1 / push-preview-v1 三个 fixture;新增 parse_commit 时区拆分的单测。

测试与 CI

  • 新增 8 个预览 hook 回归用例,用可控 Promise 覆盖失效、乱序返回、同路径多提交及连续范围预览;清理时释放所有在途请求,使用 spy 恢复 API。
  • Windows CI 增加预览与布局测试步骤,纳入日期、列宽拖动、共享拖动会话、文件树、布局、快捷键和终端默认值测试,并生成逐项 HTML/JUnit 计时报告。
  • 功能矩阵增加预览生命周期和同路径多提交验收步骤,Windows 实机验证仍为 pending。

脚本

  • verify-windows-boundaries.sh:豁免路径的正则兼容反斜杠分隔符,并避免 Git Bash 把开头的 / 改写成 Windows 路径。

与 macOS 的差异(有意为之,已记入矩阵)

  • mac 选中提交时只加载文件列表,不自动打开 diff;Windows 参考 IDEA 自动预览第一个文件。
  • mac 日期列显示原始时间、列宽固定;Windows 显示相对时间、列宽可调。
  • 分隔条高亮见上文。

验证

  • 本次修复在 Linux 上运行 48 个不同的 Bun 用例全部通过,使用仓库计时 harness 输出 HTML/JUnit,最慢约 44ms;tsc --noEmit 通过。针对修改文件的 lint 无错误(保留原有 Button 未使用导入 warning)。
  • 本次修复的 actionlint、Agent Notes、测试稳定性、runtime bundle immutability、Windows 边界、平台矩阵及变更门禁、diff 空白检查通过。未启动 Windows 产品或进行实机 UI 验收。
  • 以下为原作者提供的验证记录:
  • tsc --noEmit、vp lint . 通过
  • bun test(git / layout / platform / terminal / keymaps / utils / run / window):799 个通过,0 个失败
  • cargo test(lithe-core:shared fixture、parse_commit、graph)通过;cargo check windows/tauri/src-tauri 通过
  • verify-platform-feature-matrix(-change).sh、verify-windows-boundaries.sh/.ps1、verify-test-stability.sh 通过
  • 未能在 Windows 本机运行:verify-runtime-bundle-immutability.sh、verify-shared-contracts.sh(需要 zsh)和 verify-rust-core-comments.sh(需要 ruby),请以 CI 结果为准。本分支没有改动运行时资源。
  • 本机 cargo test tests::git::git_history_rewrite* / git_write_* 共 5 个用例超时失败;在未改动的基线上同样失败,属于本机环境问题,与本 PR 无关。

- Windows 标题栏在搜索(放大镜)按钮后新增设置齿轮按钮,点击打开设置对话框
- 活动栏移除设置项,右键「在活动栏中显示」列表不再包含设置
- settings 移出活动栏 ID 集合,旧设置文件中遗留的排序/隐藏条目在归一化时自动清理
- 同步更新 item-order 与 git-log keymap 测试断言,新增 settings 不属于活动栏的防回归断言
- 平台功能矩阵新增 workbench-settings-entry 行并重新生成 md/csv 视图
豁免正则以 "/" 开头会被 Git Bash (MSYS) 当作路径改写,加上 ripgrep 在
Windows 上输出反斜杠分隔路径,导致 core/lithe-core-client 与
platform/tauri-core 两个合法豁免文件被误判为违规。改为字符类开头并
兼容两种分隔符;已在 Windows 验证干净树通过、植入违规文件能被捕获。
- 终端/底部面板默认宽度模式由 editor 改为 full,与 IDEA 默认一致
- 两条活动栏提到最外层保持通高,通栏面板只位于活动栏之间,
  左侧底部按钮不再被面板顶上去;editor 模式布局不变
- 新增 terminal.store 默认值与切换的单测
- 更新 terminal-sessions 矩阵验证描述并重新生成矩阵视图
- 侧边栏、编辑区、底部面板去掉外圈描边,仅靠内容区/间隔区纯色区分
- 新增 --lithe-sidebar-gap(6px),左侧侧边栏与编辑区间距及其拖动条使用该值
- Git Log 标题栏、提交表、检查器、引用树的灰色/半透明背景统一为 bg-background,
  与编辑区底色一致
- 同步更新 workbench-panel-frame 测试断言,并修正标题栏类名的过期断言
- file-tree-row 的 span:last-child 规则会让末尾的计数/状态 trailing 也参与
  剩余宽度分配,与文件名平分空间,导致右侧留白而文件名出现省略号
- 仅对 Commit files 树新增 git-commit-file-tree 作用域规则,使 trailing 不再伸展,
  文件夹/文件名占满剩余宽度;文件浏览器等其他树不受影响
- 新增回归测试
- 单击提交后编辑区预览该提交文件树中的第一个文件 diff;仅用户点击触发,
  刚打开 Git Log 不会自动抢占编辑区
- 单击或双击 Commit files 中的文件只显示该文件 diff,不带提交说明,
  不再打开整个提交的多文件页面
- 所有预览复用同一个 diff://commit-file-preview 标签,快速连点时丢弃过期请求
- MultiFileDiff 新增 hideFileList,单文件预览不显示已更改文件列表及其切换按钮
- 检查器记录文件所属的选择,避免新提交加载期间误用上一提交的文件做预览
- 新增 getFirstCommitFilePath、findCommitFileDiff、createCommitFileDiffPreview 及测试
- 更新 git-history 矩阵验证描述并重新生成矩阵视图
Extensions 标签页为当前活动标签时,点击右侧活动栏的扩展按钮会关闭该标签页;
未打开或位于后台时仍按原行为打开/切换。同步更新源码断言测试。
- 活动栏、侧边栏/AI 面板、底部面板、编辑区分屏、文件导航侧边栏的分隔条
  悬停与拖动时不再显示蓝色背景和蓝色竖线,保留调整光标与拖拽行为。
- 左右分隔条光标由 col-resize 改为 ew-resize(上下分屏 row-resize 改为
  ns-resize),避免 Windows 上箭头中间出现竖线,并与底部面板保持一致。
工作区干净时侧边栏保持空白,移除空状态的勾选图标与文字,
并清理不再使用的 git.workingTreeClean 文案。
- 文件行右侧不再显示 A/M/D 状态字母(文件名颜色仍保留状态区分)
- 文件夹的改动文件数量从右侧移到文件夹名旁,并附带 file/files 单位
- 新增 git.log.fileCountOne 文案处理单数;中文保持“N 个文件”
- 移除仅为右侧 trailing 列存在的 :last-child CSS 覆盖,并同步更新测试
- 移除提交列表上方的列标题行
- 删除不再使用的 git.log.commit / git.log.author / git.log.date 文案
- 1 小时内的提交显示 "N minutes ago"(不足 1 分钟显示 "Just now")
- 今天和昨天的提交显示 "Today / Yesterday + h:mm AM/PM"
- 更早的提交显示 "YYYY/MM/DD h:mm AM/PM",不再使用 24 小时制
- 新增 git.log.date* 中英文文案;日期列加宽以容纳 AM/PM
- 新增 formatGitLogDate 及单元测试,无法解析的日期原样显示
- 较早提交的日期顺序由文案决定:英文 DD/MM/YYYY,中文 YYYY/MM/DD
- 作者和日期列去掉等宽字体与 11px 字号,颜色改为 text-foreground,与提交说明一致
- 表头去掉后,每一行的 Author、Date 列左边缘都有拖动手柄,拖动即可调整整列宽度
- 宽度通过滚动容器上的 CSS 变量下发:拖动中按帧直接写 DOM,不触发虚拟列表重渲染,
  松手后才写入 git-log-preferences 持久化,下次打开沿用
- 列宽有最小/最大限制,行最小宽度随列宽动态计算,避免提交说明被挤没
- 光标使用 ew-resize,无蓝色高亮,与其他面板分隔条一致;拖动遮罩防止松手触发行选中
- startDocumentResizeSession 挪到 src/utils 共享(run 侧保留 re-export),
  新增 direction(反向拖动)和 cursor 选项
- 新增列宽钳制、拖动会话选项、拖动手柄交互(happy-dom)的单元测试
- Core 提交日期改用 --date=format:%Y/%m/%d %H:%M %z,parse_commit 拆出作者 UTC 偏移,
  新增 dateUtcOffsetMinutes 字段(date 显示格式不变),更新契约文档与共享 fixture
- Windows 仅在作者时区与本机一致时显示 刚刚/N 分钟前/今天/昨天,否则显示日期
- AM/PM 进入 i18n,中文显示 上午/下午
- 日期单元格在鼠标移入所在行时刷新相对时间
@ghfind-review ghfind-review Bot added the review: low ghfind author score; see https://ghfind.com label Oct 1, 2026
frankxii and others added 2 commits October 1, 2026 16:30
CI 的 write-stable-tests 检查(--platform windows/all)拒绝测试中的真实 setTimeout。
useGitLogColumnResize 新增可选 frameScheduler 参数透传给拖动会话,测试用手动帧队列确定性地刷新宽度。
@1lck
1lck merged commit 4af800d into 1lck:preview Oct 1, 2026
14 checks passed
@frankxii
frankxii deleted the feat/ui-adjustments branch October 1, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: low ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants