From 351fba1d33c822ab52e2953fb188962643852c03 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Sat, 25 Jul 2026 23:12:41 -0700 Subject: [PATCH] FN-8594: improve project overview mobile reflow Make the project overview usable at small viewport widths while hiding its non-functional mobile task navigation. - Reflow overview filters, stats, cards, and skeletons for 480px and 380px breakpoints. - Hide the mobile navigation bar and clear its reserved height outside an active project task view. - Add regression coverage and document responsive dashboard behavior. Files changed: docs/dashboard-guide.md | 5 +- packages/dashboard/app/App.tsx | 8 +- .../mobile-feature-access-regression.test.tsx | 22 ++++- .../project-overview-small-screen.test.ts | 91 ++++++++++++++++++++ packages/dashboard/app/components/MobileNavBar.tsx | 19 ++++- packages/dashboard/app/components/ProjectCard.css | 58 +++++++++++++ .../dashboard/app/components/ProjectOverview.css | 99 ++++++++++++++++++++++ 7 files changed, 294 insertions(+), 8 deletions(-) Fusion-Task-Id: FN-8594 Fusion-Task-Lineage: 0999f6e4-ffe9-4ed6-a471-8e5ba3413029 Co-authored-by: Fusion (runfusion.ai) --- docs/dashboard-guide.md | 5 +- packages/dashboard/app/App.tsx | 8 +- .../mobile-feature-access-regression.test.tsx | 22 ++++- .../project-overview-small-screen.test.ts | 91 +++++++++++++++++ .../dashboard/app/components/MobileNavBar.tsx | 19 +++- .../dashboard/app/components/ProjectCard.css | 58 +++++++++++ .../app/components/ProjectOverview.css | 99 +++++++++++++++++++ 7 files changed, 294 insertions(+), 8 deletions(-) create mode 100644 packages/dashboard/app/__tests__/project-overview-small-screen.test.ts diff --git a/docs/dashboard-guide.md b/docs/dashboard-guide.md index 758330f517..8591331d90 100644 --- a/docs/dashboard-guide.md +++ b/docs/dashboard-guide.md @@ -141,7 +141,10 @@ While the sidebar is active on desktop/tablet project screens, Board and List wo The active nav-item highlight and the resize-handle hover/focus accent track the active color theme's `--accent` token across all themes, so shadcn, forest, ocean, and other themes no longer show a fixed blue selected state. The Header retains the Fusion brand and project selector, keeps non-navigation controls, and hides duplicate desktop view-toggle entries while the sidebar is active. -On mobile viewports (`<=768px`), the sidebar is not rendered even when the default-on setting is enabled. The existing bottom `MobileNavBar` remains the navigation surface, with mobile-only More-sheet entries for compact tools such as Git Manager, Terminal, Files, and **Import from GitHub**. +On mobile viewports (`<=768px`), the sidebar is not rendered even when the default-on setting is enabled. The existing bottom `MobileNavBar` remains the navigation surface on project task screens, with mobile-only More-sheet entries for compact tools such as Git Manager, Terminal, Files, and **Import from GitHub**. + + +On the **All Projects** overview, Fusion suppresses the mobile bottom nav because task tabs are not active there. It also clears `--mobile-nav-height`, so the overview does not reserve bottom-bar space. The overview reflows through 320px: headers, filters, stats, and card actions stack or wrap, while long project names and paths truncate rather than overflowing. Dashboard component styles use literal pixel values for media-query breakpoints (including `480px` and `380px`); declaration values within those blocks stay token-based. ## Right Dock (experimental, default on) diff --git a/packages/dashboard/app/App.tsx b/packages/dashboard/app/App.tsx index f9deaba0f5..8b3663d4a9 100644 --- a/packages/dashboard/app/App.tsx +++ b/packages/dashboard/app/App.tsx @@ -877,6 +877,7 @@ function AppInner() { /* FNXC:Navigation 2026-06-22-18:00: The right dock panel is no longer experimental or user-toggleable; tablet/desktop project screens always support it regardless of any stale persisted `rightDock` setting. */ const rightDockEnabled = true; const executorFooterVisible = viewMode === "project" && !!currentProject; + const mobileNavVisible = viewMode === "project" && !!currentProject; const rightDockActive = rightDockEnabled && !isMobile && executorFooterVisible; const sidebarActive = leftSidebarNavEnabled && !isMobile && executorFooterVisible; const agentOnboardingEnabled = experimentalFeatures.agentOnboarding === true; @@ -1890,7 +1891,7 @@ function AppInner() { /> )}
@@ -1929,8 +1930,9 @@ function AppInner() { )} {}} - footerVisible={viewMode === "project" && !!currentProject} + onChangeView={mobileNavVisible ? handleTaskViewChange : () => {}} + footerVisible={mobileNavVisible} + hidden={!mobileNavVisible} modalOpen={modalManager.anyModalOpen} keyboardOpen={mobileNavKeyboardOpen} mobileNavPrimaryItems={mobileNavPrimaryItems} diff --git a/packages/dashboard/app/__tests__/mobile-feature-access-regression.test.tsx b/packages/dashboard/app/__tests__/mobile-feature-access-regression.test.tsx index 2752880afd..0873c4f33c 100644 --- a/packages/dashboard/app/__tests__/mobile-feature-access-regression.test.tsx +++ b/packages/dashboard/app/__tests__/mobile-feature-access-regression.test.tsx @@ -130,6 +130,7 @@ const createProjects = () => [ describe("Mobile Feature Access Regression Guard", () => { beforeEach(() => { mockViewport("mobile"); + document.documentElement.style.removeProperty("--mobile-nav-height"); }); it("list view is accessible via mobile nav bar", () => { @@ -261,11 +262,15 @@ describe("Mobile Feature Access Regression Guard", () => { expect(screen.queryByTestId("mobile-more-item-chat")).toBeNull(); }); - it("mobile nav bar renders only on mobile viewport and hides for modal or desktop", () => { - const mobileRender = render(); + it("mobile nav bar renders only on mobile viewport and hides for modal, desktop, or project overview", () => { + const mobileRender = render(