FN-5879: restore desktop tab scrolling in task detail modal

Keep the task detail tab strip scrollable on desktop without shrinking tab labels.

- move horizontal tab-strip scrolling and momentum styles into the base .detail-tabs rule
- keep .detail-tab items from shrinking at all viewport sizes so overflow remains scrollable
- add a CSS contract test for the base tab strip behavior and extend task detail API mocks with refreshPrStatus

Files changed:
 packages/dashboard/app/components/TaskDetailModal.css              | 7 ++++---
 .../dashboard/app/components/__tests__/TaskDetailModal.css.test.ts | 7 +++++++
 .../app/components/__tests__/TaskDetailModal.test-helpers.ts       | 1 +
 3 files changed, 12 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-5879

Fusion-Task-Lineage: b990a88e-7b1d-44d9-b222-986a28ae143d
This commit is contained in:
gsxdsm
2026-06-02 08:46:04 -07:00
parent 0006408181
commit 5bad807189
3 changed files with 12 additions and 3 deletions

View File

@@ -1625,11 +1625,15 @@
.detail-tabs {
display: flex;
gap: 0;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: thin;
border-bottom: 1px solid var(--border);
margin-bottom: var(--space-md);
}
.detail-tab {
flex-shrink: 0;
padding: var(--space-sm) var(--space-lg);
background: none;
border: none;
@@ -1788,8 +1792,6 @@
}
.detail-tabs {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
}
@@ -1800,7 +1802,6 @@
.detail-tab {
padding: var(--space-sm) var(--space-md);
font-size: 13px;
flex-shrink: 0;
}
/* Task detail modal: prevent header clipping + full-screen refine flow */

View File

@@ -7,4 +7,11 @@ describe("TaskDetailModal CSS contract", () => {
expect(css).toMatch(/\.detail-source-header\s*\{[^}]*align-items\s*:\s*flex-start\s*;/);
});
it("FN-5879 keeps the base detail tab strip horizontally scrollable without shrinking tabs", async () => {
const css = await loadAllAppCssBaseOnly();
expect(css).toMatch(/\.detail-tabs\s*\{[^}]*overflow-x\s*:\s*auto\s*;/);
expect(css).toMatch(/\.detail-tab\s*\{[^}]*flex-shrink\s*:\s*0\s*;/);
});
});

View File

@@ -36,6 +36,7 @@ vi.mock("../../api", async (importOriginal) => {
pauseTask: vi.fn().mockResolvedValue({}),
unpauseTask: vi.fn().mockResolvedValue({}),
recoverBranchBinding: vi.fn(),
refreshPrStatus: vi.fn(),
fetchWorkflowResults: vi.fn().mockResolvedValue([]),
fetchTaskReview: vi.fn().mockResolvedValue({ reviewState: { source: "reviewer-agent", items: [], addressing: [] }, automationStatus: null, emptyMessage: "No reviewer feedback yet — this task has not produced reviewer-agent feedback in direct mode." }),
refreshTaskReview: vi.fn().mockResolvedValue({ reviewState: undefined, automationStatus: null }),