dash.foogy

Fix the dashboard on mobile

doing

Every page overflows horizontally at phone width. Collapse the nav into a real menu, stop the card grid blowing out, and make wide content scroll inside itself.

4/6
1 ready 0 need you mfugaj/dash-foogy $5.60 of $60 (9%)

Task graph

Ordered the way the dispatcher would work it. Each row shows the loop's own verdict — this is the same computation scripts/next.mjs runs, not a second opinion.

The spec

Fix the dashboard on mobile

The dash is described as mobile-first and currently is not usable on a phone. Every page scrolls sideways.

Measured, not guessed

Audited with headless Chromium at 320 / 375 / 414 px across twelve representative pages. Horizontal overflow (scrollWidth - clientWidth):

Page320px375px414px
/291px236px197px
every other page119px64px64px
/p/insuladent/google-ads-web-plan133px78px

Three distinct causes:

1. The top nav, on every page. .topnav is a six-item flex row with no wrapping and no mobile treatment. It measures 329px wide and its right edge lands at 439px inside a 375px viewport. This is the overlay running off the screen, and it is why the number is identical on almost every page. Nav links are also 20px tall — less than half the 44px minimum tap target.

2. The card grid on /. .card.pcard renders 595px wide regardless of viewport — 320, 375 and 414 all produce the same 595. A constant width under a 1fr grid column means content is setting the track’s min-content size: grid and flex items default to min-width: auto, so one non-wrapping descendant props the whole column open. The nowrap/ellipsis rules on .md-title and .md-meta are the likely culprits, but the fix is the min-width: 0 cascade, not the symptom.

3. Wide content with no scroll container. Markdown tables in doc pages render 437px wide. The /graph triple list overflows its container by a pixel at 320px because the serialised triples are long unbreakable strings.

Goal

No page scrolls horizontally at 320px or wider. The nav is a real menu on phones, openable and closable. Wide content scrolls inside its own box rather than dragging the page with it.

Scope

  • A repeatable audit that measures overflow, so “fixed” is checkable rather than a matter of opinion.
  • The nav becomes a hamburger below the desktop breakpoint: opens a panel, closes with an explicit × control, closes on Escape, and returns focus where it came from.
  • The card grid stops blowing out its track.
  • Tables, triple lists and code blocks scroll inside overflow-x: auto containers.
  • Tap targets reach 44px.

Non-goals

  • No redesign. Same light theme, same #ff5a1f accent, same 8px spacing scale, same components. This is a layout repair, not a visual refresh.
  • No CSS framework, no JS framework. The site has zero runtime dependencies and keeps them.
  • No new breakpoints beyond the three already in global.css (700 / 720 / 820) unless a task’s criteria genuinely require one — three is already one too many and consolidating them is not this mission’s job.
  • Not touching desktop layout. If a desktop screenshot changes, that is a regression.

Constraints

  • Astro 4, static output. Any menu JS is vanilla, in the layout, and must survive a page navigation — every page is a full load, so no persistent app state to rely on.
  • The menu must work with JS disabled to the extent of not trapping the user: if the panel cannot open, the links stay reachable.
  • npm run build must pass.

Acceptance (mission-level)

  • The audit script reports zero horizontal overflow on every page at 320, 375 and 414 px.
  • The nav menu opens and closes by tap, closes on Escape, and its close control is visible without scrolling.
  • No interactive element is under 44px in its smaller dimension.
  • Desktop (≥1080px) renders unchanged — verified by screenshot comparison, not by eye.

The line

Everything here is reversible CSS and markup in a private dashboard behind Cloudflare Access. The audit harness and the CI gate are lane 1. The visible layout changes are lane 2 — not because they are dangerous, but because “does this look right on a phone” is a judgement the verifier cannot make from a diff, and the screenshots are worth a glance before they land.