feat(ui): sidebar project tree, status bar and a tabbed workbench for workspaces

The Workspace page's lane strip moves into the sidebar as a project tree:
workspaces grouped by git repository (new GET /api/projects, cached in
memory, POST /api/projects/refresh), untracked worktrees with Adopt, inline
rename, drag/Alt+arrow ordering and a right-click row menu. The selected
workspace is the URL's ?lane=, one shared lane list feeds the tree, the new
bottom status bar and the page. The Changes panel gains an activity bar
(Files / Changes / Sessions, with resume), and split panes get a header.
This commit is contained in:
2026-10-01 16:33:25 +07:00
parent 5b3884b309
commit ba2c4e1914
39 changed files with 2431 additions and 1439 deletions
+28 -1
View File
@@ -311,5 +311,32 @@
"conflict.reset": "Cancel",
"conflict.save": "Save and mark resolved",
"changes.takeOursHint": "Keep your version of the whole file",
"changes.takeTheirsHint": "Take the incoming version of the whole file"
"changes.takeTheirsHint": "Take the incoming version of the whole file",
"projects.title": "Projects",
"projects.folders": "Folders",
"projects.newWorkspace": "New workspace in {{name}}",
"projects.refresh": "Refresh projects and worktrees",
"projects.hidden_one": "{{count}} hidden",
"projects.hidden_other": "{{count}} hidden",
"projects.pick": "Pick a workspace in the sidebar",
"row.primary": "primary",
"row.adopt": "Adopt",
"row.actions": "Workspace actions",
"row.hint": "Double-click to rename · drag or Alt+↑/↓ to reorder · right-click for actions",
"menu.start": "Start",
"menu.stop": "Stop",
"menu.rename": "Rename",
"menu.newHere": "New workspace here…",
"menu.copyPath": "Copy path",
"menu.reset": "Reset worktree…",
"menu.remove": "Delete workspace…",
"pane.slot": "slot {{n}}",
"pane.close": "Stop this pane's session",
"panel.files": "Files",
"panel.changes": "Changes",
"panel.sessions": "Sessions",
"sessions.empty": "No sessions in this workspace yet",
"sessions.resume": "Resume",
"sessions.open": "Open",
"sessions.search": "Filter sessions…"
}
+6 -1
View File
@@ -70,5 +70,10 @@
"releaseAvailable": "{{version}} available",
"devBuild": "Dev build · {{count}} ahead",
"installedNotRunning": "{{version}} installed, not running",
"releaseUnchecked": "Could not check for updates"
"releaseUnchecked": "Could not check for updates",
"statusBar": {
"running": "{{count}} running",
"needYou": "{{count}} need you",
"today": "Today {{cost}}"
}
}
+28 -1
View File
@@ -311,5 +311,32 @@
"conflict.reset": "Huỷ",
"conflict.save": "Lưu và đánh dấu đã xong",
"changes.takeOursHint": "Giữ bản của mình cho cả file",
"changes.takeTheirsHint": "Lấy bản kia cho cả file"
"changes.takeTheirsHint": "Lấy bản kia cho cả file",
"projects.title": "Dự án",
"projects.folders": "Thư mục",
"projects.newWorkspace": "Workspace mới trong {{name}}",
"projects.refresh": "Làm mới dự án và worktree",
"projects.hidden_one": "{{count}} đang ẩn",
"projects.hidden_other": "{{count}} đang ẩn",
"projects.pick": "Chọn một workspace ở thanh bên",
"row.primary": "chính",
"row.adopt": "Nhận",
"row.actions": "Thao tác workspace",
"row.hint": "Nhấp đúp để đổi tên · kéo hoặc Alt+↑/↓ để sắp xếp · chuột phải để xem thao tác",
"menu.start": "Bắt đầu",
"menu.stop": "Dừng",
"menu.rename": "Đổi tên",
"menu.newHere": "Workspace mới tại đây…",
"menu.copyPath": "Sao chép đường dẫn",
"menu.reset": "Đặt lại worktree…",
"menu.remove": "Xóa workspace…",
"pane.slot": "ô {{n}}",
"pane.close": "Dừng phiên của ô này",
"panel.files": "Tệp",
"panel.changes": "Thay đổi",
"panel.sessions": "Phiên",
"sessions.empty": "Chưa có phiên nào trong workspace này",
"sessions.resume": "Tiếp tục",
"sessions.open": "Mở",
"sessions.search": "Lọc phiên…"
}
+6 -1
View File
@@ -70,5 +70,10 @@
"releaseAvailable": "Có {{version}}",
"devBuild": "Bản dev · trước {{count}} commit",
"installedNotRunning": "Đã cài {{version}}, chưa chạy",
"releaseUnchecked": "Không kiểm tra được bản mới"
"releaseUnchecked": "Không kiểm tra được bản mới",
"statusBar": {
"running": "{{count}} đang chạy",
"needYou": "{{count}} cần bạn",
"today": "Hôm nay {{cost}}"
}
}