Skip to content

fix(dashboard): mobile touch and layout polish - #704

Merged
kmonsoe merged 1 commit into
mainfrom
fix/dashboard-ui-polish
Jul 30, 2026
Merged

fix(dashboard): mobile touch and layout polish#704
kmonsoe merged 1 commit into
mainfrom
fix/dashboard-ui-polish

Conversation

@kmonsoe

@kmonsoe kmonsoe commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Independent of the outbound-calling stack — small, unrelated UI fixes found while eyeballing the SMS/email channel dialogs on mobile.

Email channel dialog — clipped focus ring

This dialog is the only one that nests its scroll container one level inside DialogContent (so the footer can stay pinned below the scrolling form, unlike every other dialog where the footer scrolls with the content). That inner overflow-y-auto div has no padding of its own — per the CSS overflow spec, setting overflow-y to anything but visible forces overflow-x to compute as auto too, so the box-shadow focus ring on the leftmost input hit that clip edge immediately. Fixed with the standard -mx-1/px-1 buffer pair: expand the box 4px, pad back in 4px, net-zero visual shift, but now the ring has room. Confirmed this predates the current PR stack — it's on main already, not something introduced there.

Touch devices stuck gray

The cog icon (dashboard topbar) and the back arrow (settings topbar) are text-ink-mute at rest, turning black on :hover. Correct for a mouse; permanently gray on a touchscreen, which has no persistent hover state to reveal the "real" color. Both now force black via [@media(hover:none)]:!text-ink (and the dark-mode pair) — !important is deliberate here, since a same-specificity override would leave the outcome dependent on Tailwind's internal class-emission order rather than the media condition. The hover: behavior for actual mouse users is untouched.

The mobile hamburger menu button was also variant="outline" (bordered), inconsistent with the borderless cog it sits next to on desktop. Switched to variant="ghost".

Team page tables on mobile

Members and pending-invitations tables used min-w-[640px] on a plain <table>, forcing horizontal scroll on any phone-width viewport. Below md they now render as a stacked card list instead; md and up is pixel-identical to before.

  • Members: name + email as the identity block, then role select + edit/remove in one row below. Role stays visible and editable on mobile — the "Edit" dialog only renames, the inline select is the only way to change someone's role, so hiding it would've been a real functionality loss, not just decluttering. Only the join date is dropped (pure metadata).
  • Invitations: email as the identity line, then role chip + revoke in one row. Sent/expires timestamps are dropped on mobile as the two genuinely decorative columns.

Verification

pnpm typecheck clean, pnpm -F @getmunin/dashboard-pages test green (39 tests, no team-page tests exist), eslint clean on all three touched files. Verified interactively against a local dev server at mobile viewport widths, including seeding extra dummy members/invitations to check the card layout with a realistic row count.

🤖 Generated with Claude Code

https://claude.ai/code/session_011HwhYb3yU3qnGjtFRodQxm

Email channel dialog: the focus ring on the leftmost field was clipped —
overflow-y-auto forces overflow-x to compute as auto too, and the nested
scroll wrapper (used here so the footer stays outside the scroll area,
unlike every other dialog) had no padding of its own to give the ring room
before hitting that edge. Added a small negative-margin/padding pair so the
ring renders without shifting any content.

Settings mobile menu button used variant="outline", inconsistent with the
borderless cog icon it sits next to; switched to "ghost".

The cog icon and the settings-page back arrow were gray-by-default with
hover turning them black — right for a mouse, permanently gray on a touch
device that has no hover state. Both now force black via
[@media(hover:none)], leaving desktop behavior untouched.

Team page: members and pending-invitations tables forced horizontal scroll
below md (min-w-[640px] on a plain table). Both now collapse to a stacked
card list on mobile instead. Members keep the role select inline with
edit/remove — it's the only place to change a member's role, the edit
dialog only renames — dropping just the join date. Invitations show email
then role chip + revoke in one row, matching the same alignment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HwhYb3yU3qnGjtFRodQxm
@kmonsoe
kmonsoe merged commit 8e98f2d into main Jul 30, 2026
6 checks passed
@kmonsoe
kmonsoe deleted the fix/dashboard-ui-polish branch July 30, 2026 10:34
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