Skip to content

Toggle Group

Một tập hợp các nút toggle hai trạng thái có thể bật hoặc tắt.

Cài đặt

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

Sử dụng

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

<template>
  <ToggleGroup type="single">
    <ToggleGroupItem value="a">A</ToggleGroupItem>
    <ToggleGroupItem value="b">B</ToggleGroupItem>
    <ToggleGroupItem value="c">C</ToggleGroupItem>
  </ToggleGroup>
</template>
tsx
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"

export default function App() {
  return (
    <ToggleGroup type="single">
      <ToggleGroupItem value="a">A</ToggleGroupItem>
      <ToggleGroupItem value="b">B</ToggleGroupItem>
      <ToggleGroupItem value="c">C</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="single">
      <ui-toggle-group-item value="a">A</ui-toggle-group-item>
      <ui-toggle-group-item value="b">B</ui-toggle-group-item>
      <ui-toggle-group-item value="c">C</ui-toggle-group-item>
    </ui-toggle-group>
  `
})
export class AppComponent {}

API Reference

ToggleGroup Props

PropTypeDefaultMô tảFrameworks
type'single' | 'multiple'-Kiểu toggle (chọn một hoặc nhiều)All
valuestring[]-Giá trị controlledAll
defaultValuestring[]-Giá trị mặc định (uncontrolled)All
onValueChange(value: string[]) => void-Gọi khi giá trị thay đổiAll
disabledbooleanfalseVô hiệu hóa groupAll
variant'default' | 'outline''default'Biến thể kiểu hiển thịAll
size'default' | 'sm' | 'lg''default'Biến thể kích thướcAll
classNamestring''CSS class bổ sungAll

ToggleGroupItem Props

PropTypeDefaultMô tảFrameworks
valuestring-Giá trị của itemAll
disabledbooleanfalseVô hiệu hóa itemAll
asChildbooleanfalseRender như phần tử conReact, Vue, Angular
classNamestring''CSS class bổ sungAll

Ví dụ

Single selection

vue
<ToggleGroup type="single">
  <ToggleGroupItem value="left">Left</ToggleGroupItem>
  <ToggleGroupItem value="center">Center</ToggleGroupItem>
  <ToggleGroupItem value="right">Right</ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single">
  <ToggleGroupItem value="left">Left</ToggleGroupItem>
  <ToggleGroupItem value="center">Center</ToggleGroupItem>
  <ToggleGroupItem value="right">Right</ToggleGroupItem>
</ToggleGroup>
typescript
<ui-toggle-group type="single">
  <ui-toggle-group-item value="left">Left</ui-toggle-group-item>
  <ui-toggle-group-item value="center">Center</ui-toggle-group-item>
  <ui-toggle-group-item value="right">Right</ui-toggle-group-item>
</ui-toggle-group>

Multiple selection

vue
<ToggleGroup type="multiple">
  <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
  <ToggleGroupItem value="italic">Italic</ToggleGroupItem>
  <ToggleGroupItem value="underline">Underline</ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="multiple">
  <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
  <ToggleGroupItem value="italic">Italic</ToggleGroupItem>
  <ToggleGroupItem value="underline">Underline</ToggleGroupItem>
</ToggleGroup>
typescript
<ui-toggle-group type="multiple">
  <ui-toggle-group-item value="bold">Bold</ui-toggle-group-item>
  <ui-toggle-group-item value="italic">Italic</ui-toggle-group-item>
  <ui-toggle-group-item value="underline">Underline</ui-toggle-group-item>
</ui-toggle-group>

Outline variant

vue
<ToggleGroup type="single" variant="outline">
  <ToggleGroupItem value="a">A</ToggleGroupItem>
  <ToggleGroupItem value="b">B</ToggleGroupItem>
  <ToggleGroupItem value="c">C</ToggleGroupItem>
</ToggleGroup>
tsx
<ToggleGroup type="single" variant="outline">
  <ToggleGroupItem value="a">A</ToggleGroupItem>
  <ToggleGroupItem value="b">B</ToggleGroupItem>
  <ToggleGroupItem value="c">C</ToggleGroupItem>
</ToggleGroup>
typescript
<ui-toggle-group type="single" variant="outline">
  <ui-toggle-group-item value="a">A</ui-toggle-group-item>
  <ui-toggle-group-item value="b">B</ui-toggle-group-item>
  <ui-toggle-group-item value="c">C</ui-toggle-group-item>
</ui-toggle-group>

Kích thước

vue
<div class="flex flex-col gap-4">
  <ToggleGroup type="single" size="sm">
    <ToggleGroupItem value="a">Small</ToggleGroupItem>
  </ToggleGroup>
  <ToggleGroup type="single" size="default">
    <ToggleGroupItem value="a">Default</ToggleGroupItem>
  </ToggleGroup>
  <ToggleGroup type="single" size="lg">
    <ToggleGroupItem value="a">Large</ToggleGroupItem>
  </ToggleGroup>
</div>
tsx
<div className="flex flex-col gap-4">
  <ToggleGroup type="single" size="sm">
    <ToggleGroupItem value="a">Small</ToggleGroupItem>
  </ToggleGroup>
  <ToggleGroup type="single" size="default">
    <ToggleGroupItem value="a">Default</ToggleGroupItem>
  </ToggleGroup>
  <ToggleGroup type="single" size="lg">
    <ToggleGroupItem value="a">Large</ToggleGroupItem>
  </ToggleGroup>
</div>
typescript
<div class="flex flex-col gap-4">
  <ui-toggle-group type="single" size="sm">
    <ui-toggle-group-item value="a">Small</ui-toggle-group-item>
  </ui-toggle-group>
  <ui-toggle-group type="single" size="default">
    <ui-toggle-group-item value="a">Default</ui-toggle-group-item>
  </ui-toggle-group>
  <ui-toggle-group type="single" size="lg">
    <ui-toggle-group-item value="a">Large</ui-toggle-group-item>
  </ui-toggle-group>
</div>

Tương tác bàn phím

PhímMô tả
TabDi chuyển focus đến item tiếp theo
Shift + TabDi chuyển focus đến item trước đó
SpaceBật/tắt item đang được focus
EnterBật/tắt item đang được focus
ArrowRight / ArrowDownDi chuyển focus đến item tiếp theo
ArrowLeft / ArrowUpDi chuyển focus đến item trước đó
HomeDi chuyển focus đến item đầu tiên
EndDi chuyển focus đến item cuối cùng

Khả năng tiếp cận

Tuân thủ WAI-ARIA Toolbar Pattern.

  • Sử dụng role group cho container
  • Hỗ trợ điều hướng bằng bàn phím đầy đủ
  • Các items có thể focus được
  • Hỗ trợ cả single và multiple selection

Khả năng truy cập

  • Điều hướng bàn phím: [TODO]
  • Đọc màn hình: [TODO]
  • Quản lý focus: [TODO]
  • Tuân thủ WCAG: Tuân thủ WCAG 2.1 cấp độ AA

Tác giả

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

Giấy phép

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

Phát hành theo Giấy phép MIT.