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.  |