Checkbox
Allow users to switch between checked, unchecked, and indeterminate states.
	<script lang="ts">
  import { Checkbox, Label } from "bits-ui";
  import { Check, Minus } from "$icons/index.js";
</script>
 
<div class="flex items-center space-x-3">
  <Checkbox.Root
    id="terms"
    aria-labelledby="terms-label"
    class="peer inline-flex size-[25px] items-center justify-center rounded-md border border-muted bg-foreground transition-all duration-150 ease-in-out active:scale-98 data-[state=unchecked]:border-border-input data-[state=unchecked]:bg-background data-[state=unchecked]:hover:border-dark-40"
    name="hello"
  >
    {#snippet children({ checked })}
      <div class="inline-flex items-center justify-center text-background">
        {#if checked === true}
          <Check class="size-[15px]" weight="bold" />
        {:else if checked === "indeterminate"}
          <Minus class="size-[15px]" weight="bold" />
        {/if}
      </div>
    {/snippet}
  </Checkbox.Root>
  <Label.Root
    id="terms-label"
    for="terms"
    class="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
  >
    Accept terms and conditions
  </Label.Root>
</div>
	
Structure
	<script lang="ts">
	import { Checkbox } from "bits-ui";
</script>
 
<Checkbox.Root>
	<Checkbox.Indicator />
	<Checkbox.Input />
</Checkbox.Root>
	
API Reference
The button component used to toggle the state of the checkbox.
| Property | Type | Description | 
|---|---|---|
| disabled | boolean | Whether or not the checkbox button is disabled. This prevents the user from interacting with it. Default:  false | 
| checked | enum | The checkbox button's checked state. This can be a boolean or the string 'indeterminate', which would typically display a dash in the checkbox. Default:  false | 
| onCheckedChange | function | A callback that is fired when the checkbox button's checked state changes. Default:  —— undefined | 
| required | boolean | Whether or not the checkbox is required. Default:  false | 
| name | string | The name of the checkbox. This is used for form submission. Default:  —— undefined | 
| value | string | The value of the checkbox. This is used for form submission. Default:  —— undefined | 
| asChild | boolean | Whether to use render delegation with this component or not. Default:  false | 
| el | HTMLButtonElement | 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  | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-disabled | —— | Present when the checkbox is disabled. | 
| data-state | enum | The checkbox's state. Can be 'checked', 'unchecked', or 'indeterminate'. | 
| data-checkbox-root | —— | Present on the root element. | 
The hidden input element that is used to store the checkbox's state for form submission. It receives all the same props as a regular HTML input element.
| Property | Type | Description | 
|---|---|---|
| value | boolean | Unless a value is provided, the input's value will be a boolean that represents the checkbox's checked state. Indeterminate checkboxes will have a value of  Default:  false | 
| disabled | boolean | Whether or not the checkbox input is disabled. If not provided, it will inherit the disabled state of the Root component, which defaults to false. Default:  false | 
A component which passes isChecked and isIndeterminate slot props to its children. This is useful for rendering the checkbox's indicator icon depending on its state.
| Property | Type | Description | 
|---|---|---|
| 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 | 
|---|---|---|
| isChecked | boolean | Whether or not the checkbox is checked. | 
| isIndeterminate | boolean | Whether or not the checkbox is indeterminate. | 
| attrs | object | Additional attributes to apply to the element if using the  | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-checkbox-indicator | —— | Present on the indicator element. | 
Examples
Controlled Usage
If you want to control or be aware of the checked state from outside the component, you can bind to the checked prop.
	<script lang="ts">
	import { Checkbox } from "bits-ui";
	let myChecked = false;
</script>
 
<p>Checked: {myChecked}</p>
<Checkbox.Root bind:checked={myChecked}>
	<Checkbox.Indicator />
	<Checkbox.Input />
</Checkbox.Root>