CheckboxGroup
Manages a set of Checkbox children as a single multi-select value array; works controlled or uncontrolled.
Wrapper has role="group"; child Checkbox inputs keep their native role and labels.
Preview
tsx
import { Checkbox, CheckboxGroup, Stack } from '@arshad-shah/cynosure-react';
export default function Example() {
return (
<CheckboxGroup defaultValue={['en']} aria-label="Languages">
<Stack gap="2">
<Checkbox value="en">English</Checkbox>
<Checkbox value="fr">French</Checkbox>
<Checkbox value="de">German</Checkbox>
<Checkbox value="es">Spanish</Checkbox>
</Stack>
</CheckboxGroup>
);
}
import { Checkbox, CheckboxGroup } from "@arshad-shah/cynosure-react";
<CheckboxGroup defaultValue={["en"]} aria-label="Languages"> <Checkbox value="en">English</Checkbox> <Checkbox value="fr">French</Checkbox></CheckboxGroup>Each child Checkbox must carry a value — the group’s value is the array of currently-checked values.
Controlled
Section titled “Controlled”Drive selection from state via value + onChange. Individual checked / onCheckedChange props on the children are ignored once they’re inside a group.
Preview
tsx
import { Checkbox, CheckboxGroup, Stack } from '@arshad-shah/cynosure-react';
import { useState } from 'react';
export default function Example() {
const [value, setValue] = useState<string[]>(['en']);
return (
<Stack gap="3">
<CheckboxGroup value={value} onChange={setValue} aria-label="Languages">
<Stack gap="2">
<Checkbox value="en">English</Checkbox>
<Checkbox value="fr">French</Checkbox>
<Checkbox value="de">German</Checkbox>
</Stack>
</CheckboxGroup>
<p style={{ fontSize: '0.875rem' }}>
Selected: <code>{JSON.stringify(value)}</code>
</p>
</Stack>
);
}
Layout
Section titled “Layout”The group renders a plain wrapper — wrap children in any layout primitive (Stack for vertical, Inline for horizontal).
Preview
tsx
import { Checkbox, CheckboxGroup, Inline } from '@arshad-shah/cynosure-react';
export default function Example() {
return (
<CheckboxGroup defaultValue={['en']} aria-label="Languages">
<Inline gap="4">
<Checkbox value="en">English</Checkbox>
<Checkbox value="fr">French</Checkbox>
<Checkbox value="de">German</Checkbox>
<Checkbox value="es">Spanish</Checkbox>
</Inline>
</CheckboxGroup>
);
}
Disabled
Section titled “Disabled”Setting disabled on the group cascades to every child. Children can also be disabled individually.
Preview
tsx
import { Checkbox, CheckboxGroup, Stack } from '@arshad-shah/cynosure-react';
export default function Example() {
return (
<Stack gap="5">
<CheckboxGroup defaultValue={['en']} disabled aria-label="Disabled group">
<Stack gap="2">
<Checkbox value="en">English</Checkbox>
<Checkbox value="fr">French</Checkbox>
<Checkbox value="de">German</Checkbox>
</Stack>
</CheckboxGroup>
<CheckboxGroup defaultValue={['fr']} aria-label="Individually disabled">
<Stack gap="2">
<Checkbox value="en">English</Checkbox>
<Checkbox value="fr">French</Checkbox>
<Checkbox value="de" disabled>
German (unavailable)
</Checkbox>
</Stack>
</CheckboxGroup>
</Stack>
);
}
With Fieldset
Section titled “With Fieldset”For a visible legend, wrap the group in <Fieldset>.
Preview
tsx
import { Checkbox, CheckboxGroup, Fieldset, Stack } from '@arshad-shah/cynosure-react';
export default function Example() {
return (
<Fieldset legend="Pick your languages">
<CheckboxGroup defaultValue={['en']}>
<Stack gap="2">
<Checkbox value="en">English</Checkbox>
<Checkbox value="fr">French</Checkbox>
<Checkbox value="de">German</Checkbox>
<Checkbox value="es">Spanish</Checkbox>
</Stack>
</CheckboxGroup>
</Fieldset>
);
}
PropTypeDefaultDescription
value
string[]
—
Controlled array of selected checkbox values.
defaultValue
string[]
—
Uncontrolled initial array of selected values.
onChange
((value: string[]) => void)
—
Fires with the next array on every toggle.
name
string
—
Shared submit name for every checkbox in the group. Individual `name` overrides take precedence.
disabled
boolean
—
Disables every checkbox in the group.
aria-label
string
—
A11y label for the group — resolves to `aria-label` on the wrapper.
Accessibility
Section titled “Accessibility”- Wrapper uses
role="group"— pair witharia-labelor a<Fieldset legend="…">so the group has an accessible name. - Each child
Checkboxkeeps its nativerole="checkbox"and individual label, so screen-reader counting (“3 of 5”) works. disabledon the group is propagated to every child, including theiraria-disabledstate.- Selection lives in a single value array — there is no separate
checkedto keep in sync per item.
Recipes
Section titled “Recipes”- Pass
nameso each checked item submits as a repeated form value inside a native<form>. - Combine with
FormField+FormMessageto drive “pick at least one” validation messaging. - Keep
valueitems primitive strings — they round-trip cleanly through URLs andFormData.