Request Reset Email
Step one of a reset: an email field and a submit that mails a recovery link.
3 frameworksBeginner
A two-column layout: the reset form on one side, a decorative gradient panel on the other.
<!--
Form on the left in the DOM, decorative panel on the right. On mobile the panel
is hidden (hidden md:flex) - it is atmosphere, not content, so it must not push
the form below the fold on a phone. The form column always fills the width.
-->
<div class="mx-auto grid w-full max-w-4xl overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-sm md:grid-cols-2 dark:border-gray-800 dark:bg-gray-950">
<div class="p-6 sm:p-8">
<h1 class="text-xl font-bold tracking-tight text-gray-900 dark:text-gray-100">Reset your password</h1>
<p class="mt-1 text-sm text-gray-600 dark:text-gray-400">Pick something you haven't used before.</p>
<form class="mt-6 space-y-4" action="#" method="post">
<div>
<label for="split-new" class="block text-sm font-medium text-gray-700 dark:text-gray-300">New password</label>
<input id="split-new" name="password" type="password" autocomplete="new-password" required minlength="8" placeholder="At least 8 characters" class="mt-1.5 w-full rounded-lg border border-gray-300 bg-white px-3.5 py-2.5 text-sm text-gray-900 placeholder:text-gray-500 focus-visible:border-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:placeholder:text-gray-400 dark:focus-visible:ring-blue-400" />
</div>
<div>
<label for="split-confirm" class="block text-sm font-medium text-gray-700 dark:text-gray-300">Confirm password</label>
<input id="split-confirm" name="confirm" type="password" autocomplete="new-password" required placeholder="Re-enter your password" class="mt-1.5 w-full rounded-lg border border-gray-300 bg-white px-3.5 py-2.5 text-sm text-gray-900 placeholder:text-gray-500 focus-visible:border-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:placeholder:text-gray-400 dark:focus-visible:ring-blue-400" />
</div>
<button type="submit" class="w-full rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-semibold text-white transition-colors hover:bg-blue-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2 focus-visible:ring-offset-white motion-reduce:transition-none dark:focus-visible:ring-blue-400 dark:focus-visible:ring-offset-gray-950">Update password</button>
</form>
</div>
<div class="hidden bg-gradient-to-br from-blue-600 via-indigo-600 to-purple-700 p-8 md:flex md:flex-col md:justify-end" aria-hidden="true">
<p class="text-lg font-semibold text-white">One strong password, and you're back in.</p>
<p class="mt-2 text-sm text-blue-100">Your reset link keeps the account safe until you finish.</p>
</div>
</div>| Prop | Type | Default | Description |
|---|---|---|---|
title | string | 'Reset your password' | Heading text for the card. |
submitLabel | string | 'Update password' | Submit label |
onSubmit | (data: { password: string }) => void | - | Called with the form's values when it is submitted. |
className | string | - | Additional classes merged onto the root element. |
The gradient panel is `hidden md:flex` because it is atmosphere, not content - it must not push the form below the fold on a phone. The form column always fills the width and the confirm field blocks submit on mismatch.