Toggle Group

Usage

import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { AlignCenterIcon, AlignLeftIcon, AlignRightIcon } from 'lucide-react'
 
export function ToggleGroupDemo() {
  return (
    <ToggleGroup>
      <ToggleGroupItem value="left" aria-label="Align left">
        <AlignLeftIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center" aria-label="Align center">
        <AlignCenterIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right" aria-label="Align right">
        <AlignRightIcon className="size-4" />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}

Outline

Use variant="outline" on the group for bordered toggle items.

import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { LayoutGridIcon, LayoutListIcon, TableIcon } from 'lucide-react'
 
export function ToggleGroupOutlineDemo() {
  return (
    <ToggleGroup variant="outline">
      <ToggleGroupItem value="list" aria-label="List view">
        <LayoutListIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="grid" aria-label="Grid view">
        <LayoutGridIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="table" aria-label="Table view">
        <TableIcon className="size-4" />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}

Sizes

Use the size prop to change the size of the toggle group items.

import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { AlignCenterIcon, AlignLeftIcon, AlignRightIcon } from 'lucide-react'
 
export function ToggleGroupSizesDemo() {
  return (
    <div className="flex flex-col items-center gap-4">
      <ToggleGroup size="sm">
        <ToggleGroupItem value="left" aria-label="Align left">
          <AlignLeftIcon className="size-3.5" />
        </ToggleGroupItem>
        <ToggleGroupItem value="center" aria-label="Align center">
          <AlignCenterIcon className="size-3.5" />
        </ToggleGroupItem>
        <ToggleGroupItem value="right" aria-label="Align right">
          <AlignRightIcon className="size-3.5" />
        </ToggleGroupItem>
      </ToggleGroup>
      <ToggleGroup size="default">
        <ToggleGroupItem value="left" aria-label="Align left">
          <AlignLeftIcon className="size-4" />
        </ToggleGroupItem>
        <ToggleGroupItem value="center" aria-label="Align center">
          <AlignCenterIcon className="size-4" />
        </ToggleGroupItem>
        <ToggleGroupItem value="right" aria-label="Align right">
          <AlignRightIcon className="size-4" />
        </ToggleGroupItem>
      </ToggleGroup>
      <ToggleGroup size="lg">
        <ToggleGroupItem value="left" aria-label="Align left">
          <AlignLeftIcon className="size-4" />
        </ToggleGroupItem>
        <ToggleGroupItem value="center" aria-label="Align center">
          <AlignCenterIcon className="size-4" />
        </ToggleGroupItem>
        <ToggleGroupItem value="right" aria-label="Align right">
          <AlignRightIcon className="size-4" />
        </ToggleGroupItem>
      </ToggleGroup>
    </div>
  )
}

Spacing

Use spacing to add space between toggle group items instead of the joined look.

import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { AlignCenterIcon, AlignLeftIcon, AlignRightIcon } from 'lucide-react'
 
export function ToggleGroupSpacingDemo() {
  return (
    <ToggleGroup variant="outline" spacing={1}>
      <ToggleGroupItem value="left" aria-label="Align left">
        <AlignLeftIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center" aria-label="Align center">
        <AlignCenterIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right" aria-label="Align right">
        <AlignRightIcon className="size-4" />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}

Vertical

Use orientation="vertical" for vertically stacked toggle groups.

import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { AlignCenterIcon, AlignLeftIcon, AlignRightIcon } from 'lucide-react'
 
export function ToggleGroupVerticalDemo() {
  return (
    <ToggleGroup orientation="vertical" variant="outline">
      <ToggleGroupItem value="left" aria-label="Align left">
        <AlignLeftIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center" aria-label="Align center">
        <AlignCenterIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right" aria-label="Align right">
        <AlignRightIcon className="size-4" />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}

Disabled

import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { AlignCenterIcon, AlignLeftIcon, AlignRightIcon } from 'lucide-react'
 
export function ToggleGroupDisabledDemo() {
  return (
    <ToggleGroup disabled>
      <ToggleGroupItem value="left" aria-label="Align left">
        <AlignLeftIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center" aria-label="Align center">
        <AlignCenterIcon className="size-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right" aria-label="Align right">
        <AlignRightIcon className="size-4" />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}

Custom

A controlled toggle group for selecting meeting recap sections.

Selected: summary

'use client'
 
import { Label } from '@jamie/ui/label'
import { ToggleGroup, ToggleGroupItem } from '@jamie/ui/toggle-group'
import { useState } from 'react'
 
const views = [
  { value: 'summary', label: 'Summary' },
  { value: 'transcript', label: 'Transcript' },
  { value: 'action-items', label: 'Action Items' }
]
 
export function ToggleGroupCustomDemo() {
  const [selected, setSelected] = useState(['summary'])
 
  return (
    <div className="flex flex-col gap-3">
      <Label>Include in meeting recap</Label>
      <ToggleGroup
        value={selected}
        onValueChange={setSelected}
        variant="outline"
        spacing={1}
        size="sm"
      >
        {views.map((view) => (
          <ToggleGroupItem key={view.value} value={view.value}>
            {view.label}
          </ToggleGroupItem>
        ))}
      </ToggleGroup>
      <p className="text-xs text-muted-foreground">
        {selected.length === 0 ? 'No sections selected' : `Selected: ${selected.join(', ')}`}
      </p>
    </div>
  )
}