ButtonGroup

Molecule

Segmented button group for mutually-exclusive options. Supports multiple variants and sizes.

Outline (default)

Preview
Code
function Demo() {
  const [v, setV] = useState('week');
  return (
    <ButtonGroup value={v} onChange={setV}
      items={[{ value: 'day', label: 'Day' }, { value: 'week', label: 'Week' }, { value: 'month', label: 'Month' }]}
    />
  );
}

Sizes

Preview
Code
<ButtonGroup size="sm" value="a" onChange={setV} items={[...]} />
<ButtonGroup size="md" value="a" onChange={setV} items={[...]} />

Primary / secondary / ghost

Preview

Primary

Secondary

Ghost

Code
<ButtonGroup variant="primary" value="week" onChange={setV} items={[...]} />
<ButtonGroup variant="secondary" value="week" onChange={setV} items={[...]} />
<ButtonGroup variant="ghost" value="week" onChange={setV} items={[...]} />

With disabled item

Preview
Code
<ButtonGroup value="week" onChange={setV}
  items={[
    { value: 'day',   label: 'Day' },
    { value: 'week',  label: 'Week' },
    { value: 'month', label: 'Month', disabled: true },
  ]}
/>

Icon-style labels

Preview
Code
// Use single-char labels as icon proxies:
<ButtonGroup value="grid" onChange={setV}
  items={[
    { value: 'list', label: '☰' },
    { value: 'grid', label: '⊞' },
    { value: 'map',  label: '◫' },
  ]}
/>
Sourcemodules/ui/ButtonGroup.tsx