diff --git a/frontend/app/bills/[id]/page.tsx b/frontend/app/bills/[id]/page.tsx index c8423dc..af374a0 100644 --- a/frontend/app/bills/[id]/page.tsx +++ b/frontend/app/bills/[id]/page.tsx @@ -78,8 +78,8 @@ export default function BillDetailPage({ params }: { params: Promise<{ id: strin {/* Content grid */} -
-
+
+
diff --git a/frontend/app/members/page.tsx b/frontend/app/members/page.tsx index dec4d19..858ee1d 100644 --- a/frontend/app/members/page.tsx +++ b/frontend/app/members/page.tsx @@ -56,7 +56,7 @@ export default function MembersPage() { ) : ( <>
{data?.total ?? 0} members
-
+
{data?.items?.map((member) => (
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index cf34377..698179a 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -40,8 +40,8 @@ export default function DashboardPage() { {isLoading ? (
Loading dashboard...
) : ( -
-
+
+

Your Feed diff --git a/frontend/app/settings/page.tsx b/frontend/app/settings/page.tsx index 325a424..6a4fda4 100644 --- a/frontend/app/settings/page.tsx +++ b/frontend/app/settings/page.tsx @@ -119,7 +119,7 @@ export default function SettingsPage() {

{stats ? ( <> -
+
{stats.total_bills.toLocaleString()}
diff --git a/frontend/app/topics/page.tsx b/frontend/app/topics/page.tsx index 84c0457..305d702 100644 --- a/frontend/app/topics/page.tsx +++ b/frontend/app/topics/page.tsx @@ -37,7 +37,7 @@ export default function TopicsPage() {

-
+
{TOPICS.map(({ tag, label, desc }) => (
diff --git a/frontend/components/shared/AuthGuard.tsx b/frontend/components/shared/AuthGuard.tsx index 52f1444..181dfd2 100644 --- a/frontend/components/shared/AuthGuard.tsx +++ b/frontend/components/shared/AuthGuard.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import { useAuthStore } from "@/stores/authStore"; import { Sidebar } from "./Sidebar"; +import { MobileHeader } from "./MobileHeader"; const PUBLIC_PATHS = ["/login", "/register"]; @@ -13,6 +14,7 @@ export function AuthGuard({ children }: { children: React.ReactNode }) { const token = useAuthStore((s) => s.token); // Zustand persist hydrates asynchronously — wait for it before rendering const [hydrated, setHydrated] = useState(false); + const [drawerOpen, setDrawerOpen] = useState(false); useEffect(() => { setHydrated(true); @@ -38,12 +40,30 @@ export function AuthGuard({ children }: { children: React.ReactNode }) { // Authenticated: render the full app shell return (
- -
-
- {children} + {/* Desktop sidebar — hidden on mobile */} +
+ +
+ + {/* Mobile slide-in drawer */} + {drawerOpen && ( +
+
setDrawerOpen(false)} /> +
+ setDrawerOpen(false)} /> +
-
+ )} + + {/* Content column */} +
+ setDrawerOpen(true)} /> +
+
+ {children} +
+
+
); } diff --git a/frontend/components/shared/MobileHeader.tsx b/frontend/components/shared/MobileHeader.tsx new file mode 100644 index 0000000..d3f9f2e --- /dev/null +++ b/frontend/components/shared/MobileHeader.tsx @@ -0,0 +1,16 @@ +"use client"; +import { Menu, Landmark } from "lucide-react"; + +export function MobileHeader({ onMenuClick }: { onMenuClick: () => void }) { + return ( +
+ +
+ + PocketVeto +
+
+ ); +} diff --git a/frontend/components/shared/Sidebar.tsx b/frontend/components/shared/Sidebar.tsx index f56ff5f..f3f92ed 100644 --- a/frontend/components/shared/Sidebar.tsx +++ b/frontend/components/shared/Sidebar.tsx @@ -11,6 +11,7 @@ import { Settings, Landmark, LogOut, + X, } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; import { cn } from "@/lib/utils"; @@ -26,7 +27,7 @@ const NAV = [ { href: "/settings", label: "Admin", icon: Settings, adminOnly: true }, ]; -export function Sidebar() { +export function Sidebar({ onClose }: { onClose?: () => void }) { const pathname = usePathname(); const router = useRouter(); const qc = useQueryClient(); @@ -43,7 +44,12 @@ export function Sidebar() {