UNPKG

@angular/material

Version:
1,229 lines (1,221 loc) 55.9 kB
import * as i0 from '@angular/core'; import { InjectionToken, inject, ElementRef, DOCUMENT, ChangeDetectorRef, booleanAttribute, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, TemplateRef, ApplicationRef, Injector, ViewContainerRef, Directive, QueryList, signal, EventEmitter, afterNextRender, ContentChildren, ViewChild, ContentChild, Output, NgZone, Renderer2, NgModule } from '@angular/core'; import { FocusMonitor, _IdGenerator, FocusKeyManager, isFakeTouchstartFromScreenReader, isFakeMousedownFromScreenReader } from '@angular/cdk/a11y'; import { UP_ARROW, DOWN_ARROW, RIGHT_ARROW, LEFT_ARROW, ESCAPE, hasModifierKey, ENTER, SPACE } from '@angular/cdk/keycodes'; import { Subject, merge, Subscription, of } from 'rxjs'; import { startWith, switchMap, takeUntil, take, filter, skipWhile } from 'rxjs/operators'; import { _CdkPrivateStyleLoader } from '@angular/cdk/private'; import { _StructuralStylesLoader } from './_structural-styles-chunk.mjs'; import { MatRipple } from './_ripple-chunk.mjs'; import { TemplatePortal, DomPortalOutlet } from '@angular/cdk/portal'; import { _animationsDisabled } from './_animation-chunk.mjs'; import { Directionality, BidiModule } from '@angular/cdk/bidi'; import { createRepositionScrollStrategy, createOverlayRef, OverlayConfig, createFlexibleConnectedPositionStrategy, ViewportRuler, ScrollDispatcher, OverlayModule } from '@angular/cdk/overlay'; import { _getEventTarget, _getShadowRoot } from '@angular/cdk/platform'; import { CdkScrollableModule } from '@angular/cdk/scrolling'; import { MatRippleModule } from './_ripple-module-chunk.mjs'; import '@angular/cdk/coercion'; import '@angular/cdk/layout'; const MAT_MENU_PANEL = new InjectionToken('MAT_MENU_PANEL'); class MatMenuItem { _elementRef = inject(ElementRef); _document = inject(DOCUMENT); _focusMonitor = inject(FocusMonitor); _parentMenu = inject(MAT_MENU_PANEL, { optional: true }); _changeDetectorRef = inject(ChangeDetectorRef); role = 'menuitem'; disabled = false; disableRipple = false; _hovered = new Subject(); _focused = new Subject(); _highlighted = false; _triggersSubmenu = false; constructor() { inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader); this._parentMenu?.addItem?.(this); } focus(origin, options) { if (this._focusMonitor && origin) { this._focusMonitor.focusVia(this._getHostElement(), origin, options); } else { this._getHostElement().focus(options); } this._focused.next(this); } ngAfterViewInit() { if (this._focusMonitor) { this._focusMonitor.monitor(this._elementRef, false); } } ngOnDestroy() { if (this._focusMonitor) { this._focusMonitor.stopMonitoring(this._elementRef); } if (this._parentMenu && this._parentMenu.removeItem) { this._parentMenu.removeItem(this); } this._hovered.complete(); this._focused.complete(); } _getTabIndex() { return this.disabled ? '-1' : '0'; } _getHostElement() { return this._elementRef.nativeElement; } _checkDisabled(event) { if (this.disabled) { event.preventDefault(); event.stopPropagation(); } } _handleMouseEnter() { this._hovered.next(this); } getLabel() { const clone = this._elementRef.nativeElement.cloneNode(true); const icons = clone.querySelectorAll('mat-icon, .material-icons'); for (let i = 0; i < icons.length; i++) { icons[i].remove(); } return clone.textContent?.trim() || ''; } _setHighlighted(isHighlighted) { this._highlighted = isHighlighted; this._changeDetectorRef.markForCheck(); } _setTriggersSubmenu(triggersSubmenu) { this._triggersSubmenu = triggersSubmenu; this._changeDetectorRef.markForCheck(); } _hasFocus() { return this._document && this._document.activeElement === this._getHostElement(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: MatMenuItem, isStandalone: true, selector: "[mat-menu-item]", inputs: { role: "role", disabled: ["disabled", "disabled", booleanAttribute], disableRipple: ["disableRipple", "disableRipple", booleanAttribute] }, host: { listeners: { "click": "_checkDisabled($event)", "mouseenter": "_handleMouseEnter()" }, properties: { "attr.role": "role", "class.mat-mdc-menu-item-highlighted": "_highlighted", "class.mat-mdc-menu-item-submenu-trigger": "_triggersSubmenu", "attr.tabindex": "_getTabIndex()", "attr.aria-disabled": "disabled", "attr.disabled": "disabled || null" }, classAttribute: "mat-mdc-menu-item mat-focus-indicator" }, exportAs: ["matMenuItem"], ngImport: i0, template: "<ng-content select=\"mat-icon, [matMenuItemIcon]\"></ng-content>\n<span class=\"mat-mdc-menu-item-text\"><ng-content></ng-content></span>\n<div class=\"mat-mdc-menu-ripple\" matRipple\n [matRippleDisabled]=\"disableRipple || disabled\"\n [matRippleTrigger]=\"_getHostElement()\">\n</div>\n\n@if (_triggersSubmenu) {\n <svg\n class=\"mat-mdc-menu-submenu-icon\"\n viewBox=\"0 0 5 10\"\n focusable=\"false\"\n aria-hidden=\"true\"><polygon points=\"0,0 5,5 0,10\"/></svg>\n}\n", dependencies: [{ kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuItem, decorators: [{ type: Component, args: [{ selector: '[mat-menu-item]', exportAs: 'matMenuItem', host: { '[attr.role]': 'role', 'class': 'mat-mdc-menu-item mat-focus-indicator', '[class.mat-mdc-menu-item-highlighted]': '_highlighted', '[class.mat-mdc-menu-item-submenu-trigger]': '_triggersSubmenu', '[attr.tabindex]': '_getTabIndex()', '[attr.aria-disabled]': 'disabled', '[attr.disabled]': 'disabled || null', '(click)': '_checkDisabled($event)', '(mouseenter)': '_handleMouseEnter()' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [MatRipple], template: "<ng-content select=\"mat-icon, [matMenuItemIcon]\"></ng-content>\n<span class=\"mat-mdc-menu-item-text\"><ng-content></ng-content></span>\n<div class=\"mat-mdc-menu-ripple\" matRipple\n [matRippleDisabled]=\"disableRipple || disabled\"\n [matRippleTrigger]=\"_getHostElement()\">\n</div>\n\n@if (_triggersSubmenu) {\n <svg\n class=\"mat-mdc-menu-submenu-icon\"\n viewBox=\"0 0 5 10\"\n focusable=\"false\"\n aria-hidden=\"true\"><polygon points=\"0,0 5,5 0,10\"/></svg>\n}\n" }] }], ctorParameters: () => [], propDecorators: { role: [{ type: Input }], disabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], disableRipple: [{ type: Input, args: [{ transform: booleanAttribute }] }] } }); function throwMatMenuInvalidPositionX() { throw Error(`xPosition value must be either 'before' or after'. Example: <mat-menu xPosition="before" #menu="matMenu"></mat-menu>`); } function throwMatMenuInvalidPositionY() { throw Error(`yPosition value must be either 'above' or below'. Example: <mat-menu yPosition="above" #menu="matMenu"></mat-menu>`); } function throwMatMenuRecursiveError() { throw Error(`matMenuTriggerFor: menu cannot contain its own trigger. Assign a menu that is ` + `not a parent of the trigger or move the trigger outside of the menu.`); } const MAT_MENU_CONTENT = new InjectionToken('MatMenuContent'); class MatMenuContent { _template = inject(TemplateRef); _appRef = inject(ApplicationRef); _injector = inject(Injector); _viewContainerRef = inject(ViewContainerRef); _document = inject(DOCUMENT); _changeDetectorRef = inject(ChangeDetectorRef); _portal; _outlet; _attached = new Subject(); constructor() {} attach(context = {}) { if (!this._portal) { this._portal = new TemplatePortal(this._template, this._viewContainerRef); } this.detach(); if (!this._outlet) { this._outlet = new DomPortalOutlet(this._document.createElement('div'), this._appRef, this._injector); } const element = this._template.elementRef.nativeElement; element.parentNode.insertBefore(this._outlet.outletElement, element); this._changeDetectorRef.markForCheck(); this._portal.attach(this._outlet, context); this._attached.next(); } detach() { if (this._portal?.isAttached) { this._portal.detach(); } } ngOnDestroy() { this.detach(); this._outlet?.dispose(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.3", type: MatMenuContent, isStandalone: true, selector: "ng-template[matMenuContent]", providers: [{ provide: MAT_MENU_CONTENT, useExisting: MatMenuContent }], ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuContent, decorators: [{ type: Directive, args: [{ selector: 'ng-template[matMenuContent]', providers: [{ provide: MAT_MENU_CONTENT, useExisting: MatMenuContent }] }] }], ctorParameters: () => [] }); const MAT_MENU_DEFAULT_OPTIONS = new InjectionToken('mat-menu-default-options', { providedIn: 'root', factory: () => ({ overlapTrigger: false, xPosition: 'after', yPosition: 'below', backdropClass: 'cdk-overlay-transparent-backdrop' }) }); const ENTER_ANIMATION = '_mat-menu-enter'; const EXIT_ANIMATION = '_mat-menu-exit'; class MatMenu { _elementRef = inject(ElementRef); _changeDetectorRef = inject(ChangeDetectorRef); _injector = inject(Injector); _keyManager; _xPosition; _yPosition; _firstItemFocusRef; _exitFallbackTimeout; _animationsDisabled = _animationsDisabled(); _allItems; _directDescendantItems = new QueryList(); _classList = {}; _panelAnimationState = 'void'; _animationDone = new Subject(); _isAnimating = signal(false, ...(ngDevMode ? [{ debugName: "_isAnimating" }] : [])); parentMenu; direction; overlayPanelClass; backdropClass; ariaLabel; ariaLabelledby; ariaDescribedby; get xPosition() { return this._xPosition; } set xPosition(value) { if (value !== 'before' && value !== 'after' && (typeof ngDevMode === 'undefined' || ngDevMode)) { throwMatMenuInvalidPositionX(); } this._xPosition = value; this.setPositionClasses(); } get yPosition() { return this._yPosition; } set yPosition(value) { if (value !== 'above' && value !== 'below' && (typeof ngDevMode === 'undefined' || ngDevMode)) { throwMatMenuInvalidPositionY(); } this._yPosition = value; this.setPositionClasses(); } templateRef; items; lazyContent; overlapTrigger; hasBackdrop; set panelClass(classes) { const previousPanelClass = this._previousPanelClass; const newClassList = { ...this._classList }; if (previousPanelClass && previousPanelClass.length) { previousPanelClass.split(' ').forEach(className => { newClassList[className] = false; }); } this._previousPanelClass = classes; if (classes && classes.length) { classes.split(' ').forEach(className => { newClassList[className] = true; }); this._elementRef.nativeElement.className = ''; } this._classList = newClassList; } _previousPanelClass; get classList() { return this.panelClass; } set classList(classes) { this.panelClass = classes; } closed = new EventEmitter(); close = this.closed; panelId = inject(_IdGenerator).getId('mat-menu-panel-'); constructor() { const defaultOptions = inject(MAT_MENU_DEFAULT_OPTIONS); this.overlayPanelClass = defaultOptions.overlayPanelClass || ''; this._xPosition = defaultOptions.xPosition; this._yPosition = defaultOptions.yPosition; this.backdropClass = defaultOptions.backdropClass; this.overlapTrigger = defaultOptions.overlapTrigger; this.hasBackdrop = defaultOptions.hasBackdrop; } ngOnInit() { this.setPositionClasses(); } ngAfterContentInit() { this._updateDirectDescendants(); this._keyManager = new FocusKeyManager(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(); this._keyManager.tabOut.subscribe(() => this.closed.emit('tab')); this._directDescendantItems.changes.pipe(startWith(this._directDescendantItems), switchMap(items => merge(...items.map(item => item._focused)))).subscribe(focusedItem => this._keyManager.updateActiveItem(focusedItem)); this._directDescendantItems.changes.subscribe(itemsList => { const manager = this._keyManager; if (this._panelAnimationState === 'enter' && manager.activeItem?._hasFocus()) { const items = itemsList.toArray(); const index = Math.max(0, Math.min(items.length - 1, manager.activeItemIndex || 0)); if (items[index] && !items[index].disabled) { manager.setActiveItem(index); } else { manager.setNextItemActive(); } } }); } ngOnDestroy() { this._keyManager?.destroy(); this._directDescendantItems.destroy(); this.closed.complete(); this._firstItemFocusRef?.destroy(); clearTimeout(this._exitFallbackTimeout); } _hovered() { const itemChanges = this._directDescendantItems.changes; return itemChanges.pipe(startWith(this._directDescendantItems), switchMap(items => merge(...items.map(item => item._hovered)))); } addItem(_item) {} removeItem(_item) {} _handleKeydown(event) { const keyCode = event.keyCode; const manager = this._keyManager; switch (keyCode) { case ESCAPE: if (!hasModifierKey(event)) { event.preventDefault(); this.closed.emit('keydown'); } break; case LEFT_ARROW: if (this.parentMenu && this.direction === 'ltr') { this.closed.emit('keydown'); } break; case RIGHT_ARROW: if (this.parentMenu && this.direction === 'rtl') { this.closed.emit('keydown'); } break; default: if (keyCode === UP_ARROW || keyCode === DOWN_ARROW) { manager.setFocusOrigin('keyboard'); } manager.onKeydown(event); return; } } focusFirstItem(origin = 'program') { this._firstItemFocusRef?.destroy(); this._firstItemFocusRef = afterNextRender(() => { const menuPanel = this._resolvePanel(); if (!menuPanel || !menuPanel.contains(document.activeElement)) { const manager = this._keyManager; manager.setFocusOrigin(origin).setFirstItemActive(); if (!manager.activeItem && menuPanel) { menuPanel.focus(); } } }, { injector: this._injector }); } resetActiveItem() { this._keyManager.setActiveItem(-1); } setElevation(_depth) {} setPositionClasses(posX = this.xPosition, posY = this.yPosition) { this._classList = { ...this._classList, ['mat-menu-before']: posX === 'before', ['mat-menu-after']: posX === 'after', ['mat-menu-above']: posY === 'above', ['mat-menu-below']: posY === 'below' }; this._changeDetectorRef.markForCheck(); } _onAnimationDone(state) { const isExit = state === EXIT_ANIMATION; if (isExit || state === ENTER_ANIMATION) { if (isExit) { clearTimeout(this._exitFallbackTimeout); this._exitFallbackTimeout = undefined; } this._animationDone.next(isExit ? 'void' : 'enter'); this._isAnimating.set(false); } } _onAnimationStart(state) { if (state === ENTER_ANIMATION || state === EXIT_ANIMATION) { this._isAnimating.set(true); } } _setIsOpen(isOpen) { this._panelAnimationState = isOpen ? 'enter' : 'void'; if (isOpen) { if (this._keyManager.activeItemIndex === 0) { const menuPanel = this._resolvePanel(); if (menuPanel) { menuPanel.scrollTop = 0; } } } else if (!this._animationsDisabled) { this._exitFallbackTimeout = setTimeout(() => this._onAnimationDone(EXIT_ANIMATION), 200); } if (this._animationsDisabled) { setTimeout(() => { this._onAnimationDone(isOpen ? ENTER_ANIMATION : EXIT_ANIMATION); }); } this._changeDetectorRef.markForCheck(); } _updateDirectDescendants() { this._allItems.changes.pipe(startWith(this._allItems)).subscribe(items => { this._directDescendantItems.reset(items.filter(item => item._parentMenu === this)); this._directDescendantItems.notifyOnChanges(); }); } _resolvePanel() { let menuPanel = null; if (this._directDescendantItems.length) { menuPanel = this._directDescendantItems.first._getHostElement().closest('[role="menu"]'); } return menuPanel; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenu, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "21.0.3", type: MatMenu, isStandalone: true, selector: "mat-menu", inputs: { backdropClass: "backdropClass", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], ariaDescribedby: ["aria-describedby", "ariaDescribedby"], xPosition: "xPosition", yPosition: "yPosition", overlapTrigger: ["overlapTrigger", "overlapTrigger", booleanAttribute], hasBackdrop: ["hasBackdrop", "hasBackdrop", value => value == null ? null : booleanAttribute(value)], panelClass: ["class", "panelClass"], classList: "classList" }, outputs: { closed: "closed", close: "close" }, host: { properties: { "attr.aria-label": "null", "attr.aria-labelledby": "null", "attr.aria-describedby": "null" } }, providers: [{ provide: MAT_MENU_PANEL, useExisting: MatMenu }], queries: [{ propertyName: "lazyContent", first: true, predicate: MAT_MENU_CONTENT, descendants: true }, { propertyName: "_allItems", predicate: MatMenuItem, descendants: true }, { propertyName: "items", predicate: MatMenuItem }], viewQueries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], exportAs: ["matMenu"], ngImport: i0, template: "<ng-template>\n <div\n class=\"mat-mdc-menu-panel\"\n [id]=\"panelId\"\n [class]=\"_classList\"\n [class.mat-menu-panel-animations-disabled]=\"_animationsDisabled\"\n [class.mat-menu-panel-exit-animation]=\"_panelAnimationState === 'void'\"\n [class.mat-menu-panel-animating]=\"_isAnimating()\"\n (click)=\"closed.emit('click')\"\n tabindex=\"-1\"\n role=\"menu\"\n (animationstart)=\"_onAnimationStart($event.animationName)\"\n (animationend)=\"_onAnimationDone($event.animationName)\"\n (animationcancel)=\"_onAnimationDone($event.animationName)\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"ariaLabelledby || null\"\n [attr.aria-describedby]=\"ariaDescribedby || null\">\n <div class=\"mat-mdc-menu-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:\"\";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenu, decorators: [{ type: Component, args: [{ selector: 'mat-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, exportAs: 'matMenu', host: { '[attr.aria-label]': 'null', '[attr.aria-labelledby]': 'null', '[attr.aria-describedby]': 'null' }, providers: [{ provide: MAT_MENU_PANEL, useExisting: MatMenu }], template: "<ng-template>\n <div\n class=\"mat-mdc-menu-panel\"\n [id]=\"panelId\"\n [class]=\"_classList\"\n [class.mat-menu-panel-animations-disabled]=\"_animationsDisabled\"\n [class.mat-menu-panel-exit-animation]=\"_panelAnimationState === 'void'\"\n [class.mat-menu-panel-animating]=\"_isAnimating()\"\n (click)=\"closed.emit('click')\"\n tabindex=\"-1\"\n role=\"menu\"\n (animationstart)=\"_onAnimationStart($event.animationName)\"\n (animationend)=\"_onAnimationDone($event.animationName)\"\n (animationcancel)=\"_onAnimationDone($event.animationName)\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"ariaLabelledby || null\"\n [attr.aria-describedby]=\"ariaDescribedby || null\">\n <div class=\"mat-mdc-menu-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:\"\";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n"] }] }], ctorParameters: () => [], propDecorators: { _allItems: [{ type: ContentChildren, args: [MatMenuItem, { descendants: true }] }], backdropClass: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label'] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby'] }], ariaDescribedby: [{ type: Input, args: ['aria-describedby'] }], xPosition: [{ type: Input }], yPosition: [{ type: Input }], templateRef: [{ type: ViewChild, args: [TemplateRef] }], items: [{ type: ContentChildren, args: [MatMenuItem, { descendants: false }] }], lazyContent: [{ type: ContentChild, args: [MAT_MENU_CONTENT] }], overlapTrigger: [{ type: Input, args: [{ transform: booleanAttribute }] }], hasBackdrop: [{ type: Input, args: [{ transform: value => value == null ? null : booleanAttribute(value) }] }], panelClass: [{ type: Input, args: ['class'] }], classList: [{ type: Input }], closed: [{ type: Output }], close: [{ type: Output }] } }); const MAT_MENU_SCROLL_STRATEGY = new InjectionToken('mat-menu-scroll-strategy', { providedIn: 'root', factory: () => { const injector = inject(Injector); return () => createRepositionScrollStrategy(injector); } }); const MENU_PANEL_TOP_PADDING = 8; const PANELS_TO_TRIGGERS = new WeakMap(); class MatMenuTriggerBase { _canHaveBackdrop; _element = inject(ElementRef); _viewContainerRef = inject(ViewContainerRef); _menuItemInstance = inject(MatMenuItem, { optional: true, self: true }); _dir = inject(Directionality, { optional: true }); _focusMonitor = inject(FocusMonitor); _ngZone = inject(NgZone); _injector = inject(Injector); _scrollStrategy = inject(MAT_MENU_SCROLL_STRATEGY); _changeDetectorRef = inject(ChangeDetectorRef); _animationsDisabled = _animationsDisabled(); _portal; _overlayRef = null; _menuOpen = false; _closingActionsSubscription = Subscription.EMPTY; _menuCloseSubscription = Subscription.EMPTY; _pendingRemoval; _parentMaterialMenu; _parentInnerPadding; _openedBy = undefined; get _menu() { return this._menuInternal; } set _menu(menu) { if (menu === this._menuInternal) { return; } this._menuInternal = menu; this._menuCloseSubscription.unsubscribe(); if (menu) { if (menu === this._parentMaterialMenu && (typeof ngDevMode === 'undefined' || ngDevMode)) { throwMatMenuRecursiveError(); } this._menuCloseSubscription = menu.close.subscribe(reason => { this._destroyMenu(reason); if ((reason === 'click' || reason === 'tab') && this._parentMaterialMenu) { this._parentMaterialMenu.closed.emit(reason); } }); } this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()); } _menuInternal; constructor(_canHaveBackdrop) { this._canHaveBackdrop = _canHaveBackdrop; const parentMenu = inject(MAT_MENU_PANEL, { optional: true }); this._parentMaterialMenu = parentMenu instanceof MatMenu ? parentMenu : undefined; } ngOnDestroy() { if (this._menu && this._ownsMenu(this._menu)) { PANELS_TO_TRIGGERS.delete(this._menu); } this._pendingRemoval?.unsubscribe(); this._menuCloseSubscription.unsubscribe(); this._closingActionsSubscription.unsubscribe(); if (this._overlayRef) { this._overlayRef.dispose(); this._overlayRef = null; } } get menuOpen() { return this._menuOpen; } get dir() { return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr'; } _triggersSubmenu() { return !!(this._menuItemInstance && this._parentMaterialMenu && this._menu); } _closeMenu() { this._menu?.close.emit(); } _openMenu(autoFocus) { const menu = this._menu; if (this._menuOpen || !menu) { return; } this._pendingRemoval?.unsubscribe(); const previousTrigger = PANELS_TO_TRIGGERS.get(menu); PANELS_TO_TRIGGERS.set(menu, this); if (previousTrigger && previousTrigger !== this) { previousTrigger._closeMenu(); } const overlayRef = this._createOverlay(menu); const overlayConfig = overlayRef.getConfig(); const positionStrategy = overlayConfig.positionStrategy; this._setPosition(menu, positionStrategy); if (this._canHaveBackdrop) { overlayConfig.hasBackdrop = menu.hasBackdrop == null ? !this._triggersSubmenu() : menu.hasBackdrop; } else { overlayConfig.hasBackdrop = false; } if (!overlayRef.hasAttached()) { overlayRef.attach(this._getPortal(menu)); menu.lazyContent?.attach(this.menuData); } this._closingActionsSubscription = this._menuClosingActions().subscribe(() => this._closeMenu()); menu.parentMenu = this._triggersSubmenu() ? this._parentMaterialMenu : undefined; menu.direction = this.dir; if (autoFocus) { menu.focusFirstItem(this._openedBy || 'program'); } this._setIsMenuOpen(true); if (menu instanceof MatMenu) { menu._setIsOpen(true); menu._directDescendantItems.changes.pipe(takeUntil(menu.close)).subscribe(() => { positionStrategy.withLockedPosition(false).reapplyLastPosition(); positionStrategy.withLockedPosition(true); }); } } focus(origin, options) { if (this._focusMonitor && origin) { this._focusMonitor.focusVia(this._element, origin, options); } else { this._element.nativeElement.focus(options); } } _destroyMenu(reason) { const overlayRef = this._overlayRef; const menu = this._menu; if (!overlayRef || !this.menuOpen) { return; } this._closingActionsSubscription.unsubscribe(); this._pendingRemoval?.unsubscribe(); if (menu instanceof MatMenu && this._ownsMenu(menu)) { this._pendingRemoval = menu._animationDone.pipe(take(1)).subscribe(() => { overlayRef.detach(); if (!PANELS_TO_TRIGGERS.has(menu)) { menu.lazyContent?.detach(); } }); menu._setIsOpen(false); } else { overlayRef.detach(); menu?.lazyContent?.detach(); } if (menu && this._ownsMenu(menu)) { PANELS_TO_TRIGGERS.delete(menu); } if (this.restoreFocus && (reason === 'keydown' || !this._openedBy || !this._triggersSubmenu())) { this.focus(this._openedBy); } this._openedBy = undefined; this._setIsMenuOpen(false); } _setIsMenuOpen(isOpen) { if (isOpen !== this._menuOpen) { this._menuOpen = isOpen; this._menuOpen ? this.menuOpened.emit() : this.menuClosed.emit(); if (this._triggersSubmenu()) { this._menuItemInstance._setHighlighted(isOpen); } this._changeDetectorRef.markForCheck(); } } _createOverlay(menu) { if (!this._overlayRef) { const config = this._getOverlayConfig(menu); this._subscribeToPositions(menu, config.positionStrategy); this._overlayRef = createOverlayRef(this._injector, config); this._overlayRef.keydownEvents().subscribe(event => { if (this._menu instanceof MatMenu) { this._menu._handleKeydown(event); } }); } return this._overlayRef; } _getOverlayConfig(menu) { return new OverlayConfig({ positionStrategy: createFlexibleConnectedPositionStrategy(this._injector, this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn('.mat-menu-panel, .mat-mdc-menu-panel'), backdropClass: menu.backdropClass || 'cdk-overlay-transparent-backdrop', panelClass: menu.overlayPanelClass, scrollStrategy: this._scrollStrategy(), direction: this._dir || 'ltr', disableAnimations: this._animationsDisabled }); } _subscribeToPositions(menu, position) { if (menu.setPositionClasses) { position.positionChanges.subscribe(change => { this._ngZone.run(() => { const posX = change.connectionPair.overlayX === 'start' ? 'after' : 'before'; const posY = change.connectionPair.overlayY === 'top' ? 'below' : 'above'; menu.setPositionClasses(posX, posY); }); }); } } _setPosition(menu, positionStrategy) { let [originX, originFallbackX] = menu.xPosition === 'before' ? ['end', 'start'] : ['start', 'end']; let [overlayY, overlayFallbackY] = menu.yPosition === 'above' ? ['bottom', 'top'] : ['top', 'bottom']; let [originY, originFallbackY] = [overlayY, overlayFallbackY]; let [overlayX, overlayFallbackX] = [originX, originFallbackX]; let offsetY = 0; if (this._triggersSubmenu()) { overlayFallbackX = originX = menu.xPosition === 'before' ? 'start' : 'end'; originFallbackX = overlayX = originX === 'end' ? 'start' : 'end'; if (this._parentMaterialMenu) { if (this._parentInnerPadding == null) { const firstItem = this._parentMaterialMenu.items.first; this._parentInnerPadding = firstItem ? firstItem._getHostElement().offsetTop : 0; } offsetY = overlayY === 'bottom' ? this._parentInnerPadding : -this._parentInnerPadding; } } else if (!menu.overlapTrigger) { originY = overlayY === 'top' ? 'bottom' : 'top'; originFallbackY = overlayFallbackY === 'top' ? 'bottom' : 'top'; } positionStrategy.withPositions([{ originX, originY, overlayX, overlayY, offsetY }, { originX: originFallbackX, originY, overlayX: overlayFallbackX, overlayY, offsetY }, { originX, originY: originFallbackY, overlayX, overlayY: overlayFallbackY, offsetY: -offsetY }, { originX: originFallbackX, originY: originFallbackY, overlayX: overlayFallbackX, overlayY: overlayFallbackY, offsetY: -offsetY }]); } _menuClosingActions() { const outsideClicks = this._getOutsideClickStream(this._overlayRef); const detachments = this._overlayRef.detachments(); const parentClose = this._parentMaterialMenu ? this._parentMaterialMenu.closed : of(); const hover = this._parentMaterialMenu ? this._parentMaterialMenu._hovered().pipe(filter(active => this._menuOpen && active !== this._menuItemInstance)) : of(); return merge(outsideClicks, parentClose, hover, detachments); } _getPortal(menu) { if (!this._portal || this._portal.templateRef !== menu.templateRef) { this._portal = new TemplatePortal(menu.templateRef, this._viewContainerRef); } return this._portal; } _ownsMenu(menu) { return PANELS_TO_TRIGGERS.get(menu) === this; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuTriggerBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.3", type: MatMenuTriggerBase, isStandalone: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuTriggerBase, decorators: [{ type: Directive }], ctorParameters: () => [{ type: undefined }] }); class MatMenuTrigger extends MatMenuTriggerBase { _cleanupTouchstart; _hoverSubscription = Subscription.EMPTY; get _deprecatedMatMenuTriggerFor() { return this.menu; } set _deprecatedMatMenuTriggerFor(v) { this.menu = v; } get menu() { return this._menu; } set menu(menu) { this._menu = menu; } menuData; restoreFocus = true; menuOpened = new EventEmitter(); onMenuOpen = this.menuOpened; menuClosed = new EventEmitter(); onMenuClose = this.menuClosed; constructor() { super(true); const renderer = inject(Renderer2); this._cleanupTouchstart = renderer.listen(this._element.nativeElement, 'touchstart', event => { if (!isFakeTouchstartFromScreenReader(event)) { this._openedBy = 'touch'; } }, { passive: true }); } triggersSubmenu() { return super._triggersSubmenu(); } toggleMenu() { return this.menuOpen ? this.closeMenu() : this.openMenu(); } openMenu() { this._openMenu(true); } closeMenu() { this._closeMenu(); } updatePosition() { this._overlayRef?.updatePosition(); } ngAfterContentInit() { this._handleHover(); } ngOnDestroy() { super.ngOnDestroy(); this._cleanupTouchstart(); this._hoverSubscription.unsubscribe(); } _getOverlayOrigin() { return this._element; } _getOutsideClickStream(overlayRef) { return overlayRef.backdropClick(); } _handleMousedown(event) { if (!isFakeMousedownFromScreenReader(event)) { this._openedBy = event.button === 0 ? 'mouse' : undefined; if (this.triggersSubmenu()) { event.preventDefault(); } } } _handleKeydown(event) { const keyCode = event.keyCode; if (keyCode === ENTER || keyCode === SPACE) { this._openedBy = 'keyboard'; } if (this.triggersSubmenu() && (keyCode === RIGHT_ARROW && this.dir === 'ltr' || keyCode === LEFT_ARROW && this.dir === 'rtl')) { this._openedBy = 'keyboard'; this.openMenu(); } } _handleClick(event) { if (this.triggersSubmenu()) { event.stopPropagation(); this.openMenu(); } else { this.toggleMenu(); } } _handleHover() { if (this.triggersSubmenu() && this._parentMaterialMenu) { this._hoverSubscription = this._parentMaterialMenu._hovered().subscribe(active => { if (active === this._menuItemInstance && !active.disabled && this._parentMaterialMenu?._panelAnimationState !== 'void') { this._openedBy = 'mouse'; this._openMenu(false); } }); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.3", type: MatMenuTrigger, isStandalone: true, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: { _deprecatedMatMenuTriggerFor: ["mat-menu-trigger-for", "_deprecatedMatMenuTriggerFor"], menu: ["matMenuTriggerFor", "menu"], menuData: ["matMenuTriggerData", "menuData"], restoreFocus: ["matMenuTriggerRestoreFocus", "restoreFocus"] }, outputs: { menuOpened: "menuOpened", onMenuOpen: "onMenuOpen", menuClosed: "menuClosed", onMenuClose: "onMenuClose" }, host: { listeners: { "click": "_handleClick($event)", "mousedown": "_handleMousedown($event)", "keydown": "_handleKeydown($event)" }, properties: { "attr.aria-haspopup": "menu ? \"menu\" : null", "attr.aria-expanded": "menuOpen", "attr.aria-controls": "menuOpen ? menu?.panelId : null" }, classAttribute: "mat-mdc-menu-trigger" }, exportAs: ["matMenuTrigger"], usesInheritance: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: MatMenuTrigger, decorators: [{ type: Directive, args: [{ selector: '[mat-menu-trigger-for], [matMenuTriggerFor]', host: { 'class': 'mat-mdc-menu-trigger', '[attr.aria-haspopup]': 'menu ? "menu" : null', '[attr.aria-expanded]': 'menuOpen', '[attr.aria-controls]': 'menuOpen ? menu?.panelId : null', '(click)': '_handleClick($event)', '(mousedown)': '_handleMousedown($event)', '(keydown)': '_handleKeydown($event)' }, exportAs: 'matMenuTrigger' }] }], ctorParameters: () => [], propDecorators: { _deprecatedMatMenuTriggerFor: [{ type: Input, args: ['mat-menu-trigger-for'] }], menu: [{ type: Input, args: ['matMenuTriggerFor'] }], menuData: [{ type: Input, args: ['matMenuTriggerData'] }], restoreFocus: [{ type: Input, args: ['matMenuTriggerRestoreFocus'] }], menuOpened: [{ type: Output }], onMenuOpen: [{ type: Output }], menuClosed: [{ type: Output }], onMenuClose: [{ type: Output }] } }); class MatContextMenuTrigger extends MatMenuTriggerBase { _point = { x: 0, y: 0, initialX: 0, initialY: 0, initialScrollX: 0, initialScrollY: 0 }; _triggerPressedControl = false; _rootNode; _document = inject(DOCUMENT); _viewportRuler = inject(ViewportRuler); _scrollDispatcher = inject(ScrollDispatcher); _scrollSubscription; get menu() { return this._menu; } set menu(menu) { this._menu = menu; } menuData; restoreFocus = true; disabled = false; menuOpened = new EventEmitter(); menuClosed = new EventEmitter(); constructor() { super(false); } ngOnDestroy() { super.ngOnDestroy(); this._scrollSubscription?.unsubscribe(); } _handleContextMenuEvent(event) { if (!this.disabled) { event.preventDefault(); if (this.menuOpen) { this._initializePoint(event.clientX, event.clientY); this._updatePosition(); } else { this._openContextMenu(event); } } } _destroyMenu(reason) { super._destroyMenu(reason); this._scrollSubscription?.unsubscribe(); } _getOverlayOrigin() { return this._point; } _getOutsideClickStream(overlayRef) { return overlayRef.outsidePointerEvents().pipe(skipWhile((event, index) => { if (event.type === 'contextmenu') { return this._isWithinMenuOrTrigger(_getEventTarget(even