Skip to content
SLICES / TECHNICAL FOLIO Nº 001FULL-STACK ASSEMBLIES — OPEN SOURCE

Headless / Authentication

Sign in

Authenticate with a password, a code, or a social account. Supply your own elements while the parts handle the flow.

55 public parts · 4examples

@slices.sh/auth/headlessView as Markdown ↗

Your design. Our behavior.

Explore the tree to see what each part controls. Gates reveal the relevant state; roots outline their scope.

Behavior / inputGateGenericRenderer · not headlessScope
COMPONENT ANATOMYHover · focus · tap
ONE POSSIBLE DESIGNStatic preview

SignIn.Root · Scope

SignIn.RootStep gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Installation

Choose what your component needs. Run these commands in an initialized Next.js app.

0

Before you start

The steps below run in a Next.js app with shadcn set up (it has a components.json). In an existing Next.js app, such as one from create-next-app, set shadcn up first:

npx shadcn@latest init -t next -b base -p nova

Or start fresh: the slices CLI creates the app and sets it up.

npx slices.sh install
1

Install the service registry

Adds services/index.ts, which import "@/services" loads. A provider setup writes the same file, so skip this if your app has one.

npx add services
2

Install the headless library

npm

Add the React parts to your app, then compose them with your own elements.

npm install @slices.sh/auth@^0.1.10

Import from @slices.sh/auth/headless.

3

Install the service

Connect the parts to a provider. Skip this step if this service is already configured in your app.

Provider
Database
Authentication methods
Account capabilities
npx add auth.betterauth --auth-methods google

Adds service configuration and API routes to your app, with the provider dependencies. For a headless composition, add import "@/services" after "use client".

The slices CLI installs the service and provisions its required resources in one command.

Set BETTER_AUTH_URL to your app origin. Memory is for local development; use a persistent database for deployment. Neon and Supabase also require the migration script printed by the installer.

Provider setup notes
  • BETTER_AUTH_SECRET signs every session and is generated into .env.local while this installs (32 random bytes, base64, nothing leaves the machine). Changing it signs everyone out; in production set the same one on every instance.
  • The public origin (OAuth callbacks, the passkey domain) is the one each request comes to in development, and the deployment's own on Vercel. Elsewhere, or behind a proxy or a custom domain, set BETTER_AUTH_URL, such as https://acme.com.

Start small

Parts bring the behavior. Use their default elements, or supply your own with render.

example.tsx
"use client"// services/index.ts comes from https://slices.sh/r/services.json (or any provider setup)import "@/services"import { SignIn, User } from "@slices.sh/auth/headless"export function Example() {  return (    <SignIn.Root>      <User.SignedOut>        <SignIn.OAuth provider="google">Continue with Google</SignIn.OAuth>      </User.SignedOut>      <User.SignedIn>        <User.Image          render={<img className="rounded-md" alt="Your avatar" />}        />        <p>          Signed in as <User.Email />        </p>        <User.SignOut>Sign out</User.SignOut>      </User.SignedIn>    </SignIn.Root>  )}

Enable google in the auth methods below, then provision AuthLocker. OAuth and SignOut already render buttons.

API reference

Every public part used by this experience is listed below. Gates render children without adding an element. Element parts accept native element props and render; function children receive the state declared in their props. Scopes provide context rather than a visual element.

SignIn.IdentifierStagegate

IdentifierStage gates on stage="identify" | "method" in the identifier-first flow and renders both in the other. Continue checks the address and moves on, focusing the field when it is not valid. IdentifierPill shows { email } and goes back to change it. SignUpLink is the host's registration link, and nothing without password support.

Required scope

SignIn.IdentifierStage must be inside <SignIn.Root>.

Props

3 documented props

SignIn.IdentifierStage props
PropTypeDefault
stageRequired
"identify" | "method"—
children

Content rendered inside this part.

ReactNode—
render
ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.IdentifierStage from @slices.sh/auth/headless/sign-in
  • SignIn.IdentifierStage from @slices.sh/auth/headless/passkeys
  • SignIn.IdentifierStage from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/identifier-stage.tsx

SignIn.IdentifierPillaction · <button>

IdentifierStage gates on stage="identify" | "method" in the identifier-first flow and renders both in the other. Continue checks the address and moves on, focusing the field when it is not valid. IdentifierPill shows { email } and goes back to change it. SignUpLink is the host's registration link, and nothing without password support.

Required scope

SignIn.IdentifierPill must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.IdentifierPill props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { email: string }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.IdentifierPill from @slices.sh/auth/headless/sign-in
  • SignIn.IdentifierPill from @slices.sh/auth/headless/passkeys
  • SignIn.IdentifierPill from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/identifier-pill.tsx

SignIn.Continueaction · <button>

IdentifierStage gates on stage="identify" | "method" in the identifier-first flow and renders both in the other. Continue checks the address and moves on, focusing the field when it is not valid. IdentifierPill shows { email } and goes back to change it. SignUpLink is the host's registration link, and nothing without password support.

Required scope

SignIn.Continue must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.Continue props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Continue from @slices.sh/auth/headless/sign-in
  • SignIn.Continue from @slices.sh/auth/headless/passkeys
  • SignIn.Continue from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/continue.tsx

SignIn.Viewportcontent · <div>

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Props

2 documented props · Native <div> attributes supported

SignIn.Viewport props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Viewport from @slices.sh/auth/headless/sign-in
  • SignIn.Viewport from @slices.sh/auth/headless/passkeys
  • SignIn.Viewport from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/viewport.tsx

SignIn.CodeFeedbackcontent · <div>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Props

2 documented props · Native <div> attributes supported

SignIn.CodeFeedback props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.CodeFeedback from @slices.sh/auth/headless/sign-in
  • SignIn.CodeFeedback from @slices.sh/auth/headless/passkeys
  • SignIn.CodeFeedback from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/code-feedback.tsx

SignIn.RetryAftercontent · <p>

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Props

2 documented props · Native <p> attributes supported

SignIn.RetryAfter props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { seconds: number }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.RetryAfter from @slices.sh/auth/headless/sign-in
  • SignIn.RetryAfter from @slices.sh/auth/headless/passkeys
  • SignIn.RetryAfter from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/retry-after.tsx

SignIn.LastUsedcontent · <span>

A label for a supported method that previously completed a login in this browser.

Capability: methods: oauth

Props

3 documented props · Native <span> attributes supported

SignIn.LastUsed props
PropTypeDefault
methodRequired
OAuthProvider | "passkey"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.LastUsed from @slices.sh/auth/headless/sign-in
  • SignIn.LastUsed from @slices.sh/auth/headless/passkeys
  • SignIn.LastUsed from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/last-used.tsx

SignIn.CapsLockcontent · <p>

Password is <input type="password" autocomplete="current-password"> with { invalid }. RevealPassword toggles visibility with { visible }. CapsLock is <p role="status"> with { active }: keep it mounted and return empty content while inactive. PasswordStrength, StrengthSegment, PasswordFeedback and PasswordRequirement describe a new password, here the one set by a reset. PasswordSubmit is disabled until the address is valid and a password is typed.

Capability: methods: password

Required scope

CapsLock must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <p> attributes supported

SignIn.CapsLock props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { active: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • CapsLock from @slices.sh/auth/headless/password-settings
  • SignIn.CapsLock from @slices.sh/auth/headless/sign-in
  • SignIn.CapsLock from @slices.sh/auth/headless/passkeys
  • SignIn.CapsLock from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/caps-lock.tsx

SignIn.ChallengeTitlecontent · <h2>

`inTerminal`: development with nothing set up to send codes; the code was printed where the app runs.

Capability: methods: email-code or phone-code

Required scope

ChallengeTitle needs SignIn.Root or SignUp.Root.

Props

2 documented props · Native <h2> attributes supported

SignIn.ChallengeTitle props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { multiple: boolean; channel: "email" | "sms"; inTerminal: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ChallengeTitle from @slices.sh/auth/headless/sign-in
  • SignIn.ChallengeTitle from @slices.sh/auth/headless/passkeys
  • SignIn.ChallengeTitle from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/challenge-title.tsx

SignIn.Providerscontent · <div>

OAuth is <button type="button"> with { pending }, provider="google" | "github" and callbackURL; it renders nothing for a provider the backend lacks. Providers wraps them, sets data-layout to full or icons (layout="auto" switches to icons above three), and renders nothing when none is offered. LastUsed marks the method that last signed in from this browser. MethodSeparator renders only when a method before it and one after it are both offered.

Capability: methods: oauth

Props

4 documented props · Native <div> attributes supported

SignIn.Providers props
PropTypeDefault
providersRequired
readonly OAuthProvider[]—
layout
"auto" | "full" | "icons""auto"
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Providers from @slices.sh/auth/headless/sign-in
  • SignIn.Providers from @slices.sh/auth/headless/passkeys
  • SignIn.Providers from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/providers.tsx

SignIn.MethodSeparatorcontent · <div>

OAuth is <button type="button"> with { pending }, provider="google" | "github" and callbackURL; it renders nothing for a provider the backend lacks. Providers wraps them, sets data-layout to full or icons (layout="auto" switches to icons above three), and renders nothing when none is offered. LastUsed marks the method that last signed in from this browser. MethodSeparator renders only when a method before it and one after it are both offered.

Capability: methods: oauth

Required scope

MethodSeparator needs SignIn.Root or SignUp.Root.

Props

4 documented props · Native <div> attributes supported

SignIn.MethodSeparator props
PropTypeDefault
beforeRequired
readonly Method[]—
after
"passkey" | "channels""channels"
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.MethodSeparator from @slices.sh/auth/headless/sign-in
  • SignIn.MethodSeparator from @slices.sh/auth/headless/passkeys
  • SignIn.MethodSeparator from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/method-separator.tsx

SignIn.ChallengeChannelcontent

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

ChallengeChannel needs SignIn.Root or SignUp.Root.

Props

3 documented props

SignIn.ChallengeChannel props
PropTypeDefault
channelRequired
"email" | "sms"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ChallengeChannel from @slices.sh/auth/headless/sign-in
  • SignIn.ChallengeChannel from @slices.sh/auth/headless/passkeys
  • SignIn.ChallengeChannel from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/challenge-channel.tsx

SignIn.ChallengeInputinput · <input>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

ChallengeInput needs SignIn.Root or SignUp.Root.

Props

2 documented props · Native <input> attributes supported

SignIn.ChallengeInput props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ChallengeInput from @slices.sh/auth/headless/sign-in
  • SignIn.ChallengeInput from @slices.sh/auth/headless/passkeys
  • SignIn.ChallengeInput from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/challenge-input.tsx

SignIn.Rootscope

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Props

7 documented props

SignIn.Root props
PropTypeDefault
onSignedIn
(destination: string) => void—
channels
readonly OtpChannel[]—
flow
"identifier-first" | "all-methods""identifier-first"
emailPassword
boolean—
config

The auth config, a slug from the registry (services/auth/<config>.config.ts). The nearest root's, else "default", when left out.

string—
enabled

Left out or true: required, and missing auth throws. "optional": renders its children and every part inside degrades without auth. false: off. A capability name such as "methods: password": requires auth with it.

Enabled—
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Root from @slices.sh/auth/headless/sign-in
  • SignIn.Root from @slices.sh/auth/headless/passkeys
  • SignIn.Root from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/root.tsx

SignIn.ChannelPanelcontent · <div>

Base UI tabs between the email and SMS channels. Channels is the tabs root, ChannelList the tab list, ChannelTrigger channel="email" | "sms" one tab, ChannelPanel its panel. Unavailable channels render nothing, and with one channel the list disappears. Switching keeps what was typed in each.

Required scope

SignIn.ChannelPanel must be inside a sign-in or sign-up Root.

Props

3 documented props · Native <div> attributes supported

SignIn.ChannelPanel props
PropTypeDefault
channelRequired
"email" | "sms"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ChannelPanel from @slices.sh/auth/headless/sign-in
  • SignIn.ChannelPanel from @slices.sh/auth/headless/passkeys
  • SignIn.ChannelPanel from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/channel-panel.tsx

SignIn.ChannelTriggeraction · <button>

Base UI tabs between the email and SMS channels. Channels is the tabs root, ChannelList the tab list, ChannelTrigger channel="email" | "sms" one tab, ChannelPanel its panel. Unavailable channels render nothing, and with one channel the list disappears. Switching keeps what was typed in each.

Required scope

SignIn.ChannelTrigger must be inside a sign-in or sign-up Root.

Props

3 documented props · Native <button> attributes supported

SignIn.ChannelTrigger props
PropTypeDefault
channelRequired
"email" | "sms"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ChannelTrigger from @slices.sh/auth/headless/sign-in
  • SignIn.ChannelTrigger from @slices.sh/auth/headless/passkeys
  • SignIn.ChannelTrigger from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/channel-trigger.tsx

SignIn.ChannelListcontent · <div>

Base UI tabs between the email and SMS channels. Channels is the tabs root, ChannelList the tab list, ChannelTrigger channel="email" | "sms" one tab, ChannelPanel its panel. Unavailable channels render nothing, and with one channel the list disappears. Switching keeps what was typed in each.

Required scope

SignIn.ChannelList must be inside a sign-in or sign-up Root.

Props

2 documented props · Native <div> attributes supported

SignIn.ChannelList props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ChannelList from @slices.sh/auth/headless/sign-in
  • SignIn.ChannelList from @slices.sh/auth/headless/passkeys
  • SignIn.ChannelList from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/channel-list.tsx

SignIn.Channelscontent · <div>

Base UI tabs between the email and SMS channels. Channels is the tabs root, ChannelList the tab list, ChannelTrigger channel="email" | "sms" one tab, ChannelPanel its panel. Unavailable channels render nothing, and with one channel the list disappears. Switching keeps what was typed in each.

Required scope

SignIn.Channels must be inside a sign-in or sign-up Root.

Props

2 documented props · Native <div> attributes supported

SignIn.Channels props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Channels from @slices.sh/auth/headless/sign-in
  • SignIn.Channels from @slices.sh/auth/headless/passkeys
  • SignIn.Channels from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/channels.tsx

SignIn.Stepgate

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Props

3 documented props

SignIn.Step props
PropTypeDefault
nameRequired
"identify" | "reset-request" | "reset-code" | "reset" | "code" | "two-factor" | "locked" | "expired" | "signed-in"—
children

Content rendered inside this part.

ReactNode—
render
ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Step from @slices.sh/auth/headless/sign-in
  • SignIn.Step from @slices.sh/auth/headless/passkeys
  • SignIn.Step from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/step.tsx

SignIn.Statuscontent · <p>

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Required scope

Status must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <p> attributes supported

SignIn.Status props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean; attempts: StatusAttempts | null }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Status from @slices.sh/auth/headless/sign-in
  • SignIn.Status from @slices.sh/auth/headless/passkeys
  • SignIn.Status from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/status.tsx

SignIn.Formaction · <form>

Form prevents the page submit, holds one submitting part, and gives { pending } while any sign-in action runs. Label takes field="email" | "phone" | "password" | "code" | "two-factor-code" | "trust-device" and locks htmlFor. Email is <input type="email" autocomplete="email"> with { invalid }, and nothing without passwords or email codes. EmailSuggestion offers a corrected domain without submitting; OpenInbox links to the person's mail provider after an email challenge.

Required scope

Form must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <form> attributes supported

SignIn.Form props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Form from @slices.sh/auth/headless/sign-in
  • SignIn.Form from @slices.sh/auth/headless/passkeys
  • SignIn.Form from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/form.tsx

SignIn.Labelcontent · <label>

Form prevents the page submit, holds one submitting part, and gives { pending } while any sign-in action runs. Label takes field="email" | "phone" | "password" | "code" | "two-factor-code" | "trust-device" and locks htmlFor. Email is <input type="email" autocomplete="email"> with { invalid }, and nothing without passwords or email codes. EmailSuggestion offers a corrected domain without submitting; OpenInbox links to the person's mail provider after an email challenge.

Required scope

Label field=

Props

3 documented props · Native <label> attributes supported

SignIn.Label props
PropTypeDefault
fieldRequired
LabelField—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Label from @slices.sh/auth/headless/sign-in
  • SignIn.Label from @slices.sh/auth/headless/passkeys
  • SignIn.Label from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/label.tsx

SignIn.Emailinput · <input>

Form prevents the page submit, holds one submitting part, and gives { pending } while any sign-in action runs. Label takes field="email" | "phone" | "password" | "code" | "two-factor-code" | "trust-device" and locks htmlFor. Email is <input type="email" autocomplete="email"> with { invalid }, and nothing without passwords or email codes. EmailSuggestion offers a corrected domain without submitting; OpenInbox links to the person's mail provider after an email challenge.

Required scope

Email must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.Email props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Email from @slices.sh/auth/headless/sign-in
  • SignIn.Email from @slices.sh/auth/headless/passkeys
  • SignIn.Email from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/email.tsx

SignIn.OpenInboxcontent · <a>

Form prevents the page submit, holds one submitting part, and gives { pending } while any sign-in action runs. Label takes field="email" | "phone" | "password" | "code" | "two-factor-code" | "trust-device" and locks htmlFor. Email is <input type="email" autocomplete="email"> with { invalid }, and nothing without passwords or email codes. EmailSuggestion offers a corrected domain without submitting; OpenInbox links to the person's mail provider after an email challenge.

Required scope

OpenInbox requires SignIn.Root or SignUp.Root.

Props

2 documented props · Native <a> attributes supported

SignIn.OpenInbox props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { name: string }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.OpenInbox from @slices.sh/auth/headless/sign-in
  • SignIn.OpenInbox from @slices.sh/auth/headless/passkeys
  • SignIn.OpenInbox from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/open-inbox.tsx

SignIn.EmailSuggestionaction · <button>

Form prevents the page submit, holds one submitting part, and gives { pending } while any sign-in action runs. Label takes field="email" | "phone" | "password" | "code" | "two-factor-code" | "trust-device" and locks htmlFor. Email is <input type="email" autocomplete="email"> with { invalid }, and nothing without passwords or email codes. EmailSuggestion offers a corrected domain without submitting; OpenInbox links to the person's mail provider after an email challenge.

Required scope

EmailSuggestion requires SignIn.Root or SignUp.Root.

Props

2 documented props · Native <button> attributes supported

SignIn.EmailSuggestion props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { suggestion: string }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.EmailSuggestion from @slices.sh/auth/headless/sign-in
  • SignIn.EmailSuggestion from @slices.sh/auth/headless/passkeys
  • SignIn.EmailSuggestion from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/email-suggestion.tsx

SignIn.PhoneRootscope

The phone number and its country list, kept in the card's phone field as an E.164 number or as nothing at all. Renders nothing itself, and nothing inside it when the backend sends no codes by text. The card's field keeps the id, so its label and the focus a refused send asks for find the number's input without knowing a country list is there.

Capability: methods: phone-code

Required scope

SignIn.PhoneRoot must be inside <SignIn.Root> or <SignUp.Root>.

Props

4 documented props

SignIn.PhoneRoot props
PropTypeDefault
defaultCountry

Where a number typed without a + is read until a country is picked. ISO 3166-1 alpha-2.

string—
allowedCountries

The countries a number may be in, which are also the ones the list offers. Without it, every country.

readonly string[]—
locale
string—
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.PhoneRoot from @slices.sh/auth/headless/sign-in
  • SignIn.PhoneRoot from @slices.sh/auth/headless/passkeys
  • SignIn.PhoneRoot from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/phone-root.tsx

SignIn.Phoneinput · <input>

The number, typed in its country's own format. It sits inside `SignIn.PhoneRoot`, which is where the country list is too, and says "invalid" for the refusals the number's own reading cannot know about.

Capability: methods: phone-code

Required scope

Phone must be inside <SignIn.Root> or <SignUp.Root>.

Props

3 documented props · Native <input> attributes supported

SignIn.Phone props
PropTypeDefault
invalidMessage
string—
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean; status: PhoneStatus }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Phone from @slices.sh/auth/headless/sign-in
  • SignIn.Phone from @slices.sh/auth/headless/passkeys
  • SignIn.Phone from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/sign-in-phone.tsx

SignIn.Passwordinput · <input>

Password is <input type="password" autocomplete="current-password"> with { invalid }. RevealPassword toggles visibility with { visible }. CapsLock is <p role="status"> with { active }: keep it mounted and return empty content while inactive. PasswordStrength, StrengthSegment, PasswordFeedback and PasswordRequirement describe a new password, here the one set by a reset. PasswordSubmit is disabled until the address is valid and a password is typed.

Capability: methods: password

Required scope

SignIn.Password must be inside <SignIn.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.Password props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Password from @slices.sh/auth/headless/sign-in
  • SignIn.Password from @slices.sh/auth/headless/passkeys
  • SignIn.Password from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/password.tsx

SignIn.RevealPasswordaction · <button>

Shows or hides what was typed into the password field. No `aria-pressed`: its own name changes, and a button announced as "Hide password, pressed" says the same thing twice in opposite directions.

Capability: methods: password

Required scope

SignIn.RevealPassword must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.RevealPassword props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { visible: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Reveal from @slices.sh/auth/headless/password-settings
  • SignIn.RevealPassword from @slices.sh/auth/headless/sign-in
  • SignIn.RevealPassword from @slices.sh/auth/headless/passkeys
  • SignIn.RevealPassword from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reveal-password.tsx

SignIn.PasswordSubmitaction · <button>

Password is <input type="password" autocomplete="current-password"> with { invalid }. RevealPassword toggles visibility with { visible }. CapsLock is <p role="status"> with { active }: keep it mounted and return empty content while inactive. PasswordStrength, StrengthSegment, PasswordFeedback and PasswordRequirement describe a new password, here the one set by a reset. PasswordSubmit is disabled until the address is valid and a password is typed.

Capability: methods: password

Required scope

SignIn.PasswordSubmit must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.PasswordSubmit props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.PasswordSubmit from @slices.sh/auth/headless/sign-in
  • SignIn.PasswordSubmit from @slices.sh/auth/headless/passkeys
  • SignIn.PasswordSubmit from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/password-submit.tsx

SignIn.OAuthaction · <button>

OAuth is <button type="button"> with { pending }, provider="google" | "github" and callbackURL; it renders nothing for a provider the backend lacks. Providers wraps them, sets data-layout to full or icons (layout="auto" switches to icons above three), and renders nothing when none is offered. LastUsed marks the method that last signed in from this browser. MethodSeparator renders only when a method before it and one after it are both offered.

Capability: methods: oauth

Required scope

OAuth must be inside <SignIn.Root> or <SignUp.Root>.

Props

4 documented props · Native <button> attributes supported

SignIn.OAuth props
PropTypeDefault
providerRequired
OAuthProvider—
callbackURL

Where the provider sends the person back; the backend's default when left out.

string—
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.OAuth from @slices.sh/auth/headless/sign-in
  • SignIn.OAuth from @slices.sh/auth/headless/passkeys
  • SignIn.OAuth from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/oauth.tsx

SignIn.SendCodeaction · <button>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

SendCode must be inside <SignIn.Root> or <SignUp.Root>.

Props

3 documented props · Native <button> attributes supported

SignIn.SendCode props
PropTypeDefault
channel
"email" | "sms""email"
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean; cooldown: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.SendCode from @slices.sh/auth/headless/sign-in
  • SignIn.SendCode from @slices.sh/auth/headless/passkeys
  • SignIn.SendCode from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/send-code.tsx

SignIn.Destinationcontent

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

Destination must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props

SignIn.Destination props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Destination from @slices.sh/auth/headless/sign-in
  • SignIn.Destination from @slices.sh/auth/headless/passkeys
  • SignIn.Destination from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/destination.tsx

SignIn.CodeInputinput · <input>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

CodeInput must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.CodeInput props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.CodeInput from @slices.sh/auth/headless/sign-in
  • SignIn.CodeInput from @slices.sh/auth/headless/passkeys
  • SignIn.CodeInput from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/code-input.tsx

SignIn.VerifyCodeaction · <button>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

VerifyCode must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.VerifyCode props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.VerifyCode from @slices.sh/auth/headless/sign-in
  • SignIn.VerifyCode from @slices.sh/auth/headless/passkeys
  • SignIn.VerifyCode from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/verify-code.tsx

SignIn.Verifyinggate

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

Verifying must be inside <SignIn.Root> or <SignUp.Root>.

Props

1 documented props

SignIn.Verifying props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Verifying from @slices.sh/auth/headless/sign-in
  • SignIn.Verifying from @slices.sh/auth/headless/passkeys
  • SignIn.Verifying from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/verifying.tsx

SignIn.ResendCodeaction · <button>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

ResendCode must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.ResendCode props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { seconds: number; pending: boolean; exhausted: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResendCode from @slices.sh/auth/headless/sign-in
  • SignIn.ResendCode from @slices.sh/auth/headless/passkeys
  • SignIn.ResendCode from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/resend-code.tsx

SignIn.AttemptsRemainingcontent · <p>

SendCode is a submit with { pending, cooldown } and channel="email" | "sms"; it refuses and focuses the field when the address is invalid, and renders nothing without that channel. The rest render only once a code was sent. Destination is the address it went to; ChallengeTitle gets { multiple, channel }; ChallengeChannel gates on the channel; ChallengeInput shows the address read-only. CodeInput is a numeric one-time-code input with maxLength locked, verifying once complete; VerifyCode is for a pasted code; Verifying stands where a spinner would be. ResendCode gets { seconds, pending }. AttemptsRemaining gets { remaining, limit } after the first wrong code. CodeFeedback gets { invalid } for a wrong code.

Capability: methods: email-code or phone-code

Required scope

AttemptsRemaining must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <p> attributes supported

SignIn.AttemptsRemaining props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { remaining: number; limit: number }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.AttemptsRemaining from @slices.sh/auth/headless/sign-in
  • SignIn.AttemptsRemaining from @slices.sh/auth/headless/passkeys
  • SignIn.AttemptsRemaining from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/attempts-remaining.tsx

SignIn.Restartaction · <button>

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Required scope

Restart must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.Restart props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Restart from @slices.sh/auth/headless/sign-in
  • SignIn.Restart from @slices.sh/auth/headless/passkeys
  • SignIn.Restart from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/restart.tsx

SignIn.Errorcontent · <div>

Step gates on name and accepts render={<MotionPanel />} to animate; without render it is a wrapper-free gate. Status is the one polite live region, mounted for the card's life, that speaks waits and the attempt budget. Viewport is a plain container for animated steps. Error is <div role="alert"> with { code, message }, only for the current step's last failed action. RetryAfter gets { seconds } while a rate limit holds. Restart returns to identify and drops the challenge.

Props

2 documented props · Native <div> attributes supported

SignIn.Error props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { code: AuthErrorCode; message: string }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.Error from @slices.sh/auth/headless/sign-in
  • SignIn.Error from @slices.sh/auth/headless/passkeys
  • SignIn.Error from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/error.tsx

Authentication.Rootscope

Mode gates on name="sign-in" | "sign-up", so the hidden flow is unmounted, not hidden. Switch is a button with to="sign-in" | "sign-up", and renders nothing in the flow it points to.

Props

5 documented props

Authentication.Root props
PropTypeDefault
defaultMode
"sign-in" | "sign-up""sign-in"
allowSignUp
booleantrue
config

The auth config, a slug from the registry (services/auth/<config>.config.ts). The nearest root's, else "default", when left out.

string—
enabled

Left out or true: required, and missing auth throws. "optional": renders its children and every part inside degrades without auth. false: off. A capability name such as "methods: password": requires auth with it.

Enabled—
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Authentication.Root from @slices.sh/auth/headless/authentication

Source: @slices.sh/auth/src/headless/authentication/root.tsx

Authentication.Modegate

Mode gates on name="sign-in" | "sign-up", so the hidden flow is unmounted, not hidden. Switch is a button with to="sign-in" | "sign-up", and renders nothing in the flow it points to.

Required scope

Authentication.Mode must be inside <Authentication.Root>.

Props

2 documented props

Authentication.Mode props
PropTypeDefault
nameRequired
"sign-in" | "sign-up"—
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Authentication.Mode from @slices.sh/auth/headless/authentication

Source: @slices.sh/auth/src/headless/authentication/mode.tsx

Authentication.Switchaction · <button>

The way across: "Don't have an account? Sign up", and back again. A button rather than a link, because both flows are this one page. An installed app that keeps `/sign-in` and `/sign-up` as two routes links between them instead, and drops this.

Required scope

Authentication.Switch must be inside <Authentication.Root>.

Props

3 documented props · Native <button> attributes supported

Authentication.Switch props
PropTypeDefault
toRequired
"sign-in" | "sign-up"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Authentication.Switch from @slices.sh/auth/headless/authentication

Source: @slices.sh/auth/src/headless/authentication/switch.tsx

Authentication.SignUpAvailablegate

Keep the entire invitation out of the screen when password registration is unavailable.

Capability: methods: password

Required scope

Authentication.SignUpAvailable must be inside <Authentication.Root>.

Props

1 documented props

Authentication.SignUpAvailable props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Authentication.SignUpAvailable from @slices.sh/auth/headless/authentication

Source: @slices.sh/auth/src/headless/authentication/sign-up-available.tsx

User.SignedOutgate

SignedIn and SignedOut open once the session has answered, so nobody flashes signed out. Loading covers the first load only. SessionExpired opens when the session on screen has run out while its name and picture are still shown. ReadError is <p role="alert"> with { message } when the session could not be read, and Retry reads it again.

Props

1 documented props

User.SignedOut props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • User.SignedOut from @slices.sh/auth/headless/user
  • User.SignedOut from @slices.sh/auth/headless/passkeys
  • User.SignedOut from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/user/signed-out.tsx

SignIn.Passkeyaction · <button>

Passkey is <button type="button"> with { pending }; it runs the ceremony on click and renders nothing where the backend or the browser cannot. PasskeyAutofill renders no element: it starts conditional mediation once, on mount, so the passkey is offered in the autofill list under the email field. A ceremony that ends without a credential is remembered, and Passkeys.SetupPrompt offers one after sign-in.

Capability: methods: passkey

Required scope

SignIn.Passkey must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.Passkey props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/passkeys/sign-in/passkey.tsx

SignIn.PasskeyAutofillgate

Starts the passkey ceremony the browser runs from the identifier field itself. Renders nothing: conditional mediation has no button, which is the point — the passkey is offered in the autofill list under the email field, and the ceremony finishes as soon as one is picked. It runs once, on mount, and only where the browser said it can, because `startAuthentication` with autofill throws in a browser that cannot serve it. The ceremony is owned here rather than by the pattern, which calls no hook of its own.

Capability: methods: passkey

Required scope

SignIn.PasskeyAutofill must be inside <SignIn.Root>.

Props

1 documented props

SignIn.PasskeyAutofill props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/passkeys/sign-in/passkey-autofill.tsx

SignIn.SecondFactorgate

One second factor or the other. The backup-code side renders nothing at all where the backend cannot redeem one, so a lost authenticator is never offered a way out that this deployment does not have.

Capability: two-factor

Required scope

SignIn.SecondFactor must be inside <SignIn.Root>.

Props

2 documented props

SignIn.SecondFactor props
PropTypeDefault
factorRequired
"authenticator" | "backup-code"—
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/second-factor.tsx

SignIn.ChooseSecondFactoraction · <button>

Switches to the other second factor, and is absent when there is no other to switch to.

Capability: two-factor

Required scope

SignIn.ChooseSecondFactor must be inside <SignIn.Root>.

Props

3 documented props · Native <button> attributes supported

SignIn.ChooseSecondFactor props
PropTypeDefault
factorRequired
"authenticator" | "backup-code"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/choose-second-factor.tsx

SignIn.TwoFactorCodeinput · <input>

SecondFactor is a gate with factor="authenticator" | "backup-code": one is on screen at a time, so each gets its own form and Enter works. ChooseSecondFactor switches to the other factor and renders nothing when there is no other. TwoFactorCode is a numeric one-time-code input, read-only while it is checked, and takes focus when the step opens. TrustDevice is a checkbox, unticked again after Restart. VerifyTwoFactor submits, disabled until a code is typed.

Capability: two-factor

Required scope

SignIn.TwoFactorCode must be inside <SignIn.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.TwoFactorCode props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/two-factor-code.tsx

SignIn.BackupCodeinput · <input>

BackupCode is the input for one recovery code, with no one-time-code token so a password manager does not offer the last SMS. VerifyBackupCode submits it. The backup-code side of SecondFactor renders nothing where the backend cannot redeem one.

Capability: backup-codes

Required scope

SignIn.BackupCode must be inside <SignIn.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.BackupCode props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/backup-code.tsx

SignIn.VerifyBackupCodeaction · <button>

BackupCode is the input for one recovery code, with no one-time-code token so a password manager does not offer the last SMS. VerifyBackupCode submits it. The backup-code side of SecondFactor renders nothing where the backend cannot redeem one.

Capability: backup-codes

Required scope

SignIn.VerifyBackupCode must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.VerifyBackupCode props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/verify-backup-code.tsx

SignIn.TrustDeviceinput · <input>

SecondFactor is a gate with factor="authenticator" | "backup-code": one is on screen at a time, so each gets its own form and Enter works. ChooseSecondFactor switches to the other factor and renders nothing when there is no other. TwoFactorCode is a numeric one-time-code input, read-only while it is checked, and takes focus when the step opens. TrustDevice is a checkbox, unticked again after Restart. VerifyTwoFactor submits, disabled until a code is typed.

Capability: two-factor

Required scope

SignIn.TrustDevice must be inside <SignIn.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.TrustDevice props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { checked: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/trust-device.tsx

SignIn.VerifyTwoFactoraction · <button>

SecondFactor is a gate with factor="authenticator" | "backup-code": one is on screen at a time, so each gets its own form and Enter works. ChooseSecondFactor switches to the other factor and renders nothing when there is no other. TwoFactorCode is a numeric one-time-code input, read-only while it is checked, and takes focus when the step opens. TrustDevice is a checkbox, unticked again after Restart. VerifyTwoFactor submits, disabled until a code is typed.

Capability: two-factor

Required scope

SignIn.VerifyTwoFactor must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.VerifyTwoFactor props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Source: @slices.sh/auth/src/headless/two-factor/sign-in/verify-two-factor.tsx

SignIn.ForgotPasswordaction · <button>

Asks for the reset screen. Absent unless the backend can actually put a link in front of somebody: a "Forgot password?" that leads nowhere is worse than none at all. `stage="identify"` is for the link under the email field of an identifier-first card: it is there only while that step is drawn. Where the email and the password stand together there is no such step, and the password field's own link is the only one.

Capability: password-reset

Required scope

SignIn.ForgotPassword must be inside <SignIn.Root>.

Props

3 documented props · Native <button> attributes supported

SignIn.ForgotPassword props
PropTypeDefault
stage
"identify"—
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ForgotPassword from @slices.sh/auth/headless/sign-in
  • SignIn.ForgotPassword from @slices.sh/auth/headless/passkeys
  • SignIn.ForgotPassword from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/forgot-password.tsx

SignIn.ResetMethodgate

How this install replaces a forgotten password: a link to the inbox, or a code to type. A gate, because the two are different screens rather than one screen with a different sentence — a link is followed away and comes back with a token, a code is typed here — and only the backend knows which it can deliver.

Capability: password-reset

Required scope

SignIn.ResetMethod must be inside <SignIn.Root>.

Props

2 documented props

SignIn.ResetMethod props
PropTypeDefault
methodRequired
"link" | "code"—
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResetMethod from @slices.sh/auth/headless/sign-in
  • SignIn.ResetMethod from @slices.sh/auth/headless/passkeys
  • SignIn.ResetMethod from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reset-method.tsx

SignIn.RequestResetaction · <button>

ForgotPassword opens the reset steps, and nothing unless the backend can deliver a link or a code. ResetMethod gates on method="link" | "code". RequestReset sends it with { pending, method }; ResetSent says it went, the same for any address. ResetDestination, ResetCodeInput and ResendResetCode are the code variant. ResetUnused gates while a link is unspent; NewPassword and SubmitReset set the password; ResetDone follows. BackToSignIn leaves and drops the token from the address bar.

Capability: password-reset

Required scope

SignIn.RequestReset must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.RequestReset props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean; method: "link" | "code" }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.RequestReset from @slices.sh/auth/headless/sign-in
  • SignIn.RequestReset from @slices.sh/auth/headless/passkeys
  • SignIn.RequestReset from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/request-reset.tsx

SignIn.ResetSentgate

ForgotPassword opens the reset steps, and nothing unless the backend can deliver a link or a code. ResetMethod gates on method="link" | "code". RequestReset sends it with { pending, method }; ResetSent says it went, the same for any address. ResetDestination, ResetCodeInput and ResendResetCode are the code variant. ResetUnused gates while a link is unspent; NewPassword and SubmitReset set the password; ResetDone follows. BackToSignIn leaves and drops the token from the address bar.

Capability: password-reset

Required scope

SignIn.ResetSent must be inside <SignIn.Root>.

Props

1 documented props

SignIn.ResetSent props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { delivery: "mail" | "terminal" | "log" }) => ReactNode)—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResetSent from @slices.sh/auth/headless/sign-in
  • SignIn.ResetSent from @slices.sh/auth/headless/passkeys
  • SignIn.ResetSent from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reset-sent.tsx

SignIn.BackToSignInaction · <button>

Leaves the reset screens. It drops the token as well as the intent, which is what takes a live credential out of the address bar once it has been spent, and the code challenge with it: coming back to a half-typed code for a reset nobody is doing any more is a screen nobody asked for.

Capability: password-reset

Required scope

SignIn.BackToSignIn must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.BackToSignIn props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.BackToSignIn from @slices.sh/auth/headless/sign-in
  • SignIn.BackToSignIn from @slices.sh/auth/headless/passkeys
  • SignIn.BackToSignIn from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/back-to-sign-in.tsx

SignIn.ResetDestinationcontent

Where the reset code went, as the backend spells it back: often masked, never guessed.

Capability: password-reset

Required scope

SignIn.ResetDestination must be inside <SignIn.Root>.

Props

2 documented props

SignIn.ResetDestination props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResetDestination from @slices.sh/auth/headless/sign-in
  • SignIn.ResetDestination from @slices.sh/auth/headless/passkeys
  • SignIn.ResetDestination from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reset-destination.tsx

SignIn.ResetCodeInputinput · <input>

The code that proves the address a reset was asked for. The same six digits as a sign-in code and a different thing entirely: a right one answers a token that sets a password, and signs nobody in. Checked the moment its last digit lands, so there is no button beside it.

Capability: password-reset

Required scope

SignIn.ResetCodeInput must be inside <SignIn.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.ResetCodeInput props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResetCodeInput from @slices.sh/auth/headless/sign-in
  • SignIn.ResetCodeInput from @slices.sh/auth/headless/passkeys
  • SignIn.ResetCodeInput from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reset-code-input.tsx

SignIn.ResendResetCodeaction · <button>

ForgotPassword opens the reset steps, and nothing unless the backend can deliver a link or a code. ResetMethod gates on method="link" | "code". RequestReset sends it with { pending, method }; ResetSent says it went, the same for any address. ResetDestination, ResetCodeInput and ResendResetCode are the code variant. ResetUnused gates while a link is unspent; NewPassword and SubmitReset set the password; ResetDone follows. BackToSignIn leaves and drops the token from the address bar.

Capability: password-reset

Required scope

SignIn.ResendResetCode must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.ResendResetCode props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { seconds: number; pending: boolean; exhausted: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResendResetCode from @slices.sh/auth/headless/sign-in
  • SignIn.ResendResetCode from @slices.sh/auth/headless/passkeys
  • SignIn.ResendResetCode from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/resend-reset-code.tsx

SignIn.ResetUnusedgate

ForgotPassword opens the reset steps, and nothing unless the backend can deliver a link or a code. ResetMethod gates on method="link" | "code". RequestReset sends it with { pending, method }; ResetSent says it went, the same for any address. ResetDestination, ResetCodeInput and ResendResetCode are the code variant. ResetUnused gates while a link is unspent; NewPassword and SubmitReset set the password; ResetDone follows. BackToSignIn leaves and drops the token from the address bar.

Capability: password-reset

Required scope

SignIn.ResetUnused must be inside <SignIn.Root>.

Props

1 documented props

SignIn.ResetUnused props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResetUnused from @slices.sh/auth/headless/sign-in
  • SignIn.ResetUnused from @slices.sh/auth/headless/passkeys
  • SignIn.ResetUnused from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reset-unused.tsx

SignIn.NewPasswordinput · <input>

The password being set by a reset, which is a new one and is announced as such.

Capability: password-reset

Required scope

SignIn.NewPassword must be inside <SignIn.Root>.

Props

2 documented props · Native <input> attributes supported

SignIn.NewPassword props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { invalid: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.NewPassword from @slices.sh/auth/headless/sign-in
  • SignIn.NewPassword from @slices.sh/auth/headless/passkeys
  • SignIn.NewPassword from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/new-password.tsx

SignIn.PasswordStrengthcontent · <div>

The meter over a new password: `data-level` is the score, 0 to 4, and absent until one is known. Absent over an empty field too. A meter that says "very weak" before anything has been typed is a screen telling somebody off for not having started.

Capability: methods: password

Required scope

PasswordStrength must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <div> attributes supported

SignIn.PasswordStrength props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { score: number | null; levels: number }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Strength from @slices.sh/auth/headless/password-settings
  • SignIn.PasswordStrength from @slices.sh/auth/headless/sign-in
  • SignIn.PasswordStrength from @slices.sh/auth/headless/passkeys
  • SignIn.PasswordStrength from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/password-strength.tsx

SignIn.StrengthSegmentcontent · <span>

One bar of the meter, repeated once per level. The count comes from the estimator's own scale rather than from the card, so a skin cannot draw five bars over a score that only goes to four.

Capability: methods: password

Required scope

StrengthSegment must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <span> attributes supported

SignIn.StrengthSegment props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { index: number; filled: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • StrengthSegment from @slices.sh/auth/headless/password-settings
  • SignIn.StrengthSegment from @slices.sh/auth/headless/sign-in
  • SignIn.StrengthSegment from @slices.sh/auth/headless/passkeys
  • SignIn.StrengthSegment from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/strength-segment.tsx

SignIn.PasswordFeedbackcontent · <p>

What the estimator would say about this password, in its own words. Its sentences come from the language pack, so they are already the person's language and are not repeated in `copy`. Absent until there is something to say: a strong password earns no advice, and an empty field has not been judged.

Capability: methods: password

Required scope

PasswordFeedback must be inside <SignIn.Root> or <SignUp.Root>.

Props

2 documented props · Native <p> attributes supported

SignIn.PasswordFeedback props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { warning: string | null; suggestions: readonly string[] }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Feedback from @slices.sh/auth/headless/password-settings
  • SignIn.PasswordFeedback from @slices.sh/auth/headless/sign-in
  • SignIn.PasswordFeedback from @slices.sh/auth/headless/passkeys
  • SignIn.PasswordFeedback from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/password-feedback.tsx

SignIn.PasswordRequirementcontent · <li>

One rule a new password has to meet, said out loud rather than discovered by being refused. The numbers are the backend's, read from the capability, so the sentence and the refusal can never disagree. `data-state` is `met` or `unmet`, which is what a skin ticks off. A rule the backend does not have is absent: a "hard to guess" line over a backend that accepts anything would be a promise nobody keeps.

Capability: methods: password

Required scope

PasswordRequirement must be inside <SignIn.Root> or <SignUp.Root>.

Props

3 documented props · Native <li> attributes supported

SignIn.PasswordRequirement props
PropTypeDefault
ruleRequired
"length" | "strength"—
children

Content rendered inside this part.

ReactNode | ((state: State) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • Requirement from @slices.sh/auth/headless/password-settings
  • SignIn.PasswordRequirement from @slices.sh/auth/headless/sign-in
  • SignIn.PasswordRequirement from @slices.sh/auth/headless/passkeys
  • SignIn.PasswordRequirement from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/password-requirement.tsx

SignIn.SubmitResetaction · <button>

ForgotPassword opens the reset steps, and nothing unless the backend can deliver a link or a code. ResetMethod gates on method="link" | "code". RequestReset sends it with { pending, method }; ResetSent says it went, the same for any address. ResetDestination, ResetCodeInput and ResendResetCode are the code variant. ResetUnused gates while a link is unspent; NewPassword and SubmitReset set the password; ResetDone follows. BackToSignIn leaves and drops the token from the address bar.

Capability: password-reset

Required scope

SignIn.SubmitReset must be inside <SignIn.Root>.

Props

2 documented props · Native <button> attributes supported

SignIn.SubmitReset props
PropTypeDefault
children

Content rendered inside this part.

ReactNode | ((state: { pending: boolean }) => ReactNode)—
render

Replace the default element with your own while retaining the part’s behavior and accessibility.

ReactElement—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.SubmitReset from @slices.sh/auth/headless/sign-in
  • SignIn.SubmitReset from @slices.sh/auth/headless/passkeys
  • SignIn.SubmitReset from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/submit-reset.tsx

SignIn.ResetDonegate

ForgotPassword opens the reset steps, and nothing unless the backend can deliver a link or a code. ResetMethod gates on method="link" | "code". RequestReset sends it with { pending, method }; ResetSent says it went, the same for any address. ResetDestination, ResetCodeInput and ResendResetCode are the code variant. ResetUnused gates while a link is unspent; NewPassword and SubmitReset set the password; ResetDone follows. BackToSignIn leaves and drops the token from the address bar.

Capability: password-reset

Required scope

SignIn.ResetDone must be inside <SignIn.Root>.

Props

1 documented props

SignIn.ResetDone props
PropTypeDefault
children

Content rendered inside this part.

ReactNode—

Required props are marked. A dash means no explicit default is declared in this component.

Alternate public imports
  • SignIn.ResetDone from @slices.sh/auth/headless/sign-in
  • SignIn.ResetDone from @slices.sh/auth/headless/passkeys
  • SignIn.ResetDone from @slices.sh/auth/headless/two-factor

Source: @slices.sh/auth/src/headless/sign-in/reset-done.tsx

When something is missing

No service configuration
Install the auth setup below and import "@/services". Required service roots report missing setup; gates do not replace that configuration.
Missing capability or parent scope
Follow each part’s context requirements and the example composition. Capability-aware controls hide when the provider cannot perform their action.
Read the setup guide →