Components

Menu

A floating menu of actions, anchored to a trigger element.

A dropdown menu positioned relative to a trigger. Supports plain items, checkboxes, radio groups, separators, labels, submenus, and grouped item arrays.

Anatomy

  • #trigger — element that opens the menu

Items are rendered internally from the items prop. Individual items can be overridden via named slots using item.slot.

Usage

Examples

Grouped items with separators

Pass an array of arrays — Akaza UI inserts separators automatically between groups.

<script setup lang="ts">
const items = [
  [
    { label: "Edit", value: "edit" },
    { label: "Rename", value: "rename" },
  ],
  [
    { label: "Delete", value: "delete" },
  ],
];
</script>

<template>
  <Menu :items="items">
    <template #trigger="{ toggle }">
      <button @click="() => toggle()">More ▾</button>
    </template>
  </Menu>
</template>

Checkbox items

<script setup lang="ts">
const items = [
  { type: "checkbox", label: "Show sidebar", checked: true, value: "sidebar",
    onUpdateChecked: (v) => console.log("sidebar:", v) },
  { type: "checkbox", label: "Compact mode", checked: false, value: "compact",
    onUpdateChecked: (v) => console.log("compact:", v) },
];
</script>

Radio group

<script setup lang="ts">
import { ref } from "vue";
const radioValues = ref({ view: "list" });

const items = [
  { type: "radio", label: "Grid", value: "grid", radioGroup: "view" },
  { type: "radio", label: "List", value: "list", radioGroup: "view" },
];
</script>

<template>
  <Menu :items="items" v-model:radio-values="radioValues">
    <template #trigger="{ toggle }">
      <button @click="() => toggle()">View ▾</button>
    </template>
  </Menu>
</template>
<script setup lang="ts">
const items = [
  { label: "Share", children: [
    { label: "Copy link", value: "copy-link" },
    { label: "Send email", value: "send-email" },
  ]},
];
</script>

API Reference

Props

PropTypeDefaultDescription
itemsMenuItem[] | MenuItem[][]Flat array or grouped array (groups get auto-separators).
side"top" | "bottom" | "left" | "right""bottom"Preferred side to position the menu.
align"start" | "center" | "end""start"Alignment relative to the trigger.
sideOffsetnumber4Gap in px between trigger and menu.
closeOnSelectbooleantrueClose the menu after an item is selected.
radioValuesRecord<string, string>v-model:radio-values — state for radio groups.
teleportstring | falsefalseTeleport target for the menu.
asstring | Component"div"Root element tag.
uiMenuUiCSS class overrides.
KeyTypeDescription
labelstringDisplay label.
valuestringUnique value identifier.
type"item" | "checkbox" | "radio" | "separator" | "label"Item type. Defaults to "item".
disabledbooleanDisables this item.
checkedbooleanChecked state for checkbox items.
onUpdateChecked(checked: boolean) => voidCalled when a checkbox item changes.
radioGroupstringRadio group key for radio items.
childrenMenuItem[] | MenuItem[][]Sub-menu items.
slotstringNamed slot key for per-item render override.
onSelect() => voidPer-item select callback.

Slots

SlotScoped propsDescription
trigger{ isOpen, open, close, toggle, triggerProps }The element that opens the menu.
[item.slot]{ item }Per-item render override when item.slot is set.

Exposed methods

MethodSignatureDescription
open(reason?, event?) => voidOpens the menu.
close(reason?, event?) => voidCloses the menu.
toggle(reason?, event?) => voidToggles the menu.

Emits

EventPayloadDescription
open-change[open: boolean, details]Fired when the open state changes.
select[item: MenuItem, details]Fired when an item is selected.
check-change[item: MenuItem, checked: boolean, details]Fired when a checkbox item changes.
radio-change[group: string, value: string, details]Fired when a radio item is selected.
update:radioValues[values: Record<string, string>]v-model event for radio group state.

UI Options

KeyDescription
contentThe floating menu panel.
itemEach menu item element.
separatorSeparator elements between groups.
labelLabel-type item elements.
groupGroup wrapper element.
submenuContentSubmenu panel element.