Skip to content

fix(dashboard): mobile responsive fixes across sidebar, home, project, emails, deployments - #359

Open
DiogoDuart3 wants to merge 11 commits into
oblien:mainfrom
DiogoDuart3:pr4-dashboard-mobile-responsive
Open

fix(dashboard): mobile responsive fixes across sidebar, home, project, emails, deployments#359
DiogoDuart3 wants to merge 11 commits into
oblien:mainfrom
DiogoDuart3:pr4-dashboard-mobile-responsive

Conversation

@DiogoDuart3

Copy link
Copy Markdown
Contributor

A batch of small, independent mobile-responsive fixes across the dashboard, verified live via a headless screenshot pass at 390px and 1280px before/after each change.

  • Sidebar: collapses to a drawer below lg (was always fixed-position, unusable on narrow viewports) - adds a mobile top bar with an open/close trigger.
  • Home rows: narrow the name column and widen the hosting label on mobile; stop the hosting badge from hard-clipping mid-word; go icon-only for the hosting badge and fix a stack-badge clipping issue; hide the Stack badge below sm - it never actually fit at 390px.
  • Deployments: stop the status badge and commit hash overlapping on a deployment row, make the filter chip row scrollable instead of wrapping/overflowing, tighten the commit hash display on mobile.
  • Project detail: tab strip gets a fade instead of hard-clipping, stop label/value crowding in the overview tab, stop the page heading truncating on mobile.
  • Emails admin: stop the header buttons wrapping awkwardly, fade the admin tab strip (same treatment as project detail), stop the mail hostname/CTA overlapping on mobile.

Note on CI

Recent merged PRs against main (#322, #327) show Typecheck: SUCCESS / Test: FAILURE on their PR-context runs. Flagging in case it reproduces here too - doesn't look related to this change.

At narrow widths the sidebar never collapsed - it rendered inline and
squeezed page content to roughly half the viewport instead of getting
out of the way. Below `lg` it's now hidden by default and opens as an
overlay drawer (fixed position, slide-in, scrim) via a hamburger button
in a new slim mobile top bar (logo + hamburger + theme toggle). The
drawer auto-closes on navigation and locks page scroll while open.
Desktop sidebar behavior (collapse/expand, width) is unchanged.
… chips

Two mobile layout bugs on the deployments list:

- The project title truncated with `truncate` but no `min-w-0` on the
  flex item, so its min-content stayed the full untruncated text width -
  it refused to shrink and spilled across the status badge / commit hash
  instead of ellipsizing. The commit-hash + menu block now also stacks
  onto its own row below `sm` instead of sharing the row it used to
  overlap into.
- The status filter chips (All/Success/Failed/...) wrapped to a ragged
  second line on narrow screens; they now scroll horizontally in a
  single row instead.

Desktop layout is unchanged (sm+ reverts to the original row).
…ding

- Define the `.scrollbar-hide` utility that ProjectMobileTabs and the
  shared Tabs component both already referenced but that never actually
  existed - Firefox (which doesn't honor the app's global
  ::-webkit-scrollbar rule) was showing a bare scrollbar under every
  horizontal-scroll tab strip in the app.
- Add fade edges to the project detail mobile tab strip so the
  horizontal scroll reads as intentional instead of a hard content cut.
- Infrastructure/Source card rows (Server, Repository, and the shared
  Item row used for Platform/Mode/Port/Branch) stack label above value
  below `sm` instead of cramming both onto one line - on a narrow
  viewport a long repo slug or server name has no room next to its
  label and was overflowing past the truncate boundary because the
  value span was missing `min-w-0` (a flex item with `white-space:
  nowrap` keeps its full text width as its shrink floor unless told
  otherwise, so `truncate`'s max-width never actually kicked in).
- The "Add mail server" header button had no `whitespace-nowrap` and
  competed with an untruncated title block for space, so on a narrow
  viewport its label wrapped across three lines. The title now
  truncates, the button is pinned to one line, and its label collapses
  to icon-only below `sm` (the icon + tooltip stay meaningful on their
  own; the full label comes back once there's room).
- The 10-tab admin nav (Overview...Advanced) already scrolled
  horizontally but gave no visual hint that there was more off-screen -
  added the same fade-edge treatment as the project detail tab strip.
- The reputation warm-up banner gets an explicit `w-full` and slightly
  tighter mobile end-padding so it doesn't read as a squeezed column
  next to its own dismiss button.
…g label

- The project row's name+domain column was a fixed w-44 (176px) at every
  width below lg, which left too little room for the rest of the row on
  a phone-width viewport and pushed the row wider than the screen -
  the domain line rendered past the visible edge rather than actually
  truncating in view. It now steps down to w-32 below sm.
- The hosting-target label (e.g. a server name) was capped at
  max-w-[120px], truncating mid-word ("Unkn...") even at desktop widths
  where the row has spare room; widened to 160/220px.
Regression from the earlier mobile pass: widening the hosting label's
max-width to fix one truncation bug pushed the row's total shrink-0
badge content past the available width at other viewports (reported at
1280px desktop, "This Server" clipped to "Thi"). The row's
overflow-hidden clips at the box edge, not per-badge, so whichever
badge landed on that boundary got a raw pixel cut instead of an
ellipsis - same mechanism was clipping "Unknown" to "Unkno" on mobile.

Fixed at the source instead of re-tuning another magic max-width: the
icon is always visible (with a title tooltip standing in for the label
on narrow/icon-only sizes), and the label text only renders as a DOM
node from md up - hidden removes it from layout rather than shrinking
it, so it can't contribute a partial-width clip, and once visible it's
unclamped so it can't cut mid-word either.
The h1 and the env selector/help menu shared one row, so on a
phone-width viewport the heading truncated ("Overview" -> "Overv...")
to make room for the controls. Stacks below sm now: heading gets its
own full-width line, controls wrap to a second row. Unchanged at sm+.
The hostname (break-all, wraps to 2 lines on a long domain) and the
Open webmail / Deploy webmail button shared one row via flex-wrap,
which read as an overlap once the hostname wrapped on a narrow
viewport. The CTA now stacks onto an explicit second row below sm
instead of relying on wrap to reflow it. Unchanged at sm+. The
secondary "Webmail at ..." line (same break-all treatment) already
sits below the hostname within the same column, so it benefits from
the same fix without further changes.
The commit hash rendered as a padded pill button sharing a separate
stacked row with the menu button on mobile, reading as loose and
disconnected from the rest of the row's metadata. It now renders
inline in the time/message row as plain muted mono text (matching that
row's existing dot-separated rhythm) below sm; the desktop pill next to
the menu is unchanged above sm.
…dge clip

F1 regression follow-up: unclamping the hosting label at md+ (previous
commit) still wasn't safe - the home row shares its column with the
right-hand Activity/Updates sidebar, so even at 1280px desktop the
track available to Stack+Hosting+Source+Build-target together is
narrower than the raw viewport suggests, and the row's overflow-hidden
hard-clips at the box edge once real content (e.g. "This Server")
exceeds it, regardless of breakpoint. Verified via headless screenshot
(login + DOM/computed-style inspection) at both 1280 and 390 this
time, not just at the source level. Hosting badge is icon+tooltip only
now, at every width - no label text means no possible partial-width
clip.

Also caught, via the same visual pass, that the Stack badge ("Unknown"
etc.) has the identical failure mode and was clipping to "Unkr" at
390px - same fix (min-w-0 + truncate + max-w on the inner text) applied
there.

F2: favicon fallback now also handles a URL that 200s with an empty
body (seen on Faltou - content-length: 0), which resolves as
`complete=true` with naturalWidth 0 without reliably firing onLoad/
onError before React's listeners attach. A post-mount check via ref
catches it and falls back to the initial-letter avatar.
…90px

Measured the real page at exactly 390x844: after the mobile name
column (w-32) and the trailing Live-badge+arrow block, the meta-badges
row has ~35px of actual width - not enough for the Stack pill (~67px)
even with the min-w-0 + truncate fix from the previous pass, so the
row's overflow-hidden was still hard-clipping it ("Unknown" -> "Unkr")
regardless. Hidden below sm now, same reveal pattern as Source (md)
and Build target (lg) further down the row - Hosting (icon-only) is
the only thing that actually fits in that space at 390px. Verified via
headless screenshot + getBoundingClientRect at exactly 390x844 before
deploying.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant