Signup Page
The signup form with the proof under it rather than above it — the person who arrived here has already decided, and scrolling past testimonials is friction applied to the wrong reader.
A full auth page that deliberately contains almost nothing but the form — no nav, no marketing, nothing competing with the one job.
app/login-page.tsxnpx hoverlab add login-page
Or over MCP, from your editor's agent — no account needed.
Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.
The real page, rendered in your current theme — every section below is a live block, not a screenshot.
Only want one section? Open it and copy that block instead — browse Authentication.
Want the whole project rather than this one screen? A template ships every route, the theme tokens and the layout.
/**
* A full sign-in screen.
*
* Almost nothing beyond the card, and that is the point: an auth page has
* exactly one job, and every additional element on it is a way to fail at
* that job. No nav, no marketing, no footer links competing with the form.
*
* What is here beyond the card is the small print that stops support
* tickets — a way back to the marketing site, and the legal links that have
* to be reachable from somewhere.
*
* The gradient wash is `-z-10` behind everything and `pointer-events-none`,
* so it can never intercept a click meant for the form.
*/
import * as React from 'react'
import { AuthLoginCard } from '@/components/auth-login-card'
export default function LoginPage() {
return (
<main className="relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-background px-4 text-foreground">
{/* Decoration only — never in front of the form. */}
<div aria-hidden className="pointer-events-none absolute inset-0 -z-10">
<div className="absolute -top-40 left-1/3 h-96 w-96 rounded-full bg-primary/15 blur-3xl" />
<div className="absolute bottom-0 right-1/3 h-96 w-96 rounded-full bg-emerald-500/10 blur-3xl" />
</div>
<a
href="/"
className="mb-2 flex items-center gap-2 text-sm font-semibold tracking-tight"
>
<span
aria-hidden
className="flex h-8 w-8 items-center justify-center rounded-xl bg-primary text-primary-foreground"
>
A
</span>
Acme Inc
</a>
<AuthLoginCard />
<p className="mt-6 text-center text-xs text-muted-foreground">
<a href="/terms" className="hover:text-foreground">
Terms
</a>
<span aria-hidden className="mx-2">
·
</span>
<a href="/privacy" className="hover:text-foreground">
Privacy
</a>
<span aria-hidden className="mx-2">
·
</span>
<a href="/support" className="hover:text-foreground">
Support
</a>
</p>
</main>
)
}
components/ — each block page has its own copy button.app/login-page.tsx. The imports already point at @/components/…, so they resolve with no edits.The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.
The signup form with the proof under it rather than above it — the person who arrived here has already decided, and scrolling past testimonials is friction applied to the wrong reader.
Password reset, plus the magic link beside it — the moment after a password has failed is when somebody is most willing to stop using one.
The second factor with its fallback on the same screen, because a 2FA prompt with no recovery route is a lockout screen wearing a security screen.
A domain field for the employee who signs in daily, and the capability detail below the fold for the IT reviewer who reads it once.
The end of the forgot-password flow, shipped with the state it reaches more than any other screen: a focused error summary linking to each field, beside a strength meter that is a real <meter>.