Skip to content

Commit 87df2cb

Browse files
committed
feat(ui): redesign in the idiom of Codex, Cursor, and Conductor
The workbench read as a VS Code theme with badges bolted on: coloured chips, dot separators, bordered cards, boxed callouts, and system-font fallbacks. This redesign follows the conventions the agent tools Lore sits beside share: monochrome surfaces, hairline borders, one accent, colour only for status and diffs, lists over cards, and a white primary action. - Type and colour: Inter and JetBrains Mono bundled with Fontsource (so the CSP's font-src 'self' holds and every platform looks the same), a zinc neutral scale where each text step clears WCAG AA, and a new stylesheet (about 2,400 lines, down from 3,800) written against the components. - Status: Linear-style glyphs (spinner, check, cross, needs-you, merged, paused) replace dot-and-word badges; agent names are plain text. - Sidebar: a repository switcher (the titlebar's Open folder… moves here), New agent with its shortcut, and Overview with the needs-you count; agent rows are glyph, title, time, and one quiet line (what it is doing, what it needs, or where it stands). - Overview: a centred question and composer, then every agent in one list with filter tabs (All, Needs you, Running, Ready to merge, To review, Merged) instead of a grid of cards. The composer puts Title and Owns behind Options and shows the repository and base branch. - Agent view: a header with title, state, agent, branch → target and quiet icon actions; a commit / merge bar under it; the conversation centred with the prompt as a message bubble, tool calls as single lines, and output in quiet blocks; notices (usage limit, failure, overlaps) above the composer; and the diff in a Review panel on the right instead of a tab, full width when the window is narrow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DR1BSkQa1svcpmy9YZeTab
1 parent f4e786a commit 87df2cb

20 files changed

Lines changed: 2678 additions & 2737 deletions

‎package-lock.json‎

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
"tauri": "tauri"
1919
},
2020
"dependencies": {
21+
"@fontsource-variable/inter": "^5.3.0",
22+
"@fontsource-variable/jetbrains-mono": "^5.3.0",
2123
"@tauri-apps/api": "^2",
2224
"@tauri-apps/plugin-dialog": "^2.7.2",
2325
"@tauri-apps/plugin-notification": "^2.4.0",

‎src/components/workbench/ActivityList.tsx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ function EntryView({
134134
case "prompt":
135135
return (
136136
<li className="activity__prompt">
137-
<span className="activity__prompt-label">Prompt</span>
138-
<span className="activity__prompt-text">{entry.text}</span>
137+
<span className="visually-hidden">Prompt: </span>
138+
<span className="activity__bubble">{entry.text}</span>
139139
</li>
140140
);
141141
case "tool":

‎src/components/workbench/AgentView.test.tsx‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -306,22 +306,24 @@ describe("AgentView", () => {
306306
expect(document.activeElement).toBe(screen.getByLabelText("Follow-up prompt"));
307307
});
308308

309-
it("shows the task's changes in a tab beside its activity, next to commit and merge", async () => {
309+
it("opens the task's changes in a review panel beside the conversation", async () => {
310310
vi.mocked(taskDiff).mockResolvedValue({
311311
text: "diff --git a/src/a.rs b/src/a.rs\n--- a/src/a.rs\n+++ b/src/a.rs\n@@ -1 +1 @@\n-old\n+new\n",
312312
truncated: false,
313313
});
314314
renderView({ commits_ahead: 1, uncommitted_count: 0 });
315-
const tabs = screen.getByRole("tablist", { name: "Agent views" });
316-
const changes = within(tabs).getByRole("tab", { name: /Changes/ });
317-
expect(changes.textContent).toBe("Changes2");
318-
fireEvent.click(changes);
319-
expect(changes.getAttribute("aria-selected")).toBe("true");
320-
await screen.findByRole("region", { name: "src/a.rs" });
315+
expect(screen.queryByRole("complementary", { name: "Changes" })).toBeNull();
316+
const toggle = screen.getByRole("button", { name: /Review/ });
317+
expect(toggle.textContent?.trim()).toBe("Review2");
318+
fireEvent.click(toggle);
319+
expect(toggle.getAttribute("aria-pressed")).toBe("true");
320+
const review = screen.getByRole("complementary", { name: "Changes" });
321+
await within(review).findByRole("region", { name: "src/a.rs" });
321322
expect(taskDiff).toHaveBeenCalledWith("t1");
322-
// Git actions stay in the header while reviewing.
323+
// The conversation and the merge action stay alongside the diff.
324+
expect(screen.getByRole("region", { name: "Conversation" })).toBeTruthy();
323325
expect(screen.getByRole("button", { name: "Merge into checked-out branch" })).toBeTruthy();
324-
fireEvent.keyDown(changes, { key: "ArrowLeft" });
325-
expect(within(tabs).getByRole("tab", { name: "Activity" }).getAttribute("aria-selected")).toBe("true");
326+
fireEvent.click(within(review).getByRole("button", { name: "Close review" }));
327+
expect(screen.queryByRole("complementary", { name: "Changes" })).toBeNull();
326328
});
327329
});

0 commit comments

Comments
 (0)