toggle group

A set of two-state buttons that can be pressed or released. Multiple buttons can be selected at the same time.

PreviousNext
import { Component } from '@angular/core';

import { provideIcons } from '@ng-icons/core';
import { lucideBold, lucideItalic, lucideUnderline } from '@ng-icons/lucide';

import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-default',
  imports: [ZardToggleGroupComponent],
  template: `
    <z-toggle-group zMode="multiple" zType="outline" [zItems]="items" (valueChange)="onToggleChange($event)" />
  `,
  viewProviders: [
    provideIcons({
      lucideBold,
      lucideItalic,
      lucideUnderline,
    }),
  ],
})
export default class ToggleGroupDefaultComponent {
  items: ZardToggleGroupItem[] = [
    {
      value: 'bold',
      icon: 'lucideBold',
      ariaLabel: 'Toggle bold',
    },
    {
      value: 'italic',
      icon: 'lucideItalic',
      ariaLabel: 'Toggle italic',
    },
    {
      value: 'underline',
      icon: 'lucideUnderline',
      ariaLabel: 'Toggle underline',
    },
  ];

  onToggleChange(value: string | string[]) {
    console.log('Toggle group changed:', value);
  }
}

Installation

Copy
npx zard-cli@latest add toggle-group

Usage

import { ZardToggleGroupComponent } from '@/shared/components/toggle-group/toggle-group.component';
Copy
<z-toggle-group>
  <z-toggle value="bold">Bold</z-toggle>
  <z-toggle value="italic">Italic</z-toggle>
  <z-toggle value="underline">Underline</z-toggle>
</z-toggle-group>
Copy

Examples

outline

Use zType="outline" for an outline style.

import { Component } from '@angular/core';

import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-outline',
  imports: [ZardToggleGroupComponent],
  template: `
    <z-toggle-group
      zDefaultValue="all"
      zMode="single"
      zType="outline"
      [zItems]="items"
      (valueChange)="onToggleChange($event)"
    />
  `,
})
export default class ToggleGroupOutlineComponent {
  items: ZardToggleGroupItem[] = [
    {
      value: 'all',
      label: 'All',
      ariaLabel: 'Toggle all',
    },
    {
      value: 'missed',
      label: 'Missed',
      ariaLabel: 'Toggle missed',
    },
  ];

  onToggleChange(value: string | string[]) {
    console.log('Selected:', value);
  }
}

size

Use the zSize to change the size of the toggle group.

import { Component } from '@angular/core';

import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-sizes',
  imports: [ZardToggleGroupComponent],
  template: `
    <div class="space-y-4">
      <div>
        <z-toggle-group
          zDefaultValue="top"
          zMode="single"
          zSize="sm"
          [zItems]="items"
          zType="outline"
          (valueChange)="onToggleChange($event)"
        />
      </div>
      <div>
        <z-toggle-group
          zDefaultValue="top"
          zMode="single"
          zSize="lg"
          [zItems]="items"
          zType="outline"
          (valueChange)="onToggleChange($event)"
        />
      </div>
    </div>
  `,
})
export default class ToggleGroupSizesComponent {
  items: ZardToggleGroupItem[] = [
    {
      value: 'top',
      label: 'Top',
      ariaLabel: 'Toggle top',
    },
    {
      value: 'bottom',
      label: 'Bottom',
      ariaLabel: 'Toggle bottom',
    },
    {
      value: 'left',
      label: 'Left',
      ariaLabel: 'Toggle left',
    },
    {
      value: 'right',
      label: 'Right',
      ariaLabel: 'Toggle right',
    },
  ];

  onToggleChange(value: string | string[]) {
    console.log('Selected:', value);
  }
}

spacing

Use zSpacing to add spacing between toggle group items.

import { Component } from '@angular/core';

import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-spacing',
  imports: [ZardToggleGroupComponent],
  template: `
    <z-toggle-group
      zDefaultValue="top"
      zMode="single"
      zSize="sm"
      zType="outline"
      [zItems]="items"
      [zSpacing]="2"
      (valueChange)="onToggleChange($event)"
    />
  `,
})
export default class ToggleGroupSpacingComponent {
  items: ZardToggleGroupItem[] = [
    {
      value: 'top',
      label: 'Top',
      ariaLabel: 'Toggle top',
    },
    {
      value: 'bottom',
      label: 'Bottom',
      ariaLabel: 'Toggle bottom',
    },
    {
      value: 'left',
      label: 'Left',
      ariaLabel: 'Toggle left',
    },
    {
      value: 'right',
      label: 'Right',
      ariaLabel: 'Toggle right',
    },
  ];

  onToggleChange(value: string | string[]) {
    console.log('Selected:', value);
  }
}

vertical

Use zOrientation="vertical" for vertical toggle groups.

import { Component } from '@angular/core';

import { provideIcons } from '@ng-icons/core';
import { lucideBold, lucideItalic, lucideUnderline } from '@ng-icons/lucide';

import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-vertical',
  imports: [ZardToggleGroupComponent],
  template: `
    <z-toggle-group
      zMode="multiple"
      zOrientation="vertical"
      [zDefaultValue]="['bold', 'italic']"
      [zItems]="items"
      [zSpacing]="1"
      (valueChange)="onToggleChange($event)"
    />
  `,
  viewProviders: [
    provideIcons({
      lucideBold,
      lucideItalic,
      lucideUnderline,
    }),
  ],
})
export default class ToggleGroupVerticalComponent {
  items: ZardToggleGroupItem[] = [
    {
      value: 'bold',
      icon: 'lucideBold',
      ariaLabel: 'Toggle bold',
    },
    {
      value: 'italic',
      icon: 'lucideItalic',
      ariaLabel: 'Toggle italic',
    },
    {
      value: 'underline',
      icon: 'lucideUnderline',
      ariaLabel: 'Toggle underline',
    },
  ];

  onToggleChange(value: string | string[]) {
    console.log('Toggle group changed:', value);
  }
}

disabled

import { Component } from '@angular/core';

import { provideIcons } from '@ng-icons/core';
import { lucideBold, lucideItalic, lucideUnderline } from '@ng-icons/lucide';

import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-disabled',
  imports: [ZardToggleGroupComponent],
  template: `
    <z-toggle-group [zDisabled]="true" zMode="multiple" [zItems]="items" (valueChange)="onToggleChange($event)" />
  `,
  viewProviders: [
    provideIcons({
      lucideBold,
      lucideItalic,
      lucideUnderline,
    }),
  ],
})
export default class ToggleGroupDisabledComponent {
  items: ZardToggleGroupItem[] = [
    {
      value: 'bold',
      icon: 'lucideBold',
      ariaLabel: 'Toggle bold',
    },
    {
      value: 'italic',
      icon: 'lucideItalic',
      ariaLabel: 'Toggle italic',
    },
    {
      value: 'underline',
      icon: 'lucideUnderline',
      ariaLabel: 'Toggle underline',
    },
  ];

  onToggleChange(value: string | string[]) {
    console.log('Toggle group changed:', value);
  }
}

custom

A custom toggle group example.

Use font- to set the font weight.

import { Component, computed, signal, type TemplateRef, viewChild } from '@angular/core';

import { ZardFieldImports } from '@/shared/components/field';
import {
  ZardToggleGroupComponent,
  type ZardToggleGroupItem,
} from '@/shared/components/toggle-group/toggle-group.component';

@Component({
  selector: 'demo-toggle-group-custom',
  imports: [ZardToggleGroupComponent, ...ZardFieldImports],
  template: `
    <div z-field class="w-full">
      <label z-field-label for="fontToggle">Font Weight</label>
      <z-toggle-group
        id="fontToggle"
        zItemClass="flex size-16 flex-col items-center justify-center rounded-xl"
        zMode="single"
        zType="outline"
        zSize="lg"
        [zItems]="items()"
        [zSpacing]="2"
        (valueChange)="onToggleChange($event)"
      />
      <p z-field-description>
        Use
        <code class="bg-muted rounded-md px-1 py-0.5 font-mono">font-{{ fontWeight() }}</code>
        to set the font weight.
      </p>
    </div>

    <ng-template #light>
      <span class="text-2xl leading-none font-light">Aa</span>
      <span class="text-muted-foreground text-xs">Light</span>
    </ng-template>

    <ng-template #normal>
      <span class="text-2xl leading-none font-normal">Aa</span>
      <span class="text-muted-foreground text-xs">Normal</span>
    </ng-template>

    <ng-template #medium>
      <span class="text-2xl leading-none font-medium">Aa</span>
      <span class="text-muted-foreground text-xs">Medium</span>
    </ng-template>

    <ng-template #bold>
      <span class="text-2xl leading-none font-bold">Aa</span>
      <span class="text-muted-foreground text-xs">Bold</span>
    </ng-template>
  `,
})
export default class ToggleGroupCustomComponent {
  readonly light = viewChild<TemplateRef<void>>('light');
  readonly normal = viewChild<TemplateRef<void>>('normal');
  readonly medium = viewChild<TemplateRef<void>>('medium');
  readonly bold = viewChild<TemplateRef<void>>('bold');

  protected readonly fontWeight = signal<string>('');

  readonly items = computed<ZardToggleGroupItem[]>(() => [
    {
      value: 'light',
      template: this.light(),
      ariaLabel: 'Light',
    },
    {
      value: 'normal',
      template: this.normal(),
      ariaLabel: 'Normal',
    },
    {
      value: 'medium',
      template: this.medium(),
      ariaLabel: 'Medium',
    },
    {
      value: 'bold',
      template: this.bold(),
      ariaLabel: 'Bold',
    },
  ]);

  onToggleChange(value: string | string[]) {
    let weight = '';
    if (Array.isArray(value)) {
      [weight] = value;
    } else {
      weight = value;
    }
    this.fontWeight.set(weight);
  }
}

API Reference

z-toggle-groupComponent

A set of two-state buttons that can be pressed or released, with multiple selections supported.

PropertyDescriptionTypeDefault
class Additional CSS classes ClassValue ''
zDefaultValue Default value string | string[] -
zDisabled Whether the entire group is disabled boolean false
zItemClass Additional CSS classes for group item ClassValue ''
zItems Array of toggle items to display ZardToggleGroupItem[] []
zMode Selection mode — single allows one active toggle, multiple allows many 'single' | 'multiple' 'multiple'
zOrientation Layout direction of the toggle group 'horizontal' | 'vertical' 'horizontal'
zSize Size variant of the toggle group 'default' | 'sm' | 'lg' 'default'
zSpacing Gap spacing between toggle items number 0
zType Visual style variant 'default' | 'outline' 'default'
zValue Controlled value of the toggle group string | string[] | undefined -
valueChange Emitted when toggle state changes, returns updated value output<string | string[]> -
github iconwhatsapp icondiscord iconX icon

Made with in Brazil. Open source and available on GitHub .