Button Group

Button Group component for grouping multiple buttons with single or multiple selection modes.

Simple Selection

Pass a single value or undefined for simple selection mode.

Show code
Hide code
import type { ButtonGroupValue } from '@mylighthouse/prism-react';
import { ButtonGroup } from '@mylighthouse/prism-react';
import { useState } from 'react';

const options = [
  { label: 'Option 1', value: 'option1' },
  { label: 'Option 2', value: 'option2' },
  { label: 'Option 3', value: 'option3' },
  { label: 'Option 4', value: 'option4' },
] as const;

export default function SimpleSelectionExample(): React.ReactElement {
  const [value, setValue] = useState<ButtonGroupValue>('option1');

  return (
    <div className="flex flex-col gap-300">
      <ButtonGroup onChange={setValue} value={value}>
        {options.map((option) => (
          <ButtonGroup.Button key={option.value} value={option.value}>
            {option.label}
          </ButtonGroup.Button>
        ))}
      </ButtonGroup>
    </div>
  );
}

Multiple Selection

Pass an array value for multiple selection mode.

Show code
Hide code
import type { ButtonGroupValue } from '@mylighthouse/prism-react';
import { ButtonGroup } from '@mylighthouse/prism-react';
import { useState } from 'react';

const options = [
  { label: 'Option 1', value: 'option1' },
  { label: 'Option 2', value: 'option2' },
  { label: 'Option 3', value: 'option3' },
  { label: 'Option 4', value: 'option4' },
] as const;

export default function MultipleSelectionExample(): React.ReactElement {
  const [value, setValue] = useState<ButtonGroupValue>(['option1', 'option2']);

  return (
    <div className="flex flex-col gap-300">
      <ButtonGroup onChange={setValue} value={value}>
        {options.map((option) => (
          <ButtonGroup.Button key={option.value} value={option.value}>
            {option.label}
          </ButtonGroup.Button>
        ))}
      </ButtonGroup>
    </div>
  );
}

With Icons

Show code
Hide code
import type { ButtonGroupValue } from '@mylighthouse/prism-react';
import { ButtonGroup } from '@mylighthouse/prism-react';
import { useState } from 'react';

const options = [
  { label: 'Option 1', value: 'option1', icon: 'artificial-intelligence' },
  { label: 'Option 2', value: 'option2', icon: 'automation' },
  { label: 'Option 3', value: 'option3', icon: 'heart-filled' },
  { label: 'Option 4', value: 'option4', icon: 'star-filled' },
] as const;

export default function WithIconsExample(): React.ReactElement {
  const [value, setValue] = useState<ButtonGroupValue>('option2');

  return (
    <div className="flex flex-col gap-300">
      <ButtonGroup onChange={setValue} value={value}>
        {options.map((option) => (
          <ButtonGroup.Button
            iconBefore={option.icon}
            key={option.value}
            value={option.value}
          >
            {option.label}
          </ButtonGroup.Button>
        ))}
      </ButtonGroup>
    </div>
  );
}

Small Size

Show code
Hide code
import type { ButtonGroupValue } from '@mylighthouse/prism-react';
import { ButtonGroup } from '@mylighthouse/prism-react';
import { useState } from 'react';

const options = [
  { label: 'Option 1', value: 'option1' },
  { label: 'Option 2', value: 'option2' },
  { label: 'Option 3', value: 'option3' },
  { label: 'Option 4', value: 'option4' },
] as const;

export default function SmallSizeExample(): React.ReactElement {
  const [value, setValue] = useState<ButtonGroupValue>('option3');

  return (
    <div className="flex flex-col gap-300">
      <ButtonGroup isSmall onChange={setValue} value={value}>
        {options.map((option) => (
          <ButtonGroup.Button key={option.value} value={option.value}>
            {option.label}
          </ButtonGroup.Button>
        ))}
      </ButtonGroup>
    </div>
  );
}

Disabled State

Show code
Hide code
import type { ButtonGroupValue } from '@mylighthouse/prism-react';
import { ButtonGroup } from '@mylighthouse/prism-react';
import { useState } from 'react';

const options = [
  { label: 'Option 1', value: 'option1' },
  { label: 'Option 2', value: 'option2' },
  { label: 'Option 3', value: 'option3' },
  { label: 'Option 4', value: 'option4' },
] as const;

export default function DisabledStateExample(): React.ReactElement {
  const [valueA, setValueA] = useState<ButtonGroupValue>('option1');
  const [valueB, setValueB] = useState<ButtonGroupValue>([
    'option1',
    'option2',
  ]);

  return (
    <div className="flex flex-col gap-300">
      <ButtonGroup isDisabled onChange={setValueA} value={valueA}>
        {options.map((option) => (
          <ButtonGroup.Button key={option.value} value={option.value}>
            {option.label}
          </ButtonGroup.Button>
        ))}
      </ButtonGroup>

      <ButtonGroup isDisabled onChange={setValueB} value={valueB}>
        {options.map((option) => (
          <ButtonGroup.Button key={option.value} value={option.value}>
            {option.label}
          </ButtonGroup.Button>
        ))}
      </ButtonGroup>
    </div>
  );
}

ButtonGroup

Name Default Type Description
onChange * -- (value: ButtonGroupValue) => void --
value * -- ButtonGroupValue --
isDisabled -- boolean --
isSmall -- boolean --

ButtonGroup.Button

Name Default Type Description
value * -- string --
iconBefore -- IconName --