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
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:
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user