Meet Frontfriend.Your brand. Your rules. Your agents, connected.Explore what’s new
DocumentationDropdownMenu

DropdownMenu

Displays a menu to the user — such as a set of actions or functions — triggered by a button.

Interactive preview

Rendered from the shared Frontfriend stories with React Base, the same preview Studio shows. Styling comes from your Design System; the code below is native to Reka UI.

Installation

Complete project setup first. Your configuration must select vue/reka and include your Design System ID.

pnpm exec frontfriend download dropdown-menu -f vue --primitive reka

Review dependencies reported by the downloader and keep your source changes in version control.

Usage

<script setup lang="ts">
import { DropdownMenu } from "@/components/ui/dropdown-menu";
import { DropdownMenuTrigger } from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";
import { DropdownMenuContent } from "@/components/ui/dropdown-menu";
import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
import { reactive } from "vue";

const args = reactive({
  "open": false,
  "label": "Open menu",
});
</script>

<template>
  <DropdownMenu v-model:open="args.open"
    ><DropdownMenuTrigger as-child
      ><Button>{{ args.label }}</Button></DropdownMenuTrigger
    ><DropdownMenuContent
      ><DropdownMenuItem>Profile</DropdownMenuItem
      ><DropdownMenuItem>Settings</DropdownMenuItem></DropdownMenuContent
    ></DropdownMenu
  >
</template>

Examples

Default

<script setup lang="ts">
import { DropdownMenu } from "@/components/ui/dropdown-menu";
import { DropdownMenuTrigger } from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";
import { DropdownMenuContent } from "@/components/ui/dropdown-menu";
import { DropdownMenuLabel } from "@/components/ui/dropdown-menu";
import { DropdownMenuSeparator } from "@/components/ui/dropdown-menu";
import { DropdownMenuGroup } from "@/components/ui/dropdown-menu";
import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
import { Icon } from "@/components/ui/icon";
import { DropdownMenuShortcut } from "@/components/ui/dropdown-menu";
import { DropdownMenuSub } from "@/components/ui/dropdown-menu";
import { DropdownMenuSubTrigger } from "@/components/ui/dropdown-menu";
import { DropdownMenuPortal } from "@/components/ui/dropdown-menu";
import { DropdownMenuSubContent } from "@/components/ui/dropdown-menu";

const args = {

};
</script>

<template>
  <DropdownMenu>
    <DropdownMenuTrigger as-child>
      <Button variant="tertiary" size="lg">Open</Button>
    </DropdownMenuTrigger>
    <DropdownMenuContent v-bind="args">
      <DropdownMenuLabel>My Account</DropdownMenuLabel>
      <DropdownMenuSeparator />
      <DropdownMenuGroup>
        <DropdownMenuItem>
          <Icon name="User" size="4" class="mr-2" />
          <span>Profile</span>
          <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
        </DropdownMenuItem>
        <DropdownMenuItem>
          <Icon name="CreditCard" size="4" class="mr-2" />
          <span>Billing</span>
          <DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
        </DropdownMenuItem>
        <DropdownMenuItem>
          <Icon name="Settings" size="4" class="mr-2" />
          <span>Settings</span>
          <DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
        </DropdownMenuItem>
        <DropdownMenuItem>
          <Icon name="Keyboard" size="4" class="mr-2" />
          <span>Keyboard shortcuts</span>
          <DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
        </DropdownMenuItem>
      </DropdownMenuGroup>
      <DropdownMenuSeparator />
      <DropdownMenuGroup>
        <DropdownMenuItem>
          <Icon name="Users" size="4" class="mr-2" />
          <span>Team</span>
        </DropdownMenuItem>
        <DropdownMenuSub>
          <DropdownMenuSubTrigger>
            <Icon name="UserPlus" size="4" class="mr-2" />
            <span class="pl-2">Invite users</span>
          </DropdownMenuSubTrigger>
          <DropdownMenuPortal>
            <DropdownMenuSubContent>
              <DropdownMenuItem>
                <Icon name="Mail" size="4" class="mr-2" />
                <span>Email</span>
              </DropdownMenuItem>
              <DropdownMenuItem>
                <Icon name="MessageSquare" size="4" class="mr-2" />
                <span>Message</span>
              </DropdownMenuItem>
              <DropdownMenuSeparator />
              <DropdownMenuItem>
                <Icon name="CirclePlus" size="4" class="mr-2" />
                <span>More...</span>
              </DropdownMenuItem>
            </DropdownMenuSubContent>
          </DropdownMenuPortal>
        </DropdownMenuSub>
        <DropdownMenuItem>
          <Icon name="Plus" size="4" class="mr-2" />
          <span>New Team</span>
          <DropdownMenuShortcut>⌘+T</DropdownMenuShortcut>
        </DropdownMenuItem>
      </DropdownMenuGroup>
      <DropdownMenuSeparator />
      <DropdownMenuItem>
        <Icon name="Github" size="4" class="mr-2" />
        <span>GitHub</span>
      </DropdownMenuItem>
      <DropdownMenuItem>
        <Icon name="LifeBuoy" size="4" class="mr-2" />
        <span>Support</span>
      </DropdownMenuItem>
      <DropdownMenuItem disabled>
        <Icon name="Cloud" size="4" class="mr-2" />
        <span>API</span>
      </DropdownMenuItem>
      <DropdownMenuSeparator />
      <DropdownMenuItem variant="destructive">
        <Icon name="LogOut" size="4" class="mr-2" />
        <span>Log out</span>
        <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
      </DropdownMenuItem>
    </DropdownMenuContent>
  </DropdownMenu>
</template>

Checkboxes

<script setup lang="ts">
import { DropdownMenu } from "@/components/ui/dropdown-menu";
import { DropdownMenuCheckboxItem } from "@/components/ui/dropdown-menu";
import { DropdownMenuContent } from "@/components/ui/dropdown-menu";
import { DropdownMenuTrigger } from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";
import { ref } from "vue";
import type { DropdownMenuCheckboxItemProps } from "radix-vue";

// Internal Components
type Checked = DropdownMenuCheckboxItemProps["checked"];

const DropdownMenuCheckboxExample = {
  components: {
    DropdownMenu,
    DropdownMenuCheckboxItem,
    DropdownMenuContent,
    DropdownMenuTrigger,
    Button,
  },
  setup() {
    const showStatusBar = ref<Checked>(true);
    const showActivityBar = ref<Checked>(false);
    const showPanel = ref<Checked>(true);
    return {
      showStatusBar,
      showActivityBar,
      showPanel,
    };
  },
  template: `
    <DropdownMenu>
      <DropdownMenuTrigger as-child>
        <Button variant="tertiary" icon="Columns3" iconPosition="prefix">
          Columns
        </Button>
      </DropdownMenuTrigger>
      <DropdownMenuContent class="w-[160px]" align="start">
        <DropdownMenuCheckboxItem
          v-model:checked="showStatusBar"
        >
          Column 1
        </DropdownMenuCheckboxItem>
        <DropdownMenuCheckboxItem
          v-model:checked="showActivityBar"
        >
          Column 2
        </DropdownMenuCheckboxItem>
        <DropdownMenuCheckboxItem
          v-model:checked="showPanel"
        >
          Column 3
        </DropdownMenuCheckboxItem>
      </DropdownMenuContent>
    </DropdownMenu>
  `,
};

const args = {

};
</script>

<template>
  <DropdownMenuCheckboxExample />
</template>

Radio

<script setup lang="ts">
import { DropdownMenu } from "@/components/ui/dropdown-menu";
import { DropdownMenuContent } from "@/components/ui/dropdown-menu";
import { DropdownMenuLabel } from "@/components/ui/dropdown-menu";
import { DropdownMenuRadioGroup } from "@/components/ui/dropdown-menu";
import { DropdownMenuRadioItem } from "@/components/ui/dropdown-menu";
import { DropdownMenuSeparator } from "@/components/ui/dropdown-menu";
import { DropdownMenuTrigger } from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";
import { ref } from "vue";

const DropdownMenuRadioExample = {
  components: {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuLabel,
    DropdownMenuRadioGroup,
    DropdownMenuRadioItem,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
    Button,
  },
  setup() {
    const position = ref("bottom");
    return {
      position,
    };
  },
  template: `
    <DropdownMenu>
      <DropdownMenuTrigger as-child>
        <Button variant="tertiary">
          Open
        </Button>
      </DropdownMenuTrigger>
      <DropdownMenuContent class="w-56">
        <DropdownMenuLabel>Panel Position</DropdownMenuLabel>
        <DropdownMenuSeparator />
        <DropdownMenuRadioGroup v-model="position">
          <DropdownMenuRadioItem value="top">
            Top
          </DropdownMenuRadioItem>
          <DropdownMenuRadioItem value="bottom">
            Bottom
          </DropdownMenuRadioItem>
          <DropdownMenuRadioItem value="right">
            Right
          </DropdownMenuRadioItem>
        </DropdownMenuRadioGroup>
      </DropdownMenuContent>
    </DropdownMenu>
  `,
};

const args = {

};
</script>

<template>
  <DropdownMenuRadioExample />
</template>

API reference

Frontfriend-owned props. Native HTML and inherited primitive props remain documented by Reka UI.

DropdownMenuItem

Prop Type Default Description
class HTMLAttributes["class"] —
inset boolean —
variant "default" | "destructive" —

DropdownMenuLabel

Prop Type Default Description
class HTMLAttributes["class"] —
inset boolean —

DropdownMenuSeparator

Prop Type Default Description
class HTMLAttributes["class"] —

DropdownMenuShortcut

Prop Type Default Description
class HTMLAttributes["class"] —
variant "default" | "destructive" —

DropdownMenuSubContent

Prop Type Default Description
class HTMLAttributes["class"] —

DropdownMenuSubTrigger

Prop Type Default Description
class HTMLAttributes["class"] —
inset boolean —

Configuration determines the actual classes and available styling hooks. See Theming & component configuration before introducing a repeated local override.