- Root cause of 'navbar mobile tak bisa pindah halaman': the chatbot FAB (fixed right-4 bottom-5 z-50) overlapped the rightmost mobile bottom-nav items (z-40) and intercepted taps. Raise the FAB above the nav on mobile (bottom above nav, md:bottom-5 on desktop) so it never blocks nav taps. - Mobile bottom nav now mirrors the FULL desktop sidebar (all 7 items: dashboard, messages, voice, media, recordings, moderation, analysis); horizontally scrollable + snap-to-active on narrow screens. - Select dropdown: clamp portal position within viewport + min-width so it never overflows off-screen on mobile triggers near the right edge; larger tap targets on touch. - Input/Textarea: text-base (16px) on touch to prevent iOS auto-zoom on focus, text-sm on >=sm; comfortable mobile min-height for chat input. - Add .hermes/plans/mobile-nav-form-responsive.md spec.
3.1 KiB
3.1 KiB
GMW Frontend — Mobile Nav + Form Controls Responsive Pass
Problem
Two mobile UX defects reported by user:
-
Mobile navbar can't navigate between pages (
tidak bisa pindah halaman).- Root cause A (click-block): the floating chatbot FAB
(
chatbot.tsxline ~125:fixed right-4 bottom-5 z-50 size-11) overlaps the mobile bottom nav (MobileNavisfixed bottom-0 z-40). Because the FAB isz-50and sits atbottom-5on the right, it intercepts taps on the rightmost bottom-nav items (Voice/Media). Verified in Playwright: click onMedianav item is blocked bybutton[aria-label="Open neural HUD assistant"]. - Root cause B (missing destinations):
mobileNavItemsinsrc/lib/navigation.tsfiltersnavItemsto only['/dashboard','/messages','/voice','/media'], so/recordings,/moderation,/analysisare unreachable from the mobile bottom bar. - Chosen design (user directive): extend the mobile bottom bar to all 7
nav items, horizontally scrollable/flex-wrap so they fit on narrow
screens, following the desktop sidebar's items (same set as
navItems).
- Root cause A (click-block): the floating chatbot FAB
(
-
Form controls not responsive on mobile (
perbagus textfield, dropdown, lainnya agar responsif di mobile).Selectdropdown (primitives/select.tsx) is portalled w/fixedpositioning computed from trigger rect only (top/left/width). On a narrow viewport a dropdown anchored near the right edge overflows past the screen's right edge and can be clipped/clickable-outside the visible area. Clamp horizontally within viewport.Input/Textarea(primitives/input.tsx) usetext-sm(14px) which on iOS triggers auto-zoom on focus (a known mobile annoyance) and can be small touch targets. Give inputs a comfortable mobile baseline.
Files touched
src/components/shell/mobile-nav.tsx— usenavItems(all 7), make the bar scrollable on narrow widths (overflow-x-auto + snap), keep active indicator.src/components/chatbot/chatbot.tsx— raise FAB above the mobile bottom nav onmd:hidden(e.g.bottom-[calc(4.75rem+env(safe-area-inset-bottom))]), keepbottom-5onmd+so it never overlaps the nav.src/lib/navigation.ts— dropmobileNavItemsspecial-case (or repoint tonavItems); keepnavItemsas the single source.src/components/primitives/select.tsx— clamp dropdownleftso it stays within viewport; cap width on narrow screens; keep max-height.src/components/primitives/input.tsx— mobile-friendly font size / touch height (16px inputs to avoid iOS zoom; keep desktop as-is via responsive classes).
Verification
pnpm format,pnpm lint(biome clean),pnpm buildcompiles.- Smoke on NON-PROD port (4024) — confirm free first via
ss -ltnp. - Playwright mobile viewport (390px): ALL 7 nav items present in bottom bar; tapping each navigates (esp. Media rightmost item NOT blocked by FAB); FAB is raised above the nav and no longer intercepts taps.
- Select dropdown on a 390px viewport stays fully on-screen (no right overflow).
- Commit (no trailer), push,
gh run watch, verify all 7 live routes 200.