Mobile Navigation: - Add MobileNav component with bottom tab bar - Show mobile nav on small screens, hide desktop sidebar - Add session count badge to Sessions tab - Add safe area padding for notched devices Session Management: - Redesign SessionCard for mobile with action menu - Add MobileActionSheet for session actions - Keep primary action prominent Forms & Dialogs: - Stack form fields vertically on mobile - Ensure 44px minimum touch targets - Update dialogs for 320px viewport Responsive Layout: - Add MobilePageHeader with back button - Reduce page padding on mobile - Stack multi-column grids vertically Touch & Interaction: - Add active states to interactive elements - Ensure 8px spacing between touch targets Complex Pages: - Update Repo Workspace for mobile - Update Tool Workshop and Config Profiles Build: TypeScript check passes, production build succeeds
6.8 KiB
Context
The Headquarter web app is built as a desktop-first React application. While the terminal component has been fully mobile-optimized through the mobile-terminal-ux change, the rest of the application remains largely unusable on mobile devices. Key pages like Sessions, Dashboard, and Project Workspace use desktop-oriented layouts (sidebars, multi-column forms, fixed-width panels) that break on small viewports.
Current mobile state:
- AppShell has horizontal scroll navigation (functional but awkward)
- Session cards have action buttons that wrap and overlap
- CreateSessionForm uses multi-column grids that become cramped
- Repo Workspace has 3 fixed sidebars that stack poorly
- Tool Workshop and Config Profiles use fixed 280px sidebars with no mobile adaptation
- Many touch targets are below 44px
- Dialogs may overflow 320px viewports
User behavior on mobile:
- Primary use: start/stop sessions, check status, terminal access
- Secondary use: small config adjustments, quick file edits
- Not used for: complex tool configuration, heavy code editing, git merge operations
Goals / Non-Goals
Goals:
- Make session start/stop/restart fully usable on mobile
- Provide clear navigation and wayfinding on small screens
- Ensure all interactive elements have minimum 44px touch targets
- Make Dashboard and Sessions pages comfortable to use on phones
- Add consistent mobile page headers with back buttons
- Ensure dialogs and modals work within 320px viewport
- Provide read-first, edit-second pattern for complex admin pages
Non-Goals:
- Full feature parity with desktop (complex editing remains desktop-optimized)
- Native app feel (no swipe gestures, pull-to-refresh, or bottom sheets beyond existing terminal special keys)
- Redesigning the terminal (already complete)
- Tablet-specific optimizations (focus is on 320-768px phones)
- Changing any backend APIs or data models
Decisions
1. Bottom Tab Bar for Primary Navigation
Decision: Replace AppShell's horizontal scroll nav with a bottom tab bar on mobile (< 768px).
Rationale:
- Bottom tab bars are the standard mobile navigation pattern
- Thumb-reachable, always visible, supports muscle memory
- Horizontal scroll nav requires two-handed use and hides items
Implementation:
- Create
MobileNavcomponent with 5 tabs: Home, Projects, Sessions, Tools, Settings - Show badges for active sessions
- Use CSS
position: fixed; bottom: 0with safe-area-inset padding - Desktop keeps existing sidebar navigation
2. Session Cards: Action Sheet Pattern
Decision: Replace inline action buttons with a single "Actions" button that opens a dropdown/sheet.
Rationale:
- Current session cards show 4-5 action buttons (Open, Terminal, Stop, Restart, Delete) that wrap awkwardly
- Action sheet reduces visual clutter while keeping all actions accessible
- Follows native mobile pattern
Implementation:
- Add
...or "Actions" button to each session card - On tap, show action sheet with: Open, Terminal, Stop/Start, Restart, Delete
- Primary action (Open/Terminal) remains as prominent button
- Keep swipe actions for power users (optional enhancement)
3. Forms: Vertical Stacking with Progressive Disclosure
Decision: All multi-column forms stack vertically on mobile. Complex forms use stepper or accordion pattern.
Rationale:
- Multi-column forms become unreadable on 320px screens
- Vertical stacking is the native mobile form pattern
- Steppers reduce cognitive load by showing one section at a time
Implementation:
- Update CSS:
@media (max-width: 767px)setgrid-template-columns: 1fron all form grids - For CreateSessionForm: consider stepper (Project → Repo → Tool → Config) or keep as single long form with clear sections
- Ensure all inputs have
min-height: 44pxand adequate spacing
4. Complex Admin Pages: Read-First Pattern
Decision: Tool Workshop and Config Profiles show summary/list view by default on mobile, with edit flowing into full-screen mode.
Rationale:
- These pages have complex forms with sidebars that don't fit mobile
- Users rarely need to edit these on mobile, but may need to view or make small changes
- Read-first pattern matches user behavior
Implementation:
- Tool Workshop: show tool type cards with key info, tap to view details, "Edit" enters full-screen edit mode
- Config Profiles: show profile list, tap to view summary (tools, mounts, env), "Edit" enters multi-step form
- Keep desktop split-pane layout unchanged
5. Touch Targets and Feedback
Decision: Enforce 44px minimum touch targets everywhere. Add active states for all interactive elements.
Rationale:
- iOS Human Interface Guidelines and Android Material Design both recommend 44-48px
- Missing active states make the app feel unresponsive on touch
Implementation:
- Audit all buttons, links, and clickable areas
- Add
:activestates with subtle background changes - Add loading/spinner states for async operations
- Ensure adequate spacing between adjacent touch targets (minimum 8px)
Risks / Trade-offs
[Risk] Increased CSS complexity from dual layouts
→ Mitigation: Use CSS custom properties and utility classes. Mobile styles live in @media (max-width: 767px) blocks alongside desktop styles, not in separate files.
[Risk] Bottom tab bar reduces vertical screen real estate
→ Mitigation: Tab bar is only ~56px + safe area. On modern phones, this is acceptable. Content areas must account for tab bar height with padding-bottom.
[Risk] Hiding actions behind menus increases tap count → Mitigation: Keep the most common action (Open/Terminal) as a primary visible button. Only secondary actions (Restart, Delete) move to the menu.
[Risk] Stepper forms may annoy desktop users if not implemented carefully → Mitigation: Stepper only activates on mobile breakpoints. Desktop keeps existing layouts.
[Risk] Maintaining two navigation patterns (desktop sidebar + mobile tab bar) → Mitigation: Both use the same route definitions. Navigation state is URL-driven. MobileNav is just a different UI for the same router.
Migration Plan
This is a pure frontend change with no backend or database impact.
- Implement mobile navigation (AppShell changes)
- Update session pages (Dashboard, Sessions)
- Update form components (CreateSessionForm, dialogs)
- Update complex pages (Repo Workspace, Tool Workshop, Config Profiles)
- Polish: touch targets, active states, dialog sizing
- Test on actual devices (iOS Safari, Android Chrome)
Rollback: Revert CSS/JS changes. No data migration needed.
Open Questions
- Should we add a "Quick Actions" FAB (Floating Action Button) on mobile for common operations like "Start Session"?
- Should the bottom tab bar hide when scrolling down to maximize content area (like Safari's bottom bar)?
- Do we need a "Desktop Site" toggle for users who prefer the desktop layout on tablets?