feat(aria/menu): Add possibility to create a shared menu component from aria/menu
Mantenedores costumam responder em até 1 dia
@ok7sai já está trabalhando nisso.
Desde 1/4/2026.
Avaliação
Esta issue ainda não foi avaliada.
Descrição
Feature Description
When building a menu using aria/menu you have to have the following structure:
- an for cdkConnectedOverlay
- a container element with ngMenu
- another for ngMenuContent
- only then the actual ngMenuItem elements
This results in 4 structural levels that need to be repeated every time you need a new menu.
I attempted to create a shared menu component (similar to Angular Material’s MatMenu) in order to reduce this complexity to 2 levels and enable an API like:
<button appMenuTrigger #appMenuTrigger="appMenuTrigger" [appMenu]="appMenu.formatMenu()">
Open Menu
</button>
<app-menu #appMenu [appMenuTrigger]="appMenuTrigger">
<app-menu-item value="Mark as read">
<span class="icon material-symbols-outlined" aria-hidden="true">mark_email_read</span>
<span class="label">Mark as read</span>
</app-menu-item>
<app-menu-item value="Snooze">
<span class="icon material-symbols-outlined" aria-hidden="true">snooze</span>
<span class="label">Snooze</span>
</app-menu-item>
</app-menu>
Internally, app-menu wraps Menu and MenuContent:
@Component({
selector: 'app-menu',
imports: [OverlayModule, Menu, MenuContent],
template: `
<ng-template
[cdkConnectedOverlayOpen]="appMenuTrigger().menuTrigger.expanded()"
[cdkConnectedOverlay]="{ origin: appMenuTrigger().nativeElement, usePopover: 'inline' }"
[cdkConnectedOverlayPositions]="overlayPositions"
cdkAttachPopoverAsChild>
<div ngMenu class="menu" #formatMenu="ngMenu">
<ng-template ngMenuContent>
<ng-content />
</ng-template>
</div>
</ng-template>
`
})
export class AppMenu {
appMenuTrigger = input.required<AppMenuTrigger>();
formatMenu = viewChild<Menu<string>>('formatMenu');
overlayPositions: ConnectedPosition[] = [{originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4}];
}
and menu items are wrapped like this:
@Component({
selector: 'app-menu-item',
template: '<ng-content />',
hostDirectives: [{ directive: MenuItem, inputs: ['value: value'] }]
})
export class AppMenuItem {}
Problem
With this approach, accessibility breaks (keyboard navigation no longer works correctly). This seems to happen because Menu cannot properly register MenuItem children when they are content projected.
Proposed enhancement
Expose a public API on Menu that allows the menu to "refresh" in order to register the items when they are content projected.
Use Case
No response
- Linguagem predominante
- TypeScript
- Estrelas
- 25k
- Forks
- 6.8k
- Merge médio
- 1d 4h
- PRs com merge (30d)
- 69
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de angular/components
-
bug(material/sort): hover hint arrow on an unsorted header shows the active sort direction, not the resulting direction after click.Talvez já em andamento @lekhmanrus assumiu há 10 dias. Abertaarea: material/sort P3
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
angular/components#33933 ·
Mantenedores costumam responder em até 1 dia
-
bug(mat-date-picker): month shown twice in date pickerTalvez já em andamento @PreethiPantangi assumiu há 27 dias. Abertaarea: material/datepicker P4
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
angular/components#33763 · 2 comentários · 3 reações ·
Mantenedores costumam responder em até 1 dia
-
Bug in table.scss footer cell height: unset instead of footer row height unsetTalvez já em andamento @minwookshin assumiu há 14 dias. Abertaarea: material/table P4
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
angular/components#33709 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
docs-bug(Table): Add example with `rowspan`Talvez já em andamento @BHUVANSH855 assumiu há 95 dias. Abertaarea: material/table docs P4
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
angular/components#33455 ·
Mantenedores costumam responder em até 1 dia
-
bug(date-adapter): Misleading JSDoc for createDate returns typeTalvez já em andamento @BHUVANSH855 assumiu há 144 dias. Abertaarea: material/core P3
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 78/100
angular/components#33059 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de angular/components
Issues semelhantes
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
components-web-app/docs#260 ·
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 65/100
521xueweihan/HelloGitHub#4025 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
ctrf-io/playwright-ctrf-json-reporter#117 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
voidzero-dev/void#478 ·
Mantenedores costumam responder em até 1 dia