feat: Modern mobile-first UX improvements

Implemented 5 major improvements for better mobile UX:

1.  Fixed Header Transform Issue
   Problem: Header used sticky + translateY, so submenu top-0 had no effect
   Solution: Changed to fixed positioning on mobile

   Before:
   <header className="sticky top-0 -translate-y-full">

   After:
   <header className="fixed top-0 left-0 right-0 -translate-y-full">
   <div className="pt-16"> <!-- compensate for fixed header -->

   Result: Submenu now properly moves to top-0 when header hides

2.  Removed Top Bar in Mobile Standalone Mode
   Problem: Top bar wastes precious vertical space on mobile
   Solution: Hide header completely on mobile PWA standalone

   Implementation:
   if (isStandalone && window.innerWidth < 768) return null;

   Result: Native app feel, maximum content space

3.  Fixed More Page Gap
   Problem: PageHeader had transparent background, content visible behind
   Solution: Changed to solid background

   Before: bg-background/95 backdrop-blur
   After: bg-background

   Result: Clean, solid header with no bleed-through

4.  Fixed Button Sizing
   Problem: .ui-ctrl class overriding button heights
   Solution: Removed .ui-ctrl from Button component

   Before: className={cn('ui-ctrl', buttonVariants(...))}
   After: className={cn(buttonVariants(...))}

   Button sizes now work correctly:
   - sm: h-8 (32px)
   - default: h-9 (36px)
   - lg: h-10 (40px)

5.  Implemented Contextual Headers
   Problem: No page-specific headers
   Solution: Added usePageHeader hook to More page

   Implementation:
   useEffect(() => {
     setPageHeader(__('More'));
     return () => clearPageHeader();
   }, []);

   Result: Consistent header pattern across all pages

Mobile Layout (Standalone Mode):
┌─────────────────────────────────┐
│ (No top bar - native feel)      │
├─────────────────────────────────┤
│ Submenu (dynamic top)           │
├─────────────────────────────────┤
│ Page Title (contextual)         │
├─────────────────────────────────┤
│ Content                         │
│                        [+]      │
├─────────────────────────────────┤
│ Bottom Nav                      │
└─────────────────────────────────┘

Benefits:
 Native app feel on mobile
 Maximum content space (64px saved!)
 Smooth scroll animations
 Consistent button sizing
 Clean, professional look
 Industry-standard UX

Files Modified:
- App.tsx: Fixed header positioning, hide on mobile standalone
- PageHeader.tsx: Solid background
- button.tsx: Removed ui-ctrl override
- More/index.tsx: Added contextual header

Next Steps:
- Add contextual headers to remaining pages
- Test on real devices
- Add page transitions
- Implement pull-to-refresh
This commit is contained in:
dwindown
2025-11-06 22:16:48 +07:00
parent 87d2704a72
commit 51580d5008
4 changed files with 23 additions and 14 deletions

View File

@@ -1,7 +1,8 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';
import React, { useEffect } from 'react';
import { useNavigate, Link } from 'react-router-dom';
import { Tag, Settings as SettingsIcon, ChevronRight } from 'lucide-react';
import { __ } from '@/lib/i18n';
import { usePageHeader } from '@/contexts/PageHeaderContext';
interface MenuItem {
icon: React.ReactNode;
@@ -27,17 +28,20 @@ const menuItems: MenuItem[] = [
export default function MorePage() {
const navigate = useNavigate();
const { setPageHeader, clearPageHeader } = usePageHeader();
useEffect(() => {
setPageHeader(__('More'));
return () => clearPageHeader();
}, [setPageHeader, clearPageHeader]);
return (
<div className="min-h-screen bg-background pb-20">
{/* Header */}
<div className="sticky top-0 z-10 bg-background border-b">
<div className="px-4 py-4">
<h1 className="text-2xl font-bold">{__('More')}</h1>
<p className="text-sm text-muted-foreground mt-1">
{__('Additional features and settings')}
</p>
</div>
{/* Remove inline header - use PageHeader component instead */}
<div className="px-4 py-4">
<p className="text-sm text-muted-foreground">
{__('Additional features and settings')}
</p>
</div>
{/* Menu Items */}