Skip to content

Mobile Responsive App — Steer Document

Date: 2026-04-10 (Session 35) Status: Implemented — P0/P1/P2 all merged Companion spec: ../mobile-responsive-feature.md


Problem

The conversational UI was desktop-first. On 375px mobile screens, the 56px icon rail + 360px left panel + chat area didn't fit. Core flow was unusable on mobile.

Decision

Hide the icon rail on mobile. Replace with a hamburger menu that opens a slide-out drawer (Claude mobile app pattern). Panels become full-screen overlays with backdrop-tap-to-close.

Design Rationale

Why hamburger drawer, not bottom tab bar

Bottom tab bar was tried first (PR #23) but overlapped the chat input bar. The hamburger drawer pattern (like Claude, ChatGPT) avoids this by not competing for vertical space. The drawer also provides room for recent cases list and new-case CTA.

Why 100svh not 100dvh

dvh (dynamic viewport height) on Android includes the browser address bar area, pushing the input bar behind it. svh (small viewport height) uses the visible area after the address bar is shown — the input bar stays above the chrome.

Why interactive-widget=resizes-content

Tells mobile browsers to resize the layout viewport when the keyboard or address bar appears. Belt-and-suspenders with svh.

Why CSS variable theming, not dark: variants

dark: is a two-mode system (light/dark). CSS variables support N themes. Adding a theme = one CSS block, zero component changes. Three themes shipped: Light, Dark, High Contrast (WCAG AAA).

Why themes scoped to /app only

Storefront pages have ~270 hardcoded colors that don't respond to CSS variables. Theming them requires a separate migration. Scoping avoids a broken experience on public pages.

Breakpoints

  • < 768px: hamburger drawer, full-screen panels, no icon rail
  • 768-1024px: icon rail, overlay panels with backdrop
  • > 1024px: icon rail + inline panels (current desktop layout)

References

  • Feature spec: docs/specs/mobile-responsive-feature.md
  • Audit: Session 35 (25 findings, P0-P2)