md-menu spec card
Identity · when to use / when NOT · decision cues · behavioural contract · do/don't · anti-patterns · full API. Paste into your agent when you're implementing with this component.
A temporary set of actions or options, anchored to a trigger. It handles
placement, flipping, roving focus, typeahead and dismissal. It is also the
dropdown surface inside md-select,
md-multi-select,
md-autocomplete and
md-date-picker.
The menus below start closed — click a trigger to open one.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-icon-button id="more" icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="overflow" anchor="more" placement="bottom-start">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
<script type="module">
const trigger = document.getElementById('more');
const menu = document.getElementById('overflow');
// The menu never wires its own trigger — opening it, and the trigger's ARIA,
// are both yours.
trigger.setAttribute('aria-haspopup', 'menu');
trigger.addEventListener('click', () => menu.show());
menu.addEventListener('mdOpen', () => trigger.setAttribute('aria-expanded', 'true'));
menu.addEventListener('mdClose', () => trigger.setAttribute('aria-expanded', 'false'));
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useEffect, useRef } from 'react';
import { MdIconButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const triggerRef = useRef(null);
const menuRef = useRef(null);
useEffect(() => {
const trigger = triggerRef.current;
const menu = menuRef.current;
// The menu never wires its own trigger — opening it, and the trigger's ARIA,
// are both yours.
trigger.setAttribute('aria-haspopup', 'menu');
trigger.addEventListener('click', () => menu.show());
menu.addEventListener('mdOpen', () => trigger.setAttribute('aria-expanded', 'true'));
menu.addEventListener('mdClose', () => trigger.setAttribute('aria-expanded', 'false'));
}, []);
return (
<>
<MdIconButton id="more" ref={triggerRef} icon="more_vert" aria-label="More actions"></MdIconButton>
<MdMenu id="overflow" ref={menuRef} anchor="more" placement="bottom-start">
<MdMenuItem headline="Rename"></MdMenuItem>
<MdMenuItem headline="Duplicate"></MdMenuItem>
<MdMenuItem headline="Delete"></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
// app.component.ts
import { AfterViewInit, Component, ElementRef, ViewChild } from '@angular/core';
@Component({
selector: 'app-demo',
templateUrl: './app.component.html',
})
export class DemoComponent implements AfterViewInit {
@ViewChild('trigger') triggerRef!: ElementRef;
@ViewChild('menu') menuRef!: ElementRef;
ngAfterViewInit() {
const trigger = this.triggerRef.nativeElement;
const menu = this.menuRef.nativeElement;
// The menu never wires its own trigger — opening it, and the trigger's ARIA,
// are both yours.
trigger.setAttribute('aria-haspopup', 'menu');
trigger.addEventListener('click', () => menu.show());
menu.addEventListener('mdOpen', () => trigger.setAttribute('aria-expanded', 'true'));
menu.addEventListener('mdClose', () => trigger.setAttribute('aria-expanded', 'false'));
}
}
<!-- app.component.html -->
<md-icon-button id="more" #trigger icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="overflow" #menu anchor="more" placement="bottom-start">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { onMounted, ref } from 'vue';
import '@awc-ui/core/define';
const triggerRef = ref(null);
const menuRef = ref(null);
onMounted(() => {
const trigger = triggerRef.value;
const menu = menuRef.value;
// The menu never wires its own trigger — opening it, and the trigger's ARIA,
// are both yours.
trigger.setAttribute('aria-haspopup', 'menu');
trigger.addEventListener('click', () => menu.show());
menu.addEventListener('mdOpen', () => trigger.setAttribute('aria-expanded', 'true'));
menu.addEventListener('mdClose', () => trigger.setAttribute('aria-expanded', 'false'));
});
</script>
<template>
<md-icon-button id="more" ref="triggerRef" icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="overflow" ref="menuRef" anchor="more" placement="bottom-start">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { onMount } from 'svelte';
import '@awc-ui/core/define';
let triggerRef;
let menuRef;
onMount(() => {
const trigger = triggerRef;
const menu = menuRef;
// The menu never wires its own trigger — opening it, and the trigger's ARIA,
// are both yours.
trigger.setAttribute('aria-haspopup', 'menu');
trigger.addEventListener('click', () => menu.show());
menu.addEventListener('mdOpen', () => trigger.setAttribute('aria-expanded', 'true'));
menu.addEventListener('mdClose', () => trigger.setAttribute('aria-expanded', 'false'));
});
</script>
<md-icon-button id="more" bind:this={triggerRef} icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="overflow" bind:this={menuRef} anchor="more" placement="bottom-start">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
Already installed? See the
Installation guide for one-time package setup
(core + tokens, fonts). Each tab below shows two patterns for using
md-menu in your project: Option A registers every AWC UI
component at once (simplest), Option B imports only this component for
tree-shake-friendly bundles.
<!-- ─── Option A: global registration (all components) ─── -->
<script type="module">
import '@awc-ui/core/define';
</script>
<!-- ─── Option B: single import (tree-shake only md-menu) ─── -->
<script type="module">
import '@awc-ui/core/components/md-menu';
</script>
<md-menu></md-menu>// ─── Option A: typed React wrapper (registers all components) ───
// Importing from '@awc-ui/react' calls defineCustomElements() as a
// side effect, so every md-* element becomes available in the browser.
import { MdMenu } from '@awc-ui/react';
export function Example() {
return <MdMenu></MdMenu>;
}
// ─── Option B: single import (tree-shake to only md-menu) ───
// Skip the wrapper and use the raw custom element. Smallest bundle,
// but you lose typed props/events on JSX.
import '@awc-ui/core/components/md-menu';
export function ExampleTreeShaken() {
return <md-menu></md-menu>;
}// ─── Option A: schema module (any md-* element accepted) ───
// Pair with `defineCustomElements(window)` in main.ts.
import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
template: `<md-menu></md-menu>`,
})
export class ExampleComponent {}
// ─── Option B: typed directive (tree-shake friendly) ───
// Pair with `import '@awc-ui/core/components/md-menu'` in main.ts.
import { Component } from '@angular/core';
import { MdMenu } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [MdMenu],
template: `<md-menu></md-menu>`,
})
export class ExampleTreeShakenComponent {}<!-- ─── Option A: typed Vue wrapper (registers all components) ─── -->
<script setup lang="ts">
import { MdMenu } from '@awc-ui/vue';
</script>
<template>
<MdMenu></MdMenu>
</template>
<!-- ─── Option B: single import (tree-shake to only md-menu) ─── -->
<script setup lang="ts">
import '@awc-ui/core/components/md-menu';
</script>
<template>
<md-menu></md-menu>
</template><!-- ─── Option A: global registration (done once in main entry) ─── -->
<!-- main.ts: -->
<!-- import { defineCustomElements } from '@awc-ui/svelte'; -->
<!-- defineCustomElements(window); -->
<md-menu></md-menu>
<!-- ─── Option B: single import (tree-shake to only md-menu) ─── -->
<script lang="ts">
import '@awc-ui/core/components/md-menu';
</script>
<md-menu></md-menu>md-sub-menu-item.| Situation | Use instead |
|---|---|
| Actions that should always be visible | md-toolbar |
| Choosing a value in a form | md-select / md-multi-select |
| 2–5 exclusive options | md-segmented-button |
| A list of records | md-list |
| A blocking decision | md-dialog |
| Supplementary panel content | md-side-sheet / md-bottom-sheet |
| Top-level navigation | md-navigation-bar / md-navigation-rail |
| One default action plus variants | md-split-button |
| Need | Setting |
|---|---|
| Commands (rename, delete) | Default menu semantics |
| Values the user picks from | listbox + presentation="option" rows |
| Multi-select rows | keep-open on the items (add persistent only if the menu should also survive an outside click) |
| Sections with headings | layout="grouped" + md-menu-item-group |
| Surface at least as wide as the trigger | match-anchor-width |
| A sheet on compact viewports | responsive |
| No open animation | quick |
The menu does not wire the trigger for you. Call show() yourself, and set
aria-haspopup / aria-expanded on the trigger — see
Accessibility.
Any element can be the trigger — a button, an icon button, a chip, a row:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="mt-btn" variant="filled" trailing-icon="arrow_drop_down">Button</md-button>
<md-menu id="mt-m1" anchor="mt-btn"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Duplicate"></md-menu-item></md-menu>
<md-icon-button id="mt-icon" icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="mt-m2" anchor="mt-icon"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Delete"></md-menu-item></md-menu>
<md-chip id="mt-chip" appearance="assist">Filter</md-chip>
<md-menu id="mt-m3" anchor="mt-chip"><md-menu-item headline="Newest" type="radio" selected></md-menu-item><md-menu-item headline="Oldest" type="radio"></md-menu-item></md-menu>
<script type="module">
document.getElementById('mt-btn').addEventListener('click', () => {
document.getElementById('mt-m1').show();
});
document.getElementById('mt-icon').addEventListener('click', () => {
document.getElementById('mt-m2').show();
});
document.getElementById('mt-chip').addEventListener('click', () => {
document.getElementById('mt-m3').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdChip, MdIconButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const mtM1Ref = useRef(null);
const mtM2Ref = useRef(null);
const mtM3Ref = useRef(null);
return (
<>
<MdButton id="mt-btn" variant="filled" trailingIcon="arrow_drop_down" onClick={() => mtM1Ref.current?.show()}>Button</MdButton>
<MdMenu id="mt-m1" ref={mtM1Ref} anchor="mt-btn"><MdMenuItem headline="Rename"></MdMenuItem><MdMenuItem headline="Duplicate"></MdMenuItem></MdMenu>
<MdIconButton id="mt-icon" icon="more_vert" aria-label="More actions" onClick={() => mtM2Ref.current?.show()}></MdIconButton>
<MdMenu id="mt-m2" ref={mtM2Ref} anchor="mt-icon"><MdMenuItem headline="Rename"></MdMenuItem><MdMenuItem headline="Delete"></MdMenuItem></MdMenu>
<MdChip id="mt-chip" appearance="assist" onClick={() => mtM3Ref.current?.show()}>Filter</MdChip>
<MdMenu id="mt-m3" ref={mtM3Ref} anchor="mt-chip"><MdMenuItem headline="Newest" type="radio" selected></MdMenuItem><MdMenuItem headline="Oldest" type="radio"></MdMenuItem></MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="mt-btn" variant="filled" trailing-icon="arrow_drop_down" (click)="mtM1.show()">Button</md-button>
<md-menu id="mt-m1" #mtM1 anchor="mt-btn"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Duplicate"></md-menu-item></md-menu>
<md-icon-button id="mt-icon" icon="more_vert" aria-label="More actions" (click)="mtM2.show()"></md-icon-button>
<md-menu id="mt-m2" #mtM2 anchor="mt-icon"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Delete"></md-menu-item></md-menu>
<md-chip id="mt-chip" appearance="assist" (click)="mtM3.show()">Filter</md-chip>
<md-menu id="mt-m3" #mtM3 anchor="mt-chip"><md-menu-item headline="Newest" type="radio" selected></md-menu-item><md-menu-item headline="Oldest" type="radio"></md-menu-item></md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const mtM1 = ref(null);
const mtM2 = ref(null);
const mtM3 = ref(null);
</script>
<template>
<md-button id="mt-btn" variant="filled" trailing-icon="arrow_drop_down" @click="mtM1?.show()">Button</md-button>
<md-menu id="mt-m1" ref="mtM1" anchor="mt-btn"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Duplicate"></md-menu-item></md-menu>
<md-icon-button id="mt-icon" icon="more_vert" aria-label="More actions" @click="mtM2?.show()"></md-icon-button>
<md-menu id="mt-m2" ref="mtM2" anchor="mt-icon"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Delete"></md-menu-item></md-menu>
<md-chip id="mt-chip" appearance="assist" @click="mtM3?.show()">Filter</md-chip>
<md-menu id="mt-m3" ref="mtM3" anchor="mt-chip"><md-menu-item headline="Newest" type="radio" selected></md-menu-item><md-menu-item headline="Oldest" type="radio"></md-menu-item></md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let mtM1;
let mtM2;
let mtM3;
</script>
<md-button id="mt-btn" variant="filled" trailing-icon="arrow_drop_down" on:click={() => mtM1?.show()}>Button</md-button>
<md-menu id="mt-m1" bind:this={mtM1} anchor="mt-btn"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Duplicate"></md-menu-item></md-menu>
<md-icon-button id="mt-icon" icon="more_vert" aria-label="More actions" on:click={() => mtM2?.show()}></md-icon-button>
<md-menu id="mt-m2" bind:this={mtM2} anchor="mt-icon"><md-menu-item headline="Rename"></md-menu-item><md-menu-item headline="Delete"></md-menu-item></md-menu>
<md-chip id="mt-chip" appearance="assist" on:click={() => mtM3?.show()}>Filter</md-chip>
<md-menu id="mt-m3" bind:this={mtM3} anchor="mt-chip"><md-menu-item headline="Newest" type="radio" selected></md-menu-item><md-menu-item headline="Oldest" type="radio"></md-menu-item></md-menu>placement is logical, so bottom-start follows the reading direction. The
menu flips to the opposite side when it would overflow the viewport, and slides
along the anchor when it would run off the inline edge — you do not opt in.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="ap-1" variant="outlined">bottom-start</md-button>
<md-menu id="ap-m1" anchor="ap-1" placement="bottom-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-2" variant="outlined">bottom-end</md-button>
<md-menu id="ap-m2" anchor="ap-2" placement="bottom-end"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-3" variant="outlined">top-start</md-button>
<md-menu id="ap-m3" anchor="ap-3" placement="top-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<script type="module">
document.getElementById('ap-1').addEventListener('click', () => {
document.getElementById('ap-m1').show();
});
document.getElementById('ap-2').addEventListener('click', () => {
document.getElementById('ap-m2').show();
});
document.getElementById('ap-3').addEventListener('click', () => {
document.getElementById('ap-m3').show();
});
</script>import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const apM1Ref = useRef(null);
const apM2Ref = useRef(null);
const apM3Ref = useRef(null);
return (
<>
<MdButton id="ap-1" variant="outlined" onClick={() => apM1Ref.current?.show()}>bottom-start</MdButton>
<MdMenu id="ap-m1" ref={apM1Ref} anchor="ap-1" placement="bottom-start"><MdMenuItem headline="One"></MdMenuItem><MdMenuItem headline="Two"></MdMenuItem></MdMenu>
<MdButton id="ap-2" variant="outlined" onClick={() => apM2Ref.current?.show()}>bottom-end</MdButton>
<MdMenu id="ap-m2" ref={apM2Ref} anchor="ap-2" placement="bottom-end"><MdMenuItem headline="One"></MdMenuItem><MdMenuItem headline="Two"></MdMenuItem></MdMenu>
<MdButton id="ap-3" variant="outlined" onClick={() => apM3Ref.current?.show()}>top-start</MdButton>
<MdMenu id="ap-m3" ref={apM3Ref} anchor="ap-3" placement="top-start"><MdMenuItem headline="One"></MdMenuItem><MdMenuItem headline="Two"></MdMenuItem></MdMenu>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="ap-1" variant="outlined" (click)="apM1.show()">bottom-start</md-button>
<md-menu id="ap-m1" #apM1 anchor="ap-1" placement="bottom-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-2" variant="outlined" (click)="apM2.show()">bottom-end</md-button>
<md-menu id="ap-m2" #apM2 anchor="ap-2" placement="bottom-end"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-3" variant="outlined" (click)="apM3.show()">top-start</md-button>
<md-menu id="ap-m3" #apM3 anchor="ap-3" placement="top-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu><script setup>
import { ref } from 'vue';
import '@awc-ui/core/define';
const apM1 = ref(null);
const apM2 = ref(null);
const apM3 = ref(null);
</script>
<template>
<md-button id="ap-1" variant="outlined" @click="apM1?.show()">bottom-start</md-button>
<md-menu id="ap-m1" ref="apM1" anchor="ap-1" placement="bottom-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-2" variant="outlined" @click="apM2?.show()">bottom-end</md-button>
<md-menu id="ap-m2" ref="apM2" anchor="ap-2" placement="bottom-end"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-3" variant="outlined" @click="apM3?.show()">top-start</md-button>
<md-menu id="ap-m3" ref="apM3" anchor="ap-3" placement="top-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
</template><script>
import '@awc-ui/core/define';
let apM1;
let apM2;
let apM3;
</script>
<md-button id="ap-1" variant="outlined" on:click={() => apM1?.show()}>bottom-start</md-button>
<md-menu id="ap-m1" bind:this={apM1} anchor="ap-1" placement="bottom-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-2" variant="outlined" on:click={() => apM2?.show()}>bottom-end</md-button>
<md-menu id="ap-m2" bind:this={apM2} anchor="ap-2" placement="bottom-end"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>
<md-button id="ap-3" variant="outlined" on:click={() => apM3?.show()}>top-start</md-button>
<md-menu id="ap-m3" bind:this={apM3} anchor="ap-3" placement="top-start"><md-menu-item headline="One"></md-menu-item><md-menu-item headline="Two"></md-menu-item></md-menu>baseline is the default. vibrant is high emphasis — M3 says use it
sparingly.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="menu-demo-t-baseline" variant="outlined">Baseline</md-button>
<md-menu id="menu-demo-m-baseline" anchor="menu-demo-t-baseline" variant="baseline">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-standard" variant="outlined">Standard</md-button>
<md-menu id="menu-demo-m-standard" anchor="menu-demo-t-standard" variant="standard">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-vibrant" variant="outlined">Vibrant</md-button>
<md-menu id="menu-demo-m-vibrant" anchor="menu-demo-t-vibrant" variant="vibrant">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('menu-demo-t-baseline').addEventListener('click', () => {
document.getElementById('menu-demo-m-baseline').show();
});
document.getElementById('menu-demo-t-standard').addEventListener('click', () => {
document.getElementById('menu-demo-m-standard').show();
});
document.getElementById('menu-demo-t-vibrant').addEventListener('click', () => {
document.getElementById('menu-demo-m-vibrant').show();
});
</script>import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const menuDemoMBaselineRef = useRef(null);
const menuDemoMStandardRef = useRef(null);
const menuDemoMVibrantRef = useRef(null);
return (
<>
<MdButton id="menu-demo-t-baseline" variant="outlined" onClick={() => menuDemoMBaselineRef.current?.show()}>Baseline</MdButton>
<MdMenu id="menu-demo-m-baseline" ref={menuDemoMBaselineRef} anchor="menu-demo-t-baseline" variant="baseline">
<MdMenuItem headline="Rename"></MdMenuItem>
<MdMenuItem headline="Duplicate"></MdMenuItem>
</MdMenu>
<MdButton id="menu-demo-t-standard" variant="outlined" onClick={() => menuDemoMStandardRef.current?.show()}>Standard</MdButton>
<MdMenu id="menu-demo-m-standard" ref={menuDemoMStandardRef} anchor="menu-demo-t-standard" variant="standard">
<MdMenuItem headline="Rename"></MdMenuItem>
<MdMenuItem headline="Duplicate"></MdMenuItem>
</MdMenu>
<MdButton id="menu-demo-t-vibrant" variant="outlined" onClick={() => menuDemoMVibrantRef.current?.show()}>Vibrant</MdButton>
<MdMenu id="menu-demo-m-vibrant" ref={menuDemoMVibrantRef} anchor="menu-demo-t-vibrant" variant="vibrant">
<MdMenuItem headline="Rename"></MdMenuItem>
<MdMenuItem headline="Duplicate"></MdMenuItem>
</MdMenu>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="menu-demo-t-baseline" variant="outlined" (click)="menuDemoMBaseline.show()">Baseline</md-button>
<md-menu id="menu-demo-m-baseline" #menuDemoMBaseline anchor="menu-demo-t-baseline" variant="baseline">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-standard" variant="outlined" (click)="menuDemoMStandard.show()">Standard</md-button>
<md-menu id="menu-demo-m-standard" #menuDemoMStandard anchor="menu-demo-t-standard" variant="standard">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-vibrant" variant="outlined" (click)="menuDemoMVibrant.show()">Vibrant</md-button>
<md-menu id="menu-demo-m-vibrant" #menuDemoMVibrant anchor="menu-demo-t-vibrant" variant="vibrant">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu><script setup>
import { ref } from 'vue';
import '@awc-ui/core/define';
const menuDemoMBaseline = ref(null);
const menuDemoMStandard = ref(null);
const menuDemoMVibrant = ref(null);
</script>
<template>
<md-button id="menu-demo-t-baseline" variant="outlined" @click="menuDemoMBaseline?.show()">Baseline</md-button>
<md-menu id="menu-demo-m-baseline" ref="menuDemoMBaseline" anchor="menu-demo-t-baseline" variant="baseline">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-standard" variant="outlined" @click="menuDemoMStandard?.show()">Standard</md-button>
<md-menu id="menu-demo-m-standard" ref="menuDemoMStandard" anchor="menu-demo-t-standard" variant="standard">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-vibrant" variant="outlined" @click="menuDemoMVibrant?.show()">Vibrant</md-button>
<md-menu id="menu-demo-m-vibrant" ref="menuDemoMVibrant" anchor="menu-demo-t-vibrant" variant="vibrant">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
</template><script>
import '@awc-ui/core/define';
let menuDemoMBaseline;
let menuDemoMStandard;
let menuDemoMVibrant;
</script>
<md-button id="menu-demo-t-baseline" variant="outlined" on:click={() => menuDemoMBaseline?.show()}>Baseline</md-button>
<md-menu id="menu-demo-m-baseline" bind:this={menuDemoMBaseline} anchor="menu-demo-t-baseline" variant="baseline">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-standard" variant="outlined" on:click={() => menuDemoMStandard?.show()}>Standard</md-button>
<md-menu id="menu-demo-m-standard" bind:this={menuDemoMStandard} anchor="menu-demo-t-standard" variant="standard">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-vibrant" variant="outlined" on:click={() => menuDemoMVibrant?.show()}>Vibrant</md-button>
<md-menu id="menu-demo-m-vibrant" bind:this={menuDemoMVibrant} anchor="menu-demo-t-vibrant" variant="vibrant">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
</md-menu>type="checkbox" and type="radio" turn rows into selection controls. Pair them
with keep-open so picking one doesn’t dismiss the menu, and use
check-position="start" when the checkmark should lead instead of trail. Note
that keep-open is all you need here: adding persistent to the menu would
also switch off outside-click dismissal, which a preference or sort menu
should keep:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check end (default)</span>
<md-button id="sel-cb-end-t" variant="outlined">Preferences</md-button>
<md-menu id="sel-cb-end-m" anchor="sel-cb-end-t" variant="standard">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check start</span>
<md-button id="sel-cb-start-t" variant="outlined">Preferences</md-button>
<md-menu id="sel-cb-start-m" anchor="sel-cb-start-t" variant="standard" check-position="start">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check end (default)</span>
<md-button id="sel-rd-end-t" variant="outlined">Sort</md-button>
<md-menu id="sel-rd-end-m" anchor="sel-rd-end-t" variant="standard">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check start</span>
<md-button id="sel-rd-start-t" variant="outlined">Sort</md-button>
<md-menu id="sel-rd-start-m" anchor="sel-rd-start-t" variant="standard" check-position="start">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
</div>
<script type="module">
document.getElementById('sel-cb-end-t').addEventListener('click', () => {
document.getElementById('sel-cb-end-m').show();
});
document.getElementById('sel-cb-start-t').addEventListener('click', () => {
document.getElementById('sel-cb-start-m').show();
});
document.getElementById('sel-rd-end-t').addEventListener('click', () => {
document.getElementById('sel-rd-end-m').show();
});
document.getElementById('sel-rd-start-t').addEventListener('click', () => {
document.getElementById('sel-rd-start-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const selCbEndMRef = useRef(null);
const selCbStartMRef = useRef(null);
const selRdEndMRef = useRef(null);
const selRdStartMRef = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '32px', flexWrap: 'wrap' }}>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Checkbox — check end (default)</span>
<MdButton id="sel-cb-end-t" variant="outlined" onClick={() => selCbEndMRef.current?.show()}>Preferences</MdButton>
<MdMenu id="sel-cb-end-m" ref={selCbEndMRef} anchor="sel-cb-end-t" variant="standard">
<MdMenuItem headline="Notifications" type="checkbox" keepOpen selected><span slot="leading-icon" className="material-symbols-outlined">notifications</span></MdMenuItem>
<MdMenuItem headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" className="material-symbols-outlined">dark_mode</span></MdMenuItem>
<MdMenuItem headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" className="material-symbols-outlined">view_compact</span></MdMenuItem>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Checkbox — check start</span>
<MdButton id="sel-cb-start-t" variant="outlined" onClick={() => selCbStartMRef.current?.show()}>Preferences</MdButton>
<MdMenu id="sel-cb-start-m" ref={selCbStartMRef} anchor="sel-cb-start-t" variant="standard" checkPosition="start">
<MdMenuItem headline="Notifications" type="checkbox" keepOpen selected><span slot="leading-icon" className="material-symbols-outlined">notifications</span></MdMenuItem>
<MdMenuItem headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" className="material-symbols-outlined">dark_mode</span></MdMenuItem>
<MdMenuItem headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" className="material-symbols-outlined">view_compact</span></MdMenuItem>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Radio — check end (default)</span>
<MdButton id="sel-rd-end-t" variant="outlined" onClick={() => selRdEndMRef.current?.show()}>Sort</MdButton>
<MdMenu id="sel-rd-end-m" ref={selRdEndMRef} anchor="sel-rd-end-t" variant="standard">
<MdMenuItem headline="Newest first" type="radio" keepOpen selected><span slot="leading-icon" className="material-symbols-outlined">arrow_upward</span></MdMenuItem>
<MdMenuItem headline="Oldest first" type="radio" keep-open><span slot="leading-icon" className="material-symbols-outlined">arrow_downward</span></MdMenuItem>
<MdMenuItem headline="Name" type="radio" keep-open><span slot="leading-icon" className="material-symbols-outlined">sort_by_alpha</span></MdMenuItem>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Radio — check start</span>
<MdButton id="sel-rd-start-t" variant="outlined" onClick={() => selRdStartMRef.current?.show()}>Sort</MdButton>
<MdMenu id="sel-rd-start-m" ref={selRdStartMRef} anchor="sel-rd-start-t" variant="standard" checkPosition="start">
<MdMenuItem headline="Newest first" type="radio" keepOpen selected><span slot="leading-icon" className="material-symbols-outlined">arrow_upward</span></MdMenuItem>
<MdMenuItem headline="Oldest first" type="radio" keep-open><span slot="leading-icon" className="material-symbols-outlined">arrow_downward</span></MdMenuItem>
<MdMenuItem headline="Name" type="radio" keep-open><span slot="leading-icon" className="material-symbols-outlined">sort_by_alpha</span></MdMenuItem>
</MdMenu>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check end (default)</span>
<md-button id="sel-cb-end-t" variant="outlined" (click)="selCbEndM.show()">Preferences</md-button>
<md-menu id="sel-cb-end-m" #selCbEndM anchor="sel-cb-end-t" variant="standard">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check start</span>
<md-button id="sel-cb-start-t" variant="outlined" (click)="selCbStartM.show()">Preferences</md-button>
<md-menu id="sel-cb-start-m" #selCbStartM anchor="sel-cb-start-t" variant="standard" check-position="start">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check end (default)</span>
<md-button id="sel-rd-end-t" variant="outlined" (click)="selRdEndM.show()">Sort</md-button>
<md-menu id="sel-rd-end-m" #selRdEndM anchor="sel-rd-end-t" variant="standard">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check start</span>
<md-button id="sel-rd-start-t" variant="outlined" (click)="selRdStartM.show()">Sort</md-button>
<md-menu id="sel-rd-start-m" #selRdStartM anchor="sel-rd-start-t" variant="standard" check-position="start">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const selCbEndM = ref(null);
const selCbStartM = ref(null);
const selRdEndM = ref(null);
const selRdStartM = ref(null);
</script>
<template>
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check end (default)</span>
<md-button id="sel-cb-end-t" variant="outlined" @click="selCbEndM?.show()">Preferences</md-button>
<md-menu id="sel-cb-end-m" ref="selCbEndM" anchor="sel-cb-end-t" variant="standard">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check start</span>
<md-button id="sel-cb-start-t" variant="outlined" @click="selCbStartM?.show()">Preferences</md-button>
<md-menu id="sel-cb-start-m" ref="selCbStartM" anchor="sel-cb-start-t" variant="standard" check-position="start">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check end (default)</span>
<md-button id="sel-rd-end-t" variant="outlined" @click="selRdEndM?.show()">Sort</md-button>
<md-menu id="sel-rd-end-m" ref="selRdEndM" anchor="sel-rd-end-t" variant="standard">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check start</span>
<md-button id="sel-rd-start-t" variant="outlined" @click="selRdStartM?.show()">Sort</md-button>
<md-menu id="sel-rd-start-m" ref="selRdStartM" anchor="sel-rd-start-t" variant="standard" check-position="start">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let selCbEndM;
let selCbStartM;
let selRdEndM;
let selRdStartM;
</script>
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check end (default)</span>
<md-button id="sel-cb-end-t" variant="outlined" on:click={() => selCbEndM?.show()}>Preferences</md-button>
<md-menu id="sel-cb-end-m" bind:this={selCbEndM} anchor="sel-cb-end-t" variant="standard">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Checkbox — check start</span>
<md-button id="sel-cb-start-t" variant="outlined" on:click={() => selCbStartM?.show()}>Preferences</md-button>
<md-menu id="sel-cb-start-m" bind:this={selCbStartM} anchor="sel-cb-start-t" variant="standard" check-position="start">
<md-menu-item headline="Notifications" type="checkbox" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">notifications</span></md-menu-item>
<md-menu-item headline="Dark mode" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">dark_mode</span></md-menu-item>
<md-menu-item headline="Compact view" type="checkbox" keep-open><span slot="leading-icon" class="material-symbols-outlined">view_compact</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check end (default)</span>
<md-button id="sel-rd-end-t" variant="outlined" on:click={() => selRdEndM?.show()}>Sort</md-button>
<md-menu id="sel-rd-end-m" bind:this={selRdEndM} anchor="sel-rd-end-t" variant="standard">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Radio — check start</span>
<md-button id="sel-rd-start-t" variant="outlined" on:click={() => selRdStartM?.show()}>Sort</md-button>
<md-menu id="sel-rd-start-m" bind:this={selRdStartM} anchor="sel-rd-start-t" variant="standard" check-position="start">
<md-menu-item headline="Newest first" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">arrow_upward</span></md-menu-item>
<md-menu-item headline="Oldest first" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">arrow_downward</span></md-menu-item>
<md-menu-item headline="Name" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">sort_by_alpha</span></md-menu-item>
</md-menu>
</div>
</div>One menu can mix a command, a checkbox and a radio group — the row type is
per row, not per menu:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="sel-mix-t" variant="outlined">View</md-button>
<md-menu id="sel-mix-m" anchor="sel-mix-t" variant="standard">
<md-menu-item headline="Reload"><span slot="leading-icon" class="material-symbols-outlined">refresh</span></md-menu-item>
<md-menu-item headline="Show sidebar" type="checkbox" keep-open selected divider><span slot="leading-icon" class="material-symbols-outlined">view_sidebar</span></md-menu-item>
<md-menu-item headline="Comfortable" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">density_large</span></md-menu-item>
<md-menu-item headline="Compact" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">density_small</span></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('sel-mix-t').addEventListener('click', () => {
document.getElementById('sel-mix-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const selMixMRef = useRef(null);
return (
<>
<MdButton id="sel-mix-t" variant="outlined" onClick={() => selMixMRef.current?.show()}>View</MdButton>
<MdMenu id="sel-mix-m" ref={selMixMRef} anchor="sel-mix-t" variant="standard">
<MdMenuItem headline="Reload"><span slot="leading-icon" className="material-symbols-outlined">refresh</span></MdMenuItem>
<MdMenuItem headline="Show sidebar" type="checkbox" keepOpen selected divider><span slot="leading-icon" className="material-symbols-outlined">view_sidebar</span></MdMenuItem>
<MdMenuItem headline="Comfortable" type="radio" keepOpen selected><span slot="leading-icon" className="material-symbols-outlined">density_large</span></MdMenuItem>
<MdMenuItem headline="Compact" type="radio" keep-open><span slot="leading-icon" className="material-symbols-outlined">density_small</span></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="sel-mix-t" variant="outlined" (click)="selMixM.show()">View</md-button>
<md-menu id="sel-mix-m" #selMixM anchor="sel-mix-t" variant="standard">
<md-menu-item headline="Reload"><span slot="leading-icon" class="material-symbols-outlined">refresh</span></md-menu-item>
<md-menu-item headline="Show sidebar" type="checkbox" keep-open selected divider><span slot="leading-icon" class="material-symbols-outlined">view_sidebar</span></md-menu-item>
<md-menu-item headline="Comfortable" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">density_large</span></md-menu-item>
<md-menu-item headline="Compact" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">density_small</span></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const selMixM = ref(null);
</script>
<template>
<md-button id="sel-mix-t" variant="outlined" @click="selMixM?.show()">View</md-button>
<md-menu id="sel-mix-m" ref="selMixM" anchor="sel-mix-t" variant="standard">
<md-menu-item headline="Reload"><span slot="leading-icon" class="material-symbols-outlined">refresh</span></md-menu-item>
<md-menu-item headline="Show sidebar" type="checkbox" keep-open selected divider><span slot="leading-icon" class="material-symbols-outlined">view_sidebar</span></md-menu-item>
<md-menu-item headline="Comfortable" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">density_large</span></md-menu-item>
<md-menu-item headline="Compact" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">density_small</span></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let selMixM;
</script>
<md-button id="sel-mix-t" variant="outlined" on:click={() => selMixM?.show()}>View</md-button>
<md-menu id="sel-mix-m" bind:this={selMixM} anchor="sel-mix-t" variant="standard">
<md-menu-item headline="Reload"><span slot="leading-icon" class="material-symbols-outlined">refresh</span></md-menu-item>
<md-menu-item headline="Show sidebar" type="checkbox" keep-open selected divider><span slot="leading-icon" class="material-symbols-outlined">view_sidebar</span></md-menu-item>
<md-menu-item headline="Comfortable" type="radio" keep-open selected><span slot="leading-icon" class="material-symbols-outlined">density_large</span></md-menu-item>
<md-menu-item headline="Compact" type="radio" keep-open><span slot="leading-icon" class="material-symbols-outlined">density_small</span></md-menu-item>
</md-menu>Any control can anchor a menu — the wiring is identical, only the trigger and
the menu’s variant change:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Filled button — baseline menu</span>
<md-button id="tr-bl-t" variant="filled">Actions</md-button>
<md-menu id="tr-bl-m" anchor="tr-bl-t" variant="baseline">
<md-menu-item headline="Edit"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Duplicate"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
<md-menu-item headline="Delete" divider><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
<md-menu-item headline="Move to"><span slot="leading-icon" class="material-symbols-outlined">drive_file_move</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Outlined button — standard menu</span>
<md-button id="tr-st-t" variant="outlined">File</md-button>
<md-menu id="tr-st-m" anchor="tr-st-t" variant="standard">
<md-menu-item headline="New" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open" trailing-text="⌘O"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S" divider><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
<md-menu-item headline="Export"><span slot="leading-icon" class="material-symbols-outlined">download</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Icon button — vibrant menu</span>
<md-icon-button id="tr-vb-t" icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="tr-vb-m" anchor="tr-vb-t" variant="vibrant">
<md-menu-item headline="Rename"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Share"><span slot="leading-icon" class="material-symbols-outlined">share</span></md-menu-item>
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
</md-menu>
</div>
</div>
<script type="module">
document.getElementById('tr-bl-t').addEventListener('click', () => {
document.getElementById('tr-bl-m').show();
});
document.getElementById('tr-st-t').addEventListener('click', () => {
document.getElementById('tr-st-m').show();
});
document.getElementById('tr-vb-t').addEventListener('click', () => {
document.getElementById('tr-vb-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdIconButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const trBlMRef = useRef(null);
const trStMRef = useRef(null);
const trVbMRef = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '40px', flexWrap: 'wrap' }}>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Filled button — baseline menu</span>
<MdButton id="tr-bl-t" variant="filled" onClick={() => trBlMRef.current?.show()}>Actions</MdButton>
<MdMenu id="tr-bl-m" ref={trBlMRef} anchor="tr-bl-t" variant="baseline">
<MdMenuItem headline="Edit"><span slot="leading-icon" className="material-symbols-outlined">edit</span></MdMenuItem>
<MdMenuItem headline="Duplicate"><span slot="leading-icon" className="material-symbols-outlined">content_copy</span></MdMenuItem>
<MdMenuItem headline="Delete" divider><span slot="leading-icon" className="material-symbols-outlined">delete</span></MdMenuItem>
<MdMenuItem headline="Move to"><span slot="leading-icon" className="material-symbols-outlined">drive_file_move</span></MdMenuItem>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Outlined button — standard menu</span>
<MdButton id="tr-st-t" variant="outlined" onClick={() => trStMRef.current?.show()}>File</MdButton>
<MdMenu id="tr-st-m" ref={trStMRef} anchor="tr-st-t" variant="standard">
<MdMenuItem headline="New" trailingText="⌘N"><span slot="leading-icon" className="material-symbols-outlined">note_add</span></MdMenuItem>
<MdMenuItem headline="Open" trailingText="⌘O"><span slot="leading-icon" className="material-symbols-outlined">folder_open</span></MdMenuItem>
<MdMenuItem headline="Save" trailingText="⌘S" divider><span slot="leading-icon" className="material-symbols-outlined">save</span></MdMenuItem>
<MdMenuItem headline="Export"><span slot="leading-icon" className="material-symbols-outlined">download</span></MdMenuItem>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Icon button — vibrant menu</span>
<MdIconButton id="tr-vb-t" icon="more_vert" aria-label="More actions" onClick={() => trVbMRef.current?.show()}></MdIconButton>
<MdMenu id="tr-vb-m" ref={trVbMRef} anchor="tr-vb-t" variant="vibrant">
<MdMenuItem headline="Rename"><span slot="leading-icon" className="material-symbols-outlined">edit</span></MdMenuItem>
<MdMenuItem headline="Share"><span slot="leading-icon" className="material-symbols-outlined">share</span></MdMenuItem>
<MdMenuItem headline="Archive"><span slot="leading-icon" className="material-symbols-outlined">archive</span></MdMenuItem>
</MdMenu>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Filled button — baseline menu</span>
<md-button id="tr-bl-t" variant="filled" (click)="trBlM.show()">Actions</md-button>
<md-menu id="tr-bl-m" #trBlM anchor="tr-bl-t" variant="baseline">
<md-menu-item headline="Edit"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Duplicate"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
<md-menu-item headline="Delete" divider><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
<md-menu-item headline="Move to"><span slot="leading-icon" class="material-symbols-outlined">drive_file_move</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Outlined button — standard menu</span>
<md-button id="tr-st-t" variant="outlined" (click)="trStM.show()">File</md-button>
<md-menu id="tr-st-m" #trStM anchor="tr-st-t" variant="standard">
<md-menu-item headline="New" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open" trailing-text="⌘O"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S" divider><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
<md-menu-item headline="Export"><span slot="leading-icon" class="material-symbols-outlined">download</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Icon button — vibrant menu</span>
<md-icon-button id="tr-vb-t" icon="more_vert" aria-label="More actions" (click)="trVbM.show()"></md-icon-button>
<md-menu id="tr-vb-m" #trVbM anchor="tr-vb-t" variant="vibrant">
<md-menu-item headline="Rename"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Share"><span slot="leading-icon" class="material-symbols-outlined">share</span></md-menu-item>
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
</md-menu>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const trBlM = ref(null);
const trStM = ref(null);
const trVbM = ref(null);
</script>
<template>
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Filled button — baseline menu</span>
<md-button id="tr-bl-t" variant="filled" @click="trBlM?.show()">Actions</md-button>
<md-menu id="tr-bl-m" ref="trBlM" anchor="tr-bl-t" variant="baseline">
<md-menu-item headline="Edit"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Duplicate"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
<md-menu-item headline="Delete" divider><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
<md-menu-item headline="Move to"><span slot="leading-icon" class="material-symbols-outlined">drive_file_move</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Outlined button — standard menu</span>
<md-button id="tr-st-t" variant="outlined" @click="trStM?.show()">File</md-button>
<md-menu id="tr-st-m" ref="trStM" anchor="tr-st-t" variant="standard">
<md-menu-item headline="New" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open" trailing-text="⌘O"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S" divider><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
<md-menu-item headline="Export"><span slot="leading-icon" class="material-symbols-outlined">download</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Icon button — vibrant menu</span>
<md-icon-button id="tr-vb-t" icon="more_vert" aria-label="More actions" @click="trVbM?.show()"></md-icon-button>
<md-menu id="tr-vb-m" ref="trVbM" anchor="tr-vb-t" variant="vibrant">
<md-menu-item headline="Rename"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Share"><span slot="leading-icon" class="material-symbols-outlined">share</span></md-menu-item>
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
</md-menu>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let trBlM;
let trStM;
let trVbM;
</script>
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Filled button — baseline menu</span>
<md-button id="tr-bl-t" variant="filled" on:click={() => trBlM?.show()}>Actions</md-button>
<md-menu id="tr-bl-m" bind:this={trBlM} anchor="tr-bl-t" variant="baseline">
<md-menu-item headline="Edit"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Duplicate"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
<md-menu-item headline="Delete" divider><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
<md-menu-item headline="Move to"><span slot="leading-icon" class="material-symbols-outlined">drive_file_move</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Outlined button — standard menu</span>
<md-button id="tr-st-t" variant="outlined" on:click={() => trStM?.show()}>File</md-button>
<md-menu id="tr-st-m" bind:this={trStM} anchor="tr-st-t" variant="standard">
<md-menu-item headline="New" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open" trailing-text="⌘O"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S" divider><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
<md-menu-item headline="Export"><span slot="leading-icon" class="material-symbols-outlined">download</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Icon button — vibrant menu</span>
<md-icon-button id="tr-vb-t" icon="more_vert" aria-label="More actions" on:click={() => trVbM?.show()}></md-icon-button>
<md-menu id="tr-vb-m" bind:this={trVbM} anchor="tr-vb-t" variant="vibrant">
<md-menu-item headline="Rename"><span slot="leading-icon" class="material-symbols-outlined">edit</span></md-menu-item>
<md-menu-item headline="Share"><span slot="leading-icon" class="material-symbols-outlined">share</span></md-menu-item>
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
</md-menu>
</div>
</div>variant="vibrant" tints the surface and the selected row with the primary /
secondary container roles instead of the flat neutral surface — for menus that
carry navigation rather than one-off commands.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="vib-flat-t" variant="outlined">Vibrant, flat</md-button>
<md-menu id="vib-flat-m" anchor="vib-flat-t" variant="vibrant">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
<md-menu-item headline="Drafts"><span slot="leading-icon" class="material-symbols-outlined">drafts</span></md-menu-item>
</md-menu>
<md-button id="vib-gap-t" variant="outlined">Vibrant, grouped</md-button>
<md-menu id="vib-gap-m" anchor="vib-gap-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Overview">
<md-menu-item headline="Dashboard"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Analytics"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Tools">
<md-menu-item headline="Reports"><span slot="leading-icon" class="material-symbols-outlined">description</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<script type="module">
document.getElementById('vib-flat-t').addEventListener('click', () => {
document.getElementById('vib-flat-m').show();
});
document.getElementById('vib-gap-t').addEventListener('click', () => {
document.getElementById('vib-gap-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdMenuItemGroup } from '@awc-ui/react';
export function Demo() {
const vibFlatMRef = useRef(null);
const vibGapMRef = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '24px', flexWrap: 'wrap' }}>
<MdButton id="vib-flat-t" variant="outlined" onClick={() => vibFlatMRef.current?.show()}>Vibrant, flat</MdButton>
<MdMenu id="vib-flat-m" ref={vibFlatMRef} anchor="vib-flat-t" variant="vibrant">
<MdMenuItem headline="Inbox"><span slot="leading-icon" className="material-symbols-outlined">inbox</span></MdMenuItem>
<MdMenuItem headline="Starred" selected><span slot="leading-icon" className="material-symbols-outlined">star</span></MdMenuItem>
<MdMenuItem headline="Sent"><span slot="leading-icon" className="material-symbols-outlined">send</span></MdMenuItem>
<MdMenuItem headline="Drafts"><span slot="leading-icon" className="material-symbols-outlined">drafts</span></MdMenuItem>
</MdMenu>
<MdButton id="vib-gap-t" variant="outlined" onClick={() => vibGapMRef.current?.show()}>Vibrant, grouped</MdButton>
<MdMenu id="vib-gap-m" ref={vibGapMRef} anchor="vib-gap-t" variant="vibrant" layout="grouped" use-gap>
<MdMenuItemGroup label="Overview">
<MdMenuItem headline="Dashboard"><span slot="leading-icon" className="material-symbols-outlined">dashboard</span></MdMenuItem>
<MdMenuItem headline="Analytics"><span slot="leading-icon" className="material-symbols-outlined">analytics</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup label="Tools">
<MdMenuItem headline="Reports"><span slot="leading-icon" className="material-symbols-outlined">description</span></MdMenuItem>
<MdMenuItem headline="Settings"><span slot="leading-icon" className="material-symbols-outlined">settings</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="vib-flat-t" variant="outlined" (click)="vibFlatM.show()">Vibrant, flat</md-button>
<md-menu id="vib-flat-m" #vibFlatM anchor="vib-flat-t" variant="vibrant">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
<md-menu-item headline="Drafts"><span slot="leading-icon" class="material-symbols-outlined">drafts</span></md-menu-item>
</md-menu>
<md-button id="vib-gap-t" variant="outlined" (click)="vibGapM.show()">Vibrant, grouped</md-button>
<md-menu id="vib-gap-m" #vibGapM anchor="vib-gap-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Overview">
<md-menu-item headline="Dashboard"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Analytics"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Tools">
<md-menu-item headline="Reports"><span slot="leading-icon" class="material-symbols-outlined">description</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const vibFlatM = ref(null);
const vibGapM = ref(null);
</script>
<template>
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="vib-flat-t" variant="outlined" @click="vibFlatM?.show()">Vibrant, flat</md-button>
<md-menu id="vib-flat-m" ref="vibFlatM" anchor="vib-flat-t" variant="vibrant">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
<md-menu-item headline="Drafts"><span slot="leading-icon" class="material-symbols-outlined">drafts</span></md-menu-item>
</md-menu>
<md-button id="vib-gap-t" variant="outlined" @click="vibGapM?.show()">Vibrant, grouped</md-button>
<md-menu id="vib-gap-m" ref="vibGapM" anchor="vib-gap-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Overview">
<md-menu-item headline="Dashboard"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Analytics"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Tools">
<md-menu-item headline="Reports"><span slot="leading-icon" class="material-symbols-outlined">description</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let vibFlatM;
let vibGapM;
</script>
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="vib-flat-t" variant="outlined" on:click={() => vibFlatM?.show()}>Vibrant, flat</md-button>
<md-menu id="vib-flat-m" bind:this={vibFlatM} anchor="vib-flat-t" variant="vibrant">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
<md-menu-item headline="Drafts"><span slot="leading-icon" class="material-symbols-outlined">drafts</span></md-menu-item>
</md-menu>
<md-button id="vib-gap-t" variant="outlined" on:click={() => vibGapM?.show()}>Vibrant, grouped</md-button>
<md-menu id="vib-gap-m" bind:this={vibGapM} anchor="vib-gap-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Overview">
<md-menu-item headline="Dashboard"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Analytics"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Tools">
<md-menu-item headline="Reports"><span slot="leading-icon" class="material-symbols-outlined">description</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>layout="grouped" sections the surface; the header slot sits above the rows
and scrolls with them.
use-gap on a grouped menu swaps the divider between sections for real
whitespace, and each md-menu-item-group keeps its own label. Compare the two
variants — standard keeps the flat surface, vibrant tints the group bands:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="gap-std-t" variant="outlined">Standard</md-button>
<md-menu id="gap-std-m" anchor="gap-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="File">
<md-menu-item headline="New"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Edit">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
</md-menu>
<md-button id="gap-vib-t" variant="outlined">Vibrant</md-button>
<md-menu id="gap-vib-m" anchor="gap-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Mail">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Manage">
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
<md-menu-item headline="Delete"><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<script type="module">
document.getElementById('gap-std-t').addEventListener('click', () => {
document.getElementById('gap-std-m').show();
});
document.getElementById('gap-vib-t').addEventListener('click', () => {
document.getElementById('gap-vib-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdMenuItemGroup } from '@awc-ui/react';
export function Demo() {
const gapStdMRef = useRef(null);
const gapVibMRef = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '24px', flexWrap: 'wrap' }}>
<MdButton id="gap-std-t" variant="outlined" onClick={() => gapStdMRef.current?.show()}>Standard</MdButton>
<MdMenu id="gap-std-m" ref={gapStdMRef} anchor="gap-std-t" variant="standard" layout="grouped" use-gap>
<MdMenuItemGroup label="File">
<MdMenuItem headline="New"><span slot="leading-icon" className="material-symbols-outlined">note_add</span></MdMenuItem>
<MdMenuItem headline="Open"><span slot="leading-icon" className="material-symbols-outlined">folder_open</span></MdMenuItem>
<MdMenuItem headline="Save" trailingText="⌘S"><span slot="leading-icon" className="material-symbols-outlined">save</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup label="Edit">
<MdMenuItem headline="Undo" trailingText="⌘Z"><span slot="leading-icon" className="material-symbols-outlined">undo</span></MdMenuItem>
<MdMenuItem headline="Redo" trailingText="⌘⇧Z"><span slot="leading-icon" className="material-symbols-outlined">redo</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
<MdButton id="gap-vib-t" variant="outlined" onClick={() => gapVibMRef.current?.show()}>Vibrant</MdButton>
<MdMenu id="gap-vib-m" ref={gapVibMRef} anchor="gap-vib-t" variant="vibrant" layout="grouped" use-gap>
<MdMenuItemGroup label="Mail">
<MdMenuItem headline="Inbox"><span slot="leading-icon" className="material-symbols-outlined">inbox</span></MdMenuItem>
<MdMenuItem headline="Starred" selected><span slot="leading-icon" className="material-symbols-outlined">star</span></MdMenuItem>
<MdMenuItem headline="Sent"><span slot="leading-icon" className="material-symbols-outlined">send</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup label="Manage">
<MdMenuItem headline="Archive"><span slot="leading-icon" className="material-symbols-outlined">archive</span></MdMenuItem>
<MdMenuItem headline="Delete"><span slot="leading-icon" className="material-symbols-outlined">delete</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="gap-std-t" variant="outlined" (click)="gapStdM.show()">Standard</md-button>
<md-menu id="gap-std-m" #gapStdM anchor="gap-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="File">
<md-menu-item headline="New"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Edit">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
</md-menu>
<md-button id="gap-vib-t" variant="outlined" (click)="gapVibM.show()">Vibrant</md-button>
<md-menu id="gap-vib-m" #gapVibM anchor="gap-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Mail">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Manage">
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
<md-menu-item headline="Delete"><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const gapStdM = ref(null);
const gapVibM = ref(null);
</script>
<template>
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="gap-std-t" variant="outlined" @click="gapStdM?.show()">Standard</md-button>
<md-menu id="gap-std-m" ref="gapStdM" anchor="gap-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="File">
<md-menu-item headline="New"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Edit">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
</md-menu>
<md-button id="gap-vib-t" variant="outlined" @click="gapVibM?.show()">Vibrant</md-button>
<md-menu id="gap-vib-m" ref="gapVibM" anchor="gap-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Mail">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Manage">
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
<md-menu-item headline="Delete"><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let gapStdM;
let gapVibM;
</script>
<div style="display: flex; gap: 24px; flex-wrap: wrap;">
<md-button id="gap-std-t" variant="outlined" on:click={() => gapStdM?.show()}>Standard</md-button>
<md-menu id="gap-std-m" bind:this={gapStdM} anchor="gap-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="File">
<md-menu-item headline="New"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-menu-item headline="Open"><span slot="leading-icon" class="material-symbols-outlined">folder_open</span></md-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Edit">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
</md-menu>
<md-button id="gap-vib-t" variant="outlined" on:click={() => gapVibM?.show()}>Vibrant</md-button>
<md-menu id="gap-vib-m" bind:this={gapVibM} anchor="gap-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group label="Mail">
<md-menu-item headline="Inbox"><span slot="leading-icon" class="material-symbols-outlined">inbox</span></md-menu-item>
<md-menu-item headline="Starred" selected><span slot="leading-icon" class="material-symbols-outlined">star</span></md-menu-item>
<md-menu-item headline="Sent"><span slot="leading-icon" class="material-symbols-outlined">send</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Manage">
<md-menu-item headline="Archive"><span slot="leading-icon" class="material-symbols-outlined">archive</span></md-menu-item>
<md-menu-item headline="Delete"><span slot="leading-icon" class="material-symbols-outlined">delete</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>Groups work without labels too — the cards alone carry the grouping — and
use-gap is what swaps the divider for that separation:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — no labels</span>
<md-button id="gap-nl-std-t" variant="outlined">Edit</md-button>
<md-menu id="gap-nl-std-m" anchor="gap-nl-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — no labels</span>
<md-button id="gap-nl-vib-t" variant="outlined">Edit</md-button>
<md-menu id="gap-nl-vib-m" anchor="gap-nl-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">use-gap — cards</span>
<md-button id="gap-cmp-gap-t" variant="outlined">With gap</md-button>
<md-menu id="gap-cmp-gap-m" anchor="gap-cmp-gap-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">no use-gap — divider</span>
<md-button id="gap-cmp-div-t" variant="outlined">With divider</md-button>
<md-menu id="gap-cmp-div-m" anchor="gap-cmp-div-t" variant="standard" layout="grouped">
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
</div>
<script type="module">
document.getElementById('gap-nl-std-t').addEventListener('click', () => {
document.getElementById('gap-nl-std-m').show();
});
document.getElementById('gap-nl-vib-t').addEventListener('click', () => {
document.getElementById('gap-nl-vib-m').show();
});
document.getElementById('gap-cmp-gap-t').addEventListener('click', () => {
document.getElementById('gap-cmp-gap-m').show();
});
document.getElementById('gap-cmp-div-t').addEventListener('click', () => {
document.getElementById('gap-cmp-div-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdMenuItemGroup } from '@awc-ui/react';
export function Demo() {
const gapNlStdMRef = useRef(null);
const gapNlVibMRef = useRef(null);
const gapCmpGapMRef = useRef(null);
const gapCmpDivMRef = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '32px', flexWrap: 'wrap' }}>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Standard — no labels</span>
<MdButton id="gap-nl-std-t" variant="outlined" onClick={() => gapNlStdMRef.current?.show()}>Edit</MdButton>
<MdMenu id="gap-nl-std-m" ref={gapNlStdMRef} anchor="gap-nl-std-t" variant="standard" layout="grouped" use-gap>
<MdMenuItemGroup>
<MdMenuItem headline="Undo" trailingText="⌘Z"><span slot="leading-icon" className="material-symbols-outlined">undo</span></MdMenuItem>
<MdMenuItem headline="Redo" trailingText="⌘⇧Z"><span slot="leading-icon" className="material-symbols-outlined">redo</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup>
<MdMenuItem headline="Cut" trailingText="⌘X"><span slot="leading-icon" className="material-symbols-outlined">content_cut</span></MdMenuItem>
<MdMenuItem headline="Copy" trailingText="⌘C"><span slot="leading-icon" className="material-symbols-outlined">content_copy</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Vibrant — no labels</span>
<MdButton id="gap-nl-vib-t" variant="outlined" onClick={() => gapNlVibMRef.current?.show()}>Edit</MdButton>
<MdMenu id="gap-nl-vib-m" ref={gapNlVibMRef} anchor="gap-nl-vib-t" variant="vibrant" layout="grouped" use-gap>
<MdMenuItemGroup>
<MdMenuItem headline="Undo" trailingText="⌘Z"><span slot="leading-icon" className="material-symbols-outlined">undo</span></MdMenuItem>
<MdMenuItem headline="Redo" trailingText="⌘⇧Z"><span slot="leading-icon" className="material-symbols-outlined">redo</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup>
<MdMenuItem headline="Cut" trailingText="⌘X"><span slot="leading-icon" className="material-symbols-outlined">content_cut</span></MdMenuItem>
<MdMenuItem headline="Copy" trailingText="⌘C"><span slot="leading-icon" className="material-symbols-outlined">content_copy</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>use-gap — cards</span>
<MdButton id="gap-cmp-gap-t" variant="outlined" onClick={() => gapCmpGapMRef.current?.show()}>With gap</MdButton>
<MdMenu id="gap-cmp-gap-m" ref={gapCmpGapMRef} anchor="gap-cmp-gap-t" variant="standard" layout="grouped" use-gap>
<MdMenuItemGroup label="History">
<MdMenuItem headline="Undo" trailingText="⌘Z"><span slot="leading-icon" className="material-symbols-outlined">undo</span></MdMenuItem>
<MdMenuItem headline="Redo" trailingText="⌘⇧Z"><span slot="leading-icon" className="material-symbols-outlined">redo</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup label="Clipboard">
<MdMenuItem headline="Cut" trailingText="⌘X"><span slot="leading-icon" className="material-symbols-outlined">content_cut</span></MdMenuItem>
<MdMenuItem headline="Copy" trailingText="⌘C"><span slot="leading-icon" className="material-symbols-outlined">content_copy</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>no use-gap — divider</span>
<MdButton id="gap-cmp-div-t" variant="outlined" onClick={() => gapCmpDivMRef.current?.show()}>With divider</MdButton>
<MdMenu id="gap-cmp-div-m" ref={gapCmpDivMRef} anchor="gap-cmp-div-t" variant="standard" layout="grouped">
<MdMenuItemGroup label="History">
<MdMenuItem headline="Undo" trailingText="⌘Z"><span slot="leading-icon" className="material-symbols-outlined">undo</span></MdMenuItem>
<MdMenuItem headline="Redo" trailingText="⌘⇧Z"><span slot="leading-icon" className="material-symbols-outlined">redo</span></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup label="Clipboard">
<MdMenuItem headline="Cut" trailingText="⌘X"><span slot="leading-icon" className="material-symbols-outlined">content_cut</span></MdMenuItem>
<MdMenuItem headline="Copy" trailingText="⌘C"><span slot="leading-icon" className="material-symbols-outlined">content_copy</span></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — no labels</span>
<md-button id="gap-nl-std-t" variant="outlined" (click)="gapNlStdM.show()">Edit</md-button>
<md-menu id="gap-nl-std-m" #gapNlStdM anchor="gap-nl-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — no labels</span>
<md-button id="gap-nl-vib-t" variant="outlined" (click)="gapNlVibM.show()">Edit</md-button>
<md-menu id="gap-nl-vib-m" #gapNlVibM anchor="gap-nl-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">use-gap — cards</span>
<md-button id="gap-cmp-gap-t" variant="outlined" (click)="gapCmpGapM.show()">With gap</md-button>
<md-menu id="gap-cmp-gap-m" #gapCmpGapM anchor="gap-cmp-gap-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">no use-gap — divider</span>
<md-button id="gap-cmp-div-t" variant="outlined" (click)="gapCmpDivM.show()">With divider</md-button>
<md-menu id="gap-cmp-div-m" #gapCmpDivM anchor="gap-cmp-div-t" variant="standard" layout="grouped">
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const gapNlStdM = ref(null);
const gapNlVibM = ref(null);
const gapCmpGapM = ref(null);
const gapCmpDivM = ref(null);
</script>
<template>
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — no labels</span>
<md-button id="gap-nl-std-t" variant="outlined" @click="gapNlStdM?.show()">Edit</md-button>
<md-menu id="gap-nl-std-m" ref="gapNlStdM" anchor="gap-nl-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — no labels</span>
<md-button id="gap-nl-vib-t" variant="outlined" @click="gapNlVibM?.show()">Edit</md-button>
<md-menu id="gap-nl-vib-m" ref="gapNlVibM" anchor="gap-nl-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">use-gap — cards</span>
<md-button id="gap-cmp-gap-t" variant="outlined" @click="gapCmpGapM?.show()">With gap</md-button>
<md-menu id="gap-cmp-gap-m" ref="gapCmpGapM" anchor="gap-cmp-gap-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">no use-gap — divider</span>
<md-button id="gap-cmp-div-t" variant="outlined" @click="gapCmpDivM?.show()">With divider</md-button>
<md-menu id="gap-cmp-div-m" ref="gapCmpDivM" anchor="gap-cmp-div-t" variant="standard" layout="grouped">
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let gapNlStdM;
let gapNlVibM;
let gapCmpGapM;
let gapCmpDivM;
</script>
<div style="display: flex; gap: 32px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — no labels</span>
<md-button id="gap-nl-std-t" variant="outlined" on:click={() => gapNlStdM?.show()}>Edit</md-button>
<md-menu id="gap-nl-std-m" bind:this={gapNlStdM} anchor="gap-nl-std-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — no labels</span>
<md-button id="gap-nl-vib-t" variant="outlined" on:click={() => gapNlVibM?.show()}>Edit</md-button>
<md-menu id="gap-nl-vib-m" bind:this={gapNlVibM} anchor="gap-nl-vib-t" variant="vibrant" layout="grouped" use-gap>
<md-menu-item-group>
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group>
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">use-gap — cards</span>
<md-button id="gap-cmp-gap-t" variant="outlined" on:click={() => gapCmpGapM?.show()}>With gap</md-button>
<md-menu id="gap-cmp-gap-m" bind:this={gapCmpGapM} anchor="gap-cmp-gap-t" variant="standard" layout="grouped" use-gap>
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">no use-gap — divider</span>
<md-button id="gap-cmp-div-t" variant="outlined" on:click={() => gapCmpDivM?.show()}>With divider</md-button>
<md-menu id="gap-cmp-div-m" bind:this={gapCmpDivM} anchor="gap-cmp-div-t" variant="standard" layout="grouped">
<md-menu-item-group label="History">
<md-menu-item headline="Undo" trailing-text="⌘Z"><span slot="leading-icon" class="material-symbols-outlined">undo</span></md-menu-item>
<md-menu-item headline="Redo" trailing-text="⌘⇧Z"><span slot="leading-icon" class="material-symbols-outlined">redo</span></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Clipboard">
<md-menu-item headline="Cut" trailing-text="⌘X"><span slot="leading-icon" class="material-symbols-outlined">content_cut</span></md-menu-item>
<md-menu-item headline="Copy" trailing-text="⌘C"><span slot="leading-icon" class="material-symbols-outlined">content_copy</span></md-menu-item>
</md-menu-item-group>
</md-menu>
</div>
</div>The menu closes on item activation by default. Use persistent on the
menu, or keep-open on individual items, for multi-select-style menus.
listbox switches the surface to option semantics — use it when the menu
presents values, not commands.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="menu-demo-t-cols" variant="outlined">Columns</md-button>
<md-menu id="menu-demo-m-cols" anchor="menu-demo-t-cols" persistent listbox list-label="Columns">
<md-menu-item headline="Name" type="checkbox" keep-open selected></md-menu-item>
<md-menu-item headline="Owner" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Modified" type="checkbox" keep-open selected></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('menu-demo-t-cols').addEventListener('click', () => {
document.getElementById('menu-demo-m-cols').show();
});
</script>import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const menuDemoMColsRef = useRef(null);
return (
<>
<MdButton id="menu-demo-t-cols" variant="outlined" onClick={() => menuDemoMColsRef.current?.show()}>Columns</MdButton>
<MdMenu id="menu-demo-m-cols" ref={menuDemoMColsRef} anchor="menu-demo-t-cols" persistent listbox listLabel="Columns">
<MdMenuItem headline="Name" type="checkbox" keepOpen selected></MdMenuItem>
<MdMenuItem headline="Owner" type="checkbox" keep-open></MdMenuItem>
<MdMenuItem headline="Modified" type="checkbox" keepOpen selected></MdMenuItem>
</MdMenu>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="menu-demo-t-cols" variant="outlined" (click)="menuDemoMCols.show()">Columns</md-button>
<md-menu id="menu-demo-m-cols" #menuDemoMCols anchor="menu-demo-t-cols" persistent listbox list-label="Columns">
<md-menu-item headline="Name" type="checkbox" keep-open selected></md-menu-item>
<md-menu-item headline="Owner" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Modified" type="checkbox" keep-open selected></md-menu-item>
</md-menu><script setup>
import { ref } from 'vue';
import '@awc-ui/core/define';
const menuDemoMCols = ref(null);
</script>
<template>
<md-button id="menu-demo-t-cols" variant="outlined" @click="menuDemoMCols?.show()">Columns</md-button>
<md-menu id="menu-demo-m-cols" ref="menuDemoMCols" anchor="menu-demo-t-cols" persistent listbox list-label="Columns">
<md-menu-item headline="Name" type="checkbox" keep-open selected></md-menu-item>
<md-menu-item headline="Owner" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Modified" type="checkbox" keep-open selected></md-menu-item>
</md-menu>
</template><script>
import '@awc-ui/core/define';
let menuDemoMCols;
</script>
<md-button id="menu-demo-t-cols" variant="outlined" on:click={() => menuDemoMCols?.show()}>Columns</md-button>
<md-menu id="menu-demo-m-cols" bind:this={menuDemoMCols} anchor="menu-demo-t-cols" persistent listbox list-label="Columns">
<md-menu-item headline="Name" type="checkbox" keep-open selected></md-menu-item>
<md-menu-item headline="Owner" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Modified" type="checkbox" keep-open selected></md-menu-item>
</md-menu><!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="menu-demo-t-sub" variant="outlined">File</md-button>
<md-menu id="menu-demo-m-sub" anchor="menu-demo-t-sub">
<md-menu-item headline="New"></md-menu-item>
<md-sub-menu-item headline="Share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('menu-demo-t-sub').addEventListener('click', () => {
document.getElementById('menu-demo-m-sub').show();
});
</script>import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdSubMenuItem } from '@awc-ui/react';
export function Demo() {
const menuDemoMSubRef = useRef(null);
return (
<>
<MdButton id="menu-demo-t-sub" variant="outlined" onClick={() => menuDemoMSubRef.current?.show()}>File</MdButton>
<MdMenu id="menu-demo-m-sub" ref={menuDemoMSubRef} anchor="menu-demo-t-sub">
<MdMenuItem headline="New"></MdMenuItem>
<MdSubMenuItem headline="Share">
<MdMenu slot="submenu">
<MdMenuItem headline="Copy link"></MdMenuItem>
<MdMenuItem headline="Email"></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdMenuItem headline="Delete"></MdMenuItem>
</MdMenu>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="menu-demo-t-sub" variant="outlined" (click)="menuDemoMSub.show()">File</md-button>
<md-menu id="menu-demo-m-sub" #menuDemoMSub anchor="menu-demo-t-sub">
<md-menu-item headline="New"></md-menu-item>
<md-sub-menu-item headline="Share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu><script setup>
import { ref } from 'vue';
import '@awc-ui/core/define';
const menuDemoMSub = ref(null);
</script>
<template>
<md-button id="menu-demo-t-sub" variant="outlined" @click="menuDemoMSub?.show()">File</md-button>
<md-menu id="menu-demo-m-sub" ref="menuDemoMSub" anchor="menu-demo-t-sub">
<md-menu-item headline="New"></md-menu-item>
<md-sub-menu-item headline="Share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
</template><script>
import '@awc-ui/core/define';
let menuDemoMSub;
</script>
<md-button id="menu-demo-t-sub" variant="outlined" on:click={() => menuDemoMSub?.show()}>File</md-button>
<md-menu id="menu-demo-m-sub" bind:this={menuDemoMSub} anchor="menu-demo-t-sub">
<md-menu-item headline="New"></md-menu-item>
<md-sub-menu-item headline="Share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>match-anchor-width makes the surface at least as wide as the trigger — it
still grows wider if the rows need it. max-height caps the surface;
empty-text covers the no-rows case.
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="menu-demo-t-wide" variant="outlined">Match anchor width</md-button>
<md-menu id="menu-demo-m-wide" anchor="menu-demo-t-wide" match-anchor-width max-height="200">
<md-menu-item headline="One"></md-menu-item>
<md-menu-item headline="Two"></md-menu-item>
<md-menu-item headline="Three"></md-menu-item>
<md-menu-item headline="Four"></md-menu-item>
<md-menu-item headline="Five"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-empty" variant="outlined">Empty</md-button>
<md-menu id="menu-demo-m-empty" anchor="menu-demo-t-empty" empty-text="No actions"></md-menu>
<script type="module">
document.getElementById('menu-demo-t-wide').addEventListener('click', () => {
document.getElementById('menu-demo-m-wide').show();
});
document.getElementById('menu-demo-t-empty').addEventListener('click', () => {
document.getElementById('menu-demo-m-empty').show();
});
</script>import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const menuDemoMWideRef = useRef(null);
const menuDemoMEmptyRef = useRef(null);
return (
<>
<MdButton id="menu-demo-t-wide" variant="outlined" onClick={() => menuDemoMWideRef.current?.show()}>Match anchor width</MdButton>
<MdMenu id="menu-demo-m-wide" ref={menuDemoMWideRef} anchor="menu-demo-t-wide" matchAnchorWidth maxHeight="200">
<MdMenuItem headline="One"></MdMenuItem>
<MdMenuItem headline="Two"></MdMenuItem>
<MdMenuItem headline="Three"></MdMenuItem>
<MdMenuItem headline="Four"></MdMenuItem>
<MdMenuItem headline="Five"></MdMenuItem>
</MdMenu>
<MdButton id="menu-demo-t-empty" variant="outlined" onClick={() => menuDemoMEmptyRef.current?.show()}>Empty</MdButton>
<MdMenu id="menu-demo-m-empty" ref={menuDemoMEmptyRef} anchor="menu-demo-t-empty" emptyText="No actions"></MdMenu>
</>
);
}// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="menu-demo-t-wide" variant="outlined" (click)="menuDemoMWide.show()">Match anchor width</md-button>
<md-menu id="menu-demo-m-wide" #menuDemoMWide anchor="menu-demo-t-wide" match-anchor-width max-height="200">
<md-menu-item headline="One"></md-menu-item>
<md-menu-item headline="Two"></md-menu-item>
<md-menu-item headline="Three"></md-menu-item>
<md-menu-item headline="Four"></md-menu-item>
<md-menu-item headline="Five"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-empty" variant="outlined" (click)="menuDemoMEmpty.show()">Empty</md-button>
<md-menu id="menu-demo-m-empty" #menuDemoMEmpty anchor="menu-demo-t-empty" empty-text="No actions"></md-menu><script setup>
import { ref } from 'vue';
import '@awc-ui/core/define';
const menuDemoMWide = ref(null);
const menuDemoMEmpty = ref(null);
</script>
<template>
<md-button id="menu-demo-t-wide" variant="outlined" @click="menuDemoMWide?.show()">Match anchor width</md-button>
<md-menu id="menu-demo-m-wide" ref="menuDemoMWide" anchor="menu-demo-t-wide" match-anchor-width max-height="200">
<md-menu-item headline="One"></md-menu-item>
<md-menu-item headline="Two"></md-menu-item>
<md-menu-item headline="Three"></md-menu-item>
<md-menu-item headline="Four"></md-menu-item>
<md-menu-item headline="Five"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-empty" variant="outlined" @click="menuDemoMEmpty?.show()">Empty</md-button>
<md-menu id="menu-demo-m-empty" ref="menuDemoMEmpty" anchor="menu-demo-t-empty" empty-text="No actions"></md-menu>
</template><script>
import '@awc-ui/core/define';
let menuDemoMWide;
let menuDemoMEmpty;
</script>
<md-button id="menu-demo-t-wide" variant="outlined" on:click={() => menuDemoMWide?.show()}>Match anchor width</md-button>
<md-menu id="menu-demo-m-wide" bind:this={menuDemoMWide} anchor="menu-demo-t-wide" match-anchor-width max-height="200">
<md-menu-item headline="One"></md-menu-item>
<md-menu-item headline="Two"></md-menu-item>
<md-menu-item headline="Three"></md-menu-item>
<md-menu-item headline="Four"></md-menu-item>
<md-menu-item headline="Five"></md-menu-item>
</md-menu>
<md-button id="menu-demo-t-empty" variant="outlined" on:click={() => menuDemoMEmpty?.show()}>Empty</md-button>
<md-menu id="menu-demo-m-empty" bind:this={menuDemoMEmpty} anchor="menu-demo-t-empty" empty-text="No actions"></md-menu>Set responsive to present a near-full-width sheet on compact viewports, and
quick to skip the open animation.
A row carries a headline plus any of: a leading icon, supporting text, a badge, trailing text, and a trailing icon. Everything is optional — a menu of plain headlines is a perfectly good menu.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="ra-t" variant="outlined">Full anatomy</md-button>
<md-menu id="ra-m" anchor="ra-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" supporting-text="Creates a copy in place"></md-menu-item>
<md-menu-item headline="Notifications" icon="notifications" badge="3"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="ra-t2" variant="outlined">No icons</md-button>
<md-menu id="ra-m2" anchor="ra-t2">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('ra-t').addEventListener('click', () => {
document.getElementById('ra-m').show();
});
document.getElementById('ra-t2').addEventListener('click', () => {
document.getElementById('ra-m2').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const raMRef = useRef(null);
const raM2Ref = useRef(null);
return (
<>
<MdButton id="ra-t" variant="outlined" onClick={() => raMRef.current?.show()}>Full anatomy</MdButton>
<MdMenu id="ra-m" ref={raMRef} anchor="ra-t">
<MdMenuItem headline="Rename" icon="edit" trailingText="⌘R"></MdMenuItem>
<MdMenuItem headline="Duplicate" icon="content_copy" supportingText="Creates a copy in place"></MdMenuItem>
<MdMenuItem headline="Notifications" icon="notifications" badge="3"></MdMenuItem>
<MdMenuItem headline="Delete" icon="delete" trailingText="⌫"></MdMenuItem>
</MdMenu>
<MdButton id="ra-t2" variant="outlined" onClick={() => raM2Ref.current?.show()}>No icons</MdButton>
<MdMenu id="ra-m2" ref={raM2Ref} anchor="ra-t2">
<MdMenuItem headline="Rename"></MdMenuItem>
<MdMenuItem headline="Duplicate"></MdMenuItem>
<MdMenuItem headline="Delete"></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="ra-t" variant="outlined" (click)="raM.show()">Full anatomy</md-button>
<md-menu id="ra-m" #raM anchor="ra-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" supporting-text="Creates a copy in place"></md-menu-item>
<md-menu-item headline="Notifications" icon="notifications" badge="3"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="ra-t2" variant="outlined" (click)="raM2.show()">No icons</md-button>
<md-menu id="ra-m2" #raM2 anchor="ra-t2">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const raM = ref(null);
const raM2 = ref(null);
</script>
<template>
<md-button id="ra-t" variant="outlined" @click="raM?.show()">Full anatomy</md-button>
<md-menu id="ra-m" ref="raM" anchor="ra-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" supporting-text="Creates a copy in place"></md-menu-item>
<md-menu-item headline="Notifications" icon="notifications" badge="3"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="ra-t2" variant="outlined" @click="raM2?.show()">No icons</md-button>
<md-menu id="ra-m2" ref="raM2" anchor="ra-t2">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let raM;
let raM2;
</script>
<md-button id="ra-t" variant="outlined" on:click={() => raM?.show()}>Full anatomy</md-button>
<md-menu id="ra-m" bind:this={raM} anchor="ra-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" supporting-text="Creates a copy in place"></md-menu-item>
<md-menu-item headline="Notifications" icon="notifications" badge="3"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="ra-t2" variant="outlined" on:click={() => raM2?.show()}>No icons</md-button>
<md-menu id="ra-m2" bind:this={raM2} anchor="ra-t2">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Duplicate"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>disabled takes the row out of the roving focus order. Selection state comes
from type="checkbox" / type="radio" plus selected; indeterminate is a
presentational mixed state on checkbox rows only.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="rs-t" variant="outlined">States</md-button>
<md-menu id="rs-m" anchor="rs-t">
<md-menu-item headline="Enabled" icon="check_circle"></md-menu-item>
<md-menu-item headline="Disabled" icon="block" disabled></md-menu-item>
<md-menu-item headline="Checked" type="checkbox" selected keep-open></md-menu-item>
<md-menu-item headline="Unchecked" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Indeterminate" type="checkbox" indeterminate keep-open></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('rs-t').addEventListener('click', () => {
document.getElementById('rs-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const rsMRef = useRef(null);
return (
<>
<MdButton id="rs-t" variant="outlined" onClick={() => rsMRef.current?.show()}>States</MdButton>
<MdMenu id="rs-m" ref={rsMRef} anchor="rs-t">
<MdMenuItem headline="Enabled" icon="check_circle"></MdMenuItem>
<MdMenuItem headline="Disabled" icon="block" disabled></MdMenuItem>
<MdMenuItem headline="Checked" type="checkbox" selected keep-open></MdMenuItem>
<MdMenuItem headline="Unchecked" type="checkbox" keep-open></MdMenuItem>
<MdMenuItem headline="Indeterminate" type="checkbox" indeterminate keep-open></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="rs-t" variant="outlined" (click)="rsM.show()">States</md-button>
<md-menu id="rs-m" #rsM anchor="rs-t">
<md-menu-item headline="Enabled" icon="check_circle"></md-menu-item>
<md-menu-item headline="Disabled" icon="block" disabled></md-menu-item>
<md-menu-item headline="Checked" type="checkbox" selected keep-open></md-menu-item>
<md-menu-item headline="Unchecked" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Indeterminate" type="checkbox" indeterminate keep-open></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const rsM = ref(null);
</script>
<template>
<md-button id="rs-t" variant="outlined" @click="rsM?.show()">States</md-button>
<md-menu id="rs-m" ref="rsM" anchor="rs-t">
<md-menu-item headline="Enabled" icon="check_circle"></md-menu-item>
<md-menu-item headline="Disabled" icon="block" disabled></md-menu-item>
<md-menu-item headline="Checked" type="checkbox" selected keep-open></md-menu-item>
<md-menu-item headline="Unchecked" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Indeterminate" type="checkbox" indeterminate keep-open></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let rsM;
</script>
<md-button id="rs-t" variant="outlined" on:click={() => rsM?.show()}>States</md-button>
<md-menu id="rs-m" bind:this={rsM} anchor="rs-t">
<md-menu-item headline="Enabled" icon="check_circle"></md-menu-item>
<md-menu-item headline="Disabled" icon="block" disabled></md-menu-item>
<md-menu-item headline="Checked" type="checkbox" selected keep-open></md-menu-item>
<md-menu-item headline="Unchecked" type="checkbox" keep-open></md-menu-item>
<md-menu-item headline="Indeterminate" type="checkbox" indeterminate keep-open></md-menu-item>
</md-menu><!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="bd-t" variant="outlined">Badges</md-button>
<md-menu id="bd-m" anchor="bd-t">
<md-menu-item headline="Inbox" icon="inbox" badge="3"></md-menu-item>
<md-menu-item headline="Drafts" icon="drafts" badge="12"></md-menu-item>
<md-menu-item headline="Spam" icon="report" badge="99+"></md-menu-item>
<md-menu-item headline="Archive" icon="archive"></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('bd-t').addEventListener('click', () => {
document.getElementById('bd-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const bdMRef = useRef(null);
return (
<>
<MdButton id="bd-t" variant="outlined" onClick={() => bdMRef.current?.show()}>Badges</MdButton>
<MdMenu id="bd-m" ref={bdMRef} anchor="bd-t">
<MdMenuItem headline="Inbox" icon="inbox" badge="3"></MdMenuItem>
<MdMenuItem headline="Drafts" icon="drafts" badge="12"></MdMenuItem>
<MdMenuItem headline="Spam" icon="report" badge="99+"></MdMenuItem>
<MdMenuItem headline="Archive" icon="archive"></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="bd-t" variant="outlined" (click)="bdM.show()">Badges</md-button>
<md-menu id="bd-m" #bdM anchor="bd-t">
<md-menu-item headline="Inbox" icon="inbox" badge="3"></md-menu-item>
<md-menu-item headline="Drafts" icon="drafts" badge="12"></md-menu-item>
<md-menu-item headline="Spam" icon="report" badge="99+"></md-menu-item>
<md-menu-item headline="Archive" icon="archive"></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const bdM = ref(null);
</script>
<template>
<md-button id="bd-t" variant="outlined" @click="bdM?.show()">Badges</md-button>
<md-menu id="bd-m" ref="bdM" anchor="bd-t">
<md-menu-item headline="Inbox" icon="inbox" badge="3"></md-menu-item>
<md-menu-item headline="Drafts" icon="drafts" badge="12"></md-menu-item>
<md-menu-item headline="Spam" icon="report" badge="99+"></md-menu-item>
<md-menu-item headline="Archive" icon="archive"></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let bdM;
</script>
<md-button id="bd-t" variant="outlined" on:click={() => bdM?.show()}>Badges</md-button>
<md-menu id="bd-m" bind:this={bdM} anchor="bd-t">
<md-menu-item headline="Inbox" icon="inbox" badge="3"></md-menu-item>
<md-menu-item headline="Drafts" icon="drafts" badge="12"></md-menu-item>
<md-menu-item headline="Spam" icon="report" badge="99+"></md-menu-item>
<md-menu-item headline="Archive" icon="archive"></md-menu-item>
</md-menu><!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="ns-t" variant="outlined">Nested</md-button>
<md-menu id="ns-m" anchor="ns-t">
<md-menu-item headline="New" icon="add"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-sub-menu-item headline="Send to">
<md-menu slot="submenu">
<md-menu-item headline="Email"></md-menu-item>
<md-menu-item headline="Slack"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('ns-t').addEventListener('click', () => {
document.getElementById('ns-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdSubMenuItem } from '@awc-ui/react';
export function Demo() {
const nsMRef = useRef(null);
return (
<>
<MdButton id="ns-t" variant="outlined" onClick={() => nsMRef.current?.show()}>Nested</MdButton>
<MdMenu id="ns-m" ref={nsMRef} anchor="ns-t">
<MdMenuItem headline="New" icon="add"></MdMenuItem>
<MdSubMenuItem headline="Share" icon="share">
<MdMenu slot="submenu">
<MdMenuItem headline="Copy link"></MdMenuItem>
<MdSubMenuItem headline="Send to">
<MdMenu slot="submenu">
<MdMenuItem headline="Email"></MdMenuItem>
<MdMenuItem headline="Slack"></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdMenuItem headline="Delete" icon="delete"></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="ns-t" variant="outlined" (click)="nsM.show()">Nested</md-button>
<md-menu id="ns-m" #nsM anchor="ns-t">
<md-menu-item headline="New" icon="add"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-sub-menu-item headline="Send to">
<md-menu slot="submenu">
<md-menu-item headline="Email"></md-menu-item>
<md-menu-item headline="Slack"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const nsM = ref(null);
</script>
<template>
<md-button id="ns-t" variant="outlined" @click="nsM?.show()">Nested</md-button>
<md-menu id="ns-m" ref="nsM" anchor="ns-t">
<md-menu-item headline="New" icon="add"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-sub-menu-item headline="Send to">
<md-menu slot="submenu">
<md-menu-item headline="Email"></md-menu-item>
<md-menu-item headline="Slack"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let nsM;
</script>
<md-button id="ns-t" variant="outlined" on:click={() => nsM?.show()}>Nested</md-button>
<md-menu id="ns-m" bind:this={nsM} anchor="ns-t">
<md-menu-item headline="New" icon="add"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-sub-menu-item headline="Send to">
<md-menu slot="submenu">
<md-menu-item headline="Email"></md-menu-item>
<md-menu-item headline="Slack"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>Three levels, both variants, as a stress test — every level is its own
md-menu in the parent row’s submenu slot, and each one flips side or
direction on its own when it would leave the viewport:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — 3 levels</span>
<md-button id="deep-std-t" variant="filled">File</md-button>
<md-menu id="deep-std-m" anchor="deep-std-t" variant="standard">
<md-menu-item headline="New file" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-sub-menu-item headline="Open recent" supporting-text="Last 5 files">
<span slot="leading-icon" class="material-symbols-outlined">history</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="document.txt" supporting-text="Modified yesterday"></md-menu-item>
<md-menu-item headline="styles.css" supporting-text="Modified 3 days ago"></md-menu-item>
<md-sub-menu-item headline="Projects" supporting-text="Browse all">
<span slot="leading-icon" class="material-symbols-outlined">folder</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="my-app" supporting-text="React project"></md-menu-item>
<md-menu-item headline="website" supporting-text="Static site"></md-menu-item>
<md-menu-item headline="design-system" supporting-text="Stencil components"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Export as" supporting-text="Save to disk" divider>
<span slot="leading-icon" class="material-symbols-outlined">download</span>
<md-menu slot="submenu" variant="standard">
<md-sub-menu-item headline="Image" supporting-text="Raster or vector">
<span slot="leading-icon" class="material-symbols-outlined">image</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="PNG"></md-menu-item>
<md-menu-item headline="JPEG"></md-menu-item>
<md-menu-item headline="SVG"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="PDF"><span slot="leading-icon" class="material-symbols-outlined">picture_as_pdf</span></md-menu-item>
<md-menu-item headline="CSV"><span slot="leading-icon" class="material-symbols-outlined">table_chart</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — 3 levels</span>
<md-button id="deep-vib-t" variant="tonal">Share</md-button>
<md-menu id="deep-vib-m" anchor="deep-vib-t" variant="vibrant">
<md-menu-item headline="Copy link" supporting-text="To clipboard"><span slot="leading-icon" class="material-symbols-outlined">link</span></md-menu-item>
<md-sub-menu-item headline="Social" supporting-text="Post to a network">
<span slot="leading-icon" class="material-symbols-outlined">public</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Twitter" supporting-text="Post a tweet"><span slot="leading-icon" class="material-symbols-outlined">tag</span></md-menu-item>
<md-menu-item headline="LinkedIn" supporting-text="Share with your network"><span slot="leading-icon" class="material-symbols-outlined">work</span></md-menu-item>
<md-sub-menu-item headline="More" supporting-text="Other platforms">
<span slot="leading-icon" class="material-symbols-outlined">more_horiz</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Facebook"></md-menu-item>
<md-menu-item headline="Reddit"></md-menu-item>
<md-menu-item headline="Mastodon"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Send to" supporting-text="Direct message" divider>
<span slot="leading-icon" class="material-symbols-outlined">send</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Email" supporting-text="Compose a message"><span slot="leading-icon" class="material-symbols-outlined">email</span></md-menu-item>
<md-menu-item headline="Messages" supporting-text="Via iMessage"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
<md-menu-item headline="AirDrop" supporting-text="Nearby devices"><span slot="leading-icon" class="material-symbols-outlined">wifi</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Embed" supporting-text="Get the embed code"><span slot="leading-icon" class="material-symbols-outlined">code</span></md-menu-item>
</md-menu>
</div>
</div>
<script type="module">
document.getElementById('deep-std-t').addEventListener('click', () => {
document.getElementById('deep-std-m').show();
});
document.getElementById('deep-vib-t').addEventListener('click', () => {
document.getElementById('deep-vib-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdSubMenuItem } from '@awc-ui/react';
export function Demo() {
const deepStdMRef = useRef(null);
const deepVibMRef = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '40px', flexWrap: 'wrap' }}>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Standard — 3 levels</span>
<MdButton id="deep-std-t" variant="filled" onClick={() => deepStdMRef.current?.show()}>File</MdButton>
<MdMenu id="deep-std-m" ref={deepStdMRef} anchor="deep-std-t" variant="standard">
<MdMenuItem headline="New file" trailingText="⌘N"><span slot="leading-icon" className="material-symbols-outlined">note_add</span></MdMenuItem>
<MdSubMenuItem headline="Open recent" supportingText="Last 5 files">
<span slot="leading-icon" className="material-symbols-outlined">history</span>
<MdMenu slot="submenu" variant="standard">
<MdMenuItem headline="document.txt" supportingText="Modified yesterday"></MdMenuItem>
<MdMenuItem headline="styles.css" supportingText="Modified 3 days ago"></MdMenuItem>
<MdSubMenuItem headline="Projects" supportingText="Browse all">
<span slot="leading-icon" className="material-symbols-outlined">folder</span>
<MdMenu slot="submenu" variant="standard">
<MdMenuItem headline="my-app" supportingText="React project"></MdMenuItem>
<MdMenuItem headline="website" supportingText="Static site"></MdMenuItem>
<MdMenuItem headline="design-system" supportingText="Stencil components"></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdSubMenuItem headline="Export as" supportingText="Save to disk" divider>
<span slot="leading-icon" className="material-symbols-outlined">download</span>
<MdMenu slot="submenu" variant="standard">
<MdSubMenuItem headline="Image" supportingText="Raster or vector">
<span slot="leading-icon" className="material-symbols-outlined">image</span>
<MdMenu slot="submenu" variant="standard">
<MdMenuItem headline="PNG"></MdMenuItem>
<MdMenuItem headline="JPEG"></MdMenuItem>
<MdMenuItem headline="SVG"></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdMenuItem headline="PDF"><span slot="leading-icon" className="material-symbols-outlined">picture_as_pdf</span></MdMenuItem>
<MdMenuItem headline="CSV"><span slot="leading-icon" className="material-symbols-outlined">table_chart</span></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdMenuItem headline="Save" trailingText="⌘S"><span slot="leading-icon" className="material-symbols-outlined">save</span></MdMenuItem>
</MdMenu>
</div>
<div style={{ display: 'grid', gap: '8px', justifyItems: 'start' }}>
<span style={{ font: 'var(--md-sys-typescale-label-large)', color: 'var(--md-sys-color-on-surface-variant)' }}>Vibrant — 3 levels</span>
<MdButton id="deep-vib-t" variant="tonal" onClick={() => deepVibMRef.current?.show()}>Share</MdButton>
<MdMenu id="deep-vib-m" ref={deepVibMRef} anchor="deep-vib-t" variant="vibrant">
<MdMenuItem headline="Copy link" supportingText="To clipboard"><span slot="leading-icon" className="material-symbols-outlined">link</span></MdMenuItem>
<MdSubMenuItem headline="Social" supportingText="Post to a network">
<span slot="leading-icon" className="material-symbols-outlined">public</span>
<MdMenu slot="submenu" variant="vibrant">
<MdMenuItem headline="Twitter" supportingText="Post a tweet"><span slot="leading-icon" className="material-symbols-outlined">tag</span></MdMenuItem>
<MdMenuItem headline="LinkedIn" supportingText="Share with your network"><span slot="leading-icon" className="material-symbols-outlined">work</span></MdMenuItem>
<MdSubMenuItem headline="More" supportingText="Other platforms">
<span slot="leading-icon" className="material-symbols-outlined">more_horiz</span>
<MdMenu slot="submenu" variant="vibrant">
<MdMenuItem headline="Facebook"></MdMenuItem>
<MdMenuItem headline="Reddit"></MdMenuItem>
<MdMenuItem headline="Mastodon"></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdSubMenuItem headline="Send to" supportingText="Direct message" divider>
<span slot="leading-icon" className="material-symbols-outlined">send</span>
<MdMenu slot="submenu" variant="vibrant">
<MdMenuItem headline="Email" supportingText="Compose a message"><span slot="leading-icon" className="material-symbols-outlined">email</span></MdMenuItem>
<MdMenuItem headline="Messages" supportingText="Via iMessage"><span slot="leading-icon" className="material-symbols-outlined">chat</span></MdMenuItem>
<MdMenuItem headline="AirDrop" supportingText="Nearby devices"><span slot="leading-icon" className="material-symbols-outlined">wifi</span></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdMenuItem headline="Embed" supportingText="Get the embed code"><span slot="leading-icon" className="material-symbols-outlined">code</span></MdMenuItem>
</MdMenu>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — 3 levels</span>
<md-button id="deep-std-t" variant="filled" (click)="deepStdM.show()">File</md-button>
<md-menu id="deep-std-m" #deepStdM anchor="deep-std-t" variant="standard">
<md-menu-item headline="New file" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-sub-menu-item headline="Open recent" supporting-text="Last 5 files">
<span slot="leading-icon" class="material-symbols-outlined">history</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="document.txt" supporting-text="Modified yesterday"></md-menu-item>
<md-menu-item headline="styles.css" supporting-text="Modified 3 days ago"></md-menu-item>
<md-sub-menu-item headline="Projects" supporting-text="Browse all">
<span slot="leading-icon" class="material-symbols-outlined">folder</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="my-app" supporting-text="React project"></md-menu-item>
<md-menu-item headline="website" supporting-text="Static site"></md-menu-item>
<md-menu-item headline="design-system" supporting-text="Stencil components"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Export as" supporting-text="Save to disk" divider>
<span slot="leading-icon" class="material-symbols-outlined">download</span>
<md-menu slot="submenu" variant="standard">
<md-sub-menu-item headline="Image" supporting-text="Raster or vector">
<span slot="leading-icon" class="material-symbols-outlined">image</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="PNG"></md-menu-item>
<md-menu-item headline="JPEG"></md-menu-item>
<md-menu-item headline="SVG"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="PDF"><span slot="leading-icon" class="material-symbols-outlined">picture_as_pdf</span></md-menu-item>
<md-menu-item headline="CSV"><span slot="leading-icon" class="material-symbols-outlined">table_chart</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — 3 levels</span>
<md-button id="deep-vib-t" variant="tonal" (click)="deepVibM.show()">Share</md-button>
<md-menu id="deep-vib-m" #deepVibM anchor="deep-vib-t" variant="vibrant">
<md-menu-item headline="Copy link" supporting-text="To clipboard"><span slot="leading-icon" class="material-symbols-outlined">link</span></md-menu-item>
<md-sub-menu-item headline="Social" supporting-text="Post to a network">
<span slot="leading-icon" class="material-symbols-outlined">public</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Twitter" supporting-text="Post a tweet"><span slot="leading-icon" class="material-symbols-outlined">tag</span></md-menu-item>
<md-menu-item headline="LinkedIn" supporting-text="Share with your network"><span slot="leading-icon" class="material-symbols-outlined">work</span></md-menu-item>
<md-sub-menu-item headline="More" supporting-text="Other platforms">
<span slot="leading-icon" class="material-symbols-outlined">more_horiz</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Facebook"></md-menu-item>
<md-menu-item headline="Reddit"></md-menu-item>
<md-menu-item headline="Mastodon"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Send to" supporting-text="Direct message" divider>
<span slot="leading-icon" class="material-symbols-outlined">send</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Email" supporting-text="Compose a message"><span slot="leading-icon" class="material-symbols-outlined">email</span></md-menu-item>
<md-menu-item headline="Messages" supporting-text="Via iMessage"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
<md-menu-item headline="AirDrop" supporting-text="Nearby devices"><span slot="leading-icon" class="material-symbols-outlined">wifi</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Embed" supporting-text="Get the embed code"><span slot="leading-icon" class="material-symbols-outlined">code</span></md-menu-item>
</md-menu>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const deepStdM = ref(null);
const deepVibM = ref(null);
</script>
<template>
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — 3 levels</span>
<md-button id="deep-std-t" variant="filled" @click="deepStdM?.show()">File</md-button>
<md-menu id="deep-std-m" ref="deepStdM" anchor="deep-std-t" variant="standard">
<md-menu-item headline="New file" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-sub-menu-item headline="Open recent" supporting-text="Last 5 files">
<span slot="leading-icon" class="material-symbols-outlined">history</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="document.txt" supporting-text="Modified yesterday"></md-menu-item>
<md-menu-item headline="styles.css" supporting-text="Modified 3 days ago"></md-menu-item>
<md-sub-menu-item headline="Projects" supporting-text="Browse all">
<span slot="leading-icon" class="material-symbols-outlined">folder</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="my-app" supporting-text="React project"></md-menu-item>
<md-menu-item headline="website" supporting-text="Static site"></md-menu-item>
<md-menu-item headline="design-system" supporting-text="Stencil components"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Export as" supporting-text="Save to disk" divider>
<span slot="leading-icon" class="material-symbols-outlined">download</span>
<md-menu slot="submenu" variant="standard">
<md-sub-menu-item headline="Image" supporting-text="Raster or vector">
<span slot="leading-icon" class="material-symbols-outlined">image</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="PNG"></md-menu-item>
<md-menu-item headline="JPEG"></md-menu-item>
<md-menu-item headline="SVG"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="PDF"><span slot="leading-icon" class="material-symbols-outlined">picture_as_pdf</span></md-menu-item>
<md-menu-item headline="CSV"><span slot="leading-icon" class="material-symbols-outlined">table_chart</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — 3 levels</span>
<md-button id="deep-vib-t" variant="tonal" @click="deepVibM?.show()">Share</md-button>
<md-menu id="deep-vib-m" ref="deepVibM" anchor="deep-vib-t" variant="vibrant">
<md-menu-item headline="Copy link" supporting-text="To clipboard"><span slot="leading-icon" class="material-symbols-outlined">link</span></md-menu-item>
<md-sub-menu-item headline="Social" supporting-text="Post to a network">
<span slot="leading-icon" class="material-symbols-outlined">public</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Twitter" supporting-text="Post a tweet"><span slot="leading-icon" class="material-symbols-outlined">tag</span></md-menu-item>
<md-menu-item headline="LinkedIn" supporting-text="Share with your network"><span slot="leading-icon" class="material-symbols-outlined">work</span></md-menu-item>
<md-sub-menu-item headline="More" supporting-text="Other platforms">
<span slot="leading-icon" class="material-symbols-outlined">more_horiz</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Facebook"></md-menu-item>
<md-menu-item headline="Reddit"></md-menu-item>
<md-menu-item headline="Mastodon"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Send to" supporting-text="Direct message" divider>
<span slot="leading-icon" class="material-symbols-outlined">send</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Email" supporting-text="Compose a message"><span slot="leading-icon" class="material-symbols-outlined">email</span></md-menu-item>
<md-menu-item headline="Messages" supporting-text="Via iMessage"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
<md-menu-item headline="AirDrop" supporting-text="Nearby devices"><span slot="leading-icon" class="material-symbols-outlined">wifi</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Embed" supporting-text="Get the embed code"><span slot="leading-icon" class="material-symbols-outlined">code</span></md-menu-item>
</md-menu>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let deepStdM;
let deepVibM;
</script>
<div style="display: flex; gap: 40px; flex-wrap: wrap;">
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Standard — 3 levels</span>
<md-button id="deep-std-t" variant="filled" on:click={() => deepStdM?.show()}>File</md-button>
<md-menu id="deep-std-m" bind:this={deepStdM} anchor="deep-std-t" variant="standard">
<md-menu-item headline="New file" trailing-text="⌘N"><span slot="leading-icon" class="material-symbols-outlined">note_add</span></md-menu-item>
<md-sub-menu-item headline="Open recent" supporting-text="Last 5 files">
<span slot="leading-icon" class="material-symbols-outlined">history</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="document.txt" supporting-text="Modified yesterday"></md-menu-item>
<md-menu-item headline="styles.css" supporting-text="Modified 3 days ago"></md-menu-item>
<md-sub-menu-item headline="Projects" supporting-text="Browse all">
<span slot="leading-icon" class="material-symbols-outlined">folder</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="my-app" supporting-text="React project"></md-menu-item>
<md-menu-item headline="website" supporting-text="Static site"></md-menu-item>
<md-menu-item headline="design-system" supporting-text="Stencil components"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Export as" supporting-text="Save to disk" divider>
<span slot="leading-icon" class="material-symbols-outlined">download</span>
<md-menu slot="submenu" variant="standard">
<md-sub-menu-item headline="Image" supporting-text="Raster or vector">
<span slot="leading-icon" class="material-symbols-outlined">image</span>
<md-menu slot="submenu" variant="standard">
<md-menu-item headline="PNG"></md-menu-item>
<md-menu-item headline="JPEG"></md-menu-item>
<md-menu-item headline="SVG"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="PDF"><span slot="leading-icon" class="material-symbols-outlined">picture_as_pdf</span></md-menu-item>
<md-menu-item headline="CSV"><span slot="leading-icon" class="material-symbols-outlined">table_chart</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Save" trailing-text="⌘S"><span slot="leading-icon" class="material-symbols-outlined">save</span></md-menu-item>
</md-menu>
</div>
<div style="display: grid; gap: 8px; justify-items: start;">
<span style="font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant);">Vibrant — 3 levels</span>
<md-button id="deep-vib-t" variant="tonal" on:click={() => deepVibM?.show()}>Share</md-button>
<md-menu id="deep-vib-m" bind:this={deepVibM} anchor="deep-vib-t" variant="vibrant">
<md-menu-item headline="Copy link" supporting-text="To clipboard"><span slot="leading-icon" class="material-symbols-outlined">link</span></md-menu-item>
<md-sub-menu-item headline="Social" supporting-text="Post to a network">
<span slot="leading-icon" class="material-symbols-outlined">public</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Twitter" supporting-text="Post a tweet"><span slot="leading-icon" class="material-symbols-outlined">tag</span></md-menu-item>
<md-menu-item headline="LinkedIn" supporting-text="Share with your network"><span slot="leading-icon" class="material-symbols-outlined">work</span></md-menu-item>
<md-sub-menu-item headline="More" supporting-text="Other platforms">
<span slot="leading-icon" class="material-symbols-outlined">more_horiz</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Facebook"></md-menu-item>
<md-menu-item headline="Reddit"></md-menu-item>
<md-menu-item headline="Mastodon"></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-sub-menu-item>
<md-sub-menu-item headline="Send to" supporting-text="Direct message" divider>
<span slot="leading-icon" class="material-symbols-outlined">send</span>
<md-menu slot="submenu" variant="vibrant">
<md-menu-item headline="Email" supporting-text="Compose a message"><span slot="leading-icon" class="material-symbols-outlined">email</span></md-menu-item>
<md-menu-item headline="Messages" supporting-text="Via iMessage"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
<md-menu-item headline="AirDrop" supporting-text="Nearby devices"><span slot="leading-icon" class="material-symbols-outlined">wifi</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Embed" supporting-text="Get the embed code"><span slot="leading-icon" class="material-symbols-outlined">code</span></md-menu-item>
</md-menu>
</div>
</div>| Event | Cancelable | Detail | Fires |
|---|---|---|---|
mdOpen | no | void | The menu opened |
mdClose | no | void | The menu closed |
<md-icon-button id="more" icon="more_vert" aria-label="More actions"></md-icon-button>
<md-menu id="menu" anchor="more" placement="bottom-end">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
<script type="module">
const menu = document.getElementById('menu');
document.getElementById('more').addEventListener('mdClick', () => menu.show());
menu.addEventListener('mdOpen', (e) => {
if (e.target !== menu) return; // composed: ignore the re-fire on a host
trackOpen();
});
menu.addEventListener('mdClose', (e) => {
if (e.target !== menu) return;
trackClose();
});
</script>import { useRef } from 'react';
import { MdIconButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function OverflowMenu() {
const menu = useRef<HTMLMdMenuElement>(null);
return (
<>
<MdIconButton
id="more"
icon="more_vert"
aria-label="More actions"
onMdClick={() => menu.current?.show()}
/>
<MdMenu
ref={menu}
anchor="more"
placement="bottom-end"
onMdOpen={(e) => {
if (e.target !== menu.current) return;
trackOpen();
}}
>
<MdMenuItem headline="Rename" />
<MdMenuItem headline="Delete" />
</MdMenu>
</>
);
}import { Component, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'app-overflow-menu',
template: `
<md-icon-button id="more" icon="more_vert" aria-label="More actions"
(mdClick)="menu.nativeElement.show()"></md-icon-button>
<md-menu #menu anchor="more" placement="bottom-end" (mdOpen)="onOpen($event)">
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>
`,
})
export class OverflowMenuComponent {
@ViewChild('menu') menu!: ElementRef<HTMLElement>;
onOpen(e: CustomEvent) {
if (e.target !== this.menu.nativeElement) return;
trackOpen();
}
}<script setup lang="ts">
import { ref } from 'vue';
const menu = ref<HTMLElement | null>(null);
function onOpen(e: CustomEvent) {
if (e.target !== menu.value) return;
trackOpen();
}
</script>
<template>
<md-icon-button
id="more"
icon="more_vert"
aria-label="More actions"
@mdClick="menu?.show()"
/>
<md-menu ref="menu" anchor="more" placement="bottom-end" @mdOpen="onOpen">
<md-menu-item headline="Rename" />
<md-menu-item headline="Delete" />
</md-menu>
</template><script lang="ts">
let menu: HTMLElement;
function onOpen(e: CustomEvent) {
if (e.target !== menu) return;
trackOpen();
}
</script>
<md-icon-button
id="more"
icon="more_vert"
aria-label="More actions"
on:mdClick={() => menu.show()}
></md-icon-button>
<md-menu bind:this={menu} anchor="more" placement="bottom-end" on:mdOpen={onOpen}>
<md-menu-item headline="Rename"></md-menu-item>
<md-menu-item headline="Delete"></md-menu-item>
</md-menu>show(opts?) and close() drive the menu. reposition() exists for when the
anchor moves — the menu reacts to scroll and resize, but does not observe
arbitrary layout changes:
window.addEventListener('resize', () => menu.open && menu.reposition());setComboboxElement() and setVirtualProvider() are integration hooks for
composite pickers with virtualized option lists. Application code should not
call them.
| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
open | open | boolean | false | Yes |
anchor | anchor | string | '' | — |
placement | placement | 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' | 'bottom-start' | Yes |
quick | quick | boolean | false | — |
variant | variant | 'baseline' | 'standard' | 'vibrant' | 'baseline' | Yes |
layout | layout | 'standard' | 'grouped' | 'standard' | Yes |
useGap | use-gap | boolean | false | Yes |
emptyText | empty-text | string | '' | — |
matchAnchorWidth | match-anchor-width | boolean | false | Yes |
responsive | responsive | boolean | false | Yes |
persistent | persistent | boolean | false | Yes |
autoFocus | auto-focus | boolean | true | Yes |
maxHeight | max-height | number | string | — | — |
listLabel | list-label | string | — | — |
listbox | listbox | boolean | false | Yes |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
| Method | Parameters |
|---|---|
setComboboxElement() | el: HTMLElement | null |
setVirtualProvider() | provider: VirtualMenuProvider | null |
getScrollViewport() | none |
show() | opts?: { autoFocus?: boolean } |
reposition() | none |
close() | none |
| Slot | Description |
|---|---|
(default) | — |
header | — |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-menu-min-width | Min container width (default 112px) |
--md-menu-max-width | Max container width (default 280px) |
--md-menu-inline-surface-color | Background for md-menu--inline-fill only (default transparent) |
--md-menu-inline-fill-radius-end | Bottom corner radius for inline-fill embed (default 0) |
--md-menu-viewport-margin | — |
--md-menu-group-gap | — |
--md-menu-section-gap | — |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
empty-text | — |
surface | — |
menu-viewport | — |
A menu is composed from three row types. They are documented here rather than on their own pages: none of them mean anything outside a menu, and the parent owns focus, keyboard navigation and dismissal for all of them.
md-menu-itemOne row in the menu — a command, or a checkbox/radio option, with optional icons, supporting text, a badge and trailing text.
keep-open is set on the item or
persistent on the menu. keep-open is the per-row opt-out; persistent
is the whole-menu one and additionally disables outside-click dismissal, so
reach for it only when you manage closing yourself.type="radio" does not group itself. Put radio rows in an
md-menu-item-group and enforce exclusivity in your
handler — nothing does it for you.mdClick carries no payload. Identify the row by the element you bound
the listener to, or by its headline.indeterminate is presentational only — a mixed state on a checkbox row.
It is ignored for button / radio types and when selected is true.presentation and role-override change the announced role. Leave them
alone unless you are building a picker; md-select uses
presentation="option" so its popup is a real listbox rather than a menu.density here overrides the density inherited from the menu.| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
headline | headline | string | '' | — |
supportingText | supporting-text | string | '' | — |
trailingText | trailing-text | string | '' | — |
disabled | disabled | boolean | false | Yes |
selected | selected | boolean | false | Yes |
indeterminate | indeterminate | boolean | false | Yes |
keepOpen | keep-open | boolean | false | — |
divider | divider | boolean | false | Yes |
gap | gap | boolean | false | Yes |
badge | badge | string | '' | — |
type | type | 'button' | 'checkbox' | 'radio' | 'button' | — |
checkPosition | check-position | 'start' | 'end' | 'end' | Yes |
presentation | presentation | 'menuitem' | 'option' | 'menuitem' | Yes |
roleOverride | role-override | string | '' | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
| Slot | Description |
|---|---|
leading-icon | — |
trailing-icon | — |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-menu-item-height | Item height (default 48px) |
--md-menu-item-padding-inline | Horizontal padding (default 12px) |
--md-menu-item-gap | Gap between elements (default 12px) |
--md-menu-item-icon-size | Leading/trailing icon (default 24px, |
--md-menu-item-check-size | Selection check/radio glyph (default 20px) |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
state-layer | — |
leading-icon | — |
content | — |
headline | — |
supporting-text | — |
badge | — |
trailing | — |
md-menu-item-groupA labelled section within the menu — groups related rows under a heading so a long menu stays scannable.
label defeats the point. An unlabelled group adds nothing over
flat rows — either provide a heading, or use divider on an item instead.layout="grouped". Without it the spacing between
sections doesn’t render as intended.--md-menu-group-gap, set on the menu — it exposes
no custom properties, no events, no methods and no CSS parts of its own.md-menu-item and
md-sub-menu-item children.| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
label | label | string | '' | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
| Slot | Description |
|---|---|
(default) | — |
md-sub-menu-itemA menu row that opens a nested submenu — the same anatomy as
md-menu-item, plus a submenu slot holding the nested
content.
md-menu-item there is no type, no
selected, no keep-open — a submenu row is a branch, not an option. If
you are reaching for those, you want md-menu-item.collapse() exists; there is no expand(). Opening is driven by user
interaction; collapse() closes the branch and resets its visual state, and
an ancestor menu calls it on close so reopening always starts fresh.mdClick fires for the row itself (not the submenu) and carries no
payload.--md-sub-menu-item-* custom properties. It inherits
the --md-menu-item-* metrics from the menu.| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
headline | headline | string | '' | — |
supportingText | supporting-text | string | '' | — |
disabled | disabled | boolean | false | Yes |
divider | divider | boolean | false | Yes |
gap | gap | boolean | false | Yes |
badge | badge | string | '' | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
| Method | Parameters |
|---|---|
collapse() | none |
| Slot | Description |
|---|---|
leading-icon | — |
submenu | — |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
state-layer | — |
leading-icon | — |
content | — |
headline | — |
supporting-text | — |
badge | — |
Escape to close, and returns
focus to the anchor.aria-haspopup="menu" (or listbox in
listbox mode) and aria-expanded.list-label when the menu’s purpose isn’t obvious from the trigger.inert and aria-hidden — don’t fight that; it’s what
keeps hidden items out of the accessibility tree.auto-focus="false" is for composites where focus must stay in a text field.
In that case you must manage the announcements yourself, and note that ARIA
IDREFs can’t cross shadow boundaries.| Key | Action |
|---|---|
↓ / ↑ | Move between enabled rows, wrapping at the ends |
Home / End | First / last row |
| A–Z | Typeahead — jumps to the next row whose headline starts with the letters |
Enter / Space | Activate the row (closes unless keep-open / persistent) |
→ | On a submenu row, open it and move into it (inverted under dir="rtl") |
← | Close the submenu and return to its parent row |
Escape | Close, returning focus to the anchor |
Tab | Close and move on — a menu is not a tab stop |
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="a11y-t" variant="outlined">Open and drive it from the keyboard</md-button>
<md-menu id="a11y-m" anchor="a11y-t" list-label="Document actions">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Download" icon="download" disabled></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<script type="module">
document.getElementById('a11y-t').addEventListener('click', () => {
document.getElementById('a11y-m').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdSubMenuItem } from '@awc-ui/react';
export function Demo() {
const a11yMRef = useRef(null);
return (
<>
<MdButton id="a11y-t" variant="outlined" onClick={() => a11yMRef.current?.show()}>Open and drive it from the keyboard</MdButton>
<MdMenu id="a11y-m" ref={a11yMRef} anchor="a11y-t" listLabel="Document actions">
<MdMenuItem headline="Rename" icon="edit"></MdMenuItem>
<MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem>
<MdMenuItem headline="Download" icon="download" disabled></MdMenuItem>
<MdSubMenuItem headline="Share" icon="share">
<MdMenu slot="submenu">
<MdMenuItem headline="Copy link"></MdMenuItem>
<MdMenuItem headline="Email"></MdMenuItem>
</MdMenu>
</MdSubMenuItem>
<MdMenuItem headline="Delete" icon="delete"></MdMenuItem>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="a11y-t" variant="outlined" (click)="a11yM.show()">Open and drive it from the keyboard</md-button>
<md-menu id="a11y-m" #a11yM anchor="a11y-t" list-label="Document actions">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Download" icon="download" disabled></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const a11yM = ref(null);
</script>
<template>
<md-button id="a11y-t" variant="outlined" @click="a11yM?.show()">Open and drive it from the keyboard</md-button>
<md-menu id="a11y-m" ref="a11yM" anchor="a11y-t" list-label="Document actions">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Download" icon="download" disabled></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let a11yM;
</script>
<md-button id="a11y-t" variant="outlined" on:click={() => a11yM?.show()}>Open and drive it from the keyboard</md-button>
<md-menu id="a11y-m" bind:this={a11yM} anchor="a11y-t" list-label="Document actions">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Download" icon="download" disabled></md-menu-item>
<md-sub-menu-item headline="Share" icon="share">
<md-menu slot="submenu">
<md-menu-item headline="Copy link"></md-menu-item>
<md-menu-item headline="Email"></md-menu-item>
</md-menu>
</md-sub-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>RTL — placement is logical (bottom-start follows reading order) and the
surface mirrors under dir="rtl", including the submenu open direction and the
arrow keys that drive it. See RTL.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:20px 16px;align-items:center;">
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr">
<md-button id="rtl-a" variant="outlined">Actions</md-button>
<md-menu id="rtl-ma" anchor="rtl-a" placement="bottom-start">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share"><md-menu slot="submenu"><md-menu-item headline="Copy link"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl">
<md-button id="rtl-b" variant="outlined">إجراءات</md-button>
<md-menu id="rtl-mb" anchor="rtl-b" placement="bottom-start">
<md-menu-item headline="إعادة تسمية" icon="edit"></md-menu-item>
<md-sub-menu-item headline="مشاركة" icon="share"><md-menu slot="submenu"><md-menu-item headline="نسخ الرابط"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
</div>
<script type="module">
document.getElementById('rtl-a').addEventListener('click', () => {
document.getElementById('rtl-ma').show();
});
document.getElementById('rtl-b').addEventListener('click', () => {
document.getElementById('rtl-mb').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdSubMenuItem } from '@awc-ui/react';
export function Demo() {
const rtlMaRef = useRef(null);
const rtlMbRef = useRef(null);
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '20px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '2.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>ltr</span>
<div dir="ltr">
<MdButton id="rtl-a" variant="outlined" onClick={() => rtlMaRef.current?.show()}>Actions</MdButton>
<MdMenu id="rtl-ma" ref={rtlMaRef} anchor="rtl-a" placement="bottom-start">
<MdMenuItem headline="Rename" icon="edit"></MdMenuItem>
<MdSubMenuItem headline="Share" icon="share"><MdMenu slot="submenu"><MdMenuItem headline="Copy link"></MdMenuItem></MdMenu></MdSubMenuItem>
</MdMenu>
</div>
<span style={{ inlineSize: '2.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl">
<MdButton id="rtl-b" variant="outlined" onClick={() => rtlMbRef.current?.show()}>إجراءات</MdButton>
<MdMenu id="rtl-mb" ref={rtlMbRef} anchor="rtl-b" placement="bottom-start">
<MdMenuItem headline="إعادة تسمية" icon="edit"></MdMenuItem>
<MdSubMenuItem headline="مشاركة" icon="share"><MdMenu slot="submenu"><MdMenuItem headline="نسخ الرابط"></MdMenuItem></MdMenu></MdSubMenuItem>
</MdMenu>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:20px 16px;align-items:center;">
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr">
<md-button id="rtl-a" variant="outlined" (click)="rtlMa.show()">Actions</md-button>
<md-menu id="rtl-ma" #rtlMa anchor="rtl-a" placement="bottom-start">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share"><md-menu slot="submenu"><md-menu-item headline="Copy link"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl">
<md-button id="rtl-b" variant="outlined" (click)="rtlMb.show()">إجراءات</md-button>
<md-menu id="rtl-mb" #rtlMb anchor="rtl-b" placement="bottom-start">
<md-menu-item headline="إعادة تسمية" icon="edit"></md-menu-item>
<md-sub-menu-item headline="مشاركة" icon="share"><md-menu slot="submenu"><md-menu-item headline="نسخ الرابط"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const rtlMa = ref(null);
const rtlMb = ref(null);
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:20px 16px;align-items:center;">
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr">
<md-button id="rtl-a" variant="outlined" @click="rtlMa?.show()">Actions</md-button>
<md-menu id="rtl-ma" ref="rtlMa" anchor="rtl-a" placement="bottom-start">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share"><md-menu slot="submenu"><md-menu-item headline="Copy link"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl">
<md-button id="rtl-b" variant="outlined" @click="rtlMb?.show()">إجراءات</md-button>
<md-menu id="rtl-mb" ref="rtlMb" anchor="rtl-b" placement="bottom-start">
<md-menu-item headline="إعادة تسمية" icon="edit"></md-menu-item>
<md-sub-menu-item headline="مشاركة" icon="share"><md-menu slot="submenu"><md-menu-item headline="نسخ الرابط"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let rtlMa;
let rtlMb;
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:20px 16px;align-items:center;">
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr">
<md-button id="rtl-a" variant="outlined" on:click={() => rtlMa?.show()}>Actions</md-button>
<md-menu id="rtl-ma" bind:this={rtlMa} anchor="rtl-a" placement="bottom-start">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-sub-menu-item headline="Share" icon="share"><md-menu slot="submenu"><md-menu-item headline="Copy link"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
<span style="inline-size:2.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl">
<md-button id="rtl-b" variant="outlined" on:click={() => rtlMb?.show()}>إجراءات</md-button>
<md-menu id="rtl-mb" bind:this={rtlMb} anchor="rtl-b" placement="bottom-start">
<md-menu-item headline="إعادة تسمية" icon="edit"></md-menu-item>
<md-sub-menu-item headline="مشاركة" icon="share"><md-menu slot="submenu"><md-menu-item headline="نسخ الرابط"></md-menu-item></md-menu></md-sub-menu-item>
</md-menu>
</div>
</div>Density — density="-1…-4" compacts rows and cascades to items; a row’s own
density overrides the menu’s. See Density.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; gap: 12px; flex-wrap: wrap;">
<md-button id="dn-0" variant="outlined">0</md-button>
<md-menu id="dn-m0" anchor="dn-0" density="0"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-1" variant="outlined">-1</md-button>
<md-menu id="dn-m1" anchor="dn-1" density="-1"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-2" variant="outlined">-2</md-button>
<md-menu id="dn-m2" anchor="dn-2" density="-2"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-3" variant="outlined">-3</md-button>
<md-menu id="dn-m3" anchor="dn-3" density="-3"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-4" variant="outlined">-4</md-button>
<md-menu id="dn-m4" anchor="dn-4" density="-4"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
</div>
<script type="module">
document.getElementById('dn-0').addEventListener('click', () => {
document.getElementById('dn-m0').show();
});
document.getElementById('dn-1').addEventListener('click', () => {
document.getElementById('dn-m1').show();
});
document.getElementById('dn-2').addEventListener('click', () => {
document.getElementById('dn-m2').show();
});
document.getElementById('dn-3').addEventListener('click', () => {
document.getElementById('dn-m3').show();
});
document.getElementById('dn-4').addEventListener('click', () => {
document.getElementById('dn-m4').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const dnM0Ref = useRef(null);
const dnM1Ref = useRef(null);
const dnM2Ref = useRef(null);
const dnM3Ref = useRef(null);
const dnM4Ref = useRef(null);
return (
<>
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap' }}>
<MdButton id="dn-0" variant="outlined" onClick={() => dnM0Ref.current?.show()}>0</MdButton>
<MdMenu id="dn-m0" ref={dnM0Ref} anchor="dn-0" density="0"><MdMenuItem headline="Rename" icon="edit"></MdMenuItem><MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem><MdMenuItem headline="Delete" icon="delete"></MdMenuItem></MdMenu>
<MdButton id="dn-1" variant="outlined" onClick={() => dnM1Ref.current?.show()}>-1</MdButton>
<MdMenu id="dn-m1" ref={dnM1Ref} anchor="dn-1" density="-1"><MdMenuItem headline="Rename" icon="edit"></MdMenuItem><MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem><MdMenuItem headline="Delete" icon="delete"></MdMenuItem></MdMenu>
<MdButton id="dn-2" variant="outlined" onClick={() => dnM2Ref.current?.show()}>-2</MdButton>
<MdMenu id="dn-m2" ref={dnM2Ref} anchor="dn-2" density="-2"><MdMenuItem headline="Rename" icon="edit"></MdMenuItem><MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem><MdMenuItem headline="Delete" icon="delete"></MdMenuItem></MdMenu>
<MdButton id="dn-3" variant="outlined" onClick={() => dnM3Ref.current?.show()}>-3</MdButton>
<MdMenu id="dn-m3" ref={dnM3Ref} anchor="dn-3" density="-3"><MdMenuItem headline="Rename" icon="edit"></MdMenuItem><MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem><MdMenuItem headline="Delete" icon="delete"></MdMenuItem></MdMenu>
<MdButton id="dn-4" variant="outlined" onClick={() => dnM4Ref.current?.show()}>-4</MdButton>
<MdMenu id="dn-m4" ref={dnM4Ref} anchor="dn-4" density="-4"><MdMenuItem headline="Rename" icon="edit"></MdMenuItem><MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem><MdMenuItem headline="Delete" icon="delete"></MdMenuItem></MdMenu>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; gap: 12px; flex-wrap: wrap;">
<md-button id="dn-0" variant="outlined" (click)="dnM0.show()">0</md-button>
<md-menu id="dn-m0" #dnM0 anchor="dn-0" density="0"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-1" variant="outlined" (click)="dnM1.show()">-1</md-button>
<md-menu id="dn-m1" #dnM1 anchor="dn-1" density="-1"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-2" variant="outlined" (click)="dnM2.show()">-2</md-button>
<md-menu id="dn-m2" #dnM2 anchor="dn-2" density="-2"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-3" variant="outlined" (click)="dnM3.show()">-3</md-button>
<md-menu id="dn-m3" #dnM3 anchor="dn-3" density="-3"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-4" variant="outlined" (click)="dnM4.show()">-4</md-button>
<md-menu id="dn-m4" #dnM4 anchor="dn-4" density="-4"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const dnM0 = ref(null);
const dnM1 = ref(null);
const dnM2 = ref(null);
const dnM3 = ref(null);
const dnM4 = ref(null);
</script>
<template>
<div style="display: flex; gap: 12px; flex-wrap: wrap;">
<md-button id="dn-0" variant="outlined" @click="dnM0?.show()">0</md-button>
<md-menu id="dn-m0" ref="dnM0" anchor="dn-0" density="0"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-1" variant="outlined" @click="dnM1?.show()">-1</md-button>
<md-menu id="dn-m1" ref="dnM1" anchor="dn-1" density="-1"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-2" variant="outlined" @click="dnM2?.show()">-2</md-button>
<md-menu id="dn-m2" ref="dnM2" anchor="dn-2" density="-2"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-3" variant="outlined" @click="dnM3?.show()">-3</md-button>
<md-menu id="dn-m3" ref="dnM3" anchor="dn-3" density="-3"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-4" variant="outlined" @click="dnM4?.show()">-4</md-button>
<md-menu id="dn-m4" ref="dnM4" anchor="dn-4" density="-4"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let dnM0;
let dnM1;
let dnM2;
let dnM3;
let dnM4;
</script>
<div style="display: flex; gap: 12px; flex-wrap: wrap;">
<md-button id="dn-0" variant="outlined" on:click={() => dnM0?.show()}>0</md-button>
<md-menu id="dn-m0" bind:this={dnM0} anchor="dn-0" density="0"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-1" variant="outlined" on:click={() => dnM1?.show()}>-1</md-button>
<md-menu id="dn-m1" bind:this={dnM1} anchor="dn-1" density="-1"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-2" variant="outlined" on:click={() => dnM2?.show()}>-2</md-button>
<md-menu id="dn-m2" bind:this={dnM2} anchor="dn-2" density="-2"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-3" variant="outlined" on:click={() => dnM3?.show()}>-3</md-button>
<md-menu id="dn-m3" bind:this={dnM3} anchor="dn-3" density="-3"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
<md-button id="dn-4" variant="outlined" on:click={() => dnM4?.show()}>-4</md-button>
<md-menu id="dn-m4" bind:this={dnM4} anchor="dn-4" density="-4"><md-menu-item headline="Rename" icon="edit"></md-menu-item><md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item><md-menu-item headline="Delete" icon="delete"></md-menu-item></md-menu>
</div>Rows go 48px at 0 down to 32px at -4, and the icons taper 24 → 20px with
them. --md-menu-item-height and --md-menu-item-icon-size opt a menu out of
that curve entirely.
i18n — translate empty-text, list-label, header content and every item’s
text. Menu width follows content, so longer translations widen the surface —
check --md-menu-max-width.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="i18-de" variant="outlined">Aktionen</md-button>
<md-menu id="i18-mde" anchor="i18-de" list-label="Dokumentaktionen" empty-text="Keine Aktionen">
<md-menu-item headline="Umbenennen" icon="edit"></md-menu-item>
<md-menu-item headline="Vervielfältigen" icon="content_copy" supporting-text="Erstellt eine Kopie am selben Ort"></md-menu-item>
<md-menu-item headline="Löschen" icon="delete"></md-menu-item>
</md-menu>
<md-button id="i18-empty" variant="outlined">Leer</md-button>
<md-menu id="i18-mempty" anchor="i18-empty" empty-text="Keine Aktionen verfügbar"></md-menu>
<script type="module">
document.getElementById('i18-de').addEventListener('click', () => {
document.getElementById('i18-mde').show();
});
document.getElementById('i18-empty').addEventListener('click', () => {
document.getElementById('i18-mempty').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const i18MdeRef = useRef(null);
const i18MemptyRef = useRef(null);
return (
<>
<MdButton id="i18-de" variant="outlined" onClick={() => i18MdeRef.current?.show()}>Aktionen</MdButton>
<MdMenu id="i18-mde" ref={i18MdeRef} anchor="i18-de" listLabel="Dokumentaktionen" emptyText="Keine Aktionen">
<MdMenuItem headline="Umbenennen" icon="edit"></MdMenuItem>
<MdMenuItem headline="Vervielfältigen" icon="content_copy" supportingText="Erstellt eine Kopie am selben Ort"></MdMenuItem>
<MdMenuItem headline="Löschen" icon="delete"></MdMenuItem>
</MdMenu>
<MdButton id="i18-empty" variant="outlined" onClick={() => i18MemptyRef.current?.show()}>Leer</MdButton>
<MdMenu id="i18-mempty" ref={i18MemptyRef} anchor="i18-empty" emptyText="Keine Aktionen verfügbar"></MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="i18-de" variant="outlined" (click)="i18Mde.show()">Aktionen</md-button>
<md-menu id="i18-mde" #i18Mde anchor="i18-de" list-label="Dokumentaktionen" empty-text="Keine Aktionen">
<md-menu-item headline="Umbenennen" icon="edit"></md-menu-item>
<md-menu-item headline="Vervielfältigen" icon="content_copy" supporting-text="Erstellt eine Kopie am selben Ort"></md-menu-item>
<md-menu-item headline="Löschen" icon="delete"></md-menu-item>
</md-menu>
<md-button id="i18-empty" variant="outlined" (click)="i18Mempty.show()">Leer</md-button>
<md-menu id="i18-mempty" #i18Mempty anchor="i18-empty" empty-text="Keine Aktionen verfügbar"></md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const i18Mde = ref(null);
const i18Mempty = ref(null);
</script>
<template>
<md-button id="i18-de" variant="outlined" @click="i18Mde?.show()">Aktionen</md-button>
<md-menu id="i18-mde" ref="i18Mde" anchor="i18-de" list-label="Dokumentaktionen" empty-text="Keine Aktionen">
<md-menu-item headline="Umbenennen" icon="edit"></md-menu-item>
<md-menu-item headline="Vervielfältigen" icon="content_copy" supporting-text="Erstellt eine Kopie am selben Ort"></md-menu-item>
<md-menu-item headline="Löschen" icon="delete"></md-menu-item>
</md-menu>
<md-button id="i18-empty" variant="outlined" @click="i18Mempty?.show()">Leer</md-button>
<md-menu id="i18-mempty" ref="i18Mempty" anchor="i18-empty" empty-text="Keine Aktionen verfügbar"></md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let i18Mde;
let i18Mempty;
</script>
<md-button id="i18-de" variant="outlined" on:click={() => i18Mde?.show()}>Aktionen</md-button>
<md-menu id="i18-mde" bind:this={i18Mde} anchor="i18-de" list-label="Dokumentaktionen" empty-text="Keine Aktionen">
<md-menu-item headline="Umbenennen" icon="edit"></md-menu-item>
<md-menu-item headline="Vervielfältigen" icon="content_copy" supporting-text="Erstellt eine Kopie am selben Ort"></md-menu-item>
<md-menu-item headline="Löschen" icon="delete"></md-menu-item>
</md-menu>
<md-button id="i18-empty" variant="outlined" on:click={() => i18Mempty?.show()}>Leer</md-button>
<md-menu id="i18-mempty" bind:this={i18Mempty} anchor="i18-empty" empty-text="Keine Aktionen verfügbar"></md-menu>| Custom property | Purpose | Default |
|---|---|---|
--md-menu-min-width / --md-menu-max-width | Surface width bounds | 112px / viewport-clamped |
--md-menu-inline-surface-color | Inline (embedded) surface tone | transparent |
--md-menu-inline-fill-radius-end | Inline surface corner | 0 |
--md-menu-viewport-margin | Gap from the viewport edge | — |
--md-menu-section-gap | Space between groups | 2px |
--md-menu-group-gap | Space after a md-menu-item-group | 2px |
--md-menu-item-height | Row height (opts out of density) | 48px, density-derived |
--md-menu-item-padding-inline | Row padding | 12px |
--md-menu-item-gap | Gap between row elements | 12px |
--md-menu-item-icon-size | Leading / trailing glyph | 24px (20px in standard/vibrant) |
--md-menu-item-check-size | Selection check / radio glyph | 20px |
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-button id="th-1" variant="outlined">Wide and roomy</md-button>
<md-menu id="th-m1" anchor="th-1" style="--md-menu-min-width: 260px; --md-menu-item-height: 56px; --md-menu-item-padding-inline: 20px; --md-menu-item-gap: 16px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-2" variant="outlined">Narrow and dense</md-button>
<md-menu id="th-m2" anchor="th-2" style="--md-menu-min-width: 140px; --md-menu-max-width: 180px; --md-menu-item-height: 34px; --md-menu-item-icon-size: 18px; --md-menu-item-gap: 8px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-3" variant="outlined">Grouped, wide gaps</md-button>
<md-menu id="th-m3" anchor="th-3" layout="grouped" style="--md-menu-section-gap: 12px; --md-menu-group-gap: 12px;">
<md-menu-item-group label="Order">
<md-menu-item headline="Newest" type="radio" selected></md-menu-item>
<md-menu-item headline="Oldest" type="radio"></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Field">
<md-menu-item headline="Name" type="radio"></md-menu-item>
<md-menu-item headline="Size" type="radio"></md-menu-item>
</md-menu-item-group>
</md-menu>
<script type="module">
document.getElementById('th-1').addEventListener('click', () => {
document.getElementById('th-m1').show();
});
document.getElementById('th-2').addEventListener('click', () => {
document.getElementById('th-m2').show();
});
document.getElementById('th-3').addEventListener('click', () => {
document.getElementById('th-m3').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem, MdMenuItemGroup } from '@awc-ui/react';
export function Demo() {
const thM1Ref = useRef(null);
const thM2Ref = useRef(null);
const thM3Ref = useRef(null);
return (
<>
<MdButton id="th-1" variant="outlined" onClick={() => thM1Ref.current?.show()}>Wide and roomy</MdButton>
<MdMenu id="th-m1" ref={thM1Ref} anchor="th-1" style={{ '--md-menu-min-width': '260px', '--md-menu-item-height': '56px', '--md-menu-item-padding-inline': '20px', '--md-menu-item-gap': '16px' }}>
<MdMenuItem headline="Rename" icon="edit"></MdMenuItem>
<MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem>
<MdMenuItem headline="Delete" icon="delete"></MdMenuItem>
</MdMenu>
<MdButton id="th-2" variant="outlined" onClick={() => thM2Ref.current?.show()}>Narrow and dense</MdButton>
<MdMenu id="th-m2" ref={thM2Ref} anchor="th-2" style={{ '--md-menu-min-width': '140px', '--md-menu-max-width': '180px', '--md-menu-item-height': '34px', '--md-menu-item-icon-size': '18px', '--md-menu-item-gap': '8px' }}>
<MdMenuItem headline="Rename" icon="edit"></MdMenuItem>
<MdMenuItem headline="Duplicate" icon="content_copy"></MdMenuItem>
<MdMenuItem headline="Delete" icon="delete"></MdMenuItem>
</MdMenu>
<MdButton id="th-3" variant="outlined" onClick={() => thM3Ref.current?.show()}>Grouped, wide gaps</MdButton>
<MdMenu id="th-m3" ref={thM3Ref} anchor="th-3" layout="grouped" style={{ '--md-menu-section-gap': '12px', '--md-menu-group-gap': '12px' }}>
<MdMenuItemGroup label="Order">
<MdMenuItem headline="Newest" type="radio" selected></MdMenuItem>
<MdMenuItem headline="Oldest" type="radio"></MdMenuItem>
</MdMenuItemGroup>
<MdMenuItemGroup label="Field">
<MdMenuItem headline="Name" type="radio"></MdMenuItem>
<MdMenuItem headline="Size" type="radio"></MdMenuItem>
</MdMenuItemGroup>
</MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-button id="th-1" variant="outlined" (click)="thM1.show()">Wide and roomy</md-button>
<md-menu id="th-m1" #thM1 anchor="th-1" style="--md-menu-min-width: 260px; --md-menu-item-height: 56px; --md-menu-item-padding-inline: 20px; --md-menu-item-gap: 16px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-2" variant="outlined" (click)="thM2.show()">Narrow and dense</md-button>
<md-menu id="th-m2" #thM2 anchor="th-2" style="--md-menu-min-width: 140px; --md-menu-max-width: 180px; --md-menu-item-height: 34px; --md-menu-item-icon-size: 18px; --md-menu-item-gap: 8px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-3" variant="outlined" (click)="thM3.show()">Grouped, wide gaps</md-button>
<md-menu id="th-m3" #thM3 anchor="th-3" layout="grouped" style="--md-menu-section-gap: 12px; --md-menu-group-gap: 12px;">
<md-menu-item-group label="Order">
<md-menu-item headline="Newest" type="radio" selected></md-menu-item>
<md-menu-item headline="Oldest" type="radio"></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Field">
<md-menu-item headline="Name" type="radio"></md-menu-item>
<md-menu-item headline="Size" type="radio"></md-menu-item>
</md-menu-item-group>
</md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const thM1 = ref(null);
const thM2 = ref(null);
const thM3 = ref(null);
</script>
<template>
<md-button id="th-1" variant="outlined" @click="thM1?.show()">Wide and roomy</md-button>
<md-menu id="th-m1" ref="thM1" anchor="th-1" style="--md-menu-min-width: 260px; --md-menu-item-height: 56px; --md-menu-item-padding-inline: 20px; --md-menu-item-gap: 16px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-2" variant="outlined" @click="thM2?.show()">Narrow and dense</md-button>
<md-menu id="th-m2" ref="thM2" anchor="th-2" style="--md-menu-min-width: 140px; --md-menu-max-width: 180px; --md-menu-item-height: 34px; --md-menu-item-icon-size: 18px; --md-menu-item-gap: 8px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-3" variant="outlined" @click="thM3?.show()">Grouped, wide gaps</md-button>
<md-menu id="th-m3" ref="thM3" anchor="th-3" layout="grouped" style="--md-menu-section-gap: 12px; --md-menu-group-gap: 12px;">
<md-menu-item-group label="Order">
<md-menu-item headline="Newest" type="radio" selected></md-menu-item>
<md-menu-item headline="Oldest" type="radio"></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Field">
<md-menu-item headline="Name" type="radio"></md-menu-item>
<md-menu-item headline="Size" type="radio"></md-menu-item>
</md-menu-item-group>
</md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let thM1;
let thM2;
let thM3;
</script>
<md-button id="th-1" variant="outlined" on:click={() => thM1?.show()}>Wide and roomy</md-button>
<md-menu id="th-m1" bind:this={thM1} anchor="th-1" style="--md-menu-min-width: 260px; --md-menu-item-height: 56px; --md-menu-item-padding-inline: 20px; --md-menu-item-gap: 16px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-2" variant="outlined" on:click={() => thM2?.show()}>Narrow and dense</md-button>
<md-menu id="th-m2" bind:this={thM2} anchor="th-2" style="--md-menu-min-width: 140px; --md-menu-max-width: 180px; --md-menu-item-height: 34px; --md-menu-item-icon-size: 18px; --md-menu-item-gap: 8px;">
<md-menu-item headline="Rename" icon="edit"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy"></md-menu-item>
<md-menu-item headline="Delete" icon="delete"></md-menu-item>
</md-menu>
<md-button id="th-3" variant="outlined" on:click={() => thM3?.show()}>Grouped, wide gaps</md-button>
<md-menu id="th-m3" bind:this={thM3} anchor="th-3" layout="grouped" style="--md-menu-section-gap: 12px; --md-menu-group-gap: 12px;">
<md-menu-item-group label="Order">
<md-menu-item headline="Newest" type="radio" selected></md-menu-item>
<md-menu-item headline="Oldest" type="radio"></md-menu-item>
</md-menu-item-group>
<md-menu-item-group label="Field">
<md-menu-item headline="Name" type="radio"></md-menu-item>
<md-menu-item headline="Size" type="radio"></md-menu-item>
</md-menu-item-group>
</md-menu>The menu exposes three parts; the rows expose their own seven.
| Part | On | Element |
|---|---|---|
surface | md-menu | The elevated popup surface |
menu-viewport | md-menu | The scrolling region inside the surface |
empty-text | md-menu | The empty-text message |
state-layer | md-menu-item | Hover / focus / press overlay |
leading-icon | md-menu-item | Leading glyph container |
content | md-menu-item | Headline + supporting-text wrapper |
headline | md-menu-item | Primary label |
supporting-text | md-menu-item | Secondary label |
badge | md-menu-item | The badge |
trailing | md-menu-item | Trailing text / icon region |
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<style>
.parts-menu::part(surface) {
box-shadow: none;
border: 2px solid var(--md-sys-color-primary);
border-radius: 4px;
}
.parts-menu::part(menu-viewport) { padding-block: 6px; }
.parts-menu md-menu-item::part(headline) { text-transform: uppercase; letter-spacing: .06em; font-size: 13px; }
.parts-menu md-menu-item::part(trailing) { opacity: .6; font-variant-numeric: tabular-nums; }
</style>
<md-button id="pm-t" variant="outlined">Styled parts</md-button>
<md-menu id="pm-m" class="parts-menu" anchor="pm-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" trailing-text="⌘D"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="pm-t2" variant="outlined">Styled empty state</md-button>
<md-menu id="pm-m2" class="parts-menu" anchor="pm-t2" empty-text="Nothing here yet"></md-menu>
<script type="module">
document.getElementById('pm-t').addEventListener('click', () => {
document.getElementById('pm-m').show();
});
document.getElementById('pm-t2').addEventListener('click', () => {
document.getElementById('pm-m2').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdButton, MdMenu, MdMenuItem } from '@awc-ui/react';
export function Demo() {
const pmMRef = useRef(null);
const pmM2Ref = useRef(null);
return (
<>
<style>
.parts-menu::part(surface) {
box-shadow: none;
border: 2px solid var(--md-sys-color-primary);
border-radius: 4px;
}
.parts-menu::part(menu-viewport) { padding-block: 6px; }
.parts-menu md-menu-item::part(headline) { text-transform: uppercase; letter-spacing: .06em; font-size: 13px; }
.parts-menu md-menu-item::part(trailing) { opacity: .6; font-variant-numeric: tabular-nums; }
</style>
<MdButton id="pm-t" variant="outlined" onClick={() => pmMRef.current?.show()}>Styled parts</MdButton>
<MdMenu id="pm-m" ref={pmMRef} className="parts-menu" anchor="pm-t">
<MdMenuItem headline="Rename" icon="edit" trailingText="⌘R"></MdMenuItem>
<MdMenuItem headline="Duplicate" icon="content_copy" trailingText="⌘D"></MdMenuItem>
<MdMenuItem headline="Delete" icon="delete" trailingText="⌫"></MdMenuItem>
</MdMenu>
<MdButton id="pm-t2" variant="outlined" onClick={() => pmM2Ref.current?.show()}>Styled empty state</MdButton>
<MdMenu id="pm-m2" ref={pmM2Ref} className="parts-menu" anchor="pm-t2" emptyText="Nothing here yet"></MdMenu>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<style>
.parts-menu::part(surface) {
box-shadow: none;
border: 2px solid var(--md-sys-color-primary);
border-radius: 4px;
}
.parts-menu::part(menu-viewport) { padding-block: 6px; }
.parts-menu md-menu-item::part(headline) { text-transform: uppercase; letter-spacing: .06em; font-size: 13px; }
.parts-menu md-menu-item::part(trailing) { opacity: .6; font-variant-numeric: tabular-nums; }
</style>
<md-button id="pm-t" variant="outlined" (click)="pmM.show()">Styled parts</md-button>
<md-menu id="pm-m" #pmM class="parts-menu" anchor="pm-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" trailing-text="⌘D"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="pm-t2" variant="outlined" (click)="pmM2.show()">Styled empty state</md-button>
<md-menu id="pm-m2" #pmM2 class="parts-menu" anchor="pm-t2" empty-text="Nothing here yet"></md-menu><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const pmM = ref(null);
const pmM2 = ref(null);
</script>
<template>
<style>
.parts-menu::part(surface) {
box-shadow: none;
border: 2px solid var(--md-sys-color-primary);
border-radius: 4px;
}
.parts-menu::part(menu-viewport) { padding-block: 6px; }
.parts-menu md-menu-item::part(headline) { text-transform: uppercase; letter-spacing: .06em; font-size: 13px; }
.parts-menu md-menu-item::part(trailing) { opacity: .6; font-variant-numeric: tabular-nums; }
</style>
<md-button id="pm-t" variant="outlined" @click="pmM?.show()">Styled parts</md-button>
<md-menu id="pm-m" ref="pmM" class="parts-menu" anchor="pm-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" trailing-text="⌘D"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="pm-t2" variant="outlined" @click="pmM2?.show()">Styled empty state</md-button>
<md-menu id="pm-m2" ref="pmM2" class="parts-menu" anchor="pm-t2" empty-text="Nothing here yet"></md-menu>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let pmM;
let pmM2;
</script>
<style>
.parts-menu::part(surface) {
box-shadow: none;
border: 2px solid var(--md-sys-color-primary);
border-radius: 4px;
}
.parts-menu::part(menu-viewport) { padding-block: 6px; }
.parts-menu md-menu-item::part(headline) { text-transform: uppercase; letter-spacing: .06em; font-size: 13px; }
.parts-menu md-menu-item::part(trailing) { opacity: .6; font-variant-numeric: tabular-nums; }
</style>
<md-button id="pm-t" variant="outlined" on:click={() => pmM?.show()}>Styled parts</md-button>
<md-menu id="pm-m" bind:this={pmM} class="parts-menu" anchor="pm-t">
<md-menu-item headline="Rename" icon="edit" trailing-text="⌘R"></md-menu-item>
<md-menu-item headline="Duplicate" icon="content_copy" trailing-text="⌘D"></md-menu-item>
<md-menu-item headline="Delete" icon="delete" trailing-text="⌫"></md-menu-item>
</md-menu>
<md-button id="pm-t2" variant="outlined" on:click={() => pmM2?.show()}>Styled empty state</md-button>
<md-menu id="pm-m2" bind:this={pmM2} class="parts-menu" anchor="pm-t2" empty-text="Nothing here yet"></md-menu>md-menu::part(surface) { box-shadow: none; border: 1px solid var(--md-sys-color-outline-variant);}md-menu-item ·
md-menu-item-group ·
md-sub-menu-item ·
md-select ·
md-multi-select ·
md-autocomplete ·
md-toolbar ·
md-split-button
md-menuTwo artefacts to give your AI agent so it generates correct UI with this component. The per-component spec answers "how do I use this exact tag?". The main-llm spec answers "which tag should I pick in the first place?".
md-menu spec card
Identity · when to use / when NOT · decision cues · behavioural contract · do/don't · anti-patterns · full API. Paste into your agent when you're implementing with this component.
System-prompt preamble · decision matrix · token reference · page recipes · anti-patterns. Paste into the system prompt at the start of a piece of work.