Skip to content

Toggle Group

A set of two-state buttons that can be toggled on or off.

## Installation
bash
npx @galaxy-stack/nebula-cli@latest add toggle-group
bash
pnpm dlx @galaxy-stack/nebula-cli@latest add toggle-group
bash
yarn dlx @galaxy-stack/nebula-cli@latest add toggle-group
bash
bunx @galaxy-stack/nebula-cli@latest add toggle-group
bash
# If you have installed galaxy-design globally
galaxy-design add toggle-group

Usage

vue
<script setup lang="ts">
import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'
import { Bold, Italic, Underline } from 'lucide-vue-next'
</script>

<template>
  <ToggleGroup type="multiple">
    <ToggleGroupItem value="bold" aria-label="Toggle bold">
      <Bold class="h-4 w-4" />
    </ToggleGroupItem>
    <ToggleGroupItem value="italic" aria-label="Toggle italic">
      <Italic class="h-4 w-4" />
    </ToggleGroupItem>
    <ToggleGroupItem value="underline" aria-label="Toggle underline">
      <Underline class="h-4 w-4" />
    </ToggleGroupItem>
  </ToggleGroup>
</template>
tsx
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
import { Bold, Italic, Underline } from "lucide-react"

export default function App() {
  return (
    <ToggleGroup type="multiple">
      <ToggleGroupItem value="bold" aria-label="Toggle bold">
        <Bold className="h-4 w-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="italic" aria-label="Toggle italic">
        <Italic className="h-4 w-4" />
      </ToggleGroupItem>
      <ToggleGroupItem value="underline" aria-label="Toggle underline">
        <Underline className="h-4 w-4" />
      </ToggleGroupItem>
    </ToggleGroup>
  )
}
typescript
import { Component } from '@angular/core';
import { ToggleGroupComponent, ToggleGroupItemComponent } from '@/components/ui/toggle-group';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ToggleGroupComponent, ToggleGroupItemComponent],
  template: `
    <ui-toggle-group type="multiple">
      <ui-toggle-group-item value="bold" aria-label="Toggle bold">
        <lucide-icon name="bold" class="h-4 w-4"></lucide-icon>
      </ui-toggle-group-item>
      <ui-toggle-group-item value="italic" aria-label="Toggle italic">
        <lucide-icon name="italic" class="h-4 w-4"></lucide-icon>
      </ui-toggle-group-item>
      <ui-toggle-group-item value="underline" aria-label="Toggle underline">
        <lucide-icon name="underline" class="h-4 w-4"></lucide-icon>
      </ui-toggle-group-item>
    </ui-toggle-group>
  `
})
export class AppComponent {}

Examples

Default

vue
<ToggleGroup type="single">
  <ToggleGroupItem value="left">
    <AlignLeft class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight class="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single">
  <ToggleGroupItem value="left">
    <AlignLeft className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight className="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
html
<ui-toggle-group type="single">
  <ui-toggle-group-item value="left">
    <lucide-icon name="align-left" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="center">
    <lucide-icon name="align-center" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="right">
    <lucide-icon name="align-right" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
</ui-toggle-group>

Outline

vue
<ToggleGroup type="single" variant="outline">
  <ToggleGroupItem value="left">
    <AlignLeft class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight class="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single" variant="outline">
  <ToggleGroupItem value="left">
    <AlignLeft className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight className="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
html
<ui-toggle-group type="single" variant="outline">
  <ui-toggle-group-item value="left">
    <lucide-icon name="align-left" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="center">
    <lucide-icon name="align-center" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="right">
    <lucide-icon name="align-right" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
</ui-toggle-group>

Small

vue
<ToggleGroup type="single" size="sm">
  <ToggleGroupItem value="left">
    <AlignLeft class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight class="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single" size="sm">
  <ToggleGroupItem value="left">
    <AlignLeft className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight className="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
html
<ui-toggle-group type="single" size="sm">
  <ui-toggle-group-item value="left">
    <lucide-icon name="align-left" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="center">
    <lucide-icon name="align-center" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="right">
    <lucide-icon name="align-right" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
</ui-toggle-group>

Large

vue
<ToggleGroup type="single" size="lg">
  <ToggleGroupItem value="left">
    <AlignLeft class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight class="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single" size="lg">
  <ToggleGroupItem value="left">
    <AlignLeft className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight className="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
html
<ui-toggle-group type="single" size="lg">
  <ui-toggle-group-item value="left">
    <lucide-icon name="align-left" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="center">
    <lucide-icon name="align-center" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="right">
    <lucide-icon name="align-right" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
</ui-toggle-group>

Disabled

vue
<ToggleGroup type="single" disabled>
  <ToggleGroupItem value="left">
    <AlignLeft class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter class="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight class="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single" disabled>
  <ToggleGroupItem value="left">
    <AlignLeft className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="center">
    <AlignCenter className="h-4 w-4" />
  </ToggleGroupItem>
  <ToggleGroupItem value="right">
    <AlignRight className="h-4 w-4" />
  </ToggleGroupItem>
</ToggleGroup>
html
<ui-toggle-group type="single" [disabled]="true">
  <ui-toggle-group-item value="left">
    <lucide-icon name="align-left" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="center">
    <lucide-icon name="align-center" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
  <ui-toggle-group-item value="right">
    <lucide-icon name="align-right" class="h-4 w-4"></lucide-icon>
  </ui-toggle-group-item>
</ui-toggle-group>

API Reference

ToggleGroup Props

PropTypeDefaultDescriptionFrameworks
type'single' | 'multiple'-Toggle type (single or multiple selection)All
valuestring[]-Controlled valueAll
defaultValuestring[]-Default value for uncontrolled usageAll
onValueChange(value: string[]) => void-Called when value changesAll
disabledbooleanfalseDisables the groupAll
variant'default' | 'outline''default'Visual style variantAll
size'default' | 'sm' | 'lg''default'Size variantAll
classNamestring''Additional CSS classesAll

ToggleGroupItem Props

PropTypeDefaultDescriptionFrameworks
valuestring-Item valueAll
disabledbooleanfalseDisables the itemAll
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''Additional CSS classesAll

Accessibility

Uses roving tabindex to manage focus movement among items.

Keyboard Interactions

KeyDescription
TabMoves focus to either the pressed item or the first item in the group
SpaceActivates/deactivates the item
EnterActivates/deactivates the item
ArrowDownMoves focus to the next item in the group
ArrowRightMoves focus to the next item in the group
ArrowUpMoves focus to the previous item in the group
ArrowLeftMoves focus to the previous item in the group
HomeMoves focus to the first item
EndMoves focus to the last item

Author

Bùi Trọng Hiếu (kevinbui)

License

MIT © 2025 Bùi Trọng Hiếu (kevinbui)

Released under the MIT License.