Toggle Group

A set of two-state buttons that can be either on or off.
vue
<script setup lang="ts">
import { ref } from 'vue'
import { Icon } from '@iconify/vue'
import { ToggleGroupRoot, ToggleGroupItem } from '@typlog/ui'

const selected = ref<string>('left')
</script>

<template>
  <div class="flex items-center gap-2">
    <ToggleGroupRoot v-model="selected">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>
  </div>
</template>

API Reference ​

ToggleGroupRoot ​

PropDefaultType
color
–

Overrides the accent color inherited from the Theme.

highContrast
–
boolean

Uses a higher contrast color for the component.

radius
–
"none""small""medium""large""full"

Overrides the radius inherited from the theme.

size"2"
"1""2""3"

Control the size of the toggle.

variant"solid"
Enum

The visual variant to apply.

ToogleGroupItem ​

Examples ​

Size ​

vue
<script setup lang="ts">
import { ref } from 'vue'
import { Icon } from '@iconify/vue'
import { ToggleGroupRoot, ToggleGroupItem } from '@typlog/ui'

const selected = ref<string>('left')
</script>

<template>
  <div class="flex items-center gap-2">
    <ToggleGroupRoot v-model="selected" size="1">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>
    <ToggleGroupRoot v-model="selected" size="2">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>
    <ToggleGroupRoot v-model="selected" size="3">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>
  </div>
</template>

Variant ​

vue
<script setup lang="ts">
import { ref } from 'vue'
import { Icon } from '@iconify/vue'
import { ToggleGroupRoot, ToggleGroupItem } from '@typlog/ui'

const selected = ref<string>('blog')
</script>

<template>
  <div class="flex items-podcast gap-2">
    <ToggleGroupRoot v-model="selected" variant="solid">
      <ToggleGroupItem value="blog">
        <Icon icon="lucide:file-text" />
      </ToggleGroupItem>
      <ToggleGroupItem value="podcast">
        <Icon icon="lucide:podcast" />
      </ToggleGroupItem>
      <ToggleGroupItem value="photo">
        <Icon icon="lucide:file-image" />
      </ToggleGroupItem>
    </ToggleGroupRoot>

    <ToggleGroupRoot v-model="selected" variant="surface">
      <ToggleGroupItem value="blog">
        <Icon icon="lucide:file-text" />
      </ToggleGroupItem>
      <ToggleGroupItem value="podcast">
        <Icon icon="lucide:podcast" />
      </ToggleGroupItem>
      <ToggleGroupItem value="photo">
        <Icon icon="lucide:file-image" />
      </ToggleGroupItem>
    </ToggleGroupRoot>

    <ToggleGroupRoot v-model="selected" variant="soft">
      <ToggleGroupItem value="blog">
        <Icon icon="lucide:file-text" />
      </ToggleGroupItem>
      <ToggleGroupItem value="podcast">
        <Icon icon="lucide:podcast" />
      </ToggleGroupItem>
      <ToggleGroupItem value="photo">
        <Icon icon="lucide:file-image" />
      </ToggleGroupItem>
    </ToggleGroupRoot>

    <ToggleGroupRoot v-model="selected" variant="outline">
      <ToggleGroupItem value="blog">
        <Icon icon="lucide:file-text" />
      </ToggleGroupItem>
      <ToggleGroupItem value="podcast">
        <Icon icon="lucide:podcast" />
      </ToggleGroupItem>
      <ToggleGroupItem value="photo">
        <Icon icon="lucide:file-image" />
      </ToggleGroupItem>
    </ToggleGroupRoot>

    <ToggleGroupRoot v-model="selected" variant="ghost">
      <ToggleGroupItem value="blog">
        <Icon icon="lucide:file-text" />
      </ToggleGroupItem>
      <ToggleGroupItem value="podcast">
        <Icon icon="lucide:podcast" />
      </ToggleGroupItem>
      <ToggleGroupItem value="photo">
        <Icon icon="lucide:file-image" />
      </ToggleGroupItem>
    </ToggleGroupRoot>
  </div>
</template>

Color ​

vue
<script setup lang="ts">
import { ref } from 'vue'
import { Icon } from '@iconify/vue'
import { ToggleGroupRoot, ToggleGroupItem } from '@typlog/ui'

const selected = ref<string>('left')
</script>

<template>
  <div class="flex items-center gap-2">
    <ToggleGroupRoot v-model="selected" variant="surface" color="green">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>

    <ToggleGroupRoot v-model="selected" variant="surface" color="red">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>

    <ToggleGroupRoot v-model="selected" variant="surface" color="gray">
      <ToggleGroupItem value="left">
        <Icon icon="lucide:align-left" />
      </ToggleGroupItem>
      <ToggleGroupItem value="center">
        <Icon icon="lucide:align-center" />
      </ToggleGroupItem>
      <ToggleGroupItem value="right">
        <Icon icon="lucide:align-right" />
      </ToggleGroupItem>
    </ToggleGroupRoot>
  </div>
</template>
Last updated Sep 15, 2026