Allow users to switch between checked, unchecked, and indeterminate states.
Overview
The Checkbox component provides a flexible and accessible way to create checkbox inputs in your Svelte applications. It supports three states: checked, unchecked, and indeterminate, allowing for complex form interactions and data representations.
Key Features
Tri-State Support: Handles checked, unchecked, and indeterminate states, providing versatility in form design.
Accessibility: Built with WAI-ARIA guidelines in mind, ensuring keyboard navigation and screen reader support.
Flexible State Management: Supports both controlled and uncontrolled state, allowing for full control over the checkbox's checked state.
Architecture
The Checkbox component is composed of the following parts:
Root: The main component that manages the state and behavior of the checkbox.
Structure
Here's an overview of how the Checkbox component is structured in code:
Reusable Components
It's recommended to use the Checkbox primitive to create your own custom checkbox component that can be used throughout your application. In the example below, we're using the Checkbox and Label components to create a custom checkbox component.
You can then use the MyCheckbox component in your application like so:
Managing Checked State
Bits UI offers several approaches to manage and synchronize the Checkbox's checked state, catering to different levels of control and integration needs.
1. Two-Way Binding
For seamless state synchronization, use Svelte's bind:checked directive. This method automatically keeps your local state in sync with the checkbox's internal state.
Key Benefits
Simplifies state management
Automatically updates myChecked when the checkbox changes (e.g., via clicking on the checkbox)
Allows external control (e.g., checking via a separate button/programmatically)
2. Change Handler
For more granular control or to perform additional logic on state changes, use the onCheckedChange prop. This approach is useful when you need to execute custom logic alongside state updates.
Use Cases
Implementing custom behaviors on checked/unchecked
Integrating with external state management solutions
Triggering side effects (e.g., logging, data fetching)
3. Fully Controlled
For complete control over the checkbox's checked state, use the controlledChecked prop. This approach requires you to manually manage the checked state, giving you full control over when and how the checkbox responds to change events.
To implement controlled state:
Set the controlledChecked prop to true on the Checkbox.Root component.
Provide a checked prop to Checkbox.Root, which should be a variable holding the current state.
Implement an onCheckedChange handler to update the state when the internal state changes.
When to Use
Implementing complex checked/unchecked logic
Coordinating multiple UI elements
Debugging state-related issues
Note
While powerful, fully controlled state should be used judiciously as it increases complexity and can cause unexpected behaviors if not handled carefully.
For more in-depth information on controlled components and advanced state management techniques, refer to our Controlled State documentation.
Managing Indeterminate State
Bits UI offers several approaches to manage and synchronize the Checkbox's indeterminate state, catering to different levels of control and integration needs.
1. Two-Way Binding
For seamless state synchronization, use Svelte's bind:indeterminate directive. This method automatically keeps your local state in sync with the checkbox's internal state.
Key Benefits
Simplifies state management
Automatically updates myIndeterminate when the checkbox changes (e.g., via clicking on the checkbox)
Allows external control (e.g., checking via a separate button/programmatically)
2. Change Handler
For more granular control or to perform additional logic on state changes, use the onIndeterminateChange prop. This approach is useful when you need to execute custom logic alongside state updates.
Use Cases
Implementing custom behaviors
Integrating with external state management solutions
Triggering side effects (e.g., logging, data fetching)
3. Fully Controlled
For complete control over the checkbox's checked state, use the controlledIndeterminate prop. This approach requires you to manually manage the indeterminate state, giving you full control over when and how the checkbox responds to change events.
To implement controlled state:
Set the controlledIndeterminate prop to true on the Checkbox.Root component.
Provide a indeterminate prop to Checkbox.Root, which should be a variable holding the current state.
Implement an onIndeterminateChange handler to update the state when the internal state changes.
When to Use
Implementing complex indeterminate logic
Coordinating multiple UI elements
Debugging state-related issues
Note
While powerful, fully controlled state should be used judiciously as it increases complexity and can cause unexpected behaviors if not handled carefully.
For more in-depth information on controlled components and advanced state management techniques, refer to our Controlled State documentation.
Disabled State
You can disable the checkbox by setting the disabled prop to true.
HTML Forms
If you set the name prop, a hidden checkbox input will be rendered to submit the value of the checkbox with a form.
By default, the checkbox will be submitted with default checkbox value of 'on' if the checked prop is true.
Custom Input Value
If you'd prefer to submit a different value, you can use the value prop to set the value of the hidden input.
For example, if you wanted to submit a string value, you could do the following:
Required
If you want to make the checkbox required, you can use the required prop.
This will apply the required attribute to the hidden input element, ensuring that proper form submission is enforced.
API Reference
Checkbox.Root
The button component used to toggle the state of the checkbox.
Property
Type
Description
checked$bindable
boolean
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
controlledChecked
boolean
Whether or not the checked state is controlled or not. If true, the component will not update the checked state internally, instead it will call onCheckedChange when it would have otherwise, and it is up to you to update the checked prop that is passed to the component.
Default: false
indeterminate$bindable
boolean
Whether the checkbox is an indeterminate state or not.
Default: false
onIndeterminateChange
function
A callback that is fired when the indeterminate state changes.
Default: ——undefined
controlledIndeterminate
boolean
Whether or not the indeterminate state is controlled or not. If true, the component will not update the indeterminate state internally, instead it will call onIndeterminateChange when it would have otherwise, and it is up to you to update the indeterminate prop that is passed to the component.
Default: false
disabled
boolean
Whether or not the checkbox button is disabled. This prevents the user from interacting with it.
Default: false
required
boolean
Whether or not the checkbox is required.
Default: false
name
string
The name of the checkbox. If provided a hidden input will be render to use for form submission. If not provided, the hidden input will not be rendered.
Default: ——undefined
value
string
The value of the checkbox. This is what is submitted with the form when the checkbox is checked.
Default: ——undefined
ref$bindable
HTMLButtonElement
The underlying DOM element being rendered. You can bind to this to get a reference to the element.
Default: ——undefined
children
Snippet
The children content to render.
Default: ——undefined
child
Snippet
Use render delegation to render your own element. See Child Snippet docs for more information.
Default: ——undefined
Data Attribute
Value
Description
data-state
enum
The checkbox's state of checked, unchecked, or indeterminate.