Recovery Phrase Entry

Enter your recovery phrase

Type or paste your 12-word recovery phrase to restore access to your account.

1
2
3
4
5
6
7
8
9
10
11
12

Tip: paste the full phrase into the first box to fill them all.

About this block

Recovery Phrase EntryPRO

Full-height account recovery screen with a numbered grid of word inputs and paste-to-fill support, plus a restore button that unlocks once every word is entered. Perfect for seed phrase and recovery-phrase restore flows.

Auth47: Recovery Phrase Entry

A full-height centered recovery screen that renders a heading, description, and a responsive numbered grid of wordCount monospace text inputs (paste into the first box to auto-split a full phrase across all boxes), a submit button that stays disabled until every word is filled, and an optional back link with a left-arrow icon.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/auth47?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/auth47?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/auth47.tsx, plus the button, input-group, and field shadcn/ui primitives it uses for the restore button, the numbered word inputs, and the field grouping with helper text.

Quick start

The installed file exports auth47Demo alongside the block: the exact props behind the preview above. Spread it to get a working recovery-phrase form in one line.

tsx
import { Auth47, auth47Demo } from "@/components/beste/block/auth47";

export default function RecoveryPage() {
  return <Auth47 {...auth47Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Auth47 } from "@/components/beste/block/auth47";

export default function RecoveryPage() {
  return (
    <Auth47
      heading="Enter your recovery phrase"
      description="Paste your 24-word phrase to restore access."
      wordCount={24}
      labels={{
        helper: "Paste the full phrase into the first box to fill them all.",
        submit: "Restore account",
      }}
      backLink={{ label: "Back to sign in", href: "/login" }}
    />
  );
}

Props

PropTypeDefaultDescription
headingstring–Centered page title, rendered only when set
descriptionstring–Muted subtitle under the heading, rendered only when set
wordCountnumber12Number of word input boxes rendered in the grid
labels{ helper?: string; submit?: string }{}Helper text under the grid and the submit button label
backLink{ label: string; href: string }–Optional back link with a left-arrow icon below the card
classNamestring–Extra classes for the outer <section>

Behavior notes

  • The input array is seeded from wordCount via useState; changing wordCount after mount does not resize the existing state, so treat it as a mount-time value only.
  • Pasting into any box splits the clipboard text on whitespace, and if it yields more than one part the paste is intercepted and distributed across all boxes from index 0, with parts[i] ?? "" filling short phrases and extra words beyond wordCount silently dropped.
  • The submit button is disabled until allFilled is true, meaning every box has non-whitespace content; there is no onSubmit callback prop, and the <form> calls e.preventDefault(), so submission is inert and wiring the actual restore action is left to the integrator.
  • Entered words live only in internal useState and are never lifted out or exposed via a change handler, so the parent cannot read the phrase.
  • The grid is grid-cols-2 on mobile and sm:grid-cols-3 from the small breakpoint up; each box carries a numbered InputGroupAddon, font-mono text, and autoComplete="off", autoCapitalize="none", spellCheck={false}.
  • heading, description, labels.helper, labels.submit, and backLink are each conditionally rendered, so omitting any of them removes its element entirely rather than showing a blank.
  • The section is min-h-screen, so the block always fills the full viewport height regardless of content.

Wiring the form up

This block ships the form markup only; state, validation, and submit are yours to add. Our guide wires the shadcn Field primitives to React Hook Form, TanStack Form, and Formisch on one field system.

More Auth blocks

View all Auth
PRO

auth22

Recovery Codes

FREE

auth4

Forgot Password Request

PRO

auth8

Welcome Back Unlock

Get Pro access