PIN Input
Allows users to input a sequence of one-character alphanumeric inputs.
<script lang="ts">
import { PinInput, Toggle } from "bits-ui";
import { Eye, EyeSlash } from "$icons/index.js";
let value: string[] | undefined = [];
let unlocked = true;
let pinInputType: "text" | "password" = "password";
$: pinInputType = unlocked ? "text" : "password";
</script>
<PinInput.Root
bind:value
class="flex items-center gap-2"
type={pinInputType}
placeholder="0"
>
<PinInput.Input
class="flex h-input w-10 select-none rounded-input border border-foreground bg-background px-2 py-3 text-center font-alt text-[17px] tracking-[0.01em] text-foreground placeholder-shown:border-border-input focus-within:border-border-input-hover focus-within:shadow-date-field-focus hover:border-border-input-hover"
/>
<PinInput.Input
class="flex h-input w-10 select-none rounded-input border border-foreground bg-background px-2 py-3 text-center font-alt text-[17px] tracking-[0.01em] text-foreground placeholder-shown:border-border-input focus-within:border-border-input-hover focus-within:shadow-date-field-focus hover:border-border-input-hover"
/>
<PinInput.Input
class="flex h-input w-10 select-none rounded-input border border-foreground bg-background px-2 py-3 text-center font-alt text-[17px] tracking-[0.01em] text-foreground placeholder-shown:border-border-input focus-within:border-border-input-hover focus-within:shadow-date-field-focus hover:border-border-input-hover"
/>
<PinInput.Input
class="flex h-input w-10 select-none rounded-input border border-foreground bg-background px-2 py-3 text-center font-alt text-[17px] tracking-[0.01em] text-foreground placeholder-shown:border-border-input focus-within:border-border-input-hover focus-within:shadow-date-field-focus hover:border-border-input-hover"
/>
<PinInput.HiddenInput />
<Toggle.Root
aria-label="toggle code visibility"
class="inline-flex size-10 items-center justify-center rounded-[9px] text-foreground/40 transition-all hover:bg-muted active:scale-98 active:bg-dark-10 active:data-[state=on]:bg-dark-10"
bind:pressed={unlocked}
>
{#if unlocked}
<Eye class="size-5" />
{:else}
<EyeSlash class="size-5" />
{/if}
</Toggle.Root>
</PinInput.Root>
Structure
<script lang="ts">
import { PinInput } from "bits-ui";
</script>
<PinInput.Root>
<PinInput.Input />
<PinInput.Input />
<PinInput.Input />
<PinInput.Input />
<PinInput.HiddenInput />
</PinInput.Root>
API Reference
The root component which contains the pin-input.
Property | Type | Description |
---|---|---|
placeholder | string | The placeholder character to use for empty pin-inputs. Default:
○ |
value | string[] | The value of the pin-input. Default:
undefined |
name | string | The name of the pin-input. This is used for form submission. Default:
undefined |
disabled | boolean | Whether or not the pin-input is disabled. Default:
false |
type | 'text' | 'password' | The type of the input. Use Default:
text |
onValueChange | function | A callback function called when the pin-input value changes. Default:
undefined |
asChild | boolean | Whether to use render delegation with this component or not. Default:
false |
el | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:
undefined |
Slot Property | Type | Description |
---|---|---|
builder | object | The builder attributes and actions to apply to the element if using the |
ids | object | The ids of the elements within the component, useful when you don't necessarily want to provide a custom ID, but still want access to the ID being assigned (if any). |
Data Attribute | Value | Description |
---|---|---|
data-pin-input-root | —— | Present on the root element. |
data-complete | —— | Present if the pin-input is complete. |
The input component which contains the pin-input.
Property | Type | Description |
---|---|---|
asChild | boolean | Whether to use render delegation with this component or not. Default:
false |
el | HTMLInputElement | The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:
undefined |
Data Attribute | Value | Description |
---|---|---|
data-pin-input-input | —— | Present on the input element. |
data-complete | —— | Present if the pin-input is complete. |
The hidden input component which contains the pin-input.
Property | Type | Description |
---|---|---|
asChild | boolean | Whether to use render delegation with this component or not. Default:
false |
el | HTMLInputElement | The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:
undefined |
Data Attribute | Value | Description |
---|---|---|
data-pin-input-hidden-input | —— | Present on the hidden input element. |