Docs Components Navigation

Menubar

React example follows below.
ts
/**
* Menubar fixture. `defaultOpen` pins the one-menu-open state all five
* adapters render, and the File menu covers every row shape the shared
* `.gr-dropdown-menu__item` surface has: plain, shortcut-bearing, divider,
* danger, and disabled.
*/
const menubarFixture = {
id: "menubar",
defaultOpen: 0,
menus: [
{
label: "File",
items: [
{ label: "New service", shortcut: "⌘N" },
{ label: "Open recent" },
{ divider: true },
{ label: "Tear down", danger: true },
],
},
{
label: "Edit",
items: [
{ label: "Undo", shortcut: "⌘Z" },
{ label: "Redo", shortcut: "⇧⌘Z", disabled: true },
],
},
{ label: "View", items: [{ label: "Toggle sidebar", shortcut: "⌘B" }] },
],
} satisfies {
id: string;
defaultOpen: number;
menus: readonly {
label: string;
items: readonly (
| { label: string; shortcut?: string; danger?: boolean; disabled?: boolean }
| { divider: true }
)[];
}[];
};
import { Menubar, type MenubarMenu } from "@grassroot/ui-react";
export default function MenubarDemo() {
return (
<div style={{ minHeight: "220px" }}>
<Menubar
menus={menubarFixture.menus as unknown as MenubarMenu[]}
defaultOpen={menubarFixture.defaultOpen}
/>
</div>
);
}
ts
<script setup lang="ts">
/**
* Menubar fixture. `defaultOpen` pins the one-menu-open state all five
* adapters render, and the File menu covers every row shape the shared
* `.gr-dropdown-menu__item` surface has: plain, shortcut-bearing, divider,
* danger, and disabled.
*/
const menubarFixture = {
id: "menubar",
defaultOpen: 0,
menus: [
{
label: "File",
items: [
{ label: "New service", shortcut: "⌘N" },
{ label: "Open recent" },
{ divider: true },
{ label: "Tear down", danger: true },
],
},
{
label: "Edit",
items: [
{ label: "Undo", shortcut: "⌘Z" },
{ label: "Redo", shortcut: "⇧⌘Z", disabled: true },
],
},
{ label: "View", items: [{ label: "Toggle sidebar", shortcut: "⌘B" }] },
],
} satisfies {
id: string;
defaultOpen: number;
menus: readonly {
label: string;
items: readonly (
| { label: string; shortcut?: string; danger?: boolean; disabled?: boolean }
| { divider: true }
)[];
}[];
};
import { Menubar, type MenubarMenu } from "@grassroot/ui-vue";
const menus = menubarFixture.menus as unknown as MenubarMenu[];
</script>
<template>
<div style="min-height: 220px">
<Menubar :menus="menus" :default-open="menubarFixture.defaultOpen" />
</div>
</template>
ts
import { Component } from "@angular/core";
/**
* Menubar fixture. `defaultOpen` pins the one-menu-open state all five
* adapters render, and the File menu covers every row shape the shared
* `.gr-dropdown-menu__item` surface has: plain, shortcut-bearing, divider,
* danger, and disabled.
*/
const menubarFixture = {
id: "menubar",
defaultOpen: 0,
menus: [
{
label: "File",
items: [
{ label: "New service", shortcut: "⌘N" },
{ label: "Open recent" },
{ divider: true },
{ label: "Tear down", danger: true },
],
},
{
label: "Edit",
items: [
{ label: "Undo", shortcut: "⌘Z" },
{ label: "Redo", shortcut: "⇧⌘Z", disabled: true },
],
},
{ label: "View", items: [{ label: "Toggle sidebar", shortcut: "⌘B" }] },
],
} satisfies {
id: string;
defaultOpen: number;
menus: readonly {
label: string;
items: readonly (
| { label: string; shortcut?: string; danger?: boolean; disabled?: boolean }
| { divider: true }
)[];
}[];
};
import { GrassrootMenubar, type MenubarMenu } from "@grassroot/ui-angular";
@Component({
selector: "app-menubar-demo",
standalone: true,
imports: [GrassrootMenubar],
template: `
<div style="min-height:220px">
<grassroot-menubar [menus]="menus" [defaultOpen]="fixture.defaultOpen" />
</div>
`,
})
export class MenubarDemoComponent {
protected readonly fixture = menubarFixture;
protected readonly menus = menubarFixture.menus as unknown as MenubarMenu[];
}
export default MenubarDemoComponent;
ts
<script lang="ts">
import { Menubar, type MenubarMenu } from "@grassroot/ui-svelte";
/**
* Menubar fixture. `defaultOpen` pins the one-menu-open state all five
* adapters render, and the File menu covers every row shape the shared
* `.gr-dropdown-menu__item` surface has: plain, shortcut-bearing, divider,
* danger, and disabled.
*/
const menubarFixture = {
id: "menubar",
defaultOpen: 0,
menus: [
{
label: "File",
items: [
{ label: "New service", shortcut: "⌘N" },
{ label: "Open recent" },
{ divider: true },
{ label: "Tear down", danger: true },
],
},
{
label: "Edit",
items: [
{ label: "Undo", shortcut: "⌘Z" },
{ label: "Redo", shortcut: "⇧⌘Z", disabled: true },
],
},
{ label: "View", items: [{ label: "Toggle sidebar", shortcut: "⌘B" }] },
],
} satisfies {
id: string;
defaultOpen: number;
menus: readonly {
label: string;
items: readonly (
| { label: string; shortcut?: string; danger?: boolean; disabled?: boolean }
| { divider: true }
)[];
}[];
};
</script>
<div style="min-height:220px">
<Menubar
menus={menubarFixture.menus as unknown as MenubarMenu[]}
defaultOpen={menubarFixture.defaultOpen}
/>
</div>
ts
/** @jsxImportSource solid-js */
import { Menubar, type MenubarMenu } from "@grassroot/ui-solid";
/**
* Menubar fixture. `defaultOpen` pins the one-menu-open state all five
* adapters render, and the File menu covers every row shape the shared
* `.gr-dropdown-menu__item` surface has: plain, shortcut-bearing, divider,
* danger, and disabled.
*/
const menubarFixture = {
id: "menubar",
defaultOpen: 0,
menus: [
{
label: "File",
items: [
{ label: "New service", shortcut: "⌘N" },
{ label: "Open recent" },
{ divider: true },
{ label: "Tear down", danger: true },
],
},
{
label: "Edit",
items: [
{ label: "Undo", shortcut: "⌘Z" },
{ label: "Redo", shortcut: "⇧⌘Z", disabled: true },
],
},
{ label: "View", items: [{ label: "Toggle sidebar", shortcut: "⌘B" }] },
],
} satisfies {
id: string;
defaultOpen: number;
menus: readonly {
label: string;
items: readonly (
| { label: string; shortcut?: string; danger?: boolean; disabled?: boolean }
| { divider: true }
)[];
}[];
};
export default function MenubarDemo() {
return (
<div style="min-height:220px">
<Menubar
menus={menubarFixture.menus as unknown as MenubarMenu[]}
defaultOpen={menubarFixture.defaultOpen}
/>
</div>
);
}

Installation

API Reference

Import

import { Menubar, type MenubarMenu } from "@grassroot/ui-react";

Props

Prop
Type
Default
Requirement
Description
menus
MenubarMenu[]
required
defaultOpen
number | undefined
optional
Open the menu at this index initially (handy for stories).
className
string | undefined
optional
Prop
menus
Type
MenubarMenu[]
Default
Requirement
required
Description
Prop
defaultOpen
Type
number | undefined
Default
Requirement
optional
Description
Open the menu at this index initially (handy for stories).
Prop
className
Type
string | undefined
Default
Requirement
optional
Description

Import

import { Menubar, type MenubarMenu } from "@grassroot/ui-vue";

Props

Prop
Type
Default
Requirement
menus
readonly MenubarMenu[]
required
defaultOpen
number | undefined
undefined
optional
Prop
menus
Type
readonly MenubarMenu[]
Default
Requirement
required
Prop
defaultOpen
Type
number | undefined
Default
undefined
Requirement
optional

Import

import { Component } from "@angular/core";
import { GrassrootMenubar, type MenubarMenu } from "@grassroot/ui-angular";

Props

Prop
Type
Default
Requirement
menus
readonly MenubarMenu[]
required
defaultOpen
number | null
null
optional
Prop
menus
Type
readonly MenubarMenu[]
Default
Requirement
required
Prop
defaultOpen
Type
number | null
Default
null
Requirement
optional

Import

import { Menubar, type MenubarMenu } from "@grassroot/ui-svelte";

Props

Prop
Type
Default
Requirement
menus
readonly MenubarMenu[]
required
defaultOpen
number
optional
className
string
optional
Prop
menus
Type
readonly MenubarMenu[]
Default
Requirement
required
Prop
defaultOpen
Type
number
Default
Requirement
optional
Prop
className
Type
string
Default
Requirement
optional

Import

import { Menubar, type MenubarMenu } from "@grassroot/ui-solid";

Props

Prop
Type
Default
Requirement
menus
MenubarMenu[]
required
defaultOpen
number
optional
className
string
optional
Prop
menus
Type
MenubarMenu[]
Default
Requirement
required
Prop
defaultOpen
Type
number
Default
Requirement
optional
Prop
className
Type
string
Default
Requirement
optional