From 51580d500832b6f643e1551c0696ecf739b12b55 Mon Sep 17 00:00:00 2001 From: dwindown Date: Thu, 6 Nov 2025 22:16:48 +0700 Subject: [PATCH] feat: Modern mobile-first UX improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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:
After:
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 --- admin-spa/src/App.tsx | 9 +++++++-- admin-spa/src/components/PageHeader.tsx | 2 +- admin-spa/src/components/ui/button.tsx | 2 +- admin-spa/src/routes/More/index.tsx | 24 ++++++++++++++---------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/admin-spa/src/App.tsx b/admin-spa/src/App.tsx index a1e17de..8762380 100644 --- a/admin-spa/src/App.tsx +++ b/admin-spa/src/App.tsx @@ -329,8 +329,13 @@ function Header({ onFullscreen, fullscreen, showToggle = true, scrollContainerRe } }; + // Hide header completely on mobile in standalone mode + if (isStandalone && typeof window !== 'undefined' && window.innerWidth < 768) { + return null; + } + return ( -
+
{siteTitle}
{window.WNW_API?.isDev ? 'Dev Server' : 'Production'}
@@ -480,7 +485,7 @@ function Shell() {
) : ( -
+
{!isMorePage && (isDashboardRoute ? ( ) : ( diff --git a/admin-spa/src/components/PageHeader.tsx b/admin-spa/src/components/PageHeader.tsx index aa767c2..c5ef39d 100644 --- a/admin-spa/src/components/PageHeader.tsx +++ b/admin-spa/src/components/PageHeader.tsx @@ -16,7 +16,7 @@ export function PageHeader({ fullscreen = false }: PageHeaderProps) { const topClass = fullscreen ? 'top-0' : 'top-[calc(10rem+32px)]'; return ( -
+

{title}

diff --git a/admin-spa/src/components/ui/button.tsx b/admin-spa/src/components/ui/button.tsx index 1e1144e..65d4fcd 100644 --- a/admin-spa/src/components/ui/button.tsx +++ b/admin-spa/src/components/ui/button.tsx @@ -45,7 +45,7 @@ const Button = React.forwardRef( const Comp = asChild ? Slot : "button" return ( diff --git a/admin-spa/src/routes/More/index.tsx b/admin-spa/src/routes/More/index.tsx index 28cdbd2..1412921 100644 --- a/admin-spa/src/routes/More/index.tsx +++ b/admin-spa/src/routes/More/index.tsx @@ -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 (
- {/* Header */} -
-
-

{__('More')}

-

- {__('Additional features and settings')} -

-
+ {/* Remove inline header - use PageHeader component instead */} +
+

+ {__('Additional features and settings')} +

{/* Menu Items */}