CityTrack / Frontend /app /page.tsx
0xarchit's picture
frontend v2 refactor and enhancements
c2bc4c7
"use client";
import Link from "next/link";
import {
Smartphone,
Zap,
Shield,
ChevronRight,
Radio,
Activity,
MapPin,
CheckCircle2,
Building2,
Users,
LayoutDashboard,
LogOut,
} from "lucide-react";
import { useAuth } from "@/components/AuthProvider";
export default function LandingPage() {
const { user, role, signOut } = useAuth();
const getDashboardLink = () => {
if (role === "admin") return "/admin";
if (role === "worker") return "/worker";
return "/user";
};
return (
<div className="min-h-screen text-slate-900 font-sans selection:bg-emerald-100 selection:text-slate-900 overflow-x-hidden">
<div className="fixed inset-0 z-0 opacity-70 pointer-events-none bg-mesh" />
<div className="fixed inset-0 z-0 opacity-50 pointer-events-none bg-grid" />
<nav className="fixed top-0 w-full z-50 border-b border-slate-200/70 bg-white/70 backdrop-blur-xl transition-all">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between h-20 items-center">
<div className="flex items-center gap-3 group cursor-default">
<div className="relative">
<div className="absolute inset-0 bg-blue-500/20 blur-md opacity-0 group-hover:opacity-100 transition-opacity" />
<div className="relative w-10 h-10 bg-gradient-to-br from-emerald-500 to-cyan-600 rounded-xl flex items-center justify-center text-white shadow-lg shadow-emerald-500/30">
<MapPin className="w-5 h-5 text-white" />
</div>
</div>
<span className="text-xl font-bold tracking-tight text-slate-900">
City<span className="text-emerald-600">Track</span>
</span>
</div>
<div className="hidden md:flex items-center gap-8">
<NavLink href="#features">Features</NavLink>
<NavLink href="#stats">Live Data</NavLink>
<NavLink href="#roadmap">Roadmap</NavLink>
</div>
<div className="flex gap-4 items-center">
{user ? (
<>
<button
onClick={() => signOut()}
className="hidden sm:flex px-4 py-2 text-slate-500 hover:text-red-600 transition-colors"
>
<LogOut className="w-5 h-5" />
</button>
<Link
href={getDashboardLink()}
className="group relative px-6 py-2.5 bg-slate-900 hover:bg-slate-800 text-white font-semibold rounded-lg transition-all shadow-lg hover:shadow-xl hover:-translate-y-0.5 flex items-center gap-2"
>
<LayoutDashboard className="w-4 h-4" />
<span>Go to Dashboard</span>
</Link>
</>
) : (
<>
<Link
href="/signin"
className="px-5 py-2 text-slate-600 hover:text-slate-900 font-medium transition-colors hover:bg-slate-100 rounded-lg"
>
Login
</Link>
<Link
href="/signup"
className="group relative px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg transition-all shadow-lg shadow-emerald-500/30 overflow-hidden hover:-translate-y-0.5"
>
<div className="absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-700" />
<span className="relative flex items-center gap-2">
Get Started <ChevronRight className="w-4 h-4" />
</span>
</Link>
</>
)}
</div>
</div>
</div>
</nav>
<main className="relative z-10 pt-24">
<div className="relative border-b border-slate-200/70">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-24 lg:py-32">
<div className="grid gap-12 lg:grid-cols-[1.1fr_0.9fr] items-center">
<div className="text-center lg:text-left">
<div className="inline-flex items-center gap-3 px-4 py-1.5 rounded-full bg-white border border-slate-200 shadow-sm mb-8 fade-up">
<span className="relative flex h-2 w-2">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"></span>
<span className="relative inline-flex rounded-full h-2 w-2 bg-emerald-500"></span>
</span>
<span className="text-sm font-bold text-slate-600 font-mono tracking-wide">
SYSTEM ONLINE
</span>
</div>
<h1 className="text-5xl md:text-6xl lg:text-7xl font-extrabold text-slate-900 tracking-tight mb-6 leading-[1.05]">
City infrastructure,
<span className="block bg-gradient-to-r from-emerald-600 via-cyan-600 to-blue-600 bg-clip-text text-transparent">
remapped by intelligence.
</span>
</h1>
<p className="text-lg md:text-xl text-slate-600 mb-10 max-w-2xl lg:max-w-none leading-relaxed">
A civic response system that blends vision AI,
geo-deduplication, and automated routing to turn every report
into a verified, trackable action.
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center lg:justify-start items-center">
<Link
href="/signup"
className="px-7 py-3.5 bg-slate-900 text-white font-bold rounded-xl shadow-xl shadow-slate-900/20 hover:shadow-slate-900/30 transition-all hover:-translate-y-1 flex items-center gap-2"
>
Report an Issue
<Smartphone className="w-5 h-5" />
</Link>
<Link
href="/signin"
className="px-7 py-3.5 bg-white text-slate-700 font-semibold rounded-xl border border-slate-200 hover:bg-slate-50 transition-all shadow-lg shadow-slate-200/50 hover:border-slate-300 flex items-center gap-2"
>
Track Status
<Activity className="w-5 h-5 text-emerald-600" />
</Link>
</div>
</div>
<div className="glass-panel rounded-3xl p-6 md:p-8 shadow-urban-xl float-slow">
<div className="flex items-center justify-between mb-6">
<div>
<p className="text-xs uppercase tracking-[0.2em] text-slate-500 font-semibold">
Ops Pulse
</p>
<p className="text-2xl font-bold text-slate-900">
Live Command Board
</p>
</div>
<div className="h-10 w-10 rounded-2xl bg-emerald-100 text-emerald-700 flex items-center justify-center">
<Activity className="w-5 h-5" />
</div>
</div>
<div id="stats" className="grid grid-cols-2 gap-4">
<StatCard
label="ISSUES RESOLVED"
value="12,405"
icon={CheckCircle2}
color="text-emerald-600 bg-emerald-50"
/>
<StatCard
label="ACTIVE AGENTS"
value="84"
icon={Users}
color="text-cyan-600 bg-cyan-50"
/>
<StatCard
label="AVG. REACTION"
value="1.2hrs"
icon={Zap}
color="text-amber-600 bg-amber-50"
/>
<StatCard
label="CITIES LIVE"
value="3"
icon={Building2}
color="text-slate-700 bg-slate-100"
/>
</div>
<div className="mt-6 rounded-2xl bg-slate-900 text-white p-4">
<div className="flex items-center justify-between text-xs uppercase tracking-[0.2em] text-slate-300">
<span>Routing</span>
<span className="text-emerald-400">Auto-assign</span>
</div>
<p className="mt-3 text-sm text-slate-200">
18 active tasks prioritized and dispatched to nearest teams.
</p>
</div>
</div>
</div>
</div>
</div>
<div
id="features"
className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-28"
>
<div className="text-center mb-16">
<h2 className="text-3xl md:text-4xl font-bold text-slate-900 mb-4">
Core Capabilities
</h2>
<p className="text-slate-500 max-w-2xl mx-auto text-lg">
Built on a microservices architecture designed for scale,
security, and speed.
</p>
</div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
<FeatureCard
icon={<Radio className="w-8 h-8 text-blue-600" />}
title="Geo-Spatial AI"
desc="Automatically detects duplicate reports within a 50m radius using smart cluster analysis and GPS verification."
colorClass="bg-blue-50 group-hover:bg-blue-100/50"
/>
<FeatureCard
icon={<Zap className="w-8 h-8 text-amber-500" />}
title="Vision Agent"
desc="Computer vision algorithms analyze uploaded photos to identify pothole severity, debris types, and hazards instantly."
colorClass="bg-amber-50 group-hover:bg-amber-100/50"
/>
<FeatureCard
icon={<Shield className="w-8 h-8 text-emerald-600" />}
title="End-to-End Encryption"
desc="Citizen data is AES-256 encrypted at rest. Zero-knowledge protocols ensure maximum privacy."
colorClass="bg-emerald-50 group-hover:bg-emerald-100/50"
/>
</div>
</div>
<div
id="roadmap"
className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pb-28"
>
<div className="glass-panel rounded-3xl p-8 md:p-12">
<div className="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
<div>
<p className="text-xs uppercase tracking-[0.2em] text-slate-500 font-semibold">
Roadmap
</p>
<h3 className="text-3xl font-bold text-slate-900 mt-2">
Next deployments
</h3>
<p className="text-slate-500 mt-3 max-w-xl">
Expanding to new municipal zones with predictive maintenance,
citizen feedback loops, and real-time response SLAs.
</p>
</div>
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 w-full md:w-auto">
<div className="rounded-2xl bg-white border border-slate-200 p-4">
<p className="text-xs uppercase tracking-wide text-slate-400 font-semibold">
Phase 1
</p>
<p className="text-lg font-bold text-slate-900 mt-2">
North Zone
</p>
<p className="text-sm text-slate-500 mt-1">Q2 rollout</p>
</div>
<div className="rounded-2xl bg-white border border-slate-200 p-4">
<p className="text-xs uppercase tracking-wide text-slate-400 font-semibold">
Phase 2
</p>
<p className="text-lg font-bold text-slate-900 mt-2">
Predictive SLA
</p>
<p className="text-sm text-slate-500 mt-1">Q3 launch</p>
</div>
<div className="rounded-2xl bg-white border border-slate-200 p-4">
<p className="text-xs uppercase tracking-wide text-slate-400 font-semibold">
Phase 3
</p>
<p className="text-lg font-bold text-slate-900 mt-2">
Citizen Portal
</p>
<p className="text-sm text-slate-500 mt-1">Q4 release</p>
</div>
</div>
</div>
</div>
</div>
</main>
<footer className="border-t border-slate-200 bg-white/80 py-12 relative z-10">
<div className="max-w-7xl mx-auto px-4 text-center">
<div className="flex justify-center items-center gap-2 mb-8 opacity-75 hover:opacity-100 transition-opacity">
<div className="w-6 h-6 bg-slate-900 rounded-md flex items-center justify-center text-white">
<MapPin className="w-3.5 h-3.5" />
</div>
<span className="text-sm font-bold tracking-wide text-slate-900">
CityTracker SYSTEMS
</span>
</div>
<p className="text-slate-500 text-sm">
© 2026 Dept. of Public Works. Secure. Efficient. Transparent.
</p>
</div>
</footer>
</div>
);
}
function NavLink({
href,
children,
}: {
href: string;
children: React.ReactNode;
}) {
return (
<Link
href={href}
className="text-sm font-medium text-slate-500 hover:text-emerald-600 transition-colors"
>
{children}
</Link>
);
}
function StatCard({
label,
value,
icon: Icon,
color,
}: {
label: string;
value: string;
icon: any;
color: string;
}) {
return (
<div className="p-4 rounded-2xl bg-white border border-slate-200 shadow-sm hover:shadow-md hover:border-slate-300 transition-all group">
<div className="flex items-center gap-3 mb-2">
<div className={`p-1.5 rounded-lg ${color}`}>
<Icon className="w-4 h-4" />
</div>
<span className="text-xs font-mono text-slate-500 font-bold tracking-wider">
{label}
</span>
</div>
<div className="text-2xl font-bold text-slate-900 group-hover:scale-105 transition-transform origin-left font-mono">
{value}
</div>
</div>
);
}
function FeatureCard({
icon,
title,
desc,
colorClass,
}: {
icon: React.ReactNode;
title: string;
desc: string;
colorClass: string;
}) {
return (
<div className="p-8 bg-white rounded-3xl border border-slate-200 shadow-xl shadow-slate-200/50 hover:shadow-2xl hover:shadow-slate-200/80 hover:-translate-y-1 transition-all group">
<div
className={`w-16 h-16 ${colorClass} rounded-2xl flex items-center justify-center mb-6 border border-slate-100 group-hover:scale-110 transition-transform duration-300`}
>
{icon}
</div>
<h3 className="text-xl font-bold text-slate-900 mb-3 tracking-tight">
{title}
</h3>
<p className="text-slate-500 leading-relaxed text-sm font-medium">
{desc}
</p>
</div>
);
}