Viewport:
- Add `viewport` export with `viewport-fit=cover` (enables CSS safe-area-inset-*
on bezel-less iOS/Android) and `interactive-widget=resizes-content` (prevents
layout jumps from virtual keyboard open/close)
iOS zoom prevention:
- input.tsx, textarea.tsx: change text-sm (14px) → text-base sm:text-sm (16px)
on mobile; iOS Safari auto-zooms any input with font-size < 16px
Touch targets:
- button.tsx: default h-10 → h-11 (44px), sm h-8 → h-9 (36px), icon h-10→h-11
matching the 44×44px iOS HIG and WCAG 2.5.5 minimum
- Add touch-manipulation to buttons, inputs, textarea to eliminate 300ms tap delay
Dialog → mobile bottom sheet:
- On mobile (< 640px): anchored to bottom with full width, rounded top corners,
slide-in-from-bottom / slide-out-to-bottom animation, drag handle affordance,
max-h-[90svh] + overflow-y-auto to prevent viewport overflow
- Safe area padding: pb-[max(1.25rem,env(safe-area-inset-bottom))]
- On desktop (sm+): unchanged centered modal with zoom animation
- Close button gets a 32×32 tap area on mobile
Mobile navigation:
- New bottom-nav.tsx: persistent 3-tab bottom bar (مسیر/مرکز/لیگ) shown below
md: breakpoint, hidden on desktop; 56px height + safe-area-inset-bottom;
active tab gets heavier stroke and scale
- Only shown for authenticated non-admin users
- app-shell.tsx: injects BottomNav; main content gets dynamic padding-bottom to
clear the bar (56px + safe area) on mobile, reverts to py-10 on md:
- Footer: safe-area-inset-bottom padding so content clears iPhone home indicator
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>