Skip to content
Esc
navigateopen⌘Jpreview
On this page

Checkbox Group

Shares checked state across multiple checkboxes.

import { Checkbox } from '@/components/ui/checkbox';
import { CheckboxGroup } from '@/components/ui/checkbox-group';
import { Label } from '@/components/ui/label';

export default function CheckboxGroupDemo() {
  return (
    <CheckboxGroup defaultValue={['newsletter']} aria-label="Email preferences">
      <Label>
        <Checkbox name="newsletter" /> Newsletter
      </Label>
      <Label>
        <Checkbox name="product-updates" /> Product updates
      </Label>
      <Label>
        <Checkbox name="promotions" /> Promotions
      </Label>
    </CheckboxGroup>
  );
}

Install

npx shadcn@latest add @madeui/checkbox-group

Usage

import { Checkbox } from '@/components/ui/checkbox';
import { CheckboxGroup } from '@/components/ui/checkbox-group';

Parent checkbox

A “select all” checkbox: make the group controlled, pass every child’s identifier to allValues, and add parent to a Checkbox with no name — it ticks all, unticks all, and goes indeterminate when only some children are checked.

'use client';

import * as React from 'react';

import * as stylex from '@stylexjs/stylex';

import { Checkbox } from '@/components/ui/checkbox';
import { CheckboxGroup } from '@/components/ui/checkbox-group';
import { Label } from '@/components/ui/label';
import { space } from '@/lib/constants.stylex';

const notifications = ['comments', 'mentions', 'follows'];

export default function CheckboxGroupWithParent() {
  const [value, setValue] = React.useState<string[]>(['comments']);

  return (
    <CheckboxGroup
      value={value}
      onValueChange={setValue}
      allValues={notifications}
      aria-label="Notification preferences"
    >
      <Label>
        <Checkbox parent /> All notifications
      </Label>
      <Label style={styles.child}>
        <Checkbox name="comments" /> Comments
      </Label>
      <Label style={styles.child}>
        <Checkbox name="mentions" /> Mentions
      </Label>
      <Label style={styles.child}>
        <Checkbox name="follows" /> Follows
      </Label>
    </CheckboxGroup>
  );
}

const styles = stylex.create({
  child: {
    marginLeft: space.s6,
  },
});

API reference

Built on Base UI Checkbox Group. Give each child Checkbox a name and control the group with value / defaultValue / onValueChange (arrays of names); a parent checkbox is supported via allValues. All props are forwarded — see the Base UI Checkbox Group API reference. Accepts a style prop (StyleXStyles, merged last).

Was this page helpful?