Toolbar

A container for interactive controls with arrow key navigation.

Usage

import { Toolbar } from '@hareui/vue'
<script setup lang="ts">import { Icon } from '@iconify/vue'import { Button, ButtonGroup, Separator, ToggleButton, ToggleButtonGroup, Toolbar } from '@hareui/vue'</script><template>  <Toolbar aria-label="Text formatting">    <ToggleButtonGroup aria-label="Text style" selection-mode="multiple" separator>      <ToggleButton icon-only aria-label="Bold" value="bold">        <Icon icon="gravity-ui:bold" />      </ToggleButton>      <ToggleButton icon-only aria-label="Italic" value="italic">        <Icon icon="gravity-ui:italic" />      </ToggleButton>      <ToggleButton icon-only aria-label="Underline" value="underline">        <Icon icon="gravity-ui:underline" />      </ToggleButton>    </ToggleButtonGroup>    <Separator />    <ButtonGroup variant="tertiary" separator>      <Button icon-only aria-label="Copy">        <Icon icon="gravity-ui:copy" />      </Button>      <Button icon-only aria-label="Cut">        <Icon icon="gravity-ui:scissors" />      </Button>    </ButtonGroup>  </Toolbar></template>

Examples

Vertical

<script setup lang="ts">import { Icon } from '@iconify/vue'import { Button, ButtonGroup, Separator, ToggleButton, ToggleButtonGroup, Toolbar } from '@hareui/vue'</script><template>  <Toolbar aria-label="Tools" orientation="vertical">    <ToggleButtonGroup aria-label="Text style" selection-mode="multiple" separator>      <ToggleButton icon-only aria-label="Bold" value="bold">        <Icon icon="gravity-ui:bold" />      </ToggleButton>      <ToggleButton icon-only aria-label="Italic" value="italic">        <Icon icon="gravity-ui:italic" />      </ToggleButton>      <ToggleButton icon-only aria-label="Underline" value="underline">        <Icon icon="gravity-ui:underline" />      </ToggleButton>    </ToggleButtonGroup>    <Separator />    <ButtonGroup variant="tertiary" separator>      <Button icon-only aria-label="Undo">        <Icon icon="gravity-ui:arrow-uturn-ccw-left" />      </Button>      <Button icon-only aria-label="Redo">        <Icon icon="gravity-ui:arrow-uturn-cw-right" />      </Button>    </ButtonGroup>  </Toolbar></template>

Attached

<script setup lang="ts">import { Icon } from '@iconify/vue'import { Button, ButtonGroup, Separator, ToggleButton, ToggleButtonGroup, Toolbar } from '@hareui/vue'</script><template>  <Toolbar attached aria-label="Text formatting">    <ToggleButtonGroup aria-label="Text style" selection-mode="multiple" separator>      <ToggleButton icon-only aria-label="Bold" value="bold">        <Icon icon="gravity-ui:bold" />      </ToggleButton>      <ToggleButton icon-only aria-label="Italic" value="italic">        <Icon icon="gravity-ui:italic" />      </ToggleButton>      <ToggleButton icon-only aria-label="Underline" value="underline">        <Icon icon="gravity-ui:underline" />      </ToggleButton>    </ToggleButtonGroup>    <Separator />    <ButtonGroup variant="tertiary" separator>      <Button icon-only aria-label="Copy">        <Icon icon="gravity-ui:copy" />      </Button>      <Button icon-only aria-label="Cut">        <Icon icon="gravity-ui:scissors" />      </Button>    </ButtonGroup>  </Toolbar></template>

With ButtonGroup

<script setup lang="ts">import { Icon } from '@iconify/vue'import { Button, ButtonGroup, Separator, ToggleButton, ToggleButtonGroup, Toolbar } from '@hareui/vue'</script><template>  <Toolbar aria-label="Editor toolbar">    <ButtonGroup variant="tertiary" separator>      <Button>        <Icon icon="gravity-ui:arrow-uturn-ccw-left" />        Undo      </Button>      <Button>        <Icon icon="gravity-ui:arrow-uturn-cw-right" />        Redo      </Button>    </ButtonGroup>    <Separator />    <ToggleButtonGroup aria-label="Text style" selection-mode="multiple" separator>      <ToggleButton icon-only aria-label="Bold" value="bold">        <Icon icon="gravity-ui:bold" />      </ToggleButton>      <ToggleButton icon-only aria-label="Italic" value="italic">        <Icon icon="gravity-ui:italic" />      </ToggleButton>      <ToggleButton icon-only aria-label="Underline" value="underline">        <Icon icon="gravity-ui:underline" />      </ToggleButton>    </ToggleButtonGroup>    <Separator />    <ButtonGroup variant="tertiary" separator>      <Button icon-only aria-label="Align left">        <Icon icon="gravity-ui:text-align-left" />      </Button>      <Button icon-only aria-label="Align center">        <Icon icon="gravity-ui:text-align-center" />      </Button>      <Button icon-only aria-label="Align right">        <Icon icon="gravity-ui:text-align-right" />      </Button>    </ButtonGroup>  </Toolbar></template>

Customization

Tailwind CSS

<script setup lang="ts">import { Icon } from '@iconify/vue'import { ToggleButton, ToggleButtonGroup, Toolbar } from '@hareui/vue'const toggleClass = 'rounded-lg data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground'</script><template>  <Toolbar    aria-label="Formatting toolbar"    class="gap-1 rounded-xl border border-border/80 bg-surface-secondary p-1.5"  >    <ToggleButtonGroup aria-label="Text style" class="gap-0.5" selection-mode="multiple">      <ToggleButton icon-only aria-label="Bold" :class="toggleClass" value="bold">        <Icon icon="gravity-ui:bold" />      </ToggleButton>      <ToggleButton icon-only aria-label="Italic" :class="toggleClass" value="italic">        <Icon icon="gravity-ui:italic" />      </ToggleButton>      <ToggleButton icon-only aria-label="Underline" :class="toggleClass" value="underline">        <Icon icon="gravity-ui:underline" />      </ToggleButton>    </ToggleButtonGroup>  </Toolbar></template>

Global theme override

Override the toolbar theme app-wide with createHareUI:

app.use(createHareUI({
  ui: {
    toolbar: {
      slots: { base: 'gap-4 rounded-lg bg-surface p-3' },
    },
  },
}))

Styling Reference

The root carries data-slot="toolbar" and data-orientation, as in HeroUI.

ui keyHeroUI selectorDescription
base.toolbarBase container
separatorVertical.toolbar .separator--verticalClasses added to each vertical Separator inside the toolbar
separatorHorizontal.toolbar .separator--horizontalClasses added to each horizontal Separator inside the toolbar
buttonGroup.toolbar--vertical .button-groupClasses added to each ButtonGroup inside the toolbar

Variants: orientation (horizontal, vertical) and attached (surface background with full rounding).

Inside a Toolbar, ToggleButtonGroups and ButtonGroups take the toolbar's orientation and Separators take the perpendicular one, unless they set orientation themselves.

API Reference

Props

PropTypeDefaultDescription
asAsTag | Component"div"The element or component to render as.
orientation"horizontal" | "vertical""horizontal"The orientation of the toolbar. Arrow keys follow it, ToggleButtonGroups inside take it, and Separators inside take the perpendicular one.
attachedbooleanfalseWhether the toolbar has a surface background with full rounding (HeroUI's isAttached).
uiComponentSlots<{ slots: { base: string; separatorVertical: string; separatorHorizontal: string; buttonGroup: string; }; variants: { orientation: { horizontal: { base: string; }; vertical: { base: string; buttonGroup: string; }; }; attached: { true: { base: string; }; }; }; defaultVariants: { orientation: string; attached: boolean; }; }>-Per-slot class overrides.

Slots

SlotPropsDescription
default{ orientation: "horizontal" | "vertical"; }Toolbar controls; receives HeroUI's render props.

On this page

No Headings