FN-7052: restore Agent Detail tab touch panning

Restore mobile horizontal panning from direct touches on Agent Detail tab buttons.

- Apply pan-x touch-action to Agent Detail tab buttons alongside the tab strip.
- Cover both base and mobile tab styles so the global mobile pan-y lock does not block button-origin swipes.
- Extend the mobile scroll regression test to assert tab buttons expose horizontal touch panning.
- Add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7052-agent-detail-mobile-tab-touch-action.md        | 7 +++++++
 packages/dashboard/app/components/AgentDetailView.css             | 5 +++++
 .../components/__tests__/AgentDetailView.mobile-scroll.test.tsx   | 8 ++++++--
 3 files changed, 18 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-7052

Fusion-Task-Lineage: 42921948-f940-46d6-8c86-c159e94603b5
This commit is contained in:
gsxdsm
2026-06-26 01:19:55 -07:00
parent 3f66e55505
commit c0d53530cf
3 changed files with 18 additions and 2 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Restore horizontal swiping on Agent Detail tabs on mobile touch devices.
category: fix
dev: Adds `.agent-detail-tab` touch-action pan-x coverage because the global mobile pan-y lock is non-inherited.

View File

@@ -274,10 +274,14 @@ Tablet viewports inherit the base tab rule because AgentDetailView has only a mo
FNXC:AgentDetailView 2026-06-21-11:03: FNXC:AgentDetailView 2026-06-21-11:03:
Agent-detail tabs must be non-shrinking flex children so the overflow strip develops real horizontal scroll on narrow mobile viewports instead of squashing Dashboard / Logs / Mail / Skills / Settings into the available width (FN-6865). Agent-detail tabs must be non-shrinking flex children so the overflow strip develops real horizontal scroll on narrow mobile viewports instead of squashing Dashboard / Logs / Mail / Skills / Settings into the available width (FN-6865).
FNXC:AgentDetailView 2026-06-26-01:00:
`touch-action` is non-inherited, so the tab buttons themselves are the touch targets that must opt into pan-x; the FN-6450/FN-6865 container-only opt-in still left button touches under the global mobile `* { touch-action: pan-y; }` lock. Mirror the FN-7048 task-detail fix for FN-7052 without changing tab layout or labels.
*/ */
.agent-detail-tab { .agent-detail-tab {
display: flex; display: flex;
flex: 0 0 auto; flex: 0 0 auto;
touch-action: pan-x pan-y;
align-items: center; align-items: center;
gap: var(--space-xs); gap: var(--space-xs);
padding: calc(var(--space-sm) + var(--space-xs) * 0.5) var(--space-md); padding: calc(var(--space-sm) + var(--space-xs) * 0.5) var(--space-md);
@@ -1834,6 +1838,7 @@ Agent-detail tabs must be non-shrinking flex children so the overflow strip deve
.agent-detail-tab { .agent-detail-tab {
padding: var(--space-md) calc(var(--space-md) + var(--space-xs) * 0.5); padding: var(--space-md) calc(var(--space-md) + var(--space-xs) * 0.5);
font-size: 0.875rem; font-size: 0.875rem;
touch-action: pan-x pan-y;
white-space: nowrap; white-space: nowrap;
min-height: calc(var(--space-lg) + var(--space-md) + var(--space-xs)); min-height: calc(var(--space-lg) + var(--space-md) + var(--space-xs));
} }

View File

@@ -66,6 +66,7 @@ describe("AgentDetailView mobile scroll regression (FN-4231)", () => {
expect(tabsStyle.touchAction).toBe("pan-x pan-y"); expect(tabsStyle.touchAction).toBe("pan-x pan-y");
expect(tabsStyle.touchAction).toContain("pan-x"); expect(tabsStyle.touchAction).toContain("pan-x");
expect(tabsStyle.overflowX).toBe("auto"); expect(tabsStyle.overflowX).toBe("auto");
expect(tabStyle.touchAction).toContain("pan-x");
expect(tabStyle.flexShrink).toBe("0"); expect(tabStyle.flexShrink).toBe("0");
}); });
@@ -84,9 +85,12 @@ describe("AgentDetailView mobile scroll regression (FN-4231)", () => {
const tabsEl = document.querySelector(".agent-detail-tabs") as HTMLElement; const tabsEl = document.querySelector(".agent-detail-tabs") as HTMLElement;
const tabEl = document.querySelector(".agent-detail-tab") as HTMLElement; const tabEl = document.querySelector(".agent-detail-tab") as HTMLElement;
const tabStyle = window.getComputedStyle(tabEl);
expect(window.getComputedStyle(tabsEl).overflowX).toBe("auto"); expect(window.getComputedStyle(tabsEl).overflowX).toBe("auto");
expect(window.getComputedStyle(tabEl).whiteSpace).toBe("nowrap"); expect(tabStyle.touchAction).toContain("pan-x");
expect(window.getComputedStyle(tabEl).flexShrink).toBe("0"); expect(tabStyle.whiteSpace).toBe("nowrap");
expect(tabStyle.flexShrink).toBe("0");
}); });
it("keeps tab labels readable across tablet and mobile states (FN-6728)", async () => { it("keeps tab labels readable across tablet and mobile states (FN-6728)", async () => {