fix: Mobile optimization improvements
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled

Settings Page:
- Horizontal scrollable tabs on mobile (< lg breakpoint)
- Vertical sidebar on desktop (lg+)
- Hide plan info card on mobile (visible in billing tab)

Header:
- Added Settings link in mobile menu for authenticated users

Global CSS:
- Added scrollbar-hide utility class
- Added smooth scrolling for touch devices
- Added touch-pan-x for horizontal scroll areas
- Removed tap highlight on mobile
- select-none utility class
This commit is contained in:
yves.gugger
2025-12-08 15:27:42 +01:00
parent 3ae2ef45d9
commit b641ab0b8f
3 changed files with 67 additions and 4 deletions

View File

@ -140,6 +140,32 @@
@apply bg-border-hover; @apply bg-border-hover;
} }
/* Hide scrollbar utility */
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
/* Smooth scrolling for touch devices */
.scroll-smooth {
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
}
/* Prevent text selection on interactive elements */
.select-none {
-webkit-user-select: none;
user-select: none;
}
/* Touch action for horizontal scrolling */
.touch-pan-x {
touch-action: pan-x;
}
/* Animation delays */ /* Animation delays */
.delay-100 { animation-delay: 100ms; } .delay-100 { animation-delay: 100ms; }
.delay-150 { animation-delay: 150ms; } .delay-150 { animation-delay: 150ms; }
@ -148,3 +174,10 @@
.delay-300 { animation-delay: 300ms; } .delay-300 { animation-delay: 300ms; }
.delay-400 { animation-delay: 400ms; } .delay-400 { animation-delay: 400ms; }
.delay-500 { animation-delay: 500ms; } .delay-500 { animation-delay: 500ms; }
/* Mobile tap highlight removal */
@media (max-width: 640px) {
button, a, input, select, textarea {
-webkit-tap-highlight-color: transparent;
}
}

View File

@ -192,9 +192,29 @@ export default function SettingsPage() {
)} )}
<div className="flex flex-col lg:flex-row gap-6"> <div className="flex flex-col lg:flex-row gap-6">
{/* Sidebar */} {/* Sidebar - Horizontal scroll on mobile, vertical on desktop */}
<div className="lg:w-64 shrink-0"> <div className="lg:w-64 shrink-0">
<nav className="p-2 bg-background-secondary/50 border border-border rounded-xl"> {/* Mobile: Horizontal scroll tabs */}
<nav className="lg:hidden flex gap-2 overflow-x-auto pb-2 -mx-4 px-4 scrollbar-hide">
{tabs.map((tab) => (
<button
key={tab.id}
onClick={() => setActiveTab(tab.id)}
className={clsx(
"flex items-center gap-2 px-4 py-2.5 text-ui-sm font-medium rounded-xl whitespace-nowrap transition-all",
activeTab === tab.id
? "bg-foreground text-background"
: "bg-background-secondary/50 text-foreground-muted hover:text-foreground border border-border"
)}
>
<tab.icon className="w-4 h-4" />
{tab.label}
</button>
))}
</nav>
{/* Desktop: Vertical tabs */}
<nav className="hidden lg:block p-2 bg-background-secondary/50 border border-border rounded-xl">
{tabs.map((tab) => ( {tabs.map((tab) => (
<button <button
key={tab.id} key={tab.id}
@ -212,8 +232,8 @@ export default function SettingsPage() {
))} ))}
</nav> </nav>
{/* Plan info */} {/* Plan info - hidden on mobile, shown in content area instead */}
<div className="mt-4 p-4 bg-background-secondary/30 border border-border rounded-xl"> <div className="hidden lg:block mt-4 p-4 bg-background-secondary/30 border border-border rounded-xl">
<div className="flex items-center gap-2 mb-2"> <div className="flex items-center gap-2 mb-2">
{isProOrHigher ? <Crown className="w-4 h-4 text-accent" /> : <Zap className="w-4 h-4 text-foreground-muted" />} {isProOrHigher ? <Crown className="w-4 h-4 text-accent" /> : <Zap className="w-4 h-4 text-foreground-muted" />}
<span className="text-body-sm font-medium text-foreground">{tierName} Plan</span> <span className="text-body-sm font-medium text-foreground">{tierName} Plan</span>

View File

@ -151,6 +151,16 @@ export function Header() {
<LayoutDashboard className="w-5 h-5" /> <LayoutDashboard className="w-5 h-5" />
<span>Dashboard</span> <span>Dashboard</span>
</Link> </Link>
<Link
href="/settings"
className="flex items-center gap-3 px-4 py-3 text-body-sm text-foreground-muted
hover:text-foreground hover:bg-background-secondary rounded-xl
transition-all duration-300"
onClick={() => setMobileMenuOpen(false)}
>
<Settings className="w-5 h-5" />
<span>Settings</span>
</Link>
<button <button
onClick={() => { onClick={() => {
logout() logout()