UNPKG

primeng

Version:

PrimeNG is a premium UI library for Angular featuring a rich set of 90+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeBlock,

1 lines 75.6 kB
{"version":3,"file":"primeng-menu.mjs","sources":["../../src/menu/style/menustyle.ts","../../src/menu/menu-token.ts","../../src/menu/menu-item-content.ts","../../src/menu/menu.ts","../../src/menu/primeng-menu.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { style } from '@primeuix/styles/menu';\nimport { BaseStyle } from 'primeng/base';\n\nconst inlineStyles = {\n root: ({ instance }) => ({\n position: instance.popup() ? 'absolute' : 'relative',\n ...instance.style()\n })\n};\n\nconst classes = {\n root: ({ instance }) => [\n 'p-menu p-component',\n {\n 'p-menu-overlay': instance.popup()\n }\n ],\n start: 'p-menu-start',\n list: 'p-menu-list',\n submenuLabel: 'p-menu-submenu-label',\n submenuList: 'p-menu-submenu-list',\n separator: 'p-menu-separator',\n end: 'p-menu-end',\n item: ({ instance, item, id, toggleable }) => [\n 'p-menu-item',\n {\n 'p-menu-item-toggleable': toggleable,\n 'p-focus': instance.focusedOptionId() && id === instance.focusedOptionId(),\n 'p-disabled': instance.disabled(item.disabled)\n },\n item.styleClass\n ],\n itemContent: 'p-menu-item-content',\n itemLink: 'p-menu-item-link',\n itemIcon: ({ item }) => ['p-menu-item-icon', item.icon, item.iconClass],\n itemLabel: 'p-menu-item-label',\n itemSubmenuIcon: 'p-menu-item-submenu-icon'\n};\n\n@Injectable()\nexport class MenuStyle extends BaseStyle {\n name = 'menu';\n\n style = style;\n\n classes = classes;\n\n inlineStyles = inlineStyles;\n}\n\n/**\n *\n * Menu is a navigation / command component that supports dynamic and static positioning.\n *\n * [Live Demo](https://www.primeng.org/menu/)\n *\n * @module menustyle\n *\n */\n\nexport enum MenuClasses {\n /**\n * Class name of the root element\n */\n root = 'p-menu',\n /**\n * Class name of the start element\n */\n start = 'p-menu-start',\n /**\n * Class name of the list element\n */\n list = 'p-menu-list',\n /**\n * Class name of the submenu label element (non-toggleable group headers)\n */\n submenuLabel = 'p-menu-submenu-label',\n /**\n * Class name of the nested submenu list element\n */\n submenuList = 'p-menu-submenu-list',\n /**\n * Class name of the separator element\n */\n separator = 'p-menu-separator',\n /**\n * Class name of the end element\n */\n end = 'p-menu-end',\n /**\n * Class name of the item element\n */\n item = 'p-menu-item',\n /**\n * Class name of the item content element\n */\n itemContent = 'p-menu-item-content',\n /**\n * Class name of the item link element\n */\n itemLink = 'p-menu-item-link',\n /**\n * Class name of the item icon element\n */\n itemIcon = 'p-menu-item-icon',\n /**\n * Class name of the item label element\n */\n itemLabel = 'p-menu-item-label',\n /**\n * Class name of the item submenu toggle icon element (toggleable items)\n */\n itemSubmenuIcon = 'p-menu-item-submenu-icon'\n}\n\nexport interface MenuStyle extends BaseStyle {}\n","import { InjectionToken } from '@angular/core';\n\nexport const MENU_INSTANCE = new InjectionToken<any>('MENU_INSTANCE');\n","import { isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, inject, input, numberAttribute, output, Pipe, PipeTransform, PLATFORM_ID, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { RouterModule } from '@angular/router';\nimport { MenuItem, SharedModule } from 'primeng/api';\nimport { BadgeModule } from 'primeng/badge';\nimport { BaseComponent } from 'primeng/basecomponent';\nimport { BindModule } from 'primeng/bind';\nimport { Ripple } from 'primeng/ripple';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { MenuItemTemplateContext } from 'primeng/types/menu';\nimport { ChevronDown as ChevronDownIcon } from '@primeicons/angular/chevron-down';\nimport { MenuStyle } from './style/menustyle';\nimport type { Menu } from './menu';\nimport { MENU_INSTANCE } from './menu-token';\n\n@Pipe({\n name: 'safeHtml',\n standalone: true\n})\nexport class SafeHtmlPipe implements PipeTransform {\n private platformId = inject(PLATFORM_ID);\n private sanitizer = inject(DomSanitizer);\n\n public transform(value: string): SafeHtml {\n if (!value || !isPlatformBrowser(this.platformId)) {\n return value;\n }\n\n return this.sanitizer.bypassSecurityTrustHtml(value);\n }\n}\n\n@Component({\n selector: '[pMenuItemContent]',\n standalone: true,\n imports: [NgTemplateOutlet, RouterModule, Ripple, TooltipModule, BadgeModule, SharedModule, SafeHtmlPipe, BindModule, ChevronDownIcon],\n template: `\n @let _item = item();\n <div [class]=\"cx('itemContent')\" (click)=\"onItemClick($event, _item)\" [attr.data-pc-section]=\"'itemcontent'\" [pBind]=\"getPTOptions('itemContent')\">\n @if (!itemTemplate()) {\n @if (!_item?.routerLink) {\n <a\n [attr.title]=\"_item?.title\"\n [attr.href]=\"_item?.url || null\"\n [attr.data-automationid]=\"_item?.automationId\"\n [attr.tabindex]=\"-1\"\n [class]=\"cn(cx('itemLink'), _item?.linkClass)\"\n [style]=\"_item?.linkStyle\"\n [target]=\"_item?.target\"\n [pBind]=\"getPTOptions('itemLink')\"\n [attr.data-pc-section]=\"'itemlink'\"\n pRipple\n >\n <ng-container *ngTemplateOutlet=\"itemContent; context: { $implicit: _item }\"></ng-container>\n </a>\n } @else {\n <a\n [routerLink]=\"_item?.routerLink\"\n [attr.data-automationid]=\"_item?.automationId\"\n [attr.tabindex]=\"-1\"\n [attr.title]=\"_item?.title\"\n [queryParams]=\"_item?.queryParams\"\n routerLinkActive=\"p-menu-item-link-active\"\n [routerLinkActiveOptions]=\"getRouterLinkActiveOptions(_item)\"\n [class]=\"cn(cx('itemLink'), _item?.linkClass)\"\n [style]=\"_item?.linkStyle\"\n [target]=\"_item?.target\"\n [fragment]=\"_item?.fragment\"\n [queryParamsHandling]=\"_item?.queryParamsHandling\"\n [preserveFragment]=\"_item?.preserveFragment\"\n [skipLocationChange]=\"_item?.skipLocationChange\"\n [replaceUrl]=\"_item?.replaceUrl\"\n [state]=\"_item?.state\"\n [pBind]=\"getPTOptions('itemLink')\"\n [attr.data-pc-section]=\"'itemlink'\"\n pRipple\n >\n <ng-container *ngTemplateOutlet=\"itemContent; context: { $implicit: _item }\"></ng-container>\n </a>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"itemTemplate(); context: { $implicit: _item }\"></ng-container>\n }\n\n <ng-template #itemContent>\n @if (_item?.icon) {\n <span [class]=\"cn(cx('itemIcon', { item: _item }), _item?.iconClass)\" [pBind]=\"getPTOptions('itemIcon')\" [style]=\"_item?.iconStyle\" [attr.data-pc-section]=\"'itemicon'\"></span>\n }\n @if (_item?.escape !== false) {\n <span [class]=\"cn(cx('itemLabel'), _item?.labelClass)\" [style]=\"_item?.labelStyle\" [pBind]=\"getPTOptions('itemLabel')\" [attr.data-pc-section]=\"'itemlabel'\">{{ _item?.label }}</span>\n } @else {\n <span [class]=\"cn(cx('itemLabel'), _item?.labelClass)\" [style]=\"_item?.labelStyle\" [attr.data-pc-section]=\"'itemlabel'\" [innerHTML]=\"_item?.label | safeHtml\" [pBind]=\"getPTOptions('itemLabel')\"></span>\n }\n @if (toggleable()) {\n @if (submenuIconTemplate()) {\n <ng-container *ngTemplateOutlet=\"submenuIconTemplate()!; context: { $implicit: _item }\"></ng-container>\n } @else {\n <svg [pBind]=\"getPTOptions('itemSubmenuIcon')\" data-p-icon=\"chevron-down\" [class]=\"cx('itemSubmenuIcon')\" [attr.aria-hidden]=\"true\" [attr.data-expanded]=\"expanded() || null\" />\n }\n }\n @if (_item?.badge) {\n <p-badge [class]=\"_item?.badgeStyleClass\" [value]=\"_item?.badge\" [pt]=\"getPTOptions('pcBadge')\" [unstyled]=\"unstyled()\" />\n }\n </ng-template>\n </div>\n <ng-content></ng-content>\n `,\n encapsulation: ViewEncapsulation.None,\n providers: [MenuStyle]\n})\nexport class MenuItemContent extends BaseComponent {\n item = input<MenuItem | undefined>(undefined, { alias: 'pMenuItemContent' });\n\n itemTemplate = input<TemplateRef<MenuItemTemplateContext> | undefined>();\n\n menuitemId = input<string>('');\n\n idx = input<number>(0);\n\n toggleable = input(false, { transform: booleanAttribute });\n\n expanded = input(false, { transform: booleanAttribute });\n\n depth = input(0, { transform: numberAttribute });\n\n submenuIconTemplate = input<TemplateRef<any> | undefined>();\n\n onMenuItemClick = output<{ originalEvent: Event; item: MenuItem | undefined }>();\n\n menu = inject<Menu>(MENU_INSTANCE);\n\n _componentStyle = inject(MenuStyle);\n\n hostName = 'Menu';\n\n onItemClick(event: Event, item: MenuItem | undefined) {\n if (this.toggleable()) {\n event.preventDefault();\n this.menu.toggleSubmenu(item!, this.menuitemId(), this.depth());\n this.menu.focusedOptionIndex.set(this.menuitemId());\n this.menu.focusMenuList();\n return;\n }\n\n this.onMenuItemClick.emit({ originalEvent: event, item });\n }\n\n getRouterLinkActiveOptions(item: MenuItem | undefined) {\n return item?.routerLinkActiveOptions || { exact: false };\n }\n\n getPTOptions(key: string) {\n return this.menu.getPTOptions(key, this.item(), this.idx(), this.menuitemId());\n }\n}\n","import { isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, ChangeDetectionStrategy, Component, computed, contentChild, ElementRef, inject, input, model, NgModule, numberAttribute, output, signal, TemplateRef, viewChild, ViewEncapsulation, ViewRef } from '@angular/core';\nimport { MotionEvent, MotionOptions } from '@primeuix/motion';\nimport { absolutePosition, addStyle, appendChild, find, findSingle, focus, isTouchDevice, uuid } from '@primeuix/utils';\nimport { MenuItem, OverlayService, SharedModule } from 'primeng/api';\nimport { BaseComponent, PARENT_INSTANCE } from 'primeng/basecomponent';\nimport { Bind, BindModule } from 'primeng/bind';\nimport { ConnectedOverlayScrollHandler } from 'primeng/dom';\nimport { MotionModule } from 'primeng/motion';\nimport { TooltipModule } from 'primeng/tooltip';\nimport type { AppendTo, CSSProperties } from 'primeng/types/shared';\nimport { VoidListener } from 'primeng/ts-helpers';\nimport { MenuExpandedKeys, MenuItemTemplateContext, MenuPassThrough, MenuSubmenuHeaderTemplateContext } from 'primeng/types/menu';\nimport { ZIndexUtils } from 'primeng/utils';\nimport { MenuItemContent, SafeHtmlPipe } from './menu-item-content';\nimport { MENU_INSTANCE } from './menu-token';\nimport { MenuStyle } from './style/menustyle';\n\n/**\n * Menu is a navigation / command component that supports dynamic and static positioning.\n * @group Components\n */\n@Component({\n selector: 'p-menu',\n standalone: true,\n imports: [NgTemplateOutlet, MenuItemContent, TooltipModule, SharedModule, SafeHtmlPipe, BindModule, MotionModule],\n template: `\n @if (!popup() || overlayVisible()) {\n <div\n #container\n [class]=\"cn(cx('root'), styleClass())\"\n [style]=\"sx('root')\"\n (click)=\"onOverlayClick($event)\"\n [attr.id]=\"$id()\"\n [pBind]=\"ptm('root')\"\n [attr.data-p]=\"dataP()\"\n [pMotion]=\"visible() || !popup()\"\n [pMotionName]=\"'p-anchored-overlay'\"\n [pMotionAppear]=\"!!popup()\"\n [pMotionDisabled]=\"!popup()\"\n [pMotionOptions]=\"computedMotionOptions()\"\n (pMotionOnBeforeEnter)=\"onOverlayBeforeEnter($event)\"\n (pMotionOnAfterLeave)=\"onOverlayAfterLeave()\"\n >\n @if (startTemplate()) {\n <div [class]=\"cx('start')\" [pBind]=\"ptm('start')\" [attr.data-pc-section]=\"'start'\">\n <ng-container *ngTemplateOutlet=\"startTemplate()\"></ng-container>\n </div>\n }\n <ul\n #list\n [class]=\"cx('list')\"\n [pBind]=\"ptm('list')\"\n role=\"menu\"\n [attr.id]=\"$id() + '_list'\"\n [attr.tabindex]=\"getTabIndexValue()\"\n [attr.data-pc-section]=\"'menu'\"\n [attr.aria-activedescendant]=\"activedescendant()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledBy]=\"ariaLabelledBy()\"\n (focus)=\"onListFocus($event)\"\n (blur)=\"onListBlur($event)\"\n (keydown)=\"onListKeyDown($event)\"\n >\n <ng-container *ngTemplateOutlet=\"recursiveItems; context: { $implicit: model(), depth: 0, parentId: $id() }\"></ng-container>\n <ng-template #recursiveItems let-items let-depth=\"depth\" let-parentId=\"parentId\">\n @for (item of items; track menuitemId(item, parentId, i); let i = $index) {\n @if (isSeparatorVisible(item)) {\n <li [class]=\"cx('separator')\" [pBind]=\"ptm('separator')\" role=\"separator\" [attr.data-pc-section]=\"'separator'\"></li>\n }\n @if (!item.separator && isVisible(item)) {\n @if (item.items?.length && !isSubmenuToggleable(item, depth)) {\n <li\n [class]=\"cx('submenuLabel')\"\n [attr.data-depth]=\"depth || null\"\n [pBind]=\"ptm('submenuLabel')\"\n [attr.data-automationid]=\"item.automationId\"\n pTooltip\n [tooltipOptions]=\"item.tooltipOptions\"\n [pTooltipUnstyled]=\"unstyled()\"\n role=\"none\"\n [attr.id]=\"menuitemId(item, parentId, i)\"\n [attr.data-pc-section]=\"'submenulabel'\"\n >\n @if (!submenuHeaderTemplate()) {\n @if (item.escape !== false) {\n <span>{{ item.label }}</span>\n } @else {\n <span [innerHTML]=\"item.label | safeHtml\"></span>\n }\n }\n <ng-container *ngTemplateOutlet=\"submenuHeaderTemplate(); context: { $implicit: item }\"></ng-container>\n </li>\n <ng-container *ngTemplateOutlet=\"recursiveItems; context: { $implicit: item.items, depth: depth + 1, parentId: menuitemId(item, parentId, i) }\"></ng-container>\n } @else {\n <li\n [class]=\"cn(cx('item', { item, id: menuitemId(item, parentId, i), toggleable: !!item.items?.length && isSubmenuToggleable(item, depth) }), item?.styleClass)\"\n [pBind]=\"ptm('item')\"\n [pMenuItemContent]=\"item\"\n [itemTemplate]=\"itemTemplate()\"\n [idx]=\"i\"\n [menuitemId]=\"menuitemId(item, parentId, i)\"\n [toggleable]=\"!!item.items?.length && isSubmenuToggleable(item, depth)\"\n [expanded]=\"isSubmenuExpanded(item, depth, menuitemId(item, parentId, i))\"\n [depth]=\"depth\"\n [submenuIconTemplate]=\"submenuIconTemplate()\"\n [style]=\"item.style\"\n (onMenuItemClick)=\"itemClick($event, menuitemId(item, parentId, i))\"\n pTooltip\n [tooltipOptions]=\"item.tooltipOptions\"\n [pTooltipUnstyled]=\"unstyled()\"\n [unstyled]=\"unstyled()\"\n role=\"menuitem\"\n [attr.aria-label]=\"label(item.label)\"\n [attr.aria-haspopup]=\"!!item.items?.length && isSubmenuToggleable(item, depth) ? 'true' : null\"\n [attr.aria-expanded]=\"!!item.items?.length && isSubmenuToggleable(item, depth) ? isSubmenuExpanded(item, depth, menuitemId(item, parentId, i)) : null\"\n [attr.data-focused]=\"isItemFocused(menuitemId(item, parentId, i))\"\n [attr.data-disabled]=\"disabled(item.disabled)\"\n [attr.data-toggleable]=\"(!!item.items?.length && isSubmenuToggleable(item, depth)) || null\"\n [attr.data-depth]=\"!!item.items?.length && isSubmenuToggleable(item, depth) ? depth : null\"\n [attr.aria-disabled]=\"disabled(item.disabled)\"\n [attr.id]=\"menuitemId(item, parentId, i)\"\n [attr.data-pc-section]=\"'item'\"\n (click)=\"onItemLiClick($event, item, menuitemId(item, parentId, i), depth)\"\n (mousedown)=\"onItemLiMousedown($event, item, depth)\"\n >\n @if (!!item.items?.length && isSubmenuToggleable(item, depth) && isSubmenuExpanded(item, depth, menuitemId(item, parentId, i))) {\n <ul [class]=\"cx('submenuList')\" [pBind]=\"ptm('submenuList')\" role=\"menu\">\n <ng-container *ngTemplateOutlet=\"recursiveItems; context: { $implicit: item.items, depth: depth + 1, parentId: menuitemId(item, parentId, i) }\"></ng-container>\n </ul>\n }\n </li>\n }\n }\n }\n </ng-template>\n </ul>\n @if (endTemplate()) {\n <div [class]=\"cx('end')\" [pBind]=\"ptm('end')\" [attr.data-pc-section]=\"'end'\">\n <ng-container *ngTemplateOutlet=\"endTemplate()\"></ng-container>\n </div>\n }\n </div>\n }\n `,\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [MenuStyle, { provide: MENU_INSTANCE, useExisting: Menu }, { provide: PARENT_INSTANCE, useExisting: Menu }],\n hostDirectives: [Bind]\n})\nexport class Menu extends BaseComponent<MenuPassThrough> {\n componentName = 'Menu';\n\n /**\n * An array of menuitems.\n * @group Props\n */\n model = input<MenuItem[]>();\n /**\n * Defines if menu would displayed as a popup.\n * @group Props\n */\n popup = input(false, { transform: booleanAttribute });\n /**\n * Inline style of the component.\n * @group Props\n */\n style = input<CSSProperties>();\n /**\n * Style class of the component.\n * @group Props\n */\n styleClass = input<string>();\n /**\n * Whether to automatically manage layering.\n * @group Props\n */\n autoZIndex = input(true, { transform: booleanAttribute });\n /**\n * Base zIndex value to use in layering.\n * @group Props\n */\n baseZIndex = input(0, { transform: numberAttribute });\n /**\n * Defines a string value that labels an interactive element.\n * @group Props\n */\n ariaLabel = input<string>();\n /**\n * Identifier of the underlying input element.\n * @group Props\n */\n ariaLabelledBy = input<string>();\n /**\n * Current id state as a string.\n * @group Props\n */\n id = input<string>();\n /**\n * Index of the element in tabbing order.\n * @group Props\n */\n tabindex = input(0, { transform: numberAttribute });\n /**\n * Target element to attach the overlay, valid values are \"body\" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]=\"mydiv\" for a div element having #mydiv as variable name).\n * @defaultValue 'self'\n * @group Props\n */\n appendTo = input<AppendTo>(undefined);\n /**\n * The motion options.\n * @group Props\n */\n motionOptions = input<MotionOptions | undefined>(undefined);\n /**\n * When provided, switches the component to controlled mode; each key is the DOM id of a toggleable submenu header and the value its expansion flag.\n * Use two-way binding with `[(expandedKeys)]`.\n * @group Props\n */\n expandedKeys = model<MenuExpandedKeys>();\n\n /**\n * Callback to invoke when overlay menu is shown.\n * @group Emits\n */\n onShow = output<object>();\n /**\n * Callback to invoke when overlay menu is hidden.\n * @group Emits\n */\n onHide = output<object>();\n /**\n * Callback to invoke when the list loses focus.\n * @param {Event} event - blur event.\n * @group Emits\n */\n onBlur = output<Event>();\n /**\n * Callback to invoke when the list receives focus.\n * @param {Event} event - focus event.\n * @group Emits\n */\n onFocus = output<Event>();\n\n /**\n * Defines template option for start.\n * @group Templates\n */\n startTemplate = contentChild<TemplateRef<void>>('start', { descendants: false });\n\n /**\n * Defines template option for end.\n * @group Templates\n */\n endTemplate = contentChild<TemplateRef<void>>('end', { descendants: false });\n\n /**\n * Custom item template.\n * @param {MenuItemTemplateContext} context - item context.\n * @see {@link MenuItemTemplateContext}\n * @group Templates\n */\n itemTemplate = contentChild<TemplateRef<MenuItemTemplateContext>>('item', { descendants: false });\n\n /**\n * Custom submenu header template.\n * @param {MenuSubmenuHeaderTemplateContext} context - submenu header context.\n * @see {@link MenuSubmenuHeaderTemplateContext}\n * @group Templates\n */\n submenuHeaderTemplate = contentChild<TemplateRef<MenuSubmenuHeaderTemplateContext>>('submenuheader', { descendants: false });\n\n /**\n * Custom submenu toggle icon template.\n * @param {MenuSubmenuHeaderTemplateContext} context - submenu header context.\n * @see {@link MenuSubmenuHeaderTemplateContext}\n * @group Templates\n */\n submenuIconTemplate = contentChild<TemplateRef<MenuSubmenuHeaderTemplateContext>>('submenuicon', { descendants: false });\n\n listViewChild = viewChild<ElementRef>('list');\n\n containerViewChild = viewChild<ElementRef>('container');\n\n private _internalId = uuid('pn_id_');\n\n $id = computed(() => this.id() || this._internalId);\n\n $appendTo = computed(() => this.appendTo() || this.config.overlayAppendTo());\n\n computedMotionOptions = computed<MotionOptions>(() => {\n return {\n ...this.ptm('motion'),\n ...this.motionOptions()\n };\n });\n\n container: HTMLElement | undefined;\n\n scrollHandler: ConnectedOverlayScrollHandler | null | undefined;\n\n documentClickListener: VoidListener;\n\n documentResizeListener: VoidListener;\n\n preventDocumentDefault: boolean | undefined;\n\n target: HTMLElement | null = null;\n\n visible = signal(false);\n\n focusedOptionId = computed(() => {\n return this.focusedOptionIndex() !== -1 ? this.focusedOptionIndex() : null;\n });\n\n focusedOptionIndex = signal<string | number>(-1);\n\n selectedOptionIndex = signal<number>(-1);\n\n focused = signal(false);\n\n overlayVisible = signal(false);\n\n d_expandedKeys = signal<MenuExpandedKeys>({});\n\n currentExpandedKeys = computed(() => {\n return this.expandedKeys() !== undefined ? this.expandedKeys()! : this.d_expandedKeys();\n });\n\n $pcMenu: Menu | undefined = inject(MENU_INSTANCE, { optional: true, skipSelf: true }) ?? undefined;\n\n overlayService = inject(OverlayService);\n\n _componentStyle = inject(MenuStyle);\n\n bindDirectiveInstance = inject(Bind, { self: true });\n\n onAfterViewChecked() {\n this.bindDirectiveInstance.setAttrs(this.ptm('host'));\n }\n\n dataP = computed(() => {\n return this.cn({\n popup: this.popup()\n });\n });\n\n getPTOptions(key: string, item: MenuItem | undefined, index: number, id: string) {\n return this.ptm(key, {\n context: {\n item: item,\n index: index,\n focused: this.isItemFocused(id),\n disabled: this.disabled(item?.disabled)\n }\n });\n }\n /**\n * Toggles the visibility of the popup menu.\n * @param {Event} event - Browser event.\n * @group Method\n */\n public toggle(event: Event) {\n if (this.visible()) this.hide();\n else this.show(event);\n\n this.preventDocumentDefault = true;\n }\n /**\n * Displays the popup menu.\n * @param {Event} event - Browser event.\n * @group Method\n */\n public show(event: Event) {\n // Clear container if exists but overlay is not currently visible (fast toggle case)\n if (this.container && !this.overlayVisible()) {\n this.container = undefined;\n }\n\n this.target = event.currentTarget as HTMLElement | null;\n this.visible.set(true);\n this.preventDocumentDefault = true;\n this.overlayVisible.set(true);\n }\n\n onInit() {\n if (!this.popup()) {\n this.bindDocumentClickListener();\n }\n }\n\n getTabIndexValue(): string | null {\n const tabindexValue = this.tabindex();\n return tabindexValue !== undefined ? tabindexValue.toString() : null;\n }\n\n onOverlayBeforeEnter(event: MotionEvent) {\n this.container = event.element as HTMLElement;\n\n if (this.container) {\n addStyle(this.container, { position: 'absolute', top: '0' });\n this.appendOverlay();\n this.moveOnTop();\n\n this.$attrSelector && this.container?.setAttribute(this.$attrSelector, '');\n this.bindDocumentClickListener();\n this.bindDocumentResizeListener();\n this.bindScrollListener();\n absolutePosition(this.container!, this.target!);\n focus(this.listViewChild()?.nativeElement);\n this.onShow.emit({});\n }\n }\n\n onOverlayAfterLeave() {\n this.restoreOverlayAppend();\n this.onOverlayHide();\n this.overlayVisible.set(false);\n this.onHide.emit({});\n }\n\n appendOverlay() {\n if (this.$appendTo() && this.$appendTo() !== 'self') {\n if (this.$appendTo() === 'body') {\n appendChild(this.document.body, this.container!);\n } else {\n appendChild(this.$appendTo(), this.container!);\n }\n }\n }\n\n restoreOverlayAppend() {\n if (this.container && this.$appendTo() !== 'self') {\n appendChild(this.el.nativeElement, this.container);\n }\n }\n\n moveOnTop() {\n if (this.autoZIndex()) {\n ZIndexUtils.set('menu', this.container, this.baseZIndex() + this.config.zIndex.menu);\n }\n }\n /**\n * Hides the popup menu.\n * @group Method\n */\n public hide() {\n this.visible.set(false);\n }\n\n onWindowResize() {\n if (this.visible() && !isTouchDevice()) {\n this.hide();\n }\n }\n\n menuitemId(item: MenuItem, id: string, index?: string | number, childIndex?: string | number) {\n return item?.id ?? `${id}_${index}${childIndex !== undefined ? '_' + childIndex : ''}`;\n }\n\n isItemFocused(id: string | number | null) {\n return this.focusedOptionId() === id;\n }\n\n label(label: string | (() => string) | undefined) {\n return typeof label === 'function' ? label() : label;\n }\n\n disabled(disabled: boolean | (() => boolean) | undefined) {\n return typeof disabled === 'function' ? disabled() : typeof disabled === 'undefined' ? false : disabled;\n }\n\n isVisible(item: MenuItem) {\n return item.visible !== false;\n }\n\n isSeparatorVisible(item: MenuItem) {\n return item.separator && this.isVisible(item);\n }\n\n isItemVisible(item: MenuItem) {\n return !item.separator && this.isVisible(item);\n }\n\n isSubmenuSeparatorVisible(item: MenuItem, submenu: MenuItem) {\n return item.separator && (this.isVisible(item) || this.isVisible(submenu));\n }\n\n isSubmenuItemVisible(item: MenuItem, submenu: MenuItem) {\n return !item.separator && this.isVisible(item) && (item.visible !== undefined || this.isVisible(submenu));\n }\n\n activedescendant = computed(() => {\n return this.focused() ? this.focusedOptionId() : undefined;\n });\n\n onListFocus(event: Event) {\n if (!this.focused()) {\n this.focused.set(true);\n if (!this.popup() && !this.focusedOptionId()) {\n this.changeFocusedOptionIndex(0);\n }\n this.onFocus.emit(event);\n }\n }\n\n onListBlur(event: FocusEvent | MouseEvent) {\n if (this.focused()) {\n this.focused.set(false);\n this.changeFocusedOptionIndex(-1);\n this.selectedOptionIndex.set(-1);\n this.focusedOptionIndex.set(-1);\n this.onBlur.emit(event);\n }\n }\n\n onListKeyDown(event: KeyboardEvent) {\n switch (event.code) {\n case 'ArrowDown':\n this.onArrowDownKey(event);\n break;\n\n case 'ArrowUp':\n this.onArrowUpKey(event);\n break;\n\n case 'Home':\n this.onHomeKey(event);\n break;\n\n case 'End':\n this.onEndKey(event);\n break;\n\n case 'Enter':\n this.onEnterKey(event);\n break;\n\n case 'NumpadEnter':\n this.onEnterKey(event);\n break;\n\n case 'Space':\n this.onSpaceKey(event);\n break;\n\n case 'Escape':\n case 'Tab':\n if (this.popup()) {\n this.target && focus(this.target);\n this.hide();\n }\n this.overlayVisible() && this.hide();\n break;\n\n default:\n break;\n }\n }\n\n onArrowDownKey(event: KeyboardEvent) {\n const optionIndex = this.findNextOptionIndex(this.focusedOptionIndex());\n this.changeFocusedOptionIndex(optionIndex);\n event.preventDefault();\n }\n\n onArrowUpKey(event: KeyboardEvent) {\n if (event.altKey && this.popup()) {\n this.target && focus(this.target);\n this.hide();\n event.preventDefault();\n } else {\n const optionIndex = this.findPrevOptionIndex(this.focusedOptionIndex());\n\n this.changeFocusedOptionIndex(optionIndex);\n event.preventDefault();\n }\n }\n\n onHomeKey(event: KeyboardEvent) {\n this.changeFocusedOptionIndex(0);\n event.preventDefault();\n }\n\n onEndKey(event: KeyboardEvent) {\n this.changeFocusedOptionIndex(find(this.containerViewChild()?.nativeElement, 'li[data-pc-section=\"item\"][data-disabled=\"false\"]').length - 1);\n event.preventDefault();\n }\n\n onEnterKey(event: KeyboardEvent) {\n event.preventDefault();\n\n const element = findSingle(this.listViewChild()?.nativeElement, `[id=\"${`${this.focusedOptionIndex()}`}\"]`) as HTMLElement | null;\n\n if (!element) return;\n\n if (element.getAttribute('data-toggleable') === 'true') {\n const content = (findSingle(element, '[data-pc-section=\"itemcontent\"]') || element) as HTMLElement;\n content.click();\n return;\n }\n\n const anchorElement = findSingle(element, 'a[data-pc-section=\"itemlink\"]') as HTMLElement | null;\n\n this.popup() && this.target && focus(this.target);\n (anchorElement || element).click();\n }\n\n onSpaceKey(event: KeyboardEvent) {\n this.onEnterKey(event);\n }\n\n findNextOptionIndex(index: string | number) {\n const links = find(this.containerViewChild()?.nativeElement, 'li[data-pc-section=\"item\"][data-disabled=\"false\"]');\n const matchedOptionIndex = [...links].findIndex((link) => link.id === index);\n\n return matchedOptionIndex > -1 ? matchedOptionIndex + 1 : 0;\n }\n\n findPrevOptionIndex(index: string | number) {\n const links = find(this.containerViewChild()?.nativeElement, 'li[data-pc-section=\"item\"][data-disabled=\"false\"]');\n const matchedOptionIndex = [...links].findIndex((link) => link.id === index);\n\n return matchedOptionIndex > -1 ? matchedOptionIndex - 1 : 0;\n }\n\n changeFocusedOptionIndex(index: number) {\n const links = find(this.containerViewChild()?.nativeElement, 'li[data-pc-section=\"item\"][data-disabled=\"false\"]');\n if (links.length > 0) {\n let order = index >= links.length ? links.length - 1 : index < 0 ? 0 : index;\n order > -1 && this.focusedOptionIndex.set(links[order].getAttribute('id') ?? -1);\n }\n }\n\n itemClick(event: { originalEvent: Event; item: MenuItem }, id: string) {\n const { originalEvent, item } = event;\n\n if (!this.focused()) {\n this.focused.set(true);\n this.onFocus.emit(originalEvent);\n }\n\n if (item.disabled) {\n originalEvent.preventDefault();\n return;\n }\n\n if (!item.url && !item.routerLink) {\n originalEvent.preventDefault();\n }\n\n if (item.command) {\n item.command({\n originalEvent: originalEvent,\n item: item\n });\n }\n\n if (this.popup()) {\n this.hide();\n }\n\n if (!this.popup() && this.focusedOptionIndex() !== id) {\n this.focusedOptionIndex.set(id);\n }\n }\n\n onOverlayClick(event: Event) {\n if (this.popup()) {\n this.overlayService.add({\n originalEvent: event,\n target: this.el.nativeElement\n });\n }\n\n this.preventDocumentDefault = true;\n }\n\n bindDocumentClickListener() {\n if (!this.documentClickListener && isPlatformBrowser(this.platformId)) {\n const documentTarget = this.el ? this.el.nativeElement.ownerDocument : this.document;\n\n this.documentClickListener = this.renderer.listen(documentTarget, 'click', (event) => {\n const isOutsideContainer = this.containerViewChild()?.nativeElement && !this.containerViewChild()?.nativeElement.contains(event.target);\n const isOutsideTarget = !(this.target && (this.target === event.target || this.target.contains(event.target)));\n if (!this.popup() && isOutsideContainer && isOutsideTarget) {\n this.onListBlur(event);\n }\n if (this.preventDocumentDefault && this.overlayVisible() && isOutsideContainer && isOutsideTarget) {\n this.hide();\n this.preventDocumentDefault = false;\n }\n });\n }\n }\n\n unbindDocumentClickListener() {\n if (this.documentClickListener) {\n this.documentClickListener();\n this.documentClickListener = null;\n }\n }\n\n bindDocumentResizeListener() {\n if (!this.documentResizeListener && isPlatformBrowser(this.platformId)) {\n const window = this.document.defaultView;\n this.documentResizeListener = this.renderer.listen(window, 'resize', this.onWindowResize.bind(this));\n }\n }\n\n unbindDocumentResizeListener() {\n if (this.documentResizeListener) {\n this.documentResizeListener();\n this.documentResizeListener = null;\n }\n }\n\n bindScrollListener() {\n if (!this.scrollHandler && isPlatformBrowser(this.platformId)) {\n this.scrollHandler = new ConnectedOverlayScrollHandler(this.target, () => {\n if (this.visible()) {\n this.hide();\n }\n });\n }\n\n this.scrollHandler?.bindScrollListener();\n }\n\n unbindScrollListener() {\n if (this.scrollHandler) {\n this.scrollHandler.unbindScrollListener();\n this.scrollHandler = null;\n }\n }\n\n onOverlayHide() {\n this.unbindDocumentClickListener();\n this.unbindDocumentResizeListener();\n this.unbindScrollListener();\n this.preventDocumentDefault = false;\n\n if (!(this.cd as ViewRef).destroyed) {\n this.target = null;\n }\n if (this.container) {\n if (this.autoZIndex()) {\n ZIndexUtils.clear(this.container);\n }\n this.container = undefined;\n }\n }\n\n onDestroy() {\n if (this.popup()) {\n if (this.scrollHandler) {\n this.scrollHandler.destroy();\n this.scrollHandler = null;\n }\n\n if (this.container) {\n if (this.autoZIndex()) {\n ZIndexUtils.clear(this.container);\n }\n this.container = undefined;\n }\n\n this.restoreOverlayAppend();\n this.onOverlayHide();\n }\n\n if (!this.popup()) {\n this.unbindDocumentClickListener();\n }\n }\n\n hasSubMenu(): boolean {\n return this.model()?.some((item) => item.items) ?? false;\n }\n\n getSubmenuKey(submenu: MenuItem, id: string): string {\n return submenu?.key != null ? String(submenu.key) : id;\n }\n\n isSubmenuToggleable(submenu: MenuItem, depth: number = 0): boolean {\n if (submenu.toggleable !== undefined) {\n return submenu.toggleable;\n }\n return depth > 0;\n }\n\n isSubmenuExpanded(submenu: MenuItem, depth: number = 0, id?: string): boolean {\n if (!this.isSubmenuToggleable(submenu, depth)) {\n return true;\n }\n\n if (id) {\n const key = this.getSubmenuKey(submenu, id);\n const expandedKeys = this.currentExpandedKeys();\n\n if (expandedKeys && key in expandedKeys) {\n return expandedKeys[key];\n }\n }\n\n return submenu.expanded === true;\n }\n\n toggleSubmenu(submenu: MenuItem, id: string, depth: number = 0) {\n const key = this.getSubmenuKey(submenu, id);\n const isExpanded = this.isSubmenuExpanded(submenu, depth, id);\n const next = { ...(this.currentExpandedKeys() || {}), [key]: !isExpanded };\n\n if (this.expandedKeys() !== undefined) {\n this.expandedKeys.set(next);\n } else {\n this.d_expandedKeys.set(next);\n }\n\n submenu.expanded = !isExpanded;\n }\n\n onItemLiClick(event: Event, item: MenuItem, id: string, depth: number) {\n if (item.items?.length && this.isSubmenuToggleable(item, depth)) {\n event.preventDefault();\n }\n }\n\n onItemLiMousedown(event: Event, item: MenuItem, depth: number) {\n if (item.items?.length && this.isSubmenuToggleable(item, depth)) {\n event.preventDefault();\n }\n }\n\n focusMenuList() {\n const list = this.listViewChild()?.nativeElement;\n if (list) focus(list);\n }\n\n isItemHidden(item: MenuItem): boolean {\n if (item.separator) {\n return item.visible === false || !!(item.items && item.items.some((subitem: MenuItem) => subitem.visible !== false));\n }\n return item.visible === false;\n }\n}\n\n@NgModule({\n imports: [Menu, SharedModule, SafeHtmlPipe],\n exports: [Menu, SharedModule, SafeHtmlPipe]\n})\nexport class MenuModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","ChevronDownIcon","i1","i3"],"mappings":"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