DocsBlog
  • 1.1.2

  • light

    dark

    system

    Switch mode
  • Cerberus

    Acheron

    Elysium

Get Started
Components
Data Grid
Signals
Styling
Theming

Concepts

OverviewCompositionCerberus ContextTesting

Layout

Aspect RatioBleedBoxCenterContainerDividerFlexFloatGridGroupLink OverlayScrollableStackWrap

Components

AccordionAdmonitionAvatarButtonCarouselCheckboxClipboardCollapsibleComboboxConfirm ModalCTAModalDate PickerDialogFieldFieldsetFile UploaderIcon ButtonInputLoading StatesMenuNotificationsNumber InputPaginationPin InputProgressPrompt ModalRadioRatingSelectSplit ButtonSwitchTableTabsTagTextTextareaToggleTooltip

Utilities

Client OnlyDownload TriggerEnvironmentFeature FlagsFocus TrapForFormat ByteFormat NumberFormat Relative TimeFrameHighlightJSON Tree ViewLocaleLocal StoragePortalPresenceShowsplitPropsTheme

Checkbox

The Checkbox component allows users to select one or more options from a set.

  • npm
  • source
  • recipe
  • Ark
import { Checkbox, CheckboxGroup } from '@cerberus/react'

Usage

The Checkbox component is a controlled component that can be used to select one or more options from a set. It can be used in a group with other checkboxes to allow for multiple selections.

Indeterminate State

The Checkbox component supports the indeterminate state, which is useful for indicating that a group of checkboxes is in a mixed state. To enable this state, set the checked prop to indeterminate.

Sizes

The Checkbox component supports different sizes. You can set the size prop to sm, or md.

Customizing

You can customize the Checkbox any way you like with style props and data-selectors.

Primitives

The layers of the Checkbox which can be used to create a fully custom solution.

ComponentDescription
CheckboxRootThe context provider for the Checkbox parts
CheckboxLabelThe label of the checkbox
CheckboxControlThe input of the checkbox
CheckboxIndicatorThe indicator of the checkbox state
CheckboxGroupThe group container for multiple checkboxes
CheckboxHiddenInputThe native input for the checkbox

Data Attributes

The primitives additionally use the following data attributes for custom styling:

NameValueDescription
data-scopecheckboxThe scope of the components.
data-partrootThe root layer of the scope.
data-partlabelThe label layer of the scope.
data-partcontrolThe control layer of the scope.
data-partindicatorThe indicator layer of the scope.
data-partgroupThe group layer of the scope.
data-activePresent when active or pressed
data-focusPresent when focused
data-focus-visiblePresent when focused with keyboard
data-readonlyPresent when read-only
data-hoverPresent when hovered
data-disabledPresent when disabled
data-state"indeterminate" | "checked" | "unchecked"
data-invalidPresent when invalid
data-requiredPresent when required

API

Props

The Checkbox component is an abstraction of the primitives and accepts the following props:

PropTypeRequiredDescription
asChildbooleanNoUse the provided child element as the default rendered element, combining their props and behavior.
sizesmNoThis size of the Checkbox.
checkedCheckedStateNoThe controlled checked state of the checkbox
defaultCheckedCheckedStateNoThe initial checked state of the checkbox when rendered. Use when you don't need to control the checked state of the checkbox.
disabledbooleanNoWhether the checkbox is disabled
formstringNoThe id of the form that the checkbox belongs to.
idstringNoThe unique identifier of the machine.
idsPartial<{ root: string; hiddenInput: string; control: string; label: string }>NoThe ids of the elements in the checkbox. Useful for composition.
invalidbooleanNoWhether the checkbox is invalid
namestringNoThe name of the input field in a checkbox.
Useful for form submission.
onCheckedChange(details: CheckedChangeDetails) => voidNoThe callback invoked when the checked state changes.
readOnlybooleanNoWhether the checkbox is read-only
requiredbooleanNoWhether the checkbox is required
valuestringNoThe value of checkbox input. Useful for form submission.

Parts

The CheckboxParts API is an Object containing the full family of components.

Note

It is best to only use the CheckboxParts if you are building a custom solution. Importing Object based components will ship every property it includes into your bundle, regardless if you use it or not.

NameDescription
RootThe CheckboxRoot component which is the Provider for the family.
LabelThe CheckboxLabel component which displays the label and "required" notice.
ControlThe CheckboxControl component which is the visual field.
IndicatorThe CheckboxIndicator component which displays based on the checked state.
GroupThe CheckboxGroup component which creates a controls the spacing of a group.
HiddenInputThe CheckboxHiddenInput component which displays the native input.

On this page

  • Edit this page on Github
Copy
'use client'

import { Box } from '@/styled-system/jsx'
import { Checkbox, CheckboxGroup, For } from '@cerberus/react'

const items = [
  {
    id: 'terms',
    label: 'I agree to the terms and conditions',
    required: true,
  },
  {
    id: 'legal',
    label: 'I would like to receive marketing emails',
  },
]

export function BasicDemo() {
  return (
    <Box w="1/2">
      <CheckboxGroup name="user_acceptance">
        <For each={items}>
          {(item) => (
            <Checkbox
              key={item.id}
              ids={{ control: item.id }}
              required={item?.required}
            >
              {item.label}
            </Checkbox>
          )}
        </For>

        <Checkbox ids={{ control: 'mixed' }} checked="indeterminate">
          The indeterminate state
        </Checkbox>
      </CheckboxGroup>
    </Box>
  )
}
Copy
Copy
Copy
'use client'

import { Checkbox, CheckboxGroup, For } from '@cerberus/react'
import { createComputed, useSignal } from '@cerberus/signals'
import { Box } from 'styled-system/jsx'

const initialValues = [
  { label: 'Monday', checked: false, value: 'monday' },
  { label: 'Tuesday', checked: false, value: 'tuesday' },
  { label: 'Wednesday', checked: false, value: 'wednesday' },
  { label: 'Thursday', checked: false, value: 'thursday' },
]

export function IndeterminateDemo() {
  const [values, setValues] = useSignal(initialValues)

  const allChecked = createComputed(() => values.every((value) => value.checked))
  const indeterminate = createComputed(
    () => values.some((value) => value.checked) && !allChecked(),
  )

  return (
    <Box w="1/2">
      <CheckboxGroup name="days">
        <Checkbox
          checked={indeterminate() ? 'indeterminate' : allChecked()}
          onCheckedChange={(e) => {
            setValues((current) =>
              current.map((value) => ({ ...value, checked: !!e.checked })),
            )
          }}
        >
          Weekdays
        </Checkbox>

        <For each={values}>
          {(item, index) => (
            <Checkbox
              key={item.value}
              checked={item.checked}
              onCheckedChange={(e) => {
                setValues((current) => {
                  const newValues = [...current]
                  newValues[index] = { ...newValues[index], checked: !!e.checked }
                  return newValues
                })
              }}
            >
              {item.label}
            </Checkbox>
          )}
        </For>
      </CheckboxGroup>
    </Box>
  )
}
'use client'

import { Box } from '@/styled-system/jsx'
import { Checkbox, CheckboxGroup } from '@cerberus/react'

export function SizeDemo() {
  return (
    <Box w="1/2">
      <CheckboxGroup name="size">
        <Checkbox ids={{ control: 'small' }} size="sm">
          Small
        </Checkbox>
        <Checkbox ids={{ control: 'medium' }} size="md">
          Medium
        </Checkbox>
      </CheckboxGroup>
    </Box>
  )
}
'use client'

import { Box } from '@/styled-system/jsx'
import { ArrowDownRight } from '@carbon/icons-react'
import { CheckboxParts } from '@cerberus/react'

export function CustomDemo() {
  return (
    <Box w="1/2">
      <CheckboxParts.Root>
        <CheckboxParts.Label>Custom Checkbox</CheckboxParts.Label>
        <CheckboxParts.Control
          bgColor="black"
          border="4px solid"
          borderColor="danger.border.initial"
          h={8}
          rounded="none"
          transform="skewX(-10deg)"
          w={8}
          _checked={{
            bgColor: 'info.bg.initial',
          }}
        >
          <CheckboxParts.Indicator>
            <ArrowDownRight />
          </CheckboxParts.Indicator>
        </CheckboxParts.Control>
        <CheckboxParts.HiddenInput />
      </CheckboxParts.Root>
    </Box>
  )
}