import { useEffect, useState } from "react" import { useNavigate, useSearchParams } from "react-router" import { Loader2, LogIn, Sparkles } from "lucide-react" import { Button } from "~/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card" import { Input } from "~/components/ui/input" import { useBrand } from "~/lib/identity" import { pageTitle } from "~/lib/page-meta" import { signIn, useSession } from "~/lib/session" export const meta = () => pageTitle("Sign in") export default function LoginRoute() { const navigate = useNavigate() const [params] = useSearchParams() const session = useSession() const brand = useBrand() const BrandIcon = brand.icon const next = params.get("next") || "/" const [email, setEmail] = useState("you@example.com") const [password, setPassword] = useState("hunter2") const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) // Already signed in? Bounce. useEffect(() => { if (session) navigate(next, { replace: true }) }, [session, next, navigate]) const onSubmit = async (e: React.FormEvent) => { e.preventDefault() setSubmitting(true) setError(null) try { await signIn(email, password) navigate(next, { replace: true }) } catch (err) { setError(err instanceof Error ? err.message : "Sign-in failed.") setSubmitting(false) } } return (
Sign in to {brand.name} Mock auth — any email + non-empty password works. Wire{" "} ~/lib/session.ts to your real backend.
{error && (

{error}

)}

No account needed in dev — credentials aren't checked.

) }