Skip to content

Commit bc95b39

Browse files
committed
refactor(material/menu): convert to standalone
Converts `material/menu` to standalone.
1 parent 6f1e66f commit bc95b39

File tree

8 files changed

+43
-16
lines changed

8 files changed

+43
-16
lines changed

src/material/menu/menu-content.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const MAT_MENU_CONTENT = new InjectionToken<MatMenuContent>('MatMenuConte
3333
@Directive({
3434
selector: 'ng-template[matMenuContent]',
3535
providers: [{provide: MAT_MENU_CONTENT, useExisting: MatMenuContent}],
36+
standalone: true,
3637
})
3738
export class MatMenuContent implements OnDestroy {
3839
private _portal: TemplatePortal<any>;

src/material/menu/menu-item.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {FocusableOption, FocusMonitor, FocusOrigin} from '@angular/cdk/a11y';
2323
import {Subject} from 'rxjs';
2424
import {DOCUMENT} from '@angular/common';
2525
import {MatMenuPanel, MAT_MENU_PANEL} from './menu-panel';
26+
import {MatRipple} from '@angular/material/core';
2627

2728
/**
2829
* Single item inside a `mat-menu`. Provides the menu item styling and accessibility treatment.
@@ -44,6 +45,8 @@ import {MatMenuPanel, MAT_MENU_PANEL} from './menu-panel';
4445
changeDetection: ChangeDetectionStrategy.OnPush,
4546
encapsulation: ViewEncapsulation.None,
4647
templateUrl: 'menu-item.html',
48+
standalone: true,
49+
imports: [MatRipple],
4750
})
4851
export class MatMenuItem implements FocusableOption, AfterViewInit, OnDestroy {
4952
/** ARIA role for the menu item. */

src/material/menu/menu-trigger.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ import {MenuPositionX, MenuPositionY} from './menu-positions';
5353
/** Injection token that determines the scroll handling while the menu is open. */
5454
export const MAT_MENU_SCROLL_STRATEGY = new InjectionToken<() => ScrollStrategy>(
5555
'mat-menu-scroll-strategy',
56+
{
57+
providedIn: 'root',
58+
factory: () => {
59+
const overlay = inject(Overlay);
60+
return () => overlay.scrollStrategies.reposition();
61+
},
62+
},
5663
);
5764

5865
/** @docs-private */
@@ -90,6 +97,7 @@ export const MENU_PANEL_TOP_PADDING = 8;
9097
'(keydown)': '_handleKeydown($event)',
9198
},
9299
exportAs: 'matMenuTrigger',
100+
standalone: true,
93101
})
94102
export class MatMenuTrigger implements AfterContentInit, OnDestroy {
95103
private _portal: TemplatePortal;

src/material/menu/menu.spec.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,13 +2736,13 @@ describe('MatMenu default overrides', () => {
27362736
beforeEach(fakeAsync(() => {
27372737
TestBed.configureTestingModule({
27382738
imports: [MatMenuModule, NoopAnimationsModule],
2739-
declarations: [SimpleMenu, FakeIcon],
27402739
providers: [
27412740
{
27422741
provide: MAT_MENU_DEFAULT_OPTIONS,
27432742
useValue: {overlapTrigger: true, xPosition: 'before', yPosition: 'above'},
27442743
},
27452744
],
2745+
declarations: [SimpleMenu, FakeIcon],
27462746
}).compileComponents();
27472747
}));
27482748

@@ -2786,7 +2786,9 @@ const SIMPLE_MENU_TEMPLATE = `
27862786
</mat-menu>
27872787
`;
27882788

2789-
@Component({template: SIMPLE_MENU_TEMPLATE})
2789+
@Component({
2790+
template: SIMPLE_MENU_TEMPLATE,
2791+
})
27902792
class SimpleMenu {
27912793
@ViewChild(MatMenuTrigger) trigger: MatMenuTrigger;
27922794
@ViewChild('triggerEl') triggerEl: ElementRef<HTMLElement>;

src/material/menu/menu.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import {MenuPositionX, MenuPositionY} from './menu-positions';
4747
import {throwMatMenuInvalidPositionX, throwMatMenuInvalidPositionY} from './menu-errors';
4848
import {MatMenuContent, MAT_MENU_CONTENT} from './menu-content';
4949
import {matMenuAnimations} from './menu-animations';
50+
import {NgClass} from '@angular/common';
5051

5152
let menuPanelUid = 0;
5253

@@ -108,6 +109,8 @@ export function MAT_MENU_DEFAULT_OPTIONS_FACTORY(): MatMenuDefaultOptions {
108109
},
109110
animations: [matMenuAnimations.transformMenu, matMenuAnimations.fadeInItems],
110111
providers: [{provide: MAT_MENU_PANEL, useExisting: MatMenu}],
112+
standalone: true,
113+
imports: [NgClass],
111114
})
112115
export class MatMenu implements AfterContentInit, MatMenuPanel<MatMenuItem>, OnInit, OnDestroy {
113116
private _keyManager: FocusKeyManager<MatMenuItem>;

src/material/menu/module.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,16 @@ import {MatMenuContent} from './menu-content';
1717
import {MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER, MatMenuTrigger} from './menu-trigger';
1818

1919
@NgModule({
20-
imports: [CommonModule, MatRippleModule, MatCommonModule, OverlayModule],
20+
imports: [
21+
CommonModule,
22+
MatRippleModule,
23+
MatCommonModule,
24+
OverlayModule,
25+
MatMenu,
26+
MatMenuItem,
27+
MatMenuContent,
28+
MatMenuTrigger,
29+
],
2130
exports: [
2231
CdkScrollableModule,
2332
MatMenu,
@@ -26,7 +35,6 @@ import {MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER, MatMenuTrigger} from './menu-
2635
MatMenuContent,
2736
MatMenuTrigger,
2837
],
29-
declarations: [MatMenu, MatMenuItem, MatMenuContent, MatMenuTrigger],
3038
providers: [MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER],
3139
})
3240
export class MatMenuModule {}

src/material/menu/testing/menu-harness.spec.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ describe('MatMenuHarness', () => {
1313

1414
beforeEach(async () => {
1515
await TestBed.configureTestingModule({
16-
imports: [MatMenuModule, NoopAnimationsModule],
17-
declarations: [MenuHarnessTest],
16+
imports: [MatMenuModule, NoopAnimationsModule, MenuHarnessTest],
1817
}).compileComponents();
1918

2019
fixture = TestBed.createComponent(MenuHarnessTest);
@@ -94,8 +93,7 @@ describe('MatMenuHarness', () => {
9493

9594
beforeEach(async () => {
9695
await TestBed.configureTestingModule({
97-
imports: [MatMenuModule, NoopAnimationsModule],
98-
declarations: [NestedMenuHarnessTest],
96+
imports: [MatMenuModule, NoopAnimationsModule, NestedMenuHarnessTest],
9997
}).compileComponents();
10098

10199
fixture = TestBed.createComponent(NestedMenuHarnessTest);
@@ -165,6 +163,8 @@ describe('MatMenuHarness', () => {
165163
<menu mat-menu-item>Account</menu>
166164
</mat-menu>
167165
`,
166+
standalone: true,
167+
imports: [MatMenuModule],
168168
})
169169
class MenuHarnessTest {}
170170

@@ -190,6 +190,8 @@ class MenuHarnessTest {}
190190
<button mat-menu-item (click)="lastClickedLeaf = 3">Leaf Item 3</button>
191191
</mat-menu>
192192
`,
193+
standalone: true,
194+
imports: [MatMenuModule],
193195
})
194196
class NestedMenuHarnessTest {
195197
lastClickedLeaf = 0;

tools/public_api_guard/material/menu.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import { FocusableOption } from '@angular/cdk/a11y';
1919
import { FocusMonitor } from '@angular/cdk/a11y';
2020
import { FocusOrigin } from '@angular/cdk/a11y';
2121
import * as i0 from '@angular/core';
22-
import * as i5 from '@angular/common';
23-
import * as i6 from '@angular/material/core';
24-
import * as i7 from '@angular/cdk/overlay';
22+
import * as i1 from '@angular/common';
23+
import * as i2 from '@angular/material/core';
24+
import * as i3 from '@angular/cdk/overlay';
2525
import * as i8 from '@angular/cdk/scrolling';
2626
import { InjectionToken } from '@angular/core';
2727
import { Injector } from '@angular/core';
@@ -123,7 +123,7 @@ export class MatMenu implements AfterContentInit, MatMenuPanel<MatMenuItem>, OnI
123123
get yPosition(): MenuPositionY;
124124
set yPosition(value: MenuPositionY);
125125
// (undocumented)
126-
static ɵcmp: i0.ɵɵComponentDeclaration<MatMenu, "mat-menu", ["matMenu"], { "backdropClass": { "alias": "backdropClass"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "xPosition": { "alias": "xPosition"; "required": false; }; "yPosition": { "alias": "yPosition"; "required": false; }; "overlapTrigger": { "alias": "overlapTrigger"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "panelClass": { "alias": "class"; "required": false; }; "classList": { "alias": "classList"; "required": false; }; }, { "closed": "closed"; "close": "close"; }, ["lazyContent", "_allItems", "items"], ["*"], false, never>;
126+
static ɵcmp: i0.ɵɵComponentDeclaration<MatMenu, "mat-menu", ["matMenu"], { "backdropClass": { "alias": "backdropClass"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "xPosition": { "alias": "xPosition"; "required": false; }; "yPosition": { "alias": "yPosition"; "required": false; }; "overlapTrigger": { "alias": "overlapTrigger"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "panelClass": { "alias": "class"; "required": false; }; "classList": { "alias": "classList"; "required": false; }; }, { "closed": "closed"; "close": "close"; }, ["lazyContent", "_allItems", "items"], ["*"], true, never>;
127127
// (undocumented)
128128
static ɵfac: i0.ɵɵFactoryDeclaration<MatMenu, never>;
129129
}
@@ -145,7 +145,7 @@ export class MatMenuContent implements OnDestroy {
145145
// (undocumented)
146146
ngOnDestroy(): void;
147147
// (undocumented)
148-
static ɵdir: i0.ɵɵDirectiveDeclaration<MatMenuContent, "ng-template[matMenuContent]", never, {}, {}, never, never, false, never>;
148+
static ɵdir: i0.ɵɵDirectiveDeclaration<MatMenuContent, "ng-template[matMenuContent]", never, {}, {}, never, never, true, never>;
149149
// (undocumented)
150150
static ɵfac: i0.ɵɵFactoryDeclaration<MatMenuContent, never>;
151151
}
@@ -195,7 +195,7 @@ export class MatMenuItem implements FocusableOption, AfterViewInit, OnDestroy {
195195
_setTriggersSubmenu(triggersSubmenu: boolean): void;
196196
_triggersSubmenu: boolean;
197197
// (undocumented)
198-
static ɵcmp: i0.ɵɵComponentDeclaration<MatMenuItem, "[mat-menu-item]", ["matMenuItem"], { "role": { "alias": "role"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "disableRipple": { "alias": "disableRipple"; "required": false; }; }, {}, never, ["mat-icon, [matMenuItemIcon]", "*"], false, never>;
198+
static ɵcmp: i0.ɵɵComponentDeclaration<MatMenuItem, "[mat-menu-item]", ["matMenuItem"], { "role": { "alias": "role"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "disableRipple": { "alias": "disableRipple"; "required": false; }; }, {}, never, ["mat-icon, [matMenuItemIcon]", "*"], true, never>;
199199
// (undocumented)
200200
static ɵfac: i0.ɵɵFactoryDeclaration<MatMenuItem, [null, null, null, { optional: true; }, null]>;
201201
}
@@ -207,7 +207,7 @@ export class MatMenuModule {
207207
// (undocumented)
208208
static ɵinj: i0.ɵɵInjectorDeclaration<MatMenuModule>;
209209
// (undocumented)
210-
static ɵmod: i0.ɵɵNgModuleDeclaration<MatMenuModule, [typeof i1.MatMenu, typeof i2.MatMenuItem, typeof i3.MatMenuContent, typeof i4.MatMenuTrigger], [typeof i5.CommonModule, typeof i6.MatRippleModule, typeof i6.MatCommonModule, typeof i7.OverlayModule], [typeof i8.CdkScrollableModule, typeof i1.MatMenu, typeof i6.MatCommonModule, typeof i2.MatMenuItem, typeof i3.MatMenuContent, typeof i4.MatMenuTrigger]>;
210+
static ɵmod: i0.ɵɵNgModuleDeclaration<MatMenuModule, never, [typeof i1.CommonModule, typeof i2.MatRippleModule, typeof i2.MatCommonModule, typeof i3.OverlayModule, typeof i4.MatMenu, typeof i5.MatMenuItem, typeof i6.MatMenuContent, typeof i7.MatMenuTrigger], [typeof i8.CdkScrollableModule, typeof i4.MatMenu, typeof i2.MatCommonModule, typeof i5.MatMenuItem, typeof i6.MatMenuContent, typeof i7.MatMenuTrigger]>;
211211
}
212212

213213
// @public
@@ -288,7 +288,7 @@ export class MatMenuTrigger implements AfterContentInit, OnDestroy {
288288
triggersSubmenu(): boolean;
289289
updatePosition(): void;
290290
// (undocumented)
291-
static ɵdir: i0.ɵɵDirectiveDeclaration<MatMenuTrigger, "[mat-menu-trigger-for], [matMenuTriggerFor]", ["matMenuTrigger"], { "_deprecatedMatMenuTriggerFor": { "alias": "mat-menu-trigger-for"; "required": false; }; "menu": { "alias": "matMenuTriggerFor"; "required": false; }; "menuData": { "alias": "matMenuTriggerData"; "required": false; }; "restoreFocus": { "alias": "matMenuTriggerRestoreFocus"; "required": false; }; }, { "menuOpened": "menuOpened"; "onMenuOpen": "onMenuOpen"; "menuClosed": "menuClosed"; "onMenuClose": "onMenuClose"; }, never, never, false, never>;
291+
static ɵdir: i0.ɵɵDirectiveDeclaration<MatMenuTrigger, "[mat-menu-trigger-for], [matMenuTriggerFor]", ["matMenuTrigger"], { "_deprecatedMatMenuTriggerFor": { "alias": "mat-menu-trigger-for"; "required": false; }; "menu": { "alias": "matMenuTriggerFor"; "required": false; }; "menuData": { "alias": "matMenuTriggerData"; "required": false; }; "restoreFocus": { "alias": "matMenuTriggerRestoreFocus"; "required": false; }; }, { "menuOpened": "menuOpened"; "onMenuOpen": "onMenuOpen"; "menuClosed": "menuClosed"; "onMenuClose": "onMenuClose"; }, never, never, true, never>;
292292
// (undocumented)
293293
static ɵfac: i0.ɵɵFactoryDeclaration<MatMenuTrigger, [null, null, null, null, { optional: true; }, { optional: true; self: true; }, { optional: true; }, null, null]>;
294294
}

0 commit comments

Comments
 (0)