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.
SignIn.Root · Scope
Installation
Choose what your component needs. Run these commands in an initialized Next.js app.
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 novaOr start fresh: the slices CLI creates the app and sets it up.
npx slices.sh installInstall 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 servicesInstall the headless library
npmAdd the React parts to your app, then compose them with your own elements.
npm install @slices.sh/auth@^0.1.10Import from @slices.sh/auth/headless.
Install the service
Connect the parts to a provider. Skip this step if this service is already configured in your app.
npx add auth.betterauth --auth-methods googleAdds 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.
"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
| Prop | Type | Default |
|---|---|---|
stageRequired | "identify" | "method" | — |
childrenContent 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.IdentifierStagefrom@slices.sh/auth/headless/sign-inSignIn.IdentifierStagefrom@slices.sh/auth/headless/passkeysSignIn.IdentifierStagefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { email: string }) => ReactNode) | — |
renderReplace 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.IdentifierPillfrom@slices.sh/auth/headless/sign-inSignIn.IdentifierPillfrom@slices.sh/auth/headless/passkeysSignIn.IdentifierPillfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Continuefrom@slices.sh/auth/headless/sign-inSignIn.Continuefrom@slices.sh/auth/headless/passkeysSignIn.Continuefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Viewportfrom@slices.sh/auth/headless/sign-inSignIn.Viewportfrom@slices.sh/auth/headless/passkeysSignIn.Viewportfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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.CodeFeedbackfrom@slices.sh/auth/headless/sign-inSignIn.CodeFeedbackfrom@slices.sh/auth/headless/passkeysSignIn.CodeFeedbackfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { seconds: number }) => ReactNode) | — |
renderReplace 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.RetryAfterfrom@slices.sh/auth/headless/sign-inSignIn.RetryAfterfrom@slices.sh/auth/headless/passkeysSignIn.RetryAfterfrom@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
| Prop | Type | Default |
|---|---|---|
methodRequired | OAuthProvider | "passkey" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.LastUsedfrom@slices.sh/auth/headless/sign-inSignIn.LastUsedfrom@slices.sh/auth/headless/passkeysSignIn.LastUsedfrom@slices.sh/auth/headless/two-factor
Source: @slices.sh/auth/src/headless/sign-in/last-used.tsx
SignIn.SignUpLinkcontent · <a>
The host owns the registration route; no link is offered without password support.
Props
2 documented props · Native <a> attributes supported
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.SignUpLinkfrom@slices.sh/auth/headless/sign-inSignIn.SignUpLinkfrom@slices.sh/auth/headless/passkeysSignIn.SignUpLinkfrom@slices.sh/auth/headless/two-factor
Source: @slices.sh/auth/src/headless/sign-in/sign-up-link.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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { active: boolean }) => ReactNode) | — |
renderReplace 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
CapsLockfrom@slices.sh/auth/headless/password-settingsSignIn.CapsLockfrom@slices.sh/auth/headless/sign-inSignIn.CapsLockfrom@slices.sh/auth/headless/passkeysSignIn.CapsLockfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { multiple: boolean; channel: "email" | "sms"; inTerminal: boolean }) => ReactNode) | — |
renderReplace 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.ChallengeTitlefrom@slices.sh/auth/headless/sign-inSignIn.ChallengeTitlefrom@slices.sh/auth/headless/passkeysSignIn.ChallengeTitlefrom@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
| Prop | Type | Default |
|---|---|---|
providersRequired | readonly OAuthProvider[] | — |
layout | "auto" | "full" | "icons" | "auto" |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Providersfrom@slices.sh/auth/headless/sign-inSignIn.Providersfrom@slices.sh/auth/headless/passkeysSignIn.Providersfrom@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
| Prop | Type | Default |
|---|---|---|
beforeRequired | readonly Method[] | — |
after | "passkey" | "channels" | "channels" |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.MethodSeparatorfrom@slices.sh/auth/headless/sign-inSignIn.MethodSeparatorfrom@slices.sh/auth/headless/passkeysSignIn.MethodSeparatorfrom@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
| Prop | Type | Default |
|---|---|---|
channelRequired | "email" | "sms" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ChallengeChannelfrom@slices.sh/auth/headless/sign-inSignIn.ChallengeChannelfrom@slices.sh/auth/headless/passkeysSignIn.ChallengeChannelfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ChallengeInputfrom@slices.sh/auth/headless/sign-inSignIn.ChallengeInputfrom@slices.sh/auth/headless/passkeysSignIn.ChallengeInputfrom@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
| Prop | Type | Default |
|---|---|---|
onSignedIn | (destination: string) => void | — |
channels | readonly OtpChannel[] | — |
flow | "identifier-first" | "all-methods" | "identifier-first" |
emailPassword | boolean | — |
configThe auth config, a slug from the registry ( | string | — |
enabledLeft out or | Enabled | — |
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
SignIn.Rootfrom@slices.sh/auth/headless/sign-inSignIn.Rootfrom@slices.sh/auth/headless/passkeysSignIn.Rootfrom@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
| Prop | Type | Default |
|---|---|---|
channelRequired | "email" | "sms" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ChannelPanelfrom@slices.sh/auth/headless/sign-inSignIn.ChannelPanelfrom@slices.sh/auth/headless/passkeysSignIn.ChannelPanelfrom@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
| Prop | Type | Default |
|---|---|---|
channelRequired | "email" | "sms" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ChannelTriggerfrom@slices.sh/auth/headless/sign-inSignIn.ChannelTriggerfrom@slices.sh/auth/headless/passkeysSignIn.ChannelTriggerfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ChannelListfrom@slices.sh/auth/headless/sign-inSignIn.ChannelListfrom@slices.sh/auth/headless/passkeysSignIn.ChannelListfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Channelsfrom@slices.sh/auth/headless/sign-inSignIn.Channelsfrom@slices.sh/auth/headless/passkeysSignIn.Channelsfrom@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
| Prop | Type | Default |
|---|---|---|
nameRequired | "identify" | "reset-request" | "reset-code" | "reset" | "code" | "two-factor" | "locked" | "expired" | "signed-in" | — |
childrenContent 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.Stepfrom@slices.sh/auth/headless/sign-inSignIn.Stepfrom@slices.sh/auth/headless/passkeysSignIn.Stepfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean; attempts: StatusAttempts | null }) => ReactNode) | — |
renderReplace 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.Statusfrom@slices.sh/auth/headless/sign-inSignIn.Statusfrom@slices.sh/auth/headless/passkeysSignIn.Statusfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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.Formfrom@slices.sh/auth/headless/sign-inSignIn.Formfrom@slices.sh/auth/headless/passkeysSignIn.Formfrom@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
| Prop | Type | Default |
|---|---|---|
fieldRequired | LabelField | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Labelfrom@slices.sh/auth/headless/sign-inSignIn.Labelfrom@slices.sh/auth/headless/passkeysSignIn.Labelfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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.Emailfrom@slices.sh/auth/headless/sign-inSignIn.Emailfrom@slices.sh/auth/headless/passkeysSignIn.Emailfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { name: string }) => ReactNode) | — |
renderReplace 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.OpenInboxfrom@slices.sh/auth/headless/sign-inSignIn.OpenInboxfrom@slices.sh/auth/headless/passkeysSignIn.OpenInboxfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { suggestion: string }) => ReactNode) | — |
renderReplace 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.EmailSuggestionfrom@slices.sh/auth/headless/sign-inSignIn.EmailSuggestionfrom@slices.sh/auth/headless/passkeysSignIn.EmailSuggestionfrom@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
| Prop | Type | Default |
|---|---|---|
defaultCountryWhere a number typed without a | string | — |
allowedCountriesThe countries a number may be in, which are also the ones the list offers. Without it, every country. | readonly string[] | — |
locale | string | — |
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
SignIn.PhoneRootfrom@slices.sh/auth/headless/sign-inSignIn.PhoneRootfrom@slices.sh/auth/headless/passkeysSignIn.PhoneRootfrom@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
| Prop | Type | Default |
|---|---|---|
invalidMessage | string | — |
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean; status: PhoneStatus }) => ReactNode) | — |
renderReplace 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.Phonefrom@slices.sh/auth/headless/sign-inSignIn.Phonefrom@slices.sh/auth/headless/passkeysSignIn.Phonefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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.Passwordfrom@slices.sh/auth/headless/sign-inSignIn.Passwordfrom@slices.sh/auth/headless/passkeysSignIn.Passwordfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { visible: boolean }) => ReactNode) | — |
renderReplace 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
Revealfrom@slices.sh/auth/headless/password-settingsSignIn.RevealPasswordfrom@slices.sh/auth/headless/sign-inSignIn.RevealPasswordfrom@slices.sh/auth/headless/passkeysSignIn.RevealPasswordfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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.PasswordSubmitfrom@slices.sh/auth/headless/sign-inSignIn.PasswordSubmitfrom@slices.sh/auth/headless/passkeysSignIn.PasswordSubmitfrom@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
| Prop | Type | Default |
|---|---|---|
providerRequired | OAuthProvider | — |
callbackURLWhere the provider sends the person back; the backend's default when left out. | string | — |
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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.OAuthfrom@slices.sh/auth/headless/sign-inSignIn.OAuthfrom@slices.sh/auth/headless/passkeysSignIn.OAuthfrom@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
| Prop | Type | Default |
|---|---|---|
channel | "email" | "sms" | "email" |
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean; cooldown: boolean }) => ReactNode) | — |
renderReplace 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.SendCodefrom@slices.sh/auth/headless/sign-inSignIn.SendCodefrom@slices.sh/auth/headless/passkeysSignIn.SendCodefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Destinationfrom@slices.sh/auth/headless/sign-inSignIn.Destinationfrom@slices.sh/auth/headless/passkeysSignIn.Destinationfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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.CodeInputfrom@slices.sh/auth/headless/sign-inSignIn.CodeInputfrom@slices.sh/auth/headless/passkeysSignIn.CodeInputfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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.VerifyCodefrom@slices.sh/auth/headless/sign-inSignIn.VerifyCodefrom@slices.sh/auth/headless/passkeysSignIn.VerifyCodefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
SignIn.Verifyingfrom@slices.sh/auth/headless/sign-inSignIn.Verifyingfrom@slices.sh/auth/headless/passkeysSignIn.Verifyingfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { seconds: number; pending: boolean; exhausted: boolean }) => ReactNode) | — |
renderReplace 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.ResendCodefrom@slices.sh/auth/headless/sign-inSignIn.ResendCodefrom@slices.sh/auth/headless/passkeysSignIn.ResendCodefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { remaining: number; limit: number }) => ReactNode) | — |
renderReplace 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.AttemptsRemainingfrom@slices.sh/auth/headless/sign-inSignIn.AttemptsRemainingfrom@slices.sh/auth/headless/passkeysSignIn.AttemptsRemainingfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Restartfrom@slices.sh/auth/headless/sign-inSignIn.Restartfrom@slices.sh/auth/headless/passkeysSignIn.Restartfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { code: AuthErrorCode; message: string }) => ReactNode) | — |
renderReplace 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.Errorfrom@slices.sh/auth/headless/sign-inSignIn.Errorfrom@slices.sh/auth/headless/passkeysSignIn.Errorfrom@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
| Prop | Type | Default |
|---|---|---|
defaultMode | "sign-in" | "sign-up" | "sign-in" |
allowSignUp | boolean | true |
configThe auth config, a slug from the registry ( | string | — |
enabledLeft out or | Enabled | — |
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
Authentication.Rootfrom@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
| Prop | Type | Default |
|---|---|---|
nameRequired | "sign-in" | "sign-up" | — |
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
Authentication.Modefrom@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
| Prop | Type | Default |
|---|---|---|
toRequired | "sign-in" | "sign-up" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.Switchfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
Authentication.SignUpAvailablefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
User.SignedOutfrom@slices.sh/auth/headless/userUser.SignedOutfrom@slices.sh/auth/headless/passkeysUser.SignedOutfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
childrenContent 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
| Prop | Type | Default |
|---|---|---|
factorRequired | "authenticator" | "backup-code" | — |
childrenContent 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
| Prop | Type | Default |
|---|---|---|
factorRequired | "authenticator" | "backup-code" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { checked: boolean }) => ReactNode) | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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
| Prop | Type | Default |
|---|---|---|
stage | "identify" | — |
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ForgotPasswordfrom@slices.sh/auth/headless/sign-inSignIn.ForgotPasswordfrom@slices.sh/auth/headless/passkeysSignIn.ForgotPasswordfrom@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
| Prop | Type | Default |
|---|---|---|
methodRequired | "link" | "code" | — |
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
SignIn.ResetMethodfrom@slices.sh/auth/headless/sign-inSignIn.ResetMethodfrom@slices.sh/auth/headless/passkeysSignIn.ResetMethodfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean; method: "link" | "code" }) => ReactNode) | — |
renderReplace 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.RequestResetfrom@slices.sh/auth/headless/sign-inSignIn.RequestResetfrom@slices.sh/auth/headless/passkeysSignIn.RequestResetfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent 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.ResetSentfrom@slices.sh/auth/headless/sign-inSignIn.ResetSentfrom@slices.sh/auth/headless/passkeysSignIn.ResetSentfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.BackToSignInfrom@slices.sh/auth/headless/sign-inSignIn.BackToSignInfrom@slices.sh/auth/headless/passkeysSignIn.BackToSignInfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
renderReplace 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.ResetDestinationfrom@slices.sh/auth/headless/sign-inSignIn.ResetDestinationfrom@slices.sh/auth/headless/passkeysSignIn.ResetDestinationfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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.ResetCodeInputfrom@slices.sh/auth/headless/sign-inSignIn.ResetCodeInputfrom@slices.sh/auth/headless/passkeysSignIn.ResetCodeInputfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { seconds: number; pending: boolean; exhausted: boolean }) => ReactNode) | — |
renderReplace 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.ResendResetCodefrom@slices.sh/auth/headless/sign-inSignIn.ResendResetCodefrom@slices.sh/auth/headless/passkeysSignIn.ResendResetCodefrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
SignIn.ResetUnusedfrom@slices.sh/auth/headless/sign-inSignIn.ResetUnusedfrom@slices.sh/auth/headless/passkeysSignIn.ResetUnusedfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { invalid: boolean }) => ReactNode) | — |
renderReplace 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.NewPasswordfrom@slices.sh/auth/headless/sign-inSignIn.NewPasswordfrom@slices.sh/auth/headless/passkeysSignIn.NewPasswordfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { score: number | null; levels: number }) => ReactNode) | — |
renderReplace 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
Strengthfrom@slices.sh/auth/headless/password-settingsSignIn.PasswordStrengthfrom@slices.sh/auth/headless/sign-inSignIn.PasswordStrengthfrom@slices.sh/auth/headless/passkeysSignIn.PasswordStrengthfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { index: number; filled: boolean }) => ReactNode) | — |
renderReplace 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
StrengthSegmentfrom@slices.sh/auth/headless/password-settingsSignIn.StrengthSegmentfrom@slices.sh/auth/headless/sign-inSignIn.StrengthSegmentfrom@slices.sh/auth/headless/passkeysSignIn.StrengthSegmentfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { warning: string | null; suggestions: readonly string[] }) => ReactNode) | — |
renderReplace 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
Feedbackfrom@slices.sh/auth/headless/password-settingsSignIn.PasswordFeedbackfrom@slices.sh/auth/headless/sign-inSignIn.PasswordFeedbackfrom@slices.sh/auth/headless/passkeysSignIn.PasswordFeedbackfrom@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
| Prop | Type | Default |
|---|---|---|
ruleRequired | "length" | "strength" | — |
childrenContent rendered inside this part. | ReactNode | ((state: State) => ReactNode) | — |
renderReplace 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
Requirementfrom@slices.sh/auth/headless/password-settingsSignIn.PasswordRequirementfrom@slices.sh/auth/headless/sign-inSignIn.PasswordRequirementfrom@slices.sh/auth/headless/passkeysSignIn.PasswordRequirementfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | ((state: { pending: boolean }) => ReactNode) | — |
renderReplace 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.SubmitResetfrom@slices.sh/auth/headless/sign-inSignIn.SubmitResetfrom@slices.sh/auth/headless/passkeysSignIn.SubmitResetfrom@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
| Prop | Type | Default |
|---|---|---|
childrenContent rendered inside this part. | ReactNode | — |
Required props are marked. A dash means no explicit default is declared in this component.
Alternate public imports
SignIn.ResetDonefrom@slices.sh/auth/headless/sign-inSignIn.ResetDonefrom@slices.sh/auth/headless/passkeysSignIn.ResetDonefrom@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.