From a5b11a4e3e9ae6e179db6e3a1a97bc54e957aa27 Mon Sep 17 00:00:00 2001 From: David Flanagan Date: Fri, 19 Jun 2026 15:48:09 +0100 Subject: [PATCH 001/216] chore(frontend): open github-like ui draft From 84fe8050a709e3e32f2c03911ea578e9dcfd8129 Mon Sep 17 00:00:00 2001 From: David Flanagan Date: Fri, 19 Jun 2026 16:45:04 +0100 Subject: [PATCH 002/216] feat(frontend): make repo chrome more familiar --- frontend/src/components/RepoTabs.test.ts | 36 +++++-- frontend/src/components/RepoTabs.vue | 15 ++- frontend/src/routes/RepoHome.vue | 79 +++++++++------ frontend/src/styles.css | 116 +++++++++++++++++++++-- 4 files changed, 202 insertions(+), 44 deletions(-) diff --git a/frontend/src/components/RepoTabs.test.ts b/frontend/src/components/RepoTabs.test.ts index b2f5feb2..f18ff472 100644 --- a/frontend/src/components/RepoTabs.test.ts +++ b/frontend/src/components/RepoTabs.test.ts @@ -18,6 +18,7 @@ type CountTone = "ink" | "alarm"; interface Tab { id: string; label: string; + icon: string; count?: number; countTone?: CountTone; } @@ -35,22 +36,23 @@ function buildTabs(opts: { } const all: Tab[] = [ - { id: "overview", label: "Overview" }, - { id: "code", label: "Code" }, + { id: "overview", label: "Overview", icon: "folder" }, + { id: "code", label: "Code", icon: "file" }, ]; if (extEnabled("issues")) - all.push({ id: "issues", label: "Issues", count: openIssues }); + all.push({ id: "issues", label: "Issues", icon: "issue", count: openIssues }); if (extEnabled("pulls")) - all.push({ id: "pulls", label: "Pulls", count: openPulls }); - if (extEnabled("epics")) all.push({ id: "epics", label: "Epics" }); + all.push({ id: "pulls", label: "Pulls", icon: "pr", count: openPulls }); + if (extEnabled("epics")) all.push({ id: "epics", label: "Epics", icon: "tag" }); if (extEnabled("checks")) all.push({ id: "checks", label: "Checks", + icon: "check", count: failingChecks, countTone: "alarm", }); - all.push({ id: "config", label: "Config" }); + all.push({ id: "config", label: "Config", icon: "settings" }); return all; } @@ -170,6 +172,28 @@ describe("RepoTabs extension filtering", () => { expect(ids).toContain("issues"); }); + test("uses familiar forge icons for core and extension tabs", () => { + const tabs = buildTabs({ + enabledExtensions: [ + "ext_issues", + "ext_pull_requests", + "ext_epics", + "ext_checks", + ], + }); + expect( + Object.fromEntries(tabs.map((tab) => [tab.id, tab.icon])), + ).toEqual({ + overview: "folder", + code: "file", + issues: "issue", + pulls: "pr", + epics: "tag", + checks: "check", + config: "settings", + }); + }); + test("short extension slugs are not feature enablement ids", () => { const ids = visibleIds(["issues", "pulls", "epics", "checks"]); expect(ids).toEqual(["overview", "code", "config"]); diff --git a/frontend/src/components/RepoTabs.vue b/frontend/src/components/RepoTabs.vue index edf287c9..8636084a 100644 --- a/frontend/src/components/RepoTabs.vue +++ b/frontend/src/components/RepoTabs.vue @@ -1,10 +1,12 @@